cardpeek-0.8/0000755000175000017500000000000012214321142010130 500000000000000cardpeek-0.8/depcomp0000755000175000017500000005064311777117217011460 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 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 outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' 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 if test "$depmode" = msvc7msys; then # This is just like msvc7 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=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc 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 ' ' "$nl" < "$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. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## 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 "s|.*$object$||" -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 ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$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" ;; xlc) # 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 ;; 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" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -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 anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -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 ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -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 -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$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" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # 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 ;; #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:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$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" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## 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::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$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: cardpeek-0.8/lua_ext.h0000644000175000017500000000311412160275733011677 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUAX_H #define LUAX_H #include "smartcard.h" #include void luax_set_card_reader(cardreader_t* r); void luax_run_script(const char* scriptname); void luax_run_command(const char* command); int luax_init(void); void luax_release(void); char *luax_escape_string(const char *src); /*****/ gboolean luax_config_table_save(void); char *luax_variable_get_strdup(const char *vname); gboolean luax_variable_set_strval(const char *vname, const char *value); int luax_variable_get_integer(const char *vname); gboolean luax_variable_set_integer(const char *vname, int value); gboolean luax_variable_get_boolean(const char *vname); gboolean luax_variable_set_boolean(const char *vname, gboolean value); gboolean luax_variable_is_defined(const char *vname); #endif cardpeek-0.8/missing0000755000175000017500000002415211777117217011476 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 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 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. ;; *) 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 ;; *) 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: cardpeek-0.8/lua_crypto.c0000644000175000017500000001047612201417477012422 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_crypto.h" #include "crypto.h" #include "lua_bytes.h" /*********************************************************** * BASIC CRYPTO FUNCTIONS */ static int subr_crypto_create_context(lua_State* L) { int alg = luaL_checkinteger(L,1); bytestring_t* bs; bytestring_t* res = bytestring_new(8); crypto_error_t e; if (lua_isnoneornil(L,2)) bs = NULL; else bs = luaL_check_bytestring(L,2); if ((e=crypto_create_context(res,alg,bs))==CRYPTO_OK) lua_push_bytestring(L,res); else { bytestring_free(res); return luaL_error(L,crypto_stringify_error(e)); } return 1; } static int subr_crypto_encrypt(lua_State* L) { bytestring_t* ctx = luaL_check_bytestring(L,1); bytestring_t* src = luaL_check_bytestring(L,2); bytestring_t* iv; bytestring_t* res = bytestring_new(8); crypto_error_t e; if (lua_isnoneornil(L,3)) iv = NULL; else iv = luaL_check_bytestring(L,3); if ((e=crypto_encrypt(res,ctx,src,iv))==CRYPTO_OK) lua_push_bytestring(L,res); else { bytestring_free(res); return luaL_error(L,crypto_stringify_error(e)); } return 1; } static int subr_crypto_decrypt(lua_State* L) { bytestring_t* ctx = luaL_check_bytestring(L,1); bytestring_t* src = luaL_check_bytestring(L,2); bytestring_t* iv; bytestring_t* res = bytestring_new(8); crypto_error_t e; if (lua_isnoneornil(L,3)) iv = NULL; else iv = luaL_check_bytestring(L,3); if ((e=crypto_decrypt(res,ctx,src,iv))==CRYPTO_OK) lua_push_bytestring(L,res); else { bytestring_free(res); return luaL_error(L,crypto_stringify_error(e)); } return 1; } static int subr_crypto_mac(lua_State* L) { bytestring_t* ctx = luaL_check_bytestring(L,1); bytestring_t* src = luaL_check_bytestring(L,2); bytestring_t* res = bytestring_new(8); crypto_error_t e; if ((e=crypto_mac(res,ctx,src))==CRYPTO_OK) lua_push_bytestring(L,res); else { bytestring_free(res); return luaL_error(L,crypto_stringify_error(e)); } return 1; } static int subr_crypto_digest(lua_State* L) { bytestring_t* ctx = luaL_check_bytestring(L,1); bytestring_t* src = luaL_check_bytestring(L,2); bytestring_t* res = bytestring_new(8); crypto_error_t e; if ((e=crypto_digest(res,ctx,src))==CRYPTO_OK) lua_push_bytestring(L,res); else { bytestring_free(res); return luaL_error(L,crypto_stringify_error(e)); } return 1; } static const struct luaL_Reg cryptolib [] = { { "create_context", subr_crypto_create_context }, { "encrypt", subr_crypto_encrypt }, { "decrypt", subr_crypto_decrypt }, { "mac", subr_crypto_mac }, { "digest", subr_crypto_digest }, { NULL, NULL} /* sentinel */ }; struct luaL_reg_integer { const char* name; int value; }; static const struct luaL_reg_integer cryptoconstants [] = { { "ALG_DES_ECB", CRYPTO_ALG_DES_ECB }, { "ALG_DES_CBC", CRYPTO_ALG_DES_CBC }, { "ALG_DES2_EDE_ECB", CRYPTO_ALG_DES2_EDE_ECB }, { "ALG_DES2_EDE_CBC", CRYPTO_ALG_DES2_EDE_CBC }, { "ALG_ISO9797_M3", CRYPTO_ALG_ISO9797_M3 }, { "ALG_SHA1", CRYPTO_ALG_SHA1 }, { "PAD_ZERO", CRYPTO_PAD_ZERO }, { "PAD_OPT_80_ZERO", CRYPTO_PAD_OPT_80_ZERO }, { "PAD_ISO9797_P2", CRYPTO_PAD_ISO9797_P2 }, { NULL, 0} /* sentinel */ }; int luaopen_crypto(lua_State* L) { int i; luaL_newlib(L,cryptolib); for (i=0;cryptoconstants[i].name;i++) { lua_pushstring (L, cryptoconstants[i].name); lua_pushinteger(L, cryptoconstants[i].value); lua_settable(L,-3); } lua_setglobal(L,"crypto"); return 1; } cardpeek-0.8/smartcard.h0000644000175000017500000000707312160275534012225 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #ifndef SMARTCARD_H #define SMARTCARD_H #include "bytestring.h" #include "replay.h" #define PROTOCOL_T0 1 #define PROTOCOL_T1 2 enum { SMARTCARD_ERROR, SMARTCARD_OK }; #define CARDPEEK_ERROR_SW 0x6FFF /******************************************************************** * CARDMANAGER */ typedef struct { char **readers; unsigned readers_count; } cardmanager_t; cardmanager_t *cardmanager_new(void); void cardmanager_free(cardmanager_t* cm); unsigned cardmanager_count_readers(cardmanager_t* cm); const char *cardmanager_reader_name(cardmanager_t* cm, unsigned index); const char **cardmanager_reader_name_list(cardmanager_t* cm); /******************************************************************** * CARDREADER */ enum { CARDREADER_EVENT_CONNECT, CARDREADER_EVENT_DISCONNECT, CARDREADER_EVENT_RESET, CARDREADER_EVENT_TRANSMIT, CARDREADER_EVENT_FINALIZE, CARDREADER_EVENT_CLEAR_LOG, CARDREADER_EVENT_SAVE_LOG }; typedef void (*cardreader_callback_t)(unsigned,const bytestring_t*,unsigned short, const bytestring_t*,void*); typedef struct _cardreader_t cardreader_t; struct _cardreader_t { char *name; unsigned connected; #ifdef __APPLE__ uint32_t protocol; #else unsigned long protocol; #endif uint16_t sw; unsigned command_interval; bytestring_t *atr; void *extra_data; cardreader_callback_t cb_func; void *cb_data; cardreplay_t *cardlog; int (*connect)(cardreader_t*, unsigned); int (*disconnect)(cardreader_t*); int (*reset)(cardreader_t*); unsigned short (*transmit)(cardreader_t*,const bytestring_t*, bytestring_t*); const bytestring_t* (*last_atr)(cardreader_t*); char** (*get_info)(cardreader_t*); int (*fail)(cardreader_t*); void (*finalize)(cardreader_t*); }; cardreader_t* cardreader_new(const char *card_reader_name); int cardreader_connect(cardreader_t *reader, unsigned protocol); int cardreader_disconnect(cardreader_t *reader); int cardreader_warm_reset(cardreader_t *reader); unsigned short cardreader_transmit(cardreader_t *reader, const bytestring_t* command, bytestring_t* result); unsigned short cardreader_get_sw(cardreader_t *reader); const bytestring_t* cardreader_last_atr(cardreader_t *reader); char** cardreader_get_info(cardreader_t *reader); int cardreader_fail(cardreader_t *reader); void cardreader_free(cardreader_t *reader); void cardreader_set_command_interval(cardreader_t *reader, unsigned interval); void cardreader_set_callback(cardreader_t *reader, cardreader_callback_t func, void *user_data); void cardreader_log_clear(cardreader_t *reader); int cardreader_log_save(const cardreader_t *reader, const char *filename); int cardreader_log_count_records(const cardreader_t *reader); #endif cardpeek-0.8/install-sh0000755000175000017500000003325611777117217012110 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.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 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac 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 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac 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 do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 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 problematic for `test' and other utilities. 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 # 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 X"$d" = X && 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: cardpeek-0.8/a_string.c0000644000175000017500000000711412160275537012045 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "a_string.h" #include #include #include #include /*********************************************************/ a_string_t* a_strnnew(unsigned n, const char* str) { a_string_t* cs = (a_string_t *)malloc(sizeof(a_string_t)); if (str) { cs->_alloc=n+1; cs->_size=cs->_alloc; cs->_data=(char *)malloc(cs->_alloc); a_strncpy(cs,n,str); } else { cs->_alloc=8; cs->_size=0; cs->_data=(char *)malloc(8); cs->_data[0]=0; } return cs; } a_string_t* a_strnew(const char* str) { if (str) return a_strnnew(strlen(str),str); return a_strnnew(0,NULL); } void a_strfree(a_string_t* cs) { if (cs->_alloc) free(cs->_data); memset(cs,0,sizeof(a_string_t)); free(cs); } char* a_strfinalize(a_string_t* cs) { char *res = cs->_data; free(cs); return res; } const char* a_strncpy(a_string_t* cs, unsigned n, const char* str) { cs->_size=0; return a_strncat(cs,n,str); } const char* a_strcpy(a_string_t* cs, const char* str) { if (str==NULL) return a_strncpy(cs,0,""); return a_strncpy(cs,strlen(str),str); } const char* a_strncat(a_string_t* cs, unsigned n, const char* str) { unsigned needed_size; unsigned p; if (cs->_alloc==0) /* should never happen */ return NULL; if (str==NULL) return cs->_data; if (cs->_size==0) /* cs->_alloc != 0 */ { cs->_size=1; cs->_data[0]=0; } p=0; while (p_size; if (needed_size>cs->_alloc) { while (needed_size>cs->_alloc) cs->_alloc<<=1; cs->_data=(char *)realloc(cs->_data,cs->_alloc); } memcpy(cs->_data+cs->_size-1,str,n); cs->_size=needed_size; cs->_data[cs->_size-1]=0; return cs->_data; } const char* a_strcat(a_string_t* cs, const char* str) { return a_strncat(cs,strlen(str),str); } const char* a_strpushback(a_string_t* cs, char c) { return a_strncat(cs,1,&c); } const char* a_strval(const a_string_t* cs) { return cs->_data; } unsigned a_strlen(const a_string_t* cs) { if (cs->_size==0) return 0; return cs->_size-1; } int a_sprintf(a_string_t* cs, const char *format, ...) { unsigned reclen; va_list al; va_start(al,format); reclen=vsnprintf(cs->_data,0,format,al); va_end(al); if (reclen+1>cs->_alloc) { cs->_alloc=reclen+1; free(cs->_data); cs->_data=(char *)malloc(cs->_alloc); } va_start(al,format); vsnprintf(cs->_data,reclen+1,format,al); va_end(al); cs->_size=reclen+1; return reclen; } int a_strnequal(const a_string_t* cs, unsigned n, const char *value) { if (cs->_alloc==0) return 0; if (n!=a_strlen(cs)) return 0; return memcmp(cs->_data,value,n)==0; } int a_strequal(const a_string_t* cs, const char *value) { return a_strnequal(cs,strlen(value),value); } cardpeek-0.8/crypto.c0000644000175000017500000002173012160275537011557 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "crypto.h" #include #include #include "bytestring.h" #include #define DES_KS_SIZE sizeof(DES_key_schedule) #define ALG_TYPE(x) (x&0x00FF) #define PAD_TYPE(x) (x&0xFF00) #define KS_HEADER_SIZE 2 crypto_error_t crypto_create_context(bytestring_t *ctx, crypto_alg_t alg_type, const bytestring_t* key_bin) { DES_key_schedule ks; bytestring_clear(ctx); bytestring_pushback(ctx,ALG_TYPE(alg_type)); bytestring_pushback(ctx,PAD_TYPE(alg_type)>>8); switch (ALG_TYPE(alg_type)) { case CRYPTO_ALG_DES_ECB: case CRYPTO_ALG_DES_CBC: if (key_bin==NULL || bytestring_get_size(key_bin)!=8 || key_bin->width!=8) return CRYPTO_ERROR_BAD_KEY_FORMAT; DES_set_key_unchecked((const_DES_cblock *)key_bin->data,&ks); bytestring_append_data(ctx,DES_KS_SIZE,(unsigned char *)&ks); break; case CRYPTO_ALG_DES2_EDE_ECB: case CRYPTO_ALG_DES2_EDE_CBC: case CRYPTO_ALG_ISO9797_M3: if (key_bin==NULL || bytestring_get_size(key_bin)!=16 || key_bin->width!=8) return CRYPTO_ERROR_BAD_KEY_FORMAT; DES_set_key_unchecked((const_DES_cblock *)key_bin->data,&ks); bytestring_append_data(ctx,DES_KS_SIZE,(unsigned char *)&ks); DES_set_key_unchecked((const_DES_cblock *)(key_bin->data+8),&ks); bytestring_append_data(ctx,DES_KS_SIZE,(unsigned char *)&ks); break; case CRYPTO_ALG_SHA1: /* nothing else to do */ break; default: return CRYPTO_ERROR_UNKNOWN_KEY_TYPE; } return CRYPTO_OK; } static crypto_error_t crypto_cipher(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src, const bytestring_t* iv, int enc) { unsigned u; unsigned char alg; if (bytestring_get_element(&alg,ctx,0)!=BYTESTRING_OK) return CRYPTO_ERROR_UNKNOWN; if ((bytestring_get_size(src)&0x7)!=0) return CRYPTO_ERROR_BAD_CLEARTEXT_LENGTH; switch (alg) { case CRYPTO_ALG_DES_ECB: bytestring_resize(dst,bytestring_get_size(src)); for (u=0;udata+u*8), (DES_cblock *)(dst->data+u*8), (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE), enc); break; case CRYPTO_ALG_DES_CBC: if (iv==NULL || bytestring_get_size(iv)!=8) return CRYPTO_ERROR_BAD_IV_LENGTH; bytestring_resize(dst,bytestring_get_size(src)); DES_ncbc_encrypt(src->data, dst->data, bytestring_get_size(src), (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE), (DES_cblock *)(iv->data), enc); break; case CRYPTO_ALG_DES2_EDE_ECB: bytestring_resize(dst,bytestring_get_size(src)); for (u=0;udata+u*8), (DES_cblock *)(dst->data+u*8), (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE), (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE+DES_KS_SIZE), enc); break; case CRYPTO_ALG_DES2_EDE_CBC: if (iv==NULL || bytestring_get_size(iv)!=8) return CRYPTO_ERROR_BAD_IV_LENGTH; bytestring_resize(dst,bytestring_get_size(src)); DES_ede2_cbc_encrypt(src->data, dst->data, bytestring_get_size(src), (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE), (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE+DES_KS_SIZE), (DES_cblock *)(iv->data), enc); break; default: return CRYPTO_ERROR_UNKNOWN_ALGORITHM; } return CRYPTO_OK; } static crypto_error_t crypto_pad(bytestring_t* dst, const bytestring_t* ctx,const bytestring_t* src) { unsigned char e; bytestring_copy(dst,src); bytestring_get_element(&e,ctx,1); switch (((unsigned)e)<<8) { case CRYPTO_PAD_OPT_80_ZERO: if ((bytestring_get_size(dst)&0x7)==0) break; case CRYPTO_PAD_ISO9797_P2: bytestring_pushback(dst,0x80); bytestring_pad_right(dst,8,0); break; case CRYPTO_PAD_ZERO: bytestring_pad_right(dst,8,0); break; default: bytestring_clear(dst); return CRYPTO_ERROR_UNKNOWN_PADDING_METHOD; } return CRYPTO_OK; } crypto_error_t crypto_encrypt(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src, const bytestring_t* iv) { unsigned pad_type; bytestring_t *padded_src; crypto_error_t retval; bytestring_get_element((unsigned char *)&pad_type,ctx,1); if (pad_type==0 && (bytestring_get_size(src)&0x7)==0) return crypto_cipher(dst,ctx,src,iv,DES_ENCRYPT); padded_src=bytestring_new(8); retval = crypto_pad(padded_src,ctx,src); if (retval==CRYPTO_OK) { retval = crypto_cipher(dst,ctx,padded_src,iv,DES_ENCRYPT); } bytestring_free(padded_src); return retval; } crypto_error_t crypto_decrypt(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src, const bytestring_t* iv) { return crypto_cipher(dst,ctx,src,iv,DES_DECRYPT); } crypto_error_t crypto_mac(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src) { unsigned u,v; unsigned char tmp[8]; unsigned char clr[8]; unsigned char alg; crypto_error_t retval; bytestring_t *padded_src; bytestring_get_element(&alg,ctx,0); if (alg==CRYPTO_ALG_ISO9797_M3) { padded_src = bytestring_new(8); retval = crypto_pad(padded_src,ctx,src); if (retval!=CRYPTO_OK) { bytestring_free(padded_src); return retval; } memset(tmp,0,8); for (u=0;udata[u*8+v]^tmp[v]; DES_ecb_encrypt((const_DES_cblock *)clr, (DES_cblock *)tmp, (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE), DES_ENCRYPT); } memcpy(clr,tmp,8); DES_ecb_encrypt((const_DES_cblock *)clr, (DES_cblock *)tmp, (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE+DES_KS_SIZE), DES_DECRYPT); memcpy(clr,tmp,8); DES_ecb_encrypt((const_DES_cblock *)clr, (DES_cblock *)tmp, (DES_key_schedule *)(ctx->data+KS_HEADER_SIZE), DES_ENCRYPT); bytestring_assign_data(dst,8,tmp); bytestring_free(padded_src); } else return CRYPTO_ERROR_UNKNOWN_ALGORITHM; return CRYPTO_OK; } crypto_error_t crypto_digest(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src) { unsigned char alg; bytestring_get_element(&alg,ctx,0); if (alg==CRYPTO_ALG_SHA1) { bytestring_resize(dst,SHA_DIGEST_LENGTH); SHA1(src->data,bytestring_get_size(src),dst->data); } else return CRYPTO_ERROR_UNKNOWN_ALGORITHM; return CRYPTO_OK; } const char *CRYTPO_ERROR_STRING[] = { "OK", "Bad key format", "Unknown key type", "Incorrect cleartext length", "Incorrect IV length", "Unknown padding method", "Unknown algorithm", "Unknown error" }; const char *crypto_stringify_error(crypto_error_t err) { if (err * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_bytes.h" #include "bytestring.h" #include "misc.h" #include #include /*** LUA_BYTES: lua encapsulation of bytestring.c ***/ bytestring_t* luaL_check_bytestring(lua_State *L, int p) { void *ud = luaL_checkudata(L,p,"bytes.type"); luaL_argcheck(L, ud != NULL, p, "`bytes' expected"); return *(bytestring_t **)ud; } int luaL_is_bytestring(lua_State *L, int idx) { int retval; void *p; if (idx<0) idx=lua_gettop(L)+idx+1; if ((p = lua_touserdata(L, idx)) == NULL) { return 0; } luaL_getmetatable(L, "bytes.type"); /* pushes one on stack */ if (!lua_getmetatable(L, idx)) { lua_pop(L,1); return 0; } if (!lua_rawequal(L, -1, -2)) retval = 0; else retval = 1; lua_pop(L, 2); return retval; } void lua_push_bytestring(lua_State *L, bytestring_t* bs) { bytestring_t **dst; if (bs==NULL) lua_pushnil(L); else { dst = (bytestring_t **)lua_newuserdata(L, sizeof(bytestring_t *)); /* -2 */ luaL_getmetatable(L, "bytes.type"); /* -1 */ lua_setmetatable(L, -2); *dst = bs; } } static bytestring_t* x_bytes_create(lua_State *L, unsigned width, int start, int end) { bytestring_t *bs=bytestring_new(width); int p; bytestring_t *tmp; for (p=start;p<=end;p++) { switch (lua_type(L,p)) { case LUA_TSTRING: tmp = bytestring_new(width); bytestring_assign_digit_string(tmp,lua_tostring(L,p)); bytestring_append(bs,tmp); bytestring_free(tmp); break; case LUA_TNUMBER: bytestring_pushback(bs,lua_tointeger(L,p)); break; case LUA_TUSERDATA: tmp = luaL_check_bytestring(L,p); bytestring_append(bs,tmp); break; default: luaL_error(L,"wrong type for parameter %d (%s)", p, lua_typename(L,lua_type(L,p))); return NULL; } } return bs; } /******************************************************* * * CONSTRUCTORS */ static int subr_bytes_new(lua_State *L) { int width = luaL_checkint(L, 1); int n = lua_gettop(L); bytestring_t *bs; bs=x_bytes_create(L,width,2,n); lua_push_bytestring(L,bs); return 1; } static int subr_bytes_new_from_chars(lua_State *L) { const char *str = luaL_checkstring(L, 1); bytestring_t *bs = bytestring_new(8); bytestring_assign_data(bs,strlen(str),(const unsigned char *)str); lua_push_bytestring(L,bs); return 1; } static int subr_bytes_concat(lua_State *L) { int i; bytestring_t *bs; int width = 8; /* find the first bytestring and get its width */ for (i=1;i<=lua_gettop(L);i++) { if (lua_isuserdata(L,i)) { bs = luaL_check_bytestring(L, i); width = bs->width; break; } } /* create the result and push it on the stack */ bs = x_bytes_create(L,width,1,lua_gettop(L)); lua_push_bytestring(L,bs); return 1; } /******************************************************* * * DESTRUCTOR */ static int subr_bytes_gc(lua_State *L) { bytestring_t **bs=(bytestring_t **)lua_touserdata(L,1); if (*bs) bytestring_free(*bs); return 0; } /******************************************************* * * META-METHODS */ static int subr_bytes_tostring(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); char *s=bytestring_to_format("%D",bs); lua_pushstring(L,s); free(s); return 1; } static int subr_bytes_len(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); lua_pushnumber(L,bytestring_get_size(bs)); return 1; } static int subr_bytes_eq(lua_State *L) { bytestring_t *a = luaL_check_bytestring(L, 1); bytestring_t *b = luaL_check_bytestring(L, 2); lua_pushboolean(L,bytestring_is_equal(a,b)); return 1; } /****************************************************** * * ITERATOR */ typedef struct { bytestring_t* bs; unsigned index; } bytes_iter_data_t; static int iter_bytes(lua_State *L) { unsigned char c; bytes_iter_data_t *iter = (bytes_iter_data_t *)lua_touserdata(L,lua_upvalueindex(1)); if (iter->indexbs)) { lua_pushnumber(L,iter->index); bytestring_get_element(&c,iter->bs,iter->index++); lua_pushnumber(L,c); return 2; } return 0; } static int subr_bytes_ipairs(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); bytes_iter_data_t *iter = (bytes_iter_data_t *)lua_newuserdata(L,sizeof(bytestring_t)); iter->bs = bs; iter->index = 0; lua_pushcclosure(L, iter_bytes, 1); return 1; } /******************************************************** * * ORDINARY METHODS */ static int subr_bytes_get(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); int b_index; int e_index; int i; unsigned char c; if (lua_isnoneornil(L,2)) b_index = 0; else { b_index=luaL_checkint(L,2); if (b_index<0) b_index = 0; } if (lua_isnoneornil(L,3)) e_index = b_index; else { e_index=luaL_checkint(L,2); if (e_index>=(int)bytestring_get_size(bs)) e_index = bytestring_get_size(bs)-1; } if (e_index2) end=luaL_checkint(L,3); if (start<0) start=bytestring_get_size(bs)+start; if (end<0) end=bytestring_get_size(bs)+end; ret = bytestring_new(bs->width); if (bytestring_substr(ret,start,end-start+1,bs)!=BYTESTRING_OK) { bytestring_free(ret); lua_pushnil(L); return 1; } lua_push_bytestring(L,ret); return 1; } static int subr_bytes_width(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); lua_pushnumber(L,bs->width); return 1; } static int subr_bytes_is_printable(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); lua_pushboolean(L,bytestring_is_printable(bs)==BYTESTRING_OK); return 1; } static int subr_bytes_convert(lua_State *L) { static int warn_obsolete=0; bytestring_t *bs; int width; bytestring_t *ret; if (lua_type(L,2)==LUA_TUSERDATA && lua_type(L,1)==LUA_TNUMBER) { if (!warn_obsolete) { warn_obsolete = 1; log_printf(LOG_WARNING,"The calling convention of bytes.convert() has changed in cardpeek 0.8, please update your scripts\n" "\tchange bytes.convert(A,B) to bytes.convert(B,A)\n" "\tThis warning will only appear once."); } width=luaL_checkint(L,1); bs = luaL_check_bytestring(L, 2); } else { bs = luaL_check_bytestring(L, 1); width=luaL_checkint(L,2); } if (width!=8 && width!=4 && width!=1) return luaL_error(L,"bytes.convert() only recognizes 8, 4 or 1 as parameter value."); ret = bytestring_new(width); if (bytestring_convert(ret,bs)!=BYTESTRING_OK) { bytestring_free(ret); lua_pushnil(L); return 1; } lua_push_bytestring(L,ret); return 1; } static int subr_bytes_to_number(lua_State *L) { bytestring_t *bs = luaL_check_bytestring(L, 1); double ret=bytestring_to_number(bs); lua_pushnumber(L,ret); return 1; } static int subr_bytes_format(lua_State *L) { static int warn_obsolete=0; bytestring_t *bs; const char *format; char *s; if (lua_type(L,2)==LUA_TUSERDATA && lua_type(L,1)==LUA_TSTRING) { if (!warn_obsolete) { warn_obsolete = 1; log_printf(LOG_WARNING,"The calling convention of bytes.format() has changed in version 0.8, please update your scripts\n" "\tchange bytes.format(A,B) to bytes.format(B,A)\n" "\tThis warning will only appear once."); } format = lua_tostring(L,1); bs = luaL_check_bytestring(L,2); } else { bs = luaL_check_bytestring(L,1); format = lua_tostring(L,2); } s=bytestring_to_format(format,bs); lua_pushstring(L,s); free(s); return 1; } static int subr_bytes_index(lua_State *L) { if (lua_gettop(L)<2) return luaL_error(L,"missing arguement to bytes.__index() function."); switch (lua_type(L,2)) { case LUA_TNUMBER: return subr_bytes_get(L); case LUA_TSTRING: luaL_getmetatable(L, "bytes.type"); /* st: mt */ lua_pushvalue(L,2); /* st: mt, key */ lua_rawget(L,-2); /* st: mt, val */ lua_remove(L,-2); /* st: val */ return 1; } return luaL_error(L,"Invalid index type for bytes."); } static int subr_bytes_newindex(lua_State *L) { if (lua_gettop(L)<2) return luaL_error(L,"missing arguement to bytes.__newindex() function."); switch (lua_type(L,2)) { case LUA_TNUMBER: return subr_bytes_set(L); case LUA_TSTRING: return luaL_error(L,"The 'bytes' type does not accept new indices."); } return luaL_error(L,"Invalid index type for bytes."); } /********************************************** * * LUA REGISTRATION */ static const struct luaL_Reg byteslib_m [] = { {"__gc",subr_bytes_gc}, {"__tostring",subr_bytes_tostring}, {"__len",subr_bytes_len}, {"__concat",subr_bytes_concat}, {"__eq", subr_bytes_eq}, {"__index", subr_bytes_index }, {"__newindex", subr_bytes_newindex }, {"ipairs",subr_bytes_ipairs}, {"get",subr_bytes_get}, {"set",subr_bytes_set}, {"pad_left",subr_bytes_pad_left}, {"pad_right",subr_bytes_pad_right}, {"reverse",subr_bytes_reverse}, {"clone",subr_bytes_clone}, {"sub",subr_bytes_sub}, {"width",subr_bytes_width}, {"is_printable",subr_bytes_is_printable}, {"convert",subr_bytes_convert}, {"tonumber",subr_bytes_to_number}, {"format",subr_bytes_format}, {NULL,NULL} }; static const struct luaL_Reg byteslib_f [] = { {"new", subr_bytes_new}, {"new_from_chars",subr_bytes_new_from_chars}, {"concat", subr_bytes_concat}, {"ipairs",subr_bytes_ipairs}, {"get",subr_bytes_get}, {"set",subr_bytes_set}, {"pad_left",subr_bytes_pad_left}, {"pad_right",subr_bytes_pad_right}, {"reverse",subr_bytes_reverse}, {"clone",subr_bytes_clone}, {"sub",subr_bytes_sub}, {"width",subr_bytes_width}, {"is_printable",subr_bytes_is_printable}, {"convert",subr_bytes_convert}, {"tonumber",subr_bytes_to_number}, {"format",subr_bytes_format}, {NULL, NULL} }; int luaopen_bytes(lua_State* L) { luaL_newmetatable(L, "bytes.type"); lua_pushstring(L, "__index"); lua_pushvalue(L, -2); /* pushes the metatable */ lua_settable(L, -3); /* metatable.__index = metatable */ luaL_setfuncs(L, byteslib_m, 0); luaL_newlib(L, byteslib_f); lua_setglobal(L,"bytes"); lua_pop(L,1); /* pop the metatable */ return 1; } cardpeek-0.8/pathconfig.c0000644000175000017500000000567612167310646012372 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "pathconfig.h" #include #include #include #include #include #include "misc.h" const char *PATH_CONFIG_OPTIONS[NUM_PATH_CONFIG_OPTIONS]= { NULL, NULL, "", "scripts", "replay", "logs", "config.lua", "cardpeekrc.lua", "version", "scripts/etc/smartcard_list.txt", "scripts/etc/smartcard_list.download" }; char *PATH_CONFIG_STRING[NUM_PATH_CONFIG_OPTIONS]; int path_config_init(void) { char path_config_string[PATH_MAX]; char current_working_dir[PATH_MAX]; char cardpeek_dir[PATH_MAX]; const char *home_dir; unsigned i; #ifndef _WIN32 home_dir = getenv("HOME"); #else home_dir = getenv("USERDATA"); if (home_dir==NULL) home_dir = getenv("USERPROFILE"); #endif if (home_dir==NULL) return 0; if (getenv("CARDPEEK_DIR")) strncpy(cardpeek_dir,getenv("CARDPEEK_DIR"),PATH_MAX); else snprintf(cardpeek_dir,PATH_MAX,"%s/.cardpeek",home_dir); if (getcwd(current_working_dir,PATH_MAX)) PATH_CONFIG_STRING[0]=strdup(current_working_dir); else PATH_CONFIG_STRING[0]=strdup(home_dir); snprintf(path_config_string,PATH_MAX,"%s/.cardpeek.log",home_dir); PATH_CONFIG_STRING[1]=strdup(path_config_string); for (i=2; iNUM_PATH_CONFIG_OPTIONS) return NULL; return PATH_CONFIG_STRING[c_index]; } int path_config_set_string(unsigned c_index, const char *path) { if (c_index>NUM_PATH_CONFIG_OPTIONS) return 0; if (PATH_CONFIG_STRING[c_index]) free(PATH_CONFIG_STRING[c_index]); if (path) PATH_CONFIG_STRING[c_index]=strdup(path); else PATH_CONFIG_STRING[c_index]=strdup(""); return 1; } void path_config_release(void) { unsigned i; for (i=0; i. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and L1L1@gmx.com about $0: your system, including any error possibly output before $0: this message. Then install a modern shell, or manually $0: run the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='cardpeek' PACKAGE_TARNAME='cardpeek' PACKAGE_VERSION='0.8' PACKAGE_STRING='cardpeek 0.8' PACKAGE_BUGREPORT='L1L1@gmx.com' PACKAGE_URL='' ac_unique_file="main.c" # 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 EGREP GREP CPP GDK_PIXBUF_PIXDATA GLIB_COMPILE_RESOURCES CURL_LIBS CURL_CFLAGS LUA_LIBS LUA_CFLAGS PCSC_LIBS PCSC_CFLAGS GTK_LIBS GTK_CFLAGS GLIB_LIBS GLIB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG host_os host_vendor host_cpu host build_os build_vendor build_cpu build am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V 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_silent_rules enable_dependency_tracking ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GLIB_CFLAGS GLIB_LIBS GTK_CFLAGS GTK_LIBS PCSC_CFLAGS PCSC_LIBS LUA_CFLAGS LUA_LIBS CURL_CFLAGS CURL_LIBS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures cardpeek 0.8 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/cardpeek] --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 cardpeek 0.8:";; 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] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config PCSC_CFLAGS C compiler flags for PCSC, overriding pkg-config PCSC_LIBS linker flags for PCSC, overriding pkg-config LUA_CFLAGS C compiler flags for LUA, overriding pkg-config LUA_LIBS linker flags for LUA, overriding pkg-config CURL_CFLAGS C compiler flags for CURL, overriding pkg-config CURL_LIBS linker flags for CURL, overriding pkg-config CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _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 cardpeek configure 0.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------- ## ## Report this to L1L1@gmx.com ## ## --------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=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 eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func 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 cardpeek $as_me 0.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='cardpeek' VERSION='0.8' 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. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" # silent build by default # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Our own checks 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 ${ac_cv_path_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; 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 as_fn_executable_p "$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 GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.32.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.32.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.32.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.32.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.32.0" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.32.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.32.0) were not met: $GLIB_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 GLIB_CFLAGS and GLIB_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}: result: no" >&5 $as_echo "no" >&6; } { { $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 GLIB_CFLAGS and GLIB_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 GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.4.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.4.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= 3.4.2" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.4.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-3.0 >= 3.4.2) were not met: $GTK_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 GTK_CFLAGS and GTK_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}: result: no" >&5 $as_echo "no" >&6; } { { $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 GTK_CFLAGS and GTK_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 GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi case "${host}" in *-*-darwin*) PCSC_CFLAGS='-Wno-deprecated-declarations -I/System/Library/Frameworks/PCSC.framework/Headers' PCSC_LIBS='-framework PCSC' ;; *) pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCSC" >&5 $as_echo_n "checking for PCSC... " >&6; } if test -n "$PCSC_CFLAGS"; then pkg_cv_PCSC_CFLAGS="$PCSC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcsclite\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcsclite") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PCSC_CFLAGS=`$PKG_CONFIG --cflags "libpcsclite" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PCSC_LIBS"; then pkg_cv_PCSC_LIBS="$PCSC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcsclite\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcsclite") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PCSC_LIBS=`$PKG_CONFIG --libs "libpcsclite" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 PCSC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpcsclite" 2>&1` else PCSC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpcsclite" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PCSC_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpcsclite) were not met: $PCSC_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 PCSC_CFLAGS and PCSC_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}: result: no" >&5 $as_echo "no" >&6; } { { $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 PCSC_CFLAGS and PCSC_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 PCSC_CFLAGS=$pkg_cv_PCSC_CFLAGS PCSC_LIBS=$pkg_cv_PCSC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ;; esac pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua-5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua-5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua-5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua-5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua-5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua-5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua-5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua-5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua >= 5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua >= 5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi elif test $pkg_failed = untried; then { $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 LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua >= 5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua >= 5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi elif test $pkg_failed = untried; then { $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 LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua >= 5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua >= 5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi elif test $pkg_failed = untried; then { $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 LUA" >&5 $as_echo_n "checking for LUA... " >&6; } if test -n "$LUA_CFLAGS"; then pkg_cv_LUA_CFLAGS="$LUA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LUA_LIBS"; then pkg_cv_LUA_LIBS="$LUA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lua >= 5.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "lua >= 5.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lua >= 5.2" 2>&1` else LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lua >= 5.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LUA_PKG_ERRORS" >&5 for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do as_ac_Lib=`$as_echo "ac_cv_lib_$lua_lib_name''_lua_close" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua_close in -l$lua_lib_name" >&5 $as_echo_n "checking for lua_close in -l$lua_lib_name... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lua_lib_name $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 lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : have_liblua=yes else have_liblua=no fi if test $have_liblua = yes; then LUA_CFLAGS="" LUA_LIBS="-l$lua_lib_name" break fi done if test $have_liblua = no; then as_fn_error $? "Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first." "$LINENO" 5 fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else LUA_CFLAGS=$pkg_cv_LUA_CFLAGS LUA_LIBS=$pkg_cv_LUA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CURL" >&5 $as_echo_n "checking for CURL... " >&6; } if test -n "$CURL_CFLAGS"; then pkg_cv_CURL_CFLAGS="$CURL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcurl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CURL_CFLAGS=`$PKG_CONFIG --cflags "libcurl" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$CURL_LIBS"; then pkg_cv_CURL_LIBS="$CURL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcurl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CURL_LIBS=`$PKG_CONFIG --libs "libcurl" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 CURL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcurl" 2>&1` else CURL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcurl" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CURL_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libcurl) were not met: $CURL_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 CURL_CFLAGS and CURL_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}: result: no" >&5 $as_echo "no" >&6; } { { $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 CURL_CFLAGS and CURL_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 CURL_CFLAGS=$pkg_cv_CURL_CFLAGS CURL_LIBS=$pkg_cv_CURL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_free in -lssl" >&5 $as_echo_n "checking for SSL_free in -lssl... " >&6; } if ${ac_cv_lib_ssl_SSL_free+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lssl $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 SSL_free (); int main () { return SSL_free (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ssl_SSL_free=yes else ac_cv_lib_ssl_SSL_free=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_ssl_SSL_free" >&5 $as_echo "$ac_cv_lib_ssl_SSL_free" >&6; } if test "x$ac_cv_lib_ssl_SSL_free" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSSL 1 _ACEOF LIBS="-lssl $LIBS" else as_fn_error $? "Could not find openssl-dev. This program requires the openssl dev. library. Please install it first." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRYPTO_free in -lcrypto" >&5 $as_echo_n "checking for CRYPTO_free in -lcrypto... " >&6; } if ${ac_cv_lib_crypto_CRYPTO_free+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypto $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 CRYPTO_free (); int main () { return CRYPTO_free (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypto_CRYPTO_free=yes else ac_cv_lib_crypto_CRYPTO_free=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_crypto_CRYPTO_free" >&5 $as_echo "$ac_cv_lib_crypto_CRYPTO_free" >&6; } if test "x$ac_cv_lib_crypto_CRYPTO_free" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCRYPTO 1 _ACEOF LIBS="-lcrypto $LIBS" else as_fn_error $? "Could not find openssl-dev. This program requires the openssl dev. library. Please install it first." "$LINENO" 5 fi # Extract the first word of "glib-compile-resources", so it can be a program name with args. set dummy glib-compile-resources; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GLIB_COMPILE_RESOURCES+:} false; then : $as_echo_n "(cached) " >&6 else case $GLIB_COMPILE_RESOURCES in [\\/]* | ?:[\\/]*) ac_cv_path_GLIB_COMPILE_RESOURCES="$GLIB_COMPILE_RESOURCES" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GLIB_COMPILE_RESOURCES="$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 test -z "$ac_cv_path_GLIB_COMPILE_RESOURCES" && ac_cv_path_GLIB_COMPILE_RESOURCES="no" ;; esac fi GLIB_COMPILE_RESOURCES=$ac_cv_path_GLIB_COMPILE_RESOURCES if test -n "$GLIB_COMPILE_RESOURCES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_COMPILE_RESOURCES" >&5 $as_echo "$GLIB_COMPILE_RESOURCES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$GLIB_COMPILE_RESOURCES = xno ; then as_fn_error $? "glib-compile-resources cannot be found in PATH. It is usually included with GTK+2.0 dev. libraries. Please install this tool first. " "$LINENO" 5 fi # Extract the first word of "gdk-pixbuf-pixdata", so it can be a program name with args. set dummy gdk-pixbuf-pixdata; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GDK_PIXBUF_PIXDATA+:} false; then : $as_echo_n "(cached) " >&6 else case $GDK_PIXBUF_PIXDATA in [\\/]* | ?:[\\/]*) ac_cv_path_GDK_PIXBUF_PIXDATA="$GDK_PIXBUF_PIXDATA" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GDK_PIXBUF_PIXDATA="$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 test -z "$ac_cv_path_GDK_PIXBUF_PIXDATA" && ac_cv_path_GDK_PIXBUF_PIXDATA="no" ;; esac fi GDK_PIXBUF_PIXDATA=$ac_cv_path_GDK_PIXBUF_PIXDATA if test -n "$GDK_PIXBUF_PIXDATA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDK_PIXBUF_PIXDATA" >&5 $as_echo "$GDK_PIXBUF_PIXDATA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$GDK_PIXBUF_PIXDATA = xno ; then as_fn_error $? "gdk-pixbuf-pixdata cannot be found in PATH. It is usually included with GTK+2.0 dev. libraries and is needed by glib-compile-resources. Please install this tool first. " "$LINENO" 5 fi # Checks for libraries. # Checks for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h limits.h stdlib.h string.h sys/time.h termios.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi CFLAGS="$GLIB_CFLAGS $CFLAGS" ac_fn_c_check_type "$LINENO" "GStatBuf" "ac_cv_type_GStatBuf" "#include " if test "x$ac_cv_type_GStatBuf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GSTATBUF 1 _ACEOF fi # Checks for library functions. for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if ${ac_cv_func_memcmp_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done for ac_func in bzero getcwd memmove memset select strcasecmp strdup strerror strncasecmp strrchr strtol do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done #AC_PATH_PROG(PDFLATEX,[pdflatex],no) #if test x$PDFLATEX = xno ; then #AC_MSG_WARN([The pdflatex program could not be found. # This is only a problem if you wish to rebuild the pdf documentation # from the LaTeX source in the doc/ sub-directory. # Otherwise this warning can be safely ignored.]) #fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by cardpeek $as_me 0.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ cardpeek config.status 0.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --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" _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" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # 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 >"$ac_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_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; 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="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_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 "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_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 } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi cardpeek-0.8/lua_log.c0000644000175000017500000000316112201420064011636 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_log.h" #include "misc.h" /*********************************************************** * LOG FUNCTIONS */ static int subr_log_print(lua_State* L) { int level = lua_tointeger(L,1); const char *message = luaL_checkstring(L,2); log_printf(level,"%s",message); return 0; } static const struct luaL_Reg loglib [] = { { "print", subr_log_print }, { NULL, NULL} /* sentinel */ }; int luaopen_log(lua_State* L) { luaL_newlib(L,loglib); lua_pushstring(L,"GOOD"); lua_pushinteger(L, 0); lua_settable(L,-3); lua_pushstring(L,"INFO"); lua_pushinteger(L, 1); lua_settable(L,-3); lua_pushstring(L,"WARNING"); lua_pushinteger(L, 2); lua_settable(L,-3); lua_pushstring(L,"ERROR"); lua_pushinteger(L, 3); lua_settable(L,-3); lua_setglobal(L, "log"); return 1; } cardpeek-0.8/update_dot_cardpeek_dir.sh0000644000175000017500000000444512213657631015255 00000000000000#/bin/bash VERSION=`date +%s` SOURCE_DST=`pwd` if [ "x$CARDPEEK_DST"="x" ] then DOT_CARDPEEK_SRC=~/.cardpeek else DOT_CARDPEEK_SRC=$CARDPEEK_DST fi DOT_CARDPEEK_DST="$SOURCE_DST/dot_cardpeek_dir" MODIFIED='no' case "$1" in dryrun) TODO=dryrun ;; update) TODO=update ;; *) echo "Usage: $0 [dryrun|update]" echo " 'dryrun' just prints what the script would do, without actually doing it." echo " 'update' actually does the work." exit ;; esac if [ -d "$DOT_CARDPEEK_SRC" ]; then cd $DOT_CARDPEEK_SRC echo "## Retrieving new files:" IFS=$'\t\n' for i in `find * \! -path replay/\* \! -path scripts.old\*`; do if [ -d "$i" ]; then if [ ! -e "$DOT_CARDPEEK_DST/$i" ]; then echo "!! creating dir $DOT_CARDPEEK_DST/$i" if [ $TODO = "update" ]; then mkdir -p "$DOT_CARDPEEK_DST/$i" MODIFIED='yes' fi fi elif (diff -q "$i" "$DOT_CARDPEEK_DST/$i" | grep differ) &> /dev/null; then if [ "$i" -nt "$DOT_CARDPEEK_DST/$i" ]; then echo ">> $DOT_CARDPEEK_SRC/$i will be copied to $DOT_CARDPEEK_DST/$i" if [ $TODO = "update" ]; then cp -pRv "$i" "$DOT_CARDPEEK_DST/$i" MODIFIED='yes' fi elif [ "$i" -ot "$DOT_CARDPEEK_DST/$i" ]; then echo "<< $DOT_CARDPEEK_SRC/$i will be replaced by $DOT_CARDPEEK_DST/$i" if [ $TODO = "update" ]; then cp -pRv "$DOT_CARDPEEK_DST/$i" "$i" MODIFIED='yes' fi fi fi done if [ "$TODO" = "update" ]; then if [ "$MODIFIED" = 'yes' ]; then echo "## Removing unecessary files and updating directory modfication time:" rm -vf $DOT_CARDPEEK_DST/replay/* touch $DOT_CARDPEEK_DST echo "## Set version info:" echo " Version ID is now $VERSION" echo $VERSION > $DOT_CARDPEEK_DST/version echo $VERSION > $DOT_CARDPEEK_SRC/version cat > "$SOURCE_DST/script_version.h" << __EOF #ifndef SCRIPT_VERSION_H #define SCRIPT_VERSION_H #define SCRIPT_VERSION $VERSION #endif __EOF else echo "## No updates performed." fi fi echo "## Done" else echo "Error: ~/.cardpeek does not exist. Doing nothing" fi cardpeek-0.8/gui.c0000644000175000017500000004422712213657631011027 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui.h" #include "gui_cardview.h" #include "gui_readerview.h" #include "gui_logview.h" #include "gui_scratchpad.h" #include "misc.h" #include "string.h" #include "cardpeek_resources.gresource" /*********************************************************/ /* THE INFAMOUS UGLY GLOBALS *****************************/ /*********************************************************/ GtkWidget *MAIN_WINDOW=NULL; GtkWidget *MAIN_NOTEBOOK=NULL; /*********************************************************/ /* GUI_* FUNCTIONS ***************************************/ /*********************************************************/ int gui_question(const char *message, ...) { va_list al; const char *item; unsigned item_count=0; const char **item_table; gint retval; va_start(al,message); while (va_arg(al,const char *)) item_count++; va_end(al); item_table=g_malloc(sizeof(const char *)*item_count); item_count=0; va_start(al,message); while ((item=va_arg(al,const char *))) item_table[item_count++]=item; va_end(al); retval = gui_question_l(message,item_count,item_table); g_free(item_table); return retval; } int gui_question_l(const char *message, unsigned item_count, const char **items) { GtkWidget *dialog; GtkWidget *label; GtkWidget *hbox; GtkWidget *img; int result; dialog = gtk_dialog_new_with_buttons ("Question", GTK_WINDOW(MAIN_WINDOW), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, NULL, NULL); for (result=0; result<(int)item_count; result++) gtk_dialog_add_button(GTK_DIALOG(dialog),items[result],result); img = gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); label = gtk_label_new(message); gtk_label_set_line_wrap(GTK_LABEL(label),TRUE); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); gtk_widget_show_all(hbox); gtk_container_add (GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox); result = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (result==GTK_RESPONSE_NONE) return -1; return result; } int gui_readline(const char *message, unsigned input_max, char *input) /* input_max does not include final '\0' */ { GtkWidget *dialog; GtkWidget *label; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *img; GtkWidget *entry; gint result; if (input_max==0) { log_printf(LOG_ERROR,"'gui_readline' was called with maximum input length set to 0"); return 0; } if (input==NULL) { log_printf(LOG_ERROR,"'gui_readline' was called with a NULL value"); return 0; } dialog = gtk_dialog_new_with_buttons("Question", GTK_WINDOW(MAIN_WINDOW), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); img = gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); label = gtk_label_new(message); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 10); entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry), input_max); gtk_entry_set_width_chars(GTK_ENTRY(entry),input_max<=80?input_max:80); gtk_entry_set_text(GTK_ENTRY(entry),input); gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 10); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 10); gtk_widget_show_all(hbox); gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox); result = gtk_dialog_run (GTK_DIALOG (dialog)); if (result!=GTK_RESPONSE_ACCEPT) { input[0]=0; gtk_widget_destroy(dialog); return 0; } strncpy(input,gtk_entry_get_text(GTK_ENTRY(entry)),input_max); input[input_max]=0; /* this should not be needed */ gtk_widget_destroy(dialog); return 1; } char **gui_select_file(const char *title, const char *path, const char *filename) { static char *ret_values[2]; GtkWidget *filew; if (filename==NULL) /* open a file - filename==NULL */ { filew = gtk_file_chooser_dialog_new (title, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); } else /* save a file - filename contains the default name */ { filew = gtk_file_chooser_dialog_new (title, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filew), TRUE); } if (path) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filew), path); if (filename) gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filew), filename); if (gtk_dialog_run (GTK_DIALOG (filew)) == GTK_RESPONSE_ACCEPT) { ret_values[0] = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (filew)); ret_values[1] = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filew)); } else { ret_values[0] = NULL; ret_values[1] = NULL; } gtk_widget_destroy (filew); return ret_values; } void gui_update(unsigned lag_allowed) { static unsigned ref=0; unsigned now = time(NULL); if (now-ref * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "smartcard.h" #include "a_string.h" #include "misc.h" #include #include #include #include #include #include #include "pathconfig.h" #include "lua_ext.h" #include "iso7816.h" #ifdef _WIN32 #include "win32/win32compat.h" #else #include #endif int cardmanager_search_pcsc_readers(cardmanager_t *cm); int cardmanager_search_replay_readers(cardmanager_t *cm); /******************************************************************** * CARDMANAGER */ cardmanager_t *cardmanager_new(void) { cardmanager_t *cm = (cardmanager_t *)malloc(sizeof(cardmanager_t)); memset(cm,0,sizeof(cardmanager_t)); cardmanager_search_pcsc_readers(cm); cardmanager_search_replay_readers(cm); return cm; } void cardmanager_free(cardmanager_t* cm) { unsigned u; for (u=0;ureaders_count;u++) free(cm->readers[u]); if (cm->readers) free(cm->readers); free(cm); } unsigned cardmanager_count_readers(cardmanager_t* cm) { return cm->readers_count; } const char *cardmanager_reader_name(cardmanager_t* cm, unsigned n_index) { if (n_indexreaders_count) return cm->readers[n_index]; return NULL; } const char **cardmanager_reader_name_list(cardmanager_t* cm) { return (const char **)cm->readers; } /******************************************************************** * CARDREADER */ #include "gui.h" #include "gui_inprogress.h" #include "drivers/null_driver.c" #include "drivers/pcsc_driver.c" #include "drivers/replay_driver.c" cardreader_t* cardreader_new(const char *card_reader_name) { cardreader_t* reader = (cardreader_t *)malloc(sizeof(cardreader_t)); memset(reader,0,sizeof(cardreader_t)); if (card_reader_name==NULL || strcmp(card_reader_name,"none")==0) { reader->name=strdup("(none)"); if (null_initialize(reader)==0) return NULL; } else if (strncmp(card_reader_name,"pcsc://",7)==0) { reader->name=strdup(card_reader_name); if (pcsc_initialize(reader)==0) return NULL; } else if (strncmp(card_reader_name,"replay://",9)==0) { reader->name=strdup(card_reader_name); if (replay_initialize(reader)==0) return NULL; } else { free(reader); log_printf(LOG_ERROR,"Unknown reader type : %s",card_reader_name); return NULL; } reader->atr=bytestring_new(8); reader->cardlog=cardreplay_new(); return reader; } int cardreader_connect(cardreader_t *reader, unsigned protocol) { int retval = reader->connect(reader,protocol); reader->last_atr(reader); cardreplay_add_reset(reader->cardlog,reader->atr); if (reader->cb_func) reader->cb_func(CARDREADER_EVENT_CONNECT,reader->atr,0,NULL,reader->cb_data); return retval; } int cardreader_disconnect(cardreader_t *reader) { if (reader->cb_func) reader->cb_func(CARDREADER_EVENT_DISCONNECT,NULL,0,NULL,reader->cb_data); return reader->disconnect(reader); } int cardreader_warm_reset(cardreader_t *reader) { int retval = reader->reset(reader); cardreader_last_atr(reader); cardreplay_add_reset(reader->cardlog,reader->atr); if (reader->cb_func) reader->cb_func(CARDREADER_EVENT_RESET,reader->atr,0,NULL,reader->cb_data); return retval; } unsigned short cardreader_transmit(cardreader_t *reader, const bytestring_t* command, bytestring_t *result) { unsigned char SW1; unsigned char SW2; bytestring_t* command_dup; bytestring_t* get_response; bytestring_t* tmp_response; char *tmp; apdu_descriptor_t ad; if (iso7816_describe_apdu(&ad,command)!=ISO7816_OK) { tmp = bytestring_to_format("%D",command); log_printf(LOG_ERROR,"Could not parse APDU format: %s",tmp); free(tmp); return CARDPEEK_ERROR_SW; } tmp = bytestring_to_format("%D",command); if (strlen(tmp)>37) strcpy(tmp+32,"(...)"); log_printf(LOG_INFO,"send: %s [%s]", tmp, iso7816_stringify_apdu_class(ad.apdu_class)); free(tmp); reader->sw = reader->transmit(reader,command,result); cardreplay_add_command(reader->cardlog,command,reader->sw,result); if (reader->cb_func) reader->cb_func(CARDREADER_EVENT_TRANSMIT,command,reader->sw,result,reader->cb_data); SW1 = (reader->sw>>8)&0xFF; SW2 = reader->sw&0xFF; tmp = bytestring_to_format("%D",result); if (strlen(tmp)>37) strcpy(tmp+32,"(...)"); log_printf(LOG_INFO,"Recv: %04X %s [%s]", reader->sw, tmp, iso7816_stringify_sw(reader->sw)); free(tmp); if (SW1==0x6C) /* Re-issue with right length */ { command_dup = bytestring_duplicate(command); if (ad.le_len==3) /* in case of extended le */ bytestring_resize(command_dup,bytestring_get_size(command_dup)-2); bytestring_set_element(command_dup,-1,SW2); reader->sw = cardreader_transmit(reader,command_dup,result); bytestring_free(command_dup); } while (SW1==0x61) /* use Get Response */ { get_response = bytestring_new_from_string("8:00C0000000"); tmp_response = bytestring_new(8); bytestring_set_element(get_response,4,SW2); reader->sw = cardreader_transmit(reader,get_response,tmp_response); bytestring_append_data(result, bytestring_get_size(tmp_response), bytestring_get_data(tmp_response)); bytestring_free(get_response); bytestring_free(tmp_response); SW1 = (reader->sw>>8)&0xFF; SW2 = reader->sw&0xFF; } if (reader->command_interval) usleep(reader->command_interval); return reader->sw; } unsigned short cardreader_get_sw(cardreader_t *reader) { return reader->sw; } const bytestring_t *cardreader_last_atr(cardreader_t *reader) { const bytestring_t *atr = reader->last_atr(reader); char *tmp; if (atr) { tmp = bytestring_to_format("%D",atr); log_printf(LOG_INFO,"ATR is %i bytes: %s",bytestring_get_size(atr),tmp); free(tmp); } return atr; } char** cardreader_get_info(cardreader_t *reader) { char SW_string[5]; unsigned info_count; char **info = reader->get_info(reader); if (info==NULL) info_count = 0; else for (info_count=0; info[info_count]!=NULL; info_count++); info = g_realloc(info, sizeof(char*)*(11+info_count)); info[info_count+0]=g_strdup("reader"); info[info_count+1]=g_strdup(reader->name); info[info_count+2]=g_strdup("connected"); if (reader->connected) info[info_count+3]=g_strdup("TRUE"); else info[info_count+3]=g_strdup("FALSE"); info[info_count+4]=g_strdup("protocol"); if (reader->protocol==PROTOCOL_T0) info[info_count+5]=g_strdup("T0"); else if (reader->protocol==PROTOCOL_T1) info[info_count+5]=g_strdup("T1"); else info[info_count+5]=g_strdup("Undefined"); info[info_count+6]=g_strdup("sw"); sprintf(SW_string,"%u",(unsigned)(reader->sw & 0xFFFF)); info[info_count+7]=g_strdup(SW_string); info[info_count+8]=g_strdup("command_interval"); info[info_count+9]=g_strdup("0"); info[info_count+10]=NULL; return info; } int cardreader_fail(cardreader_t *reader) { return reader->fail(reader); } void cardreader_free(cardreader_t *reader) { reader->finalize(reader); bytestring_free(reader->atr); cardreplay_free(reader->cardlog); free(reader->name); free(reader); } void cardreader_set_command_interval(cardreader_t *reader, unsigned interval) { reader->command_interval=interval; } void cardreader_log_clear(cardreader_t *reader) { if (reader->cb_func) reader->cb_func(CARDREADER_EVENT_CLEAR_LOG,NULL,0,NULL,reader->cb_data); cardreplay_free(reader->cardlog); reader->cardlog=cardreplay_new(); } int cardreader_log_save(const cardreader_t *reader, const char *filename) { if (reader->cb_func) reader->cb_func(CARDREADER_EVENT_SAVE_LOG,NULL,0,NULL,reader->cb_data); return cardreplay_save_to_file(reader->cardlog,filename); } int cardreader_log_count_records(const cardreader_t *reader) { return cardreplay_count_records(reader->cardlog); } /************************************************/ /* this should not be here but in pcsc_driver.c */ static int cardmanager_check_pcscd_is_running(void) { int fd=g_open("/var/pid/pcscd.pid",O_RDONLY,0); if (fd<0) return 0; close(fd); return 1; } /* this should not be here but in pcsc_driver.c */ int cardmanager_search_pcsc_readers(cardmanager_t *cm) { DWORD dwReaders; char *p; LONG hcontext = 0; long status; a_string_t *rlist; char *readers; unsigned r; status = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hcontext); if (status!=SCARD_S_SUCCESS) { log_printf(LOG_INFO,"Failed to establish PCSC card manager context"); log_printf(LOG_INFO,"PCSC error code 0x%08X: %s",status,pcsc_stringify_error(status)); if (cardmanager_check_pcscd_is_running()==0) log_printf(LOG_INFO,"The pcscd daemon does not seem to be running."); else log_printf(LOG_INFO,"The pcscd daemon seems to be running."); return 0; } status = SCardListReaders(hcontext, NULL, NULL, &dwReaders); if (status!=SCARD_S_SUCCESS) { log_printf(LOG_WARNING,"No PCSC reader connected"); log_printf(LOG_INFO,"PCSC error code 0x%08X: %s",status,pcsc_stringify_error(status)); return 0; } readers=(char *)malloc(dwReaders); status = SCardListReaders(hcontext, NULL, readers, &dwReaders); if (status!=SCARD_S_SUCCESS) { log_printf(LOG_WARNING,"PCSC Reader list failed"); log_printf(LOG_INFO,"PCSC error code %lX: %s",status,pcsc_stringify_error(status)); return 0; } p=readers; cm->readers_count=0; while (*p) { cm->readers_count++; p+=strlen(p)+1; } cm->readers=(char **)realloc(cm->readers,sizeof(char*)*cm->readers_count); rlist = a_strnew(NULL); p=readers; for (r=0;rreaders_count;r++) { a_strcpy(rlist,"pcsc://"); a_strcat(rlist,p); cm->readers[r]=strdup(a_strval(rlist)); p+=strlen(p)+1; } a_strfree(rlist); free(readers); log_printf(LOG_DEBUG,"Found %i PCSC readers",cm->readers_count); status = SCardReleaseContext(hcontext); if (status!=SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Failed to release PCSC context"); log_printf(LOG_INFO,"PCSC error code %lX: %s",status,pcsc_stringify_error(status)); } return cm->readers_count; } static int select_clf(DIRENT_T* de) { char *ext=rindex(de->d_name,'.'); if (ext && strcmp(ext,".clf")==0) return 1; return 0; } int cardmanager_search_replay_readers(cardmanager_t *cm) { a_string_t* fn; struct dirent **namelist; const char* log_folder = path_config_get_string(PATH_CONFIG_FOLDER_REPLAY); int count,n; n = scandir(log_folder,&namelist,select_clf,alphasort); if (n<=0) return 0; count=0; cm->readers=(char **)realloc(cm->readers,sizeof(char*)*(cm->readers_count+n)); while (n--) { count++; fn = a_strnew(NULL); a_sprintf(fn,"replay://%s",namelist[n]->d_name); cm->readers[cm->readers_count++]=a_strfinalize(fn); free(namelist[n]); } free(namelist); return count; } void cardreader_set_callback(cardreader_t *reader, cardreader_callback_t func, void *user_data) { reader->cb_func=func; reader->cb_data = user_data; } cardpeek-0.8/lua_ui.h0000644000175000017500000000160412160275534011515 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_UI_H #include int luaopen_ui(lua_State* L); #endif cardpeek-0.8/lua_nodes.c0000644000175000017500000003534312201427153012202 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_ui.h" #include "gui.h" #include "gui_cardview.h" #include "dyntree_model.h" #include "misc.h" #include #include #include "bytestring.h" #include "lua_bytes.h" #include #include #include "lua_nodes.h" GtkTreeIter PSEUDO_ROOT; /*********************************************************** * SOME HELPER FUNCTIONS */ static GtkTreeIter* luaL_check_node_ref(lua_State *L, int p) { void *ud = luaL_checkudata(L,p,"node_ref.type"); luaL_argcheck(L, ud != NULL, p, "`node_ref' expected"); return (GtkTreeIter *)ud; } static void lua_push_node_ref(lua_State *L, GtkTreeIter *iter) /* Pushes iter on the stack, without deep copy */ { GtkTreeIter *dst; if (iter==NULL) lua_pushnil(L); else { dst = (GtkTreeIter *)lua_newuserdata(L, sizeof(GtkTreeIter)); luaL_getmetatable(L, "node_ref.type"); lua_setmetatable(L, -2); *dst = *iter; } } static gboolean internal_is_pseudo_root(GtkTreeIter *iter) { return (iter->stamp==0x1B16BEEF && iter->user_data==NULL); } static GtkTreeIter* luaL_check_node_ref_no_pseudo_root(lua_State* L, int p) { GtkTreeIter *iter = luaL_check_node_ref(L,p); if (internal_is_pseudo_root(iter)) { luaL_error(L,"This function cannot be applied to the root node."); return NULL; } return iter; } static char *internal_bytes_or_string_dup(lua_State* L, int lindex) { bytestring_t *bytes; const char* str; char *retval; if (luaL_is_bytestring(L,lindex)) { bytes = luaL_check_bytestring(L,lindex); retval = bytestring_to_format("%S",bytes); } else if (lua_isstring(L,lindex)) { str = luaL_checkstring(L,lindex); retval = g_strdup_printf("t:%s",str); } else { luaL_error(L,"Expected either a bytestring or a string, but got %s instead",lua_typename(L,lua_type(L,lindex))); return NULL; /* never reached */ } return retval; } static void internal_bytes_or_string_push(lua_State* L, const char *src) { if (src) { switch (src[0]) { case 't': lua_pushstring(L,src+2); break; case '8': case '4': case '1': lua_push_bytestring(L,bytestring_new_from_string(src)); break; case 0: lua_pushnil(L); break; default: log_printf(LOG_ERROR,"Unrecognized attribute format code (0x%02X) in '%s'",src[0],src); luaL_error(L,"Internal error. Please report this bug."); } } else lua_pushnil(L); } typedef struct { unsigned size; int *indices; const char **names; char **values; } attr_table_t; static void internal_empty_table(attr_table_t *table) { unsigned u; for (u=0;usize;u++) { /* table->names[u] is const, no de-alloc */ if (table->values[u]) g_free(table->values[u]); } if (table->indices) { g_free(table->indices); table->indices = NULL; } if (table->values) { g_free(table->values); table->values = NULL; } if (table->names) { g_free(table->names); table->names = NULL; } table->size=0; } static gboolean internal_fill_table(lua_State* L, int lindex, attr_table_t *table) { unsigned u; const char *attr_name; luaL_checktype(L, lindex, LUA_TTABLE); lua_pushnil(L); table->size=0; while (lua_next(L,-2)!=0) { if (!lua_isstring(L,-2)) { luaL_error(L,"Expected string for attribute key in table, got %s instead",lua_typename(L,lua_type(L,-2))); return FALSE; } if (!luaL_is_bytestring(L,-1) && !lua_isstring(L,-1)) { attr_name = lua_tostring(L,-2); luaL_error(L,"Expected bytestring or string for value of attribute '%s' in table, got %s instead",attr_name,lua_typename(L,lua_type(L,-1))); return FALSE; } lua_pop(L,1); table->size++; } if (table->size==0) return FALSE; table->indices = g_malloc0((sizeof(int)*table->size)); table->names = g_malloc0((sizeof(char*)*table->size)); table->values = g_malloc0((sizeof(char*)*table->size)); lua_pushnil(L); u=0; while (lua_next(L,lindex)!=0) { table->indices[u] = -1; table->names[u] = lua_tostring(L,-2); table->values[u] = internal_bytes_or_string_dup(L,-1); lua_pop(L,1); u++; } return TRUE; } static gboolean internal_index_table(attr_table_t *table) { unsigned u; for (u=0;usize;u++) { if ((table->indices[u] = dyntree_model_column_name_to_index(gui_cardview_get_store(),table->names[u]))<0) return FALSE; } return TRUE; } /************************************* * USER INTERFACE FUNCTIONS */ static int subr_nodes_root(lua_State* L) { lua_push_node_ref(L,&PSEUDO_ROOT); return 1; } static int subr_nodes_append(lua_State* L) { GtkTreeIter *parent; /*1*/ char *classname; GtkTreeIter node; attr_table_t table; unsigned u; if (lua_gettop(L)>2) { lua_pushstring(L, "node.append() takes at most two arguments: a parent and either a classname or a table."); lua_error(L); } parent=luaL_check_node_ref(L,1); if (internal_is_pseudo_root(parent)) parent = NULL; dyntree_model_iter_append(gui_cardview_get_store(),&node,parent); switch (lua_type(L,2)) { case LUA_TNONE: case LUA_TNIL: dyntree_model_iter_attribute_set(gui_cardview_get_store(),&node,CC_CLASSNAME,"t:item"); break; case LUA_TTABLE: if (internal_fill_table(L,2,&table)) { for (u=0;uindexcount) { if (dyntree_model_iter_attribute_get(gui_cardview_get_store(),attr->iter,attr->index,&attr_value)) { if (attr_value) { attr_name = dyntree_model_column_index_to_name(gui_cardview_get_store(),attr->index++); lua_pushstring(L,attr_name); internal_bytes_or_string_push(L,attr_value); return 2; } } attr->index++; } return 0; } static int subr_nodes_attributes(lua_State* L) { GtkTreeIter *iter = luaL_check_node_ref_no_pseudo_root(L,1); attribute_iter_data_t *attr = (attribute_iter_data_t *)lua_newuserdata(L,sizeof(attribute_iter_data_t)); attr->index = 0; attr->count = dyntree_model_get_n_columns(GTK_TREE_MODEL(gui_cardview_get_store())); attr->iter = iter; lua_pushcclosure(L, iter_attribute, 1); return 1; } typedef struct { int has_more; GtkTreeIter iter; } children_iter_data_t; static int iter_children(lua_State* L) { children_iter_data_t *children = (children_iter_data_t *)lua_touserdata(L,lua_upvalueindex(1)); if (children->has_more) { lua_push_node_ref(L,&(children->iter)); children->has_more = gtk_tree_model_iter_next(GTK_TREE_MODEL(gui_cardview_get_store()),&(children->iter)); return 1; } return 0; } static int subr_nodes_children(lua_State *L) { GtkTreeIter *parent; children_iter_data_t *children; parent = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(parent)) parent = NULL; children = (children_iter_data_t *)lua_newuserdata(L,sizeof(children_iter_data_t)); children->has_more = gtk_tree_model_iter_children(GTK_TREE_MODEL(gui_cardview_get_store()),&(children->iter),parent); lua_pushcclosure(L, iter_children, 1); return 1; } static int subr_nodes_parent(lua_State *L) { GtkTreeIter *iter = luaL_check_node_ref_no_pseudo_root(L,1); GtkTreeIter ret; if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(gui_cardview_get_store()),&ret,iter)) lua_push_node_ref(L,&ret); else lua_pushnil(L); return 1; } static int subr_nodes_remove(lua_State* L) { GtkTreeIter* iter = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(iter)) iter = NULL; if (!dyntree_model_iter_remove(gui_cardview_get_store(),iter)) lua_pushboolean(L,0); else lua_pushboolean(L,1); gui_update(1); return 1; } static int subr_nodes_find_first(lua_State* L) { GtkTreeIter* iter; attr_table_t table; GtkTreeIter node; iter = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(iter)) iter = NULL; if (internal_fill_table(L,2,&table)) { if (internal_index_table(&table)) { if (dyntree_model_iter_find_first(gui_cardview_get_store(),&node,iter,table.indices,table.values,table.size)) lua_push_node_ref(L,&node); else lua_pushnil(L); } else lua_pushnil(L); internal_empty_table(&table); } else lua_pushnil(L); return 1; } typedef struct { int has_more; GtkTreeIter *iter; GtkTreeIter node; attr_table_t table; } nodes_iter_data_t; static int iter_find(lua_State* L) { nodes_iter_data_t *nodes = (nodes_iter_data_t *)lua_touserdata(L,lua_upvalueindex(1)); if (nodes->has_more) { lua_push_node_ref(L,&(nodes->node)); nodes->has_more = dyntree_model_iter_find_next(gui_cardview_get_store(), &(nodes->node), nodes->iter, nodes->table.indices, nodes->table.values, nodes->table.size); return 1; } return 0; } static int iter_find_gc(lua_State *L) { nodes_iter_data_t *nodes = (nodes_iter_data_t *)lua_touserdata(L,1); internal_empty_table(&(nodes->table)); return 0; } static int subr_nodes_find(lua_State* L) { GtkTreeIter *iter; nodes_iter_data_t *nodes; attr_table_t table; iter = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(iter)) iter = NULL; if (internal_fill_table(L,2,&table)) { if (internal_index_table(&table)) { nodes = (nodes_iter_data_t *)lua_newuserdata(L, sizeof(nodes_iter_data_t)); luaL_getmetatable(L,"node_iter.type"); lua_setmetatable(L, -2); nodes->table = table; nodes->iter = iter; nodes->has_more = dyntree_model_iter_find_first(gui_cardview_get_store(), &(nodes->node), nodes->iter, nodes->table.indices, nodes->table.values, nodes->table.size); lua_pushcclosure(L, iter_find, 1); return 1; } internal_empty_table(&table); } lua_pushnil(L); return 1; } static int subr_nodes_to_xml(lua_State* L) { GtkTreeIter *iter; char *res; iter = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(iter)) iter = NULL; res = dyntree_model_iter_to_xml(gui_cardview_get_store(),iter,TRUE); if (res==NULL) { lua_pushnil(L); } else { lua_pushstring(L,res); free(res); } return 1; } static int subr_nodes_append_xml(lua_State* L) { GtkTreeIter *iter; const char *xml; gboolean res; iter = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(iter)) iter = NULL; xml = luaL_checkstring(L,2); res = dyntree_model_iter_from_xml(gui_cardview_get_store(),iter,TRUE,xml,-1); lua_pushboolean(L,res); return 1; } static int subr_nodes_tostring(lua_State* L) { GtkTreeIter *iter; char buf[20]; iter = luaL_check_node_ref(L,1); if (internal_is_pseudo_root(iter)) g_sprintf(buf,"@node(ROOT)"); else g_sprintf(buf,"@node(%p)",iter->user_data); lua_pushstring(L,buf); return 1; } static const struct luaL_Reg nodelib_f [] = { {"root", subr_nodes_root }, {"append", subr_nodes_append }, {"children", subr_nodes_children }, {"parent", subr_nodes_parent }, {"attributes", subr_nodes_attributes }, {"remove", subr_nodes_remove }, {"find_first", subr_nodes_find_first }, {"find", subr_nodes_find }, {"set_attribute", subr_nodes_set_attribute }, {"get_attribute", subr_nodes_get_attribute }, {"to_xml", subr_nodes_to_xml }, {"append_xml", subr_nodes_append_xml }, {NULL,NULL} /* sentinel */ }; static const struct luaL_Reg nodelib_m [] = { {"__tostring", subr_nodes_tostring }, {"append", subr_nodes_append }, {"children", subr_nodes_children }, {"parent", subr_nodes_parent }, {"attributes", subr_nodes_attributes }, {"remove", subr_nodes_remove }, {"find_first", subr_nodes_find_first }, {"find", subr_nodes_find }, {"set_attribute", subr_nodes_set_attribute }, {"get_attribute", subr_nodes_get_attribute }, {"to_xml", subr_nodes_to_xml }, {"append_xml", subr_nodes_append_xml }, {NULL,NULL} /* sentinel */ }; int luaopen_nodes(lua_State* L) { PSEUDO_ROOT.stamp = 0x1B16BEEF; PSEUDO_ROOT.user_data = NULL; luaL_newmetatable(L, "node_iter.type"); lua_pushstring(L, "__gc"); lua_pushcfunction(L, iter_find_gc); lua_settable(L,-3); luaL_newmetatable(L, "node_ref.type"); lua_pushstring(L, "__index"); lua_pushvalue(L, -2); /* pushes the metatable */ lua_settable(L, -3); /* metatable.__index = metatable */ luaL_setfuncs(L, nodelib_m, 0); luaL_newlib(L, nodelib_f); lua_setglobal(L,"nodes"); lua_pop(L,2); /* pop the two metatables */ return 1; } cardpeek-0.8/gui_logview.c0000644000175000017500000000771412213657631012563 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui.h" #include "gui_logview.h" #include "misc.h" #include /*********************************************************/ /* THE INFAMOUS UGLY GLOBALS *****************************/ /*********************************************************/ GtkTextBuffer* LOG_BUFFER=NULL; GtkWidget* LOG_WINDOW=NULL; GtkStatusbar *STATUS_BAR=NULL; guint STATUS_BAR_CONTEXT_ID=0; /*********************************************************/ /* LOG FUNCTIONS AND UI CALLBACKS ************************/ /*********************************************************/ static void gui_logview_function(int log_level, const char* str) { GtkTextIter iter; GtkAdjustment* adj; const char* tag; char status_bar_text[160]; if (!LOG_BUFFER) return; switch (log_level) { case LOG_INFO: tag = "green_text"; break; case LOG_DEBUG: tag = "black_text"; break; case LOG_WARNING: tag = "purple_text"; break; case LOG_ERROR: default: tag = "red_text"; } gtk_text_buffer_get_iter_at_offset (LOG_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(LOG_BUFFER,&iter,str,-1,tag,NULL); if (LOG_WINDOW) { adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(LOG_WINDOW)); gtk_adjustment_set_value(adj,gtk_adjustment_get_upper(adj)); gtk_adjustment_value_changed(adj); } if (STATUS_BAR) { strncpy(status_bar_text,str,160); status_bar_text[159]=0; if (status_bar_text[strlen(status_bar_text)-1]<' ') status_bar_text[strlen(status_bar_text)-1]=0; gtk_statusbar_pop (STATUS_BAR, STATUS_BAR_CONTEXT_ID); gtk_statusbar_push (STATUS_BAR, STATUS_BAR_CONTEXT_ID,status_bar_text); } gui_update(1); } GtkWidget *gui_logview_create_window(void) { GtkWidget *view; PangoFontDescription *font_desc; view = gtk_text_view_new (); LOG_BUFFER = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); gtk_text_view_set_editable(GTK_TEXT_VIEW (view),FALSE); gtk_text_buffer_create_tag(LOG_BUFFER,"black_text", "foreground","black", NULL); gtk_text_buffer_create_tag(LOG_BUFFER,"green_text", "foreground","dark green", NULL); gtk_text_buffer_create_tag(LOG_BUFFER,"purple_text", "foreground","purple", NULL); gtk_text_buffer_create_tag(LOG_BUFFER,"red_text", "foreground","dark red", NULL); font_desc = pango_font_description_from_string ("Monospace"); gtk_widget_modify_font (view, font_desc); pango_font_description_free (font_desc); LOG_WINDOW = GTK_WIDGET(gtk_scrolled_window_new (NULL, NULL)); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (LOG_WINDOW), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (LOG_WINDOW), view); log_set_function(gui_logview_function); return GTK_WIDGET(LOG_WINDOW); } GtkWidget *gui_logview_create_status_bar(void) { GtkWidget* status = gtk_statusbar_new (); STATUS_BAR = GTK_STATUSBAR(status); STATUS_BAR_CONTEXT_ID = gtk_statusbar_get_context_id(STATUS_BAR,"main"); return status; } void gui_logview_cleanup(void) { LOG_BUFFER = NULL; log_set_function(NULL); LOG_WINDOW=NULL; STATUS_BAR=NULL; } cardpeek-0.8/cardpeek_resources.gresource.xml0000644000175000017500000000155412135142304016447 00000000000000 dot_cardpeek.tar.gz icons/analyzer.png icons/application.png icons/block.png icons/record.png icons/cardpeek.png icons/file.png icons/folder.png icons/item.png icons/smartcard.png icons/atr.png icons/header.png icons/body.png AUTHORS cardpeek-0.8/dot_cardpeek_dir/0000755000175000017500000000000012214321142013412 500000000000000cardpeek-0.8/dot_cardpeek_dir/replay/0000755000175000017500000000000012214321142014706 500000000000000cardpeek-0.8/dot_cardpeek_dir/config.lua0000644000175000017500000000074112213657631015322 00000000000000-- -- This file is automatically generated by Cardpeek. -- It holds cardpeek configuration parameters, which are stored in the -- lua 'cardpeek' table. -- -- See cardpeekrc.lua for adding your own functions and variables to -- cardpeek. -- cardpeek = { ['smartcard_list'] = { ['next_update'] = 1380292091, ['auto_update'] = true, ['url'] = "http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt", }, } dofile('scripts/lib/apdu.lua') -- end -- cardpeek-0.8/dot_cardpeek_dir/cardpeekrc.lua0000644000175000017500000000031712165352366016162 00000000000000-- This file is free for the user to modify -- It is executed after config.lua -- The next line is needed for card commands. dofile("scripts/lib/apdu.lua") dofile("scripts/lib/compatibility-with-0.7.lua") cardpeek-0.8/dot_cardpeek_dir/scripts/0000755000175000017500000000000012214321142015101 500000000000000cardpeek-0.8/dot_cardpeek_dir/scripts/emv.lua0000644000175000017500000005124412155053151016327 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- @name EMV -- @description Bank cards 'PIN and chip' -- @targets 0.8 -- -- History: -- Aug 07 2010: Corrected bug in GPO command. -- Aug 08 2010: Corrected bug in AFL data processing -- Mar 27 2011: Added CVM patch from Adam Laurie. -- Jan 23 2012: Added UK Post Office Card Account in AID list from Tyson Key. -- Mar 25 2012: Added a few AIDs require('lib.tlv') require('lib.strict') -------------------------------------------------------------------------- -- GLOBAL EMV CARD COMMANDS extending general lib.apdu -------------------------------------------------------------------------- function card.get_processing_options(pdol) local command; if pdol and #pdol>0 then command = bytes.new(8,"80 A8 00 00",#pdol+2,0x83,#pdol,pdol,"00") else command = bytes.new(8,"80 A8 00 00 02 83 00 00") end return card.send(command) end -- override card.get_data() for EMV function card.get_data(data) local command = bytes.new(8,"80 CA",bit.AND(bit.SHR(data,8),0xFF),bit.AND(data,0xFF),0) return card.send(command) end -- ------------------------------------------------------------------------ -- EMV -- ------------------------------------------------------------------------ TRANSACTION_TYPE = { [0]="Purchase", [1]="Cash" } function ui_parse_transaction_type(node,cc) local tt = TRANSACTION_TYPE[cc[0]] if tt == nil then return tostring(cc) end nodes.set_attribute(node,"val",cc) nodes.set_attribute(node,"alt",tt) return true end function ui_parse_CVM(node,data) local i local left local right local leftstring local rightstring local subnode local out nodes.append(node,{ classname="item", label="X", size=4, val=bytes.sub(data,0,3)}) nodes.append(node,{ classname="item", label="Y", size=4, val=bytes.sub(data,4,7)}) for i= 4,(#data/2)-1 do subnode = nodes.append(node, { classname="item", label="CVM", id=i-3, size=2, val=bytes.sub(data,i*2,i*2+1)}) left = data:get(i*2) right = data:get(i*2+1) if bit.AND(left,0x40) == 0x40 then out = "Apply succeeding CV rule if this rule is unsuccessful: " else out = "Fail cardholder verification if this CVM is unsuccessful: " end if CVM_REFERENCE_BYTE1[bit.AND(left,0xBF)] == nil then leftstring = string.format("Unknown (%02X)",left) else leftstring = CVM_REFERENCE_BYTE1[bit.AND(left,0xBF)] end if CVM_REFERENCE_BYTE2[right] == nil then rightstring = string.format("Unknown (%02X)",right) else rightstring = CVM_REFERENCE_BYTE2[right] end out = out .. leftstring .. " - " .. rightstring nodes.set_attribute(subnode,"alt",out) end nodes.set_attribute(node,"val",data) return true end CVM_REFERENCE_BYTE1 = { [0x00] = "Fail CVM processing", [0x01] = "Plaintext PIN verification performed by ICC", [0x02] = "Enciphered PIN verified online", [0x03] = "Plaintext PIN verification performed by ICC and signature (paper)", [0x04] = "Enciphered PIN verification performed by ICC", [0x05] = "Enciphered PIN verification performed by ICC and signature (paper)", [0x1E] = "Signature (paper)", [0x1F] = "No CVM Required", } CVM_REFERENCE_BYTE2 = { [0x00] = "Always", [0x01] = "If unattended cash", [0x02] = "If not attended cash and not manual cash and not purchase with cashback", [0x03] = "If terminal supports the CVM", [0x04] = "If manual cash", [0x05] = "If purchase with cashback", [0x06] = "If transaction is in the application currency and is under X value", [0x07] = "If transaction is in the application currency and is over X value", [0x08] = "If transaction is in the application currency and is under Y value", [0x09] = "If transaction is in the application currency and is over Y value" } EMV_REFERENCE = { ['5D'] = {"Directory Definition File (DDF) Name" }, ['70'] = {"Application Data File (ADF)" }, ['80'] = {"Response Message Template Format 1" }, ['82'] = {"Application Interchange Profile (AIP)" }, ['87'] = {"Application Priority Indicator" }, ['88'] = {"Short File Identifier (SFI)" }, ['8C'] = {"Card Risk Management Data Object List 1 (CDOL1)" }, ['8D'] = {"Card Risk Management Data Object List 2 (CDOL2)" }, ['8E'] = {"Cardholder Verification Method (CVM) List", ui_parse_CVM }, ['8F'] = {"Certificate Authority Public Key Index (PKI)" }, ['90'] = {"Issuer PK Certificate" }, ['91'] = {"Issuer Authentication Data" }, ['92'] = {"Issuer PK Remainder" }, ['93'] = {"Signed Static Application Data" }, ['94'] = {"Application File Locator (AFL)" }, ['95'] = {"Terminal Verification Results (TVR)" }, ['97'] = {"Transaction Certificate Data Object List (TDOL)" }, ['9A'] = {"Transaction Date", ui_parse_YYMMDD }, ['9C'] = {"Transaction Type", ui_parse_transaction_type }, ['A5'] = {"FCI Proprietary Template" }, ['9F02'] = {"Amount, Authorized" }, ['9F03'] = {"Amount, Other" }, ['9F05'] = {"Application Discretionary Data" }, ['9F07'] = {"Application Usage Control" }, ['9F08'] = {"Application Version Number" }, ['9F0B'] = {"Cardholder Name - Extended" }, ['9F0D'] = {"Issuer Action Code - Default" }, ['9F0E'] = {"Issuer Action Code - Denial" }, ['9F0F'] = {"Issuer Action Code - Online" }, ['9F10'] = {"Issuer Application Data" }, ['9F11'] = {"Issuer Code Table Index" }, ['9F12'] = {"Application Preferred Name" }, ['9F13'] = {"Last Online ATC Register" }, ['9F14'] = {"Lower Consecutive Offline Limit (Terminal Check)" }, ['9F17'] = {"PIN Try Counter", ui_parse_number }, ['9F19'] = {"Dynamic Data Authentication Data Object List (DDOL)" }, ['9F1A'] = {"Terminal Country Code", ui_parse_country_code }, ['9F1F'] = {"Track 1 Discretionary Data", ui_parse_printable }, ['9F23'] = {"Upper Consecutive Offline Limit (Terminal Check)" }, ['9F26'] = {"Application Cryptogram (AC)" }, ['9F27'] = {"Cryptogram Information Data" }, ['9F2D'] = {"ICC PIN Encipherment Public Key Certificate" }, ['9F2E'] = {"ICC PIN Encipherment Public Key Exponent" }, ['9F2F'] = {"ICC PIN Encipherment Public Key Remainder" }, ['9F32'] = {"Issuer PK Exponent" }, ['9F36'] = {"Application Transaction Counter (ATC)" }, ['9F38'] = {"Processing Options Data Object List (PDOL)" }, ['9F42'] = {"Application Currency Code" }, ['9F44'] = {"Application Currency Exponent" }, ['9F45'] = {"Data Authentication Code" }, ['9F46'] = {"ICC Public Key Certificate" }, ['9F47'] = {"ICC Public Key Exponent" }, ['9F48'] = {"ICC Public Key Remainder" }, ['9F4A'] = {"Static Data Authentication Tag List" }, ['9F4B'] = {"Signed Dynamic Application Data" }, ['9F4C'] = {"Integrated Circuit Card (ICC) Dynamic Number" }, ['9F4D'] = {"Log Entry" }, ['9F4F'] = {"Log Fromat" }, ['9F51'] = {"Application Currency Code" }, ['9F52'] = {"Card Verification Results (CVR)" }, ['9F53'] = {"Consecutive Transaction Limit (International)" }, ['9F54'] = {"Cumulative Total Transaction Amount Limit" }, ['9F55'] = {"Geographic Indicator" }, ['9F56'] = {"Issuer Authentication Indicator" }, ['9F57'] = {"Issuer Country Code" }, ['9F58'] = {"Lower Consecutive Offline Limit (Card Check)" }, ['9F59'] = {"Upper Consecutive Offline Limit (Card Check)" }, ['9F5A'] = {"Issuer URL2" }, ['9F5C'] = {"Cumulative Total Transaction Amount Upper Limit" }, ['9F72'] = {"Consecutive Transaction Limit (International - Country)" }, ['9F73'] = {"Currency Conversion Factor" }, ['9F74'] = {"VLP Issuer Authorization Code" }, ['9F75'] = {"Cumulative Total Transaction Amount Limit - Dual Currency" }, ['9F76'] = {"Secondary Application Currency Code" }, ['9F77'] = {"VLP Funds Limit" }, ['9F78'] = {"VLP Single Transaction Limit" }, ['9F79'] = {"VLP Available Funds" }, ['9F7F'] = {"Card Production Life Cycle (CPLC) History File Identifiers" }, ['BF0C'] = {"FCI Issuer Discretionary Data" } } function emv_parse(cardenv,tlv) return tlv_parse(cardenv,tlv,EMV_REFERENCE) end PPSE = "#325041592E5359532E4444463031" PSE = "#315041592E5359532E4444463031" -- AID_LIST enhanced with information from Wikipedia -- http://en.wikipedia.org/wiki/EMV AID_LIST = { "#A0000000421010", -- French CB "#A0000000422010", -- French CB "#A0000000031010", -- Visa credit or debit "#A0000000032010", -- Visa electron "#A0000000032020", -- V pay "#A0000000032010", -- Visa electron "#A0000000041010", -- Mastercard credit or debit "#A0000000042010", -- "#A0000000043060", -- Mastercard Maestro "#A0000000046000", -- Mastercard Cirrus "#A00000006900", -- FR Moneo "#A0000001850002", -- UK Post Office Card Account card "#A00000002501", -- American Express "#A0000001523010", -- Diners club } EXTRA_DATA = { 0x9F36, 0x9F13, 0x9F17, 0x9F4D, 0x9F4F } function emv_process_ppse(cardenv) local sw, resp local APP local dirent sw, resp = card.select(PPSE) if sw ~= 0x9000 then log.print(log.INFO,"No PPSE") return false end -- Construct tree APP = nodes.append(cardenv, {classname="application", label="application", id=PPSE}) emv_parse(APP,resp) AID_LIST = {} for dirent in nodes.find(APP,{ id="4F" }) do aid = tostring(nodes.get_attribute(dirent,"val")) log.print(log.INFO,"PPSE contains application #" .. aid) table.insert(AID_LIST,"#"..aid) end return true end function emv_process_pse(cardenv) local sw, resp local APP local ref local sfi local FILE local rec local REC local RECORD local aid local warm_atr local tag4F sw, resp = card.select(PSE) -- Could it be a french card? if sw == 0x6E00 then card.warm_reset() warm_atr = card.last_atr() nodes.append(cardenv, {classname="atr", label="ATR", id="warm", size=#warm_atr, val=warm_atr}) sw, resp = card.select(PSE) end -- could it be a contactless smartcard? if sw == 0x6A82 then return emv_process_ppse(cardenv) end if sw ~= 0x9000 then log.print(log.INFO,"No PSE") return false end -- Construct tree APP = nodes.append(cardenv, {classname="application", label="application", id=PSE}) emv_parse(APP,resp) ref = nodes.find_first(APP,{id="88"}) if (ref) then sfi = nodes.get_attribute(ref,"val") FILE = nodes.append(APP,{classname="file", label="file", id=sfi[0]}) rec = 1 AID_LIST = {} repeat sw,resp = card.read_record(sfi:get(0),rec) if sw == 0x9000 then RECORD = nodes.append(FILE, {classname="record", label="record", id=tostring(rec)}) emv_parse(RECORD,resp) tag4F = nodes.find_first(RECORD,{id="4F"}) if (tag4F) then aid = tostring(nodes.get_attribute(tag4F,"val")) log.print(log.INFO,"PSE contains application #" .. aid) table.insert(AID_LIST,"#"..aid) rec = rec + 1 end end until sw ~= 0x9000 else log.print(log.WARNING,"SFI indicator (tag 88) not found in PSE") end return true end function visa_process_application_logs(application, log_sfi, log_max) local sw, resp local LOG_FILE local LOG_DATA local LOG_FORMAT local log_recno LOG_FILE = nodes.append(application,{ classname="file", label="file", id=tostring(log_sfi)}) LOG_DATA = nodes.append(LOG_FILE, { classname="item", label = "log data"}) log.print(log.INFO,string.format("Reading LOG SFI %i",log_sfi)) for log_recno =1,log_max do sw,resp = card.read_record(log_sfi, log_recno) if sw ~= 0x9000 then log.print(log.WARNING,"Read log record failed") break else nodes.append(LOG_DATA,{ classname = "record", label="record", id=log_recno, size=#resp, val=resp}) end end end function emv_process_application_logs(application, log_sfi, log_max) local log_format local log_tag local log_items = { } local sw, resp local tag local tag_name local tag_func local len local i local item local item_pos local LOG_FILE local LOG_DATA local LOG_FORMAT local REC local ITEM local ITEM_AMOUNT local log_recno local data local currency_code, currency_name, currency_digits LOG_FILE = nodes.append(application, { classname="file", label="log file", id=log_sfi}) LOG_FORMAT = nodes.append(LOG_FILE, { classname="block", label="log format"}) log_format = application:find_first({id = "9F4F"}):get_attribute("val") i = 1 item = "" nodes.set_attribute(LOG_FORMAT,"val",log_format); while log_format do tag, log_format = asn1.split_tag(log_format) len, log_format = asn1.split_length(log_format) tag_name, tag_func = tlv_tag_info(tag,EMV_REFERENCE,0); log_items[i]= { tag, len, tag_name, tag_func } i = i+1 item = item .. string.format("%X[%d] ", tag, len); end nodes.set_attribute(LOG_FORMAT,"alt",item); log.print(log.INFO,string.format("Reading LOG SFI %i",log_sfi)) for log_recno =1,log_max do sw,resp = card.read_record(log_sfi,log_recno) if sw ~= 0x9000 then log.print(log.WARNING,"Read log record failed") break else REC = nodes.append(LOG_FILE,{classname="record", label="record", id=log_recno, size=#resp}) item_pos = 0 ITEM_AMOUNT = nil currency_digits = 0 for i=1,#log_items do if log_items[i][3] then ITEM = nodes.append(REC,{ classname="item", label=log_items[i][3], size=log_items[i][2] }) else ITEM = nodes.append(REC,{ classname="item", label=string.format("tag %X",log_items[i][1]), size=log_items[i][2] }) end data = bytes.sub(resp,item_pos,item_pos+log_items[i][2]-1) nodes.set_attribute(ITEM,"val",data) if log_items[i][1]==0x9F02 then ITEM_AMOUNT=ITEM elseif log_items[i][1]==0x5F2A then currency_code = tonumber(tostring(data)) currency_name = iso_currency_code_name(currency_code) currency_digits = iso_currency_code_digits(currency_code) nodes.set_attribute(ITEM,"alt",currency_name) elseif log_items[i][4] then log_items[i][4](ITEM,data) end item_pos = item_pos + log_items[i][2] end if ITEM_AMOUNT then local amount = tostring(nodes.get_attribute(ITEM_AMOUNT,"val")) nodes.set_attribute(ITEM_AMOUNT,"alt",string.format("%.2f",amount/(10^currency_digits))) end end end end function emv_process_application(cardenv,aid) local sw, resp local ref local pdol local AFL local extra local j -- counter log.print(log.INFO,"Processing application "..aid) -- Select AID sw,resp = card.select(aid) if sw ~=0x9000 then return false end -- Process 'File Control Infomation' and get PDOL local APP local FCI APP = nodes.append(cardenv, { classname = "application", label = "application", id=aid }) FCI = nodes.append(APP, { classname = "header", label = "answer to select", size=#resp, val=resp }) emv_parse(FCI,resp) ref = nodes.find_first(FCI,{id="9F38"}) if (ref) then pdol = nodes.get_attribute(ref,"val") else pdol = nil; end -- INITIATE get processing options, now that we have pdol local GPO if ui.question("Issue a GET PROCESSING OPTIONS command?",{"Yes","No"})==1 then -- Get processing options log.print(log.INFO,"Attempting GPO") sw,resp = card.get_processing_options(pdol) if sw ~=0x9000 then if pdol then -- try empty GPO just in case the card is blocking some stuff log.print(log.WARNING, string.format("GPO with data failed with code %X, retrying GPO without data",sw)) sw,resp = card.get_processing_options(nil) end end if sw ~=0x9000 then log.print(log.ERROR,"GPO Failed") ui.question("GET PROCESSING OPTIONS failed, the script will continue to read the card",{"OK"}) else GPO = nodes.append(APP,{classname="block",label="processing_options", size=#resp, val=resp}) emv_parse(GPO,resp) end end -- Read extra data --extra = nodes.append(APP,{classname="block",label="extra emv data"}) for j=1,#EXTRA_DATA do sw,resp = card.get_data(EXTRA_DATA[j]) if sw == 0x9000 then emv_parse(APP,resp):set_attribute("classname","block") end end -- find LOG INFO local LOG local logformat logformat=nil ref = nodes.find_first(APP,{id="9F4D"}) -- I've seen this on some cards : if ref==nil then -- proprietary style ? ref = nodes.find_first(APP,{id="DF60"}) logformat = "VISA" else logformat = "EMV" end if ref then LOG = nodes.get_attribute(ref,"val") else sw, resp = card.get_data(0x9F4D) if sw==0x9000 then LOG = tostring(resp) logformat = "EMV" else sw, resp = card.get_data(0xDF60) if sw==0x9000 then LOG = tostring(resp) logformat = "VISA" else logformat = nil LOG = nil end end end if logformat then log.print(log.INFO,"Found "..logformat.." transaction log indicator") else log.print(log.INFO,"No transaction log indicator") end local sfi_index local rec_index local SFI local REC for sfi_index=1,31 do SFI = nil if (logformat==nil or LOG:get(0)~=sfi_index) then for rec_index=1,255 do log.print(log.INFO,string.format("Reading SFI %i, record %i",sfi_index, rec_index)) sw,resp = card.read_record(sfi_index,rec_index) if sw ~= 0x9000 then log.print(log.WARNING,string.format("Read record failed for SFI %i, record %i",sfi_index,rec_index)) break else if (SFI==nil) then SFI = nodes.append(APP,{classname="file", label="file", id=sfi_index}) end REC = nodes.append(SFI,{classname="record", label="record", id=rec_index}) if (emv_parse(REC,resp)==false) then nodes.set_attribute(REC,"val",resp) nodes.set_attribute(REC,"size",#resp) end end end -- for rec_index end -- if log exists end -- for sfi_index -- Read logs if they exist if logformat=="EMV" then emv_process_application_logs(APP,LOG:get(0),LOG:get(1)) elseif logformat=="VISA" then visa_process_application_logs(APP,LOG:get(0),LOG:get(1)) end return true end CPLC_DATA = { { "IC Fabricator", 2, 0 } , { "IC Type", 2, 0 }, { "Operating System Provider Identifier", 2 }, { "Operating System Release Date", 2 }, { "Operating System Release Level", 2 }, { "IC Fabrication Date", 2 }, { "IC Serial Number", 4 }, { "IC Batch Identifier", 2 }, { "IC ModuleFabricator", 2 }, { "IC ModulePackaging Date", 2 }, { "ICC Manufacturer", 2 }, { "IC Embedding Date", 2 }, { "Prepersonalizer Identifier", 2 }, { "Prepersonalization Date", 2 }, { "Prepersonalization Equipment", 4 }, { "Personalizer Identifier", 2 }, { "Personalization Date", 2 }, { "Personalization Equipment", 4 }, } function emv_process_cplc(cardenv) local sw, resp local CPLC local cplc_data local cplc_tag local i local pos local ref2 log.print(log.INFO,"Processing CPLC data") sw,resp = card.get_data(0x9F7F) if sw == 0x9000 then cplc_tag, cplc_data = asn1.split(resp) CPLC = nodes.append(cardenv,{classname="block", label="cpcl data", id="9F7F", size=#cplc_data}) nodes.set_attribute(CPLC,"val",cplc_data) pos = 0 for i=1,#CPLC_DATA do ref2 = nodes.append(CPLC,{classname="item", label=CPLC_DATA[i][1], id=pos}); nodes.set_attribute(ref2,"val",bytes.sub(cplc_data,pos,pos+CPLC_DATA[i][2]-1)) pos = pos + CPLC_DATA[i][2] end end end -- PROCESSING if card.connect() then local mycard = card.tree_startup("EMV") emv_process_pse(mycard) card.warm_reset() for i=1,#AID_LIST do -- print(AID_LIST[i]) emv_process_application(mycard,AID_LIST[i]) card.warm_reset() end emv_process_cplc(mycard) card.disconnect() else ui.question("No card detected in reader",{"OK"}) end cardpeek-0.8/dot_cardpeek_dir/scripts/e-passport.lua0000644000175000017500000004605712155053151017643 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- require("lib.tlv") local SSC local KM_ENC local KM_MAC local KS_ENC local KS_MAC local TEST=false function epass_inc_SSC() local i=7 local e while i>=0 do SSC:set(i,SSC:get(i)+1) if SSC:get(i)~=0 then break end i=i-1 end --print("SSC: ",#SSC,SSC) return true end function epass_key_derivation(seed) local SHA1 local D local Kenc local Kmac SHA1 = crypto.create_context(0x0030) D = bytes.concat(seed, bytes.new(8,"00 00 00 01")) Kenc = crypto.digest(SHA1,D) D = bytes.concat(seed, bytes.new(8,"00 00 00 02")) Kmac = crypto.digest(SHA1,D) return bytes.sub(Kenc,0,15),bytes.sub(Kmac,0,15) end function epass_create_master_keys(mrz) local pass_no = string.sub(mrz,1,10) local pass_bd = string.sub(mrz,14,20) local pass_ed = string.sub(mrz,22,28) local mrz_info = pass_no..pass_bd..pass_ed; local hash local SHA1 SHA1 = crypto.create_context(0x0030); hash = crypto.digest(SHA1,bytes.new_from_chars(mrz_info)) KM_ENC, KM_MAC = epass_key_derivation(bytes.sub(hash,0,15)) return true end function epass_create_session_keys() local sw, resp local rnd_icc local rnd_ifd local k_ifd = bytes.new(8,"0B 79 52 40 CB 70 49 B0 1C 19 B3 3E 32 80 4F 0B") local S local iv = bytes.new(8,"00 00 00 00 00 00 00 00") local TDES_CBC = crypto.create_context(crypto.ALG_DES2_EDE_CBC+crypto.PAD_ZERO,KM_ENC); local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KM_MAC); local e_ifd local m_ifd rnd_ifd = bytes.new(8,"01 23 45 67 89 AB DC FE") sw, rnd_icc = card.send(bytes.new(8,"00 84 00 00 08")) if (sw~=0x9000) then return false end S = rnd_ifd .. rnd_icc .. k_ifd e_ifd = crypto.encrypt(TDES_CBC,S,iv) m_ifd = crypto.mac(CBC_MAC,e_ifd) cmd_data = e_ifd..m_ifd sw, resp = card.send(bytes.new(8,"00 82 00 00 28",cmd_data,0x28)) if (sw==0x6300) then log.print(log.WARNING,"Perhaps you didn't enter the right MRZ data for this passport") end if (sw~=0x9000) then return false end R = crypto.decrypt(TDES_CBC,bytes.sub(resp,0,31),iv) k_icc = bytes.sub(R,16,31) k_seed = bytes.new(8) for i=0,15 do k_seed = bytes.concat(k_seed,bit.XOR(k_ifd:get(i),k_icc:get(i))) end SSC = bytes.sub(rnd_icc,4,7)..bytes.sub(rnd_ifd,4,7) KS_ENC, KS_MAC = epass_key_derivation(k_seed) return true end function epass_select(EF) local cmdheader = bytes.new(8,"0C A4 02 0C") local cmdbody = bytes.new(8,bit.SHR(EF,8),bit.AND(EF,0xFF)) local TDES_CBC = crypto.create_context(crypto.ALG_DES2_EDE_CBC+crypto.PAD_OPT_80_ZERO,KS_ENC) local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KS_MAC) local iv = bytes.new(8,"00 00 00 00 00 00 00 00") local DO87, DO8E local command local DO99 M = bytes.concat("01",crypto.encrypt(TDES_CBC,cmdbody,iv)) DO87 = asn1.join(0x87,M) epass_inc_SSC() N = bytes.concat(SSC,cmdheader,"80 00 00 00",DO87) CC = crypto.mac(CBC_MAC,N) DO8E = asn1.join(0x8E,crypto.mac(CBC_MAC,N)) command=bytes.concat(cmdheader,(#DO87+#DO8E),DO87,DO8E,0) sw, resp = card.send(command) epass_inc_SSC() if sw~=0x9000 then return sw, resp end tag_99, value_99, rest = asn1.split(resp) tag_8E, value_8E, rest = asn1.split(rest) if tag_99~=0x99 then log.print(log.WARNING,"Expected tag 99 in card response") return 0x6FFF end if tag_8E~=0x8E then log.print(log.WARNING,"Expected tag 8E in card response") return 0x6FFF end sw = 0+bytes.tonumber(value_99) N = SSC..asn1.join(tag_99,value_99) CC = crypto.mac(CBC_MAC,N) if value_8E~=CC then log.print(log.WARNING,"Failed to verify MAC in response") end return sw, resp end function epass_read_binary(start,len) local cmdheader = bytes.new(8,"0C B0", bit.SHR(start,8),bit.AND(start,0xFF)) local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KS_MAC) local TDES_CBC = crypto.create_context(crypto.ALG_DES2_EDE_CBC+crypto.PAD_OPT_80_ZERO,KS_ENC) local DO97,D08E local value_87 local iv = bytes.new(8,"00 00 00 00 00 00 00 00") DO97 = bytes.new(8,0x97,01,len) epass_inc_SSC() DO8E = asn1.join(0x8E,crypto.mac(CBC_MAC,bytes.concat(SSC,cmdheader,"80 00 00 00",DO97))) command = bytes.concat(cmdheader,(#DO97+#DO8E),DO97,DO8E,0) sw, resp = card.send(command) epass_inc_SSC() if (sw~=0x9000) and (sw~=0x6282) then return false end tag_87, value_87 = asn1.split(resp) decrypted_data = crypto.decrypt(TDES_CBC,bytes.sub(value_87,1,-1),iv) return sw, bytes.sub(decrypted_data,0,len-1) end function epass_read_file() sw,resp = epass_read_binary(0,4) if sw~=0x9000 then return nil end log.print(log.INFO,"Heading is " .. tostring(resp)) tag, rest = asn1.split_tag(resp) len, rest = asn1.split_length(rest) --io.write("read_file: [") if len>127 then to_read = len + 2 + resp:get(1)-128 else to_read = len + 2 end log.print(log.INFO,"Expecting " .. to_read) result = bytes.new(8) already_read = 0 while to_read>0 do --io.write(".");io.flush() if to_read>0x80 then le = 0x80 else le = to_read end sw, resp = epass_read_binary(already_read,le) if sw~=0x9000 then return result end result = bytes.concat(result,resp) already_read = already_read + #resp to_read = to_read - #resp end --io.write("] "..#result.."bytes\n") return result end function ui_parse_version(node,data) local ver = bytes.format(bytes.sub(data,0,1),"%P") local i for i=1,(#data/2)-1 do ver = ver .. "." .. bytes.format(bytes.sub(data,i*2,i*2+1),"%P") end nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",ver) return true end function ui_parse_cstring(node,data) nodes.set_attribute(node,"val",data) if #data>1 then nodes.set_attribute(node,"alt",bytes.format(bytes.sub(data,0,#data-2),"%P")) end end BL_FAC_RECORD_HEADER = { { "Format Identifier", 4, ui_parse_cstring }, { "Format Version", 4, ui_parse_cstring }, { "Length of Record", 4, ui_parse_number }, { "Number of Faces", 2, ui_parse_number } } BL_FAC_INFORMATION = { { "Face Image Block Length", 4, ui_parse_number }, { "Number of Feature Points", 2, ui_parse_number }, { "Gender", 1 , { [0]="Unspecified", [1]="Male", [2]="Female", [3]="Unknown" }}, { "Eye Color", 1, { [0]="Unspecified", [1]="Black", [2]="Blue", [3]="Brown", [4]="Gray", [5]="Green", [6]="Multi-Coloured", [7]="Pink", [8]="Other or Unknown" }}, { "Hair Color", 1 , { [0]="Unspecified", [1]="Bald", [2]="Black", [3]="Blonde", [4]="Brown", [5]="Gray", [6]="White", [7]="Red", [8]="Green", [9]="Blue", [255]="Other or Unknown" }}, { "Feature Mask", 3 }, { "Expression", 2, { [0]="Unspecified", [1]="Neutral", [2]="Smile with closed mouth", [3]="Smile with open mouth", [4]="Raised eyebrows", [5]="Eyes looking away", [6]="Squinting", [7]="Frowning" }}, { "Pose Angle", 3 }, { "Pose Angle Uncertainty", 3 } } BL_FAC_FEATURE_POINT = { { "Feature Type", 1 }, { "Feature Point", 1 }, { "Horizontal Position (x)", 2 }, { "Vertical Position (y)", 2 }, { "Reserved", 2 } } BL_FAC_IMAGE_INFORMATION = { { "Face Image Type", 1 }, { "Image Data Type", 1 }, { "Width", 2, ui_parse_number }, { "Height", 2, ui_parse_number }, { "Image Color Space", 1 }, { "Source Type", 1 }, { "Device Type", 2 }, { "Quality", 2 } } BL_FIR_GENERAL_RECORD_HEADER = { { "Format Identifier", 4, ui_parse_cstring }, { "Version Number", 4, ui_parse_cstring }, { "Record Length", 6, ui_parse_number }, { "Vendor ID", 2 }, { "Scanner ID", 2 }, { "Number of fingers/palms", 1, ui_parse_number }, { "Scale Units", 1 }, { "Horizontal Scan Resolution", 2, ui_parse_number }, { "Vertical Scan Resolution", 2, ui_parse_number }, { "Horizontal Image Resolution", 2, ui_parse_number }, { "Vertical Image Resolution", 2, ui_parse_number }, { "Pixel Depth", 1 }, { "Image Compression Algorithm", 1, { [1]="Uncompressed – bit packed", [2]="Compressed – WSQ", [3]="Compressed – JPEG", [4]="Compressed – JPEG2000", [5]="PNG" }}, { "Reserved", 2 } } BL_FIR_IMAGE_RECORD_HEADER = { { "Length of finger data block", 4, ui_parse_number }, { "Finger/palm position", 1, { [0]="Unknown", [1]="Right thumb", [2]="Right index finger", [3]="Right middle finger", [4]="Right ring finger", [5]="Right little finger", [6]="Left thumb", [7]="Left index finger", [8]="Left middle finger", [9]="Left ring finger", [10]="Left little finger", [11]="Plain right thumb", [12]="Plain left thumb", [13]="Plain right four fingers", [14]="Plain left four fingers", [15]="Plain thumbs (2)" }}, { "Count of views", 1, ui_parse_number }, { "View number", 1, ui_parse_number }, { "Finger/palm image quality", 1 }, { "Impression type", 1 }, { "Horizontal line length", 2, ui_parse_number }, { "Vertical line length", 2, ui_parse_number }, { "Reserved", 1 } } function ui_parse_block(node,format,data,pos) local ITEM local block local i,v local index for i,v in ipairs(format) do ITEM = node:append({ classname="item", label=v[1], id=i-1, size=v[2] }) block = bytes.sub(data,pos,pos+v[2]-1) if v[3]~=nil then if type(v[3])=="function" then if v[3](ITEM,block)==false then return nil end elseif type(v[3])=="table" then index = bytes.tonumber(block) nodes.set_attribute(ITEM,"val",block) if v[3][index] then nodes.set_attribute(ITEM,"alt",v[3][index]) else nodes.set_attribute(ITEM,"alt",index) end else return nil end else nodes.set_attribute(ITEM,"val",block) end pos = pos + v[2] end return pos end FAC_FORMAT_IDENTIFIER = bytes.new(8,"46414300") FIR_FORMAT_IDENTIFIER = bytes.new(8,"46495200") function ui_parse_biometry_fac(node,data) local BLOCK local SUBBLOCK local SUBSUBBLOCK local SUBSUBSUBBLOCK local index = 0 local num_faces local num_features local block_length local block_start local image_len local i,j num_faces = bytes.tonumber(bytes.sub(data,12,13)) BLOCK = node:append({ classname="item", label="Facial Record Header" }) index = ui_parse_block(BLOCK,BL_FAC_RECORD_HEADER,data,index) if index==nil then log.print(log.ERROR,"Failed to parse facial header information") return false end BLOCK = node:append({ classname="item", label="Facial Data Records" }) for i = 1,num_faces do block_start = index block_length = bytes.tonumber(bytes.sub(data,index,index+3)) num_features = bytes.tonumber(bytes.sub(data,index+4,index+5)) SUBBLOCK = BLOCK:append({ classname="item", label="Facial Record Data", id=i, size=block_length }) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Facial Information" }) index = ui_parse_block(SUBSUBBLOCK,BL_FAC_INFORMATION,data,index) if index==nil then log.print(log.ERROR,"Failed to parse facial information") return false end if num_features>0 then SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Feature points" }) for j=1,num_features do SUBSUBSUBBLOCK = node:append({ classname="item", label="Feature Point", id=j }) index = ui_parse_block(SUBSUBSUBBLOCK,BL_FEATURE_POINT,data,index) if index==nil then log.print(log.ERROR,"Failed to parse facial feature information") return false end end end SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Image Information" }) index = ui_parse_block(SUBSUBBLOCK,BL_FAC_IMAGE_INFORMATION,data,index) if index==nil then log.print(log.ERROR,"Failed to parse facial image information") return false end image_len = block_length-(index-block_start) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Image Data", size=image_len }) nodes.set_attribute(SUBSUBBLOCK,"val",bytes.sub(data,index,index+image_len-1)) nodes.set_attribute(SUBSUBBLOCK,"mime-type","image/jpeg") index = index + image_len end return true end function ui_parse_biometry_fir(node,data) local BLOCK local SUBBLOCK local SUBSUBBLOCK local index = 0 local num_images local record_size local record_start local image_size local i BLOCK = node:append({ classname="item", label="Finger General Record Header" }) index = ui_parse_block(BLOCK,BL_FIR_GENERAL_RECORD_HEADER,data,index) if index==nil then log.print(log.ERROR,"Failed to parse finger general record header information") return false end num_images = bytes.tonumber(bytes.sub(data,18,18)) BLOCK = node:append({ classname="item", label="Finger Images" }) for i=1,num_images do record_size = bytes.tonumber(bytes.sub(data,index,index+3)) record_start = index SUBBLOCK = BLOCK:append({ classname="item", label="Finger Image", id=i, size=record_size }) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Finger Image Record Header" }) index = ui_parse_block(SUBSUBBLOCK,BL_FIR_IMAGE_RECORD_HEADER,data,index) if index==nil then log.print(log.ERROR,"Failed to parse finger image record header information") return false end image_size = record_size-(index-record_start) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Finger Image Data" }) nodes.set_attribute(SUBSUBBLOCK,"val",bytes.sub(data,index,index+image_size-1)) index = index + image_size end return true end function ui_parse_biometry(node,data) local tag = bytes.sub(data,0,3) if tag==FAC_FORMAT_IDENTIFIER then ui_parse_biometry_fac(node,data) elseif tag==FIR_FORMAT_IDENTIFIER then ui_parse_biometry_fir(node,data) else nodes.set_attribute(node,"val",data) end return true end AID_MRTD = "#A0000002471001" MRP_REFERENCE = { ['5F01'] = { "LDS Version Number", ui_parse_version }, ['5F08'] = { "Date of birth (truncated)" }, ['5F1F'] = { "MRZ data elements", ui_parse_printable }, ['5F2E'] = { "Biometric data block", ui_parse_biometry }, ['5F36'] = { "Unicode Version number", ui_parse_version }, ['60'] = { "Common Data Elements" }, ['61'] = { "Template for MRZ Data Group" }, ['63'] = { "Template for finger biometric Data Group" }, ['65'] = { "Template for digitized facial image" }, ['67'] = { "Template for digitized signature or usual mark" }, ['68'] = { "Template for machine assisted security -- Encoded data" }, ['69'] = { "Template for machine assisted security -- Structure" }, ['6A'] = { "Template for machine assisted security -- Substance" }, ['6B'] = { "Template for additional personal details" }, ['6C'] = { "Template for additional document details" }, ['6D'] = { "Optional details" }, ['6E'] = { "Reserved for future use" }, ['70'] = { "Person to notify" }, ['75'] = { "Template for facial biometric Data Group" }, ['76'] = { "Template for iris (eye) biometric template" }, ['77'] = { "Security data (CMD/RFC 3369)" }, ['7F2E'] = { "Biometric data block (enciphered)" }, ['7F60'] = { "Biometric Information Template" }, ['7F61'] = { "Biometric Information Group Template" }, ['7F61/2'] = { "Number of instances" }, ['A1'] = { "Biometric Header Template" }, ['A1/80'] = { "ICAO header version" }, ['A1/81'] = { "Biometric type" }, ['A1/82'] = { "Biometric feature" }, ['A1/83'] = { "Creation date and time" }, ['A1/84'] = { "Validity period" }, ['A1/86'] = { "Creator of the biometric reference data (PID)" }, ['A1/87'] = { "Format owner" }, ['A1/88'] = { "Format type" } } FILES = { { ['FID']=0x011E, ['name']='EF.COM' }, { ['FID']=0x0101, ['name']='EF.DG1' }, { ['FID']=0x0102, ['name']='EF.DG2' }, { ['FID']=0x0103, ['name']='EF.DG3' }, { ['FID']=0x0104, ['name']='EF.DG4' }, { ['FID']=0x0105, ['name']='EF.DG5' }, { ['FID']=0x0106, ['name']='EF.DG6' }, { ['FID']=0x0107, ['name']='EF.DG7' }, { ['FID']=0x0108, ['name']='EF.DG8' }, { ['FID']=0x0109, ['name']='EF.DG9' }, { ['FID']=0x010A, ['name']='EF.DG10' }, { ['FID']=0x010B, ['name']='EF.DG11' }, { ['FID']=0x010C, ['name']='EF.DG12' }, { ['FID']=0x010D, ['name']='EF.DG13' }, { ['FID']=0x010E, ['name']='EF.DG14' }, { ['FID']=0x010F, ['name']='EF.DG15' }, { ['FID']=0x0110, ['name']='EF.DG16' }, { ['FID']=0x011D, ['name']='EF.SOD' } } local MRZ_DATA="" repeat MRZ_DATA = ui.readline("Enter the code from the lower MRZ data (printed inside the passport)",44,MRZ_DATA) if MRZ_DATA==nil then break end if #MRZ_DATA<28 then ui.question("You must enter at least 28 characters",{"OK"}) end until #MRZ_DATA>=28 if MRZ_DATA then if card.connect() then local ke,km,i,v,r CARD = card.tree_startup("e-passport") sw, resp = card.select(AID_MRTD,0) APP = CARD:append({classname="application", label="application", id=AID_MRTD}) if #resp>0 then tlv_parse(APP,resp) end epass_create_master_keys(MRZ_DATA) if epass_create_session_keys(ke,km) then for i,v in ipairs(FILES) do log.print(log.INFO,"Attempt to select " .. v['name']) sw, resp = epass_select(v['FID']) FID = APP:append({ classname="file", label=v['name'], id=string.format(".%04X",v['FID']) }) FID:append({classname="header", label="header", size=#resp, val=resp }) CONTENT = FID:append({classname="body", label="content" }) if sw==0x9000 then log.print(log.INFO,"Attempt to read from " .. v['name']) r = epass_read_file() if r then nodes.set_attribute(CONTENT,"size",#r) if r:get(0)==0x6D then tag_6D, value_6D = asn1.split(r) TAG6D = CONTENT:append({ classname="item", label="National specific data", size=#value_6D }) nodes.set_attribute(TAG6D,"val",value_6D) else tlv_parse(CONTENT,r,MRP_REFERENCE) end else nodes.set_attribute(CONTENT,"alt","Selected file, but data is not accessible") end else nodes.set_attribute(CONTENT,"alt",string.format("Content not accessible (code %04X)",sw)) end end else ui.question("Could not create session keys. Perhaps you didn't enter the correct MRZ data.",{"OK"}) end card.disconnect() else ui.question("No passport detected in proximity of the reader",{"OK"}) end else log.print(log.ERROR,"Aborted by the user.") end cardpeek-0.8/dot_cardpeek_dir/scripts/vitale_2.lua0000644000175000017500000001157512135147242017253 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- require('lib.tlv') function ui_parse_asciidate(node,data) local d = bytes.format(data,"%P") local t = os.time( { ['year'] = string.sub(d,1,4), ['month'] = string.sub(d,5,6), ['day'] = string.sub(d,7,8) } ) nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",os.date("%x",t)) return true end VITALE_IDO = { ['65'] = { "Bénéficiaire" }, ['65/90'] = { "Nationalité", ui_parse_printable }, ['65/93'] = { "Numéro de sécurité sociale", ui_parse_printable }, ['65/80'] = { "Nom", ui_parse_printable }, ['65/81'] = { "Prénom", ui_parse_printable }, ['65/82'] = { "Date de naissance", ui_parse_asciidate }, ['66'] = { "Carte vitale" }, ['66/80'] = { "Date de début de validité", ui_parse_asciidate }, ['7F21'] = { "Certificat" }, ['5F37'] = { "Signature de l'AC" }, ['5F38'] = { "Résidu de la clé publique" }, } function read_bin() local total, sw, resp, r total = bytes.new(8) r = 0 repeat sw, resp = card.read_binary(".",r) total = bytes.concat(total,resp) r = r + 256 until #resp~=256 or sw~=0x9000 if #total>0 then return 0x9000, total end return sw, total end AID_VITALE = "#D250000002564954414C45" AID_VITALE_MF = "#D2500000024D465F564954414C45" function create_card_map() local resp, sw local map = {} local tag,val,rest local tag2,val2,rest2 local entry, aid, file, name sw,resp = card.select(AID_VITALE) if sw~=0x9000 then return nil end sw,resp = card.select(".2001") if sw~=0x9000 then return nil end sw,resp = read_bin() if sw~=0x9000 then return nil end tag,val = asn1.split(resp) -- E0,DATA,nil tag,rest2,rest = asn1.split(val) -- A0,DATA,DATA repeat tag2,val2,rest2 = asn1.split(rest2) if tag2==0x82 then entry = tostring(bytes.sub(val2,0,1)) aid = "#"..tostring(bytes.sub(val2,4,-1)) map[entry]={ ['aid'] = aid, ['files'] = {} } end until rest2==nil or tag==0 repeat tag,val,rest = asn1.split(rest) if tag==0x80 then entry = tostring(bytes.sub(val,8,9)) file = "."..tostring(bytes.sub(val,10,11)) name = bytes.format(bytes.sub(val,0,7),"%P") table.insert(map[entry]['files'],{ ['name']=name, ['ef']=file }) end until rest==nil or tag==0 for entry in pairs(map) do if map[entry]['aid']==AID_VITALE_MF then table.insert(map[entry]['files'],{ ['name']="DIR", ['ef']=".2F00" }) table.insert(map[entry]['files'],{ ['name']="PAN", ['ef']=".2F02" }) elseif map[entry]['aid']==AID_VITALE then table.insert(map[entry]['files'],{ ['name']="POINTERS", ['ef']=".2001" }) end end return map end --[[ AID = { "D2500000024D465F564954414C45", "E828BD080FD2500000044164E86C65", "D2500000044164E86C650101" } --]] local header if card.connect() then CARD = card.tree_startup("VITALE 2") map = create_card_map() if map then for app in pairs(map) do sw,resp = card.select(map[app]['aid']) if sw==0x9000 then APP = CARD:append({ classname="application", label="Application", id=map[app]['aid'] }) header = APP:append({ classname="header", label="answer to select", size=#resp }) tlv_parse(header,resp) end for i in pairs(map[app]['files']) do EF = APP:append({ classname="file", label=map[app]['files'][i]['name'], id=map[app]['files'][i]['ef'] }) sw,resp = card.select(map[app]['files'][i]['ef']) header = EF:append({ classname="header", label="answer to select", size=#resp }) tlv_parse(header,resp) if sw==0x9000 then sw,resp = read_bin() CONTENT = EF:append({ classname="body", label="content", size=#resp }) if sw==0x9000 then if resp:get(0)==0 or (resp:get(0)==0x04 and resp:get(1)==0x00) then nodes.set_attribute(CONTENT,"val",resp) else tlv_parse(CONTENT,resp,VITALE_IDO) end else nodes.set_attribute(CONTENT,"alt",string.format("data not accessible (code %04X)",sw)) end end end end end card.disconnect() else ui.question("No card detected",{"OK"}) end cardpeek-0.8/dot_cardpeek_dir/scripts/calypso.lua0000644000175000017500000001506412166020611017207 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- @name Calypso -- @description Calypso tranport cards: Navigo, MOBIB, Korrigo, RavKav, ... -- @targets 0.8 -- ------------------------------------------------------------------------- -- *PLEASE NOTE* -- This work is based on: -- * public information about the calypso card specification, -- * partial information found on the web about the ticketing data -- format, as described in the French "intercode" documentation. -- * experimentation and guesses, -- This information is incomplete. If you have further data, such -- as details ofd specs, please help send them -- to L1L1@gmx.com -------------------------------------------------------------------------- CARD = 0 card.CLA=0x94 -- Class for navigo cards SEL_BY_PATH = 1 SEL_BY_LFI = 2 sel_method = SEL_BY_LFI require('lib.strict') require('lib.country_codes') function bytes.is_all(bs,byte) local i,v if #bs==0 then return false end for i,v in bs:ipairs() do if v~=byte then return false end end return true end LFI_LIST = { { "ICC", "/0002", "file" }, { "ID", "/0003", "file" }, { "Ticketing", "/2000", "folder" }, { "Environment", "/2000/2001", "file" }, { "Holder", "/2000/2002", "file" }, { "Event logs", "/2000/2010", "file" }, { "Contracts", "/2000/2020", "file" }, { "Counters", "/2000/202A", "file" }, { "Counters", "/2000/202B", "file" }, { "Counters", "/2000/202C", "file" }, { "Counters", "/2000/202D", "file" }, { "Counters", "/2000/202E", "file" }, { "Counters", "/2000/202F", "file" }, { "Counters", "/2000/2060", "file" }, { "Counters", "/2000/2061", "file" }, { "Counters", "/2000/2062", "file" }, { "Special events", "/2000/2040", "file" }, { "Contract list", "/2000/2050", "file" }, { "Counters", "/2000/2069", "file" }, { "Holder Extended", "/3F1C", "file" } } function calypso_select(ctx,desc,path,klass) local path_parsed = card.make_file_path(path) local lfi = bytes.sub(path_parsed,-2) local resp, sw local r,item local parent_node=ctx local file_node=nil if sel_method==SEL_BY_LFI then sw,resp = card.select(bytes.format(lfi,"#%D")) else sw,resp = card.select(path) end if sw==0x9000 then for r=0,(#path_parsed/2)-1 do item = bytes.format(bytes.sub(path_parsed,r*2,r*2+1),"%D") file_node = parent_node:find_first({id=item}) if file_node==nil then file_node = parent_node:append{ classname = klass, label = desc, id = item } end parent_node = file_node end if resp and #resp>0 then parent_node:append{ classname="header", label="answer to select", size=#resp, val=resp} end return file_node end return nil end function calypso_guess_network(cardenv) local env_node local record_node local data env_node = cardenv:find_first({label="Environment"}) if env_node then record_node = env_node:find_first({label="record", id="1"}) if record_node then data = record_node:get_attribute("val"):convert(1) if #data > 36 then local country_bin = data:sub(13,24) local network_bin = data:sub(25,36) local country_num = tonumber(country_bin:convert(4):format("%D")) local network_num = tonumber(network_bin:convert(4):format("%D")) if country_num==250 or country_num==56 then return country_num, network_num end country_bin = data:sub(3,14) network_bin = data:sub(15,22) country_num = tonumber(country_bin:convert(4):format("%D")) network_num = tonumber(network_bin:convert(4):format("%D")) if country_num==376 then return 376,network_num end log.print(log.WARNING,"Unknown Calypso card.") else log.print(log.WARNING,"Could not find enough data in 'Environement/record#1'") end else log.print(log.WARNING,"Could not find data in 'Environement/record#1'") end else log.print(log.WARNING,"Could not find data in 'Environement'") end return false end function calypso_process(cardenv) local lfi_index local lfi_desc local lfi_node local rec_node local sw, resp local country, network local filename, file for lfi_index,lfi_desc in ipairs(LFI_LIST) do lfi_node = calypso_select(cardenv,lfi_desc[1],lfi_desc[2], lfi_desc[3]) if lfi_node and lfi_desc[3]=="file" then local record for record=1,255 do sw,resp=card.read_record(0,record,0x1D) if sw ~= 0x9000 then break end rec_node = lfi_node:append{ classname = "record", label = "record", size = #resp, id = record, val = resp } end end end country, network = calypso_guess_network(cardenv) filename = "calypso/c"..country..".lua" file = io.open(filename); if file then io.close(file) dofile(filename) else log.print(log.LOG_INFO,"Could not find "..filename) end filename = "calypso/c"..country.."n"..network..".lua" file = io.open(filename); if file then io.close(file) dofile(filename) else log.print(log.LOG_INFO,"Could not find "..filename) end end if card.connect() then CARD = card.tree_startup("CALYPSO") sw = card.select("#2000") if sw==0x9000 then sel_method = SEL_BY_LFI else sw = card.select("/2000/2010") if sw == 0x9000 then sel_method = SEL_BY_PATH else sel_method = SEL_BY_LFI ui.question("This script may not work: this card doesn't seem to react to file selection commands.",{"OK"}) end end if sw~=0x6E00 then calypso_process(CARD) end card.disconnect() else ui.question("Connection to card failed. Are you sure a card is inserted in the reader or in proximity of a contactless reader?\n\nNote: French 'navigo' cards cannot be accessed through a contactless interface.",{"OK"}); end cardpeek-0.8/dot_cardpeek_dir/scripts/mifare reader.lua0000644000175000017500000001103612135147242020224 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- require('lib.strict') require('lib.apdu') MIFARE_STD_KEYS= { [0xA]= "A0A1A2A3A4A5", [0xB]= "B0B1B2B3B4B5", [0xF]= "FFFFFFFFFFFF" } function mifare_read_uid() return card.send(bytes.new(8,"FF CA 00 00 00")) end function mifare_load_key(keynum,keyval,options) local key = bytes.new(8,keyval) if options==nil then options=0x20 -- load keys in non-volatile memory end return card.send(bytes.new(8,"FF 82", options, keynum, #key, key)) end function mifare_authenticate(addr,keynum,keytype) return card.send(bytes.new(8,"FF 86 00 00 05 01",bit.SHR(addr,8),bit.AND(addr,0xFF),keytype,keynum)) end function mifare_read_binary(addr,len) return card.send(bytes.new(8,"FF B0",bit.SHR(addr,8),bit.AND(addr,0xFF),len)) end function MIFARE_text(node,data) local i local r = "" for i=0,#data-1 do if data[i]>=32 and data[i]<127 then r = r .. string.char(data[i]) else r = r .. string.format("\\%03o",data[i]) end end node:setAlt(r) end function MIFARE_trailer_sector(trailer,data) local key_a, ac, ac_full, key_b key_a = bytes.sub(data,0,5) ac_full = bytes.sub(data,6,9) key_b = bytes.sub(data,10,15) --trailer = trailer:append("item","interpreted data") ac = bytes.sub(bytes.convert(1,ac_full),12,23) ac_split = tostring(bytes.sub(ac,0,3)) .. ", " .. tostring(bytes.sub(ac,4,7)) .. ", " .. tostring(bytes.sub(ac,8,11)) trailer:append{ classname="item", label="Key A", size=#key_a, val=key_a } trailer:append{ classname="item", label="Access bits", size=#ac_full, val=ac_ful, alt=ac_split } trailer:append{ classname="item", label="Key B or data", size=#key_b, val=key_b } end function MIFARE_first_sector(init,data) local UID, cc, manu --init = init:append("item","interpreted data") UID = bytes.sub(data,0,3) cc = bytes.sub(data,4,4) manu = bytes.sub(data,5,15) init:append{ classname="item", label="UID", size=#UID, vale=UID } init:append{ classname="item", label="Check byte", size=#cc, val=cc } init:append{ classname="item", label="Manufacturer data", size=#manu, vale=manu } end function MIFARE_scan(root) local sector,last_sector local block local key local sw, resp local SECTOR sw, resp = mifare_read_uid() if sw == 0x9000 then root:append{ classname="block", label="UID", val=resp, alt=bytes.tonumber(resp) } end root:append("block","last sector") for sector=0,63 do sw, resp = mifare_authenticate(sector*4,0xA,0x60) key = MIFARE_STD_KEYS[0xA] if sw == 0x6982 then sw, resp = mifare_authenticate(sector*4,0xB,0x61) key = MIFARE_STD_KEYS[0xB] if sw == 0x6982 then sw, resp = mifare_authenticate(sector*4,0xF,0x60) key = MIFARE_STD_KEYS[0xF] end end if sw ~= 0x9000 and sw ~= 0x6982 then break end if sw == 0x9000 then last_sector = sector SECTOR = root:append{ classname="record", label="sector", id=sector } SECTOR:append{ classname="item", label="access key", val=bytes.new(8,key) } for block = 0,3 do sw, resp = mifare_read_binary(sector*4+block,16) if sw == 0x9000 then SECTOR :append{ classname="record", label="block", id=block, size=#resp, val=resp } if block == 3 then MIFARE_trailer_sector(SECTOR:children():last(),resp) elseif block+sector == 0 then MIFARE_first_sector(SECTOR:children():last(),resp) else MIFARE_text(SECTOR:children():last(),resp) end end end end end if last_sector then _n("last sector"):val(bytes.new(8,last_sector)) end end if card.connect() then CARD = card.tree_startup("Mifare") mifare_load_key(0xA,MIFARE_STD_KEYS[0xA]) mifare_load_key(0xB,MIFARE_STD_KEYS[0xB]) mifare_load_key(0xF,MIFARE_STD_KEYS[0xF]) MIFARE_scan(CARD) card.disconnect() end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/0000755000175000017500000000000012214321142015647 500000000000000cardpeek-0.8/dot_cardpeek_dir/scripts/lib/currency_codes.lua0000644000175000017500000001255512135147242021322 00000000000000 CURRENCY_NUM_CODES = { [008]={"Lek",2}, [012]={"Algerian Dinar",2}, [032]={"Argentine Peso",2}, [036]={"Australian Dollar",2}, [044]={"Bahamian Dollar",2}, [048]={"Bahraini Dinar",3}, [050]={"Taka",2}, [051]={"Armenian Dram",2}, [052]={"Barbados Dollar",2}, [060]={"Bermudian Dollar",2}, [064]={"Ngultrum",2}, [068]={"Boliviano",2}, [072]={"Pula",2}, [084]={"Belize Dollar",2}, [090]={"Solomon Islands Dollar",2}, [096]={"Brunei Dollar",2}, [104]={"Kyat",2}, [108]={"Burundi Franc",0}, [116]={"Riel",2}, [124]={"Canadian Dollar",2}, [132]={"Cape Verde Escudo",2}, [136]={"Cayman Islands Dollar",2}, [144]={"Sri Lanka Rupee",2}, [152]={"Chilean Peso",0}, [156]={"Yuan Renminbi",2}, [170]={"Colombian Peso",2}, [174]={"Comoro Franc",0}, [188]={"Costa Rican Colon",2}, [191]={"Croatian Kuna",2}, [192]={"Cuban Peso",2}, [203]={"Czech Koruna",2}, [208]={"Danish Krone",2}, [214]={"Dominican Peso",2}, [222]={"El Salvador Colon",}, [230]={"Ethiopian Birr",2}, [232]={"Nakfa",2}, [233]={"Kroon",2}, [238]={"Falkland Island Pound",2}, [242]={"Fiji Dollar",2}, [262]={"Djibouti Franc",0}, [270]={"Dalasi",2}, [292]={"Gibraltar Pound",2}, [320]={"Quetzal",2}, [324]={"Guinea Franc",0}, [328]={"Guyana Dollar",2}, [332]={"Gourde",2}, [340]={"Lempira",2}, [344]={"Hong Kong Dollar",2}, [348]={"Forint",2}, [352]={"Iceland Krona",2}, [356]={"Indian Rupee",2}, [360]={"Rupiah",2}, [364]={"Iranian Rial",2}, [368]={"Iraqi Dinar",3}, [376]={"New Israeli Sheqel",2}, [388]={"Jamaican Dollar",2}, [392]={"Yen",0}, [398]={"Tenge",2}, [400]={"Jordanian Dinar",3}, [404]={"Kenyan Shilling",2}, [408]={"North Korean Won",2}, [410]={"Won",0}, [414]={"Kuwaiti Dinar",3}, [417]={"Som",2}, [418]={"Kip",2}, [422]={"Lebanese Pound",2}, [426]={"Loti",2}, [428]={"Latvian Lats",2}, [430]={"Liberian Dollar",2}, [434]={"Libyan Dinar",3}, [440]={"Lithuanian Litas",2}, [446]={"Pataca",2}, [454]={"Kwacha",2}, [458]={"Malaysian Ringgit",2}, [462]={"Rufiyaa",2}, [478]={"Ouguiya",1}, [480]={"Mauritius Rupee",2}, [484]={"Mexican Peso",2}, [496]={"Tugrik",2}, [498]={"Moldovan Leu",2}, [504]={"Moroccan Dirham",2}, [512]={"Rial Omani",3}, [516]={"Namibia Dollar",2}, [524]={"Nepalese Rupee",2}, [532]={"Netherlands Antillian Guilder",2}, [533]={"Aruban Guilder",2}, [548]={"Vatu",0}, [554]={"New Zealand Dollar",2}, [558]={"Cordoba Oro",2}, [566]={"Naira",2}, [578]={"Norwegian Krone",2}, [586]={"Pakistan Rupee",2}, [590]={"Balboa",2}, [598]={"Kina",2}, [600]={"Guarani",0}, [604]={"Nuevo Sol",2}, [608]={"Philippine Peso",2}, [624]={"Guinea-Bissau Peso",}, [634]={"Qatari Rial",2}, [643]={"Russian Ruble",2}, [646]={"Rwanda Franc",0}, [654]={"Saint Helena Pound",2}, [678]={"Dobra",2}, [682]={"Saudi Riyal",2}, [690]={"Seychelles Rupee",2}, [694]={"Leone",2}, [702]={"Singapore Dollar",2}, [704]={"Dong",2}, [706]={"Somali Shilling",2}, [710]={"Rand",2}, [748]={"Lilangeni",2}, [752]={"Swedish Krona",2}, [756]={"Swiss Franc",2}, [760]={"Syrian Pound",2}, [764]={"Baht",2}, [776]={"Pa\'anga",2}, [780]={"Trinidata and Tobago Dollar",2}, [784]={"UAE Dirham",2}, [788]={"Tunisian Dinar",2}, [800]={"Uganda Shilling",2}, [807]={"Denar",2}, [818]={"Egyptian Pound",2}, [826]={"Pound Sterling",2}, [834]={"Tanzanian Shilling",2}, [840]={"US Dollar",2}, [858]={"Peso Uruguayo",2}, [860]={"Uzbekistan Sum",2}, [882]={"Tala",2}, [886]={"Yemeni Rial",2}, [894]={"Zambian Kwacha",2}, [901]={"New Taiwan Dollar",2}, [931]={"Peso Convertible ",}, [932]={"Zimbabwe Dollar",2}, [934]={"Manat",2}, [936]={"Cedi",2}, [937]={"Bolivar Fuerte",2}, [938]={"Sudanese Pound",2}, [940]={"Uruguay Peso en Unidades Indexadas",}, [941]={"Serbian Dinar",2}, [943]={"Metical",2}, [944]={"Azerbaijanian Manat",2}, [946]={"New Leu",2}, [947]={"WIR Euro",2}, [948]={"WIR Franc",2}, [949]={"Turkish Lira",2}, [950]={"CFA Franc BEAC",0}, [951]={"East Caribbean Dollar",2}, [952]={"CFA Franc BCEAO",0}, [953]={"CFP Franc",0}, [955]={"Bond Markets Units European Composite Unit (EURCO)",}, [956]={"European Monetary Unit (E.M.U.-6)",}, [957]={"European Unit of Account 9 (E.U.A.-9)",}, [958]={"European Unit of Account 17 (E.U.A.-17)",}, [959]={"Gold",}, [960]={"SDR",}, [961]={"Silver",}, [962]={"Platinum",}, [963]={"Codes specifically reserved for testing purposes",}, [964]={"Palladium",}, [968]={"Surinam Dollar",2}, [969]={"Malagasy Ariary",1}, [970]={"Unidad de Valor real",2}, [971]={"Afghani",2}, [972]={"Somoni",2}, [973]={"Kwanza",2}, [974]={"Belarussian Ruble",0}, [975]={"Bulgarian Lev",2}, [976]={"Franc Congolais",2}, [977]={"Convertible Marks",2}, [978]={"Euro",2}, [979]={"Mexican Unidad de Inversion (UDI)",2}, [980]={"Hryvnia",2}, [981]={"Lari",2}, [984]={"Mvdol",2}, [985]={"Zloty",2}, [986]={"Brazilian Real",2}, [990]={"Unidades de fomento",0}, [997]={"US Dollar (Next Day)",2}, [998]={"US Dollar (Same Day)",2}, [999]={"Unregistered currency",0} } function iso_currency_code_name(cc) if CURRENCY_NUM_CODES[cc] then return CURRENCY_NUM_CODES[cc][1] end return tostring(cc) end function iso_currency_code_digits(cc) if CURRENCY_NUM_CODES[cc] then return CURRENCY_NUM_CODES[cc][2] end return 0 end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/tlv.lua0000644000175000017500000002016412155053151017110 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- HELPER LIBRARY : implements some TLV processing require("lib.currency_codes") require("lib.country_codes") function tlv_tag_msb(tag) while (tag>255) do tag = tag / 256 end return tag end function tlv_tag_is_compound(tag) return (bit.AND(tlv_tag_msb(tag),0x20)==0x20) end -- UI_PARSE_* FUNCTIONS : automated parsing of tlv values -- -- All UI_PARSE functions must take 2 parameters: a tree node and -- a bytestring. These function return true upon success and false -- otherwise. function ui_parse_digits(node,data) nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",bytes.format(data,"%D")) end function ui_parse_number(node,data) nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",bytes.tonumber(data)) end function ui_parse_YYMMDD(node,data) local d = tostring(data) local d_table = { ['year']=1900+string.sub(d,1,2), ['month']=0+string.sub(d,3,4), ['day']=0+string.sub(d,5,6)} local t if d_table['year']<1980 then d_table['year']=d_table['year']+100 end t = os.time(d_table) nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",os.date("%x",t)) end function ui_parse_country_code(node,data) local cc_name = iso_country_code_name(tonumber(tostring(data))) nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",cc_name) return true end function ui_parse_currency_code(node,data) local cc_name = iso_currency_code_name(tonumber(tostring(data))) nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",cc_name) return true end function ui_parse_printable(node,data) nodes.set_attribute(node,"val",data) if #data==0 then return false end if bytes.is_printable(data) then nodes.set_attribute(node,"alt",bytes.format(data,"%P")) else nodes.set_attribute(node,"alt",bytes.format(data,"%P (%D)")) end return true end function ui_parse_oid(node,data) local ret local i,v local item ret = "{ "..math.floor(data:get(0)/40) .." ".. (data:get(0)%40) item = 0 for i,v in data:ipairs() do item = item*128+bit.AND(v,0x7F) if v>0x80 then ret = ret .. " " .. item item = 0 end end ret = ret .. " }" nodes.set_attribute(node,"val",data) nodes.set_attribute(node,"alt",ret) return true end ISO_7816_IDO = { ['2'] = {"Integer" }, ['3'] = {"Bit String" }, ['4'] = {"Octet String" }, ['5'] = {"Null" }, ['6'] = {"Object identifier", ui_parse_oid }, ['13'] = {"Printable String", ui_parse_printable }, ['14'] = {"T61 String" }, ['16'] = {"IA5 String" }, ['17'] = {"UTC Time", ui_parse_printable }, ['30'] = {"Sequence" }, ['31'] = {"Set" }, ['41'] = {"Country authority" }, ['42'] = {"Issuer authority" }, ['43'] = {"Card service data" }, ['44'] = {"Initial access data" }, ['45'] = {"Card issuer's data" }, ['46'] = {"Pre-issuing data" }, ['47'] = {"Card capabilities" }, ['48'] = {"Status information" }, ['4F'] = {"Application Identifier (AID)" }, ['50'] = {"Application Label", ui_parse_printable }, ['51'] = {"Path" }, ['52'] = {"Command to perform" }, ['53'] = {"Discretionary data" }, ['56'] = {"Track 1 Equivalent Data" }, ['57'] = {"Track 2 Equivalent Data" }, ['58'] = {"Track 3 Equivalent Data" }, ['59'] = {"Card expiration date" }, ['5A'] = {"Application PAN", ui_parse_digits }, ['5B'] = {"Name", ui_parse_printable }, ['5C'] = {"Tag list" }, ['5D'] = {"Tag length list" }, ['5E'] = {"Log-in data" }, ['5F20'] = {"Cardholder Name", ui_parse_printable }, ['5F21'] = {"Track 1 Data" }, ['5F22'] = {"Track 2 Data" }, ['5F23'] = {"Track 3 Data" }, ['5F24'] = {"Application Expiration Date", ui_parse_YYMMDD }, ['5F25'] = {"Application Effective Date", ui_parse_YYMMDD }, ['5F26'] = {"Card Effective Date", ui_parse_YYMMDD }, ['5F27'] = {"Interchange control" }, ['5F28'] = {"Country Code", ui_parse_country_code }, ['5F29'] = {"Interchange profile" }, ['5F2A'] = {"Currency code", ui_parse_currency_code }, ['5F2B'] = {"Date of birth" }, ['5F2C'] = {"Cardholder nationality" }, ['5F2D'] = {"Language Preference", ui_parse_printable }, ['5F2E'] = {"Cardholder biometric data" }, ['5F2F'] = {"Pin usage policy" }, ['5F30'] = {"Service Code" }, ['5F32'] = {"Transaction counter" }, ['5F34'] = {"Application PAN Sequence Number" }, -- MISSING DATA HERE ['5F50'] = {"Issuer URL" }, ['62'] = {"File Control Parameters (FCP) Template" }, ['62/80'] = {"Data size excluding structural information", ui_parse_number }, ['62/81'] = {"Data size including structural information", ui_parse_number }, ['62/82'] = {"File descriptor" }, ['62/83'] = {"File identifier" }, ['62/84'] = {"Dedicated File (DF) Name", ui_parse_printable }, ['62/85'] = {"Proprietary information" }, ['62/86'] = {"Security attributes" }, ['62/87'] = {"EF containing FCI extension" }, ['63'] = {"wrapper" }, ['64'] = {"File Management Data (FMD) Template" }, -- MISSING DATA HERE ['6F'] = {"File Control Information (FCI) Template" }, ['6F/80'] = {"Data size excluding structural information", ui_parse_number }, ['6F/81'] = {"Data size including structural information", ui_parse_number }, ['6F/82'] = {"File descriptor" }, ['6F/83'] = {"File identifier" }, ['6F/84'] = {"Dedicated File (DF) Name", ui_parse_printable }, ['6F/85'] = {"Proprietary information" }, ['6F/86'] = {"Security attributes" }, ['6F/87'] = {"EF containing FCI extension" }, ['72'] = {"Issuer Script Template 2" }, ['73'] = {"Discretionary DOs" }, ['A5'] = {"FCI Proprietary Template" }, } function tlv_tag_info(tlv_tag,reference,parent) local tlv_ref tlv_ref = reference[string.format("%X/%X",parent,tlv_tag)] if tlv_ref==nil then tlv_ref = reference[string.format("%X",tlv_tag)] if tlv_ref==nil then tlv_ref = ISO_7816_IDO[string.format("%X/%X",parent,tlv_tag)] if tlv_ref==nil then tlv_ref = ISO_7816_IDO[string.format("%X",tlv_tag)] if tlv_ref==nil then return nil,nil end end end end return tlv_ref[1], tlv_ref[2] end TLV_TYPES = { "TLV (Universal)", "TLV (Application-specific)", "TLV (Context-specific)", "TLV (Private)" } function internal_tlv_parse(cardenv,tlv,reference,parent) local ref = false local tlv_tag local tlv_value local tlv_tail local tlv_name local tlv_ui_func while tlv do tlv_tag, tlv_value, tlv_tail = asn1.split(tlv) if tlv_tag==nil or tlv_tag==0 then return false end--if tlv_name, tlv_ui_func = tlv_tag_info(tlv_tag,reference,parent) if tlv_name==nil then tlv_name = TLV_TYPES[bit.SHR(tlv_tag_msb(tlv_tag),6)+1] end--if ref = nodes.append(cardenv,{ classname="item", label=tostring(tlv_name), id=string.format('%X',tlv_tag), size=#tlv_value }) if (tlv_tag_is_compound(tlv_tag)) then if (internal_tlv_parse(ref,tlv_value,reference,tlv_tag)==false) then nodes.remove(ref) return false end else if tlv_ui_func then tlv_ui_func(ref,tlv_value) else nodes.set_attribute(ref,"val",tlv_value) end--if end--if tlv = tlv_tail end--while return ref end function tlv_parse(cardenv,tlv,reference) if reference == nil then reference = {} end return internal_tlv_parse(cardenv,tlv,reference,0) end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/country_codes.lua0000644000175000017500000001662512135147242021175 00000000000000 COUNTRY_NUM_CODES = { [004]="Afghanistan", [008]="Albania, People's Socialist Republic of", [010]="Antarctica (the territory South of 60 deg S)", [012]="Algeria, People's Democratic Republic of", [016]="American Samoa", [020]="Andorra, Principality of", [024]="Angola, Republic of", [028]="Antigua and Barbuda", [031]="Azerbaijan, Republic of", [032]="Argentina, Argentine Republic", [036]="Australia, Commonwealth of", [040]="Austria, Republic of", [044]="Bahamas, Commonwealth of the", [048]="Bahrain, Kingdom of", [050]="Bangladesh, People's Republic of", [051]="Armenia", [052]="Barbados", [056]="Belgium, Kingdom of", [060]="Bermuda", [064]="Bhutan, Kingdom of", [068]="Bolivia, Republic of", [070]="Bosnia and Herzegovina", [072]="Botswana, Republic of", [074]="Bouvet Island (Bouvetoya)", [076]="Brazil, Federative Republic of", [084]="Belize", [086]="British Indian Ocean Territory (Chagos Archipelago)", [090]="Solomon Islands", [092]="British Virgin Islands", [096]="Brunei Darussalam", [100]="Bulgaria, People's Republic of", [104]="Myanmar", [108]="Burundi, Republic of", [112]="Belarus", [116]="Cambodia, Kingdom of", [120]="Cameroon, United Republic of", [124]="Canada", [132]="Cape Verde, Republic of", [136]="Cayman Islands", [140]="Central African Republic", [144]="Sri Lanka, Democratic Socialist Republic of", [148]="Chad, Republic of", [152]="Chile, Republic of", [156]="China, People's Republic of", [158]="Taiwan, Province of China", [162]="Christmas Island", [166]="Cocos (Keeling) Islands", [170]="Colombia, Republic of", [174]="Comoros, Union of the", [175]="Mayotte", [178]="Congo, People's Republic of", [180]="Congo, Democratic Republic of", [184]="Cook Islands", [188]="Costa Rica, Republic of", [191]="Hrvatska (Croatia)", [192]="Cuba, Republic of", [196]="Cyprus, Republic of", [203]="Czech Republic", [204]="Benin, People's Republic of", [208]="Denmark, Kingdom of", [212]="Dominica, Commonwealth of", [214]="Dominican Republic", [218]="Ecuador, Republic of", [222]="El Salvador, Republic of", [226]="Equatorial Guinea, Republic of", [231]="Ethiopia", [232]="Eritrea", [233]="Estonia", [234]="Faeroe Islands", [238]="Falkland Islands (Malvinas)", [239]="South Georgia and the South Sandwich Islands", [242]="Fiji, Republic of the Fiji Islands", [246]="Finland, Republic of", [250]="France, French Republic", [254]="French Guiana", [258]="French Polynesia", [260]="French Southern Territories", [262]="Djibouti, Republic of", [266]="Gabon, Gabonese Republic", [268]="Georgia", [270]="Gambia, Republic of the", [275]="Palestinian Territory, Occupied", [276]="Germany", [288]="Ghana, Republic of", [292]="Gibraltar", [296]="Kiribati, Republic of", [300]="Greece, Hellenic Republic", [304]="Greenland", [308]="Grenada", [312]="Guadaloupe", [316]="Guam", [320]="Guatemala, Republic of", [324]="Guinea, Revolutionary People's Rep'c of", [328]="Guyana, Republic of", [332]="Haiti, Republic of", [334]="Heard and McDonald Islands", [336]="Holy See (Vatican City State)", [340]="Honduras, Republic of", [344]="Hong Kong, Special Administrative Region of China", [348]="Hungary, Hungarian People's Republic", [352]="Iceland, Republic of", [356]="India, Republic of", [360]="Indonesia, Republic of", [364]="Iran, Islamic Republic of", [368]="Iraq, Republic of", [372]="Ireland", [376]="Israel, State of", [380]="Italy, Italian Republic", [384]="Cote D'Ivoire, Ivory Coast, Republic of the", [388]="Jamaica", [392]="Japan", [398]="Kazakhstan, Republic of", [400]="Jordan, Hashemite Kingdom of", [404]="Kenya, Republic of", [408]="Korea, Democratic People's Republic of", [410]="Korea, Republic of", [414]="Kuwait, State of", [417]="Kyrgyz Republic", [418]="Lao People's Democratic Republic", [422]="Lebanon, Lebanese Republic", [426]="Lesotho, Kingdom of", [428]="Latvia", [430]="Liberia, Republic of", [434]="Libyan Arab Jamahiriya", [438]="Liechtenstein, Principality of", [440]="Lithuania", [442]="Luxembourg, Grand Duchy of", [446]="Macao, Special Administrative Region of China", [450]="Madagascar, Republic of", [454]="Malawi, Republic of", [458]="Malaysia", [462]="Maldives, Republic of", [466]="Mali, Republic of", [470]="Malta, Republic of", [474]="Martinique", [478]="Mauritania, Islamic Republic of", [480]="Mauritius", [484]="Mexico, United Mexican States", [492]="Monaco, Principality of", [496]="Mongolia, Mongolian People's Republic", [498]="Moldova, Republic of", [500]="Montserrat", [504]="Morocco, Kingdom of", [508]="Mozambique, People's Republic of", [512]="Oman, Sultanate of", [516]="Namibia", [520]="Nauru, Republic of", [524]="Nepal, Kingdom of", [528]="Netherlands, Kingdom of the", [530]="Netherlands Antilles", [533]="Aruba", [540]="New Caledonia", [548]="Vanuatu", [554]="New Zealand", [558]="Nicaragua, Republic of", [562]="Niger, Republic of the", [566]="Nigeria, Federal Republic of", [570]="Niue, Republic of", [574]="Norfolk Island", [578]="Norway, Kingdom of", [580]="Northern Mariana Islands", [581]="United States Minor Outlying Islands", [583]="Micronesia, Federated States of", [584]="Marshall Islands", [585]="Palau", [586]="Pakistan, Islamic Republic of", [591]="Panama, Republic of", [598]="Papua New Guinea", [600]="Paraguay, Republic of", [604]="Peru, Republic of", [608]="Philippines, Republic of the", [612]="Pitcairn Island", [616]="Poland, Polish People's Republic", [620]="Portugal, Portuguese Republic", [624]="Guinea-Bissau, Republic of", [626]="Timor-Leste, Democratic Republic of", [630]="Puerto Rico", [634]="Qatar, State of", [638]="Reunion", [642]="Romania, Socialist Republic of", [643]="Russian Federation", [646]="Rwanda, Rwandese Republic", [654]="St. Helena", [659]="St. Kitts and Nevis", [660]="Anguilla", [662]="St. Lucia", [666]="St. Pierre and Miquelon", [670]="St. Vincent and the Grenadines", [674]="San Marino, Republic of", [678]="Sao Tome and Principe, Democratic Republic of", [682]="Saudi Arabia, Kingdom of", [686]="Senegal, Republic of", [690]="Seychelles, Republic of", [694]="Sierra Leone, Republic of", [702]="Singapore, Republic of", [703]="Slovakia (Slovak Republic)", [704]="Viet Nam, Socialist Republic of", [705]="Slovenia", [706]="Somalia, Somali Republic", [710]="South Africa, Republic of", [716]="Zimbabwe", [724]="Spain, Spanish State", [732]="Western Sahara", [736]="Sudan, Democratic Republic of the", [740]="Suriname, Republic of", [744]="Svalbard & Jan Mayen Islands", [748]="Swaziland, Kingdom of", [752]="Sweden, Kingdom of", [756]="Switzerland, Swiss Confederation", [760]="Syrian Arab Republic", [762]="Tajikistan", [764]="Thailand, Kingdom of", [768]="Togo, Togolese Republic", [772]="Tokelau (Tokelau Islands)", [776]="Tonga, Kingdom of", [780]="Trinidad and Tobago, Republic of", [784]="United Arab Emirates", [788]="Tunisia, Republic of", [792]="Turkey, Republic of", [795]="Turkmenistan", [796]="Turks and Caicos Islands", [798]="Tuvalu", [800]="Uganda, Republic of", [804]="Ukraine", [807]="Macedonia, the former Yugoslav Republic of", [818]="Egypt, Arab Republic of", [826]="United Kingdom of Great Britain & N. Ireland", [834]="Tanzania, United Republic of", [840]="United States of America", [850]="US Virgin Islands", [854]="Burkina Faso", [858]="Uruguay, Eastern Republic of", [860]="Uzbekistan", [862]="Venezuela, Bolivarian Republic of", [876]="Wallis and Futuna Islands", [882]="Samoa, Independent State of", [887]="Yemen", [891]="Serbia and Montenegro", [894]="Zambia, Republic of" } function iso_country_code_name(cc) if COUNTRY_NUM_CODES[cc] then return COUNTRY_NUM_CODES[cc] end return tostring(cc) end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/strict.lua0000644000175000017500000000225212135147242017614 00000000000000------------------------------------------------------------ -- NOTE: This file was taken from the LUA 5.1 distribution -- It is public domain ------------------------------------------------------------ -- -- strict.lua -- checks uses of undeclared global variables -- All global variables must be 'declared' through a regular assignment -- (even assigning nil will do) in a main chunk before being used -- anywhere or assigned to inside a function. -- local mt = getmetatable(_G) if mt == nil then mt = {} setmetatable(_G, mt) end __STRICT = true mt.__declared = {} mt.__newindex = function (t, n, v) if __STRICT and not mt.__declared[n] and not string.sub(n,1,2) == "__" then local w = debug.getinfo(2, "S").what if w ~= "main" and w ~= "C" then error("assign to undeclared variable '"..n.."'", 2) end mt.__declared[n] = true end rawset(t, n, v) end mt.__index = function (t, n) if not mt.__declared[n] and string.sub(n,1,2) ~= "__" and debug.getinfo(2, "S").what ~= "C" then error("variable '"..n.."' is not declared", 2) end return rawget(t, n) end function global(...) for _, v in ipairs{...} do mt.__declared[v] = true end end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/apdu.lua0000644000175000017500000001432112155053151017232 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- HELPER LIBRARY : implements some frequent iso7816 APDUs ----------------------------------------------------------- -- load_smartcard_list -- ---------------------------------------------------------- TABLE_BASE={} TABLE_REGEX={} TABLE_LOADED=false function card.load_smartcard_list() local current=nil local f = io.open('etc/smartcard_list.txt','r') if f==nil then f = io.open('/usr/share/pcsc/smartcard_list.txt','r') end if f==nil then log.print(log.WARNING,"Could not find smartcard_list.txt either in .cardpeek/scripts/etc/ or in /usr/share/pcsc/.") return false end for line in f:lines() do cfirst = line:sub(1,1) -- quick'n'dirty if cfirst=="\t" then res = { string.find(line,"\t(.+)") } table.insert(current, res[3]) elseif cfirst=="3" then res = line:gsub(" ", "") if res:find("%.") then TABLE_REGEX[res]={} current=TABLE_REGEX[res] else TABLE_BASE[res]={} current=TABLE_BASE[res] end else -- nothing end end io.close(f) TABLE_LOADED = true return true end function card.identify_atr(atr) local k,v local target=tostring(atr) if TABLE_LOADED==false then card.load_smartcard_list() end for k,v in pairs(TABLE_BASE) do if k==target then return v end end for k,v in pairs(TABLE_REGEX) do if string.match(target,k) then return v end end if TABLE_LOADED==true then log.print(log.INFO,"Could not find ATR in smartcard database.") end return nil end ----------------------------------------------------------- -- tree_startup : helper startup function -- connect the card and start the card information tree ----------------------------------------------------------- function card.tree_startup(title) local mycard local ref local atr = card.last_atr() local candidates = card.identify_atr(atr) local atrnode mycard = nodes.root():append({ classname="card", label=title }); atrnode = mycard:append({ classname="atr", label="cold ATR", size=#atr, val=atr }) if candidates then local cardtypes = atrnode:append({ classname="item", label="Possibly identified card", val=table.concat(candidates,"\n ")}) end return mycard end ----------------------------------------------------------- -- card.select : standard general select command -- (superseeds card.select_file) -- ----------------------------------------------------------- -- constants for return_what card.SELECT_RETURN_FIRST = 0 card.SELECT_RETURN_LAST = 1 card.SELECT_RETURN_NEXT = 2 card.SELECT_RETURN_PREVIOUS = 3 card.SELECT_RETURN_FCI = 0 card.SELECT_RETURN_FCP = 4 card.SELECT_RETURN_FMD = 8 function card.select(file_path,return_what,length) local command local sel_type, sel_file local fileid sel_file, sel_type = card.make_file_path(file_path) if sel_type==nil then return 0x6F00, nil end if return_what==nil then return_what=card.SELECT_RETURN_FIRST + card.SELECT_RETURN_FCI end if sel_file==nil or #sel_file==0 then command = bytes.new(8,card.CLA,0xA4,sel_type,return_what) else fileid = bytes.new(8,sel_file) command = bytes.new(8,card.CLA,0xA4,sel_type,return_what,#fileid,fileid) end if length~=nil then command = bytes.concat(command,length) else command = bytes.concat(command,"00") end return card.send(command) end ----------------------------------------------------------- -- card.read_record : standard read_record apdu, -- with optionnal length in "extra" -- -- IN sfi : a number representing a short file identifier -- or '.' for the current selected file. -- IN r : record number to read -- IN length_expected : number of bytes to read -- RETURNS : sw, data ----------------------------------------------------------- function card.read_record(sfi,r,length_expected) local command if sfi==nil then log.print(log.ERROR,"You must specify a SFI number or '.' in card.read_record()") return 0x6F00, nil end if sfi=='.' then sfi = 0 end if length_expected==nil then length_expected = 0 end local command = bytes.new(8,card.CLA,0xB2,r,bit.OR(bit.SHL(sfi,3),4),length_expected) return card.send(command) end ----------------------------------------------------------- -- card.read_binary : standard read_binary apdu -- -- IN sfi : a number representing a short file identifier -- or '.' for the current selected file. -- IN addr : start address of read (or nil for 0) -- IN length_expected : number of bytes to read (or 0 for 256) -- RETURNS : sw, data ----------------------------------------------------------- function card.read_binary(sfi,addr,length_expected) local command if sfi==nil then log.print(log.ERROR,"You must specify a SFI number or '.' in card.read_binary()") return 0x6F00, nil end if addr==nil then addr=0 end if length_expected==nil then length_expected=0 end if sfi=='.' then command = bytes.new(8,card.CLA,0xB0,bit.AND(bit.SHR(addr,8),0x7F),bit.AND(addr,0xFF),length_expected) else command = bytes.new(8,card.CLA,0xB0,bit.OR(0x80,sfi),addr,length_expected) end return card.send(command) end ----------------------------------------------------------- -- card.read_data : read data command -- -- RETURNS : sw, data ----------------------------------------------------------- function card.get_data(id,length_expected) local command if length_expected==nil then length_expected=0 end command = bytes.new(8,card.CLA,0xCA,bit.SHR(id,8),bit.AND(id,0xFF),length_expected) return card.send(command) end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/en1545.lua0000644000175000017500000001444212166040731017230 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- require('lib.strict') require('lib.country_codes') EPOCH = 852073200 date_days = 0 function en1545_DATE(source) local part = bytes.sub(source, 0, 13) -- 14 bits part = bytes.pad_left(part,32,0) date_days = EPOCH+bytes.tonumber(part)*24*3600 return os.date("%x",date_days) end function en1545_TIME(source) local date_minutes local part = bytes.sub(source, 0, 10) -- 11 bits part = bytes.pad_left(part,32,0) date_minutes = date_days + bytes.tonumber(part)*60 date_days = 0 return os.date("%X",date_minutes) end ALPHA = { "-","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","?","?","?","?"," " } function en1545_ALPHA(source) local i local c local str = {""} for i=0,#source-4,5 do c=bytes.tonumber(bytes.sub(source,i,i+4)) table.insert(str,ALPHA[c+1]) end return table.concat(str) end function en1545_NETWORKID(source) local country = bytes.sub(source, 0, 11) local region = bytes.sub(source, 12, 23) local country_code local region_code country_code = iso_country_code_name(tonumber(country:convert(4):format("%D"))) region_code = tonumber(region:convert(4):format("%D")) if region_code then return "country "..country_code.." / network "..region_code end return "country "..country_code end function en1545_NUMBER(source) return bytes.tonumber(source) end function en1545_AMOUNT(source) return string.format("%.2f euros",bytes.tonumber(source)/100) end function en1545_ZONES(source) local zones = bytes.tonumber(source) local n = 8 local maxzone = 0 local minzone while n >= 1 do if zones >= 2^(n-1) then if maxzone == 0 then maxzone = n end zones = zones - 2^(n-1) if zones == 0 then minzone = n end end n = n - 1 end return string.format("%d-%d",minzone,maxzone) end function en1545_UNDEFINED(source) local hex_info = source:convert(8) return hex_info:format("0x%D") end en1545_BITMAP = 1 en1545_REPEAT = 2 --[[ in en1545_parse_item, the "format" parameter is a table with entries containing 3 or 4 elements: - format[1]: the type of the entry, which is either a) en1545_BITMAP: indicates a bitmap field (1 => field is present) b) en1545_REPEAT: indicates the field is repeated n times. c) en1545_XXXXXX: a function to call on the data for further processing. - format[2]: the length of the entry in bits. - format[3]: the name of the entry - format[4]: used only for en1545_BITMAP, points to a sub-table of entries. --]] function en1545_parse_item(ctx, format, data, position, reference_index) local parsed = 0 local index local item_node local bitmap_node local bitmap_size local item if format == nil then return 0 end parsed = format[2] -- entry length item = bytes.sub(data,position,position+parsed-1) item_node = ctx:append{ classname="item", label=format[3], id=reference_index } if format[1] == en1545_BITMAP then -- entry type is bitmap bitmap_size = parsed parsed = bitmap_size item_node:append{ classname="item", label="("..format[3].."Bitmap)", val=item } -- go through bit table in reverse order, since lsb=first bit for index,bit in item:reverse():ipairs() do if bit==1 then parsed = parsed + en1545_parse_item(item_node, format[4][index], data, position+parsed, index) end end elseif format[1] == en1545_REPEAT then -- entry type is repeat item_node:set_attribute("val",item) item_node:set_attribute("alt",bytes.tonumber(item)) for index=1,bytes.tonumber(item) do parsed = parsed + en1545_parse_item(ctx, format[4][0], data, position+parsed, reference_index+index) end else -- entry type is item item_node:set_attribute("val",item) item_node:set_attribute("alt",format[1](item)) end return parsed end function en1545_parse(ctx, format, data) local index local parsed = 0 for index=0,#format do parsed = parsed + en1545_parse_item(ctx,format[index],data,parsed,index) end return parsed end function en1545_unparsed(ctx, data) if bytes.tonumber(data)>0 then ctx:append{ classname="item", label="(remaining unparsed data)", val=data } end end function en1545_map(cardenv, data_type, ...) local record_node local bits local i local parsed local block for file in cardenv:find({label=data_type}) do for record_node in file:find({label="record"}) do if record_node==nil then break end bits = record_node:get_attribute("val"):convert(1) parsed = 0 for i,template in ipairs({...}) do block = bytes.sub(bits,parsed) if bytes.is_all(block,0)==false then parsed = parsed + en1545_parse(record_node,template,block) end end en1545_unparsed(record_node,bytes.sub(bits,parsed)) end file:set_attribute("label",data_type..", parsed") end end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/treeflex.lua0000644000175000017500000000042112165352366020126 00000000000000-- local TREEFLEX_WARNING=false if TREEFLEX_WARNING==false then log.print(log.WARNING,"the treeflex library included in this script is obsolete, please use the new 'nodes' API\n" .. "\tThis warning is only printed once.") TREEFLEX_WARNING=true end cardpeek-0.8/dot_cardpeek_dir/scripts/lib/compatibility-with-0.7.lua0000644000175000017500000000364012165352366022442 00000000000000 local DEPRECATED_FUNCS = {} function DEPRECATED_FOR(fname) local func = debug.getinfo(2, "n") local orig = debug.getinfo(3, "lS") if DEPRECATED_FUNCS[func.name]==nil then log.print(log.WARNING,orig.short_src .. "[" .. orig.currentline .. "]: " .. func.name .. "() is deprecated, please use " .. fname .. "() instead.\n" .. "\tThis warning will only be printed once for " .. func.name .. "().") DEPRECATED_FUNCS[func.name]=true end end function ui.tree_find_all_nodes(origin_ref, alabel, aid) DEPRECATED_FOR("nodes.find") local node local ret = {} if origin_ref==nil then origin_ref = nodes.root() end for node in nodes.find(origin_ref, {label=alabel, id=aid}) do ret[#ret+1]=node; end return ret; end function ui.tree_find_node(origin_ref, alabel, aid) DEPRECATED_FOR("nodes.find_first") if origin_ref==nil then origin_ref = nodes.root() end return nodes.find_first(origin_ref, {label=alabel, id=aid}) end function ui.tree_add_node(parent_ref, ...) DEPRECATED_FOR("nodes.append") local arg={...} if parent_ref==nil then parent_ref = nodes.root() end return nodes.append(parent_ref,{ classname=arg[1], label=arg[2], id=arg[3], size=arg[4] }) end function ui.tree_set_value(node,val) DEPRECATED_FOR("nodes.set_attribute") return node:set_attribute("val",val) end function ui.tree_get_value(node,val) DEPRECATED_FOR("nodes.get_attribute") return node:get_attribute("val",val) end function ui.tree_set_alt_value(node,val) DEPRECATED_FOR("nodes.set_attribute") return node:set_attribute("alt",val) end function ui.tree_get_alt_value(node,val) DEPRECATED_FOR("nodes.get_attribute") return node:get_attribute("alt",val) end function ui.tree_delete_node(node) DEPRECATED_FOR("nodes.remove") return nodes.remove(node) end cardpeek-0.8/dot_cardpeek_dir/scripts/.e-passport.lua.swp0000644000175000017500000012000012135302665020513 00000000000000b0VIM 7.3uQ ,pannetradebiandev~pannetra/.cardpeek/scripts/e-passport.luautf-8 3210#"! Utpy.z Sl{fN$NadyR \ a       w [ 7 - ( N ) d >  H ULdWJIkH/*sgP@;}xBzzk_^" DO87 = asn1.join(0x87,M) M = bytes.concat("01",crypto.encrypt(TDES_CBC,cmdbody,iv)) local DO99 local command local DO87, DO8E local iv = bytes.new(8,"00 00 00 00 00 00 00 00") local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KS_MAC) local TDES_CBC = crypto.create_context(crypto.ALG_DES2_EDE_CBC+crypto.PAD_OPT_80_ZERO,KS_ENC) local cmdbody = bytes.new(8,bit.SHR(EF,8),bit.AND(EF,0xFF)) local cmdheader = bytes.new(8,"0C A4 02 0C")function epass_select(EF)end return true KS_ENC, KS_MAC = epass_key_derivation(k_seed) SSC = bytes.sub(rnd_icc,4,7)..bytes.sub(rnd_ifd,4,7) end k_seed = bytes.concat(k_seed,bit.XOR(k_ifd:get(i),k_icc:get(i))) for i=0,15 do k_seed = bytes.new(8) k_icc = bytes.sub(R,16,31) R = crypto.decrypt(TDES_CBC,bytes.sub(resp,0,31),iv) end return false if (sw~=0x9000) then end log.print(log.WARNING,"Perhaps you didn't enter the right MRZ data for this passport") if (sw==0x6300) then sw, resp = card.send(bytes.new(8,"00 82 00 00 28",cmd_data,0x28)) cmd_data = e_ifd..m_ifd m_ifd = crypto.mac(CBC_MAC,e_ifd) e_ifd = crypto.encrypt(TDES_CBC,S,iv) S = rnd_ifd .. rnd_icc .. k_ifd if (sw~=0x9000) then return false end sw, rnd_icc = card.send(bytes.new(8,"00 84 00 00 08")) rnd_ifd = bytes.new(8,"01 23 45 67 89 AB DC FE") local m_ifd local e_ifd local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KM_MAC); local TDES_CBC = crypto.create_context(crypto.ALG_DES2_EDE_CBC+crypto.PAD_ZERO,KM_ENC); local iv = bytes.new(8,"00 00 00 00 00 00 00 00") local S local k_ifd = bytes.new(8,"0B 79 52 40 CB 70 49 B0 1C 19 B3 3E 32 80 4F 0B") local rnd_ifd local rnd_icc local sw, resp function epass_create_session_keys()end return true KM_ENC, KM_MAC = epass_key_derivation(bytes.sub(hash,0,15)) hash = crypto.digest(SHA1,bytes.new_from_chars(mrz_info)) SHA1 = crypto.create_context(0x0030); local SHA1 local hash local mrz_info = pass_no..pass_bd..pass_ed; local pass_ed = string.sub(mrz,22,28) local pass_bd = string.sub(mrz,14,20) local pass_no = string.sub(mrz,1,10)function epass_create_master_keys(mrz)end return bytes.sub(Kenc,0,15),bytes.sub(Kmac,0,15) Kmac = crypto.digest(SHA1,D) D = bytes.concat(seed, bytes.new(8,"00 00 00 02")) Kenc = crypto.digest(SHA1,D) D = bytes.concat(seed, bytes.new(8,"00 00 00 01")) SHA1 = crypto.create_context(0x0030) local Kmac local Kenc local D local SHA1function epass_key_derivation(seed)end return true --print("SSC: ",#SSC,SSC) end i=i-1 if SSC:get(i)~=0 then break end SSC:set(i,SSC:get(i)+1) while i>=0 do local e local i=7function epass_inc_SSC()local TEST=falselocal KS_MAClocal KS_ENClocal KM_MAClocal KM_ENClocal SSCrequire("lib.tlv")---- along with Cardpeek. If not, see .-- You should have received a copy of the GNU General Public License---- GNU General Public License for more details.-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-- but WITHOUT ANY WARRANTY; without even the implied warranty of-- Cardpeek is distributed in the hope that it will be useful,---- (at your option) any later version.-- the Free Software Foundation, either version 3 of the License, or-- it under the terms of the GNU General Public License as published by-- Cardpeek is free software: you can redistribute it and/or modify---- Copyright 2009-2013 by 'L1L1'---- This file is part of Cardpeek, the smartcard reader utility.--ad I $Q]6  p e 1 '  F 9 . $ P L K J I end ui.question("No passport dend ui.question("No passport detected in proximity of the reader",{"OK"})else card.disconnect() end ui.question("Could not create session keys. Perhaps you didn't enter the correct MRZ data.",{"OK"}) else end end nodes.set_attribute(CONTENT,"alt",string.format("Content not accessible (code %04X)",sw)) else end nodes.set_attribute(CONTENT,"alt","Selected file, but data is not accessible") else end tlv_parse(CONTENT,r,MRP_REFERENCE) else nodes.set_attribute(TAG6D,"val",value_6D) TAG6D = CONTENT:append({ classname="item", label="National specific data", size=#value_6D }) tag_6D, value_6D = asn1.split(r) if r:get(0)==0x6D then nodes.set_attribute(CONTENT,"size",#r) if r then r = epass_read_file() log.print(log.INFO,"Attempt to read from " .. v['name']) if sw==0x9000 then CONTENT = FID:append({classname="body", label="content" }) FID:append({classname="header", label="header", size=#resp, val=resp }) FID = APP:append({ classname="file", label=v['name'], id=string.format(".%04X",v['FID']) })adf_7c2 v J  V  r 2 s 3 N  e<~\ZYXWL#V-^4 ca`_X~}fRQ(^8.  log.pr log.print(log.INFO,"Attempt to select " .. v['name']) for i,v in ipairs(FILES) do then if epass_create_session_keys(ke,km) epass_create_master_keys(MRZ_DATA) end tlv_parse(APP,resp) if #resp>0 then APP = CARD:append({classname="application", label="application", id=AID_MRTD}) sw, resp = card.select(AID_MRTD,0) CARD = card.tree_startup("e-passport") local ke,km,i,v,rif card.connect() thenuntil #MRZ_DATA>=28 end ui.question("You must enter at least 28 characters",{"OK"}) if #MRZ_DATA<28 then MRZ_DATA = ui.readline("Enter the code from the lower MRZ data (printed inside the passport)",44,MRZ_DATA)repeat} { ['FID']=0x011D, ['name']='EF.SOD' } { ['FID']=0x0110, ['name']='EF.DG16' }, { ['FID']=0x010F, ['name']='EF.DG15' }, { ['FID']=0x010E, ['name']='EF.DG14' }, { ['FID']=0x010D, ['name']='EF.DG13' }, { ['FID']=0x010C, ['name']='EF.DG12' }, { ['FID']=0x010B, ['name']='EF.DG11' }, { ['FID']=0x010A, ['name']='EF.DG10' }, { ['FID']=0x0109, ['name']='EF.DG9' }, { ['FID']=0x0108, ['name']='EF.DG8' }, { ['FID']=0x0107, ['name']='EF.DG7' }, { ['FID']=0x0106, ['name']='EF.DG6' }, { ['FID']=0x0105, ['name']='EF.DG5' }, { ['FID']=0x0104, ['name']='EF.DG4' }, { ['FID']=0x0103, ['name']='EF.DG3' }, { ['FID']=0x0102, ['name']='EF.DG2' }, { ['FID']=0x0101, ['name']='EF.DG1' }, { ['FID']=0x011E, ['name']='EF.COM' },FILES = { } ['A1/88'] = { "Format type" } ['A1/87'] = { "Format owner" }, ['A1/86'] = { "Creator of the biometric reference data (PID)" }, ['A1/84'] = { "Validity period" }, ['A1/83'] = { "Creation date and time" }, ['A1/82'] = { "Biometric feature" }, ['A1/81'] = { "Biometric type" }, ['A1/80'] = { "ICAO header version" }, ['A1'] = { "Biometric Header Template" }, ['7F61/2'] = { "Number of instances" }, ['7F61'] = { "Biometric Information Group Template" }, ['7F60'] = { "Biometric Information Template" }, ['7F2E'] = { "Biometric data block (enciphered)" }, ['77'] = { "Security data (CMD/RFC 3369)" }, ['76'] = { "Template for iris (eye) biometric template" }, ['75'] = { "Template for facial biometric Data Group" }, ['70'] = { "Person to notify" }, ['6E'] = { "Reserved for future use" }, ['6D'] = { "Optional details" }, ['6C'] = { "Template for additional document details" }, ['6B'] = { "Template for additional personal details" }, ['6A'] = { "Template for machine assisted security -- Substance" }, ['69'] = { "Template for machine assisted security -- Structure" }, ['68'] = { "Template for machine assisted security -- Encoded data" }, ['67'] = { "Template for digitized signature or usual mark" }, ['65'] = { "Template for digitized facial image" }, ['63'] = { "Template for finger biometric Data Group" }, ['61'] = { "Template for MRZ Data Group" }, ['60'] = { "Common Data Elements" }, ['5F36'] = { "Unicode Version number", ui_parse_version }, ['5F2E'] = { "Biometric data block", ui_parse_biometry }, ['5F1F'] = { "MRZ data elements", ui_parse_printable }, ['5F08'] = { "Date of birth (truncated)" }, ['5F01'] = { "LDS Version Number", ui_parse_version },MRP_REFERENCE = {AID_MRTD = "#A0000002471001"end return true end nodes.set_attribute(node,"val",data) else ui_parse_biometry_fir(node,data) elseif tag==FIR_FORMAT_IDENTIFIER then ui_parse_biometry_fac(node,data) if tag==FAC_FORMAT_IDENTIFIER then local tag = bytes.sub(data,0,3)function ui_parse_biometry(node,data)end return truead sw, resp = epass_select(v['FID'])ad5 .q6n0 x w R Q 5  K  o < ;  q R A u q p U 3  ~xZUT=+^3 \(tgcba`;[.R>(sW: [6]="Multi-Coloured", [5]="Green", [4]="Gray", [3]="Brown", [2]="Blue", [1]="Black", [0]="Unspecified", { "Eye Color", 1, { [3]="Unknown" }}, [2]="Female", [1]="Male", [0]="Unspecified", { "Gender", 1 , { { "Number of Feature Points", 2, ui_parse_number }, { "Face Image Block Length", 4, ui_parse_number },BL_FAC_INFORMATION = {} { "Number of Faces", 2, ui_parse_number } { "Length of Record", 4, ui_parse_number }, { "Format Version", 4, ui_parse_cstring }, { "Format Identifier", 4, ui_parse_cstring },BL_FAC_RECORD_HEADER = { end end nodes.set_attribute(node,"alt",bytes.format(bytes.sub(data,0,#data-2),"%P")) if #data>1 then nodes.set_attribute(node,"val",data)function ui_parse_cstring(node,data)end return true nodes.set_attribute(node,"alt",ver) nodes.set_attribute(node,"val",data) end ver = ver .. "." .. bytes.format(bytes.sub(data,i*2,i*2+1),"%P") for i=1,(#data/2)-1 do local i local ver = bytes.format(bytes.sub(data,0,1),"%P")function ui_parse_version(node,data)end return result --io.write("] "..#result.."bytes\n") end to_read = to_read - #resp already_read = already_read + #resp result = bytes.concat(result,resp) if sw~=0x9000 then return result end sw, resp = epass_read_binary(already_read,le) end le = to_read else le = 0x80 if to_read>0x80 then --io.write(".");io.flush() while to_read>0 do already_read = 0 result = bytes.new(8) end to_read = len + 2 else to_read = len + 4 if len>127 then --io.write("read_file: [") len, rest = asn1.split_length(rest) tag, rest = asn1.split_tag(resp) if sw~=0x9000 then return nil end sw,resp = epass_read_binary(0,4)function epass_read_file()end return sw, bytes.sub(decrypted_data,0,len-1) decrypted_data = crypto.decrypt(TDES_CBC,bytes.sub(value if (sw~=0x9000 && sw~=0x62) then return fals if (sw~=0x9000) and (sw~=0x6282) then return false end epass_inc_SSC() sw, resp = card.send(command) command = bytes.concat(cmdheader,(#DO97+#DO8E),DO97,DO8E,0) DO8E = asn1.join(0x8E,crypto.mac(CBC_MAC,bytes.concat(SSC,cmdheader,"80 00 00 00",DO97))) epass_inc_SSC() DO97 = bytes.new(8,0x97,01,len) local iv = bytes.new(8,"00 00 00 00 00 00 00 00") local value_87 local DO97,D08E local TDES_CBC = crypto.create_context(crypto.ALG_DES2_EDE_CBC+crypto.PAD_OPT_80_ZERO,KS_ENC) local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KS_MAC) local cmdheader = bytes.new(8,"0C B0", bit.SHR(start,8),bit.AND(start,0xFF))function epass_read_binary(start,len)end return sw, resp end log.print(log.WARNING,"Failed to verify MAC in response") if value_8E~=CC then CC = crypto.mac(CBC_MAC,N) N = SSC..asn1.join(tag_99,value_99) sw = 0+bytes.tonumber(value_99) end return 0x6FFF log.print(log.WARNING,"Expected tag 8E in card response") if tag_8E~=0x8E then end return 0x6FFF log.print(log.WARNING,"Expected tag 99 in card response") if tag_99~=0x99 then tag_8E, value_8E, rest = asn1.split(rest) tag_99, value_99, rest = asn1.split(resp) end return sw, resp if sw~=0x9000 then epass_inc_SSC() sw, resp = card.send(command) command=bytes.concat(cmdheader,(#DO87+#DO8E),DO87,DO8E,0) DO8E = asn1.join(0x8E,crypto.mac(CBC_MAC,N)) CC = crypto.mac(CBC_MAC,N) N = bytes.concat(SSC,cmdheader,"80 00 00 00",DO87) epass_inc_SSC()ad;pS5^F0 y P / d C 0 . -  w ` I 7 5 3  x b .  s = & p][Z;iL8pN0j9&$#"Z1pD*jdQL@<;:end return pos end pos = pos + v[2] end nodes.set_attribute(ITEM,"val",block) else end return nil else end nodes.set_attribute(ITEM,"alt",index) else nodes.set_attribute(ITEM,"alt",v[3][index]) if v[3][index] then nodes.set_attribute(ITEM,"val",block) index = bytes.tonumber(block) elseif type(v[3])=="table" then end return nil if v[3](ITEM,block)==false then if type(v[3])=="function" then if v[3]~=nil then block = bytes.sub(data,pos,pos+v[2]-1) ITEM = node:append({ classname="item", label=v[1], id=i-1, size=v[2] }) for i,v in ipairs(format) do local index local i,v local block local ITEMfunction ui_parse_block(node,format,data,pos)} { "Reserved", 1 } { "Vertical line length", 2, ui_parse_number }, { "Horizontal line length", 2, ui_parse_number }, { "Impression type", 1 }, { "Finger/palm image quality", 1 }, { "View number", 1, ui_parse_number }, { "Count of views", 1, ui_parse_number }, [15]="Plain thumbs (2)" }}, [14]="Plain left four fingers", [13]="Plain right four fingers", [12]="Plain left thumb", [11]="Plain right thumb", [10]="Left little finger", [9]="Left ring finger", [8]="Left middle finger", [7]="Left index finger", [6]="Left thumb", [5]="Right little finger", [4]="Right ring finger", [3]="Right middle finger", [2]="Right index finger", [1]="Right thumb", [0]="Unknown", { "Finger/palm position", 1, { { "Length of finger data block", 4, ui_parse_number },BL_FIR_IMAGE_RECORD_HEADER = {} { "Reserved", 2 } [5]="PNG" }}, [4]="Compressed – JPEG2000", [3]="Compressed – JPEG", [2]="Compressed – WSQ", [1]="Uncompressed – bit packed", { "Image Compression Algorithm", 1, { { "Pixel Depth", 1 }, { "Vertical Image Resolution", 2, ui_parse_number }, { "Horizontal Image Resolution", 2, ui_parse_number }, { "Vertical Scan Resolution", 2, ui_parse_number }, { "Horizontal Scan Resolution", 2, ui_parse_number }, { "Scale Units", 1 }, { "Number of fingers/palms", 1, ui_parse_number }, { "Scanner ID", 2 }, { "Vendor ID", 2 }, { "Record Length", 6, ui_parse_number }, { "Version Number", 4, ui_parse_cstring }, { "Format Identifier", 4, ui_parse_cstring },BL_FIR_GENERAL_RECORD_HEADER = { } { "Quality", 2 } { "Device Type", 2 }, { "Source Type", 1 }, { "Image Color Space", 1 }, { "Height", 2, ui_parse_number }, { "Width", 2, ui_parse_number }, { "Image Data Type", 1 }, { "Face Image Type", 1 },BL_FAC_IMAGE_INFORMATION = { } { "Reserved", 2 } { "Vertical Position (y)", 2 }, { "Horizontal Position (x)", 2 }, { "Feature Point", 1 }, { "Feature Type", 1 },BL_FAC_FEATURE_POINT = {} { "Pose Angle Uncertainty", 3 } { "Pose Angle", 3 }, [7]="Frowning" }}, [6]="Squinting", [5]="Eyes looking away", [4]="Raised eyebrows", [3]="Smile with open mouth", [2]="Smile with closed mouth", [1]="Neutral", [0]="Unspecified", { "Expression", 2, { { "Feature Mask", 3 }, [255]="Other or Unknown" }}, [9]="Blue", [8]="Green", [7]="Red", [6]="White", [5]="Gray", [4]="Brown", [3]="Blonde", [2]="Black", [1]="Bald", [0]="Unspecified", { "Hair Color", 1 , { [8]="Other or Unknown" }}, [7]="Pink",adluhXE/ 8 B A )  + ( | ? . & % M   y x ' smj;T83&%! t`NEDE5/cLKG1G end index = index + image_size nodes.set_attribute(SUBSUBBLOCK,"val",bytes.sub(data,index,index+image_size-1)) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Finger Image Data" }) image_size = record_size-(index-record_start) end return false log.print(log.ERROR,"Failed to parse finger image record header information") if index==nil then index = ui_parse_block(SUBSUBBLOCK,BL_FIR_IMAGE_RECORD_HEADER,data,index) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Finger Image Record Header" }) SUBBLOCK = BLOCK:append({ classname="item", label="Finger Image", id=i, size=record_size }) record_start = index record_size = bytes.tonumber(bytes.sub(data,index,index+3)) for i=1,num_images do BLOCK = node:append({ classname="item", label="Finger Images" }) num_images = bytes.tonumber(bytes.sub(data,18,18)) end return false log.print(log.ERROR,"Failed to parse finger general record header information") if index==nil then index = ui_parse_block(BLOCK,BL_FIR_GENERAL_RECORD_HEADER,data,index) BLOCK = node:append({ classname="item", label="Finger General Record Header" }) local i local image_size local record_start local record_size local num_images local index = 0 local SUBSUBBLOCK local SUBBLOCK local BLOCKfunction ui_parse_biometry_fir(node,data)end return true end index = index + image_len nodes.set_attribute(SUBSUBBLOCK,"mime-type","image/jpeg") nodes.set_attribute(SUBSUBBLOCK,"val",bytes.sub(data,index,index+image_len-1)) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Image Data", size=image_len }) image_len = block_length-(index-block_start) end return false log.print(log.ERROR,"Failed to parse facial image information") if index==nil then index = ui_parse_block(SUBSUBBLOCK,BL_FAC_IMAGE_INFORMATION,data,index) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Image Information" }) end end end return false log.print(log.ERROR,"Failed to parse facial feature information") if index==nil then index = ui_parse_block(SUBSUBSUBBLOCK,BL_FEATURE_POINT,data,index) SUBSUBSUBBLOCK = node:append({ classname="item", label="Feature Point", id=j }) for j=1,num_features do SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Feature points" }) if num_features>0 then end return false log.print(log.ERROR,"Failed to parse facial information") if index==nil then index = ui_parse_block(SUBSUBBLOCK,BL_FAC_INFORMATION,data,index) SUBSUBBLOCK = SUBBLOCK:append({ classname="item", label="Facial Information" }) SUBBLOCK = BLOCK:append({ classname="item", label="Facial Record Data", id=i, size=block_length }) num_features = bytes.tonumber(bytes.sub(data,index+4,index+5)) block_length = bytes.tonumber(bytes.sub(data,index,index+3)) block_start = index for i = 1,num_faces do BLOCK = node:append({ classname="item", label="Facial Data Records" }) end return false log.print(log.ERROR,"Failed to parse facial header information") if index==nil then index = ui_parse_block(BLOCK,BL_FAC_RECORD_HEADER,data,index) BLOCK = node:append({ classname="item", label="Facial Record Header" }) num_faces = bytes.tonumber(bytes.sub(data,12,13)) local i,j local image_len local block_start local block_length local num_features local num_faces local index = 0 local SUBSUBSUBBLOCK local SUBSUBBLOCK local SUBBLOCK local BLOCKfunction ui_parse_biometry_fac(node,data)FIR_FORMAT_IDENTIFIER = bytes.new(8,"46495200")FAC_FORMAT_IDENTIFIER = bytes.new(8,"46414300")ad'SfbaF$hfU&  m R ? -  [ ; 6   ? :   ) $   { P N M 6  oZD'  [6]="Multi-Coloured", [5]="Green", [4]="Gray", [3]="Brown", [2]="Blue", [1]="Black", [0]="Unspecified", { "Eye Color", 1, { [3]="Unknown" }}, [2]="Female", [1]="Male", [0]="Unspecified", { "Gender", 1 , { { "Number of Feature Points", 2, ui_parse_number }, { "Face Image Block Length", 4, ui_parse_number },BL_FAC_INFORMATION = {} { "Number of Faces", 2, ui_parse_number } { "Length of Record", 4, ui_parse_number }, { "Format Version", 4, ui_parse_cstring }, { "Format Identifier", 4, ui_parse_cstring },BL_FAC_RECORD_HEADER = { end end nodes.set_attribute(node,"alt",bytes.format(bytes.sub(data,0,#data-2),"%P")) if #data>1 then nodes.set_attribute(node,"val",data)function ui_parse_cstring(node,data)end return true nodes.set_attribute(node,"alt",ver) nodes.set_attribute(node,"val",data) end ver = ver .. "." .. bytes.format(bytes.sub(data,i*2,i*2+1),"%P") for i=1,(#data/2)-1 do local i local ver = bytes.format(bytes.sub(data,0,1),"%P")function ui_parse_version(node,data)end return result --io.write("] "..#result.."bytes\n") end to_read = to_read - #resp already_read = already_read + #resp result = bytes.concat(result,resp) if sw~=0x9000 then return result end sw, resp = epass_read_binary(already_read,le) end le = to_read else le = 0x80 if to_read>0x80 then --io.write(".");io.flush() while to_read>0 do already_read = 0 result = bytes.new(8) log.print(log.INFO,"Expecting " .. to_read) end to_read = len + 2 else to_read = len + 2 + resp:get(1)-128 if len>127 then --io.write("read_file: [") len, rest = asn1.split_length(rest) tag, rest = asn1.split_tag(resp) log.print(log.INFO,"Heading is " .. tostring(resp)) if sw~=0x9000 then return nil end sw,resp = epass_read_binary(0,4)function epass_read_file()end return sw, bytes.sub(decrypted_data,0,len-1) decrypted_data = crypto.decrypt(TDES_CBC,bytes.sub(value_87,1,-1),iv) tag_87, value_87 = asn1.split(resp)cardpeek-0.8/dot_cardpeek_dir/scripts/calypso/0000755000175000017500000000000012214321142016553 500000000000000cardpeek-0.8/dot_cardpeek_dir/scripts/calypso/c376n2.lua0000644000175000017500000012617712213657631020154 00000000000000-- -- This file is part of Cardpeek, the smart card reader utility. -- -- Copyright 2009-2013 by Alain Pannetrat -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- --********************************************************************-- -- -- This file, c376n2.lua, was authored and contributed to cardpeek by -- Anthony Berkow (C) 2013 -- -- Some minor alterations of the original file were performed for -- integration with calypso.lua -- --********************************************************************-- require('lib.apdu') require('lib.tlv') require('lib.en1545') require('lib.country_codes') require('etc.ravkav-strings') --Classes ISO_CLS_STD = 0x00 --Structure and coding of command and response according to ISO/IEC 7816 5.4.1 (plus optional secure messaging and logical channel) ISO_CLS_PRO9 = 0x90 --As for ISO_CLS_STD but the coding and meaning of command and response are proprietary --Class modifiers (SM) ISO_CLS_SM_PRO = 0x04 --Proprietary secure messaging format --Application ID AID_RavKav = "#315449432e494341" --"1TIC.ICA" --LIDs CALYPSO_LID_ENVIRONMENT = "2001" --SFI=0x07, linear, 1 record CALYPSO_LID_EVENTS_LOG = "2010" --SFI=0x08, cyclic, 3 records CALYPSO_LID_CONTRACTS = "2020" --SFI=0x09, linear, 4 records CALYPSO_LID_COUNTERS = "2069" --SFI=0x19, counters, 9 counters LID_LIST = { {"General Information", CALYPSO_LID_ENVIRONMENT, "environment"}, {"Counters", CALYPSO_LID_COUNTERS, "counters"}, {"Latest Travel", CALYPSO_LID_EVENTS_LOG, "event"}, {"Contracts", CALYPSO_LID_CONTRACTS, "contract"} } function ravkav_parse_serial_number(node,data) nodes.set_attribute(node,"val", data) nodes.set_attribute(node,"alt", string.format("%010d",bytes.tonumber(data))) end function ravkav_parse_ats(node,data) if data and 5 <= #data then local byteOffset = 1 byteOffset = RavKav_parseBits(data, byteOffset, 1, node, "File type", en1545_NUMBER) byteOffset = RavKav_parseBits(data, byteOffset, 1, node, "EF type", en1545_NUMBER) byteOffset, recordLen = RavKav_parseBits(data,byteOffset, 1, node, "Record size", en1545_NUMBER) byteOffset, numRecords = RavKav_parseBits(data,byteOffset, 1, node, "Record count", en1545_NUMBER) byteOffset = RavKav_parseBits(data, byteOffset, 4, node, "Access", en1545_UNDEFINED) end end --Tags RAVKAV_IDO = { ['A5/BF0C'] = {"Secure messaging data"}, ['BF0C/C7'] = {"Serial number", ravkav_parse_serial_number}, ['85'] = {"Record Info", ravkav_parse_ats}, } ValidUntilOption = { None = 0, Date = 1, EndOfService = 2, Cancelled = 3 } function bytes.is_all(bs, byte) if 0 == #bs then return false end local i for i = 0, #bs - 1 do if bs[i] ~= byte then return false end end return true end function RavKav_addTextNode(ctx, a_label, text) local REF = nodes.append(ctx, { classname="item", label=a_label }) nodes.set_attribute(REF,"alt", text) end function RavKav_selectApplication(root) card.CLA = ISO_CLS_STD local sw, resp = card.select(AID_RavKav, card.SELECT_RETURN_FIRST + card.SELECT_RETURN_FCI, 0) if 0x9000 ~= sw then log.print(log.ERROR, "Failed to select Calypso application.") return nil end local APP_REF = nodes.append(root, { classname="application", label="RavKav Card", size=#resp }) nodes.set_attribute(APP_REF,"val", resp) return APP_REF end function RavKav_readCalypsoEf(lid, ctx) card.CLA = ISO_CLS_STD local sw, resp = card.select("."..lid) if 0x9000 ~= sw then log.print(log.ERROR, "Failed to select EF "..lid) else tlv_parse(ctx, resp) end end function RavKav_parseEf(ctx) local numRecords, recordLen local RECINFO_REF, ri_data = RavKav_getField(ctx, "Record Info") if ri_data and 5 <= #ri_data then --recordLen = ri_data[3] --numRecords = ri_data[4] local byteOffset = 1 byteOffset = RavKav_parseBits(ri_data, byteOffset, 1, RECINFO_REF, "File type", en1545_NUMBER) byteOffset = RavKav_parseBits(ri_data, byteOffset, 1, RECINFO_REF, "EF type", en1545_NUMBER) byteOffset, recordLen = RavKav_parseBits(ri_data,byteOffset, 1, RECINFO_REF, "Record size", en1545_NUMBER) byteOffset, numRecords = RavKav_parseBits(ri_data,byteOffset, 1, RECINFO_REF, "Record count", en1545_NUMBER) byteOffset = RavKav_parseBits(ri_data, byteOffset, 4, RECINFO_REF, "Access", en1545_UNDEFINED) log.print(log.DBG, string.format("numRecords: %d, recordLen: %d", numRecords, recordLen)) end return numRecords, recordLen end function RavKav_getRecordInfo(ctx) local numRecords = 0 local recordLen = 0 local RECINFO_REF = nodes.find_first(ctx, {label="Record Info"}) if RECINFO_REF then numRecords = RavKav_getFieldAsNumber(RECINFO_REF, "Record count") recordLen = RavKav_getFieldAsNumber(RECINFO_REF, "Record size") end return numRecords, recordLen end function RavKav_readRecord(nRec, recordLen) card.CLA = ISO_CLS_PRO9 + ISO_CLS_SM_PRO local sw, resp = card.read_record(0, nRec, recordLen) if 0x9000 ~= sw then log.print(log.ERROR, string.format("Failed to read record %d", nRec)) return nil end return resp end -- Note: this function can work with either bits or bytes depending on the data format function RavKav_parseBits(data, bitOffset, nBits, REC, a_label, func, a_id) local valData = bytes.sub(data, bitOffset, bitOffset + nBits - 1) local value = func(valData) local intVal = bytes.tonumber(valData) local NEW_REF = nil if REC then NEW_REF = nodes.append(REC, {classname="item", label=a_label, id=a_id, size=nBits }) nodes.set_attribute(NEW_REF,"val", bytes.convert(valData,8)) nodes.set_attribute(NEW_REF,"alt", value) end return bitOffset + nBits, value, NEW_REF, intVal end function RavKav_rkDaysToSeconds(dateDaysPart) bytes.pad_left(dateDaysPart, 32, 0) return EPOCH + bytes.tonumber(dateDaysPart) * 24 * 3600 end -- The bits in dateDaysPart have been inverted. function RavKav_rkInvertedDaysToSeconds(dateDaysPart) bytes.pad_left(dateDaysPart, 32, 0) return EPOCH + bit.XOR(bytes.tonumber(dateDaysPart), 0x3fff) * 24 * 3600 end -- Return the date (in seconds) corresponding to the last day of the month for the given date (in seconds). -- If addMonths > 0 then the month is incremented by addMonths months. function RavKav_calculateMonthEnd(dateSeconds, addMonths) local dt = os.date("*t", dateSeconds) if 0 < addMonths then dt.month = dt.month + addMonths local addYears = math.floor(dt.month / 12) dt.year = dt.year + addYears dt.month = dt.month - addYears * 12 end dt.day = 28 local tmp_dt = dt repeat local date_s = os.time(tmp_dt) + 24 * 3600 --add 1 day tmp_dt = os.date("*t",date_s) if 1 ~= tmp_dt.day then --did not wrap round to a new month dt.day = dt.day + 1 end until 1 == tmp_dt.day return os.time(dt) end function RavKav_BCD_DATE(source) local dob = tostring(bytes.convert(source,8)) local dobYear = string.sub(dob, 1, 4) local dobMonth = string.sub(dob, 5, 6) local dobDay = string.sub(dob, 7, 8) local dateOfBirth = dobDay.."/"..dobMonth.."/"..dobYear return dateOfBirth end function RavKav_DATE_TIME(source) local dtSecondsPart = bytes.sub(source, 0, 29) --30 bits bytes.pad_left(dtSecondsPart, 32, 0) local dtSeconds = EPOCH + bytes.tonumber(dtSecondsPart) return os.date("%c", dtSeconds) end function RavKav_INVERTED_DATE(source) return os.date("%x", RavKav_rkInvertedDaysToSeconds(source)) end function RavKav_PERCENT(source) return string.format("%u %%", bytes.tonumber(source)) end -- source is in BCD! function RavKav_COUNTRY(source) local countryId = bytes.tonumber(source) countryId = tonumber(string.format("%X", countryId)) return iso_country_code_name(countryId) end function RavKav_ISSUER(source) local issuerId = bytes.tonumber(source) local issuer = RAVKAV_ISSUERS[issuerId] if issuer then return issuer end return tostring(issuerId) end function RavKav_PROFILE(source) local profileId = bytes.tonumber(source) local profile = RAVKAV_PROFILES[profileId] if profile then return profile end return tostring(profileId) end function RavKav_ROUTE(source) local routeSystemId = bytes.tonumber(source) local route = RAVKAV_ROUTES[routeSystemId] if route then return route end return tostring(routeSystemId) end function RavKav_LOCATION(source) local locationId = bytes.tonumber(source) local location = RAVKAV_LOCATIONS[locationId] if location then return location end return tostring(locationId) end function RavKav_VALIDITY_TYPE(source) local validityType = bytes.tonumber(source) local validity = RAVKAV_VALIDITY_TYPES[validityType] if validity then return validity end return tostring(validityType) end function RavKav_CONTRACT_TYPE(source) local contractType = bytes.tonumber(source) local contract = RAVKAV_CONTRACT_TYPES[contractType] if contract then return contract end return tostring(contractType) end -- Returns CSV list of which bits are set function RavKav_ZONES(source) local zonesPart = bytes.sub(source, 0, 11) --12 bits local zones = bytes.tonumber(zonesPart) local haveZones = false local zoneList = "" local i for i = 1, 12 do if 1 == bit.AND(zones, 1) then if haveZones then zoneList = zoneList.."," end zoneList = zoneList..tostring(i) haveZones = true end zones = bit.SHR(zones, 1) end return zoneList end function RavKav_readRecords(EF_REF, numRecords, recordLen, rec_desc) local nRec for nRec = 1, numRecords do local record = RavKav_readRecord(nRec, recordLen) if record then local REC_REF = nodes.append(EF_REF, {classname="record", label=rec_desc, id=nRec, size=#record}) nodes.set_attribute(REC_REF,"val", record) end end end function RavKav_readFile(APP_REF, desc, lid, rec_desc) log.print(log.DBG, "Reading "..desc.."...") local EF_REF = nodes.append(APP_REF, {classname="file", label=desc}) RavKav_readCalypsoEf(lid, EF_REF) local numRecords, recordLen = RavKav_parseEf(EF_REF) if numRecords then RavKav_readRecords(EF_REF, numRecords, recordLen, rec_desc) end end function RavKav_getField(SRC_REF, a_label, a_id) local data, text local REF = nodes.find_first(SRC_REF, {label=a_label, id=a_id}) if REF then data = nodes.get_attribute(REF,"val") text = nodes.get_attribute(REF,"alt") end return REF, data, text end function RavKav_getFieldAsNumber(SRC_REF, label, id) local REF, data, text = RavKav_getField(SRC_REF, label, id) if data then return bytes.tonumber(data) end return 0 end function RavKav_getFieldsAsNumberAry(SRC_REF, a_label, a_id) local node local ary = {} for node in nodes.find(SRC_REF, { label=a_label, id=a_id }) do local data = nodes.get_attribute(node,"val") if data then table.insert(ary, bytes.tonumber(data)) end end return ary end -- if ary is supplied then only create new node if the field is a pointer to a valid entry in ary function RavKav_copyField(SRC_REF, DEST_REF, a_label, a_id, ary) local SRC_REF2, data, text = RavKav_getField(SRC_REF, a_label, a_id) if nil == data then return nil, nil end if ary then local dataId = en1545_NUMBER(data) if nil == ary[dataId] then return nil, nil end end NEW_REF = nodes.append(DEST_REF, {classname="item", label=a_label, id=a_id, size=#data }) nodes.set_attribute(NEW_REF,"val", data) nodes.set_attribute(NEW_REF,"alt", text) return SRC_REF2, NEW_REF end function RavKav_parseEnvironment(ENV_REF, nRec) local ENV_REC_REF = nodes.find_first(ENV_REF, {label="record", id=nRec}) if nil == ENV_REC_REF then return false end local record = nodes.get_attribute(ENV_REC_REF,"val") if nil == record then return false end local data = bytes.convert(record,1) local bitOffset = 0 bitOffset = RavKav_parseBits(data, bitOffset, 3, ENV_REC_REF, "Version number", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 12, ENV_REC_REF, "Country", RavKav_COUNTRY) bitOffset = RavKav_parseBits(data, bitOffset, 8, ENV_REC_REF, "Issuer", RavKav_ISSUER) bitOffset = RavKav_parseBits(data, bitOffset, 26, ENV_REC_REF, "Application number", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 14, ENV_REC_REF, "Date of issue", en1545_DATE) bitOffset = RavKav_parseBits(data, bitOffset, 14, ENV_REC_REF, "End date", en1545_DATE) bitOffset = RavKav_parseBits(data, bitOffset, 3, ENV_REC_REF, "Pay method", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 32, ENV_REC_REF, "Date of birth", RavKav_BCD_DATE) bitOffset = RavKav_parseBits(data, bitOffset, 14, ENV_REC_REF, "Company (not set)", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 30, ENV_REC_REF, "Company ID (not set)", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 30, ENV_REC_REF, "ID number", en1545_NUMBER) local PROFILES_REF = nodes.append(ENV_REC_REF, {classname="item", label="Profiles"}) local profile, ref bitOffset, profile, ref = RavKav_parseBits(data, bitOffset, 6, PROFILES_REF, "Profile", RavKav_PROFILE, 1) bitOffset = RavKav_parseBits(data, bitOffset, 14, ref, "Valid until", en1545_DATE) bitOffset, profile, ref = RavKav_parseBits(data, bitOffset, 6, PROFILES_REF, "Profile", RavKav_PROFILE, 2) RavKav_parseBits(data, bitOffset, 14, ref, "Valid until", en1545_DATE) return true end function RavKav_parseGeneralInfo(APP_REF) log.print(log.DBG, "Parsing general info (environment)...") local ENV_REF = nodes.find_first(APP_REF, {label="Environment"}) if ENV_REF then local numRecords = RavKav_getRecordInfo(ENV_REF) local nRec for nRec = 1, numRecords do -- only the first record contains valid data if RavKav_parseEnvironment(ENV_REF, nRec) then break end end end end function RavKav_parseCounter(CNTRS_REF, nRec) local CNTR_REC_REF = nodes.find_first(CNTRS_REF, {label="record", id=nRec}) if CNTR_REC_REF then local record = nodes.get_attribute(CNTR_REC_REF,"val") if record then local data = bytes.convert(record,1) local bitOffset = 0 local maxCounters = math.floor(#data / 24) local nRec, nCnt local cntrAry = {} for nRec = 1, maxCounters do bitOffset, nCnt = RavKav_parseBits(data, bitOffset, 24, CNTR_REC_REF, "Counter", en1545_NUMBER, nRec) cntrAry[nRec] = nCnt end return cntrAry end end return nil end function RavKav_parseCounters(APP_REF) log.print(log.DBG, "Parsing counters...") local CNTRS_REF = nodes.find_first(APP_REF, {id=CALYPSO_LID_COUNTERS}) if CNTRS_REF then local numRecords = RavKav_getRecordInfo(CNTRS_REF) if 0 < numRecords then -- there should only be one counter record return RavKav_parseCounter(CNTRS_REF, 1) end end return nil end function RavKav_parseEvent(EVENTS_REF, nRec) local EVENT_REC_REF = nodes.find_first(EVENTS_REF, {label="record", id=nRec}) if nil == EVENT_REC_REF then return end local record = nodes.get_attribute(EVENT_REC_REF,"val") if nil == record then return end local data = bytes.convert(record,1) if bytes.is_all(data, 0) then return end local bitOffset = 0 local text, ref, issuerId bitOffset = RavKav_parseBits(data, bitOffset, 3, EVENT_REC_REF, "Version number", en1545_NUMBER) bitOffset, text, ref, issuerId = RavKav_parseBits(data, bitOffset, 8, EVENT_REC_REF, "Issuer", RavKav_ISSUER) if issuerId == 0 then return end local contractId, eventType bitOffset, contractId = RavKav_parseBits(data, bitOffset, 4, EVENT_REC_REF, "Contract ID", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 4, EVENT_REC_REF, "Area ID", en1545_NUMBER) --1 == urban, 2 == intercity bitOffset, eventType = RavKav_parseBits(data, bitOffset, 4, EVENT_REC_REF, "Event type", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 30, EVENT_REC_REF, "Event time", RavKav_DATE_TIME) bitOffset = RavKav_parseBits(data, bitOffset, 1, EVENT_REC_REF, "Journey interchanges flag", en1545_NUMBER) --includes switching/continuing beyond bitOffset = RavKav_parseBits(data, bitOffset, 30, EVENT_REC_REF, "First event time", RavKav_DATE_TIME) --identical to 'Event time' local PRIORITIES_REF = nodes.append(EVENT_REC_REF, {classname="item", label="Best contract priorities"}) local nContract for nContract = 1, 8 do bitOffset = RavKav_parseBits(data, bitOffset, 4, PRIORITIES_REF, "Contract", RavKav_PERCENT, nContract) end local locationBitmap local ln_ref = nil bitOffset, text, ref, locationBitmap = RavKav_parseBits(data, bitOffset, 7, EVENT_REC_REF, "Location bitmap", en1545_UNDEFINED) --defined per issuer if 0 < bit.AND(locationBitmap, 1) then if 2 == issuerId then --Israel Rail bitOffset = RavKav_parseBits(data, bitOffset, 16, EVENT_REC_REF, "Location", RavKav_LOCATION) --station else bitOffset = RavKav_parseBits(data, bitOffset, 16, EVENT_REC_REF, "Location ID", en1545_NUMBER) --place end end if 0 < bit.AND(locationBitmap, 2) then local lineNumber bitOffset, lineNumber, ln_ref = RavKav_parseBits(data, bitOffset, 16, EVENT_REC_REF, "Line number", en1545_NUMBER) --number of line on route end if 0 < bit.AND(locationBitmap, 4) then bitOffset = RavKav_parseBits(data, bitOffset, 8, EVENT_REC_REF, "Stop en route", en1545_NUMBER) end if 0 < bit.AND(locationBitmap, 8) then --12 unknown bits bitOffset = RavKav_parseBits(data, bitOffset, 12, EVENT_REC_REF, "Location[3]", en1545_UNDEFINED) end if 0 < bit.AND(locationBitmap, 0x10) then bitOffset = RavKav_parseBits(data, bitOffset, 14, EVENT_REC_REF, "Vehicle", en1545_UNDEFINED) end if 0 < bit.AND(locationBitmap, 0x20) then --how many bits?? log.print(log.DBG, string.format("Event[%d]: Location[5]: unknown value", nRec)) end if 0 < bit.AND(locationBitmap, 0x40) then --8 unknown bits if 0 < bit.AND(locationBitmap, 0x20) then -- we are lost due to previous unknown field log.print(log.DBG, string.format("Event[%d]: Location[6]: unknown value", nRec)) else bitOffset = RavKav_parseBits(data, bitOffset, 8, EVENT_REC_REF, "Location[6]", en1545_UNDEFINED) end end if 0 == bit.AND(locationBitmap, 0x20) then local eventExtension bitOffset, text, ref, eventExtension = RavKav_parseBits(data, bitOffset, 3, EVENT_REC_REF, "Event extension bitmap", en1545_UNDEFINED) if 0 < bit.AND(eventExtension, 1) then bitOffset = RavKav_parseBits(data, bitOffset, 10, EVENT_REC_REF, "Route system", RavKav_ROUTE) bitOffset = RavKav_parseBits(data, bitOffset, 8, EVENT_REC_REF, "Fare code", en1545_NUMBER) local debitAmount, dr_ref bitOffset, debitAmount, dr_ref = RavKav_parseBits(data, bitOffset, 16, EVENT_REC_REF, "Debit amount", en1545_NUMBER) if 0 < debitAmount and 6 ~= eventType and 0 < contractId and 9 > contractId then --not a transit trip if 21 > debitAmount then dr_ref:setAlt(string.format("%u trip(s)", debitAmount)) else dr_ref:setAlt(string.format("NIS %0.2f", debitAmount / 100.0)) end end end if 0 < bit.AND(eventExtension, 2) then bitOffset = RavKav_parseBits(data, bitOffset, 32, EVENT_REC_REF, "Event extension[2]", en1545_UNDEFINED) end if 0 < bit.AND(eventExtension, 4) then bitOffset = RavKav_parseBits(data, bitOffset, 32, EVENT_REC_REF, "Event extension[3]", en1545_UNDEFINED) end end -- fix 'Line number' field local lnBitsize = 0 if 3 == issuerId then --Egged bitOffset = 155 lnBitsize = 10 if 0 < bit.AND(locationBitmap, 8) then bitOffset = bitOffset + 12 end elseif 15 == issuerId then --Metropolis bitOffset = 123 lnBitsize = 32 elseif 2 ~= issuerId and 14 ~= issuerId and 16 ~= issuerId then --not Israel Rail, Nativ Express nor Superbus bitOffset = 145 lnBitsize = 10 end if 0 < lnBitsize then if ln_ref then ln_ref:remove() end RavKav_parseBits(data, bitOffset, lnBitsize, EVENT_REC_REF, "Line number", en1545_NUMBER) end end function RavKav_parseEventsLog(APP_REF) log.print(log.DBG, "Parsing events...") local EVENTS_REF = nodes.find_first(APP_REF, {label="Event logs"} ) if EVENTS_REF then local numRecords = RavKav_getRecordInfo(EVENTS_REF) local nRec for nRec = 1, numRecords do RavKav_parseEvent(EVENTS_REF, nRec) end end end function RavKav_parseContract(CONTRACTS_REF, nRec, counter) local CONTRACT_REC_REF = nodes.find_first(CONTRACTS_REF, {label="record", id=nRec}) if nil == CONTRACT_REC_REF then return end local record = nodes.get_attribute(CONTRACT_REC_REF,"val") if nil == record then return end local data = bytes.convert(record,1) if bytes.is_all(data, 0) then nodes.set_attribute(CONTRACT_REC_REF,"alt","empty") return end local bitOffset = 0 local text, ref, vfd_ref, issuerId bitOffset = RavKav_parseBits(data, bitOffset, 3, CONTRACT_REC_REF, "Version number", en1545_NUMBER) bitOffset, text, vfd_ref = RavKav_parseBits(data, bitOffset, 14, CONTRACT_REC_REF, "Valid from", RavKav_INVERTED_DATE) --validity start date local validFromSeconds = RavKav_rkInvertedDaysToSeconds(nodes.get_attribute(vfd_ref,"val")) bitOffset, text, ref, issuerId = RavKav_parseBits(data, bitOffset, 8, CONTRACT_REC_REF, "Issuer", RavKav_ISSUER) if issuerId == 0 then return end local ticketType, validityBitmap local contractValid = true bitOffset = RavKav_parseBits(data, bitOffset, 2, CONTRACT_REC_REF, "Tariff transport access", en1545_NUMBER) bitOffset = RavKav_parseBits(data, bitOffset, 3, CONTRACT_REC_REF, "Tariff counter use", en1545_NUMBER) --0 == not used, 2 == number of tokens, 3 == monetary amount bitOffset, ticketType = RavKav_parseBits(data, bitOffset, 6, CONTRACT_REC_REF, "Ticket type", en1545_NUMBER) if 1 == ticketType or 6 == ticketType or 7 == ticketType then --Single or multiple, Aggregate value or Single or multiple contractValid = 0 < counter local balance if 6 == ticketType then --Aggregate value balance = string.format("NIS %0.2f", counter / 100.0) --balanceRemaining else balance = string.format("%d trip(s)", counter) --tripsRemaining end local NEW_REF = nodes.append(CONTRACT_REC_REF, {classname="item", label="Balance", size=24}) nodes.set_attribute(NEW_REF,"val", bytes.new(8, string.format("%06X", counter))) nodes.set_attribute(NEW_REF,"alt", balance) end bitOffset = RavKav_parseBits(data, bitOffset, 14, CONTRACT_REC_REF, "Date of purchase", en1545_DATE) --sale date bitOffset = RavKav_parseBits(data, bitOffset, 12, CONTRACT_REC_REF, "Sale device", en1545_NUMBER) --serial number of device that made the sale bitOffset = RavKav_parseBits(data, bitOffset, 10, CONTRACT_REC_REF, "Sale number", en1545_NUMBER) --runnning sale number on the day of the sale bitOffset = RavKav_parseBits(data, bitOffset, 1, CONTRACT_REC_REF, "Journey interchanges flag", en1545_NUMBER) --includes switching/continuing beyond bitOffset, text, ref, validityBitmap = RavKav_parseBits(data, bitOffset, 9, CONTRACT_REC_REF, "Validity bitmap", en1545_UNDEFINED) if 0 < bit.AND(validityBitmap, 1) then bitOffset = RavKav_parseBits(data, bitOffset, 5, CONTRACT_REC_REF, "Validity[1]", en1545_UNDEFINED) end local restrictionCode = 0 if 0 < bit.AND(validityBitmap, 2) then bitOffset, restrictionCode = RavKav_parseBits(data, bitOffset, 5, CONTRACT_REC_REF, "Restriction code", en1545_NUMBER) end if 0 < bit.AND(validityBitmap, 4) then local iDuration, rd_ref bitOffset, iDuration, rd_ref = RavKav_parseBits(data, bitOffset, 6, CONTRACT_REC_REF, "Restriction duration", en1545_NUMBER) if 16 == restrictionCode then iDuration = iDuration * 5 else iDuration = iDuration * 30 end rd_ref:setAlt(string.format("%d minute(s)", iDuration)) end if 0 < bit.AND(validityBitmap,8) then --validity end date local vtd_ref bitOffset, text, vtd_ref = RavKav_parseBits(data, bitOffset, 14, CONTRACT_REC_REF, "Valid until", en1545_DATE) if contractValid then contractValid = RavKav_rkDaysToSeconds(vtd_ref:val()) > os.time() end end local validUntilOption = ValidUntilOption.None if 0 < bit.AND(validityBitmap, 0x10) then local validMonths bitOffset, validMonths = RavKav_parseBits(data, bitOffset, 8, CONTRACT_REC_REF, "Valid months", en1545_NUMBER) if 0 < validMonths then if 1 == validMonths then validUntilOption = ValidUntilOption.Date local validUntilSeconds = RavKav_calculateMonthEnd(validFromSeconds, validMonths - 1) --month end date local NEW_REF = nodes.append(CONTRACT_REC_REF, {classname="item", label="Valid to", size=14}) --month end date nodes.set_attribute(NEW_REF,"val", bytes.new(8, string.format("%04X", validUntilSeconds))) nodes.set_attribute(NEW_REF,"alt", os.date("%x", validUntilSeconds)) if contractValid then contractValid = validUntilSeconds > os.time() end elseif 129 == validMonths then validUntilOption = ValidUntilOption.EndOfService log.print(log.DBG, string.format("Contract[%d]: Valid until the end of the service", nRec)) local NEW_REF = nodes.append(CONTRACT_REC_REF, {classname="item", label="Valid to", size=2}) nodes.set_attribute(NEW_REF,"val", bytes.new(8, string.format("%01X", validUntilOption))) nodes.set_attribute(NEW_REF,"alt", "The end of the service") if contractValid then contractValid = validFromSeconds > os.time() end else log.print(log.DBG, string.format("Contract[%d]: Valid months unknown value: %d", nRec, validMonths)) end else validUntilOption = ValidUntilOption.Cancelled log.print(log.DBG, string.format("Contract[%d]: Validity cancelled", nRec)) local NEW_REF = nodes.append(CONTRACT_REC_REF, {classname="item", label="Valid to", size=2}) nodes.set_attribute(NEW_REF,"val", bytes.new(8, string.format("%01X", validUntilOption))) nodes.set_attribute(NEW_REF,"alt", "Validity cancelled") end end if 0 < bit.AND(validityBitmap, 0x20) then bitOffset = RavKav_parseBits(data, bitOffset, 32, CONTRACT_REC_REF, "Validity[5]", en1545_UNDEFINED) end if 0 < bit.AND(validityBitmap, 0x40) then bitOffset = RavKav_parseBits(data, bitOffset, 6, CONTRACT_REC_REF, "Validity[6]", en1545_UNDEFINED) end if 0 < bit.AND(validityBitmap, 0x80) then bitOffset = RavKav_parseBits(data, bitOffset, 32, CONTRACT_REC_REF, "Validity[7]", en1545_UNDEFINED) end if 0 < bit.AND(validityBitmap, 0x100) then bitOffset = RavKav_parseBits(data, bitOffset, 32, CONTRACT_REC_REF, "Validity[8]", en1545_UNDEFINED) end -- read validity locations local VALID_LOCS_REF = nodes.append(CONTRACT_REC_REF, {classname="item", label="Validity locations"}) local nLoc for nLoc = 1, 7 do --limit to 7 just in case the end marker is missing? local LOC_REF = nodes.append(VALID_LOCS_REF, {classname="item", label="Validity", id=nLoc}) local validity, ref, validityType bitOffset, validity, ref, validityType = RavKav_parseBits(data, bitOffset, 4, LOC_REF, "Validity type", RavKav_VALIDITY_TYPE) if 15 == validityType then --end of validity locations log.print(log.DBG, string.format("Contract %d: Validity location[%d]: validityType: 15 (end of validity locations)", nRec, nLoc)) nodes.remove(LOC_REF) break end if 0 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 10, LOC_REF, "Route ID", RavKav_ROUTE, validityType) bitOffset = RavKav_parseBits(data, bitOffset, 12, LOC_REF, "Spatial zones", RavKav_ZONES, validityType) elseif 1 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 10, LOC_REF, "Route ID", RavKav_ROUTE, validityType) bitOffset = RavKav_parseBits(data, bitOffset, 8, LOC_REF, "Tariff code", en1545_NUMBER, validityType) elseif 3 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 32, LOC_REF, "Validity", en1545_UNDEFINED, validityType) elseif 7 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 10, LOC_REF, "Route ID", RavKav_ROUTE, validityType) bitOffset = RavKav_parseBits(data, bitOffset, 8, LOC_REF, "Tariff code", en1545_NUMBER, validityType) elseif 8 == validityType then --unknown validity type except for Israel Rail? bitOffset = RavKav_parseBits(data, bitOffset, 10, LOC_REF, "Route ID", RavKav_ROUTE, validityType) bitOffset = RavKav_parseBits(data, bitOffset, 8, LOC_REF, "Tariff code", en1545_NUMBER, validityType) --? bitOffset = RavKav_parseBits(data, bitOffset, 14, LOC_REF, "Unknown", en1545_UNDEFINED, validityType) elseif 9 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 3, LOC_REF, "Extended ticket type (ETT)", en1545_NUMBER, validityType) bitOffset = RavKav_parseBits(data, bitOffset, 11, LOC_REF, "Contract type", RavKav_CONTRACT_TYPE, validityType) elseif 11 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 21, LOC_REF, "Validity", en1545_UNDEFINED, validityType) elseif 14 == validityType then bitOffset = RavKav_parseBits(data, bitOffset, 10, LOC_REF, "Route ID", en1545_NUMBER, validityType) bitOffset = RavKav_parseBits(data, bitOffset, 12, LOC_REF, "Spatial zones", RavKav_ZONES, validityType) else log.print(log.DBG, string.format("Contract %d: Validity location[%d]: unrecognised validityType: %d", nRec, nLoc, validityType)) break --since we don't know the next bit position end end RavKav_parseBits(data, 224, 8,CONTRACT_REC_REF, "Contract authenticator", en1545_UNDEFINED) --checksum? local cv_ref = nodes.append(CONTRACT_REC_REF, {classname="item", label="Contract valid", size=1}) if contractValid then nodes.set_attribute(cv_ref,"val", bytes.new(1, 1)) nodes.set_attribute(cv_ref,"alt", "True") else nodes.set_attribute(cv_ref,"val", bytes.new(1, 0)) nodes.set_attribute(cv_ref,"alt", "False") end end function RavKav_parseContracts(APP_REF, cntrAry) log.print(log.DBG, "Parsing contracts...") local CONTRACTS_REF = nodes.find_first(APP_REF, {label="Contracts"}) if CONTRACTS_REF then local numRecords = RavKav_getRecordInfo(CONTRACTS_REF) local nRec for nRec = 1, numRecords do RavKav_parseContract(CONTRACTS_REF, nRec, cntrAry[nRec]) end end end function RavKav_SummariseProfile(PROFS_REF, id, GI_REF) local SRC_REF, NEW_REF = RavKav_copyField(PROFS_REF, GI_REF, "Profile", id, RAVKAV_PROFILES) if NEW_REF then if 0 < RavKav_getFieldAsNumber(SRC_REF, "Valid until") then RavKav_copyField(SRC_REF, NEW_REF, "Valid until") end end end function RavKav_summariseGeneralInfo(APP_REF, SUM_REF) log.print(log.DBG, "Summarising general info...") local ENV_REF = APP_REF:find_first({label="Environment"}):find_first({label="record"}) if ENV_REF then local GI_REF = nodes.append(SUM_REF, {classname="file", label="General Information"}) RavKav_copyField(APP_REF, GI_REF, "Serial number") RavKav_copyField(ENV_REF, GI_REF, "Issuer", nil, RAVKAV_ISSUERS) local idNumber = RavKav_getFieldAsNumber(ENV_REF, "ID number") if 0 == idNumber then local REF = nodes.append(GI_REF, {classname="item", label="Identity number", size=0}) nodes.set_attribute(REF,"alt", "Anonymous Rav-Kav") return end RavKav_copyField(ENV_REF,GI_REF, "ID number") RavKav_copyField(ENV_REF,GI_REF, "Date of birth") local PROFS_REF = nodes.find_first(ENV_REF, {label="Profiles"}) if PROFS_REF then RavKav_SummariseProfile(PROFS_REF, 1, GI_REF) RavKav_SummariseProfile(PROFS_REF, 2, GI_REF) end end end function RavKav_summariseEvent(EVENTS_REF, nRec, LT_REF) local EVENT_REC_REF = nodes.find_first(EVENTS_REF, {label="record", id=nRec}) if nil == EVENT_REC_REF then return end local issuerId = RavKav_getFieldAsNumber(EVENT_REC_REF, "Issuer") if 0 == issuerId then return end local EVSUM_REF = nodes.append(LT_REF, {classname="record", label="Event", id=nRec}) -- Description --------------------------- local description = "" if RAVKAV_ISSUERS[issuerId] then description = RAVKAV_ISSUERS[issuerId] end local lineNumber = RavKav_getFieldAsNumber(EVENT_REC_REF, "Line number") if 0 < lineNumber then description = description.." line " local routeSystemId = RavKav_getFieldAsNumber(EVENT_REC_REF, "Route system") local sLineNum = tostring(lineNumber) if RAVKAV_ROUTES[routeSystemId] then if 15 == issuerId then --Metropolis local sRouteSystemId = tostring(routeSystemId) local posS, posE = string.find(sLineNum, sRouteSystemId) if 1 == posS then --Does "1234567..." start with "12"? sLineNum = string.sub(sLineNum, posE + 1, posE + 4) --"1234567..." -> "345" end end description = description..sLineNum..", cluster "..RAVKAV_ROUTES[routeSystemId] else description = description..sLineNum end end if 0 < #description then RavKav_addTextNode(EVSUM_REF, "Description", description) end ------------------------------------------ if 0 < RavKav_getFieldAsNumber(EVENT_REC_REF, "Event time") then RavKav_copyField(EVENT_REC_REF, EVSUM_REF, "Event time") end if 2 == issuerId then --Israel Rail local locationId = RavKav_getFieldAsNumber(EVENT_REC_REF, "Location") if RAVKAV_LOCATIONS[locationId] then RavKav_addTextNode(EVSUM_REF, "Station", RAVKAV_LOCATIONS[locationId]) end end -- Details ------------------------------- details = "" local eventType = RavKav_getFieldAsNumber(EVENT_REC_REF, "Event type") local contractId = RavKav_getFieldAsNumber(EVENT_REC_REF, "Contract ID") if 6 ~= eventType and 0 < contractId and 9 > contractId then --not a transit trip local REF, data, debitedText = RavKav_getField(EVENT_REC_REF, "Debit amount") local debitAmount = 0 if data then debitAmount = bytes.tonumber(data) end if 0 < debitAmount then if 1 ~= eventType then --not an exit event details = RAVKAV_EVENT_TYPES[eventType] end details = details.." contract "..tostring(contractId).." charged "..debitedText else details = RAVKAV_EVENT_TYPES[eventType].." contract "..tostring(contractId) end local fareCode = RavKav_getFieldAsNumber(EVENT_REC_REF, "Fare code") if 0 < fareCode then details = details.." (code "..tostring(fareCode)..")" end else details = RAVKAV_EVENT_TYPES[eventType] end if 0 < #details then RavKav_addTextNode(EVSUM_REF, "Details", details) end ------------------------------------------ end function RavKav_summariseLatestTravel(APP_REF, SUM_REF) log.print(log.DBG, "Summarising latest travel...") local EVENTS_REF = nodes.find_first(APP_REF, {label="Event logs"}) if EVENTS_REF then local LT_REF = nodes.append(SUM_REF, {classname="file", label="Latest Travel"}) local numRecords = RavKav_getRecordInfo(EVENTS_REF) local nRec for nRec = 1, numRecords do RavKav_summariseEvent(EVENTS_REF, nRec, LT_REF) end end end function RavKav_summariseTextArray(REC_REF, itmLabel, lookupAry, SM_REF, sumLabel) local summary = "" local ary = RavKav_getFieldsAsNumberAry(REC_REF, itmLabel) local i, id for i, id in ipairs(ary) do if lookupAry[id] then if 0 < #summary then summary = summary.."\n " end summary = summary..lookupAry[id] end end if 0 < #summary then RavKav_addTextNode(SM_REF, sumLabel, summary) end end function RavKav_summariseIntegerArray(REC_REF, itmLabel, SM_REF, sumLabel) local summary = "" local ary = RavKav_getFieldsAsNumberAry(REC_REF, itmLabel) local i, val for i, val in ipairs(ary) do if 0 < val then if 0 < #summary then summary = summary..", " end summary = summary..tostring(val) end end if 0 < #summary then RavKav_addTextNode(SM_REF, sumLabel, summary) end end function RavKav_summariseContract(CONTRACTS_REF, nRec, VC_REF, IC_REF) local CONTRACT_REC_REF = nodes.find_first(CONTRACTS_REF, {label="record", id=nRec}) if nil == CONTRACT_REC_REF then return end local issuerId = RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Issuer") if 0 == issuerId then return end local contractValid = 0 ~= RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Contract valid") local CT_REF = IC_REF if contractValid then CT_REF = VC_REF end local CTSUM_REF = nodes.append(CT_REF, {classname="record", label="Contract", id=nRec}) -- Description --------------------------- local description = "" if RAVKAV_ISSUERS[issuerId] then description = RAVKAV_ISSUERS[issuerId] end local ticketType = RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Ticket type") if RAVKAV_TICKET_TYPES[ticketType] then description = description.." "..RAVKAV_TICKET_TYPES[ticketType] end if 0 < #description then RavKav_addTextNode(CTSUM_REF, "Description", description) end ------------------------------------------ RavKav_summariseTextArray(CONTRACT_REC_REF, "Route ID", RAVKAV_ROUTES, CTSUM_REF, "Clusters") -- Type of contract ---------------------- if 0 < ticketType then local REF, data = RavKav_getField(CONTRACT_REC_REF, "Extended ticket type (ETT)") if data then local ett = bytes.tonumber(data) if RAVKAV_CONTRACT_DESCRIPTIONS[ticketType][ett] then RavKav_addTextNode(CTSUM_REF, "Type of contract", RAVKAV_CONTRACT_DESCRIPTIONS[ticketType][ett]) end end end ------------------------------------------ RavKav_summariseIntegerArray(CONTRACT_REC_REF, "Tariff code", CTSUM_REF, "Tariff codes") RavKav_summariseTextArray(CONTRACT_REC_REF, "Contract type", RAVKAV_CONTRACT_TYPES, CTSUM_REF, "Contract types") local journeyInterchangesFlag = 0 ~= RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Journey interchanges flag") if journeyInterchangesFlag then RavKav_addTextNode(CTSUM_REF, "Journey interchanges", "Includes switching/resume") end if 0 < RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Restriction duration") then RavKav_copyField(CONTRACT_REC_REF, CTSUM_REF, "Restriction duration") end RavKav_copyField(CONTRACT_REC_REF, CTSUM_REF, "Balance") if 0x3fff ~= RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Valid from") then --14 bits of valid from date are inverted RavKav_copyField(CONTRACT_REC_REF, CTSUM_REF, "Valid from") elseif 0 < RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Date of purchase") then RavKav_copyField(CONTRACT_REC_REF, CTSUM_REF, "Date of purchase") end RavKav_copyField(CONTRACT_REC_REF, CTSUM_REF, "Valid to") if 0 < RavKav_getFieldAsNumber(CONTRACT_REC_REF, "Valid until") then RavKav_copyField(CONTRACT_REC_REF, CTSUM_REF, "Valid until") end end function RavKav_summariseContracts(APP_REF, SUM_REF) log.print(log.DBG, "Summarising contracts...") local CONTRACTS_REF = nodes.find_first(APP_REF, {label="Contracts"}) if CONTRACTS_REF then local VC_REF = nodes.append(SUM_REF, {classname="file", label="Valid Contracts"}) local IC_REF = nodes.append(SUM_REF, {classname="file", label="Invalid Contracts"}) local numRecords = RavKav_getRecordInfo(CONTRACTS_REF) local nRec for nRec = 1, numRecords do RavKav_summariseContract(CONTRACTS_REF, nRec, VC_REF, IC_REF) end end end function RavKav_readFiles(APP_REF) local lid_index local lid_desc for lid_index, lid_desc in ipairs(LID_LIST) do RavKav_readFile(APP_REF, lid_desc[1], lid_desc[2], lid_desc[3]) end end function RavKav_parseRecords(APP_REF) RavKav_parseGeneralInfo(APP_REF) local cntrAry = RavKav_parseCounters(APP_REF) RavKav_parseEventsLog(APP_REF) RavKav_parseContracts(APP_REF, cntrAry) end function RavKav_summariseRecords(APP_REF, root) local SUM_REF = nodes.append(root, {classname="block", label="Summary"}) RavKav_summariseGeneralInfo(APP_REF, SUM_REF) RavKav_summariseLatestTravel(APP_REF, SUM_REF) RavKav_summariseContracts(APP_REF, SUM_REF) end function RavKav_parseAnswerToSelect(ctx) local ats local data for ats in ctx:find({label="answer to select"}) do data = nodes.get_attribute(ats,"val") tlv_parse(ats,data,RAVKAV_IDO) end end RavKav_parseAnswerToSelect(CARD) RavKav_parseRecords(CARD) RavKav_summariseRecords(CARD, CARD) cardpeek-0.8/dot_cardpeek_dir/scripts/calypso/c250.lua0000644000175000017500000002304012166040731017656 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2011 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- ------------------------------------------------------------------------- -- *PLEASE NOTE* -- This work is based on: -- * public information about the calypso card specification, -- * partial information found on the web about the ticketing data -- format, as described in the French "intercode" documentation. -- * experimentation and guesses, -- This information is incomplete. If you have further data, such -- as details of ISO 1545 or calypso card specs, please help send them -- to L1L1@gmx.com -------------------------------------------------------------------------- require('lib.strict') require('lib.en1545') ---------------------------- intercode_BestContracts = { [0] = { en1545_REPEAT, 4, "BestContractCount", { [0] = { en1545_BITMAP, 3, "BestContract", { [0] = { en1545_NETWORKID, 24, "BestContractsNetworkId" }, [1] = { en1545_UNDEFINED, 16, "BestContractsTariff" }, [2] = { en1545_UNDEFINED, 5, "BestContractsPointer" } }} }} } intercode_Env = { [0] = { en1545_UNDEFINED, 6, "EnvVersionNumber" }, [1] = { en1545_BITMAP, 7, "Env",{ [0] = { en1545_NETWORKID, 24, "EnvNetworkId" }, [1] = { en1545_UNDEFINED, 8, "EnvApplicationIssuerId" }, [2] = { en1545_DATE, 14, "EnvApplicationValidityEndDate" }, [3] = { en1545_UNDEFINED, 11, "EnvPayMethod" }, [4] = { en1545_UNDEFINED, 16, "EnvAuthenticator" }, [5] = { en1545_UNDEFINED, 32, "EnvSelectList" }, [6] = { en1545_UNDEFINED, 2, "EnvData", [0] = { en1545_UNDEFINED, 1, "EnvCardStatus" }, [1] = { en1545_UNDEFINED, 0, "EnvExtra" }, }} } } intercode_Holder = { [0] = { en1545_BITMAP, 8, "Holder", { [0] = { en1545_BITMAP, 2, "HolderName", { [0] = { en1545_UNDEFINED, 85, "HolderSurname" }, [1] = { en1545_UNDEFINED, 85, "HolderForename" } }}, [1] = { en1545_BITMAP, 2, "HolderBirth", { [0] = { en1545_UNDEFINED, 32, "HolderBirthDate" }, [1] = { en1545_UNDEFINED, 115, "HolderBirthPlace"} }}, [2] = { en1545_UNDEFINED, 85, "HolderBirthName" }, [3] = { en1545_UNDEFINED, 32, "HolderIdNumber" }, [4] = { en1545_UNDEFINED, 24, "HolderCountryAlpha" }, [5] = { en1545_UNDEFINED, 32, "HolderCompany" }, [6] = { en1545_REPEAT, 4, "HolderProfiles(0..4)", { [0] = { en1545_BITMAP, 3, "Profile", { [0] = { en1545_UNDEFINED, 24, "NetworkId" }, [1] = { en1545_UNDEFINED, 8, "ProfileNumber" }, [2] = { en1545_DATE, 14, "ProfileDate" } }} }}, [7] = { en1545_BITMAP, 12, "HolderData", { [0] = { en1545_UNDEFINED, 4, "HolderDataCardStatus" }, [1] = { en1545_UNDEFINED, 4, "HolderDataTeleReglement" }, [2] = { en1545_UNDEFINED, 17, "HolderDataResidence" }, [3] = { en1545_UNDEFINED, 6, "HolderDataCommercialID" }, [4] = { en1545_UNDEFINED, 17, "HolderDataWorkPlace" }, [5] = { en1545_UNDEFINED, 17, "HolderDataStudyPlace" }, [6] = { en1545_UNDEFINED, 16, "HolderDataSaleDevice" }, [7] = { en1545_UNDEFINED, 16, "HolderDataAuthenticator" }, [8] = { en1545_UNDEFINED, 14, "HolderDataProfileStartDate1" }, [9] = { en1545_UNDEFINED, 14, "HolderDataProfileStartDate2" }, [10] = { en1545_UNDEFINED, 14, "HolderDataProfileStartDate3" }, [11] = { en1545_UNDEFINED, 14, "HolderDataProfileStartDate4" } }} }} } intercode_Contract = { [0] = { en1545_BITMAP, 20, "Contract", { [0] = { en1545_NETWORKID, 24, "ContractNetworkId" }, [1] = { en1545_UNDEFINED, 8, "ContractProvider" }, [2] = { en1545_UNDEFINED, 16, "ContractTariff" }, [3] = { en1545_UNDEFINED, 32, "ContractSerialNumber" }, [4] = { en1545_BITMAP, 2, "ContractCustomerInfo", { [0] = { en1545_UNDEFINED, 6, "ContractCustomerProfile" }, [1] = { en1545_UNDEFINED, 32, "ContractCustomerNumber" }, }}, [5] = { en1545_BITMAP, 2, "ContractPassengerInfo", { [0] = { en1545_UNDEFINED, 6, "ContractPassengerClass" }, [1] = { en1545_UNDEFINED, 32, "ContractPassengerTotal" }, }}, [6] = { en1545_UNDEFINED, 6, "ContractVehiculeClassAllowed" }, [7] = { en1545_UNDEFINED, 32, "ContractPaymentPointer" }, [8] = { en1545_UNDEFINED, 11, "ContractPayMethod" }, [9] = { en1545_UNDEFINED, 16, "ContractServices" }, [10] = { en1545_AMOUNT, 16, "ContractPriceAmount" }, [11] = { en1545_UNDEFINED, 16, "ContractPriceUnit" }, [12] = { en1545_BITMAP, 7, "ContractContractRestriction", { [0] = { en1545_TIME, 11, "ContractStartTime" }, [1] = { en1545_TIME, 11, "ContractEndTime" }, [2] = { en1545_UNDEFINED, 8, "ContractRestrictDay" }, [3] = { en1545_UNDEFINED, 8, "ContractRestrictTimeCode" }, [4] = { en1545_UNDEFINED, 8, "ContractRestrictCode" }, [5] = { en1545_UNDEFINED, 16, "ContractRestrictProduct" }, [6] = { en1545_UNDEFINED, 16, "ContractRestrcitLocation" }, }}, [13] = { en1545_BITMAP, 9, "ContractContractValidityInfo", { [0] = { en1545_DATE, 14, "ContractStartDate" }, [1] = { en1545_TIME, 11, "ContractStartTime" }, [2] = { en1545_DATE, 14, "ContractEndDate" }, [3] = { en1545_TIME, 11, "ContractEndTime" }, [4] = { en1545_UNDEFINED, 8, "ContractDuration" }, [5] = { en1545_DATE, 14, "ContractLimitDate" }, [6] = { en1545_ZONES, 8, "ContractZones" }, [7] = { en1545_UNDEFINED, 16, "ContractJourneys" }, [8] = { en1545_UNDEFINED, 16, "ContractPeriodJourneys" }, }}, [14] = { en1545_BITMAP, 8, "ContractContractJourneyData", { [0] = { en1545_UNDEFINED, 16, "ContractOrigin" }, [1] = { en1545_UNDEFINED, 16, "ContractDestination" }, [2] = { en1545_UNDEFINED, 16, "ContractRouteNumbers" }, [3] = { en1545_UNDEFINED, 8, "ContractRouteVariants" }, [4] = { en1545_UNDEFINED, 16, "ContractRun" }, [5] = { en1545_UNDEFINED, 16, "ContractVia" }, [6] = { en1545_UNDEFINED, 16, "ContractDistance" }, [7] = { en1545_UNDEFINED, 8, "ContractInterchange" }, }}, [15] = { en1545_BITMAP, 4, "ContractContractSaleData", { [0] = { en1545_DATE, 14, "ContractDate" }, [1] = { en1545_TIME, 11, "ContractTime" }, [2] = { en1545_UNDEFINED, 8, "ContractAgent" }, [3] = { en1545_UNDEFINED, 16, "ContractDevice" }, }}, [16] = { en1545_UNDEFINED, 8, "ContractStatus" }, [17] = { en1545_UNDEFINED, 16, "ContractLoyalityPoints" }, [18] = { en1545_UNDEFINED, 16, "ContractAuthenticator" }, [19] = { en1545_UNDEFINED, 0, "Contract"}, } } } intercode_Event = { [0] = { en1545_DATE, 14, "EventDate" }, [1] = { en1545_TIME, 11, "EventTime" }, [2] = { en1545_BITMAP, 28, "Event", { [0] = { en1545_UNDEFINED, 8, "EventDisplayData" }, [1] = { en1545_NETWORKID, 24, "EventNetworkId" }, [2] = { en1545_UNDEFINED, 8, "EventCode" }, [3] = { en1545_UNDEFINED, 8, "EventResult" }, [4] = { en1545_UNDEFINED, 8, "EventServiceProvider" }, [5] = { en1545_UNDEFINED, 8, "EventNotOkCounter" }, [6] = { en1545_UNDEFINED, 24, "EventSerialNumber" }, [7] = { en1545_UNDEFINED, 16, "EventDestination" }, [8] = { en1545_UNDEFINED, 16, "EventLocationId" }, [9] = { en1545_UNDEFINED, 8, "EventLocationGate" }, [10] = { en1545_UNDEFINED, 16, "EventDevice" }, [11] = { en1545_NUMBER, 16, "EventRouteNumber" }, [12] = { en1545_UNDEFINED, 8, "EventRouteVariant" }, [13] = { en1545_UNDEFINED, 16, "EventJourneyRun" }, [14] = { en1545_UNDEFINED, 16, "EventVehiculeId" }, [15] = { en1545_UNDEFINED, 8, "EventVehiculeClass" }, [16] = { en1545_UNDEFINED, 5, "EventLocationType" }, [17] = { en1545_UNDEFINED,240, "EventEmployee" }, [18] = { en1545_UNDEFINED, 16, "EventLocationReference" }, [19] = { en1545_UNDEFINED, 8, "EventJourneyInterchanges" }, [20] = { en1545_UNDEFINED, 16, "EventPeriodJourneys" }, [21] = { en1545_UNDEFINED, 16, "EventTotalJourneys" }, [22] = { en1545_UNDEFINED, 16, "EventJourneyDistance" }, [23] = { en1545_AMOUNT, 16, "EventPriceAmount" }, [24] = { en1545_UNDEFINED, 16, "EventPriceUnit" }, [25] = { en1545_UNDEFINED, 5, "EventContractPointer" }, [26] = { en1545_UNDEFINED, 16, "EventAuthenticator" }, [27] = { en1545_UNDEFINED, 5, "EventBitmapExtra" }, } } } en1545_map(CARD,"Environment",intercode_Env,intercode_Holder) en1545_map(CARD,"Event logs",intercode_Event) en1545_map(CARD,"Special events",intercode_Event) en1545_map(CARD,"Contract list",intercode_BestContracts) -- FIXME: here we should parse the "contracts" according to "Tariff" -- but for now we will assume that contract format is 'FF' -- as defined in intercode en1545_map(CARD,"Contracts",intercode_Contract) local atr local hex_card_num local card_num atr = card.last_atr(); hex_card_num = bytes.sub(atr,-7,-4) card_num = (hex_card_num:get(0)*256*65536)+(hex_card_num:get(1)*65536)+(hex_card_num:get(2)*256)+hex_card_num:get(3) CARD:find_first({ label="cold ATR" } ) :append{ classname = "item", label="Card number", size=4, val = hex_card_num, alt = card_num } cardpeek-0.8/dot_cardpeek_dir/scripts/calypso/c250n901.lua0000644000175000017500000001040712165352366020302 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- --------------------------------------------------------------------- -- Most of the data and coding ideas in this file -- was contributed by 'Pascal Terjan', based on location -- data from 'Aurélien Baro'. --------------------------------------------------------------------- require('lib.strict') require('etc.paris-metro') require('etc.paris-rer') SERVICE_PROVIDERS = { [2] = "SNCF", [3] = "RATP" } TRANSPORT_LIST = { [1] = "Urban Bus", [2] = "Interurban Bus", [3] = "Metro", [4] = "Tram", [5] = "Train", [8] = "Parking" } TRANSITION_LIST = { [1] = "Entry", [2] = "Exit", [4] = "Inspection", [6] = "Interchange (entry)", [7] = "Interchange (exit)" } function navigo_process_events(cardenv,node_label) local event_node local record_node local ref_node local code_value local code_transport local code_transition local code_transport_string local code_transition_string local code_string local service_provider_value local location_id_value local sector_id local station_id local location_string event_node = cardenv:find_first({label=node_label}) if event_node==nil then log.print(log.WARNING,"No event found in card") return 0 end for record_node in event_node:find({label="record"}) do -- is it RATP or SNCF ? ref_node = record_node:find_first({label="EventServiceProvider"}) service_provider_value = bytes.tonumber(ref_node:get_attribute("val")) ref_node:set_attribute("alt",SERVICE_PROVIDERS[service_provider_value]) ref_node = record_node:find_first({label="EventCode"}) code_value = bytes.tonumber(ref_node:get_attribute("val")) -- is it a bus, a tram, a metro, ... ? code_transport = bit.SHR(code_value,4) code_transport_string = TRANSPORT_LIST[code_transport] if code_transport_string==nil then code_transport_string = code_transport end -- is it an entry, an exit, ... ? code_transition = bit.AND(code_value,0xF) code_transition_string = TRANSITION_LIST[code_transition] if (code_transition_string==nil) then code_transition_string = code_transition end ref_node:set_attribute("alt",code_transport_string.." - "..code_transition_string) -- service_provider_value == RATP and code_transport in { metro, tram, train } ? if (service_provider_value==3 or service_provider_value==2) and code_transport>=3 and code_transport<=5 then ref_node = record_node:find_first({label="EventLocationId"}) location_id_value = bytes.tonumber(ref_node:get_attribute("val")) sector_id = bit.SHR(location_id_value,9) station_id = bit.AND(bit.SHR(location_id_value,4),0x1F) if code_transport==5 and BANLIEUE_LIST[sector_id] and BANLIEUE_LIST[sector_id][station_id] then location_string = "secteur "..sector_id.." - station "..BANLIEUE_LIST[sector_id][station_id] else if METRO_LIST[sector_id]~=nil then location_string = "secteur "..METRO_LIST[sector_id]['name'].." - station " if METRO_LIST[sector_id][station_id]==nil then location_string = location_string .. station_id else location_string = location_string .. METRO_LIST[sector_id][station_id] end else location_string = "secteur "..sector_id.." - station "..station_id end end ref_node:set_attribute("alt",location_string) end end end navigo_process_events(CARD,"Event logs, parsed") navigo_process_events(CARD,"Special events, parsed") cardpeek-0.8/dot_cardpeek_dir/scripts/calypso/c56n1.lua0000644000175000017500000001336212166040744020053 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- -- ACKNOWLEDGEMENT: -- The MOBIB "Event" parsing included in this file was build from -- information found in public-domain software from Gildas Avoine, -- Tania Martin and Jean-Pierre Szikora from the Université catholique -- de Louvain, Belgium. require('lib.strict') require('lib.en1545') require('etc.brussels-metro') require('etc.brussels-bus') function mobib_BIRTHDATE(source) local source_digits = source:convert(4) local year = tonumber(source_digits:sub(0,3):format("%D")) local month = tonumber(source_digits:sub(4,5):format("%D")) local day = tonumber(source_digits:sub(6,7):format("%D")) return os.date("%x",os.time({['year']=year,['month']=month,['day']=day})) end function mobib_GENDER(source) local n = bytes.tonumber(source) if n==1 then return "Male" elseif n==2 then return "Female" end return "Unknown" end function mobib_HOLDERNUMBER(source) local source_digits = source:convert(4) return tostring(source_digits:sub(0,5)).."/".. tostring(source_digits:sub(6,17)).."/".. tostring(source_digits:sub(18,18)) end function mobib_TRANSPORT_BUS(source) local stationid = bytes.tonumber(source) local retval = BRUSSELS_BUS[stationid] if retval then return retval end return "Unknown location" end function mobib_TRANSPORT_METRO(source) local stationid = bytes.tonumber(source) local retval = BRUSSELS_METRO[stationid] if retval then return retval end return "Unknown location" end function mobib_TRANSPORT(source) local t = bytes.tonumber(source) if t==0 then return "metro" elseif t==7 then return "premetro" elseif t==15 then return "bus" elseif t==22 then return "tramway" else return "UNKNOWN("..t..")" end end function mobib_process_block(ref,label,beginp,endp,block,func) local data = bytes.sub(block,beginp,endp) local res = func(data) ref:append{ classname="item", label=label, size=endp-beginp+1, val=data, alt=res } return res end function mobib_process_holderext(ref) local block = ref:get_attribute("val"):convert(1) if bytes.is_all(block,0) then return false end mobib_process_block(ref,"HolderNumber",18,93,block,mobib_HOLDERNUMBER) mobib_process_block(ref,"HolderBirthRate",168,199,block,mobib_BIRTHDATE) mobib_process_block(ref,"HolderGender",200,201,block,mobib_GENDER) mobib_process_block(ref,"HolderName",205,359,block,en1545_ALPHA) end function mobib_process_event(ref) local block = ref:get_attribute("val"):convert(1) local transport_type local ref2 if bytes.is_all(block,0) then ref:set_attribute("alt","NO EVENT RECORDED") return false end mobib_process_block(ref,"EventDataDateStamp",6,19,block,en1545_DATE) mobib_process_block(ref,"EventDataTimeStamp",20,30,block,en1545_TIME) mobib_process_block(ref,"EventDataDateFirstStamp",186,199,block,en1545_DATE) mobib_process_block(ref,"EventDataTimeFirstStamp",200,210,block,en1545_TIME) mobib_process_block(ref,"EventCountOfCoupons",139,161,block,en1545_NUMBER) transport_type = mobib_process_block(ref,"EventTransportType",99,103,block,mobib_TRANSPORT) if transport_type=="metro" or transport_type=="premetro" then mobib_process_block(ref,"EventLocationId",104,120,block,mobib_TRANSPORT_METRO) ref2 = ref:find_first({label="EventLocationId"}) mobib_process_block(ref2,"EventLocationZone",104,109,block,en1545_NUMBER) mobib_process_block(ref2,"EventLocationSubZone",110,113,block,en1545_NUMBER) mobib_process_block(ref2,"EventLocationStation",114,120,block,en1545_NUMBER) elseif transport_type=="bus" then mobib_process_block(ref,"EventLocationId",71,82,block,mobib_TRANSPORT_BUS) mobib_process_block(ref,"EventJourneyRoute",92,98,block,en1545_NUMBER) end return true end function mobib_process_env(ref) local block = ref:get_attribute("val"):convert(1) if bytes.is_all(block,0) then ref:set_attribute("alt","NO ENVIRONMENT DATA") return false end mobib_process_block(ref,"EnvNetworkId",13,36,block,en1545_NETWORKID) return true end function mobib_process(cardenv) local record1_node local record2_node local data record1_node = cardenv:find_first({label="Holder Extended"}):find_first({label="record",id="1"}) if record1_node==nil then log.print(LOG_ERROR,"Could not find record 1 in 'Holder Extended' file") return false end record2_node= cardenv:find_first({label="Holder Extended"}):find_first({label="record",id="2"}) if record2_node==nil then log.print(LOG_ERROR,"Could not find record 2 in 'Holder Extended' file") return false end data = record1_node:get_attribute("val") .. record2_node:get_attribute("val") record1_node:remove() record2_node:remove() local node node = cardenv:find_first({label="Holder Extended"}) :append({ classname = "record", label = "record", id = "1+2", size = #data, val = data }) mobib_process_holderext(node) for node in cardenv:find_first({label="Event logs"}):find({label="record"}) do mobib_process_event(node) end for node in cardenv:find_first({label="Environment"}):find({label="record"}) do mobib_process_env(node) end end mobib_process(CARD) cardpeek-0.8/dot_cardpeek_dir/scripts/etc/0000755000175000017500000000000012214321142015654 500000000000000cardpeek-0.8/dot_cardpeek_dir/scripts/etc/smartcard_list.txt0000644000175000017500000051711012213657631021373 00000000000000# # smartcard_list.txt # Copyright (C) 2002-2012 Ludovic Rousseau # # 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 # # This list contains a match between an ATR and a card type # The list is sorted for edition purposes # # You can get the latest version of this file from: # http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt # # $Id: smartcard_list.txt 6731 2013-08-20 16:00:40Z rousseau $ # # syntax: # ATR in regular expression form # \t descriptive text # \t descriptive text # \t descriptive text # empty line 3B 02 14 50 Schlumberger Multiflex 3k 3B 02 53 01 Gemplus GemClub Memo 3B 04 00 00 00 00 Laundromat payment card Spanish ID ("DNIe: Documento Nacional de Identidad electrónico). http://www.dnie.es/ 3B 04 07 3C 85 92 OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 07 3C 85 9A OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 07 3C 89 10 OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 07 3C 89 18 OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 07 3C 89 92 OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 07 3C 89 9A OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 07 3C 8C 10 OLD Spanish Prepaid phone cards (pesetas) provided by Telefonica 3B 04 09 9C 2B 83 T.P.G. - CART@BONUS 20CHF (Transport) http://www.tpg.ch/fr/titres-de-transport/moyens-de-paiement/carte-prepayee-cartabonus.php 3B 04 17 3C CC E0 prepaid payphone card, issued by Telefónica Comunicaciones Públicas (http://www.cabitel.es) 3B 04 2A FF 32 00 Mac Gray Intelligent Laundry Systems laundry card 3B 04 41 11 77 81 Sample Mifare DESFire contactless smartcard from Phillips 3B 04 41 11 77 B1 IBM JCOP 30 contactless 3B 04 49 32 43 2E German Health Insurance Card "LogCard" from concept2.com (a indoor rower manufacturer) I2C card 3B 04 92 23 10 91 Siemens SLE 4432/42 card 3B 04 99 FF FF 90 Madrid prepaid parkimeters parking card 3B 04 9C FF 21 43 Hercules laundry stored value card 3B 04 A2 13 10 91 PM2P Chipkarte SLE 4442, Code FFFFFF Bahn BKK (Deutsche Bahn AG - Insurance Company) NH Hotels World fidelization card Miele Professional card for paying washing machine 3B 04 C9 D0 F1 40 Cuban prepaid phone card provided by ETECSA 3B 04 FF FF FF FF Identity card Universidad del Pais Vasco / Euskal Herriko Unibertsitatea www.ehu.es 3B 05 00 03 36 66 AE HID (eID) 3B 05 68 01 01 02 05 Certinomis card (electronic certificates) Schlumberger Cryptoflex ActivCard 3B 05 80 73 F7 01 C0 (Shenzhen, China) Mingwah Aohan eKey, eID http://en.mwcard.com/index.php?option=com_k2&view=item&layout=item&id=79&Itemid=439 3B 06 00 00 04 2E CF 4C HID 1346 ProxKey III http://www.hidglobal.com/products/cards-and-credentials/hid-proximity/1346 3B 06 00 10 01 D6 C5 46 HID ProxKey II FOB http://www.hidglobal.com/documents/proxkey_ds_en.pdf 3B 06 01 02 10 .. .. .. ISOProx II Card: http://www.hidglobal.com/documents/isoprox_ds_en.pdf 3B 06 81 24 80 80 90 00 10€ credit card for TV & telephone in Jerez de la Frontera hospital's rooms. The maker can be found at www.isernsa.com (ISERN Medical Telecomunications) 3B 06 A2 13 10 91 90 00 C3P2K SAMPLE CARD (C3PO, S.L) 3B 07 55 4E 4B 4E 4F 57 4E US DOD Smart Card 3B 09 41 04 11 DD 82 2F 00 00 88 1k contactless Mifare 3B 0A 20 62 0C 01 4F 53 45 99 14 AA GSM-SIM BEN (1800MHz) 3B 0A 21 00 26 07 4F 53 45 98 08 F8 ORGA test systems GSM phase 2+ test SIM. 3B 0E BC E1 CA AF C2 DF BC AD BC D3 C3 DC BF A8 German "Versichertenkarte" Healthcare card 3B 0F 00 65 46 53 05 16 05 71 DF 00 00 00 45 50 53 Feitian ePass3000, Feitian formatted 3B 0F 00 65 46 53 05 16 05 71 DF 00 00 00 80 6A 82 Feitian ePass3000, OpenSC formatted 3B 0F 00 65 46 53 05 30 05 71 DF 00 00 00 80 6A 82 Fetian epass3000 3B 0F 80 22 15 E1 5A 00 20 00 30 21 03 31 21 03 00 RSA SecurID SID800 token 3B 0F 80 6A 16 32 46 49 53 45 53 8C E0 FF 07 90 00 GSM-SIM Sonera (from 1998) 3B 0F FF C1 B5 CC 72 CA 00 00 .. Mifare Std 1K 3B 15 11 12 CA 07 00 DB Tricolor TV center card (Pay TV) 3B 15 11 12 CA 07 11 CA DRE Crypt (Pay TV) 3B 15 11 12 CA 07 14 CF PlatformaHD (Russia) DRE Crypt 4AE1:14 3B 15 13 80 53 41 52 03 Eutron CryptoIdentity (ATMEL AT903232C - 6464C Cryptographic processors, 64KB EEPROM, RSA 2048) 3B 15 18 2E 00 5C 00 01 China Unicom 64k OTA 3B 15 94 C3 02 08 16 01 GSM-SIM EMT (Estonia) 3B 16 18 AF 01 02 02 02 00 SIM Virgin Mobile (Australia) 3B 16 94 71 01 01 00 27 00 Cingular GSM SIM Card 3B 16 94 71 01 01 05 02 00 GSM SIM Bouygues Telecom 3B 16 94 71 01 01 06 02 00 SFR GSM SIM Card 3B 16 94 81 10 06 01 .. .. Schlumberger Cyberflex Access 16K 3B 16 94 81 10 06 01 81 2F Schlumberger Cyberflex Access Augmented Crypto 3B 16 94 81 10 06 01 81 3F Schlumberger Cyberflex Access Crypto 3B 16 94 D0 01 76 0D 2A 00 Peruvian GSM SIM 3B 16 94 D0 01 7B 2C 0E 00 SIM tunisiana 3B 16 95 D0 00 45 F7 01 00 Telefónica O2 Czech Republic, a.s. - O2 sim card - 173285 / SIM64ND.GO0 http://www.o2.cz 3B 16 96 41 73 74 72 69 64 Gemalto .NET v2.0 3B 16 96 41 73 74 72 69 64 3B 02 14 50 Gemalto IDPrime v2+ .NET 3B 16 96 BA 00 0E 02 0A 03 Vietel (Telecommunication) 3B 16 96 D0 00 D4 07 2C 00 Vodafone India Postpaid / Local Operator 3G 3B 17 11 80 65 AF 03 42 00 D8 TELE2 SPB SIM Russia 3B 17 13 9C 12 02 01 01 07 40 Schlumberger Cyberflex Access Developer 32k 3B 17 94 18 01 01 01 01 41 93 T-Mobile SIM card 3B 17 94 18 01 01 02 01 41 49 white SFR SIM card 3B 17 94 18 01 01 09 01 41 53 Old Spanish Telefónica Movistar GSM SIM card 3B 17 94 18 02 01 25 01 41 93 AT&T Wireless GSM SIM Card 3B 17 94 20 01 01 0A 02 41 43 KPN SIM card 3B 17 94 20 05 01 10 01 41 FF CLARO SIM card (ex CTI Movil) 3B 17 94 80 65 D0 01 6C F2 BE CMCC sim cards with TD-SCDMA support 3B 17 94 80 65 D0 01 8B F2 08 China SIM card 3B 17 94 89 01 02 01 02 41 87 Vodafone/Omnitel 16K GSM SIM 3B 18 94 53 0D 06 77 24 07 FF 02 GSM SIM Tele2 Estonia, prepaid (Telecommunication) 3B 19 14 55 90 01 01 01 00 05 08 B0 Schlumberger Multiflex 8k 3B 19 14 55 90 01 02 01 00 05 04 B0 Schlumberger Multiflex 4k 3B 19 14 59 01 01 0F 01 00 05 08 B0 Schlumberger Multiflex 8k 3B 19 94 31 02 05 10 45 98 01 02 4E GSM-SIM EMT (Estonia) 3B 1B 94 80 69 06 02 22 11 00 80 08 00 00 eID 3B 1B 94 80 69 07 05 21 11 00 80 00 00 00 Aircel SIM (Telecommunication) 3B 1B 96 05 43 43 32 52 53 05 12 10 90 00 ChipCity CC32RS512 factory boot loader (this is a flash based CPU card with a factory-default bootloader) 3B 1C 94 43 48 49 50 44 52 49 56 45 30 30 31 SCM Chipdrive MyKey MasterKey 24k 3B 1F 11 00 67 42 41 46 49 53 45 53 52 66 FF 81 90 00 Finnish student id card 3B 1F 11 00 67 80 42 46 49 53 45 10 52 66 FF 81 90 00 Nokia branded SC (Setec) 3B 1F 11 00 6A 01 38 46 49 53 45 10 8C 02 FF 07 90 00 GSM-SIM Saunalahti (from 2004) Finnish cell phone operator "Sonera" SIM card (from 2002) 3B 1F 11 00 6A 31 36 46 49 53 45 13 8C 02 FF 07 90 00 GSM-SIM card - Telenor Mobil - http://www.telenor.com/ 3B 1F 11 00 6A 31 38 46 49 53 45 13 8C 02 FF 07 90 00 Latvian GSM operator TELE2 (SIM) 3B 1F 11 80 6A 16 32 46 49 53 45 15 8C E6 FF 07 90 00 GSM SIM card - Tele2 Estonia - http://www.tele2.ee 3B 1F 11 80 6A 32 37 46 49 53 45 12 8C 00 FF 07 90 00 Setec Test card, SetCOS 3.7.2, rel 1.3 3B 1F 11 80 6A 32 37 46 49 53 45 12 8C 02 FF 07 90 00 GSM-SIM DNA Finland (from 2001) 3B 1F 11 80 6A 80 34 46 49 53 45 53 94 00 FF 07 .. .. Setec SetCos 3.4 3B 1F 11 80 6A 80 34 46 49 53 45 53 94 36 FF 07 90 00 SetCOS 3.4.0c RSA SecurID 3100 3B 1F 94 00 6A 01 38 46 49 53 45 10 8C 02 FF 07 90 00 GSM-SIM Saunalahti (from 2004) 3B 1F 94 80 31 00 73 12 21 13 57 4A 33 05 30 32 34 00 Tron - MVNO Malaysia SIM Card (Giesecke & Devrient SIM) http://www.tron.my 3B 1F 94 80 6A 16 32 46 49 53 45 15 8C E6 FF 07 90 00 GSM-SIM Sonera (from 2002) 3B 1F 95 80 31 00 73 12 21 13 57 4A 33 0E 19 32 33 00 Latvian GSM Operator BITE 3B 23 00 00 36 41 81 Schlumberger Payflex 4k SAM 3B 23 00 35 11 80 Schlumberger Payflex 1k User 3B 23 00 35 11 81 Schlumberger Payflex 1k SAM 3B 23 00 35 13 80 Schlumberger Cyberflex Access Campus 3B 23 00 35 13 FF Schlumberger MicroPayflex 3B 23 00 35 41 80 PayflexHID (idenfitied by Sun Ray Services) 3B 24 00 .. .. .. 45 Conax 3B 24 00 30 42 30 30 ComHem Digital-TV smartcard (Sweden) TNK Telewizja Na Kartę (Poland) - Conditional access system : Conax (Norway) http://telewizjanakarte.pl/ 3B 24 00 80 72 94 43 MPCOS-3DES 64K \ EMV Filter (Gemplus) 3B 26 00 00 26 40 00 90 00 Schlumberger, purse? 3B 26 00 11 01 6D 03 OLD CajaMadrid Visa Cash, ID card for Universidad Autónoma de Madrid, Madrid (about 1998) 3B 26 00 11 04 5C 03 90 00 Caixa Abierta (Barcelona, Spain) Cash/Visa Electron 3B 26 00 11 06 23 03 90 00 Tarjeta de la Seguridad Social (Spanish Social Insurance Card) 3B 26 00 24 06 01 00 00 80 old KPN NetBox card 3B 26 00 31 08 6C 03 90 00 VISA ELECTRON from Caixa Catalunya bank card (www.caixacatalunya.es) for students in UPC university of Barcelona (Spain) (www.upc.es) 3B 26 00 31 1A 45 03 90 00 Tajeta Sanitaria Individual (Spanish Insurance Card) from the "Junta de Andalucia(Consejeria de Salud)" 3B 27 00 80 65 A2 .. 01 01 37 Gemplus GemSAFE Smart Card (4K) 3B 27 00 80 65 A2 00 01 01 37 Gemplus GemSAFE Card CSP v1.0 3B 27 00 80 65 A2 02 02 82 37 Gemplus GPK2000s 3B 27 00 80 65 A2 02 03 82 37 Gemplus GPK2000sp 3B 27 00 80 65 A2 04 01 01 37 Gemplus GPK4000s 3B 27 00 80 65 A2 05 01 01 37 Gemplus GPK4000sp 3B 27 00 80 65 A2 06 01 01 37 GPK 4000, RSA 512 bits Sign, Unwrap 40 bits 3B 27 00 80 65 A2 0C 01 01 37 Gemplus GPK4000 3B 27 00 80 65 A2 8C 3B 27 00 GPK 4000, RSA 1024 bits Sign, Unwrap 256 bits 3B 29 00 24 93 01 00 00 00 00 01 A9 Telephone chipcard for the Vienna University of Technology http://nic.tuwien.ac.at/telefonie/chipkarte/ 3B 29 00 80 72 A4 45 64 00 00 D0 15 Moeda Electronica Bradesco (Gemplus MPCOS?) (Brasilia) 3B 29 00 80 72 A4 45 64 00 FF 00 10 MPCOS-3DES 8K (Gemplus) MBNA Europe Platinum Plus Mastercard MasterCard Card - Worldcard - Yapıkredi / Turkey Portugal BPI Visa Electron UCFIN (Italy) "UniCreditCard Free" or "Plus" (VISA or MasterCard) credit card 3B 2A 00 80 65 A0 58 04 01 62 72 D6 43 Gemplus GemCombiXplore MPCOS Pro 3B 2A 00 80 65 A2 01 .. .. .. 72 D6 41 Gemplus MPCOS EMV 1 Byte sectors 3B 2A 00 80 65 A2 01 .. .. .. 72 D6 43 Gemplus MPCOS EMV 4 Byte sectors 3B 2A 00 80 65 A2 01 00 00 00 72 D6 41 MPCOS_EMV_1B 3B 2A 00 80 65 A2 01 00 00 00 72 D6 43 MPCOS_EMV_4B 3B 2A 00 80 65 A2 01 01 01 3C 72 D6 43 Estonian bank "SEB" (VISA Electron) 3B 2A 00 80 65 A2 01 01 01 3D 72 D6 43 GEMPLUS Logico Secure SmartCard for Citrix Metaframe PTTPost Easy Stamp 3B 2A 00 80 65 A2 01 02 01 31 72 D6 43 MPCOS-EMV 64K Functional Sample 3B 2F 00 80 69 10 80 00 01 A1 0A 01 01 59 83 0E 90 00 Belgium Dexia (Axion) Bank Card Proton/Bancontact Mister Cash/Maestro 3B 2F 00 80 69 AF 03 07 06 68 00 00 0A 0E 83 06 GSM SIM MobilCom (Gemplus) 3B 2F 00 80 69 AF 03 07 06 68 00 00 0A 0E 83 06 9F 16 MobilCom-Karte 3B 2F 00 80 69 AF 03 07 06 68 00 05 0A 0E 83 3E 9F 16 KPN @ Mobile SIM card 3B 32 15 00 06 80 Schlumberger Multiflex 8k 3B 32 15 00 06 95 Schlumberger Multiflex 8k DES 3B 34 00 00 30 42 30 30 Conax card: T-Home Hungary 3B 34 94 00 30 42 30 30 Conax card: ComHem sweden 3B 37 11 00 46 4C 4F 4D 41 90 00 SLE 4428 3B 37 13 00 80 62 11 04 82 90 00 Swiss UBS Maestro/CASH Bank Card 3B 37 13 00 80 62 21 13 82 90 00 Swiss UBS Maestro/CASH Bank Card 3B 3B .. 00 80 6. A[F,E] 03 0[C,D] .. .. 83 .. 90 00 GemXplore Xpresso V3 3B 3B 11 00 67 AF 10 30 07 00 C0 33 33 90 00 Mobicarte Orange 3B 3B 11 00 6A 38 20 00 00 27 A0 33 33 90 00 Spanish Carrefour Móvil SIM card 3B 3B 11 00 80 65 AF 03 0C 01 6F 83 0F 90 00 Gemplus GemX{plore,presso} V3-B1 3B 3B 11 00 80 69 AF 03 0C 01 6F 83 0[0,1] 90 00 GemXplore'Xpresso V3 64K 3B 3B 11 00 91 41 10 10 10 5B A0 00 33 90 00 Pannon SIM card (Hungary) 3B 3B 94 00 00 64 05 3E 03 0F 31 80 0E 90 00 Slovenian national health insurance card 3B 3B 94 00 4F 34 10 20 01 0. .0 33 33 90 00 Wind (Italy) GSM SIM card 3B 3B 94 00 67 37 10 00 00 39 60 33 33 90 00 Avea GSM / Turkey 3B 3B 94 00 69 3C 10 30 01 3E 40 33 00 90 00 UK Vodafone GSM SIM 3B 3B 94 00 6A 38 20 00 00 09 E0 33 33 90 00 virgin mobile (french) SIM card 3B 3B 94 00 80 65 32 13 04 03 30 83 81 90 00 SIM cards by the austrian cell phone provider A1 3B 3B 94 00 80 65 AF 03 0D 01 74 83 0F 90 00 Gemplus GemXplore Xpresso V3 B1P Mobistar SIM - Belgium (Gemplus) 3B 3B 94 00 9B 44 20 10 4D 04 20 00 33 90 00 SIM card for 063 network of Telekom Srbije, the Serbian state-owned telephone company. 3B 3B 94 00 9B 44 20 10 4D 05 00 00 33 90 00 SIM card for 066 network Telekom Srbije, the Serbian state-owned telephone company. 3B 3B 94 00 A6 39 90 00 00 00 21 83 83 90 00 meteor ireland http://www.meteor.ie 3B 3B 96 00 07 52 51 00 00 A8 FD 33 33 90 00 Movistar Costa Rica SIM card 3B 3B 96 00 40 22 51 00 00 42 00 33 33 90 00 Wind (Italy) 128K GSM SIM card 3B 3B 96 00 40 54 01 00 00 0A C0 33 33 90 00 Wind (Italy) 64K prepaid GSM SIM card 3B 3B 96 00 A7 4C 90 00 00 90 AC 33 33 90 00 Brazilian TIM GSM SIM 3B 3C 11 00 40 AF 13 F3 12 00 06 87 83 80 90 00 SIM GSM Orange Fr 3B 3C 11 00 42 AF 20 A3 20 07 00 22 83 82 90 00 Orange Mobicarte (SIM card old generation) 3B 3C 94 00 42 31 11 A2 12 02 09 51 83 80 90 00 Omnitel IT 16K GSM SIM card 3B 3C 94 00 4B 31 25 A2 10 13 14 47 83 83 90 00 GSM SFR 3B 3C 94 00 4C 31 25 A7 20 1B 00 15 83 83 90 00 GSM-SIM (900MHz) card of the carrier vodafone for their cellular network (phase 2+ with 3V) 3B 3C 94 00 63 31 12 F0 00 00 46 40 83 83 90 00 Old russian "beeline" sim 3B 3D 94 00 01 0F 00 36 00 00 86 60 18 04 00 01 07 Vodafone GSM / Turkey 3B 3D 94 00 23 18 02 56 00 00 86 60 5B 1B 00 00 0F GSM SIM, TMN (Moche prepaid, Portugal) 3B 3D 94 00 24 0E 00 96 00 00 86 60 31 B5 00 06 07 GSM SIM Tele2 Estonia; 2008 3B 3D 94 00 44 4D 54 11 00 06 06 17 62 11 00 30 00 China Unicom SIM card 3B 3D 95 00 80 67 AF 03 0F 01 7C 06 0E 83 3E 9F 16 (Sprint) Nextel USA iDEN SIM card http://www.sprint.com/index_n.html?brand=Nextel 3B 3E 94 00 80 31 00 73 FE 21 13 62 00 31 83 81 90 00 Vodafone (Italy) 64kB GSM SIM card 3B 3F 11 00 6F AF 65 03 12 01 80 73 32 21 1B 83 0F 90 00 GSM SIM card Orange J2RE postpaid 3B 3F 11 00 80 12 00 91 31 C0 64 0E 01 13 12 72 F7 41 05 SCOSTA (transport) 3B 3F 11 00 80 69 AF 03 37 00 12 00 00 00 0E 83 18 9F 16 Reliance SIM (Prepaid), Telecommunication 3B 3F 94 00 80 65 AF 03 12 01 6F 73 32 21 1B 83 0F 90 00 GSM SIM Card (GEMPLUS), issued by Orange Switzerland (Prepaid) Italian Vodafone 64k SIM GSM SIM T-Mobile NL 3B 3F 94 00 80 65 AF 03 12 01 79 73 32 21 00 83 0F 90 00 O2 (UK) SIM 3B 3F 94 00 80 65 AF 03 12 01 79 73 32 21 1B 83 0F 90 00 UK O2 GSM SIM (2G Online Prepay Maldives) Tesco Mobile (UK) SIM 3B 3F 94 00 80 69 AF 03 07 06 67 00 00 0A 0E 83 3E 9F 16 SFR SIM card (red Gemplus Répertoire) 3B 3F 94 00 80 69 AF 03 07 06 67 09 97 0A 0E 83 3E 9F 16 BASE SIM - Belgium (Gemplus) 3B 3F 94 00 80 69 AF 03 07 06 68 00 85 0A 0E 83 3E 9F 16 O2 (UK) SIM 3B 3F 94 00 80 69 AF 03 0F 02 80 FF FF 06 0E 83 3E 9F 16 GSM-SIM Telefonica Movistar, prepaid (Spain) 3B 3F 94 00 80 69 AF 03 0F 07 A4 00 00 06 0E 83 3E 9F 16 SIM Card PRO from the austrian telecom "A1" 3B 3F 95 00 80 65 AF 03 12 01 6F 73 32 21 1B 83 00 90 00 Gemplus GemXpresso PRO 64 PK SIM 3B 3F 95 00 80 65 AF 03 12 01 6F 73 32 21 1B 83 0F 90 00 Vodafone Italia SIM 64K 3B 3F 95 00 80 65 AF 03 12 01 79 73 32 21 00 83 0F 90 00 GSM SIM Orange NL 3B 3F 95 00 80 65 AF 03 14 01 8A 73 32 21 1B 83 0F 90 00 SIM Vodafone 64k 3B 3F 95 00 80 69 AF 03 0F 02 80 FF FF 06 0E 83 3E 9F 16 AT&T Wireless GSM SIM Card UK Virgin Mobile GSM SIM 3B 3F 95 00 80 69 AF 03 0F 06 A3 FF FF 06 0E 83 3E 9F 16 "SIMYO" SIM card (KPN) 3B 3F 96 00 80 69 AF 03 3D 00 C6 00 00 00 0E 83 1E 9F 16 GSM SIM card of the Austrian provider A1 3B 57 18 02 93 02 01 01 01 90 00 Easyflex FastOS 2.0 / Schlumberger 3B 5B 96 00 00 31 C0 64 C6 FC 10 00 01 90 00 Banking card (Oberthur C.S. 06 18710-04-10) 3B 5E 11 FF 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 Estonian Identity Card (EstEID v1.0 2006 warm) 3B 5F 95 00 80 73 00 01 00 59 43 4C 5A 1B 00 11 40 90 00 SCM Chipdrive MyKey SC 3B 5F 95 00 80 73 00 01 00 59 43 4C 5A 1C 00 11 40 90 00 "CardLogic" CLXSU256KF5 3B 63 00 00 36 41 80 Schlumberger Payflex 4k User 3B 64 .. FF 80 62 .. A2 JCOP20 3B 64 00 00 80 62 0. 51 Setec SetCOS 5.1.0 EMV 3B 64 00 FF 80 62 02 A2 VISA credit card (Nordea bank) 3B 65 00 00 20 63 CB 63 00 Bank card from Societe Générale (Oberthur) 3B 65 00 00 20 63 CB 64 80 MasterCard from La Banque Postale 3B 65 00 00 20 63 CB 66 00 Boursorama banque VISA (bank) 3B 65 00 00 20 63 CB 66 80 Crédit Agricole (french bank) MasterCard 3B 65 00 00 20 63 CB 68 00 VISA credit card (Skandiabanken) VISA credit card (Banque Populaire) Banque Postale card (bank) Société Générale (visa / jazz) HSBC Business VISA 3B 65 00 00 20 63 CB 68 00 26 VISA Société Générale - Oberthur CS 3B 65 00 00 20 63 CB 68 80 Capital One MasterCard Platinum 3B 65 00 00 20 63 CB 6A 00 CB Visa La Banque Postale (Gemalto) CB Visa BNP Paribas (France) 3B 65 00 00 20 63 CB 6A 80 Mastercard EMV Debit Card Crédit Agricole (french bank) Gold Mastercard 3B 65 00 00 20 63 CB 6B 80 Crédit Agricole (french bank) Mastercard 3B 65 00 00 20 63 CB A0 80 Carrefour, MasterCard credit card, Pass Banque, Oberthur 3B 65 00 00 20 63 CB A1 00 AIB Visa Debit Card, manufcatured by Oberthur 3B 65 00 00 20 63 CB A1 80 bpaid: bpost prepaid Mastercard http://www.bpost.be/site/fr/residential/finance/bpaid/index.html 3B 65 00 00 20 63 CB A3 00 BNP VISA CARD 3B 65 00 00 20 63 CB A3 20 MasterCard Crédit Agricole Anjou-Maine (type Sociétaire) 3B 65 00 00 20 63 CB A3 A0 VISA card from Banque Populaire 3B 65 00 00 20 63 CB A7 20 ING Direct (French Bank) Gold MasterCard 3B 65 00 00 20 63 CB A8 A0 HSBC VISA Card 3B 65 00 00 20 63 CB AB 80 Portugal Caixa Geral de Depósitos Mastercard "Caixa Classic" 3B 65 00 00 29 05 01 02 01 ActivCard (Schlumberger) CyberFlex 64K V1 SM 2.1 3B 65 00 00 41 56 49 4F 4E RBC (Royal Bank of Canada) Avion Visa 3B 65 00 00 43 04 6C 90 00 Carte Bancaire (French banking card) (hot reset) 3B 65 00 00 58 01 01 00 80 RBS Advanta Platinum Reserve Master Card UK Lloyds TSB Visa Debit (issued 2003, Gemplus) 3B 65 00 00 9C 02 02 01 02 Dectel CI692 3B 65 00 00 9C 02 02 07 02 US Department of Defense, TEST Common Access Card (CAC) Schlumberger Cyberflex Access #2 Axalto Cyberflex Access 32K V2 Sun Microsystems employee card 3B 65 00 00 9C 1[0,1] 01 01 03 Schlumberger Cyberflex Palmera 3B 65 00 00 D0 00 37 00 80 Visa Debit card issued by National Bank of Dubai 3B 66 00 00 00 9C 11 01 01 03 Axalto Cyberflex Access 32K V4 SM 1.3 3B 66 00 00 00 9C 11 01 03 01 Axalto Cyberflex Access 64K V1 Bio SM 3.1 3B 66 00 00 05 12 01 01 01 B1 Lyon1 student card (Moneo compatible) 3B 66 00 00 31 4B 01 01 00 80 VISA credit card (Skandiabanken) 3B 66 00 00 32 D0 00 30 02 01 Kazakhstan Kazkom Onlinebank (Homebank) PKI client key-card (https://www.homebank.kz/) 3B 66 00 00 66 44 01 01 03 B1 Carte etudiant Paris 1 moneo BNP Paribas france (Oberthur) Carte Monéo Caise d'épargne Crouse de Lyon 3B 66 00 00 90 D1 02 01 10 B1 Moneo card (e-purse) 3B 66 00 00 90 D1 02 01 10 B1 3B 02 14 50 Card "Bordeaux Ma Ville" (yellow) http://www.bordeaux.fr/ebx/portals/ebx.portal?_nfpb=true&_pageLabel=pgPresStand8&classofcontent=presentationStandard&id=57733 3B 66 00 00 90 D1 02 01 20 B1 Moneo card (e-purse) 3B 66 00 00 90 D1 02 01 40 B1 Student card from Paris Diderot University (with Moneo) 3B 66 00 00 90 D1 02 01 52 B1 Pass Campus Alsace, a mix of a student card, a transport card (Badgeo) and a Moneo http://www.passcampus-alsace.fr/ http://www.cts-strasbourg.fr/Tarifs/Carte%C3%A0puceBadgeo/tabid/598/language/fr-FR/Default.aspx 3B 66 00 00 D0 00 47 44 00 80 VISA credit card (RBC Royal Bank) 3B 66 00 FF 4A 43 4F 50 30 33 IBM JCOP 30 3B 66 00 FF 4A 43 4F 50 32 31 JCOP 21 3B 66 00 FF 4A 43 4F 50 33 30 JCOP30 "OP-DI 16k VISA v2 (JCOP30) ORGA" 3B 67 00 00 00 00 00 00 00 90 00 Axa Bank (Belgium) Mastercard Gold / Axa Bank Belgium MisterCash & Proton card VISA Card (emitted by Bank Card Company - Belgium) 3B 67 00 00 00 00 20 00 00 90 00 BankID card from Sparebank1 3B 67 00 00 00 31 80 71 86 90 00 Swiss ZKB-Bancomat-Card 3B 67 00 00 29 20 00 6F 78 90 00 ING (previously Postbank Chippas) (chipknip) Netherlands Rabobank bankcard (dutch) ASN Bank debit card SNS Bank debit card ABN-AMRO Maestro 3B 67 00 00 29 20 00 6F 78 9A 00 ABN AMRO wereldpas 3B 67 00 00 2A 20 00 41 78 90 00 Prepaid Chipknip Netherlands 3B 67 00 00 2D 20 16 01 78 90 00 CNAMTS and CPAM SSO card (French Health Insurance) 3B 67 00 00 2D 20 36 00 78 90 00 Swedish cashcard, http://www.ida.liu.se/~TDDB31/Cashcard.pdf Bank Card (ING - Belgium) Schiphol Group Privium biometric card (Amsterdam Airport entry system) 3B 67 00 00 73 20 00 6C .. 90 00 Malaysia Citizen Identity Card (MyKad) http://www.jpn.gov.my/en/identitycard 3B 67 00 00 7C 20 40 34 2B 90 00 Swedbank Visa card 3B 67 00 00 7D 20 40 34 3B 90 00 Nordea Visa Sweden 3B 67 00 00 80 62 21 13 82 90 00 UBS MAESTRO CARD (Bank) 3B 67 00 00 85 20 36 30 78 90 00 Belgium Fortis Bank Belgium Keytrade Bank Belgium Post Bank 3B 67 00 00 85 22 16 31 78 90 00 Swiss UBS Ebanking Chipcard 3B 67 00 00 85 22 16 31 78 9F 00 UBS Token Card (bank) 3B 67 00 00 9C 10 01 01 03 FF 07 Schlumberger Cyberflex Palmera Protect 3B 67 00 00 A5 20 40 10 1F 90 00 Swedish eLegitimation (eID) from Nordea Bank http://www.elegitimation.se/ 3B 67 00 00 A6 40 40 00 09 90 00 Visa card issued by Norway bank DNBNor 3B 67 00 00 A8 10 42 20 1F 90 00 MyKad- Identification Card for Malaysians http://en.wikipedia.org/wiki/MyKad 3B 67 00 00 AB 40 40 26 09 90 00 Swedish VISA credit card (Volvofinans) 3B 67 00 00 AB 40 40 27 0B 90 00 Sparebanken Vest, Norway (spv.no). Visa credit card and national debit card [BankAxept] + Gemalto Todos authentication 3B 67 00 00 B1 40 40 33 0B 90 00 Sparebank1 VISA card, Norway www.sparebank1.no 3B 67 00 00 B3 40 40 00 3B 90 00 Handelsbanken BankID card (Swedish bank authentication issued 2011) 3B 67 00 00 B4 40 40 25 0B 90 00 Electronic meal check 3B 67 00 00 C1 30 40 01 0B 90 00 MC/Maestro card issued by Czech's "Ceskoslovenska obchodni banka" 3B 67 00 00 C4 30 40 01 0B 90 00 MasterCard issued by Czech's "Ceskoslovenska obchodni banka" Swedish Maestro bank card (Handelsbanken) 3B 67 00 FF C5 00 00 FF FF FF FF 5D Alice Tv italia (Pay TV) 3B 67 25 00 29 20 00 6F 78 90 00 Albert Heijn klantenkaart (loyalty card) Rabopas (Rabobank) 3B 67 25 00 2A 20 00 4[0,5] 68 90 00 Swedish cashcard (proton) 3B 67 25 00 62 24 33 03 .. Bull TB1000 ? (SAM for ATM in Luxemburg) 3B 68 00 00 00 73 C8 40 00 00 90 00 Barclaycard Visa Wave & Pay - Chip I/F 3B 68 00 00 00 73 C8 40 10 00 90 00 Icelandic Banking scheme Issued by the Ministry of Treasure in Iceland http://www.islandsrot.is/ 3B 68 00 00 00 73 C8 40 11 00 90 00 Woolworths Everyday Money prepaid Mastercard Nordea Bank Norway Visa + national debet card [BankAxept] VISA Classic - Nordlandsbanken (Norway) 3B 68 00 00 00 73 C8 40 12 00 90 00 Brazilian "e-CPF" card 3B 68 00 00 00 73 C8 40 13 00 90 00 MASTERCARD issued by MLP (Marschollek, Lautenschläger and Partner) 3B 68 00 00 01 02 10 96 00 00 90 00 Italian BancoPostaClick Postamat Card (Poste Italiane) - MasterCard debit card mbna PLATINUM MasterCard Flash (Banca Fideuram) Italy prepaid Mastercard 3B 68 00 00 56 53 44 43 4C 43 31 30 VISA (Estonian), made by www.trueb.ch Latvian bank "Latvijas Krajbanka" (VISA Electron) 3B 68 00 00 80 62 00 3C 83 00 90 00 Italian PostePay prepaid VISA-Electron PagoBancomat (Debtcard) Maestro - Intesa Sanpaolo Bank / Italy 3B 68 00 00 80 62 00 45 83 00 90 00 MasterCard - Intesa Sanpaolo Bank / Italy 3B 68 00 00 80 66 45 46 01 38 18 03 FNMT WG108k 3B 68 00 00 80 66 57 59 01 00 08 03 Spanish ULPGC student id card (http://www.ulpgc.es/) E-Money capability Alliance With La Caja de Canarias Bank Manufactured by GyD IBÉRICA (http://www.gi-de.com) 3B 68 00 00 80 66 A2 06 01 01 64 00 Visa card issued by Czech's "Komercni banka" (Gemplus brand on chip) 3B 68 00 00 80 66 A2 06 02 01 32 0E Gemplus GemClub 1K 3B 68 00 00 9D 03 02 01 01 56 49 53 Visa Card - SberBank / Russia 3B 68 00 00 9D 08 01 02 01 56 49 53 Visa Card - bonus - DenizBank / Turkey 3B 68 00 00 9D 08 01 03 01 4F 54 53 MasterCard Card - bonus - Garanti Bank / Turkey 3B 68 00 00 9D 08 01 03 01 56 49 53 MasterCard Card - bonus - Garanti Bank / Turkey MasterCard Card - bonus plus (paypass) - Garanti Bank / Turkey 3B 68 00 00 9D 08 01 05 01 56 49 53 MasterCard Card - CartaSi (Italian Credit Card) 3B 68 00 00 A1 02 02 01 01 56 49 53 UK NatWest Business MasterCard UK Barclaycard VISA UK NatWest Platinum MasterCard Visa Card - DenizBank / Turkey 3B 68 00 00 FF 29 23 00 07 68 90 00 Politecnico di Milano student card "Le Chiavi della Città" SienaCard MINIpay Card 3B 68 00 FF 00 73 C8 40 00 00 90 00 Visa credit card for Bank of Taiwan CommSec Debit MasterCard (Australia) 3B 68 00 FF 56 43 41 52 44 6E 73 73 NSSVirtual Smart Card for qemu 3B 69 00 00 24 94 01 00 00 00 00 01 A9 Kazakhstan Helios gas station debit card (http://helios.kz/) 3B 69 00 00 24 94 01 02 01 00 01 01 A9 Chipcard from SUN to be used in SunRay's 370-4328-01 (31091) 3B 69 00 00 24 94 01 03 01 00 01 00 A9 Schlumberger MicroPayflex S card 3B 69 00 00 4A 43 4F 50 33 31 56 32 32 Visa Europe Sample Card / Axalto 3B 69 00 00 50 01 01 04 01 00 01 01 A9 Sample card given to all attendees of the CTST 2004 SmartCard Conference 3B 69 00 00 55 4B 54 20 56 31 2E 30 00 PostFinance Card Direct (Swiss Post) 3B 69 00 00 56 49 53 5F 49 4E 46 20 06 VISA credit card (Ceska Sporitelna) Maestro credit card (Ceska Sporitelna) 3B 69 00 00 80 31 E0 55 42 45 52 47 53 Banrisul Bank 3B 69 00 00 AC 04 00 00 04 B1 8C 61 21 Student card for Université numérique Paris Île-de-France http://unpidf.univ-paris1.fr/la-carte-multiservice-etudiant-de-paris-et-d-ile-de-france-1775.kjsp?RH=unr-carte&RF=unr-carte 3B 69 00 FF 00 64 4A 10 04 32 05 90 00 NXP JCOP 20 V2.1 16K 3B 69 00 FF 4A 43 4F 50 33 31 56 32 32 JCOP 31 v22 72K - S/C I/F 3B 69 00 FF 53 6D 40 72 74 43 61 66 65 G&D (Giesecke&Devrient) Sm@rtCafé 3B 6A 00 00 80 31 C0 A1 02 03 01 32 81 16 Lloyds TSB Visa Credit/Debit Card 3B 6A 00 00 80 65 A2 01 01 01 3D 72 D6 43 GemSafe Xpresso 16k 3B 6A 00 00 80 65 A2 01 03 01 8D 72 D6 43 American Express Blue Card 3B 6A 00 00 80 66 A1 09 02 01 63 0E 90 00 Danish Visa/Dankort UK MBNA MasterCard Visa Card - Worldcard - YapıKredi / Turkey VISA - Lloyds TSB DEBIT UK Halifax Visa Debit 3B 6A 00 00 80 66 A2 0A 01 01 8B 0E 90 00 CAP-EMV demo card 3B 6A 00 FF 41 42 43 44 32 45 46 47 48 49 Austria card - JCOP 31/36K 3B 6B .. FF 80 62 .. A2 56 46 69 6E 45 49 44 JCOP20 v2.x 3B 6B 00 00 00 31 80 64 2D A0 02 0C 8C 61 27 SmartEMV prototype 3B 6B 00 00 00 31 80 64 43 B0 02 00 8C 61 27 Bull Odyssey 1.2 (Javacard 2.0) 3B 6B 00 00 00 31 C0 64 A9 EC 01 00 82 90 00 Entropia Universe Gold card http://account.entropiauniverse.com/account/security/ 3B 6B 00 00 42 6C 75 63 61 72 64 20 34 4B 42 Blutronics Blucard 4K (Loyalty) http://blucard.blutronics.com 3B 6B 00 00 80 65 A1 09 03 01 97 83 0E 90 00 Visa Card - Worldcard - YapıKredi / Turkey 3B 6B 00 00 80 65 B0 83 01 01 74 83 00 90 00 GemXpresso Pro R3 with 64K EEPROM 3B 6B 00 00 80 65 B0 83 01 03 74 83 00 90 00 Gemplus GemXpresso PRO 64K R3 v1 3B 6B 00 00 80 65 B0 83 01 04 74 83 00 90 00 Gemplus GXP3 64V2N U.S. Department of Defense Common Access Card (DoD CAC) 3B 6B 00 FF 33 00 00 09 FA 10 00 80 01 FF FF Atmel 6464C PRO 64K 3B 6B 00 FF 56 43 41 52 44 5F 4E 53 53 NSSVirtual smart card for qemu 3B 6C 00 00 10 10 10 30 00 00 00 00 00 00 00 00 Datacard Group Aptura Development Card V1.1b 3B 6C 00 00 42 6C 75 6C 6F 67 6F 6E 20 34 4B 42 eID Blutronics Blulogon 4K http://shop.blutronics.com/Prodotti.asp 3B 6C 00 00 80 64 11 65 01 90 73 00 00 00 81 07 Universal Electronic Card (UEC Russia) (eID) 3B 6C 00 02 36 61 86 38 4B 8C 13 04 62 03 59 8A Nagravision, Swiss mode 3B 6D 00 00 00 31 80 64 2D A0 04 0C 71 96 8C 61 29 UK Co-operative Bank Visa Debit (produced 2002) 3B 6D 00 00 00 31 80 71 96 64 33 D1 01 00 82 90 00 DeLaRue GalactIC JavaCard 3B 6D 00 00 00 31 C0 71 D6 64 11 22 33 01 83 90 00 Egg (bank) VISA First Direct (bank) Maestro card First Direct Gold VISA UK Barclaycard Platinum VISA UK Barclaycard VISA UK Halifax Platinum VISA UK HSBC MasterCard UCFIN (Italy) "UniCreditCard Free" or "Plus" (VISA or MasterCard) credit card 3B 6D 00 00 00 31 C0 71 D6 64 19 16 01 00 84 90 00 Eurocard Corporate MasterCard issued by Eurocard AB Sweden Capital One (UK) MasterCard VISA card, issued by Swedbank Latvia VISA issued by Citibank International plc (manufacturer Oberthur) MasterCard issued by Swedbank Estonia (manufacturer Oberthur) Santander Business Visa Debit 3B 6D 00 00 00 31 C0 71 D6 64 34 C7 01 00 84 90 00 DeLaRue ProlifIC 3B 6D 00 00 00 31 C0 71 D6 64 34 C7 02 00 84 90 00 Cybelys card (Thalys fidelity card) 3B 6D 00 00 00 31 C0 71 D6 64 38 D0 02 00 84 90 00 EMV Visa Electron (Oberthur) 3B 6D 00 00 00 31 C0 71 D6 64 38 D0 03 00 84 90 00 HSBC Visa/MasterCard credit card Barclay Card MasterCard 3B 6D 00 00 00 31 C0 71 D6 64 4E D8 01 01 84 90 00 UK Capital One Platinum MasterCard 3B 6D 00 00 00 31 C0 71 D6 64 58 D7 01 00 84 90 00 UK Nationwide Bank Visa Delta UK First Direct Maestro UK Halifax Platinum Visa UK Co-operative Bank Visa Debit (produced 2003-2004) UK HSBC LiveCash Solo Debit card 3B 6D 00 00 00 31 C0 71 D6 65 11 22 33 01 83 90 00 UK Co-operative Bank Visa Debit (produced 2006) 3B 6D 00 00 57 44 29 6C 80 86 93 D1 27 1F 13 32 3D SCSTA (Transport) 3B 6D 00 00 57 44 29 6C 80 86 93 D6 03 EE 08 2A 3D SCSTA (Transport) 3B 6D 00 00 80 31 80 65 B0 06 01 01 77 83 00 90 00 GemXpresso Lite: with EMV application 3B 6D 00 00 80 31 80 65 B0 07 02 02 89 83 00 90 00 JCOP30 contact interface 3B 6D 00 00 80 31 80 65 B0 43 01 00 77 83 00 90 00 Gemplus GemXpresso Lite 3B 6D 00 00 80 31 80 65 B0 83 01 02 90 83 00 90 00 DeutscheBank Identification card 3B 6D 00 00 80 31 80 65 B0 83 02 04 7E 83 00 90 00 LuxTrust card https://www.luxtrust.lu/solutions/comp/cartech2 https://www.luxtrust.lu/faq/middleware/middleware 3B 6D 00 00 80 31 80 65 B0 83 11 40 C8 83 00 90 00 Gemalto TOP IM (Old name GemSafeXpresso 64) 3B 6D 00 00 80 31 80 65 B0 86 26 01 08 83 08 90 00 RBC Royal Bank VISA (Bank) 3B 6D 00 00 80 31 80 65 B0 87 27 01 BC 83 08 90 00 Kazcommertsbank (http://en.kkb.kz/page/WhoWeAre) one of the biggest banks in Republic of Kazakhstan Nordea (Finland) + Finnair MasterCard (credit) 3B 6D 00 00 80 67 A1 11 01 01 64 08 55 83 0E 90 00 Italian Intesa SanPaolo Maestro 3B 6D 00 FF 00 31 80 71 8E 64 48 D5 02 00 82 90 00 Blue for Business, American Express@Business 3B 6D 00 FF 80 65 53 43 01 0D 06 73 94 21 1B 81 0[1,5] Giesecke & Devrient CardToken 350 (ICCD) 3B 6D 00 FF 80 73 00 21 13 57 4A 54 48 61 31 47 00 ActiveKey SIM 3B 6D 00 FF 80 73 00 21 13 57 4A 54 48 61 31 48 00 Spanish Medical College Card 3B 6E 00 00 00 31 80 71 86 65 01 64 02 22 32 80 90 00 MasterCard Card - bonus plus (paypass) - Garanti Bank / Turkey 3B 6E 00 00 00 31 80 71 86 65 01 64 02 22 32 83 90 00 MasterCard Card - bonus YKM - Garanti Bank / Turkey 3B 6E 00 00 00 31 80 71 86 65 01 67 02 A0 0A 83 90 00 Australian ANZ First Visa Card from the ANZ (Australia and New Zealand) Bank 3B 6E 00 00 00 31 80 71 86 65 47 44 23 01 02 83 90 00 Nat West Master Card 3B 6E 00 00 00 31 80 71 86 65 47 44 24 01 81 83 90 00 MasterCard Card - Maximum - IS Bank / Turkey Visa Card - Axess - Akbank / Turkey 3B 6E 00 00 00 31 C0 65 54 B6 01 00 84 71 D6 8C 61 2C Kazakhstan Centrcredit bank VISA electron card (http://www.bcc.kz/en/) 3B 6E 00 00 00 31 C0 65 54 B6 01 00 84 71 D6 8C 61 31 UK BARCLAYS VISA Connect Debit card. The chip is used for the Chip&PIN application common for all UK-issued cards: http://www.chipandpin.co.uk/ 3B 6E 00 00 00 31 C0 65 76 B4 01 01 60 71 D6 8C 61 1F MasterCard Silver from Viseca Card Services SA http://www.viseca.ch/html/en/kreditkarten/produkte_neutrale_karten.php 3B 6E 00 00 00 31 C0 65 77 B2 01 01 47 71 D6 8C 61 33 VISA Credit Card (National Bank of Greece) 3B 6E 00 00 00 31 C0 65 77 B2 01 03 47 71 D6 8C 61 31 UK Barclaycard Business VISA Nationwide Building Society (UK) Visa Debit and Credit Cards 3B 6E 00 00 00 31 C0 65 77 B2 01 03 47 71 D6 8C 61 37 Italian Soldintasca Sanpaolo prepaid VISA-Electron 3B 6E 00 00 00 31 C0 65 77 B3 01 00 70 71 D6 8C 61 .. Italian Bancomat (debit card) 3B 6E 00 00 00 31 C0 65 7C B5 01 00 80 71 D6 8C 61 2C Kazakhstan Kazkom bank VISA electron card (http://en.kkb.kz/) 3B 6E 00 00 00 31 C0 65 7C B5 01 00 80 71 D6 8C 61 35 MasterCard Classic, issued by Avangard Bank (Russia) http://avangard.ru/ 3B 6E 00 00 00 31 C0 65 7C B5 01 00 80 71 D6 8C 61 37 Swedbank MasterCard card 3B 6E 00 00 00 31 C0 65 BC D0 02 01 06 71 D6 8C 61 2E Lloyds TSB Mastercard Credit Card 3B 6E 00 00 00 31 C0 65 BC D0 02 01 06 71 D6 8C 61 33 Lloyds TSB Visa Debit Barclays Visa DEBIT 3B 6E 00 00 00 31 C0 65 BC D0 02 01 06 71 D6 8C 61 43 S-pankki (Finland) Visa Debit 3B 6E 00 00 00 31 C0 65 BC D1 02 01 01 71 D6 8C 61 33 Travelex Cash Passport - Prepaid MasterCard Currency Card 3B 6E 00 00 00 31 C0 65 BC D1 02 01 01 71 D6 8C 61 35 MasterCard Card, issues by Rabobank in the Netherlands 3B 6E 00 00 00 31 C0 65 D3 C1 02 01 28 71 D6 8C 61 22 Visa debit card 3B 6E 00 00 00 31 C0 65 D3 C1 02 01 28 71 D6 8C 61 33 SberBank Silver Debit Card 3B 6E 00 00 00 31 C0 65 D3 C1 02 01 28 71 D6 8C 61 39 Paypal Italy prepaid Mastercard 3B 6E 00 00 00 31 C0 65 D3 C2 02 00 05 71 D6 8C 61 35 Italian Intesa SanPaolo VISA 3B 6E 00 00 00 31 C0 65 D3 C2 02 00 05 71 D6 8C 61 39 Italian Bancomat (Cassa di Risparmio di Rimini) (bank card) 3B 6E 00 00 00 31 C0 65 D3 C3 02 03 01 71 D6 8C 61 3B American Express Platinum from Banco do Brasil 3B 6E 00 00 00 31 C0 65 E2 C4 02 01 01 71 D6 8C 61 22 mastercard (Bank) 3B 6E 00 00 00 31 C0 65 E2 C4 02 02 01 71 D6 8C 61 25 Spanish "Santander" bank - Maestro debit card - Made by gemalto sp SA 3B 6E 00 00 00 31 C0 65 E7 D2 02 01 10 71 D6 8C 61 23 Visa debit card: mBank - BRE Bank SA 3B 6E 00 00 00 31 C0 65 E7 D2 02 01 10 71 D6 8C 61 37 UCFIN (Italy) "UniCreditCard Free" or "Plus" (VISA or MasterCard) credit card 3B 6E 00 00 00 31 C0 65 E7 D2 02 01 10 71 D6 8C 61 47 Hellenic Bank Visa Electron (Gemalto) 3B 6E 00 00 00 31 C0 65 EC D4 02 00 08 71 D6 8C 61 33 Victoria Bank (Republic of Moldova) - Visa Electron 3B 6E 00 00 00 31 C0 71 86 65 01 64 02 22 33 83 90 00 UK NatWest ServiceCard 100 Maestro Visa Card - bonus - Garanti Bank / Turkey UK Royal Bank of Scotland Highline Maestro Debit 3B 6E 00 00 00 31 C0 71 86 65 01 78 01 27 34 83 90 00 UK NatWest ServiceCard 100 Maestro Visa Card - Gold - CARDFINANS / Turkey 3B 6E 00 00 00 31 C0 71 86 65 01 BB 01 13 3B 83 90 00 NatWest Servicecard 100 - Maestro ATM NatWest Visa Debit 3B 6E 00 00 00 31 C0 71 86 65 02 02 04 04 41 83 90 00 CIBC (Canada) "Platinum" (VISA) credit card ING Direct (Italy) "Gold" (VISA) credit card ING Direct (Italy) "Bancomat" (V PAY) debit card HSBC (Canada) (Interac/Cirrus/The Exchange) debit card UniCredit (Italy) "Bancomat" (Maestro) debit card 3B 6E 00 00 00 31 C0 71 C6 65 01 B0 01 03 37 83 90 00 NatWest (UK) "Business" (MasterCard) credit card NatWest (UK) (Maestro) debit card Santander Totta (Portugal) "JÁ KÁ KONTA" (VISA Electron) debit card ANZ (Australia) (VISA) credit card Millennium BCP (Portugal) (VISA Electron) debit card OpenBank (Spain) (VISA) credit card CIBC (Canada) debit card UniCredit (Italy) "Genius Card" (MasterCard) debit card UniCredit (Italy) "UniCreditCard Click" (MasterCard) debit card VISA Electron debit card from the Spanish branch of ING Direct (bank) 3B 6E 00 00 00 31 C0 71 C6 65 01 B0 01 03 3A 83 90 00 MasterCard hostet by Deutsche Bank, Germany Maestro card by Caja de Burgos, Spain MasterCard Debit Card issued by Spain Openbank (www.openbank.es) 3B 6E 00 00 00 31 C0 71 C6 65 01 B0 01 31 37 83 90 00 Electron VISA Credit Card (BANK OF Cyprus) 3B 6E 00 00 00 31 C0 71 C6 65 42 2C 01 35 35 83 90 00 UniCredit (Italy) "UniCreditCard Classic" (VISA) credit card 3B 6E 00 00 00 31 C0 71 C6 65 71 0C 04 35 36 83 90 00 NatWest VISA Business Debit VISA Debit Card (NatWest / ING DiBa) Komercni Banka, A.S., Visa Debit, Czech Republic 3B 6E 00 00 00 31 C0 71 D6 65 12 0D 01 81 00 83 90 00 VISA Gold (VISA ORO) from the Spanish branch of ING Direct (bank) http://www.ingdirect.es/tarjetas-ing/ Visa Credit Card issued by Spain Cetelem for PayPal (www.paypal.es/cetelem) MasterCard debit card: moneybookers.com card issued by Newcastle Building Society 3B 6E 00 00 00 31 C0 71 D6 65 7D E4 01 10 A0 83 90 00 VISA card, issued by the ANWB, the Dutch national Automobile club VISA Card - Maximum - Oyak Bank / Turkey VISA - Barclays Premier 3B 6E 00 00 00 31 C0 71 D6 65 7D E4 01 11 A0 83 90 00 UK CapitalOne Platinum Mastercard 3B 6E 00 00 00 31 C0 71 D6 65 94 E8 03 40 00 83 90 00 First Direct UK VISA Debit Italian Cariparma Maestro "Net+ Mastercard card" from netpluscards.com, Neteller UCFIN (Italy) "UniCreditCard Free" (VISA) credit card Cirrus ATM Card issued by Permanent TSB in Ireland 3B 6E 00 00 00 31 C0 71 D6 65 A3 03 01 80 00 83 90 00 UK First Direct (HSBC) Maestro / Cirrus UK Capital One Platinum MasterCard HSBC Commercial Card Visa VISA issued by Czech's "Komercni banka" (member of Societe General group) Portugal Caixa Geral de Depositos debit card The co-operative bank VISA Debit SberBank Silver Debit Card (VISA) Maestro/Cirrus/Laser Card issued by Bank of Ireland in Ireland 3B 6E 00 00 00 31 C0 71 D6 65 CE 0B 01 40 00 83 90 00 Nationwide InvestDirect (bank) SberBank Gold Credit Card (VISA) 3B 6E 00 00 00 62 .. 43 57 41 56 41 4E 54 10 81 90 00 Setec SetCOS 4.3.0 3B 6E 00 00 00 62 00 00 57 41 56 41 4E 54 10 81 90 00 Setec SetCOS 5.1.0 EMV + AVANT 3B 6E 00 00 00 62 16 43 .. 41 56 41 4E 54 10 81 .. .. Setec SetCos 4.3.0 3B 6E 00 00 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 Estonian Identity Card (EstEID v1.1 "MULTOS" cold) 3B 6E 00 00 57 44 36 13 69 86 93 02 32 12 56 28 25 32 Watchdata Brazil CSP v1.0 (Banco do Brasil) http://www.watchdata.com/en/bank/solutions.jsp 3B 6E 00 00 62 6C 75 63 61 72 64 20 32 4B 42 2F 76 34 eID Blutronics Blucard 2K http://blucard.blutronics.com 3B 6E 00 00 62 6C 75 63 61 72 64 20 34 4B 42 2F 76 34 eID Blutronics Blucard 4K http://blucard.blutronics.com 3B 6E 00 00 62 6C 75 63 61 72 64 20 38 4B 42 2F 76 34 eID Blutronics Blucard 8K http://blucard.blutronics.com 3B 6E 00 00 80 25 A0 00 00 00 28 56 80 10 24 00 01 11 Opencard, new card in Prague, Czech Republic (transport card) 3B 6E 00 00 80 31 80 65 B0 03 01 01 5E 83 00 00 90 00 FirstUSA Visa 3B 6E 00 00 80 31 80 65 B0 03 02 01 5E 83 00 00 90 00 Gemplus GemXpresso 211is 3B 6E 00 00 80 31 80 66 B0 07 03 00 AC 01 83 00 90 00 e-payment card with topup system, propreteary by local bank http://www.klikbca.com/individual/silver/product.html?s=69 3B 6E 00 00 80 31 80 66 B0 84 0C 01 6E 01 83 00 90 00 Nordea (a Skandinavian bank) eID card http://linux.fi/wiki/Nordea_eID 3B 6E 00 00 80 31 80 66 B0 84 12 01 6E 01 83 00 90 00 Barclaycard Platinum VISA Inteligo debit card 3B 6E 00 00 80 31 80 66 B0 84 16 01 6E 01 83 00 90 00 UK "Barclaycard Gold VISA" with RFID 3B 6E 00 FF 00 62 00 00 57 41 56 41 4E 54 10 81 90 00 debit card (Visa Electron) issued by Nordea bank 3B 6E 00 FF 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 Estonian Identity Card (EstEID v1.0 warm) 3B 6E 00 FF 47 44 2D 47 50 2D 33 32 56 34 2D 44 45 53 Mastercard Ourocard Platinum from Banco do Brasil 3B 6F 00 00 00 66 4D 45 31 61 03 01 53 08 61 04 F0 90 00 Spanish University of Murcia smart ID card - Old version (M.Mar OS) - Also used by many others spanish universities 3B 6F 00 00 00 66 4D 45 31 B1 03 01 53 08 61 04 F0 90 00 Spanish UCAM University smart ID card - (M.Mar OS) - Also used by many others spanish universities 3B 6F 00 00 00 66 4D 45 66 80 03 .. 53 06 61 03 F0 90 00 Millenium Card (www.coruna.es/millennium) municipal city card for A Coruña, Spain. electronic wallet for paying services like parking meter or public service (bus) transportation. 3B 6F 00 00 00 66 4D 45 66 84 03 09 53 03 61 04 F0 90 00 spanish MAESTRO debit card, from Unicaja bank 3B 6F 00 00 00 67 2. 43 46 49 53 45 12 52 66 FF 81 90 00 Setec SetCOS 4.3.2 3B 6F 00 00 00 68 2B 42 05 02 46 49 53 45 31 C8 07 90 00 MAESTRO card, issued by Swedbank Estonia 3B 6F 00 00 00 68 2C 42 05 02 46 49 53 45 31 C8 07 90 00 VISA card, issued by Swedbank Latvia VISA card, issued by the Latvian bank "Latvijas Krajbanka" 3B 6F 00 00 62 6C 75 63 61 72 64 20 31 36 4B 42 2F 76 34 eID Blutronics Blucard 16K http://blucard.blutronics.com 3B 6F 00 00 80 31 C0 52 00 83 64 02 19 08 32 83 83 90 00 Bancomer Mexican Bank 3B 6F 00 00 80 31 C0 52 07 52 64 02 19 08 32 83 83 90 00 Santander (Bank) 3B 6F 00 00 80 31 C0 52 07 6F 64 02 19 04 32 83 83 90 00 Credit Card IXE Banco, México 3B 6F 00 00 80 31 C0 52 0A 47 64 02 B3 02 37 83 83 90 00 Visa debit card issued by the Spanish bank "tubancaja" 3B 6F 00 00 80 31 C0 52 13 2F 64 02 19 08 32 83 83 90 00 Cajamadrid-UCM (Madrid, Spain) Cash/Visa Electron 3B 6F 00 00 80 31 C0 52 16 B9 64 05 66 80 32 83 83 90 00 Banorte Mexican Bank 3B 6F 00 00 80 31 E0 5B 4E 4F 4B 00 00 00 00 00 00 02 00 Norsk-Tipping (Buypass) Monodex card 3B 6F 00 00 80 31 E0 5B 54 57 44 00 00 00 00 00 00 02 00 MasterCard credit card for Far Eastern Bank, Taiwan 3B 6F 00 00 80 31 E0 5B 59 54 4C 00 00 00 00 00 00 02 00 Turkish Armed Force - Daily Social Facility Usage Card 3B 6F 00 00 80 31 E0 6B 01 03 05 02 E0 55 55 55 55 55 55 American Express Gold Credit Card 3B 6F 00 00 80 31 E0 6B 02 01 02 07 01 55 55 55 55 55 55 Brazilian state bank: Caixa Econômica Federal debit card 3B 6F 00 00 80 31 E0 6B 04 03 03 04 05 55 55 55 55 55 55 Blue American Express Card 3B 6F 00 00 80 31 E0 6B 04 06 03 04 40 55 55 55 55 55 55 Blue American Express Card 3B 6F 00 00 80 31 E0 6B 04 06 05 02 17 55 55 55 55 55 55 Marx Software Security - Cryptoken M2048, MULTOS, Infineon SLE66CX, 64kByte http://www.marx.com/en/ 3B 6F 00 00 80 31 E0 6B 04 20 05 02 30 55 55 55 55 55 55 Buypass card for Norsk Tipping (http://norsk-tipping.no) 3B 6F 00 00 80 31 E0 6B 04 20 05 02 47 55 55 55 55 55 55 "Norsk-Tipping (Buypass) Monodex card" bought from http://buypass.no and used to access norwegian state services at http://altinn.no 3B 6F 00 00 80 31 E0 6B 04 20 05 02 58 55 55 55 55 55 55 Norsk Tipping online player card Norwegian government controlled betting company 3B 6F 00 00 80 31 E0 6B 04 21 05 02 61 55 55 55 55 55 55 NORSK TIPPING NORWAY http://www.norsk-tipping.no/ 3B 6F 00 00 80 31 E0 6B 05 08 05 02 83 55 55 55 55 55 55 Bank of Montreal debit card 3B 6F 00 00 80 31 E0 6B 05 12 05 02 87 55 55 55 55 55 55 American Express credit card 3B 6F 00 00 80 31 E0 6B 07 14 05 02 8A 55 55 55 55 55 55 SolutionsBanking Canada Interac debit card 3B 6F 00 00 80 31 E0 6B 84 06 03 04 31 55 55 55 55 55 55 Multos Developer Sample 3B 6F 00 00 80 31 E0 6B 84 06 0E 02 02 55 55 55 55 55 55 Multos Developer Sample 3B 6F 00 00 80 31 E0 6B 84 20 05 02 39 55 55 55 55 55 55 Multos 14D (2-0-10) 64K Developer Card 3B 6F 00 00 80 31 E0 6B 84 20 05 02 42 55 55 55 55 55 55 Multos 14Dc(6-0-13) 64K Dual-Interface Developer Card 3B 6F 00 00 80 5A .. 0[1-5] .. .. .. .. .. .. .. .. 82 90 00 Card supporting a Calypso application Rev 1 Navigo (France) transport card ACTV (Italy) transport card 3B 6F 00 00 80 5A 08 03 03 00 00 00 01 56 64 F6 82 90 00 transport bus/tram "atout.tag" semitag grenoble 3B 6F 00 00 80 5A 08 06 08 20 02 00 10 00 3E DC 82 90 00 CTS (Compagnie des Transports Strasbourgeois) to hold transportation tickets 3B 6F 00 00 80 5A 08 06 08 20 02 00 10 00 48 EA 82 90 00 french public transport card (www.cts-strasbourg.fr) 3B 6F 00 00 80 5A 08 06 08 20 02 00 92 35 1E 52 82 90 00 Public transport card of Lisbon (www.carris.pt) 3B 6F 00 00 80 5A 08 06 08 20 02 00 92 37 89 73 82 90 00 Lisboa Viva subway pass from Portugal 3B 6F 00 00 80 5A 08 06 08 20 02 23 92 16 D1 BD 82 90 00 "OPUS Card" Montreal's transit system by oberthur cardsystems 3B 6F 00 00 80 5A 08 06 08 20 02 23 92 1B 4B 59 82 90 00 "OPUS Card" Quebec's Bus system. 3B 6F 00 00 80 5A 0A 07 06 20 04 2B 10 5A 8F 94 82 90 00 Rav-Kav, Used by Israeli public transportation companies (Transport) 3B 6F 00 00 80 5A 28 13 02 10 12 2B 92 92 E6 42 82 90 00 Transport card in côte d'or France (mobigo) 3B 6F 00 00 80 5A 29 13 09 10 11 3[3,5] .. .. .. .. 82 90 00 MOBIB (reseau transport en commun Bruxelles, Belgique) http://www.uclouvain.be/sites/security/mobib.html Calypso application similar to French NAVIGO 3B 6F 00 00 80 5A 2C 23 C2 10 10 05 .. .. .. .. 82 90 00 MOBIB (reseau transport en commun Bruxelles, Belgique) 3B 6F 00 00 80 5A 2C 23 C3 10 10 05 71 00 04 2B 82 90 00 NMBS/SCNB Mobility card (basically a train subscription) MoBIB 3B 6F 00 00 80 5A 43 4F 4C 44 00 00 00 00 00 00 82 90 00 LBB Berlin, MasterCard (ADAC branding?) 3B 6F 00 00 80 66 45 46 01 38 18 03 53 02 31 10 82 90 00 Fábrica Nacional de Moneda y Timbre FNMT WG10 http://www.fnmt.es/es/html/tage/fichaTarjeta/fp1_ta_01.asp 3B 6F 00 00 80 66 45 46 01 38 18 03 53 02 31 24 82 90 00 Electronic purse of the Universidad Politecnica of Madrid (provided by Banco Santander) 3B 6F 00 00 80 66 45 46 01 38 18 03 53 07 61 04 82 90 00 Vitrasa Card municipal city card for Vigo, Spain. Electronic wallet for paying bus transportation. http://www.vitrasa.es/php/index.php 3B 6F 00 00 80 66 57 59 01 00 08 03 53 07 61 14 82 90 00 E-money Vitrasa Card - Public transport in Vigo 3B 6F 00 00 80 66 A2 03 02 02 3D 07 53 02 31 10 82 90 00 Electronic purse of the Universidad Politecnica of Madrid (provided by Banco Santander) 3B 6F 00 00 80 66 B0 07 01 01 77 07 53 02 31 10 82 90 00 University ID card (issued by Banco Santander Central Hispano) . Universidad Nacional de Educación a Distancia (UNED, Spain) http://www.uned.es/tarjeta . Universitat Politècnica de Catalunya (UPC.edu) https://www.upc.edu/identitatdigital . Universitat Ramon Llull (URL) http://www.url.edu/cont/url/carnet.php 3B 6F 00 00 80 66 B0 07 01 01 77 07 53 02 31 24 82 90 00 Santander 4B Maestro University of Santiago de Compostela. Spain Polytechnical University of Madrid, Spain 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00 ruToken-S (USB token) http://www.rutoken.ru/products/rutoken/rutoken-s/ 3B 6F 00 FF 52 53 41 53 65 63 75 72 49 44 28 52 29 31 30 RSA SecurID SID800 token 3B 6F 00 FF 53 46 53 45 2D 43 58 33 32 32 2D 56 18 02 02 Giesecke & Devrient SmartCafe Expert 2.0 3B 74 18 00 00 73 66 74 65 SafeSign from A.E.T. Europe B.V. Manufactured by Giesecke & Devrient (G&D) 3B 75 12 00 00 29 05 01 04 01 CAC Cryptographic Service Provider Axalto Cyberflex Access 64K V1 SM 4.1 3B 75 13 00 00 43 09 EA 90 00 Vitale 2 (french health card) 3B 75 13 00 00 44 09 EA 90 00 Carte Vitale 2 (Nouvelle version avec photo) 3B 75 13 00 00 45 09 EA 90 00 Carte Vitale 2 (French health card) 3B 75 13 00 00 9C 02 02 01 02 Cyberflex Access 32k v2 3B 75 94 00 00 62 02 02 0[1-3] 01 Schlumberger Cyberflex 32K e-gate Gemalto TOP US (product code HWP115278A) 3B 76 11 00 00 00 9C 11 01 02 02 Schlumberger Cyberflex Access 32K 3B 76 11 00 00 00 9C 11 01 02 03 RSA SecureID 5100 3B 76 12 00 00 00 9C 11 01 03 03 Precise BioMatch (TM) JavaCard (Schlumberger) www.precisebiometrics.com 3B 76 13 00 00 80 62 07 41 81 80 Generic mass produced Motorola smart card 3B 76 13 00 00 80 62 07 41 81 81 TransLink card (discontinued San Francisco Bay Area transit card) 3B 76 98 00 00 00 9C 11 01 01 02 CyberFlex Access 32 3B 78 12 00 00 47 C4 03 00 8F F1 90 00 Sattelite bg 23.5 East cryptoworks card 3B 78 12 00 00 54 C4 03 00 8F F1 90 00 Skylink irdeto from Towercom a.s. company irdeto card for the ORF (Austrian national public television) HD channels 3B 78 12 00 00 65 C4 05 00 8F F1 90 00 Digitürk Cryptoworks 3B 78 12 00 00 65 C4 05 05 8F F1 90 00 Turkie Digiturk Cryptoworks 3B 78 12 00 00 A0 C4 03 06 8F F1 90 00 ORF Digital (Irdeto/Cryptoworks) (pay tv) 3B 78 12 00 00 A0 C4 03 07 8F F1 90 00 IRDETO-Smartcard for crytoworks for austrian television (ORF), DVB-s 3B 78 12 00 00 A0 C4 06 00 8F F1 90 00 Cryptoworks/Nagravision decoding card 3B 78 12 00 00 A0 C4 06 05 8F F1 90 00 Satellite cardu, provider: UPC DTH, CAID: 0D02 3B 78 12 00 00 A0 C4 06 07 8F F1 90 00 Skylink CZ/SK - Cryptoworks 3B 78 13 00 00 00 73 C8 40 10 00 90 00 credit/debit card from issued by Finnish credit authority Luottokunta Oy 3B 79 18 00 00 80 54 43 4F 4C 44 82 90 00 LBB VISA Card 3B 79 94 00 00 59 01 01 0E 01 6B 01 02 A9 Vending machine payment card ('Necta' brand) 3B 79 98 00 00 50 01 01 04 01 00 01 01 A9 Gemalto PayFlex used in Aristocrat System 7000 Casino Management System (South Africa only) 3B 7A 11 00 00 48 44 32 2E 30 34 6F FF 90 00 User Smartcard provided with the Hiddn Crypto Adapter (www.hiddn.no) 3B 7A 11 00 02 48 4F 53 54 06 03 19 02 90 00 Swedish bankcard with Mastercard from ICA-banken 3B 7A 13 00 00 00 09 A5 05 01 00 B7 01 A6 01 "cleyris" authentication card. monpass.santé from Mutuelle Générale 3B 7A 18 00 00 73 66 74 65 20 63 64 31 34 34 Republic Slovenia e-Gov, Ministry of Public Administration SIGOV-CA, Slovenian Governmental Certification Authority 3B 7A 18 00 00 73 66 74 65 2D 63 64 30 38 30 HYPOnet online banking card / Croatia 3B 7A 18 00 FF 4A 43 4F 50 32 31 56 32 33 31 JCOP21 18K 3B 7A 94 00 00 80 65 A2 01 01 01 3D 72 D6 43 Gemplus GemXpresso Pro R3 E32 PK 3B 7A 96 00 00 80 65 A2 01 01 01 3D 72 D6 43 AGH University of Science and Technology (Poland) - Student Identity Card (ELS) (eID) 3B 7B .. 00 00 80 62 0. 51 56 46 69 6E 45 49 44 Setec SetCOS 5.1.0 3B 7B 18 00 00 00 31 C0 64 77 E3 03 00 82 90 00 Oberthur Cosmopolic 64K v5.2 D 3B 7B 18 00 00 00 31 C0 64 77 E9 10 00 01 90 00 Oberthur Card Systems: Cosmo 64 RSA V5.4 (ISK Key Set: 404142 .. 4E4F) 3B 7B 18 00 00 00 31 C0 64 C6 FC 10 00 07 90 00 Sberbank of the RUSSIAN federation 3B 7B 18 00 00 00 31 E8 54 27 E6 00 00 01 90 00 Oberthur ID-One COSMO 64k v.5 3B 7B 18 00 00 80 62 01 54 56 46 69 6E 45 49 44 FineID identity card for organizations http://fineid.fi/default.aspx?id=491 http://www.opensc-project.org/opensc/wiki/FinnishEid 3B 7B 94 00 00 80 62 1[1,2] 51 56 46 69 6E 45 49 44 Finnish Electronic ID card (fineid card www.fineid.fi) 3B 7B 94 00 00 80 65 B0 83 01 0[1,3] 74 83 00 90 00 Gemplus GemXpresso Pro R3 (E64 PK) 3B 7B 95 00 00 80 65 B0 83 01 04 74 83 00 90 00 Gemplus GemXpresso Pro 64K R3 FIPS v2 3B 7C 13 00 00 80 64 11 65 01 90 73 00 00 00 81 07 Universal Electronic Card (UEC Russia) (eID) 3B 7D 11 00 00 00 31 80 71 8E 64 52 D9 01 00 82 90 00 Oberthur Galactic V2 3B 7D 11 00 00 00 31 80 71 8E 64 77 E3 01 00 82 90 00 Oberthur Cosmo 64k RSA v5 3B 7D 11 00 00 00 31 80 71 8E 64 77 E3 02 00 82 90 00 Oberthur 64k v5/2.2.0 3B 7D 11 00 00 00 31 80 71 8E 64 86 D6 01 00 81 90 00 DOD-CAC 3B 7D 13 00 00 4D 44 57 2D 49 41 53 2D 43 41 52 44 32 IAS (Identification, Authentication, and electronic Signature) Premium, profil DGME from Sagem 3B 7D 18 00 00 00 31 80 71 8E 64 77 E3 01 00 82 90 00 Oberthur 64k v4/2.1.1 3B 7D 18 00 02 80 57 59 50 53 49 44 30 33 83 7F 90 00 Sagem YpsID s2 (SafeSign) 3B 7D 94 00 00 57 44 53 05 54 86 93 00 15 6A 5F 13 78 Idea Indian GSM operator SIM 3B 7D 94 00 00 57 44 53 63 96 86 93 00 9D F7 10 00 9D China Mobile SIM card 3B 7D 94 00 00 57 44 53 72 FD 86 93 11 01 06 75 5B 0F China Telecom UIM 64K 3B 7D 94 00 00 57 44 53 96 FA 86 93 03 B7 BF BF 5F 63 Airtel India SIM 3B 7D 94 00 00 80 31 80 65 B0 83 01 01 90 83 00 90 00 GemSafeXpresso 16k R3.2 3B 7D 94 00 00 80 31 80 65 B0 83 01 02 90 83 00 90 00 Gem e-Seal (GemSafeXpresso 32k R3.2) Gemalto Classic TPC - IS 3B 7D 94 00 00 80 31 80 65 B0 83 02 04 7E 83 00 90 00 GXP Pro R3.2 64K, GemSafe applet MPCOS v1.11 card issued by Czech National Bank dual card: chip used for electronic certificates (czech commercial bank use such card to sign money transfer orders sent to national clearing central) 3B 7D 94 00 00 80 31 80 65 B0 83 11 00 AC 83 00 90 00 GemCombiXpresso R4 72K 3B 7D 94 00 00 80 31 80 65 B0 83 11 00 C8 83 00 90 00 personal identity card (ID card) of Republic of Lithuania LuxTrust card 3B 7D 94 00 00 80 31 80 65 B0 83 11 48 C8 83 00 90 00 Online banking http://www.getinbank.pl/ 3B 7D 94 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00 GemXpresso R4 72K 3B 7D 95 00 00 80 31 80 65 B0 83 02 04 7E 83 00 90 00 Gemalto's Classic TPC HM CC Mifare 1K White PVC (Old name GemSafeXpresso 64K) 3B 7D 95 00 00 80 31 80 65 B0 83 11 00 C8 83 00 90 00 Portuguese ID card 3B 7D 95 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00 Portuguese identity card http://www.cartaodecidadao.pt 3B 7D 96 00 00 80 31 80 65 B0 83 11 00 C8 83 00 90 00 GEMALTO Clasic TPC IM CC 3B 7D 96 00 00 80 31 80 65 B0 83 11 11 AC 83 00 90 00 GEMALTO WM GX4 72 DHS TSA 3B 7D 96 00 00 80 31 80 65 B0 83 11 11 E5 83 00 90 00 eCPF (Cadastro de Pessoas Físicas) from Imprensa Oficial do Brasil 3B 7D 96 00 00 80 31 80 65 B0 83 11 13 AC 83 00 90 00 CAC card (GEMALTO GCX4 72K DI) 3B 7D 96 00 00 80 31 80 65 B0 83 11 17 D6 83 00 90 00 DoD CAC card issued Jan 14, 2010 GEMALTO TOPDLGX4 144 Geneva Conventions Identification Card 3B 7D 96 00 00 80 31 80 65 B0 83 11 40 AC 83 00 90 00 GemXpresso R4 64k 3B 7D 96 00 00 80 31 80 65 B0 83 11 40 C8 83 00 90 00 ING BusinessOnLine Bank eToken / Poland Gemalto Classic TPC - IM 3B 7D 96 00 00 80 31 80 65 B0 83 11 48 C8 83 00 90 00 Gemalto GemSafe V1 3B 7D 96 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00 Gemplus X-Presso Pro 64k 3B 7D 96 00 00 80 31 80 65 B0 83 11 C0 C8 83 00 90 00 TOP IM GX4 from Gemalto (was GemXpresso R4) Java Card 2.2.1 Global Platform 2.1.1 (amendment A) 3B 7D 96 00 00 80 31 80 65 B0 83 11 D0 A9 83 00 90 00 GemSafe V2 (2.04, GemP15-1) Gemplus GemXpresso Pro R3 E32PK Gemalto TOP IM GX4 3B 7D 96 00 00 80 31 80 65 B0 93 11 D0 A9 83 00 90 00 Gemalto Classic TPC (Trusted PKI Card) IM Classic TPC IM (PKCS#15): 12 x RSA key containers (standard profile) 3B 7D 96 00 00 80 31 80 65 B0 A3 11 00 C8 83 00 00 00 Handelsbanken BankID card (Swedish bank authentication) 3B 7D 96 00 00 80 31 80 65 B0 A3 11 00 C8 83 00 90 00 Swedish eID (Telia IP5a) http://www.telia.se/privat/katalog/VisaProdukt.do?productRef=/privat/produkter_tjanster/bredband/tjanster/sakerhetstjanster/teliae-legitimation.1537014385.product 3B 7E 11 00 00 00 6A 11 63 54 08 30 24 01 .. .. 21 90 01 Sagem Windows for smart cards 3B 7E 13 00 00 00 31 C0 71 C6 65 01 B0 01 04 40 83 90 00 BahnCard / Commerzbank MasterCard Credit Card 3B 7E 13 00 00 00 31 C0 71 C6 65 01 B4 01 04 40 83 90 00 Portugal Millennium BCP MAESTRO debit Card 3B 7E 13 00 00 00 6A 11 63 54 05 48 .. .. .. 01 22 90 00 Sagem Windows for smart cards 3B 7E 94 00 00 80 25 A0 00 00 00 28 56 80 10 12 00 01 16 CryptoPlus CS xg 3B 7E 94 00 00 80 25 A0 00 00 00 28 56 80 10 12 81 01 17 Česká Spořitelna SERVIS24 certificate card http://smallhacks.wordpress.com/2012/05/04/exploring-servis24-certificate-card-from-the-ceska-sporitelna-bank/ 3B 7E 94 00 00 80 25 A0 00 00 00 28 56 80 10 24 00 01 11 "OpenCard" - card issued by Prague local authority dual card: chip used for electronic certificates 3B 7E 94 00 00 80 25 D2 03 10 01 00 56 00 00 00 01 01 00 Personal identity card (ID card) of Czech Republic 3B 7E 94 00 00 80 31 80 66 47 50 91 45 03 13 83 0F 90 00 JTOP Trusted Logic 3B 7E 94 00 00 80 31 80 66 47 50 A4 45 05 11 83 0F 90 00 JTOP Trusted Logic 3B 7E 95 00 00 80 31 80 73 34 11 80 82 90 00 00 00 00 00 IAS (Identification, Authentication, and electronic Signature) Premium, profil DGME from Gemalto 3B 7F .. 00 00 00 6A 43 45 52 45 53 02 2C 34 02 ...03 90 00 Ceres ST v2 3B 7F .. 00 00 00 6A 43 45 52 45 53 02 2C 34 03 .. 03 90 00 Ceres ST v3 3B 7F 11 00 00 00 31 C0 53 CA C4 01 64 52 D9 04 00 82 90 00 DoD CAC, Oberthur CosmopolIC 32K V4 3B 7F 11 00 00 00 6A 43 45 52 45 53 02 2C 34 02 00 03 90 00 FNMT-CERES ST (Fábrica Nacional de Moneda y Timbre) 3B 7F 11 00 00 80 31 C0 52 14 1E 64 02 18 19 53 83 83 90 00 Advantis card http://www.sermepa.es/ingles/familiaadvantis.htm 3B 7F 11 00 00 80 31 C0 52 21 57 64 02 18 19 53 83 83 90 00 banking card (www.caixacatalunya.com) student id of Universitat Autonoma de Barcelona 3B 7F 11 00 00 80 31 C0 52 35 31 64 05 66 61 52 83 83 90 00 Oberthur Manufactured VISA Banking card (www.caixaterrassa.cat) 3B 7F 13 00 00 80 31 C0 52 02 71 64 05 62 34 70 83 83 90 00 Mastercard Debit Card issued by Caixa d'Enginyers (http://www.caixa-enginyers.com ) - Servired 3B 7F 13 00 00 80 31 C0 52 05 6E 64 02 53 04 36 83 83 90 00 Mastercard from Banc Sabadell in Spain 3B 7F 13 00 00 80 31 C0 52 07 7D 64 05 66 99 36 83 83 90 00 VISA CEPSA (Porque tu vuelves) from Spain http://www.porquetuvuelves.com/ Visa Credit Card issued by Citibank (http://www.citibank.es) - Servired 3B 7F 13 00 00 80 31 C0 52 08 49 64 05 66 99 36 83 83 90 00 Spanish bank called BBVA 3B 7F 13 00 00 80 31 C0 52 08 4B 64 05 66 94 61 83 83 90 00 Visa Electron Card from a Spanish bank called "Caja de Ingenieros" 3B 7F 13 00 00 80 31 C0 52 0A 45 64 02 B3 02 37 83 83 90 00 Bancaja online (Visa) Card , Entity : Bancaja Bank Spain (Bankia currently) 3B 7F 13 00 00 80 31 C0 52 0A A6 64 02 B3 02 37 83 83 90 00 Credit card Visa Classic by "La Caixa" (Spain) 3B 7F 13 00 00 80 31 C0 52 0A D6 64 05 66 94 61 83 83 90 00 Visa Credit Card issued by Caixa d'Enginyers (http://www.caixa-enginyers.com ) - Servired 3B 7F 13 00 00 80 31 C0 52 0B 71 64 05 66 98 36 83 83 90 00 OuroCard VISA International - Banco do Brasil 3B 7F 13 00 00 80 31 C0 52 0B BB 64 05 66 98 36 83 83 90 00 VISA OUROCARD Banco do Brasil S.A. 3B 7F 13 00 00 80 31 C0 52 0D 1E 64 05 66 94 61 83 83 90 00 Universitat Politecnica de Valencia ID Visa Electron Card, http://www.upv.es 3B 7F 13 00 00 80 31 C0 52 0D EA 64 05 66 94 61 83 83 90 00 Universitat Rovira i Virgili Identification Card This card enables his/her propietary to sign documents and to access to rooms, laboratories and classes. 3B 7F 13 00 00 80 31 C0 52 13 0B 64 02 B3 02 37 83 83 90 00 Visa Ourocard Platinum from Banco do Brasil 3B 7F 13 00 00 80 31 C0 52 13 66 64 05 66 98 36 83 83 90 00 VISA Platinum from Banco do Brasil 3B 7F 13 00 00 80 31 C0 52 14 D5 64 05 66 96 61 83 83 90 00 Visa Electron Debit Card issued by Spain Caja Madrid (www.cajamadrid.es) 3B 7F 13 00 00 80 31 C0 52 15 54 64 05 66 98 36 83 83 90 00 VISA Card from Banc Sabadell in Spain 3B 7F 13 00 00 80 31 C0 52 15 CB 64 05 66 96 61 83 83 90 00 Bank, Spanish group BANKIA (www.bankia.es) Visa, Servired Manufactured by Saetic (http://www.saetic.es/) 3B 7F 13 00 00 80 31 C0 52 16 20 64 05 66 96 61 83 83 90 00 Bank, Spanish BBVA (http://www.bbva.com/) Visa, Servired Manufactured by Oberthur (http://www.oberthur.com/) 3B 7F 13 00 00 80 31 C0 52 17 2D 64 02 B3 02 37 83 83 90 00 Spanish "cajamar" bank - Visa Electron Debit Card. Made by Tag Systems 3B 7F 13 00 00 80 31 C0 52 17 A0 64 02 B3 02 37 83 83 90 00 Credit card Visa Classic by "La Caixa" (Spain) 3B 7F 13 00 00 80 31 C0 52 17 B4 64 05 66 98 36 83 83 90 00 Credit Card Banorte International, México 3B 7F 13 00 00 80 31 C0 52 18 80 64 05 66 98 36 83 83 90 00 Visa Electron Debit Card issued by "la Caixa" 3B 7F 13 00 00 80 31 C0 52 18 97 64 02 B3 02 37 83 83 90 00 tool-valley (vale-pedagio) from Bradesco 3B 7F 13 00 00 80 31 C0 52 34 D6 64 05 66 94 61 83 83 90 00 Visa Credit Card issued by Spain Obsidiana (www.obsidiana.com) 3B 7F 13 00 00 80 31 C0 52 35 0D 64 02 61 18 63 83 83 90 00 Visa Credit Card issued by Spain Caja Madrid (www.cajamadrid.es) 3B 7F 13 00 00 80 31 C0 52 36 42 64 05 66 94 61 83 83 90 00 Visa debit card issued by Spain Caja Madrid bank 3B 7F 13 00 FF 45 43 4F 53 76 31 31 30 28 63 29 50 46 42 4D ECOS-Card [Experimental Card Operating System V.1.1] by Philipp Maier http://www.runningserver.com/?page=runningserver.content.download.ecos 3B 7F 14 00 00 80 41 00 57 4A 2D 49 44 4D 36 34 83 7F 90 00 Electronic CPF in Brazil (Cadastro de Pessoas Físicas) http://pt.wikipedia.org/wiki/E-CPF 3B 7F 18 00 00 00 31 C0 73 9E 01 0B 64 52 D9 03 00 82 90 00 Oberthur Galactic V3 (32k) 3B 7F 18 00 00 00 31 C0 73 9E 01 0B 64 52 D9 04 00 82 90 00 Oberthur CosmopolIC 32K v4 Fast ATR Oberthur Authentic 3B 7F 18 00 00 00 31 C0 73 9E 01 0B 64 52 D9 05 00 82 90 00 Oberthur 32k BIO 3B 7F 18 00 00 80 59 49 44 65 61 59 49 44 65 61 6C 5F 31 2E e-CNPJ issued by Fenacon (eID) http://www.fenacon.org.br 3B 7F 18 00 00 80 59 49 44 65 61 6C 5F 31 2E 34 83 07 90 00 Sagem YpsID s3 3B 7F 38 00 00 00 6A 43 45 52 45 53 02 2C 34 02 02 03 90 00 WG10 3B 7F 38 00 00 00 6A 43 45 52 45 53 02 2C 34 03 10 03 90 00 Used card Aragón government (Aragón - España) 3B 7F 38 00 00 00 6A 43 45 52 45 53 02 2C 34 03 20 03 90 00 TiDcarm (Region de Murcia) (Government of the Autonomous region of Murcia, Spain). http://www.carm.es 3B 7F 38 00 00 00 6A 44 4E 49 65 00 02 4C 34 01 13 0F 65 81 DNI (Documento Nacional de Identidad), Spanish ID Card 3B 7F 38 00 00 00 6A 44 4E 49 65 [1,2]0 02 4C 34 01 13 03 90 00 DNI electronico (Spanish electronic ID card) http://www.dnielectronico.es 3B 7F 96 00 00 00 31 B8 64 40 70 14 10 73 94 01 80 82 90 00 IAS/ECC Gemalto (eID) 3B 80 80 01 01 RFID - ISO 14443 Type B Electronic Passport 3B 81 1F 00 CC 52 eToken R2 2242 3B 81 80 01 80 80 RFID - ISO 14443 Type A - NXP DESFire or DESFire EV1 "Reiner LoginCard" (or "OWOK", how they name it, https://cardlogin.reiner-sct.com/) - they have been distributed by a german computer magazine ("Computer BILD") Belgium A-kaart (Antwerp citycard) 3B 82 00 55 19 GSM card 'Hi' (KPN brand) 3B 82 00 55 22 GSM-SIM TELE2 Smart (Estonia, prepaid or subscription) # cf SCL3711 Reference Manual: 3B 82 80 01 02 44 .. RFID - NFC Forum tag type 1 (Topaz) 3B 82 81 31 76 43 C0 02 C5 CardOS/M2 V2.01(SLE44CxxS) 3B 82 81 31 76 43 C1 03 C5 i.ti (ticket card for Collogne/Bonn) CardOS M2 Combi V2.02 (SLE44R42S) 3B 83 00 12 10 96 GSM-SIM T-Mobil D1 (900MHz) 3B 84 00 91 18 01 00 Proximus 075 Belgacom Mobile SIM 3B 84 80 01 00 00 90 00 95 German (test) passport issued in january 2010 3B 84 80 01 01 10 00 06 12 Snapper New Zealand (Type A) 3B 84 80 01 01 10 00 09 1D snapper (www.snapper.co.nz) prepaid 14443A cards 3B 84 80 01 01 11 20 03 36 Snapper Sprat (Transport) https://www.snapper.co.nz/snapper-store/ 3B 84 80 01 01 11 20 03 36 90 00 TMES Total Mobility (Wellington City Council, New Zealand) 3B 84 80 01 04 38 33 B1 BB Dutch passport 3B 84 80 01 47 77 F4 00 C1 True Money Touch Sim (Thailand) 3B 85 00 12 02 01 00 96 GSM-SIM Victorvox D1 (900MHz) 3B 85 00 87 25 01 38 02 GSM-SIM Viag Interkom E2 Loop GSM (1800MHz) 3B 85 00 87 25 01 39 00 GSM-SIM Telfort (Netherlands) 900 MHz 3B 85 40 20 68 01 01 .. .. Schlumberger Cryptoflex 8k 3B 85 40 20 68 01 01 00 00 Schlumberger Cryptoflex 8k (no RSA key generation) 3B 85 40 20 68 01 01 03 05 Schlumberger Cryptoflex Key Generation 3B 85 40 20 68 01 01 05 01 Schlumberger Cryptoflex 8k (with RSA key generation) 3B 85 40 FE 68 01 01 02 04 Axalto CryptoFlex 8K 3B 85 40 FF 63 01 01 03 01 Axalto Cryptoflex 16K 3B 85 80 01 20 63 CB A0 00 2C Visa card from Banque populaire du nord/Casden 3B 85 80 01 20 63 CB A1 00 2D AIB Visa Debit Card, manufcatured by Oberthur (NFC interface) 3B 85 80 01 20 63 CB A1 80 AD bpaid: bpost prepaid Mastercard (contactless) http://www.bpost.be/site/fr/residential/finance/bpaid/index.html 3B 85 80 01 4A 4D 52 54 44 41 JMRTD - Java Machine Readable Travel Document (ePassport emulator - http://jmrtd.org/) 3B 85 80 01 4D 79 45 49 44 78 MyEID 3B 85 80 01 80 73 84 21 40 12 Dutch Biometric Passport 3B 86 40 20 68 01 01 02 04 AC Activcard Gold, SchlumbergerSema Cryptoflex 8k 3B 86 80 01 00 04 9A EE 00 CA BD ASK CPL 528 3B 86 80 01 06 75 77 81 02 80 00 NXP Mifare DESFire EV1 8K / MF3ICD81 "OpenCard" - card issued by Prague local authority dual card: RFID (1k Mirfare) used for parkimeters and as public traffic ticket 3B 86 80 01 39 30 43 30 32 31 7E Chase Freedom VISA card 3B 86 80 01 44 49 20 30 32 4D 65 Lufthansa Miles & More Gold MasterCard PayPass Raiffeizen Bank, Russia, MasterCard paypass card 3B 86 80 01 4A 43 4F 50 33 30 12 Mifare ProX T=CL 3B 86 80 01 4A 43 4F 50 33 31 13 JCOP BIO 31 Contactless Card 3B 86 80 01 4B 4F 4E 41 12 20 3E Citibank Russia, Mastercard paypass 3B 86 80 01 4B 4F 4E 41 14 11 09 Mastercard paypass enabled credit card 3B 86 81 31 70 34 45 50 41 20 45 4B 08 Austrian Quick E-purse "Einreichkarte" (transfer card) (http://www.quick.at/) 3B 87 80 01 77 43 49 50 02 00 01 28 CIPURSE (transport) http://www.osptalliance.org/ 3B 87 80 01 80 31 80 73 96 12 80 40 Public transport: VRS Verkehrsverbund Rhein-Sieg (Germany, North_Rhine-Westphalia) http://www.vrsinfo.de/englisch/the-vrs/vrs-about-us.html 3B 87 80 01 80 31 C0 73 D6 21 C0 33 Sparkasse Hannover - German contactless GeldKarte (RFID, NFC, girogo) https://www.geldkarte.de/_www/en/pub/geldkarte/service_navigation/about_us.php 3B 87 80 01 C1 05 2F 2F 01 BC D6 A9 RFID - ISO 14443 Type A - NXP Mifare Plus 3B 87 81 31 40 43 4D 46 43 20 31 33 31 6F Telekom Paycard 3B 88 80 01 00 00 00 00 00 00 00 00 09 Personalausweis (German Identity Card) (eID) 3B 88 80 01 00 00 00 00 00 71 71 00 09 OPUS Public Transport card (Montreal, Quebec, Canada) - Oberthur based http://carteopus.info/ ACTV (Italy) transport card (RFID) 3B 88 80 01 00 00 00 00 00 81 91 10 09 Trenitalia (Italy) fidelity card "CartaFreccia" (RFID) 3B 88 80 01 00 00 00 00 B3 71 71 .0 .A Public transportation card in Riga, Latvia, called "e-Talons" http://etalons.rigassatiksme.lv/en/payments/activating_the_e-ticket/ Belgian MOBIB (transport) 3B 88 80 01 00 00 01 07 01 72 90 00 EC Belgian passport 3B 88 80 01 00 73 C8 40 00 00 90 00 62 NXP JCOP 31 V2.2 36K - RFID I/F Barclaycard Visa Wave & Pay - RFID I/F 3B 88 80 01 00 73 C8 40 13 00 90 00 71 Nokia 6131 NFC phone http://wiki.forum.nokia.com/index.php/Nokia_6131_NFC_-_FAQs Giesecke & Devrient’s (G&D) Sm@rtCafé Expert 3.1 3B 88 80 01 04 02 00 20 00 71 C1 40 DF Seoul Citypass+ T-Money Card 3B 88 80 01 31 CC CC 01 77 81 C1 00 0E Ideal v 1.4 (Transport) 3B 88 80 01 4A 43 4F 50 76 32 34 31 5E RFID - ISO 14443 Type A - NXP JCOP NXP J3A081 JavaCard (contactless interface) 3B 88 80 01 C9 12 07 52 02 00 81 10 14 electronic Tickes from the german Transport Association VGN (Verkehrsgemeinschaft Niederrhein) 3B 88 80 01 E1 F3 5E 11 77 83 95 00 35 French biometric ePassport issued in 2012 3B 88 80 01 E1 F3 5E 11 77 83 D5 00 75 German Passport (ePass) (issued June 2009) 3B 88 80 01 E1 F3 5E 13 77 83 D5 00 77 ePerso - German ID card (issued 2011) 3B 88 81 31 20 55 00 57 69 6E 43 61 72 64 29 SmartCard for Windows 1.0 3B 89 00 91 26 91 06 00 01 22 01 00 BT Cellnet SIM 3B 89 40 14 47 47 32 36 4D 35 32 38 30 GSM-SIM e-plus (1800MHz) 3B 89 80 01 00 64 04 15 01 02 00 90 00 EE German Passport (issued Apr 2007) 3B 89 80 01 45 4D 56 20 30 33 20 20 06 73 Lufthansa Miles & More Gold MasterCard PayPass (old one) Found a reference pointing to NXP http://www.usingrfid.com/news/read.asp?lc=l17607hx1500zk 3B 89 80 01 4A 43 4F 50 33 31 56 32 32 4A JCOP 31 v22 72K (with Mifare 1K emulation) - RFID I/F 3B 89 80 01 4A 43 4F 50 34 31 56 32 32 4D New Zealand e-Passport Philips Semiconductor JCOP41V22 3B 89 80 01 4D 54 43 4F 53 73 01 02 01 3F Contactless MTCOS http://www.masktech.de/ 3B 89 80 01 4D 54 43 4F 53 73 02 01 04 3A Biometric passport of Czech republic Biometric passport of Libya 3B 89 80 01 53 50 4B 32 35 44 49 90 00 DA SPK 2.5 D1 3B 89 80 01 80 67 04 12 B0 03 05 01 02 4C Austrian Passport 3B 8A 00 91 01 00 16 00 01 16 01 00 96 GSM-SIM T-Mobil D1 (900MHz) 3B 8A 00 91 01 00 16 00 01 20 01 00 96 GSM-SIM T-D1 prepaid (Xtra) 3B 8A 00 91 01 00 16 00 01 20 02 00 96 GSM-SIM (900MHz) card of the carrier t-mobile for their cellular network (phase 2+ with 3V) 3B 8A 00 91 91 00 16 00 01 03 0[3,4] 00 96 GSM-SIM max.mobil (since 2002: T-Mobile Austria) 3B 8A 00 91 91 00 17 00 01 07 02 00 96 GSM-SIM T-Mobile Austria 3B 8A 00 91 91 00 17 00 01 07 03 00 96 T-Mobile prepaid 2G SIM 3B 8A 00 91 91 00 17 00 01 08 01 00 96 GSM-SIM T-Mobile Austria 3B 8A 00 92 01 26 91 07 00 01 93 03 00 Kazakhstan driver licence 3B 8A 00 92 02 03 91 08 00 01 01 04 00 32K SIM Card from the austrian telecom "ONE" 3B 8A 01 4A 43 4F 50 34 31 56 32 32 31 FF JCOP41 3B 8A 80 01 00 64 05 5C 02 03 31 80 90 00 16 T-System Contactless Netkey Card 3B 8A 80 01 00 64 05 76 02 03 31 80 90 00 3C T-System Contactless TCOS Min 3B 8A 80 01 4A 43 4F 50 33 31 56 32 33 32 7A Snapper New Zealand (JCOP) 3B 8A 80 01 4A 43 4F 50 34 31 56 32 32 31 7F NXP JCOP 41 v2.2.1 72k RFID I/F 3B 8A 80 01 80 31 B8 73 84 01 E0 82 90 00 06 German ID Card - Personalausweis 3B 8A 80 01 80 31 F8 73 F7 41 E0 82 90 00 75 ePerso - German ID card 3B 8A 80 01 80 65 A2 01 01 01 3D 72 D6 43 97 Gemplus GemXpresso Pro R3 E32 PK (combi) 3B 8B 01 52 75 74 6F 6B 65 6E 20 44 53 20 C1 Rutoken ECP (DS) 3B 8B 01 52 75 74 6F 6B 65 6E 20 45 43 50 A0 Rutoken ECP 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2 Aktiv Rutoken lite token 3B 8B 80 01 00 31 C0 64 B0 FC 10 00 00 90 00 53 Thai Passport 2010, 2011 3B 8B 80 01 00 64 04 11 01 01 31 80 00 90 00 5A German Passport (issued Nov 2006) United Kingdom e-Passport 3B 8B 80 01 4E 58 50 2D 4E 46 43 20 32 00 00 38 TouchandTravel Touchpoint NFC-Card. Train-Station in Berlin. Use a NFC-compliant phone to check in for a ticket. 3B 8B 81 31 40 34 53 4D 41 52 54 53 43 4F 50 45 31 6D Zeeland kaart (Telecommunication) 3B 8C 80 01 04 43 FD .. .. .. .. .. .. .. .. .. .. RFID - NFC Forum tag type 3 (FeliCa) 3B 8C 80 01 50 01 BA 13 7E 00 00 00 00 B3 71 71 38 Mobib (Brussels public transportation card) 3B 8C 80 01 50 7F 9C 66 8A 00 00 00 00 00 81 87 54 NFC Mastercard issued by CSOB bank Czech Republic, first 4 digits 5168 3B 8C 80 01 59 75 62 69 6B 65 79 4E 45 4F 72 33 58 Yubikey Neo 3B 8C 80 01 80 5A 41 4B 44 65 44 4C 76 31 2E 30 AD Electronic driving license card http://www.akd.hr/?p=10 3B 8C 80 01 80 91 E1 65 D0 00 43 00 00 82 90 00 19 French passport (issued in late 2008) 3B 8C 80 01 80 91 E1 65 D0 00 46 00 00 82 90 00 1C US passport 3B 8D 80 01 0D 78 80 84 02 00 73 C8 40 13 00 90 FF F8 Nokia 6212 phone seen as NFC device 3B 8D 80 01 73 66 74 65 2D 63 64 30 38 30 2D 6E 66 3F G&D SmartCafe Expert 3.2 80K Dual 3B 8D 80 01 80 31 80 65 B0 07 02 02 89 83 00 90 00 75 JCOP30 contactless interface 3B 8E 80 01 0E 78 33 C4 02 00 64 04 15 01 02 00 90 FF 95 Spanish Passport 3B 8E 80 01 10 38 77 A7 80 91 E1 65 D0 00 42 00 00 82 72 Czech Republic e-Passport (issued Feb 2009) 3B 8E 80 01 13 78 80 80 02 46 49 4F 4D 4B 5F 30 30 31 4E MasterCard/PayPass Card issued by Czech FIO Banka a.s. (contactless chip) note the ASCII string 'FIOK_001N' embedded in ATR 3B 8E 80 01 52 46 49 44 49 4F 74 20 4A 43 4F 50 38 30 5A RFIDIOt G&D SmartCafe 80K 3B 8E 80 01 80 31 80 66 40 90 89 12 08 02 83 01 90 00 0B ISO 14443B Type T = CL Infineon Card 3B 8E 80 01 80 31 80 66 B0 07 03 00 AC 01 83 00 90 00 52 BCA Flazz Card (Bank) www.bca.com 3B 8E 80 01 80 31 80 66 B0 84 0C 01 6E 01 83 00 90 00 1D Barclaycard Platinum contact/contactless (wave) 3B 8E 80 01 80 31 80 66 B0 84 12 01 6E 01 83 00 90 00 03 Contactless Barclaycard Visa 3B 8E 80 01 80 91 91 31 C0 64 77 E3 03 00 83 82 90 00 1C Belgian Passport Thai Passport 2005 3B 8E 80 01 80 91 E1 31 C0 64 77 E3 03 00 83 82 90 00 6C Belgian Passport 3B 8F 01 80 25 A0 00 00 00 56 57 44 4B 34 30 30 06 00 B7 SafeNet IKey4000 3B 8F 80 01 00 31 B8 64 04 B0 EC C1 73 94 01 80 82 90 00 0E Contactless CPS v3 Card (Carte de Professionnel de Santé) 3B 8F 80 01 43 55 32 69 AA 20 20 20 20 20 20 20 20 20 20 E9 UBS Access Card (Mobile Online Banking, NFC, Switzerland) 3B 8F 80 01 45 50 41 00 00 00 00 .. .. .. .. 00 00 .. .. .. Austrian Quick E-purse contactless (http://www.quick.at/) 3B 8F 80 01 52 46 49 44 49 4F 74 20 4A 43 4F 50 20 33 36 76 RFIDIOt JCOP 36K Blank (http://rfidiot.org) 3B 8F 80 01 52 46 49 44 49 4F 74 20 4A 43 4F 50 20 37 32 76 RFIDIOt JCOP 72K Blank (http://rfidiot.org) 3B 8F 80 01 52 46 49 44 49 4F 74 20 4A 43 4F 50 37 32 72 24 RFIDIOt JCOP 72K RANDOM_UID Blank (http://rfidiot.org) # Cf PCSC standard, Part 3, Chapter 3.1.3.2.3.2, and Part 3 Supplemental # Document # http://www.pcscworkgroup.com/specifications/specdownload.php 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 01 00 00 00 00 .. Mifare Standard 1K (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 02 00 00 00 00 .. Mifare Standard 4K (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 03 00 00 00 00 .. Mifare Ultralight (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 04 00 00 00 00 .. SLE55R_XXXX (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 06 00 00 00 00 .. SR176 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 07 00 00 00 00 .. SRI X4K (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 08 00 00 00 00 .. AT88RF020 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 09 00 00 00 00 .. AT88SC0204CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 0A 00 00 00 00 .. AT88SC0808CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 0B 00 00 00 00 .. AT88SC1616CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 0C 00 00 00 00 .. AT88SC3216CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 0D 00 00 00 00 .. AT88SC6416CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 0E 00 00 00 00 .. SRF55V10P (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 0F 00 00 00 00 .. SRF55V02P (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 10 00 00 00 00 .. SRF55V10S (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 11 00 00 00 00 .. SRF55V02S (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 12 00 00 00 00 .. TAG_IT (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 13 00 00 00 00 .. LRI512 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 14 00 00 00 00 .. ICODESLI (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 15 00 00 00 00 .. TEMPSENS (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 16 00 00 00 00 .. I.CODE1 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 17 00 00 00 00 .. PicoPass 2K (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 18 00 00 00 00 .. PicoPass 2KS (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 19 00 00 00 00 .. PicoPass 16K (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 1A 00 00 00 00 .. PicoPass 16Ks (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 1B 00 00 00 00 .. PicoPass 16K(8x2) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 1C 00 00 00 00 .. PicoPass 16KS(8x2) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 1D 00 00 00 00 .. PicoPass 32KS(16+16) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 1E 00 00 00 00 .. PicoPass 32KS(16+8x2) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 1F 00 00 00 00 .. PicoPass 32KS(8x2+16) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 20 00 00 00 00 .. PicoPass 32KS(8x2+8x2) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 21 00 00 00 00 .. LRI64 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 22 00 00 00 00 .. I.CODE UID (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 23 00 00 00 00 .. I.CODE EPC (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 24 00 00 00 00 .. LRI12 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 25 00 00 00 00 .. LRI128 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 26 00 00 00 00 .. Mifare Mini (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 27 00 00 00 00 .. my-d move (SLE 66R01P) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 28 00 00 00 00 .. my-d NFC (SLE 66RxxP) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 29 00 00 00 00 .. my-d proximity 2 (SLE 66RxxS) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 2A 00 00 00 00 .. my-d proximity enhanced (SLE 55RxxE) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 2B 00 00 00 00 .. my-d light (SRF 55V01P) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 2C 00 00 00 00 .. PJM Stack Tag (SRF 66V10ST) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 2D 00 00 00 00 .. PJM Item Tag (SRF 66V10IT) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 2E 00 00 00 00 .. PJM Light (SRF 66V01ST) (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 2F 00 00 00 00 .. Jewel Tag (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 30 00 00 00 00 .. Topaz NFC Tag (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 31 00 00 00 00 .. AT88SC0104CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 32 00 00 00 00 .. AT88SC0404CRF (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 33 00 00 00 00 .. AT88RF01C (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 34 00 00 00 00 .. AT88RF04C (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 35 00 00 00 00 .. i-Code SL2 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 00 00 00 00 00 00 00 68 NFC/RFID "Android Beam" mode on a Sony Xperia Ion 3B 8F 80 01 80 4F 0C A0 00 00 03 06 01 .. .. 00 00 00 00 .. RFID - ISO 14443 Type A Part 1 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 02 .. .. 00 00 00 00 .. RFID - ISO 14443 Type A Part 2 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 .. .. 00 00 00 00 .. RFID - ISO 14443 Type A Part 3 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 00 00 00 00 00 6B buss/train pass for use with Skånetrafiken (www.skanetrafiken.se) busses and trains. public libary of Düsseldorf, http://www.duesseldorf.de/stadtbuechereien/ specialized Mifare Ultralight card 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A Philips MIFARE Standard (1 Kbytes EEPROM) http://www.nxp.com/#/pip/pip=[pfp=41863]|pp=[t=pfp,i=41863] RFID - ISO 14443 Type A - Transport for London Oyster ACOS5/1k Mirfare RFID - ISO 14443 Type A - NXP Mifare card with 1k EEPROM vivotech ViVOcard Contactless Test Card Bangkok BTS Sky SmartPass 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 02 00 00 00 00 69 RFID - ISO 14443 Type A - NXP Mifare card with 4k EEPROM Bangkok Airport Link Dutch ov-chipkaart (public transportation) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68 RFID - ISO 14443 Type A - NXP Mifare Ultralight or UltralightC 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 FF 00 00 00 00 94 ACTV (Italy) prepaid transport ticket "NFC Tag" — Sony's "Smart Tags" 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 F0 04 00 00 00 00 9F NFC FORUM TYPE 1 TAG www.inovision-group.com/topaz ISO/IEC 14443A - 96 Bytes read/write NFC/RFID IC mandated by NFC Forum as the Type 1 NFC Forum Tag Format. 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 F0 11 00 00 00 00 8A Bangkok Metro (MRT) HTC One X Android phone (European edition "endaevoru") 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 FF 40 00 00 00 00 D4 Nokia N9 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 FF 88 00 00 00 00 1C Infineon Mifare SLE 66R35 http://www.infineon.com/cms/en/product/channel.html?channel=ff80808112ab681d0112ab69686e01ee "Old" "unlimited trips" card for Moscow Metro (underground) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 05 .. .. 00 00 00 00 .. RFID - ISO 14443 Type B Part 1 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 06 .. .. 00 00 00 00 .. RFID - ISO 14443 Type B Part 2 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 07 .. .. 00 00 00 00 .. RFID - ISO 14443 Type B Part 3 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 09 .. .. 00 00 00 00 .. RFID - ISO 15693 Part 1 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A .. .. 00 00 00 00 .. RFID - ISO 15693 Part 2 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 1C 00 00 00 00 7E RFID - HID iCLASS 16K CL 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B .. .. 00 00 00 00 .. RFID - ISO 15693 Part 3 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 00 00 00 00 00 63 RFID - ISO 15693 - EM Microelectronic-Marin SA 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 0E 00 00 00 00 6D RFID - ISO 15693 - Infineon 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 12 00 00 00 00 71 RFID - ISO 15693 - Texas Instrument 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 13 00 00 00 00 70 Discovery kit for M24LR04E (http://www.st.com/m24lr04e-discovery) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 14 00 00 00 00 77 Philips ICode RFID - ISO 15693 - Philips Semiconductors 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0C .. .. 00 00 00 00 .. RFID - ISO 15693 Part 4 (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0D .. .. 00 00 00 00 .. Contact (7816-10) I2C (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0E .. .. 00 00 00 00 .. Contact (7816-10) Extended I2C (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0F .. .. 00 00 00 00 .. Contact (7816-10) 2WBP (as per PCSC std part3) 3B 8F 80 01 80 4F 0C A0 00 00 03 06 10 .. .. 00 00 00 00 .. Contact (7816-10) 3WBP (as per PCSC std part3) 3B 8F 80 01 80 5A 08 03 03 00 00 00 01 52 43 21 82 90 00 FF Carte Mode Pass (Used in Clermont-Ferrand, France, to store personal information and T2C subscription. T2C is the public transport company of Clermont-Ferrand: http://www.t2c.fr/) 3B 8F 80 01 80 5A 08 03 03 00 00 00 01 D3 37 72 82 90 00 59 French Transport Card Pass'bus (used in Metz, France) http://www.tcrm-metz.fr/ 3B 8F 80 01 80 91 E1 31 80 65 B0 83 11 00 AC 83 00 90 00 B7 GemCombiXpresso R4 72K (contactless interface) 3B 8F 80 01 80 91 E1 31 80 65 B0 83 11 11 AC 83 00 90 00 A6 GEMALTO WM GX4 72 DHS TSA (contactless interface) 3B 90 16 01 87 BIFIT USB-Token iBank2key 3B 90 95 80 1F C3 59 Dai Nippon Printing Co., DNP Standard-J T3.1 3B 91 94 80 1F 03 23 BA China black(COS) SIM, does not support clock stop 3B 95 .. 40 FF 62 01 01 .. .. Schlumberger Cryptoflex e-gate 3B 95 15 40 .. 68 01 02 .. .. Schlumberger CryptoFlex 8k v2 3B 95 15 40 FF 63 01 01 00 00 Cryptoflex 16K 3B 95 18 40 FF 62 01 02 01 04 Schlumberger Cryptoflex 32K e-gate 3B 95 18 40 FF 62 04 01 01 05 Schlumberger CryptoFlex 32Ko V1 3B 95 18 40 FF 64 02 01 01 02 Schlumberger CryptoFlex 32Ko 3B 95 94 40 FF 63 01 01 02 01 Schlumberger Cryptoflex 16Ko 3B 95 95 40 FF AE 01 01 02 03 Axalto Cyberflex Access 64K v2a SM 2.3 3B 95 95 40 FF AE 01 03 00 00 Axalto - Cyberflex 64K Gemalto TOP IM FIPS CY2 (product code HWP115291A) 3B 95 95 40 FF D0 00 1A 01 01 Cyberflex Access 64k (v3) 3B 95 95 40 FF D0 00 31 01 01 Cyberflex Access E-gate V3 3B 95 95 40 FF D0 00 54 01 3. Portuguese identity card, http://www.cartaodecidadao.pt 3B 96 18 80 01 80 51 00 61 10 30 9F 00 61 10 30 9E Atmel/Athena T0 PC/SC Compliance Test Card No. 1 (warm reset) 3B 97 11 C0 FF B1 FE 35 1F 83 A5 05 01 01 02 A3 01 5F digital chronotachygraphe card: conducteur/driver, entreprise, contrôleur/controler et atelier/workshop, 2006-2010 manufactured by Imprimerie Nationale, distributed by Chronoservices 3B 97 13 C0 FF B1 FE 35 1F 83 A5 05 01 01 02 A3 01 5D digital chronotachygraphe card: conducteur/driver, entreprise, contrôleur/controler et atelier/workshop, 2005-2006 manufactured by Imprimerie Nationale, distributed by Chronoservices 3B 97 95 C0 2A 31 FE 35 D0 00 48 01 05 A3 11 3C digital chronotachygraphe card: conducteur/driver, entreprise, contrôleur/controler et atelier/workshop, 2010-2015 manufactured by Imprimerie Nationale, distributed by Chronoservices 3B 98 13 40 0A A5 03 01 01 01 AD 13 11 Belgium Electronic ID card 3B 98 94 00 93 91 14 01 0A 06 06 06 Orange Spain 64k Sim card 3B 98 94 40 0A A5 03 01 01 01 AD 13 10 Belgium Electronic ID card 3B 98 94 80 1F C2 32 2E 31 30 31 14 01 40 28 CMCC operator UICC (Telecommunication) 3B 98 95 00 93 94 04 04 03 03 03 03 T-Mobile MVNO SIM card 3B 98 95 40 FF D0 00 48 01 01 AD 13 21 Belgian Eid virtual test card https://env.dev.eid.belgium.be/prepcard.php 3B 98 96 00 80 31 C0 72 F7 41 81 07 Activ Rutoken Magistra 3B 98 96 00 93 94 03 07 03 04 04 04 SIM card 3B 98 96 00 93 94 03 08 05 03 03 03 SIMple Mobile SIM Card http://www.simplemobile.com 3B 99 18 00 11 88 22 33 44 55 66 77 60 sysmocom sysmoSIM-GR1 3B 99 94 00 91 08 91 06 00 01 06 06 00 GSM-SIM Orange-UK (1800) 3B 99 94 00 91 99 93 12 00 01 16 02 00 ORGA test systems - GSM Phase 2+ Test SIM 3B 9A 94 00 91 01 00 17 00 01 23 10 00 96 GSM-SIM Victorvox D1 (900MHz) 3B 9A 94 00 91 01 00 17 00 01 23 11 00 96 GSM-SIM Card T-D1 (900MHz) 3B 9A 94 00 91 01 00 17 00 01 26 06 00 96 T D1 GSM card 3B 9A 94 00 92 02 75 93 11 00 01 02 02 .. SuperSIM 3B 9A 96 00 92 01 36 93 17 00 02 04 03 00 GSM-SIM EMT "Simpel" (prepaid, Estonia) https://www.emt.ee/web/simpel 3B 9A 96 00 92 01 48 93 17 00 02 12 04 00 SIM Card Carrefour Mobile (Belgium) 3B 9A 96 00 92 01 66 93 17 00 02 12 04 00 GSM SIM Bite.lv prepaid "Toxic"; 2008 3B 9A 96 00 92 03 49 93 16 00 01 21 01 00 GSM-SIM card of the Austrian provider Yesss! (http://www.yesss.at) 3B 9A 96 C0 10 31 FE 5D 00 64 05 7B 01 02 31 80 90 00 76 German driver card for the digital tachographs (mandatory for trucks above 3.5 tons) runnig STARCOS 3.4 and prouced by Giesecke & Devrient GmbH http://www.gi-de.com/deu/de/products_and_solutions/products/tachograph_cards/Fahrtenschreiberkarten-5890.jsp 3B 9B 95 80 1F 47 80 31 A0 73 BE 21 00 53 27 11 02 4C SIM TELE2 Sweden 3B 9B 95 80 1F 47 80 31 A0 73 BE 21 00 53 34 99 05 D0 GSM-SIM EMT "Diil", prepaid (Estonia) 3B 9C 13 11 81 64 72 65 61 6D 63 72 79 70 74 00 04 08 XPlusTV & INXCT Access Card-9 (FIRECrypt) 3B 9C 13 11 81 64 72 65 61 6D 63 72 79 70 74 90 05 99 FireCrypt, access card 9 (Pay TV) 3B 9D 11 40 23 00 68 10 11 4D 69 6F 43 4F 53 00 90 00 MioCOS 1.0 3B 9D 94 40 23 00 68 20 01 4D 69 6F 43 4F 53 00 90 00 Miotec (http://www.miotec.fi) smartcard running Miocos 2.0 on an Atmel AT90SC646 3B 9D 95 80 1F C3 80 31 E0 52 4B 54 62 11 03 73 FE 21 1B 8F KT WiBro UICC (2.3 GHz mobile WiMAX in South Korea) 3B 9D 95 80 1F C3 80 31 E0 73 FE 21 1B 65 D0 00 57 02 62 30 Gemalto NFC enabled (acquired through the Simagine contest) 3B 9D 95 80 1F C3 80 63 AF 03 A0 73 1A 21 1B 83 0F 90 00 F4 Greece TIM GSM SIM 3B 9D 95 80 1F C3 80 73 1A 21 1B 63 AF 07 A7 83 0F 90 00 F7 GemXplore 3G 3B 9D 95 80 1F C7 80 73 1A 21 1B 63 AF 06 A6 83 0F 90 00 F3 Orange UK GSM/UMTS SIM 3B 9D 95 80 1F C7 80 73 1A 21 1B 63 AF 09 A9 83 0F 90 00 F3 Estonian GSM operator TELE2 (WPKI eID support) 3B 9E 94 80 1F 42 80 31 00 73 BE 21 10 66 54 59 53 04 4C 25 CF MCI (Mobile Communication Company of Iran) SIM 3B 9E 94 80 1F C3 80 31 E0 73 FE 21 1B 66 D0 00 17 B4 00 00 A5 Vodafone Ireland SIM card 3B 9E 94 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 6C 02 5F 00 33 Vivo Brasil SIM Card 3B 9E 94 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 6C 06 34 00 5C SIM card SFR 250 128ko 3B 9E 94 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 7A 00 00 00 78 GaduAIR (Poland) - Subscriber Identity Module (SIM) 3B 9E 95 80 1F C3 80 31 A0 73 BE 21 13 67 29 02 01 04 04 CD 39 H3G (?) UMTS USIM card J+ SWIM WIB UMTS SIM Test card http://www.exceldata.es/microprocess/j%2Bswinwibusim.html 3B 9E 95 80 1F C3 80 31 E0 73 FE 21 1B 66 D0 00 29 F4 01 00 DB Vodafone (UK) Pay As You Talk SIM 3B 9E 95 80 1F C3 80 31 E0 73 FE 21 1B 66 D0 00 49 00 00 00 4E UK O2 Unlimited Prepay GSM/UMTS USIM 3B 9E 95 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 07 00 1E 00 1A H3G (Ireland, UK) UMTS USIM card 3B 9E 95 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 26 1C 01 00 38 GSM-SIM Telefonica Movistar, contract (Spain) http://www.movistar.es/ 3B 9E 95 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 28 C4 00 00 EF H3G (Italy) UMTS USIM card 3B 9E 95 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 49 00 00 00 4A Rogers 3G SIM card 3B 9E 95 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 7A 00 00 00 79 Simyo SIM Card, Spanish Mobile Company Hi SIM 3B 9E 95 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 81 C8 0D 00 47 ESEYE ES4520 Anynet MFF Embedded SIM 3B 9E 95 C0 0A 1F C6 80 31 E0 73 FE 21 1B 66 D0 01 83 0D 58 81 1E Mobile Paypass G199 NFC 3B 9E 96 80 1F 83 80 31 E0 73 FE 21 12 66 55 57 4E 41 32 33 91 TDC mobile UICC (Telecommunication) 3B 9E 96 80 1F C3 80 31 E0 73 FE 21 1B 66 D0 01 7B 98 0D 00 EB Lycamobile Pay As You Go SIM 3B 9E 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 28 24 01 00 0D United Mobile SIM 3B 9E 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 00 6C 0C 72 00 12 Orange Austria GSM/3G SIM: "Mobiles Internet" 3B 9E 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 01 77 49 0D 00 32 UK simcard - O2 unlimited prepay 3G (4DM) USIM (EXT) 3B 9E 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 01 77 97 0D 00 SIM Free Mobile 3B 9E 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 01 77 97 0D 00 EC SIM Free Mobile 3B 9F .. 80 1F C3 00 68 1. 44 05 01 46 49 53 45 31 C8 .. 90 00 .. Setec SetCOS 4.4.1 3B 9F 11 40 60 49 52 44 45 54 4F 20 41 43 53 20 56 35 2E 30 "La7 Cartapiù" for DVB-T decoders, IRDETO access 3B 9F 11 40 60 49 52 44 45 54 4F 20 41 43 53 20 56 35 2E 37 dahlia Tv Italian Provider 3B 9F 11 40 60 49 52 44 45 54 4F 20 41 43 53 20 56 36 2E 30 skylink, Pay TV, http://www.skylink.cz T-Mobile Czech Republic, Irdeto Satellite TV encryption card 3B 9F 11 80 1F C3 80 31 E0 73 FE 21 1B 64 07 53 63 01 82 90 00 74 Cingular SIM 3B 9F 11 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 06 A6 83 0F 90 00 0D i-SmartSim GSM phone SIM-lock bypass card http://i-smartsim.com/component/portfolio/7-unlock-sim/7-universal-unlock-sim-f300gold 3B 9F 11 C0 0A 1F C7 80 31 E0 73 FE 21 1B 63 F1 00 AD 83 0F 90 00 59 GemXplore Generation 3G 3B 9F 13 81 31 FE 45 80 67 55 45 4B 41 45 12 61 31 80 73 B3 A1 80 1C UKiS 1.2.1 on YITAL chip 3B 9F 13 81 31 FE 45 80 67 55 45 4B 41 45 12 64 31 80 73 B3 A1 80 19 UKiS 1.2.1 on HNEC chip 3B 9F 13 81 31 FE 45 80 67 55 45 4B 41 45 12 65 31 80 73 B3 A1 80 18 UKiS 1.2.1 on SMIC chip 3B 9F 13 81 B1 80 37 1F 03 80 31 F8 69 4D 54 43 4F 53 70 02 01 02 81 07 86 Swiss Health Insurance Card 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 03 83 95 00 80 55 Nagravision Betacrypt 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 03 84 55 6D FF 80 Nagravision Betacrypt 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 03 84 55 FF 80 6D TV smart card Sky Germany BEtacrypt 1702 http://providers.wikidot.com/sky-deutschland 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 20 56 34 2E 31 9D Foxtel paytv decoder in Australia acs 4.1 Irdeto2 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 20 56 35 2E 33 9E red dragoncard chid 0604- Austar provider (pay tv) 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 20 56 35 2E 34 99 Nova Greece package on satellite 13E Hotbird 3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 20 56 35 2E 37 9A irdeto2 www.digiturk.com.tr (Pay TV) 3B 9F 94 40 1E 00 67 .. 43 46 49 53 45 10 52 66 FF 81 .. .. SLE66CX160S running SETCOS 4.3.1 Revision A 3B 9F 94 40 1E 00 67 11 43 46 49 53 45 10 52 66 FF 81 90 00 Setec / FINEID SETEC Instant EID 3B 9F 94 40 1E 00 67 16 43 46 49 53 45 10 52 66 FF 81 90 00 RSA SecurID 3100 or Utimaco Safeware Smartcard SetCOS 4.3.1 Revision Unknown 3B 9F 94 80 1F C3 00 68 10 44 05 01 46 49 53 45 31 C8 07 90 00 18 SetCOS 4.3.0 32K RSA Instant EID IP2 SETEC SetCard 32K PKI Evaluated SetCOS 4.4.1a2 3B 9F 94 80 1F C7 80 31 E0 73 FE 21 13 57 49 05 0C 86 98 60 18 CC China Unicom USIM 128K 6131H 3B 9F 94 80 1F C7 80 31 E0 73 FE 21 1B 64 06 81 01 00 82 90 00 45 Mobicarte Orange 3B 9F 94 80 1F C7 80 31 E0 73 FE 21 1B 64 07 56 42 00 82 90 00 D0 SIM mobi orange 3B 9F 95 80 1F 43 80 31 E0 73 36 21 13 57 4A 33 0E 09 31 41 00 A9 GSM-SIM Elisa (Estonia, WPKI eID support) 3B 9F 95 80 1F 43 80 31 E0 73 36 21 13 57 4A 33 0E 0C 31 41 00 AC Vodafone SIM (mobile phone) 3B 9F 95 80 1F 43 80 31 E0 73 36 21 13 57 4A 33 0E 10 31 41 00 B0 SIM card O2 (UK, Pay-As-You-Go) Tesco Mobile (UK) SIM 3B 9F 95 80 1F 43 80 31 E0 73 F6 21 13 57 4A 43 05 21 31 41 00 3A GSM SIM AT&T US 3B 9F 95 80 1F 47 80 31 E0 73 36 21 13 57 4A 33 0E 10 31 41 00 B4 Sonera Easy (Telecommunication) http://www.sonera.fi/ 3B 9F 95 80 1F 47 80 31 E0 73 36 21 13 57 4A 33 0E 11 31 41 00 B5 Telus 3G SIM Card 3B 9F 95 80 1F C3 80 31 A0 73 BE 21 13 67 47 01 03 01 02 00 00 99 T-Mobile (UK) SIM Fresh Mobile (UK) SIM 3B 9F 95 80 1F C3 80 31 A0 73 BE 21 13 67 47 01 05 01 04 00 00 99 T-Mobile Nederlands http://www.tmobile.nl 3B 9F 95 80 1F C3 80 31 A0 73 BE 21 13 67 D0 02 03 09 01 00 00 06 GSM, T-Mobile (Germany) 3B 9F 95 80 1F C3 80 31 A0 73 BE 21 13 67 D0 02 03 31 05 00 00 3A T-MOBILE CZ GSM card 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 57 3F 86 60 46 CD 00 01 B4 China Unicom USIM 128K 1295E 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 63 E2 09 A9 83 0F 90 00 8D GSM-SIM EMT (Estonia, WPKI eID support) 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 63 E2 0A D2 83 0F 90 00 F5 GSM, Vodafone (Germany) 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 64 06 90 61 00 82 90 00 31 3G SIM card from AT&T USA 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 64 06 90 62 00 82 90 00 32 AT&T GoPhone SIM Card 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 64 9B 4D 01 11 82 90 00 00 Singular (now AT&T) 3G GSM SIM Card 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B B3 E2 01 74 83 0F 90 00 88 Gemplus GemXplore 3G USIM 3B 9F 95 80 1F C7 80 31 A0 73 BE 21 13 67 D0 02 04 09 01 00 00 05 T-Mobile SIM card issued in Germany 2012 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 57 12 29 11 02 01 00 00 C2 sysmocom sysmoUSIM-GR1 http://sysmocom.de/ 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 57 4A 33 05 2E 32 34 00 SIM card 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 57 4A 33 0E 07 32 30 00 99 Bell Canada 3G SIM 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 57 4A 33 0E 19 32 33 00 84 WIND Mobile SIM Card 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 57 4A 33 0E 1A 32 36 00 82 TELUS 3G SIM Card 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 63 55 10 AA 83 07 90 00 24 2degrees NFC (Telecommunication) http://www.2degreesmobile.co.nz/home 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 13 67 94 03 11 00 00 02 03 5C AT&T (US) GSM SIM 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 03 94 83 0F 90 00 BE Telenet N.V. Walk & Talk SIM Card Belgium 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 04 A5 83 0F 90 00 88 Cingular "64Ksmartchip" GSM SIM Telia GSM/3G (Swedish operator) 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 06 A6 83 0F 90 00 89 TracFone (US) Net10 GSM SIM card Simyo (Germany) GSM SIM card H3G (Italy) UMTS USIM card 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 07 A7 83 0F 90 00 89 SIM NRJ Mobile H3G (UK) UMTS USIM card Orange UK GSM/UMTS SIM 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 08 A8 83 0F 90 00 89 H3G (Sweden) UMTS USIM card 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 09 A9 83 0F 90 00 89 GSM SIM Vodafone NL postpaid 3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 65 9F 01 09 02 04 81 05 C4 2degrees mobile SIM card (from http://www.2degreesmobile.co.nz/) 3B 9F 95 81 31 FE 9F 00 65 46 53 05 .. 06 71 DF 00 00 00 .. .. .. .. Feitian PKI (http://www.ftsafe.com/products/PKI-Card.html) FTCOS/PK-01C 3B 9F 95 81 31 FE 9F 00 65 46 53 05 30 06 71 DF 00 00 00 80 6A 82 5E Feitian PKI (http://www.ftsafe.com/products/PKI-Card.html) 3B 9F 95 81 31 FE 9F 00 66 46 53 05 01 00 11 71 DF 00 00 .. .. .. .. Feitian ePass2003 token 3B 9F 95 C0 0A 1F C7 80 31 E0 73 FE 21 1B 63 F1 00 AD 83 0F 90 00 DD Telenor SIM card (Norway) 3B 9F 96 40 0A 80 31 E0 6B 04 20 05 02 58 55 55 55 55 55 55 BuyPass identification card. It can also possibly be used to hold e-currency. 3B 9F 96 40 0A 80 31 E0 6B 04 21 05 02 61 55 55 55 55 55 55 altinn - Buypass Electronic ID card for login to the altinn.no service 3B 9F 96 80 1F 43 80 31 E0 73 36 21 13 57 4A 33 0E 09 31 41 00 AA Elisa UICC (Telecommunication) 3B 9F 96 80 1F 43 80 31 E0 73 36 21 13 57 4A 33 0E 0C 31 41 00 AF GSM, Vodafone (Germany) 3B 9F 96 80 1F 47 80 31 E0 73 36 21 13 57 4A 33 0E 0C 31 41 00 AB NATEL SIM-Card swisscom 3B 9F 96 80 1F C3 00 68 10 44 05 01 46 49 53 45 31 C8 07 90 00 1A SETEC SetCard 32K PKI Evaluated SetCOS 4.4.1 3B 9F 96 80 1F C3 80 31 E0 73 FE 21 1B B3 E2 02 7E 83 0F 90 00 82 Vodafone SIM Card (D2, 1800Mhz, Germany, Twincard, possibly others too?), manufactured by Gemplus (See stamp on the chip) MobileOne (Singaporean 3G/GSM operator) SIM card "II(3G-64) M1 3G " 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 .. 63 .. .. .. 83 0. 90 00 .. TIM (Italy) 128KB GSM SIM H3G (Italy) UMTS USIM Vodafone (UK) SIM 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 13 67 91 18 02 04 06 06 06 51 USIM (3G PF) Orange 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 13 67 94 03 07 03 04 04 04 4F GSM-SIM EMT (3G modem 2011, Estonia) 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 13 67 94 04 01 07 02 02 02 4C Orange Mobicarte (France) 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 13 67 94 04 04 03 05 05 05 4A Claro operator SIM 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B 63 40 41 91 83 07 90 00 50 giffgaff UK 3G SIM 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 03 94 83 0F 90 00 BD USIM (3G DF) Orange 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B 64 07 14 81 00 82 90 00 53 SFR operator 3G 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B 64 07 54 61 00 82 90 00 F3 Aero2 (Poland) - A 900Mhz HSPA+ and 2500Mhz LTE wholesale telecom operator USIM providing toll-free access to the Internet ("Bezpłatny Dostęp do Internetu" service) http://aero2.pl/bdi.html 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B 64 40 41 12 00 82 90 00 D2 Free Mobile SIM Card 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 01 6B 82 0E 18 01 FE Telekom Deutschland GmbH - Xtra Data Karte (3G SIM) 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B B3 E2 03 94 83 0F 90 00 6D GemXplore 3G v2.2 3B 9F 96 80 1F C7 80 31 E0 73 FE 21 1B B3 E2 04 A5 83 0F 90 00 5B Tre Italia Gemplus (Telecommunication) 3B 9F 96 80 3F C3 A0 80 31 E0 73 F6 21 13 57 4A 4D 0E 1D 31 30 00 71 Telenor SIM card (Norway) 3B 9F 96 81 31 FE 45 80 67 55 45 4B 41 45 12 12 31 80 73 B3 A1 80 EA AKiS v1.2 on nxp chip 3B 9F 96 81 31 FE 45 80 67 55 45 4B 41 45 12 52 31 80 73 B3 A1 80 AA AKiS v1.2.1 on infineon chip 3B 9F 96 81 31 FE 45 80 67 55 45 4B 41 45 12 53 31 80 73 B3 A1 80 AB AKiS v1.2.1 on nxp chip 3B 9F 96 81 31 FE 45 80 67 55 45 4B 41 45 12 92 31 80 73 B3 A1 80 6A AKiS v1.2.2 on infineon chip 3B 9F 96 81 31 FE 45 80 67 55 45 4B 41 45 12 93 31 80 73 B3 A1 80 6B AKiS v1.3 on infineon chip 3B 9F 96 81 B1 FE 45 1F 07 00 64 05 1E B2 00 31 B0 73 96 21 DB 05 90 00 5C SignTrust (www.signtrust.de) Infinion SLE66CX680PE with Starcos 3.2 http://www.deutschepost.de/dpag?xmlFile=link1015459_49595 3B 9F 96 C0 0A 1F C3 80 31 E0 73 FE 21 1B 63 F1 00 AD 83 0F 90 00 DA SIM SFR Pro (French Mobile Operator) 3B 9F 96 C0 0A 1F C7 80 31 E0 73 FE 21 1B 63 F1 00 AD 83 0F 90 00 DE H3G (Italy) UMTS USIM card 3B 9F 96 C0 0A 1F C7 80 31 E0 73 FE 21 1B 65 D0 01 8E 0E 32 81 00 7A Rogers 3G SIM card 3B 9F 96 C0 0A 3F C7 A0 80 31 E0 73 FE 21 1B 65 D0 01 74 0E 8D 81 0F B0 USIM 3B 9F 97 C0 0A 1F C7 80 31 E0 73 FE 21 1B 65 D0 01 10 09 22 81 00 F2 "ultra fast card, max speed supported for telecom"? (transport) 3B 9F 97 C0 FF 1F C7 80 31 E0 73 FE 21 1B 63 F1 00 AD 83 0F 90 00 2A Gemalto Speed Enhancement 97 (Telecommunication) 3B 9F D6 80 B1 A0 59 1F C7 53 4C 45 38 38 5F 50 53 4C 5F 56 30 2E 35 30 01 Infineon SLE88CFX4000P 3B A7 00 40 .. 80 65 A2 08 .. .. .. Gemplus GemSAFE Smart Card (8K) 3B A7 00 40 14 80 65 A2 14 01 01 37 Gemplus GPK4000sdo 3B A7 00 40 18 80 65 A2 08 01 01 52 Gemplus GPK8000 GemSAFE Smart Card (8K) 3B A7 00 40 18 80 65 A2 09 01 01 52 Gemplus GPK16000 3B A7 00 40 18 80 65 A2 09 01 02 52 Gemplus GPK16000 3B A7 00 40 18 80 65 A2 09 01 03 52 Gemplus GemSAFE std (GPK16000?) 3B A8 00 81 71 46 5D 00 54 43 4F 53 31 2E 32 00 65 Telesec TCOS 1.2 3B A8 00 81 71 46 5D 00 54 43 4F 53 31 2E 32 4B 2E CeloCom Card with TCOS 1.2 3B AA 00 40 14 47 47 32 47 54 35 53 34 38 30 GSM-SIM Libertel (900MHz) 3B AA 00 40 80 53 4F 80 53 45 03 04 11 AA A3 "open platform" ATMEGA "new Generation" http://www.masterixweb-italy.com/new/images/articoli/atmega.jpg 3B AB 00 81 31 40 45 80 31 C0 65 08 06 80 00 00 00 00 84 Reloadable Visa Cash card (Schlumberger), Bank of America 3B AC 00 40 2A 00 12 25 00 64 80 00 03 10 00 90 00 Sesam Vitale card CPS (Carte Profesionnel de Santé) 3B AC 00 40 2A 00 12 25 00 64 80 82 02 12 00 90 00 Sesam Vitale card CPS (Carte Profesionnel de Santé) 3B AD 00 40 FF 80 31 80 65 B0 05 01 01 5E 83 00 90 00 Dallas Semiconductor iButton JIB Gemplus GemXpresso 2.11PK 3B B0 11 00 81 31 90 73 F2 SamOS 2.7 3B B0 36 00 81 31 FE 5D 95 Betacrypt 2 (Comvenient GmbH) Conditional Access Smart Card (Pay TV) www.comvenient.com 3B B2 11 00 10 80 00 01 Atmel memory card AT88SC0104C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf Plug'n'Print 3B B2 11 00 10 80 00 02 Atmel memory card AT88SC0204C (Atmel memory card) http://www.atmel.com/dyn/resources/prod_documents/doc5211.pdf 3B B2 11 00 10 80 00 04 Atmel memory card AT88SC0404C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf 3B B2 11 00 10 80 00 08 Atmel memory card AT88SC0808C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf Smart VR Card - GD Burti 3B B2 11 00 10 80 00 16 Atmel memory card AT88SC1616C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf 3B B3 11 00 00 00 00 32 Atmel memory card AT88SC3216C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf 3B B3 11 00 00 00 00 64 Atmel memory card AT88SC6416C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf 3B B3 11 00 00 00 01 28 Atmel memory card AT88SC12816C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf 3B B3 11 00 00 00 02 56 Atmel memory card AT88SC25616C http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf 3B B7 11 00 81 31 90 43 A5 .. .. .. .. .. .. .. Siemens CardOS/M V1.4 (SLE44C80S) 3B B7 11 00 81 31 90 53 B5 .. .. .. .. .. .. .. CardOS EM/V1.4 (SLE44CR80S) 3B B7 18 00 81 31 FE 65 53 50 4B 32 34 90 00 5A Giesecke & Devrient Starcos 2.4 3B B7 18 00 C0 3E 31 FE 65 53 50 4B 32 34 90 00 25 G&D STARCOS SPK 2.4 3B B7 94 00 81 31 FE 55 53 50 4B 32 32 90 00 E0 Dresdner Bank (a German Bank) Key-Card for InternetBanking 3B B7 94 00 81 31 FE 65 53 50 4B 32 32 90 00 D0 Giesecke & Devrient STARCOS SPK2.2 3B B7 94 00 81 31 FE 65 53 50 4B 32 33 90 00 D1 Giesecke & Devrient Starcos 2.3 Deutsche Bank WebSign (RSA-Card) G&D StarSign Token 3B B8 13 00 81 31 20 5D 00 57 69 6E 43 61 72 64 02 SmartCard for Windows 1.1 3B B9 18 00 81 31 FE 9E 80 73 FF 61 40 83 00 00 00 DF Serbian Identity Card This is the new Serbian biometric identity card (every adult cityzen must have). The chip contains owners picture, name, date and place of birth, current address, unique ID number and fingerprint. 3B B9 94 00 40 14 47 47 33 4E 48 38 36 34 30 GSM-SIM card of the Austrian mobile phone provider One, http://www.one.at Proximus SIM - Belgium (SetCOS?) 3B BA 11 00 81 31 FE 4D 55 45 4B 41 45 20 56 31 2E 30 AE AKİS v1.0 on infineon chip 3B BA 13 00 81 31 86 5D 00 64 05 0A 02 01 31 80 90 00 8B Telesec TCOS 2 (SLE44) TCOS 2.0 (on CR80S) Cryptokarte with RSA-Controller, T=1 Protocol 3B BA 14 00 81 31 86 5D 00 64 05 14 02 02 31 80 90 00 91 TCOS 2.0 (on CX160S) Telesec TCOS 2 (SLE66) 3B BA 94 00 40 14 GG3RS732S0 ? 3B BA 94 00 40 14 47 47 33 52 53 37 31 36 53 20 GSM SIM Elisa Estonia 3B BA 94 00 40 14 47 47 33 52 53 37 31 36 53 30 GSM-SIM Viag Interkom E2 Loop (1800MHz) GSM-SIM card of the Austrian A1, http://www.a1.net/privat/home GSM SIM Radiolinja Estonia; 2005 3B BA 95 00 81 B1 86 5D 1F 43 00 64 04 5C 02 03 31 80 90 00 84 T-Mobile Corporate ID Card 3B BA 96 00 81 31 86 5D 00 64 05 60 02 03 31 80 90 00 66 Telesec TCOS 2 (SLE66P) TCOS 2.0 (on CX320P) TeleSec Netkey Card 3B BA 96 00 81 31 86 5D 00 64 05 60 02 03 31 80 90 00 66 70 01 04 05 30 C9 TeleSec Netkey E4 Card 3B BA 96 00 81 31 86 5D 00 64 05 7B 02 03 31 80 90 00 7D TeleSec NetKey Card Deutsche Post card (tcos) 3B BB 18 00 C0 10 31 FE 45 80 67 04 12 B0 03 03 00 00 81 01 38 Giesecke & Devrient Star Sign Card, STARCOS 3.0 DI, 72 KB, RSA2048 bit Giesecke & Devrient Smartc@fe Expert 32K v2.0 3B BB 18 00 C0 10 31 FE 45 80 67 04 12 B0 03 03 00 00 81 05 3C Philips Smart MX Szczecin University of Technology in Poland student identity card (Elektroniczna Legitymacja Studencka = student identity card) CSOB bank, Czech Republic CATCert (Agència Catalana de Certificació) catalan government workers identity card 3B BB 18 00 C0 3E 31 FE 65 47 26 44 20 54 53 4D 20 31 2E 30 B7 Italian Tachograph Driver Card 3B BC 18 00 81 31 20 75 5A 43 33 2E 31 32 20 52 45 56 20 41 46 ZeitControl BasicCard Enhanced 3.7, http://www.basiccard.com/ 3B BC 18 00 81 31 20 75 5A 43 33 2E 31 34 20 52 45 56 20 44 45 ZeitControl BasicCard Enhanced 3.14 Rev D, http://www.basiccard.com/ 3B BC 94 00 40 14 47 47 33 48 33 35 58 53 32 30 30 30 GSM-SIM Era-PL T-Mobile GSM SIM Card 3B BC 94 00 40 14 47 47 33 48 33 35 58 56 32 30 30 30 GSM SIM CARD 32K, Vodafone 3B BC 94 00 40 14 47 47 33 49 35 39 42 43 32 30 30 30 GSM SIM Vodafona NL prepaid 3B BC 94 00 40 14 47 47 33 49 35 43 41 43 31 30 30 30 Siemens SIM card 3B BC 94 00 40 14 47 47 33 49 37 31 39 43 32 30 30 20 Telenor SIM card (Norway) 3B BC 94 00 40 14 47 47 33 49 42 31 42 43 31 30 30 20 Telenor SIM (Telecommunication) 3B BC 94 00 40 14 47 47 33 53 30 35 31 53 31 30 31 30 GSM SIM (Tele2, Estonia) GSM SIM Elisa Estonia; 2007 GSM SIM from 'fonic' Germany 3B BD 18 00 81 31 FE 45 80 51 02 67 04 14 B1 01 01 02 00 81 05 3D Austrian "e-Card" (=Health Card) special Version of Starcos 3.1 3B BD 18 00 81 31 FE 45 80 51 02 67 05 18 B1 02 02 02 01 81 05 31 Austrian health insurance card "e-card" 3B BD 18 00 81 31 FE 45 80 51 03 67 04 14 B1 01 01 02 00 81 05 3C Austrian Health insurance card "eCard" (HealthCare) http://www.chipkarte.at 3B BE 11 00 00 41 01 10 20 38 00 00 00 00 00 00 00 00 00 ACOS2 3B BE 11 00 00 41 01 38 00 00 00 00 00 00 00 00 01 90 00 ACS (Advanced Card System) ACOS-1 3B BE 11 00 00 41 01 38 00 00 00 00 00 00 00 00 02 90 00 ACS (Advanced Card System) ACOS-1 8K 3B BE 11 00 00 41 01 38 00 00 04 00 62 75 62 7A 01 90 00 Advanced Card Systems ACOS3 (24k) V1.7 http://www.acs.com.hk/index.php?pid=product&prod_sections=0&id=ACOS3 3B BE 11 00 00 41 01 38 00 00 05 00 00 00 00 00 02 90 00 ACS (Advanced Card System) ACOS2 3B BE 11 00 00 41 01 38 01 00 03 00 00 00 00 00 02 90 00 ACOS2 test card from ACS reading off a ACR38U 3B BE 11 00 00 41 01 38 4D 80 0A 80 50 52 4F 56 00 90 00 ACS (Advanced Card System) ACOS-3 3B BE 18 00 00 41 05 .. 00 00 00 00 00 00 00 00 00 90 00 Advanced Card Systems (ACS) ACOS5 Cryptographic Smart Card 3B BE 18 00 00 41 05 10 00 00 00 00 00 00 00 00 00 90 00 ACS ACOS5 "ACOS5-32-G" http://www.acs.com.hk/acos5.asp dual card 3B BE 94 00 40 14 47 47 33 53 33 45 48 41 54 4C 39 31 30 00 Latvian GSM operator TELE2 3B BE 95 00 00 41 03 00 00 00 00 00 00 00 00 00 02 90 00 touchatag SAM card Spanish University of Murcia smart ID card - Old version with CajaMurcia Banking card integrated (Maestro card) (M.Mar OS) - Also used by many others spanish universities 3B BE 96 00 00 41 03 00 00 00 00 00 00 00 00 00 02 90 00 SAM inside the Tikitag reader from Alcatel-Lucent http://hackerati.com/post/57314994/rfid-on-the-cheap-hacking-tikitag 3B BE 96 00 00 41 05 20 00 00 00 00 00 00 00 00 00 90 00 CryptoMate64 USB Cryptographic token http://www.acs.com.hk/index.php?pid=product&prod_sections=0&id=CRYPTOMATE64 3B BE 96 00 80 1F C7 80 31 E0 73 FE 21 13 62 00 .. 83 81 90 00 .. Vodafone (Italy) 128 kB GSM SIM card TIM (Italy) 128 kB GSM SIM card 3B BF .. 00 81 31 FE 5D 00 64 04 0F 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Philips P5CD036 3B BF .. 00 81 31 FE 5D 00 64 04 11 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Philips P5CT072 3B BF .. 00 81 31 FE 5D 00 64 04 15 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Philips P5CD072 3B BF .. 00 81 31 FE 5D 00 64 04 28 03 02 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 release 2 on Philips P5CD080 3B BF .. 00 81 31 FE 5D 00 64 05 6D 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Infineon SLE 66CX642P 3B BF .. 00 81 31 FE 5D 00 64 05 89 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Infineon SLE 66CLX641P 3B BF .. 00 81 31 FE 5D 00 64 05 8A 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Infineon SLE 66CLX640P 3B BF .. 00 81 31 FE 5D 00 64 05 91 03 .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 on Infineon SLE 66CX680PE 3B BF 11 00 81 31 .. 45 45 50 41 00 00 00 00 .. .. .. .. 00 00 .. .. .. Austrian Quick E-purse http://www.quick.at/ 3B BF 11 00 81 31 FE 45 45 50 41 00 00 00 00 00 00 00 00 00 00 00 00 F1 a.sign premium signature card 3B BF 11 00 81 31 FE 45 4D 43 41 00 00 01 00 01 69 71 85 00 00 00 00 77 Austrian "easybank" branded Mastercard, issued 2007 3B BF 11 00 81 31 FE 45 4D 43 41 00 00 01 00 02 08 20 51 00 00 00 00 90 austrian combined card of a mastercard and ÖBB Vorteilscard (Austrian Federal Railways) http://www.oebb.at/pv/de/Servicebox/VORTEILScard/Bezahlen_mit_der_VORTEILScard/VORTEILScard_MasterCard.jsp 3B BF 11 00 81 31 FE 45 4D 43 41 00 00 01 00 02 55 91 33 00 00 00 00 1E Mastercard (Paylife Austria) 3B BF 11 00 C0 10 31 FE 44 53 4D 40 52 54 20 43 41 46 45 20 31 2E 31 43 C1 Giesecke&Devrient SmartCafe 1.1 3B BF 18 00 80 31 70 35 53 54 41 52 43 4F 53 20 53 32 31 20 43 90 00 9B Giesecke & Devrient STARCOS S2.1 3B BF 18 00 81 31 70 55 53 54 41 52 43 4F 53 20 53 32 31 20 43 90 00 FA Giesecke & Devrient STARCOS S2.1 3B BF 18 00 C0 20 31 70 52 53 54 41 52 43 4F 53 20 53 32 31 20 43 90 00 9C Giesecke & Devrient SPK 2.1 C 3B BF 94 00 81 31 FE 65 45 4C 55 20 41 75 73 74 72 69 61 20 31 2E 32 38 A-Trust: trust-sign (Old Version, ca. 2002) for Digital Signature etc. A-Trust: a-sign-premium (ca. 2004) "Bürgerkarte" ("Citizen-Card") for Identifikation, Digital Signature etc. ("should be" Starcos 2.3) 3B BF 94 00 81 31 FE 65 45 4C 55 20 41 75 73 74 72 69 61 20 31 2E 32 38 3B BF 96 00 81 31 FE 5D 00 64 .. .. .. .. 31 C0 73 F7 01 D0 00 90 00 .. TCOS 3.0 / NetKey 3.0 3B D0 A8 FF 81 F1 FB 24 00 1F C3 F4 Philips DESFire SAM 3B D2 18 00 81 31 FE 58 C9 01 14 Atos CardOS5 (PKI) http://atos.net/NR/rdonlyres/17C7BDD0-225B-4A58-B9A4-438EA3F3238A/0/74743_20120830_160149_cardos_v5_0__datenblatt_en.pdf 3B D2 18 02 C1 0A 31 FE 58 C8 0D 51 Siemens Card CardOS M4.4 3B D5 18 00 81 31 3A 7D 80 73 C8 21 10 30 Aladdin eToken NG-Flash with 256MB of flash memory Aladdin eToken PRO (72KB) http://www.aladdin.com/etoken/devices/default.aspx 3B D5 18 00 81 31 FE 7D 80 73 C8 21 10 F4 Bank of Lithuania Identification card Aladdin PRO/Java card http://www.aladdin-rd.ru/catalog/etoken/java/ 3B D5 18 FF 80 91 FE 1F C3 80 73 C8 21 13 08 Athena IDProtect (JavaCard 2.2.2) http://www.athena-scs.com/product.asp?pid=32 3B D5 18 FF 81 91 FE 1F C3 80 73 C8 21 13 09 Athena IDProtect Key (v2) http://www.athena-scs.com/product.asp?pid=33 3B D5 95 04 00 AE 01 02 01 01 Axalto Cyberflex Access 64K v2b SM 1.1 3B D5 95 FF 80 91 FE 1F C3 80 73 C8 21 13 85 Athena IDProtect - Cryptographic Java Card http://www.athena-scs.com/product.asp?pid=32 3B D6 18 00 80 B1 80 6D 1F 03 80 51 00 61 10 30 9E Atmel/Athena T0 PC/SC Compliance Test Card No. 1 3B D6 18 00 81 B1 80 7D 1F 03 80 51 00 61 10 30 8F ASECard Crypto, http://www.athena-scs.com/product.asp?pid=8 3B D8 18 FF 81 B1 FE 45 1F 03 80 64 04 1A B4 03 81 05 61 D-Trust multicard advanced 3.1 German public health insurance card ("Gesundheitskarte"), issuer SBK "Siemens Betriebskrankenkasse" 3B D8 96 FF 81 31 FE 45 80 64 04 1B B4 2A 81 05 5B Swiss LAMal health insurance card 3B D9 18 00 C0 09 10 FE 54 59 46 4F 4E 45 00 00 00 Tyfone's SideTap Card (NFC payments) 3B D9 94 00 00 4D 4D 41 52 33 31 34 90 00 Vodafone Spain 64kb SIM card. GSM/3G networks 3B DA 18 FF 81 B1 FE 75 1F 03 00 31 C5 73 C0 01 40 00 90 00 0C GnuPG card V2 3B DA 94 00 00 4D 4D 41 52 4A 2B 33 39 90 00 SIM card from Vodafone Spain 3B DB 11 FF 50 00 FF 00 00 00 00 00 00 00 07 92 16 03 NEC V-WAY64 v2.1 3B DB 18 00 80 1F 03 00 31 C0 64 77 E3 03 00 82 90 00 4F Oberthur ID-One Cosmo 64K V5.2 3B DB 18 00 80 B1 FE 45 1F 83 00 31 C0 64 C7 FC 10 00 01 90 00 FA Oberthur Cosmo V7 64K Dual/128K 3B DB 18 FF C0 80 B1 FE 75 1F 03 5A 43 37 2E 35 20 52 45 56 20 41 6F ZeitControl BasicCard ZC7.5 user-programmable dual interface smart card http://www.smartcardfocus.com/shop/ilp/id~380/BasicCard_ZC7_5_Dual_Interface/p/index.shtml 3B DB 96 00 80 1F 03 00 31 C0 64 77 E3 03 00 82 90 00 C1 CAC (Common Access Card) 3B DB 96 00 80 1F 03 00 31 C0 64 B0 F3 10 00 07 90 00 80 DoD CAC, Oberthur ID One 128 v5.5 Dual 3B DB 96 00 80 1F 03 00 31 C0 64 B0 F3 10 00 0F 90 00 88 US Department of Veterans Affairs PIV 3B DB 96 00 80 B1 FE 45 1F 83 00 31 C0 64 1A 18 01 00 0F 90 00 52 Serbian Car registration ID card http://blog.goranrakic.com/archives/2011/07/citanje_saobracajne_dozvole_sa_cipom.html 3B DB 96 00 80 B1 FE 45 1F 83 00 31 C0 64 B0 FC 10 00 07 90 00 05 Oberthur Cosmo V7 debug card (SDK) 3B DB 96 00 80 B1 FE 45 1F 83 00 31 C0 64 BE 1B 01 00 01 90 00 FB Bank card 3B DB 96 00 80 B1 FE 45 1F 83 00 31 C0 64 C3 08 01 00 0F 90 00 9B SIM Aruba (Italian provider) 3B DB 96 00 80 B1 FE 45 1F 83 00 31 C0 64 C7 FC 10 00 0F 90 00 7A Guatemalan ID Card http://www.renap.gob.gt/ 3B DB 96 00 81 B1 FE 45 1F 03 80 F9 A0 00 00 03 08 00 00 10 00 18 Oberthur CS PIV End Point v1.08 FIPS201 Certified 3B DB 96 00 81 B1 FE 45 1F 03 80 F9 A0 00 00 03 48 00 00 00 01 49 Fly Clear card 3B DB 96 00 81 B1 FE 45 1F 83 80 F9 A0 00 00 03 08 00 00 10 00 98 Oberthur Cosmo v7 128K with PIV applet http://www.smartcardfocus.com/shop/ilp/id~410/p/index.shtml 3B DB 96 FF C0 10 31 FE 45 80 67 15 01 B4 03 00 09 00 81 05 21 Digital Tachograph Card for Professional Driver 3B DC 18 FF 81 91 FE 1F C3 80 73 C8 21 13 66 01 06 01 30 04 01 55 Athena IDProtect Key Laser 3B DC 18 FF 81 91 FE 1F C3 80 73 C8 21 13 66 01 06 11 59 00 01 28 JaCarta (PKI) http://www.aladdin-rd.ru 3B DC 18 FF 81 91 FE 1F C3 80 73 C8 21 13 66 01 0B 03 52 00 05 38 Athena IDProtect Smart Card Logon Card 3B DD 18 00 81 31 FE 45 80 F9 A0 00 00 00 77 01 08 00 07 90 00 FE Oberthur Cosmo v7 IAS ECC 3B DD 18 00 81 31 FE 45 90 4C 41 54 56 49 41 2D 65 49 44 90 00 8C Identity card (eID) Republic of Latvia http://www.pmlp.gov.lv/lv/pakalpojumi/passes/eid.html 3B DD 18 FF C0 80 B1 FE 45 1F C3 00 68 D2 76 00 00 28 04 04 11 00 90 00 C9 Russian Federation driver card for the digital tachograph 3B DD 96 FF 81 B1 FE 45 1F 03 00 64 04 05 08 03 73 96 21 D0 00 90 00 C9 German public health insurance card ("Gesundheitskarte"), issuer Techniker Krankenkasse 3B DD 96 FF 81 B1 FE 45 1F 03 00 64 05 73 10 A6 73 D6 21 C0 00 90 00 53 New european health insurance card of the German health insurance 3B DD 96 FF 81 B1 FE 45 1F 03 80 31 B0 52 02 03 64 04 1B B4 22 81 05 18 Austrian "e-card" G3 (State Health Insurance Card) (running StarCOS 3.4 by Giesecke & Devrient) 3B DD 97 FF 81 B1 FE 45 1F 03 00 64 04 05 08 03 73 96 21 D0 00 90 00 C8 German "eGK" (State Health Insurance Card) 3B DD 97 FF 81 B1 FE 45 1F 03 00 64 04 05 08 03 73 96 96 21 D0 00 90 C8 German public health insurance card ("Gesundheitskarte"), issuer Knappschaft 3B DE 11 00 00 49 43 4F 53 35 33 00 00 00 00 00 00 00 08 MyKID (eID) 3B DE 18 FF 81 F1 FB 34 00 1F 07 44 45 53 46 69 72 65 53 41 4D 56 31 2E 30 D2 Mifare Desfire SAM Module 3B DE 18 FF 81 F1 FE 43 00 3F 07 83 44 45 53 46 69 72 65 38 20 53 41 4D 2D 58 17 NXP SAM 3B DE 18 FF C0 80 B1 FE 45 1F 03 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 2B Estonian Identity Card (EstEID v1.0 2006 cold) 3B DF 18 00 81 31 FE 67 00 5C 49 43 4D D4 91 47 D2 76 00 00 38 33 00 58 Infineon SICRYPT Card Module D4 PC/SC Compliance Test Card 3B DF 18 00 81 31 FE 7D 00 6B 15 0C 01 80 01 11 01 43 4E 53 10 31 80 E9 Provider: Actalis S.p.A. code: AT00006181 website: http://www.actalis.it 3B DF 18 00 81 31 FE 7D 00 6B 15 0C 01 81 01 11 01 43 4E 53 10 31 80 E8 Italian healthcare card (TS) National Service Card (CNS) Carta Regionale dei Servizi - Regione Lombardia Tuscany TS-CNS http://www.regione.toscana.it/cartasanitaria 3B DF 18 FF 81 31 FE 45 80 59 01 80 48 49 44 43 37 30 30 73 00 01 1B 33 Crescendo C700 + MiFare 4K http://www.smartcardfocus.com/shop/ilp/id~265/p/index.shtml 3B DF 18 FF 81 F1 FE 43 00 1F 03 4D 49 46 41 52 45 20 50 6C 75 73 20 53 41 4D 98 Mifare SAM AV2 3B DF 18 FF 81 F1 FE 43 00 3F 03 83 4D 49 46 41 52 45 20 50 6C 75 73 20 53 41 4D 3B NXP SAM AV2 module 3B DF 96 00 80 31 FE 45 00 31 B8 64 04 1F EC C1 73 94 01 80 82 90 00 EC Ministry of Interior - France "Agent Card" (Carte Agent du Ministère de l'Intérieur Français) 3B DF 96 00 80 31 FE 45 00 31 B8 64 04 29 EC C1 73 94 01 80 82 90 00 DA Finnish identity card given by the City of Helsinki to all members of city council, board and commitees 3B DF 96 00 81 B1 FE 45 1F 83 80 73 CC 91 CB F9 A0 00 00 03 08 00 00 10 00 79 Test PIV Cards available for sale from NIST http://csrc.nist.gov/groups/SNS/piv/testcards.html 3B DF 96 FF 81 31 FE 45 5A 01 80 48 49 44 43 31 31 58 58 73 00 01 1B 09 HID Crescendo iCLASS Px G8H 3B E0 00 00 81 31 20 40 30 SmarTEC 3B E0 00 FF 81 31 FE 45 14 "JUKICARD", digitally sign tax documents in Japan 3B E2 00 00 40 20 49 .. Schlumberger Cryptoflex 4k 3B E2 00 00 40 20 49 05 Schlumberger Cryptoflex DES 3B E2 00 00 40 20 49 06 Schlumberger Cryptoflex 3B E2 00 00 40 20 49 07 Schlumberger Cryptoflex Key Generation 3B E2 00 FF C1 10 31 FE 55 C8 02 9C Aladdin eToken PRO (USB token) Siemens CardOS M4.0 3B E3 00 FF 91 81 71 26 44 00 01 13 20 2D Metrebus Card (used in Rome to store personal information and Atac subscription. Atac is the public transport company of the city of Rome.) http://www.atac.roma.it/smart/smart.asp?A=2&S=22&PR=4&LNG=2 3B E5 00 00 81 31 FE 45 D0 00 37 00 80 89 ATM card for Standard Chartered, Taiwan 3B E6 00 00 81 21 45 32 4B 01 01 01 01 7A Axalto Cyberflex Palmera V5 3B E6 00 FF 81 31 FE 45 44 49 20 30 32 4D 70 Alior Sync (Poland) - MasterCard Debit Card with PayPass (Bank) MasterCard Contactless Debit Card issued by Raiffeisen Bank in Czech Republic 3B E6 00 FF 81 31 FE 45 44 49 20 30 32 56 6B VISA credit card (DKB) 3B E6 00 FF 81 31 FE 45 4A 43 4F 50 30 33 07 IBM JCOP 30/16 3B E6 00 FF 81 31 FE 45 4A 43 4F 50 31 30 05 IBM JCOP 10/16 Rental card for Blockbuster, Taiwan 3B E6 00 FF 81 31 FE 45 4A 43 4F 50 32 30 06 IBM JCOP 20/16 IBM JCOP20 with MIFARE or Datakey Smart Card Model 330J (http://www.datakey.com/products/smart_cards/products_sc_330j.shtml) 3B E6 00 FF 81 31 FE 45 4A 43 4F 50 32 31 07 IBM JCOP ID21 3B E6 00 FF 81 31 FE 45 4A 43 4F 50 33 30 07 Mifare ProX T=1 3B E6 00 FF 81 31 FE 45 4A 43 4F 50 33 31 06 IBM JCOP 30/31bio (contact interface) 3B E7 00 00 91 81 31 FE 41 01 10 30 01 00 90 80 49 "FirmenTicket" from the "Rheinbahn" for the "VRR" its a ticket corporates can buy for their employees. so its called "FirmenTicket". "Rheinbahn" is the local service operator for the mass traffic in and around duesseldorf/germany. "VRR" is traffic network spanning over at least a big part of north rhine westphalia (Verkehrsverbund Rhein-Ruhr) (http://www.vrr.de/de/tickets_und_tarife/vielfahrer/firmenticket/index.php) 3B E7 00 FF 81 31 FE 45 44 30 38 2E 30 20 36 57 EMV (MasterCard) card, issued by Raiffeisen Bank in Russia "Deutsche Kreditbank AG" Visa Card produced by AustriaCard GNC All cards (MasterCard, Maestro, VISA Electron) issued by Raiffeisen Bank in Romania EMV (MasterCard) Card, issued by Raiffeisen Bank in Czech Republic 3B E8 00 00 81 31 20 45 00 73 C8 40 00 00 90 00 56 Visa credit card for Standard Chartered, Taiwan 3B E8 00 00 81 31 FE 45 00 73 C8 40 00 00 90 00 88 VISA Card (Skandinaviska Enskilda Banken) with Swedish BankID VISA card (Chinatrust Bank (Taiwan), dual-interface card with a Taipei Metro e-purse function) 3B E8 00 00 81 31 FE 45 4A 43 4F 50 76 32 34 .. .. NXP JCOP v2.4.x (see hist bytes for more info) 3B E9 00 00 81 21 45 45 4D 56 5F 41 54 52 20 06 6C VISA card, issued by HVB Bank Czech Republic (http://www.hvb.cz) or austrian BankAustria 3B E9 00 00 81 21 45 4D 43 5F 5F 49 4E 46 20 06 65 MasterCard Credit card issued by SpareBank1 (http://www.sparebank1.no) in Norway 3B E9 00 00 81 21 45 56 49 53 5F 49 4E 46 20 06 78 VISA card, issued by the Austrian "Raiffeisen" bank (http://www.raiffeisen.at/ Visa Card - Maximum - Oyak Bank / Turkey VISA, issued by Austrian bank "Erste Bank" VISA card, issued by the Latvian bank "Latvijas Krajbanka" 3B E9 00 00 81 31 FE 45 43 44 32 69 09 00 00 00 00 B7 Swiss UBS MasterCard Creditcard 3B E9 00 00 81 31 FE 45 45 4D 56 20 30 33 20 20 06 99 Visa credit card MasterCard credit card 3B E9 00 00 81 31 FE 45 45 4D 56 30 32 5F 34 53 06 80 Maestro Card issued by "First Investment Bank" in Bulgaria, http://fibank.bg/ Visa Electron card: TATRA BANKA, a.s. 3B E9 00 00 81 31 FE 45 4A 43 4F 50 31 30 56 32 32 A3 ORGA Open Platform DES 16k V2.0 / JCOP10 3B E9 00 00 81 31 FE 45 4A 43 4F 50 33 31 56 32 32 A0 JCOP 31 / 72k 3B E9 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 A7 IBM JCOP v2.2 41 3B E9 00 00 81 31 FE 45 4D 43 41 20 30 33 20 20 06 88 PayLife Gold MasterCard -- an unbranded version of the master card 3B E9 00 FF C1 10 31 FE 55 00 64 05 00 C8 02 31 80 00 47 Identity card of Italian Republic 3B E9 00 FF C1 10 31 FE 55 C8 01 20 50 4E 34 30 31 32 AD Siemens CardOS/M 3.0 (SLE66CX160S) 3B EA 00 00 81 31 FE 45 43 6F 6D 62 4F 53 20 49 49 00 FE UBS VISA Gold Card MasterCard from lhv.ee Nordea Bank Finland PLC Estonian Branch (ABnote) 3B EA 00 00 81 31 FE 45 4A 43 4F 50 33 31 56 32 33 32 90 NAB VISA Debit card 3B EA 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 31 95 HID Crescendo C700 https://www.hidglobal.com/products/cards-and-credentials/crescendo/c700 3B EA 00 FF 81 31 20 75 00 64 05 14 01 02 31 00 90 00 27 GCOS-MDK 3B EA 00 FF 81 31 FE 45 54 55 42 2D 43 4B 01 03 01 00 7B Technische Universität Berlin - Campus Karte Maybe Sm@rtCafé Expert 2.0 (Giesecke & Devrient) or GemXpresso 211 PK (Gemplus) Includes a Mifare-Chip (1 KB - Memory-Chip) 3B EB 00 00 81 31 42 45 4E 4C 43 68 53 43 4B 30 34 30 31 2B Dutch University accesscard & Electronic purse & telphone card 3B EB 00 00 81 31 42 45 4E 4C 43 68 69 70 70 65 72 30 31 0A Dutch Post (Chipper) 3B EC 00 00 40 32 42 4C 55 45 20 44 52 41 47 4F 4E 20 43 00 01 Pay TV 3B EC 00 FF 81 31 FE 45 A0 00 00 00 56 33 33 30 4A 33 06 00 A1 Datakey model 330J card, www.datakey.com http://www.hmk.de/downloads/datakey/Model_330J_Smart_Card.pdf Model 330J JavaCard v2.1.1 Global Platform v2.0.1 specifications. JCCOS operating system applet (Java-based Cryptographic Card Operating System) 3B ED 00 00 81 31 20 43 80 31 80 65 B0 83 02 04 7E 83 00 90 00 32 Latvian Digital Signature Card (warm) (http://www.eme.lv/) 3B EE 00 00 81 31 FE 45 00 31 80 71 86 65 01 67 02 A0 0A 83 90 00 1B IBM JCOP "Java Card 2.1.1" et "Open Plaform 2.0.1" 3B EE 00 00 81 31 FE 45 80 31 80 66 40 90 93 06 0F 17 83 0F 90 00 F3 IC card for the National Health Insurance, Taiwan 3B EF .. 00 40 14 80 25 43 45 52 45 53 57 .. .. 01 01 03 90 00 Electronic Identification Card from the FNMT, the Spanish Official Certification Authority (Fábrica Nacional de Moneda y Timbre) FNMT-Ceres Siemens Infineon SLE 19 3B EF .. 00 40 14 80 25 43 45 52 45 53 57 .. .. 01 02 03 90 00 FNMT-Ceres Siemens Infineon SLE 20 Fábrica Nacional de Moneda y Timbre 3B EF 00 00 81 31 20 49 00 5C 50 43 54 10 27 F8 D2 76 00 00 38 33 00 4D Infineon Technologies PC/SC Compliance Test Card V1.0 3B EF 00 00 81 31 40 69 00 5C 50 43 53 35 C5 3A D2 76 00 00 38 33 00 0F Siemens Nixdorf Sicrypt 3B EF 00 00 81 31 FC 45 80 31 80 65 11 01 13 00 01 53 41 43 45 81 04 21 Slovenska sporitelna (SLSP) Bank card, Maestro Card with chip 3B EF 00 00 81 31 FC 45 80 31 80 65 11 11 23 10 02 53 41 43 45 81 04 12 VISA card issued by UBS, Switzerland 3B EF 00 00 81 31 FE 45 43 4D 42 5F 43 6F 6D 44 44 41 30 30 35 35 00 F7 Master Card (emitted by bank Nordea - Lithuania) 3B EF 00 00 81 31 FE 45 43 4D 42 5F 43 6F 6D 53 44 41 30 30 34 30 00 E4 VISA (Danske Bank Eesti / www.sampopank.ee) 3B EF 00 00 81 31 FE 45 43 4D 42 5F 43 6F 6D 53 44 41 30 30 35 31 00 E4 Visa (Sampo Estonia, 2010) 3B EF 00 00 81 31 FE 45 43 6F 6D 62 4F 53 20 56 49 20 20 20 20 20 00 C4 VfB Stuttgart Fankarte (pay card for the football stadium of the german club VfB Stuttgart) 3B EF 00 00 81 31 FE 45 46 49 4F 4D 4B 5F 30 30 31 20 30 31 30 41 00 9C MasterCard/PayPass Card issued by Czech FIO Banka a.s. (contact chip) note the ASCII string ' FIOMK_001 010A' embedded in ATR 3B EF 00 00 81 31 FE 65 00 5C 50 43 53 D1 91 47 D2 76 00 00 38 33 00 70 Siemens/Infineon Sicrypt S26381-F252-V1 GS:03 3B EF 00 00 81 31 FE 67 00 5C 49 43 4D DB C9 7E D2 76 00 00 38 33 00 1E Infineon SICRYPT CardModule Card 3B EF 00 FF 81 31 .. 45 65 63 Debit card (Germany): ec-cash, GeldKarte(DEM), Maestro, Cirrus 3B EF 00 FF 81 31 20 45 42 61 73 69 63 43 61 72 64 20 5A 43 32 2E 33 BD ZeitControl BasicCard Enhanced 2.3 3B EF 00 FF 81 31 20 45 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 33 BC Electronic Purse (Elton Senegal) 3B EF 00 FF 81 31 20 75 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 33 8C ZeitControl BasicCard Enhanced 3.3 3B EF 00 FF 81 31 20 75 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 37 88 ZeitControl BasicCard Enhanced 3.7 3B EF 00 FF 81 31 20 75 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 39 86 ZeitControl BasicCard Enhanced 3.9 3B EF 00 FF 81 31 42 45 .* 38 UNI-Card 3B EF 00 FF 81 31 42 45 65 63 03 02 03 02 80 00 22 40 48 95 96 00 20 28 Scard Sparkasse Detmold, Deutschland BLZ 47650130 3B EF 00 FF 81 31 50 45 42 61 73 69 63 43 61 72 64 20 5A 43 31 2E 31 CC ZeitControl BasicCard Compact 1.1 3B EF 00 FF 81 31 50 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. GeldKarte v2 (Germany) 3B EF 00 FF 81 31 50 45 65 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Geldkarte v2 3B EF 00 FF 81 31 50 45 65 63 08 0B 40 02 80 00 08 15 20 03 36 04 00 7E old banking card (electronic-card / Maestro / Geldkarte) of the Stadt-Sparkasse Duesseldorf (like the above, but old - around 2002). 3B EF 00 FF 81 31 50 45 65 63 0D 24 20 02 80 00 05 08 33 56 10 01 02 43 German ec card 3B EF 00 FF 81 31 52 45 4D 46 43 20 49 42 4D 20 34 30 48 39 36 30 31 FB IBM MFC 3.5 file system smart card (Card from the book "Smart Card Application Development Using Java") 3B EF 00 FF 81 31 60 45 65 63 04 02 11 00 00 00 00 00 A5 32 A5 01 11 B6 GledKarte Siemens M3-Module with a Motorola SC-28. G&D (Giesecke&Devrient) Geldkarten-OS mit der Version 11 3B EF 00 FF 81 31 60 45 65 63 06 03 14 02 50 00 06 51 08 11 5E 01 41 90 Geldkarte from Deutsche Bank, Thomson-Chip 3B EF 00 FF 81 31 66 45 49 42 4D 20 4D 46 43 34 30 30 32 30 38 33 31 A1 IBM MFC 4.1 file system smart card Card from the book "Smart Card Application Development Using Java" authors: Uwe Hansmann, Martin. S. Nicklous, Thomas Schäck, Achim Schneider, Frank Seliger 3B EF 00 FF 81 31 66 45 65 63 20 20 49 42 4D 20 33 2E 31 20 20 20 20 IBM eCash 3B EF 00 FF 81 31 66 45 65 63 20 20 49 42 4D 20 33 2E 31 20 20 20 20 CF IBM eCash 3B EF 00 FF 81 31 86 45 49 42 4D 20 4D 46 43 34 30 30 30 30 38 33 31 43 ComCard MFC 4.1 3B EF 00 FF 81 31 FE 45 65 63 11 04 01 02 80 00 0F 27 40 00 03 01 00 E1 Postbank Geldkarte 3B EF 00 FF 81 31 FE 45 65 63 11 04 01 02 80 00 0F 46 20 04 23 01 00 C4 Postbank ec/Maestro (Germany) 3B EF 00 FF 81 31 FE 45 65 63 19 01 62 02 80 00 0F 00 35 00 42 06 20 BB Credit card (Germany, Postbank AG): VISA 3B EF 00 FF 81 31 FE 45 80 31 C0 6B 49 42 4D 20 4A 65 74 5A 20 4D 32 39 UBS Internet Card (IBM JetZ M2) 3B EF 00 FF 81 31 FF 65 49 42 4D 20 4D 46 43 39 32 32 39 32 38 39 30 17 IBM MFC 4.22 (University of Cambridge smartchip card) 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 Japanese Chijou Digital B-CAS Card (pay TV) 3B F0 12 00 FF 91 81 B1 EF 45 1F 03 0A Japanese Digital CATV C-CAS card 3B F0 13 00 00 10 00 MasterCard ETEC InterOp 27. This is an dual-app Maestro/MasterCard Credit EMV test card 3B F2 18 00 00 C1 0A 31 FE 55 C8 06 75 HID iCLASS P16K C4H proximity card used for both door locks and keystore 3B F2 18 00 02 C1 0A 31 FE 55 C8 07 76 Siemens CardOS V4.3 3B F2 18 00 02 C1 0A 31 FE 58 C8 08 74 Siemens CardOS V4.3B D-Trust multicard 2.1 (may only be the testcard for it) 3B F2 18 00 02 C1 0A 31 FE 58 C8 09 75 Siemens CardOS V4.2B 3B F2 18 00 02 C1 0A 31 FE 58 C8 0B 77 CardOS V4.2C (SLE66CX360PE dual interface) 3B F2 18 00 FF C1 0A 31 FE 55 C8 06 8A Siemens CardOS M 4.2 (SLE66CX642P) 3B F2 98 00 FF C1 10 31 FE 55 C8 03 15 Siemens CardOS M 4.01 (SLE66CX320P) 3B F2 98 00 FF C1 10 31 FE 55 C8 04 12 CardOS M4.01a (SLE66CX322P) 3B F3 96 00 FF C0 0A 31 FE 4D 80 31 E0 83 MARX Cryptoken (supported by RaakSign) 3B F4 18 00 02 C1 0A 31 FE 58 56 34 63 76 C5 Eutron CryptoIdentity (reader + card token) 3B F4 18 00 FF 81 31 80 55 00 31 80 00 C7 Identity card of Italian Republic 3B F4 98 00 FF C1 10 31 FE 55 4D 34 63 76 B4 Eutron Digipass 860 (reader + card token) 3B F5 18 00 00 81 31 FE 45 4D 79 45 49 44 9A Aventra ActiveSecurity MyEID http://www.aventra.fi/pdf/ActiveSecurity%20MyEID%20Tokens%20white%20paper%20(2p)%20EN.pdf 3B F5 91 00 FF 91 81 71 FE 40 00 41 00 00 00 00 05 Contactless Mifare Ultralight 3B F5 91 00 FF 91 81 71 FE 40 00 41 08 00 00 00 0D Contactless Mifare 3B F5 91 00 FF 91 81 71 FE 40 00 41 18 00 00 00 1D Contactless Mifare 4k 3B F5 91 00 FF 91 81 71 FE 40 00 41 88 00 00 00 8D Contactless Mifare 1k or 4k 3B F5 91 00 FF 91 81 71 FE 40 00 42 00 01 00 81 86 American Express Blue RFID 3B F6 18 00 FF 81 31 FE 45 4A 32 41 30 38 30 1B NXP J2A080 - 80K (blank) http://www.classic.nxp.com/acrobat_download2/literature/9397/75016728.pdf 3B F6 18 00 FF 81 31 FE 45 4A 43 4F 50 32 30 0E IBM JCOP20 3B F6 18 00 FF 81 31 FE 45 4A 43 4F 50 33 30 0F Philips P8RF5016 running IBM JCOP 30 (contact interface) 3B F6 18 00 FF 81 31 FE 45 4A 43 4F 50 33 31 0E IBM JCOP BIO31 IBM JCOP BIO31 Java card 3B F7 11 00 00 81 71 80 42 00 00 63 95 0A 01 90 00 B9 ATM Card for Chunghwa Post Inc., Taiwan 3B F7 11 00 00 81 71 FE 42 00 00 63 95 01 01 90 00 CC ATM Card for Mega International Commercial Bank, Taiwan ATM card for HSBC Direct, Taiwan ATM card for TaChong Bank, Taiwan ATM card for Chunghwa Post, Taiwan VISA card for Taipei Fubon Bank, Taiwan 3B F7 11 00 00 81 71 FE 42 00 00 63 95 31 02 90 00 FF VISA card for Taipei Fubon Bank, Taiwan 3B F7 11 00 00 81 71 FE 42 00 00 63 95 31 05 90 00 F8 ATM card for Chunghwa Post, Taiwan ATM card for E.Sun Commercial Bank, Taiwan 3B F7 11 00 01 40 96 54 30 04 0E 6C B6 D6 90 00 PIC16F876-04/SP (PICCard2) or PIC16F84A-04/P + 24LC16B (PICCard1) or Canal + Canal Digital Spain year 2000/2001 or PIC Silver Card 2 (PIC16F876/7 + 24C64) 3B F7 11 00 01 40 96 58 42 14 0E 6C B6 D6 UK on digital (terrestrial digital TV card) 3B F7 11 00 01 40 96 70 70 07 0E 6C B6 D6 Cyfra+ SECA Card (http://cyfraplus.pl/) 3B F7 11 00 01 40 96 70 70 07 0E 6C B6 D6 90 00 M-II (a.k.a. M-2, a.k.a. Platinum Card), AT90SC6464C based KnotCard II TitaniumElite 3B F7 11 00 01 40 96 70 70 0A 0E 6C B6 D6 TopUp TV NagraVision viewing card 3B F7 11 00 01 40 96 70 70 17 0E 6C B6 D6 Canal Satellite card (VERSION 7.1 SYSTEM / SECA2) 3B F7 11 00 01 40 96 70 70 37 0E 6C B6 D6 Carte pour decodeur cable numérique (fourni par www.voo.be et www.ledecodeur.be) 3B F7 11 00 01 40 96 70 70 67 0E 6C B6 D6 UK TopUp TV 3B F7 11 00 01 40 96 70 71 09 0E 6C B6 D6 Carte pour décodeur télé de Neuf Telecom TV 3B F7 13 00 00 81 31 FE 45 46 4F 4D 53 4F 4D 53 A9 Health card Russian Federation 3B F7 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 .. .. NXP JCOP v2.4.x (see hist bytes for more info) 3B F7 18 00 00 80 31 FE 45 73 66 74 65 2D 6E 66 C4 SmartCafe Expert 3.2 72K 3B F7 18 00 00 81 71 80 42 00 00 63 95 0A 01 90 00 B0 7-Eleven icash card, Taiwan 3B F7 91 00 FF 91 81 71 FE 40 00 41 20 00 11 77 81 80 40 Contactless Mifare DESFire 3B F8 13 00 00 81 31 FE 45 4A 43 4F 50 76 32 34 .. .. NXP JCOP v2.4.x (see hist bytes for more info) 3B F8 18 00 00 80 31 FE 45 00 73 C8 40 13 00 90 00 92 G&D StarSign Token 3B F8 18 00 00 81 31 FE 45 00 73 C8 40 00 00 90 00 80 NXP JCOP 31 V2.2 36K - S/C I/F 3B F8 18 00 00 81 31 FE 45 00 73 C8 40 13 00 90 00 93 Giesecke & Devrient Sm@rtCafé Expert 3.0 3B F8 18 00 00 81 31 FE 45 4A 43 4F 50 56 32 34 31 9C NXP JCOP2.4.1 J3A080 80KB T=1 GP2.1.1 JC2.2.2 SCP02 3B F8 18 00 00 81 31 FE 45 4A 43 4F 50 76 32 34 31 BC NXP J2A080 JavaCard 3B F8 18 00 FF 81 31 FE 45 00 73 C8 40 00 00 90 00 7F NXP JCOP 10 NXP JCOP 31 (contact interface) 3B F8 18 00 FF 81 31 FE 45 4A 43 4F 50 76 32 34 31 43 VIVOtech SAM NXP JCOP V241 NXP J3A081 JavaCard (contact interface) 3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 .. .. .. .. NXP JCOP v2.4.x (see hist bytes for more info) 3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 34 A2 JCOP41 v2.4 3B F9 13 00 FF 10 80 80 31 E0 55 42 45 52 47 53 Banrisul bank 3B F9 18 00 00 81 31 FE 45 39 35 32 38 35 30 31 33 31 DA JCOP31 / 72B1 V2.2 (4096 RSA key support) Smartcard Dual Interface JCOP31 with 72KB EEPROM and V2.2 Java Card Open Platform 3B F9 18 00 00 81 31 FE 45 4A 43 4F 50 32 31 56 32 32 A9 NXP JCOP 21 V2.2 36K 3B F9 18 00 00 81 31 FE 45 4A 43 4F 50 33 31 56 32 32 A8 JCOP31 / 72B1 V2.2 Smartcard Dual Interface JCOP31 with 72KB EEPROM and V2.2 Java Card Open Platform 3B F9 94 00 00 81 31 FE 65 46 54 20 56 31 30 30 90 00 83 ePass 2000 3B F9 98 00 FF C1 10 31 FE 55 41 4D 20 43 4D 44 31 31 30 83 Service card of the Ministry of Defense of Italy - Military Aviation 3B F9 98 00 FF C1 10 31 FE 55 45 49 20 43 4D 44 31 31 30 83 Service card of the Ministry of Defense of Italy - Italian Army 3B F9 98 00 FF C1 10 31 FE 55 4D 4D 20 43 4D 44 31 31 30 8F Service card of the Ministry of Defense of Italy - Navy 3B F9 98 00 FF C1 10 31 FE 55 50 43 20 43 4D 44 31 31 30 9C Service card of the Ministry of Defense of Italy - Civil personnel 3B FA 11 00 00 81 31 FE 45 43 6F 6D 62 4F 53 20 49 56 00 E0 MyWireCard 2go Prepaid VISA Card 3B FA 11 00 02 40 60 43 C6 02 F8 03 03 00 00 90 00 DeLaRue DX(?) 3B FA 13 00 00 81 31 FE 15 59 75 62 69 6B 65 79 4E 45 4F A6 Yubikey NEO 3B FA 13 00 00 81 31 FE 45 44 65 78 61 20 43 46 20 76 31 98 Dexa Systems Crossfire Card (PKI) http://www.dexasystems.com/products-services/products/dexa-smartcards-credential-tokens-peripherals 3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 3. 3. 56 32 33 32 .. JCOPxx/yy v2.3.2 (see hist bytes for more info) 3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 32 31 56 32 33 31 91 NXP JCOP 21 V2.3.1 36K 3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 JCOP41 V221 3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 33 31 97 JCOP41 /72K (eID) 3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 76 32 34 .. .. .. .. NXP JCOP v2.4.x (see hist bytes for more info) 3B FA 13 00 FF 81 31 80 45 00 31 C1 73 C0 01 00 00 90 00 B1 OpenPGP 3B FA 18 00 00 81 31 FE 45 06 08 60 84 10 01 87 6F 06 02 FE Card used by the Dutch health insurers to give medical personell access to patient insurance information 3B FA 18 00 00 81 31 FE 45 4A 33 41 30 34 30 56 32 34 31 84 NXP J3A 40K Java Card v2.2.2 - Global Platform v2.2.1 Dual-interface functionality (features 1K Mifare emulation) 3B FA 18 00 00 81 31 FE 45 4A 33 41 30 38 31 56 32 34 31 89 NXP JCOP CJ3A081 http://www.usmartcards.com/media/downloads/492/NXP%20P5CX012%2002X%2040%2073%2080%20144%20%20%202011.pdf 3B FA 18 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 31 9D NXP JCOP 41 v2.2.1 72k SmartCard I/F 3B FA 18 00 02 C1 0A 31 FE 58 4B 53 77 69 73 73 53 69 67 6E 89 SuisseId card (used for qualified signatures) http://postsuisseid.ch/de/suisseid http://www.suisseid.ch/ 3B FA 18 00 FF 81 31 FE 45 4A 43 4F 50 32 31 56 32 33 31 65 TrubDemax healthcare card JCOP 21 / 72k 3B FA 18 00 FF 81 31 FE 45 4A 43 4F 50 34 31 43 32 30 30 74 HID Crescendo C200 https://www.hidglobal.com/sites/hidglobal.com/files/resource_files/crescendo-c200-c700-smart-card-ds-en.pdf 3B FA 18 00 FF 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 31 62 JCOP41 HID Crescendo C700 http://www.hidcorp.com/ Should be compatible to RAAK http://www.raaktechnologies.com/ Marx CrypToken MX2048-JCOP USB Token 3B FA 18 00 FF 81 31 FE 45 4A 43 4F 50 34 31 56 32 33 31 63 JCOP41 V2.3.1 Dual Interface, Mifare emulation, 72K (NXP SmartMX P5CT072) JCOP (Java Card OpenPlatform) is a Java smart card distributed and developed by NXP. The JCOP 41 v2.3.1. is an USB-smart card and can be used not only with standard smart card reader, but also with simple USB-connectors. The JCOP card is connected as ICCD card and can be used with such ICCD standard drivers. JCOP 41 is a Dual-Interface Smart Card, that means, the card can also be contacted with a contactless card reader. For building access systems, this card is also be able to emulate Mifare Classic 1k/4k. JCOP 41 v2.3.1 is compliant to JavaCard Standard 2.2.1. and GlobalPlattform 2.1.1. Their cryptographic features supports RSA up to 2432 bit, 'Eliptic curves' - ECC GF(2n), AES and 3DES. More information is available here: http://www.nxp.com/documents/short_data_sheet/P5Cx009_P5Cx072_FAM_SDS.pdf 3B FA 94 00 00 81 31 20 43 80 65 A2 01 01 01 3D 72 D6 43 21 GemXpresso Pro R3 32PK (MPCOS, T=1) 3B FA 98 00 FF C1 10 31 FE 55 C8 03 53 41 47 5F 50 4B 49 32 77 Siemens corporate ID card (access to the building / rooms etc, stores PKI private keys/certificates) 3B FA 98 00 FF C1 10 31 FE 55 C8 04 53 41 47 5F 50 4B 49 32 70 Siemens Corporate Card (Belgium , Germany) 3B FB 11 00 00 40 28 80 59 53 50 59 52 55 53 AE 00 02 Spyrus Rosetta Basic 3B FB 11 00 00 40 78 80 59 53 50 59 52 55 53 AE 02 02 Rosetta® Series II Smart Card manufactured by Spyrus http://spyrus.com/products/rosetta_smart_usb.asp 3B FB 11 00 00 81 31 FE 45 00 31 C0 64 77 E9 10 00 00 90 00 6A OCS ID-One Cosmo Card USB Token 3B FB 13 00 00 81 31 FE 45 4A 43 4F 50 53 3. 3. 56 32 33 32 .. JCOP-Sxx/yy v2.3.2 (see hist bytes for more info) 3B FB 13 00 FF 81 31 80 75 5A 43 35 2E 35 20 52 45 56 20 47 63 ZeitControl BasicCard 5.5 3B FB 13 00 FF 81 31 80 75 5A 43 35 2E 36 20 52 45 56 20 4D 6A ZeitControl BasicCard ZC5.6 user-programmable smart card http://www.basiccard.com/index.html?overview.htm 3B FB 13 00 FF 81 31 80 75 5A 43 36 2E 35 20 52 45 56 20 43 64 ZeitControl BasicCard 6.5, multiapplication with 30 kByte EEPROM 3B FB 13 00 FF C0 80 31 80 75 5A 43 35 2E 34 20 52 45 56 20 41 A5 ZeitControl BasicCard Professional 5.4 Revision A 3B FB 13 00 FF C0 80 31 80 75 5A 43 35 2E 34 20 52 45 56 20 48 AC ZeitControl BasicCard Professional 5.4 3B FB 18 00 00 81 31 FE 45 00 31 C0 64 77 E9 10 00 01 90 00 62 ID card for personal of "Govern Illes Balears" http://www.caib.es/sacmicrofront/contenido.do?cont=7584&mkey=M08110610180317195848&&lang=en 3B FB 91 00 FF 91 81 71 FE 40 00 41 20 00 01 00 81 20 63 CB A0 80 03 Carrefour, MasterCard credit card, Pass Banque, Oberthur - contactless/PayPass 3B FB 96 00 00 80 31 FE 45 00 31 C0 64 77 E3 02 00 82 90 00 76 Oberthur ID-One Cosmo 3B FB 96 00 00 81 31 FE 45 00 31 C0 64 77 E9 10 00 01 90 00 EC Oberthur ID-ONE v5.4 3B FB 96 00 00 81 31 FE 45 00 31 C0 64 77 E9 10 00 0F 90 00 E2 Elektroniczna Legitymacja Studencka - Polish Student's ID Issued in Poznan in 2007 3B FB 96 00 00 81 31 FE 45 56 44 53 49 35 40 01 00 04 00 01 1F Vasco DIGIPASS KEY 200 usb token http://www.vasco.com/products/digipass/digipass_pki/digipass_pki_keys/digipass_key_200.aspx Should contain a 'Oberthur cosmo v 5.4 or V7.0D' smartcard 3B FB 98 00 FF C1 10 31 FE 55 00 64 05 20 47 03 31 80 00 90 00 F3 Gemplus GemGate 32K distributed by Postecert (www.postecert.it) to legally sign documents 3B FC 13 00 00 81 31 FE 45 59 75 62 69 6B 65 79 4E 45 4F 72 33 B1 Yubikey Neo http://www.yubico.com/products/yubikey-hardware/yubikey-neo/ 3B FC 98 00 FF C1 10 31 FE 55 C8 03 49 6E 66 6F 63 61 6D 65 72 65 28 New Card Infocamere (Italy) series 1402... http://www.card.infocamere.it/ Siemens Informatica - Siemens M4.01a chip Infineon SLE66CX322P (CC EAL5) Memory EEPROM: 32KB Operating system CARDOS Max numero dei tentativi PIN: 3 Pin: da 5 a 8 digit Unblocked by tool CARDOS API 2.2 3B FD 13 00 00 81 31 FE 45 41 37 30 30 36 43 47 20 32 34 32 52 31 D6 YubiKey NEO (token) 3B FD 13 00 00 81 31 FE 45 4A 43 4F 50 32 31 76 32 33 31 47 44 54 E1 National Health Insurance Card, Taiwan 3B FD 18 00 00 80 31 FE 45 00 31 80 71 8E 64 52 D9 04 00 81 90 00 5B Oberthur Card Systems, authentIC 3B FD 18 00 00 80 31 FE 45 73 66 74 65 2D 63 64 30 38 30 2D 6E 66 DC G&D Sm@Cafe 3.1 (eID) 3B FD 18 00 00 81 31 FE 45 53 43 45 36 30 2D 43 43 30 38 31 2D 46 C2 Giesecke & Devrient StarSign USB Token 3B FD 18 00 00 81 31 FE 45 80 31 80 65 40 90 7B 01 51 83 07 90 00 55 Croatian Health Care card 3B FD 18 00 00 81 31 FE 45 80 31 81 53 47 45 31 73 84 21 C0 81 07 2E Georgian ID Card 3B FD 18 00 FF 80 B1 FE 45 1F 07 80 73 00 21 13 57 4A 54 48 61 31 47 00 5F Activkey Sim http://www.actividentity.com/products/activkey_usb_tokens__home.php 3B FD 18 00 FF 80 B1 FE 45 1F 07 80 73 00 21 13 57 4A 54 48 61 31 48 00 50 G&D Sm@rtCafe Expert 64 v2 3B FD 18 00 FF 80 B1 FE 45 1F 07 80 73 00 21 13 57 4A 54 48 61 31 4A 00 52 e-CPF issued by AASP (Lawyers Association of São Paulo, Brazil) 3B FD 91 00 FF 91 81 71 FE 40 00 41 20 00 41 00 81 80 31 C0 73 D6 21 C0 D8 Sparkasse Hanau - German contactless GeldKarte (PPSE, girogo) https://www.geldkarte.de/_www/en/pub/geldkarte/service_navigation/about_us.php 3B FD 94 00 00 81 31 20 43 80 31 80 65 B0 83 02 04 7E 83 00 90 00 B6 GXPPRo-R3.x STD PTS T=1 Latvian Digital Signature Card (cold) (http://www.eme.lv/) 3B FD 94 00 00 81 31 60 65 80 31 C0 69 4D 54 43 4F 53 73 01 01 11 E0 MTCOS Light, http://www.masktech.de/products/mtcoslight/index.html 3B FD 96 00 00 81 31 20 43 80 31 80 65 B0 83 11 00 C8 83 00 90 00 15 Gemalto TOP IM GX4 MSA081, T=1 (PKI) 3B FD 96 00 00 81 31 20 43 80 31 80 65 B0 83 11 48 C8 83 00 90 00 Pay TV 3B FE 18 00 00 80 31 FE 45 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 A8 Estonian Identity Card (EstEID 3.0 "JavaCard" cold) 3B FE 18 00 00 80 31 FE 45 80 31 80 66 40 90 A4 16 2A 00 83 01 90 00 E1 Estonian Identity Card (EstEID 3.0 "JavaCard" warm) 3B FE 18 00 00 80 31 FE 45 80 31 80 66 40 90 A4 16 2A 00 83 0F 90 00 EF iEstonian Identity Card (EstEID 3.0 (18.01.2011) warm) 3B FE 91 00 FF 91 81 71 FE 40 00 41 28 00 01 80 81 00 73 C8 40 00 00 90 00 4D Philips SmartMX chip (IBMs JCOP OS) 3B FE 91 00 FF 91 81 71 FE 40 00 41 28 00 11 33 B0 4A 43 4F 50 33 31 56 32 C4 JCOP31 72K dual interface functionality, 1K Mifare emulation. 3B FE 94 00 00 80 1F 42 80 31 80 66 47 50 20 45 83 01 83 01 90 00 02 TATA Docomo UICC (Telecommunication) http://www.tatadocomo.com/ 3B FE 94 00 FF 80 B1 FA 45 1F 03 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 43 Estonian Identity Card (EstEID v1.0 cold) Estonian Identity Card (EstEID v1.1 "MULTOS" warm) 3B FE 96 00 FF C0 0A 31 FE 4D 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 9B Estonian Identity Card (EstEID v1.1 compatible) http://www.id.ee/?id=11019&&langchange=1 3B FF .. 00 FF 81 31 .. 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. Debit card (Germany): ec-cash, GeldKarte(EUR), Maestro, Cirrus, ... 3B FF 00 00 FF 81 31 FE 45 80 25 A0 00 00 00 56 57 53 43 36 35 30 00 00 00 SafeNet SC650 3B FF 00 FF 81 31 .. 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. Debit card (Germany): ec-cash, GeldKarte(EUR), Maestro, Cirrus, ... 3B FF 11 00 00 81 31 FE 4D 80 25 A0 00 00 00 56 57 44 4B 33 33 30 06 00 D0 Datakey 32K PKI Smart Card Model 330 (http://www.datakey.com/products/smart_cards/products_sc_330.shtml) 3B FF 11 00 00 81 71 40 42 00 00 21 01 31 42 52 00 0[0,5] 63 .. .. .. .. 90 00.* Smart Card "The Smart Way to Login" Used on Acer TravelMate to secure boot 3B FF 11 00 02 40 64 80 69 A2 07 01 03 57 00 00 FF 00 83 00 90 00 Gemplus GemXpresso 3B FF 13 00 00 81 31 FE 45 4F 57 4F 4B 31 30 2D 4A .. .. .. .. .. .. .. .. OWOK (One Web, One Key) login card, http://www.reiner-sct.com/owok/ Reiner SCT loginCard https://cardlogin.reiner-sct.com/ 3B FF 13 00 00 81 31 FE 4D 80 25 A0 00 00 00 56 57 44 4B 33 33 30 06 00 D2 Datakey DCOS model 330 (DKCCOS 6.0 token) 3B FF 13 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 01 01 01 65 Portugal Santander Totta Universitários "Associação Academica de Coimbra" 3B FF 13 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 18 02 08 76 SmartCafe Expert Java 3B FF 13 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 18 03 08 77 Giesecke & Devrient SmartCafe Expert 32K v2.0 #2 3B FF 13 00 FF 81 31 FE 45 65 63 11 04 50 02 80 00 08 39 00 04 02 05 02 E9 German "Geldkarte" supplied by the Deutsche Bank in Karlsruhe, Baden-Württemberg, Germany. 3B FF 13 00 FF 81 31 FE 45 65 63 11 04 50 02 80 00 08 54 00 04 23 05 02 A5 Maestrocard/Geldkarte (Stadtsparkasse Haltern, Germany) 3B FF 13 00 FF 81 31 FE 5D 80 25 A0 00 00 00 56 57 44 4B 33 32 30 05 00 3F Datakey DCOS model 320 3B FF 18 00 00 81 31 FE 45 00 6B 04 05 01 00 01 11 01 43 4E 53 10 31 80 69 Sanitary Card of "Friuli Venezia Giulia" region (Italian Republic) Carta Nazionale dei Servizi (Italia) http://cartaservizi.regione.fvg.it/ 3B FF 18 00 00 81 31 FE 45 00 6B 04 05 01 00 01 12 02 48 50 43 10 31 80 6C Carta del Professionista Sanitario - CNS - Provincia autonoma di Trento Professional Health card, Autonomous Province of Trento 3B FF 18 00 00 81 31 FE 45 00 6B 04 05 01 00 01 21 01 43 49 45 10 31 80 48 hybrid card for various health services and regional services (access to various organizations and digital signatures) 3B FF 18 00 00 81 31 FE 45 00 6B 04 05 01 00 01 21 01 43 4E 53 10 31 80 59 CNS - Carta Nazionale dei Servizi (Italia) PA emittente: Regione Autonoma della Sardegna Carta del Servizio Sanitario Regionale - Emilia Romagna 3B FF 18 00 00 81 31 FE 4D 80 25 A0 00 00 00 56 57 44 4B 34 30 30 06 00 DD DataKey 400 (DK400) 3B FF 18 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 18 03 08 7C Giesecke & Devrient Sm@rtCafé Expert 2.0 3B FF 18 00 FF 80 31 FE 45 53 6D 40 72 74 43 61 66 65 45 78 70 65 72 74 65 Giesecke & Devrient SmartCafe 32K v1 3B FF 18 00 FF 81 31 .. 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. Geldkarte (generic ATR) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 00 26 00 04 10 09 Maestrocard/Geldkarte (Postbank, Germany) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 01 55 00 04 10 7B Volksbank VR-BankCard (GeldKarte) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 05 29 00 04 10 03 Geldkarte/HBCI(DDV-1) (Stadtsparkasse Vorpommern, Germany) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 07 88 00 04 10 A0 HBCI-Karte (Berliner Sparkasse, Germany) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 13 82 00 04 10 BE Bremer Karte ("Geldkarte und BSAG-Kundenkarte in einem.") http://www.bsag.de/4911.php 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 14 06 00 04 10 3D Geldkarte/HBCI(DDV-1) (Staedtische Sparkasse Offenbach, Germany) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 14 44 00 04 10 7F Geldkarte/HBCI (Kreissparkasse Ebersberg, Deutschland) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 55 70 00 04 10 0A EC-Card from DKB (Deutsche Kreditbank AG) 3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 80 00 12 24 30 00 20 04 10 59 Geldkarte (Germany) 3B FF 18 00 FF 81 31 50 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. GeldKarte v3 (Germany) 3B FF 18 00 FF 81 31 FE 45 54 48 43 43 31 30 54 45 43 4F 47 44 49 4E 31 26 National Health Insurance Card, Taiwan 3B FF 18 00 FF 81 31 FE 45 65 63 0D 04 50 02 80 00 08 90 09 70 00 05 00 2A Landesbank baden-Württemberg Geldkarte 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 05 28 00 0D 90 81 06 00 06 15 58 Geldkarte/HBCI (Frankfurter Sparkasse, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D .. .. .. .. 06 15 .. Giesecke & Devrient GmbH ROM Mask=ecD6.3 Init-Table=SDP2G3F0.E_2 (BES0), SWP2G3H0.E_1 (CS0) Signaturerstellungseinheit ZKA TUVIT.93125.TU.12.2005 Banking Signature Card, v6.32, Type 3 TUVIT.93125.TU.12.2005 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D .. .. .. .. 06 15 .. Giesecke & Devrient GmbH ROM Mask=SDP2G330.E_1 (BES0), SWP2G370.E_1 (CS0) Init-Table=ecD6.3 Signaturerstellungseinheit ZKA TUVIT.09397.TU.03.2005 Banking Signature Card, v6.31 NP, Type 3 TUVIT.09397.TU.03.2005 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 58 45 00 06 15 8C Stadtsparkasse München electronic cash card / Geldkarte 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 73 07 00 06 15 E5 Sparkasse Acchen HBCI Geld Karte 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 74 32 00 06 15 D7 German HBCI-Banking Card with 'Geldkarte' from the bank "Sparkasse Marburg-Biedenkopf" 3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 92 61 00 06 15 62 Geldkarte (Frankfurter Sparkasse, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 0D 08 65 07 64 00 0D .. .. .. .. 06 16 .. Giesecke & Devrient GmbH ROM Mask=ecD6.5 Init-Table=SWP3G5J0.E_1 (CS0) Signaturerstellungseinheit ZKA Banking Signature Card, v6.51 TUVIT.93129.TU.03.2006 3B FF 18 00 FF 81 31 FE 45 65 63 0D 08 65 07 64 00 0D 91 04 90 00 06 16 0E German Railway's (Deutsche Bahn AG) "Konzernausweis" 3B FF 18 00 FF 81 31 FE 45 65 63 0D 0C 76 07 64 00 0D 95 81 20 00 07 30 0F Master Card Credit Card issued by WGZ bank (all german volksbank institutes use them) 3B FF 18 00 FF 81 31 FE 45 65 63 11 03 50 02 80 00 08 27 70 02 06 05 01 8A old banking card (electronic-card / Maestro / Geldkarte) of the "Volksbank Gelderland eG" (around 2003) 3B FF 18 00 FF 81 31 FE 45 65 63 11 05 40 02 50 00 10 55 10 03 03 05 00 43 belongs to a banking card (electronic-card / Maestro / Geldkarte). the bank calls it "VR-BankCard". the banks name is "Volksbank Gelderland eG" and is part of the "Volksbanken und Raiffeisenbanken" (http://www.vb-gelderland.de/html/5/2394/rubrik/1282.html) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 .. .. .. .. 05 00 .. Gemplus-mids GmbH, ROM Mask=ZKA 322 V5A, Init-Table=SWI1P070.E_0 (CS0),SDI1P080.E_1 (BES0), Signaturerstellungseinheit ZKASignaturkarte v5.02, TUVIT.09385.TU.09.2004 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 05 50 03 10 05 00 43 HBCI-Karte (Bordesholmer Sparkasse, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 19 10 04 20 05 00 28 Stadtsparkasse München HBCI card / Geldkarte 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 25 60 05 12 05 00 57 Geldkarte/HBCI(DDV-1) (Stadtsparkasse Vorpommern, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 27 30 02 16 05 00 06 GeldKarte from Sparkasse bank 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 27 80 03 25 05 00 84 Volksbank VR-BankCard (GeldKarte) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 28 50 01 11 05 00 6D HBCI Bancing Card of Sparkasse Pforzheim 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 .. .. .. .. 06 13 .. Giesecke & Devrient GmbH ROM Mask=ecD6.2, Init-Table=SDI1G280.E_1 (BES0), Signaturerstellungseinheit ZKA Banking Signature Card, v6.2b NP & 6.2f NP, Type 3 TUVIT.09395.TU.01.2005 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 06 60 03 04 06 13 87 Geldkarte (Volksbank Offenburg, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 16 50 05 17 06 13 B2 FinTS (BBBank Karlsruhe, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 20 90 03 09 06 13 5C Geldkarte [ec, Maestro] (1822 direkt Frankfurter Sparkasse, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 43 50 01 17 06 13 E3 EC-Card of Sparkasse Pforzheim Calw 3B FF 18 00 FF 81 31 FE 45 65 63 11 07 51 02 50 00 10 72 80 00 02 06 20 C6 Maestro Card Deutsche Kredit Bank (DKB) / Germany 3B FF 18 00 FF 81 31 FE 45 65 63 11 07 64 02 80 00 11 .. .. .. .. 06 19 .. Giesecke & Devrient GmbH ROM Mask=ecD6.4 Init-Table=SDI2G4G0.E_4 (BES0), SWI2G4H0.E_2 (CS0) Signaturerstellungseinheit ZKA 17.01.2006 Banking Signature Card, v6.4 TUVIT.93123.TU.01.2006 3B FF 18 00 FF 81 31 FE 45 65 63 11 08 43 02 50 00 10 .. .. .. .. 05 30 .. Gemalto ROM Mask=ZKA 680 V5A Init-Table=SSI3P3M6E_1 (MS0) Massen-Signaturerstellungseinheit ZKA Banking Signature Card, Version 5.11M TUVIT.93148.TU.06.2007 3B FF 18 00 FF 81 31 FE 45 65 63 11 08 43 02 50 00 10 46 50 01 08 05 30 27 HBCI-Karte (Sparkasse Altmark-West, Salzwedel, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 11 08 43 02 50 00 10 84 70 01 04 05 30 C9 HBCI Card (1822 direkt Frankfurter Sparkasse, Germany) Geldkarte [ec, Maestro] 3B FF 18 00 FF 81 31 FE 45 65 63 11 08 66 02 80 00 11 .. .. .. .. 06 20 .. Giesecke & Devrient GmbH ROM Mask=ecD6.6 Init-Table=SDI3G6G0.E_3 (BES0), SSI3G6M0.E_2 (S0), SWI3G6H0.E_3 (CS0) Signaturerstellungseinheit ZKA Banking Signature Card, Version 6.6 TUVIT.93130.TU.05.2006 - 2. Nachbestätigung 3B FF 18 00 FF 81 31 FE 45 65 63 11 08 66 02 80 00 11 40 50 03 18 06 20 D4 banking card (electronic-card / Maestro / Geldkarte). the bank+calls it "S-Card" or "Sparkassen-Card". the banks name is "Stadtsparkasse Duesseldorf" and is part of the "Sparkassen-Finanzgruppe" (a finance group, network of local banks). 3B FF 18 00 FF 81 31 FE 45 65 63 11 08 66 02 80 00 11 56 00 03 18 06 20 92 Geldkarte [ec, Maestro] (Sparkasse Langen-Seligenstadt, Germany) 3B FF 18 00 FF 81 31 FE 45 65 63 19 01 50 02 80 00 0F .. .. .. .. 05 12 .. SAGEM ORGA GmbH ROM Mask=SecV1.5.3 Init-Table=SDR0O1G0.A_B (BES0), SWR0O1H0.A_5 (CS0) Signaturerstellungseinheit ZKA SECCOS Sig v1.5.3 BSI.02076.TE.12.2006 3B FF 18 00 FF 81 31 FE 45 65 63 1A 01 41 02 50 00 10 52 09 05 67 05 10 21 Maestro/Geldkarte (BBBank Karlsruhe, Germany) 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 01 01 43 4E 53 10 31 80 9F Carta Nazionale dei Servizi - InfoCamere 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 01 01 44 53 44 10 31 80 92 Postcom S.P.A. (digital certificate) 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 11 01 43 4E 53 10 31 80 8F Carta Regionale dei Servizi - Regione Lombardia 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 11 01 43 4E 53 11 31 80 8E Infocamere CNS 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 03 00 01 11 01 43 4E 53 11 31 80 8F Card description: Multiservice Card - CMCC - Arma Carabinieri (Carta Multiservizi) 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 03 03 01 01 01 43 4E 53 10 31 80 9D Aruba CNS for Regione Toscana (IT) http://www.regione.toscana.it 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 03 03 01 01 01 44 53 44 10 31 80 90 Postecert (www.postecert.it) to legally sign documents 3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 03 03 01 11 01 43 4E 53 11 31 80 8C Infocert 1205* smart card Universita' Degli Studi di Torino (Infocert) 3B FF 18 00 FF C1 0A 31 FE 55 00 6B 05 08 C8 05 01 11 01 43 4E 53 10 31 80 0C Carta Regionale dei Servizi - Regione Lombardia 3B FF 18 00 FF C1 0A 31 FE 55 00 6B 05 08 C8 09 01 11 01 43 4E 53 10 31 80 00 Carta regionale dei servizi - Regione Sicilia http://www.regione.sicilia.it/crs/index.asp 3B FF 18 00 FF C1 0A 31 FE 55 00 6B 05 08 C8 0A 01 11 01 43 4E 53 10 31 80 03 Carta Regionale dei Servizi - Regione Lombardia 3B FF 18 00 FF C1 0A 31 FE 55 00 6B 05 08 C8 0C 01 11 01 43 4E 53 10 31 80 05 Healthcare card (TS-CNS) - Provincia Autonoma di Trento 3B FF 32 00 00 10 80 80 31 E0 5B 47 42 50 00 00 00 00 00 00 02 55 UK NatWest BT PayToView Mondex 3B FF 94 00 00 00 43 4D 42 5F 55 42 53 69 67 6E 30 30 30 32 15 UBS Access Card used for online banking with UBS in Switzerland. It resides in a calculator like token, that is used for a challenge response when logging in. 3B FF 94 00 00 40 0A 80 31 00 73 12 21 13 57 4A 33 0E 01 31 41 00 O2 Loop SIM card 3B FF 94 00 00 40 0A 80 31 00 73 12 21 13 57 4A 33 0E 02 32 41 00 Turkcell SIMPlus64 / Turkey 3B FF 94 00 00 C0 0A B1 FE 49 1F 43 80 31 E0 73 F6 21 13 57 34 36 43 41 32 30 20 68 Sonera UICC (Telecommunication) 3B FF 94 00 FF 80 B1 FE 45 1F 03 00 68 D2 76 00 00 28 FE 05 22 31 80 00 90 00 1E Alice Business card (to be used in the modem supplied by an Italian provider) 3B FF 94 00 FF 80 B1 FE 45 1F 03 00 68 D2 76 00 00 28 FF 05 1E 31 80 00 90 00 23 D-Trust Signature Card (www.d-trust.net): - Citizencard of the People of Ulm in Germany (Bürgerkarte) - Qualified Electronic Signature Card (Qualifizierte Signaturkarte) 3B FF 94 00 FF C0 0A 1F 43 80 31 E0 73 36 21 13 57 4A 43 49 1C 31 30 32 1C Giesecke & Devrient - UniverSIM Pegasus 3B FF 95 00 00 C0 0A 1F 43 80 31 E0 73 36 21 13 57 4A 33 0E 02 31 41 00 88 "BASE" SIM card; BASE is a german mobile phone operator, which is a brand of E-Plus, Germany. 3B FF 95 00 FF 40 0A 80 31 00 73 1A 21 13 57 4A 50 48 60 31 41 47 Vodafone 64 KB SIM with Javacard 3B FF 95 00 FF 40 0A 80 31 E8 73 F6 21 13 67 4A 47 48 60 31 42 00 Giesecke & Devrient STARSIM 3B FF 95 00 FF C0 0A 1F 43 80 31 E0 73 36 21 13 57 4A 33 20 07 33 41 41 1F Swisscom 3G SIM card 3B FF 95 00 FF C0 0A 1F 43 80 31 E0 73 F6 21 13 57 4A 33 48 57 31 41 41 E5 MTNL 3G USIM (India) 3B FF 95 00 FF C0 0A 1F 43 80 31 E0 73 F6 21 13 57 4A 33 48 61 32 41 47 D6 GSM SIM (issued by e-plus, Germany) 3B FF 95 00 FF C0 0A 1F 43 80 31 E0 73 F6 21 13 57 4A 55 48 60 32 41 00 F6 GSM SIM from O2 Germany (UMTS ready) from 2005 3B FF 95 00 FF C0 0A 1F 47 80 31 E0 73 F6 21 13 57 4A 33 20 0B 31 41 41 D5 Telenor SIM card (Norway) 3B FF 96 00 FF 81 31 FE 45 65 63 0D 09 71 07 64 00 0D 00 03 54 50 07 01 81 Commerzbank ServiceCard / Maestro / GeldKarte / Cirrus / girocard / CashGroup / electronic cash 3B FF 96 00 FF 81 31 FE 45 65 63 19 01 50 02 80 00 0F 00 2B 00 46 50 11 72 Sparkasse Bremen Germany HBCI DDV 3B FF 96 00 FF 81 31 FE 45 65 63 19 01 50 02 80 00 0F 00 2F 00 25 50 11 15 German Postbank Giro card with electronic cash, Maestro, GeldKarte features 3B FF 96 00 FF C0 0A 1F 43 80 31 E0 73 36 21 13 57 4A 43 49 1C 31 30 32 1E Giesecke & Devrient - UniverSIM Pegasus 3F 05 DC 20 FC 00 01 DigiCash Facility Card 3F 28 00 00 11 14 00 03 68 90 00 SIMEMU - a DIY GSM SIM card - http://simemu.cjb.net/ 3F 2D 00 27 A0 51 82 7D 00 00 00 52 00 0C 90 00 Porta Moedas Multibanco (Portugeese electronic purse) 3F 2F 00 80 59 AF 02 01 01 30 00 00 0A 0E 83 06 9F 12 Gemplus GemXplore 3F 2F 00 80 59 AF 02 01 02 30 00 0C 0A 0E 83 1E 9F 16 GSM-SIM (900MHz) card of the carrier "Mannesmann Mobilfunk" for their network "D2-Privat" - now known as Vodafone Mobilfunk (http://www.vodafone.de/). 3F 2F 00 80 69 AE 02 02 01 36 00 00 0A 0E 83 3E 9F 16 GSM-SIM e-plus (1800MHz) 3F 2F 00 80 69 AF 02 04 01 36 00 02 0A 0E 83 3E 9F 16 GSM-SIM D2 CallYa (900MHz) 3F 2F 00 80 69 AF 03 07 01 59 00 00 0A 0E 83 3E 9F 16 Nokia SIM Ph2 16K Ver2.0 3F 2F 00 80 69 AF 03 07 01 59 00 13 0A 0E 83 3E 9F 16 Old Spanish Telefónica Movistar GSM SIM card manufactured by Gemplus 3F 2F 00 80 69 AF 03 07 03 52 00 00 0A 0E 83 3E 9F 16 GemXplore 98 V1 16K 3F 2F 00 80 69 AF 03 07 03 52 00 0D 0A 0E 83 3E 9F 16 GSM-SIM Debitel D2 (900MHz) 3F 2F 00 80 69 AF 03 07 03 5A 00 15 0A 0E 83 3E 9F 16 Virgin Mobile SIM (Gemplus) 3F 3D 11 00 80 67 28 50 04 02 20 00 00 83 8E 90 00 GSM SIM card of the Austrian provider A1 3F 3E 11 00 46 52 45 43 43 49 41 52 4F 53 53 41 90 00 Trenitalia (Italy) fidelity card "CartaFreccia" (Smartcard) 3F 3F 94 00 80 69 AF 03 07 01 59 00 00 0A 0E 83 3E 9F 16 Finnish SIM card from "Radiolinja" now "Elisa" 3F 65 25 .. .. 04 6C 90 .0 Carte Bancaire (French banking card) 3F 65 25 00 2B 09 62 90 00 Coinamatic SmartyCity smartcard 3F 65 25 00 2B 09 69 90 00 Municipal parking meter card for the City of St. John's, NL, Canada. The city's web site is: http://www.stjohns.ca/index.jsp 3F 65 25 00 2B 09 EB 90 00 Bull Scot 5 3F 65 25 00 2[2,C] 09 [F,6]9 90 00 Sesam Vitale (French health card) 3F 65 25 00 52 09 6A 90 00 French carte Vitale 3F 65 25 00 A[3,4] 09 6A 90 00 Sesam Vitale (French health card) 3F 65 25 08 22 04 68 90 00 France Telecom card (ex Pastel card) 3F 65 25 08 23 04 68 90 00 France Telecom card 3F 65 25 08 33 04 20 90 00 D-Trust card 3F 65 25 08 43 04 6C 90 00 CB visa La Poste France (Oberthur) CB visa Societe Generale France (Oberthur) 3F 65 25 08 63 04 6C 90 00 CB visa La Poste France (Oberthur) CB Master Carte du Crédit Mutuel 3F 65 25 08 65 04 6C 90 00 CB visa Boursorama France (Axalto) 3F 65 35 10 0. 04 6C 90 00 Postcard (Switzerland) 3F 65 35 64 02 04 6C 90 40 Postcard (Switzerland) 3F 67 25 00 21 20 00 0F 68 90 00 Smart Builder "your kit for PC/SC applications" and Bull http://www.cp8.bull.net/ 3F 67 25 00 21 20 00 0F 78 90 00 Bank Nederlandse Gemeenten, BNG Data Services 3F 67 25 00 26 14 00 20 68 90 00 Pay-TV card from Casema Cable Television, Netherland 3F 67 25 00 2A 20 00 0F 68 90 00 Carte Grand Voyageur (SNCF: French train company) 3F 67 25 00 2A 20 00 40 68 9F 00 Swiss Cash card Chipknip SNS Bank (banking card) 3F 67 25 00 2A 20 00 41 68 90 00 ChipKnip 3F 67 25 00 2A 20 00 4[0,1] 68 90 00 Dutch ChipKnip, Proton (chip Bull CC 60 V1, Bull CC 60 V2 or Bull CC 1000) 3F 67 25 04 21 20 00 07 68 90 00 Philips TB100 (C-MOS chip) 3F 67 2F 04 11 20 00 00 68 90 00 BULL HN ITALIA 06/92 - 100.000 - 64MP La Sapienza - Universita' di Roma 3F 69 00 00 24 AF 01 70 01 01 FF 90 00 French GSM SIM card (900MHz) 3F 6A 00 00 00 64 01 50 01 0C 82 01 01 A9 Credit Card café Selecta 3F 6C 00 00 24 A0 30 00 FF 00 00 01 00 04 90 00 Gemplus MCOS 16K DES Sample Card 3F 6C 00 00 25 A0 30 89 76 00 00 04 01 0C 90 00 MCOS 24k EEPROM 3F 6C 00 00 3C A0 30 9E 61 00 00 01 00 04 90 00 Gemplus - British Gas - Gascard 3F 6C 00 00 3C A0 30 A7 58 00 00 01 01 8C 90 00 Rendezvous Series 7 (D2-Mac satellite TV card) 3F 6D 00 00 80 31 80 65 B0 05 01 02 5E 83 00 90 00 Gemplus GemXpresso 211PK or 211PK-IS 3F 6D 00 00 80 31 80 65 B0 05 01 02 5E 92 00 90 00 Gemplus GemXpresso 32K 3F 77 18 00 00 C1 14 00 A2 68 90 00 Viacess card HRT (Hrvatska Radio Televizija) 3F 77 18 00 00 C2 14 00 C1 68 90 00 Viaccess Sexview 3F 77 18 00 00 C2 47 40 00 68 90 00 Viacces card: SRG SSR idèe suisse 3F 77 18 00 00 C2 7A 41 02 68 90 00 Viacces card: SRG SSR idée suisse 3F 77 18 00 00 C2 7A 42 02 68 90 00 SCT (Via Access) 3F 77 18 00 00 C2 7A 43 02 68 90 00 DORCEL (Via Access) 3F 77 18 00 00 C2 7A 44 02 68 90 00 XXX Redlight_HD (Viaccess) 3F 77 18 25 00 29 14 00 62 68 90 00 Viaccess card 3F 78 12 25 01 40 B0 03 4A 50 20 48 55 DSS/DTV H 3F 78 13 25 03 40 B0 20 FF FF 4A 50 00 DSS/DTV P4 3F 7E 11 25 05 40 B0 08 00 00 4D 59 00 00 00 53 4B 0B 07 BSkyB Series 11 (DSS satellite TV card) 3F 7E 11 25 05 40 B0 08 00 00 4D 59 00 00 00 53 4B 0B 08 Sky Series 11 (DSS satellite TV card) 3F 7E 11 25 09 40 B0 01 00 00 4D 59 00 00 03 53 4B 0A 01 Sky Series 10 (DSS satellite TV card) 3F 7F 11 25 03 33 B0 09 69 FF 4A 50 70 00 00 56 54 01 00 00 Viasat Baltic (satellite card, NDS) 3F 7F 11 25 05 40 B0 0F 69 FF 4D 59 00 00 00 53 4B 0C 06 00 Sky Series 12 (DSS satellite TV card) 3F 7F 13 25 02 40 B0 0C 69 FF 4A 50 C0 00 00 52 53 00 00 00 Stream Italy NDS 1 (Pay TV) 3F 7F 13 25 03 33 B0 06 69 FF 4A 50 D0 00 00 53 59 00 00 00 Sky 2005/6 (DSS satellite TV card) 3F 7F 13 25 03 33 B0 11 69 FF 4A 50 50 00 00 49 56 01 00 00 Indonesia Videoguard 2 card 3F 7F 13 25 03 38 B0 04 FF FF 4A 50 00 00 29 48 55 .. .. .. DSS/DTV HU 3F 7F 13 25 03 40 B0 0B 69 4C 4A 50 C0 00 00 53 59 00 00 00 Sky Digital (DSS satellite TV card) 3F 7F 13 25 05 40 B0 11 69 FF 4A 50 00 00 00 47 54 00 0C 00 YES DBS Israel Videoguard 090C,090D 3F 96 18 80 01 80 51 00 61 10 30 9F Atmel/Athena T0 Inverse Convention PC/SC Compliance Test Card No. 2 3F EF 00 FF 81 31 .. 45 65 63 Debit card (Germany): ec-cash, GeldKarte(DEM), Maestro, Cirrus 3F FD 13 25 02 50 00 0F 33 B0 0F 69 FF 4A 50 D0 00 00 53 59 02 Sky Digital (DSS satellite TV card) 2009 issue 3F FD 13 25 02 50 80 0F .. B0 .. 69 FF 4A 50 D0 80 00 49 54 03 Sky (Italy) VideoGuard CAM card 3F FD 13 25 02 50 80 0F 33 B0 08 FF FF 4A 50 90 00 00 47 4C 01 Sky (Brasil) VideoGuard CAM card 3F FD 14 25 01 50 00 0F 33 B0 0B FF FF 4A 50 80 00 00 47 58 01 DirecTV card 3F FD 15 25 02 50 80 0F 41 B0 0A 69 FF 4A 50 F0 00 00 50 31 03 Sky Germany [NDS|V14] (098C:000000) (Pay TV) 3F FF 11 25 03 10 80 41 B0 06 69 FF 4A 50 70 00 00 41 5A 01 00 11 Astro (Pay TV) http://www.astro.com.my 3F FF 11 25 03 10 80 41 B0 07 69 FF 4A 50 70 00 00 50 31 01 00 11 Sky (Germany) VideoGuard CAM card (www.sky.de) 3F FF 13 25 02 50 80 0F 54 B0 03 FF FF 4A 50 80 00 00 00 00 47 4C 05 Sky (Brasil) VideoGuard CAM card 3F FF 13 25 03 10 80 33 B0 0E 69 FF 4A 50 70 00 00 49 54 02 00 00 Sky entitlement card 3F FF 13 25 03 10 80 33 B0 10 69 FF 4A 50 70 00 00 4E 5A 01 00 00 NDS SKY NZ (Pay TV) 3F FF 13 25 0B 50 00 0F 33 B0 04 69 FF 4A 50 E0 00 00 53 35 00 00 00 Stream TV (IP television) decoder card, provided by stream.ru ISP in Moscow 3F FF 13 25 0B 50 00 0F 33 B0 04 69 FF 4A 50 E0 00 00 54 38 00 00 00 Stream TV (IP television) decoder card, provided by aon (Telekom Austria) TV card, contains Incorporated NDS Videoguard (TM) security system 3F FF 14 25 03 10 80 33 B0 10 69 FF 4A 50 70 00 00 5A 45 01 00 00 Norwegian DVB-C provider Get (www.get.no). NDS Videoguard security card. 3F FF 14 25 03 10 80 41 B0 01 69 FF 4A 50 70 00 00 5A 48 01 00 00 "D-Smart" NDS from Turkie 3F FF 14 25 03 10 80 41 B0 01 69 FF 4A 50 70 00 00 5A 4B 01 00 00 Pay TV, Viasat Ukraine 3F FF 14 25 03 10 80 41 B0 02 69 FF 4A 50 70 80 00 41 4F 01 00 14 Pay TV 3F FF 14 25 03 10 80 54 B0 01 69 FF 4A 50 70 00 00 4B 57 01 00 00 PayTV Card Kabel BW (www.kabelbw.de), Encryption: NDS by Videoguard, Distribution Standard: DVB-C 3F FF 3F 3F 3F 3F 00 3F 3F FF 3F 3F 3F 3F 3F FF 3F FF 95 3F FF 95 3F FF Premium joker card to see Spanish TDT premium (goltv) 3F FF 95 00 FF 91 81 71 .. 47 00 .. 4. 4. .. .. 3. 3. 3. 20 .. 65 7. .. .. .. .. Nagravision TV CAM card — http://en.wikipedia.org/wiki/Nagravision 3F FF 95 00 FF 91 81 71 .. 47 00 4E 43 4D 45 44 3. 30 3. 20 52 65 76 .. 3. 3. .. Mediaset Premium (Italy) CAM card 3F FF 95 00 FF 91 81 71 64 47 00 44 4E 41 53 50 30 30 33 20 52 65 76 33 32 33 FF Satellite TV Card "Via Digital" (Nagra) 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 30 20 52 65 76 41 32 30 48 DSS/DISH ROM10 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 30 20 52 65 76 41 32 31 49 PayTV card for DishNetwork Sat receiver http://www.dishnetwork.com/ 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 NTL digial TV card (Nagravision) 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 30 36 4E Telewest Broadband (Nagravision) 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 30 42 3A NagraVision card for StarHub Digital Cable DVB-C Singapore 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 30 44 3C NagraVision card for Virgin Media in the UK 3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 31 38 30 20 4D 65 72 30 30 30 28 NagraVision (VG04) for Virgin Media (UK) NagraVision 3 for DigiTV (Romania) http://www.rcs-rds.ro/televiziune-digi-tv/satelit 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 30 31 14 TVA Digital - Nagra Vision ID TV-01 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 30 37 12 UPC Austria/UPC-Cablecom Switzerland, digital television encryption card http://www.upc-cablecom.ch/ 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 32 32 15 UM01 card from German Unitymedia cable TV provider 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 34 35 14 Telenet N.V. HDTV Decoder Card Belgium 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 43 33 65 Brazilian NET Digital (Cable TV provider) - Nagra Vision "NASP110 RevA01" 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 34 32 20 52 65 76 47 30 32 16 Polsat Nagra3 Brazil - Claro TV Nagra3 Red 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 34 32 20 52 65 76 47 30 34 10 Nagra 3 Card - Telefonica Brazil Green 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 34 32 20 52 65 76 47 30 36 12 UM02 card from German Unitymedia cable TV provider 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 34 32 20 52 65 76 47 43 34 63 HD+ card used by the satelite company astra for decryption of the HDTV channels of RTL, VOX, Sat1 and ProSieben. Nagravision V3 is used for the encryption. 3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 38 30 20 4D 65 72 4A 30 32 0E Nagra 3 Digital Plus Spain 3F FF 95 00 FF 91 81 71 FE 47 00 54 49 47 45 52 36 30 31 20 52 65 76 4D 38 30 13 Spanish pay TV card for GOLTV 3F FF 95 00 FF 91 81 71 FF 47 00 44 4E 41 53 50 53 30 31 20 44 73 68 36 30 39 16 PayTV card for DishNetwork Sat receiver http://www.dishnetwork.com/ Cards were obsoleted in nationwide system update in 2009. 3F FF 95 00 FF 91 81 71 FF 47 00 54 49 47 45 52 30 30 33 20 52 65 76 32 35 30 64 Tivu' Sat (Italy) CAM card www.tivu.tv # do not delete cardpeek-0.8/dot_cardpeek_dir/scripts/etc/paris-metro.lua0000644000175000017500000002252312135147243020557 00000000000000METRO_LIST = { [01] = { ["name"] = "Cité", [01] = "Saint-Michel", [04] = "Odéon", [05] = "Cluny - La Sorbonne", [06] = "Maubert - Mutualité", [07] = "Luxembourg", [08] = "Châtelet", [09] = "Les Halles", [10] = "Les Halles", [12] = "Louvre - Rivoli", [13] = "Pont Neuf", [14] = "Cité", [15] = "Hôtel de Ville" }, [02] = { ["name"] = "Rennes", [02] = "Cambronne", [03] = "Sèvres - Lecourbe", [04] = "Ségur", [06] = "Saint-François-Xavier", [07] = "Duroc", [08] = "Vaneau", [09] = "Sèvres - Babylone", [10] = "Rue du Bac", [11] = "Rennes", [12] = "Saint-Sulpice", [14] = "Mabillon", [15] = "Saint-Germain-des-Prés" }, [03] = { ["name"] = "Villette", [04] = "Porte de la Villette", [05] = "Aubervilliers - Pantin - Quatre Chemins", [06] = "Fort d'Aubervilliers", [07] = "La Courneuve - 8 Mai 1945", [09] = "Hoche", [10] = "Église de Pantin", [11] = "Bobigny - Pantin - Raymond Queneau", [12] = "Bobigny - Pablo Picasso" }, [04] = { ["name"] = "Montparnasse", [02] = "Pernety", [03] = "Plaisance", [04] = "Gaîté", [06] = "Edgar Quinet", [07] = "Vavin", [08] = "Montparnasse - Bienvenüe", [12] = "Saint-Placide", [14] = "Notre-Dame-des-Champs" }, [05] = { ["name"] = "Nation", [02] = "Robespierre", [03] = "Porte de Montreuil", [04] = "Maraîchers", [05] = "Buzenval", [06] = "Rue des Boulets", [07] = "Porte de Vincennes", [09] = "Picpus", [10] = "Nation", [12] = "Avron", [13] = "Alexandre Dumas" }, [06] = { ["name"] = "Saint-Lazare", [01] = "Malesherbes", [02] = "Monceau", [03] = "Villiers", [04] = "Quatre-Septembre", [05] = "Opéra", [06] = "Auber", [07] = "Havre - Caumartin", [08] = "Saint-Lazare", [09] = "Saint-Lazare", [10] = "Saint-Augustin", [12] = "Europe", [13] = "Liège" }, [07] = { ["name"] = "Auteuil", [03] = "Porte de Saint-Cloud", [07] = "Porte d'Auteuil", [08] = "Église d'Auteuil", [09] = "Michel-Ange - Auteuil", [10] = "Michel-Ange - Molitor", [11] = "Chardon-Lagache", [12] = "Mirabeau", [14] = "Exelmans", [15] = "Jasmin" }, [08] = { ["name"] = "République", [01] = "Rambuteau", [03] = "Arts et Métiers", [04] = "Jacques Bonsergent", [05] = "Goncourt", [06] = "Temple", [07] = "République", [10] = "Oberkampf", [11] = "Parmentier", [12] = "Filles du Calvaire", [13] = "Saint-Sébastien - Froissart", [14] = "Richard-Lenoir", [15] = "Saint-Ambroise" }, [09] = { ["name"] = "Austerlitz", [01] = "Quai de la Gare", [02] = "Chevaleret", [04] = "Saint-Marcel", [07] = "Gare d'Austerlitz", [08] = "Gare de Lyon", [10] = "Quai de la Rapée" }, [10] = { ["name"] = "Invalides", [01] = "Champs-Élysées - Clemenceau", [02] = "Concorde", [03] = "Madeleine", [04] = "Bir-Hakeim", [07] = "École Militaire", [08] = "La Tour-Maubourg", [09] = "Invalides", [11] = "Saint-Denis - Université", [12] = "Varenne", [13] = "Assemblée nationale", [14] = "Solférino" }, [11] = { ["name"] = "Sentier", [01] = "Tuileries", [02] = "Palais Royal - Musée du Louvre", [03] = "Pyramides", [04] = "Bourse", [06] = "Grands Boulevards", [07] = "Richelieu - Drouot", [08] = "Bonne Nouvelle", [10] = "Strasbourg - Saint-Denis", [11] = "Château d'Eau", [13] = "Sentier", [14] = "Réaumur - Sébastopol", [15] = "Étienne Marcel" }, [12] = { ["name"] = "Île Saint-Louis", [01] = "Faidherbe - Chaligny", [02] = "Reuilly - Diderot", [03] = "Montgallet", [04] = "Censier - Daubenton", [05] = "Place Monge", [06] = "Cardinal Lemoine", [07] = "Jussieu", [08] = "Sully - Morland", [09] = "Pont Marie", [10] = "Saint-Paul", [12] = "Bastille", [13] = "Chemin Vert", [14] = "Bréguet - Sabin", [15] = "Ledru-Rollin" }, [13] = { ["name"] = "Daumesnil", [01] = "Porte Dorée", [03] = "Porte de Charenton", [07] = "Bercy", [08] = "Dugommier", [10] = "Michel Bizot", [11] = "Daumesnil", [12] = "Bel-Air" }, [14] = { ["name"] = "Italie", [02] = "Porte de Choisy", [03] = "Porte d'Italie", [04] = "Cité universitaire", [09] = "Maison Blanche", [10] = "Tolbiac", [11] = "Nationale", [12] = "Campo-Formio", [13] = "Les Gobelins", [14] = "Place d'Italie", [15] = "Corvisart" }, [15] = { ["name"] = "Denfert", [01] = "Cour Saint-Emilion", [02] = "Porte d'Orléans", [03] = "Bibliothèque François Mitterrand", [04] = "Mouton-Duvernet", [05] = "Alésia", [06] = "Olympiades", [08] = "Glacière", [09] = "Saint-Jacques", [10] = "Raspail", [14] = "Denfert-Rochereau" }, [16] = { ["name"] = "Félix Faure", [01] = "Falguière", [02] = "Pasteur", [03] = "Volontaires", [04] = "Vaugirard", [05] = "Convention", [06] = "Porte de Versailles", [09] = "Balard", [10] = "Lourmel", [11] = "Boucicaut", [12] = "Félix Faure", [13] = "Charles Michels", [14] = "Javel - André Citroën" }, [17] = { ["name"] = "Passy", [02] = "Porte Dauphine", [04] = "La Motte-Picquet - Grenelle", [05] = "Commerce", [06] = "Avenue Émile Zola", [07] = "Dupleix", [08] = "Passy", [09] = "Ranelagh", [11] = "La Muette", [13] = "Rue de la Pompe", [14] = "Boissière", [15] = "Trocadéro" }, [18] = { ["name"] = "Étoile", [01] = "Iéna", [03] = "Alma - Marceau", [04] = "Miromesnil", [05] = "Saint-Philippe du Roule", [07] = "Franklin D. Roosevelt", [08] = "George V", [09] = "Kléber", [10] = "Victor Hugo", [11] = "Argentine", [12] = "Charles de Gaulle - ?~Itoile", [14] = "Ternes", [15] = "Courcelles" }, [19] = { ["name"] = "Clichy - Saint Ouen", [01] = "Mairie de Clichy", [02] = "Gabriel Péri", [03] = "Les Agnettes", [04] = "Asnières - Gennevilliers - Les Courtilles", [09] = "La Chapelle)", [10] = "Garibaldi", [11] = "Mairie de Saint-Ouen", [13] = "Carrefour Pleyel", [14] = "Saint-Denis - Porte de Paris", [15] = "Basilique de Saint-Denis" }, [20] = { ["name"] = "Montmartre", [01] = "Porte de Clignancourt", [06] = "Porte de la Chapelle", [07] = "Marx Dormoy", [09] = "Marcadet - Poissonniers", [10] = "Simplon", [11] = "Jules Joffrin", [12] = "Lamarck - Caulaincourt" }, [21] = { ["name"] = "Lafayette", [01] = "Chaussée d'Antin - La Fayette", [02] = "Le Peletier", [03] = "Cadet", [04] = "Château Rouge", [07] = "Barbès - Rochechouart", [08] = "Gare du Nord", [09] = "Gare de l'Est", [10] = "Poissonnière", [11] = "Château-Landon" }, [22] = { ["name"] = "Buttes Chaumont", [01] = "Porte de Pantin", [02] = "Ourcq", [04] = "Corentin Cariou", [06] = "Crimée", [08] = "Riquet", [09] = "La Chapelle", [10] = "Louis Blanc", [11] = "Stalingrad", [12] = "Jaurès", [13] = "Laumière", [14] = "Bolivar", [15] = "Colonel Fabien" }, [23] = { ["name"] = "Belleville", [02] = "Porte des Lilas", [03] = "Mairie des Lilas", [04] = "Porte de Bagnolet", [05] = "Gallieni", [08] = "Place des Fêtes", [09] = "Botzaris", [10] = "Danube", [11] = "Pré Saint-Gervais", [13] = "Buttes Chaumont", [14] = "Jourdain", [15] = "Télégraphe" }, [24] = { ["name"] = "Père Lachaise", [01] = "Voltaire", [02] = "Charonne", [04] = "Père Lachaise", [05] = "Ménilmontant", [06] = "Rue Saint-Maur", [07] = "Philippe Auguste", [08] = "Saint-Fargeau", [09] = "Pelleport", [10] = "Gambetta", [12] = "Belleville", [13] = "Couronnes", [14] = "Pyrénées" }, [25] = { ["name"] = "Charenton", [02] = "Croix de Chavaux", [03] = "Mairie de Montreuil", [04] = "Maisons-Alfort - Les Juilliottes", [05] = "Créteil - L'Échat", [06] = "Créteil - Université", [07] = "Créteil - Préfecture", [08] = "Saint-Mandé", [10] = "Bérault", [11] = "Château de Vincennes", [12] = "Liberté", [13] = "Charenton - Écoles", [14] = "École vétérinaire de Maisons-Alfort", [15] = "Maisons-Alfort - Stade" }, [26] = { ["name"] = "Ivry - Villejuif", [03] = "Porte d'Ivry", [04] = "Pierre et Marie Curie", [05] = "Mairie d'Ivry", [06] = "Le Kremlin-Bicêtre", [07] = "Villejuif - Léo Lagrange", [08] = "Villejuif - Paul Vaillant-Couturier", [09] = "Villejuif - Louis Aragon" }, [27] = { ["name"] = "Vanves", [02] = "Porte de Vanves", [07] = "Malakoff - Plateau de Vanves", [08] = "Malakoff - Rue Étienne Dolet", [09] = "Châtillon - Montrouge" }, [28] = { ["name"] = "Issy", [02] = "Corentin Celton", [03] = "Mairie d'Issy", [08] = "Marcel Sembat", [09] = "Billancourt", [10] = "Pont de Sèvres" }, [29] = { ["name"] = "Levallois", [00] = "La Défense (correspondance RER)", [04] = "Boulogne - Jean Jaurès", [05] = "Boulogne - Pont de Saint-Cloud", [08] = "Les Sablons", [09] = "Pont de Neuilly", [10] = "Esplanade de la Défense", [11] = "La Défense", [12] = "Porte de Champerret", [13] = "Louise Michel", [14] = "Anatole France", [15] = "Pont de Levallois - Bécon" }, [30] = { ["name"] = "Péreire", [01] = "Porte Maillot", [04] = "Wagram", [05] = "Pereire", [08] = "Brochant", [09] = "Porte de Clichy", [12] = "Guy Môquet", [13] = "Porte de Saint-Ouen" }, [31] = { ["name"] = "Pigalle", [02] = "Funiculaire de Montmartre (station inférieure)", [03] = "Funiculaire de Montmartre (station supérieure)", [04] = "Anvers", [05] = "Abbesses", [06] = "Pigalle", [07] = "Blanche", [08] = "Trinité - d'Estienne d'Orves", [09] = "Notre-Dame-de-Lorette", [10] = "Saint-Georges", [12] = "Rome", [13] = "Place de Clichy", [14] = "La Fourche" } } cardpeek-0.8/dot_cardpeek_dir/scripts/etc/brussels-bus.lua0000644000175000017500000011044212135147243020744 00000000000000BRUSSELS_BUS = { [1000] = "Legrelle", [1001] = "UZ brussel", [1003] = "Pompiers", [1003] = "Pompiers-UZ Brussel", [1004] = "Liebrecht", [1005] = "Schuermans", [1006] = "Dieleghem", [1007] = "Bonaventure", [1008] = "Reniers", [1009] = "Eugene Toussaint", [1010] = "Le Roux", [1012] = "Square du Centenaire", [1013] = "Bruxellois", [1014] = "Miroir", [1016] = "Willebroek", [1019] = "Picard", [1020] = "Tour et Taxis", [1021] = "Armateurs", [1022] = "Wtc", [1023] = "Gare du Nord", [1024] = "Wtc", [1025] = "Simonis", [1026] = "Liebrecht", [1027] = "Legrelle", [1029] = "Gare du Nord", [1030] = "Gare du Nord", [1033] = "Yser", [1034] = "Rogier", [1051] = "Willebroek", [1052] = "Wtc", [1053] = "Flessingue", [1054] = "Armateurs", [1055] = "Tour et Taxis", [1056] = "Picard", [1062] = "Bruxellois", [1065] = "Le Roux", [1066] = "Eugene Toussaint", [1067] = "Reniers", [1068] = "Bonaventure", [1069] = "Soetens", [1070] = "Schuermans", [1074] = "UZ Brussel", [1075] = "Pompiers", [1075] = "Pompiers-UZ Brussel", [1078] = "Dieleghem", [1079] = "De Rivieren", [1080] = "Demunter", [1081] = "Demunter", [1095] = "Place de l'Eglise", [1096] = "Benes", [1097] = "Bastogne", [1098] = "Sippelberg", [1099] = "Parc Monnet", [1100] = "Hunderenveld", [1101] = "Hunderenveld", [1102] = "Sept Etoiles", [1105] = "Comhaire", [1107] = "Hopital Français", [1108] = "Goffin", [1112] = "Simonis", [1113] = "Ichec", [1114] = "Van Huffel", [1115] = "Autrique", [1117] = "Delacroix", [1118] = "Gare de l'Ouest", [1123] = "Gare du Midi", [1124] = "Delacroix", [1125] = "Hopital Saint-Pierre", [1126] = "Jeu de balle", [1127] = "Chapelle", [1128] = "Petit Sablon", [1129] = "Royale", [1130] = "Trone", [1131] = "Luxembourg", [1132] = "Treves", [1133] = "Parc Leopold", [1134] = "Nerviens", [1135] = "Gaulois", [1136] = "Merode", [1137] = "Montgomery", [1139] = "Georges Henri", [1140] = "Degrooff", [1141] = "Meudon", [1146] = "Beekant", [1148] = "Schuman", [1149] = "Breydel", [1152] = "Meudon", [1153] = "Degrooff", [1154] = "Georges Henri", [1155] = "Montgomery", [1156] = "Merode", [1157] = "Gaulois", [1158] = "Nerviens", [1159] = "Gaulois", [1160] = "Treves", [1162] = "Luxembourg", [1163] = "Trone", [1164] = "Ducale", [1165] = "Royale", [1166] = "Grand Sablon", [1167] = "Chapelle", [1168] = "Jeu de balle", [1169] = "Porte de Hal", [1171] = "KU Brussel", [1176] = "Gare de l'Ouest", [1178] = "Delacroix", [1179] = "Autrique", [1180] = "Van Huffel", [1181] = "KU Brussel", [1182] = "Sippelberg", [1183] = "Simonis", [1188] = "Hopital Français", [1190] = "Comhaire", [1193] = "Sept Etoiles", [1194] = "Hunderenveld", [1195] = "Hunderenveld", [1196] = "Parc Monnet", [1197] = "Bastogne", [1198] = "Benes", [1199] = "Goffin", [1201] = "Moortebeek", [1202] = "Osseghem", [1203] = "Westland Shopping", [1204] = "Fruits", [1205] = "Willemyns", [1206] = "Peterbos", [1207] = "Paulsen", [1208] = "Henri Rey", [1209] = "Place de l'Eglise", [1210] = "Beekant", [1211] = "Jacques Brel", [1213] = "Charlemagne", [1214] = "Maelbeek", [1215] = "Joseph II", [1216] = "Guimard", [1217] = "Belliard", [1218] = "Barriere", [1233] = "Luxembourg", [1241] = "Elephant", [1242] = "Elephant", [1243] = "Orban", [1253] = "Jacques Brel", [1255] = "Veterans Coloniaux", [1256] = "Henri Rey", [1257] = "Paulsen", [1259] = "Willemyns", [1260] = "Fruits", [1261] = "Westland Shopping", [1262] = "Luxembourg", [1263] = "Belliard", [1264] = "Guimard", [1265] = "Arts-loi", [1266] = "Joseph II", [1267] = "Maelbeek", [1270] = "Schuman", [1271] = "Froissart", [1272] = "Jourdan", [1273] = "Ambiorix", [1305] = "Vellemolen", [1375] = "Gergel", [1377] = "Deutsche Schule", [1380] = "Long Chene", [1381] = "Long Chene", [1387] = "Deutsche Schule", [1402] = "Michel-Ange", [1403] = "De Jamblinne de Meux", [1404] = "Victor Hugo", [1405] = "Diamant", [1406] = "Vergote", [1408] = "Montald", [1409] = "Tomberg", [1410] = "Melard", [1412] = "Voot", [1415] = "Stade Fallon", [1416] = "Froissard", [1416] = "Froissart", [1417] = "Breydel", [1418] = "Schuman", [1419] = "Gueux", [1421] = "Slegers", [1422] = "Deportes", [1423] = "Parc Malou", [1424] = "Georges Henri", [1425] = "Ambiorix", [1449] = "Slegers", [1450] = "Deportes", [1451] = "Parc Malou", [1454] = "Voot", [1456] = "Melard", [1457] = "Tomberg", [1458] = "Montald", [1459] = "Georges Henri", [1460] = "Vergote", [1461] = "Diamant", [1462] = "Victor Hugo", [1463] = "Gueux", [1464] = "Michel-Ange", [1470] = "Sainte-Bernadette", [1474] = "Schuman", [1476] = "Froissart", [1477] = "CERIA", [1478] = "Campus CERIA", [1479] = "Colombophiles", [1480] = "Waxweiler", [1481] = "Bizet", [1482] = "Rene Henry", [1483] = "Westland Shopping", [1484] = "Pommier", [1485] = "Bon Air", [1486] = "Bon Air", [1487] = "Pommier", [1488] = "Westland Shopping", [1489] = "Rene Henry", [1490] = "Van Beethoven", [1491] = "Bizet", [1492] = "Waxweiler", [1493] = "Wauters", [1494] = "Campus CERIA", [1495] = "Van Beethoven", [1496] = "Sainte-Bernadette", [1497] = "Toulouse", [1498] = "Huit Heures", [1501] = "De Brouckere", [1502] = "Arenberg", [1504] = "Gare Centrale", [1508] = "Madou", [1509] = "Saint-Josse", [1510] = "Gutenberg", [1511] = "Clovis", [1512] = "Vincotte", [1513] = "Dailly", [1514] = "Radium", [1515] = "Plasky", [1516] = "Opale", [1517] = "Diamant", [1518] = "Levie", [1519] = "Mai", [1520] = "Heydenberg", [1521] = "Speeckaert", [1522] = "Verheyleweghen", [1525] = "Peupliers", [1526] = "Marcel Thiry", [1527] = "Jespers", [1528] = "Hof Ten Berg", [1529] = "Hymans", [1530] = "Roodebeek", [1531] = "Marcel Thiry", [1532] = "Tractebel", [1533] = "Gulledelle", [1534] = "Ciceron", [1535] = "Paduwa", [1536] = "Gulledelle", [1537] = "Roodebeek", [1538] = "De Lombaerde", [1539] = "Andromede", [1540] = "Charmille", [1549] = "RTBF", [1550] = "Charmille", [1551] = "Marcel Thiry", [1552] = "Jespers", [1553] = "Marcel Thiry", [1554] = "Peupliers", [1556] = "Diamant", [1557] = "Verheyleweghen", [1558] = "Speeckaert", [1559] = "Heydenberg", [1560] = "Mai", [1561] = "Levie", [1562] = "Diamant", [1563] = "Opale", [1565] = "Radium", [1566] = "Dailly", [1567] = "Vincotte", [1568] = "Clovis", [1569] = "Gutenberg", [1570] = "Saint-Josse", [1571] = "Madou", [1572] = "Congres", [1575] = "Assaut", [1576] = "Anspach-De Brouckere", [1577] = "Roodebeek", [1578] = "Hymans", [1582] = "Saint-Josse", [1601] = "Reine Astrid", [1602] = "Violettes", [1605] = "Louis Marcelis", [1613] = "Wezembeek-Shopping", [1614] = "Ring 0", [1615] = "Gergel", [1616] = "Voisins", [1617] = "Plaine des Sports", [1620] = "Hernalsteen", [1625] = "Eglise Wezembeek", [1627] = "Stijn Streuvels", [1629] = "Oppem", [1631] = "Stijn Streuvels", [1634] = "Marie-therese", [1635] = "Eglise Wezembeek", [1638] = "Crainhem", [1656] = "Hernalsteen", [1657] = "Plaine des Sports", [1659] = "Gergel", [1660] = "Ring 0", [1661] = "Wezembeek-Shopping", [1668] = "Violettes", [1669] = "Louis Marcelis", [1673] = "Reine Astrid", [1701] = "Bourse", [1702] = "Saint-Jean", [1703] = "Grand Sablon", [1704] = "Ducale", [1705] = "Porte de Namur", [1708] = "Parnasse", [1712] = "Fetis", [1713] = "La Chasse", [1714] = "Buedts", [1715] = "Arsenal", [1716] = "Strategie", [1717] = "Hankar", [1718] = "Eglise Saint-Julien", [1719] = "Vandromme", [1720] = "Valduc", [1723] = "Schoonejans", [1724] = "Sacre Coeur", [1725] = "Transvaal", [1728] = "Museum", [1729] = "Science", [1730] = "Auderghem-Shopping", [1731] = "Auderghem-Shopping", [1733] = "Etangs", [1735] = "Place Saint-Job", [1736] = "De Wansijn", [1737] = "Drossart", [1738] = "Drossart", [1739] = "De Wansijn", [1740] = "Place Saint-Job", [1751] = "Auderghem-Shopping", [1752] = "Sacre Coeur", [1753] = "Schoonejans", [1754] = "Herrmann-Debroux", [1756] = "Valduc", [1757] = "Vandromme", [1758] = "Eglise Saint-Julien", [1759] = "Hankar", [1760] = "Strategie", [1761] = "Arsenal", [1762] = "Buedts", [1763] = "La Chasse", [1764] = "Fetis", [1769] = "Museum", [1770] = "Porte de Namur", [1771] = "Saint-Jean", [1772] = "Plattesteen", [1776] = "Science", [1777] = "Etangs", [1802] = "Nerviens", [1803] = "Leman", [1804] = "Louis Hap", [1805] = "La Chasse", [1806] = "Onze novembre", [1807] = "Roi Vainqueur", [1808] = "Thieffry", [1809] = "Boileau", [1810] = "Baron de Castro", [1811] = "Dreve de Nivelles", [1812] = "Mouettes", [1813] = "Chant d'Oiseau", [1814] = "Ocean Atlantique", [1815] = "Mostinck", [1816] = "Chien Vert", [1817] = "Woluwe", [1818] = "Kelle", [1819] = "Mertens", [1821] = "Rue au Bois", [1822] = "Manoir d'Anjou", [1823] = "Vander Meerschen", [1825] = "Sainte-Alix", [1826] = "Paddock", [1828] = "Gersis", [1829] = "Val des Seigneurs", [1830] = "Konkel", [1831] = "Don Bosco", [1832] = "Don Bosco", [1833] = "Stade Fallon", [1834] = "Mareyde", [1835] = "Bouleaux", [1840] = "Bouleaux", [1841] = "Mareyde", [1846] = "Val des Seigneurs", [1847] = "Gersis", [1848] = "Stockel", [1850] = "Paddock", [1851] = "Sainte-Alix", [1852] = "Vander Meerschen", [1853] = "Manoir d'Anjou", [1854] = "Rue au Bois", [1856] = "Mertens", [1857] = "Kelle", [1858] = "Woluwe", [1859] = "Chien Vert", [1860] = "Jules Cesar", [1861] = "Ocean Atlantique", [1862] = "Chant d'Oiseau", [1863] = "Mouettes", [1864] = "Dreve de Nivelles", [1865] = "Baron de Castro", [1866] = "Boileau", [1867] = "Thieffry", [1868] = "Roi Vainqueur", [1869] = "Onze Novembre", [1870] = "La Chasse", [1871] = "Louis Hap", [1872] = "Leman", [1873] = "Nerviens", [1879] = "Stockel", [1900] = "Gare du Nord", [1902] = "Rogier", [1903] = "Biarritz", [1907] = "Luxembourg", [1908] = "Parnasse", [1909] = "Blyckaerts", [1910] = "Malibran", [1912] = "Vleurgat", [1913] = "Van Eyck", [1914] = "Patton", [1915] = "Bascule", [1916] = "Longchamp", [1917] = "Gossart", [1918] = "Montjoie", [1919] = "Rene Gobert", [1920] = "Floride", [1921] = "Houzeau", [1926] = "Rittweger", [1928] = "Trois Arbres", [1929] = "Engeland", [1930] = "Chateau d'Or", [1931] = "Bigarreaux", [1932] = "Griottes", [1933] = "Moensberg Station", [1934] = "Bourdon", [1935] = "Braves", [1936] = "Linkebeek Gare", [1938] = "Homborch", [1942] = "Statuaires", [1943] = "Statuaires", [1944] = "Hospices", [1951] = "Heros", [1953] = "Cabris", [1954] = "Linkebeek Gare", [1955] = "Braves", [1956] = "Bourdon", [1957] = "Moensberg Station", [1958] = "Griottes", [1959] = "Bigarreaux", [1960] = "Chateau d'Or", [1961] = "Engeland", [1962] = "Uccle Calevoet", [1964] = "Rittweger", [1968] = "Zeecrabbe", [1969] = "Houzeau", [1970] = "Floride", [1971] = "Rene Gobert", [1972] = "Montjoie", [1973] = "Gossart", [1975] = "Bascule", [1976] = "Van eyck", [1977] = "Vleurgat", [1979] = "Observatoire", [1980] = "Malibran", [1981] = "Blyckaerts", [1982] = "Parnasse", [1984] = "Globe", [1985] = "Globe", [1986] = "Biarritz", [1988] = "Rogier", [1990] = "Ducale", [1995] = "Trois Arbres", [1998] = "Debecker", [1999] = "Observatoire", [2000] = "Churchill", [2003] = "Voot", [2004] = "Fabry", [2005] = "Parc des Sources", [2006] = "Viaduc E 40", [2007] = "Empain", [2008] = "Val Duchesse", [2009] = "Rond-point du Souverain", [2015] = "Viaduc E 40", [2016] = "Dries", [2017] = "Saint-Antoine", [2018] = "Futaie", [2022] = "Thiry-Woluwe", [2025] = "Annecy", [2027] = "Dunette", [2028] = "Thiry-Woluwe", [2029] = "Thumas", [2033] = "Crainhem", [2036] = "Hof Ter Musschen", [2037] = "Cliniques-UCL", [2038] = "Auditoires-UCL", [2039] = "Mounier", [2040] = "Hof Ter Musschen", [2041] = "Mounier", [2042] = "Auditoires-UCL", [2043] = "Cliniques-UCL", [2044] = "Hof Ter Musschen", [2045] = "Sapiniere", [2046] = "Herrmann-Debroux", [2050] = "Herrmann-Debroux", [2058] = "Rond-point du Souverain", [2059] = "Val Duchesse", [2060] = "Empain", [2061] = "Auderghem-Shopping", [2062] = "Parc des Sources", [2063] = "Fabry", [2064] = "Voot", [2065] = "Vellemolen", [2069] = "UCL Saint-Luc", [2071] = "Annecy", [2074] = "Futaie", [2075] = "Saint-Antoine", [2076] = "Dries", [2079] = "Watermael Gare", [2080] = "Watermael Gare", [2084] = "UCL Saint-Luc", [2085] = "Dunette", [2087] = "Thumas", [2099] = "Gazelle", [2103] = "Verrewinkel", [2104] = "Gui", [2107] = "Bien-Faire", [2108] = "Place Saint-Job", [2109] = "Vivier d'Oie", [2110] = "Vivier d'Oie", [2112] = "Pasteur", [2113] = "Kauwberg", [2114] = "Kauwberg", [2115] = "Bien-Faire", [2121] = "Georges Brugmann", [2123] = "Cavell", [2124] = "Brunard", [2125] = "Langeveld", [2126] = "Houzeau", [2128] = "Clinique Edith Cavell", [2129] = "Clinique Edith Cavell", [2130] = "Houzeau", [2131] = "Langeveld", [2132] = "Brunard", [2133] = "Cavell", [2135] = "Georges Brugmann", [2152] = "Place Saint-Job", [2154] = "De Wansijn", [2156] = "Gui", [2157] = "Verrewinkel", [2161] = "Pasteur", [2167] = "Gazelle", [2168] = "Homborch", [2169] = "Biches", [2200] = "Mabru", [2201] = "Quai des Usines", [2202] = "Bockstael", [2203] = "Destouvelles", [2204] = "Destouvelles", [2207] = "Glibert", [2209] = "Nicolay", [2211] = "Beguinage", [2212] = "Bourse", [2213] = "Buanderie", [2214] = "Porte d'Anderlecht", [2215] = "Liverpool", [2216] = "Clemenceau", [2217] = "Albert I", [2218] = "Cureghem", [2220] = "Resistance", [2223] = "Meir", [2225] = "Aristide Briand", [2226] = "Van Kalken", [2235] = "Yser", [2236] = "Yser", [2237] = "Masui", [2238] = "Stephenson", [2239] = "Pavillon", [2252] = "Aristide Briand", [2253] = "Parking 58", [2254] = "Meir", [2256] = "Saint-Guidon", [2257] = "Resistance", [2259] = "Cureghem", [2260] = "Albert I", [2261] = "Clemenceau", [2262] = "Liverpool", [2263] = "Porte d'Anderlecht", [2264] = "Buanderie", [2265] = "Bourse", [2267] = "Beguinage", [2269] = "Nicolay", [2270] = "De Brouckere", [2271] = "Glibert", [2300] = "Quai des Usines", [2304] = "Steamers", [2305] = "Entrepot", [2307] = "Outre-Ponts", [2308] = "Van Praet", [2309] = "Avant-Port", [2310] = "Heembeek", [2311] = "Pres Communs", [2312] = "Zavelput", [2313] = "Peter Benoit", [2314] = "Ramier", [2315] = "Chemin Vert", [2316] = "Trassersweg", [2317] = "Antoon van Oss", [2318] = "Mabru", [2319] = "Hopital Joseph Bracops", [2320] = "Saint-Guidon", [2321] = "CRS", [2323] = "Meir", [2324] = "Parking 58", [2325] = "Claessens", [2326] = "Claessens", [2327] = "Rive Gauche", [2328] = "Wimpelberg", [2350] = "De Brouckere", [2352] = "Hopital Militaire", [2353] = "Crs", [2358] = "Antoon van Oss", [2359] = "Trassersweg", [2360] = "Chemin Vert", [2361] = "Ramier", [2362] = "Peter Benoit", [2363] = "Zavelput", [2364] = "Pres Communs", [2368] = "Outre-Ponts", [2370] = "Entrepot", [2371] = "Steamers", [2373] = "De Linde", [2374] = "Heembeek", [2375] = "Hopital Joseph Bracops", [2376] = "Van Praet", [2402] = "Parvis de Saint-Gilles", [2404] = "Combaz", [2407] = "Laine", [2408] = "Mont Kemmel", [2410] = "Altitude Cent", [2411] = "Duden", [2412] = "Domaine", [2413] = "Forestoise", [2414] = "Decroly", [2415] = "Aulne", [2416] = "Victor Allard", [2417] = "Uccle Stalle", [2418] = "Fontainas", [2452] = "Victor Allard", [2453] = "Decroly", [2454] = "Forestoise", [2455] = "Domaine", [2456] = "Duden", [2457] = "Altitude Cent", [2459] = "Mont Kemmel", [2460] = "Laine", [2462] = "Rochefort", [2463] = "Combaz", [2465] = "Parvis de Saint-Gilles", [2467] = "Porte de Hal", [2498] = "Demineurs", [2499] = "Jette Gare", [2500] = "Gare du Midi", [2501] = "Bockstael", [2502] = "Breesch", [2503] = "Loyaute", [2504] = "Woeste", [2505] = "Leopold I", [2506] = "Miroir", [2507] = "Simpson", [2508] = "Riethuisen", [2509] = "Bossaert-Basilique", [2510] = "Bastogne", [2511] = "Cimetiere Molenbeek", [2512] = "Leroy", [2513] = "Candries", [2514] = "Machtens", [2515] = "Verbeyst", [2517] = "Veeweyde", [2518] = "De Linde", [2519] = "Riethuisen", [2521] = "Digue du Canal", [2522] = "Prince de Liege", [2523] = "Ile Sainte-Helene", [2524] = "Charroi", [2526] = "Fierlant", [2528] = "Veterinaires", [2531] = "Gare du Midi", [2532] = "Jacob Smits", [2533] = "Beaute", [2534] = "Broeren", [2535] = "Saint-Guidon", [2536] = "Peterbos", [2538] = "Gare du Midi", [2539] = "Suede", [2540] = "Avenue du Roi", [2541] = "Place Victor Horta", [2544] = "Avenue du Roi", [2545] = "Karel Bogaerd", [2546] = "Wiels", [2550] = "Van Kalken", [2551] = "Charroi", [2553] = "Orban", [2555] = "Charroi", [2556] = "Ile Sainte-Helene", [2557] = "Digue du Canal", [2560] = "Beaute", [2561] = "Jacob Smits", [2562] = "Maison d'Erasme", [2564] = "Prince de Liege", [2565] = "Machtens", [2566] = "Candries", [2567] = "Leroy", [2568] = "Cimetiere Molenbeek", [2569] = "Bastogne", [2570] = "Bossaert-Basilique", [2571] = "Riethuisen", [2572] = "Simpson", [2573] = "Miroir", [2574] = "Leopold I", [2575] = "Woeste", [2576] = "Loyaute", [2577] = "Breesch", [2579] = "Peterbos", [2580] = "Veeweyde", [2583] = "Jette Gare", [2584] = "Demineurs", [2586] = "Verbeyst", [2608] = "Bempt", [2609] = "Rue Longue", [2610] = "Drogenbos-Shopping", [2611] = "Gilson", [2659] = "Gilson", [2660] = "Drogenbos-Shopping", [2661] = "Rue Longue", [2662] = "Uccle Sport", [2663] = "Neerstalle", [2665] = "Max Waller", [2669] = "Bempt", [2671] = "Suede", [2701] = "Uccle Calevoet", [2702] = "Groelstveld", [2703] = "Papenkasteel", [2704] = "Hellevelt", [2705] = "Chenaie", [2712] = "Hopital Deux Alice", [2714] = "Hopital Sainte-Elisabeth", [2715] = "Vert Chasseur", [2716] = "Montana", [2721] = "Gendarmes", [2722] = "Statuaires", [2724] = "Demey", [2725] = "Bergoje", [2727] = "Deux Chaussees", [2728] = "Sainte-Anne", [2731] = "Sapiniere", [2752] = "Deux Chaussees", [2753] = "Bergoje", [2761] = "Montana", [2762] = "Vert Chasseur", [2763] = "Hopital Sainte-Elisabeth", [2769] = "Chenaie", [2770] = "Hellevelt", [2771] = "Groelstveld", [2801] = "Crocq", [2802] = "Hopital Brugmann", [2803] = "Lorge", [2804] = "Jette Gare", [2805] = "Cimetiere de Jette", [2807] = "Prince Leopold", [2808] = "Jacobs Fontaine", [2809] = "Karel Bogaerd", [2810] = "Artistes", [2812] = "Ecole des Cadets", [2813] = "De Wand", [2814] = "Pagodes", [2815] = "Long Bonnier", [2816] = "Versailles", [2817] = "Beyseghem", [2819] = "Kruipweg", [2822] = "Val Maria", [2823] = "Ferme nos Pilifs", [2824] = "Serres Royales", [2825] = "Gare Bockstael", [2826] = "Val Maria", [2827] = "Ferme nos Pilifs", [2829] = "Hopital Militaire", [2852] = "Kruipweg", [2853] = "Beyseghem", [2854] = "Versailles", [2855] = "Long Bonnier", [2856] = "Pagodes", [2857] = "De Wand", [2858] = "Ecole des Cadets", [2859] = "Guillaume de Greef", [2860] = "Artistes", [2862] = "Bockstael", [2863] = "Jacobs Fontaine", [2865] = "Duysburgh", [2867] = "Hopital Brugmann", [2871] = "Lorge", [2872] = "Crocq", [2875] = "Serres Royales", [2877] = "Cimetiere de Jette", [2895] = "Omnisports Haren", [2898] = "Verboekhoven", [2899] = "Witloof", [2900] = "Fonson", [2903] = "Fonson", [2905] = "Twyeninck", [2906] = "Cortenbach", [2907] = "Haren-Sud Gare", [2908] = "Biplan", [2909] = "Saint-Vincent", [2910] = "Paix", [2912] = "Notre-Dame", [2915] = "Josaphat", [2916] = "Chazal", [2917] = "Patrie", [2918] = "Dailly", [2919] = "Brabanconne", [2920] = "Ambiorix", [2921] = "Palmerston", [2922] = "Livingstone", [2923] = "Maelbeek", [2924] = "Oud-Kapelleke", [2926] = "Bichon", [2927] = "Parc Leopold", [2928] = "Fernand Cocq", [2929] = "Vanne", [2931] = "Trinite", [2932] = "Ma Campagne", [2934] = "Albert", [2935] = "Jupiter", [2936] = "Tournoi", [2937] = "Mystere", [2938] = "Forest National", [2939] = "Gare Forest-Est", [2949] = "Bailli", [2950] = "Prison", [2951] = "Jupiter", [2952] = "Gare Forest-Est", [2953] = "Forest National", [2954] = "Mystere", [2955] = "Tournoi", [2957] = "Albert", [2959] = "Ma Campagne", [2960] = "Trinite", [2962] = "Vanne", [2963] = "Fernand Cocq", [2964] = "Quartier St-Boniface", [2965] = "Prison", [2966] = "Bailli", [2967] = "Matonge", [2969] = "Maelbeek", [2970] = "Livingstone", [2973] = "Brabanconne", [2974] = "Dailly", [2975] = "Patrie", [2976] = "Chazal", [2977] = "Josaphat", [2980] = "Notre-Dame", [2982] = "Paix", [2984] = "Biplan", [2985] = "Cortenbach", [2986] = "Twyeninck", [2989] = "Haren-Sud Gare", [2990] = "Bichon", [2991] = "Witloof", [2992] = "Saint-Vincent", [2995] = "Oud-Kapelleke", [2996] = "Conscience", [2997] = "Conscience", [2999] = "Vandenhoven", [3000] = "NBN", [3001] = "Hopital Militaire", [3002] = "Dghr Domaine Militaire", [3003] = "Marly", [3005] = "Trois Pertuis", [3007] = "Biebuyck", [3008] = "Avant-Port", [3013] = "Pavillons Meudon", [3014] = "Rive Gauche", [3058] = "Avant-Port", [3059] = "Biebuyck", [3061] = "Trois Pertuis", [3063] = "Marly", [3064] = "Dghr Domaine Militaire", [3065] = "Pavillons Meudon", [3100] = "Gutenberg", [3101] = "Saint-Vincent", [3102] = "Picardie", [3103] = "Carli", [3104] = "Chaumontel", [3105] = "Zenobe Gramme", [3106] = "Schaerbeek Gare", [3108] = "Schaerbeek Gare", [3109] = "Eenens", [3110] = "Ernest Laude", [3111] = "Herman", [3112] = "Coteaux", [3113] = "Geefs", [3114] = "Bossuet", [3117] = "Parc Leopold", [3118] = "Braemt", [3120] = "Natation", [3121] = "Wery", [3122] = "Flagey", [3124] = "Levure", [3125] = "Hopital Etterbeek-Ixelles", [3126] = "Vandenhoven", [3127] = "Bordet Station", [3128] = "Haren-Ecolage", [3129] = "Haren-Atelier", [3130] = "Haren-STIB", [3152] = "Levure", [3154] = "Flagey", [3155] = "Wery", [3156] = "Natation", [3158] = "Jourdan", [3159] = "Parc Leopold", [3160] = "Etangs", [3161] = "Gutenberg", [3162] = "Houwaert", [3163] = "Geefs", [3164] = "Coteaux", [3165] = "Herman", [3166] = "Ernest Laude", [3167] = "Eenens", [3168] = "Verboekhoven", [3169] = "Princesse Elisabeth", [3170] = "Schaerbeek Gare", [3171] = "Zenobe Gramme", [3172] = "Chaumontel", [3173] = "Carli", [3174] = "Picardie", [3175] = "Saint-Vincent", [3176] = "Vandenhoven", [3178] = "Bordet Station", [3179] = "Haren-Atelier", [3199] = "Aerodrome", [3200] = "Diablotins", [3201] = "Maes", [3203] = "Middelweg", [3204] = "Sabca", [3205] = "Bordet Station", [3206] = "Germinal", [3207] = "Jules Bordet", [3209] = "Cimetiere de Bruxelles", [3210] = "Artemis", [3213] = "Bordet Station", [3214] = "Bordet Station", [3215] = "Meiser", [3216] = "Plasky", [3217] = "Gueux", [3218] = "Marguerite", [3219] = "Waterloo-Wilson", [3221] = "Dansaert", [3222] = "Porte de Flandre", [3223] = "Porte de Ninove", [3224] = "Duchesse de Brabant", [3225] = "Quatre-Vents", [3228] = "Triangle", [3230] = "Gare de l'Ouest", [3231] = "Joseph Baeck", [3232] = "Dubois", [3233] = "Tamaris", [3234] = "Machtens", [3235] = "Candries", [3236] = "Thym", [3238] = "Condor", [3239] = "Condor", [3240] = "Optimisme", [3251] = "Flasky", [3251] = "Plasky", [3252] = "Tamaris", [3253] = "Gare de l'Ouest", [3257] = "Quatre-Vents", [3258] = "Duchesse de Brabant", [3259] = "Porte de Ninove", [3260] = "Porte de Flandre", [3261] = "Dansaert", [3262] = "Bourse", [3264] = "Gare Centrale", [3266] = "Max-Plasky", [3268] = "Meiser", [3272] = "Paduwa", [3273] = "Artemis", [3274] = "Cimetiere de Bruxelles", [3276] = "Jules Bordet", [3277] = "Germinal", [3278] = "Bordet Station", [3279] = "Sabca", [3280] = "Middelweg", [3281] = "Dubois", [3282] = "Joseph Baeck", [3283] = "Peage", [3285] = "Diablotins", [3299] = "Bienfaiteurs", [3300] = "Lekaerts", [3301] = "Nato", [3302] = "Nato", [3303] = "Germinal", [3304] = "Matisse", [3305] = "Lekaerts", [3306] = "Hoedemaekers", [3307] = "Notre-Dame", [3309] = "Coteaux", [3313] = "Quetelet", [3317] = "Hopital Saint-Etienne", [3318] = "De Brouckere", [3319] = "Bale", [3322] = "Gare Centrale", [3324] = "Gare Centrale", [3328] = "Bourget", [3330] = "Gare Centrale", [3331] = "Parc", [3332] = "Madou", [3349] = "Gare Centrale", [3350] = "Gare Centrale", [3351] = "Parc", [3352] = "Gare Centrale", [3353] = "Treurenberg", [3354] = "Presse", [3355] = "Madou", [3358] = "Presse", [3359] = "Treurenberg", [3361] = "Hoedemaekers", [3362] = "Lekaerts", [3363] = "Germinal", [3364] = "Bale", [3397] = "Cimetiere de Bruxelles", [3398] = "Cimetiere de Bruxelles", [3399] = "Schuman", [3401] = "Cimetiere de Bruxelles", [3402] = "Guillaume", [3403] = "Dunant", [3404] = "Loisirs", [3407] = "Kennis", [3408] = "Latinis", [3409] = "Louis Bertrand", [3410] = "Crossing", [3411] = "Kurth", [3414] = "Azalees", [3416] = "Permeke", [3417] = "Evere Shopping", [3418] = "Station Evere", [3419] = "Conscience", [3420] = "Oud-Kapelleke", [3448] = "Station Evere", [3449] = "Kurth", [3450] = "Evere Shopping", [3451] = "Azalees", [3452] = "Crossing", [3453] = "Louis Bertrand", [3454] = "Kennis", [3458] = "Loisirs", [3459] = "Dunant", [3460] = "Guillaume", [3461] = "Paduwa", [3462] = "Ciceron", [3463] = "Gulledelle", [3464] = "Tractebel", [3465] = "Gulledelle", [3466] = "Evere Shopping", [3467] = "Geneve", [3468] = "Paul Leduc", [3470] = "Conscience", [3471] = "Permeke", [3501] = "De Brouckere", [3502] = "Bozar", [3503] = "Royale", [3504] = "Porte de Namur", [3506] = "Quartier St-Boniface", [3510] = "Geo Bernier", [3511] = "Buyl", [3512] = "Jeanne", [3513] = "ULB", [3514] = "Cimetiere d'Ixelles", [3515] = "Fraiteur", [3516] = "Triomphe", [3517] = "Etangs d'Ixelles", [3518] = "Matonge", [3519] = "Flagey", [3520] = "Delta", [3521] = "Beaulieu", [3522] = "ADEPS", [3523] = "Deveze-ULB", [3524] = "Jardin Massart", [3526] = "Jardin Massart", [3529] = "Rouge-Cloitre", [3530] = "Rouge-Cloitre", [3531] = "Van Volsem", [3546] = "Delta", [3547] = "Invalides", [3548] = "Demey", [3549] = "Vignette", [3550] = "Roodenberg", [3551] = "Clesse", [3552] = "Roodenberg", [3553] = "Clesse", [3556] = "Delta", [3557] = "Fraiteur", [3558] = "Cimetiere d'Ixelles", [3559] = "ULB", [3560] = "Jeanne", [3561] = "Buyl", [3562] = "Geo Bernier", [3567] = "Royale", [3568] = "Bozar", [3570] = "Etangs d'Ixelles", [3571] = "Van Volsem", [3573] = "Flagey", [3702] = "Arbre Unique", [3704] = "Paul Leduc", [3705] = "Frans Courtens", [3707] = "De Jamblinne de Meux", [3709] = "Resistance", [3712] = "Vanhellemont", [3713] = "Scherdemael", [3717] = "Sibelius", [3718] = "Neerpede", [3751] = "Neerpede", [3752] = "Sibelius", [3755] = "Scherdemael", [3756] = "Vanhellemont", [3760] = "Veterans Coloniaux", [3761] = "Leopold III", [3762] = "Frans Courtens", [3763] = "Paul Leduc", [3765] = "Arbre Unique", [3766] = "Optimisme", [3800] = "Eloy", [3802] = "Veterinaires", [3803] = "Bruxelles X", [3804] = "Deux Gares", [3805] = "Petite Ile", [3808] = "Digue du Canal", [3810] = "Bollinckx", [3812] = "Labeur", [3814] = "Mozart", [3815] = "Mozart", [3850] = "Humanite", [3851] = "Bollinckx", [3852] = "Deux Gares", [3853] = "Boulevard International", [3854] = "CERIA", [3856] = "Digue du Canal", [3858] = "Petite Ile", [3859] = "Labeur", [3860] = "Boulevard International", [3861] = "Bruxelles X", [3898] = "Paduwa", [3899] = "Moonens", [3900] = "Sainte-Famille", [3902] = "Capricorne", [3903] = "Pleiades", [3904] = "Carene", [3905] = "Colonel Bourg", [3906] = "Fevrier", [3908] = "Heydenberg", [3909] = "Sainte-Famille", [3910] = "Moonens", [3912] = "Leman", [3917] = "Senghor", [3918] = "Senghor", [3919] = "Verheyleweghen", [3920] = "Andromede", [3952] = "Fevrier", [3953] = "Leman", [3954] = "Heydenberg", [3956] = "Colonel Bourg", [3957] = "Carene", [3958] = "Pleiades", [3959] = "Capricorne", [3961] = "Mommaerts", [3962] = "Andromede", [4001] = "Berchem Station", [4002] = "Berchem-Shopping", [4003] = "Alcyons", [4005] = "Genot", [4006] = "Van Zande", [4007] = "Cimetiere Molenbeek", [4008] = "Karreveld", [4010] = "Etangs Noirs", [4012] = "Mennekens", [4013] = "Joseph Baeck", [4014] = "Beekkant", [4015] = "Beekkant", [4018] = "Beekkant", [4019] = "Joseph Baeck", [4020] = "Joseph Baeck", [4053] = "Karreveld", [4054] = "Cimetiere Molenbeek", [4055] = "Van Zande", [4056] = "Genot", [4057] = "Schweitzer", [4058] = "Alcyons", [4059] = "Berchem-Shopping", [4061] = "Berchem Station", [4062] = "Bois des Iles", [4063] = "Van Page", [4064] = "Dieleghem", [4065] = "De Rivieren", [4069] = "Cite Modele 4", [4070] = "Laerbeek", [4070] = "Laerbeek-UZ Brussel", [4071] = "Arbre Ballon-Heymbosch", [4072] = "De Heyn", [4101] = "Basilix", [4103] = "Het Veroost", [4104] = "Neuberger", [4105] = "Nereus", [4106] = "Sorensen", [4107] = "Beeckmans", [4109] = "Chopin", [4110] = "College Sacre-Coeur", [4111] = "Etangs Noirs", [4112] = "Lowet", [4114] = "Osseghem", [4115] = "Ganshoren-Sport", [4116] = "Parc Elisabeth", [4152] = "Parc Elisabeth", [4153] = "College Sacre-Coeur", [4154] = "Riethuisen", [4156] = "Beeckmans", [4157] = "Sorensen", [4158] = "Nereus", [4159] = "Neuberger", [4160] = "Het Veroost", [4162] = "Basilix", [4163] = "Lowet", [4164] = "Van Page", [4165] = "Bois des Iles", [4168] = "Ganshoren-Sport", [4169] = "Chopin", [4170] = "Berchem Station", [4205] = "Palfyn", [4206] = "Tircher", [4207] = "Pattijn", [4212] = "Escaut", [4213] = "Ribaucourt", [4214] = "Merchtem", [4215] = "Westland Shopping", [4217] = "Dieudonne Lefevre", [4221] = "Cite Modele 4", [4223] = "De Heyn", [4224] = "Arbre Ballon-Heymbosch", [4225] = "Laerbeek", [4225] = "Laerbeek-UZ Brussel", [4226] = "Arbre Ballon-Heymbosch", [4227] = "Roi Baudouin", [4228] = "Amethyste", [4233] = "Gare Bockstael", [4250] = "Crocq", [4251] = "Crocq", [4252] = "Dieudonne Lefevre", [4253] = "Ribaucourt", [4254] = "Escaut", [4258] = "Pouchkine", [4259] = "Pattijn", [4260] = "Tircher", [4261] = "Palfyn", [4264] = "Heysel", [4266] = "Nekkersdal", [4267] = "Nekkersdal", [4268] = "Amethyste", [4269] = "Roi Baudouin", [4270] = "Pannenhuis", [4271] = "Pouchkine", [4287] = "International School", [4288] = "International School", [4289] = "Etangs de Boitsfort", [4290] = "Kattenberg", [4291] = "Pepiniere", [4292] = "Etangs de Boitsfort", [4293] = "Brillant", [4294] = "Tercoigne", [4295] = "Gardon", [4296] = "Berensheide", [4297] = "Beaulieu", [4298] = "Michiels", [4299] = "Brillant", [4301] = "Bourse", [4303] = "Germoir", [4304] = "Rodin", [4305] = "Delporte", [4306] = "Etterbeek Gare", [4307] = "Thys", [4308] = "Relais", [4309] = "Arcades", [4310] = "Keym", [4311] = "Vander Elst", [4312] = "Ortolans", [4313] = "Les 3 Tilleuls", [4313] = "Les Trois Tilleuls", [4319] = "Equipages", [4341] = "Diabolo", [4342] = "Diabolo", [4347] = "Miraval", [4348] = "Miraval", [4349] = "Wiener", [4351] = "Wiener", [4355] = "Les 3 Tilleuls", [4355] = "Les Trois Tilleuls", [4356] = "Ortolans", [4357] = "Vander Elst", [4358] = "Keym", [4359] = "Arcades", [4360] = "Relais", [4362] = "Thys", [4363] = "Etterbeek Gare", [4364] = "Delporte", [4365] = "Rodin", [4366] = "Germoir", [4367] = "Luxembourg", [4368] = "Wiener", [4401] = "Loutrier", [4402] = "Hannetons", [4403] = "Archiducs", [4405] = "Pecheries", [4407] = "Vignette", [4408] = "Tritomas", [4449] = "Tritomas", [4452] = "Pecheries", [4454] = "Archiducs", [4455] = "Hannetons", [4456] = "Loutrier", [4500] = "RTL", [4505] = "Mommaerts", [4550] = "RTBF", [4554] = "Diamant", [4555] = "Paul Leduc", [4556] = "Geneve", [4557] = "Evere Shopping", [4558] = "RTL", [4598] = "Broek", [4599] = "Maricolles", [4600] = "Cimetieres", [4601] = "Elbers", [4602] = "Hoogbosch", [4652] = "Vieillesse Heureuse", [4653] = "Hoogbosch", [4655] = "Elbers", [4656] = "Cimetieres", [4657] = "Maricolles", [4658] = "Thym", [4659] = "Candries", [4660] = "Elbers", [4661] = "Broek", [4705] = "Washington", [4804] = "Mercure", [4853] = "Mercure", [4952] = "Porte de Namur", [5009] = "Belgica", [5011] = "Vanderstichelen", [5058] = "Heros", [5074] = "Vanderstichelen", [5076] = "Belgica", [5081] = "Guillaume de Greef", [5106] = "Schweitzer", [5115] = "Rochefort", [5152] = "Saint-Denis", [5159] = "Wiels", [5160] = "Barriere", [5161] = "Forest Centre", [5162] = "Anciens Etangs", [5171] = "Schweitzer", [5255] = "Longchamp", [5256] = "Bascule", [5302] = "Princesse Elisabeth", [5308] = "Leopold III", [5416] = "Boondael Gare", [5451] = "Boondael Gare", [5458] = "Gendarmes", [5505] = "Woluwe", [5506] = "Musee du Tram", [5710] = "Verboekhoven", [5719] = "Saint-Denis", [5720] = "Max Waller", [5721] = "Neerstalle", [5741] = "Pavillon", [5742] = "Stephenson", [5770] = "Van Praet", [5810] = "Timmermans", [5811] = "Moliere-Longchamp", [5817] = "Uccle Calevoet", [5858] = "Moliere-Longchamp", [5859] = "Timmermans", [5905] = "Aquiris", [5906] = "Rive Droite", [5909] = "Moulin Marly", [5910] = "Chemin de Fer", [5911] = "Pont Albert", [5912] = "Anciens Etangs", [5913] = "Monnoyer", [5915] = "Forest Centre", [5916] = "Egide van Ophem", [5917] = "Wagon", [5919] = "Carrefour Stalle", [5921] = "Carrefour Stalle", [5922] = "Eggergat", [5923] = "Eggergat", [5951] = "Anciens Etangs", [5952] = "Wagon", [5953] = "Egide van Ophem", [5958] = "Pont Albert", [5959] = "Chemin de Fer", [5960] = "Moulin Marly", [5963] = "Pathe", [5964] = "Pathe", [5965] = "Monnoyer", [5967] = "Rive Droite", [5968] = "Aquiris", [6016] = "Limite", [6017] = "Houwaert", [6018] = "Steurs", [6019] = "Fuss", [6020] = "Clays", [6021] = "Chasseurs Ardennais", [6022] = "Wappers", [6023] = "De Jamblinne de Meux", [6024] = "Chevalerie", [6029] = "Schweitzer", [6053] = "Chevalerie", [6054] = "Wappers", [6055] = "De Jamblinne de Meux", [6056] = "Chasseurs Ardennais", [6058] = "Clays", [6059] = "Fuss", [6060] = "Steurs", [6061] = "Bossuet", [6062] = "Rue Traversiere", [6075] = "Joseph Baeck", [6076] = "Mennekens", [6103] = "Jules de Trooz", [6112] = "Flagey", [6123] = "Masui", [6168] = "Jules de Trooz", [6173] = "Prince Leopold", [6203] = "Coteaux", [6210] = "Bienfaiteurs", [6305] = "Robiano", [6362] = "Robiano", [6407] = "Tenbosch", [6408] = "Churchill", [6452] = "Tenbosch", [6453] = "Washington", [6648] = "Triangle", [6701] = "Comte de Flandre", [6702] = "Borne", [6704] = "Duchesse de Brabant", [6706] = "Savonnerie", [6752] = "Duchesse de Brabant", [6754] = "Borne", [6755] = "Comte de Flandre", [6800] = "Jette Gare", [6805] = "Broustin", [6806] = "Bara", [6809] = "Douvres", [6858] = "Douvres", [6862] = "Bara", [6864] = "Broustin", [6865] = "Miroir", [6931] = "Station Saint-Job", [6956] = "Station Saint-Job", [7501] = "Hippodrome", [9011] = "La Chasse", [9020] = "Montgomery", [9021] = "Botanique", [9022] = "Botanique", [9023] = "Rue Traversiere", [9024] = "Heros", [9025] = "Wtc", [9026] = "Wtc", [9027] = "Breesch", [9044] = "Cite Jardin", [9047] = "Stienon", [9048] = "Stienon", [9054] = "Cite Jardin", [9059] = "Heiligenborre", [9060] = "Quetelet", [9063] = "Hopital Saint-Etienne", [9064] = "Rue Traversiere", [9103] = "Square du Centenaire", [9164] = "Marmotte", [9169] = "Vier Huiskens", [9290] = "Saint-Vincent", [9291] = "Dailly", [9296] = "Dailly", [9311] = "Jules Bordet", [9561] = "Vier Huiskens", [9600] = "Brussels Airport", [9605] = "Minnemolen", [9606] = "Ennepetal", [9607] = "Twee Leeuwenweg", [9608] = "VTM", [9609] = "Hoogveld", [9626] = "Minnemolen", [9627] = "Vlierkens", [9631] = "Ennepetal", [9632] = "Twee Leeuwenweg", [9634] = "VTM", [9635] = "Hoogveld", [9649] = "Dorent", [9651] = "Kerk Ruisbroek", [9652] = "Ruisbroek Centrum", [9654] = "Kapel Ruisbroek", [9655] = "Voetbalclub", [9656] = "Beka", [9657] = "Waterbury", [9658] = "Lot Station", [9659] = "Station Lot", [9660] = "Sportcentrum Ruisbroek", [9677] = "Waterbury", [9678] = "Beka", [9679] = "Voetbalclub", [9680] = "Kapel Ruisbroek", [9682] = "Ruisbroek Centrum", [9683] = "Kerk Ruisbroek", [9685] = "Sportcentrum Ruisbroek", [9686] = "Dorent", [9701] = "Kerk Machelen", [9702] = "Raedemaekers", [9703] = "Kasteel Beaulieu", [9704] = "Machelen", [9705] = "Kerk Machelen", [9706] = "Pellenberg", [9707] = "Jordaen", [9725] = "Kasteel Beaulieu", [9726] = "Raedemaekers", [9727] = "Parkstraat", [9728] = "Koningin Fabiola", [9729] = "Pellenberg", [9751] = "Vilvorde Station", [9753] = "Blokken", [9754] = "Drie Fonteinen", [9755] = "Bicoque", [9756] = "Diegemstraat", [9776] = "Diegemstraat", [9777] = "Bicoque", [9778] = "Drie Fonteinen", [9779] = "Blokken", [9780] = "Heldenplein", [9783] = "Kerk Vilvoorde", [9784] = "Vilvorde Station", [9786] = "Heldenplein", [9787] = "Kerk Vilvoorde", [9788] = "Sportcomplex", [9851] = "Lenneke Mare", [9853] = "Hof Ter Musschen", [9876] = "Lenneke Mare", [9996] = "Montgomery" } cardpeek-0.8/dot_cardpeek_dir/scripts/etc/paris-rer.lua0000644000175000017500000002724012135147243020222 00000000000000BANLIEUE_LIST = { [01] = { [00] = "Châtelet-Les Halles", [01] = "Châtelet-Les Halles", [07] = "Luxembourg" }, [03] = { [00] = "Saint-Michel Notre-Dame" }, [06] = { [00] = "Auber" }, [14] = { [04] = "Cité Universitaire" }, [15] = { [12] = "Port Royal", [13] = "Denfert-Rochereau" }, [16] = { [01] = "Nation", [02] = "Fontenay-sous-Bois|Vincennes", [03] = "Joinville-le-Pont|Nogent-sur-Marne", [04] = "Saint-Maur Créteil", [05] = "Le Parc de Saint-Maur", [06] = "Champigny", [07] = "La Varenne-Chennevières", [08] = "Boissy-Saint-Léger|Sucy Bonneuil" }, [17] = { [01] = "Charles de Gaulle-Etoile", [04] = "La Défense (Grande Arche)", [05] = "Nanterre-Université|Nanterre-Ville|Nanterre-Préfecture", [06] = "Rueil-Malmaison", [08] = "Chatou-Croissy", [09] = "Le Vésinet-Centre|Le Vésinet-Le Pecq|Saint-Germain-en-Laye" }, [18] = { [00] = "Denfert-Rochereau", [01] = "Gentilly", [02] = "Arcueil-Cachan|Laplace", [03] = "Bagneux|Bourg-la-Reine", [04] = "La Croix-de-Berny|Parc de Sceaux", [05] = "Antony|Fontaine-Michalon|Les Baconnets", [06] = "Massy-Palaiseau|Massy-Verrières", [07] = "Palaiseau|Palaiseau Villebon", [08] = "Lozère", [09] = "Le Guichet|Orsay-Ville", [10] = "Bures-sur-Yvette|Courcelle-sur-Yvette|Gif-sur-Yvette|La Hacquinière|Saint-Rémy-lès-Chevreuse" }, [20] = { [01] = "Gare de l'Est", [04] = "Pantin", [05] = "Noisy-le-Sec", [06] = "Bondy", [07] = "Gagny|Le Raincy Villemomble", [09] = "Chelles Gournay|Le Chênay Gagny", [10] = "Vaires Torcy", [11] = "Lagny-Thorigny", [13] = "Esbly", [14] = "Meaux", [15] = "Changis-Saint-Jean|Isles-Armentières Congis|Lizy-sur-Ourcq|Trilport", [16] = "Crouy-sur-Ourcq|La Ferté-sous-Jouarre|Nanteuil Saacy" }, [21] = { [05] = "Rosny-Bois-Perrier|Rosny-sous-Bois|Val de Fontenay", [06] = "Nogent Le-Perreux", [07] = "Les Boullereaux Champigny", [08] = "Villiers-sur-Marne", [09] = "Les Yvris Noisy-le-Grand", [10] = "Emerainville|Roissy-en-Brie", [11] = "Ozoir-la-Ferrière", [12] = "Gretz-Armainvilliers|Tournan", [15] = "Courquetaine|Faremoutiers Pommeuse|Guerard La-Celle-sur-Morin|Liverdy en Brie|Marles-en-Brie|Mormant|Mortcerf|Mouroux|Ozouer le voulgis|Verneuil-l'Etang|Villepatour - Presles|Yebles|Yebles - Guignes", [16] = "Chailly Boissy-le-Châtel|Chauffry|Coulommiers|Jouy-sur-Morin Le-Marais|Nangis|Saint-Rémy-la-Vanne|Saint-Siméon", [17] = "Champbenoist-Poigny|La Ferté-Gaucher|Longueville|Provins|Sainte-Colombe-Septveilles", [18] = "Flamboin|Meilleray|Villiers St Georges" }, [22] = { [07] = "Allée de la Tour-Rendez-Vous|La Remise-à-Jorelle|Les Coquetiers|Les Pavillons-sous-Bois", [08] = "Gargan", [09] = "Freinville Sevran|L'Abbaye|Lycée Henri Sellier|Rougemont-Chanteloup" }, [23] = { [13] = "Couilly Saint-Germain Quincy|Les Champs-Forts|Montry Condé", [14] = "Crécy-en-Brie La Chapelle|Villiers-Montbarbin" }, [26] = { [05] = "Val de Fontenay", [06] = "Bry-sur-Marne|Neuilly-Plaisance", [07] = "Noisy-le-Grand (Mont d'Est)", [08] = "Noisy-Champs", [10] = "Lognes|Noisiel|Torcy", [11] = "Bussy-Saint-Georges", [12] = "Val d'europe", [13] = "Marne-la-Vallée Chessy" }, [28] = { [04] = "Fontenay-aux-Roses|Robinson|Sceaux" }, [30] = { [01] = "Gare Saint-Lazare", [03] = "Pont Cardinet", [04] = "Asnières|Bécon-les-Bruyères|Clichy Levallois|Courbevoie|La Défense (Grande Arche)", [05] = "Puteaux|Suresnes Mont-Valérien", [07] = "Garches Marne-la-Coquette|Le Val d'Or|Saint-Cloud", [08] = "Vaucresson", [09] = "Bougival|La Celle-Saint-Cloud|Louveciennes|Marly-le-Roi", [10] = "L'Etang-la-Ville|Saint-Nom-la-Bretêche Forêt" }, [31] = { [07] = "Chaville-Rive Droite|Sèvres Ville-d'Avray|Viroflay-Rive Droite", [08] = "Montreuil|Versailles-Rive Droite" }, [32] = { [05] = "La Garenne-Colombes|Les Vallées|Nanterre-Université", [07] = "Houilles Carrières-sur-Seine|Sartrouville", [09] = "Maisons-Laffitte", [10] = "Poissy", [11] = "Médan|Villennes-sur-Seine", [12] = "Les Clairières de Verneuil|Vernouillet Verneuil", [13] = "Aubergenville-Elisabethville|Les Mureaux", [14] = "Epône Mézières", [16] = "Bonnières|Mantes-la-Jolie|Mantes-Station|Port-Villez|Rosny-sur-Seine" }, [33] = { [10] = "Achères-Grand-Cormier|Achères-Ville", [11] = "Cergy-Préfecture|Neuville-Université", [12] = "Cergy-le-Haut|Cergy-Saint-Christophe" }, [34] = { [05] = "Suresnes - Lonchamp", [06] = "Les Côteaux|Pont de Saint Cloud|Pont de Sèvres", [07] = "Bas Meudon|Bellevue funiculaire", [08] = "Les Moulineaux - Billancourt" }, [35] = { [04] = "Bois-Colombes", [05] = "Colombes|Le Stade", [06] = "Argenteuil", [08] = "Cormeilles-en-Parisis|Val d'Argenteuil", [09] = "Herblay|La Frette Montigny", [10] = "Conflans-Fin d'Oise|Conflans-Sainte-Honorine", [11] = "Andrésy|Chanteloup-lès-Vignes|Maurecourt", [12] = "Triel-sur-Seine|Vaux-sur-Seine", [13] = "Meulan Hadricourt|Thun-le-Paradis", [14] = "Gargenville|Juziers", [15] = "Issou Porcheville|Limay", [16] = "Breval|Ménerville" }, [40] = { [01] = "Gare de Lyon|Gare de Lyon (Banlieue)", [05] = "Le Vert de Maisons|Maisons-Alfort Alfortville", [06] = "Villeneuve-Prairie", [07] = "Villeneuve-Triage", [08] = "Villeneuve-Saint-Georges", [09] = "Juvisy|Vigneux-sur-Seine", [10] = "Ris-Orangis|Viry-Châtillon", [11] = "Evry Val de Seine|Grand-Bourg", [12] = "Corbeil-Essonnes|Mennecy|Moulin-Galant", [13] = "Ballancourt|Fontenay le Vicomte", [14] = "La Ferté-Alais", [16] = "Boutigny|Maisse", [17] = "Boigneville|Buno-Gironville" }, [41] = { [00] = "Saint-Michel Notre-Dame|Musée d'Orsay", [01] = "Gare d'Austerlitz", [02] = "Bibliotheque-Francois", [03] = "Boulevard Masséna", [04] = "Ivry-sur-Seine|Vitry-sur-Seine", [05] = "Choisy-le-Roi|Les Ardoines", [07] = "Villeneuve-le-Roi", [08] = "Ablon", [09] = "Athis-Mons" }, [42] = { [09] = "Epinay-sur-Orge|Savigny-sur-Orge", [10] = "Sainte-Geneviève-des-Bois", [11] = "Saint-Michel-sur-Orge", [12] = "Brétigny-sur-Orge|Marolles-en-Hurepoix", [13] = "Bouray|Lardy", [14] = "Chamarande|Etampes|Etréchy", [16] = "Saint-Martin d'Etampes", [17] = "Guillerval" }, [43] = { [09] = "Montgeron Crosne|Yerres", [10] = "Brunoy", [11] = "Boussy-Saint-Antoine|Combs-la-Ville Quincy", [12] = "Lieusaint Moissy", [13] = "Cesson|Savigny-le-Temple Nandy", [15] = "Le Mée|Melun", [16] = "Chartrettes|Fontaine-le-Port|Livry-sur-Seine", [17] = "Champagne-sur-Seine|Héricy|La Grande Paroisse|Vernou-sur-Seine|Vulaines-sur-Seine Samoreau" }, [44] = { [12] = "Essonnes-Robinson|Villabé", [13] = "Coudray-Montceaux|Le Plessis-Chenet-IBM|Saint-Fargeau", [14] = "Boissise-le-Roi|Ponthierry Pringy", [15] = "Vosves", [16] = "Bois-le-Roi", [17] = "Bagneaux-sur-Loing|Bourron-Marlotte Grez|Fontainebleau-Avon|Montereau|Montigny-sur-Loing|Moret Veneux-les-Sablons|Nemours Saint-Pierre|Saint-Mammés|Souppes|Thomery" }, [45] = { [10] = "Grigny-Centre", [11] = "Evry Courcouronnes|Orangis Bois de l'Epine", [12] = "Le Bras-de-Fer - Evry" }, [50] = { [00] = "Haussmann-Saint-Lazare", [01] = "Gare du Nord|Gare du Nord (Surface)|Magenta|Paris-Nord", [05] = "Epinay-Villetaneuse|Saint-Denis|Sèvres-Rive Gauche", [06] = "La Barre-Ormesson", [07] = "Champ de Courses d'Enghien|Enghien-les-Bains", [08] = "Ermont Eaubonne|Ermont-Eaubonne|Ermont-Halte|Gros-Noyer Saint-Prix", [09] = "Saint-Leu-La-Forêt|Taverny|Vaucelles", [10] = "Bessancourt|Frépillon|Mery", [11] = "Mériel|Valmondois", [12] = "Bruyères-sur-Oise|Champagne-sur-Oise|L'Isle-Adam Parmain|Persan Beaumont" }, [51] = { [04] = "La Courneuve-Aubervilliers|La Plaine-Stade de France", [05] = "Le Bourget", [07] = "Blanc-Mesnil|Drancy", [08] = "Aulnay-sous-Bois", [09] = "Sevran Livry|Vert-Galant", [10] = "Villeparisis", [11] = "Compans|Mitry Claye|Mitry-Claye", [12] = "Dammartin Juilly Saint-Mard|Thieux Nantouillet" }, [52] = { [05] = "Stade de France-Saint-Denis", [06] = "Pierrefitte Stains", [07] = "Garges-Sarcelles", [08] = "Villiers-le-Bel (Gonesse -", [10] = "Goussainville|Les Noues|Louvres", [11] = "La Borne-Blanche|Survilliers-Fosses" }, [53] = { [06] = "Deuil Montmagny", [07] = "Groslay", [08] = "Sarcelles Saint-Brice", [09] = "Domont|Ecouen Ezanville", [10] = "Bouffemont Moisselles|Montsoult Maffliers", [11] = "Belloy-Saint-Martin|Luzarches|Seugy|Viarmes|Villaines" }, [54] = { [08] = "Cernay", [09] = "Franconville|Montigny Beauchamp|Montigny-Beauchamp", [10] = "Pierrelaye", [11] = "Pontoise|Saint-Ouen-l'Aumône|Saint-Ouen-l'Aumone-Liesse", [12] = "Boissy-l'Aillerie|Osny", [15] = "Chars|Montgeroult Courcelles|Santeuil Le Perchay|Us" }, [55] = { [00] = "Avenue Foch|Avenue Henri-Martin|Kennedy Radio-France|Boulainvilliers|Neuilly-Porte Maillot", [01] = "Péreire-Levallois", [02] = "Porte de Clichy", [03] = "Saint-Ouen", [04] = "Les Grésillons", [05] = "Gennevilliers", [06] = "Epinay-sur-Seine", [07] = "Saint-Gratien" }, [56] = { [11] = "Auvers-sur-Oise|Chaponval|Epluches|Pont Petit" }, [57] = { [11] = "Presles Courcelles", [12] = "Nointel Mours" }, [60] = { [01] = "Gare Montparnasse|Paris Montparnasse3 Vaug.", [04] = "Clamart|Vanves Malakoff", [05] = "Bellevue|Bièvres|Meudon", [06] = "Chaville-Rive Gauche|Chaville-Vélizy|Viroflay-Rive Gauche", [07] = "Versailles-Chantiers", [10] = "Saint-Cyr", [11] = "Saint-Quentin-en-Yvelines -|Trappes", [12] = "Coignières|La Verrière", [13] = "Les Essarts-le-Roi", [14] = "Le Perray|Rambouillet", [15] = "Gazeran" }, [61] = { [10] = "Fontenay-le-Fleury", [11] = "Villepreux Les-Clayes", [12] = "Plaisir Grignon|Plaisir Les-Clayes", [13] = "Beynes|Mareil-sur-Mauldre|Maule|Nézel Aulnay", [15] = "Garancières La-Queue|Montfort-l'Amaury Méré|Orgerus Behoust|Tacoignères Richebourg|Villiers Neauphle", [16] = "Houdan" }, [63] = { [07] = "Porchefontaine|Versailles-Rive Gauche" }, [64] = { [00] = "Pont de l'alma|Invalides", [01] = "Champ de Mars-Tour Eiffel", [02] = "Javel", [03] = "Boulevard Victor - Pont du Garigliano", [04] = "Issy-Val de Seine", [05] = "Issy|Meudon-Val-Fleury" }, [65] = { [08] = "Jouy-en-Josas|Petit-Jouy-les-Loges", [09] = "Vauboyen", [10] = "Igny", [11] = "Massy-Palaiseau", [12] = "Longjumeau", [13] = "Chilly-Mazarin", [14] = "Gravigny-Balizy|Petit-Vaux" }, [70] = { [09] = "Parc des Expositions|Sevran-Beaudottes|Villepinte", [10] = "Aéroport Charles de Gaulle 1|Aéroport Charles de Gaulle 2" }, [72] = { [07] = "Sannois" }, [73] = { [11] = "Eragny Neuville|Saint-Ouen-l'Aumône (Eglise)" }, [75] = { [07] = "Les Saules|Orly-Ville", [09] = "Pont de Rungis Aéroport|Rungis-La Fraternelle", [10] = "Chemin d'Antony", [12] = "Massy-Verrières" }, [76] = { [12] = "Arpajon|Egly|La Norville", [13] = "Breuillet Bruyères-le-Châtel|Breuillet-Village|Saint-Chéron", [14] = "Sermaise", [15] = "Dourdan|Dourdan-la-Forêt" } } BANLIEUE_NET_LIST = { [1] = "RATP", [2] = "Transilien Paris Est", [3] = "Transilien Paris Saint-Lazare", [4] = "Transilien Paris Lyon", [5] = "Transilien Paris Nord", [6] = "Transilien Paris Montparnasse" } cardpeek-0.8/dot_cardpeek_dir/scripts/etc/ravkav-strings.lua0000644000175000017500000006467512165352366021323 00000000000000RAVKAV_ISSUERS = { [1] = "Service Center (Postal Bank)", [2] = "Israel Rail", [3] = "Egged", [4] = "Egged Transport", [5] = "Dan", [6] = "NTT (Nazereth Consolidated Bus Services)", [7] = "NTT (Nazereth Travel & Tourism)", [8] = "JB Tours", [9] = "Omni (Nazrin Express)", [10] = "Ayalot Regional Council", [11] = "Elite", [12] = "undefined 12", [13] = "undefined 13", [14] = "Nativ Express", [15] = "Metropolis", [16] = "Superbus", [17] = "Connex & Veolia", [18] = "Kavim", [19] = "Metrodan", [20] = "Carmelit", [21] = "CityPass", [22] = "undefined 22", [23] = "Galim (Narkis Gal)", [24] = "Golan Regional Council", [25] = "Afikim", [26] = "undefined 26", [27] = "undefined 27", [28] = "undefined 28", [29] = "undefined 29", [30] = "Dan North", [31] = "undefined 31", [32] = "undefined 32", [33] = "undefined 33", [34] = "undefined 34", [35] = "undefined 35", [36] = "undefined 36", [37] = "undefined 37", [38] = "undefined 38", [39] = "undefined 39", [40] = "undefined 40", [41] = "East Jerusalem operators" } RAVKAV_PROFILES = { -- [0] = "Standard", -- [1] = "Standard", [2] = "2", [3] = "Extended Student", [4] = "Senior Citizen", [5] = "Handicapped", [6] = "Poor vision / blind", [7] = "7", [8] = "8", [9] = "9", [10] = "Ministry of Defence", [11] = "11", [12] = "12", [13] = "Public Transport Works", [14] = "14", [15] = "15", [16] = "16", [17] = "17", [18] = "18", [19] = "Regular Student", [20] = "20", [21] = "21", [22] = "22", [23] = "23", [24] = "24", [25] = "25", [26] = "26", [27] = "27", [28] = "28", [29] = "29", [30] = "30", [31] = "31", [32] = "Child aged 5-10", [33] = "Youth", [34] = "National Service", [35] = "Of \"takad\" zayin", [36] = "Israel Police", [37] = "Prison Services", [38] = "Member of Parliament", [39] = "Parliament Guard", [40] = "Eligible for Social Security", [41] = "Victim of Hostilities", [42] = "New Immigrant in Rural Settlement" } --Cluster codes --issuerId: --[code] = description --issuerId RAVKAV_ROUTES = { --18: [1] = "Ha'Emek", --5: [11] = "Dan Region - Tel-Aviv", [12] = "Dan Region - Ever Ha'Yarkon", [13] = "Dan Region East - Bnei Brak", [14] = "Dan Region East - Ramat Gan", [15] = "Dan Region South - Bat Yam", [16] = "Dan Region South - Rishon Le'Tziyon / Holon", [17] = "Petach Tikva - Tel-Aviv", [18] = "Students", [19] = "Bat Yam - Ramat Gan", --[40] = reserved --- --2: [50] = "Israel Rail primary", [51] = "Israel Rail - Northern", [52] = "Israel Rail - Central", [53] = "Israel Rail - Southern", --[54] = reserved --- --[55] = reserved --- --3: [71] = "Holon urban + metropolis + free", [72] = "Rishon Le'Tziyon suburban", [73] = "Rishon Le'Tziyon urban", [74] = "Rechovot urban", [75] = "Rechovot suburban", [76] = "Tel-Aviv - Ashkalon", [77] = "Tel-Aviv - Galilee - Amekim", [79] = "Ashdod Students", [81] = "Haifa urban", [83] = "Haifa suburban", [84] = "Kiryat Shmona - Haifa", [85] = "Matm'z Karyut", [86] = "Hadera suburban", [87] = "Kiryat Shmona urban", [89] = "Carmiel urban + Carmiel, Haifa, Tiberias", [91] = "Jerusalem urban", [93] = "Jerusalem - Beit Shemesh", [94] = "Jerusalem - Tel-Aviv", [95] = "Jerusalem - Bnei Brak (402)", [96] = "Jerusalem - Ha'Shfela", [97] = "Jerusalem North Axis East", [98] = "Ashdod - Ashkalon - Jerusalem", [101] = "Eilat urban and intercity", [102] = "Southern cluster", [103] = "Haifa - Ha'Sharon - Jerusalem", [104] = "Jerusalem - Be'er Sheva", [105] = "Jerusalem - Bnei Brak (400)", [106] = "Ashdod - Tel-Aviv (competition)", [107] = "Nahariya - Haifa (competition)", [108] = "Shfar'am Villages (competition)", [109] = "Sefad (competition)", [110] = "Tel-Aviv - Ha'Sharon - Haifa", [111] = "Tel-Aviv - Hadera", [112] = "Haredi sector (competition)", [113] = "Jerusalem suburban", [114] = "Jerusalem protected", [115] = "Jerusalem - Haredi sector", [116] = "Netanya - Hadera (competition)", [118] = "Haifa - Jerusalem - Eilat", [121] = "Nazareth lines - JB Tours", --8 [122] = "Nazareth lines - Travel and Tourism", --7 [123] = "Nazareth Lines - NTT", --6 [124] = "Nahariya - Sefad", --14 [125] = "Nazareth-Haifa shared", --7 [126] = "Nazareth-Haifa shared", --8 [127] = "Yokneam - Tivon", --9 [130] = "Golan Heights", --24 [132] = "Nazareth area - JB Tours", --8 [141] = "Ha'Negev North", --4 [142] = "Ayalot", --10 [143] = "Rahat", --23 [151] = "Elad", --4 [152] = "Beitar Illit", --18 [153] = "Beitar Illit", --11 [154] = "Modi'in", --17 [155] = "Hadera - Netanya", --14 [157] = "Modi'in Illit", --16 [158] = "Yavne - Ashdod - Tel-Aviv", --17 [160] = "Netanya - Tel-Aviv", --14 [169] = "Lod - Tel-Aviv", --17 [170] = "Peruzdor Jerusalem", --16 [171] = "Road 4 - Jerusalem - Bnei Brak", --17 [176] = "Jerusalem perimeter", --4 [180] = "East Jerusalem", --41 [190] = "Samaria", --25 [195] = "Ha'Sharon", --15 [200] = "Dan Region", --5 [201] = "Be'er Sheva urban", --19 [202] = "Tiberias regional", --17 [203] = "Ramla - Lod", --16 [204] = "Ashdod urban", --4 [205] = "Netanya urban", --4 [206] = "Fast Lane Shuttle", --5 [208] = "Ono - Petach Tikva", --18 [210] = "Jerusalem Light Rail", --21 [214] = "Carmelit", --20 [215] = "Metronit Haifa", --30 [218] = "Fast line Tel-Aviv (BRT)", --5 [220] = "Tel-Aviv Light Rail", --? [221] = "Beer Sheva direct - Tel-Aviv", --4 [222] = "Beer Sheva - Tel-Aviv - Negev (including Arad, Yeruham, Mitzpe Ramon and Nitzana)" --15 } -- These are the station names from the Israel Rail website. -- However the IDs on the website do NOT match those used by RavKav and are incorrect, -- except for the 3 that have been updated below (with original ID added as comment) RAVKAV_LOCATIONS = { [300] = "Modi'in - Pa'ate Modi'in", [7049] = "Modi'in Center", --400 [700] = "Kiryat Hayyim", [800] = "Kiryat Motzkin", [1220] = "Lev HaMifrats", [1300] = "Hutsot HaMifrats", [1500] = "Akko", [1600] = "Nahariyya", [2100] = "Haifa Center HaShmona", [2200] = "Haifa Bat Gallim", [2300] = "Haifa Hof HaKarmel (Razi'el)", [2500] = "Atlit", [2800] = "Binyamina", [2820] = "Ceasarea - Pardes Hanna", [3100] = "Hadera West", [3300] = "Natanya", [3400] = "Bet Yehoshua", [7002] = "Herzliya", --3500 [3600] = "Tel Aviv - University", [3700] = "Tel Aviv Center - Savidor", [4100] = "Bnei Brak", [4170] = "Petah Tikva Kiryat Arye", [4250] = "Petah Tikva Sgulla", [7023] = "Tel Aviv HaShalom", --4600 [4640] = "Holon Junction", [4660] = "Holon - Wolfson", [4680] = "Bat Yam - Yoseftal", [4690] = "Bat Yam - Komemiyyut", [4800] = "Kfar Habbad", [4900] = "Tel Aviv HaHagana", [5000] = "Lod", [5010] = "Ramla", [5150] = "Lod Ganey Aviv", [5200] = "Rehovot E. Hadar", [5300] = "Be'er Ya'akov", [5410] = "Yavne", [5800] = "Ashdod Ad Halom (M.Bar Kochva)", [5900] = "Ashkelon", [6300] = "Bet Shemesh", [6500] = "Jerusalem Biblical Zoo", [6700] = "Jerusalem Malha", [7000] = "Kiryat Gat", [7300] = "Be'er Sheva North University", [7320] = "Be'er Sheva Center", [7500] = "Dimona", [8550] = "Lehavim - Rahat", [8600] = "Ben Gurion Airport", [8700] = "Kefar Sava - Nordau (A.Kostyuk)", [8800] = "Rosh Ha'Ayin North", [9000] = "Yavne West", [9100] = "Rishon LeTsiyyon HaRishonim", [9200] = "Hod HaSharon - Sokolov", [9800] = "Rishon LeTsiyyon - Moshe Dayan" } RAVKAV_EVENT_TYPES = { [1] = "Entry -", --Used for [2] = "Exit -", [6] = "Transit trip", [9] = "Cancel -", [12] = "Loaded card and used immediately for", [13] = "Loaded", [14] = "Personalization" } RAVKAV_TICKET_TYPES = { [1] = "Single or multiple", [2] = "Season pass", --free period [3] = "3", [4] = "Free of charge", [5] = "5", [6] = "Aggregate value", [7] = "Single or multiple", [8] = "8" } RAVKAV_VALIDITY_TYPES = { [0] = "Area", [1] = "Tariff", [2] = "2", [3] = "3", [4] = "4", [7] = "Rail tariff 1", [8] = "Rail tariff 2", [9] = "Predefined", [10] = "10", [11] = "11", [12] = "12", [13] = "13", [14] = "Rail area", [15] = "End of validity locations" } -- ticketType, ETT RAVKAV_CONTRACT_DESCRIPTIONS = { [1] = { [0] = "Single ticket", [1] = "Return", [2] = "Tickets for 2 trips", [3] = "Tickets for 5 trips", [4] = "Tickets for 10 trips", [5] = "Tickets for 12 trips", [6] = "Tickets for 15 trips", [7] = "Tickets for 20 trips" }, [2] = { [0] = "Monthly free travel", [1] = "Weekly free travel", [2] = "Daily free travel", [3] = "Monthly free local travel", [4] = "Free travel for the semester", [5] = "Annual free travel" }, [4] = { [0] = "Reserve soldier coupon", [1] = "Special travel" }, [6] = { [0] = "Total value of NIS 30", [1] = "Total value of NIS 50", [2] = "Total value of NIS 100", [3] = "Total value of NIS 150", [4] = "Total value of NIS 200", [5] = "Total value of NIS 5 + 30", [6] = "Total value of NIS 5 + 12.80", [7] = "Total value of NIS 5 + 20" }, [7] = { [0] = "Tickets for 4 trips", [1] = "Tickets for 6 trips", [2] = "Supplementary ticket / voucher to claim", [3] = "Special tickets" } } --Predefined codes -- 0- 999 Reserved by MOT --1000-1999 Egged --2000-2047 Compatibility tests RAVKAV_CONTRACT_TYPES = { --code = description / operators / comments [1] = "\"Rest of the country\" entire country except for Arava (soldiers)", --wilderness? [2] = "Arava [Eilot District, Egged] (soldiers)", [3] = "Rest of the country - entire country except for Yozei Dofen", --certain exceptions? [4] = "Dan Region", [6] = "Entire country except for the Arava from price code 5 and up", [7] = "Entire country up to price code 7 inclusive", [8] = "Jerusalem [CityPass] (police)", [9] = "Free travel Egged + Egged-Transport (company employees and family)", [10] = "Free travel Dan + Kavim [Dan, Kavim] (company employees and family)", [11] = "Free travel Dan + Kavim + Egged [Dan, Kavim, Egged] (company employees and family)", [12] = "Free travel Dan + Egged [Dan, Egged] (company employees and family)", [13] = "Golan Heights Student Card [Golan Heights Regional Council]", [14] = "Netanya Municipality Youth Pass [Egged Transport]", [15] = "Betar Illit <> Beit Shemesh [Kavim]", [16] = "Betar Illit internal [Kavim]", [17] = "Betar Illit youth [Kavim] (youth only, discount excepted)", [18] = "Shoham / Modi'in Illit Student Card [Superbus] (youth only)", [19] = "Betar Illit <> Beit Shemesh youth [Kavim] (youth only, discount excepted)", [21] = "Beit Shemesh internal [Superbus]", [22] = "Modi'in Illit internal [Superbus]", [23] = "Ramla internal [Superbus]", [24] = "Modi'in Illit <> Bnei Brak [Superbus]", [25] = "Shoham <> Tel-Aviv [Superbus]", [26] = "Shoham <> Ben-Gurion [Superbus]", [27] = "Modi'in internal [Connex and Veolia]", [28] = "Modi'in <> Ramla <> Lod [Connex and Veolia]", [29] = "Modi'in <> Tel-Aviv [Connex and Veolia]", [30] = "Modi'in <> Jerusalem [Connex and Veolia]", [31] = "Ashdod zones [Connex and Veolia]", [32] = "Yavne [Connex and Veolia]", [33] = "Free weekly Ashdod zones [Connex and Veolia]", [34] = "Semester Modi'in <> Jerusalem [Connex and Veolia] (students only)", [35] = "Annual Modi'in <> Jerusalem [Connex and Veolia] (students only)", [36] = "Free daily Ramla [Superbus]", [37] = "Free daily Lod [Connex and Veolia]", [39] = "Free daily Lod <> Tel-Aviv [Connex and Veolia]", [41] = "Semester Modi'in <> Tel-Aviv [Connex and Veolia] (students only)", [42] = "Annual Modi'in <> Tel-Aviv [Connex and Veolia] (students only)", [45] = "Rahat urban [Narcissus-Gal]", [46] = "Rahat surrounds [Narcissus-Gal]", [55] = "Free daily Ashdod internal [Egged-Transport]", [56] = "Ashdod internal [Egged-Transport]", [57] = "Ashkalon [Egged-Transport]", [58] = "Kiryat-Gat [Egged-Transport]", [59] = "Ashkalon <> Kiryat-Gat [Egged-Transport]", [60] = "Be'er Sheva urban [Metrodan]", [61] = "Student semester [Egged-Transport] (all clusters, students only)", [62] = "Student annual [Egged-Transport] (all clusters, students only)", [63] = "Free weekly Nazareth <> Kfar Kana [Jaybee Tours]", [64] = "Free weekly Nazareth <> Turan/Baina [Jaybee Tours]", [68] = "Free weekly Turan <> Haifa [Jaybee Tours]", [69] = "Yearly subscription for lines 28, 298, 299 [Travel and Tourism] (students only)", [70] = "Afula [Kavim]", [71] = "Free daily Afula [Kavim]", [72] = "Free daily Ha'Emek surrounds [Kavim]", [73] = "Free daily Mount Tabor [Kavim] (line 350 only)", [74] = "Free daily Tiberias [Connex and Veolia]", [75] = "Tiberias [Connex and Veolia]", [76] = "Free weekly Ma'alot <> Kfar Yasif <> Nahariya [Nativ Express]", [77] = "Nazareth [M*A*S*H]", [78] = "Nazareth <> Kfar Kana [M*A*S*H]", [79] = "Free weekly Peki'in <> Horfeish <> Nahariya [Nativ Express]", [81] = "Netanya internal [Egged-Transport]", [82] = "Free daily Netanya internal [Egged-Transport]", [86] = "Sefad [Nativ Express]", [87] = "Nahariya [Nativ Express]", [88] = "Shlomi <> Nahariya [Nativ Express]", [91] = "Free daily Sagol [Kavim] (Petach Tikva and Rosh Ha'Ayin)", [92] = "Elad <> Petach Tikva [Egged-Transport]", [93] = "Elad <> Bnei Brak [Egged-Transport]", [94] = "Free daily Elad [Egged-Transport]", [95] = "Free weekly Or Akiva <> Hadera [Nativ Express]", [96] = "Free weekly Jat <> Charish <> Hadera [Nativ Express]", [97] = "Kadima/Zoran <> Netanya [Nativ Express]", [98] = "Netanya <> Tel-Aviv [Nativ Express]", [100] = "Dan Region Free 'white' subscription [Egged, Dan, Kavim, Metropoline, Afikim] (sold through Afikim only, includes subscriptions for students)", [105] = "Dan Region Samaria free 'brown' subscription [Egged, Dan, Kavim, Metropoline, Afikim] (sold through Afikim only, includes subscriptions for students)", [109] = "Dan Region Sagol [Kavim] (Petach Tikva and Rosh Ha'Ayin)", [111] = "Dan Region Free subscription zone 1 [Dan, Egged, Kavim, Metropoline] (including students)", [112] = "Dan Region Free subscription zone 2 [Dan, Egged, Kavim, Metropoline] (including students)", [113] = "Dan Region Free subscription surrounds [Dan, Egged, Kavim, Metropoline] (including students)", [120] = "Dan Region - Free daily special [Dan] (in place of damaged smartcard)", [121] = "Dan Region - cartisiya code 41 [Dan, Egged, Kavim, Metropoline] (ring 2, zone 22 + Petach Tikva only)", [122] = "Dan Region - cartisiya code 42 [Dan, Egged, Kavim, Metropoline] (ring 1 only)", [123] = "Dan Region - cartisiya code 43 [Dan, Egged, Kavim, Metropoline] (ring 2, zone 21 only)", [124] = "Dan Region - cartisiya code 44 [Dan, Egged, Kavim, Metropoline] (surrounds)", [135] = "Dan Region - Free daily zone 1 [Dan, Egged, Kavim, Metropoline] (including Petach Tikva area)", [137] = "Dan Region - Afur, Bnei Brak [Dan]", [200] = "Nationwide aggregate value [Egged, Dan, Kavim, Metropoline] (enabled temporarily on specific clusters)", [210] = "Elad aggregate value [Egged-Transport] (Elad cluster only)", [300] = "Sharing agreement lines 331, 332 [Travel and Tourism, Jaybee Tours]", [303] = "Sharing agreement line 333 [Travel and Tourism, Jaybee Tours]", [365] = "Free weekly Migdal Ha'Emek <> Haifa [Travel and Tourism, Jaybee Tours]", [366] = "Free weekly Nazareth / Nazereth Illit <> Haifa [Travel and Tourism, Jaybee Tours]", [367] = "Free weekly Nazareth <> University [Travel and Tourism, Jaybee Tours]", [510] = "Netanya [Egged Transport, Nativ Express]", [511] = "Netanya <> Kfar Yona [Egged Transport, Nativ Express]", [512] = "Netanya <> Tel-Aviv [Egged Transport, Nativ Express]", [515] = "Hadera [Egged, Nativ Express]", [516] = "Hadera <> Or Akiva [Egged, Nativ Express]", [517] = "Hadera <> Pardes Hanna [Egged, Nativ Express]", [518] = "Netanya <> Hadera [Egged, Nativ Express]", [520] = "Metropoline Haifa [Egged, Nazrin Express]", [521] = "Single ticket code 10 [Egged, Nazrin Express]", [522] = "Single ticket code 2 [Egged, Nazrin Express]", [524] = "Single ticket code 4 [Egged, Nazrin Express]", [526] = "Single ticket code 6 [Egged, Nazrin Express]", [527] = "Single ticket code 7 [Egged, Nazrin Express]", [528] = "Single ticket code 8 [Egged, Nazrin Express]", [529] = "Single ticket code 9 [Egged, Nazrin Express]", [530] = "Haifa zone [Egged, Nazrin Express]", [532] = "Haifa surround [Egged, Nazrin Express]", [534] = "Semester Afula <> Haifa [Egged, Nazrin Express] (students only)", [535] = "Annual Afula <> Haifa [Egged, Nazrin Express] (students only)", [536] = "Semester Metropoline Haifa [Egged, Nazrin Express] (students only)", [537] = "Annual Metropoline Haifa [Egged, Nazrin Express] (students only)", [538] = "Semester Haifa zone [Egged, Nazrin Express] (students only)", [541] = "Cartisiya code 10 [Egged, Nazrin Express]", [542] = "Cartisiya code 2 [Egged, Nazrin Express]", [544] = "Cartisiya code 4 [Egged, Nazrin Express]", [545] = "Cartisiya code 6 with hourly transition [Egged, Nazrin Express]", [546] = "Cartisiya code 6 without hourly transition [Egged, Nazrin Express]", [547] = "Cartisiya code 7 [Egged, Nazrin Express]", [548] = "Cartisiya code 8 [Egged, Nazrin Express]", [549] = "Cartisiya code 9 [Egged, Nazrin Express]", [551] = "Nahariya <> Akko [Egged, Nativ Express]", [552] = "Nahariya <> Kiryat Ata Junction [Egged, Nativ Express]", [553] = "Nahariya <> Akko <> Haifa [Egged, Nativ Express]", [554] = "Carmiel <> Akko [Egged, Nativ Express]", [558] = "Akko <> Haifa [Egged, Nativ Express]", [602] = "Single Jerusalem surrounds, code 2 + continuation [Egged, Superbus]", [603] = "Shared Single Peruzdor <> Jerusalem [Egged, Superbus]", [604] = "Jerusalem surrounds, shared, cartisiya code 2 [Egged, Superbus]", [605] = "Peruzdor <> Jerusalem, cartisiya 5 + continuation [Egged, Superbus]", [606] = "Peruzdor <> Jerusalem, cartisiya 6 + continuation [Egged, Superbus]", [607] = "Beitar Illit <> Jerusalem return + continuation [Egged, Kavim]", [608] = "Beitar Illit <> Jerusalem, cartisiya 10 + continuation [Egged, Kavim]", [609] = "Beitar Illit <> Jerusalem, cartisiya 5 + continuation [Egged, Kavim] (entitled only (not including youth / senior citizens))", [610] = "Beitar Illit <> Jerusalem, cartisiya 10 + continuation [Egged, Kavim]", [611] = "Beitar Illit extended annual student [Egged, Kavim] (students only)", [612] = "Beitar Illit extended semester A student [Egged, Kavim] (students only)", [613] = "Beitar Illit extended semester B student [Egged, Kavim] (students only)", [614] = "Beitar Illit standard annual student [Egged, Kavim] (students only)", [615] = "Beitar Illit standard semester A student [Egged, Kavim] (students only)", [616] = "Beitar Illit standard semester B student [Egged, Kavim] (students only)", [617] = "Return Ticket + continuation [Egged, Kavim] (youth / senior citizens only)", [620] = "Beit Shemesh <> Jerusalem, annual student [Egged, Superbus, CityPass] (students only)", [621] = "Peruzdor <> Jerusalem, annual student [Egged, Superbus, CityPass] (students only)", [622] = "Beit Shemesh <> Jerusalem, semester A student [Egged, Superbus, CityPass] (students only)", [623] = "Peruzdor <> Jerusalem, semester A student [Egged, Superbus, CityPass] (students only)", [624] = "Beit Shemesh <> Jerusalem, semester B student [Egged, Superbus, CityPass] (students only)", [625] = "Peruzdor <> Jerusalem, semester B student [Egged, Superbus, CityPass] (students only)", [626] = "Modi'in Illit <> Jerusalem annual student [Egged, Superbus, CityPass] (students only)", [627] = "Modi'in Illit <> Jerusalem semester A student [Egged, Superbus, CityPass] (students only)", [628] = "Modi'in Illit <> Jerusalem semester B student [Egged, Superbus, CityPass] (students only)", [632] = "Beit Shemesh <> Jerusalem [Egged, Superbus, CityPass] (sold by Superbus)", [633] = "Peruzdor <> Jerusalem [Egged, Superbus, CityPass] (sold by Superbus)", [634] = "Modi'in Illit <> Jerusalem [Egged, Superbus, CityPass] (sold by Superbus)", [636] = "Beitar Illit extended youth [Egged, Kavim] (sold by Kavim)", [637] = "Extended, Beitar Illit <> Jerusalem [Egged, Kavim] (sold by Kavim)", [638] = "Standard, Beitar Illit <> Jerusalem [Egged, Kavim] (sold by Kavim)", [641] = "Jerusalem shared single code 2 [Egged, CityPass, Superbus]", [642] = "Jerusalem shared single code 3 [Egged, CityPass, Superbus]", [645] = "Jerusalem shared cartisiyot code 2 [Egged, CityPass, Superbus]", [646] = "Jerusalem shared cartisiyot code 3 [Egged, CityPass, Superbus]", [647] = "Jerusalem cartisiya 2 [Egged, CityPass] (Choham'f - to The Western Wall)", [651] = "Jerusalem free surrounds semester A [Egged, CityPass, Superbus] (students only)", [652] = "Jerusalem free surrounds annual [Egged, CityPass, Superbus] (students only)", [653] = "Jerusalem surrounds [Egged, CityPass, Superbus] (respected by Superbus only)", [654] = "Jerusalem free surrounds semester B [Egged, CityPass, Superbus] (students only)", [658] = "Beit Shemesh Jerusalem semester B [Egged, CityPass] (students only)", [659] = "Beit Shemesh Jerusalem [Egged, CityPass]", [680] = "Lines 400-402 Bnei Brak <> Jerusalem [Egged, Dan]", [690] = "East Jerusalem [East Jerusalem operators]", [692] = "East Jerusalem surrounds [East Jerusalem operators]", [701] = "Ramla <> Lod [Egged, Superbus, Connex]", [702] = "Be'er Ya'akov <> Ben-Gurion [Egged, Superbus, Connex]", [703] = "Ramla <> Lod <> Tel-Aviv [Egged, Superbus, Connex]", [704] = "Rechovot <> Rishon Le'Tziyon <> Ramla <> Lod [Egged, Superbus, Connex]", [705] = "Lod [Egged, Superbus, Connex]", [706] = "Lod <> Petach Tikva [Egged, Connex]", [707] = "Rechovot <> Rishon Le'Tziyon Be'er Ya'akov junction [Egged, Superbus]", [708] = "Rechovot <> Tel-Aviv semester B [Egged, Superbus] (students only)", [709] = "Rechovot <> Tel-Aviv [Egged, Superbus]", [811] = "Semester South [Egged, Metrodan, Metropoline, Egged-Transport] (students only)", [812] = "Annual South [Egged, Metrodan, Metropoline, Egged-Transport] (students only)", [821] = "Cartisiya 2 Tel-Aviv <> Be'er Sheva [Metropoline, Egged-Transport]", [901] = "Israel Rail free daily + Dan Region [Dan, Egged, Kavim, Metropoline] (senior citizen)", [902] = "Israel Rail free daily + Dan Region [Dan, Egged, Kavim, Metropoline] (standard passenger)", [903] = "Israel Rail + Dan Region zone 1 [Dan, Egged, Kavim, Metropoline] (senior citizen, reform)", [904] = "Israel Rail + Dan Region surrounds [Dan, Egged, Kavim, Metropoline] (senior citizen, reform)", [905] = "Israel Rail + Dan Region zone 1 [Dan, Egged, Kavim, Metropoline] (standard passenger, reform)", [906] = "Israel Rail + Dan Region surrounds [Dan, Egged, Kavim, Metropoline] (standard passenger, reform)", [907] = "Israel Rail + Dan Region zone 1 [Dan, Egged, Kavim, Metropoline] (senior citizen, special)", [908] = "Israel Rail + Dan Region zone 1 [Dan, Egged, Kavim, Metropoline] (senior citizen, standard)", [909] = "Israel Rail + Dan Region surrounds [Dan, Egged, Kavim, Metropoline] (senior citizen, special)", [910] = "Israel Rail + Dan Region surrounds [Dan, Egged, Kavim, Metropoline] (senior citizen, standard)", [911] = "Israel Rail + Dan Region zone 1 [Dan, Egged, Kavim, Metropoline] (standard passenger, special)", [912] = "Israel Rail + Dan Region zone 1 [Dan, Egged, Kavim, Metropoline] (standard passenger, standard)", [913] = "Israel Rail + Dan Region surrounds [Dan, Egged, Kavim, Metropoline] (standard passenger, special)", [914] = "Israel Rail + Dan Region surrounds [Dan, Egged, Kavim, Metropoline] (standard passenger, standard)", [925] = "Israel Rail + Haifa zone [Egged] (senior citizen)", [926] = "Israel Rail + Haifa zone [Egged] (standard passenger)", [935] = "Israel Rail + Shoham <> Ben-Gurion [Superbus] (senior citizen)", [936] = "Israel Rail + Shoham <> Ben-Gurion [Superbus] (standard passenger)", [940] = "Single Ticket Israel Rail + Samaria lines [Afikim]", [960] = "Israel Rail + Be'er Sheva [Metrodan]", [962] = "Israel Rail + Netanya [Egged Transport]", [964] = "Israel Rail + Rechovot [Egged]", [966] = "Israel Rail + Lod [Superbus, Connex, Egged]", [968] = "Israel Rail + Ashkalon [Egged Transport]", [970] = "Israel Rail + Kiryat Gat [Egged Transport]", [972] = "Israel Rail + Hadera (tentative)", [974] = "Israel Rail + Beit Yehoshua [Nativ Express]", [976] = "Israel Rail + Yavne West/East [Connex]", [978] = "Israel Rail + Ashdod [Egged Transport]", [980] = "Israel Rail + Kiryat Motzkin [Egged]", [982] = "Israel Rail + Akko [Egged]" } cardpeek-0.8/dot_cardpeek_dir/scripts/etc/brussels-metro.lua0000644000175000017500000000323112135147243021276 00000000000000BRUSSELS_METRO = { [14658] = "De Brouckere", [14668] = "Gare Centrale", [14677] = "Park", [14687] = "Art-Loi", [14697] = "Maelbeek", [14707] = "Schuman", [14716] = "Merode", [14726] = "Montgomery", [14736] = "Josephine-Charlotte", [14746] = "Gribaumont", [14755] = "Tomberg", [14765] = "Roodebeek", [14775] = "Vandervelde", [14785] = "Alma", [14795] = "Crainhem", [14804] = "Stockel", [14912] = "Sainte Catherine", [14921] = "Comte de Flandres", [14931] = "Etangs Noirs", [17314] = "Gare de l'Ouest", [17324] = "Beekant", [24707] = "Trone", [24716] = "Porte de Namur", [24726] = "Louise", [24736] = "Hotel des Monnaies", [24746] = "Porte de Hal", [24755] = "Gare du Midi", [24765] = "Clemenceau", [24775] = "Delacroix", [24814] = "Madou", [24824] = "Botanique", [24834] = "Rogier", [24843] = "Yser", [24863] = "Ribaucourt", [27099] = "Osseghem", [27109] = "Simonis", [53906] = "Thieffry", [53916] = "Petillon", [53925] = "Hankar", [53935] = "Delta", [53945] = "Beaulieu", [53955] = "Demey", [53964] = "Hermann-Debroux", [56289] = "Erasme", [56299] = "Eddy Merckx", [56308] = "CERIA", [56318] = "La Roue", [56328] = "Bizet", [56337] = "Veeweyde", [56347] = "Saint Guidon", [56357] = "Aumale", [56367] = "Jacques Brel", [64732] = "Georges Henri", [64742] = "Diamant", [64820] = "Boileau", [66181] = "Belgica", [66191] = "Pannehuis", [66201] = "Bockstael", [66211] = "Stuyvenbergh", [66220] = "Houba-Brugmann", [66230] = "Heysel", [66240] = "Roi Baudouin", [93746] = "Gare du Nord", [93824] = "Bourse", [93833] = "Anneessens", [93843] = "Lemonnier", [93873] = "Parvis Saint Gilles", [93882] = "Horta", [93892] = "Albert" } cardpeek-0.8/dot_cardpeek_dir/scripts/atr.lua0000644000175000017500000000151112135147243016322 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2011 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- require('lib.apdu') if card.connect() then card.tree_startup("ATR") card.disconnect() end cardpeek-0.8/dot_cardpeek_dir/scripts/gsm (beta).lua0000644000175000017500000003364512155053151017350 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- @name GSM SIM -- @description Analyzes GSM SIM cards only (not 3G/USIM data) -- @targets 0.8 require('lib.strict') require('lib.apdu') card.CLA = 0xA0 function card.get_response(len) return card.send(bytes.new(8,card.CLA,0xC0,0x00,0x00,len)) end function card.gsm_select(file_path,return_what,length) local sw,resp = card.select(file_path,return_what,length) if bit.AND(sw,0xFF00)==0x9F00 then log.print(log.INFO,"GSM specific response code 9Fxx") sw,resp = card.get_response(bit.AND(sw,0xFF)) end return sw,resp end GSM_DEFAULT_ALPHABET = { "@", "£", "$", "¥", "è", "é", "ù", "ì", "ò", "Ç", "\\n", "Ø", "ø", "\\r", "Å", "å", "Δ", "_", "Φ", "Γ", "Λ", "Ω", "Π", "Ψ", "Σ", "Θ", "Ξ", "\\e", "Æ", "æ", "ß", "É", " ", "!", "\"", "#", "¤", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "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", "ä", "ö", "ñ", "ü", "à" } BCD_EXTENDED = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "*", "#", "-", "?", "!", "F" } AC_GSM = { "Always", "CHV1", "CHV2", "RFU", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "ADM", "Never" } MAP1_FILE_STRUCT = { [0]="transparent", [1]="linear fixed", [3]="cyclic" } MAP1_FILE_TYPE = { [1]="MF", [2]="DF", [4]="EF" } MAP1_FILE_STATUS = { [0]="invalidated", [1]="not invalidated" } function GSM_bcd_swap(data) local i,v local r = "" for i,v in data:ipairs() do local lsb = bit.AND(v,0xF) local msb = bit.SHR(v,4) if lsb == 0xF then break end r = r .. BCD_EXTENDED[1+lsb] if msb == 0xF then break end r = r .. BCD_EXTENDED[1+msb] end return r end function GSM_tostring(data) local r = "" local i,v for i,v in data:ipairs() do if v==0xFF then return r end r = r .. GSM_DEFAULT_ALPHABET[v+1] end return r end ------------------------------------------------------------------------- function GSM_access_conditions(node,data) local text text = AC_GSM[1+bit.SHR(data:get(0), 4)] .. "," .. AC_GSM[1+bit.AND(data:get(0),0xF)] .. "," .. AC_GSM[1+bit.SHR(data:get(1), 4)] .. "," .. AC_GSM[1+bit.SHR(data:get(2), 4)] .. "," .. AC_GSM[1+bit.AND(data:get(2),0xF)] return node:set_attribute("alt",text) end function GSM_byte_map(node,data,map) local ret = node:set_attribute("alt",map[bytes.tonumber(data)]) return ret end function GSM_ICCID(node,data) return node:set_attribute("alt",GSM_bcd_swap(data)) end function GSM_SPN(node,data) return node:set_attribute("alt",GSM_tostring(bytes.sub(data,1))) end function GSM_ADN(node,data) local alpha_len = #data-14 local r = "" if data:get(0)==0xFF then return node:set_attribute("alt","(empty)") end if alpha_len then r = GSM_tostring(bytes.sub(data,0,alpha_len-1)) end r = r .. ": " .. GSM_bcd_swap(bytes.sub(data,alpha_len+2,alpha_len+12)) return node:set_attribute("alt",r) end function GSM_SMS_decode_default_alphabet(node,data) local text = "" local char local back_char = 0 local pos for pos=0,#data-1 do shifted = (pos%7) -- dmy = bit.AND(data:get(pos),bit.SHR(0xFF,shifted+1)) char = bit.AND(bit.SHL(data:get(pos),shifted),0x7F)+back_char back_char = bit.SHR(data:get(pos),7-shifted) text = text..GSM_DEFAULT_ALPHABET[char+1] if shifted==6 then text = text..GSM_DEFAULT_ALPHABET[back_char+1] back_char = 0 end end return node:set_attribute("alt",text) end function GSM_number(node,data) local bcd=GSM_bcd_swap(data) if (bcd[#bcd]=='F') then node:set_attribute("alt",string.sub(bcd,1,-1)) else node:set_attribute("alt",bcd) end end function GSM_byte(node,data) node:set_attribute("alt",data:get(0)) end GSM_MONTHS = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } GSM_QUARTER = { "00","15","30","45" } function GSM_timestamp(node,data) local bcd=data:convert(4) local tz = bcd:get(13)*10+bcd:get(12) local year = bcd:get(1)*10+bcd:get(0) if year>90 then year=1900+year else year=2000+year end node:set_attribute("alt",string.format("%i%i:%i%i:%i%i, %i%i %s %i [+%i:%s]", bcd:get(7), bcd:get(6), bcd:get(9), bcd:get(8), bcd:get(11), bcd:get(10), bcd:get(5), bcd:get(4), GSM_MONTHS[bcd:get(3)*10+bcd:get(2)], year, math.floor(tz/4), GSM_QUARTER[1+tz%4])); end function create_sub_node(node,data,label,pos,len,func) local subnode local edata = bytes.sub(data,pos,pos+len-1) subnode = node:append{classname="item",label=label,size=#edata, val=edata} if func then func(subnode,edata) end end function GSM_SMS(node,data) local subnode local pos local encoding create_sub_node(node,data,"status",0,1) pos = 1 if data:get(0)~=0 then create_sub_node(node,data,"Length of SMSC information",pos,1,GSM_byte) create_sub_node(node,data,"Type of address",pos+1,1) create_sub_node(node,data,"Service center number",pos+2,data:get(pos)-1,GSM_number) pos = pos+data:get(pos) + 1 create_sub_node(node,data,"First octet SMS deliver message",pos,1,GSM_byte) pos = pos + 1 create_sub_node(node,data,"Length of address",pos,1,GSM_byte) create_sub_node(node,data,"Type of address",pos+1,1) create_sub_node(node,data,"Sender number".." "..tostring(data:get(pos)),pos+2,math.floor((data:get(pos)+1)/2),GSM_number) pos = pos+math.floor((data:get(pos)+1)/2) + 2 create_sub_node(node,data,"TP-PID",pos,1) encoding = data:get(pos+1) create_sub_node(node,data,"TP-DCS",pos+1,1) create_sub_node(node,data,"TP-SCTS",pos+2,7,GSM_timestamp) pos = pos + 9 create_sub_node(node,data,"Length of SMS",pos,1,GSM_byte) if encoding==0 then create_sub_node(node,data,"Text of SMS",pos+1,math.floor(((data:get(pos))*7+6)/8),GSM_SMS_decode_default_alphabet) else create_sub_node(node,data,"Text of SMS",pos+1,math.floor(((data:get(pos))*7+6)/8)) end end end --[[ GSM_MAP allows to map out the content of a GSM SIM card into a set of nodes diplayed in the cardpeek interface. Each entry in GSM_MAP reperesents a node and is composed of 4 parts: 1. a "classname" (the icon used in cardpeek) 2. an "id" (the id of the node) 3. a "label" for the node. 4. an action to undertake, which itself can take 3 types of values: (a) a function name representing a function that will be called to futher process the data. (b) an array of GSM_MAP entries, mapping out a sub-directory. (c) nil, meaning that we do nothing except show raw data. The function described in 4(a) takes two parameters: the (tQuery) node in the cardpeek interface, and the data itself, represented as a bytestring. The function can therefore create sub-nodes and/or create interpretation of the data (by calling the alt() function on the node). --]] GSM_MAP = { "folder", "3F00", "MF", { { "file", "2F00", "Application directory", nil }, { "file", "2F05", "Preferred languages", nil }, { "file", "2F06", "Access rule reference", nil }, { "file", "2FE2", "ICCID", GSM_ICCID }, { "folder", "7F10", "TELECOM", { { "file", "6F06", "Access rule reference", nil }, { "file", "6F3A", "Abbreviated dialling numbers", GSM_ADN }, { "file", "6F3B", "Fixed dialing numbers", GSM_ADN }, { "file", "6F3C", "Short messages", GSM_SMS }, { "file", "6F3D", "Capability configuration parameters", nil }, { "file", "6F40", "MSISDN", GSM_ADN }, { "file", "6F42", "SMS parameters", nil }, { "file", "6F43", "SMS status", nil }, { "file", "6F44", "LND", GSM_ADN }, { "file", "6F47", "Short message status report", nil }, { "file", "6F49", "Service dialing numbers", GSM_ADN }, { "file", "6F4A", "Extension 1", nil }, { "file", "6F4B", "Extension 2", nil }, { "file", "6F4C", "Extenstion 3", nil }, { "file", "6F4D", "Barred dialing numbers", nil }, { "file", "6F4E", "Extension 5", nil }, { "file", "6F4F", "ECCP", nil }, { "file", "6F53", "GPRS location", nil }, { "file", "6F54", "SetUp menu elements", nil }, { "file", "6FE0", "In case of emergency - dialing number", nil }, { "file", "6FE1", "In case of emergency - free format", nil }, { "file", "6FE5", "Public service identity of the SM-SC", nil }, } }, { "folder", "7F20", "GSM", { { "file", "6F05", "Language indication", nil }, { "file", "6F07", "IMSI", nil }, { "file", "6F20", "Ciphering key Kc", nil }, { "file", "6F30", "PLMN selector", nil }, { "file", "6F31", "Higher priority PLMN search", nil }, { "file", "6F37", "ACM maximum value", nil }, { "file", "6F38", "Sim service table", nil }, { "file", "6F39", "Accumulated call meter", nil }, { "file", "6F3E", "Group identifier 1", nil }, { "file", "6F3F", "Groupe identifier 2", nil }, { "file", "6F41", "PUCT", nil }, { "file", "6F45", "CBMI", nil }, { "file", "6F46", "Service provider name", GSM_SPN }, { "file", "6F74", "BCCH", nil }, { "file", "6F78", "Access control class", nil }, { "file", "6F7B", "Forbidden PLMNs", nil }, { "file", "6F7E", "Location information", nil }, { "file", "6FAD", "Administrative data", nil }, { "file", "6FAE", "Phase identification", nil }, } }, } } DF_MAP = { { 2, "RFU" }, { 2, "Total memory"}, { 2, "File ID" }, { 1, "Type of file" }, { 5, "RFU" }, { 1, "Length of extra GSM data" }, { 1, "File characteristics" }, { 1, "Number of DFs in this DF" }, { 1, "Number of EFs in this DF" }, { 1, "Number of CHVs" }, { 1, "RFU" }, { 1, "CHV1 status" }, { 1, "UNBLOCK CHV1 status" }, { 1, "CHV2 status" }, { 1, "UNBLOCK CHV2 status" }, } EF_MAP = { { 2, "RFU" }, { 2, "File size" }, { 2, "File ID" }, { 1, "File type", GSM_byte_map, MAP1_FILE_TYPE }, { 1, "Command flags" }, { 3, "Access conditions", GSM_access_conditions }, { 1, "File status", GSM_byte_map, MAP1_FILE_STATUS }, { 1, "Length of extra GSM data" }, { 1, "File structure" }, --GSM_byte_map, MAP1_FILE_STRUCT }, { 1, "Length of a record" }, } function gsm_map_descriptor(node,data,map) local pos = 0 local i,v local item node = node:append{ classname="header", label="answer to select", size=#data } for i,v in ipairs(map) do item = bytes.sub(data,pos,pos+v[1]-1) child = node:append{ classname="item", label=v[2], size=v[1], val=item } if v[3] then v[3](child,item,v[4]) end pos = pos + v[1] end end function gsm_read_content_binary(node,fsize,alt) local pos = 0 local try_read local sw,resp local data = bytes.new(8) while fsize>0 do if fsize>128 then try_read = 128 else try_read = fsize end sw, resp = card.read_binary('.',pos,try_read) if sw~=0x9000 then return false end data = bytes.concat(data,resp) pos = pos + try_read fsize = fsize - try_read end node = node:append{classname="body", label="data", size=#data, val=data} if alt then alt(node,data) end return true end function gsm_read_content_record(node,fsize,rec_len,alt) local rec_count local rec_num local sw,resp local record if rec_len==nil or rec_len==0 then return false end rec_count = fsize/rec_len for rec_num=1,rec_count do sw, resp = card.read_record('.',rec_num,rec_len) if sw~=0x9000 then return false end record = node:append{ classname="record", label="record", id=rec_num, size=rec_len, val=resp } if alt then alt(record,resp) end end return true end function gsm_map(root,amap) local i,v local sw,resp local child local file_type local file_size sw, resp = card.gsm_select("#"..amap[2]) if sw == 0x9000 then child = root:append{classname=amap[1], label=amap[3], id=amap[2]} if amap[1]=="file" then gsm_map_descriptor(child,resp,EF_MAP) file_type = resp:get(13) file_size = resp:get(2)*256+resp:get(3) if file_type == 0 then gsm_read_content_binary(child,file_size,amap[4]) else gsm_read_content_record(child,file_size,resp:get(14),amap[4]) end else gsm_map_descriptor(child,resp,DF_MAP) if amap[4] then for i,v in ipairs(amap[4]) do gsm_map(child,v) end end end end end function pin_wrap(pin) local i local r = bytes.new(8) for i=1,#pin do r = bytes.concat(r,string.byte(pin,i)) end for i=#pin+1,8 do r = bytes.concat(r,0xFF) end return r end local PIN local sw,resp if card.connect() then CARD = card.tree_startup("GSM") PIN = ui.readline("Enter PIN for verification (or keep empty to avoid PIN verification)",8,"0000") if PIN~="" then PIN=pin_wrap(PIN) sw, resp = card.send(bytes.new(8,"A0 20 00 01 08",PIN)) -- unblock pin = XXXX if sw == 0x9000 then gsm_map(CARD,GSM_MAP) elseif bit.AND(sw,0xFF00) == 0x9800 then log.print(log.ERROR,"PIN Verification failed") ui.question("PIN Verfication failed, halting.",{"OK"}) else ui.question("This does not seem to be a GSM SIM card, halting.",{"OK"}) end else gsm_map(CARD,GSM_MAP) end card.disconnect() log.print(log.WARNING,"NOTE: This GSM script is still incomplete. Several data items are not analyzed and UMTS (3G) card data is not processed.") end cardpeek-0.8/dot_cardpeek_dir/scripts/moneo.lua0000644000175000017500000001501712155053151016653 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009i-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- @name Moneo -- @description French stored value card -- @targets 0.8 -- -- April 2013: Added contributions from Darius Matboo who provided a -- human readable interpretation of some of the data. -- require('lib.apdu') require('lib.tlv') function BCD(data,index) return tostring(string.format("%x",data:get(index))); end function BCD_amount(data) return string.format("%i,%i Euros", BCD(data,0)*100+BCD(data,1), BCD(data,2)) end function BCD_date(data) return string.format("%02i/%02i/%i", BCD(data,2), BCD(data,1), 2000+BCD(data,0)) end function BCD_date_time(data) return string.format("%02i/%02i/%i %02i:%02i:%02i", BCD(data,3), BCD(data,2), BCD(data,0)*100+BCD(data,1), BCD(data,4), BCD(data,5), BCD(data,6)) end function moneo_identifiants(node,data) node:append({ classname = 'item', label = 'PAN', val = data:sub(0,9), alt = tostring(data:sub(0,9)):sub(1,19) }) node:append({ classname = 'item', label = "Date d'expiration", val = data:sub(10,11), alt = string.format("%i/%i", BCD(data,11), BCD(data,10)+2000) }) node:append({ classname = 'item', label = "Date d'activation", val = data:sub(12,14), alt = BCD_date(data:sub(12,14)) }) node:append({ classname = 'item', label = "Code pays", val = data:sub(15,16), alt = tostring(data:sub(15,16)) }) node:append({ classname = 'item', label = "Code monnaie", val = data:sub(17,19), alt = data:sub(17,19):format("%C") }) end function moneo_journal_rechargements(node,data) node:append({ classname = 'item', label = 'Compteur de rechargements', val = data:sub(1,2), alt = data:sub(1,2):tonumber() }) node:append({ classname = 'item', label = 'Montant de recharge', val = data:sub(4,6), alt = BCD_amount(data:sub(4,6)) }) node:append({ classname = 'item', label = 'Reste', val = data:sub(7,9), alt = BCD_amount(data:sub(7,9)) }) node:append({ classname = 'item', label = 'Terminal', val = data:sub(13,20), alt = tostring(data:sub(13,20)) }) node:append({ classname = 'item', label = 'Date', val = data:sub(24,30), alt = BCD_date_time(data:sub(24,30)) }) end function moneo_journal_des_achats(node,data) node:append({ classname = 'item', label = "Compteur d'achats", val = data:sub(1,2), alt = data:sub(1,2):tonumber() }) node:append({ classname = 'item', label = 'Montant de la transaction', val = data:sub(5,7), alt = BCD_amount(data:sub(5,7)) }) node:append({ classname = 'item', label = 'Terminal', val = data:sub(8,17), alt = tostring(data:sub(8,17)):sub(1,19) }) node:append({ classname = 'item', label = 'Date', val = data:sub(29,35), alt = BCD_date_time(data:sub(29,35)) }) node:append({ classname = 'item', label = 'Reste', val = data:sub(26,28), alt = BCD_amount(data:sub(26,28)) }) end function moneo_montants(node,data) node:append({ classname = 'item', label = 'Credit actuel', val = data:sub(0,2), alt = BCD_amount(data:sub(0,2)) }) node:append({ classname = 'item', label = 'Credit maximum', val = data:sub(3,5), alt = BCD_amount(data:sub(3,5)) }) node:append({ classname = 'item', label = 'Montant maximum de transaction', val = data:sub(6,8), alt = BCD_amount(data:sub(6,8)) }) end function moneo_seqnum(node,data) node:set_attribute("alt",data:tonumber()) end MONEO_SFI = { { 'Rechargement rapide', 0x08 }, { 'Numero de sequence de rechargement rapide', 0x0A, moneo_seqnum }, { 'ICP', 0x0C }, { 'Identifiants', 0x17, moneo_identifiants }, { 'Montants', 0x18, moneo_montants }, { 'Type de porte-monnaie', 0x19 }, { 'Numero de sequence de rechargement', 0x1A, moneo_seqnum }, { "Numero de sequence d'achat", 0x1B, moneo_seqnum }, { 'Journal des rechargements', 0x1C, moneo_journal_rechargements }, { 'Journal des achats', 0x1D, moneo_journal_des_achats } } function process_moneo(card_ctx) local sw, resp local APP local AID = "#A00000006900" local r local SFI local i,v local NODE sw, resp = card.select(AID,nil,0) if (#resp==0) then return FALSE end -- this is for a strange bug seen in some moneo cards: -- if resp:get(1)>=0x82 then asn1.enable_single_byte_length(true) end APP = nodes.append(card_ctx, { classname="application", label="application", id=AID }) tlv_parse(APP,resp) for i,v in ipairs(MONEO_SFI) do SFI = nodes.append(APP,{ classname="file", label=v[1], id=string.format("%02X",v[2]) }) for r=1,255 do sw,resp = card.read_record(v[2],r) if (#resp==0) then break end NODE = nodes.append(SFI, { classname="record", label="record", id=r, size=#resp, val=resp }) if v[3] then v[3](NODE,resp) end end end end if card.connect() then CARD = card.tree_startup("MONEO") process_moneo(CARD) card.disconnect() else ui.question("No card detected",{"OK"}) end cardpeek-0.8/dot_cardpeek_dir/scripts/belgian eID.lua0000644000175000017500000001356012155053151017562 00000000000000-- -- This file is part of Cardpeek, the smartcard reader utility. -- -- Copyright 2009-2013 by 'L1L1' -- -- Cardpeek is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . -- -- @name Belgian eID -- @description Belgian electronic ID card. -- @targets 0.8 require('lib.apdu') require('lib.tlv') require('lib.strict') function tlv_parse_utf8(node,data) node:set_attribute("val",data) node:set_attribute("alt",data:format("%C")) end EID_IDO = { ['0'] = { "File structure version" }, ['1'] = { "Card number", ui_parse_printable }, ['2'] = { "Chip number" }, ['3'] = { "Card validity start date", ui_parse_printable }, ['4'] = { "Card validity end date", ui_parse_printable }, ['5'] = { "Card delivery municipality", ui_parse_printable }, ['6'] = { "National number", ui_parse_printable }, ['7'] = { "Name", ui_parse_printable }, ['8'] = { "2 first given names", ui_parse_printable }, ['9'] = { "First letter of third given name", ui_parse_printable }, ['A'] = { "Nationality", ui_parse_printable }, ['B'] = { "Birth location", ui_parse_printable }, ['C'] = { "Birth date", ui_parse_printable }, ['D'] = { "Sex", ui_parse_printable }, ['E'] = { "Noble condition", ui_parse_printable }, ['F'] = { "Document type", ui_parse_printable }, ['10'] = { "Special status", ui_parse_printable }, ['11'] = { "Hash of photo" } } ADDRESS_IDO = { ['0'] = { "File structure version" }, ['1'] = { "Street and number", ui_parse_printable }, ['2'] = { "ZIP code", ui_parse_printable }, ['3'] = { "municipality", ui_parse_printable } } --[[ -- If we follow the specs, this is the type of TLV parsing we need to do. -- in practice tlv_parse() in lib.tlv seems to work just as well function simpletlv_parse(node,data,ido) local tag local len = 0 local head local tail local pos = 1 local child if data==nil or #data==0 then return end tag = string.format("%X",data:get(0)) while data:get(pos)==0xFF do len = len + 255 pos = pos + 1 end len = len + data:get(pos) pos = pos + 1 head = data:sub(pos,pos+len-1) tail = data:sub(pos+len) if ido[tag] then child = node:append({ classname="item", label=ido[tag][1], id=tag, size=#head }) if ido[tag][2] then ido[tag][2](child,head) else child:set_attribute("val",head) end else node:append({ classname="file", label="(unknown)", id=tag, size=#head, val=head }) end return simpletlv_parse(node,tail,ido) end --]] -- weird parameters for belgian EID card select local BEID_SELECT = card.SELECT_RETURN_FMD + card.SELECT_RETURN_FCP function eid_process_photo(node) node:set_attribute("mime-type","image/jpeg") end function eid_process_tlv(node) local data = node:get_attribute("val") tlv_parse(node,data) end function eid_process_tlv_id(node) local data = node:get_attribute("val") tlv_parse(node,data,EID_IDO) end function eid_process_tlv_address(node) local data = node:get_attribute("val") tlv_parse(node,data,ADDRESS_IDO) end local eid_structure = { { "folder", "MF", ".3F00", { { "file", "EF_DIR", ".2F00", eid_process_tlv }, { "folder", "DF_BELPIC", ".DF00", { { "file", "EF_ODF", ".5031", eid_process_tlv }, { "file", "EF_TokenInfo", ".5032", eid_process_tlv }, { "file", "EF_AODF", ".5034", eid_process_tlv }, { "file", "EF_PrKDF", ".5035", eid_process_tlv }, { "file", "EF_CDF", ".5037", eid_process_tlv }, { "file", "EF_Cert#2", ".5038", eid_process_tlv }, { "file", "EF_Cert#3", ".5039", eid_process_tlv }, { "file", "EF_Cert#4", ".503A", eid_process_tlv }, { "file", "EF_Cert#6", ".503B", eid_process_tlv }, { "file", "EF_Cert#8", ".503C", eid_process_tlv }, }}, { "folder", "DF_ID", ".DF01", { { "file", "EF_ID#RN", ".4031", eid_process_tlv_id }, { "file", "EF_SGN#RN", ".4032", nil }, { "file", "EF_ID#Address",".4033", eid_process_tlv_address }, { "file", "EF_SGN#Address",".4034", nil }, { "file", "EF_ID#Photo", ".4035", eid_process_photo }, { "file", "EF_PuK#7", ".4038", nil }, { "file", "EF_Preferences",".4039", nil }, }} } } } function eid_load_files(parent, struct, path) local k,v local sw, resp local node if struct==nil then log.print(log.ERROR,"missing parameter #2 in eid_load_files()") return end if path==nil then path = {} end for k,v in ipairs(struct) do sw, resp = card.select(v[3],BEID_SELECT) if sw == 0x9000 then node = parent:append({ classname=v[1], label=v[2], id=v[3] }) if type(v[4])=="table" then table.insert(path,v[3]) eid_load_files(node,v[4],path) table.remove(path) local k2,v2 -- this is done to move up to parent dir -- We start again from the MF and go down for k2,v2 in ipairs(path) do card.select(v2,BEID_SELECT) end else local pos = 0 local data = bytes.new(8) repeat sw, resp = card.read_binary('.',pos) if resp then pos = pos + #resp data = data .. resp end until sw~=0x9000 or resp==nil or #resp<256 if #data then node:set_attribute("val",data) node:set_attribute("size",#data) if type(v[4])=="function" then v[4](node) end else node:set_attribute("alt",string.format("No content (code %04x)",sw)) end end end end end if card.connect() then local CARD CARD = card.tree_startup("Belgian eID") eid_load_files(CARD,eid_structure) card.disconnect() end cardpeek-0.8/dot_cardpeek_dir/version0000644000175000017500000000001312213657631014752 000000000000001378830353 cardpeek-0.8/drivers/0000755000175000017500000000000012214321142011606 500000000000000cardpeek-0.8/drivers/pcsc_driver.c0000644000175000017500000003100112214320473014176 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smartcard reader utility. * * Copyright 2009-2013 by 'L1L1' * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #ifdef _WIN32 /* * On linux pioRecvPci is expected to point somewhere in the * SCardTransmit() call but on windows, we must make it NULL. * So here is an ugly trick. */ #define SCARD_PCI_NULL NULL #elif defined(__APPLE__) SCARD_IO_REQUEST pioRecvPci_dummy; #define SCARD_PCI_NULL (&pioRecvPci_dummy) #include #define SCARD_ATTR_MAXINPUT 0x7A007 #else /* Linux et al. */ SCARD_IO_REQUEST pioRecvPci_dummy; #define SCARD_PCI_NULL (&pioRecvPci_dummy) #include #endif /* #ifndef _WIN32 * #ifndef __APPLE__ * #include * #endif * SCARD_IO_REQUEST pioRecvPci_dummy; * #define SCARD_PCI_NULL (&pioRecvPci_dummy) * #else * * * On linux pioRecvPci is expected to point somewhere in the * SCardTransmit() call but on windows, we must make it NULL. * So here is an ugly trick. * * #define SCARD_PCI_NULL NULL * #endif * #ifdef __APPLE__ * #include * #define SCARD_ATTR_MAXINPUT 0x7A007 * #endif */ #define MAX_PCSC_READ_LENGTH 270 typedef struct { LONG hcontext; SCARDHANDLE hcard; DWORD protocol; LONG status; } pcsc_data_t; static const char *pcsc_stringify_protocol(DWORD proto) { static char proto_string[32]; switch (proto) { case SCARD_PROTOCOL_T0: return "T=0"; case SCARD_PROTOCOL_T1: return "T=1"; case SCARD_PROTOCOL_RAW: return "Raw"; } sprintf(proto_string,"UNKNOWN(0x%x)",(unsigned)proto); return proto_string; } static const char *pcsc_stringify_state(DWORD state) { static char state_string[500]; int state_string_len; *state_string = 0; if (state & SCARD_STATE_CHANGED) strcat(state_string," Changed state,"); if (state & SCARD_STATE_IGNORE) strcat(state_string," Ignore reader,"); if (state & SCARD_STATE_UNKNOWN) strcat(state_string," Unknown reader,"); if (state & SCARD_STATE_UNAVAILABLE) strcat(state_string," Status unavailable,"); if (state & SCARD_STATE_EMPTY) strcat(state_string," Card removed,"); if (state & SCARD_STATE_PRESENT) strcat(state_string," Card present,"); if (state & SCARD_STATE_EXCLUSIVE) strcat(state_string," Exclusive access,"); if (state & SCARD_STATE_INUSE) strcat(state_string," Shared access,"); if (state & SCARD_STATE_MUTE) strcat(state_string," Silent card,"); state_string_len=strlen(state_string); if (state_string[state_string_len-1]==',') state_string[state_string_len-1]=0; else strcat(state_string,"UNDEFINED"); return state_string; } static int pcsc_connect(cardreader_t *cr, unsigned prefered_protocol) { DWORD attr_maxinput = 0; DWORD attr_maxinput_len = sizeof(unsigned int); SCARD_READERSTATE reader_state; pcsc_data_t* pcsc = cr->extra_data; int counter = 0; GtkWidget *progress; memset(&reader_state,0,sizeof(reader_state)); reader_state.szReader = cr->name+7; reader_state.dwCurrentState = SCARD_STATE_UNAWARE; pcsc->status = SCardGetStatusChange(pcsc->hcontext,INFINITE,&reader_state,1); if (pcsc->status != SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Failed to query reader status before connecting: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return 0; } progress = gui_inprogress_new("Connection","Waiting for the reader to connect to a card."); while ((reader_state.dwEventState & SCARD_STATE_PRESENT)==0) { reader_state.dwCurrentState = reader_state.dwEventState; if (((counter++)%30)==0) { log_printf(LOG_INFO,"Waiting for card to be present (current state: %s)...", pcsc_stringify_state(reader_state.dwEventState)); } if (!gui_inprogress_pulse(progress)) { log_printf(LOG_ERROR,"Connection aborted by user"); gui_inprogress_free(progress); pcsc->status = 0x6FFF; return 0; } pcsc->status = SCardGetStatusChange(pcsc->hcontext,100,&reader_state,1); if ((pcsc->status!=(LONG)SCARD_S_SUCCESS) && (pcsc->status!=(LONG)SCARD_E_TIMEOUT)) { log_printf(LOG_ERROR,"Failed to query reader status change before connecting: %s (error 0x%08x/%08x).", pcsc_stringify_error(pcsc->status), pcsc->status, SCARD_E_TIMEOUT ); return 0; } } gui_inprogress_free(progress); log_printf(LOG_DEBUG,"Attempting to connect to '%s'",cr->name); pcsc->status = SCardConnect(pcsc->hcontext, cr->name+7, /* SCARD_SHARE_EXCLUSIVE, */ SCARD_SHARE_SHARED, prefered_protocol, &(pcsc->hcard), &(cr->protocol)); if (pcsc->status!=SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Connection failed: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return 0; } if (SCardGetAttrib(pcsc->hcard,SCARD_ATTR_MAXINPUT,(LPBYTE)&attr_maxinput,(LPDWORD)&attr_maxinput_len)==SCARD_S_SUCCESS) log_printf(LOG_INFO,"Reader maximum input length is %u bytes",attr_maxinput); else log_printf(LOG_DEBUG,"Could not determinate reader maximum input length"); log_printf(LOG_INFO,"Connection successful, protocol is %s",pcsc_stringify_protocol(cr->protocol)); cr->connected=1; return 1; } static int pcsc_disconnect(cardreader_t *cr) { pcsc_data_t* pcsc = cr->extra_data; pcsc->status = SCardDisconnect(pcsc->hcard,SCARD_UNPOWER_CARD); if (pcsc->status==SCARD_S_SUCCESS) { cr->connected=0; log_printf(LOG_INFO,"Disconnected reader"); return 1; } log_printf(LOG_ERROR,"Failed to disconnect reader: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return 0; } static int pcsc_reset(cardreader_t *cr) { pcsc_data_t* pcsc = cr->extra_data; pcsc->status = SCardReconnect(pcsc->hcard, SCARD_SHARE_EXCLUSIVE, cr->protocol, SCARD_RESET_CARD, &(cr->protocol)); if (pcsc->status==SCARD_S_SUCCESS) { log_printf(LOG_INFO,"Reconnected reader"); cr->connected=1; return 1; } log_printf(LOG_ERROR,"Failed to reconnect reader: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); cr->connected=0; return 0; } static unsigned short pcsc_transmit(cardreader_t* cr, const bytestring_t* command, bytestring_t* result) { pcsc_data_t* pcsc = cr->extra_data; BYTE REC_DAT[MAX_PCSC_READ_LENGTH]; DWORD REC_LEN=MAX_PCSC_READ_LENGTH; unsigned short SW; if (cr->protocol==SCARD_PROTOCOL_T0) { pcsc->status = SCardTransmit(pcsc->hcard,SCARD_PCI_T0, bytestring_get_data(command), bytestring_get_size(command), SCARD_PCI_NULL, REC_DAT,&REC_LEN); } else if (cr->protocol==SCARD_PROTOCOL_T1) { pcsc->status = SCardTransmit(pcsc->hcard,SCARD_PCI_T1, bytestring_get_data(command), bytestring_get_size(command), SCARD_PCI_NULL, REC_DAT,&REC_LEN); } else { log_printf(LOG_ERROR,"Unknown smartcard protocol: %i",cr->protocol); return CARDPEEK_ERROR_SW; } if (pcsc->status!=SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Failed to transmit command to card: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return CARDPEEK_ERROR_SW; } if (REC_LEN>=2) { bytestring_assign_data(result,REC_LEN-2,REC_DAT); SW = (REC_DAT[REC_LEN-2]<<8)|REC_DAT[REC_LEN-1]; } else if (REC_LEN==1) { bytestring_clear(result); SW = REC_DAT[0]; } else { log_printf(LOG_ERROR,"Transmited %i bytes to the card (T=%i), but recieved a response of length 0.", bytestring_get_size(command), cr->protocol); return CARDPEEK_ERROR_SW; } return SW; } static const bytestring_t* pcsc_last_atr(cardreader_t* cr) { pcsc_data_t* pcsc = cr->extra_data; DWORD state; DWORD protocol; BYTE pbAtr[MAX_ATR_SIZE]; DWORD atrlen=MAX_ATR_SIZE; char readername[MAX_READERNAME]; DWORD readernamelen=MAX_READERNAME; /*char *tmp;*/ pcsc->status = SCardStatus(pcsc->hcard, readername,&readernamelen, &state, &protocol, pbAtr,&atrlen); if (pcsc->status==SCARD_S_SUCCESS) { bytestring_assign_data(cr->atr,atrlen,pbAtr); /*tmp = bytestring_to_format("%D",cr->atr); log_printf(LOG_INFO,"ATR is %i bytes: %s",atrlen,tmp); free(tmp);*/ } else { bytestring_clear(cr->atr); log_printf(LOG_ERROR,"Failed to query card status: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); } return cr->atr; } static char **pcsc_get_info(cardreader_t* cr) { pcsc_data_t* pcsc = cr->extra_data; DWORD state; DWORD protocol; BYTE pbAtr[MAX_ATR_SIZE]; DWORD atrlen=MAX_ATR_SIZE; char readername[MAX_READERNAME]; DWORD readernamelen=MAX_READERNAME; char num_buf[20]; char **info; pcsc->status = SCardStatus(pcsc->hcard, readername,&readernamelen, &state, &protocol, pbAtr,&atrlen); if (pcsc->status!=SCARD_S_SUCCESS) { cr->connected = 0; /*log_printf(LOG_ERROR,"Failed to query card status: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status );*/ return NULL; } info = g_malloc(5*sizeof(char *)); info[0]=g_strdup("state"); sprintf(num_buf,"%u",(unsigned)(state)); info[1]=g_strdup(num_buf); bytestring_assign_data(cr->atr,atrlen,pbAtr); info[2]=g_strdup("atr"); info[3]=bytestring_to_format("%D",cr->atr); info[4]=NULL; return info; } static int pcsc_fail(cardreader_t* cr) { pcsc_data_t* pcsc = cr->extra_data; return (pcsc->status!=SCARD_S_SUCCESS); } static void pcsc_finalize(cardreader_t* cr) { pcsc_data_t* pcsc = cr->extra_data; SCardReleaseContext(pcsc->hcontext); free(pcsc); } static int pcsc_initialize(cardreader_t *reader) { pcsc_data_t* pcsc = malloc(sizeof(pcsc_data_t)); memset(pcsc,0,sizeof(pcsc_data_t)); pcsc->status = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &(pcsc->hcontext)); if (pcsc->status!=SCARD_S_SUCCESS) { log_printf(LOG_ERROR,"Failed to establish PCSC card manager context: %s (error 0x%08x).", pcsc_stringify_error(pcsc->status), pcsc->status ); return 0; } reader->extra_data = pcsc; reader->connect = pcsc_connect; reader->disconnect = pcsc_disconnect; reader->reset = pcsc_reset; reader->transmit = pcsc_transmit; reader->last_atr = pcsc_last_atr; reader->get_info = pcsc_get_info; reader->fail = pcsc_fail; reader->finalize = pcsc_finalize; return 1; } cardpeek-0.8/drivers/null_driver.c0000644000175000017500000000346012143757324014242 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smartcard reader utility. * * Copyright 2009 by 'L1L1' * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ static int null_error(cardreader_t *cr) { UNUSED(cr); log_printf(LOG_ERROR,"Operation failed: no connected reader selected"); return 0; } static int null_connect(cardreader_t *cr, unsigned prefered_protocol) { UNUSED(prefered_protocol); return null_error(cr); } static unsigned short null_transmit(cardreader_t* cr, const bytestring_t* command, bytestring_t* result) { UNUSED(command); UNUSED(result); null_error(cr); return CARDPEEK_ERROR_SW; } static const bytestring_t* null_last_atr(cardreader_t* cr) { return cr->atr; } static int null_fail(cardreader_t* cr) { UNUSED(cr); return 1; } static void null_finalize(cardreader_t* cr) { null_error(cr); } static int null_initialize(cardreader_t *reader) { reader->connect = null_connect; reader->disconnect = null_error; reader->reset = null_error; reader->transmit = null_transmit; reader->last_atr = null_last_atr; reader->fail = null_fail; reader->finalize = null_finalize; return 1; } cardpeek-0.8/drivers/replay_driver.c0000644000175000017500000000545212155053152014556 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smartcard reader utility. * * Copyright 2009 by 'L1L1' * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "../replay.h" static int replay_connect(cardreader_t *cr, unsigned prefered_protocol) { cardreplay_t* emul = cr->extra_data; UNUSED(prefered_protocol); cr->connected = 1; return cardreplay_run_cold_reset(emul); } static int replay_disconnect(cardreader_t *cr) { cr->connected = 0; log_printf(LOG_INFO,"Disconnected reader"); return 1; } static int replay_reset(cardreader_t *cr) { cardreplay_t* emul = cr->extra_data; log_printf(LOG_INFO,"Reset reader"); return cardreplay_run_warm_reset(emul); } static unsigned short replay_transmit(cardreader_t* cr, const bytestring_t* command, bytestring_t* result) { cardreplay_t* emul = cr->extra_data; unsigned short SW = CARDPEEK_ERROR_SW; if (cr->connected) cardreplay_run_command(emul,command,&SW,result); return SW; } static const bytestring_t* replay_last_atr(cardreader_t* cr) { cardreplay_t* emul = cr->extra_data; if (cr->connected) cardreplay_run_last_atr(emul,cr->atr); return cr->atr; } static char** replay_get_info(cardreader_t* cr) { UNUSED(cr); return NULL; /* nothing to add */ } static int replay_fail(cardreader_t* cr) { return (cr->connected==0); } static void replay_finalize(cardreader_t* cr) { cardreplay_t* emul = cr->extra_data; free(emul); } static int replay_initialize(cardreader_t *reader) { char fname[PATH_MAX]; cardreplay_t* emul = cardreplay_new_from_file(fname); sprintf(fname,"%s/%s",path_config_get_string(PATH_CONFIG_FOLDER_REPLAY), reader->name+9); emul = cardreplay_new_from_file(fname); if (emul==NULL) { log_printf(LOG_ERROR,"Could not load %s",fname); return 0; } reader->extra_data = emul; reader->connect = replay_connect; reader->disconnect = replay_disconnect; reader->reset = replay_reset; reader->transmit = replay_transmit; reader->last_atr = replay_last_atr; reader->get_info = replay_get_info; reader->fail = replay_fail; reader->finalize = replay_finalize; return 1; } cardpeek-0.8/gui_inprogress.h0000644000175000017500000000217512160275534013302 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_INPROGRESS_H #define GUI_INPROGRESS_H #include GtkWidget* gui_inprogress_new(const char *title, const char *message); unsigned gui_inprogress_pulse(GtkWidget *dialog); unsigned gui_inprogress_set_fraction(GtkWidget *dialog, gdouble level); void gui_inprogress_free(GtkWidget *dialog); #endif cardpeek-0.8/script_version.h0000644000175000017500000000013512213657631013307 00000000000000#ifndef SCRIPT_VERSION_H #define SCRIPT_VERSION_H #define SCRIPT_VERSION 1378830353 #endif cardpeek-0.8/lua_bit.h0000644000175000017500000000160612160275534011660 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_BIT_H #include int luaopen_bit(lua_State* L); #endif cardpeek-0.8/bytestring.h0000644000175000017500000000742412160275534012437 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef BYTESTRING_H #define BYTESTRING_H typedef struct { unsigned len; unsigned alloc; unsigned char width; unsigned char mask; unsigned char *data; } bytestring_t; enum { BYTESTRING_ERROR=0, BYTESTRING_OK=1, BYTESTRING_NPOS=0x7FFFFFFF }; /* constructors */ int bytestring_init(bytestring_t *bs, unsigned element_width); bytestring_t* bytestring_new(unsigned element_width); bytestring_t* bytestring_new_from_string(const char *str); bytestring_t* bytestring_duplicate(const bytestring_t *bs); /* assign */ int bytestring_assign_data(bytestring_t* bs, unsigned len, const unsigned char *data); int bytestring_assign_element(bytestring_t* bs, unsigned len, unsigned char c); int bytestring_assign_digit_string(bytestring_t* bs, const char* str); /* copy */ int bytestring_copy(bytestring_t *bs, const bytestring_t *src); /* convert */ int bytestring_convert(bytestring_t *bs, const bytestring_t *src); /* append data */ int bytestring_append(bytestring_t *bs, const bytestring_t *extra); int bytestring_append_data(bytestring_t *bs, unsigned len, const unsigned char *data); int bytestring_append_element(bytestring_t* bs, unsigned len, unsigned char c); int bytestring_pushback(bytestring_t *bs, unsigned char c); /* accessors */ int bytestring_set_element(const bytestring_t *bs, int pos, unsigned char element); int bytestring_get_element(unsigned char* element, const bytestring_t *bs, int pos); const unsigned char *bytestring_get_data(const bytestring_t *bs); /* invert */ int bytestring_invert(bytestring_t *bs); /* clear */ void bytestring_clear(bytestring_t *bs); int bytestring_erase(bytestring_t *bs, unsigned pos, unsigned len); /* tests */ int bytestring_is_equal(const bytestring_t *a, const bytestring_t *b); int bytestring_is_empty(const bytestring_t *bs); int bytestring_is_printable(const bytestring_t *bs); /* insertion */ int bytestring_insert_data(bytestring_t *bs, unsigned pos, unsigned len, const unsigned char* data); int bytestring_insert_element(bytestring_t *bs, unsigned pos, unsigned len, unsigned char c); int bytestring_insert(bytestring_t *bs, unsigned pos, const bytestring_t *src); int bytestring_pad_left(bytestring_t *bs, unsigned block_size, unsigned char c); int bytestring_pad_right(bytestring_t *bs, unsigned block_size, unsigned char c); /* get size / resize */ int bytestring_resize(bytestring_t *bs, unsigned len); unsigned bytestring_get_size(const bytestring_t *bs); /* substring */ int bytestring_substr(bytestring_t *dst, unsigned pos, unsigned len, const bytestring_t* src); /* conversion to other types */ char *bytestring_to_format(const char *format, const bytestring_t *bs); double bytestring_to_number(const bytestring_t *bs); /* destructors */ void bytestring_release(bytestring_t *bs); void bytestring_free(bytestring_t *bs); #endif cardpeek-0.8/gui_cardview.h0000644000175000017500000000213212160275534012704 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_CARDVIEW_H #define GUI_CARDVIEW_H #include #include "dyntree_model.h" DyntreeModel* gui_cardview_get_store(void); GtkWidget *gui_cardview_create_window(GtkAccelGroup *accel_group); void gui_cardview_expand_all(void); void gui_cardview_cleanup(void); #endif cardpeek-0.8/Makefile.am0000644000175000017500000000507112213657631012125 00000000000000AUTOMAKE_OPTIONS = gnu AM_CFLAGS=-Wall -pedantic -Wno-overlength-strings @LUA_CFLAGS@ @PCSC_CFLAGS@ @GLIB_CFLAGS@ @GTK_CFLAGS@ @CURL_CFLAGS@ bin_PROGRAMS= cardpeek cardpeek_SOURCES = asn1.c asn1.h bytestring.c bytestring.h gui_flexi_cell_renderer.c gui_flexi_cell_renderer.h dyntree_model.c dyntree_model.h crypto.c crypto.h replay.c replay.h gui.c gui.h iso7816.c iso7816.h lua_nodes.c lua_nodes.h lua_asn1.c lua_asn1.h lua_bit.c lua_bit.h lua_bytes.c lua_bytes.h lua_card.c lua_card.h lua_crypto.c lua_crypto.h lua_ext.c lua_ext.h lua_log.c lua_log.h lua_ui.c lua_ui.h main.c misc.c misc.h pathconfig.c pathconfig.h smartcard.c smartcard.h system_info.c system_info.h a_string.c a_string.h gui_about.c gui_about.h gui_toolbar.c gui_toolbar.h gui_logview.c gui_logview.h gui_cardview.c gui_cardview.h gui_readerview.c gui_readerview.h gui_scratchpad.c gui_scratchpad.h gui_inprogress.c gui_inprogress.h doc_DATA=doc/cardpeek_ref.en.pdf cardpeek_LDADD=cardpeek_resources.$(OBJEXT) @LUA_LIBS@ @PCSC_LIBS@ @GLIB_LIBS@ @GTK_LIBS@ @CURL_LIBS@ cardpeek_LDFLAGS=-g #cardpeek_LDFLAGS=-O2 dist_man_MANS=cardpeek.1 DRIVERS=drivers/replay_driver.c drivers/null_driver.c drivers/pcsc_driver.c ICONS=icons/analyzer.png icons/item.png icons/record.png icons/smartcard.png icons/folder.png icons/cardpeek.png icons/application.png icons/file.png icons/block.png icons/atr.png icons/header.png icons/body.png CLEANFILES=cardpeek_resources.c dot_cardpeek.tar.gz EXTRA_DIST=cardpeek_resources.gresource.xml cardpeek_resources.gresource $(DRIVERS) $(ICONS) dot_cardpeek_dir doc/cardpeek_ref.en.pdf doc/cardpeek_ref.en.odt update_dot_cardpeek_dir.sh script_version.h cardpeek.desktop GLIB_COMPILE_RESOURCES=@GLIB_COMPILE_RESOURCES@ desktopdir = $(datadir)/applications desktop_DATA = cardpeek.desktop iconsdir = $(datadir)/icons/hicolor/48x48/apps icons_DATA = icons/cardpeek.png mostlyclean-local: rm -rf .cardpeek dist-hook: rm -rf `find $(distdir)/ -name .svn` dot_cardpeek.tar.gz: dot_cardpeek_dir @echo " TAR $<" $(AM_V_at)tar czf dot_cardpeek.tar.gz --directory $(srcdir)/dot_cardpeek_dir --exclude=.svn . cardpeek_resources.$(OBJEXT): dot_cardpeek.tar.gz $(ICONS) AUTHORS COPYING cardpeek_resources.gresource.xml @echo " GLIB_COMPILE_RESOURCES cardpeek_resources.gresource.xml" $(AM_V_at)$(GLIB_COMPILE_RESOURCES) --generate-source --sourcedir=. --sourcedir=$(srcdir) --target=cardpeek_resources.c $(srcdir)/cardpeek_resources.gresource.xml $(AM_V_CC)$(COMPILE) -c cardpeek_resources.c smartcard.$(OBJEXT): smartcard.c smartcard.h $(DRIVERS) $(AM_V_CC)$(COMPILE) -c $< cardpeek-0.8/config.h.in0000644000175000017500000001137312213660104012103 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if the system has the type `GStatBuf'. */ #undef HAVE_GSTATBUF /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `crypto' library (-lcrypto). */ #undef HAVE_LIBCRYPTO /* Define to 1 if you have the `ssl' library (-lssl). */ #undef HAVE_LIBSSL /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* 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 `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* 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 `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_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_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* 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 the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Version number of package */ #undef VERSION /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t cardpeek-0.8/gui_scratchpad.c0000644000175000017500000000515412213657631013217 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui.h" #include "lua_ext.h" #include "gui_scratchpad.h" #include "misc.h" /*********************************************************/ /* THE INFAMOUS UGLY GLOBALS *****************************/ /*********************************************************/ GtkListStore *COMPLETION=NULL; /*********************************************************/ /* IMPLEMENTATION ****************************************/ /*********************************************************/ static void gui_run_command_cb(GtkWidget *widget, GtkWidget *entry ) { GtkTreeIter iter; const gchar *entry_text = gtk_entry_get_text (GTK_ENTRY (entry)); UNUSED(widget); luax_run_command(entry_text); gtk_list_store_append(COMPLETION,&iter); gtk_list_store_set(COMPLETION,&iter,0,entry_text,-1); gui_update(0); } GtkWidget *gui_scratchpad_create_window(void) { GtkWidget *label; GtkWidget *hbox; GtkWidget *entry; GtkEntryCompletion* compl; GtkWidget *icon; entry = gtk_entry_new(); COMPLETION = gtk_list_store_new(1,G_TYPE_STRING); compl = gtk_entry_completion_new(); gtk_entry_completion_set_model(compl, GTK_TREE_MODEL(COMPLETION)); gtk_entry_completion_set_text_column(compl, 0); gtk_entry_set_completion(GTK_ENTRY(entry), compl); label = gtk_label_new("Command:"); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); if ((icon = gtk_image_new_from_stock(GTK_STOCK_EXECUTE,GTK_ICON_SIZE_MENU))) gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (gui_run_command_cb), (gpointer) entry); return hbox; } void gui_scratchpad_cleanup(void) { /* FIXME: check this out */ } cardpeek-0.8/gui_readerview.h0000644000175000017500000000235312160275534013242 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_READERVIEW_H #define GUI_READERVIEW_H #include #include "bytestring.h" void gui_readerview_print(unsigned event, const bytestring_t *command, unsigned short sw, const bytestring_t *response, void *extra_data); GtkWidget *gui_readerview_create_window(void); void gui_readerview_cleanup(void); #endif cardpeek-0.8/COPYING0000644000175000017500000010474012121632651011120 00000000000000 This program is released under the GPL version 3 below, with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . cardpeek-0.8/lua_bytes.h0000644000175000017500000000210612160275534012224 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_BYTES_H #include #include "bytestring.h" int luaopen_bytes(lua_State* L); bytestring_t* luaL_check_bytestring(lua_State *L, int p); int luaL_is_bytestring(lua_State *L, int p); void lua_push_bytestring(lua_State *L, bytestring_t* bs); #endif cardpeek-0.8/iso7816.h0000644000175000017500000000546212160275534011365 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef ISO7816_H #define ISO7816_H #include "bytestring.h" typedef struct { unsigned apdu_class; unsigned lc_len; unsigned lc; unsigned le_len; unsigned le; } apdu_descriptor_t; enum { APDU_CLASS_NONE, APDU_CLASS_1, APDU_CLASS_2S, APDU_CLASS_3S, APDU_CLASS_4S, APDU_CLASS_2E, APDU_CLASS_3E, APDU_CLASS_4E }; #define ISO7816_OK 1 #define ISO7816_ERROR 0 const char* iso7816_stringify_sw(unsigned short sw); const char* iso7816_stringify_apdu_class(unsigned apdu_class); int iso7816_describe_apdu(apdu_descriptor_t *ad, const bytestring_t* apdu); int iso7816_make_file_path(bytestring_t* file_path, int *path_type, const char* path); /** iso7816_make_file_path() converts a string 'path' into a couple { path_file, path_type } according to the following rules : path | path_type | ------------------+-----------+----------------------------------------- '#' | 0 | Select the MF (equiv. #3F00) '#HHHH' | 0 | Select file with ID=HHHH '#HHHHHH...' | 4 | Select by AID HHHHHH... (5 to 16 bytes) '.HHHH' | 1 | select child *EF* with file ID=HHHH '.HHHH/' | 2 | select child *DF* with file ID=HHHH '..' | 3 | select parent of current EF or DF '/HHHH/HHHH/...' | 8 | select absolute path /3F00/HHHH/HHHH/... | | without specifying the MF (3F00) './HHHH/HHHH/...' | 9 | select by relative path ./HHHH/HHHH/... | | without specifiying the current DF. The values "HH" reperesents hexadecimal pairs of digits (i.e 1 byte). 'path_file' is a bytestring representing 'path' in a binary form that is compatible with SELECT_FILE is ISO 7816-4. This approach is designed to cover all the cases presented in the specification of SELECT_FILE in ISO 7816-4 : path_type maps to the parameter P1 in the SELECT_FILE command. **/ #endif cardpeek-0.8/dyntree_model.c0000644000175000017500000013026712213657631013075 00000000000000#include "config.h" #include "dyntree_model.h" #include "misc.h" #include "a_string.h" #include #include #include #include #include /* * NOTE: Integration of the data model in GTK+ is based on the GtkTreeView * tutorial by Tim-Philipp Mller (thanks!). * */ /* internal stuff */ static void dyntree_model_init (DyntreeModel *pkg_tree); static void dyntree_model_class_init (DyntreeModelClass *klass); static void dyntree_model_tree_model_init (GtkTreeModelIface *iface); static void dyntree_model_finalize (GObject *object); static GtkTreeModelFlags dyntree_model_get_flags (GtkTreeModel *tree_model); static GType dyntree_model_get_column_type (GtkTreeModel *tree_model, gint c_index); static gboolean dyntree_model_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path); static GtkTreePath *dyntree_model_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter); static void dyntree_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value); static gboolean dyntree_model_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean dyntree_model_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent); static gboolean dyntree_model_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter); static gint dyntree_model_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean dyntree_model_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n); static gboolean dyntree_model_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child); static GObjectClass *parent_class = NULL; static gboolean internal_dyntree_model_iter_remove(DyntreeModel *ctm, GtkTreeIter *iter, gboolean emit_signal); /* implementation */ GType dyntree_model_get_type (void) { static GType dyntree_model_type = 0; if (dyntree_model_type) return dyntree_model_type; if (1) { static const GTypeInfo dyntree_model_info = { sizeof (DyntreeModelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) dyntree_model_class_init, NULL, /* class finalize */ NULL, /* class_data */ sizeof (DyntreeModel), 0, /* n_preallocs */ (GInstanceInitFunc) dyntree_model_init, NULL, }; dyntree_model_type = g_type_register_static (G_TYPE_OBJECT, "DyntreeModel", &dyntree_model_info, (GTypeFlags)0); } if (1) { static const GInterfaceInfo tree_model_info = { (GInterfaceInitFunc) dyntree_model_tree_model_init, NULL, NULL }; g_type_add_interface_static (dyntree_model_type, GTK_TYPE_TREE_MODEL, &tree_model_info); } return dyntree_model_type; } static void dyntree_model_class_init(DyntreeModelClass *klass) { GObjectClass *object_class; parent_class = (GObjectClass *) g_type_class_peek_parent (klass); object_class = (GObjectClass *) klass; object_class->finalize = dyntree_model_finalize; } static void dyntree_model_tree_model_init (GtkTreeModelIface *iface) { iface->get_flags = dyntree_model_get_flags; iface->get_n_columns = dyntree_model_get_n_columns; iface->get_column_type = dyntree_model_get_column_type; iface->get_iter = dyntree_model_get_iter; iface->get_path = dyntree_model_get_path; iface->get_value = dyntree_model_get_value; iface->iter_next = dyntree_model_iter_next; iface->iter_children = dyntree_model_iter_children; iface->iter_has_child = dyntree_model_iter_has_child; iface->iter_n_children = dyntree_model_iter_n_children; iface->iter_nth_child = dyntree_model_iter_nth_child; iface->iter_parent = dyntree_model_iter_parent; } int dyntree_model_column_name_to_index(DyntreeModel *ctm, const char *column_name) { /* the value in the table is c+1 to differentiate the NULL from N=0, so we substract 1 */ return GPOINTER_TO_INT((char *)g_hash_table_lookup(ctm->columns_by_name,(gpointer)column_name))-1; } const char *dyntree_model_column_index_to_name(DyntreeModel *ctm, int c_index) { if (c_index<0 || c_index>=ctm->n_columns) return NULL; return ctm->columns_by_index[c_index].name; } int dyntree_model_column_register(DyntreeModel *ctm, const char *column_name) { int col; if ((col = dyntree_model_column_name_to_index(ctm,column_name))<0) { col = ctm->n_columns++; if (col==ctm->max_columns) { ctm->max_columns<<=1; ctm->columns_by_index = g_realloc(ctm->columns_by_index, sizeof(DyntreeModelAttributeDescriptor)*ctm->max_columns); } ctm->columns_by_index[col].name = g_strdup(column_name); /* we add 1 to col so that col==0 is stored as 1 and not NULL */ g_hash_table_insert(ctm->columns_by_name,(gpointer)ctm->columns_by_index[col].name,GINT_TO_POINTER(col+1)); } return col; } static void dyntree_model_init (DyntreeModel *ctm) { ctm->root = NULL; ctm->columns_by_name = g_hash_table_new(cstring_hash,cstring_equal); g_assert(ctm->columns_by_name != NULL); ctm->columns_by_index = g_try_malloc(sizeof(char *)*16); g_assert(ctm->columns_by_index != NULL); ctm->max_columns = 16; ctm->n_columns = 0; ctm->stamp = g_random_int(); /* Random int to check whether an iter belongs to our model */ } static void dyntree_model_finalize (GObject *object) { DyntreeModel *ctm = DYNTREE_MODEL(object); int i; internal_dyntree_model_iter_remove(ctm,NULL,FALSE); for (i=0; in_columns; i++) { if (ctm->columns_by_index[i].name) g_free(ctm->columns_by_index[i].name); } g_free(ctm->columns_by_index); g_hash_table_destroy(ctm->columns_by_name); /* must chain up - finalize parent */ (* parent_class->finalize) (object); } static GtkTreeModelFlags dyntree_model_get_flags (GtkTreeModel *tree_model) { g_return_val_if_fail (DYNTREE_IS_MODEL(tree_model), (GtkTreeModelFlags)0); return (GTK_TREE_MODEL_ITERS_PERSIST); } /***************************************************************************** * * dyntree_model_get_n_columns: tells the rest of the world how many data * columns we export via the tree model interface * *****************************************************************************/ gint dyntree_model_get_n_columns (GtkTreeModel *tree_model) { g_return_val_if_fail (DYNTREE_IS_MODEL(tree_model), 0); return DYNTREE_MODEL(tree_model)->n_columns; } /***************************************************************************** * * dyntree_model_get_column_type: tells the rest of the world which type of * data an exported model column contains * *****************************************************************************/ static GType dyntree_model_get_column_type (GtkTreeModel *tree_model, gint c_index) { g_return_val_if_fail (DYNTREE_IS_MODEL(tree_model), G_TYPE_INVALID); g_return_val_if_fail (c_index < DYNTREE_MODEL(tree_model)->n_columns && c_index >= 0, G_TYPE_INVALID); return G_TYPE_STRING; } /***************************************************************************** * * dyntree_model_get_iter: converts a tree path (physical position) into a * tree iter structure * *****************************************************************************/ static gboolean dyntree_model_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) { /* DyntreeModel *dyntree_model; */ GtkTreeIter parent; gint *indices, n, depth; g_assert(DYNTREE_IS_MODEL(tree_model)); g_assert(path!=NULL); /* dyntree_model = DYNTREE_MODEL(tree_model); */ indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); g_assert (depth>0); if (dyntree_model_iter_nth_child(tree_model,iter,NULL,indices[0])==FALSE) return FALSE; for (n=1; nuser_data != NULL, NULL); node = (DyntreeModelNode *)iter->user_data; path = gtk_tree_path_new(); while (node) { gtk_tree_path_prepend_index(path, node->sibling_index); node = node -> parent; } return path; } /***************************************************************************** * * dyntree_model_get_value: Returns a row's exported data columns * (_get_value is what gtk_tree_model_get uses) * *****************************************************************************/ static void dyntree_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { DyntreeModelNode *node; /* DyntreeModel *ctm; */ g_return_if_fail (DYNTREE_IS_MODEL (tree_model)); g_return_if_fail (iter != NULL); g_return_if_fail (column < DYNTREE_MODEL(tree_model)->n_columns); /* ctm = DYNTREE_MODEL(tree_model); */ node = (DyntreeModelNode *) iter->user_data; g_return_if_fail ( node != NULL ); g_value_init (value, G_TYPE_STRING); if (columnmax_attributes && node->attributes[column].value) g_value_set_string(value, node->attributes[column].value); } /***************************************************************************** * * dyntree_model_iter_next: Takes an iter structure and sets it to point * to the next row. * *****************************************************************************/ static gboolean dyntree_model_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter) { DyntreeModelNode *node, *nextnode; DyntreeModel *ctm; g_return_val_if_fail (DYNTREE_IS_MODEL (tree_model), FALSE); g_return_val_if_fail (iter != NULL, FALSE); g_return_val_if_fail (iter->user_data != NULL, FALSE); ctm = DYNTREE_MODEL(tree_model); node = (DyntreeModelNode *) iter->user_data; if (node->next == NULL) return FALSE; nextnode = node->next; iter->stamp = ctm->stamp; iter->user_data = nextnode; return TRUE; } /***************************************************************************** * * dyntree_model_iter_children: Returns TRUE or FALSE depending on whether * the row specified by 'parent' has any children. * If it has children, then 'iter' is set to * point to the first child. Special case: if * 'parent' is NULL, then the first top-level * row should be returned if it exists. * *****************************************************************************/ static gboolean dyntree_model_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { DyntreeModel *ctm; DyntreeModelNode *node; g_return_val_if_fail (DYNTREE_IS_MODEL (tree_model), FALSE); ctm = DYNTREE_MODEL(tree_model); if (parent==NULL) { if (ctm->root == NULL) return FALSE; iter->user_data = ctm->root; iter->stamp = ctm->stamp; return TRUE; } node = (DyntreeModelNode *)parent->user_data; if (node->children == NULL) return FALSE; iter->user_data = node->children; iter->stamp = ctm->stamp; return TRUE; } /***************************************************************************** * * dyntree_model_iter_has_child: Returns TRUE or FALSE depending on whether * the row specified by 'iter' has any children. * *****************************************************************************/ static gboolean dyntree_model_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter) { DyntreeModelNode *node; g_return_val_if_fail (DYNTREE_IS_MODEL (tree_model), FALSE); g_return_val_if_fail (iter != NULL, FALSE); node = (DyntreeModelNode *)iter->user_data; if (node->children == NULL) return FALSE; return TRUE; } /***************************************************************************** * * dyntree_model_iter_n_children: Returns the number of children the row * specified by 'iter' has. * *****************************************************************************/ static gint dyntree_model_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter) { DyntreeModel *ctm; DyntreeModelNode *node; gint count_children; g_return_val_if_fail (DYNTREE_IS_MODEL (tree_model), -1); ctm = DYNTREE_MODEL(tree_model); /* if we are at the root of ctm, we can't rely on node->n_children so we manually count them */ if (iter==NULL) { node = ctm->root; count_children = 0; while (node) { node = node->next; count_children++; } return count_children; } node = (DyntreeModelNode *)iter->user_data; if (node==NULL) return 0; return node->n_children; } /***************************************************************************** * * dyntree_model_iter_nth_child: If the row specified by 'parent' has any * children, set 'iter' to the n-th child and * return TRUE if it exists, otherwise FALSE. * A special case is when 'parent' is NULL, in * which case we need to set 'iter' to the n-th * row if it exists. * *****************************************************************************/ static gboolean dyntree_model_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n) { DyntreeModelNode *node; DyntreeModel *ctm; g_return_val_if_fail (DYNTREE_IS_MODEL (tree_model), FALSE); ctm = DYNTREE_MODEL(tree_model); if (parent==NULL) { node = ctm->root; } else { node = (DyntreeModelNode *)parent->user_data; if (node==NULL) return FALSE; node = node->children; } while (node) { if (n==0) { iter->stamp = ctm->stamp; iter->user_data = node; return TRUE; } node = node -> next; n--; } return FALSE; } /***************************************************************************** * * dyntree_model_iter_parent: Point 'iter' to the parent node of 'child'. As * we have a list and thus no children and no * parents of children, we can just return FALSE. * *****************************************************************************/ static gboolean dyntree_model_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) { DyntreeModel *ctm; DyntreeModelNode *node; g_return_val_if_fail (DYNTREE_IS_MODEL (tree_model), -1); ctm = DYNTREE_MODEL(tree_model); node = (DyntreeModelNode *)child->user_data; if (node->parent==NULL) return FALSE; iter->stamp = ctm->stamp; iter->user_data = node->parent; return TRUE; } /***************************************************************************** * * dyntree_model_new: This is what you use in your own code to create a * new custom list tree model for you to use. * *****************************************************************************/ DyntreeModel *dyntree_model_new (void) { DyntreeModel *newctm; newctm = (DyntreeModel *) g_object_new (DYNTREE_MODEL_TYPE, NULL); g_assert( newctm != NULL ); dyntree_model_column_register(newctm,"classname"); dyntree_model_column_register(newctm,"label"); dyntree_model_column_register(newctm,"id"); dyntree_model_column_register(newctm,"size"); dyntree_model_column_register(newctm,"val"); dyntree_model_column_register(newctm,"alt"); dyntree_model_column_register(newctm,"mime-type"); g_assert(newctm->n_columns == CC_INITIAL_COUNT); return newctm; } /***************************************************************************** * * Implement user level functions * *****************************************************************************/ gboolean dyntree_model_iter_attribute_set(DyntreeModel *m, GtkTreeIter *iter, int c_index, const char *str) { int i,pos; DyntreeModelNode *node; GtkTreePath *path; g_return_val_if_fail ( iter!=NULL , FALSE ); g_return_val_if_fail ( c_index < m->n_columns && c_index >= 0, FALSE); node = (DyntreeModelNode *)iter->user_data; if (c_index>=node->max_attributes) { pos = node->max_attributes; node->max_attributes = m->max_columns; node->attributes = g_realloc(node->attributes, sizeof(DyntreeModelAttributeValue)*m->max_columns); for (i=pos; imax_attributes; i++) { node->attributes[i].value = NULL; } } if (node->attributes[c_index].value) g_free(node->attributes[c_index].value); if (str==NULL) node->attributes[c_index].value = NULL; else node->attributes[c_index].value = g_strdup(str); path = dyntree_model_get_path(GTK_TREE_MODEL(m), iter); gtk_tree_model_row_changed(GTK_TREE_MODEL(m), path, iter); gtk_tree_path_free(path); return TRUE; } gboolean dyntree_model_iter_attribute_set_by_name(DyntreeModel *m, GtkTreeIter *iter, const char *attr_name, const char *str) { int col = dyntree_model_column_register(m,attr_name); if (col>=0) return dyntree_model_iter_attribute_set(m,iter,col,str); return FALSE; } static int dyntree_model_iter_n_attributes(DyntreeModel *m, GtkTreeIter *iter) { int attr_index; int attr_count = 0; DyntreeModelNode *node = iter->user_data; for (attr_index=0; attr_indexn_columns && attr_indexmax_attributes; attr_index++) { if (node->attributes[attr_index].value) attr_count++; } return attr_count; } gboolean dyntree_model_iter_attribute_get(DyntreeModel *m, GtkTreeIter *iter, int c_index, const char **str) { DyntreeModelNode *node; g_return_val_if_fail ( iter!=NULL, FALSE); g_return_val_if_fail ( str!=NULL , FALSE); node = (DyntreeModelNode *)iter->user_data; g_return_val_if_fail (c_index < m->n_columns && c_index >= 0, FALSE); if (c_index < node->max_attributes) *str = node->attributes[c_index].value; else *str = NULL; return TRUE; } gboolean dyntree_model_iter_attribute_get_by_name(DyntreeModel *m, GtkTreeIter *iter, const char *attr_name, const char **str) { int col = dyntree_model_column_name_to_index(m,attr_name); if (col>=0) return dyntree_model_iter_attribute_get(m,iter,col,str); return FALSE; } static DyntreeModelNode *dyntree_model_node_new(DyntreeModel *ctm) { DyntreeModelNode *node = g_new0(DyntreeModelNode,1); UNUSED(ctm); node->max_attributes = 8; node->attributes = g_new0(DyntreeModelAttributeValue,node->max_attributes); return node; } static void dyntree_model_node_reindex_from_parent(DyntreeModel *ct, DyntreeModelNode *parent) { int n = 0; DyntreeModelNode *cur_node; if (parent==NULL) cur_node = ct->root; else cur_node = parent->children; while (cur_node) { cur_node->sibling_index = n++; cur_node = cur_node->next; } if (parent) parent->n_children = n; } static gboolean internal_dyntree_model_iter_remove(DyntreeModel *ctm, GtkTreeIter *iter, gboolean emit_signal) { DyntreeModelNode *node; int i; GtkTreeIter other; GtkTreePath *path; if (iter == NULL) { while (ctm->root) { other.user_data = ctm->root; internal_dyntree_model_iter_remove(ctm,&other,emit_signal); } return TRUE; } g_return_val_if_fail(iter->user_data != NULL, FALSE); node = iter->user_data; while (node->children) { other.stamp = ctm->stamp; other.user_data = node->children; internal_dyntree_model_iter_remove(ctm,&other,emit_signal); } if (emit_signal) path = dyntree_model_get_path(GTK_TREE_MODEL(ctm),iter); if (node->prev==NULL) { if (node->parent) (node->parent)->children = node->next; else ctm->root = node->next; } if (node->prev) (node->prev)->next = node->next; if (node->next) (node->next)->prev = node->prev; dyntree_model_node_reindex_from_parent(ctm,node->parent); for (i=0; imax_attributes; i++) { if (node->attributes[i].value) g_free(node->attributes[i].value); } g_free(node->attributes); g_free(node); if (emit_signal) { gtk_tree_model_row_deleted(GTK_TREE_MODEL(ctm), path); gtk_tree_path_free(path); } return TRUE; } gboolean dyntree_model_iter_remove(DyntreeModel *ctm, GtkTreeIter *iter) { return internal_dyntree_model_iter_remove(ctm,iter,TRUE); } #define dyntree_model_clear(ctm) dyntree_model_iter_remove(ctm,NULL) void dyntree_model_iter_append (DyntreeModel *ctm, GtkTreeIter *child, GtkTreeIter *parent) { DyntreeModelNode *pred_node; DyntreeModelNode *node; DyntreeModelNode *parent_node; GtkTreePath *path; g_return_if_fail( child!=NULL ); if (parent==NULL) { parent_node = NULL; if (ctm->root==NULL) { ctm->root = dyntree_model_node_new(ctm); child->stamp = ctm->stamp; child->user_data = node = ctm->root; child->user_data2 = NULL; child->user_data3 = NULL; goto row_inserted; } pred_node = ctm->root; } else { parent_node = parent->user_data; g_assert(parent_node != NULL); if (parent_node->children==NULL) { parent_node->children = dyntree_model_node_new(ctm); (parent_node->children)->parent = parent_node; parent_node->n_children = 1; child->stamp = ctm->stamp; child->user_data = node = parent_node->children; child->user_data2 = NULL; child->user_data3 = NULL; goto row_inserted; } parent_node->n_children++; pred_node = parent_node->children; } while (pred_node->next) pred_node = pred_node->next; node = dyntree_model_node_new(ctm); pred_node->next = node; node->prev = pred_node; node->sibling_index = pred_node->sibling_index+1; node->parent = parent_node; child->stamp = ctm->stamp; child->user_data = node; child->user_data2 = NULL; child->user_data3 = NULL; row_inserted: path = dyntree_model_get_path(GTK_TREE_MODEL(ctm), child); gtk_tree_model_row_inserted(GTK_TREE_MODEL(ctm), path, child); gtk_tree_path_free(path); } static gboolean dyntree_model_iter_attributes_setv(DyntreeModel *ctm, GtkTreeIter *iter, va_list al) { int column; g_assert(DYNTREE_IS_MODEL(ctm)); g_assert(iter!=NULL); while ((column = va_arg(al,int))>=0) { if (dyntree_model_iter_attribute_set(ctm, iter, column,va_arg(al,char *))==FALSE) return FALSE; } return TRUE; } gboolean dyntree_model_iter_attributes_set(DyntreeModel *ctm, GtkTreeIter *iter, ...) { va_list al; gboolean retval; va_start(al,iter); retval = dyntree_model_iter_attributes_setv(ctm,iter,al); va_end(al); return retval; } static gboolean dyntree_model_iter_attributes_getv(DyntreeModel *ctm, GtkTreeIter *iter, va_list al) { int column; g_assert(DYNTREE_IS_MODEL(ctm)); g_assert(iter!=NULL); while ((column = va_arg(al,int))>=0) { if (dyntree_model_iter_attribute_get(ctm,iter,column,va_arg(al,const char **))==FALSE) return FALSE; } return TRUE; } gboolean dyntree_model_iter_attributes_get(DyntreeModel *ctm, GtkTreeIter *iter, ...) { va_list al; gboolean retval; va_start(al,iter); retval = dyntree_model_iter_attributes_getv(ctm,iter,al); va_end(al); return retval; } /* XML EXPORT */ static gboolean internal_node_to_xml(a_string_t *res, DyntreeModel *store, GtkTreeIter *iter, int depth) { int i,attr_index; GtkTreeIter child; gchar *esc_value; DyntreeModelNode *node; const char *col_name; do { node = iter->user_data; g_assert(node != NULL); for(i=0; i\n"); else { a_strcat(res,"\n"); for (attr_index=0; attr_indexn_columns && attr_indexmax_attributes; attr_index++) { col_name = dyntree_model_column_index_to_name(store,attr_index); if (node->attributes[attr_index].value && col_name[0]!='-') { for(i=0; i<=depth; i++) a_strcat(res," "); a_strcat(res,"attributes[attr_index].value[0]) { case '8': case '4': case '2': a_strcat(res,"\" type=\"bytes\">"); a_strcat(res,node->attributes[attr_index].value); break; default: a_strcat(res,"\">"); esc_value = g_markup_escape_text(node->attributes[attr_index].value+2,-1); a_strcat(res,esc_value); g_free(esc_value); } a_strcat(res,"\n"); } } if (gtk_tree_model_iter_children(GTK_TREE_MODEL(store),&child,iter)) { internal_node_to_xml(res,store,&child,depth+1); } for(i=0; i\n"); } } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(store),iter)); return TRUE; } char *dyntree_model_iter_to_xml(DyntreeModel *ct, GtkTreeIter *root, gboolean full_xml) { a_string_t *res; GtkTreeIter root_copy; int initial_depth; if (full_xml) { res = a_strnew("\n"); a_strcat(res,"\n"); a_strcat(res," 0.8\n"); initial_depth = 1; } else { res = a_strnew(""); initial_depth = 0; } if (root==NULL) { if (dyntree_model_iter_children(GTK_TREE_MODEL(ct),&root_copy,NULL)==TRUE) internal_node_to_xml(res,ct,&root_copy,initial_depth); } else { root_copy = *root; internal_node_to_xml(res,ct,&root_copy,initial_depth); } if (full_xml) { a_strcat(res,"\n"); } return a_strfinalize(res); } gboolean dyntree_model_iter_to_xml_file(DyntreeModel *ct, GtkTreeIter *root, const char *fname) { int output; char *xml; gboolean retval; if ((output = g_open(fname, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR))<0) { log_printf(LOG_ERROR,"Could not open '%s' for output (%s)",fname,strerror(errno)); return FALSE; } xml = dyntree_model_iter_to_xml(ct,root,TRUE); if (write(output,xml,strlen(xml))<0) { log_printf(LOG_ERROR,"Output error on '%s' (%s)",fname,strerror(errno)); retval = FALSE; } else retval = TRUE; g_free(xml); close(output); return retval; } /* XML IMPORT */ enum { ND_NONE, ND_ROOT, ND_NODE, ND_ATTR, ND_VERSION, ND_ADEF }; const char *ND_STATE[6] = { "file", "root", "", "", "", NULL }; typedef struct { gboolean ctx_is_root; unsigned ctx_version; DyntreeModel *ctx_tree; GtkTreeIter ctx_node; int ctx_column; int ctx_state; int ctx_encoded; } xml_context_data_t; static void xml_start_element_cb (GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { xml_context_data_t *ctx = (xml_context_data_t *)user_data; GtkTreeIter child; int line_number; int char_number; int attr_index; const char *attr_name; g_markup_parse_context_get_position(context,&line_number,&char_number); if (g_strcmp0(element_name,"node")==0) { if (ctx->ctx_state==ND_ROOT) { if (ctx->ctx_is_root) { dyntree_model_iter_append (ctx->ctx_tree, &child, NULL); ctx->ctx_is_root = FALSE; } else { dyntree_model_iter_append (ctx->ctx_tree, &child, &ctx->ctx_node); } } else if (ctx->ctx_state==ND_NODE) { dyntree_model_iter_append (ctx->ctx_tree, &child, &ctx->ctx_node); } else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unexpected in %s", line_number,char_number,ND_STATE[ctx->ctx_state]); return; } ctx->ctx_node = child; ctx->ctx_state=ND_NODE; } else if (g_strcmp0(element_name,"attr")==0) { if (ctx->ctx_state!=ND_NODE) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unexpected in %s", line_number,char_number,ND_STATE[ctx->ctx_state]); return; } attr_name = NULL; attr_index = 0; ctx->ctx_encoded =0; while (attribute_names[attr_index]) { if (g_strcmp0("name",attribute_names[attr_index])==0) { attr_name = attribute_values[attr_index]; ctx->ctx_column = dyntree_model_column_register(ctx->ctx_tree,attr_name); if (ctx->ctx_column<0) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: failed to register attribute '%s'", line_number,char_number,attr_name); return; } } else if (g_strcmp0("type",attribute_names[attr_index])==0) { if (g_strcmp0("bytes",attribute_values[attr_index])==0) { ctx->ctx_encoded = 1; } else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unrecognized type '%s' in ", line_number,char_number,attribute_values[attr_index]); return; } } else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unrecognized attribute '%s' in ", line_number,char_number,attribute_names[attr_index]); return; } attr_index++; } ctx->ctx_state=ND_ATTR; } else if (g_strcmp0(element_name,"cardpeek")==0) { if (ctx->ctx_state!=ND_NONE) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unexpected in %s", line_number,char_number,ND_STATE[ctx->ctx_state]); return; } ctx->ctx_state=ND_ROOT; if (attribute_names[0]) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unrecognized attribute '%s' in ", line_number,char_number,attribute_names[0]); return; } } else if (g_strcmp0(element_name,"version")==0) { if (ctx->ctx_state!=ND_ROOT) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Error on line %i[%i]: unexpected in %s", line_number,char_number,ND_STATE[ctx->ctx_state]); return; } ctx->ctx_state=ND_VERSION; } else /* error */ { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_UNKNOWN_ELEMENT, "Error on line %i[%i]: unrecognized element <%s> in %s", line_number,char_number,element_name,ND_STATE[ctx->ctx_state]); } } static void xml_end_element_cb (GMarkupParseContext *context, const gchar *element_type, gpointer user_data, GError **error) { xml_context_data_t *ctx = (xml_context_data_t *)user_data; GtkTreeIter parent; UNUSED(element_type); UNUSED(context); UNUSED(error); switch (ctx->ctx_state) { case ND_NODE: if (dyntree_model_iter_parent(GTK_TREE_MODEL(ctx->ctx_tree),&parent,&(ctx->ctx_node))==TRUE) { ctx->ctx_state=ND_NODE; ctx->ctx_node = parent; } else { ctx->ctx_state=ND_ROOT; ctx->ctx_is_root=TRUE; } break; case ND_ATTR: ctx->ctx_state=ND_NODE; break; case ND_ROOT: ctx->ctx_state=ND_NONE; break; case ND_VERSION: ctx->ctx_state=ND_ROOT; break; } } static void xml_text_cb (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { xml_context_data_t *ctx = (xml_context_data_t *)user_data; int line_number; int char_number; unsigned i; a_string_t *str; g_markup_parse_context_get_position(context,&line_number,&char_number); if (ctx->ctx_state==ND_ATTR) { if (ctx->ctx_encoded || (ctx->ctx_version==0 && text_len>=2 && text[1]==':')) { if (text_len>=2 && (text[0]=='8' || text[0]=='4' || text[0]==2) && text[1]==':') { str = a_strnnew(text_len,text); dyntree_model_iter_attribute_set(ctx->ctx_tree,&(ctx->ctx_node),ctx->ctx_column,a_strval(str)); a_strfree(str); } /* FIXME: ignore other cases ? */ } else { str = a_strnew("t:"); a_strncat(str,text_len,text); dyntree_model_iter_attribute_set(ctx->ctx_tree,&(ctx->ctx_node),ctx->ctx_column,a_strval(str)); a_strfree(str); } } else if (ctx->ctx_state==ND_VERSION) { unsigned version_high = 0; unsigned version_low = 0; sscanf(text,"%u.%u",&version_high,&version_low); ctx->ctx_version = (version_high<<8)+version_low; } else { for (i=0; imessage); } static GMarkupParser dyntree_parser = { xml_start_element_cb, xml_end_element_cb, xml_text_cb, NULL, xml_error_cb }; gboolean dyntree_model_iter_from_xml(DyntreeModel *ct, GtkTreeIter *parent, gboolean full_xml, const char *source_text, int source_len) { xml_context_data_t ctx; GMarkupParseContext *markup_ctx; GError *err = NULL; /* dyntree_model_clear(ct); */ if (source_len<0) source_len = strlen(source_text); ctx.ctx_tree = ct; if (full_xml) ctx.ctx_state = ND_NONE; else ctx.ctx_state = ND_ROOT; if (parent != NULL) { ctx.ctx_is_root = FALSE; ctx.ctx_node = *parent; } else { ctx.ctx_is_root = TRUE; memset(&ctx.ctx_node,0,sizeof(ctx.ctx_node)); } markup_ctx = g_markup_parse_context_new(&dyntree_parser,0,&ctx,NULL); if (g_markup_parse_context_parse(markup_ctx,source_text,source_len,&err)==TRUE) { g_markup_parse_context_end_parse(markup_ctx,&err); } g_markup_parse_context_free(markup_ctx); if (err!=NULL) { g_error_free(err); return FALSE; } return TRUE; } gboolean dyntree_model_iter_from_xml_file(DyntreeModel *ct, GtkTreeIter *iter, const char *fname) { char *buf_val; int buf_len; int rd_len; GStatBuf st; gboolean retval; int input; if (g_stat(fname,&st)!=0) { log_printf(LOG_ERROR,"Could not stat '%s' (%s)",fname,strerror(errno)); return FALSE; } #ifdef _WIN32 if ((input=g_open(fname,O_RDONLY | O_BINARY,0))<0) #else if ((input=g_open(fname,O_RDONLY,0))<0) #endif { log_printf(LOG_ERROR,"Could not open '%s' for input (%s)",fname,strerror(errno)); return FALSE; } buf_len = st.st_size; buf_val = g_malloc(buf_len); if ((rd_len=read(input,buf_val,buf_len))==buf_len) { if (dyntree_model_iter_from_xml(ct,iter,TRUE,buf_val,buf_len)==FALSE) { retval = FALSE; /* dyntree_model_clear(ct); */ } else retval = TRUE; } else { log_printf(LOG_ERROR,"Could not read all data (%i bytes of %i) from %s (%s)", rd_len,buf_len,fname,strerror(errno)); retval = FALSE; } g_free(buf_val); close(input); return retval; } /* searching */ static gboolean internal_dyntree_model_iter_match(DyntreeModel *ctm, GtkTreeIter *iter, int *indices, char **str, int n_values) { int i; const char *candidate; if (n_values==0) return FALSE; for (i=0; iuser_data == next.user_data) return FALSE; if (dyntree_model_iter_next(GTK_TREE_MODEL(ctm),&next)==FALSE) { child = *result; do { if (dyntree_model_iter_parent(GTK_TREE_MODEL(ctm),&next,&child)==FALSE) return FALSE; if (root->user_data == next.user_data) return FALSE; child = next; } while (dyntree_model_iter_next(GTK_TREE_MODEL(ctm),&next)==FALSE); } } *result = next; if (internal_dyntree_model_iter_match(ctm,result,indices,str,n_values)) return TRUE; } return FALSE; } gboolean dyntree_model_foreach(DyntreeModel *ctm, GtkTreeIter *root, DyntreeModelFunc func, gpointer user_data) { GtkTreeIter iter; GtkTreeIter child; if (root!=NULL) iter = *root; else { if (dyntree_model_iter_children(GTK_TREE_MODEL(ctm),&iter,NULL)==FALSE) return FALSE; } if (func(ctm,&iter,user_data)==FALSE) return FALSE; if (dyntree_model_iter_children(GTK_TREE_MODEL(ctm),&child,&iter)) { do { if (dyntree_model_foreach(ctm,&child,func,user_data)==FALSE) return FALSE; } while (dyntree_model_iter_next(GTK_TREE_MODEL(ctm),&child)); } return TRUE; } cardpeek-0.8/Makefile.in0000644000175000017500000010324712213660063012133 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = cardpeek$(EXEEXT) subdir = . DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS config.guess config.sub depcomp \ install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(iconsdir)" PROGRAMS = $(bin_PROGRAMS) am_cardpeek_OBJECTS = asn1.$(OBJEXT) bytestring.$(OBJEXT) \ gui_flexi_cell_renderer.$(OBJEXT) dyntree_model.$(OBJEXT) \ crypto.$(OBJEXT) replay.$(OBJEXT) gui.$(OBJEXT) \ iso7816.$(OBJEXT) lua_nodes.$(OBJEXT) lua_asn1.$(OBJEXT) \ lua_bit.$(OBJEXT) lua_bytes.$(OBJEXT) lua_card.$(OBJEXT) \ lua_crypto.$(OBJEXT) lua_ext.$(OBJEXT) lua_log.$(OBJEXT) \ lua_ui.$(OBJEXT) main.$(OBJEXT) misc.$(OBJEXT) \ pathconfig.$(OBJEXT) smartcard.$(OBJEXT) system_info.$(OBJEXT) \ a_string.$(OBJEXT) gui_about.$(OBJEXT) gui_toolbar.$(OBJEXT) \ gui_logview.$(OBJEXT) gui_cardview.$(OBJEXT) \ gui_readerview.$(OBJEXT) gui_scratchpad.$(OBJEXT) \ gui_inprogress.$(OBJEXT) cardpeek_OBJECTS = $(am_cardpeek_OBJECTS) cardpeek_DEPENDENCIES = cardpeek_resources.$(OBJEXT) cardpeek_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(cardpeek_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(cardpeek_SOURCES) DIST_SOURCES = $(cardpeek_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) DATA = $(desktop_DATA) $(doc_DATA) $(icons_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDK_PIXBUF_PIXDATA = @GDK_PIXBUF_PIXDATA@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LIBS = @LUA_LIBS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ 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@ AUTOMAKE_OPTIONS = gnu AM_CFLAGS = -Wall -pedantic -Wno-overlength-strings @LUA_CFLAGS@ @PCSC_CFLAGS@ @GLIB_CFLAGS@ @GTK_CFLAGS@ @CURL_CFLAGS@ cardpeek_SOURCES = asn1.c asn1.h bytestring.c bytestring.h gui_flexi_cell_renderer.c gui_flexi_cell_renderer.h dyntree_model.c dyntree_model.h crypto.c crypto.h replay.c replay.h gui.c gui.h iso7816.c iso7816.h lua_nodes.c lua_nodes.h lua_asn1.c lua_asn1.h lua_bit.c lua_bit.h lua_bytes.c lua_bytes.h lua_card.c lua_card.h lua_crypto.c lua_crypto.h lua_ext.c lua_ext.h lua_log.c lua_log.h lua_ui.c lua_ui.h main.c misc.c misc.h pathconfig.c pathconfig.h smartcard.c smartcard.h system_info.c system_info.h a_string.c a_string.h gui_about.c gui_about.h gui_toolbar.c gui_toolbar.h gui_logview.c gui_logview.h gui_cardview.c gui_cardview.h gui_readerview.c gui_readerview.h gui_scratchpad.c gui_scratchpad.h gui_inprogress.c gui_inprogress.h doc_DATA = doc/cardpeek_ref.en.pdf cardpeek_LDADD = cardpeek_resources.$(OBJEXT) @LUA_LIBS@ @PCSC_LIBS@ @GLIB_LIBS@ @GTK_LIBS@ @CURL_LIBS@ cardpeek_LDFLAGS = -g #cardpeek_LDFLAGS=-O2 dist_man_MANS = cardpeek.1 DRIVERS = drivers/replay_driver.c drivers/null_driver.c drivers/pcsc_driver.c ICONS = icons/analyzer.png icons/item.png icons/record.png icons/smartcard.png icons/folder.png icons/cardpeek.png icons/application.png icons/file.png icons/block.png icons/atr.png icons/header.png icons/body.png CLEANFILES = cardpeek_resources.c dot_cardpeek.tar.gz EXTRA_DIST = cardpeek_resources.gresource.xml cardpeek_resources.gresource $(DRIVERS) $(ICONS) dot_cardpeek_dir doc/cardpeek_ref.en.pdf doc/cardpeek_ref.en.odt update_dot_cardpeek_dir.sh script_version.h cardpeek.desktop desktopdir = $(datadir)/applications desktop_DATA = cardpeek.desktop iconsdir = $(datadir)/icons/hicolor/48x48/apps icons_DATA = icons/cardpeek.png all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj am--refresh: Makefile @: $(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; else :; fi @if test ! -f $@; then $(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 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) cardpeek$(EXEEXT): $(cardpeek_OBJECTS) $(cardpeek_DEPENDENCIES) $(EXTRA_cardpeek_DEPENDENCIES) @rm -f cardpeek$(EXEEXT) $(AM_V_CCLD)$(cardpeek_LINK) $(cardpeek_OBJECTS) $(cardpeek_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/a_string.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bytestring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dyntree_model.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_about.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_cardview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_flexi_cell_renderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_inprogress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_logview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_readerview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_scratchpad.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_toolbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso7816.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_asn1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_bit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_bytes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_card.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_ext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_nodes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua_ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pathconfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/replay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smartcard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system_info.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-iconsDATA: $(icons_DATA) @$(NORMAL_INSTALL) @list='$(icons_DATA)'; test -n "$(iconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iconsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(iconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(iconsdir)" || exit $$?; \ done uninstall-iconsDATA: @$(NORMAL_UNINSTALL) @list='$(icons_DATA)'; test -n "$(iconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iconsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ 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: $(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) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi $(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 $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) config.h installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(iconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -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) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-desktopDATA install-docDATA install-iconsDATA \ install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-local pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-desktopDATA \ uninstall-docDATA uninstall-iconsDATA uninstall-man uninstall-man: uninstall-man1 .MAKE: all install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-binPROGRAMS install-data \ install-data-am install-desktopDATA install-docDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-iconsDATA install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-local pdf pdf-am ps ps-am tags \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-desktopDATA uninstall-docDATA uninstall-iconsDATA \ uninstall-man uninstall-man1 mostlyclean-local: rm -rf .cardpeek dist-hook: rm -rf `find $(distdir)/ -name .svn` dot_cardpeek.tar.gz: dot_cardpeek_dir @echo " TAR $<" $(AM_V_at)tar czf dot_cardpeek.tar.gz --directory $(srcdir)/dot_cardpeek_dir --exclude=.svn . cardpeek_resources.$(OBJEXT): dot_cardpeek.tar.gz $(ICONS) AUTHORS COPYING cardpeek_resources.gresource.xml @echo " GLIB_COMPILE_RESOURCES cardpeek_resources.gresource.xml" $(AM_V_at)$(GLIB_COMPILE_RESOURCES) --generate-source --sourcedir=. --sourcedir=$(srcdir) --target=cardpeek_resources.c $(srcdir)/cardpeek_resources.gresource.xml $(AM_V_CC)$(COMPILE) -c cardpeek_resources.c smartcard.$(OBJEXT): smartcard.c smartcard.h $(DRIVERS) $(AM_V_CC)$(COMPILE) -c $< # 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: cardpeek-0.8/cardpeek.desktop0000644000175000017500000000025312201404172013222 00000000000000[Desktop Entry] Name=Cardpeek Comment=Tool to read the contents of smart cards Exec=cardpeek Icon=cardpeek Terminal=false Type=Application Categories=GTK;System;Security; cardpeek-0.8/lua_ext.c0000644000175000017500000003236512214320473011674 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include #include #include #include #include #include #include #include #include "pathconfig.h" #include "iso7816.h" #include "misc.h" #include "lua_ext.h" /****************************************/ #include "lua_log.h" #include "lua_bytes.h" #include "lua_asn1.h" #include "lua_card.h" #include "lua_bit.h" #include "lua_crypto.h" #include "lua_ui.h" #include "lua_nodes.h" /****************************************/ /* FIXME: this whole file needs cleanup */ /****************************************/ static int print_debug_message(lua_State* L) { const char* err_msg = lua_tostring(L,1); lua_Debug ar; int depth = 1; log_printf(LOG_ERROR,"%s",err_msg); while (lua_getstack(L,depth++,&ar)) { if (lua_getinfo(L,"lnS",&ar)) { if (ar.name) { if (ar.currentline>=0) log_printf(LOG_ERROR,"backtrace: called from %s() in %s[%i]",ar.name,ar.short_src,ar.currentline); else log_printf(LOG_ERROR,"backtrace: called from %s()",ar.name); } else log_printf(LOG_ERROR,"backtrace: called at %s",ar.short_src); } else log_printf(LOG_ERROR,"backtrace: no further information available"); } return 0; } unsigned line_num = 0; char line_buf[1024]; static const char* read_chunk(lua_State* L, void* input, size_t* sz) { UNUSED(L); if (fgets(line_buf,1024,(FILE*)input)==NULL) { *sz=0; return NULL; } line_num++; *sz=strlen(line_buf); return line_buf; } static int run_file(lua_State* L, const char *filename) { FILE* input = g_fopen(filename,"r"); if (input==NULL) { log_printf(LOG_ERROR,"Could not load %s (%s)",filename,strerror(errno)); return 0; } line_num = 0; lua_pushcfunction(L,print_debug_message); if (lua_load(L,read_chunk,input,filename,NULL)!=0) { log_printf(LOG_ERROR,"Syntax error on line %i in %s",line_num,filename); return 0; } fclose(input); if (lua_pcall(L, 0, LUA_MULTRET, -2)!=0) { lua_pop(L,1); return 0; } lua_pop(L,1); return 1; } /* void run_card_shell(lua_State* L) { int error; char inputline[1024]; printf("cardpeek> "); while (fgets(inputline, sizeof(inputline), stdin) != NULL) { if (strncmp(inputline,"quit()",6)==0) break; error = luaL_loadbuffer(L, inputline, strlen(inputline), "cardpeek") || lua_pcall(L, 0, 0, 0); if (error) { fprintf(stderr, "%s\n", lua_tostring(L, -1)); lua_pop(L, 1); } printf("cardpeek> "); } fprintf(stderr,"bye.\n"); } */ /******************************************************************/ static lua_State* x_lua_begin(void) { lua_State* L = luaL_newstate(); luaL_openlibs(L); log_printf(LOG_DEBUG,"Lua is loaded."); return L; } static int x_lua_end(lua_State* L) { lua_close(L); log_printf(LOG_DEBUG,"Lua has stopped."); return 1; } /* void x_lua_shell(lua_State* L, const char* prompt) { int error; char *inputline; printf("-- Lua shell, type '!' alone to quit.\n"); while ((inputline=readline(prompt))!=NULL) { if (strncmp(inputline,"!",1)==0) break; error = luaL_loadbuffer(L, inputline, strlen(inputline), prompt) || lua_pcall(L, 0, 0, 0); if (error) { fprintf(stderr, "%s\n", lua_tostring(L, -1)); lua_pop(L, 1); } add_history(inputline); free(inputline); } fprintf(stderr,"-- bye.\n"); } */ /******************************************************************/ lua_State* LUA_STATE= NULL; void luax_run_script(const char* scriptname) { chdir(path_config_get_string(PATH_CONFIG_FOLDER_SCRIPTS)); log_printf(LOG_INFO,"Running script %s (please wait)",scriptname); run_file(LUA_STATE,scriptname); } void luax_run_command(const char* command) { int error; chdir(path_config_get_string(PATH_CONFIG_FOLDER_SCRIPTS)); log_printf(LOG_DEBUG,"Executing '%s'",command); error = luaL_loadbuffer(LUA_STATE, command, strlen(command), "command line") || lua_pcall(LUA_STATE, 0, 0, 0); if (error) { log_printf(LOG_ERROR,"%s", lua_tostring(LUA_STATE, -1)); lua_pop(LUA_STATE, 1); /* pop error message from the stack */ } } int luax_init(void) { GStatBuf st; const char *config_lua; const char *cardpeekrc_lua; LUA_STATE= x_lua_begin(); luaopen_bytes(LUA_STATE); luaopen_asn1(LUA_STATE); luaopen_bit(LUA_STATE); luaopen_card(LUA_STATE); luaopen_log(LUA_STATE); luaopen_ui(LUA_STATE); luaopen_crypto(LUA_STATE); luaopen_nodes(LUA_STATE); lua_newtable(LUA_STATE); lua_setglobal(LUA_STATE,"cardpeek"); config_lua = path_config_get_string(PATH_CONFIG_FILE_CONFIG_LUA); cardpeekrc_lua = path_config_get_string(PATH_CONFIG_FILE_CARDPEEK_RC); chdir(path_config_get_string(PATH_CONFIG_FOLDER_CARDPEEK)); if (g_stat(config_lua,&st)==0) { log_printf(LOG_DEBUG,"Loading configuration script %s",config_lua); run_file(LUA_STATE,config_lua); } if (g_stat(cardpeekrc_lua,&st)==0) { log_printf(LOG_DEBUG,"Running user configuration script %s",cardpeekrc_lua); run_file(LUA_STATE,cardpeekrc_lua); } return 0; } void luax_release(void) { x_lua_end(LUA_STATE); } char *luax_escape_string(const char *src) { char *res; const char *s; char *p; unsigned alloc_count = 1; for (s=src; *s; s++) { if (*s=='\\' || *s=='\'' || *s=='"') alloc_count+=2; else alloc_count++; } p = res = g_malloc(alloc_count); while (*src) { switch (*src) { case '\\': *p++='\\'; *p++='\\'; break; case '\'': *p++='\\'; *p++='\''; break; case '\"': *p++='\\'; *p++='\"'; break; default: *p++=*src; } src++; } *p='\0'; return res; } /*************************************/ const char *config_table_header = "-- \n" "-- This file is automatically generated by Cardpeek.\n" "-- It holds cardpeek configuration parameters, which are stored in the\n" "-- lua 'cardpeek' table.\n" "-- \n" "-- See cardpeekrc.lua for adding your own functions and variables to\n" "-- cardpeek.\n" "-- \n"; static void internal_save_table(FILE *cf, int depth) { int i; g_assert(lua_istable(LUA_STATE,-1)); lua_pushnil(LUA_STATE); while (lua_next(LUA_STATE,-2)) { if (lua_type(LUA_STATE,-2)==LUA_TSTRING || lua_type(LUA_STATE,-2)==LUA_TNUMBER) { for (i=0;i g_strdup(x)==NULL */ lua_pop(LUA_STATE,1); return retval; } gboolean luax_variable_set_strval(const char *vname, const char *value) { lua_pushstring(LUA_STATE,value); return internal_set_variable(LUA_STATE,vname); } int luax_variable_get_integer(const char *vname) { int retval; internal_get_variable(LUA_STATE,vname); retval = (int)lua_tointeger(LUA_STATE,-1); lua_pop(LUA_STATE,1); return retval; } gboolean luax_variable_set_integer(const char *vname, int value) { lua_pushinteger(LUA_STATE,value); return internal_set_variable(LUA_STATE,vname); } gboolean luax_variable_get_boolean(const char *vname) { gboolean retval; internal_get_variable(LUA_STATE,vname); retval = lua_toboolean(LUA_STATE,-1); lua_pop(LUA_STATE,1); return retval; } gboolean luax_variable_set_boolean(const char *vname, gboolean value) { lua_pushboolean(LUA_STATE,value); return internal_set_variable(LUA_STATE,vname); } gboolean luax_variable_is_defined(const char *vname) { gboolean retval; internal_get_variable(LUA_STATE,vname); retval = (lua_isnoneornil(LUA_STATE,-1)==0); lua_pop(LUA_STATE,-1); return retval; } cardpeek-0.8/crypto.h0000644000175000017500000000445412160275534011565 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef CRYPTO_H #define CRYPTO_H #include "bytestring.h" typedef enum { CRYPTO_OK, CRYPTO_ERROR_BAD_KEY_FORMAT, CRYPTO_ERROR_UNKNOWN_KEY_TYPE, CRYPTO_ERROR_BAD_CLEARTEXT_LENGTH, CRYPTO_ERROR_BAD_IV_LENGTH, CRYPTO_ERROR_UNKNOWN_PADDING_METHOD, CRYPTO_ERROR_UNKNOWN_ALGORITHM, CRYPTO_ERROR_UNKNOWN } crypto_error_t; typedef unsigned crypto_alg_t; #define CRYPTO_ALG_DES_ECB (0x0000) #define CRYPTO_ALG_DES_CBC (0x0001) #define CRYPTO_ALG_DES2_EDE_ECB (0x0010) #define CRYPTO_ALG_DES2_EDE_CBC (0x0011) #define CRYPTO_ALG_ISO9797_M3 (0x0021) #define CRYPTO_ALG_SHA1 (0x0030) #define CRYPTO_PAD_ZERO (0x0000) #define CRYPTO_PAD_OPT_80_ZERO (0x0100) #define CRYPTO_PAD_ISO9797_P2 (0x0200) crypto_error_t crypto_create_context(bytestring_t *ctx, crypto_alg_t alg_type, const bytestring_t* key_bin); crypto_error_t crypto_encrypt(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src, const bytestring_t* iv); crypto_error_t crypto_decrypt(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src, const bytestring_t* iv); crypto_error_t crypto_mac(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src); crypto_error_t crypto_digest(bytestring_t* dst, const bytestring_t* ctx, const bytestring_t* src); const char *crypto_stringify_error(crypto_error_t err); #endif cardpeek-0.8/lua_card.c0000644000175000017500000001047512201417016011777 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_card.h" #include "smartcard.h" #include "lua_bytes.h" #include #include "iso7816.h" #include "misc.h" #include "lua_ext.h" #include "gui.h" cardreader_t* READER=NULL; void luax_set_card_reader(cardreader_t* r) { READER = r; } static int subr_card_connect(lua_State* L) { if(!cardreader_connect(READER,PROTOCOL_T0 | PROTOCOL_T1)) lua_pushboolean(L,0); else lua_pushboolean(L,1); return 1; } static int subr_card_disconnect(lua_State* L) { cardreader_disconnect(READER); lua_pushboolean(L,1); return 1; } static int subr_card_warm_reset(lua_State* L) { if (cardreader_warm_reset(READER)) lua_pushboolean(L,1); else lua_pushboolean(L,0); return 1; } static int subr_card_last_atr(lua_State* L) { const bytestring_t *atr = cardreader_last_atr(READER); lua_push_bytestring(L,bytestring_duplicate(atr)); return 1; } static int subr_card_info(lua_State* L) { char **info=cardreader_get_info(READER); int index; lua_newtable(L); for (index=0;info[index]!=NULL;index+=2) { lua_pushstring(L,info[index]); lua_pushstring(L,info[index+1]); lua_settable(L,-3); g_free(info[index]); g_free(info[index+1]); } g_free(info); /* this update is needed since cardreader_get_info is silent upon success */ gui_update(0); return 1; } static int subr_card_send(lua_State* L) { bytestring_t *command = luaL_check_bytestring(L,1); bytestring_t *result = bytestring_new(8); unsigned short SW; SW=cardreader_transmit(READER,command,result); lua_pushinteger(L,SW); lua_push_bytestring(L,result); return 2; } static int subr_card_set_command_interval(lua_State* L) { unsigned interval=(unsigned)lua_tointeger(L,1); cardreader_set_command_interval(READER,interval); return 0; } static int subr_card_make_file_path(lua_State* L) { int path_type; bytestring_t *file_path = bytestring_new(8); const char *path; if (lua_isnoneornil(L,1)) path = ""; else path = lua_tostring(L,1); if (iso7816_make_file_path(file_path,&path_type,path)!=ISO7816_OK) { bytestring_free(file_path); lua_pushnil(L); lua_pushnil(L); log_printf(LOG_DEBUG,"Could not parse path %s",path); } else { lua_push_bytestring(L,file_path); lua_pushinteger(L,path_type); } return 2; } static int subr_card_log_save(lua_State* L) { const char *filename; if (lua_isnoneornil(L,1)) return luaL_error(L,"Expecting one parameter: a filename (string)"); filename= lua_tostring(L,1); if (cardreader_log_save(READER,filename)!=SMARTCARD_OK) { log_printf(LOG_ERROR,"Could not write data to '%s'",filename); lua_pushboolean(L,0); } else { log_printf(LOG_INFO,"Wrote card data to '%s'",filename); lua_pushboolean(L,1); } return 1; } static int subr_card_log_clear(lua_State* L) { UNUSED(L); cardreader_log_clear(READER); return 0; } static const struct luaL_Reg cardlib [] = { {"connect", subr_card_connect }, {"disconnect", subr_card_disconnect }, {"warm_reset", subr_card_warm_reset }, {"last_atr", subr_card_last_atr }, {"info", subr_card_info }, {"send", subr_card_send }, {"set_command_interval", subr_card_set_command_interval }, {"make_file_path", subr_card_make_file_path }, {"log_clear", subr_card_log_clear }, {"log_save", subr_card_log_save }, {NULL, NULL} /* sentinel */ }; int luaopen_card(lua_State* L) { luaL_newlib(L, cardlib); lua_pushstring(L, "CLA"); lua_pushinteger(L, 0); lua_settable(L,-3); lua_setglobal(L,"card"); return 1; } cardpeek-0.8/gui_toolbar.h0000644000175000017500000000244612160275534012552 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_TOOLBAR_H #define GUI_TOOLBAR_H #include typedef struct { const gchar *id; const gchar *icon; const gchar *text; GCallback callback; gconstpointer callback_data; const gchar *tooltip; } toolbar_item_t; #define TOOLBAR_ITEM_SEPARATOR "separator" #define TOOLBAR_ITEM_EXPANDER "expander" GtkWidget *gui_toolbar_new(toolbar_item_t *tbitems); void gui_toolbar_run_command_cb(GtkWidget *w, gconstpointer user_data); #endif cardpeek-0.8/pathconfig.h0000644000175000017500000000265412167307643012373 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef PATH_CONFIG_H #define PATH_CONFIG_H enum { PATH_CONFIG_FOLDER_WORKING, PATH_CONFIG_FILE_CARDPEEK_LOG, PATH_CONFIG_FOLDER_CARDPEEK, PATH_CONFIG_FOLDER_SCRIPTS, PATH_CONFIG_FOLDER_REPLAY, PATH_CONFIG_FOLDER_OLD_REPLAY, PATH_CONFIG_FILE_CONFIG_LUA, PATH_CONFIG_FILE_CARDPEEK_RC, PATH_CONFIG_FILE_VERSION, PATH_CONFIG_FILE_SMARTCARD_LIST_TXT, PATH_CONFIG_FILE_SMARTCARD_LIST_DOWNLOAD, NUM_PATH_CONFIG_OPTIONS }; int path_config_init(void); const char *path_config_get_string(unsigned index); int path_config_set_string(unsigned index, const char *path); void path_config_release(void); #endif cardpeek-0.8/gui_logview.h0000644000175000017500000000200412160275534012552 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_LOGVIEW_H #define GUI_LOGVIEW_H #include GtkWidget *gui_logview_create_window(void); GtkWidget *gui_logview_create_status_bar(void); void gui_logview_cleanup(void); #endif cardpeek-0.8/AUTHORS0000644000175000017500000000116012214320473011124 00000000000000Cardpeek is (c) 2009-2013 Alain Pannetrat Kind contributors: - Anthony Berkow: Calypso script for the RavKav card in Israel. - Stanislav Brabec: Intial patch for LUA 5.2 upgrade. - Ludovic Lange: Initial patch for Mac OS X version. - Adam Laurie: CVM parsing in EMV. - Kalev Lember: Bug and compatibility fixes. - Darius Matboo: Human friendly data parsing for Moneo. - Ludovic Rousseau: Lots of code cleanup, better use of autotools. - Pascal Terjan: Paris metro/RER name decoding and bug fixes. - and a few anonymous contributors... This software uses the smartcard_list.txt (c) from Ludovic Rousseau. cardpeek-0.8/replay.h0000644000175000017500000000450112160275534011532 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef REPLAY_H #define REPLAY_H #include "bytestring.h" enum { CARDREPLAY_COMMAND, CARDREPLAY_RESET }; enum { CARDREPLAY_ERROR, CARDREPLAY_OK }; typedef struct _anyreplay_t { struct _anyreplay_t *next; unsigned type; } anyreplay_t; typedef struct _comreplay_t { anyreplay_t *next; unsigned type; bytestring_t *query; unsigned sw; bytestring_t *response; } comreplay_t; typedef struct _resreplay_t { anyreplay_t *next; unsigned type; bytestring_t *atr; } resreplay_t; typedef union { anyreplay_t *any; comreplay_t *com; resreplay_t *res; } replay_t; typedef struct _cardreplay_t { int count; replay_t start; replay_t pos; replay_t atr; } cardreplay_t; int cardreplay_add_command(cardreplay_t* ce, const bytestring_t* command, unsigned sw, const bytestring_t* result); int cardreplay_add_reset(cardreplay_t* ce, const bytestring_t* atr); cardreplay_t* cardreplay_new(void); void cardreplay_free(cardreplay_t* ce); anyreplay_t* cardreplay_after_atr(cardreplay_t* ce); int cardreplay_run_command(cardreplay_t* ce, const bytestring_t* command, unsigned short *sw, bytestring_t *response); int cardreplay_run_cold_reset(cardreplay_t* ce); int cardreplay_run_warm_reset(cardreplay_t* ce); int cardreplay_run_last_atr(const cardreplay_t* ce, bytestring_t *atr); int cardreplay_save_to_file(const cardreplay_t* ce, const char *filename); cardreplay_t* cardreplay_new_from_file(const char *filename); int cardreplay_count_records(const cardreplay_t* ce); #endif cardpeek-0.8/lua_asn1.h0000644000175000017500000000161012160275534011737 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_ASN1_H #include int luaopen_asn1(lua_State* L); #endif cardpeek-0.8/misc.c0000644000175000017500000000731512167310166011170 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "misc.h" #include "pathconfig.h" #include #include #include #include #include #include #include const char ANSI_RESET[] = "\x1b[0m"; const char ANSI_RED[] = "\x1b[31m"; const char ANSI_GREEN[] = "\x1b[32m"; const char ANSI_YELLOW[] = "\x1b[33m"; const char ANSI_BLUE[] = "\x1b[34m"; const char ANSI_MAGENTA[] = "\x1b[35m"; const char ANSI_CYAN[] = "\x1b[36m"; const char ANSI_WHITE[] = "\x1b[37m"; const char *filename_extension(const char *fname) { const char* dot = strrchr(fname, '.'); if (!dot || dot==fname) return ""; return dot; } const char *filename_base(const char *fname) { const char* slash = strrchr(fname, '/'); if (!slash) slash = strrchr(fname, '\\'); if (!slash) return fname; return slash+1; } void logstring_default(int,const char *); unsigned logpos=0; logfunc_t LOGFUNCTION = logstring_default; FILE* LOGFILE=NULL; void logstring_default(int level, const char *str) { if (level==LOG_DEBUG) fprintf(stderr,"%s",str); if (level==LOG_INFO) fprintf(stderr,"%s%s",ANSI_GREEN,str); if (level==LOG_WARNING) fprintf(stderr,"%s%s",ANSI_MAGENTA,str); if (level==LOG_ERROR) fprintf(stderr,"%s%s",ANSI_RED,str); fprintf(stderr,"%s",ANSI_RESET); } int log_printf(int level, const char *format, ...) { va_list al; char *buf=NULL; unsigned len_buf; va_start(al,format); len_buf = vsnprintf(buf,0,format,al); va_end(al); buf = (char *)malloc(len_buf+24); if (level==LOG_DEBUG) sprintf(buf,"%04i DEBUG ",logpos++); else if (level==LOG_INFO) sprintf(buf,"%04i INFO ",logpos++); else if (level==LOG_WARNING) sprintf(buf,"%04i WARNING ",logpos++); else if (level==LOG_ERROR) sprintf(buf,"%04i ERROR ",logpos++); va_start(al,format); vsprintf(buf+strlen(buf),format,al); va_end(al); strcat(buf,"\n"); if (LOGFUNCTION) LOGFUNCTION(level,buf); if (LOGFILE) fprintf(LOGFILE,"%s",buf); free(buf); return len_buf; } void log_set_function(logfunc_t logfunc) { LOGFUNCTION=logfunc; } void log_open_file(void) { time_t now = time(NULL); LOGFILE = g_fopen(path_config_get_string(PATH_CONFIG_FILE_CARDPEEK_LOG),"w+"); if (LOGFILE) fprintf(LOGFILE,"cardpeek log start: %s",ctime(&now)); else fprintf(stderr,"Could not open %s for output. Proceeding without a log file.\n",path_config_get_string(PATH_CONFIG_FILE_CARDPEEK_LOG)); } void log_close_file(void) { time_t now = time(NULL); if (LOGFILE) { fprintf(LOGFILE,"cardpeek log ends: %s",ctime(&now)); fclose(LOGFILE); } LOGFILE = NULL; } /*********************************************************/ guint cstring_hash(gconstpointer str) { const unsigned char *s = str; guint res=0; while (*s) { res = (res*27)+(*s); s++; } return res; } gint cstring_equal(gconstpointer a, gconstpointer b) { return (strcmp(a,b)==0); } cardpeek-0.8/iso7816.c0000644000175000017500000002306512160275537011362 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "iso7816.h" #include int iso7816_describe_apdu(apdu_descriptor_t *ad, const bytestring_t* apdu) { unsigned apdu_len = bytestring_get_size(apdu); unsigned char c; memset(ad,0,sizeof(*ad)); if (apdu_len<4) return ISO7816_ERROR; if (apdu_len==4) /* CASE 1 */ { ad->apdu_class = APDU_CLASS_1; return ISO7816_OK; } bytestring_get_element(&c,apdu,4); if (apdu_len==5) /* CASE 2S */ { ad->apdu_class = APDU_CLASS_2S; ad->le_len = 1; ad->le = c; return ISO7816_OK; } if (c>0) /* apdu_len>5 */ { ad->lc_len= 1; ad->lc = c; if ((5+ad->lc)==apdu_len) /* CASE 3S */ { ad->apdu_class = APDU_CLASS_3S; return ISO7816_OK; } bytestring_get_element(&c,apdu,ad->lc+5); if ((ad->lc+6)==apdu_len) /* CASE 4S */ { ad->apdu_class = APDU_CLASS_4S; ad->le_len = 1; ad->le = c; return ISO7816_OK; } } else /* c==0 */ { if (apdu_len<7) return ISO7816_ERROR; if (apdu_len==7) /* CASE 2E */ { ad->apdu_class = APDU_CLASS_2E; ad->le_len=3; bytestring_get_element(&c,apdu,5); ad->le = c; bytestring_get_element(&c,apdu,6); ad->le = ((ad->le)<<8)|c; return ISO7816_OK; } ad->lc_len=3; bytestring_get_element(&c,apdu,5); ad->lc = c; bytestring_get_element(&c,apdu,6); ad->lc = ((ad->lc)<<8)|c; if (apdu_len==ad->lc+7) /* case 3E */ { ad->apdu_class = APDU_CLASS_3E; return ISO7816_OK; } if (apdu_len==ad->lc+10) /* case 4E */ { bytestring_get_element(&c,apdu,ad->lc+7); if (c!=0) return ISO7816_ERROR; ad->apdu_class = APDU_CLASS_4E; ad->le_len = 3; bytestring_get_element(&c,apdu,ad->lc+8); ad->le = c; bytestring_get_element(&c,apdu,ad->lc+9); ad->le = ((ad->le)<<8)|c; return ISO7816_OK; } } return ISO7816_ERROR; } #define is_hex(c) (((c)>='0' && (c)<='9') || \ ((c)>='A' && (c)<='F') || \ ((c)>='a' && (c)<='f')) static int is_hex4(const char* s) { if (strlen(s)<4) return 0; return (is_hex(s[0]) && is_hex(s[1]) && is_hex(s[2]) && is_hex(s[3])); } int iso7816_make_file_path(bytestring_t* file_path, int *path_type, const char* path) { unsigned path_len = strlen(path); *path_type=-1; bytestring_clear(file_path); if (path[0]=='.') { if (path[1]=='.' && path_len==2) { *path_type=3; return ISO7816_OK; } else if (path[1]=='/') { *path_type=9; /* 9 => SELECT FROM CURRENT DF */ bytestring_assign_digit_string(file_path,path+2); return ISO7816_OK; } else if (is_hex4(path+1)) { if (path[5]=='/' && path_len==6) { *path_type=1; bytestring_assign_digit_string(file_path,path+1); return ISO7816_OK; } else if (path_len==5) { *path_type=2; bytestring_assign_digit_string(file_path,path+1); return ISO7816_OK; } } } else if (path[0]=='#') { if (path_len==5) { *path_type=0; bytestring_assign_digit_string(file_path,path+1); return ISO7816_OK; } else if (path_len==1) { *path_type=0; return ISO7816_OK; } else { *path_type=4; bytestring_assign_digit_string(file_path,path+1); return ISO7816_OK; } } else if (path[0]=='/' && is_hex4(path+1)) { *path_type=8; /* 8 => SELECT FROM MF */ bytestring_assign_digit_string(file_path,path+1); return ISO7816_OK; } return ISO7816_ERROR; } const char* iso7816_stringify_sw(unsigned short sw) { static char msg[200]; msg[0]=0; if (sw==0x9000) return strcpy(msg,"Normal processing"); switch (sw>>8) { case 0x61: strcpy(msg,"More bytes available (see SW2)"); break; case 0x62: strcpy(msg,"State of non-volatile memory unchanged - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; case 0x81: strcat(msg,"Part of returned data may be corrupted"); break; case 0x82: strcat(msg,"End of file/record reached before reading Le bytes"); break; case 0x83: strcat(msg,"Selected file invalidated"); break; case 0x84: strcat(msg,"FCI not formatted correctly"); break; } break; case 0x63: strcpy(msg,"State of non-volatile memory changed - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; case 0x81: strcat(msg,"File filled up by the last write"); break; } if ((sw&0xF0)==0xC0) strcat(msg,"Counter value"); break; case 0x64: strcpy(msg,"State of non-volatile memory unchanged - "); if ((sw&0xFF)==0) strcat(msg,"OK"); break; case 0x65: strcpy(msg,"State of non-volatile memory changed - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; case 0x81: strcat(msg,"Memory failure"); break; } break; case 0x66: strcpy(msg,"security-related issue - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; } break; case 0x67: if (sw==0x6700) strcpy(msg,"Wrong length"); else strcpy(msg,"Unknown 67XX error code"); break; case 0x68: strcpy(msg,"Functions in CLA not supported - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; case 0x81: strcat(msg,"Logical channel not supported"); break; case 0x82: strcat(msg,"Secure messaging not supported"); break; } break; case 0x69: strcpy(msg,"Command not allowed - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; case 0x81: strcat(msg,"Command incompatible with file structure"); break; case 0x82: strcat(msg,"Security status not satisfied"); break; case 0x83: strcat(msg,"Authentication method blocked"); break; case 0x84: strcat(msg,"Referenced data invalidated"); break; case 0x85: strcat(msg,"Conditions of use not satisfied"); break; case 0x86: strcat(msg,"Command not allowed (no current EF)"); break; case 0x87: strcat(msg,"Expected SM data objects missing"); break; case 0x88: strcat(msg,"SM data objects incorrect"); break; } break; case 0x6A: strcpy(msg,"Wrong parameter(s) P1-P2 - "); switch (sw&0xFF) { case 0x00: strcat(msg,"No information given"); break; case 0x80: strcat(msg,"Incorrect parameters in the data field"); break; case 0x81: strcat(msg,"Function not supported"); break; case 0x82: strcat(msg,"File not found"); break; case 0x83: strcat(msg,"Record not found"); break; case 0x84: strcat(msg,"Not enough memory space in the file"); break; case 0x85: strcat(msg,"Lc inconsistent with TLV structure"); break; case 0x86: strcat(msg,"Incorrect parameters P1-P2"); break; case 0x87: strcat(msg,"Lc inconsistent with P1-P2"); break; case 0x88: strcat(msg,"Referenced data not found"); break; } break; case 0x6B: if (sw==0x6B00) strcpy(msg,"Wrong parameter(s) P1-P2"); else strcpy(msg,"Unknown 6BXX error code"); break; case 0x6C: strcpy(msg,"Wrong length Le, see SW2"); break; case 0x6D: if (sw==0x6D00) strcpy(msg,"Instruction code not supported or invalid"); else strcpy(msg,"Unknown 6DXX error code"); break; case 0x6E: if (sw==0x6E00) strcpy(msg,"Class not supported"); else strcpy(msg,"Unknown 6EXX error code"); break; case 0x6F: if (sw==0x6FFF) strcpy(msg,"Cardpeek application-level error"); else strcpy(msg,"No precise diagnosis"); break; case 0x92: strcpy(msg,"GSM - Update successful after n reties (see SW2)"); break; case 0x94: switch (sw&0xFF) { case 0x00: strcpy(msg,"GSM - No EF selected"); break; case 0x02: strcpy(msg,"GSM - Out of range (invalid address)"); break; case 0x04: strcpy(msg,"GSM - File ID or pattern not found"); break; case 0x08: strcpy(msg,"GSM - File inconsistent with the command"); break; } break; case 0x98: switch (sw&0xFF) { case 0x02: strcpy(msg,"GSM - No CHV initilaized"); break; case 0x04: strcpy(msg,"GSM - Authentication failed"); break; case 0x08: strcpy(msg,"GSM - In contradiction with CHV status"); break; case 0x10: strcpy(msg,"GSM - In contradiction invalidation status"); break; case 0x40: strcpy(msg,"GSM - Authentication failed, no attempts left"); break; case 0x50: strcpy(msg,"GSM - Increase failed, max. vaule reached"); break; } break; case 0x9F: strcpy(msg,"GSM - Length of response in SW2"); break; default: strcpy(msg,"** Unkown error code **"); } return msg; } const char *APDU_CLASS_NAMES[]={"None","1","2S","3S","4S","2E","3E","4E"}; const char *iso7816_stringify_apdu_class(unsigned apdu_class) { if (apdu_class>7) apdu_class=0; return APDU_CLASS_NAMES[apdu_class]; } cardpeek-0.8/a_string.h0000644000175000017500000000323212160275534012044 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef A_STRING_H #define A_STRING_H typedef struct { unsigned _alloc; unsigned _size; char* _data; } a_string_t; a_string_t* a_strnnew(unsigned n, const char* str); a_string_t* a_strnew(const char* str); void a_strfree(a_string_t* cs); char* a_strfinalize(a_string_t* cs); const char* a_strncpy(a_string_t* cs, unsigned n, const char* str); const char* a_strcpy(a_string_t* cs, const char* str); const char* a_strncat(a_string_t* cs, unsigned n, const char* str); const char* a_strcat(a_string_t* cs, const char* str); const char* a_strpushback(a_string_t* cs, char c); const char* a_strval(const a_string_t* cs); unsigned a_strlen(const a_string_t* cs); int a_sprintf(a_string_t* cs, const char *format, ...); int a_strnequal(const a_string_t* cs, unsigned n, const char *value); int a_strequal(const a_string_t* cs, const char *value); #endif cardpeek-0.8/lua_bit.c0000644000175000017500000000431612201416076011646 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_bit.h" /*********************************************************** * GENERAL FUNCTIONS * - Binary integer ops that LUA lacks */ static int subr_bit_and(lua_State* L) { unsigned a = (unsigned)lua_tointeger(L,1); unsigned b = (unsigned)lua_tointeger(L,2); lua_pushinteger(L,(int)(a&b)); return 1; } static int subr_bit_or(lua_State* L) { unsigned a = (unsigned)lua_tointeger(L,1); unsigned b = (unsigned)lua_tointeger(L,2); lua_pushinteger(L,(int)(a|b)); return 1; } static int subr_bit_xor(lua_State* L) { unsigned a = (unsigned)lua_tointeger(L,1); unsigned b = (unsigned)lua_tointeger(L,2); lua_pushinteger(L,(int)(a^b)); return 1; } static int subr_bit_shl(lua_State* L) { unsigned a = (unsigned)lua_tointeger(L,1); unsigned b = (unsigned)lua_tointeger(L,2); lua_pushinteger(L,(int)((a<>b)); return 1; } static const struct luaL_Reg bitlib [] = { { "AND", subr_bit_and }, { "OR", subr_bit_or }, { "XOR", subr_bit_xor }, { "SHL", subr_bit_shl }, { "SHR", subr_bit_shr }, { NULL, NULL } /* sentinel */ }; int luaopen_bit(lua_State* L) { luaL_newlib(L,bitlib); lua_setglobal(L,"bit"); /* luaL_openlib(L, "bit", bitlib, 0);*/ return 1; } cardpeek-0.8/lua_crypto.h0000644000175000017500000000161412160275534012421 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_CRYPTO_H #include int luaopen_crypto(lua_State* L); #endif cardpeek-0.8/misc.h0000644000175000017500000000416412160275534011176 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef MISC_H #define MISC_H #include #ifdef _WIN32 #include "win32/config.h" #else #include "config.h" #endif #ifndef HAVE_GSTATBUF #include typedef struct stat GStatBuf; #endif #ifdef __APPLE__ #define DIRENT_T struct dirent #else #define DIRENT_T const struct dirent #endif #define is_hex(a) ((a>='0' && a<='9') || \ (a>='A' && a<='F') || \ (a>='a' && a<='f')) #define is_blank(a) (a==' ' || a=='\t' || a=='\r' || a=='\n') const char *filename_extension(const char *fname); const char *filename_base(const char *fname); typedef void (*logfunc_t)(int,const char*); int log_printf(int level, const char *format, ...); void log_set_function(logfunc_t logfunc); void log_open_file(void); void log_close_file(void); enum { LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR }; extern const char ANSI_RESET[]; extern const char ANSI_RED[]; extern const char ANSI_GREEN[]; extern const char ANSI_YELLOW[]; extern const char ANSI_BLUE[]; extern const char ANSI_MAGENTA[]; extern const char ANSI_CYAN[]; extern const char ANSI_WHITE[]; guint cstring_hash(gconstpointer data); gint cstring_equal(gconstpointer a, gconstpointer b); #include #define HERE() { fprintf(stderr,"%s[%i]\n",__FILE__,__LINE__); fflush(stderr); } #define UNUSED(x) (void)x #endif cardpeek-0.8/gui_flexi_cell_renderer.c0000644000175000017500000006021412214320473015065 00000000000000#include "gui_flexi_cell_renderer.h" #include "bytestring.h" #include #include "misc.h" /* This is based mainly on GtkCellRendererFlexi * in GAIM, written and (c) 2002 by Sean Egan * (Licensed under the GPL), which in turn is * based on Gtk's GtkCellRenderer[Text|Toggle|Pixbuf] * implementation by Jonathan Blandford */ /* This is taken mainly from the GtkTreeView Tutorial */ /* IT IS NOT USED IN CARDPEEK AT THIS STAGE */ static void custom_cell_renderer_flexi_init (CustomCellRendererFlexi *cellflexi); static void custom_cell_renderer_flexi_class_init (CustomCellRendererFlexiClass *klass); static void custom_cell_renderer_flexi_get_property (GObject *object, guint param_id, GValue *value, GParamSpec *pspec); static void custom_cell_renderer_flexi_set_property (GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); static void custom_cell_renderer_flexi_finalize (GObject *gobject); /* These functions are the heart of our custom cell renderer: */ static void custom_cell_renderer_flexi_get_size (GtkCellRenderer *cell, GtkWidget *widget, const GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height); static void custom_cell_renderer_flexi_render (GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags); enum { PROP_RAW_VALUE = 1, PROP_MIME_TYPE, PROP_ALT_TEXT }; enum { RENDER_NONE, RENDER_TEXT, RENDER_PIXBUF }; static gpointer parent_class; /*************************************************************************** * * custom_cell_renderer_flexi_get_type: here we register our type with * the GObject type system if we * haven't done so yet. Everything * else is done in the callbacks. * ***************************************************************************/ GType custom_cell_renderer_flexi_get_type (void) { static GType cell_flexi_type = 0; if (cell_flexi_type == 0) { static const GTypeInfo cell_flexi_info = { sizeof (CustomCellRendererFlexiClass), /* class size */ NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) custom_cell_renderer_flexi_class_init, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CustomCellRendererFlexi), /* instance size */ 0, /* n_preallocs */ (GInstanceInitFunc) custom_cell_renderer_flexi_init, /* instance init */ NULL, }; /* Derive from GtkCellRenderer */ cell_flexi_type = g_type_register_static (GTK_TYPE_CELL_RENDERER, "CustomCellRendererFlexi", &cell_flexi_info, 0); } return cell_flexi_type; } /*************************************************************************** * * custom_cell_renderer_flexi_init: set some default properties of the * parent (GtkCellRenderer). * ***************************************************************************/ static void custom_cell_renderer_flexi_init (CustomCellRendererFlexi *cellrendererflexi) { /* default: GTK_CELL_RENDERER(cellrendererflexi)->mode = GTK_CELL_RENDERER_MODE_INERT; */ gtk_cell_renderer_set_padding(GTK_CELL_RENDERER(cellrendererflexi), 2, 2); cellrendererflexi->raw_value = a_strnew(NULL); cellrendererflexi->alt_text = a_strnew(NULL); cellrendererflexi->mime_type = a_strnew(NULL); cellrendererflexi->rendered_type = RENDER_NONE; cellrendererflexi->rendered_value = NULL; cellrendererflexi->default_width = -1; } /*************************************************************************** * * custom_cell_renderer_flexi_class_init: * * set up our own get_property and set_property functions, and * override the parent's functions that we need to implement. * And make our new "percentage" property known to the type system. * If you want cells that can be activated on their own (ie. not * just the whole row selected) or cells that are editable, you * will need to override 'activate' and 'start_editing' as well. * ***************************************************************************/ static void custom_cell_renderer_flexi_class_init (CustomCellRendererFlexiClass *klass) { GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(klass); GObjectClass *object_class = G_OBJECT_CLASS(klass); parent_class = g_type_class_peek_parent (klass); object_class->finalize = custom_cell_renderer_flexi_finalize; /* Hook up functions to set and get our * custom cell renderer properties */ object_class->get_property = custom_cell_renderer_flexi_get_property; object_class->set_property = custom_cell_renderer_flexi_set_property; /* Override the two crucial functions that are the heart * of a cell renderer in the parent class */ cell_class->get_size = custom_cell_renderer_flexi_get_size; cell_class->render = custom_cell_renderer_flexi_render; /* Install our very own properties */ g_object_class_install_property (object_class, PROP_RAW_VALUE, g_param_spec_string ("raw-value", "RawValue", "The main source of data to display", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_MIME_TYPE, g_param_spec_string ("mime-type", "MimeType", "The format of data to display", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_ALT_TEXT, g_param_spec_string ("alt-text", "AltText", "The alternative text to display if available", NULL, G_PARAM_READWRITE)); } /*************************************************************************** * * custom_cell_renderer_flexi_finalize: free any resources here * ***************************************************************************/ static void internal_clear_rendered(CustomCellRendererFlexi *cr) { switch (cr->rendered_type) { case RENDER_TEXT: a_strfree((a_string_t*)cr->rendered_value); break; case RENDER_PIXBUF: g_object_unref(cr->rendered_value); break; } cr->rendered_type = RENDER_NONE; cr->rendered_value = NULL; } static void custom_cell_renderer_flexi_finalize (GObject *object) { CustomCellRendererFlexi *crflexi = CUSTOM_CELL_RENDERER_FLEXI(object); a_strfree(crflexi->raw_value); a_strfree(crflexi->mime_type); a_strfree(crflexi->alt_text); internal_clear_rendered(crflexi); (* G_OBJECT_CLASS (parent_class)->finalize) (object); } /*************************************************************************** * * custom_cell_renderer_flexi_get_property: as it says * ***************************************************************************/ static void custom_cell_renderer_flexi_get_property (GObject *object, guint param_id, GValue *value, GParamSpec *psec) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI(object); switch (param_id) { case PROP_RAW_VALUE: g_value_set_string(value, a_strval(cellflexi->raw_value)); break; case PROP_ALT_TEXT: g_value_set_string(value, a_strval(cellflexi->alt_text)); break; case PROP_MIME_TYPE: g_value_set_string(value, a_strval(cellflexi->mime_type)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, psec); break; } } /*************************************************************************** * * custom_cell_renderer_flexi_set_property: as it says * ***************************************************************************/ static void custom_cell_renderer_flexi_set_property (GObject *object, guint param_id, const GValue *value, GParamSpec *pspec) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (object); switch (param_id) { case PROP_RAW_VALUE: if (value) a_strcpy(cellflexi->raw_value, g_value_get_string(value)); else a_strcpy(cellflexi->raw_value,""); break; case PROP_ALT_TEXT: if (value) a_strcpy(cellflexi->alt_text, g_value_get_string(value)); else a_strcpy(cellflexi->alt_text,""); break; case PROP_MIME_TYPE: if (value) a_strcpy(cellflexi->mime_type, g_value_get_string(value)); else a_strcpy(cellflexi->mime_type,""); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); break; } internal_clear_rendered(cellflexi); } /*************************************************************************** * * custom_cell_renderer_flexi_new: return a new cell renderer instance * ***************************************************************************/ GtkCellRenderer *custom_cell_renderer_flexi_new (gboolean is_raw) { CustomCellRendererFlexi *cellflexi = g_object_new(CUSTOM_TYPE_CELL_RENDERER_FLEXI, NULL); cellflexi -> is_raw = is_raw; /* if (!is_raw) { GSList *formats = gdk_pixbuf_get_formats(); GSList* item; char **mime_types; int i; if (formats) { for (item=formats;item!=NULL;item=g_slist_next(item)) { mime_types = gdk_pixbuf_format_get_mime_types(item->data); for (i=0;mime_types[i]!=NULL;i++) g_printf("Format(%s): %s\n", gdk_pixbuf_format_get_name(item->data), mime_types[i]); g_strfreev(mime_types); } g_slist_free(formats); } } */ return GTK_CELL_RENDERER(cellflexi); } /*************************************************************************** * * RENDERING * */ static gboolean internal_render_error(CustomCellRendererFlexi *cr, const char *msg) { cr->rendered_type = RENDER_TEXT; cr->rendered_value = a_strnew("Error: "); a_strcat(cr->rendered_value,msg); a_strcat(cr->rendered_value,""); if (a_strlen(cr->mime_type)>2) log_printf(LOG_WARNING,"Rendering error for '%s' mime-type: %s",a_strval(cr->mime_type)+2,msg); else log_printf(LOG_WARNING,"Rendering error: %s",msg); return FALSE; } static void internal_format_raw(a_string_t *dst, int len_src, const char *src, int limit) { char tmp[40]; a_strcpy(dst,""); if (len_src>=2) { a_strcat(dst,""); a_strncat(dst,limit,src+2); a_strcat(dst,""); if (limith"); break; case '4': a_strcat(dst,"q"); break; case '1': a_strcat(dst,"b"); break; default: a_strcat(dst,"?"); } } else { a_strcat(dst,"-"); } } } static void internal_format_alt(a_string_t *dst, int len_src, const char *src) { int i; a_strcpy(dst,""); if (len_src>=2) { a_strcat(dst,"> "); for (i=2; i') a_strcat(dst,">"); else if (src[i]=='&') a_strcat(dst,"&"); else a_strpushback(dst,src[i]); } a_strcat(dst,""); } } static gboolean internal_format(CustomCellRendererFlexi *cr, const a_string_t *a_src, int limit) { int len_src = a_strlen(a_src); const char *src = a_strval(a_src); cr->rendered_type = RENDER_TEXT; cr->rendered_value = a_strnew(NULL); if (src==NULL || len_src<2) return FALSE; switch (src[0]) { case '8': case '4': case '1': internal_format_raw(cr->rendered_value,len_src,src,limit); break; case 't': internal_format_alt(cr->rendered_value,len_src,src); break; default: return internal_render_error(cr,"Internal format error."); } return TRUE; } static gboolean internal_load_image(CustomCellRendererFlexi *cr, const char *src) { GdkPixbufLoader *loader; bytestring_t *bs = bytestring_new_from_string(src); GError *err = NULL; if (bs==NULL) { internal_render_error(cr,"No image data."); return FALSE; } if (bs->width!=8) { internal_render_error(cr,"Image data must be octets."); bytestring_free(bs); return FALSE; } loader = gdk_pixbuf_loader_new(); if (gdk_pixbuf_loader_write(loader,bs->data,bs->len,&err)==FALSE) { if (err!=NULL) { internal_render_error(cr,err->message); g_error_free(err); bytestring_free(bs); return FALSE; } } if (gdk_pixbuf_loader_close(loader,&err)==FALSE) { if (err!=NULL) { internal_render_error(cr,err->message); g_error_free(err); bytestring_free(bs); return FALSE; } } cr->rendered_type = RENDER_PIXBUF; cr->rendered_value = (GdkPixbuf*) gdk_pixbuf_loader_get_pixbuf(loader); g_object_ref(cr->rendered_value); g_object_unref(loader); bytestring_free(bs); return TRUE; } static int internal_prepare_rendering(CustomCellRendererFlexi *cr) { if (cr->rendered_type!=RENDER_NONE) return cr->rendered_type; if (cr->is_raw) { internal_format(cr, cr->raw_value, 65536); } else { if (a_strlen(cr->mime_type)>2) { if (strstr(a_strval(cr->mime_type)+2,"image/")!=NULL) { internal_load_image(cr,a_strval(cr->raw_value)); } else { internal_render_error(cr,"Unrecognized mime-type"); } } else { if (a_strlen(cr->alt_text)>0) { internal_format(cr, cr->alt_text,65536); } else if (a_strlen(cr->raw_value)>0) { internal_format(cr, cr->raw_value,256); } } } return cr->rendered_type; } /*************************************************************************** * * custom_cell_renderer_flexi_get_size: crucial - calculate the size * of our cell, taking into account * padding and alignment properties * of parent. * ***************************************************************************/ static PangoLayout* internal_text_create_layout(GtkWidget *widget, CustomCellRendererFlexi *cellflexi) { PangoContext* p_context = gtk_widget_get_pango_context(widget); PangoFontDescription* font_desc = NULL; PangoLayout* layout = NULL; PangoRectangle rect; if (cellflexi->default_width < 0) { layout = gtk_widget_create_pango_layout(widget,"0123456789ABCDEF"); font_desc = pango_font_description_from_string("Monospace"); if (font_desc) pango_layout_set_font_description(layout, font_desc); pango_layout_get_pixel_extents(layout,NULL,&rect); cellflexi->default_width = rect.width*4; /* catch-all, if any conditions fails */ if (cellflexi->default_width <= 0) { cellflexi->default_width = 400; } if (font_desc) pango_font_description_free(font_desc); g_object_unref(layout); } layout = pango_layout_new(p_context); pango_layout_set_width(layout,cellflexi->default_width*PANGO_SCALE); pango_layout_set_wrap(layout,PANGO_WRAP_WORD_CHAR); pango_layout_set_markup(layout,a_strval((a_string_t*)cellflexi->rendered_value),-1); return layout; } static void internal_text_get_size_layout(GtkCellRenderer *cell, GtkWidget *widget, PangoLayout *layout, const GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (cell); PangoRectangle rect; gint calc_width; gint calc_height; gint xpad; gint ypad; gfloat yalign; if (layout==NULL) layout = internal_text_create_layout(widget,cellflexi); else g_object_ref(layout); g_assert(layout!=NULL); pango_layout_get_pixel_extents(layout,NULL,&rect); gtk_cell_renderer_get_padding(cell,&xpad,&ypad); calc_width = xpad * 2 + rect.width; calc_height = ypad * 2 + rect.height; if (width) { *width = calc_width; } if (height) { *height = calc_height; } if (cell_area) { if (x_offset) { *x_offset = 0; } if (y_offset) { gtk_cell_renderer_get_alignment(cell,NULL,&yalign); *y_offset = yalign * (cell_area->height - calc_height); *y_offset = MAX (*y_offset, 0); } } g_object_unref(layout); } static void internal_image_get_size(GtkCellRenderer *cell, GtkWidget *widget, const GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (cell); int image_width = gdk_pixbuf_get_width((GdkPixbuf*)cellflexi->rendered_value); int image_height = gdk_pixbuf_get_height((GdkPixbuf*)cellflexi->rendered_value); gint calc_width; gint calc_height; gint xpad; gint ypad; UNUSED(widget); UNUSED(cell_area); gtk_cell_renderer_get_padding(cell,&xpad,&ypad); calc_width = xpad * 2 + image_width; calc_height = ypad * 2 + image_height; if (width) *width = calc_width; if (height) *height = calc_height; if (x_offset) { *x_offset = 0; } if (y_offset) { *y_offset = 0; } } static void custom_cell_renderer_flexi_get_size (GtkCellRenderer *cell, GtkWidget *widget, const GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (cell); int engine = internal_prepare_rendering(cellflexi); if (x_offset) *x_offset = 0; if (y_offset) *y_offset = 0; if (width) *width = 0; if (height) *height = 0; switch (engine) { case RENDER_TEXT: internal_text_get_size_layout(cell,widget,NULL,cell_area,x_offset,y_offset,width,height); break; case RENDER_PIXBUF: internal_image_get_size(cell,widget,cell_area,x_offset,y_offset,width,height); break; } } /*************************************************************************** * * custom_cell_renderer_flexi_render: crucial - do the rendering. * ***************************************************************************/ static void internal_text_render(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, guint flags) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (cell); PangoLayout *layout; /* GtkStateType state; */ gint width, height; gint x_offset, y_offset; gint xpad; gint ypad; UNUSED(background_area); UNUSED(flags); layout = internal_text_create_layout(widget,cellflexi); g_assert(layout!=NULL); internal_text_get_size_layout (cell, widget, layout, cell_area, &x_offset, &y_offset, &width, &height); /* if (gtk_widget_has_focus(widget)) state = GTK_STATE_ACTIVE; else state = GTK_STATE_NORMAL; */ gtk_cell_renderer_get_padding(cell,&xpad,&ypad); width -= xpad*2; height -= ypad*2; gtk_render_layout(gtk_widget_get_style_context(widget), cr, cell_area->x + x_offset + xpad, cell_area->y + y_offset + ypad, layout); g_object_unref(layout); } static void internal_image_render(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, guint flags) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (cell); UNUSED(widget); UNUSED(background_area); UNUSED(flags); gdk_cairo_set_source_pixbuf(cr, (GdkPixbuf *)cellflexi->rendered_value,cell_area->x,cell_area->y); cairo_paint(cr); cairo_fill(cr); } static void custom_cell_renderer_flexi_render (GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) { CustomCellRendererFlexi *cellflexi = CUSTOM_CELL_RENDERER_FLEXI (cell); int engine = internal_prepare_rendering(cellflexi); switch (engine) { case RENDER_TEXT: internal_text_render(cell, cr, widget, background_area, cell_area, flags); break; case RENDER_PIXBUF: internal_image_render(cell, cr, widget, background_area, cell_area, flags); } } cardpeek-0.8/gui_about.h0000644000175000017500000000160212160275534012213 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_ABOUT_H #define GUI_ABOUT_H void gui_about(void); #endif cardpeek-0.8/configure.ac0000644000175000017500000000642512213660045012354 00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.67]) AC_INIT([cardpeek],[0.8],[L1L1@gmx.com]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) # silent build by default m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) # Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET AC_CANONICAL_HOST # Our own checks PKG_CHECK_MODULES([GLIB],[glib-2.0 >= 2.32.0]) PKG_CHECK_MODULES([GTK],[gtk+-3.0 >= 3.4.2]) case "${host}" in *-*-darwin*) PCSC_CFLAGS='-Wno-deprecated-declarations -I/System/Library/Frameworks/PCSC.framework/Headers' PCSC_LIBS='-framework PCSC' ;; *) PKG_CHECK_MODULES([PCSC],[libpcsclite]) ;; esac PKG_CHECK_MODULES([LUA],[lua-5.2],,[ PKG_CHECK_MODULES([LUA],[lua5.2],,[ PKG_CHECK_MODULES([LUA],[lua >= 5.2],,[ for lua_lib_name in lua.5.2 lua-5.2 lua5.2; do AC_CHECK_LIB([$lua_lib_name], [lua_close], [have_liblua=yes], [have_liblua=no]) if test $have_liblua = yes; then AC_SUBST([LUA_CFLAGS], [""]) AC_SUBST([LUA_LIBS], ["-l$lua_lib_name"]) break fi done if test $have_liblua = no; then AC_MSG_ERROR([Could not find lua 5.2-dev. This program requires the lua 5.2 development library. Please install the lua 5.2 library first.]) fi ]) ]) ]) PKG_CHECK_MODULES([CURL],[libcurl]) AC_CHECK_LIB([ssl],[SSL_free],, AC_MSG_ERROR([Could not find openssl-dev. This program requires the openssl dev. library. Please install it first.])) AC_CHECK_LIB([crypto],[CRYPTO_free],, AC_MSG_ERROR([Could not find openssl-dev. This program requires the openssl dev. library. Please install it first.])) AC_PATH_PROG(GLIB_COMPILE_RESOURCES,[glib-compile-resources],no) if test x$GLIB_COMPILE_RESOURCES = xno ; then AC_MSG_ERROR([glib-compile-resources cannot be found in PATH. It is usually included with GTK+2.0 dev. libraries. Please install this tool first. ]) fi AC_SUBST(GLIB_COMPILE_RESOURCES) AC_PATH_PROG(GDK_PIXBUF_PIXDATA,[gdk-pixbuf-pixdata],no) if test x$GDK_PIXBUF_PIXDATA = xno ; then AC_MSG_ERROR([gdk-pixbuf-pixdata cannot be found in PATH. It is usually included with GTK+2.0 dev. libraries and is needed by glib-compile-resources. Please install this tool first. ]) fi # Checks for libraries. # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h string.h sys/time.h termios.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T AC_HEADER_TIME CFLAGS="$GLIB_CFLAGS $CFLAGS" AC_CHECK_TYPES([GStatBuf],[],[],[#include ]) # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_MEMCMP AC_FUNC_REALLOC AC_FUNC_SELECT_ARGTYPES AC_FUNC_STAT AC_FUNC_VPRINTF AC_CHECK_FUNCS([bzero getcwd memmove memset select strcasecmp strdup strerror strncasecmp strrchr strtol]) #AC_PATH_PROG(PDFLATEX,[pdflatex],no) #if test x$PDFLATEX = xno ; then #AC_MSG_WARN([The pdflatex program could not be found. # This is only a problem if you wish to rebuild the pdf documentation # from the LaTeX source in the doc/ sub-directory. # Otherwise this warning can be safely ignored.]) #fi AC_CONFIG_FILES([Makefile]) AC_OUTPUT cardpeek-0.8/cardpeek_resources.gresource0000644000175000017500000000172212127060574015656 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smartcard reader utility. * * Copyright 2009i-2013 by 'L1L1' * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef __RESOURCE_cardpeek_resources_H__ #define __RESOURCE_cardpeek_resources_H__ #include extern GResource *cardpeek_resources_get_resource (void); #endif cardpeek-0.8/gui_cardview.c0000644000175000017500000005733612213657631012720 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui.h" #include "gui_cardview.h" #include "gui_toolbar.h" #include "gui_about.h" #include "gui_flexi_cell_renderer.h" #include "lua_ext.h" #include #include "misc.h" #include "pathconfig.h" #include #include #include #include #ifndef _WIN32 #include "config.h" #else #include "win32/config.h" #include "win32/win32compat.h" #endif typedef struct _ScriptInfo ScriptInfo; struct _ScriptInfo { char *script_name; char *script_file; char *script_description; char *script_targeted_version; ScriptInfo *prev; }; /*********************************************************/ /* THE INFAMOUS UGLY GLOBALS *****************************/ /*********************************************************/ DyntreeModel *CARDTREE=0; GtkWidget *CARDVIEW=NULL; ScriptInfo *SCRIPTS=NULL; DyntreeModel *gui_cardview_get_store(void) { return CARDTREE; } /*********************************************************/ /* LOG FUNCTIONS AND UI CALLBACKS ************************/ /*********************************************************/ static void menu_run_script_cb(GtkWidget *widget, gpointer callback_data, guint callback_action) { ScriptInfo *script = (ScriptInfo *)callback_data; UNUSED(widget); UNUSED(callback_action); if (!script->script_targeted_version) { log_printf(LOG_WARNING,"The script '%s' does not contain version information, and may use an older incompatible API", script->script_file); log_printf(LOG_WARNING,"To remove this warning, add the following line at the begining of '%s':\n\t -- @targets %s", script->script_file, VERSION); } gui_set_title(script->script_name); luax_run_script(script->script_file); gtk_tree_view_expand_all (GTK_TREE_VIEW(CARDVIEW)); gui_update(0); } static void menu_cardview_clear_cb(GtkWidget *w, gpointer user_data) { UNUSED(w); UNUSED(user_data); dyntree_model_iter_remove(CARDTREE,NULL); luax_run_command("card.CLA=0"); log_printf(LOG_INFO,"Cleared card data tree"); } static void menu_cardview_open_cb(GtkWidget *w, gpointer user_data) { char **select_info; a_string_t *command; char *filename; UNUSED(w); UNUSED(user_data); select_info = gui_select_file("Load xml card description",path_config_get_string(PATH_CONFIG_FOLDER_WORKING),NULL); if (select_info[1]) { path_config_set_string(PATH_CONFIG_FOLDER_WORKING,select_info[0]); filename = luax_escape_string(select_info[1]); command=a_strnew(NULL); a_sprintf(command,"ui.load_view(\"%s\")",filename); luax_run_command(a_strval(command)); a_strfree(command); g_free(select_info[0]); g_free(select_info[1]); g_free(filename); } } static void menu_cardview_save_as_cb(GtkWidget *w, gpointer user_data) { char **select_info; a_string_t *command; char *filename; UNUSED(w); UNUSED(user_data); select_info = gui_select_file("Save xml card description",path_config_get_string(PATH_CONFIG_FOLDER_WORKING),"card.xml"); if (select_info[1]) { path_config_set_string(PATH_CONFIG_FOLDER_WORKING,select_info[0]); filename = luax_escape_string(select_info[1]); command=a_strnew(NULL); a_sprintf(command,"ui.save_view(\"%s\")",filename); luax_run_command(a_strval(command)); a_strfree(command); g_free(select_info[0]); g_free(select_info[1]); g_free(filename); } } static void menu_cardview_switch_column(void) { GtkTreeViewColumn *column2 = gtk_tree_view_get_column(GTK_TREE_VIEW(CARDVIEW),2); GtkTreeViewColumn *column3 = gtk_tree_view_get_column(GTK_TREE_VIEW(CARDVIEW),3); if (gtk_tree_view_column_get_visible(column2)) { gtk_tree_view_column_set_visible (column2,FALSE); gtk_tree_view_column_set_visible (column3,TRUE); } else { gtk_tree_view_column_set_visible (column2,TRUE); gtk_tree_view_column_set_visible (column3,FALSE); } } static void menu_cardview_context_menu_change_value_type(GtkWidget *menuitem, gpointer userdata) { UNUSED(userdata); UNUSED(menuitem); menu_cardview_switch_column(); } static void menu_cardview_column_activated(GtkTreeViewColumn *treeviewcolumn, gpointer userdata) { UNUSED(userdata); UNUSED(treeviewcolumn); menu_cardview_switch_column(); } static void menu_cardview_context_menu_expand_all(GtkWidget *menuitem, gpointer userdata) /* Callback responding to right click context menu item to expand current branch */ { GtkTreeView *treeview = GTK_TREE_VIEW(userdata); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path; UNUSED(menuitem); if (gtk_tree_selection_get_selected(selection,&model,&iter)) { path = gtk_tree_model_get_path(model,&iter); gtk_tree_view_expand_row(treeview,path,TRUE); gtk_tree_path_free(path); } } static void menu_cardview_context_menu(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) /* Create a right click context menu */ { GtkWidget *menu, *menuitem; GtkTreeViewColumn *column2 = gtk_tree_view_get_column(GTK_TREE_VIEW(treeview),2); UNUSED(userdata); menu = gtk_menu_new(); /* Menu Item */ menuitem = gtk_menu_item_new_with_label("Expand all"); g_signal_connect(menuitem, "activate", (GCallback) menu_cardview_context_menu_expand_all, treeview); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); /* Menu Item */ if (gtk_tree_view_column_get_visible(column2)) { menuitem = gtk_menu_item_new_with_label("Show interpreted value"); g_signal_connect(menuitem, "activate", (GCallback) menu_cardview_context_menu_change_value_type, treeview); } else { menuitem = gtk_menu_item_new_with_label("Show raw value"); g_signal_connect(menuitem, "activate", (GCallback) menu_cardview_context_menu_change_value_type, treeview); } gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, (event != NULL) ? event->button : 0, gdk_event_get_time((GdkEvent *)event)); } static gboolean menu_cardview_button_press_event(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) { GtkTreeSelection *selection; GtkTreePath *path; if (event->type == GDK_BUTTON_PRESS && event->button == 3) { selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); if (gtk_tree_selection_count_selected_rows(selection) <= 1) { /* Get tree path for row that was clicked */ if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL)) { gtk_tree_selection_unselect_all(selection); gtk_tree_selection_select_path(selection, path); gtk_tree_path_free(path); } } menu_cardview_context_menu(treeview,event,userdata); return TRUE; } /* else if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { g_printf("double click\n"); } */ return FALSE; } static void menu_cardview_analyzer_cb_pos_func(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { GtkWidget *button=(GtkWidget *)user_data; GtkAllocation allocation; UNUSED(menu); gtk_widget_get_allocation(button,&allocation); *push_in = TRUE; gdk_window_get_origin(gtk_widget_get_window(button), x, y); *x += allocation.x; *y += allocation.y; *y += allocation.height; } static void menu_cardview_analyzer_cb(GtkWidget *w, gpointer user_data) { GtkWidget *menu=(GtkWidget *)user_data; if (menu) { gtk_menu_popup(GTK_MENU(menu), NULL, NULL, menu_cardview_analyzer_cb_pos_func, w, 0, gtk_get_current_event_time()); } else log_printf(LOG_ERROR,"No menu to display"); } static void menu_cardview_analyzer_load_cb(GtkWidget *w, gpointer user_data) { char **select_info; UNUSED(w); UNUSED(user_data); select_info = gui_select_file("Load card script",path_config_get_string(PATH_CONFIG_FOLDER_SCRIPTS),NULL); if (select_info[1]) { path_config_set_string(PATH_CONFIG_FOLDER_WORKING,select_info[0]); chdir(select_info[0]); gui_set_title(select_info[1]); luax_run_script(select_info[1]); g_free(select_info[0]); g_free(select_info[1]); } } /*********************************************************/ /* CONSTRUTION OF MAIN UI ********************************/ /*********************************************************/ static int select_lua(DIRENT_T *de) { char *ext=rindex(de->d_name,'.'); if (ext && strcmp(ext,".lua")==0) return 1; return 0; } static void rtrim(char *line) { char *eol = line+strlen(line)-1; while (eol>=line && *eol<=' ') *eol--=0; } static const char *locate_after_prefix(const char *prefix, const char *line) { char *pos = strstr(line,prefix); if (pos) { pos+=strlen(prefix); while (*pos<=' ' && *pos>0) pos++; return pos; } return NULL; } static GtkWidget *script_info_add(const char *path, const char *fname) { char *fullname; ScriptInfo *si; FILE *script; int i; char line[1024]; const char *str; char *dot; char *underscore; GtkWidget *menuitem = NULL; fullname = g_malloc(strlen(path)+strlen(fname)+2); sprintf(fullname,"%s/%s",path,fname); script = fopen(fullname,"r"); if (script) { si = (ScriptInfo *)g_malloc0(sizeof(ScriptInfo)); si->script_file = strdup(fname); rtrim(line); for (i=0; i<30; i++) { if (fgets(line,1024,script)==NULL) break; rtrim(line); if ((str=locate_after_prefix("@name",line))!=NULL) { si->script_name = g_strdup(str); } else if ((str=locate_after_prefix("@description",line))!=NULL) { si->script_description = g_strdup(str); } else if ((str=locate_after_prefix("@targets",line))!=NULL) { si->script_targeted_version = g_strdup(str); } } fclose(script); if (si->script_name==NULL) { si->script_name = g_strdup(fname); dot = rindex(si->script_name,'.'); if (dot) *dot=0; for (underscore=si->script_name; *underscore!=0; underscore++) { if (*underscore=='_') *underscore=' '; } } si->prev = SCRIPTS; SCRIPTS = si; menuitem = gtk_image_menu_item_new_with_label(si->script_name); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem),gtk_image_new_from_stock(GTK_STOCK_EXECUTE,GTK_ICON_SIZE_MENU)); if (si->script_description) gtk_widget_set_tooltip_text(menuitem,si->script_description); g_signal_connect(GTK_WIDGET(menuitem),"activate",G_CALLBACK(menu_run_script_cb),si); gtk_widget_show(menuitem); } else { log_printf(LOG_ERROR,"Failed to open %s for reading",fullname); } g_free(fullname); return menuitem; } static GtkWidget *create_analyzer_menu(GtkAccelGroup *accel_group) { GtkWidget *menu = gtk_menu_new(); GtkWidget *menuitem = NULL; struct dirent **namelist; int i,n; const char *script_path=path_config_get_string(PATH_CONFIG_FOLDER_SCRIPTS); menu = gtk_menu_new(); n = scandir(script_path, &namelist, select_lua, alphasort); if (n > 0) { for (i=0; id_name); menuitem = script_info_add(script_path, namelist[i]->d_name); if (menuitem) gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem); free(namelist[i]); } free(namelist); } else log_printf(LOG_WARNING,"No scripts found in %s",script_path); menuitem = gtk_separator_menu_item_new(); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem); menuitem = gtk_image_menu_item_new_with_label("Load a script"); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem),gtk_image_new_from_stock(GTK_STOCK_OPEN,GTK_ICON_SIZE_MENU)); g_signal_connect(GTK_WIDGET(menuitem),"activate",G_CALLBACK(menu_cardview_analyzer_load_cb),NULL); gtk_widget_add_accelerator(menuitem, "activate", accel_group, GDK_KEY_l, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem); return menu; } toolbar_item_t TB_CARD_VIEW[] = { { "card-view-analyzer", "cardpeek-analyzer", "Analyzer", G_CALLBACK(menu_cardview_analyzer_cb), NULL, "Analyze card contents." }, { NULL, TOOLBAR_ITEM_SEPARATOR, NULL, NULL, NULL, NULL }, { "card-view-clear", GTK_STOCK_CLEAR, "Clear", G_CALLBACK(menu_cardview_clear_cb), NULL, "Clear the card view content." }, { "card-view-open", GTK_STOCK_OPEN, "Open", G_CALLBACK(menu_cardview_open_cb), NULL, "Load previously saved card view content (XML fomat)." }, { "card-view-save-as", GTK_STOCK_SAVE_AS, "Save", G_CALLBACK(menu_cardview_save_as_cb), NULL, "Save current card view content into a file (XML fomat)." }, { NULL, TOOLBAR_ITEM_EXPANDER, NULL, NULL, NULL, NULL }, { "card-view-about", GTK_STOCK_ABOUT, "About", G_CALLBACK(gui_toolbar_run_command_cb), "ui.about()", "About cardpeek " VERSION }, { NULL, TOOLBAR_ITEM_SEPARATOR, NULL, NULL, NULL, NULL }, { "card-view-quit", GTK_STOCK_QUIT, "Quit", G_CALLBACK(gtk_main_quit), NULL, "Quit cardpeek" }, /* END MARKER : */ { NULL, NULL, NULL, NULL, NULL, NULL } }; static void internal_cell_renderer_icon_cb (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { char *classname; const char *icon_name = NULL; UNUSED(col); UNUSED(user_data); gtk_tree_model_get(GTK_TREE_MODEL(model), iter, CC_CLASSNAME, &classname, -1); if (classname!=NULL && classname[0]=='t') { switch (classname[2]) { case 'a': if (strcmp("t:application",classname)==0) icon_name="cardpeek-application"; else if (strcmp("t:atr",classname)==0) icon_name="cardpeek-atr"; break; case 'b': if (strcmp("t:block",classname)==0) icon_name="cardpeek-block"; else if (strcmp("t:body",classname)==0) icon_name="cardpeek-body"; break; case 'c': if (strcmp("t:card",classname)==0) icon_name="cardpeek-smartcard"; break; case 'f': if (strcmp("t:file",classname)==0) icon_name="cardpeek-file"; else if (strcmp("t:folder",classname)==0) icon_name="cardpeek-folder"; break; case 'h': if (strcmp("t:header",classname)==0) icon_name="cardpeek-header"; break; case 'r': if (strcmp("t:record",classname)==0) icon_name="cardpeek-record"; break; } } if (icon_name==NULL) icon_name="cardpeek-item"; g_object_set(renderer, "stock-id", icon_name, NULL); g_free(classname); } static void internal_cell_renderer_markup_cb (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { a_string_t *markup_label_id; char *classname; char *id; char *label; UNUSED(col); UNUSED(user_data); gtk_tree_model_get(GTK_TREE_MODEL(model), iter, CC_CLASSNAME, &classname, CC_LABEL, &label, CC_ID, &id, -1); /* TODO: escape markup characters that may appear in classname, id and label */ markup_label_id = a_strnew(NULL); if (label && label[0]=='t') a_sprintf(markup_label_id,"%s",label+2); else { if (classname && classname[0]=='t') a_sprintf(markup_label_id,"%s",classname+2); else a_sprintf(markup_label_id,"item"); } if (id && id[0]=='t') { a_strcat(markup_label_id," "); a_strcat(markup_label_id,id+2); } g_object_set(renderer, "markup", a_strval(markup_label_id), NULL); a_strfree(markup_label_id); g_free(classname); g_free(label); g_free(id); } static void internal_cell_renderer_size_cb (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { char *size; UNUSED(col); UNUSED(user_data); gtk_tree_model_get(GTK_TREE_MODEL(model), iter, CC_SIZE, &size, -1); if (size && size[0]=='t') g_object_set(renderer, "text", size+2, NULL); else g_object_set(renderer, "text", "", NULL); g_free(size); } GtkWidget *gui_cardview_create_window(GtkAccelGroup *accel_group) { GtkCellRenderer *renderer; GtkWidget *scrolled_window; GtkTreeViewColumn *column; GtkWidget *base_container; GtkWidget *toolbar; GtkWidget *colheader; GtkWidget *colitem; /* Create base window container */ base_container = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); /* Create the toolbar */ TB_CARD_VIEW[0].callback_data = create_analyzer_menu(accel_group); toolbar = gui_toolbar_new(TB_CARD_VIEW); gtk_box_pack_start (GTK_BOX (base_container), toolbar, FALSE, FALSE, 0); /* Create a new scrolled window, with scrollbars only if needed */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_end (GTK_BOX (base_container), scrolled_window, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); CARDVIEW = gtk_tree_view_new (); g_signal_connect(CARDVIEW, "button-press-event", (GCallback) menu_cardview_button_press_event, NULL); gtk_container_add (GTK_CONTAINER (scrolled_window), CARDVIEW); /* --- Column #0 --- */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column,"Items"); gtk_tree_view_column_set_resizable(column,TRUE); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, internal_cell_renderer_icon_cb, NULL, NULL); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, internal_cell_renderer_markup_cb, NULL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(CARDVIEW), column); /* --- Column #1 --- */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column,"Size"); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, internal_cell_renderer_size_cb, NULL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(CARDVIEW), column); g_object_set(renderer, "foreground", "blue", NULL); /* --- Column #2 --- */ renderer = custom_cell_renderer_flexi_new(TRUE); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (CARDVIEW), -1, NULL, renderer, "raw-value", CC_VAL, NULL); column = gtk_tree_view_get_column(GTK_TREE_VIEW (CARDVIEW),2); gtk_tree_view_column_set_resizable(column,TRUE); gtk_tree_view_column_set_visible (column,FALSE); gtk_tree_view_column_set_clickable(column,TRUE); g_signal_connect(column,"clicked",(GCallback)menu_cardview_column_activated,NULL); colheader = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,10); gtk_box_pack_start (GTK_BOX (colheader), gtk_label_new("Raw value"), FALSE, FALSE, 0); if ((colitem = gtk_image_new_from_stock(GTK_STOCK_CONVERT,GTK_ICON_SIZE_MENU))) { gtk_box_pack_start (GTK_BOX (colheader), colitem, FALSE, FALSE, 0); } gtk_widget_show_all(colheader); gtk_widget_set_tooltip_text(colheader,"Click to switch to 'interpreted' data."); gtk_tree_view_column_set_widget(column,colheader); /* --- Column #3 --- */ renderer = custom_cell_renderer_flexi_new(FALSE); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (CARDVIEW), -1, NULL, renderer, "raw-value", CC_VAL, "alt_text", CC_ALT, "mime-type", CC_MIME_TYPE, NULL); column = gtk_tree_view_get_column(GTK_TREE_VIEW (CARDVIEW),3); gtk_tree_view_column_set_resizable(column,TRUE); gtk_tree_view_column_set_clickable(column,TRUE); g_signal_connect(column,"clicked",(GCallback)menu_cardview_column_activated,NULL); colheader = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,10); gtk_box_pack_start (GTK_BOX (colheader), gtk_label_new("Interpreted value"), FALSE, FALSE, 0); if ((colitem = gtk_image_new_from_stock(GTK_STOCK_CONVERT,GTK_ICON_SIZE_MENU))) { gtk_box_pack_start (GTK_BOX (colheader), colitem, FALSE, FALSE, 0); } gtk_widget_show_all(colheader); gtk_widget_set_tooltip_text(colheader,"Click to switch to 'raw' data."); gtk_tree_view_column_set_widget(column,colheader); /* add the dat model */ CARDTREE = dyntree_model_new(); gtk_tree_view_set_model(GTK_TREE_VIEW(CARDVIEW),GTK_TREE_MODEL(CARDTREE)); g_object_unref(CARDTREE); return base_container; } void gui_cardview_cleanup(void) { ScriptInfo *prev; while (SCRIPTS) { prev=SCRIPTS->prev; g_free(SCRIPTS->script_name); g_free(SCRIPTS->script_file); if (SCRIPTS->script_description) g_free(SCRIPTS->script_description); if (SCRIPTS->script_targeted_version) g_free(SCRIPTS->script_targeted_version); free(SCRIPTS); SCRIPTS=prev; } CARDTREE=NULL; CARDVIEW=NULL; } cardpeek-0.8/ChangeLog0000644000175000017500000000721212214320473011632 00000000000000cardpeek-0.8: L1L1@gmx.com 12 Spetember 2013 - Added Belgian eID card support - Added RavKav calypso card support (A. Berkow) - Updated Moneo script with more detailed parsing. - Added ability to display pictures (e-passports && eID cards). - A new simplified and more efficient card view API with the 'nodes' library. - Improved compatibility: now compiles on ARM Raspberry PI and Intel Mac OS X. - Attempts to recognize cards from ATR with smartcard_list.txt database. - Uses libcurl for online automatic update of ATR database smartcard_list.txt. - A few minor changes to the 'bytes' API. - Updgraded libraries to GTK 3.0 and LUA 5.2. - Many bugfixes and minor enhancements. cardpeek-0.7.2: L1L1@gmx.com 17 March 2013 - This is a bugfix release. No new features / scripts were added. - Fixed many compiler, and C coding standards compliance issues (many thanks to Ludovic Rousseau). - Produce a windows version that seems to work both for 32 and 64 bit platforms - Added proper compile flag detection for GLIB. - Added source of PDF documentation in doc/ directory. - Some other minor correction cardpeek-0.7.1: L1L1@gmx.com 7 May 2012 - Corrected a bug in the GSM script (spotted by Tyson Key), which made it halt on some USIM cards. - Corrected a bug in the EMV script (spotted by geoffrey.bulan): the script didn't parse AFLs corectly on some EMV cards, resulting in a runtime error. - Corrected a bug in filename parsing for windows, which occured when filenames contained UTF8 characters. - Corrected a bug in metro/RER station name analysis for the Paris Navigo script. cardpeek-0.7: L1L1@gmx.com 4 September 2011 - Added support for the Windows XP OS. - Extended MOBIB transport card support with better event log parsing including metro and bus stations names. - Added preliminary GSM SIM card support. - Added prelininary Mifare card support (tested with the Thalys card). - Corrected a major bug in the e-passport script. - Changed the XML data format used to save card data. - Rewrote the card data model for additional flexibility. - Added a new flexible card view manipulation library called "treeflex". - Minor GUI tweaks. - Many bug corrections. cardpeek-0.6: L1L1@gmx.com 27 March 2011 - Rewrote the Calypso scripts for extended modularity. - Added desktop and application icon. - Corrected bugs. - Added EMV CVM parsing proposed by Adam Laurie (many thanks to him). cardpeek-0.5: L1L1@gmx.com 22 March 2010 - Complete rework of the GUI, for better clarity and ease of use. - Added basic crypto support based on OPENSSL (for BAC e-passport ops). - Added preliminary support for e-passport analysis in BAC security mode. - Extended the documentation. - Moved to "autotools" for compilation purposes. - Confirmed support for Debian i386, Debian amd64, and FreeBSD 8.0 cardpeek-0.4: L1L1@gmx.com 03 February 2010 - Added preliminary Vitale 2 health card analysis. - Extended the documentation. - Added LUA functions to run standard ISO 7816 commands. - Corrected some small bugs. - Added the possibility to compile the source under FreeBSD. - Added better upgrade capacity when installing a newer version over an older one. cardpeek-0.3: L1L1@gmx.com 17 January 2010 - Extended the documentation. - Defined a generic calypso script. - Added a specific navigo scripts with extended event analysis (thanks to ideas from Pascal Terjan). - Added better generic EMV log analysis. - Added experimental AGC Multi Iso contactless support. - Added APDU capture and card emulator driver code. cardpeek-0.2: L1L1@gmx.com 3 January 2010 - Complete rewrite of most of the code. - Imported ideas and bugfixes from Pascal Terjan (many thanks to him) cardpeek-0.1: L1L1@gmx.com 20 July 2009 - Initial version cardpeek-0.8/main.c0000644000175000017500000003751612214320473011162 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include #include #include #include #include #include #include "smartcard.h" #include "misc.h" #include "a_string.h" #include "gui.h" #include "gui_readerview.h" #include "pathconfig.h" #include "lua_ext.h" #include "script_version.h" #include "system_info.h" #include #ifndef _WIN32 #include #endif #include #include #include "cardpeek_resources.gresource" #include "gui_inprogress.h" #include static int progress_update_smartcard_list_txt(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow) { GtkWidget *progress = (GtkWidget *)clientp; UNUSED(ultotal); UNUSED(ulnow); if (dltotal==0) return !gui_inprogress_pulse(progress); return !gui_inprogress_set_fraction(progress,dlnow/dltotal); } static int update_smartcard_list_txt(void) { CURL *curl; CURLcode res; const char* smartcard_list_txt = path_config_get_string(PATH_CONFIG_FILE_SMARTCARD_LIST_TXT); const char* smartcard_list_download = path_config_get_string(PATH_CONFIG_FILE_SMARTCARD_LIST_DOWNLOAD); FILE* smartcard_list; char *url; char user_agent[100]; time_t now = time(NULL); unsigned next_update = (unsigned)luax_variable_get_integer("cardpeek.smartcard_list.next_update"); GtkWidget *progress; int retval = 0; time_t next_update_distance; if (!luax_variable_is_defined("cardpeek.smartcard_list")) { luax_variable_set_boolean("cardpeek.smartcard_list.auto_update",FALSE); luax_variable_set_integer("cardpeek.smartcard_list.next_update",0); luax_variable_set_strval("cardpeek.smartcard_list.url", "http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt"); } if (luax_variable_get_boolean("cardpeek.smartcard_list.auto_update")!=TRUE) { log_printf(LOG_INFO,"smartcard_list.txt auto-update is disabled."); return 0; } if (now=SCRIPT_VERSION) { log_printf(LOG_DEBUG,"Scripts are up to date."); return 1; } } astr = a_strnew(NULL); if (dot_version==0 && f==NULL) a_sprintf(astr,"This seems to be the first time you run Cardpeek, because '%s' does not exist\n" "Do you want to install the necessary files in '%s'?",version_file,cardpeek_dir); else a_sprintf(astr,"Some scripts in '%s' seem to be outdated or missing\n" "Do you want to upgrade these scripts?",cardpeek_dir); if ((response = gui_question(a_strval(astr),"Yes","No","No, don't ask me again",NULL))!=0) { log_printf(LOG_DEBUG,"The files in '%s' will not be upgraded.",cardpeek_dir); a_strfree(astr); if (response==2) { if ((f=g_fopen(version_file,"w"))!=NULL) { fprintf(f,"%u\n",SCRIPT_VERSION); fclose(f); } } return 0; } a_strfree(astr); } else { astr = a_strnew(NULL); a_sprintf(astr,"It seems this is the first time you run Cardpeek, because \n'%s' does not exit (%s).\n" "Do you want to create '%s'?",cardpeek_dir,strerror(errno),cardpeek_dir); if (gui_question(a_strval(astr),"Yes","No",NULL)!=0) { log_printf(LOG_DEBUG,"'%s' will not be created",cardpeek_dir); a_strfree(astr); return 0; } a_strfree(astr); #ifndef _WIN32 if (mkdir(cardpeek_dir,0770)!=0) #else if (mkdir(cardpeek_dir)!=0) #endif { astr = a_strnew(NULL); a_sprintf(astr,"'%s' could not be created: %s",cardpeek_dir,strerror(errno)); log_printf(LOG_ERROR,a_strval(astr)); gui_question(a_strval(astr),"OK",NULL); a_strfree(astr); return 0; } } if (g_stat(old_replay_dir,&sbuf)==0) { if (rename(old_replay_dir,new_replay_dir)==0) { log_printf(LOG_INFO,"Renamed %s to %s.", old_replay_dir, new_replay_dir); } else { log_printf(LOG_WARNING,"Failed to rename %s to %s: %s", old_replay_dir, new_replay_dir, strerror(errno)); } } cardpeek_resources = cardpeek_resources_get_resource(); if (cardpeek_resources == NULL) { log_printf(LOG_ERROR,"Could not load cardpeek internal resources. This is not good."); return -1; } dot_cardpeek_tar_gz = g_resources_lookup_data("/cardpeek/dot_cardpeek.tar.gz",G_RESOURCE_LOOKUP_FLAGS_NONE,NULL); if (dot_cardpeek_tar_gz == NULL) { log_printf(LOG_ERROR,"Could not load .cardpeek.tar.gz"); return -1; } dot_cardpeek_tar_gz_start = (unsigned char *)g_bytes_get_data(dot_cardpeek_tar_gz,&dot_cardpeek_tar_gz_size); chdir(cardpeek_dir); if ((f = g_fopen("dot_cardpeek.tar.gz","wb"))==NULL) { log_printf(LOG_ERROR,"Could not create dot_cardpeek.tar.gz in %s (%s)", cardpeek_dir, strerror(errno)); gui_question("Could not create dot_cardpeek.tar.gz, aborting.","Ok",NULL); return 0; } if (fwrite(dot_cardpeek_tar_gz_start,dot_cardpeek_tar_gz_size,1,f)!=1) { log_printf(LOG_ERROR,"Could not write to dot_cardpeek.tar.gz in %s (%s)", cardpeek_dir, strerror(errno)); gui_question("Could not write to dot_cardpeek.tar.gz, aborting.","Ok",NULL); fclose(f); return 0; } log_printf(LOG_DEBUG,"Wrote %i bytes to dot_cardpeek.tar.gz",dot_cardpeek_tar_gz_size); fclose(f); g_bytes_unref(dot_cardpeek_tar_gz); log_printf(LOG_INFO,"Created dot_cardpeek.tar.gz"); log_printf(LOG_INFO,"Creating files in %s", cardpeek_dir); status = system("tar xzvf dot_cardpeek.tar.gz"); log_printf(LOG_INFO,"'tar xzvf dot_cardpeek.tar.gz' returned %i",status); if (status!=0) { gui_question("Extraction of dot_cardpeek.tar.gz failed, aborting.","Ok",NULL); return 0; } status = system("rm dot_cardpeek.tar.gz"); log_printf(LOG_INFO,"'rm dot_cardpeek.tar.gz' returned %i",status); gui_question("Note: The files have been created.\nIt is recommended that you quit and restart cardpeek, for changes to take effect.","Ok",NULL); return 1; } static gboolean run_command_from_cli(gpointer data) { luax_run_command((const char *)data); return FALSE; } /* static gboolean run_update_checks(gpointer data) { update_smartcard_list_txt(); return FALSE; } */ static const char *message = "***************************************************************\n" " Oups... \n" " Cardpeek has encoutered a problem and has exited abnormally. \n" " Additionnal information may be available in the file \n" " \n" " " ; static const char *signature = "\n" " \n" " L1L1@gmx.com \n" "***************************************************************\n" ; static void save_what_can_be_saved(int sig_num) { const char *logfile; char buf[32]; write(2,message,strlen(message)); logfile = path_config_get_string(PATH_CONFIG_FILE_CARDPEEK_LOG); write(2,logfile,strlen(logfile)); write(2,signature,strlen(signature)); sprintf(buf,"Received signal %i\n",sig_num); write(2,buf,strlen(buf)); log_close_file(); exit(-2); } static void display_readers_and_version(void) { cardmanager_t *CTX; unsigned i; unsigned reader_count; const char **reader_list; log_set_function(NULL); luax_init(); fprintf(stdout,"%sThis is %s.%s\n",ANSI_GREEN,system_string_info(),ANSI_RESET); fprintf(stdout,"Cardpeek path is %s\n",path_config_get_string(PATH_CONFIG_FOLDER_CARDPEEK)); CTX = cardmanager_new(); reader_count = cardmanager_count_readers(CTX); reader_list = cardmanager_reader_name_list(CTX); if (reader_count == 0) fprintf(stdout,"There are no readers detected\n"); else if (reader_count==1) fprintf(stdout,"There is 1 reader detected:\n"); else fprintf(stdout,"There are %i readers detected:\n",reader_count); for (i=0; i %s\n", reader_list[i]); fprintf(stdout,"\n"); cardmanager_free(CTX); luax_release(); } static void display_help(char *progname) { fprintf(stderr, "Usage: %s [-r|--reader reader-name] [-e|--exec lua-command] [-v|--version]\n", progname); } static struct option long_options[] = { {"reader", required_argument, 0, 'r' }, {"exec", required_argument, 0, 'e' }, {"version", no_argument, 0, 'v' }, {"help", no_argument, 0, 'h' }, {0, 0, 0, 0 } }; int main(int argc, char **argv) { cardmanager_t* CTX; cardreader_t* READER; int opt; int opt_index = 0; int run_gui = 1; char* reader_name = NULL; char* exec_command = NULL; signal(SIGSEGV, save_what_can_be_saved); path_config_init(); log_open_file(); while ((opt = getopt_long(argc,argv,"r:e:vh",long_options,&opt_index))!=-1) { switch (opt) { case 'r': reader_name = g_strdup(optarg); break; case 'e': exec_command = optarg; break; case 'v': display_readers_and_version(); run_gui = 0; break; default: display_help(argv[0]); run_gui = 0; } } if (run_gui) { /* if we want threads: gdk_threads_init(); gdk_threads_enter(); */ gui_init(&argc,&argv); gui_create(); log_printf(LOG_INFO,"Running %s",system_string_info()); install_dot_file(); luax_init(); CTX = cardmanager_new(); if (reader_name == NULL) { reader_name = gui_select_reader(cardmanager_count_readers(CTX), cardmanager_reader_name_list(CTX)); } READER = cardreader_new(reader_name); cardmanager_free(CTX); if (READER) { luax_set_card_reader(READER); cardreader_set_callback(READER,gui_readerview_print,NULL); if (exec_command) g_idle_add(run_command_from_cli,exec_command); else update_smartcard_list_txt(); /*else g_idle_add(run_update_checks,NULL); */ gui_run(); cardreader_free(READER); } else { fprintf(stderr,"Failed to open smart card reader '%s'.\n",reader_name); log_printf(LOG_ERROR,"Failed to open smart card reader '%s'.", reader_name); } luax_config_table_save(); luax_release(); /* if we want threads: gdk_threads_leave(); */ } if (reader_name) g_free(reader_name); log_close_file(); path_config_release(); return 0; } cardpeek-0.8/system_info.h0000644000175000017500000000157712160275534012607 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef SYSTEM_INFO_H const char *system_string_info(void); #endif cardpeek-0.8/replay.c0000644000175000017500000001653312160275537011540 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "replay.h" #include #include #include "misc.h" #include static anyreplay_t* cardreplay_new_item(cardreplay_t* ce, int type) { replay_t replay; if (type==CARDREPLAY_COMMAND) { replay.com = (comreplay_t *)malloc(sizeof(comreplay_t)); replay.com -> type = CARDREPLAY_COMMAND; } else { replay.res = (resreplay_t *)malloc(sizeof(resreplay_t)); replay.res -> type = CARDREPLAY_RESET; } if (ce->start.any==NULL) { replay.any -> next = NULL; ce->start = ce->pos = replay; } else { replay.any -> next = (ce->pos.any)->next; (ce->pos.any)->next= replay.any; ce->pos = replay; } return replay.any; } int cardreplay_add_command(cardreplay_t* ce, const bytestring_t* command, unsigned sw, const bytestring_t* result) { comreplay_t* com = (comreplay_t *)cardreplay_new_item(ce,CARDREPLAY_COMMAND); if (com==NULL) return CARDREPLAY_ERROR; com->query = bytestring_duplicate(command); com->sw = sw; com->response = bytestring_duplicate(result); ce->count++; return CARDREPLAY_OK; } int cardreplay_add_reset(cardreplay_t* ce, const bytestring_t* atr) { resreplay_t* res = (resreplay_t *)cardreplay_new_item(ce,CARDREPLAY_RESET); if (res==NULL) return CARDREPLAY_ERROR; res->atr = bytestring_duplicate(atr); ce->count++; return CARDREPLAY_OK; } cardreplay_t* cardreplay_new(void) { cardreplay_t* ce=(cardreplay_t*)malloc(sizeof(cardreplay_t)); ce -> start.any = ce -> pos.any = ce -> atr.any = NULL; ce -> count = 0; return ce; } void cardreplay_free(cardreplay_t* ce) { replay_t item; anyreplay_t *next; if (ce==NULL) { log_printf(LOG_WARNING,"cardreplay_free(): Attempt to free an NULL pointer."); return; } item = ce -> start; while (item.any) { next = item.any -> next; if (item.any->type==CARDREPLAY_COMMAND) { bytestring_free(item.com->query); bytestring_free(item.com->response); } else { bytestring_free(item.res->atr); } free(item.any); item.any = next; } free(ce); } anyreplay_t* cardreplay_after_atr(cardreplay_t* ce) { if (ce->atr.any==NULL) return NULL; return (ce->atr.any)->next; } int cardreplay_run_command(cardreplay_t* ce, const bytestring_t* command, unsigned short *sw, bytestring_t *response) { anyreplay_t* init; replay_t cur; bytestring_clear(response); *sw=0x6FFF; if (ce->start.any==NULL || ce->pos.any==NULL) return CARDREPLAY_ERROR; init = ce->pos.any; cur.any = init; do { if (cur.any->type==CARDREPLAY_COMMAND) { if (bytestring_is_equal(command,cur.com->query)) { bytestring_copy(response,cur.com->response); *sw = cur.com->sw; if (cur.any->next) ce->pos.any = cur.any->next; else ce->pos.any = cardreplay_after_atr(ce); return CARDREPLAY_OK; } if (cur.any->next) cur.any = cur.any->next; else cur.any = cardreplay_after_atr(ce); } else /* CARDREPLAY_RESET */ { cur.any = cardreplay_after_atr(ce); } } while (cur.any!=init && cur.any!=NULL); return CARDREPLAY_ERROR; } int cardreplay_run_cold_reset(cardreplay_t* ce) { if (ce->start.any==NULL) return CARDREPLAY_ERROR; ce->atr=ce->start; ce->pos.any=(ce->start.any)->next; if ((ce->atr.res)->type!=CARDREPLAY_RESET) { log_printf(LOG_ERROR,"cardreplay_run_cold_atr(): reset error."); return CARDREPLAY_ERROR; } return CARDREPLAY_OK; } int cardreplay_run_warm_reset(cardreplay_t* ce) { replay_t cur = ce->pos; if (ce->start.any==NULL || cur.any==NULL) return CARDREPLAY_ERROR; if (ce->atr.any==NULL) log_printf(LOG_WARNING,"cardreplay_run_warm_reset(): no previous cold reset"); for (;;) { if (cur.any->type==CARDREPLAY_RESET) { ce->atr=cur; ce->pos.any=cur.any->next; return CARDREPLAY_OK; } if (cur.any->next) cur.any=cur.any->next; else if (ce->atr.any) cur = ce->atr; else cur = ce->start; } return CARDREPLAY_OK; } int cardreplay_run_last_atr(const cardreplay_t* ce, bytestring_t *atr) { if (ce->atr.any==NULL) { bytestring_clear(atr); return CARDREPLAY_ERROR; } bytestring_copy(atr,(ce->atr.res)->atr); return CARDREPLAY_OK; } int cardreplay_save_to_file(const cardreplay_t* ce, const char *filename) { FILE *f; replay_t cur; char *a; char *b; if ((f=g_fopen(filename,"w"))==NULL) return CARDREPLAY_ERROR; fprintf(f,"# cardpeek trace file\n"); fprintf(f,"# version 0\n"); for (cur=ce->start;cur.any!=NULL;cur.any=cur.any->next) { if (cur.any->type==CARDREPLAY_COMMAND) { a = bytestring_to_format("%D",cur.com->query); b = bytestring_to_format("%D",cur.com->response); fprintf(f,"C:%s:%04X:%s\n",a,cur.com->sw,b); free(a); free(b); } else /* CARDTREE_RESET */ { a = bytestring_to_format("%D",cur.res->atr); fprintf(f,"R:%s\n",a); free(a); } } fprintf(f,"# end\n"); fclose(f); return CARDREPLAY_OK; } cardreplay_t* cardreplay_new_from_file(const char *filename) { FILE* f; cardreplay_t *ce; char BUF[1024]; char *a; char *b; char *c; char *p; bytestring_t* query; bytestring_t* response; bytestring_t* atr; unsigned sw; int something_to_read; int lineno=0; if ((f=g_fopen(filename,"r"))==NULL) return NULL; ce = cardreplay_new(); query = bytestring_new(8); response = bytestring_new(8); atr = bytestring_new(8); while ((something_to_read=(fgets(BUF,1024,f)!=NULL))) { lineno++; if (BUF[0]=='#') continue; if (BUF[0]=='C' && BUF[1]==':') { p=a=BUF+2; while (*p!=':' && *p) p++; if (*p==0) break; *p=0; p=b=p+1; while (*p!=':' && *p) p++; if (*p==0) break; *p=0; c=p+1; bytestring_assign_digit_string(query,a); sw = strtol(b,NULL,16); bytestring_assign_digit_string(response,c); cardreplay_add_command(ce,query,sw,response); } else if (BUF[0]=='R' && BUF[1]==':') { a=BUF+2; bytestring_assign_digit_string(atr,a); cardreplay_add_reset(ce,atr); } else if (BUF[0]=='\r' || BUF[0]=='\n') continue; else break; } bytestring_free(query); bytestring_free(response); bytestring_free(atr); fclose(f); if (something_to_read) { log_printf(LOG_ERROR, "cardreplay_new_from_file(): syntax error on line %i in %s", lineno,filename); cardreplay_free(ce); return NULL; } return ce; } int cardreplay_count_records(const cardreplay_t* ce) { return ce->count; } cardpeek-0.8/config.sub0000755000175000017500000010532711764422452012062 00000000000000#! /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, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # 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, 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. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 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-android* | 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/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 \ | aarch64 | aarch64_be \ | 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 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | 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 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-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-* \ | aarch64-* | aarch64_be-* \ | 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-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | 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-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | 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 ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 | 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*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-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 ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -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 ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; 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: cardpeek-0.8/NEWS0000644000175000017500000000000012110364466010550 00000000000000cardpeek-0.8/lua_card.h0000644000175000017500000000161012160275534012006 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_CARD_H #include int luaopen_card(lua_State* L); #endif cardpeek-0.8/lua_ui.c0000644000175000017500000001131312201420163011470 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_ui.h" #include "gui.h" #include "gui_about.h" #include "gui_cardview.h" #include "dyntree_model.h" #include "misc.h" #include #include #include "bytestring.h" #include "lua_bytes.h" #include #include static int subr_ui_save_view(lua_State* L) { const char *filename; if (lua_isnoneornil(L,1)) return luaL_error(L,"Expecting one parameter: a filename (string)"); filename= lua_tostring(L,1); if (dyntree_model_iter_to_xml_file(gui_cardview_get_store(),NULL,filename)==0) { log_printf(LOG_ERROR,"Could not write xml data to '%s'",filename); lua_pushboolean(L,0); } else { log_printf(LOG_INFO,"Wrote card data to '%s'",filename); lua_pushboolean(L,1); } return 1; } static int subr_ui_load_view(lua_State* L) { const char *filename; int retval; if (lua_isnoneornil(L,1)) return luaL_error(L,"Expecting one parameter: a filename (string)"); filename = lua_tostring(L,1); if (strcmp(filename_extension(filename),".lua")==0) { log_printf(LOG_WARNING,"%s seems to be a card LUA script: perhaps you should use the 'Analyzer'" " menu instead to open this file.",filename_base(filename)); } dyntree_model_iter_remove(gui_cardview_get_store(),NULL); retval = dyntree_model_iter_from_xml_file(gui_cardview_get_store(),NULL,filename); lua_pushboolean(L,retval); return 1; } static int subr_ui_question(lua_State* L) { const char* message; const char** items; unsigned item_count; unsigned i; int result; if (!lua_isstring(L,1) || !lua_istable(L,2)) return luaL_error(L,"expecting a string and a table as arguments to this function"); if (!lua_isnil(L,1)) message = lua_tostring(L,1); else message = ""; item_count = lua_rawlen(L,2); items = malloc(sizeof(char *)*item_count); for (i=0;i * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_NODES_H #include int luaopen_nodes(lua_State* L); #endif cardpeek-0.8/icons/0000755000175000017500000000000012214321142011243 500000000000000cardpeek-0.8/icons/item.png0000644000175000017500000000100612155053152012633 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXVAjP}iPD vkwW\t^D.\Hv=@5 C4z-$uq_{-maQrKay~Y ә(Xǫ ;@K\,@|g<aEl'3QuM@C0΀x]",!0!]DxD,MdzAۆ   @qt' RIENDB`cardpeek-0.8/icons/analyzer.png0000644000175000017500000000361212135142303013522 00000000000000PNG  IHDR szzsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATXŗ}lW?ko;0F)-2J͐.F 5KdnEF8cdE+/½^ )X6jm}-INrs}?syOh6˝@`A:Q"vv|&Ynm^WJdg[BP(iG>R! K{m~pW)::ߥKp尔"44: v;_{ֻ>4/b]S0Ma0=C)7gxr=Fy/`pkH5 W;Rͧϋ濝Eu^LiHHin8{Ay19FvbXֶ3Φu[7LsYy=73! VyW⫚[5;޲Gm`HSqZ>'N8iE}cUu;`h,Ebc46}aM-MEmYA[!Ɩ:%%'Ǿl]?L.ۄMr7}1x<KF+ɝ"s|vwgJ]ȂQ*^9ѽe>`+Ol}^i/Xژ5t@Kd4fP\\}mQzۤmgQ! ߜ&SpJ>nmHOnXmJ'RI $Q% 虺f"w/kJAN(}ǜ丧C k::t?ӣ`@3N>߿(cVk׮͖/{8^UYnƴt<֔,^zg ⲶK}7-+]4T%yӥ> i|U@:Z C+ umÆ E% 4mű:6oߎhBV:iJ8Ww@"??Bf] m%%%@h4fhhp6oK2iRE E}e_fVg\(1%Q NB8ƺֱߎE-xs@_ئɍay kڏ6p.gFށ8ʪ5ZNo{ 'GMڵ,xLj.D{U8ЉIZ],f] hK֕d>BddW7IENDB`cardpeek-0.8/icons/record.png0000644000175000017500000000070412155053152013157 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<AIDATX헱NPs{7fVILy'D_ta:lN$88wzqDuf~;|lRz#f{IENDB`cardpeek-0.8/icons/body.png0000644000175000017500000000034712155053152012641 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<dIDATXԱ 0 DoB..^H@Rr秓l(V8V.El\loCfNpw(wv5@@;IENDB`cardpeek-0.8/icons/smartcard.png0000755000175000017500000000061112155053152013661 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX헱m0D'K42pҐfQRRRkK86 0)q@Q~DLfmI둝Q Go8"d4o Ub{G0smIh7$soGqpvܹ jC.q[5 @0{.H=@t=#_E/聓_!hvh7PP9_66` OjNa8h5ZKIENDB`cardpeek-0.8/icons/folder.png0000644000175000017500000000036612155053152013160 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<sIDATXױ e/8"[X2d&M*Ml$a1tw?tj^9|;w?0@D:D^-ffKG|@@@F7%`_ IENDB`cardpeek-0.8/icons/cardpeek.png0000644000175000017500000001075312143757324013475 00000000000000PNG  IHDR00WsBIT|d pHYspMBtEXtSoftwarewww.inkscape.org<hIDATh{tUŽ?3{G'!,RV Kץ-).lTBX U[k)VG+E 6ŘK899gcYs3~f֚oS d ggggN4PQQq>ikkI Dv@7m@iEeeeSKKKg9;H$3777 N)E,shȑ#曯>3;ǩ6D6XVVv_?k̘1ZkQ[/[85!%}#CqeB>|__zׁ>ZLJJKK.^xф F8'Am$ǀ> ϐyGmxC 'O6qV̾r.Ÿ#1M=oذ-hZ_?| +Wwԩb[qϓۈ̜>K&dYD^SLAC"eSyXm$˘1m2~g ,_^^h3iG> P8cƌ}0`@=Xr lnj WMM8DHZ)fTT<+|xjjjzh?"z"qZ>0;sw/ G~;rM32lL30 @"DB )BkF+ױ_^op٤R)vuK.}8X#pʕ+͊F[-w>Ρ:{ͤ_ 0@H!0@H @ |iU$Zx- aÆeee?j^ !L䗿˖-[XU}T|G%̟syy4AR G@kZ tj4Jk\W*R ڴBVy |k׮}e #!\}?OZeLn1n TJvNAĐi|1hwTU8F)M߽6/# zkFg5꒍7XPP}ݿ/c8?ᕔ LLiH C`J١ !:IpwۮqQ *E]I֮#=sܹsoo+0lƍ/\zk4t4L?0!L$`  S L m0F)pF W 4[ lv4)E;G??ļҟgϞ_~E@of~iiԋ/x®{yjnH~D. 4#NH7\ S1 BGj? Zwi7&9'wF0U-ּw#.8ŋy䑇-Zk-!۷oyɵ?q ;"03ġnW0l0TVVF5SE]獝5"ek\ۢ˓)$䜢0j2eʿZLKΜ9'N,AbIM4kZcInbcĈt E{hҵq3y;I~֖IhBKhtlTٶo;6kŊl8(f;â&ф?ƍ;-ȥ璝%}E,hlS3cъp .@~bY4f̘~r'`}Wir2Ԧh%ky+C^殺%J,p2@zXbذaY3f&UVV65???Ji )E~ ,g9&4JAhUkEfAyCA=E<(9P00ٱcƟ{\s͏n DO~֚?ӓ4:8ʠ=Cn!f i@" x~7D3pf܀A"L )q,&/Y0>@ΨQ~QUMu]…e 4*-a-07<@4=&w}\)Eqa@շz(uxuTo&;WBKqaR455}&X)4ڵ7p@UL'MB9'|\h4,).x1V`SW/tvU^HknB(Ņb1@ȑ#_\z㆖E7JW[I0[;ā{;VZCzՕ=^ `_ph}hj]6u4֠Ϊle1t`k꫟@tN6mܬ. R(-8іe5vΔBfd;[dQeX)FzPn'LBAMM~ jO? jEO' VXee%78-Ƥ12xjoGg(cδ)BEE@q>|tܘ2_&I_ N9:ͣٷo_)FzrzfD}+C8B+`$_0n(^xa+H޸iӦ?Ɋg7թe(LMMi=e*:|8ʓj7 o4M;PϯZjK/sFJuvll*c:eVkDZ, ˲mpԚJ/L&;={{xyʌrn!̸bmۖY ]wusϭp\y* |D Tu>] MUhL<WxWd C}Tј1'=Оtll]= &|W^ysν L@gbk˖-L2Vfcd@(! 60!2P ++S*L \\WLDdƲ k\C<Оѩ6H5C1~re +}9˗/cǎVj,YY6$Ayٲl+bAlM"x2pDn )؄u2Iv,τM\2*ʨ?^cǎ>VOKΙ3g΃>e~EM/d`.r0dL2B&A8hS0Hi?(R:rIKrHZ'Du"B 7oy뭷)n+FӺu^\n#\xv`5NI'S. %L A:M{w&,4L9AKJ 6"\vYlٲ2+h&BYk׮}n̙D^dC0YAOAi H4e}Ѷc²ѩV0uFW^}ٛo tl1=oK}z J A7).5V:dp|e;X)l̻?m}饗nذaSAouK?ݿ Ͱ'}6=UZ$֝bۊ`[qrNqG~>)wyg[vĉ|MSH@ӧO[xǏuԴgA# `݄:66n*jG'ƊyS(tp۷;|hnB2k̙3;vl8,~ێPd@ !CH3&EڵQN}\fM´ FtltO> 6j@ $5x?aÆe塵c7J]c'l`@,P' >j@UU:vG6mZK/}?it\{?1bE ꓓ#rrrX#G~-}أ"ݎ 2_<!ifojj<=~ ˲Z8n2%IENDB`cardpeek-0.8/icons/application.png0000755000175000017500000000203112155053152014202 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXWK2[~9bEWǟ]1E "%D]]|@;E6A@-"i?@"j(,Jf|qyh*](~ _[{P(,,,DQ<`b(B`8DQNv쟆n2vwwdZ)ŞOMMb!X^^nie88VˠeH Ix^;N T*aϭ80 KKK$IvO0hna ؂`0Xv0NG[VLNN*I@OOq([\.<~ 0 Qy;;;j=,ހlǒ$a{{jAr\Z-\.z嚊אL&)_HpqqZ pGOOOr~֯h2CN$nnnaKRC QPj8==r2 VVVԝ" s̐t:h4*kZ:DWWD0 ϧ X"N7{d2p8|>'ۂ^^^p||;vttt(HHDťd5^AףP(yM ޾~n{CxP-y6~H;3߾X߄?CP+;}MIENDB`cardpeek-0.8/icons/block.png0000644000175000017500000000033712155053152012775 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<\IDATXA 0Dѱs(/kVE]"MbT&.i݇|5 !} V`h@f>ޏ'h{~Z ߎ7 мIENDB`cardpeek-0.8/lua_log.h0000644000175000017500000000160612160275534011663 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef LUA_LOG_H #include int luaopen_log(lua_State* L); #endif cardpeek-0.8/README0000644000175000017500000000244712120126144010740 00000000000000UTF-8 English/Français [EN] Cardpeek is a Linux tool to read the contents of ISO7816 smart cards. It features a GTK GUI to represent card data is a tree view, and is extendable with a scripting language (LUA). The goal of this project is to allow smart card owners to be better informed about what type of personal information is stored in these devices. The tool currently reads the contents of: * EMV cards * Calypso public transport cards (such as Navigo) * Moneo ePurse cards * Vitale 2 French health cards. * GSM cards (beta) See doc/cardpeek_ref.en.pdf for more details. L1L1@gmx.com [FR] Cardpeek est un outil de lecture de carte à puce avec une interface graphique basée sur GTK 2.0, fonctionnant sous GNU Linux et extensible par le langage de programmation LUA. Cardpeek est un outil qui a pour objectif de vous permettre d’accéder aux information personnelles contenues dans ces ces dispositifs. Dans cette version, l’application est capable de lire le contenu des cartes suivantes : * Les cartes bancaires EMV * Les cartes de transport parisien Navigo et certaines autres cartes similaires. * Les cartes Monéo * Les cartes 'Vitale 2' * Les cartes GSM (beta) Voir doc/cardpeek_ref.en.pdf pour plus de détails. L1L1@gmx.com cardpeek-0.8/gui.h0000644000175000017500000000265412160275534011031 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_H #define GUI_H int gui_init(int *argc, char ***argv); int gui_create(void); int gui_run(void); void gui_exit(void); void gui_update(unsigned lag_allowed); void gui_expand_view(void); char* gui_select_reader(unsigned list_size, const char** list); int gui_question_l(const char *message, unsigned item_count, const char** items); int gui_question(const char *message, ...); int gui_readline(const char *message, unsigned input_max, char* input); char** gui_select_file(const char *title, const char *path, const char *filename); void gui_set_title(const char *title); #endif cardpeek-0.8/cardpeek.10000644000175000017500000000334112137515465011732 00000000000000.TH CARDPEEK 1 .SH NAME cardpeek \- A gui tool to explore the contents of ISO 7816 smart cards. .SH SYNOPSIS .B cardpeek .RB [\fIoptions\fR] .SH DESCRIPTION .PP Cardpeek is a tool to read the contents of ISO7816 smart cards. It features a GTK GUI to represent card data is a tree view, and is extendable with a scripting language (LUA). .TP \fB\-r\fR, \fB\-\-reader\fR=\fIREADER\fR Connect to the reader identified by READER. .TP \fB\-e\fR, \fB\-\-exec\fR=\fICOMMAND\fR Execute the lua commands described in COMMAND. .TP \fB\-v\fR, \fB\-\-version\fR Print version info and list of detected smart card readers. .PP The goal of this project is to allow smart card owners to be better informed about what type of personal information is stored in these devices. This is not a real man-page, for more detailed information see included PDF documentation .B cardpeek_ref.en.pdf available online here: http://cardpeek.googlecode.com/files/cardpeek_ref.en.pdf or in your in your system .B doc/ directory (e.g. /usr/share/doc/cardpeek). .SH COPYRIGHT cardpeek is Copyright (c) 2009-2013 Alain Pannetrat. cardpeek is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. cardpeek is distributed in the hope that 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 http://www.gnu.org/licenses/. .SH AUTHORS Alain Pannetrat cardpeek-0.8/gui_flexi_cell_renderer.h0000644000175000017500000000321512160275534015077 00000000000000#ifndef GUI_FLEXI_CELL_RENDERER_H #define GUI_FLEXI_CELL_RENDERER_H /* This file is WORK IN PROGRESS */ /* it has not use in cardpeek yet */ #include #include "a_string.h" #define CUSTOM_TYPE_CELL_RENDERER_FLEXI (custom_cell_renderer_flexi_get_type()) #define CUSTOM_CELL_RENDERER_FLEXI(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), CUSTOM_TYPE_CELL_RENDERER_FLEXI, CustomCellRendererFlexi)) #define CUSTOM_CELL_RENDERER_FLEXI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CUSTOM_TYPE_CELL_RENDERER_FLEXI, CustomCellRendererFlexiClass)) #define CUSTOM_IS_CELL_FLEXI_FLEXI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CUSTOM_TYPE_CELL_RENDERER_FLEXI)) #define CUSTOM_IS_CELL_FLEXI_FLEXI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CUSTOM_TYPE_CELL_RENDERER_FLEXI)) #define CUSTOM_CELL_RENDERER_FLEXI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CUSTOM_TYPE_CELL_RENDERER_FLEXI, CustomCellRendererFlexiClass)) typedef struct _CustomCellRendererFlexi CustomCellRendererFlexi; typedef struct _CustomCellRendererFlexiClass CustomCellRendererFlexiClass; /* CustomCellRendererFlexi: Our custom cell renderer * structure. Extend according to need */ struct _CustomCellRendererFlexi { GtkCellRenderer parent; gboolean is_raw; a_string_t *raw_value; a_string_t *alt_text; a_string_t *mime_type; unsigned rendered_type; gpointer rendered_value; int default_width; }; struct _CustomCellRendererFlexiClass { GtkCellRendererClass parent_class; }; GType custom_cell_renderer_flexi_get_type (void); GtkCellRenderer *custom_cell_renderer_flexi_new (gboolean is_raw); #endif cardpeek-0.8/gui_readerview.c0000644000175000017500000001657712213657631013253 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui.h" #include "gui_readerview.h" #include "gui_toolbar.h" #include "smartcard.h" #include "a_string.h" #include "misc.h" #include "pathconfig.h" #include "lua_ext.h" #include "string.h" #include "iso7816.h" /*********************************************************/ /* THE INFAMOUS UGLY GLOBALS *****************************/ /*********************************************************/ GtkTextBuffer* READER_BUFFER=NULL; /*********************************************************/ /* MENU CALLBACK: only one here, others call lua stuff. */ /*********************************************************/ static void menu_readerview_save_as_cb(GtkWidget *w, gpointer user_data) { char** select_info; a_string_t *command; char *filename; UNUSED(w); UNUSED(user_data); select_info = gui_select_file("Save recorded data",path_config_get_string(PATH_CONFIG_FOLDER_REPLAY),"card.clf"); if (select_info[1]) { filename = luax_escape_string(select_info[1]); command=a_strnew(NULL); a_sprintf(command,"card.log_save(\"%s\")",filename); luax_run_command(a_strval(command)); a_strfree(command); g_free(select_info[0]); g_free(select_info[1]); g_free(filename); } } /*********************************************************/ /* CONSTRUTION OF MAIN UI ********************************/ /*********************************************************/ toolbar_item_t TB_READER_VIEW[] = { { "reader-view-connect", GTK_STOCK_CONNECT, "Connect", G_CALLBACK(gui_toolbar_run_command_cb), "card.connect()", "Connect a card to the reader." }, { "reader-view-reset", GTK_STOCK_REDO, "Reset", G_CALLBACK(gui_toolbar_run_command_cb), "card.warm_reset()", "Reset the card in the reader." }, { "reader-view-disconnect", GTK_STOCK_DISCONNECT, "Disconnect", G_CALLBACK(gui_toolbar_run_command_cb), "card.disconnect()", "Diconnect the card in the reader." }, { NULL, TOOLBAR_ITEM_SEPARATOR, NULL, NULL, NULL, NULL }, { "reader-view-clear", GTK_STOCK_CLEAR, "Clear", G_CALLBACK(gui_toolbar_run_command_cb), "card.log_clear()", "Clear the reader view." }, { "reader-view-save-as", GTK_STOCK_SAVE_AS, "Save replay", G_CALLBACK(menu_readerview_save_as_cb), NULL, "Save card/reader data exchange for later replay\nYou can then select a replay during application startup." }, { NULL, NULL, NULL, NULL, NULL, NULL } }; GtkWidget *gui_readerview_create_window(void) { GtkWidget *view; GtkWidget *scrolled_window; GtkWidget *base_container; GtkWidget *toolbar; PangoFontDescription *font_desc; /* Create base window container */ base_container = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); /* Create the toolbar */ toolbar = gui_toolbar_new(TB_READER_VIEW); gtk_box_pack_start (GTK_BOX (base_container), toolbar, FALSE, FALSE, 0); /* Create a new scrolled window, with scrollbars only if needed */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_end (GTK_BOX (base_container), scrolled_window, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); view = gtk_text_view_new (); font_desc = pango_font_description_from_string ("Monospace"); gtk_widget_modify_font (view, font_desc); pango_font_description_free (font_desc); gtk_container_add (GTK_CONTAINER (scrolled_window), view); /* Reader buffer */ READER_BUFFER = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); gtk_text_view_set_editable(GTK_TEXT_VIEW (view),FALSE); gtk_text_buffer_create_tag(READER_BUFFER,"green_text", "foreground","dark green", NULL); gtk_text_buffer_create_tag(READER_BUFFER,"blue_text", "foreground","dark blue", NULL); gtk_text_buffer_create_tag(READER_BUFFER,"red_text", "foreground","dark red", NULL); return base_container; } char HEX_CHAR[17]="0123456789ABCDEF"; static const char* hex_pretty_print(int indent, const bytestring_t *bs,int add_ascii) { static char retval[1500]; int i; int offset; int line; int sizebs=bytestring_get_size(bs); int linesize=indent+48+4+16+1; unsigned char e; if (sizebs==0) return "(nil)\n"; for (i=0;i>4; if (offset==0) { memset(retval+line*linesize,' ',linesize); retval[line*linesize+linesize-1]='\n'; retval[line*linesize+linesize]=0; } bytestring_get_element(&e,bs,i); retval[line*linesize+indent+offset*3]=HEX_CHAR[(e>>4)]; retval[line*linesize+indent+offset*3+1]=HEX_CHAR[e&0xF]; if (add_ascii) { if (e>=' ' && e<=126) retval[line*linesize+indent+52+offset]=e; else retval[line*linesize+indent+52+offset]='.'; } } return retval+indent; } void gui_readerview_print(unsigned event, const bytestring_t *command, unsigned short sw, const bytestring_t *response, void *extra_data) { const char* text; char buf[200]; GtkTextIter iter; UNUSED(extra_data); if (event==CARDREADER_EVENT_RESET || event==CARDREADER_EVENT_CONNECT) { gtk_text_buffer_get_iter_at_offset (READER_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(READER_BUFFER,&iter,"RSET ",-1,"red_text",NULL); text = hex_pretty_print(5,command,0); gtk_text_buffer_get_iter_at_offset (READER_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(READER_BUFFER,&iter,text,-1,"red_text",NULL); } else if (event==CARDREADER_EVENT_TRANSMIT) { gtk_text_buffer_get_iter_at_offset (READER_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(READER_BUFFER,&iter,"SEND ",-1,"green_text",NULL); text = hex_pretty_print(5,command,0); gtk_text_buffer_get_iter_at_offset (READER_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(READER_BUFFER,&iter,text,-1,"green_text",NULL); sprintf(buf,"RECV %04X # %s\n ",sw,iso7816_stringify_sw(sw)); gtk_text_buffer_get_iter_at_offset (READER_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(READER_BUFFER,&iter,buf,-1,"blue_text",NULL); text = hex_pretty_print(5,response,1); if (text) { gtk_text_buffer_get_iter_at_offset (READER_BUFFER,&iter,-1); gtk_text_buffer_insert_with_tags_by_name(READER_BUFFER,&iter,text,-1,"blue_text",NULL); } } else if (event==CARDREADER_EVENT_CLEAR_LOG) { gtk_text_buffer_set_text(READER_BUFFER,"",0); } gui_update(1); } void gui_readerview_cleanup(void) { READER_BUFFER=NULL; } cardpeek-0.8/system_info.c0000644000175000017500000000472212160275537012600 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "system_info.h" #ifndef _WIN32 #include #include #include "config.h" const char *system_string_info(void) { static char info[128]; char first_line[128]; FILE *cmd; char *p; if ((cmd=popen("uname -smr","r"))) { if (fgets(first_line,127,cmd)) { for (p=first_line;*p!='\0';p++) if (*p=='\r' || *p=='\n') { *p='\0'; break; } } else { strcpy(first_line,"Unknown os"); } if (pclose(cmd),0) { strcpy(first_line,"Unknown os"); } } else { strcpy(first_line,"Unknown os"); } snprintf(info,128,"Cardpeek %s on %s", VERSION, first_line); return info; } #else #include #include #include #include "win32/config.h" typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); const char *system_string_info(void) { static char info[128]; SYSTEM_INFO si; OSVERSIONINFOEX osvi; PGNSI GetNativeSystemInfo_func; memset(&si,0,sizeof(si)); memset(&osvi,0,sizeof(osvi)); osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx((OSVERSIONINFO*)&osvi); GetNativeSystemInfo_func = (PGNSI) GetProcAddress( GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); if (GetNativeSystemInfo_func!=NULL) GetNativeSystemInfo_func(&si); else GetSystemInfo(&si); snprintf(info,110,"Cardpeek %s on Windows NT_%u.%u (%s) ", VERSION, (unsigned)osvi.dwMajorVersion, (unsigned)osvi.dwMinorVersion, osvi.szCSDVersion); switch (si.wProcessorArchitecture) { case 9: strcat(info,"AMD64"); break; case 6: strcat(info,"IA64"); break; case 0: strcat(info,"x86"); break; default: strcat(info,"Unknown platform"); }; return info; } #endif cardpeek-0.8/gui_toolbar.c0000644000175000017500000000667512213657631012556 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui_toolbar.h" #include "string.h" #include "misc.h" #include "lua_ext.h" /*********************************************************/ /* EXPERIMENTAL ******************************************/ /*********************************************************/ /* GHashTable *WIDGET_TABLE = NULL; static guint stringhash(gconstpointer str) { const unsigned char *s = str; guint res=0; while (*s) { res = (res*27)+(*s); s++; } return res; } static gint stringcompare(gconstpointer a, gconstpointer b) { return (strcmp(a,b)==0); } static gboolean gui_widget_table_init(void) { WIDGET_TABLE = g_hash_table_new(stringhash,stringcompare); return TRUE; } static void gui_widget_table_release(void) { g_hash_table_destroy(WIDGET_TABLE); } #ifdef _DEAD_CODE_ static GtkWidget *gui_widget_table_lookup(const gchar *name) { return (GtkWidget *)g_hash_table_lookup(WIDGET_TABLE,name); } #endif static void gui_widget_table_insert(const gchar *name, const GtkWidget *widget) { g_hash_table_insert(WIDGET_TABLE,(gpointer)name,(gpointer)widget); } */ GtkWidget *gui_toolbar_new(toolbar_item_t *tbitems) { GtkWidget *toolbar; GtkToolItem *item; int i; toolbar = gtk_toolbar_new(); gtk_orientable_set_orientation (GTK_ORIENTABLE (toolbar), GTK_ORIENTATION_HORIZONTAL ); gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH); for (i=0; tbitems[i].icon!=NULL; i++) { if (strcmp(tbitems[i].icon,TOOLBAR_ITEM_SEPARATOR)==0) { item = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item),-1); } else if (strcmp(tbitems[i].icon,TOOLBAR_ITEM_EXPANDER)==0) { item = gtk_separator_tool_item_new(); gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM(item),FALSE); gtk_tool_item_set_expand(GTK_TOOL_ITEM(item),TRUE); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item),-1); } else { item = gtk_tool_button_new_from_stock (tbitems[i].icon); if (tbitems[i].text) gtk_tool_button_set_label(GTK_TOOL_BUTTON(item),tbitems[i].text); if (tbitems[i].callback) g_signal_connect(G_OBJECT(item),"clicked",G_CALLBACK(tbitems[i].callback),(gpointer)tbitems[i].callback_data); if (tbitems[i].tooltip) gtk_widget_set_tooltip_text(GTK_WIDGET(item),tbitems[i].tooltip); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item),-1); } /* if (tbitems[i].id) gui_widget_table_insert(tbitems[i].id, GTK_WIDGET(item)); */ } return toolbar; } void gui_toolbar_run_command_cb(GtkWidget *w, gconstpointer user_data) { UNUSED(w); if (user_data) luax_run_command((char *)user_data); else log_printf(LOG_ERROR,"No command to execute"); } cardpeek-0.8/gui_inprogress.c0000644000175000017500000000721412213657631013275 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui.h" #include "gui_inprogress.h" #include "misc.h" /*********************************************************/ /* LOG FUNCTIONS AND UI CALLBACKS ************************/ /*********************************************************/ typedef struct { unsigned in_progress; GtkWidget *progress_bar; } progress_info_t; static void internal_inprogress_response_cb(GtkDialog *dialog, gint response_id, gpointer user_data) { progress_info_t *progress = user_data; UNUSED(dialog); UNUSED(response_id); progress->in_progress = 0; } GtkWidget* gui_inprogress_new(const char *title, const char *message) { GtkWidget *dialog; GtkWidget *label; GtkWidget *content_area; GtkWidget *progress_bar; GtkWidget *vbox; progress_info_t *progress; dialog = gtk_dialog_new_with_buttons (title, NULL, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); progress = g_malloc(sizeof(progress_info_t)); progress->in_progress = 1; g_object_set_data(G_OBJECT(dialog),"progress",progress); content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,16); gtk_container_set_border_width(GTK_CONTAINER(vbox),16); label = gtk_label_new (message); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); progress_bar = gtk_progress_bar_new(); gtk_box_pack_end (GTK_BOX (vbox), progress_bar, FALSE, FALSE, 0); progress->progress_bar = progress_bar; g_signal_connect (dialog, "response", G_CALLBACK (internal_inprogress_response_cb), progress); g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_true), NULL); gtk_container_add (GTK_CONTAINER (content_area), vbox); gtk_widget_show_all (dialog); return dialog; } unsigned gui_inprogress_pulse(GtkWidget *dialog) { progress_info_t *progress = g_object_get_data(G_OBJECT(dialog),"progress"); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progress->progress_bar)); gui_update(0); return progress->in_progress; } unsigned gui_inprogress_set_fraction(GtkWidget *dialog, gdouble level) { progress_info_t *progress = g_object_get_data(G_OBJECT(dialog),"progress"); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress->progress_bar),level); gui_update(0); return progress->in_progress; } void gui_inprogress_free(GtkWidget *dialog) { progress_info_t *progress = g_object_get_data(G_OBJECT(dialog),"progress"); g_free(progress); gtk_widget_destroy(dialog); } cardpeek-0.8/gui_scratchpad.h0000644000175000017500000000173712160275534013226 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef GUI_SCRATCHPAD_H #define GUI_SCRATCHPAD_H #include GtkWidget *gui_scratchpad_create_window(void); void gui_scratchpad_cleanup(void); #endif cardpeek-0.8/asn1.h0000644000175000017500000000314012160275534011076 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #ifndef ASN1_H #define ASN1_H #include "bytestring.h" int asn1_force_single_byte_length_parsing(int enable); int asn1_skip_tlv(unsigned* pos, const bytestring_t* tlvlist); int asn1_decode_tag(unsigned* pos, const bytestring_t* tlv, unsigned* tag); int asn1_decode_length(unsigned* pos, const bytestring_t* tlv, unsigned* len); int asn1_skip_value(unsigned* pos, const bytestring_t* lv); int asn1_decode_value(unsigned* pos, const bytestring_t* lv, bytestring_t* val); int asn1_decode_tlv(unsigned* pos, const bytestring_t* tlv, unsigned *tag, bytestring_t* val); int asn1_encode_tag(unsigned tag, bytestring_t* bertag); int asn1_encode_tlv(unsigned tag, const bytestring_t* val, bytestring_t* bertlv); int asn1_parse_path(const char* path, const bytestring_t* src, bytestring_t* val); #endif cardpeek-0.8/bytestring.c0000644000175000017500000004144212160275537012433 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ /* #include "misc.h" */ #include "bytestring.h" #include #include #include #ifndef _WIN32 #include #endif #include "misc.h" #include "a_string.h" int bytestring_init(bytestring_t *bs, unsigned element_width) { unsigned char mask; if (bs==NULL) return BYTESTRING_ERROR; switch (element_width) { case 1: mask=1; break; case 4: mask=0x0F; break; case 8: mask=0xFF; break; default: return BYTESTRING_ERROR; } bs->len=0; bs->alloc=0; bs->data=NULL; bs->width=element_width; bs->mask=mask; return BYTESTRING_OK; } bytestring_t* bytestring_new(unsigned element_width) { bytestring_t *res=(bytestring_t*)malloc(sizeof(bytestring_t)); if (bytestring_init(res,element_width)!=BYTESTRING_OK) { if (res) free(res); return NULL; } return res; } static unsigned hex_nibble(const char nibble) { if (nibble<='9' && nibble>='0') return nibble-'0'; if (nibble<='F' && nibble>='A') return nibble-'A'+10; if (nibble<='f' && nibble>='a') return nibble-'a'+10; return BYTESTRING_NPOS; } bytestring_t* bytestring_new_from_string(const char *str) { unsigned width; bytestring_t *dat; if (str==NULL) return NULL; switch (*str) { case '8': width=8; break; case '4': width=4; break; case '1': width=1; break; default: return NULL; } str++; if (*str!=':') return NULL; dat=bytestring_new(width); bytestring_assign_digit_string(dat,++str); return dat; } bytestring_t* bytestring_duplicate(const bytestring_t *bs) { bytestring_t* res=bytestring_new(bs->width); bytestring_assign_data(res,bs->len,bs->data); return res; } int bytestring_assign_data(bytestring_t* bs, unsigned len, const unsigned char *data) { unsigned i; bytestring_resize(bs,len); for (i=0;idata[i]=data[i]&bs->mask; return BYTESTRING_OK; } int bytestring_assign_element(bytestring_t* bs, unsigned len, unsigned char c) { bytestring_resize(bs,len); memset(bs->data,c&bs->mask,len); return BYTESTRING_OK; } int bytestring_assign_digit_string(bytestring_t* bs, const char *str) { unsigned str_len; unsigned value; unsigned state; unsigned i; unsigned c; if (str==NULL) return BYTESTRING_ERROR; str_len = strlen(str); bytestring_clear(bs); if (bs->width==8) { state=0; value=0; for (i=0;iwidth=src->width; bs->mask=src->mask; return bytestring_assign_data(bs,src->len,src->data); } return BYTESTRING_OK; } static int bs_convert_8_to_4(bytestring_t *bs, const bytestring_t *src) { unsigned u; bytestring_resize(bs,src->len*2); for (u=0;ulen;u++) { bs->data[u*2]=src->data[u]>>4; bs->data[u*2+1]=src->data[u]&0xF; } return BYTESTRING_OK; } static int bs_convert_8_to_1(bytestring_t *bs, const bytestring_t *src) { unsigned u; unsigned char c; bytestring_resize(bs,src->len*8); for (u=0;ulen;u++) { c=src->data[u]; bs->data[u*8]=((c&128)>>7)&0x1; bs->data[u*8+1]=((c&64)>>6)&0x1; bs->data[u*8+2]=((c&32)>>5)&0x1; bs->data[u*8+3]=((c&16)>>4)&0x1; bs->data[u*8+4]=((c&8)>>3)&0x1; bs->data[u*8+5]=((c&4)>>2)&0x1; bs->data[u*8+6]=((c&2)>>1)&0x1; bs->data[u*8+7]=c&0x1; } return BYTESTRING_OK; } static int bs_convert_4_to_1(bytestring_t *bs, const bytestring_t *src) { unsigned u; unsigned char c; bytestring_resize(bs,src->len*4); for (u=0;ulen;u++) { c=src->data[u]; bs->data[u*4]=((c&8)>>3)&0x1; bs->data[u*4+1]=((c&4)>>2)&0x1; bs->data[u*4+2]=((c&2)>>1)&0x1; bs->data[u*4+3]=c&0x1; } return BYTESTRING_OK; } static int bs_convert_4_to_8(bytestring_t *bs, const bytestring_t *src) { unsigned des_i; unsigned src_i; bytestring_resize(bs,(src->len+1)/2); if ((src->len&1)==1) { bs->data[0]=src->data[0]; des_i=1; src_i=1; } else { des_i=0; src_i=0; } while (src_ilen) { bs->data[des_i]=src->data[src_i]<<4; bs->data[des_i]+=src->data[src_i+1]; des_i+=1; src_i+=2; } return BYTESTRING_OK; } static int bs_convert_1_to_8(bytestring_t *bs, const bytestring_t *src) { unsigned src_i; unsigned dst_i; bytestring_resize(bs,(src->len+7)/8); if ((src->len&7)!=0) { bs->data[0]=0; for (src_i=0;src_i<(src->len&7);src_i++) { bs->data[0]<<=1; bs->data[0]|=src->data[src_i]; } dst_i=1; } else { src_i=0; dst_i=0; } while (src_ilen) { bs->data[dst_i] =src->data[src_i++]<<7; bs->data[dst_i]|=src->data[src_i++]<<6; bs->data[dst_i]|=src->data[src_i++]<<5; bs->data[dst_i]|=src->data[src_i++]<<4; bs->data[dst_i]|=src->data[src_i++]<<3; bs->data[dst_i]|=src->data[src_i++]<<2; bs->data[dst_i]|=src->data[src_i++]<<1; bs->data[dst_i]|=src->data[src_i++]; dst_i++; } return BYTESTRING_OK; } static int bs_convert_1_to_4(bytestring_t *bs, const bytestring_t *src) { unsigned src_i; unsigned dst_i; bytestring_resize(bs,(src->len+3)/4); if ((src->len&3)!=0) { bs->data[0]=0; for (src_i=0;src_i<(src->len&3);src_i++) { bs->data[0]<<=1; bs->data[0]|=src->data[src_i]; } dst_i=1; } else { src_i=0; dst_i=0; } while (src_ilen) { bs->data[dst_i] =src->data[src_i++]<<3; bs->data[dst_i]|=src->data[src_i++]<<2; bs->data[dst_i]|=src->data[src_i++]<<1; bs->data[dst_i]|=src->data[src_i++]; dst_i++; } return BYTESTRING_OK; } int bytestring_convert(bytestring_t *bs, const bytestring_t *src) { unsigned algo; bytestring_t* tmp; int retval; if (bs==src) { tmp=bytestring_duplicate(src); retval=bytestring_convert(bs,tmp); bytestring_free(tmp); return retval; } algo=src->width*10+bs->width; switch (algo) { case 11: case 44: case 88: return bytestring_copy(bs,src); case 14: return bs_convert_1_to_4(bs,src); case 18: return bs_convert_1_to_8(bs,src); case 41: return bs_convert_4_to_1(bs,src); case 48: return bs_convert_4_to_8(bs,src); case 81: return bs_convert_8_to_1(bs,src); case 84: return bs_convert_8_to_4(bs,src); } return BYTESTRING_ERROR; } int bytestring_append(bytestring_t *bs, const bytestring_t *extra) { bytestring_t* tmp; int retval; if (bs==extra) { tmp=bytestring_duplicate(extra); retval=bytestring_append(bs,tmp); bytestring_free(tmp); return retval; } return bytestring_append_data(bs,extra->len,extra->data); } int bytestring_append_data(bytestring_t *bs, unsigned len, const unsigned char *data) { unsigned i; unsigned old_len=bs->len; bytestring_resize(bs,bs->len+len); for (i=0;idata[old_len+i]=data[i]&bs->mask; return BYTESTRING_OK; } int bytestring_append_element(bytestring_t* bs, unsigned len, unsigned char c) { unsigned i; unsigned old_len=bs->len; bytestring_resize(bs,bs->len+len); for (i=0;idata[old_len+i]=c&bs->mask; return BYTESTRING_OK; } int bytestring_pushback(bytestring_t *bs, unsigned char c) { unsigned old_len=bs->len; bytestring_resize(bs,bs->len+1); bs->data[old_len]=c&bs->mask; return BYTESTRING_OK; } int bytestring_get_element(unsigned char* element, const bytestring_t *bs, int pos) { if (pos<0) pos=(int)bs->len+pos; if (pos<(int)bs->len && pos>=0) { *element=bs->data[pos]; return BYTESTRING_OK; } *element=0; return BYTESTRING_ERROR; } int bytestring_set_element(const bytestring_t *bs, int pos, unsigned char element) { if (pos<0) pos=(int)bs->len+pos; if (pos<(int)bs->len && pos>=0) { bs->data[pos]=element&bs->mask; return BYTESTRING_OK; } return BYTESTRING_ERROR; } int bytestring_invert(bytestring_t *bs) { unsigned last=bs->len-1; unsigned c; unsigned char extra; for (c=0;clen/2;c++) { extra=bs->data[last-c]; bs->data[last-c]=bs->data[c]; bs->data[c]=extra; } return BYTESTRING_OK; } void bytestring_clear(bytestring_t *bs) { bs->len=0; } const unsigned char *bytestring_get_data(const bytestring_t *bs) { return bs->data; } int bytestring_erase(bytestring_t *bs, unsigned pos, unsigned len) { if (pos>=bs->len) return BYTESTRING_OK; if (pos+len>=bs->len) return bytestring_resize(bs,pos); memmove(bs->data+pos,bs->data+pos+len,bs->len-pos-len); bytestring_resize(bs,bs->len-len); return BYTESTRING_OK; } int bytestring_is_equal(const bytestring_t *a, const bytestring_t *b) { unsigned u; if (a->width!=b->width) return 0; if (a->len!=b->len) return 0; for (u=0;ulen;u++) if (a->data[u]!=b->data[u]) return 0; return 1; } int bytestring_is_empty(const bytestring_t *bs) { return bs->len==0; } int bytestring_is_printable(const bytestring_t *bs) { unsigned u; if (bs->len==0) return 0; for (u=0;ulen;u++) { if (bs->data[u]>127 || !isprint((char)(bs->data[u]))) return 0; } return 1; } int bytestring_insert_data(bytestring_t *bs, unsigned pos, unsigned len, const unsigned char* data) { unsigned u; if (pos>=bs->len) return bytestring_append_data(bs,len,data); bytestring_resize(bs,bs->len+len); memmove(bs->data+pos+len,bs->data+pos,bs->len-pos); for (u=0;udata[pos+u]=data[u]&bs->mask; return BYTESTRING_OK; } int bytestring_insert_element(bytestring_t *bs, unsigned pos, unsigned len, unsigned char c) { unsigned u; if (pos>=bs->len) return bytestring_append_element(bs,len,c); bytestring_resize(bs,bs->len+len); memmove(bs->data+pos+len,bs->data+pos,bs->len-len-pos); for (u=0;udata[pos+u]=c&bs->mask; return BYTESTRING_OK; } int bytestring_insert(bytestring_t *bs, unsigned pos, const bytestring_t *src) { bytestring_t* tmp; int retval; if (bs==src) { tmp=bytestring_duplicate(src); retval=bytestring_insert(bs,pos,tmp); bytestring_free(tmp); return retval; } return bytestring_insert_data(bs,pos,src->len,src->data); } int bytestring_pad_left(bytestring_t *bs, unsigned block_size, unsigned char c) { unsigned pad = block_size-(bs->len%block_size); if (pad==block_size) return BYTESTRING_OK; return bytestring_insert_element(bs,0,pad,c); } int bytestring_pad_right(bytestring_t *bs, unsigned block_size, unsigned char c) { unsigned pad = block_size-(bs->len%block_size); if (pad==block_size) return BYTESTRING_OK; return bytestring_append_element(bs,pad,c); } int bytestring_resize(bytestring_t *bs, unsigned len) { if (len>bs->len) { if (len>bs->alloc) { if (bs->alloc==0) { bs->alloc=(len<8?8:len); bs->data=(unsigned char *)malloc(bs->alloc); } else { while (bs->allocalloc<<=1; bs->data=(unsigned char *)realloc(bs->data,bs->alloc); if (bs->data==NULL) { bs->alloc=0; return BYTESTRING_ERROR; } } } } bs->len=len; return BYTESTRING_OK; } unsigned bytestring_get_size(const bytestring_t *bs) { return bs->len; } int bytestring_substr(bytestring_t* dst, unsigned pos, unsigned len, const bytestring_t *src) { bytestring_t* tmp; int retval; if (dst==src) { tmp=bytestring_duplicate(src); retval=bytestring_substr(dst,pos,len,tmp); bytestring_free(tmp); return retval; } if (pos>src->len) { bytestring_clear(dst); return BYTESTRING_ERROR; } if (len==BYTESTRING_NPOS || pos+len>src->len) len = src->len-pos; return bytestring_assign_data(dst,len,src->data+pos); } static void x_bytestring_append_as_printable(a_string_t* dest, const bytestring_t *bs) { unsigned u; char octal_form[5]; for (u=0;ulen;u++) { if (bs->data[u]>127 || !isprint((char)(bs->data[u]))) { sprintf(octal_form,"\\%03o",bs->data[u]); a_strcat(dest,octal_form); } else a_strpushback(dest,(char)(bs->data[u])); } } const char HEXA[]="0123456789ABCDEF"; static void x_bytestring_append_as_digits(a_string_t* dest, const bytestring_t *bs) { unsigned i; if (bs->width==8) { for (i=0;ilen;i++) { a_strpushback(dest,HEXA[(bs->data[i]>>4)&0xF]); a_strpushback(dest,HEXA[bs->data[i]&0xF]); } } else { for (i=0;ilen;i++) a_strpushback(dest,HEXA[bs->data[i]&0xF]); } } static int x_bytestring_set(bytestring_t *bs, unsigned bs_index, unsigned char v) { if (bs_index>=bs->len) bytestring_resize(bs,bs_index+1); bs->data[bs_index]=v; return BYTESTRING_OK; } static unsigned x_bytestring_get(bytestring_t *bs, unsigned bs_index) { if (bs_index>=bs->len) return 0; return (unsigned)bs->data[bs_index]; } static int x_bytestring_decimal_mul_add(bytestring_t *bs, unsigned mul_v, unsigned add_v) { unsigned r; int bs_index; int i; for (bs_index=bs->len-1;bs_index>=0;bs_index--) { r=((unsigned)bs->data[bs_index])*mul_v; x_bytestring_set(bs,bs_index,r%10); r/=10; i=1; while (r) { r+=x_bytestring_get(bs,bs_index+i); if (x_bytestring_set(bs,bs_index+i,r%10)!=BYTESTRING_OK) return BYTESTRING_ERROR; r/=10; i++; } } r=x_bytestring_get(bs,0)+add_v; x_bytestring_set(bs,0,r%10); r/=10; i=1; while (r) { r+=x_bytestring_get(bs,i); if (x_bytestring_set(bs,i,r%10)!=BYTESTRING_OK) return BYTESTRING_ERROR; r/=10; i++; } return BYTESTRING_OK; } static void x_bytestring_append_as_integer(a_string_t *dest, const bytestring_t *bs) { bytestring_t *b10; unsigned i; if (bs->len==0) return; b10 = bytestring_new(8); bytestring_pushback(b10,0); for (i=0;ilen;i++) x_bytestring_decimal_mul_add(b10,1<<(bs->width),bs->data[i]); for (i=0;ilen;i++) a_strpushback(dest,b10->data[b10->len-1-i]+'0'); bytestring_free(b10); } char *bytestring_to_format(const char *format, const bytestring_t *bs) { char tmp[10]; a_string_t *s=a_strnew(NULL); while (*format) { if (*format!='%') a_strpushback(s,*format); else { format++; switch (*format) { case '%': a_strpushback(s,'%'); break; case 'I': x_bytestring_append_as_integer(s,bs); break; case 'D': x_bytestring_append_as_digits(s,bs); break; case 'S': a_strpushback(s,'0'+bs->width); a_strpushback(s,':'); x_bytestring_append_as_digits(s,bs); break; case 'w': a_strpushback(s,'0'+bs->width); break; case 'P': x_bytestring_append_as_printable(s,bs); break; case 'C': a_strncat(s,bs->len,(char *)bs->data); break; case 'l': sprintf(tmp,"%i",bs->len); a_strcat(s,tmp); break; case 0: goto end_this_function; default: log_printf(LOG_WARNING,"bytestring_to_format() does not recognize %%%c as a format identifier",*format); } } format++; } end_this_function: return a_strfinalize(s); } double bytestring_to_number(const bytestring_t *bs) { unsigned i; unsigned coef = 0; double res = 0; if (bs->len==0) return 0; coef = 1<<(bs->width); for (i=0;ilen;i++) res = (res*coef)+bs->data[i]; return res; } void bytestring_release(bytestring_t *bs) { if (bs->data) free(bs->data); bs->data=NULL; } void bytestring_free(bytestring_t *bs) { bytestring_release(bs); free(bs); } cardpeek-0.8/config.guess0000755000175000017500000012743211764422452012420 00000000000000#! /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, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-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, 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 Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 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 tuples: *-*-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'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) 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:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-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*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-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 ;; 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 if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} 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 ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx 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: cardpeek-0.8/INSTALL0000644000175000017500000000255112110364466011117 00000000000000UTF-8 English/Français [EN] Instructions: 1. Make sure you have the following development packages installed: * libgtk 2.0 (http://www.gtk.org) * liblua 5.1 (http://www.lua.org) * libpcsclite (http://pcsclite.alioth.debian.org/) * libssl (http://www.openssl.org/) (Note: On a Debian system, these packages are all available through apt/aptitude.) 2. Unpack the source if needed and change directory to the source directory. 3. Type './configure' (see './configure --help' for more options) 4. Type 'make' 5. As root, type 'make install' (or do 'sudo make install') See doc/carpeek_ref.en.pdf for more details [FR] Instructions: 1. Vérifier que les outils de développement suivants sont intallés: * libgtk 2.0 (http://www.gtk.org) * liblua 5.1 (http://www.lua.org) * libpcsclite (http://pcsclite.alioth.debian.org/) * libssl (http://www.openssl.org/) (Note: Sur un système Debian, ces outils sont tous disponibles avec apt/aptitude.) 2. Dépaqueter le code source si nécessaire et se placer dans le répertoire contenant le code source. 3. Taper './configure' (voir './configure --help' pour plus d'options) 4. Taper 'make' 5. En tant que root, taper 'make install' (ou faire 'sudo make install') Voir doc/cardpeek_ref.en.pdf pour plus de détails. cardpeek-0.8/gui_about.c0000644000175000017500000000476712213657631012226 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include "gui_about.h" #include #ifndef _WIN32 #include "config.h" #else #include "win32/config.h" /*#include "win32/win32compat.h"*/ #endif const char* LICENSE="CARDPEEK is free software: you can redistribute it and/or modify it under the terms of the GNU " "General Public License as published by the Free Software Foundation, either version 3 of the " "License, or (at your option) any later version.\n\n" "As an exemption to the GNU General Public License, compiling, linking, and/or using OpenSSL is " "allowed.\n\n" "CARDPEEK is distributed in the hope that 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.\n\n" "You should have received a copy of the GNU General Public License along with this program. If " "not, see http://www.gnu.org/licenses/."; void gui_about(void) { GBytes* authors_bytes; gsize size; const char *authors[2]; authors_bytes = g_resources_lookup_data("/cardpeek/AUTHORS",G_RESOURCE_LOOKUP_FLAGS_NONE,NULL); authors[0] = (const char *)g_bytes_get_data(authors_bytes,&size); authors[1] = NULL; gtk_show_about_dialog(NULL, "program-name", "cardpeek", "version", VERSION, "license", LICENSE, "wrap-license", TRUE, "authors", authors, "comments", "Cardpeek is a tool to read the contents of smart cards.", "copyright", "Copyright Alain Pannetrat ", "website", "https://cardpeek.googlecode.com", "website-label", "https://cardpeek.googlecode.com", NULL); } cardpeek-0.8/dyntree_model.h0000644000175000017500000001075712160275534013102 00000000000000#ifndef dyntree_model_h #define dyntree_model_h #include #define DYNTREE_MODEL_TYPE (dyntree_model_get_type()) #define DYNTREE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),DYNTREE_MODEL_TYPE, DyntreeModel)) #define DYNTREE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DYNTREE_MODEL, DyntreeModelClass)) #define DYNTREE_IS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DYNTREE_MODEL_TYPE)) #define DYNTREE_IS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DYNTREE_MODEL_TYPE)) #define DYNTREE_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DYNTREE_MODEL_TYPE, CustomListClass)) enum { CC_CLASSNAME = 0, /* 0 */ CC_LABEL, CC_ID, CC_SIZE, CC_VAL, CC_ALT, /* 5 */ CC_MIME_TYPE, /* 6 */ CC_INITIAL_COUNT /* 7 */ }; typedef struct { char *name; } DyntreeModelAttributeDescriptor; typedef struct { char *value; } DyntreeModelAttributeValue; typedef struct _DyntreeModelNode { struct _DyntreeModelNode *parent; struct _DyntreeModelNode *prev; struct _DyntreeModelNode *next; struct _DyntreeModelNode *children; DyntreeModelAttributeValue *attributes; int max_attributes; int sibling_index; int n_children; } DyntreeModelNode; typedef struct { GObject parent; DyntreeModelNode *root; /* extras */ GHashTable *columns_by_name; DyntreeModelAttributeDescriptor *columns_by_index; gint n_columns; gint max_columns; gint stamp; } DyntreeModel; typedef struct { GObjectClass parent_class; } DyntreeModelClass; typedef gboolean (* DyntreeModelFunc)(DyntreeModel *, GtkTreeIter *, gpointer); GType dyntree_model_get_type(void); /***** USER FUNCS *****/ /* Creating our model */ DyntreeModel *dyntree_model_new (void); /* Adding columns to our model */ int dyntree_model_column_register(DyntreeModel *ctm, const char *column_name); int dyntree_model_column_name_to_index(DyntreeModel *ctm, const char *column_name); const char *dyntree_model_column_index_to_name(DyntreeModel *ctm, int index); gint dyntree_model_get_n_columns (GtkTreeModel *tree_model); /* Setting attributes */ gboolean dyntree_model_iter_attribute_set(DyntreeModel *m, GtkTreeIter *iter, int index, const char *str); gboolean dyntree_model_iter_attribute_set_by_name(DyntreeModel *m, GtkTreeIter *iter, const char *attr_name, const char *str); gboolean dyntree_model_iter_attributes_setvalist(DyntreeModel *ctm, GtkTreeIter *iter, va_list al); gboolean dyntree_model_iter_attributes_set(DyntreeModel *ctm, GtkTreeIter *iter, ...); /* Reading attributes */ gboolean dyntree_model_iter_attribute_get(DyntreeModel *m, GtkTreeIter *iter, int index, const char **str); gboolean dyntree_model_iter_attribute_get_by_name(DyntreeModel *m, GtkTreeIter *iter, const char *attr_name, const char **ptr); gboolean dyntree_model_iter_attributes_getvalist(DyntreeModel *ctm, GtkTreeIter *iter, va_list al); gboolean dyntree_model_iter_attributes_get(DyntreeModel *ctm, GtkTreeIter *iter, ...); /* Removing a node */ gboolean dyntree_model_iter_remove(DyntreeModel *ctm, GtkTreeIter *iter); void dyntree_model_iter_clear(DyntreeModel *ctm); /* Adding a node */ void dyntree_model_iter_append (DyntreeModel *ctm, GtkTreeIter *child, GtkTreeIter *parent); /* Testing if empty */ #define dyntree_model_is_empty(ctm) (ctm->root==NULL) /* exporting/importing XML */ char* dyntree_model_iter_to_xml(DyntreeModel *ctm, GtkTreeIter *root, gboolean full_xml); /* result (char*) must be freed with g_free() */ gboolean dyntree_model_iter_to_xml_file(DyntreeModel* ct, GtkTreeIter *root, const char *fname); gboolean dyntree_model_iter_from_xml(DyntreeModel *ct, GtkTreeIter *parent, gboolean full_xml, const char *source_val, int source_len); gboolean dyntree_model_iter_from_xml_file(DyntreeModel *ct, GtkTreeIter *parent, const char *fname); /* searching */ gboolean dyntree_model_iter_find_first(DyntreeModel *ctm, GtkTreeIter *result, GtkTreeIter *root, int *indices, char **str, int n_values); gboolean dyntree_model_iter_find_next(DyntreeModel *ctm, GtkTreeIter *result, GtkTreeIter *root, int *indices, char **str, int n_values); /* iterating */ gboolean dyntree_model_foreach(DyntreeModel *ctm, GtkTreeIter *root, DyntreeModelFunc func, gpointer user_data); #endif cardpeek-0.8/aclocal.m40000644000175000017500000012262212213660061011722 00000000000000# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # 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|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) 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. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have 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_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) 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 AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [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])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [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 .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2009, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # (`yes' being less verbose, `no' or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR cardpeek-0.8/doc/0000755000175000017500000000000012214321142010675 500000000000000cardpeek-0.8/doc/cardpeek_ref.en.pdf0000644000175000017500000235302712214320473014345 00000000000000%PDF-1.4 %äüöß 2 0 obj <> stream xuRMk0 W<++CҦ] =ݶ>hwߟdX,&8# [@t# o %5{jj-CׁC{4hSC=:צ͠ ~NG6k9.p.KT| -Ԙ =FA[&iY rRw\>5VJhJ 8x}U$s ؉YCFV+PQ] !!メ >Kʯ5SHퟎib6GB4{ZﴻTӪDyyQ]le>9Sfl9nGM6a endstream endobj 3 0 obj 343 endobj 4 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 5 0 obj <> endobj 7 0 obj <> stream x]Ko6W\^>D ,@> %?"{ B$} ň,=|)D!/Ә*l)/?{˃Vm4~x ?] V+0\jW=cxiC'X.l׿|xxzyJVͲqe!;ɲZ+֋r%5,) Y B@$^[@g 46۪r# 9eū ]\ 71k,v9NX?Dh(ОUvI(q*'R3P[]jYTM%0@Bxtp⨰qlQґ^QptL=zjJ=!R2ÌxK@ъFn@@V=v e"Ъ:ZO~RJEQ* _qVe7aTY#㕈S;jA+Dm0;Y |#<ҝlvց^n)huŮ4=}v|)ǔMU8u׵YUtau] sç;xqt[DJ".#]O@曃ƁÓK%R]g;m3DY.#Di -{]nNXS,3;Dž!t&?AE 1OA*ujݰ1>9je./&CWj2Lc->zp3RUe R(>FЀF-) QT)Y*Ә3;\377EҬaُ{i#ZE.M{Qu|l}(t`di,g.Vƈ *:2M<ʅ jEtdDǨ 41E6N%zn\Lo-MPŲsdyL`,txo8 oY׽`T!3?P.ؘ֡RMn3JEݓݙ8Q$優i3o5U{S[md4B,b[>p,3k6\g *R>&C~UW-4n*BЅ8dTx췿7iSش5n~{TTKiԬy&f2FqfY{V*I$9cT/Ltƪ8a=0idf4KfĨj^"dRwsᨿol'Q!.Erjq9O̵y<83ZtLnlq~ϯq'(쑑h9 S;q wHx $#TYT WW,b: ,~ʰTؘc&t>!UnM4L {Q&"TrkԄE.pxB?*qPN>,%%z!ݷLh@HZ3Ğ8a{l3;o*> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 10 0 obj <> endobj 12 0 obj <> stream x]K6 ϯ@Ö 2N=l;@Eo}Eп_Rc;h'$άwڙXh$|,X묲j]ey/?T]Ëʔ^qroUɟ+٨O7+Q~wyO<}|}t$^zm@{0=B.a@V9 + 㭶$׎/A߯"tie30˫uq /Ƶ BIU^oWjY%L([th+y@) ~="i"ƕ weyw`_Oe}*l`z ?pnhBN/PX}&c;? ^$1ƨu& Z΃_{ <b"ihǏm=F-(?SQU@?03MFyUMh_AN TP$Ta^u/aњȊ0ͪaܵ.U `, r6nGzۃ 4TRT&Ջ+]KZO E|FTrP ?d.uى&;KZ[4 zL!{ua_g^ϳ{)f] D^0.YhĤ>0+7؅UE1:\08-r/~uOqMKeBgT-CES6IX[ё^\D܈%!#(?DQ?r@ gO*SjkEƣ59]ȓTIQQ@7A k ߯u۔Ly:P0MxL"‰rX+1X+ 䚺ZڳP޵eJ0xD Zh?)*C6_ W~a4=S?\*ݺtd(hQHSb+=C3{iܞ=!:M糤7Z2`y9D9\lL!$ ‚\[7ԹEd+is SNXLS n cw$iRAײ# coO*.wr,Α 8zՓ@l)13ք8x֙ZV}D: ٵ.YN+ !~D!qeuO e:7h1Zq:*o/B;IpWfB> 31s}p""OjVNmq^F2L݄TYN\`sݽ n 1)̈ 2|B+<_+c;{4`6e|ltq,?%im2A[.*rJs=&gy|&8!ߺ 0BEwuA)eZǺs6<#Ȭ`6 0=NknGX80DmG 1JLNNs^fIs l@^(p;\øB:.4iiU(zŬ> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 15 0 obj <> endobj 17 0 obj <> stream x]K6й$ 0x׻f@C~3pD) W}ΐN*-I>Uԉ5ji<|)/6jeiY{E%J'L]uW^hY**J:[pGk*UzR G,J ;ϯwPֲB`qs} u`՛ЃāDq>:ON_dx/czŊH(n1QPON%j*S۪A-AwgRPGeΊ9H2P[]5\[eQO1>{fnw-LEQs~ZI0ц!_ŻMDY$]@AǗj#Z[;'!_S Ȱgʤ$~Qʮ6OiJKp\`z;e." 8! " Beu,l7mfP0Q$0QO y@ucx +@㿋+C滿 Eaa(ץ֎|ƅLKYqnYTMBRQ]s 4=m"͡2j|:M58qcvx4=UQ˂FTSZ)֏Ӟmw $ LvQ4H9K_\Ue)( gәBI cmh)SGVs9@-&l}[.z!EIVP rrF_K&"JgCPmU#N#8i7d.3r%"N,f/L앖fv{(y-(g8HއNqF+^SU t ʥƅڮBo 2N_|EQ (H2tFndBaWl燷 Ν(~n!,]o;–Jyc7% x>B^L oEuTO7g7~#z^-: 䉾MT# Y:*)G.am&C?r)tШR0͗,n%`^eR /7WfjĹ-n Kߒ];w1 Ye0 j]6Fvߥcm0ukrX*W,ۭ4G|iJƄY,6w#w#0[%o7DfS?7BX"1q޹l*]N_© @CNӅxt{Gf搿*H!:QuU &(1\f`gvS;7;0 ̸HC@E2:;86.1=7x# g4}u& {d`HMovx"QagѣvՒueFA~PBܙ8BAY8*,6hНKgɹos5#hDUq>'Ca4Pu[ϜG׍) ]_b37{=" fi EN倹h=lDὐ~lmP; R69*vXv\RnCNcRgpo|{j'hl=I8cF, gB\=MSDRwojpf͕LTz$/Ш9\ީX#ȁ ަp :l&~hɰ #z3؏ ѣyFg>!m*1)4dl!@oMxC2nyaD3^TMT\`В񏿒O['&_K޽~WU7?Em endstream endobj 18 0 obj 2432 endobj 19 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 20 0 obj <> endobj 22 0 obj <> stream xZKkGW9ufJ2rp"`?쮞1A{_|s:S]N/C7_>=l?oݛ$yM't.=zNӯ/^oqRF.1?3p9L\p)?>=p5 |ڕO!2<!*0>)]_OJ=Ie1`%FP>?~@Jgz-5W%?xdMi'?)o`yvpl/D&` q& 1ǀ[p*@ˑoD\t^~'E6E-SU%t&I fs(<W$teeXAU gw^>+dY-G T^!kI)dM%ꌅ 0lD1x##F Ri^FNBdQ(zC(1/W啥JUРK]I l,RP,"ўķާLGH{B5M0viJ r?}L~j%eNv|X (d+WFHoMZE"{"8E9) d%T0JJ 0D]y.;({27ۄ1)8ѥIc^K.МJΩ+wQ .+[DߜJ?˪1%)m ffKr*cF\,r"D6P /X¸^$vu, naT}; )U;5!b-ąuIU k 1j \<40DӰz\zTLĴgȁE%ɋW*ˆE*VdC]gs+8{0gh8]4vW8S˔ֶZճKpM&%!u!H [19ra* njat0NJŽw-Eű>\)TJos5GqLLgʐ5Q`HGnzj ө2w/k_~2=IrtrR,2RMJʄ'?#fqdBv}6)*m9bR [E!uf^ 1xcVtre:fEeq j3:Xzvaa]pJSTt qBӌL(̐`iڛү/ۥԎPO6\|կ6Q#5~p_x sy qIh>N 4Sm7eY77CQLj 6x57ZJd7*%T 60i}tteiX|[Ns(-J[n* _/8{u_.U2aڙ0/@GDެcEb{"d\ǯ(;G؍2$Lzw7Oo}˗wVy endstream endobj 23 0 obj 2217 endobj 24 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 25 0 obj <> endobj 27 0 obj <> stream xWKGW9 mws`IC |0%1$~ѯHJEhꫯnQ?wߕV3^}E#ke|EK1usf|ݝ.+F>Ni4󴏣I L{7zySO7}ډExD;!Pm g`|y+s)}S͡j nd0JҘB) ttr-Ij1D3cFV,8O0j&/ybdNq=#@r6)!Gb(^n\~rP(eF!As9HlY*wtǹp'd:c~t=xL-Ûjc ОM*=6ti"H?ivnBo jX 9'Xؤ#DuMlH8FHIwR)$9n&0e[,j&/4X&Eiܗil kAjDtRu`IO A~yYF\apy+7(DQLD1eWfg6x< 9WwrR.Vy|OS$˺]\_l}AEXD26FݘU52 9`! bY芦|y}Ȇ]ӸIيR-0YaB"EO)RClWqђn)@ @ v{c\O[8ߍg_wۀ@jp+50?OaE懍୴ӊ(nsT]A~vb.+8Dfd &Ѻ ==~*~koP_C=]^aPoe/{8Q endstream endobj 28 0 obj 1203 endobj 29 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 30 0 obj <> endobj 32 0 obj <> stream xZK6й_,{!= 􁤇΃/٢M+r3<9:@K:\pݍc_5<. \{tH^8pIVcNʩg(7oGp ,qՂ| >?g?耸M /EEVE}42{7=z=%ٍ'!ZHgm#'>/Q;?!0i$&ėӂ&h60Yv؛ Zr=5*?n NgL5hdeOW g4 }vb3䉲51bQ^lPq/v5֠i+톬*ZBKy # 䖝Ɔ H]ֹS^&OM[h)=bs4"Iz499 `7lӚ4Z p:Y$zOяz۹6S[uW%g*7հpH H.^@p[ŋvfj#I*fݚ26WRh,Ȟq\`$EQoȁNyraS j;T;7 `Kժ[j"(e( ?D49C~#cwR\h ˆ\%I KXIu@pRe*n)<؞w&()$UE 蘕%#г,GUAOEL sa+{,C-4YYT1V 5ܚ/(oTmigو2WlIBU%fK.PqG1\UT6[:J+|^( ERjW< 0;^?L)ٌ&:>zDZ5$[u#);R|\m R=*p&{~]]uAXA @hfE((KI*R`|.v=FtnJ~뒨=>fJC=R͉M6@RuXQu,'aWd,KUޓǣTa}zICbakLV(vL&)oϳ$mT鶱" P{I!y5c:jQm%6*jJX&:& dok-#o|s̎葆6ucQ 6|C H uGsTÑcMGI>tr;H ^(“fdpy}mg+wAPW:mjtOgI nyQ  ukU0 y4w yCx%Anvbo}xqSWH$Oݒ|Q6;UԚbr޼E?(+.%EU743Xͮ.~oΝwzwocmFkfx0sgsji_(WuGMa9Ůz%ݫ/<^3[JSCV8ѓk+(-@ۄ>}!cAdȧGjIInL3 2Mm*ڮE q+6κmW Tz\<h :/?4nrgWX` i|TyvK, k&xƐeoA3)5tGӈt/ݛu޼|5;۽L endstream endobj 33 0 obj 2159 endobj 34 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 35 0 obj <> endobj 37 0 obj <> stream xZKFyk2% uUì`f|IJUgf$eFF4'x}0_a';LN嗧m|?_~}zy{-~GrçWo e<+0]\/#sg/xpE?4ϷoOWˇHˇ˻)aGG.twpgzyEp|E?`7W'qp5#YD"44Y'cA`;va߸H5,?dF]Kw~>ɷaL;n "tGRX0/ٮYWچF893|;SOl RAy1^P+;OjؙɆZǞ1ņ y ta:x" *79vW]eM-& N*G;r8& M:|"/ɾχPcB8EStJc7-p.thG2&È)HM ?^' i&#uj(k2dm4h.9j!2)H{bfpm C }O5zJ+K Ǣ2ө94ŰhhV,^XT@=n)@fxQ7x%gY,j;]Qh mЪd1ٕm\ c;k%&h ɆtTNDׅ>Y.Φ`-DN,vFmύ?s~xaHmU V źBhO4~t918كiJN0bd:ȖII8'g yxv$i@ck|N8n}f|<5gR5`Y/|>?v24GE.8FkFة c@h/V^Mkne"uߡ9N{ݱ[@YxP=NEZD59'#҉(~턯,(ZO.Xn7UP%][QRub$ٿZSRd傳2|%ƒzg}8umӥEaRz,Q)Ôg{=S#˖~ܚ`M[WiOnJ*(Vjn Z8N|$.\lDLuKCM]%ב kpGXvl+.UԘb)BsC ar(˕wPza~>q1/+Nc*} o pߛjQ{ά{z3--uCuD7O9ңR](؎ۆdV&QIrKh< 뢝Ti x) ]ǧ%Q[i Y#4 ZiSKM(T1|v0bBRūRCp4~yV~€KMAXޘdXa'uުjQ9SbYOS51ߴZ0g@װ"v,,-[nt!0N[vroImm^1ꞙ[O֌-{NZiF~ s_ Q-sfE'=[xlݵWR24J\o؎9p`M|sX m?"n З>t䏸nz1#mђ%XQV# SKE1‰pP"{p+T;낋$N[*-U]TP~90|%~otiQZg zl1vN5ڊCȼXWHפ 8Nt*6{f=:ʍ#ti%W^&%35GZmE Zq>IsS?nNuZ"\9aݙ3Ķ/\9H>x՞Zrq7toQUnkf9f-ǝӦjkg|^ *+B Pۇ UV SlޔSPsRR Z-lU#$jS2> j2'4Jrq%K3;uc9H~W2{#RM;}STr;'a^M}c ڼKr1QjUr+;49=9 XQ{GƠʄnz9L~t;t\s-9p}AoI-|g_C nG7_ k*3ofwHˀ2~}!>ciJ!ƜSA#BW-Gͤ _(e߿o ?Цa;~#<>|7ï>}qpOXR endstream endobj 38 0 obj 3051 endobj 39 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 40 0 obj <> endobj 42 0 obj <> stream xɊ,>_gC˭zF Aր7=%#2֞'xCWV.o^NWpO_ӟNw//WÐ^o/?_.5^Ϲzp=ë_M]a|#XzuYalU7{/o/?y ܃ޯyww2|(ݨ?y]\~bU8߮AIs<&ugab|{ шIgXFaq>ݔx n>]e2ő` L2'uk%!Z*Hn Yn 6G;@/Jzr=ŎR3HSM7 w)fPp߬]naG𼺏(GA:xhžzMd(*Ds%ď2­(;tKy-X TD "UWAɬ)h.Ads,>1"F%TgRLU+v㜱p^'Rt^Uu"shD5! N(IW\ZOօ!፸P(ߧl1^ g r]6rp,j巐'B0XIy`&TDkLn⮈tI84*fo-`)-; %uSCC~Y>g?pn Z'[̆s 9b ʮ8{Xy2/A p޿ϪflФpkׇevt 4iA Tl:iL AT4XfBو+5UD̎GV" "1pZQ8zS8W)9 6e3y@ul# `q X`\52Ӳu+< %6@^/T%4ي(BHdwMfҌm\Bjd+H%0[sC&\~2{3- j?O)F[AF{6^KFQ1^;͘& Dj6v[g$A?;Q*ZBl,.iAU6ޭRx.nHJb a:F=VMg 5pj { LӡJ5Fm}, (i=;`;oPy*lBƶ?xrQ}`_O08gx2?Anc2#gnndY%(U*q$ح"|t-Ô4 'vt2j0T_2E~)钸-9Y6y>4lpQyN'J3]H"F6%li7)))3Rw0\A>PIE=w|&Q?4ݕ־j1ҕZjrs(t4>-mvQL&=$c"i`{]~vr`m9xGej8(֟<9|cf܏=`w-;Q\y~Iu3gM4Q[jH9E*n#S}~\*ŦSDϾe1Գk0LjI{ci*ݺˬtnЁ.%øߞtPj]%_Wz722/5A92ҞSEmcl,CƊk>OVH'kRqpXN|+7@">Z&r_is!V D$m/5.UQ>&ZNCER舂ߒI;.v%}{u  6?Ƭy>+bsOO ^RuO^.X 6-M?Th5tO#f])\,T5gܤI-APSCßҒ0uEfH87Ғ1\O7= =\S/ބh8hՈK43Įu QF$Z#)["ni:kuv-_˦u MHbmAۥcך$E'o}L$ZrcC4nv-, f5p) K#2oxRnik ӮOFU4;\R"q%I?,<Iյͱi2M}M8/O;VmоP`lox[ݤq~Mi֭ P2.;θn4=\x B 1e2E5+5 $~QCE%Щx\7Mߧ.`MdAWIܜx((,,PMM VEKzoK(}߳}QPsy~-J#T?-N ]=aHL=UBUw/*rs@jm֡M5> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 45 0 obj <> endobj 47 0 obj <> stream xXɎ7+l@^mc@ !-# ?UH6[-@<iT}SЅZOzkGB}hƙC񇺢>W_Еk]W7c6h?~(`ѮQ==n[ݿvt#b~O͕}}$|#hO?<3s% Lln9R+?:6뒡e\D`sEy@lBŵ"\Nwtw:YrzRI쬶aw^G? o-Goq %4sMpoKlfmܡl ͩsBr>x$$֊-L5!H eoi@k$5GfC$]\?EV-͖x;xqH qR ~}W}|%ִh"c혡y^ZLAabPX@)Aj؟ V Jn>SdaPݶEtlP`u+"LPъAC-gl"d=g0Z1(qeL ZW> V Jn>SdGUV`"(7h) M.7`*qqk\[Ҷ8WWaA`]:Peʒ_Ǡ 8X6{o< hxrع pۈL*sQR4uRSRSgC g@{0zK3-uO3zYmY 3蟧kЕUcJziVjiNhqa#k%2,J)Dt 0[q„nuFKNeh:1HIw؇\=lj1oݠVO ^:zhʺhpepLG+gm01]N:Iϖ=e 77{QNYs-$EJ*LtM`j$w7bOvk8(WWv?a![ozQ_]⮨:p. iewe}==$o-C$M |:g͐J(W4wDťiql\4P&0ԐjĉPY'd*]"у3q ͫkb㱠a,ĈRbqC^%19V]'j,` O V"Md^ G*p.n8[4 O4[-i;O6Zq[bV)WM(èltGŻO!С0JPǒP-ΈK.nsFzR7'PžRn7(W\p+ e8eh. $U׾(&M4 #.Ԍ<2>sN"(gzGȖ!Mt}i+^S3[sLEcIrt0tO[=|W]^v. endstream endobj 48 0 obj 1566 endobj 49 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 50 0 obj <> endobj 52 0 obj <> stream xWM6WZC"`Jv=1CS-=͐tReI3|ph;27ߌ5W!W _6Mxs<a19}}gH;;[qGFq;7i1A\y佝z@@V-B˒cqFI'.cи|aGAX#;ޣn08ANf o'ZyǟІaQ e '{b?JyaVXAP{;vKwbg%o.O]op{}S^Gp$"; IH$ޱ"%K<-7))XP*/byY+5j\_ZhDTrI姶 ʚ #~> Y(Y[mh,$93%v c|Z|4ʸk*×ԨF2f%NEg %ne,(!SGb %ϣFP.]ݾea*hɑ3owS/-gH!౎"_M2o7&7dt4,eZӧ9F\rdU"K8k%7u)k&;u-A6ѠWYR3lj \v4 ihhev2VU\Z7:_XһWBPZk%z_r>Eʹeƺ=H*eXXpfDcZ-"hEtĚC+Y{]&e#_+$lnЬs;p!W#@ӘSWMw|ߋI _syegVKDw ;U3[w&\Bnk rѿ #h*tj~{ 2JX NDyxE^J`SN d\AAOK!-aqVڊTYg=zXy|k!UsgTYRFD)BW0% ]+'0]rISuÞy8(FFN  "y9]YVDUWO_7F2y8~4] endstream endobj 53 0 obj 1173 endobj 54 0 obj <> stream xwXUև#AKb-.jX`{ `C1Ƙ5_d8r}sٳڋ o;s|f3olRP*fp*Vf=37 7 7[O_빵 Mܹs#L~J|S|')C/RXLՈi:_U-fU?>|PWR(5#U#p1jMwt.RgMG fM)._ jPtFҴ;=H*5ԔŰ^RRRtttLLQ;&ϟ?Čԉ?j K%1wɼTM ^9blzYOoZ^B2C5à굯Z}IL=PXnŋ9j: UX{t钮f! ԓWSW NOSwg:}թ2L3cTG46ό7o,AXXXc"""tBS?XYhv,j .p?'WTʌر{tF^-1J%ƍ4j4r%Jj`Ub ɔ@>7~J_[4S9L9zt6zwR˵\q,iQcjl_6SP_Tm|Ԙu-}!Lo=)蒺W58҅2cjd]&=uzH_1bja쟞===bcce=w܅\)H)fQ;;;j*/N|vmFjӦM^݃ҳttjYsb%p1>wϘ ,yw_myx>^=ZrlFR@+&&&*SaI}7~wo>w5dʩCvKyʫ1a?àuzO폟EW _=vԁTa5NAU;QOLS*!UnP%T]U]cڎBo Sjlj _]E߬u1]KU2W*Yk#k;`?ׯv9o޼7n|cBDDD||b[hU?|l d}rqq3fU֮]\_5-&6l+%5lǴ=>U$ 9<֠/]̙3^4sȌ/]X̼ѻ|H?)rJ VOf4e:=M lycu_IB'S=G~USt}L/tLUa}5Lo$L!6W1 Uf^2N* 2TSiՎiyU@3xwٻk֬m۶>F˗G^`Eܼy󬲿??k/T>OEIB%SN=*pd||jA @Uo;?% \u~ĺD΍Xxz籮C6k3*:U-Ye:9%UL;U4G?e݋աn\ F`ڲnS%_ Iԭzv_OJ>V2Yț_;7`_}ݻ?Tg͛gAAA666uԑZԝ;wJqY(eo? iوlhh}9z칲ߢl.cAmٲI&1c/]I:sǎ[nՙ!!! ۴ ^pcǎ8$;w6kk׊$Ps}՜9sAdvݻwĈ#xA6m7n\imС2ՁTGTRE/6ߣzvIdWfן;+!.\=an:вgkxJi*66Vw9+]Vug$!SR >՗$d<)u;;y뢤kG~<1W$}y¤r_ucUB o ۫*/%֭+΃R :v9x𠴰j*9,UTf|R-X6b2Nկ80-8p`W#C|$-_~Z]1>|xbŴ+UԦMIKA mФ)///uϚ5K)쟅_ڏNAwɔO9UunOcG=9c}mj!Uy{*!u5ZSd?GY? )SR@US.i;ij?Um6DHW'K*t:WA ^KXjC̊wEVs}K[^2I]]p ji=sU@l:G2n:T9R7멥mSܬe:$݂uwKK!Q2iӦNPOᆱ=[nɓlժU'd}JϞ=etZ&M$"R$P2Wv ;Wl9`Єygl'X{@Qk.ru»CWjIZE6*GN|UFHuִ>objvթNPHQ*C)ִu/nD_/iM\ij=}VW͚_2%n*5$Ղ2?k޽{X?=Z1cy0k[(PaÆ_eH~^} \#HʘݻwҨʰ,Y"Ylp^rE ۷\r/O֭/qJ*/?WСC(IaI5D,q<·m4dȎAcU v iC۶'%| R74xEvn|2˧F$!zQhQ*I 2),>eEtM6urrRsQ틹}||^x-?~5Tu-),YܹsUy18 Wd߿_'O<{<kg$P2 TʑO9qDR,g$I<#uؤ̨ZU$gb7\2kհs:rJ =-[U.%eA m}$2;njedJ?>bFwڵ۷ow~W_}%bRQP(;KREՕUի RRQڑC՚WJE. iJ+&[BT㒩TԨ%SVSUTJNJ:U9jBS)}J޷__QMeg'OYvLy6Y|[n .;\e˕+׾}goVժUM߯_?qsKbjjGeK+)cY}`gm۶HAI%9UH9&IKsc_Ҳʩ*3jJ,qS,6FUR*ʧRiՔnAJ2ՕսC)RHR*3TBJeCUF\] 9T+vլtuA_\TSVW[j\u1>nWI(*VIed?2|C݈$SP ORJ[L5]^rԓTTULʔ'2ܚŽǨ2`ǨdJwqOJ #5UQ:Q'D)UBuʡ.u mƩc9FӾs| a`}/%!BY.er| Y;s|a`!prB<ՁN; yȫ˝v@!W;B(Ȣ ɸ̱:O:Uӱܦ؉h{ҙxK!dQmVݺvθLDXH j:433C;/_>q!,1ZBRewKw<*m"}l҅3O< 6MA׋٥72EK<:6a64!WhTxy@!d!<,M"G W+[RD {;;Ν:HNd O*W,[,9+\p+T(_vTS5Wv*}|㤉lϜ>,) JN>=e5-3d<{HN:_ڲim4S l/fgt680Sa IVVV;W>]rWڼˈCT-ZD!Fؼ!pBYHfkkgyȞlBBexyT ٹB7/]'C6ENrܦN*\W\*;];X©?F)$EN:Q 6RuK:0Ov:jǎFқ١2E&΃$#qF: ӥqdÑ!O:)cX+BB2<1_ևs-;Ado_f<_ϞVKϗ]UW,Yd*dQU]ڶiu`n=ZB(GCQ#ܿˠ=ݦ]z.;㖱Uh]{NTar|`ϛm,hFϼBCGns,64gznzʆ]p>݆Eo۳v$^nVujk6cR,/Pjjz3/#r,ߺW=o*SdR1m[v5 *:u!ܪ|*/3g Ǐ=|~={wU$Ÿ&px/xGo ?tHo߽.;ׯкiQC;.ш^O3όwr=XզQgr|lQxIS T!j4cSBbtxq۔zng&_],Bi(}_t228[|[tnSFP.۷um.ʫÞ=úx=췓ϧ.,e3MvlU([L\'볰d@Qwi9`x{xț*!#r|lZN3[vx4765נ`5r| !Js%'۟:?ΆbB\\У7y ߾u u:f=tUaկ?/qh7R?tX4ɶggOdxg+{N뷸`a;~icH3q]uԹ[N%?fHW1/%e~y/̂˕''ODžzݲ9='>f(:z6 [ke{R?X8fʿi6aݷދصĮYFGŸ+4rӆ'>\| iΞޟ^f+WnNN Ͽ w:;yH XAI hm;d''pq}pq2 (ExD\~:Z‘촎—E[hHJ&{/^ק2úЭW5Zk?Wz a5 ߴjt1&eݴNO/1ծ%M_xrŢW.{h_~ʶpqqVFhҘ9!ǭ&ݬ[xEK܀Ͽqtc%s0fSf#ԩ󯚣ڼb@V?ܽqɫqq;9z?׏<^Ǐ޿޹%kIǗXhHs>4R&6ֺFW ;ѹ J$Tr/\SJ{:Byzp!aޙϝ, }ןWܰbvLq3< 1.齕{~lWwv{_틦w?g}3;EKC9v9]ӎeN)PJ,J\>Kz[~U+<ҕIyyh|xᄿ]'=WISX׬[/Nkmf4tv:u3tE-ۄtҔ#Ф'G>6t[C{o}NhطM-\r.Lq ^yI< _fS8PfE}WT9fvpwJZr$_J)),y@((1-zKX vw nF߾ho?xhq9,799xkugzܨ<%(_uT}!o;]5Jw?צ]? d &،mݴu֖oD\<3}Twi$U,4ͧ4w揞k >h!l>hnDݛtIOm:u^^[\n;ѯy@(]Ƕq|NovjM_B?kw ,_,f_?Tmyyؽs[~qh53l"d% `ՠV&W-LOkӿu/c+.O`eޛ}mػmhPXdhL|ԙ'$}H~[{oͲGCdSIO>;7Ž.gFwWWy >`HTbyLLLllcܹs}ї_~?ܿ箝:|ϖ:}}[O BJ\8q~no_ϝgoG|\6 rô|6Z &j`~bJێ,Ây& rУ?0ouW+6??8Z}fa]/o\nˆONq@XeT8fb_|љg_ S{y5`{*wnѪY\\\ddd=[mݣwo9O۷PʈPV7ωy@(胋'OP_vvorͻם#rX)f৅Z/xYfw<6UZFpƎY3@rͬ6ڶnwq[QU1ȡg늋uOpz5#k%Ej] &DO9+W'fF׿λr|ZjQoo]Q.7;]M qKA vgF7n^\{N_KnMFem6-9op0q0 58{'F6yei˭+.x3y?{{H1) )¤ѭWy4mkvj֬ZJY5xw*+7#=OXyj!ý3ޟØ^6۷p3wyc'u8g;];=?K=??zkŸ?~ 7rpD8W?=sk99n]SuFv[/Õ+WMk׮>}:44o߾}R`Q< b q p=Ro~5x{v< a~vկ_/=>X*RBlp.;KrVy/?S7hҫRZC|htקc n_`vDW@?1aX7ɓ^pBrW|hnṗ#n|4AIqn]ձIw۟(ikn]{2_on)~OFOcHUz={]+8)㡃}6_6m\Vެ^Wnh3mo;ćjdѼ3ϖ(JZg'b7{h~o=k~8j_ny^ܩeizpj/m>Sf[}9>%Y@o*tFn+컩e}ݽ{>7?6|ʯ?$<|ȴc9c؆kd=S'b $zOAI*Бc6v+}e޹MZf/] C̓u 5ml5oe+/ܵK'5_ҴJ6N0d٣Wa*칺K~|:::ΛUCYZfqdalѼ|%e_+dSرrvH1fǍ.]5(3ܧ= -Ͽ\5evQ Q.1YH~}{˷Z){tϮRXիU=jxr甶m[#̚]25tvumwi;;ۭқ]6OPm1PWK#,2:sTlJ aтR}54nޤA6AUetԮo~*S\ĴÚQk<=?'jzK?9T΃\,[W9Y CN`̟#Yq? Sj]A6OG\P"g/2{I%_MN *-F-D]:wϡ_ޥKu۴nT=9ʫD~&YgN^=v)5I=΃_fs ;y.\HeΛ%OMwKΈ?)>څ}/Pnb %Yeݖ5_\MI)SzA9<&N+O2M't6Y)tfo29۝r,XkRRRRh#S< pՃyAeQ jvwCu&1|j \)-F-D*c/gQ]sHGS%-_viGߙ)>+s缝%Co[M+YyEPcFyq'j~3I:Y8Ar7sfTŊڥ]CJ*:88ȎӸQ--vI.vIsg׎^0ˈ%Bnpdgп\\dE;Hio2۶ 5rLDF(̥ysu5;+YIRI5 ΃g%^Yrq;;ʕ+,S7drʃ"!HeDz#_EB$04iH-DN7T| s۴nW'Yyd-Qɩg;vh/Xm!AbZIG>+TxC)q2upJ9CkC8UqcG\2֙ӱgF<`ʖ-00A6eYWf?Vy?t GȒb;eڴrdvv=~NI=5}I7M3{ݐ,hx󆵱1S^K[0Nri}p5ʤR0B9Qu䁽\Ǝq$H!BRuB!;B!Cy@!!< BȐpB!dH8!2$BB! !BB!Cy@!!ey#iB!LGB)%!m1< A*|PS杇! Bٕ ub#Wp{y@YT8=< ,*pBByO8! 'E|hLL: K ifBτ2޾ߙY~]Ն We;ѩ=]fX0Γ=-M:o~Ě2GnۗBY'pj~y3.Y5+s|\ ;88>c2yGTP>1!΢+.hfmڶiխk'pxH|ą\}1uP|+++@Æ")BVD҅3i{x>A{4qք.& qS , o_۫Do9'+uMӍ5*^gO,tNdP&m#HFQ:y!36-ؿ3övvPߝC͢ܣqJzM԰絒%%mgg۷OO$g!66={tճ<_Sjm@Eqt|i9nP*[V ˲sd[n$BCd%9s:vlG=z]p 4Ylmm'#m *Ut3odA9t>UVnY/wI"Y7j {}2fI .,VPvZ'jTZ8$ɐ:wl<.?fgif[wKٻĝ'm+Uo! L4ʒȃ|喖L-Ztԉrr4i(&:\8hT %{d*ABY oY4d)([샲3Z:N}4syKΦ]I/hS٭d9#$ `_W6möm[#Bhed. >㎤qyuRnST΃I RU+ʦ1LelÞ];$ժ5ܨӪb3WGܕtV*] iezOq=F9~'S83ţ[QnoQ]kpJ~eI iUEqE޷jaQGɽ%?D*e} ׷wʕdMG ΃vTC6_ ez y VuӻGɞn_H9!/i qGKϗ ]dɒGŻP4oҶM+e5+ٳ=y0d>zQ7\9xj׵]m?֧T[? ґ+=yп/`< #<R=ˣ\2rk%7 Z}˞%06< ёa:)ߌJo1ԻV*AG?6pVqlmmunCQ7"Ȃ)[[[(J GVtVP K˕-Sx1C e}l^W+rq;;ʕ+lCg|gϮ)?H]ʙ7 jp*RQj5iPVTe|IgXҲ_ҹT:J*s15h٢T߶GG}NNNՕ`+)oaܘqNsDO꥗3cn 14ljWBϊ2޾e޷k˦F\pSU<:k;o=Ѓe8jS '!9=7v hknEq[ ,[zax G^.wi5 /\BȢz?rVǍgwX"3-E\9(c¤}^|օp{y@YT8=< ,*pBByO8! 'EPBȢy@(]>ۇBO]LX*eybRPV)3y!_||'|'tTy~l |A|'|sɏ-qB!R !BSW2IK j0hEH(r o5FPᢀQ"$&WnW3ӄH|uL QbxxE9YG$xm{s/Dx }vߓ_z?߈ v:f'30AxҤd_7؃ W\/{2@taF~'j,,,a%j]jvx011䇙bS^BxxFW,^\~hTU"<l &C=`f;ݪ0Ax/CاOK}|%م -= Dx  )< \^JOFVjrJ~uqqvw_(CAm)e\3$ؐ6:Sn`.=t  Ht/B|o(0f$_,+:pfwRxĤ١n.*emj̝+'\Z,,,,c6KKK33_`QrښF:iC++Vjl[[[i t{ׅAAOu:ON آyT^Oo %!C[gs ]&F6=`D۝dhU(чl~}'Q nO穢[N- 蘃LY&gg/)0p,^49u%Ϝ*`fff <45Srtq|MZZ":ͬxJ!9>(JmAAcCԝu]=j̓{;v_. DdY5Ue>ѤN磵k#CwA٥  ؛vv ;wr9?U!++#LJǒ7j2SSSv@m;'<<\sYAvV:$' 3+3ɣsghXx(:5% Nfs#w⚚TrF?>kcll4 ߅6PKKK)r2tٽ{.\0goGGghgHPx禍wԢQfumA#<@ACvN:o;(?\|.d4Uj/]0kTշZ(K譮*cwInȬզ=/U ;  HT@Vޢn\!IAuA=m1\Y[իxSx8mt  i vaq^fv~{Ax ?a2;'=!)- JnAA!}w\Rho..+_MAmXx `aGߐ.2uhNNí~t=y +d-9̓)dړZw}1'fv{vGҤ "\ι9wW⦣#x->+Wk @{dVyU`,fRSw֮YCGܳ<@涔1湻UG4<AV}Rx)YwgMXȗIN<vnYhԭM䀪j֩P(\tÐJ"n:G Q*Ø4 ,Z :2k8uufܸSJd..TOG>^i#MVސ:"#ȸuiA+Ot,oo"$NgpdёG$%UG> eD; ᧟~믿\ZC]MU5RWjisϠfd^PQvwn.a_ogF׵SwFtJȢFNV)ejX v0 ?9 x).9^]~']<uC4<Ï?Vh]ZMFxAmLƒÃxm׿9/뗜 endstream endobj 57 0 obj 25904 endobj 55 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 56 0 obj <> endobj 59 0 obj <> stream xˊ_QgCK) ۰kǎR*56-)322ޯq˿Oa^iJu:}8y2&4o<}ݟ|8}Ƌ]˷ž9lK:]z/ntq&v>t=6â{}<ݯ /"CpS|NLXMF.2d0ڋ Jt G<}㗜 ~n $93R9kH4 (~ #_w&+ai<$.|x摋s; S5H5K)$ u6$8oˑDJ7erX,'WDBi(j@V}( >sX9d._eyOVq\X+%)ٳU =RߗŜ`*$T@ AKs +WJ KUdG^#c1(u"3JiPq7 *=HWK 3ZD69Jg˲YU|_cYA(>Q61e/_?~fC, T2PkJ߶ŜQ2; 3B{*I+{(|x:sFPSf RC wjs1 HNyx蘜 P8,@d^Hj?x@MLE2{'o]7sT .D-tn̮ǁq(|WklD ow2=y5!gSXQZmU`.fN"@ȩ v\ ̽c@ EWck0q䬓ŧxo6cOVReB 9q#S"U{i|I"F#rBbe^lơ6Dj19îVV|D4a/[L^`1Yc^v"~0901Z1e{A46җ[l9g,hV=&U Ici:ԛ0<^V } v62ڵq8Թ3Zf*2B2'(X8pm@oiɤ7ԓq(Em ou"sMw՝؉T@uIhu7݈Ŗ|M56/]y! q bu?C.Ttjo5i ezG[̊|oHY5GfOvōapS ,ɀ [zn6tVg@ɗ*o, ^i6E:zIyC3.5s;< '>(b*#:1.S%2G}n'se-ޖyTNhI޵J,*UY.YJus6(qY-oVhd1{e1c5{4T5` '^P{.ka6!-ZHlE/R4˚5iꆛ35jw 1|Xftɨ$:P>cdiEią{iHHξ `M4@4*1Y*7E}#fwסV{XB_͟`j|pX܋m%Ek[9O+qLmv ug1VYE-2NeuA1qW vLvڎ͞j4RO+Ģ:_?v@=cDjr/ ɭbƢ3ޫVrxٱah` =23d$n5AΤ7S' ozM<I':Gz~CSu"G>t{لJ\<;1{C'x]E*, LhJRsm xK5•mU?Uw:^>L78dp+ Iv-¶0WOz0Zt\0ڈV :*KjKlJ{ Zw'vz ?QNHqwmǕ2g֘*tmiJ V˚`̨ wQdz_fV]&ej!q[ QG^LtN1rcpQbsr(WC3χ=J}!LZAG9t 1;)xI6 wFꟗE+;S [,RvP>MeNl2˴czU/o?||[J endstream endobj 60 0 obj 3153 endobj 61 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 62 0 obj <> endobj 64 0 obj <> stream xˎ#ـffAF1` `؁ ?'쇴 vbU,;4K8~/V0ixӻ?p|Lgw >\9w_h0|91ݿ7vg&T&N}rg\hܝ A  ~;a^Xʇd]AOYZkp_pԃ4`)Zs9+XUܱeKٔp>5d!g &i&XWq%O~!q,7U4XabU03?Q`ebҕ ((*#.08Ln%0Y5+[(VaP+Q9U,e1'7ˬh.@ffݑtX- !OPxy,M8g5=Rߏ4)/e}>j9_EWt=؂W+p 8[_ќP)<'SaI,eXA7rgO& ejYS 6# R4d>[*˻j!~yAM+͒/_3#U{i;Ogm.6 >0b2YXމBteKfKGTa[EzwdtMQghE;af(4Q&UZMOrk0Ϭu%dpi6iS:lȂcRF1T,5&'2H-A1*7tjTZk!Q[۝tnk?28MQ)NZ<{`k-Qg,"ܰMθCQ^n6Fsc,skդtBsuๆmכ*[B#Rѡ 8i;x+Kȋw~{aǼSZ::xe+sowwNJJ5I IŸzxwiP͗9P&Grfy6y‰Mm5Jnq|6a(-m޶TUQiИ4,;WYj>Ϥ\'D(UA![RVh0EXђhҢbݛCIPi4P{J\t.r"Qd;AyQ+x^\L27yFbu@+ m k6nvJCBא}|ާB~DSlKJ5U2D֏62h;i M\.6quFk2k6v$عloT). ǶV)V ׏H$MVzkp2.zzS_nXqC.G3@QbR$12#[d"@HnT*ޘh >Pyz kuTxReYHVl9[zF~cim5(߲Ũͫ$-d3M@]ChJn[AFnsG{k`>ZvjӹCq#JY+{#UFh wTf^zkʅ6:+:FTU0noHŵ;[OjdC;.ov'Tl@I{!nDjs  A49=@;]ltntoU8P35>Q$DHx*8 -rn 8F!PYOAP(ň+VkY7#Pņ&㄰,p*|Y5sQop "]f[!pRC-yk&Hyy7#AW?ř !?NzQU}_( Jj(͔U#T%(%z> ~<wRRcOoo=~㏇fj endstream endobj 65 0 obj 3604 endobj 66 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 67 0 obj <> endobj 69 0 obj <> stream xZK$ ϯsճ41` !-Û ~z. c]*(Gܳxraz/ÿ>v98d^;:6OS~.4/O>'Ǘ\{ԟœ^"~"',[XrG{iyx> []L(dzxLW _npuoj/_'|jܠE%ߍqGT=Gi~!N~p]&mXo\7 +*gX{`*b)sydL3joRmiy5?dfg5ph,8r{5$ݒH GE(+? 뭤&8rhphT-G3aai]3.|eCE_㶠Ё !+M\nD,e&gk0voELx+ GTȫ;qA%:|NGPYɇL_{^a;4B 7gwѭ2N'b6,&^l?k]R򇳱nRavy=p#"Vp $Bp[֞B eaMށSqs*.F*=\ԥF|v?Dg"nଌXEa( @(a-*!(aơtmRuD:#1q<*ʴ˩ hB<$~4Ep16l]|B-38 {KűC{ h5_96ijw3`.j j:1/׬+ܺfMi}B%E9!cq'| ‹0q6mXw"[(mf`HN1TXq0&VTYx|)xHAFK?3UWF":SɁ:'MLA*Fc0(G!w&?wF9#;_|!CI9,=40&cg){*A;_mKZu-r}xc &VkH>=1-P mlZ$ܔ'|mN"qޞWkTs:ͤyOʓbF.Lq oV9XJt-Ӕ5; ^SKj>UJ>9^ !PJ?gQVZ@ Cr0MԆ|DB "MpPܑRB!Y~^~k fgPBE4E[P: UBE]^V҅m@TsJ-y[|SJS5g@6{#nwy~T|TL7!nvxu(|e%f3]1 ؛KAڴcZ1U5 iiC4ԨPBdց&!D*IRH3HNSq}&? 35ʑ;Ō1{ ?M Q# Q-kȣA0i *wq>U6­Xn&- 4ad0R\&5&fV/7lF{;o>]Ǿ3N7OzcpAG!HH|+r{تb2y*0XUQ=sEv*]/2t|kNcW2zkuiʕMRh4ba]{az!5'%E@g*C(UE.Q kл/Sٖ}ߦœ\|盐& b~SbV$}~kvCwG0<հj(w`l@eV!05f.dAq.NiزJCVpΛqŨ^B/3IYk3'Ȼ6Mϟ(S?^K(Z6 y_7S "L49Y\LE}[:l?Ƒ7CSj_~*^2}Z<5Ze[ʎGhЏc_F tUoheƐ8$ ;c%̪Aq,~cUI j:Β}*7`(}~Z"ĖIF0?Q]RessSԁV:]9(DeҰbOl¯@~2C?Maç>?ܑ endstream endobj 70 0 obj 3042 endobj 71 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 72 0 obj <> endobj 74 0 obj <> stream xWKF W9$)@ zHc 6 dSd{/#KJNb!#[l\ x(+xK!Ӈ[8c#D8Cyy{ޮBSVO$8cĿ=0t{" GȐe ].tX5Kbń.wYcifC Rf#H'Տ*1KUxTl9ςԦCR._V%nU54^Q' ueXxIna W$}ř#Ȼ UʟHSTnCC`҈Zl#  qI$'Ojan@˄) ոсuse /lI}b`Q]'y`b|!1Y3l4 bv;pFVRG)p]D>o+J8C$w#]׬",)Pwi]SW*]˜fd2kZ=if]]Ź?a xjZrSP^ \?Vr-64n 8Ghe /t5RV%RWߒRgXn&j@yHIot3{7y8s1 =FIGE(&'8psQwlhhX/*H]Śsl , n zԘ 2[W~EYoi:b)yt  H(!UL.A(f_$49Ȑl[;-4AqRxb@AYGiLkGS޾LFvF>iLz_|Ridm#=K>t^E͡&[Yb] v{GSSxzFWnB=;yPqЉl ޭJ)v֪f$B' {=j-0 }}CW *ZFH`DPfI-5y5:=~{ɝq\9g['p? endstream endobj 75 0 obj 1168 endobj 76 0 obj <> stream xXǥ/`oI,$ƒXDMhbE,((D   6H]l4&5~I&e= I}~0;{̙߾:o>Vޮ#B^, W +`yE"XΫܲ[ղf_4vJ߾}]STqU*#rҷoݸnƵ7;uɬ7~ȹEDcFl;Ku-${Z^UmsٴߩSkQ`維}q'Cߟ2~ْIId?|ݲ谴}\=>O{^ևWyv#n'_զ]erSL3v5[>|xMpϥkF YmV535/$?έ y{wa#dojQ,JNsYgRp?]n0HTmSlY]:J5d9/ gVxJN=;&siڵkb7|CT9!|FAkmV>yzrEEGOna}Sb!a&42Jv'#d#TS t^V!p"蜵AwʜӉKm|z[z=(^*Fsپ{Ul)qQ,`7#&|C[ v36?79cRs FbfIfs|t(Oi5ZF欨P L,vδ Zwt`HzE|Ty=-Xxɴūnfop*CR&):_d8} >0q_UWSWT YDRf6urՓJ4)qQ:rsUwS> D, q3Q)!&oi yS Qb_fZ{Y1n{]Y4WyҴ[>ϤNHKCs*F{}xynƻv6ܹpZCF~ی>l maRpp5f st(bUjYz*>gvn\vہgRF-uj4Vg<{l5/'6kQڃ[+[xtEEijK p75cG LMʢy?'|[_}S{i7Hq7VtVBr҃eqF`׏oekofOr D YWzl40B Go ;+A)Woۿ17?ǿlhm8})ƍ}/LwJg*qt杲((+~^akޫoCeݯ̉}[)I㮜>{_Xn KL>o\(0 ? ZXt![zK^E/km}uc̓zk֯JMW_V^AME%mOBpp=-,M^UM`)Vγp7;4> ím+ o.:ݳMV7)4rꭏΏno+=קv=/ܿz/|Ů%.=Uq[w=7;}.׷ޯІ˺/G KWhA~N>9ut͂\͊>3Aj'2jjF^3j cAq㏏PNホcekߞ'/S{޵"{c}S~R*;թS~;VZ=;|;'+UX jJ r2RSŜ*:Cm|WuYl C6zyoqx[tIh_C*0bB⼢,2Hr57;i~b^cZSSpm-VO!W +`yE@{V,|84sJ M0~Ԩ.ɐy %No dg%2L^ͳ7kGQA^&/Z[O^%'s\wn߶e۷OzYclؿNdMtR^VwvrSSӚe*޾Y#n"ns|D|ÍJ[F1iDOpr1JV^eqD:᭷=J]@/*p\B w߾}P;ϭHyv>/'N:w|OVJn]N>/?b?QwngOBCl@zP1'J\yɖiKQ+cUֿVsg^|_U+WXXX C^?q5+Bh}7AFZ+.ƞG[Axesfff\6?⃆hgjاOs>[(aXJӻ;WC`#h:ud%[yGr`2%г G/^ٻw/՝Zz#2d^]n)S&a4`t.)΋8w?{P0]*R6>A sCWۣݚUƏ lP^cjP1JV^ewD-g玭ݺu3lP+Iw.[}SIkW0bhxXm맼W|իlj`d 'O~xeD4dj[|FccUSi:*P 5%_g. qՓd59X!tE>x&B?¯ķ;)b e2GW/]022JZѯ:w6 V={pcgBE~{ j"WU'• \xlBxq(\/*+,^b9v"@.5ܐj%Iv­ 8 A#@W^y;A%?t g5G@2b}Yv.|qe [(Yyɖ uv`U)%9a3\? ("65s?WjX(p)-ؽkQ4Z.1qIҒʰxn-hp#dmV[q*/'Ck6'ѯߋ!6)q{3h}5!W#nl3yE"X@^, W +`y$&hJvɉ(;T4l8xdKB+JI+WέZ'ge6K@ JN]mzk9.t߳$_C#d%^\/_x~Ly߄5gÂB?q}ӿN7Dۡ%^=CqrO簷P K\3O?h9͚/MJKK>GF7DS43119)/hWZ4 G;rly7;U\/pSe6y乫{HϞ=*ɫ8Ma.R_1%%!d2\ [0w^W T@l[+ yB&y KrVDYīh%y5 4+cA~)*u8SLO/ΆQIi IWĞ =.m^8{. #",=~4zUB{;Z_6N"+`yE"X@^, W (/`\yo֬YƳyͷ7:{|l EWxy;rH0_\b/aE+QELRoWknvkVZO}o6aÆܙ<]n WN,-X/^2qxccc,>MRD"ՒT+aj)| 6)^i] gHD<Ыޞ ^ӼTWޝьܲxsW!up1vh.ʆ q2Tƫx%*U/^+0h@m#x)yW<5+ߛ2k.Whw^d( Xa)nggH4x+=zt$AꕮR9֬ Iqyܾm|_?$3^3Grz屧W6Ha^LMI000(,<<|w 8^3^3^e+B!S?xOijU^+ 19yM6aox%*9>;Uj Fw MJyW0 qЋiw>B$;waY+ɌFܩث]P計ׇ ~!L{ۼTtwpw5;{.zƍuvrz%}>BW;{W_-^[36iW:KՀ)aV^n(tLM ej yŅ:=Cqn):ױcG(t>*.^Fme~n&\rڼ1+#[V#9;9>LB9lxC޽]w>h!r6$)(ͯ$[{:tMS8j.yUz-NC[QAJrgmO>֬\x#W^jh4) 2\8T8;BKss𳧔 ^!pE^_2XOOob%f|Kf=pe?3K*EX!\p<+9J5 :w6 A,dpϞ=8U8|˱c 26nX1BA;]pqce?3Kna0( /Ͻp)1!Nf6UW(w+/fr[ q&w!VVZlCK1We%=d?3KUr?Sltڸ qoI^΀K?nAq+ 9k { +D?"f3`xEhR@M:9t6?O$'\qŅ2BR JDGE"9~ʸb^*ARYIpP^*K%X@, W +`yE"X@^,TWdKѿ } Ș!T8Tf:Tq T2eި]t撀F+/U~~RuUq x2%3U P=ڵß*Sȕa~RTSTʪa]TɤT2erÇv2;t*9?ifzO J]q dRd2U9$GW:Kt^7nX]8e@*^#YLU'W#W^Iy$SM%SV NAE?(NJ,S]*ylK0?)dd*)}IeTUg(SS@ƼTuK5"XSP%R%TTUf5>iL+jT]RMʪ8UFCdbJֆ"ՔW["ՔW[K%X@y >`yE"X@^, W +J@ƼTW,S5X_g[xQ.B?ۓ1/6jl! N^ J 23=ThRw3SRվnWXږ_k8,|}.[tLwܵdKFaMWv!Cֲ7&#W^)S&m޴#ʟy{!rc 1 sy ૯"{KBKU6«gBi+nj]+%"W^R x`IYIWYN_u=\8_*˜ Q[{m,^صk-; Lf$T1/^.F ,{SJyuЃ ϗJ.iyoJvTJ#X@^, W +`yE"X@y /FmVޟ2~wL1Nܤ]ʆ< YH<9Լ2 ȘZR7p@_ӖO72iD###D+-,,Y/9iАiѬU+L(hRɯY0ߪ{k:nFVU+$ETD===*ˋWX33vKyZPR䕖e W^8eХ07?7`b!C^erL鹚e#GN;uvre^({п?Vt_km,9Э[7CCCI&r^I  R3Ғڵk7kG%yh|,4]+ =yYji!`xu<(!C9sWiff rN߄ݺvBvVj޽==܅nQ;B0ɱx>NV6R9m 9XԈN"%BLIs #ΝF;|v!oJ8nͪ ljWNB!_WJP R9mJU51ΫueS^={5yxpf 7:w$װxG蠧N}/jRWJhȕi h FFF W.q[G=$|bm,#uv‰g>++6ϫ]p 8 P9(unv,^ƒ;;v6?{J__^++6+\/3?p\Q9pԴgp;.Y+uK v}̚9,ޫ62_*.pE-r^g\]|6F qٻ#@y (/`,Tt_`yE"X@^, W +K%X W^*MQFT\yOQ!9O"nLPu%+/U)JOҥ5'LVFsuts٩s#GL,hKmt҂LBr<@>{ޡӧ\/{sg>$CՕ@r6:E鶭 CݚUG+~)S&LUW ȕK,t~{\y ۨKUW ȕ ohq* +Pu%\yNQzb4{RWɡJ ZRt /С 'RMrd D+R+ʊvsk@29I%R P^*K%X@y >`yE"X@^, W +JM͗*#U3R-|*4|Tpj-YhS HՈsm٤<=܍~_(ϒ>_:t|:ʼbMW K BO>zـ7nhDȕji9fnV}uϞ=s8@OO䀷伥B4ώYsssU+WHٛw\y^{vE3OB¹x%T)Q`}jJl$t\yU 7՜ŋ(Ήz%9oRUDE{_ѣ ȕ >1].ƞWJyT)QD,H%9sKa'{rARWy\9bҤYᘥJr&WO ǽ/K~Rw+z1xrU5F^=拀`w>cmHh#?mzH<1џaHJ jSebcg0/)|P+uϢ <5nJq|1$c\ }AW+,pcZчr%sÑ+ AGQƐ^{EPXIu^H*'N,51nx)*+fx%>q-,0{߹[ kCZh.FsaDSeЅ atY43%9JEs4ד_d"#; WvlW_}u;(ѓϫ+k$yfѵTWٛ)*vBHںkŃw>|t[yX{%x7OxDG~N$"Z}^:@#!X@^, W +`b.A4u^ы^zWb\(e endstream endobj 79 0 obj 11959 endobj 77 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 78 0 obj <> endobj 81 0 obj <> stream xWɎ8+x`5Y\DY Cs43 sOmn/h[R^-l9kXc)yw+My?ob©.?çOwƴsq׏[4u~97q;ѐcq4z|' # 6IOv?Z0[wÙ՗3n璛`3D9vaӀ?;r8#1>MM hi(6}]83Ey=# ptOzǧXPᖀ_0.zY΁:J{!oPmI73X^m"Ȅf{")dvd6ٹ"B.  p'%f>a eF$ ,UOG$ ;K80,kZ_#$7(zʂC9 k~Oa\ş,fS,cIdlͤwMg75`<vr9m(Pp 0,i ]LTQqGypjsQFrG}B]|=ncP ZU^&fmR$6.$~El1ewɬ]brfM2˙R,rbO a|LD" R=yDΑ@we$pq+^d*eXЪ64[-^fRBZK6۹p)YjJךmnpXm=\ ''@X0Fd{zVQ[,D?]D.MDuG:#> +GZ_R!}ֲ~j7ǹj'˥^jpwR~;;׽8Y'|J7Xo> kXik.^KqՈŝDr}k6 [:'v,?nظ?^,>d|~o>Zo hBWKuzSy"'AI^$J_.H5]$g^(H)X;"KAWT H=w8^,}OK"$Ƨ?,NF7> stream xwXWC EDQ;Xcv{AFT,X"6PP#"*U"%&[,x2-.eY\k3gNy33g-(h޽{=>J%ޕfL )˅GOA_|ſ8(iF/N7q/I`WP^|}D*) e"K((%R_.(%R_.(%}A2c|)ly1_F^#k1I?%&g.)M22b)*2z^(55ŋgϞ= [%̗g:kS^yL8# w'7a1ޅեSlEO/-YvMqQUy&9ɌtJ3~-<<ȑ#%DXXؕ+W}B"+o3U(&] >2O>n_X&,#u$}1TҔ+OeseDWu+dϝ;'˓إK>2Q 55UɁ-̫Ǐ#my./fe)STne?KYLKKK;|pppprr2ޑ8y$27.yw-N#y2Q)SV5Uf E'4`Q22PiVedV)8qիP}ׯ_vuݸq'C& Jf͚M6luְarss{+u͛ك *7oxt-&*OfiQYʗYL /#O$XbO>Ҹ̇;}^|^F*x*eyuebV}_Q]/f4UtyQ܄ ˑقte\z"7i_qdzK w.p {pg@'ƍ[.Zc! (///kk 6 H/^x֭!ڧ_dy??zH.ɓldidb *SW d]w2=+/Hz#>YmzM4Q8kA/?2/J4|86/ )dB~իk֬YhQBBH8Z!~JA^R R2x111JƟAX #2+lO Ç,n>.J ,"PB>[S.roW0e޾hm&>ۗ[fkE!ݣ#s/h8<8/[aUSO&%%AB]r|p[ (/Ν?ѣǍk.4lٲI&M:u3ڱ?v2!>O>f̘+W.^xÆ ,uV4;ooo4ݻwQ sĉǏg(|5&8k֬~ iiihoV>d6???I>abpp0ZmXwYv-;v,e2 mmm \2=?ş%b@b._ݻc%U( lk*rQL)j\zQDGz$Sf C^uQw2G-/V+v!ٯfxٳ=<< t S{(+8G ɔ asEC">};j@!LMMEI(4kkk//۷oM0 yE__t777h'*ܳɁʂC?2;'2^jaa)1Tgh#GH Z:±x+lVVV0FzAa(%"4Qi2 b% OQ ^-/LF}ɌLgk_U̙͛3 d(//Of6%%Ǐb]CA+ F]r٪ym߾5¤)g̘ј%2D)(Id$jAAYNAGǟ |ҥH H:thɼGȼ-[ q1 M!l144>/O 3-N3 wO/'g7~{, =bےlXPh)<%벒Bآ2uy;e'Dw[^&,ʬ%,{\_XJ4py6[`XyI eOc?~T?$$d Q?b24i(˖-[p!MRR2L+BAyX B 3j H@eٳk.9L&͛7?{{{wwwrqqX-ZĤ)]|t8}aÐXl||'yffǎÇvE!S%HA,_:Z4Poy]&8uTBBSeOtPXuA.h QAg ri4vZѨM2D-@-Yu >(l,h/iii$d'BCCYyΝ [F  M 0** !<<{nziS?[+=RL;Ug9"2 d|G2)SW(mqc_VERuXwCnez_o *0/)Eң.ƛG Kܑ EW8q>Rz1̙34%BQu#FA}M(4Ƣ?Mdd]F ĪGBh9iHR?ow=z4):deeQ, d2ܹs/^8q+sDGGK?;;Xx1*vBBBDcX|8 q.FtRRE"jΜ9l-ɋ?ʌ3fذaPȇY~3t#40X YtR|2… 'O>q1rH`a{ KD_*`?Q)>|8;;;88844 KKK*ۼy3 Xp(nnn/f߿PKwMaOş$v??'kzy{{)O _=5u&t㻟]we8]] [f> G'0oA|}%xF0[dn%ygǢLnO?***111...!!111 ^j +G߹s'B$̉R&?) aدۤŜakF-*2 ۔MLeQ5aZЮ.jwftG!=j?ſ?Ob.]xb'C'cksss)??ſM6Jijpa$ [I'Wo)/  }|b [-CӢyHf#S)?şOWWyeUxyvE`˗Y>ObҥKU$oY1qZ{-w\bń ޸(J?şOS)jw*'vʂcr3  > }(8/v7ʂce3AAAPCC\ P6@AD B)  qEulƁ  2!,8 $ l;V_Zq-2ϕpT'NKI3ӓU- B  Dw 8JqSӦiI*3qvtd܆,T$ PwɀbO:#sF WRnvz@ ׋FDP ?%}P-DlH AHAȻCa}}}5fp`TN}==ÐZjU%Pxwop34445mڱc{23kmi9sҌϛ#31Aȱ?mۚMDzj7vtD﵋IH7" Q ͛W `:6[k>U4ظ& xݕ'YHA42FEhkk\eoԨ2vjG&iLM޺ycFZ@E{IɉKbH:-ohX7CM 8biBB@\!/bS7oh7mi I)=y9%7BcH#?|48gS\@6۱(ө Vy535eIA$2N6ڵ+Rc#wܮj 4{v{A)&&&"Ax.9"|N2A|3ڄ:br(vmP,a--3Rƍ=beժUQxtݻ [VpP褼^dNpd6" tB"V-[Θ>I<[ Ɯ $AHAȼCh1tpNլidl\c\ڵ3/' =YZ;ᤉ95Ƥ@{vhkgƍmqоݲN2YHNpd6 Ŏ!B}`:u Jݻ'` ƍnz&֭# B  D LLL9. ;2ḱML5[7o42*А?҃3z$$dQ6VuuucJg2'"st#BA<ffmd۠Aij5g> W7y!AAJ"ߏ>UTٸ~-\8'+ CYP2+/ {v*%OmhDZ)uW$ $[u#‚6l0~2OZ#c ԠTp Byl87g&ƟYy"{}zKH3AqzL<!_o! $ BIe<{ MM )C͛A~}> RAv ] 2W2vj89'HCIޜ5ھ}/驉`vI~jժ'By]0yÑn8ic4U֗ժUmZbCWT9)$+rN+ #TcINAO M٢) qQA&ZZ0+t}bm0_ڃ4ܩоK C1oakB^y3D§dfjwѨ7Tf_mtIoiV( C-7^yӼstn˜q6#l,`* <b7Yq .usy'G ж6\k;A̘2|}$E}{! ӧ8ɻ:z4jj䤫7e8>xB/|V(eOʐ!_(Q//yOCgfP 2˅ؘc}ʽPe }m굫Μ0q8QC,*;4uTGqP"~ ћ9FI=JQX+y`|1~H)q444T6:vnG#܇/de{>/89Wopɮdş$^|$PQ1="vrZ tv{a;uӎ=Ia&},[1}( LhqNG t5<ȜwsC…;}2㇗v{WwsIA1~MufzzNi^:ps5t.lw |n0gZFjY"Uֲ5ny_m;&3=s$ JĀN/{{K/ѿyi"yHӿy >r”6R] {:ݿt ov oֿfj7xyYt?= ҠVwqEUOSv贯ǕNνgS(ʗMA8 7Z]g&govaYP՞T Pm;/],C73B06kKuڍBԎj ^WGVM5h MAn*_[@mޱaoOED'Ǥg0?r<8ع ,3I:O8}ɳw\T?\{b4-0']aĄ|^pʕ+w}۷o8bL; |Ed 9qu B KNFNVZVFr/A/ow}`nocbIEXNBB N3! w9~9|۷ZΓ|;O< 9~U B I3RSݟw_]'<]v(*5pР*:s"NqRӴayd>*uZfm'U!("'wNⷹI~Iss}/ww%cʓǷ4.˂մ;.ge*Ý{o\v9VNmikiii`|>z֭[QQQ];z 'A%'5x.9.ֿǽKo{%ȝբ<˛׳m/μwqB_'Ca URiS^w-3-n׮U6+1zTAu[Ϯ_ڡw)X^T/ ׊b M&;&8ձ}!mq?k_3-yĵ 7\}#wܱ̍bNҸ~ڶ)ϧC^{)ғ3*Czv;yݮ!p -=.] k׮ ɇ~w- T)AD!LSŽ k :?ͅ 5lw9\/X}.vbӤw"Fl_a* <=om]۷סMz_iꡳnn^g ]ش-3=|]`>=v{&Ԥ'x|{yؑ~x?lw=v#gNr z@XsqeJu`ܶ{y#,< m.qsx  sWKۏk~O>}}?JII 8pN3$9,%(  C]c#b>Űc~.!}*%ߨcS߽t-'z!i]bW޿K98i˗Nݻg'TGٹOx>%J"} DҔ鎍z:t[oPACk n2q^q"qdq v, ,"Pe,7jnH>T A=5x:2SA@m \W,s3{椉C ֭sNO6cSby̳\6rk6:cY}L/re 5ٵ#lL\`neK] *WW_/ACyZ,MAW(Jku tǹ591*1>62LxtThdN :v2l(Q0N8s`]J'12q{{gb"c# $EaMCQ)MAF% dA455'7A  ,-.u^<|ƂA+ JlihXⴵkPE^6l0ud%OQ!M3ҒJvpZjV#A&fK1"%TA̟3R-o޼YǎdqhfZe:/LFT"|u֭Z gXsp"OeKnPj@ :-^'؎Sg.# GlJd)eb^`JI B^E:AZ:d \/tuu,a? 9zzUTRbX_Oh 0Kݺu8D uZߖQ$9t Ѿ1dDGby"}}m[K=03",xyˌLFT|zUU4iܯ=_ծmc=~⺦A*=.yAi70=@ai'422r[*oAEl ɮfqڵ3ӊ8B`A~(othn CE/u^\|'U!΋U栐 y(2JVnG$bwprC¦F~F ]]d 4S\,}j9NL9L] qQظyBЊ_hk뭛7;׮Y#e:/32EQ Ka<C7ofc^ 2;mTDqMmyA)"<}2S:N*9;oajADa)ɥ_?ӸfYh8ژ$ߜbeXکMV3g8;8b8NΤiϖvaDX0TEESS3LkYN:7'Y`">6rX%O pV,. YuTر={I`(vmX#OoqHm}`!|28Μ#Դ);f!YTM(2wRD?-cE{Pf%eaǐ (otjADFl`' VzD&Obmղe^NV#}u.d ? $3&|~+Gn#m$ظfǎPE$kg@Uhz3jjDImj >V[VHAMn@1d:/32zb8Zր{{13!kRF&8FE\{2vd~ۣ zz>^FW!ȓ 8`jp^nq aOSʅ ܸ~->/tЮWU^!&gT۠~=?SY ˄;=bUe w hl~BjX/Ag.LeFF].hÅ3׭1 : ڴQd<\Va᳋WvHWĤn]BQ'Ʌ?vem5jp  03k'y8{`.mNƎ?!oPB">6&ֹVgnk]Q=Q&T>FuSV>TZuR'28鈰 LvA͝abMMƩ=o&sPBAXdBO$'-rB_=k{jT1驉v)35,BT_&g#Sฃ>-t ad)+c.g#{ADs,e)sippf{PBp{yGׯ[`P 1Ԯ]}RPK%AASʬ ;ظqٳf=D<[$AAkʬ $  JAAAAAAAAAAAAAAAAAAAA%a  29Aw AxOyN $`_4T J T ^V^ n /"T]z{'(}z"AHJ!AHQ(9- $B $(MHQ!AHQ $ B 49mݼ $ AHQHOzU%&Ԅ$ (MHVNM:My PDeC415!1&, tZuKD@$~];imo7G5beV9UWn'U\֯[])IofzJ=sa{P{R!"‚;vhצu+Wcɮ>v , $C:/>BSSsႹȏ15m M&6!*ZG#C444 U7"s"~ N$b(N\ !%IT"?W7& 3Lnvt9YijWɈT{ P $Ԡ|q:u(߲ G҂m Œh)/b;t#Jv ¤1< T&2^,36(͛7cP]lVl ej5fƍ֪e[&\@]Wj׮ۢEs<3ݻu 8'*Vz)l B>WZ@f5kV=0ˉs^qGȴhYX[ G3?ޛ7okmHӞvп/>|Fo̬ b23U"o OjTCj? QjPDrb,{08=5wTD3pto~ր bI#D~]v@ Dr?C~J3rlG .FX Q[0Epp200k΃~nY~l !A*^*!D@^44!AH!AeJ%iY~袡wˆQ5W"HQTP/פJBu $ B 4!AHD!ADiB 2 B ҄!AeA B $ JAAHA&$ ( $(MT$ Ȩw2 J!MALh*#£RAX@l2`x/]@CCҫ*88ݻw @VOo!oaxQk׮ӧ]}k׮e^^^XPeXvv6;t>|خ];l KK9s j* B?~ɓ]]]sssY<oܸD֭b(Ȟ={!`c.0x`333uʋ`.M7)1Z,=cƌ#GUonԨQz)_ ٙ{UR ###cFPSI'[DtaܹsX5tP||ׯg߿UIuܙBO>E>!+5E&Wl0eZ.$u-Z)S~޽L!aggo߾4iҼyXyiAsQ4y(-{+/! ҥ˽{xfZZZ@@_0a<1IVłY]߾ŋϗǮknnҽ{^p!_Ӵiƍ{zz*S!jm4E _0:u,pQFbDD6;wDI[.^rvvFZjӓ&o^ ELi3gDZKK+77WɖEjŅi? Ԕye׭[geeL(V^ؔ6}VV1{mgFLFPEj9ȗ.p`k,Yo1b7`;vsNB!4k,V˗/b9hGajԨVAy{{+߲HMA/կ_9kڴiH4noݺ=z 'y v!3 ! BkڴiN_}rF[%2gcm͝;Hɓ׮]þZJv%<,==ؘ]|hF,ߦi}'2`իWoV˗/o޽HIIAsrrVIm#jYdyyy_ yf*(l ɓbCVݻ§J<Yq!Y%7ddddddddHUr#AHFFFFFFFVɍ!Y%7ddddddddHUr#AHFFFFFFFVɍ!Y%7ddddddddHUr#AX655Uzյkׂ>}Z^+8v *ɼ|D`s| Bv>]? z8q(&&&ժUr&ݵWW\ (\ iJA u߿g>D~GѫW!J*͚5KOÇY& n˖-2)Yz;J “'O=qٳG&#SETƔqߴ KYr`ݺuӦM_~!C $sƝ;wXƍ҃F18w\R͚5Y :ute\M<G7pU=Skׄ]/// WV: 1ņ .]Tt[I޸ 맼v oG6?6>ׯ;o?!!tWa<* ’K~e4!{]Ayjժ )17ܹHcG[nHl#F@>.!qevTSS3##Cf^^FSL=Je\ =p@lnv"h]QK Dfv~YX 9p@JJ0ر, cƉoai\m޼Y۷o1W };4w\\`ɁI ӧgE0 ̜9hhzid*Q7<{mܸ%ay۝f{LoT ŋC WIC%Pf~:AiӦB&}| +W2QL+++jaqƌ6WXE[[[VVZ!&|]]ݖ-[^|$JFn +߱~B8j䏵9Y`?6_[#-[ԩ3r&MiYn'NHgGwNQ޽qUX~}򯘹\ܢE a2+;0LZXZZ.\,X0|ѨQ#?O(o\S^;|;,d*L+ 0El͚5*l|Ì=Z lذ!יddݠ-W_c&hD#ЏNUJc޽|ƍ <l2p`_Sr۶m[ڵ!آ+Z/.*gK +`jÇϞ=L7~kGqܔounnn8ѣm۶ϟ?D/B| lwf]GށImg񞞞H ֬YK~V G.nݺE{{{,5߿y Nȷ+|aySºd6WS D*jӦMIL͆8K{wɼs ^Je]KÙӧK_jᔊk@Lw}7e;D ps)yyy}~РAS%ֿ{S9Kݛ (l>$χ|,UX?嵣 njG1|:u:_pmw5 /U4k֬G\Ж?_^+ , =UX;\EDD`W;wz˘:tuu1Y"rtttfΜ4Ģ&a2d;E0&&'N@'Lz8s"ddl# 4ܸ7PW.hj'%|,ʁ+Wy,ԅp;wgZݻq𲛊H׻q`~:::Hj 5&ŋ1ύo^ِ5k|&1*Z[0{`` b?ġUp}e\RP~yɯ@ =2`'A7)EuE@2Aڱ;wжn Q=x QÔ%M61|!-q<5T}72nK}A!M%L]55>>I:Å)A(>}B;͛7 %)0!m۶۷o`W_ewl4i@(.L\5B(1G.|ѱΝ+Bag̘ 6e~ʋB燒(O3_cݻw/U83spp`4?_^+ ,hByj |҂Pݽz*55U 3)))XNNԻo -$QH.qًzHFV͛##GDoSZ W~| B@lUY:2222222 B2222222Jn$* $#######F B2222222Jn$* $#######F B2222222Jn$ncɓ'k ]vo_߼yILFV|{unnni Bݼyگ]Kkjj:ҥÇ7nXWWֶXU{m@@$x&睜L؇*Of//Ted+ʔY3*w?l:P O|"% ˻.0LiwG;?~-(ϟ#SjՂ{MD"}_bIII;vDד'O ?..KDQufҽs{I͚5=<<}6[IsճgO\|uܹO><Nm$mѢEZ^266vvp웘5 Eݻpfff=z8֭k^z +h BU߈yMl ׯ_|77C1gϞ-_\KK޽/P~bpF@_N~3: BEDD7T\ѯ($(%F28.(cb45c\ypF-D ?bV.%j͸° `hT;}M/UT99޾ܥQdʈsMQh2iii;wFoE爠Z dkGKwm,ǏիF[ff(ɩi,.]қq˖-J3g|(-;;[X0;wz|Q399YOM!Pۂ}z6(PnXY!:BCCQ~Q7鬬,Lr)$铘,sΕtBVZloo_]]]jjj]]B:t耹*++_ĠA80k,.\7e֯_#g#""F+=>ٚ_x<2E冕zyy1|I{1Vܮu:ĢE;I:!ݻ)l---M2xP)h{YEE1?xI0ԩSf7պ prv͚5lJKDS \ؕ>^|i*]/={݇5'33#+W+ȬXbfSEB^E(m$aAd)(7lꖱ}ӽ^ ⎰FB8j(1̙3@JBx T ÇGyȐ!FTr٥K}׀H+~}+Ie}%K̚5K 1R޴UuVOOO^l߾{wQQ4%q!"¶+F0;;)yfQL"O)5T[x1ҟ~) ,hll ev_X y% H~q0P4iHO0A '}7f9zoݢ8ה\]]^j~|Bh4!UBX ȑ#8qBLŨ_<(5HZbb"iq NEݑ޹sx{xaE:իDrdZyӆ $i/z&go4a7!??[n5ZvZPPEoO8Q6:8{a84++K1Bh*!UBX8+WDCi&+(TX[rPA;GKKK{rE5rvS+IOOwttiׯo5KH{h\111=,[Loٳʒ˗// "xأ?Ce8b'}vyyyأڢu5A!l#B 1#{SBÛz7z}}}vvD)))1ӆ?陚zaTWWcdzzC!$Br(B!VB!ʡB!X9BB!+BH!bP !B !!BC!$Br(B!VB!ʡ;QQQTWWzCaCs̩ R/֢ŋB! ԩ{ѣ6lHۭբLHHH@@@%䕣GABoҕ+WΜ9Ӣh)))Dќ8q"33J? !76)a_ĨC4JBXXXxOASSSEEEII|XD骪,4~yyǏ.((x(nnnϟcv-;wi b^vΝ;(ǹz'OD"e dÆ C A+BQ\$Us;~~~'N Oc6~xCA.]*<}wӦMӟԧOZRNypqGnWĨ !|^9(߸qU2Tڊ{cƌvmdG%EEEgϞ@蟈ܵkWeVyʕ+H5CoqAo탒-[B!$%ҝ;{ꅽ.Y$&''/­[tPP͛-J? !=¶ a_ ?VB#44GEqBzʔ)NB,sΕtB(ȭZ޾:##VWW'ZlV!{ϟ8q8g$u:`… )=>ٚ_x1E冕M2/ cRzz7!00P\aoohW fΜ)RHG4N+JҥBS}0?ƔG__Ior`ĘN,Y2k,TS})K̙1B ?/_vww/PDvvzSQ'!BXpШI t(?#TVVVQQ!6BS}0BH^Kn"FI4;$g7i$0a|N`J+(KAvZQ> tDDDddzSQ'!BX ȑ#8qBLs!{IxPDCBB$U!twwGzΝ?C.`~M& SqcuV{dB{= 2޵kYqݻw1~B^o(mosrJd=<<6mrrr|}}%U!m[BhPGc%sТFњB )hjj())*++mhh@*++Kp_^^c =z$1Fkkkmll>'OZ-B!UBGccJ"4jl4ozܑ~ە(1B={W>m4oܸQjjjmmmŅ1c@PȎ1j*DEEgϞUGxɓ(g,X0|^yBy%"ДO$ճArB=tѣ(7nYYYHO2ԩSH'11YΝ+Z޾:##.55ho 6X!C!4)3ĨbUM>E冕zyy1|I{UU퍉ACEFF"hѢcǎ$[&~P iz"Bg !IaSdQnX-cI2&{{{Ca;FQČ3g)BԩS %B!Bh J]!4*٘ϰ0I7o***$B???Qެb)|||KKK[F!:B!TGxϷ3%!9r'NsIڗA%&&B T;w*!|ȑ#HS\r̙rTy{}/|.8j$BZe)a_ĨC4JaDN )hjj())644lUUUVV써_^^c =z$1 *J Ȗiy&GGG#kܹ7WccիO<) Ϟ=nЀ>Ԉ^rF.;~~~'Nl{LδiPqFI+`Crokk+3vmGFEEfϞ=+LI'r+BMW^B+##F~m>}oDpyldǎ+%K/F_!fs^za¨wffzN-rKBfq M74fH9P۝}z6(PW*5i$BP=zƍC:++ )S })X(AzܹBA@@Us0O;;Ժ:I+:tEB+P9ץKΟ?WJ``9s֭_~A8p`֬YH/\P !1c]B:==~'ׯ_}AQIPPHO<9::Z\`xoiOSK EJUjÕD(ĨbUM>Ez5g,BzI1o#?tE; !ݻ)D1--M2 !p~0u߾}!r ʇ &io[:v숬}!пBtQ8uTI'hH_l ,@://> B['|"˗/6mzD8,W_{i!{2iBbvgpH0@ Yܶm0:5uDEEKj[?[[[;+f9s,Bڵ 5.G(K.>iggg蟞Nyҝ;wEX儼M0%K̚5K\`xoiOSK ou%~Bbv+4qUdUP*|Ba7oٲ2B' [*pO?T\kllk׮(G6::Z"^4;v뛐%..N~rc„ US}K\}}*o]!xC#u2i"s;?Cx-P~DVȑ#8qBL;wN>^;o޼71iobbbzhIvyyylmm]\\֭[gY Lϖ^ڥ?a5 ׸f!yZ*AQ[pÆ !2)jkkl05ҹ n| !/OuPDOODLs[+-OCBQۑzq5F)JRRRP~ȑv!B!|8yĉ^ߍ7 W'ȿPM!ւBH!bP !B !!BC!$Br(B!VB!ʡB!X9BB!+BH!bP_-B n檪Əgh{Y,--myg !b!WN:aZ+~=DUPsss͏6o<ߛS9!!ݽB!P_N?8$ HhM!P{ ***JJJEJd$U,_~yyǏ.((x(nnnϟ#-Θ1ѣGqvdL=FQ?!L(ozܑ~ە(1B={W>m4oܸQjjjmmm1cPȎ1ޅ*DEEgϞ@Hܿ_4FgkygggQ~۶mږ-[D;whOdN<>  >V0!IqɿfytfǀK. wU ŋz0"1}ʩZZ$VbccGEKX? eT!P۝}z6(PnXYP=zƍCZܔ)SN:D>}EzܹNA@@Uu0ꌌ RSS{F\TTttt\t)"W666H 9shBh'F+BM7l:뗐6g4G1[s0@l.\8ԩS˗/ׯ{wBS=4z-؉0رc̙3.Z0;w\.;&OÇ1DsrrI ܐ6l&Y qr+[w!B!lw&Fj)(7,:ϟ/iخnoLL :t(22E;v,%%G]q&BػwoSZZZx0)) &L0gΘ1CdK,Yf aaavcBS=1$338$ kBC4vl0vsrrBӧO[Nϱ cmܸ~I/`^~ׯ_+//G|zZV^l^*?1M;bׯݻwa8hH+-? ?plOb !fB!lw$  "OEaeS% Ș3с⎰ iBG%f B5=R6qqG b|/99YqCB}<{l!z ԩSJ;%WvxW k`7l0>$cH̙3'LG}}D-z.\0 Zvd޽P,0@}g! pP_R3~B(Pj޼y$}O>(̙3Zn݊\t А!55i_0uTIBBe!y,S|8_|466^~S?<~Ҟb k1:p?2v[o~ɓ'B޹sD1BH{={2_mbP !gΜHxp.P !B !!BC!$Br(B!VB!ʡB!X9BB!+BH!bP !B ETTTmӧO?#FwرxAAA˖-`ވyi".\"!? EN0GHh4???GgϞ}y-YoGF7o&}/..vqq={ tB# 446%˝pH>FњB )UTT׋j644 ]UUF///1= +W?{ RSSEEQ0lcc#AR]]ݵkܹ#υK.?4 .eeeǏܹ3'OkWT~ӧ333˧f/\r=!lvy)]R_3;FIB aw_vJ:B!iJM7JZC5x\g[[[q=m̘1$TS!;b///$P!** @pA|KV'NOBY!{{{u]u+r{סCg*B`ҤI&%%鵋I/'o۶*ϖ-[DӰM___YY^od͚5'N5k5#_~`@g4G1[s+W\`HoݺGl2 7Eas%۷o3g_E"qΝ]jPAl|BZP۝Q}Ū:|, + !&i/y111sСH$-Ztر|O a޽EL!9P,I }n޼yˆcǎmll4V⢢.)믿F:<<\`]v-Tp3znذ3f %K4۟5k &&y)~@B$ kBC4088CyW^-ʱa؅!իWq[gϞ=xR1Nyr !V$ 6,>E冕M2/ cRzz7,!00PaoosQF0ؑ{!5mܸQ\;r䈩BF%dum .pΜ9_~7,z.\Yh&''#liq@  :ѣG>|Xu $%WvxWZ@1x [ъ+r 1 ҂ʹd!"O~0ڽ{w.!Ī;\!4*٘,_yfQL<.OBxӧO㋻8 + %A2ﳄř .n,g'L#-k׮ӧWK$B(2&օBXb*;zxxZ0"Q jW\\, all|=xO"lFFJX%o `rJS%wED\{1? mbWWWX_^=(ߌ1/B<' [TTԫW/l]"6Fk|ͦWB\H`Çc8oE#X3—rrrTz-/`^y+߼y'Z EBH[w/8mye)a_ĨC4JBXXXxOASSSEEEIII}}VYYp,4~yyǏ.((x(nnn0ϟKBɓӧOgff^t+ Ξ=+_kM\vΝ;*MYO1˅ BΝ;H;99F3!(.*nϘ1f5k :73f-;v^ -]:uj?p׮]8z+䵄B]N(ٳgzӦMCƍ%;tP[[[q!Grqd}6#FBP޳gO#<Ӕ8pYT߶mtв~ӧ ~: ͚5 iP%>BXXXʈe9slx8$$o߾˖-1zzz=>ٚǞ8dȐcbC(|r~00 lH`+T^p[/v AAA*q0A[HCEz  Hv74TGkA'!!T ;geOKR~_*G[n褫IYgΜAE FΝSY*lڴ @J%IKg@!lw&Fj)(7,rϗ:Mؘ9tPdd$-:v%$\[& P8c Epd,Y_txxZ]f糳[__Qe*G5/8 DJ;w|=:+[QΪoi[K=CK,oyy98kYz5Rg۶m؈t;il@ a38$I lY|, +e,i_@Ƥt(p$jԨQbFq= )! .D!Md1Da.]|@3|p;;;cP.*MYˆ$[̳g6BİPvVN~A?RnoJ^2 6K+'OC3qV=y$9si裏`\68Sr(l.\P7GjD! -..#;&$$ w.Z7oJeI%~K?}3STO>B,X^^ dŅYi!˗+6lǏUt;iURA!lw,BhT1)88XP&q͢BYY -BD%Mn"&&i 駟H%;u!T nϲZJ'0@6B߿]dСC~/Rl0@#A2}#b@aFFcjj8bwCK+(Sq0O?QމhaǏwwwWo#\H{ ^i2zE~T-7}-[JCnݺ8)zBhj}Ey#ߞ={߿_%~Km]%/vǂgGĉbxvN<iWbb"QjQ!ġ;w5Jn(""VEGG#QxM֭[H#F^ZX":ceCoV]c^ Z?: !"b>{ 44n؀RRRD/ B(qeSӧO%F;i$9}q;ˎ;LAzwqRF5XeB?Bh@>}T/ aIzEߗֱcB8j)ŢuYp@eBPYYY8?^%~Kmfo@!lw,xX<0XrQ>p|}}%U!ġ@T2V:.]gg={}7P2޽{#rLʆo ެ0!!Ae)P%S1RX-| !fs1C[=)Ip>6]Fܰc,#. ^x;(>|cP)^I'tSq|ŃB!V բSNo֊ߣGk_~#Gt),,F>|[,frʕ3gbgONN1ӧo~MsB @CcS¾܉Q$i)𞂦&xZII|D骪,4~yyǏ.((x(nnnBY$"]ŋh:""BTkܹ#.]-a?lذaȐ!,ݺu۹s'EEEX3}Hozw08qb=ct6~xew}2gc*'ݸq#zkե'=(ozܑ~ە(1B={W>m4oܸQjjjmmm1c}EzܹNնUV322\\\`_uuuzBIaJAR2~𡃖O>]H)*! .A|||ICm50 ۳Kɹ|ŋˣɓ'GGG#Aݰ8999::b'2BzWWW8rMPjz}B1BL/ /VSdQnXYWϗWpw{cbbPСCH,Zرc)))<޽{$gB&gϞlBk$%kB6OCB=zH !\t)֭빩h˨¸ȓ<$$uNȋS)~o~%] C$^dɬYIEEEp^zeJoߎ3%3fVQQQSSӷo_ B!vǂ+F0;;)^zyfQL#,O)-T[xJd>H !ܸq#Vxx8N%!J!ܵk썰/ٵMȋs)6J ّ !P_N?8$ HhM!455UTT׋jB$(++K)_^^c =z$1N޽;sLd,y Np%JvѢȢ\tC/@cQ(/իW%蹨, !JKKT555H_ oذaȐ!t?uHof~zϞ=? 6lĈm/By!(ozܑ~ە(1B={W>m4oܸQ`5񶶶²ƌ#|*DEE,YBUȗmۆldG-{Ȟ={V/2&vLan\\\ 1S p6$F!oӧ7H:!D7|SpBǰ׮]C6e-$+%ҝ; vاOJ}[ۮ{bv'a_ ?VB#44GEqBzʔ)NBv,sΕtB(hZ ^Ȁp%%%޽!vZD(**,9::.]+W~~)mӋlcBD[nEbӦM !n'N8gN̙3WX! ^jB;tޢW4t?=>ٚ-4vV|ƃBZ a31j0XUSOEae!^^^u@$WWWqO6&&u:ĢE;gI:!ݻ)\(--Mj‘#G!I{3fh%K6F;& !ׯ_Ν^j6L(%tYI'ZQiBP9kSN' kBC4W_ !eB ID"rʦnK1)==[U``zf#F#pԨQbFp R2&'Oܽ{w߾}ݼyfrr2!!!zBB 04'OlJBE9dX)]tQ app(裏v tBH@>4_'2 N:#A!lw,BhT2A{&Q((++tWD^Yf!$PLḼ[PSBhcBQ8i$qYR \.ڵh7Bx7uԯpI{dڵ0C19ꡡ:[KaԾ555^777U߶m4/T*OS \؞?^|iD޽{k޽r}] !!-;CŧȢܰ[ƒdLJOOǙ(鰷\ 5jq̙B %l㈏ .TH( ِs"K:W$>%!C!\t)֭3\RC!3gNDDƍT P֡""B^ 1:/yU([/b0M1*5k<ӳW^ԗ(BXpШfgg}aaaN7o,*W6r"#''' E5ؠ|1_I!̉,P~?O?Ev}7")ifHƄ'\LP{kj-,d߿T.ΝkJ&_()`fG}N4I'L _ׯ_߿x6P !9r'Ns$ Hm ;;w[jҎ'dw!ieEGG#mkk{ 3#իaAE?oݺi&xxO/)!4C3Pn"==:TB(43y?ڵ+oM& Szw֭F Q^XX}6''+۷P !mݱ-c=pSW\M }WƊh4p*Q8J)uELٳz6_ݻ7JЖx 7r|ee eJML!T6at_^7DɬY=:h\111=?*^駟޽mCbe>suuTBeP_B )**2~mm- M~򭡡!??ܐill~:6z(,,4Yд,&ZMvY̔("h"P !B !!BC!$Br(B!VB!ʡB!X9BB!+BH!bP !B !!BcmB(pB{wB!} !gNXUU7~>k޽{rrr '̇HeB!C!P ]]]Pн{\˺ѣG a̛7+OHHvtttww 9ұcG///'''he !,B8?L&88 r8c dG-Wxӧ333EISSSyyǏ.((x(wss=W5VVVvي e.]q:h8! r[iir^F;i!,!i2X'XQ!9|X8ҭ[;wSNbU&B9B_Ih?TCeyFSBέ[UgϞ+C΢mPxmdGiA6** ={/3?~|/<<\yo޼)io&:t0p_:!LCihFN˜Fʤr85!r[x#w31Ew^Uu}Z{^봋Bؽ{w7"ʫ[ӧO6lJ`$$P BxE*&''c©B"VwNXp>;wޱH !|=ﶬ[R*|OY̭L!SxPraB !$$$ V]T(͛f RgΜ)B5/]6rBBxY(NYY١CV\2x1aÆEDD`P>u޹P$(Q׮]$Ou3~AY[[ !4u ރ]1 ӧO[B!ju5+"ؠT!h4qqqQPxyljjj&M(ئM ɓEeqQ)///$1/8b yv[0*<<< Bt߰BإKVZg{nn3y*:)~{ҥ-c7771Jk?ҦMVa 3V&B)2B(iи J5BAyyyNNNFFdsX#?-仜* ?~; f?U;n:y$ M^/+B(~_߫  233 *ttDWuv+B!DUBSt\|}HU^)Bp(עχ(N<!B^4(B!T !!BQA!$Bp(B!B!¡B!X8BB! BH!bP !B, +@RRRHHHffޱw=}%B;;CG߿.J?Hw_!BЙr>ڼyޱAAA={DH4AZi4ͭ4ׯ=KN4^VJ31￟_~d~1f)--ł()Fs/Zo/Ctܹs?ŷ|׏ \_^}|IBo&%%Z~#P> t?_C +O>-[z[??o9B(s?CX+mPvRlސ;wrZ\HB ># W=}ԨQBbQ4^'KtдҌ,&}^Wsׅ|0۰a(4 '>\>E8ݿUVhx LBC7w ݻw?u͕ǁ y|"'O6Kڋ 1-J?5B}M cP<- i‚  7pjbST+z0X_4=hnwftB_'L8Q?dȐү_?r>}8y|W7x LBC7w[0L"ECr۵kgE<]+6?jP ^{X?;㟗࣏>/)P}Z~#{P~>s8K??oiB(U9Y0TaͯvA nڵ!!!]t cBBv@!xEdᇑ(N~~M ؠA BH,%'+M?kW0_/I6V'U Kd|xR{Pͽw?}"ɓ[nݿ,;Ν;Ǐ/**R̙3hSe5tu͚5(6jh5[OB(*QH"Tz IiR:KUk׮ǏGiap۶mNNNˑ|2vヂmxx8eƴ4ׯ|/44Ti/^dRRuv\zUݻ7n kqB!^"А+X%Ke"WLIItyzzm.ۨQ#!gϞCsvvnРArrrffp< 0!Ӿ}{Hȑ#Qqㆽy 6Lx2?';SNf[B!PbLA7|0oן._byUD8X>}3| &LIzyy<|w]pIxE'O={vǎ;dȐe˖ fΜ9>30@ٳgkz BKg ׃1byUÇ|}}ɴƍ1$[n"?|p ܹS®]Bt邤SFGG0w\U aLLL۶mAL_ByAi۠d{9::B`"#7.\( P `TTݻ!T^Л>}:2ƍ"lذA P $Bn:ȤFf2kB!Bh?e5DyBBBBlll0j*IF0tbOD6??߈6o5kֈgB8sL~y% cƌQ|)Xfee|_By1V $pʅmP2-cI^\\O'ˊǦ6iDrrrڴiT^!}9|Ebp„ rB///apBC~}ɓЭ;v@G1jȐ!˖-C%iΙ3G-3ZZn è-[H!RH, azP0@ W "|rX Ç뫬Z^^B7!vM.m+⊟.] ܹsuH%[֭TڵB0'OۤIYu$p2SQr劸h'C~DEE2γF+֯v կ;YG{k !(Wan)stt PҊ .(Fc_}Bw.ƅP~?eR[EEņ e-X0IJHhhhLL_ B$Q'22Ҫry睚~ZH6uӧ|I+֯v կ;YzZifLLmW ac3E֭[X ¸BBBfccUVIo+xe[[|#Bؼys׬Y#?C( ̙38pW&:6rBBxy̘1)t@o-w=TB(O%!4.z$?C8lذ7NBE<~:Ez_ N@rsscuՎus[[ZYݕ7kM1B^A(YomWYlFà Y||\355U蓸i&-cB8ydQY~X۷oCɐ>>>+ʦC3lڴ)TMBy*q!ۥ tҪU+1;1g}fŷILճ V;u͝omke}B;7 }_󺝦f(!>P-rO[^\УGT+**0V[ Z0=c ?~; f-=1@]WkUfuܺuK˺_;ʛv oHwԼyB^(/P;OOOO*پ};)))+B!ŇBq}޹sW5۷è͛7?wAAA={AOڵ+%%7B1 @yE-Y}÷(#f= ?.))cW^r=z4==Td`bw}ʹyP!rO>>(چ#!_o~|}}k}rL{EI{Vں]vv^*U PPDj.z;|-[] R*NBHLci:f(MfF'N8p@Q߿dd$ k;sGGG 7'C!wo%W "ӧvϟbp„ 4iB///O ewZNqUTTlذA P HP~PF5CFٳVwg+J!o???!4+w. !1Håm5JTI@@(G'ihӦObbbC!5BX TB$lll0j*I?E<-22e[[|#Bؼys׬Y#!T*̙38pWۥK&ZNHH/8 +Q>CX-n78qB,8&?~A V\i}k׮jR<8wܱcjB+Er閬[_J_[G@1ثW/Ç=^ZZ*2w}ʹy8!rO|o?~?BiO3v&3'N8p(?22t 6 6#G8::bݻwϑP !@!wo%W "#ӧv B,'LI& !yxw-)b+**:yٳgwC Yl Ɯ9s`gUBA|Uj zUC hBJ)uCqhlӦMS:TwlrC__~x}s !!(Aa_1ÇaD8p(iiiФ( !ݺuÇcpΝvUn֥K$:t -::s:f6 ! M5jˮ|:Jq_=};v.**Jq6rHyTaaw- on^@!$1 {!E0C .(Fc !ݻwy#B|9eȌ7bÆ ,XBXX}#44TamP5BףG۷o?'\."MzլZ*=|X}}&ܧOj}M6>>>77/BLBX !988`ccUVIx3xZdd$ʶFy(YF)V\iyb z%{qqq>\(>>^ڤI1iӦMR[zpɢҨBhxs_b0VҞ!!A7 6`OQu{"6rB:!B!wo%W "?ӧvϟbp„ 4iBU@}| lN>>>'Q 7W2I֭o>Af.(!Ă;?C888`cccUFEFFlkk 2"͛7Gy͚5BΜ9S߁|}}>]t me v 6%oU +ngƒ [v-ֆܚ ^!4 Xȏ?~РAֺBA$SSS%+0db!$mto[Փz_Knnx{{c=BPo,8M;r6fHJJʯ*i/'BхBX=}ca)M4`e6mt.)pɢҨ۷o{yy!yG|||0+Vs/..V-j۔twwJ!ꫯP~? =K37Έ u.]*20u|C3ޒɇX3UTTT3-SLd?oak 8[P~ǎ p҄,g1^=Iq'BхB"`~yyNNNFFƣGT***0߭E 4G <.I0k۩3J233 3T677={V!p-l5oV;TABHPI3n8[[[q{B!2BRt֭m۶-B! B!¡B!X8BB! BH!bP !B, !!BC!$Bp(B!B!¡t;00pƌ7oެ;vU|YYYz 8pʔ)7SNYܽ{CбӧOOLD .| +=ٳ2ҰaCGGǐ y8wܱcTI*߯hɓ'`ltbaP_+*nDE5{zN#V!۷Ǡ ^233aph-//ÝFrDDč7̛7oذaB픕IUB/>,aÆLOOB(E)z[>|0 йkע>cƌ qDaƌ"/W,x`` WWW#+ʸ_bU`)9vN:=CǏM~4N+r|ITT(w'/pĈ?cFIA֭[7m'5ؿē8e~%Ə7|#:3v#G 1ooog-8]:qℨ=CIevprdJ! UO/_1&%}1688X S4i///fO U÷|'O#رC\2dȲeP  ̙ɑL~P5m9,, I,o6L+ioAP1H\Bc+ŲFVq!4Bٳ۵kghZSY){h>@EWpԼysl?6o?G;˗/ F{ϝ;W ]fVydMCJ8xF."פI!VJ}_zQ aLLL۶mA,)[+}$S9xbooo???΃Ln;.4a#}:28DZF<ł P TBr$B(?C(R,A~Ν;CNt}I %єBBh|E%֭ÚYf\E.lYTzz @\o =g0qD^RQxΰ,Y"}*!LL)*bP){q6meb?]!3z(Xqj`ccAqR_.O`S(og7o5k3J!9s05AA&ZNHH/8v%z[q HڵkrPhܸÇkAqwwk"VTee%(coLBZp*! ĕɬ,u$mt௹7o2yUqU\~H;/!fض=<( `0B`0 Bh `0)u-&>xo5 F`0 +KeVM6`0 ?R2"%H(] `!ֻaYUBx0B`0BCB{ ½Ͽ[q(`0 F-АvƊezB,_VS `bP a;_ P :sR `bP QW-B`0 .BR8oB`0B#B20%9B`0 vBhH_JD=s/0 ݠggDgg `nP tt[`0D؋՟ & 6`0 VeEͪ0moʟϬ `0u* `0W>( `0zc~`0 񧅮2 `0,0( `0Bn `0 GKK11 `Q\8]RDR `0uA>@hJB!׍ 儅:xneBB!Ÿ޽}hiӧ|2zO4 /> uj?tԛ]:wzPР{ ܹ3&̣B!21"ٙ qy $?s3V'Xd Ƅ6Nwmwuum;%:jۧV7 ?rD0B!!<аTƼsfw%g ~~u=}F5!&BJͭpGv)BvchBH!KƐB>>qUgSG}28n.LcP>tp[{NCc_OGvheP>#V@kޭgw^faoo?zgvIኳ:>9uPAeBB!X*!ܿ7fZlђ#?>}Nˁ(CD'~2&N G}4S}˗ 666I?B=);`0׮jذܹ3e!<**OG-],ӓ !b(0' l0-=uM>Q{3_*b͛`׭Q&ړ63[KO2Chx ۴j+.nn]5jBC7à=} !!B,…KW!~' AKV,YܲcO|lD{{Q]( eK/9?p@_'ma\Tض[[[DM)bBY?dgsޭ(BXB8?as#aog-\2~c|2LAADžt(}qw21aAj*lmWVڲyxԉî._Ob^΍EQav70 Hn$Y!qӺ9gR !bQ(fk33kƞ=ɋ'd;<~ߟ:5}'k> ҨQ#H_69YX׮2Gi `04t01ggY@@ģ<%:M<'Aci֝R۶pGf֯-^'Drӳy˖-rDF%&m6p. ] Xobܴȗ(K<~4]9Ofʾȿի[YoϫqFb !zb+'a8wZmA5`0/H K6l(v.Ie_'^l@Q:xܙ_MiBIF:J5_.Li'M/2 ͛l;3I] *!DlFZurrwC9=<

'۸n sa0 B~1yR;__yp!mFn#K};{֬"mԭ{Tl`Zjv}qqC2lη"놮B`}(9ҕ@P̩cΆb:neP-mOӟ%aJKnnn_DFz+jsFhoUyaYP) Z`W ީ E1 SEeQYo#*>~>HxKo `XH\6YJ+G~ mڴN۷'/7 n3hЀ5+}-$BX|j)㇢"'@nVlÆ 3N,hKg?*Pީ`ʵWׯ[#6!{O,cPaܙ+ƺmA5`0N@$Q gcFlR L+"͡d[^-D|b|V+>5BmA5`0ND=ط{8aJUy8iYy(PT~2 .Oʸmdۖx;BmB`0 FBxU]!C9PޙAÃ*!qӺFZI5i㉩rZ alokkj2oPkW ?FN:oӆ}[i7Y,NhժArMX֣G&aA|ӦnyY[6oBRpvv{цcfd~  !f=ix;;;Tvtt|A Ъf[Bo[.-r0w,k"‘D4a=DQ `:( VQ$uPn X(󠇡SLA>ɽKX{kwg[+u=΂rmu<Ce8:[MMK:{NF࿥\9vڭx_{g_ endstream endobj 86 0 obj 67965 endobj 84 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 85 0 obj <> endobj 88 0 obj <> stream x[I+ϯ9qh$rp<@AnI Y~jc^4!07RWEʽӯ/_yί4%:叿;_zyxN9}yēKHssƋC7k߯{0?(˖uLƌ/~x0/~/~ &oޮp /!u'9׳ #ܮgYOhMw79=9 ^D1k& # <$n<QW@yUM~) uOeBX()Ik?uq@- qw fAY |?~MkU޽( FAwێ>{Xhբo*#U'7⅍!kSa~3ku ckgiD8asܴ86"5;u K٥Cz".QiGEuNɲo%Jc}%ń{R(Z>q+2h[PP&xJ%[ ?!پ ߥ{gqtu裓T'4FH)ȟz,8oEupZTM%C|JP@B$ܳ`9 aSͱyePDiX$]#YAX&V]taPgÁCXN У\u55q!i?IIF݇@٠()%n |E.fd! X@Fo&s ZοmlvpZI eq6!IV\*J&6-2&䱱Jj얕 a؍ݴu`ni[ha>~ 8IfZXZ]]{ cmǁ"|dX1E+ QJ} ([|V9/y[5hhx`V@5/))AZ4-yh\2FQo!c"omUm+ hrC!+3x ʑ}F0'(8D;uȻn]'oz8k6٩JLZgf'2IBWO9cKT\S#J_׶AMp3`G*7#X{/I7@]uZo&bOݖZcphgƨFw)뉉gAHٍjT2oκ[zc^s IJ .FKjɈ]ңumWK}R (1a+&J"L}dƨVR:Ҫ f \2O&B` K{;vW ZqarJFrp#+ +eSUM鴉Dor]jѥhaWC饠Lt\[ 7vWa5\j(0 7U*:dͣ#KYrל9U6j~È ;g|Cy}5*؂;£%IIKկ$̜]e6w^EQ Sܒ$k^YEl@fG<е /w4;HKuXGQG~PZ+=]ʥ*C^ ^Nw <"VNPr}T92nt5f` 6\'Z#ԪRĵ0cL&@$|LΪ9{(,Iq7%0~Nχo}ϳ껙 D]JDh9vHMU,o uaBJ6?Y+c~& S,j{)Pn.L&:l1;޹[2RՒah_O{\xWxҗ~~?~9}O?N:: endstream endobj 89 0 obj 3504 endobj 90 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 91 0 obj <> endobj 93 0 obj <> stream xZK$ϯ{33) k@xefdz f|;jwݟ/tsO5tcױˏt9>0k>A闿B!| 7 +n>^]=~-3G>9*yFHB0Z|/~r#2p|pH>LDM~ oD  K:E)MoZϦg9N!2ޏD.\}Y$wwUD&X.wv%*th oG -rό+e!&dFb-Y4lF nO+a$ddԔ !(6Ot *RZdLt[uznc"$a!u!3 ·Uby*rPqK2-:Í\q,3l=er4DZl@tAT~+}o'%;Xw ,Φg-%զ()UAZv}[U8rM0g$R # %- yR.|qQw98,\6B$$ݲQr'WWF԰HILQfAO|/vIQ8CO&={aY9}%i|2bwM~.$fDReLiTB.a s3e?8tpZ m"FܚbSS'd% &9$d9l?N@x\M ;x |T>7λ}s7T;$8y$ >xFXn[-h*[P0pS`l)n9DvZ?% .`Vn` >K[̚}9-6A}qUBd9դG!l 0NGW*YabRpHkzC`HA!ZЪPSjW=`w#9{iS&L*LNy̳O]=2&Mcl⼗we^u(u|őwiTϭ)dѩ[k?1 6/m j OϚ¾9,/ZP :2cRMDj $*&Ac3 hƒAf:yAW76150F zb8jйM~d׺iM(Y9[3/ AO~[J e[^{hh0A!I-W*7FKk.:RhTa\[E\dum6U%\)u 'KpA7O"o9TZ+e 5UZ7L bikr4lE=0*|I"ő#et 4eV&!Z.+ 3`^nVQh^blw8}j[͹͋S& tO3wVw`hcSZ ;k  a|y~Rs-|iYUJ02WDV+475^1<\,".e,z~cK"{j!Ҿ{K$2e[8~]TJBK^cLpɱv^SJG06삨 FY(2]:LəOREe:XԐqma'Ƅ2uKH T{ǺOv[>O|WsBѧF=.χᚺ#j}Dx^g<\WAP?y!e!ɔ&0J9WJƒeGz"ye}#d{%UtE]"KN>… NDzOD'%;pm2*& ^ǘa_:`JX aD"&֛5WD$Vi]?t/{# )UR! endstream endobj 94 0 obj 2541 endobj 95 0 obj <> stream JFIFC     C   lU" nHHW4X6H"KO}iD'q4g,SHT;Y1IH`@qfjQ9{ژCCy[GRi0Ջn= 6W5GO2_n,|"Ϧlm2/c:/ZܹߡTMSLV~f~Ey8j~\-\k?aݡj#K^p~T"'Nl_hYi9ȕس=Dxo#Hz͜&vxNh沵~j1u}ewBlIVEeǺ9`~ϦP5y8/3Н|o8->"wQ|^A>42$F7qn994 2ɋއ,OJʥ$_>F: њl,n|VDd–n`v 'sz~3\4:aWrUyԂFr̃g]y%@kG+A!t109ve,RD37i`:>Vֲe@q8_Bl ( L(.ʱ] SڢE}$ytX'8)iR @Z;סOu<ʯw!cU?@qt[05È+yyLZ=O;z\ZΌĽ!CR+ެQ1szx%iHnޡvԳ%dXfb"|nf7o^1TzɷkKӬ~̋2K{oJE7ɂ3oh oS=`zdjiocsl\5d|СG2&E ֝b"%2X"ݩC9#5jw*QAҵUtC$EGzOy$׫Z{5<.=Haײ;%CpzQgkI})hBEf1ZV~`Q2/z7TуN OL%R{h951 jSE =?򄵸2= GiICj 2aMVڥpuH U=KMt놴nmFCS5 ɳgSPU :gD]uʹ1˞4D.Bi"WFXˢrw1yGLj92Q^Q V(%&?gsb֋U=kIDǨ;P.[E*a&ڶDAb/R=|5u`@`qU `-rDӤvS7^$ҟ]U3uۮgd*'47I1 d9oTu]?!S ML$ϳ 3休F&'>'(.X s@<SK="<7U h+ Ճ5$}PoWKo|qNwɽKpaw'&-8bs_O&@M>BXY~:!Sbp\c֚ Uovs-x䯢ȹ[peKs3R_9 11AB!M<%55-,d ];-$s M6!LАwWl,ur_IB>>-K ^FzO]~#M\4SdU:Y>LD$Ųh.˳Z6ْؠokxz)^B_A>,>Z-B ,7IP-ݯl{E?xXO1;{-^۷b&j:G^%OQcӣCATUf)T2~γ [}q&`շ1)l@oLV^Wh23yMs n0?qmV KYՑE5Dt-m['rq}䶢ffJI&/nhsO<+-Nlut?[a0h֮ `վgQAɔ'Sgu4q81#5~F6O/GgSsdx$rʼq|TG綷1KC?^+-f.\}\Msu|ȁʩ{KgZ$|(׍Cs[rwFkNRpt\L ^~8"8|s!f vx߂;r؄&g})7i/&x>$y;Or Ƴ  c<)y?)[N Ai|iҁy~.:*1/2vse=nA.C_-rzh(8Fg7f/"!|9oEgʋRcMߏx^l|k]poim79'ۺc1xyF178!S ͱ>mOs^2||o= JKK j/kݓ@idєf$}x{/~E1sv3pYrIJ$o%<2ǖ- p|oU[Q q3xN>J娋W+p"fwsOLL%sG]J=Lp{-10-IŒf _Ҷ}?HsW}fkU@>mG;mt72^M EP4v D۝41\.t#hQq<քؔeJLR\7Pa쉣^S{2ܕ2?2&j }n>{Jv)|"-z{a}KàXw?kbږUn6/˗E{oZ#;5v Jy.:0A%|HRg]9`-ƦOCւXwФ(b+z ɇa͝z˘wn*XQM-Iؾё޲݅n2 p:%I" JH{ؽ,A C%/-/SCiFJ{Fy_sH"EԚ<+ҬT}[LC꣩ n姗v/*^G=zB;VTUod` CUz\FcP3!Uم0:+J5};,LI)?L_Զ>;#7*Xv^/┞+R N帽0*WP&_-/}VZWK԰+t;:yLxBmR,I%COoiCDL|kG=XπLl'GyXOuWdL{/KxX5ʵ^eS XыCFx)Q*OǪA 6b)%a ?z/UݛWjjjN/+ Cj *:KGjY6]^@ZGLww8nk>qv0ifGno@؁3 y돫R/V |0+-EJj"`ސ=۪ ?.{+ziym}uGr.!1"AQ2aqB?\}S^i|SQtL4Sޚ7-TpPC`` aivS]UG]}\/&6qr[ ҳN)׾`v}S*N5iip#,B'j9ە"MsW6UʬQ0*aÇU)X}hdZgDʨս 9 r#OS ap^>kL6,^Q;5 o"ݤB BU%BsI^%^TkGX aL#Xbj7[7]`3&%= { !;aЍvC+TU63.uk  8 7rMd9{Ò~&^?n/T) OEUzg~h)Q.U\ABy=meWL@捡QGZ!Ȓ 5=e}*:NeFꉼvuO 0 6o%RfsXZQn/tގHSHngVE{y 0SnQ"B6U^L5(4 k0lwYY1Q--5 J0۠K.7Ls\a{({Mh#4c r.RI*3Xx^Nhu7EhE!7[6ŘC 3$xd8 l6dxhU EgTbS>6A\A鲤cCM&L}Qħ8FHڼUacɎß`D&%Gd /)eeesI1>iVY-订2D _7Xd.8 i)ҏ Tt8#XFD 3{H0ٺlV٦aXo+Q#D`2q=C!1"A2Qa#qB$3RbrC4Es?LV1tRj&U595Q_#izAՙf"{U2z+:jyˮ"!Ja5kTv ͒ʙض2H2i^ Vf֥Ff?"RzP,5;Zvr6ޜJujS9EF;Xh?ZGC֛vˍyiX@#_6:sʛJ֦ l6&Tz^#kR@X(LMQ_[|ME*F|I/Y_R}[[*Y vo*άɮkkmkiY9ju*u?' S v6w7br~)JkY5.:m;D`Djte`3~f2GHokj.[ o}i2rܰmƚڧ0g*zAq7g-hKrџuO)Lo hLJu&4FloJ)ösJgꄏTV<ìfeHޤ Y-a߉7,[6ezԊM 2oaW4҅tI_V]5Y%@Xvui*e]^N=u(ڳ++7ZxR<U ~`9}hHXCEEs^Խv^c57ܛ۵?*]5)UҘ!vj)_CYr6: D޿pn_jaG S/c@dz-u'.iM 2"Բ׭ϥpnbKyQ$.R6P<};ZGO Ҋݳ[oZ79%vgw [2KU7H?Σg.MMG~|%uK+ePxMKu` e1269Ӣ] ݯcq[qY%lzu?\nzn-mQ}ŠƝiRl3޺W1-Z5E,cwҦUdQYlپ4t``~0H2șLs-@#\9,Aj 501؋P $_@OVb\amv]{+HS&V :>a[o14dS|FW9tgEN\\Ίj5Fo'N.hqʹG֛GQˆy11]VC޹X(_hI҃ 2MM@Iᵺk ҂[f9SLedawDzf0uW ~uή/N֧7yև)h)^_yc}-l|}>TH_ݾջ˔]M]|^+k{E%>n*PkM,Er˹\-؝(}Wi l4X\UZKK#,Nb Bo5ڙ%}iy7ބhjl/LJL@lk;hb[QF7uϽ֥1~ug[ 1 %dg6mҢh.U"Ҥ`8lѶL,oޭxOݯήM]<=I&̧ZyqcqG ]C1e˜raL67(ι{ŠLᅨQbpʼn$).ZUIa53 剺6T^ B?#Gˇ -&#Wví.N%bM!2QIEoқqh[T7d׍}*=%<6tg .(D|yV? ҦĢ⁚ehKjk"E Fmc9 &ok|})&Nzp7Ǘh؅3 O5,Gb\973sX!6<6+xiSz,e{6y ͚ F  8o+ڣn&\.خHm;iޥbLK;ucXʣ\,{aZQQ^/;hcGbY-~fqTq *aH>K>1"ԀtO67?Io X814<_Ojf><+XQA?H٢=9+$|1rޏ*98X|Lfܵ&˾:d1b|r5Ac~XqLRӘxo*Oa-'ct-`>ݪcLbW@7V'yW_R`UֱEߵ[QqZ^/[{_Iǎأa'-e<-4{/L7WT9?k;lY_NԱ’‰0>6 ɄYgL>#(l6.mbǰD_zmC5a{ΙJU{[ ,4 :&PA/E(P7Ƹ-1<1sdΧ*h*lE.%/lL,qbQM&5FL:dbk4!լ۟38XNF4DcX)9"p.'~o],*_Mxp?B|*#w0dibHbykc†D~bȍbα {N b'BOٵISbKQ߲ҸN*YdVdUB:E0^T89i7k^-¾&\ǒB 4iVS+YGxҳ.#d}~4b"Yn.lU9quTI/xd6z|f&xR*2G$hoy}TrNk43 $隸N9s{Jd3vO >{o&X5l![a,V)}Xw,'>IIڧK-k>/,K"d|U[?:l>-"&HzZH0ϗGW7y\FHu/‹TV'3ʫ{9~q1GS{H{^M;*gƸI :iWz^1vZ?? a鵫4o;$y#b"6.W4Q{[/L? CW&.&|}ȭcnOҢQ{W$BO(&ՇX_Q¼]/E\+)@i27Ւzw,"kfҔgj6x"V=?e+} ]C^Ke=%[OЂg(^@9-O>Xb"#g{7{&.Rұ100џ;_ŤPbDEk>}Qoηڔ;jWαp7&.D6w¾x)UMG1Tө q ~mbp8? b9=*l ~`xI,e75Ǐ1S6`W縯n{Zln2?e1L;&fJ{W ,8{* +s, F_2Mb#/|[FQ/ 䗕>k|t"3+|j|6F@,t/ Ş %e_1|@Xl4xXygu|2xw /t/s[Op7K0č>U ipbD<&&CTCQ,9zl}Oðg[<oְI۱Xq)+a8x z綿潥8Cް>IY%ͤ|P>缸Hhw_IUFyLz,⸄y1z=e?f a]ћ/򒔸N<6`JiO\pI|Sa̱&3{ѾDqr v,~ڰ_Nd=! :Gp,,',ǟV <1aL)zhpqKßk[[yZqax2~kmկ\6$M,O2k2aŢhN+ , 'w;Qj7z9URw"0EVT]URIqPm.SCfHM^HZ':ZՊYy1n_Q3WLxUnAxEb͊ʧڛLj 4f{\;ؘqxn$@ ;~5'l.!ʘ̯oZ}c>/kΘn2tՏƁᐪa`au2ȑHɮ|3v۸^4Z@[ \ξ1١h_:=$Nm+N `X̭pn߾ƣ/<n!AM^U@`Ӄ˃.(6:ᶄE4D4Nna -},s\kZm[O꺏 ax~~>PFI)?+,%}ضoz.3iK$e}Epr4~GlZlN,bv"ޚV:L;:HܻS[7j)83/Y+e"#}"JA@kC,L24Aκ+:TpY3GD"=9oA1xѯe? o5cB,^$;1eJ?ЬQ" VΗ = mOƢbfYxzr;+@])x3Sa*3y;̺?J,rz֜"ꧧ<ۥb`O(10D92jewu O,Xy\ [ޓ&,L[1 ڢLL1bJ3a#I24ot1S`#ifaso aܐl5IL&D#Lֽ\"0d!f}vI628k yvHJf|+H1Qf`( 擱&Ňh r^C:"*<=I-{0If%m4"Re XWw$trtR|B9I Vxo*Yc2Ir[ȷx-Ef2?Is3>h|GQcqړў蚑Ed+-{:^(`F mDcOJ2 ڂr%_# ;S~FOJyoj;R^+\BGJ6 g#Mk:ːβI*Hkho5cmc.ΎaZ-/Dw+@XW}WҬbS~ūHQa*9*\O~9ڂJֶePIPj5nTt3j+I! mj9u$JfoM!yuõ E\,~uv;P^Lb]2F&6d!QTPl vL `^]c cciQf!JuI5AQ֖%n?*2[F"Gk]}Ozh1#ݤbC+|맕O? r'0v;_έ1?\Ȱ0c<*{ &-:nږxEfInRcKǛң NzTIA=)VF+ !r_[3€﨨Q.u>'J9lS}F"waҧQ*A޲{; t)Z5`Ġ{fhνD(SgVCZ"Y}HF}l6$e#Eр7xaTcԣh/zF[u͖ N` [jΖGs* ץw 뺵] ,>@$>҅+ ́xwk;Q,I;vl\ԪـQ,}(r o/T:_ m}a3 7v7 ⲲgLm׸3!K˔QR#Ty9Ejf3Ew%}o|Җ4@uS>C;mNhYFR΍ѥ]MtzǖֽD9]Myzf:uuUV-؍OqDzV'jiuזIr8lsum+g?,뗤[<^˱,ͷK$eu֤O*WM*@ܻ.zXX9wu.#yt@q{*m@޴Xb"mtz{lfYA?ԣO26ƒr׮τzѷ"~ߪh㛱`5 -5$Yq 2RHڊ"Sk3)YtS u=}}kkImT)/;VIpuBmPEL3F7֘-HEbsxČn_k2JC~nV@~@v7Sr,1|l(EM]͘%멵D1(GtN[ ^֏:5͘W7 2F*Tbas*fG,QT=#zb2v>W0ž?}> yr{&$."?#ǞUj~5iU]IT=>*XD_2.8و°U=d޴ :[WQfצf{ڟAE;K͕umj @Ȫ2ޠϭ|֥ Ԡ^ƅ[65^vQ\foޢt$OJǔ[JXl n:ʳly4VUU v^ʢq}[R{ښB\ Ȯf̱ ڣU"(7ePލ-K(+ M}uYKW6[*o}XZDYTY|gZ4_֜mh>N߭eMֺ4+B4ڵ։{۽*ZP7-syگWVe +m9jEˆ*5qe2Z%W%!1AQaq?!ۻT`d?-dLDzْn0qJۼeDLVM{ uY 1[Kf][ ,QYfܢ8* GxX)J@1mm\D%gdN1srd-A8QU;5y'EHa+ܣe O>r *g'NY?#NZ<<ҲS^01sxbV*x1e'i;~i]B$R,/K3s?5q-4sY 뱻θz^!/-X2xry2'2p(HK~1ƗePa ݬkfF-6rJ": P08V6Hk6Iܬy*U{o<ebBT88xeu@8[CHCPi-:PX)텆#>0I@<8C3*J!F[M2ybp^ HeI) `dTZP-DR󜔊(7EԄgqL"޿v$31FK ht~pJc P*|N <R9RV#qHiiϓ/Z?و61fe`q @l#p?dX7Rd @jg%w𔗵b@[2M!D$M=+f +]/s$jp_#&+eX< ?9`@b2L!FHEKd`$H}A4=!{Pˌi0|BȇI#y/̚aלIzYF,Pc{@#_-Ye¦T!1vfH!Wx+"JXjS4k(_%Q>r&ʢK-[#&ueX,%"A1$WX@.Qc{`Woa1[Gy8 V62EG8 0gbror~ڬKl|`}Lv Ts0El̪@J)۷Z"ʨfB1~lNR51)0hnpI]v7a]D !XvhNFҢ]d?#&њ凬#_^?&уrQNb8lv^ᜯW6!#͘*uXJ3k[Q~0;5y>%!Wa;%+=N cqHJ2+'/ zbI|1> #P GhgQ}1qTG96CrRr!@P@[dqfH9Ӿ79; [l%8),OP(#0X)`XV YS pϪĿTq0 bW);UM GPSDp8h IXP8HN^q~]ɨ=^4VarƼERI?NBǑxux ژU0߳YXT6N0xHz%AHrNoGh97ՁVsMfLL K "X0ˏޫxk#gt:7UOQV'7Z*,+`AX}s?ZJѢ}dxBNHKxw< +A9đ!$OdӀ&0h"1x6fR 0[@g8Lzđ{ TΌdݭ u#q,`d}JQGĠm z{Lq$XB0"TO%a"?LSIl1OD! 2bX" ɍs)DVX"DQNY'ZI_.b CHU`6|2PD'[a?(-:5e;l dqfh0g%!+x Oy ڴFl?E { E JtsȎ0R E{ v 8!2|`8 B2b4Ҹcs}9q~.Ws:6IaxG Έx"QZ@\EaXtE5{j1HBڦ&~19G"Qbdcus%;AB_Ȏ΂,EatS H^D^nA$.Oy@#TK]\dTaoktaJtGxThۖo ]o:GfT Ўnu@hJ_8/) iїpධ <<,c'pKb:|^,OYWmQ*Hxy11.8aQO9Ó-m!FีċDq-uTnEgE2zs<>XߘPz\^dpcQ?k=>)P;0BGO9/&Q4y}YFe)19$O/7‰Gf8[ <1֒n6y;_MvZ)X4g^$ׂ#8m2}fF:nLm2ZyasaC Zඑ#A cԸ#<2(pD]-lz$ )P8iكD0Rt oXަ|a$ 2 dh'`?XR0§'#3[[@h%.[\fz "eNGlĢ Gk (0$X4Pm4 ?7FJ<@xh="wrW?_B]Xd26`HWW_la|NfJ,n'- $E;;-yapxia6凂g Ɍ)RVE14U 0[fWWS#aLE i>T^5Q J[!0.+8"& UZՐAb|$;rD}f(-.G 'C$( tĕHĩjU~=0}uNYɟʇ?'¥'q+z͠-NuB}3:~@~&Bm!bwxgC <5FF1sy 0'9Uᜊ5 AHnF'wevz&2>/]/¸xs%8)~V;i9PZ" j$"B xf  ]>C0a1a) OٳT 5ɆL nNop8넜t.dӢ6Hl8ʽ"|3O?H'a -.AbAf9wڼ\]yN3؞`Ȑl)t|=N"jp(g`r((;˾Z~,Y5B\54(~Xy+ap4PnyOA:N{KHɶX30wB|9r$b픆3&Gy%OfB1VJg㛌fB"!huaZ}(ܝӂC( d'j#u,+O Оq;2tTb(%wZ }3.xԕ]B?9. fGdBtc$k@rVV&s^|*9fLHs\oH53T; Zrw `Ѭ^G%0D8qJG#N43TOFiD( /T URMGrȌ`$}G(p)~1|=_R%r<<°m$nR"%y-̔9s"D:[ >>s.m"ϓ( OKkO.&:0$\qר (x l $Z|$B+ 03NF&%^ÞԯoˑgrOxIaА83\eLx!u\m>р5) &T+u{8W?XW"X'raUa3$DK/ OYq%WNX31F: U0Wq-LuQZ̻hC{n%sdж9=crxZ0~mJ_ACB~l\Dlч$c*mY8M {'4 E0%>5[E3I}8l~ L' &Y[suqn8n'NIuC%INJ{DNw~d2]_NWK 'Vɕ3C9Ĉ#B9],4m٩$ٓҴ5d)M-KDM{rx m;ad FF |DdLXV:E%cH"G,!4q)}¶PN(WX}Dn!!Oh?՘e!-JIGdYLaL]{ o(D_5L, I= a8diٚN>ގO)W؟cuKmhb WnL !zˉLsf[=SaъXYC_ O*m5M eپ8FIsU hoY%=K?WyTAR''/: Eǜ;IV70e)XħM2t]cH'tgw@Sx*KRwUC4q- /'.^0R~lp$9y,J'9jcKQ]DǞLpe/N[@q?X (r F܋&嬋,ͨ eS(G$fZ(@rSSw4}NK`Xc\#N0V#rOsEHבS7&'fOpp)gi_&WtEd uS(QZ}>].I[ʊd9{oY+j=Y"4EtfZ Kj*)PXoQT 38$OXxv8+[aRYq@_\hOwr٠Ϝ@o!&{@L/?1eL[Y225?G};@ϮFP FA jHA{,`i$҈Pj/eZepJ>(M ;kK-ĕq䎑9F2y8%DbA$e$qȂ!X!x1 BۅXv;bx@e$߼[ (S|0Ǽmob97X$GY~q/IR"Y-jXHcay4Q}YpŒ 2{D9. GkbRzdp1,NO|Ro^3N3̗Byh2D5iPHTk {4:$6J=8`h2J,l[.#}dtu茈ϗBs3ak/palA(y3ebQ QfY>gYafPdS3k *= #=lT)O::f@"lgZc?[|{̼$xXeTX=R ;*+?OܪCp+0]Y{W}L?\oqppŽd>$27c8U{I2aD/-+|}iڊPSCH /%!1AQqa𑡱? _f]jp8.K7okJtvF f1ǿz/3A֙ ݙI@ {r$~TE(@$MNS٤vtI`x;'_<5m([}Ԑo>(jEA։=9 XešK@-~mԻ*ݳAVo(r\""qz/I6SQj!`|Sh-C~ Ow"ܤpPD:Zc$s7Ś`*ҀϑNqq֘ň86s)UvϽBXjMk<~JH:DcIچqk5CؿIgY|;!~T ]i7Q HaHHq oE@D"ÑZj-[ -fV$G5o,2Ҧ (Xӏ&"fTG0ZN+QkrA@$j܍w}x<͹ܹi04Ӛ[q8m@9Fc(b"iHk7uWNgJc}B h*tuwVhRbs< >4kZRwmc*,Lf -(H7\'01g|"DtwHLALz_ϪA|P@;> 'w=!-;(%f1h7P ӯML6Q3~j$M) _hu[흮s&we[u$“./3k\R";BtSI2,s q5 mgjG=l[Z7Ѣ/┆Z"!Gy $g-+M!h+QH3v>)I͝tҘ,9c:LwNeS8ժ"N8\cYQ:Vj nFi-ه;E"VA/D6Sڡ"\FDvukE=}({tcS0T$14,oB_Zd-KTnF4-/L43o+F?uTޠ_sxRCqDm|^ ^K}ϖޙ7{<$Ȥ٤lT>(UVZL)2@,7$1WlϞkC Z>iId@v1P,r5R֠LawrEΔF-}r&e& >Ns.YI 6)_εhҦ;Rw+& ]|NԠ]yڄFq:t扐*_?\T?+1DjpR:iz%GIXoR#DDPPPLGCvYoڰ;iI.* hґ{6s8xm_&!1AQaq?LY(Yc;})[^ƕX\u|Drۇa/'a@YڎgYq";Qff-iK4e0#Ӟw4 b]bsҀ#Tq"8TxCݛqHg?9l~Yw9jkfo6,RRo I=nCNUq{uGWB8(bmqB/z3eJD_Z םۍ3 +̬䡤!?qm fZ&O;U$5mط[Yt>zkކB tͶ(2HKibk']-3tǼJpϻo}>ڗ Mqfj^m\va-P#3o6 bJ4^ juSQ3(_*A>2LJo֠L'M$mzk(̛uk*žsL+JUMx75;Y0q(1zJ"j@I$j":}Uҳ/ &m8lǚ[D{c@(hŝhC'urI-&q ڑJoݍ $zG !]i4^ {G8:}X3~T vf'MNoLGQTgU6ӠIj6AYЉV/=x9>Hs<.EyBv"`.gNETOQYF]R~_fҘb<,?+)8EϏ ocj\"nf,("0A}*Xl:~OH+wl|;_XފoܝumyU4|Ф $dN@cWZaCf ax~gY Yڛڂj !FɥJY}t{s^eĶV$xu _'UnL5( 2b.G#g@ŏ#J~iBĝeO4Id vzONjKB:^a՗7EU%I?#WˁqYZblƛtT| );nw,p ô[8/rOl*R#NaZX(Uˣ "9J?Ә'BOHX^/KtO:5E9wo i%( XA~` /" _v 5~pF/(.֞>Hj.X(XnҦC0vI' m %*|;nw!+QaNݼ'g2}(#Wߘ]-ӽ,ސWقВRp\ EK>HHA/UD^S7|Ѥd>GPZ'iP6S'M]XVDfЂ^pwUe4#Մ[|f?^њ_4 q ָaqPGӨex8 *"@?YA@%bإ+x!-2~z,HLe-8Sy^*_ASi|yaU|׺ v펗(o@L+y| xWmY\!uuy C \}R:RDuDi/eL ?$r xe؏b8 Px ̸V;3%K`[ /[+%RH\&F!|,0Gb+~gi@^ ;'X:(V|y hB?.Ki'´ DA XEj7P%-Iq@@M6oAߎ^ 0Y >_9iFb.e Ƌ!dUcE&v.DD߮L-4lKݩL}jD';U˾ #ob:iy%@_0GiDn%h7"}}ѐd6}Rv( PKNgh7bm8fS {?m pyw Aݒ̻xʉ :v~qnuP!n%H$;1mU_|fRЀWFWIoLO h`\.^ !{968Z$agm3/kMEQʂ336X"+-Rnsl5o71X/w0d ʂIS6#tCFOdX"(j>.LKiaMAm&#Eh R2gޗ†֝r., !Eڼ@pS ,;$2p |e|3#x\<61/U`MlY)JK$;$#!-W"`w.~pvGSLto:BkKJhuca2 ZAS,|% $TA2 7dzX3Rt] ]к笩%R$M>J`[1h0k]:&l˦P;iF2\R(MƘ-NͶ0\H&Ƴ+_V I1D]֟$ň@iP)^°GP YLXD=c&lRqiz[X3V<mL7J`;?L)ԗbչ͒T w.*0^$/r}, U!uCl-Gjp?2]b_0 5]8[(JKEW/ġ}? U<6cT;=O]2Yő( 뢠ͱԻ%Zڢ&H<q]u~FB]l&d@A @@ߘD9o([xDcpKN]bmRӡEJXsLB&TTІ--&q^BO 4@ٽf8 z!}g&^ l"E_E_C@]Xi#)W$X-doAz!jP؄=aMGm}5@@u>+0JwyrPvȫZ6gdK$Дs$hLIZ`ܬ2F_v{4ri #iy@Ie8rX$! '>\M7DG[c3;I2_#Ft)uMLN@}C¸TfTtRVPRXShhok5=jf= %lȋ çK1%Rp[~- _D5DWfF1*Nl}n (X"A*e6`FQ0&U )92av٤ O0Cͨ'&z1il ̍8"j@ˌB)) dD? UCz;K B YJxBk‫ x͚6hnM03X _&qHv ϊBm.5S ڹ:LLw:F[6Q.TJj FqAĒŬ Qk[)=lAmc(!ZU "R&j>qVAHOSWː>Ѷ6?ay!!Jo6y-j" ٯy0`ZlZS.7 %ЂAOa@+C^yQ Uɼ@tMcWT +C[ļ"(. R$h6e7TŪ mjyk(QE#dǧeJ4h}}Tπt򏏘LAv$?*5mB~Pƻ +%ਊlB[sdb`uhy'$eLc@:E(-4 qޞ_l#XWMA)Rt:nB!SR#ê"zJ#(H %z|&hD؜D{h  `T͸TqT #0$vVo7/:uҩRPj8t.?0 P6偕 aDI6% $\UCDT\6bA 3 rb=SY&Z6P1X4/%2HOHlϫ-]ځ"$ћHD+%ک ,Y LBs'PG n6a >Y/Z +㓾3w3.Uaof&  TMhYBh.%Kx "$x@BـN(J0 "BdӺv$lQi6) G@V:Ȇƙ}CX}/ˡ7A 9eP? K%6j,&G4)t;@Uذi@+hdδcMW}tJ[HDݮ8pvPyjPRJ8.{Zk4?U%_;h?9phs+"R13-Do3X1C} 1UwC5vyT+{HƮg(@J3z3,@7kGVؗn־4یE(&pH7`+lEaZǯ!*5|4_P?KBcxciG Mv 8HQ )Bx4`$W@K|` AN& 8Z'Hv`TJOz`顿ɯJl !?0PUXtˇĮL3`Ziv_KmF5Ncc]=y` 14A4ʂ «XB9K4?r:k.hV#rq?*!h $haRi"):ػU PHukzUit1Ġv;ᗤRVэ7w8jl*Ud1 Fk>F?^Gg1.m8L}5Ig^tL^]ן GHע(R,˛GY_.ZAjUJ"B/_ TN[tr},$If0(_)o; 9@&Q|wU ӨYPZF8Uúo~G&`7uJ#jx˼Ui^-ۑPŃBB -F(i;h10 aIj< x^ Q(h"hf/* FVʲj#W 4@cM&"Ptr Qp̡] Dfiv2@xQN6n~Tohoh\sA$R}c9FLe` MJvi!uDz(t;1n,'H?SKigR4>m>%죭Bq<r \,'nF?̑`D_dȡyic߹VWY^Cn*!k쑩iO6izK#d N<~v4%O@/GGz@2CM5VP )1{ R(#d-$"ר$;@{2|Lm{1PcC4ey AUހ|2ʱ,0j71qׯ}I>,'DT}@5IEtvX)QO7c_d;:`1{e+dH|e`b(/dB.1rb=OsX-vDi>0>!eD( 6fًdI_Dq# M )z@5mVt"H9eTeP tCVO(Csis>ёu?'rU|1y4C4/Lae܈$Er )4j\ 1w. 1bk:A, o* "n?/CePԗhw-INX " zk$pup!y06z'Wcvy~>&Ogο C֬OE,I NrBP4-0[hӼѫ @ԳERN`Y/!k"Q(RSv}{jO +6[sN uj4Z/A?/c,cW\5O_1PvkO^a,,GQ1vm&cZz-fl~E['9MaT"VD%@OK)i,%d|⌘$+Ot6@3ݣpu߸( VԌy-h;CV*XzV]*k1NX&T",Cbq ГHTgBtlM8ڠ%k Yg@:`a&Y`WC }΂chuؔЌ+u(s \ŀ<F"& san|!#!%)OLemIiكMJݒxc"s^ Vt}Du#daq֌IniQ6Dqdw oQ1 9ҡBniA.xiʭA Ta Kh5byvm3Biᝢ c]؏k5(-ÿvPK``(˴.FLcI*~ݐQEv=rtԓ`r!I6t-~cWC"bPL vaoKs0!K(@&-G^K DS[- ̌D^,ŇvMń]Ψ>fk_HSE T FtC?jhC BvOj- -wKb&kYw (6RBZq"b2V" (3X&*/krd3Ǘ97#^r<#Ef]"ufLKyEvw *`s"XPl]ʖ8?X8uiWXKHsװ "A.$#a>.)( Lme|=R"vyfJ7p_!mC endstream endobj 96 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 97 0 obj <> endobj 99 0 obj <> stream xYKFϯ9`oW[#B!daɃ,& cVwu뫒9BkcC\t-O?'Q蛗ߚwW};xȟ|x<}\hWiX7 C{i8Ɇ`yCϦ-ʗ5ǐi/O|)O0m;fn\H@KۓqJT@} SPE鈽dAONX\6ɍZZL)9LyIóGOwLh?x9i;pp]na@]!^%̉,kE89$"X8*?t.KW#T/ZR3YKu> }{lZןe߽I{H7Gz! !RjߊXc A|y?| 7Xx3$udt^Y%iO]=yߓڐ&UqEߪQoh$XN%uH9QD!BHbA39F GdoVQ4+%p+ԕ˕!Q%eHEkIU/]HYЛ.(pgb][D5/bH*)V U' EvIjEK9*Fk4@&J ό3:t ѹ[*on$ˆPSZ#jo^Rq4;.K΢T4Mr]0u|N+U[&*]r PʁًOdLeۇ %5B d%6/qiWJרC,^>!`7PTyY7 (|HR1RuZ~b2j;.0UH!cImIػF&$fl05^5ϘA\5w[32ͷS (f!lg$ga/'sU:ZF 57u_9QOՅ׌k,THl'`pNRMpZo"y#ĉk*~ܽfn%wzS`*Ҿ*$R3l.̩QAcIljd&f,smR$n/bB1} -S>agkrj3[ʼ3="G\:hex}ӓYI-aBJ@,[Q.ԴV^YJ܇S=/,jR$k2K]ժږ(?;cL}1u*G(ρBߵ^gnJ*3)$vzSfUdw V*PbWE@vo4?0[<s?0#$DAJ uj@ w."O~>w,UrnR6).GOfXmۂ<{ѓ Tf'/t~xp;kT3p Hd:,Vnp+꤫7D M$K{O=fZ !FV; WYW:hu u<6p+m6#Xڻ&UT d(i{sY#YEXJ-w0`=^N'=e3Q.yڬbxCB>!aeC`bcW4-:mcѮrQ~fIs' 9'<`)V75U(Zc0عl~פ9&7`SF:!}8^[yr\ OWP#7{G+4+Ǭ]ɯ8u٨y> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 102 0 obj <> endobj 104 0 obj <> stream xYˮ6+.`_ d:@.^EE~ ,&H\CyRݗçtB 'E}p}9 u/wOwv/fˇjJS~=_L`.GwD83t}e)hC5=\3DM$╅ML4wz p׶svgH0v<_ # 9-W VV=4^䫂!SH͖g ^gS@G7! 4l;s5Q"Yg <a|HfFނ[Ox~8 398`F)Ol{i g&zF:KÛp9ҁ>hiMRl±>`K*%6lsus oF@O xϹ0i`l3>=y%ĤdJp)Kd%*ȼln\-5R_7LD eZg T#V~v h6fqirFcXfMm4 GSQv"&׷|v/UJޗ&ڗB#JiuE'"];Ĵ,x{PǞ懷kDUԾȓ$FS4--mۜnWD n WH=X9e䂣VBRp8͉Jp"S'pV"B++멵 ω̞9^3 77\Ʒ9օE<τ=Ps3Uj~}pNR) H"\{R+%E1GbM4gӆW%-‰,+ZCё4,iuGdR^bP73s4-rJY%%6U. 5EnITS|xlV6Ȉ tݍk_kPXsƝ<J"v<˪< 0e wmn p*,഼I<:+W*=#Ŗ_]6[^69.qͮµiLQ_I> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 107 0 obj <> endobj 109 0 obj <> stream xZIo, W9@i h4P 10 $ `^CR$Ef'Z$qQg鷋89\JoO?~4*y-^Nyon{^Wzq{sc(nǧ{TŠx5U#7 H4w"fcN}!*q1;ހwP7po%[|n@\Cc%/yan"1n|2}_:!2aޣp6ј0=&NRs$R )S$NH|0`yzh,Ŏ|XZ* }an488z~CŧnHo#%㧺 sZmr$d"y>V2؈ z7<8j71_@,xgh/ޓ#/V3&ˇ {qV{ǯ pNaĐto~C!d|t> [Eq><QŞQocAGE/WI4o`E>Y)iO,T{jEC`!fB69H*hnowm%L KpGPSRQ.ѹZFBٺҘ fcJc1VE5SR@Z$M9{PöHnX~ԬI׉ ܌D6٦/mef'kX*= b&\.ma *Q2r ,O+ ;ܱÉG8- ȊoT{invmʪFi?, >d0VZC0 ڬŦ#Ļ7EZNr oMӮJѴ]O-.MjXMzUDMD]r $1.,viQ^[*q9tV-00WM*'ɫ l;fjZƉ=@+{(L+0"P҅3ZK>I~eEZ6 nSM[W/ =*8'j~K < -2ٖR#ؤ=yV!"Ǒݕnǂ$qvLYgB]ھ ~q/pR3u{7,5H?vuY])qKe6`zm۶[ \2+4|٨4݈Gi}^\ڋnbedG>r,#yͪO:$d"j\A\ZWjWRQl*##4R" ^RTn4T \sOr!KR1 d1 ժΩdu'\Vric}ܣR滺NujP#Yqªpq?CMh\M,n:Z`U4יۨuݓEKnx|wyd^>nQd}D՗Uso__:_tmOv%=BMbF>Qyq ?4\ ?# &_2~ϧ!bbH7^~|y'`._޿]|}/&B endstream endobj 110 0 obj 3088 endobj 111 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 112 0 obj <> endobj 114 0 obj <> stream xXK6 ϯ9̊,[azH3@EOm _>$[̢Xl֒("?~NP8|\ é^>~}Wmk0^u०'VO:}ӁԹs ڞgZ[Xw`A;7?܅uYZ[V8h/Y jg"1AT~̏<` OFI^u~=z.lg3c*2f=_?]@pjG_:Gp0:r {/]|dACfuȣ@ >EFN8ZxInd4 62gA,;>wPb{;hN4Th ^]z%єTTTR4sBpdٶ-H֝6*lP,QY8%ON)Mx֐x8#WB> \bNN+Vq}gXt H2AIgšmYM3*|ćnTjO,DrĺAߤ|)a \ . uETD ět U7"n)[Ҝ[1FêԤe \#Q$aQ_QPO E5n/o$TJ|eͼo60owi1P}iqC-PPb?WDPBeJRdeg/jZA`.Ѭ;piElZ04YgVkU^Ql2K:R m H2r@7 8[$ssPG8=rSDlJjI& ]&q(S\ (.Y ɟF:(bJmf㓈jAJ$^a# vˢ4{smdmNI2CJ:nMYaotF{nkaq\ ,.:K9YJ۩,eܝ6E\J}pg f4>+n$z'}.,_㨬/dx#ȝ[`~?CQIk V}( ENR6M|Zt\H.5/ڥ o Ov^#ol ((ȅ'E2Jx}YqGJt* bѰz5gdL0/{? %0B󡦖GUxG6ש6 s-O[E}ˊoϾi=b`ABр C;ah10; gZ̃ė&|y;!,&;wo]0_ciqVЎ`3pbFZ_bSvPgu5SIWOJH) endstream endobj 115 0 obj 1434 endobj 116 0 obj <> stream x]y\YCiA1 f]ֱeRR(ʚ,#dMTQm$3a08wv~_us>sv{5^xK>/K(UfUN )Ű{OE_rK~A/I%G?sxxz)2('O+OsSeR @g IM*?̃tēr?EW@kdvA=؍B$SF[ƨ! G~Dq!X%WT*/̈́1eI<%ۄTӲ ]KS a"Jm<77oiu=R񿰰Rﲾ"g xT~??~<$$$H^r..Y]o.M >/,(A#UPMSWNureDWb?++ҥK PPP._ w&)g-ih;QQQl!qQd-nk]S$.eʨSRit組EMbY({)DfU\_F܈ل^+ď駟~|d^z5&&۲+l5?z贴4[V%KsDӬKVN*./#[ yĉw>y} \"oyuub WTr3HWQu鈤E-sTʑmA1 wQI!_d1>>ByuguF?jԨTa%ŋw-Z^C:K#ohuꊼ3Ԭ{f&H]ʺN+Q4Dmi_B{d/Mht)J WB4wBB^!7ovqqAX3g{]_'&&B5hxJJJigϞ_iWD[ ɹqN \"o|VM"ˍQ_b-Eͬ ey] ͐(*dGDQԷ~oqP쬬+V\>INNFǻ7oekk;nܸٳg]DqttYf͝;wXW AdL8rHL qqq&Lزe ̙3pv3 --m֬YD-Æ ߵkŢEiOg yO |2$N!%2 5uy-VWW_^DƥR"r]f$UƥCmAZϸRuQwǒc߆xBCϞ= Dƾ Z*vvvaKnn.2QСCW\&Ns…d?? .I&eDSXHHn|V<8f#4ّpٲehd^t <4V)|RD(i;F GZ׿{X\X,%2 0oyu}jֽ6D>BTFj4![X+D6_E.Q n% 3e٪3ڔ.jܹ1?~8e??? V2 r,Xn:^`Μ9VGδ:xSPcV@Ў=?> ۷e?wjzzz:;;|_Ri"ƈ)k3OZ_0 -x  5af]VURG2g Ѹ]քx]Zwa]n$uDWAKJ/|W/kqT`6V8|tGyh8vۧMfCX*ښ?`aa G~PPy_6l7oǏh`-2Ww s΅m8Mg݉j;vԩSLH2-{L0kf]Hw'#Ba%Ti|aײ7oUd/- C+hZ.Z}fȑ#eWWW .<~8psssGllccrCYXh; $hoBy(w_~]Xpc?n"˭iWH9.]BěqLjVH[E]{e9<J4Fє EM(NDiik,ƍJրü6HG--ƛ囋%~[{YHhRR: n۶ :{&%6#>2#*F1ԩS׮]{KBh)Sc̈# ƍCltZZett4ja!H+n4GF,ŋ?_V\9ydtQ>Zl2؏ eT%#F,2 >#gLJ_]W;~{B K4d+؏hP:{L~p#y5>)cEcgCf63ECmN}kW„tdKDŔ/z`—8I3ϟ+{A4:''K.p2? %K7WX @؏sʭ7ye~/3ĻlN8aaނ'nd ^)/.,-2Il|,/"/mOLLLII*ɅHJJb9x=uT||<ܲ'WIO뿢6~`w.:]*2BmJ=)lei<'lY/Gd$kMX@phtDGw|QW(>_xP!C ''?3 txoD&E#NZ+Wdo%S؅p poA"7xGS&)O'y/h]2 "+ºD%|-Y<+bin'k%x+7Fhk\-.= Gv;e&bqo\%?O7߽s_i݆`Xx\"XͮuJw8Kfk݌`XH,]WTʧDb4V>@$Kհ"X$ O?ҥF5m*eN$e{9Rg82Lz2ƞ kIÉ@jZ.ݲeK˰UTkZp"2P槟Nf~s,|7у]Q]B#zpdBaR ?~Lꘝx '+4|j###}}uMfr`>_nlԨILQ޺9֮]Zjv,=S#X:?/dyٙi oҸ1D$k2;v4Dvf:8PLL߷S:vEvt*#mD" jjBիW5ʜXоݠS&ԫWހHN$VjxB\n͛Cgbc yfY| *P˖lٴ!'+DiS2Ғ]-;/YXv-&P|6AXֹӐq tW^K ֭[z-Z|tXh. T2#O$";:Ț*rAÑ@GPl|44o6brdPf |},7{jRvfIÉ@Y 8 U+!,ȈPH\jr>6=<ܘ ޵q7n,)%V~РfÇ;4}+ڄ{:XD9|( ĺ(<{g{GI*YJȎNi8\ahn|4خmY3g|G<34bxn]5)k.8s OtG4ٳ;/>Y/ g" 5|dHStm[ܷ>ںٻKN˗9G# HG4FT@08\xKZЩQF|34P&{4H p[9|9PA!\aA,qT*7nؼy3oٴĤ$p^t:%)>6: lm5G:rfp^dG4FJpxӦÆv:ŦiӦ+ܗ+.׬nߊF |Ј}B52u_qQ͚5>͎U%pSHo߶.| j WEvtJÑm$8, ؿ LBi/v:@?dBN$V*}/eYժUCרL̡[b Fۧ!k ނw H 4d&xwuٙiiS hWF ğJ)+|ȎpDÑ M5hPf͚ǵNfMֈa 319Qf(?4H TpЏeHGb!q ~iDB&|/]ᨣ]JȎNi82U5d6 ,о~2pXhHIÉ@rkXrbZϔxeK~"X$ /φYѱINnH,]WTʧDb4V>@$Kհ"X$ O?%ixE5|H$.I+aD"tI^Q +~  lDD"Xi8H$VMN$:J#M$ϳo~m =H$ERۤD"[TZH$RZD"QDJD4H$uD"$ 'D%i8H$.IÉD"QwIN$Kp"H]DRz"?/K(3H Y7W_34vQ?nզX,Ůygg:Luf`gxhFEn-F \02"Ŵ>AK-zvN8uE@w;VZ7y7g~5Si~r `{5=XآM[o Vy.s^ilǎkBhh{V:ow1^_eqQC9g'aΚ>j{PS) ZlqT㑳KZm1b辯YVlۦ/\2a(!"_v1[Z=ux?-cXﭢJpZE9瓓&\|uӪ5ήgsl7qxs3A`ECgu?.ц_:j/F7?RҼgh~MBf܍Ν7i}uc' qY6n+ro߻$d7=n[eΘ/?ĭ瑃gmZu?\JLs1˸2Y鑯?̂kjW%s c-{voj-ԇJ?_)~xBk+orΔ=UT33lEQgo9o̭ߝ;UFN !7o#_pKoOp(y9pŪU{h}埧BZ_o jR]&-y^3G#rcBܻmjųM<ut5ݦ^v2z {v">FgvCԉ~ ֶͬ׾!|asKze{0go.ș` ,[n1LD2`@>?:OY]|oix| eo_; .UU-iox63=6Wawm^yÜ)`Ep[vpq\jhuhen,vQio48OJR.8̭{,\>W){մlz/9e5դ DX8o޺Xth#h,;|`YIK~ŧ71# /9I˿O_OY6'ʲU[9Mjx-֐klcIzv;nTo}i8axu'UУ g3qlnv.8=v-Ww5`Up>˦~nHUQK떋 _sBY/&\GӺ1/D>4yY"}/.5T6 :`ɉʣgғ;6<lx)nYc އ7ռt7Ƈ7ܫZ֚3~riPCFhn^fe㊐^)߭ȺX]dž:e{ 5w3'ʗO w.}~Ԏ/Okf}_]!  O7^1W?qQn^_lkkI{k'2<=/O֐IT&[ޛn,u͞W;bv&ktȈL_|^T ߳{g] f>۪ y߭ڏ;a8Mz}6ЌGnh>U]cs.zmoAzA=/>ߠ!cJN[RO/>gS\6ӭۧf `FwfGOr9h{i%ם__z  (=/z4tq2Is~}ᒋ=]ޗ§}8c9޵km;vV64߿\c??W ?otц遆g׳.Tl08><LלO01˿~I~K>t_}`=}dΥC߆Nb)97>Q|jL7]DƟ>ߣG3M P#chm~dCs~bLf&&26˪icZY?nE IW%ۮ84yeԤ)H#xePlN% 2'9ٯ~ן2_C;!Oǿ=u3Fsݠ᧪xOӢCFU ϛ%}ʘ]\)ݻin]UqGpq޻gt15ן7Qw=a! .˖--QEC,9u e+^8OXgܶb\$ [pcX'Ճ-2@-'vD->AOp^ ?/?@@P_7) /iT‡ݗU1 twL3&Ƙs*G<С]~]ߛ>e GWGضSGVݹZڵ6ZO?ϲ[`n8A޴m>_~KMH;Èч"wr^nNDh/vw"~yp֝K쳳4rzB'7)ݸGrԴSNW\u֣G?~0]&f0lau'IÕ3'} Xå{@!==W&6/ М/VfPS JK-@׭]㯿vdꈺg~=hV(C G7OfNݚB ekPs,Zލ|՟._2AsB'8PKC'&&j6jD&?ݻKw O^@.%YyYy9I{j]췐y9i(v7iɜ> /nl]V4|i; ^~#g~+  ]-`iFI{ ?htn8<[a)3O:!dǜN9s.oŌގXayo]Osyƭ i_u9ܾ|v4|ȰAgϞ2`A޽{ɓ'o߾wݧvٟG.$Sordg%x}x{=g7ѝ VŨKJ9cd+ϙe}#_ᨷw>{ !ݦM|n#Mugq\LϿ;;໳;79Jwovf|446fNVzֹi'?{|?=Aԡ/EB\=Sq(*P 4BfzJQi6MM6Ŵ[~ps@rϮգg63xޤjaDZs X~K71p¹/hG57ދ9?_v.7}ݫNwWJk ^{6aG};89~_<3,.bfγ}՟uk?;{h}XH6z=6dн~t{;td{[YSSF6jHl9˕P`3nŜLR]m/ݰx{_:boȰA>|˗/_̙@":E-<4hVh.iy䤀Nq;H"iIg*pNha]޽s|6¹upRO?v$`H;VZ0m;kæML:3hALMZ[);S#_LЌC}8M??>ӥC3^+-~GY/94蜕fٽBQ~sgR!㸹Qյ>Fxki9:72hH0!JĻnf4쮹Ou|/%,b-S(ΝƤHx t{)a*Cq Xh.[7oZsrWyLa6Wݺu8`L۷m$֌IO޷mTwbrcY6 Ts7ٽs[!6z{p_̭xts اX\IJ\e"_-_Ž3›Ąގ8y0.hD{=K=r0ߞs5G"0r,+It"ɉq"JI),K "单dƉJJI9+ɌdGsV'+ +Ɏ& $3N$VVMYIfH$$;48XIXIv4i8g%q"Rѣ,;Lz2k UgWZ5Z7ho7b2ץFc,֭EJwk*aXi;wΏ[jHَh֬vj-[dKWad͚5-G^eg޽x![*\駓o"Ior΀jP3޺u]; znj^vƋ<#*~I O +ܗ`dAtШQ".KUt7RDUpUYϗKH i8vhkKwD t5}k0Sn2NXD8jhhPjU_  ֫WCLvڽz6؏_7ihf9 1tuYbdduw8mÄqQ6+x[åzFTrT?hw߰1a'B}zM*2(K h8޽k;KKݎ{."7dOYTpO MϞݙcCիen|(.;9͛&|Jn&4/g;BvPHFGb;@plXH|bN a*qB~<=cCӰPp}찹Ty*%ԫWo AN9KFnٴ_x׬L) ypY&([j= ̆aX^]{J ʘ fZz_+ nw^%Ӝm> OdZNgaРi'pg[f"W>R Aa.wڷ=ˡҎP[814q& " A`x2ۏwYnݺNh}{\snn}a wvXuTAj> @<(eƏє5㫲q"1/wQ9g#J}ڲe gqWe3[XiRdAHdMXpYHenǐ͆UV-*tsb8!:8]ڶ-Y W8}I ]Sl`q!ȑqyY^ <޺v*" Gh;~%j$ų)mp@#>t-.aJc¼b|3qjРҤ(-_<>/.&'ɺ}>ea1G*8>(]*tx!@\E "kݺNhuk`Iuҩ_ϔ+k76:0#vGp=!,4eN-۷`Fobb/n.!%"?@h]1Y!0sc5^3pu^gqY֙vh4)ˠH #U*-Wƍ?(P^re<Ri!ǑiyÆv((|'넆cq4;wÂ1plJ Ρ<=?$yz֮]e]Ppmr&wרQc2g[w|qk֬ivZppQ1L,ܳKN̵pzF_GYrfR4n۶u3NcʃC!386 XX#+yUthAqĻ\p|pquY4|vX wTdrmͪbbm5k #O>iUMŠ^d,- 4pN3Zvbkࠁ6~> H$V˨#Hիɥ 7p؞AñqV/FʾP}Jjgזc f@`!J Nl6ga|ؘ($@:ᠿ߮F(6l`hhЦMkPedAa^[=;PKq[ؘ#&&H?7wD53pO.1͛7+⾌"U|L"=Sľ38OfyxcүUʤhh, )}ί# w ?3qaf$MhN#D(^P:U*2K0Kʸk}I$˞V~QsZwQ#!&H˭D"HD4H$uD"$ 'D%i8H$.IÉD"QwIN$Kp"H]D4H$ujjxx?D"H,oTGÑC,EXi{'Hlg9sr%H$"vV_õbRN$K}u+IÉDb4\n' '%$iNN$KHp-4H$Zt;i8H,!IõvƔfк% jE˵> jýgOU<0zE^YM^kջ= fghB ;'E,we,ݸq;|>" lllla1bQ#ͫUx|'El"'+]3 Ue6lqc-߭UTkn,ӑ+㖆69﫣,zF3ەKj|pB, |KII׺[.# 时65j~JnWɴ2MZor΀}L2F숭jx$V_,tfZ.m11whXYZ&,@ߤqc l&YCQcqtfddgm5nx===ę6YkS&ԫWW__ĤߞZw.u)|9<:{v$b#4oe^ޥӊY3004mVZuVa\KW%뭛~añcFۧ7$WTF";BkF8tYᦦqai&&&kx"F0rGF ~[ҹӼ7 kP]GXXpr{*"Z_Dc)p$bcԫWox,~&c"{HN\`Oe%#Zf?U˖Zw.Ri޼,́YNC^N$;pxW]4^{}P lL[d˦ 9Yl,Omn Ƣd8,hPK֮]|6A{8ý!07Я Akxfr(li\omwO99pN7@Z듨C,u w_ { ?SGӂ7j`i(6҈XEQբ,9k挤DZJoj=fk3M ky8pV 4}ʩw@qQ,[&ZU_2 PK-Z|,,xmr7n,)yˠĂeC5pb4M^,K9~^~cۍ9\;oqF@GHk}}uS&@ pUbgq=/(pd 7[6ik֝iK] _@TVj8gY @]:Y?݋$V~EϖqD QaF4ٳ;o*-}^#.D}É#Bn݊ix<,KM=zNаa۴i ,<ݫWA3 ۋۻhZ4ϵlR GNM5A~}?\(#dNJׯ_-~p(TI:σ ޺u+ {~? mddԱijU:q9N4h!.>:[dLvfZP_B\f0"‰<Xom"U(|u$|=R[{>E˟?yR#Ev\܏cceNL-9?}un{x)6NKѢ+賂>$>?vcpbHEW  2^>/j*'7K۔Kp-h8Q5LӨ.}I|kD"$ עIÉDb IE4\n' '%$iNN$KHp-4H$Zt;i8H,!a-/^Fl"5_MLL~:T?NJJ;wܺu믿^q=FHxB/_G͕j8J=}4@ he ">UHʸj www^:{*i YI==͛7:ҥ JMMEvH *5r\̄rY˗999ϟ?ޭ~-//߹S@(4 H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]4@ t 'i8@ .H AwAN  p@]B 'Dby&i8H$.e5lz2D"H,j8H$uD"H$HGtZ&"HlˣNP3E$"Bax4\'A%~c?mŨnnZRp@PXdIV'S[pDSTӉ&ZuԱm6fǏi]kUiݻJNChݻwJA-ȑ#OJJ0aµkl#ą 3b6m\HԪe T^}(s5j8:L322׳7z^jF4G" >_nlԨ!Z=e"& V˹3^vڨ޲e n;̰7^i\B ƒ%k֬+ر#ۤ>e mԩ|`R۷ӧ>@#X+Vx…Pĉ)`cUoܸ1<NQʗWiD ?qDMB_[n+:ԝ4*>>>€/^2sΝ6mKsNʫB Ud }?~4X~)SܹsM6,GKp%1s b{⁦0E"K:A㏆ᕂ#Em1jDׁwڹ!<1QV*iݚgʾ{"> E:!.icG#0IMwuY4t5%)~HN,Zk޼rЅ~Wd{Kkt0~JFZb`e&]ņe ~V_Ɔ ^'O ҥ-[P a!q޸qBI(ULMMESֲe={]|hڜ0a" [dɫB ++;"YQW^uE~`СC ۝8\8MMŖ?/_.%KK˻wD% vK1p)5zҥp.e˖ᎌѣGQm۶HgffBZs$iu`y_~=ѠPHC hxLL>>{g=fx踣K1m޻r9JZD,|"Lm~i5~lmFG~ެȀ,`>2"߹Ík8Npn]'M6 X-&\W^eCxsΜ9k׮H 6oޜ$Qly( 1/^D~MhB#111V aevWWvD#Q~}QWë7mDZ;| >>/!p=GIwssCٳ8EDD(5\ +9G ݻwG:** )VIÕy8h.JjW<=3erȰ 2I?f9v-r]P﫼^d==066wAx4u8>k׮ ̟UrDKQBW5G&3@8xDfE!\![A.&U]vޅ@'h.Jj8o:c1!!+r{)./ Ł 6'O4mڔUaerٳ[XǙ׿*th.Jx{)Wƞ 8 8q$484`ӖZPjxff&SR:R;vLͻ˗/^LjKV gwF ^Q˶زaIHoܲ~ڕNk]BrB4zy.[֕4@ 7DpP>A^, gH$.:Ap"X>I$wdj=%D;Z7H$@p"H]DRIrٽ#dli'e޹M釭&N=ʂqLo=d.ٌ9vSmlb}{},?'MGi=wfbp_d'TJ:߹qc-eLMzxZajBDǏ+˿+@|nZN]ff`-I9"ƏQӆ3*wq^(6v:A"XTů=.쫴wfL[`W\peCC4777Sy~F~7nz{kdhhj~(s ;ud`[l1h!3Ғq_x5~f5~1 K/`ԩ30W ayFٳv==(%44/pLAE9Y\u (?d@Q]׃p ٙO?nJRK:SVeF=AkvˊxG.XKs6RBJ5|YZ䗣GYllqg)ƍ??!8bHZ*?vA0`M\ڣip)P>JK=2p>02WM&aB{ŀ *c)"swK)jo+>f" agiwE^{M,CTMw7/\0elm&,GyގTgTDrґ9~JFZbb Xv\DL%JbŢpp6o KB \Y3a{au&f*+;ŸP5ssTS v͖MЬlwc ҙ pI;e3`ySQ=

a>qX&j(S'sC~D|.;!"̃ emL zi=y dwyflEnLM 6-Fn˻.ܢ%#3m+$C%3z.JD]qCvЅR)MH4RkWV"Zf*dSUGw?> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 118 0 obj <> endobj 121 0 obj <> stream xYK#G W9`oT] ,,@!$ K?zԫ a3RIO*9A2>;8owzhS[_7/mzܹ1xhᅞxco B- ?6H{ǸzxRcOs?%EMTZ/jB8XW  JBjK0#Xs@ |cџԦv;KX49םh;šsy؏i>Hȼ/ _3@S8E*DhГk\a8 B a/<`ήh{kg݃5/#֚MO4Xql  5vY;Z9/6Пƍa&  ,0ot`I}ZϘ-_ͨ豪dO©nܚŭOI 'cLZD1/Uq}<;;) g:sr4ltaF)6X`/舦) wl#xQ)$ 13a(e1慗3=rFf 7W}7q `آ>Ub}6'3`[<: FR yUGCh^"%vzn N1FFEF[wWz$2x&L2- ˾jYP#RHwT^f-6-S!6֞ȕO K%B܌ NfV ~.I`99|NؾvĹmABP8j&ŎER lc0"2.@`<~>2 fW]!_ZY)DH K6QXqhb v"F^O"ɆFip&7Zmp N769iU-2e.2;V #.CA]˟'x;uTPÀqJgz!6} $3% ݦZ=GErxņ]lFqf;nCOMxև(ͳ p*9yQg ZI*pHui$J3W@UXɧ8|НS.AnKTquJ?!嘧l걍gmu⠻m8x0'C>omM<Ȅ +אDXER, kKT%f *kʪ !RtcƯd Ob Kj#LrE{Af+=枸-djy^t/xW^!cP\TlY=r@'ki7.}ͲBߜVq<ؘ<&e$ڸvnp|??v$+ H@•EއY.$o("3!F%n->Ey~c|9Ac|&[|tePWn5t|l&)cѝ(BQ{WdͰ6-Y;_ƖA3iK&wcҶ=&zG7žo3ƮbHC5f `1N(ͧN5;0*U// }cytΦ8K7{Hh|g]) !:)c5-d۔bJ7U+_9j( pTȃLh{v7ɩ¶ETʠm% kksKSWҁngv3r0zC-HC.LX#d)aqG`I$̬Tl-#e=\O~x+{;XAA-CGT>SyL Wuzua endstream endobj 122 0 obj 1880 endobj 123 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 124 0 obj <> endobj 126 0 obj <> stream xWQF ~_1ρif1o}C>nmLk@#Q3X11֕#E qI /vP ̈'\x.bإKD׬iղm,E͡M'|敠Q2 V L>mVhK$mO}§Ott">{M@P˛V1w .I"˹ve}bMFbcI|1k䍅1&Z8@C X$~ǧ4S%nT=sse-JyVFpuYuBekSŲP9m Imu+Ei ' rcpQ:r*K7(%+h5Ƭs3mkKںl<&U}0-aV}0jps5csqypu-҂s֦ffq~K=IUз"!.i]ѱ75"1'B^vS52Ѫ_o:MFJ[qsZ /*6Q}7]esԨ1I פ8ߒh_E[;|9r? 0k>tH %{}{G`MqPgRg͵Uz-׎e|U<)Q0:yjiʣ-DmQ҉7B fN2$Mɭ e75RQH Tp1%q-g3v:mt#uL^)|;(6̟0ehEک kү*:ܣX\jw?=g7K&Rl $d'dlp JĦwo?3zm$ endstream endobj 127 0 obj 1193 endobj 129 0 obj <> stream xy| WDEVQ򨽵oAlAP{6Aj b- !DlD-XJUՇS1wq#˽2̙3gsܛO_=z!*Rz7==e Ra Ra Ra R1?_ܻwO\Uau)_(_l0ƿл/BR` K=,nd|]` o\pC/67.!eg߸0ƅLݻwM6ϟ~V铔|֬Y[n5^j-y;_q 9|7ݻ'eE.@ҁyF^^v]űRZE6B[4XwH#P@gcas] i;_фԈAS AQ',jlK웼3bR(֩]M(^R_\i+Wtuu…?wb?,66>X>XX1c|趢?t hB%׿j/Sy wŗ/_~:fy Mdb /gȱ@X+ZG+q)#GW5c+oWDA륧{zzΝ;7++K|^+WIooC„ ȁc"gرNNN-¦ht>>>͛7Ç+>>;C77781c j*IIIǏ8p \pAd=ztܸq ?^d jËn+nxܹK.e )$LBOX(qtJH"SQ&(WWI$_5\shZk,#]W4uԊ QÀ`Xb?.ޥ_n:|0 EkqȈ#rE Eq{.GDDӧOegg!Ca^ ٳg\\p´4\}E?{Cdd$V 6(27n(C/"$-[fU9]doF={KR$LBaRҮcȱ7^Dꉁ"8QfBkaEyME4#8qZ㯨Aіu_)¨-m|eA x!~>2>}KYFl,Y"ĉX!JzPΝ;aR[8 ֌4X9fm۶Sb֭[N6E%m _e׵\Npppnn|)](cUn+J; 6 9VjGI q+5-ՠ)M^@:VQRc+$X)V늿BqTR3|/ybP [t))44T,Aù[nȑp%WZ%$uqǎR:უFܔ)SF _" -99錌 a#bŋنWu=zc|IIIx9888999{)@q~+#1o޼aÆIE1^_(W<ېTH`؅򟟒cȱ!ix)_JYDIz,,(I9|ӺWu9ZȑQtFkף" yBKjX޽{h/_+x-`,o86==?~<̮W^{As(vZWgΜ=z4a 2d̙+VƅNNN0>1bG&h΢rsG͞=N 5_#R/^(U /n+~ l"sT^1jcSϱbTX^ 6E庎Ž1.- T̩b Y! EQ!1Qz`z_b)ȈȯQN$kpՊe<<%)e&v)|eˉI~0Q,1X!|x hbŊgMC1ԩ-[ZZԬA8N9]v#:y4!Fk+ZGk8Z"z"p X"n%: B¬ѥ[ZY EQ!ƎzE ary&7_Ub&ߴq(!XjUOI.wؾ{.:a O׸QC ٳ X m5 O7uZnDZ::]Z"w >)֫[w|𾔉3"|0l0qGú>ZRE">سGf͚jciV]Ŋ6VA޽zh\*|M=NJÂnVs PݴamڵnWI9.ZG=hNpVC>cʕ+#JmBX_:}ݪKjm>HQePXHSLČ+`&bVj5kYX|?_ҧu qё"ݵK'ǁpO:MpVNpVRDU{OֵsÆ >TZ5)V/!Æ)WV뒐>HQe`WJZdދzbNv:˗OB.^ |b߾·G[J4}UDT,|V'c"êW6jqzlذ>֮ 0T GjEt Gk%~\|>xR7Y6!s7ZA>-&Ez?,]>PJ(2D":#!~(/=}(`fzȈ)IO1{r%G|8Ec5|uՐiT(z P9 { 7$y_ { ) _d;emm+!.} r ?4@Qejr-ߨQC;;&ߚcM3EQ&`IiƁ(D,38PE%c(S}v4@QejԎf(LM1ӌEQ>XR;fq(250#((CFA(2Pn&)(JHSEQtr{EQU {}(Rџޡ(Ppv}NMQEQ.MREQ}(REQE(, EQf)(5>HQEYA(J͢REQj}0+#%>6*)pNvѣQl:{gݢRKTNvɬjgO},dSUp;lcaG wt5i_ =}*):J1in[]6W>X;6 w^jm=֙6\+-Ko+Uq*2((dKش}0;1I޻jtY:=4$Ō~ WcV2/i7SSj|{ *[[j6"++maQPTP͏,[`˴SMP`|Od<X;gSOm,?m=`3s߲۴hljG^hBW}mXgu\\yyH_^ EG>kȘ:F[ŠǦ30D{l5_,.-fJ;0(oNm;3^O;\b.n3'L3lzvTܻwn%!zH~LuR+,zܽ(BՋtw:kU@=rHgײz1oLVNgJ?ysX-_zԞ~jghu'ah[,nUFFL<Ǵ'"s0+''>{@>}x/]9kXc?G{M>x(m^p`f淎*-˦[9t8Z133+3.J{S/mOOon Eb^pڍoO*%sЉS\A/]7~~s4`G;C{SK^s,CԠk?׏[Mìx2)ݢ|̨=;7lYgGT6ce,z{Y9߅}Yv0 ~B[jv8:uH)GW<)ѿҙŸx|pY9e_%GF*ƕ =gL3q8TR}pc V,;xt4"zMzַ}ܺC6 qѯs>G9gNOV<{>\ś\;cEɽV;o{qݚf0 '#ܣ<6RŠ̸9'~ǡGs1)lx|psY:6"%|a;eň>clFg ܹ?)ݧ[X8 :qٛ}2ooX;LXӤxZ/n*|PPG 9fߠuNa7mH[6oEٳݷlVfZ7c3cZ~+.v9â|ȦuQ{t>ףB﯒მ7oOd>kŧJx?9~T5+_3]7tYNn],ml5X3 :y]}dvtZ JP"LGrLLÅW$j]:m_wzxΧ;v=4c] }*\:gOOx'o=ßy_-{W㿾GN=#vf[^D]*:4}֙4o+ڜ1:a[)ۭ6jӰ|A^->8u5nVwmχ['orn s.FY7"n{?{O{ 3ߑsN}yvo7AkWD)hkP4}pO|+NW ߽IGh,e1Wr1 U&39]ھ:;?wG }xO]iKM2=aiMNQ(e9iMVzzioV;^d33m;[ӥ5K:{9d`-3ZS;~9enѸN^1|<˸-Vk-[lx"ktơNӏy$EfM ;>>訯 9xˁC|Wﭝ<,\y>piqfĒK8?2+ns6daA> JĕA(zgʟ?eß ?xDEיo;v;jVş0?YAJnf&|0*=P(ۨS7{3ៅc=,+{'lw.KQ6gB|YvTɃ->mnѽkQqor2\gyΗpH JnspR}=aˠ9^c}7/&_Rn#tvؠ ;ع.usܤ&}>UZ";>ϣ?=0|S,H'HEE/}`Rf;<ݴ>' Jՠ^vM|e&+>H\[^歚n״t':Zȿ\ ݶcK&^gXw]~v LLNBБ}a!A;6m|dB!Ntux;W|µpH/+>8싨SBЩ׀/WJLLLJJ:z(:uᄏvڝ;w>|'xO>ɿQK7SZzy?ޕn}i^zoE烳,%y39bEWudU %Nawг/.l1)'ne0mH 籙+m6޶yus|QTπPy>9qڀ/';xCt?_<=u _|p܈~۩K]w8x0w>y͛D`3a bTQ蛜̜̔!,]iǍ߻oc7fg&XQRDɤxI'>+ N3H ANB4azG'\1/XumUV7mX]ܑC\u-(+yGdi83IVjr&/CL۔}0x9#/_={>>;7]v:1)I_6!>عkǏ;vnuq{~zNN|Xs( Ux235#-9)dx~q{˃_~]|2qRpa|~f6WdFOЂ%'w^;bފI4'͙vߤ~퉎':e}cJM;3C gwYtp k7nOݾt딞[7/_ʊW~N <R&t<%!>cm7Ύ^_6ƷY} lb(,T\'cïGu5}p }{oܸ'um,4ӷ_ UmglO?%z7v(_+EaX;a1ۉ,{ZtH}>Y?sTߋَ?x3}f$l$׫=?4M<<1ل H 0DCx\=A|~ƾ6c<{lnn/\~ij;6 }*DaM-3=9ıñmݐ3:W%lCr:kZqdM(!8Ӓ !]1l䰆M?nجQAuOyOҨeKfg_Fvζ]8WK#[gd~oɶ[Ϙ>'}EwOfse+#8?;ƅi7/N.k̍ o\t<o})>zk1_EEp}̹ )K9?5aj_m6p!tS6^zڵ{ LNN ۶mۆ ß]->jW=g}8BI o޽h@# >z$S_/<#JzPa3fh&-~&(^y7?"l۴tΟ;}ڶE~ܠܻ{Uf+0O|⬌&#_xFxox?q?-3%%jة+\92blb\pbf9tlۡF&M[k~ޤv_}G<_~u(29˔vXkJ)٩T|>x">-#<&$G'=6#bJ$>lIVmb@*{:%OJ<}=wnߺisnj٣[&Mխ^w{sV횗kذk׬H+|Wx <=&t{yx?1{G\į>zd?zzdv⁉z޼i=&[YHM _A8}B*Q&hRkn=`s]w%ХZ>SaEZhqc [cx@H`؅Zl];NJ6&x8:냡{wm]z劥ދq2yaN=wkٲyf;o?nukWV^3u49y5k1g9}=SZvu۴am8#܆[=sG1k֢)*'*TAq -_*ĦgNgyp)0Gq"y Xl=$StgÄؿf a&hgHMʗpф\<5TVqe?hjR(2P*郒Tr) JfE$q(Y>(I%g(@dVJR(2P*郒Tr) JfE$q(Y}08hg~7ËJQcClҸQݺ=Axx ewjw bg6?yxWFZiΖ_ 8;&|0ф*;xQt}S]vm^?q8G{PVN8~:kYZZe1vU5fΘvKPw'nڶi%H5ǥ2(Nsrz6iͰ+E^EKZgK ^X'KE"1u`{7`!(&ܤ.Dw(|P*"_*ZDdx(^nFPp} L H`+>!6\ C֏5{y_$&[#I0`¥̣ 1fԊ+vhYnρEQ$"##iVX&|-^ׯJcyy: כ<߳G:k5^umLTxŊG uRt], @sYX~wvYqs.朵kVe(=ֳFQR:vlxwh* u knۃ5 ލ’e4_o1&ĬUt JL X&R ;[1]c{$R?b͚52x >Ba͟+LPe˖8 j8T87j(*c#v^kd^mD c1kuZVMŝ3ڹftA1Ghh斏>KZAa?;ܽ[]3@WfKG׷VIƎI⒫Wnk냺f>>wB?mD4Nƻu͛6qEDӦ"_N&Mzh@-6s277Sμ¶0b${Z;52zxj~$}i[fN2* SױXiXbQZÎ6[A,cuB5[5+J**U*c׋9c2ԩZ%|ΡǍ۵mkPb}Bai\b IP`ݎ_ Wn"Vw/ ZHKl#n8Y'n]tšB>Fc J::{^ ~ѰA}]'EeP:,\7[t]yߛZJKB5[הJ_0NU{O:[ 6|Wq>? BAנ^ D1h)G|'(@ث|r"s"/'33pk!a(6)Sf B!S/5!VzQ#GiS'aa:2{s-kjKlٲ^^sDBnպu>gℱyZe >aLNv\)E8vHQy^_-kJ\l]N {&%PuҸnQH1 aтy"z^q`"k6XϠ>X*,ء=V̷ުدo ,xmmm1ymӪsmpsq86#ݪeK :,DC0řb> '<TQ 27;rHDst?WcŊ’׮]3b->^hxeeccӨQC,eBy| F$foZ'>K:(jScc"4 HQEYA(J͢REQj}(REQE(,}08h;EQUd"*tBSE0yjNQe">hwqKbX5nEQ&/j$).уO(2F>}(ʈ=A(#>h)(уOT6~{{BQTn}e /9Fk*N|-7lPEф>u빯ɝ?cW;659H);/9v}67z(*6mqEjժ֯1^#q"lmm{ݫgҥgΘZjf'iBUvPn]sxG n,FzbWD9.SQ#!EI*D,Wv͗˥]LΜl1';]ƺ&#)̄h850A,Ǥ͡N*Wlxͺo`'Wu=Bqu{236qO&)Y *>|,NJDXrsݧqX퓱{J{E!BE eVGX |}09cnjp t TbKKK;76o0zp'EH\i:$"CՌ=ʼ|yrqN:K*UNmkm76&npW߶靷׷,'mV-EiCY|M(|aXY4n/Bފ kktɡO\ ɚ?nx_GXS!Dx #8L' ʠF2)JU* hH_bٳa!xk&1>Ҙ[b)Ib1bFJIzaڵj=8|E5cJ$/EO}4!B?^]o늓+m٪1=WLڮZ>\bYfz-޽+ze0]* \<.3Q]fM/_X]% #C7p{w#!`&kS欋Yz>X^mɘ49H(}s1`v׸Qs)3H8X,677?ntܑC #0~'4iGA|p >|P܎ xrFW_\  ͚52x`̞+\i1۰~ >kjemOoȩoC?}='mm_=-֪h/F>)J%*t> v u %s|P :o5c{V])k/nͤX*U*>6J;T`'}+j]ԺUKa4=imWY|J+Jޒy ճERp:۴nio4,bD+S\=>XNmV9MYI e>7X\ӏ?(U>8cܜK`~'R1h#aC$DV#&IDl?zz>{7ou͓+?w|Pk>AIf WjؠohUV-LVeՊevvo,],  6+V(A,±a]5{M^m~Y布Q=U!ݢ0-`zㆹ"*2zjF>{>:>ϋk\F.'bܼ0՗-[|ۦ2eqwAZ|yru8yOh؜8aln[qcGoF%G&n!pA!R1#EbˉA-^DPtsENd Whœ>|$.f|5ymE H􋟢LG能{d=iCdRLUևdޯQRk*=Noc o]꣏GrejE{Q3m]qrutƵ(иQ pTqetu^C<{뭊Y&:!qG~שSmZuڵ]*AƦQ 6>WV 95qJ5ͬi듢T]x~FZRp!{}AwYW m ~t_ڮ`z>UKJڙK"#fP\x%= Η<5iʍ%KӪ}bUXSG}Q_%/xNRw'FJb}W4lP17Y}5yᷪTE)8E4zU⃔~M>'CQ,уO(2F>}(ʈ=A(#>h)(уO(2F>}(ʈ=A(#*_>] Q ,O+EQa>ٲdRE惭Π() EQf)(5>HQEYEOm8MEB!@1Zp{%A]H_r~];ɉ8:ˍa(ʔUD>w.BaǟxǢRfwjףuG\g SEQ&"Ai%hf \poK=F5 5u%c~=F6ҳ8}1)؄o=EQl8cI| P젰E4;.uWo#6o 5z)(BMl]`iZMu}p`Tӭ_;ɳL_&/[?s-/_W2K0=?}'fHS'=2{牞 /{8C O2_.G̬,Ńx}apppHHE/@}!y12#""<) UOwO+= !DS9*M6+R kp},5p]Lѷoߖ2>]Xp=>x=++eˢ@Æ k׮G >/^|… }&|S}ZI)|`dݪ_~jkd}%rrr*WܫW/?n~mܸQ7ȣRJfK.}7?z|E4Tok ڶm'4o>+|p!)S\uUVm߾=%u֖/ұcGn>>>"gڴiʵSX|K_}Jc >h JV8_NRj׮]vI2 +WrČ6˕+״iS]>yf2dȻヒrD؄c>]O.xI|p̞<~wutkUTK?Ky *`M4oq7f̘6mb}M>]OKKkZz{رZ@0jmDFF"| 1,|8gɒ%ݻwGիHߺukҤI͚5}vaOnp;QZ5[[[#Ik+|i-'H* 9!N܅LM+|e ,ӧk r&ҥKgff>`nn.2˔)3tP^僘+"";...|wӦMzas޼yDcЧ.ao' ѧy!E.]$6kHEyLxMRqkvǍ׭[7ҥ˄  7,Zh ԚAM8Qq]]V׬YbH߹sE>7uTOOO\xuS(>'ׯ=>mO !A{u+`1ÇGɓ'"1d:882¿ƏTsEIXR%>x qI,11e4@౴Ӌa|c|s]6+Z\p|4װ8Bfo/^!9֌&JV\X6h@,$tf3g3fݻpqfk֬y}U\UTڿ?ĥ4wC_bCSNUXQ2G]x^xNFOp-B惚~1Seϟ/ĴL܋M#F@Bx뭷zFZzz. ’zgl i~(3)c=EcH%̃ك"_ŋ1bioC>ÇyoIy@僚b*pc-!C`4I&I.UXlY50XX6o<)) Ζ GDD偻ݻw믧P+|P% Nj^w qvv~MǑ9br| C2| V4ʗ?O |Srܸ?vɜYQP  Q(Ν;%xwt3n8iU.󾨢]ۋ~*q +vڥT]o$&&M}[n!n'wS]vGNpkByQ !rL%r4ϝ;I 5\am?r,--a&L@eΜ9T惧O.]4`:޽>S4w#C!'_X_`sΆDCyjedQޗO#߫郺̬P<aiIUXj_իW?3ɀ|P[oRJe4) уIi}rU`giӦFfXX؛o)2J~~@+VT 8؟p()>MLR>l Ϭbyѯ7 Xa8NNNȴ(_ WԪU Jfdd IoekmW%yL:UDa?{ ]XM<_jjLNNn~{Z7̏L6x{+0clYK(b.>®:竵{5E_4}6Q_K0, !W|B1AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!D ! !5C$f胄B }BBQ3AB!j>H!DEQUE(,>x<9i(R4}(& EQf/EQESFBF?MEQTQ [k!)(䇃AcBHa"pTt9ܾw}BH!~欩 H!*Df%wy  UFvZUK|-]x!-co jpꔉǍSeȞ]F<ޭK~ABQ!z|N[Zh\7QNMdK9Ć `8HY-|,NkΜHMWd胄Zt \cN{[Я&?߼U=iX޹]bF\9[`nn޻wO2eʌ3q`A,,,J.ݻWOК/W\5;%2qVJAHMD˗jՄe 3ڹaE$VĚ +>=2N=[&ܵ5N%aDtAtŢ8Oi{8:B:&*bŊS&O8x ٮ]h7YHÛWXtұؗ@m5jTe, Zd% 鞙>t2Z VK$P9.k֬X골c~£fΞޭG/.Gz6_~SN0,o5n(x9p@zu {+}D,mzi,*CCa0 `8X͚52xro,>TZB:`fz L02:,`H, e烮=u) ٴq(|pUVPFu !.`ѼcѰx+87YAU|9Q`"/oF梅>]>o㼹ABQrb\LNKplwYIzuaƌ)03_{Ͼs1<[[[xw옑0J*[,փ9ATRNm4`6:wP|#Z}a([۵m-2R2}Bԃ{{ cF 7lYྼ/M9gf /?2R> [TJIP/Fm[}}ow>}sw_hySg-,,,W;~/ TW[O|bXXXXXX<XxayE~Ç>~b7~\{sgoO&`ޜӧȳwnwՖ&_;e#PYz*oܞ;gf^11ѓ'})MǽA_޸Dh#;ڸen߮,Q~yq-n['L,0c]r g10yR3!E}?kC>E͜1K]o-Lj륙cu%; ݳ3gw6j԰MW_}555ţQ⭁tɢ&MsqP߄}ƍEGG/s,!E;v<(Iŭr^zef;fT|\|wY|o@򰰰ٳ/?'.;3nڴ>pE\)-a*k=.9wx8%h)ÇJR# <F[Bԉ`yj=|R3>aHy8,θv/e>~Sğ-p]I+aV_<٢yhڴ8.v ڳIi7n/;} $qxxUߍyPqGc(I@N[$4}|ju_d ^{P hd(yKcbId0j g7oylXfp/ȳII׭26odkneZԹ}S٨CC6lT9 Q!Aj8yUz6\Ǩ=7P=xZ:cқX Jt4qOD# YvڒB,lUrSoU^=bDV!L(Pƿ;/U;|tSR@͘>E̫PhF7TqȩOPCq=qk8 3xָXǰF1jmvɃcTYy lԕ*06mzL؟jr+ż)N;npJ<lUqDq9^*&DqiNvH ᑔLC:o!)i_)@DQ.m9h.CC1ZXhhU)/),kfY80{FBVxB[o9?o- _AZ Od; !(-39+ZsG-$Aur#99)ePL$1jO? Exzy5WbBဢӥ,ySnriGe.4(P|;Q("96 nԡЀc6A!q:]91k.PpOqñ^݆9qvǰF1jmvT 4P-Uu ;b%>Ʊ( ~.O(_[mS&O$Fʃ[7նmfPAlO8[\~# 5sz}ttT$Z#x>537ʈʏpU$y7Qxq.zii#ma@b yeKD$2@>2O^J 2#wKA'[)};u$B}U_/u۰^YacԞ[%W+QWZD>̓6 \OMH`lj6Jq{Cr`M{ÆƐMؓjtT0UIre8nB%n1 )ʧ0JVzGJ9#f`ŠnQu(4bcϟdAtr߃rE':֫0/׫qvǰF1jmvxoU`.&& Mu ;bpAeWv :HO 4h%^*lĆ߷-C[T aJi 6@FN6L6vn hMd|-^c/k1BD\\#4D-Z0>A^p>+mX1J/5\ep$kVzI ozCI\ Rypúբ4H`@|}$I;BfJ~}ْUzyEZGJ=z)8ƴ AED0Yn#7DMD'f.$`wLOO3;{aAUdFֈݴ$F8$CQc 3JW?PǨ=AĠ%1$tQW.H GA6S@ < <Cpp0&5J8ޓ4q<$^7=iٲzҩgNlL4&;bሇ 3/x9c*NAZ|I5AHDPa֮$/>;H ÃqhjE`Tэ}~oҥ3#L%s<;?S)Tйs'4O\пP&{Ǽ &U&9#]$>wnni>X`hD$},[E)c,VzaDrc&jouH!8iI*ۖ;!YHƖ==8;lءab9M{nΥBOOI-zpvDƘ(W[nU˗=q0H9˻ q_!pqfe4_̏=7gNmP|ĭOy>xyь:|t-M ?r%pgY~<)557k!c:*= LUtAgKsnQv̓Z.D߄=(W-?ozXXtXXXMW 'rJų-Y11!!!cc^-]Y^'ުQTX ^ګ5>ؿϖ=+p~A%A4> stream x͒%q(]mvrxÅLrp%߇o;r˭upP _Lv7 gviyJ.\]o\U2u9"3ȾbpnWT#T!{\U2u9"+T3JW *|yJ\]x,1MW *|yJ\]xeƗ>= W^vW&Y[劻͗>=HįL"؏~ Ǘ>=HįL"؏ - >=HįL"؏XE˗>=HįL"؏@ٵ0 K\vW&Y[BzCً 4{vҁF9N_]1khk Ȯ1@0_lވNJg7`ŖKh8 k0fmc^tmaՅAyX.q=+817lHʎnڇ9P(+ĻY[8Pً ĈҿwkZ.q=+817lHʎ}c;3^tͰ9ȑâk 9W{b>jg9tn݀ m Y'72lCױuHb/GNfd +|Vɲlۣ0N6g7`G>&F;ly4&l`]Ƕ6g8׮v&z/uX[F.L!;_ p׀Nv={c˘ Y! ǰ4x`s$ad/+|y&l0P~+]v{T;GɦsRnjl/6dy{Pl8E` =i#v52~ _^Ȯ(;& p׀Nv={cˀ Y<{B榎ڴlhxw奷:#&w Qyo'΍޳Kٺ7v ؐC-h*dMw- _^ʮ.;>1 p׀Nv={cˀ Y<{9H`iB=+#xYK?ٵ5dG)s |eDuevWg;^SF81kKJ#?PP/[pd;AgvىFva`ف:9eYQ^QNl>oaͽ4+.F81kFjF#c;׵{-/KA-1? ]v]XLvqNA7rT;=FJj̰m>좹k~ _]Ƙx;FvfFK僝>|Ѣ^&tى@v1`IAk2ovza/FUiT^Rh×w@1fz9N㛟0oqz)7{Ӈ?}Gh eB ]y c K7rT;=F]FUi`Gz^bW^h×w@}B<]2fal~^0vLuRua}@>r|Qs ]vK.-;z:ӆwwŕe}#G3WJLE|Es/{۩\"6|yû_~ϟ?鹵O?#]6 47U`e㛭U&vv|/inއwOe' c"n^+,9#좹]4tΝB֣{sؾE^ښ4͆cm]^A%\vNO%;D#н"fJ|e 0nԑ=Wm>좹> oiӧO˯_iv#ֺN`{?<#^A%\v+N&;^wŕe}#G3ɗ]>xٶGX6vˑ՞aE_|y.krֺN`{_"mkX?U"N|E etsOzW\Y7rT;|5Ȍ>{p=]m>좹voEc@8zsxHD0kX?%"N|9ىies4rŲlgM;!ëohYKT;G^uhoGj{Hw5z^*9cц/.Ɋmy@)j0Fޑ `z9hzr_KvfٱuFB#~?HA{.j:*?{jvW#4^=|Es/h×x?>8?y/_6|hpt꥾+Bp޽_zr._KvrrFB;ʑ=P<.,Di ^ ʎ^=|Es/h×x?spx#c}#__9 zlP}Kp`5Tb\\v N/;U3^hg}RixA{{ŽDvz~ AS1ڽ߫Ghmt͟(W6'+7 ]S/m6t]Nšlka qbrى/$; ?vB;gʽ?;/DT3ph]Meh~~m>좹vvo/h<*W({_eB(EQ0 zivom6b"K ׌a{a {> ]vN";Ώ좹vvoůs_l(_j|cw: zy~7?`wMrKyWf pm{e'BCsxƏsٶᵍsl*1jv͍4N߬ ʎ^=|Es/h×7og޻W([i+^P sy9G^yGziǘzl]}mv 6 ]vKN%;좹vvos w/^gJ~+̨~駚 G^- tTEaevuWٵ;{e'r^rlUG96kxfeZh%ؑ77<3.k QM^ _~Oen1n>\_zx׸!7<_xG^ -y;%^69hWwn] ]vN(;%i/>g5yf[82͆˟5<캭^ډys;2MO>[n'|yg袾|/_l~ﰼK+=֪w/Zc.vf#!{55{e'>T~sxﵳ2)gS{Y#;r/nkvG<8#}=C{6vK};=vmb|OP|lsvSV]{Z+v`PIK"N|~yEe4kfxc|/E=UZ3xë\#%vBTdTgi860*.{oӮ _]PSEzy{"1?c֪w/m }ŮBg`ĥ2V;mWtىO.;uF{4092νϾzkۣ.6G{\} BCw^*haͽԷi:w .^Ů.tD|s֪w/wvF]:q7u$.=9#Xh濔ޏ?x4hE$Ҳ9:yxlg?k o aˀ^ ѻw׺=6նoaͽjgo)dxRX?~|=]{͘KawT[w{mzdekGc+3/)ovo_z^qh,/{egm!to Öqyavpdx{W (׻B?=6R6vˮv׹Sb矿曇_rBmlk@8Ův=xu{ deGo1k N߯.;B~3{׏cϱ]]W~O>^Du9w]N:j?.{NC6|ywrs.\˿^_*Wzsx}-Q|?~ǘ^6W]{1m>ĥ2O/3c#n hmV0s|ޏ 0Q3㢺(].e%z^iDц/.^ߜϿ!??qOo}^b oz|>o˗//Ct]Iz)dH#c kY%"e|C?rۃGy896~px{Gxi%{yTیm;GhXtmǏ7-/~Ƕg/Xގu:]ĵaM n6u{ދGd'M.{N7~۠O뛽yv#_= 㻚HC/Q8Q#m3j%mna?.{ingW 6|ywO;-(_Է|qi|W됸#|l[GGd'M.n?LST9WԮ^ ]ۺ8~ i7?.{9Nbmv|~Kz_Ƹ?Sy_C_"g7\ ǰ^b;z‡w68K=l`כ_#x馝_ޮo>__-iyws ûREv_vmdE$Nħws û\&0ˮmDՉ`WSv!{/rNA7rx\d?&~ٵm(":Sv?d[)3F rg/ ^"EW']]vsNy#{;2o. ~Lk E-"QDpu"e'>|7)3F rg/ ^"EW']]vsy#{;2o. ~Lk E-"QDpu"e'>|7)3F rg/ ^"EW']]vsy#{;2o. ~Lk E-"QDpu"e'>d[; d}#wL3`]Y/j".; e'o8 9 .e6zQH\vuىO(;YVx9eY]pA. e׶A֋ZDDN|B:wGf`([+k;px":*|ys+{GVvevemOW']//5une7 p΢lݮTb!"DFvέF[YەJl8Dd<\vNֹ#~+]v;uSՉDFvέF['|m-A±:\TNֹ#neκl~:m&Չ`?֖:w!8a.[oDpu"Hd[;(ng]n? SՉDp:w!Q\κl~"Չ ᲓuneCuٺx3LE8V'Azy#{;uǛa*±:\Cv(ng]n? SՉDuxGqv;ufpNW'Fv8;Yۏ7Tcu":| GyGqv;ufpNW'{((ng]n? SՉDNv.{#uǛa*±:\Iveouٺx3LE8V'A:pwa.[oDpu"H'Y; xGqv;ufpNW'|+Yۏ7Tcu": Xκl~"Չ d(_Jve0XN';w:ve0XN*;:ve0XN*;:ve0XN*;ȇ:ve0XN-;찇:ve0XN-;G:ve0XN ;G:ve0XN ;G:ve0XN#;P:ve0XN#;P:ve0XN&;??'\);?yzz~yrZ){`NOCk`3NOٯ Ѳ\,;?~g$Np9tC 'Jv03Ȏ$YvaN@²CW]XUvZ+Ɏ\Qv=`%ٱʮ ,#;PpiمdP(wEIex#T0h۲kȎP]9ȗJv !M;dd/9[v9a.-t@C/ .6^NC%FȮ@4^6`jKdʮL<<,WvBAX `r/)_S&|LN09 `r/)_S&|LN09 `r/)_S&|LN09 `r/)_S&|LN09 `rPùH|7Џ ~.Y88da\Vli!GV!^HزCTӋ3tTdqba `:+N)"{ &"|b` R*$t0uH&b^`L2)N P0!bue7@ - ,${F=؂#0֕A$M,'h cb-9d; $;2}ɕXEl>Hb3ʎ@/$[v"1 #O~bȎ@0ӊ&;zdFL+6D1\cFZĄb+ˎ$@ 9Ɏ'@ MɎ'@ SyUdCL%6mYvT 1؜ײc pTIf뼗av &^vɃAl=qh$ bI:d$t:eh!"]lzNYvZȀS#;IS#;IS#;IHS/;}HS/;}Kv%6g !Kl2^ACL[`)b3qd#K,f21d=Mi H-`OfoRC {zH&{ ;Z*+u {w;ߤz0^lN@ӧO歧])K7r_u2e%&Nj1#a#)_ܣ|1%2} Ix 8GdFSGb6Kd0bp ~ծVx勿?f^ὔ/* 9#a- 8Gd[wZaNY+E6駟* #a- 8Gd[OT{] i:'._| ?xRx=pfn=E2/<|1O7M|VNd/7/R|1҃ߴzD6)_0 HzCb/(,=MGdΜd/7/R|1҃ߴzD6)_0 HzCb/(,=MGdΜd/7/R|1҃ߴzD6)_0 HzCb/(,=MGdΜd/7/R|1҃ߴzD6)_0 HzCb/(,=MGdΜd/7/R|1҃ߴzD6)_0 HzCb/(,=MGdΜd/7/R|1҃ߴzD6)_0 HzCb/(,=MGdΜd/7_ɏi._d|:{S<ζdim{oROM'h9dgN@? GYe%kan+&U3I}3' YKk[gs55}%+?|Ia~SeD6sF?TOAy1lR~m88 H_~oz~wy]Eq|9Vzр說#ӟ<_m}M/o7'5Y' [֛kV??kͧ\pO7fK+-˶J+nL?AbëK\^$/wTI-V`f<\G`AQ߁'>Ҵ0uMc)_|xl)_|x[[=i*+1oj ~w;&J\;:+n&^@BtYŇGZIML<",氚`w:xu'7TJ~_ќ,ΈQhӚ,_|hӚ)_Sq7GmFgKWgcj9{Y7޿ `W$v/>iޔ/@C~MwafǸ͕IA|۟Px<+NJpYS+/}9{4ʾqpmyPY^lbNwX.'yA٣fy95~+Ͽ7?>Q4z3/_dіe3M-;;H|Wvv%6g !Kl2.GCؔzّGCؔzّGCج1MCĜ1MCĜBDh.6=,;-d@ 6C841${ H$btˎ0@;yMչ^CB#6a"b*9;ϲ plĦ<ˎ*Q!fO"f_\v0bȉPl eّ!'bNY5e iW=H2#_JvIYlRq&9brydG f+.H,!6?("Kbd# $;2}ɕXKl1NrbseG`++;HXTl`EGb ^udO.20H b3^ir(N#P0$Lb+^T|)'z+{- beD$V[lIa5+-/NdqXk05[y8"{% bkN@'/mT#{{SA08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 3A08 Pt0 xvBmBŵf`^nPpMm;?P0K(p@ U0 I(p@>R 5 έm'^0Ҹ@BYId/ \6lW\dڶq46vB\aum{xQً @GP %C(p@XW= !8 mߞLvZi۴ "BZve0.Pzza 8 m^Dvp*Khۨ"r Bڶee vnP0yqA8 Lms X8 Lms X8 ̩mg";jۖ#Al$ |P0=ɦ`+8 LmCRRjAT6$eQ8 ̣m7Pv`hۊT/A$ڶ" cnzP0}.A<(p@A>d k8 kۄ45%xPm ;ABHp 8 jہ48wABAa`8 $j~vABAa`8 di{>\!K#DvjYQ-:(p@HѶ^)6!E#PxdI摻{]yR@ouPm+{Wv2%VVAsIAxmp^O+eZKKl׽9夀\a]G@_/Yɟy|1 W^]OOO/6%Axmp/ /f|R R:z ?_fG3ڵY+y$;r5^ai+`ڶ$ ]hF3k%#>]WmRY* K[F#9 ֶ$q'ށwӣZ̬lTv ^bIe$,m0Xۖĝ|u^V-ܛ=kUmMǏ3o'Xr7:)6֒Y"[Es/sl|1 ai`TXKgle*/zS-"(_lHėT/)_|1[DQ,wbS!`-/%(_RMbܣ|YF#ŦBr^>Kd+SQ|ћlGfu̓d|V|H7"rf z,LE"EoE Z9,6Y"[E ޔ/f=0s0Xl,'D2@)_{/`6k]`<XNgle*/zS-"(_lֺ`yT/)_|1[DQ٬ub `9Y/%(_RMbܣ|Y:Ar^>Kd+SQ|ћlGfu̓d|^ӖeXMm務۫ N]=KLJKY:AZ_>? Zb%҃Ǥ&$,m kI|ށvoIo~=&?T/SLOۤ&?KLrnt0Rl*e 8;V_O;ID9#^s~S匦ȦIK gčĦBZ^*f+V {%9Oܶȓ F\fȍ#R@`m9: 쑫ks^CD-A'[ĕV82Ȭd9jgخQsy6I"vR(F3s@mɑP~_poiA- vWE $ˁ1~˳EI)_@7:X`m[Nbz"t5 g/IEAvJ F:l._LJkup/F)guGZW r|1l!Ѿ]gZl"{6|botp2:½J%gi`W"k rP75o\x:~s@m.»Hr=5/R._dj1l1SY>R=ja]G?C쑮Zb)f)?" v5 0^ۮ#֟_kM8.~gv5 ‐m韲/MΠj=j!E#P{8 hxr,m{({8 di{>\!K#DvjڶeG vPmqPvvڶemnwPm,;v Ͳ].xPm&;6! C @;8 ̠mWv(qǃCv2A$ڶ"# yP0H8 ̣m7Pv`hۍ<XAT6$!8 ̦mOrOv<iۓl&;A„ڶ%7>n}P0ɋ8 Lms,;zjۜ|pB3k۟4Aڶee vnP0]zAف@(p@XBFp{ 8 m^Dvp* iۮb BZve0.PM{J١ ;!8 mߞLvZjۺs3me/9B\ڶr46dڶ̲WA\|v\$Ppnm;(p@M۞xP} Ҷ!))am @=(p@GnPe &Ѷ^sӃImEeG\am] yP0}^q ҵmBdw<(p@H׶ imr\m;f.<(p@ն9";lsDmۏ6;(p@HԶ8(;lsDmۏ#W;(p@Ҷ|6ABG Rm<eonABG--:(p@HѶ^)6@z^G?*3s"R?w/PϽ kuf%#*3H\#=.` .uP0^ۮ#\Fw^~%w5=ӧOyy9/6%Axmp^?NCbJ^*|lz"V ^j\a]G@_KNY/f|R R:zH?j gG3ڵY+7`|1I}eyӧOK ai`$ڶ$ 9]hF3k%Fk~7f:]UbI$,m0Xۖĝ{^Nfk1V-1^kM*kU܍Fr@mINxg_ޗі0weW6{S"|1[DiANnt0Rl*%|E ޔ/f=0nt0Rl*%|E ޔ/f=0nt0Rl*%|E ޔ/f=0nt0Rl*%|E ޔ/f=0nt0Rl*,'|E ޔ/f=0s0Xl,'|E ޔ/f=0s0Xl,'|E ޔ/f=0s0Xl,'|E ޔ/f=0s0Xl,'|E ޔ/f=0s0Xl,'|E ޔ/f=0s0^l*%ͣ|E ޔ/f=0s0^l*%ͣ|E ޔ/f=0s0^l*%ͣ|E ޔ/f=0s0^l*%p̃6K3M.: aik] El6"r>+f%$knė=&ϕ-w9wKW. Y{?n~ڒ=ߖ)e1v믿V$_/TkeD^~a3XI}%qR ܍fF䆽[5FY+9??aykvMi*&bS$`N^ 7:\VxӘL)_ EN{G3IDnџ/ T7:;9(*o/f8!α٫7c9>YY5v.=&|rot}sP[{~_,\w]VYuzS"v]NŘI)_@7:bo ٘ +<+GE/2ĦWIvpXKl Ya`>&@vsXQl:)١bȎ-_Dvh@;7@&'(q X]lJ!(@MO&;8p8ؔ4@ AӈMO ; q!8i١ ;!Rl5`! @.g[XBЋ!&tpzU e/0ݹ(\Al`*K [7Hp55Kh[O){Hpe޲W 4.e/$x[s$}%2b =E _.4sFl mc(_S&|LN09 `r/)_S&|LN09 `r/)_S&|LN;丶L ؙ#E!]JhsIpv[2\U,@s 9МhN}4S_ͩ/@s 9М8O}Ϭ{(<)ƒPN j v$/E$ sqC&jqUvДj} YV K@#g ЂHLj> &L1Ơ$IRL(,}2K7@jQO`o-F~&FT+=M ]z{KmCz&HmIz2ےEmޟOz>BmҟUzJ[6-=+MH4W =1zH pD[Pң(&Vm?*IFT)=C2b զ#KOLD7!Mm~'=O&w p+iVjc;S4Dҳ(DiXOڨK 'AmNV6sNz+ A&t.KO` xei!U͹Fz?ds9bYkgCPm*z,#Tɹ^z>qI`ه)z_mgE`CEyv^qreꄗZ4)7qR"}؊E7S&)7q" "}؊E7S&)7q" "u>֢V_4k}%R^jѾTʕ7 yCm; آV_4e} \ /eSܙ Y$s+0-Rw9zu~7ڙHXOx)J]3'cE&PQ<~~!>7W_0w}"zsK' ,Q_,Ћ?Ǧx[:9a7b)E^965ij yK//v0ϱ!NN@XͣXJ}QE}M ,0tr"oR* sljgy/R_TQ_`şcSC< -țG}bC/Y`nE<ꋥU;zsK'' ,Q_,Ћ?Ǧx^:<I׎b)E^965ij HvK//v0ϱ!O@R䵣XJ}QE}M ,pD9ꋥU;zGO@L󑵜pQNrE3ϱ΋  Ȉp_xy%rWW/;ACR68CyMEs"8t<|~w߽޽{O%<3'߿&FNw͓駟^>mcLJ3u=,9|!~oo,5ĦNM8G믿>|>||>wqƕ <-NrFRߩo?N @d/=,0/-%{vam'ҊMed:l1߇or: z?ɝ#u}3?2?խ8DyzVoJ}L,yQ4sθ'>綎lwAuMࣝݓp gǟ@s^NqSWjS `bSKg7AV%\o|7O8}6˔GMݒYaFV"wO~VdM/e;O9[~d&zO8}enlwԆ[~dꋻ[d˟{yS `bS[kMp-d]d;?-aI"g^_}t^_<>=қIJzY*\W 7•W ׻>,m +,/u[xii}1Ħ¡Jp^ps-W`$Yq[1GKtCWz2{3K.tpI9KOJBH:LK[5ҍ~' $]-l+}@tǰeCYJJt Ft!q9ar/hMq De De De4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4<q 8Y8x^&AmY('qL`SR[AH .s(>D-W3l*}TM YL[SzRm>BF+&S!ĥi LbuACH]mK\2d(V[ !}㪭>xIO QzNm 0(v"41?@ 11?X6'.1?p%+1ڰ?6$(_m̟XzP[h6O/=.MHtV"=4zH pD[Pң(&Sm?*IF4T+=F2b զ#KOLD7!Jmx LA ΣTn% Gmf$=X[IC4Qy&=^B4Qy&=^BtPyUzAtPyUzAՆt.H`%!ڄQ$UySzkH@dfsޔ8A+CPm*J,&TʹRz?FrI`ه<",#RY*="j8+IW`$ +>!NrKD: N!6Nt=i"{KyS' jVah C /uM@j38/[9wEyC;]=OxufM@j38/[Q_\fʤ? Na[P_\fʤ? NagEGn/MY_| t{R5rmj77܁7%n.~^J}fW. yCmF;p}ßaKs{/|[:<Iݨ/]_s^96ԇW.y aߍbkC/JmJ}S$E^;C|wЋ?ǦRR_T:<Iݨ//6ϱԦ<O@!>Q_TQ_lmşcSM/x*_;C|wЋ?ǦRR_T:9avF}QE}M6tr aߍbkC/JmJ}SþEֆ^96ڔ 3ć}7*ꋭ sl*)OkgnU[zTjS J'' lݨ//6ϱԦQ_TQ_lmşcSM/x*_;o{HE'簝ETV*lC,rwaSPh E>hP_6T}&nlC,2>P36(U3:߯Ip[|ҫfxI?sJ>U30 +CDmgX@!6B , RY$=|edRj8CPm$z,#TɹRz?զr;bYkgCVm0M!WϹ,=m5$ j9G D!ssXIڐΫCXOڨK 'DmTxn" Gm`$=X[ICQ9IVv<" P@ ~paԐh6Vze"z  @%ɈjѤPI28(6Dzh#K `")!)G!AQԆɤ-YFi9q GՖJ`?r>~]N E&=1fadPL"h+}1bӨ ZI-@0LjK&҇ 'O1 (}]HU̪IYz[mt$aq F҇ЗqԶ НՖ`bGV[Gx|6"ڎSPHW)+@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/pκPN:G d1lDj0 CO;i#m6>$,V0 }`IX̪UYzOm>H.*&S[ t>Q~]N TzNm 0(v"41?@ 11?X6'.1?p%+1ڰ?6$(_m̟XzP[h6O/=.MHtV"=4zmՆCIpD[h$Sm?*IF4T+=F2bFKLD7< DRܹS6s,!윤 p+i&j;Ϥ pQ&j:/' D9W D9ssXI"6sAz+ A&t.H`%!xΛXC"6֐ \)=vjS9WJ`1TғXF!6Hz>qI`هD&qVH_6+\y>}ȡw6?n:_(!jyh ל/rtC^ț fpVK_uJ%(:T<՝yIݜEuj38/:xa]}y{w>EV_rkWY-})E}э"P I=6sM*K7:Zt\:_5W>/\9K73rGNjj77 ބ~E:ϫ/zSW.Y y]mFNǣf$WOEW_oݦCR+ <6}sM8}?އq Nc蔲( Nridk5uU}uÞ\zU:<Ib)E!&r|/R_R_lM}m"/H:<Ib)E!&r|/R_R_lM}m"/H:<ab)E!&rz/R_R_lM}m"/H:9ab)E!&rz/R_R_lM}m"/H:9ab)E!&rz/R_R_lM}m"/H:9ab)E!&rz/R_R_lM}m"/H:9ab)E!&rz|d-'\hIk"O|պŧW'rVlja-=yfNN@RS? $?4@!];ΔWojϧE0tx/ȧ^?nO?]sL]Η̟5o鿛_>$;U&x|l]Ȧ>|"U:<I;m?{ׯӗkȝEyׇ"?|s/o0u}iynGm'^onj0lt6}`'n/6+) ˻/U]׻jͭ}6`QӉ|| M?jYT_W<",=M`"~=uM닻~ev qc777 Nz$+N8.w7]5]_5X|ҫflu|= 9*/ӧO|Ú^&}_" Ѭ >U3$ ?L&q^mg: T>}`rOz 6B , QY!}|H ,?)aEXF!6Hz>Fr<2A+CPm*J,&UySzkH@dfsޔ8q ңXI"6sAz+ AtPyUzAtPyUzA4Qy&=^B4Qy&=^BQ9IVv p+iVjc;wV` ԆKLD7!Pm?ʈET(=@JmCIpD[Pң(&Ym?G4W&D$ K `+RCSJ`C I`[H`sc H`éCK`'B#-~&U%}Zm'0Ph.}2sm zJ1@4jVG &L1 .}-TLCHI"@Rmv><^d+V* }`IXDmɰ %gq(C @j+$/lAڦPE </@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/@s 9МhN}4S_ͩ/`)Һc ~/+<58v"n> 1\GmP(}0I[Am۰94%d1za3hGbJ}BDOm>H.*fR4>T2aW`$ +CDmg`hzt~C^dD>~ɡz_mgE`[ ݨ/Ruj38/R_\F}rkWE|d'G-:Ix+ߺM\Hf5\atoBxhKO8:Zt\=V-^}uJrjj77 ބ7Жp:u0S'z,Zb6r"pզon ߢJ+g^xGP$FIX^/'rκM"U:<IiE!&r| VZQ_R_lM}m"/H:<IiE!&r| VZQ_R_lM}m"/H:<aiE!&rz VZQ_R_lM}m"/H:9aiE!&rz VZQ_R_lM}m"/H:9aiE!&rz VZQ_R_lM}m"/K:<I7iE!&rz VZQ_R_lM}m"/K:<I7iE!&rz|d-'\hzC/jHP@@.4I=M5_$GRRo~ݻw~1^57Z'uz5oǻr=;z6/w4妺= D:KwYtnN'o#lݻw&萻-צD^ZS'^8@t^ [xw3? xVN=Orb"aCnu]oK%֋ [-xj")0td^N' þ:׌}N8=/v^-ay祾s%Ezϩ/Y#;{ouz7UpzyWE. ٥juMmKzfNW_}}| f[9W_ a9\饭tHn%0tp_ۏP'}P/ݏz};?.OJ0@t|e*\:ѥHCKƐN> #*=vI:Tz0t?`0(8xip!G JgI2-!=d^:O.=^D:,=[D:O+=XJ:O(=RM:O(=RP:O%=LV:O"=FY:O"=F\:/=@8t0@5scI7IO ($=+8t%0#4G$h*= 骠@ץ;.s.I7y oK1H #H7 ;I3pt5&҇ K l%:H!tRۈG$7h$]T|!}@k `* ` * `D G9 endstream endobj 133 0 obj 30484 endobj 134 0 obj <> stream xwwq dC&#@I{h@ٔQ(he=†l^aCSH @aKr#dYdIOz~ϒޓ}ɶJP&ð=W×+pnZ}g^հ_<+}^ i%4Z6Guv[yM`f^UGFU( PoSE?S^F蜠f^1Fuz$G:fQCb.{N]0=aT^̫ڠ¨&FrTiz#J^kq{1ƈr(; -NߤGnV=N]Q{z%UMNϼ`TruS_o+jZba}~W<'m8dOeT鍿~wD,G0ψwD,?>ɆV=verYD9nZ_[MerYD9fYC ;}z 岈r|CIN[Ū`<ɬ/k]ܚ[AFŗ'>OK[-z1\RyKUz&6s׵ܚ6* ?c}/O|]w^Ʋ_#KKy{%Өz2Z()ոl@K4u=hNt򉃂VWwџ3[d̉rQ>!6 (O̳2]_ԗV@|Qnn{/(Oɗd1."0s`; ٶKbq6o[+푬@l&xs~A@8^Ⱥ>loMc|^$TaD9(}J+ to1.W6sTd_1՟^]Y';^\ӿGaDQ2M}K/ ߨCr!Ʒo:E$5k:o}f}(TFy@omr2{5*)(340Unʀ'?o̧`F->P}OmQYT&R w_?p)fQwNO<{39䤋[aG+O9oW?f(W foL]ҋYם2οć@[J]bu¾CPouazC$ʅGۏcۯcSe_}K%7/?q7(w^{w trjUC /Ÿ;F6| 0R_໖(_GTvD9'Wk0rQ>-\+f-Q^xjuG6?tH0Fqx^(_h\ܿ>f o!nÅO;joDeI)iV땉r!QbyXնո,BGlvQμ;Nf cE`\O37_wڮD&߲]{Eyܹ]5m.4 ,6MLF %rM#{l64_容sUm=K>ݸlx1}7> Ok nr`Q\暌 w+8pbǏ7s|aeIM_=jf(w~^@ɧ#e1*,_GFo,ƺ̚ /ʙE5K3.9N&5 1l#l4.ksX~4]`5˵y36{]`>Oՠ~r}Wى*Dy޹,ZO!%i#n]^@Q^kY_e-+r"~#(߸\n/l~N^ moz~[ڭk4lXT%5kJ5r&ϲQn9z$i`l8[4l@XԤ_篖Og̝Ӡ}h+3?,/$Тn?ٮQl{y(b|c}K~]fE柽,/W *?ʞ?f2a Dٻ ި+<^=)a\Rlm_/4DUg^o%=\_sd%aE-%m>D(7t+ɓF4q* 6,Gy*{Z[+uPQ.2:vTƩ2QnXmI ^-=WRKG^x}yYVPpeZc]r.QN&Ow~ߕZ2F%[ӧƷT2%gCW ʞvʥ2n_(l_m@k'gk棜Z>yYe˯ͯK>c k?lo5ƃ}tet4-(c|gC?n^({R/ z>ii(ېBbs (/zo}~rY]woXFs?Sw㋶C.]>w|Pr7Fon~}Xr^!DyS 3q}SFyX!wsN7l܅CW)ͷӗL q%_S1S=G5+Vg6ԬF@Q6oki[ uQ>9XKG$חmytXNɾxgdv]kf.[+ ^{.4?ј{'e./%>8Q%-lKn[ɷN7+,2r`#EžO>^9e5w'QafFI>Ud,ӶnP!I姍/ p3?¿($J}GsD|hڢ!,gD^MzoflD~SN+:Z. |]s=i8HX_B]iܵ&[6o&9|$ D-}s`P%Y#ЙQ"J <=P{!쟜_̻Bܖ+:C+eN/>Wu/W\WVғ~-{^!Y8^Bqɧ̃+TECׇƅ>FvqůS~gvOJHgnӷ>Y[Sg[)(=`?j|IQM\6.|*Q۲TxJFe*ꋖ#O q[Eς' OH qC/̿Q=IFeOaUN{35Jp|eQ$0Oz[4N͐l؂kk\c;7LeNOPZrD8UmXTo>9?b!%GreONo',KhQ%qGdJp!^_7r/ɽsM'6l@,ĉ&K:~L)(?c.z9ZQ$2UAÍQk7s{妳3 Blc~nubmUr||q/Dze4G9P%^WqDٰᖌ'5,Q^ ӧO*l7֮ӧZ~mqo։AGOh ~~?,į /+D`? e)ߠpz)e 0[\|e'$-sϒyMA[7b̻8MlW;o1ޚaF8J̟ S3l?@({QbA/cW](ߐ[-Q~v2gGS_u_4ed-I('~{2nQΝrb͆#8s9g}֙ Qx,a/r(he;N}9#y!E;sPԝ _bG4N=]bxsq[ydn77̘mO`ꌵ啈ߵxKFe+um_6n9;dZ׳W:sxv7gΧZ^we ֕e:*?X2 -# .)[G9{tl:Q;SWr3@ΧrN/`br.dE'jUlxb,7lW}r4K,yG>YeJ(Zx? O//%*eM.u\;K?;|3w"<2TK];廅; 3voCt_ܶ!nqSi ('ߕQ̏(rW!j;iJDY=q}a/ʷ􉂏霥DaE|XK# ;(Oa)B]6D9e2=1L5m\p_e޾hͳoU|us/c*UKHt 3JÀKGy!:cV.[~t>+ҏ?X.hu锊!F.3w Tď(3^#-OVg-v6/eS[^sn;Kb|sAE-Q=@Ik\[pcۨe0+b=KxAF|Ixw~U-s*j̛ _X*y%e˃}Y}JG=Q:h(o?۱raSXN?hGFUrzun\m/>x8JF98WGw`K{xѽ3{̾,(/"}^_Nl7(.G(Kh;ˏ[e5nQ-,GS 앂j|)̳ކPe{+Ke󣿅~)Ӎ닗JW*_}ʜŇN91_]Q6~ϓ/KEI{M9rׯ|8apQ~-P&v[m}j^QnZzpMoJ'ѸĿ(Z^Ti XNaU-O%La=lf>Y?>w82(w*iwrZeF+ZK-g(^G1>Bew7WjM_~ˢ?4Q~C>N_4,j4'Τ짦9|dt`E9u!2 ڱI%7Q>M-[Br̫Cvy3N0f`ʿ(c6rB,c`l (@[>Dܾ=vqXzcgܸ06`R4OՂ(eNc &6{U 8׍. `U٢l|Q?RG,W_=/Ĩ f7淧o33ܵzsw7#FL-g,J/?nwIF .ݩB}r_nmV~͓FYԢ6~mjEfKx,4nv~mXUrG~qٚ8r D9{KdmQzTqze?8u*bmm6BNxuW +镹(Wk+c_ԍXs+J U .~lJ7Qn1uˎ4 3ʩ+.SsRSO ^{īu]Wwܟ!F9uem?ʦKe4I=`Q0z7qR>G=w9O4Ty/K܆U(gM}`j[?:SAG|H}'5g2(X_3sFKxB(6G9mUþ'+_Ww!;|ќT?\<|ONDeEk/y:wp ~>=>NuIMsDӧ#Y_~K޿ k6~grk*|'y(3lk9Æ4c{XwG5J,/]wA;qEȷItLn> Ծs)pvV%~D9o|u6FN+̼~ո 7[~m݂hҧ=Aٴ¨vHܾ֨s_S\PTgITσAmɻ?]6 ~3 \ZaT7ErT7nnOM˕.ޒG*ު知*;V f;TڻB::4 h ¨ZfV`fX4ײ~8lz|gb ?Ȯ㡃l7'ڿƍRm~vߘ]ƍf~֫g>uσ(+W7?vO,wQ-Ĩָѣ_|/ Gַ2Xc}!Rͺ0'+3l>?܍ U QMP=Z}j}غIe%QA0'AgN(GQPWP[A5N(Ϝ(Q UBoi8?sD9*rԽ*<@gN(GQ淴5΁(Ϝ(Q BoI_YQ֟9QD9HχߒVuDYDrT %MuDYDrT@ 5R̉ ʁc.Z@gN(GQԿB p =kQ֟9QD9PsB-p jQ֟9QD9X+bg<?sD9*r 5^yDYDrT`jkyDYDrT`54jQ֟9QD9`BjQ֟9QD9`J?%lbj6AuJ]>ZG:_ddF#wuW=bUvS꣐[U Ҏ=zm 1ʗ-D'Bk>4wOXM^GS8<&wID Z9u иfM>K, .[9&z {i#[/V=A[TOb擕kA'37`zfGzT PAճغM^3SZ6^ h=ʿ$@l ]ŧ&ZCG?zO5ɽ#R7]KNj.WO>W=xK~'zO2/ |f%y3>Q=^]z9.CdP&=!@tyʣ(qh)G F B2DQ!!D"(@e B B2DQ!!D"(@e B B2DQ!!D"(@e B B2DQ!!D"(@e B:ڴi͂.cHD4uU쇺>z-3~V=2BS^½7b~z#Q})wH$Gy;^{=١z QK9-rU=fKhY]36\"y^lqՃF1^lXAEukIaUB8ayTuW\=@O7Ia'ހ ICk#z>4(wd$&x"gGaYR7YUP=/IH_DXfK2h`,T V囻d!zOQ=;:IB .iS=?I@p!}i 6Y~o#mhd!~zt{?|X{ ͣ<6& >U/4A4YSUa5Y?zu?ZŐg @:Ge|xMbN0,ĥ @GyVpk3G9W?}|[MW`Q[ViU=kqmBzN(SE.P=o1kUd!W=o1i_BEܤzM(ȆU@a^zF*zOskzFyglzbM(9|^hT8Lճg:Fu笤zL(ߧy/?1;Hq 4rG?)[YcF5%Rpч<^q'N#̾YWNa/Tb[U>̳mkw;]lHsFNg\0xCQgu1Ҷbbs!zz|(f> _Hջ ĝy(ʻ:Y{I1j>&pO(+};_gGD(2£_Ta{UgQeG("vgśMv6"Ml[V$u{F*2lGcNm5Q~$.(;)J0b߭vBxgv'ٶ(O˻d1Ǻx|X$nBЇvQ^_zwxF]M-7('YQ{7/3}Qr#QN(qy+e(7#A@%H(fQr#QN8+] DY"ʍD9ruy+e(7#A8@%H((Qr#QNְ(DrH9ǸDr V Qn$ Gp[(KD('Q.o!8xE6(9YlVQWs٢(2Q"T 4*B DQ̢9^}Ek10;{:x×qO$QN W⼵T@T8ǎ@Q~NA-8.trH-Y_ęQN"9n? ,*bGճgZF9O`gskzF*r5=xY=6W=ugSW3oFy" 1SěQN]"BܢzbN(/+75ʩ UDVճwFm𛼩I=mzT=goS ;ǫ18se18ʩÍ @:Gk0|ЁQN|xM׬ztuS}f+-aEv3ͣaUO&4rj:a4yŪ @G97yg @G9Рw@G9f`<3D95u < $D95cg@'rjv`o[+sdD9͸`Ϫg@/ rj 3'௤D9vBIvnYMbJMoyA'AQN}M8O|h(IQN_Iy. QQN&oS¢##V= JZSeI%yQNٽ$XJ޷$7Z2J}zH/IoTT6qup~ۛTOtYQ_HDG9v_-KT@B$=i_e^m.W{(g{΅bg-V=. C wœG yDG% @=,ee(P(KDzDY"#QQ2DG% @=,ee(P(KDzDY"#QQ2DG% @=,ee(P(KDzDY"#QQ2DG% @=,ee(P(KDzDY"#QQ2D㺋~\sCSlT= 9D?{[P_+M8GU=8 (/|jS=H@wDYJv眳QJAΪ{[ h(K r?SYc/F}e)Q΋l6գ4EdF]9c:%,%1ʝw)Ɇe/oV=|@CDYJ`Ys C.mW=@;DYJ\?ڲ$ƾzn(7ڳ& Qw'(KɊc+dàTO QI>%ٰOh(K 'd!E}e)9QM](KIr.rzZ&(7@lj=_e)QI MbUO Qod!zr(B`MTOQϗ BzA#ʒQW)G%p݀,TO;,ŵQ߫&sDY<]{d!Zz@eI(_JGDx#ʒQ~G8MFSb(KZG)rZTO3,`NxQڪV#ʒQ$gqX(KG^8q(KGypZ,ܪz@leI(?N-R=e m-N-zvk#,i ' Qt򧡽mb(KFp*\`Sb(KFT'6z@<eI(["{]ԁX"ʒQ>9D%-: Pke '%>,ioITO#,q$eb(K:Fp[aQtԷp(KFp[;,iioYǨ@eI(N{zTBnqɾyo/3{[~N&aGS.=0Ӻ/v\u59 ʒ~Q7wL P1úV79ɑ`//E1jFLeI(_Jx+9X.fػ1@Fb^_8u/ل(D%[8 o#GACB%<&VP|MhhLnOF,ʿ8Df]ە:ǣ{8#:¶xDy/slxӶx<$z,i](^ǣ)m5QvmG+ʎ'qf]usv'q{"Q~$xg9~DY"vt8ݭhǻ'1ˏKSceW9;Qbe(G;D9(e+  qrQ&VD>x_:h(KD9͋4-ninZvX6RҴȶ#UְyؗBҍBuxnm-MxE ֢?,Ep[nUvsj VQh[\l(,{!阷!ʝ+![׾\Q8nE^g[k"E,ceSs:3).1+Q:E2\EhFa2VSr岈] Vj`֣Ej'!ʙ7WOq^(AG+8oK0W^y5D,,ip[ɫ!(%0ڹr6޶X>!Uaъ"բ\ QdV`5D,,ip[|92G+8r8Lqm,=6ate\ QdV66岈_ ' 7QhE*QP̕Q6TSa;TÊG+DW岈_/1E(wf_XD5IۣNX&k(brg UFQjrYDY/ʯS ~ܵŅ3g @fO2(j]MD,(A%1z`(/Kjeڪ}-{65-(rWUDY0ʗ޲W!ʒQN{˺](KF95*g(K:FP[ήQt'Է@,ԯoIK=CDY2ʁQG<GDY2? 'z@eI( '% ,ND%=-ץz@,eI(Nܥz@<eI(|N(KFp*\&b(KFYQg Q} E˪' QrpJlq)E%}ܾF8)z@leI(^ '9׫0_DY8ʩ#Éq&(K:Ge|896-1F%(W`=z@eI(i'*kDY;ʩIؐjA%ܼͣf(MF%ͣRMi1G%ݣdhMnIqG%z_MO#ʒQN=+(N>fDYJ@S0u,%!ʩ,%"ʩ#jro(KɈrUi@Nk(K rjF4yh(KIrxO|ՓtAD92$R}e)AQN}!yk5,%)ʩzUO QT-|iTO QT_vճ4CE9ϵè۝OFE9%<'S=|@CDYJbSyx;g?V=t@KDYJfSH}z؀(|wQBG9Z}o뒁e)QNk*~nR=L@sDYJz ϞzKϪ$Qrwx)oGkK QQ2DG% @=,ee(P(KDzDY"#QQ2DG% @=,ee(P(KDzDY"#QQ2DG% @=,ee(P(KDzDY"#QQ2DG% @=,ee(P(KDzDY"#QQrV;sMxWp]tmzP@Re(R~ԖÐM#(KIOj[,[R=L@sDYJt_q}"g~ޗ (KɍrT[2-,%5ߞ0E3}4EdF#Q#D*Q~PEt7'yD([%8M|'1vm\e\(;ZlhQ'2EQkEΠ(od割(ZvS-viDkٶM?nmQRۭd[|C4i s;!V]{ߡa7^u'O!&]l}qkKS͓Mr]nn81bSuW_u q>`2V ] >YW_QKff5}G3Dի6rϻ:Z% 2il^pA#c9E VxdũDrXܲHNVϭ9?ȯ)Z(iSTTu=(wuv-nmnZTT•ՙM٭9rWsh+(w/.Z(w)D,'UTyo^T*X>E9{xB}rUra0غ7](-s !ee}}(hEZ=NO !ee"6١=ZQa]IekDT:eV)')e!ee6UH('{:'?UO QN[gHgw7PSGNQ=@+D9:C{Ҥz"^rr}OMՓtC칍kJ*wlm9kݩz􀆈rҽc$o0K-eVQQBN!yD(Te9{(e Q>Q#D&[}G2LD9W9D9(ersrQ&0 'yD(DpýO2Q {(eULG|G22.U0p -(ʬ&1jx[OWa|֟.c[kK%S@I(z6GMm;mMjK(#z%Uէ([O8Tc3jQN?-m0oE%<m"]jJL#(#Rd!-Sъ"ܙ}Z6xr.ŮX!ezl傣EDXE#[u5Dt$ qn~4%Vqe'qeqI[+J=6rE*FA*F|h5Dt$g_WhEQ'UC\ǦRQvT:ʕ2P:j^ HT'Y9UV)OTS&٣~otGъ"Q6swۘ q5D_uWtjϝgq~6yTkZ=2ҟ$6]L@MMK^Цzɻ|zG֫%ɛOS=~ӛzM/;h<n7T4i+Kj~zCA2֮:]H !~~pҸ/^_[z0{ OT=2H @e B B2DQ!!D"(@e B B2DQ!!D"(@e B B2DQ!!D"(@e B B2DQ!!D"(@>xuC_{U<̌Yߨ$"i]O_/U's}M$ Qݖ. KNcɎV!9jHGsꟖtP۪z Qe9caU=hKh٣eMQ=pKdglȦR=z:K`gl9Ɇq%.?\WSӶD$h+aQ-"^:WbF>$0g"IQOMN;zQ%9mm,_r6Y~$&ʗx"paYByINdDu@,ߩ$"ʿLBJ9wd!NP=]:85u3TO4>6Y;U@BnW26m =W=im/ BzbO(]RA^S=mqkBzN( zbN(]EP=q1g TQUO@ T 0D(w ScS' ִ*ru5-3^ĚQ^缫zL(ߢ y|\-UX֡zbL(_ySU1aRQbT1aVQbuUj^>#PO+g:r~α:g[-G,j1 Y4J*JlQ?_#؟Ŷs:-mjvs2H<ϑoR *kb϶į,,Fy|({YfbAѪwAe($9@gE)?XU^X(!r3ǛHъ'_ uxρΊ|˜x;CE pOcȻn<*S#哝,:QFDQ|G22r$yD(#(ÝO2QFQS*Q#DD9O L2QFQ«v>Q#Dg^rrQ&?;v>Q#D§v>Q#DD9|G22rZbC0(C|*nziQ2GsbQvD)w a iV5IvuڶvՕl_vqF[jt9Q@;mXcܸeEAudWgG۟ӛ7nh-9;;_7^bsm|̾ ;g[M3/%:wXKz#\f}'p'_9Q-;;Z[-\`;?-nmnmnOXܼ\loqw/n^ ׋gW֚1 f;q AޝQ 39p% (Y]tc`rXC%r A90n " "$@BX1+˄$stvuL]GWSw};p#6WD9HcQΥ*>?TTQ.I?ʹwu/[(OSD.8;$*\uW+>l %فW ))n~OQ.ﱷ(gz;e ޢ[Je.K$*\5UDQֺ=ᤩ(g]!:EKVTqe&CU@ NCႺ(p[Q_oOxcQΧG9?F? PsQO-D.D˽?w+xrf.Nu }@(g8^k߭ uo2\E(O90(}Q>D"e6<+u!`_PeUG݊*t*l{< Q <[ewpQz.B;KqQI4ʞ~G9cvGi2\L{4A/-[[3^]fEe/./v17Ofoˋ/Q8ʗK @Q=&4OslaǼ$=. 4GzzdtQ'=,TGٚYOlQ?(1&2`(4y|1h=֒7CPC}Ž#C;CKH l,*Cz<!]!eP%Ql_ ң%QJ[ 2)<"dXIK#}WH@Dٲ~}JO@Ez&['=ek!oJ@TEٲ=$o} JYksI@EٲV;&O^*=eZzlo;@eZ~ϏTK[:lYo"DzKk-FxI7^2w4ewΫҋ rΪO!㎾eHGN=h\o缐^!V?u뷾:)vfǽ&f*EH 1B F2Q!#Db(@e 1B F2Q!#Db(@e 1B F2Q!#Db(@e 1B F2Q!#Db(@e 1By?L=+; ߑ^!ʖ5M_9mt]zy$Q<{6㢑}eHTG7kAcSzR!Q^zV\)fW @F<`/lڥ3k1g%t1]+ɶQ.^>压FND^ 4m*ɶ3S*eQ~mjIMZ,=R7w碨0)+dnKQg/gMP(5QVKMΙNz(%LIeh(lL:r/NmGK*hl̨H@4DBk1-?&)cBlr/(/4&J@Q~}lCPC{%& cBylP4٘'(QXzT:Ga 3)&3@sώ|6+=/GyQoϥ(gyaZzdɧ7?̐@Dgxj|bM6f_$Q~F.=6/I4CeQe$lpJ<]9{K tFyp"$=:dS$zwMe״J`Meo񀳥h*Aŗb3U8I_eI[d|{0O^mIf^CN4Y|*̵~N1sw MEj9Nz 1ǭ ф(:ljQgh3 EyDl#NUeDM_pWQxɈrSކ||g,sEE"^V4Ɉ>^|xEy'CRe^C+׫f fbU63ːc͜ecvp3DkZ%*\ۮW;-FSy9d(d&Q G~\D2lUQFrD(e؈r6wD(e؈rF~\D2lD9 =n(e Qn(e Q O2Q(a'ED(vtTz"LatTzy rQ&ʰB_*~/\D2lSn(e QjO2Q(O3ߑUQ5mTۮ*ӽ\uת(gMbUQ>ae0"ZXz۲UNzZŠ?a׸ځVD9\oKf?sgf.~nz՗9|n/17>lnW<~fw cfu_t]ט3=-b^pi\bO[zpSƇ]ĠQ|}=p|;;6hF8,Rپzwj/1]L}ƬxxA6gEE!Gt W8ao`L_OwWGu:)bN`QΔZ!p(Q ]]V%rDgG2lN rǞrڎZ[!ʹǵ{Ei2xTTau{‰({HqQ(qspNWͤ_Ea%=#p.ʽ#$2\eVTe'xՍlw+8DO3(< Q3uQvpak+uQv{‰(<oܸyur']A(?n(Ù()2;Xw+~:D 'T*yU9l|Ju ^Fk=(Ù(ϕp/| WF=:b8$Y5-rg<e8$:\+=|m]w\~4]5w{ѯMsm5s\A\fOU4} 2鋲e8Q$Jl|{f@W;lg}.M*bOa?L ` B% 0>)k1ʲ/;Mz|I1B$([S%b<`Le#Qߑ@r9.xEzx2,.=:dUHMg3$sNi)dc@)uDcH:Q^.$-=6e\&Azh6붎ɭF@FY.@鍲]Oq6*(+=0Gٺ"&-=. 4G9{hMi4em"kra:QE'ңAw#j27CyGD= ʣluMWJ @ QzxYzHjrbMi?߶#")V!6y4] @ibКP%QtHME蒎([?Jw}Cz0ʤ$Vi!4MZlY($4#=ueVH@E<5&84JS-뮠`yYY([g.=RezeJ]-JHO@FeWIuYlY~W'^:æ+jڥ6ʖ!;_BzR Qy[jqSRC?ǰFAxmoI/@j>ʶwx)lV&ٝI/@!?[[8 /;<>= 1B F2Q!#Db(@e 1B F2Q!#Db(@e 1B F2Q!#Db(@e 1B F2Q!#Db(@e\)_z ҋ(/ͥ~ߏm3v1c>>u-O^!Vٶrlq7(<6QuG(YTzX*hFK @QaيWQ`Io9aW[yA9W4w9 D_]ؿUsMræ~_6i"K_gIt祷 Qv A.3Vz e ʈ(p pѳeWMFېWv(/\kZj WxjOhE{]5Q됷(ov^uQ~rnpi;L,j2f{rW3xE٘ ; }QUuifoy'4ʞrx\̣a'eTGyiɶD+|"La2'ED(FCzrQ&ʰ~\D2lD9 n(e Q;n(e Q+n(e QO2Qv~'ED(tTZvrQ&t4z"L7S:`vrQ&ț/0:{Q."Dy~?u ˸ifPa^nDe:lêNrձUQgMb(6 l醩뽿0l`؟-[Wa-ǫ/x]u04^vs{ܯ\@GCmۺlS= gGBϾZ}ڧiN rvwuu~ޏGl>`,tuWˎάyV}GrpAofUa1[-{J .rg<ձn^}@c;3BeNq⪫UntyӘ.#Jj/Nk*3X?%3x^EӼhZ}H.rW0Qtwv(q(QJq t+k(NY}Z ]-k V Q/hfoG\c9uwVks:=^OS{)DtsZUc<e5rnSsXq(ۧ* C8(#\{x$݊*\=ή\S?G5WGywYnbН@l 8Y3R6OHo4&b.(ϖ{(@H?;PzxQQzxbMFzxĢ|?5m Et :Ɖ4y  Ic@</Q˥M J upM.=3ֲQG#@͊ɇJ q־mMnY>h(@}7&!=,]泑5y"NVE'$#n+_+=($#iI|5raM>OzJHSCo3@bO { pkJM~(SCl4;1&Zz8Hy!5y*Wy-<*f|zuRMH`g!=$[0F^'= $cjˤG %$Uz PLrfiHK}I>}@/GG}UNog߷לw ynܷ-dg}jC+txI nd:ҽW|y͇x3뤗Y_?|COWa# endstream endobj 135 0 obj 32503 endobj 130 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 131 0 obj <> endobj 137 0 obj <> stream xZK7s`*wv`B&$v~ =J9CKcߺ;&p?~GO]S޷g׼޼yl҇Nٛ0~4/ FxZsdG~\o( BPQЮ^1gӥ]] GOR~!7!qj nڏ},0Bn `<+)jq2AYr^+LO.]Vb2)'ȏz+e??7掘y?ȚGLgg%߁EnA"@T\~2/K]sP| M%SwC1ʴدkLKl亁Hg_J׃\O2mPh(Z4s|#߯2ݰXvHq k)O DOVNx%UEjX]v6\l'͗К͛ׯ< endstream endobj 138 0 obj 2189 endobj 139 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 140 0 obj <> endobj 142 0 obj <> stream xXˊF+jB`@1dK20t9nI*u!v[R9Jm2_v5B65/~qwBģdCtqOɲ={|;`/6:q~w׼Eߊomp.z=>zbr ^8(8 D4c$MٖrHj%Ȉ2ۑ:d`xp9]XZ7b!=[x*uX%Lq3S2$Yz,l퉜HZ+.Fs IC#jh頶˳C^74\?Z8_5Qapmǘ|H A Z 9nl)a)N؁y::ڀf@;)#l֛`:V[y.a# &WN(ţ4n pBV)4Azc\)|_ :9Q;ʓߘ]V@EM msz`̹I;Jq^wQeŋO1k>h!iPc > /Length 8 /Filter/FlateDecode >> stream x endstream endobj 145 0 obj <> endobj 147 0 obj <> stream xZˎFWh=}]%vdq' dnAf,XI%wfFw[R=X$yHYo|?)9}Nӗ^_~?_~zy}EgaO=iEՄs_TXń/J/'{Qv}_E/)\v^&,繓 uj9)^tM%~v1W@YN }^0~Э+-C ; $+7QGXձy z{ C>9t ,5 ȭTi#\.4FȣbE"FYW#pq!]?8cjI,0&. BH{ Pڷ [15m0#KY |l4Ι#~_Q7DC/2۽yyH%ʼQF[!Z--6Th't"N}M2p%)8P" kx 9pyy\? 1Zr)6$:Q4;8Sk{Unf"U %L;vF8ؕhT%C] %ZdU˗Ld㢞{ی3xfo5\@c bA٦b|bgyCYحp_֟N- crx3]ٲ+j(5>L(i8c#,h=UY(Pa߁ȎD%[9N]]R +?`DftZN$h%g!<@ ==(٧y(fϟu-ḎVbEG]*>r鶜HWeGCfeXu4ۏk ]ϱ䁴V Xb8 y$؊%߾R] aL~niCb+ʳ2m~8|XWgxăTh/ -簫ݿʎߧO__/FW endstream endobj 148 0 obj 2715 endobj 149 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 150 0 obj <> endobj 152 0 obj <> stream xZK6ϯ0IGm 33@i.tk}t˶䙴$ײ%w>]uݷ×Nu r;n4t_;C?_?UtvoӦ{Y jAd:Y S/~ur嶽lkL3zԧ&(mڻ3r'ǂ Er5E9_=~iƇgO5M&b&5E͌=q8t|S^^}oD+DY: vsj/En)_}_Z#H@  Y`V5CAeP6-02GFi.^W})-=fiD$Ф,L&O_~fu%XvIӯQ|e\C$ħ u `-rF`Bq>UF/<ۤZXOfvꮴ)@C{QB-Њ9ov O}EPS]TT=UﴦT=*} !bXaHKLbȄlw/ V6S"PmȀ*[ۻY`^Ӑg$I9H, pU1 pqLʔ`V £گ-G(-tF;c`: 5}hf@஭`w!i _F.|3γ,9-X=B-KMW->5"b"$F_=2#x#z%ahX̾Blr~T͉7o<47FOH[ ;u=צDM A؋bʈF844"GjL;5 P ^Uw"sb8<l#Z绡5ӌ vS٘˶hrJtHxc!fď0A".Ku"rmEvn`uyghn,ηdT՚q9L:q\<,-܀^q͕#p/Uoe*dA8\‘]$ %̱q -Nqxf',&}|pX*|B$lKCrKFFLD~.EQ.>*VXWʽc,j Vʡr`X0BI<㖑Z6i[e=A>8d49DDb?M ̠|ਨ\(d ^YDP?P&6.5Ƃ^dME*3V˂ă^ >HTb$^Y]dzfyC[3ȴg(; lX|IK/8gLO8bVM,VbԬĞ2i8CS 3%F+G#Hp8vςw\P~)ڔɌCbpvC$H1'^fl,1m3I'E 1FkUdp_l?pvˣǃ-to@A b6qI4Dg3M&@f{_N)jQ+p8|4GPTa1(Ț4ٻ}k7&"@zs7@bM71ϣ%OcQu33mAoR(RtuSIe]މ^nXBµ v@11{IIO*S#ia[>E~~kcZrFy .aw%v䲰C)ވ"㢾Z-u͔ E`3BLm KQ3;@Ӛ@8 KLqObEp0 $-bO7E5.e)#6%5tѽ_"EɄoGҔ.fQ?>ݗ\Wlw/z endstream endobj 153 0 obj 2244 endobj 154 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 155 0 obj <> endobj 157 0 obj <> stream xZKϯ9@ϲMO9l<@ܒ0^S$R7LH"ŪF=ӯ{hy~gǧ'Q> E㷆iQ' TNE|I.bӰRUNV44i}5gfgazqՑ?! |LF*So V?_5'UtP#@ˠ_ؕ$%U`Xo/#kk굳6eYhYBV⏵]"o=ЄdFL :S~ ey [Ar1)r)dk=!»1kPN[ގE}D,D F7=޼U~ (zn徒/tYwH!gwxcW؀Rc(b kYmjUmY8 R]8@ˆ|AxOh+- ^aזMqEō&\,0zbXjq(2gdxƢ4ٗYY_XXi1 y "q>,:\nXHWM!+BhtGmZ7LzJ(mSMq,j[BN6FuZRntFY%#(7uwzM 6ӎ:/m1p7,uv6[6AJ=WLTS-.MUu`F>PFlY&dMVNҟ(5r~R>鹾kp3G9`KpH*,q%9 sm9ZNCxI,^)i]jWhBmGzTw<]?X MXNrs\u*ݪa#dr,wF+uP JC&8>jjSШlrbUp噇'&4 &wjaYV!lq(ZcEύr\M, *@;Dי/m5JO8l$UM&` Fn 8,nc$Q:-UNyL7#,$K\uޙqH9Ē$A֢GK'f-*,u2Dț9QiŹ_7.=l,c3Icܳ-rI1.7e(̫*'R"TUvL5kW+‹}\:hzHe ˄%vi.ɉԈWuM" `?6uh`9"|"\pۣ9QyGkhk0芃{PNE:{\˦߿Z64}P̼3֕aUSAt0U,i/iEb{卶p]+wA ]~*awA'ήvz=dv$T /{?s>(P5[Q55^B]zgMjX'n_/g9r!)muzy%/ߟJ;: ?ïçw?`~m\^>?w+ endstream endobj 158 0 obj 2446 endobj 159 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 160 0 obj <> endobj 162 0 obj <> stream xZI94Ԕڀ&n $,࿟HUm z%U{K:׷_5(Ol9㟆378>>|׋5Ww^oUijm.\x=zW3~^E5K|:u>Oń-`~I2Ȗ/v2 9~~MTp08zmd!:^LAMԻvV?줝V)|ʪ`cK1)[h->{=!,P#[$BP(PdC28z݃-d硍ۼ.IXEJkP5x`ɓ!} 0}aG~f=D},\ӟ] ^s!i>qҖȨ2DbN9׉䂰?֖HSs"2˲jw= +UwEBokEfVED&ҙ״+-Uѡfo{F tK22gݢLkYv55 Hs]OQ IiBt,f?̈AW DDL.{98O~Ggc2!{|q}@vra0( 'ttYubeH`[\)dB%:X9T߲ 27 b |)RQ hAjE "I :8QI{Q| -.J\r A(.gͨ4@[sDv wZp.@2pNKשKh ,9Fw3 ޯ#?iWd7=У8A`vwP Xu}[lBR6G9(a'̄ݹKA(pVbZ\>85NWekv~fܦO".XȻ@ْZʑ*uC+EKys/ 2ܝ LSnBűȬ5n $g%k&o8VBOAV '`!jXպ~kzHbN]M7aQcD˾40҉(OEY(ߊ✒'Tso~7p`e!H?d'$hlXEDVN>:.{&ΰs(,Ul89H{5\~dS(PTF8%vFUYG6j8A%$Z;s;#,wkk|[gí8:m-o= $ &U%&m4cR%iFg./ӄdcwIryĺnA] M&txmzA#:3Sk΅:~<Ж5HS1,m[|ugwQnInË.V邰b4BXc5+ҧ2[=Ď{at&2wL ƴV;2gr=>tkp6*O0_~AFqn(7Oz:2|y|~×o: | endstream endobj 163 0 obj 2473 endobj 164 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 165 0 obj <> endobj 167 0 obj <> stream xYIF9`q&$;J*-%8aFR"ύhe&y ͗Ojo~>yo.ּzTVt.] ċpoβ;VN֙Vl[Ze᭎ݯ7[F+g>}@{hqçg'M+7W2W_Y)?k\;C~z1(AyRAB=|@6Q=CZBj!M9EmE,kryuQ]ڪ 51^lŪaܯ~Nc0}!cMՀVU*Էe-p[VV*;m+px  O0p(2 b7(;ŻrlB]\9.g#D[&TjȋYzAY+$>.`)0! ֯kv#Hzh=- _;T*KYD_aR"ȭ[K.= HmDiųN{MGa'^(ITTLT c"OPWSm_HgEצ.*-?@T,Gx23M2bE+@l UxDX\vD{kz!\Z,QTڰ۽_QA ucظ 6+AR|T%>j{ZO xb](jB"1 H9Q0MjbB"JX(B2~b)1Eɛ7nI/6_?#> endstream endobj 168 0 obj 1747 endobj 169 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 170 0 obj <> endobj 172 0 obj <> stream xZI$ȳjbHH ktm-4:-fFdUw 3Lwgf,o{(_~$/;ۣ0}2o?X7G=srTۿOo?^&8\0"/ZnQ%O=}o9t),FI1uҋҼ.Ѯvt0R2P`V.ɳaAE\^Y$gz:?đIt:PCե,u%.!ޔǹ&)3*PSf02k+ya@l,YKsC[%(z>wpBp*Q6%{x pz%N+cb9d{EM_XimQjFbdC ;h#sv0 C\[s{i}RKbU 8'hjdqDlft"TO$D 彅R<+JтؐA !V0$:? S#sLHq˜(K`4rԐ+vkyA 0ع R+t>HcY2;0%ǬfdFwu,g127bԴb$x{\QRl^'q3,4Yn*ЍP%#&k3vG:3}Õf0㜿|U!x4 c֊Q\paݬBL1$ *bRp<1>A5~ 8^q9^C,gП6&vtq$, rbD|&N.1l b܂[3PXL*Ttd@"L!1 SEJgzpq |F R=Y/dz؁ZRs @2P%A5yyHѦ8Oq 7ImÎc@a}aӫ*و¥3./dF`ъFڐH#hFA7 (PAWRv_]J{o}N'D Н#D$I@k(lhldUu#}kA'3C~mXLO%f1Ҡ$ 4#eXFI0_6:XEePPc;V^Vc>~T{ץr6&(YAzCll%s)L][6`es;'d =K'6{'̥5<3Tm8 v].mV%R-HE̪Vj,(('2zےxO>V F E[')@rx6O1hC0@`0lS&uϘ|ub2la5P5B9-%A%y4B? LveH2@u)7*L\n?꾘:pN@ >F@X%_{Đ "r?%&}؊Ԑe%W4L-",_. GxjMi5[Vl)0Xy\8zP nQnwuz\XvMe&c#|NJSl:v9};c,UʧUUp*i(EFӊG]h?,"R >~%g5ޥy sߋ#4L\RȲ߄vFBAlL.:)*J ?h ! wZ{nsgE-2 @JV;څ "}vvP^UՋi%-^aN{e|P}.y0B:a]oW] C9ya}\ % `pӞ[69MRPFK#V(v[6@ӮE/ƞ mT}3co6;_Vq Uxv3,hݷvn6-}mkA=oXaTÚUMj٬}Mo0^nl|OAۿ ;Q.1!5jpZ Lj!)_ssI10WGh;m(^Q7{X3ShlxOL"{< QSq潊ߜBb+u[QrsOfft9o";Bu(VN*BTpkdz-;<dOBB.??ӏ0ݏߦ/oߤ7ڹ> endstream endobj 173 0 obj 2801 endobj 174 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 175 0 obj <> endobj 177 0 obj <> stream xYKoFW\@>H@Eom} !3$EEr米<>ܘ;h/>(QB6]D޷pf &V<ÅHhy C0=!\l sQdɟ(YsηѸ,X?=/|GBO5Axtyc>n*hm%ٸgx@1'~ _0A4q 8xqܭ5q`Mzr 5xXh`_{PW {Fb+ bx Y;Dhšzv5>WL91DǬ,}WՃJF/Bl7OLvn0c{p?އ6Y'о`^Wիzh+5G{ -.Y{sgI}Oƌw4Z&[L.!oq}*nz\N5zI*8yprb 8D$KK [{Z uˠ%k Z8z"T+ܲX5g$[s}ZU`Zjǹ@aI8ۓ[ y[)Mk $).H<1A ߷0tJ_o}I\T Օ&j^HU,+D(w #Մj=!, U}"$ #δ]&ʜ!?)zn60Zהm51ma7Y P\}*cMۧ5'H7M$ЉEǪq}Y%-h9kq_m~5O _Q$'rYꗷ+Sϲ]Qo==5ؚ5_ Ϳ0= endstream endobj 178 0 obj 1525 endobj 179 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 180 0 obj <> endobj 182 0 obj <> stream xZI9@Ր a|rKbHbx|[HHIS]o*xSo.+t׾ϗW_^?^K!ث>}zם}kPvyE5,I!fPZbPnx>M}m] ש7xmD)3 +fԃF=}AGk .{\&7ʗx j~%20Jf[$|Wwږ+5Y lh4dAQ$[O?1* ]ݍFqMR2xX銺0yh8,&4Kx X($=-_P}u$5MHخ@#]}rcdUd7~8`[dQ2P1/v- ]qO jL L 5꫐7;ھnPS.k-Dm;C7rӆC5!lTJvLx@16܉$iKz1Q2h\ ct[,EU9hZ,xDq 4 ڦQwڛ`~r?A֙UkR4ܕ,]&ɷLu^v9 bmYd2tj,7Y<5p2 ;iƔtBErÐckʢkLABG?jOQlUY;=^w0$ 9New[H)3W7?*+AK!ĕ!b[:M'Eub0T!Ak=)09^ܔQ'K7:p3%V GQEXBVS9zz^SS%kYZ<;AHME[mta%J 9dE"6ҊZJ1Uh>5jLO);휅YkW c(h,Y PUegvչN'`j &2?(OV0%[d@dܸ $oʷ\Z|UdUg|eu/NNvXN>P|nS01aiS~hO I΂"oTT 0m"kTtkLoQV:jskm'-HOr']GR)zE+gQ&ݞM$߲7ۛ@p[ RJijptT/ jÉa9hIs@@ou%Ev@@̘R[cAQEhC[qkih )Z)~ZdjHɀ{f[/}R'G7OH|-.V7ul ni=E=Մ*K74uc6FXTj hi9sbl<ڪ2;W=Eabzu/Veof _w6wV)6֛jǩL%~QeS踃t>uteaU} nJ0sRh,׳/}.`)Wc^7N;cG*.mvRv_5M&K0(mj&Sz3m 9w0]|ꕽ|%LsJƃASӬpsȜzw;O'|o)Yh"!.6E]:e*҉L|T&,>]=+'|gZEUg0҇%q AL*=FVoϴa '޴6m? u-'@7ׂOcoRSi)_RÉPA}?<~VoϨy"AKЙ9DXn\A1X)D,3}S p8rMm8i{aAUS'duOȞ{ϾU{5~\>E-.*:yZvz'-ES[(.SXԊVX(WK^ImO/s[ݏwϿw>vov_ɀk) endstream endobj 183 0 obj 2106 endobj 184 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 185 0 obj <> endobj 187 0 obj <> stream xZIo6ׯ9|**@9sK& A:((a-[) _?3!9xNOnϿ'Uןw;]NOdݘ0q`z;gs73߀[^3 m&O2>-~gH{1LM ٯt"͎$?S8 <KR`R!<%B^x$;GcY6x1I6Z 7zȺ!Eu]ki]yY6(T6h=N)5DhX蛈WE۱,>-=!+6"2 @ L͍0I0h]_%gyofB\B`v ɒ16mӝ8#+}aiʢ\d6> )XeX(;rkfDw&?2h&%XRNRaʪV5udl*Xn*Lx g#$1"(^WBj !blg{;gdف,Cl( 4pA EP.9+``\ D ȏT!MOİ[]R,")u'C &qbCپmLZD6#7*V۝!gז6*J}Chwl?zqUɌ9E|r?diwOtvGa$0hu;ɮ`2}I50sGVos;?jStJ*BqޓO*")1XnlDo5] =Qlj1"+sЇn׮uzvn3ae,?RfSuzMϷl^HM1bvmIo)$ ۓd5=a E Ifb*=~']M&O;=> Wќȶ[]cXx/XjSKqB" Dx(d0cke.=?{;N6ֱ咲1t'k3*#EX5Bpx Z#^z{rRW澂2H!#*VhyVl<]6V{i>VRکo/jBi]sac/:.@Uܙ *ٗ2EC@zxICNlOa @K_{X#}09Aգ@|qu5=glU!hO0n:(~‘ (p;%s>NfcSRD|f[L $m>?_g]WnE$:I3imOT]2C!"ptl uy$9M~!;n2c8]d!qpoݺ[F;0t^%ʙikf#tiΛ2w4 P҇ fs߮\1^Q%2N*UKig?o{i-RID#CN۠==#-fv;{kjk*۱[nd;LĻ Q%{*f'*+T,Gn4df_ o,e7ezf|z".y$Idl#]ڷ%=٤orW2 . 5&rLq^a!}???"E[UUBh֦z*-N {9427],!Ne_U]~] O YϽ(-[עj]T&D>>ezE{,$3)1ww`9sNcLGi7|:m*)t:EjjCT@("%ΐĊF"a?0WmKKc>?Ю  K ԁ/xmwdӭL‰6#Bs;\JWnGe'{#,xߡwt#k(WPnL%zG310C 5"J6rjI*56]c}0h<:sG?19ÚK;/~`q~6W^|#qcpG/^?COt endstream endobj 188 0 obj 2534 endobj 189 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 190 0 obj <> endobj 192 0 obj <> stream xZI6_s;$d?zH !)(X"g8Tuקσr0Z}/=_>>_?!{͋^? OzғQ9 /sMj<S ByO R&ESHd1RީtS١Q]zE$<$Ez#-+T8O_Me!1VD !f~ȟʬL!L% $]N~t}}zr1ݨp YY!9D?9CW6Kv+HE~ZYFX0eI^+is#sB3;0/-mf$A HӅ$jB+DW*שTG8 V,/C{99ƛW^ `7;Dcb e!m.jz z@hI7ɢڋMB @{eăJjf#M_*RChYC2ܾ ~dتѶa=fۡ˛sQ9/YwmάZiӾٯ]$i59Wa5K|\lBuۜnŒ$礥]rHiH!!&p@iǞ0~0hCf"O@|6#&->8)k+fRJN9~Tb*6%\ZL!\m!mh)~/O&9.Jy]q@S~0zEZ/Hg; 'R"1pq5} *6%@mKz,0y@`mu6*,s<ٌ6<@6xzDz/:VH1}0 {5ZqX臝UdɆ=oBn"Z|  ~SNrU7R>[4U%9b#[wqif*2.RB.uTS~% Kk S8M].Y,,Wdl;LCgƚUվ9ԗ]/JӍۍovosw7&JV!VzG3uXcGt t)oOx7)N;5uZ*Ӕܖ.Vt"!'7n݉Ĕ"ŪQ:^S۞,8/c]D7j0qoʴ - gZQ IqG}"t"p89_CdurT"g29I4\ΡRYa/SFc 8jz+fw+;-bDb4KI&ϘǦբg~A\512\+!S=@`Ҕ1đm osOa1>ɜ: Tf΅~.뺎$6wC΅Y@Q؞A޴nHC%[׃֊Ta=5[Z(Z\c_Q)\*5C~m\βfrsTC2'HxHZK:?VpmXfYv2^Wa&<~5 uMM}y31Dk). aݻYpFј[f\e7ƋDY7!7=qNx0̼e85>e;tw>}ӇAo!(cNi*LGݸVȷ[gl jJ ;`C:ۣExdup_9͡qPXS; Nr)&*]ϽBxP<ʓ껟ıj^P\}u<Cvh{+*WPueB[f|> z C'0OHn> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 195 0 obj <> endobj 197 0 obj <> stream xZK6W\' v=Y Eom} !3$%QIۻHX-r<>bݗͧNt;9;}u}95 7같=ipz0x0Z; X/p%N웫bɦnm\nfc:f\vq.xx=6\6H+9qknӐ6>@F|ne ; i?Dy2e'ֳs[&0u* u(nT $rXQ1 :"=L{^Oo;{ҔM؋n};/s(ɲtBGn&z=|" ^!/^y%EuiSp/eY5hS*I1+ 89qh9s#!{Mvb6d6l2ѫo{þ{fI̙s̀zLY;r،׻ՍoKff>_\d-Tf{#)'> [DJTel QA~e8Fw 1p -?۟ݒ=3O C>&l&~N hO_ Fl4H>޽#ݧ;)Dg{{j{ endstream endobj 198 0 obj 1917 endobj 199 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 200 0 obj <> endobj 202 0 obj <> stream xn-mﯘu;<v]1E]u~H4MQ\H")H3?O4SC鷿wa жLr %muyX't~.aeGs"3D;@M뚡oӷ@=No?8\| &(6e$ܯ' K`+ _dYay+e+$mb*"&g^<@2J)TMfhfE7X9RWr=&TeI ڰ!i c#A{r6~0r4~(gZ,q8 | z9rF>&YG@93$e[Ac@JzcAos* 2Hڢf`B>tDWE /4=Fd>Ќ*3hAJ҅uvQq7Ko$O .a* Kݨ0]AKVol׏W}-ϊxPK= @gN'j?_O ~%v [4?7!ȫ2&H6j\mToRE۬2 Б v곉/޴0'~err"T'y 祠VKw|1. ZBXad@bU@jOm @"}ZYρ}RW{]3;c'RPG\y1bj h4[QFXnTav++`Oͷb=q'b|FKR+BAQChB9R1 n7N>i=9Rق,&y Owz"D"24vCB8A(D2tύBQ !WSȴ$WZ᷉@t$eZ͋! gAj:3r{B" T&0gpvZT Ӷm*& I(Tqg;l:C!hyQ tm* !jqznB1P,N/0!Pbivhm):K!hy @:Xۊ LZN`y[@j"(Lq39|NXDD ƽTTEߠ& }ցH(DHw~ !55 Eiv C%dƦvhmQGS Z|^XBB!55 `mUDB+CHMBQzڶEdqz Z[ZA LH(f!m LZ^`)0 d@Qzڶch8BڳZ[TPȘt%8 I`Y&Ҡ"cEyQ "m=T &P1*(K@&%8R(4`ǪB$l~&:W.w.4=p]Ж4"X|w虱$j>InWu4Xzv,cp"m=lIn'7=3Hݰ-*Wo`d{R_yX3dTعfѝ7?`pȱnTl> Sal>۫Yc}?eqn5>M8ż}<p4Hq9 m@.ji j}w }H{p߮F؇=`!=nmw$clS0/ߏsX2i >jc%cA&5&'~HT&8HqJwE>RA&!$D'~L8hqYGFD1b>>uc ´Ŋ϶ƺvdgx#28";2wxTjwRr8ꎙÙYJSLN:ÙH"3Qv>f8D4yi1@OKKSL<~>,.,M}䲧C:H>Kc 6>A?>twEiƠL]x Fz!WafuG[h)4*{ q;(Ef\d(QMl3C!tL=_`]X8=,K{\nh[g[YƗzx^v[4pA=CW|]ƁK1-LXoxGz{8~v.bIOiy a8/X5n'||uWjxWn`|-<gЇw5s֊[8ݸ@7R~1G*э:XA?#X#¥Dk XbܨfTA7t*Hh~7k-:Jc"߆nᩅ/?*nJib gRt^9kj5]$H"k(`|9ھn3Ѹ bŊ8TUP4O!-3K6$~N*~,ZLڥ1gFiqDDȦѡu;muiAq09ŪoyH?̻ ?ڧz^ 'R9}3'aH,lkk1~NSS 0:*w͋ݨTq*^-5/_c~ͅHj)["9IհKJg)qT\1upZ*}g_Q_~:Ң`^8+~T䛿jn3}:\ˊp/rRMW50ExfNi3<v sK9̍, 1V5?eTh^a|"iW52iZu'i҂dE\x:sG7@N_0>^A@a,ݏ./}-yzp endstream endobj 203 0 obj 3806 endobj 204 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 205 0 obj <> endobj 207 0 obj <> stream xYI6W\9." d4ᡷ.Hz,$EɢAY~ }=|TEw]p ݗ_?~!ϗ{}ݛ~}>O h6 5]nPR}2NO^z5\< hڝnr$mh *4Tw|/_UN@ieOT&Eb1* ,D2td (C+z$R*`8JNlr[Lڏ/!Pdƍ\v8)wGϋ9$Rk?WFtdE>'__ܠ-g1%6}Tв;> M`H6+|*jRczQ1^ɧ= nZO^p0$PvAavvزyF"q'M/>N]!-\F<4ɐ1a.٘"Øe%6?)0^M %*qt2w j :ؕ*Z1nQ~u`],Wc֯{Uxثz 곢< J-i8AHVFRJ{=f2` R(%"*R'!y }$,8tۭۂyظVgGxܙ!<>|t+T b{}4/U9rM'R ׋ 3)k+`\\,E0>3|e[$+LS]tK 3 xh}q9 5Kf E܏[p[8x~( |EE`11so"|ŴsaܫdoYW~̥A?8C'{}\~Рuoh˟SX endstream endobj 208 0 obj 1824 endobj 209 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 210 0 obj <> endobj 212 0 obj <> stream xZI$ׯȳjbH(jfI ,~[lY{rx-ꢇO jPp'1Cto?_}q^×>~*;r6l.v<^js@piQ@(loVe`f{5=,V^zV=@ 泽2g ;Q7x}vWAhd'-=l.X)dVYv=22|$$BK0V1: Zl$|? (m~1z^c _R^/S%k-`g#\1lQ* tc|7wޘ]7[8rpW xF9A#p#y1_[YN;ݒTb~wR;4֏MmH综kuV*ARDLB@0c(䀩%UF@|J5<O Ձ j}*E6PWJޞ\0 ՄNG+x1*"ՁIW# 6پH ~F$IşmE%ʺǔ ' ;-\UJ`y $Hz`M%=͒ wynhyߥZ[DsɡYm9@J,:vWvUhEH1T@IJnm55ٴrq+q@]jpxtƞZHE#A`se+@;!rӓd[S݀5~ܳQ:> R[`j\Z'B(B4eM}Cy߲_:HY9Vm z4Kigp1^]K=(J5K ݦo =c^Pq>x0f(Z,f/Q(lq|`ԾsԻ ƂX8}@j*+@r*ֻBrS 5)NCjRY]GS/~YM{qJ:ewZn6l#.<'҈Nޔi3#ąt+t]%aL)g^sjþoЪc{p]8[,\dԋ&R0F B"'T$TԞǿs[1'..| T4&LHUz2r҄ iJ5ρ9`:W5J%0Il":!iҕ-*BmCk*{l 6D%zq)dE ܺ;Mxq*[Yd?of;uȎ,b&:&ޥa3>EiS%}nӺ65P JǷU?aͼ*J_ g*z‘0"Wc<`qŠ1.T"z;s")= O/+4&LZ5J) j8 GA3B#O~~ KՆz,q +jgݓs4MS]^KaWuL ϓū\g ) G=4i}Aor!JT{p)^ʹ VDu:V'8۽&Z/GP:{IMtJ'ܩʹ 򌲏_dx4Y)CG| M=ƛbߴ] I[X4IzbiCSAT#sy BS"NJg^v`q__-9˧yiR5Q|%DU9PUACiG@?ҶhlJr$)-xP> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 215 0 obj <> endobj 217 0 obj <> stream xM$>bΆY뫻0 {o^ Bn:!?)U5@X Ӟo P:ϧw@CD5>n5z?NASYUR=d'߶kKtEm ~ sr\a` 'TӀvY؂߀{o5GkJ|KC N82`%T-@.N8y|N))shGYKn}8;%w$Z@ KtM~^8|^DN ݑVйǫ$o,qrA0EE4@.۵P5(2Z@qۍ})qi_/2 QxSs>ʀHd6ϝj(YTTC 8"O"'Hc WXp #'k1E#|YS4;{s[7&i䢔_ԣy2PM?*aC9\p$ge%_l3y+gdCa5H䕦ϖ:t}EmT\+63kȳ/+hٺoq֛ "Ǿ,2DQR%o,f!XB-ԍ!jtjj?@b .&w,͖aEZ}+Б |X4[ ?2xlx1@3s#,jճ ݐY$dNp~=?Bkrx;LF{!Ow $t#~bTZ]־S00sWj,ޒP b#OUۈ2bc;#u?q(eVeu6LڈXBdI]%@06 -NI  ,q+`r7k=.j@k[Zn n>&p,2/ALj-(0RaVĿ[14(cyN ~Y1!^o =LBa$$dń8!,g:[\CK$J90(Zϊn@(AG踤4xŊ[X­㔒+bImA* < 檍[FqgE h [BCV-h#e(jlꄌ\Oo =Ta[tdQƵ۸ŭE%4dՂV8ZX-82:!#+ēۂr#U&h9nKViDzc:[[JWh#eo1d,N-%+Wȓۂrb,Q Z|[[V L#ʸOƘtАU ZHkY`c2 992:!#+ēۂr#U&h9nK̵vK4(Zn,QZgqKi-s,鸥dxy[Pٍ%*As 1h~J-Jr[gsKhF+չ$+!b1z^ -G-$qKXBĄ応ƀj>]#Uʻ (q q{8BM`=."lQMc׈d N¯qM=| @WB;/-M]oܲ;h{MM}b>wgbK% {z21vnё6 LlxLd[L̤xCN=IǤҧx6]S1?ORi6f3$^nO.L|MT>Af|Tn"Ci!cY5$#OXjX'DC7XGftcgR$UsRy4H&/=M11>_&cba$)X' 4d|AINO~:FqxThg'Ǭ$#SGj͞hNN'ǣ=FwRkGQ1U?bVϻ%Op{69چfx,b&GJ9 #^f7`q{193Ff?>K3X{b0ǔiΥ~C=Ig\k<˙=c@B7_E"~ [ky O1 :.Éʕ/^n K,X+I!=[S*%G|v;"-)c+>%- S|b{>nn>3` "7G~~>x~^yĆB٘ ^Ƣ!4alfbhO${* xJ2K{P2aA eF i$3ԙz\貪ŏO9x3?ӈb~A#:7K3a~w 2dz#ˎ/r.qUz{~OvT=zE[}N;Ǝ3PL 6€χ 6rtұFqсYq5&yIA/`S`?*Z3ڒ'R:*LShK\EE-ܑuuqVh>/J`~ I? Ǒ@P_vڰj,iaBJwwkݒwO˪H/M^C n[o ުH2_9ҒsM]dUjs1wJa>AVtlj\B$1Fr/tw;$8%!(iH ނmcV7 K> +4/QÏ*Ӂ1]]xw$zY9eo|L gRBi-_G q7D$fޘ2B@9c$zXwޏ AKP{0]D}Gk,V_^r%hgE; MdY[$n晁c&0i(k~yo1Ⱦ¼dtuQo2\{LC޼fl Cڔw,8t >0ʏ? k]ĶjRϿݞSw2|eHr~cPz:eP"`g|aOFsq56X%Dl{;;"to2,!d6lNaQ\S9*Iw_Bԟ9Bxq1=N[\O\[H)Pc ƅ`[EWi/ "4GnѴc4 7!{ҪUHkAV%dMeV:~ 7rޤ:~87o8HШ5,@i U3 5WHFU!i[%mHFf2T#6˻Tq;YD?]0h`uD[hYUӿ 'S//,qF9;>#)ixVdgj=Uyy_A例x"옔W2#%&Zkfh ;rlJ+e&4Tx6 F^,LrP{c,:;3![cF%NQaVUmu] 1dsS+3 B ՈFJٕh"l]zIsY gq&.'C_ ܣ{F7lC:]Fg^ yH}}ZIJ;:.%FX:Tb酚BXK :6q0wSdxޏ tOC|`6#@ea/[YʒBY"tlzL,_J_jKuSȡ\z2;ߟ@e~>p}X^h~9At^J,}{pBs);  endstream endobj 218 0 obj 4314 endobj 219 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 220 0 obj <> endobj 222 0 obj <> stream xZ[6 ~ϯ")`H@=t=m+Pv#)YIӡEע9#QNjPêkm~+~?6WumwT=Z@X=z9?m^Ox7]vWm-Z-yo[[o[ _^ma@-Z؁-w3 /%sU vx#Z<6((X7  1zD| ߢ䃇rs<4d{'O뛋8*,N>ɲrx+◌/Ej6]-O2eXe7h~d|!cQ#:E3}jxJ\'EJ:n|4NS3l&'6ciiYVr$Ġ!_hI?|<ꠡqp gv&PfgKٺr4!n޷1\ѷ KiQg|GNg+Mvo%~DI1 X1}P}83|zu|l3xۥy=7R*93 dOyմY5!1")Y]#`Nfr]&'Eא:)T@J@`EkYk62=C唠N;x*%L{ t囅od`|TtU jVi"K7]?y:\5Bt]Sl;P*QKS5\Q_Ĝ-ă?d4w\7eϯJlJ)qcw7JOH _-9 аtgFtUb Jgqf쑵?/f- R=L $;d.m[(M X8#چ!< ט:|XB*f䖐RPhbYܬxI$i#yi/cA.Y}ki1aQ_J"Hsc,KZL 1?%ƾ)fNCfJR珣z0Ox\fM  Η2YfYxd9;~6 =k!mnь7so2KwԂ04!v67eLpa{3-8jT6jsB@/ 4 8}  ( 7_'w I %}t؃$LJ0+iՀ^IRO̻ QG`uk1)es' yج[+&[Ech"(/CHeW1xʂ$O RNB* 0cu:},T`N' !̈́3F(7GGbA/Xp;t+57OE\׎kq=~D@݁(bsQ@Ȼ(bgP@wHi\R@n0B0) ig9 p@803vThaTґFWNfheNR Hv o솉 ޱU$ A3iż|DPA )-* 4Z0j`΂p ZyT/Wzs ]7GT5-3{AX]\jzn:Rb`-JOPYkUQ7,Z꧗*{WP(ǭZ~Q#DՇջOmuz7I endstream endobj 223 0 obj 1878 endobj 224 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 225 0 obj <> endobj 227 0 obj <> stream xZK, @gAρ,n@!dLBn#ɏr=\UCnWYKd[@?` \B;}S'ct#~M*1)o7d߻/o寃ƫ8} W"DV=gU_}{9.=]?~[#q>!+dn4*ݣ3)MV5Pwy,I|( (z $VE2dj7ctFzꔧoMo}y4uLd,y=lZӅ>+Q<Ұl#l>Q@Jh$Y,{ !i}l6 AtM L&AS( 1btjO=H3PpMk=g% x(Fí+tF(#1xyP䶃mq69m[ꓟ^FD8^J|]C(^2Sg$E m4m^[6^Q( "`ӛɮ HSvA?:, @B @IFc?}5˼˰|F#0uY04t̹ kV#u_]qM)I AHl_=pӨ)WhJhѯ#foga4&}AP+}I}c"x+I4>=X>.8gT=h b1$`0-sOtD,9 7\\25sH$ |!"JGEf̸XHi(8(?38SGs@F&J# ƱrN=BRЪxukqK #ۗViUTHd*1= cR`S2N0hΏS,_IUfߘV4U&y($Uv#oWb]cy=͠Id`rik {$V#K.A$XI9~(J׵_v.iLGQD:~[i9 oJQds6XkdHkGFH26) Z!"ؤH2TYȐ֎DdlRD:X,#ed(c"ɐRG!"ؤH2 靸oN!P(ܥ?Q$ QF ,#ed(cbu$CyM 51TAGM}#12'4jq GM3##`}=m_ SgcEe:uliHSW '>tԨ̬j}C*;?tvQwꨧeԤ}̓Z'g* J-{4vXu)!nA.,Z8zsM,i׫7q;Vu9S1tYܝhmYGɫs_qsrY3Zȉ"n\GK(Ln`VDw9 &_ |*1e0R0 %2g52TjFy| ɵ\饂v6cGM]AJ^tFFXIʇve91/]$KLkYˎ'9j> p LkVR75odqdGpɏuqp6ڠ9iXG>,KLmeg@Y)ChG<5yARj3ܒSFe_R.߶Fgx_T)kN D&5{;m{L[ hيD`rLηk^lQoaU`' Fy E.ʚ$e/~o(ӌ> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 230 0 obj <> endobj 232 0 obj <> stream xYI#7s=-% LAuaܒ Ya~"ɪEe7Ch]eIOo':BK:O.c2?_?==<G۽ֽדу=`N:Iï/./O@ٔA+pj(ɩq0'mU^$Bp(֒|I/H ;=&j7P7DrOpm65Pi[Z;дlcA0ՂWZCzV<:ϩ xAl®THj[.d5, P&(C?яGMt/yy_bRZx;+5DǁI=ҧ;yjz{V;/뉬co6GٙLTP4$3>33O lHs'|`/H =vc 'k6UFoףqn5Br=JXt x1S&{'RSJO#PX2x0m]zٯ&- )#4_6f^<<.qw[rdr"1ʨmrR\-ҖԴ%9W^x亼%zY# CR GtC$*PjYF욖*/<:4*+uvb^7{LtFU3wmE\G:̃سn4MtPUsJHV|G2o6 oTz}t.u޽|vO endstream endobj 233 0 obj 2009 endobj 234 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 235 0 obj <> endobj 237 0 obj <> stream x[͏ _s>mx3=5I$EdbZDIQ?~4O3\-=ii=<}a^2@aЗ_{1>E~W%=mSH Cf bc&> s.K| ?/^4rW/e.,a=ׇ-%9 uvG UӻeNs7\~ זW1NHbh2XeZ*7t2?ۀDpr9[8ПGo5e1+nxQU^QոΠ>ky  Q߱RlGT%.trs> 6OPV=H9?>.!Q'$E*ߊ:IÅwp_5 q0^$ZمP.O2)1둆DžVک+i7W|VY dG,= J*\Pš.ø)RMu}Xob#1*LL3@ZjJDHٴi*Lc>Ѡ$4cKA3wMMKj (Ps[I0̓AfUAS¶t>[u:֊aөU62sV_-e2XuP}Be-iV}hyb_Z%hhߴt>Z+Qá놘e,gbBRjXhıQXF sk 2C BT;aqB&~]Cmx(lJ_bh5Q.7яhÄ! 1aPGC|]԰asxCNys6nzʝDZ6LZ߹E \6GI]o7{z)c]~mۍ7Ęݍwwfl~ܑScS;knWK}mw6qgKD ܱ}R<<r`2dI$KPܢZlf:MKNabyɷdK옘;&ӤK\Ŋl&b2:Kdb\fuu SH̴wcRG0Zlr]xz~0a Y`yN܈aC-O/إR^{o={F^ > RpBqLvW93APHX X& p7c l5Gai)9 fq$s e~O}0ǧm`dpXp ċ\tOA( $t2AFb;Nr˂:|MP*vf2V2 B@e &w.2>3RYZc]/.YG3uD `54ݰvһݠһE1`pmtD.u& [+Tk'݌F֙\V0}&"Nf#CzxTaFɄ>vHi١X&v7DrŌ*(Q~%.Cruxн%r@{s+~ CfgGNTp0!E Q\9Oojuh̜3=c5~_z<]aY[pۀXN=occwm h/036#Q}ݚ.8:dǒHYjTH "}-,S))@8= +ڄךs2hܸ|ȹUR4貣M|G: 5Û]l6-\밶v !޹ѻ|1yrA ᪥`L1Cl2,ƭGe.)վe~GFi>"bnOԄ݉1?+Sꂠu )_^000V@q2܊FÚu4K=)J}+Ь݇D.dRHC{<6Auݠt>3|!QZ@d ~ Zm~4W*֯Z9hPsVs]npP AXwR RbmN{-p頋CjZjjφ)pXxk863NSA*7xmo" LbcҟOB!}\%U@`j9:Dx³A7yBZmG)v8'K5alyNs>%w%VU qHg1>k endstream endobj 238 0 obj 3723 endobj 239 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 240 0 obj <> endobj 242 0 obj <> stream xYK6W\^ d4rzk ;CR%QEQDpˬ8@uoVNU?>|WӆŃn?UOWY}QbсY(Lr۽tYThk}q z,itBk{jh #$bAE<`TCgI:أkJ\t^,`+ e[Ԗ\F^@FZBҚ=(q(YhJK q`ZL#0aIf I8(D?-(r|'ʶ,A7 )SE˟ (vȃ؆_GplZ8~@^$۽=Iۿ ĕ +?x_=GK66JKIXB $&oz;WVGHs۽kK@ɊSPD: 0x1ExIY+HZӐ6vdQO[X9MQTIXg ۖ>a5Ɣ>Lxt!0*{}M"S!X"FhH„7ӹ~srNAGu@g *=#NO`#UeAcH Z\Jdՙ~] GPQXqՋq飩FA$jEC9;<~rPp2+Kn#tm\ w ŲRu)=۠0f?w;robp2ԣTTtCL'`w|/ w%ZI]VYұ*cH븃u-yl"#ˢR9R } &R zV!Jhd&-IdɎU rQ@HB!RE`We*hEŝNЩyQk2]Φ "(N/'DZF4%ט(;&:ojc2]9]6"MK2Џ_:+V9eJ^HiŌE(Hy4" uǞ[[`S?+F/7 yF6D"+cO+@S] J'=.QR%k6ᢏOGHdh:@eͨfT1j |KjQcZϤ|> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 245 0 obj <> endobj 247 0 obj <> stream xZIׯ9@pEB*U>L@FnI I ~)R"8ӘFE>{ZA >q!8} ×^ ~xy_Fӛ4|5w7^^ϻڄmϻ՛^qIdK63i=h}@|6S눷>aq ce) 59Po0 #Ӡ 'չ+DqNi8"hzSz(m'ᛅmNO6]G\O#TI*UTgAeW $〆AijS.]r6)I?~6u'w@WU{*Zg KK"|d4z*$uF օB*f留Ec{۩ @t HG{6*@@IʌB(07 KkVH} 4)JbN]MY4/S"uY&Lc(^ YFn좮. _hrb50[5uQ);LI~. P9-NP츎Drh

)E*+}Z$=ܓ 18L5 J,g*[zd&$dRӔ RFB;S G* .cIFC,Yȑ2p];ㄾMcG|3t\ٓ˲ > -Tf|[cӮ- &T3q/VKix]Ē ͜nn"  4-e~yɨb(/겟H=%t 埂YKuY{90Fp*~P6XdbUQ a[dzW%=$pXt9kG_߼uPpڛk?պl5Ak^Ƚd4T5#NorO`=٪#%mny9Ѿ7WkrQ ȄMdJZ,rEe#2w+"< R;ϥzA7Z-2GTz90 H?sAf('@Oa[q 뙿V GȋUˑ 9mt$d.u wL&XBQ6۔J[yuեnx|`"?H]2ccQiʜ{ vE%ŝ<6H 1?ݼ9I<ېxvrS9&#+( cU&U>3kKf!ѿTfIXGh$K-u4AotJ Kސ\ɶĐIlZ 5t[q)!E1ۻ4h, + L] 9p5s},2pL(nƛNQP6hGe+îA+6v 63`%; g\8*..׉AjB8/:0g鱓CUqoEODXQG6 !=< mª`?T:mmۊCxeJ᠂ Ɓ xO>(h$c)Oe]SS3bUC47D7-iwde {}~>ތjy|9 endstream endobj 248 0 obj 2491 endobj 249 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 250 0 obj <> endobj 252 0 obj <> stream xZK+ ޟ_1sF O]Yݵ .ˇ(Qt ȹXH#soof0)xvC oxOÿ7o7ky)4X7|׋bnƛ|oϷi&˩iZbUd{ + {{ 'byl)?^̣h͠Ë5''9p7/8]9Ydq Э,vyz/D#zLeR6e&xÓ(Cg{O+mh5ȖǙw7p4"2nu3e8;> YAQE쓦|zkQO&POVѺu6౫Z{:.nkʺe4%@~O]5cu}okG>z !8`Տ-fq1v@I= $ CW+{%Y -ifm[ 턟xwh4Oy6:U8ގvƎ Brdby 0E95{|TL7Yʂ峀c+|>& BlScmwNbw#$ٮ3T3jҞxTZC6ݗ@ *)ݨ #dz8H&S!gKsc֕); ÅR5ӁSSѭDsL;. %zTPIF!?08bʈ IK3S<.].dM%Qo V 8vN_}xѦ0.-re]DP@\PrN Qd$Rn:R35i2M #.Ew.V0%`'XVc#lĤC, p9٫yBMqǟ(֎:8x9Gn6gG3JBߵt44JH1 >cR3 i7)}Q!4ކMF8PHjF2$̓oэ1F=Vͭ ! ZmG S."J{#Q{+tQy 幦9+9!GЉ.,v$Jmǵ>nmda#ȱa~L)s vƚ&ܦwԷ.זէ/H^ܾ'H*_NJ팂 R0sѾ`cFPB/եK ~L!@;e2~e{oƻ4.S,T$I7OOdYw=cU>U\:Z%uco5a[CTu&\_)bAlm_gyWAJ_j&ނQlm,~\2JB^VEzkY:}\÷ř Mxݫz, &]"$eF2DQ~u"e+:=;$'7ң}Y}U;-҂.@&6B҉BMBgGqdOi4VCXԔ wRe7 s X6멎/swoR lWl7K&w%[th\1x\r̵SXVlGlЗZj`f֝zRu_!7{2s0 Rhْ^b1:oJ 6%7zA vz!DJ?t,`:Giծ66WSF<ՇC]|y}xK}Mu/x솣ͬAW_IXuyqГUuPK~(_zQH) _+)̫DꛇǤwLզ[CWȅ& o^YvF jrnRW?X_-хuU9ɱ_ ~g4_=fE::|y~q×o.?׷J- endstream endobj 253 0 obj 2738 endobj 254 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 255 0 obj <> endobj 257 0 obj <> stream xYI6W\G`mM=1C[A$=-LZb1)}(>uSՇ}m/y??N]`ݫi}Gnޑ8Y )~>*fG3{M{80r}Sc3dP|ZZ M X>Jf-ԨD )7FTG j ]YbC{>ÅНƽ9 mP\:ZVHz@%L76Ơ~AjƆ1ŵЩiw;ev~@Ko4ymUტzuf2G/% q/| zƵRIJ,;e0cj!=:l6M;dd#`*mȈY{+j=<4$'6k8^ߦ #$?avaؼ6<mjZC>k('Xo]N$NL$l-}SϜdfɻv3U"E# V煮}KŝHTnr8o@SO`\Xm1n=9aG2n(Mp2f!gk^"nXQsKQ> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 260 0 obj <> endobj 262 0 obj <> stream xYM6W\9$%  ^;@,C[A?73D٢v]["97\s4BDou ?_>Nϻb5Ͽ5odǏ1+i[`ӜZ;{$'a)H BpޅvkZꐸ7s<ۙv^v$ߢ u0unT 9Qt˾&jҰKeׇvf $u$Kf$+[(b/W|ZT$;#Zm/UR]O!T $HN|Gi Azk}G h2ld4;7$YeQCw[Ƴ{M5tH{k S]Wnjd+m+,3KK7MvlK}Chh$*uN徎PGq"4SY3^I&5Rb &oG+֍~6pq*U;]& mKXd>|uRB ZB-|q>e:3]) M*[RֺP3~LbS,WbhŔ-:$qQm9f"{8S%lpR}rlZ& [>SsOu]{YAG QK[L, .aUz6+\fUwXI?FKƯJc4; < zDS'*χsA j(b[n~~)kz #׃ed1FO%Bmp,]?_kV;CW ^xK~[?F؋MםDי6܎p[ C(m,eNZ^ʾ$Υ*X?u Xut;,8>7.3S/ڥ;T[A,A/AKiC yŢa:I3hGMg ˭!53.<6(6 4 "U׳n"L }䙩,3|o3ߎ7woހ~IF\EQnP1a%ڽBk m KA "OR1)މOĂSo2tvuf1uyuw']Ka:9?]U[N'QD8K 5_neNgvN P+TVvy^ aT!DMKTJRcʊ-/ߠtK0sPj,t+T %tb/Pq(.](ǕDZ}mf\u7۞5n vӖ|SD \{`t!t.oiSD7\sr+kx()jϼp,wǝ^tvELß{|n\~64m<!0ɧ] endstream endobj 263 0 obj 1723 endobj 264 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 265 0 obj <> endobj 267 0 obj <> stream xYK7 W̹"0v=1C[A_li k{4Ccoi ri-ͯ?5{ysn[!6ߛ 5'mQ-_v}9_7nlwT:ڛqmй=_ek:w[~;ܧdN@]'^8 |]dI"/(SƮU M [nL.!\oGsOoX/x`*CsG^R; CÁ)MnOqNWsbdN|k80œ0UkSpeM\/%D,Or>1Q4TDXľ Fb>>-zg*07J)*=S4kA**-Pȼi(aҦs\],A[7R>g8']%" bUcYyUX}Zloy<`ePڧ0[ MG ɋjx3_~hbeb-.+JPmVldbg ja!2! GîN29!(˲8! lo1FE|Y4|xh$C4v .FP\9R *]F828M=A~TY+N,i"i7YogN88g 1c5| HX=8ê8;?P3eoY?X3ExfBeU6UQ`YÐ+TsU<#x:cWRh-KzӱR 6*Bկ-2B^{_d$o/,DLv=X|Ѳ\q4_L>666 <+ endstream endobj 268 0 obj 1662 endobj 269 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 270 0 obj <> endobj 272 0 obj <> stream xYK6 ϯLD x @i!M$=f${Ml+I> bdFsp?w4v睱9}Pë'@'wkn ƃEwG7I{$WPG5'a{3)I\U7MTzdzGBIA7G,x" tIJZup9WW=Y$85 0bn;t=V lX:|ɤ ?a5QiZIC4Ȥh5]p *_A W-ǾC;OZ@,&Uޮl=q7F!yn] ^+Ragpʱot# ; -:`ߖv#=nq?+#"aNJ;覊!O R&TR)V+cfąFXk5N, h*5'yZP l^qf2hit5'i]@ E {ܝ(VS@b虳8&sr s9 xS}rj2k$IaQh*P.: 7*Ѧ'{г.eԱnH`88sbV1}2$.9*!gvPET,;ĉȄڅrY:C6F_*F\|gN%!#CwlPѢF:e^NLATX?hxe%eD)@`#yfN.dp2T1*A H9[m b,/Qd3/Ȓ|Dy$Fh{"4fmTy,d +v:C6&~ }(sPE*8u*RR[חUjMa/(vJjg 3Wa\ELE1U ;3('6Ӊ@og||a,S#A_Xݎ{m$| :.\׆Bj7iT u YKVfܯ)AbD[0Ɯ0 -%afbXT;5NKt]cDRnBm -E8QaqOO UΖŗ07(gSّkvE|C]W^KqKmeB)D,""e~.2P[hp$,bFmHVW;C<4I$E/νIdҵq݂~(ǎ@i\]D='DarՊuKϷce aĢbVI=f͓M,yQsg?}FD]SBtٽ ԒS#~>Lb-&b@`necdC;Ƃ[2kK+4=#>57 mUKw۟@ Nc зK*t&( (|Drͫپ/LlyH-r'-: jedjX }='  zXRa#9$:ACUnOb+r_UmԩyIfԍ/ӱf2VɗzHChJHIiq!/Z1 =zjr&kt<仁p*> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 275 0 obj <> endobj 277 0 obj <> stream xZI#_Ұl Iz 0r0rKbO[/l6fW+e0`C8q??}m*<×;}Ww X~0o_Wff"7&3Ѽ&D߯4øwՙW0#~Gy\D`LۈhFfrx`{z#A0,P5bbf3 ;d~Y{|cɵMT=dn0:{ZuIG |$=2䙔MC8zr+쑸`L?}" ! WB2 2qAiC47Z[:V3 osIcI`%(h-0o*x_:ʲabDTm!GHd 'd ~pT~9;tAO9^G$:QpOhG4 G6B=0 =#[VOg7*6+]A$Fu5U7\qNH#vlpKu$>=Rؐ Ga3 J|>IY*`F^s-JZ.1ɝ˥@\fCANw]nI|-R66cӑ@p霬'⧺ 7KAuzY%{*gI#"+J:]/jPYQ25\yrLLU=ɜ Yɓ ,u:ɺXJ_wonBb%5NS[ $2t@v w_) tq[GtKvc⤾^m*T%g#bVXiWxDŽxM/WVF`p!i mJ$tS .7|7^ shl4YuEu(WJۭ7Q&ufVMZ&V~5brd 1YRf]5&Q=I adzbsd`_yiJ-LloNʅ%"r6%(xzF`FI{֬-ӸfĵyנTA?A޻V'= %4+sUض)`&` &/r5xkIBlGiGi ](60]uٍ"s-M:l.;ҒYJm U&g)w`3p>X@$4شڗF19O53rK ?Pڼlc@^H*@)zWykSUDZ;g&gJ_u }>o:a=k˚bHt S 'UC"d;y'7GY_ּH'yhrhs{g7{|8C~{ 30Qi!_~| q<} 1W`yo#8 =s3X:CD[aIUc%}YQOz=2@,=5nƋ%d1`%M` rE|R( N=/ ۭvb%ׇm&hYq}c< ͵wj`VmGü" ݦm &'7i ix?xjAnKxk/KV`G"]l'|J+IN'->ځ+TyG!W&[y+lP0˛-MS&4xF{#p6a[S89F-}AK_nk%m-_9S(\8KG)菶)kjTc^$}\|iG-ќ½ON&^iQکf}jڴ4^(Js{[3 &  +SPVM[oeT['D:dn φN0O`3oFFeV5@t__/~ ?o Cޛ? endstream endobj 278 0 obj 2524 endobj 279 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 280 0 obj <> endobj 282 0 obj <> stream xYMo8 W@3")H\w0;00L0))vZicI(|Vݞo\mן~Η]14~ջypu_vDjs|wr :X~|XSG`B[0M4YcmC ׸Hj<i 10)8r-ZH'>*=tNT-K{|a;ƳHE >/zn'+z(BqcmNV:c?ZѼ;C/t&2ޟp>|0)@=oD^ߪۑZ]<ݙI\tҸ{/IUyw.z̟Ǩ>s-hp_r]P×"\ !Tp70>yTb*U[JNL擌CE{E"jZ<&uӈPSbBS@TTj9\u5]ljEU =L7*A2*RFMrX:٪ili&#/ dtaMӉ; b~L]#e8@&CW05}(j ϶ +>ݡG0~g=&i%\dɌa l HEZgM&vz֕e5RP7R5fjp.` ,ֲR ~-WخnY|T"Jݺ u}/H@1wv 뢑vj8ЌY 95nDŽII l`p F [F=VlvREh=;Wq%m[pYJҧDbR{:n#Ӷ)37&l2 ߺ0 p 3O^Y?Sb$:ߦ@ EDQq`;ܠF/A\ AJWBh(u3\j%5\eLUqjuk^8 tv6Dz:9^,TQGnesmNn S0 YW_@j%X\# w2P04a-3Ñ%5lL40#ts^Yؤ6溕2 Zf} 5.q`DӭɈMx#JgF"_5)V`-KRxʓR|RTJ-Sl*R齯TbvT@0@\.~"߆ܼbA)D73 9K46)"*y=X`IPq(b_|ɔ%XeI5U\sU; uL摌Ito3.[# Մ.],^"Mv6y@Er#c9*m]2[M?loiOxK9N|חd)싋GZez֔҅x;Nbld<WUϮJ,~yo U?q vlU V6T_]K1 endstream endobj 283 0 obj 1616 endobj 284 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 285 0 obj <> endobj 287 0 obj <> stream xYM6_u䉔,[@ 7 m}ߟCRr\ M")uOo/oo}ĭa{}}QG}|p@ rp8<wc_߭iJP4C-9ri?4 lnY@Ewvw7CN.qG鮐pgޅ$ޣ#ZcNǎH=~w.†uϳZ&O1hgXĂ֞cSm}W{wW]s{wp1eÚq`/UOb FnwwkzeTMRJ9? B  fuA|_æ;-!S-[4.͝q}mM Xދ${rpW :s$ΝTgz4Ps2ˣT̬y5:ΘZՎȳXPi5|.w iE~ lQL?w.ews+&yVBb9E CjhE3/鞪0u}fu=YyߗS걐LQpE (>td `0[kIt mB )B$ & H>r%Pr.%)a vRb:Fш靧\KW(`v6MCV@vc1,E&$"誮N5:D,^r]X\򴪫c+70bjy?䩯X5xUPd5y"W⩡($ZDPBKm4b#+ٙ1][s.Xu~b[w5';[՚ =lZj pp⸧uJl[ ;u@:+MHNwʧzrOJ SNgMm2\#&09ܘn}+ݚZѩq?ff;ŶONxN㑅9h!5\`U' pG.}elMO+mazYrrWs.I%P@.hcyB|9gVZT%n-w/gFk Spbu{뺼!Z&5J:U<~Agcq-fCgQ/J誺̏hhzhc]Y}z,df> 6ҍ>dwMmĔj?/stb h"Vz(R&*ucM$,#Xݟݧ?pr/>}|1uw `c = endstream endobj 288 0 obj 2155 endobj 289 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 290 0 obj <> endobj 292 0 obj <> stream xVKk@W`egYz( >Hz> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 295 0 obj <> endobj 297 0 obj <> stream xZI6_s{*-4 9L !,!?U*Iۖ tۮE^wݩN7}}퇯?}fmS0/*A]qGʪrh/w9e`P2ũ^yu׎xoMFָ= #iQ #;3RU |.p7T˝ }|R.ޠ KAhxPah^) păB ;{AEnN#o0hO0]esJWHu0ҳ# ˳#I=BյbCkT'Ě&J>< V+ B" 76N$@V(+>1S)2]EKE)f1)Ĝ |%á kfXX-G Lt%ߚPRzLjT|U˽dRQ1>ӭjzFcDpɠYe١)C}I3Ef J(*ʒ}#}l|V@!c {[ ,XK\-zNkF TTАI^ <-kbgTwxh_p'1gT*". 4cNlke=]ҷ!+p(8HMūQ5Аn9̑YtbɠF틔dž ]n+teCf5c=(M1WژZ@)"[Ү񹩳j:zKackȷ>n $\ Ef7*g';Ɗ,0 &WKJ(bMT`=("nZ]bNehnZ,8Ͱ,RVĕBi-[M0Ta٨"Qp R _ b -jHyweħAUjRRJ= 2[`l)PH[3G%}zN[VoZs6 }gNDw} 5w y]&Y`ܱe<lTZh]₮ō"whsE.`ݶ&"Gtʉjd9<#@_07zcmhLSSc폡譬]ܩْ;ꅟCE[4Џ_1FW%00A JК"5ŖyE|Ck.;3Τ{ϥ WyY*E]å0e`-Se!xW9#zyhח)t!*Ҿc$/m3dZg0SOt*Ldf`sbD ī~}.&f{!?c3!_/wCeOuU* ݰ஼?%>a6}B I'yT):y瓥!cCvUsT (, {zaF^kJ, bXBXRŭv&K/U )`C7C-m+P#ꗀ~ f{Ņwx t~߂䉙I0 yRcy^(⢭c'+@|E5@sU^_C[`X (vkP.i!m5d‹Pō/тYB7岜#MJrUU96. ֎ORFs{9('44|^ |SWX9[xsWwj9syuTӜj/E5ホ oNw߲%|7|x&>vwn_Ju}x !t׿oui( endstream endobj 298 0 obj 2288 endobj 299 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 300 0 obj <> endobj 302 0 obj <> stream x[K$ ϯs* h43k@-#xsIRu0vJ(Sz鷗_'5){Sox럦o߷_n/Qyf+Ltp1gY_Mc=Qy[}/9 bȯ{y O\~0:5m.&"ty ᣘ68$kAw#Mz (LySFiX4._/o߿n~mdiY\|0ިD` J4יHB 8$mI &#)n%XIJ/)K}IR_akIɸ*ר:ok*[ݓU۷ P~sYڵB*SlEO݇K/Z $2  7ЄWF;Zl^ NƄhć{^b1lUY@Vs<q{s?!dςBUMr*$a{/tO3O/Ī.%;bΝN5+)/h.8}ɊZ-Kf;8;we"bQMG9Rp Q(fsgOZMdVy?RvmVrFqeX7!.S?f*+&VqI rbn;clQ"Rl\Q~CYDg!ݔV8[}/\3 e (b6v#pcZ&?BbiA<4Hv#ons88z=eM]U47sGV\}{wCz CO[Fdmh# [r$*m/15l@N|΍xDﭯᗇQrޢ(I"dW8-3M,GE6\EW`u-DI7ɷyqX]m) MK&*%yȼ,HicIdhbsH'4$Ul?Xfr8\ pڋB*_ yExE'ȀK%{n-+Lsjz H:+j.Sr jF.?Liwf2~Or =4H\ZqRwNQIB* 6ݥ1+xl(9+Y35>2ew-rR:YL1c +>t @ `@ rCj 6+cz6GFyc}6%-l3tޮ2?g#8FpԅG: *yϛ[xj껊{V8k0k9 ة Zn 1vYA5ȷͺhhIB/UYxf?1F">.$GKh G~ P Xdg;K>')$@|}gg{w"JJ؅2yHZC\QZD`p*N:!ǖL#L@YC~#I:+R+p5EӏPi#+̹̮?h(bLAYEXBq3ObϩJn"{˲#u EGl]uA [_OlϢu֔߸>ݠ-J[&oQPVwNhGjZ[ѾNZ ޏepNyL;7)w9q Sc[ {x|6ONoF:͵bܡ;K0# tZk͙>UylqzlI1tn!C'$.ΡdvjXZ+: lUA IZ.4LÈ޻FFݭds*БP\ bL"Q3`Dض(;;5O:k(l݆:զoW7n`%`r*M|DYcs)8s -..6ԘV8޽m۷BJ;16}W 1VtY챀/ʝHʪ4 E5& 5.*j]bh0 ''+` WY`&,7tjMͱH|B<=5+K#B)8Z)Ωqp"t'\c';rvn0沷M7Ru-d@XkPnM!oKJ5D ]T\㠥kXhSx۸ KxRU@cGXfMĆp'[KT?L0V2O3/Gz#0:}yG/ߌ^Jq endstream endobj 303 0 obj 2894 endobj 304 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 305 0 obj <> endobj 307 0 obj <> stream xXI8W<$IPӁ>4sf&[N*.BR.ہyas&yz# zs<]qDrehOs9ӳFэ6߯-1$rFppBNwKb h\Eِj+h}9 ,F;)!B(aƏfxfNT^aī(wn+-GO~;Gҙ38$7uk]C/"LUz>I'7FgUYʁD+B$w}b 5]>sH\PO b{##fK3)7~sFTN[y1R--TtzV.;.ҍH:ue :=R/A \.p&(F +RIS ]πg\bHϹIu "L!z XJCTWJp7sh9po=r^iro5L+Ar=c`B] k%q #&\L;i"BRg e&Y#Tܶ98KX49R=8pQFHA#MTWm/\n.ą^$!q_4*j+g)2FF:I)t܎S% AfY3{+Dd\7?, a,,ݏnT#'H ^ְuS t'6klJZfrZѯ/-{s95j@MJ-_V.d}Ro;TQ-g@y%rl<Թ.^ri3A}]on]ս [H3SʌGJhr|A,2>?v+||K.̔N~ ~#~0_zt^e>!݋a>ym6[ endstream endobj 308 0 obj 1329 endobj 309 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 310 0 obj <> endobj 450 0 obj <> stream x{ypי{_羧{z HD"@$P<%VeKdIk%NJ+.VŎxR7zldomy3foz}^W `zzy?7 zY.YLұ3^< m`˯.=d1ߵH3tNc˗ۧ+WOϾ秩7Mp`y PrH+?{n_[/^p ͒ ~>!&*m1%/&j`('o-qy0 = B~~ U< #p%*@nL|2UO4Z~Gp*AWa² b1!AF| |vK[=G~lqꁣbK_F(4൵ow t=Gt}pyY]ӟX`S {4L `;iD@ rz= 2N!<:͆ި7l?=]l=ֵ!5k8ۯaY7%w:=rU.J4PQj{* X4ǭ9]v̯VB©Ëy+1 f_d vb |B M|TqR%10!4 l$΃n=>RPlgA:TE.00bO,Nah(7|= r`AZ`8vȲٌDpbfyO'BΖ][yf |kfw|MkK&a% u(Yra*KAE &LG}rb2f_NW,Gޭsro\.XH$YwK!ITB,SANOIZLZw D1d>;丞=D9g0 7FA}3ƕGtOs+wڕKM0Xڄp:] ٹ/B9)c ;YFY gJ܃=S)LK}geLC"18y >d(7z> -:0حz׫ !D4@f MG ) kūir9M1L?=ŸמO֫p}xAj>wx:[RNSi @ j u.wl쒕1 6z,+lXt"}FB!52nO] y5QFG28:թc'c%jL In:]-5cTi t@Gگv4OvQ/ڄNRicT2Bi bhr:Dq41y/r| dee#@hI VPvJpȝؑO8XRB061 V&Gcd$:?PlZHfІMoJ U=qc-kM󃪦- ^]s""~NmEXYq<DQF!F+7z4kN߆F90خAMl4=H]%TZ)#ɚj4Mpώ}=ΤU~eu  ظXOG'gN`uc| (jQ*==XcLQbTGFTъZĶ-4GVLx{gT@[~ᅑi<5:6#>{~9ûO;w G4f^pS탓>2ڟa\0=%\r`^XkMD*5 RI`6NGbM[LCޖ `&wPjs8$LtUy$1rbYb4[StZ ؇ /gi6c2R##C|uCB] G$Ehc`}/D'ixz SD&qq{Fkg ]$W' 229DMXlf4 ]Q"8ܮÚJ!aNk6[$NӘKtni>j[14(44G,hBmd7ڈaZ,9}<8+漤 6X)Q ڡ0)eD>GSBM=&%i I)p@tZ͸.PH,/A?pr6wt-Һ;TjZHuZαU;\؞F:Mdtnw>|2O%rljsuE߈̕:뿀o #W R p,`J-{q؇4&Fd6Ik[[yyTm, گuH%50xk}iNM#9H~?)QRw~rL? %UT/?K#"Ktr$yE5{)Js}7cRJ]Fc-/h)iKj٣ *a#VwF bIrǐg6hyv]1{i-m7NZk{Kg(Lm0dݬ5$|۠/%ͩ(,C\K/! ~XȲ>a"x npRb6mJg:UtMG?Cz1U=aCd   @oWhhaNs y/Zi'X-M詘_kcFo\qkϻ&"O!obpkRݷCpjJNw!jHEATa8 Ē$ٽ{nP;rYMlEZ 6M>0ծVl̶> {Qa'8VZՙ%wX  AAfF❆qΟq- TedhNΧ)ђ IQZzXq{{vCre[ g<hM_ o w5h*2#3Ŋuxp /h#F͠8)Eռ7u [lۈl^F@SUiOT!ք'x( v!il Mh5h0 n"GvE\D!&Vp<4ap{R'Lc"(c,N2),3}2c#aֈBb};8Ӯ3[tު;㕞t|&NI=oh^7s]D eB^Ѣb`T3ӊdB$w.d$6`CX'qCGt,ef%pܿL<=vH< ~ ]OXj&si6̇m^T/~i/!pPMGcؿy|6 ;xwfOw|t~y8&,:6e@F4oy~҂zH|G>r_nQsA7⫕lizۊ#4|]n~UImRV.}5EGj=%B9%ebF6b]Ѡ[p8>Hy> 61}QI F>k 1aaie?L(ʣi!F )av7b<ȔHFSλ]v8sdW!9hb(K@4YXy NC1PS s'Mh#ЃF38 1s枌!f7tq2. l6;7vn锤Y l+ZnFBH6+84Ӷ#OrG ehnGnng[jH&'8y,bf`'-9+@I2MQ>{3_8IČًXì(YK*LxcCA iJ++mCfp"jib3 ~aX02h7 %KYȈ:|FfÍ&Uj2v9 I  d3m.lv[kDoT ΰKm}TmԠ>0w]( 49@}>*ƣ&qcJYefh|Alg{_z ׵?TR&bT"P !]bRo7?PuCj#\ ˊA$ Ӝdsiu$ApCXjh˔VXj4 `]kjóA6* ^@?j+ZPtG?@LY2W"'k_>V(>i $:\lH"̹k_:DShٌcԑHϠWNuùD.%͸pvp8BjXIo1`NHDMDLmV&M䩷ښ O)0֮Vm9%n[fw/Eуj2rh'"ՊBiq&Y38 KJ|p7rДhX̾f(a+ql:Xκ>nNX; VԢ^p76b?۹L gCKFP`:I1^+'Mh[5mJjﭴrݶEqVWcpM. 2ՙ ){6mqM8r  `m޿nmMz(56 k8(a pf1=\`HuA[kl QM֗6u7Qzb% :v'Ps~ǩ~^Egj;3R;/R'Kf#M,E%#!0`hsaeضVJaWEQ4v%Z{܁ݾTJsT; _wVPOer) 4!X3E!يӒ[y۬!FytB3HX iF~FXVHOM(QZa1SyFz]LbØV;[_ WEJ%AS[ܮX)U]GO 8xz01<D{#7=Zgw(Ÿ"lG;.!.K!ww?b˕N0O{ Ms +&cvg~v|J׮://utQI} Vv "F @?"#xo7ǜ"FfMt2qMwkmQ =V[^mddGj/-o]2Nl8#䁿jDR2)BBGrIs!k!ѱ ׾零bs`7e.l4;rB0Qs8;fD> "L-؉{&il WFx0 4+,gYd4׿'ZBU}qa\F]ڱ69K/?Kyٓw-/~/=g59ǼB1(Ř\\>QFO>>uѻgQn+h<Uv~=r# M%'Z=&CIwqrC^nJ؄͎bbi7/'ad*nTJZiԍZ/[AW?\Z:R\,T]S7J:ؠzTzllF=-/ 봙+A8SGYhtb1 њZ:X39$q8q,DX7E=E9>+KBB)5rXVY<` ƔS >kg>n,y)bOz|ڝ\pTvΆbK,q =.B( %3CJb@p}:v>F\v=ƌ:Jnu7?ro'В (=FEs>x즥D2(sE& g;0_wݙXS'{2?We*`x*6npݪo,&HgvoinWEASwoͽ V; 1 Y䄐G *Qփm&;GNpLJy' 7e)X9D2 d¬)vpl:Hbr1D {coi/HQ}ZsJ[͑eޛ(79|WxZ-T75zo~(( W( BAus )Z7@"ϬU s4V@EA H¿YlITYƼB \Sq c1{+~?tێ U@84=z~nTB N®< O o>b6QO-X #8$οsu+n3޳--Ou4V. a6Fc>݂OqУ}%c:߷dYK&~ْ9p%Al*{{~%C`_kɈ-6(C_2R9*?負#F=He6ɺl;uY> _Ѩ.;9?{.uyI}w]>&yR;Sdǟߵty47{yVJNKëxY*ԤiK-^IcKgW]vqEi4+]_XD!/__xNZ=#K+O==OՋp6<0pj\q' bgY*f^kƞb kr gfWWV/yӫȮ9]59m|] g/,.Fg/_8Iߐ.-4ez`isoL`,s*ûL f-fjk|o ./ x#-Qi8x~ӾDߚV<t8^EjX^3M&kFA^yA!/Gw/# *G0#W{T endstream endobj 451 0 obj 9169 endobj 452 0 obj <> endobj 453 0 obj <> stream x]n0E|"W"!Ej 0H ,Ttl gEut?oflN4׭x3 3]zI%ھ{7C=y=ݯ3 ,w{v]vx'5-^_86M4EhuwY몵|_۔DBdfl: Z_˂ YYYs|ƆJ&8dppL Nyp} 3:(]#\2e-|K^$'/?dfA Ow'`OBS1]b#<GQ-pS^r~Xf)7n0EǜO, L endstream endobj 454 0 obj <> endobj 455 0 obj <> stream xW{l[g?w_s}}N'~8m-KfJ[I#=ii(ZT!ĦI R bBӆkCH$Bhi6ڄsoRk_~|~MQjueb_:ݔ>w˝Tx1(@ٹzZRq9B2*`RjKnRoy{QWg yϭq0ok u(տ6qߧP ʗqWeʰ/٢_p.A "'d ,4+'+ic U&P*{΍:otL?McM04Y0S .NFby3fBC>^v+2NhA1Df6INpw2V|A-g|ˉq|ݶt#ɓf.ūs?} )Ȉ\O$ 2MFܟcb0?Im;hhP#I(tQ2RT54iۥ%/Dөdڂۻ}snӈ;.:79$̬0ݝR~g%> D!k :f X99:%񧂡1!cED{ "zh3I;ən`ÍpKp.atmhmG}]!-S`*Ez%% {&xݝYO{}0@ މp<{,J՗^w)\_7юAô:A@ކ<},4 !>'[@ dlhsi~9Zs(bLj#g]}.~ _1Y聟7?Ǯ p:B}k̒smS :`$1V[|:irMDZzNq~eQ,/ endstream endobj 456 0 obj 2361 endobj 457 0 obj <> endobj 458 0 obj <> stream x]Mk  b ,rMNRQ1Q-<;;=tF!Qa@!eE[~[̝m%.pG؋W൙cܯ} &ЂpNIg1K}0öG_V).WU8! 3iӦm9F)> endobj 460 0 obj <> stream x{|ϝ> $ Fd1  (Āv1$daf (%"BHHZ\PhAPZ"b)-mCs;9{̝⨎T*{ AO$JTz݂!'Rz+=~DEA( <ѴTYFxP8GM!Z.ܴi#5>FfM f:L7* /'TnVQ~TC{*ڣ+ V,'ir QP% SbmOiDyjDEXLr*ZF4vP֫{1劋H'i2fR2+%@)U"/M=UIh+4Nլ _ne!M8!yʠ5k]2Vr:K u5{_H?LZ-☺U40u^/^ͣ%Ӷ~bZJg2V9Fs^[nFe=GV3csB"Z7RO_"]qS^lh g˧R8/.چRE~oz6Ɗ0˖i<^S: &ʲtMU Q%ubi4N4F j涶B{Q5RSNIwZAh\+mތ\vNٟn&{ZA3 =x,ږ4SnFvF?7*fLc`.iF>_I F#ߨraslx̩W4˛!Mw*h \FqiFTPMfz].#/ݝzUJyǪ9k6EX(ybV+ZАaʹ2YQMkuե#ŕ:rq.UZT;rjd]h3(#{$S]2Z"jrUUɵEPD ̺ʦuU(]BMWs$\ޙ\˹ĤLԑTp;܊sn?N)7T>Z![yxc>,mO˅+cXyjx@P4JDGlPʢD~}ϗer#ψaigtU^r,SLŖֹMmӌ>Ŵ2Kk\ÖmO,+K;Yg--dN%@cin/n؟(,Un.$Nn(4_Nԗ1b/ ⸥?V%K;)TZZGAwu*7[VuQVZZe*8K;ɩZ4C֗\kiΣrOiצzmbh;85tWyuBǡ*Nע;{ͯ{;н߅>Ee\;3 TU`uF{4﯎TWJV 򚀯*f6F\Q:6N YSká*__b䛾*3"zb___ Y"AI4J.<~`/b?'}aXr:JsbGؘoVr3 U}`i|eq>kӨJʘĪ玄<`yA٦14}sڏ]çaM$(vC0#ֈ%G|̗<# gR"$5.g:\U* 8_ud?0#a(Y[^c|ِa гYe.޼;]yyA/4.kgwڶ=Yڱqө/wl kz^:fS/}m޽ǎ\M*^XM|"2luȘkZfϦgG[:e(vh7jc#/{m|^]ݦ3~H_?/ σρ1Ϻ{iI)$.x{8;x~Dx;ZYo7uo_F{__ep;ן{Xmx|QTnw`qd='#*3}ң/i(s ?mq2e& FEQߘsؒ>iɑ6ZdDe ?y9gȹF1^3ix=߹ҒG'qf>F9hk 1=B3W0dx+1 D+YЦ8 h lk[ ϽYB7%_lqwW<<8+tNÙ6^]U3"Tpo),P >+x{(oyMKEoG0߿c endstream endobj 461 0 obj 2932 endobj 462 0 obj <> endobj 463 0 obj <> stream x]j0D= ۷1iK~,AkZuA̓fOkK>'8-B'UVMʻLTZnN- oNŅ~gi-1pBJPs1L3ul>GA5"TYUlp8Gc h>{5,RU\~QXm.$Ϟ+l{!nT^?m endstream endobj 464 0 obj <> endobj 465 0 obj <> stream x| x2ٓ ɛ aHBXPf"@!3YLXYdUT*.w/,UZ>kVkbu)u%J&1nQ\]XU6$(ie}g@EtgMüVTI& { ! AQx{Ca_r11<:$+?qJE$/,_=ת9_Q_#}3n>NWS%Ŵ/n?.?-n?L? Qz%=Mۈh=Dϣmhv=O3jeSxZPh#݉uJxviᘫ͔iki.hs؏ؑt7oba=fBf̴vӳs:mۥf:Nҳ Is!RߣEc)G}4ESgަIhyR^hxaAnl !L ],hWgߵQTCZR%rkr-s/ %NSmsk(J)'SW^O^QszL9 /TʠQZBi'gBX>~^_BT=[=zKDBd6Lzm5bZcks֏]׶t TG?tzx/tb ga<atzW>b k레\ykvQftJ2|5p*,Eg;5ǖ:tXI=,gVFr;.F9'-cƎɣ)vx盛HHUkOUlоNm-}L| t  &tsIx`>]Z';4P^W,:|ؤ _6>y}w@)[rQ1^; sa,h@Yez*7Jw71Ц7軜J]GE3DDT8-#kδvYLt >[ZG]jkKlV ya*|Ǹ{~qLd{5nG~)`.]i漏'gOѿ#dQp9%afrh,kWI^-i1~XDN1Ch"7J#.eLDào9*):ѡ-̵bh#p7zY,q@>{{?k8eoa] ,":&+qBdھ@ð+ Vh , 춝=36ۀ/E^->)P_acLyR9DYp7Ȏ_`RjpuΘ~IΉƏ;&otnNÇ 5؞ hҿ_rRbB5.6&:*2"<̢*h$K .Wv,}iVNlxmLN(S*:XL*)k%[dvPβ~γlZaP?L78lnY}22lA) f fz4oZ~RI'I3Q- uTR,zS1ZEAJj̅.My2%85XdIYb%ς='.LBo %ÞZ2,~ Hrq[Z"H0H052 ( F&pRD10^Wkk%{Į3ۺ7uPe( %Z3-ڬ{=˂$gV, S*5QpiZ \[A*h/ےqL. ;7AumrKaJƫ--[!ۭ5Rhlp4NXqmh%ˍlk xAO4r9Wy/pֲ'M, Ѫ./;"i>z/,+vMz:xǖB Х?6>AW@T*|]re ,xKeAyywòvLrX3΢̨s lbA)솏Sl..dȴ|l3lT<^|Ee}NCԔK]d/li)kE--%vjoi-.ni(ľgj m+Z+$8[\"cdoj6!ϷX#Tdӊx^iCB˰D[cM"g3m@4c'[L.gkl̨kĦ+U3-yKsGKgJ;ܔR@%ha#u<OԳ&IXtaL:2阨/2XZ-H=kI2F C_%UA'NH2O2-d1ɊSydm\&9MЃO' z7t$Bg6Ưt_)h򚂚e5u>.-zģu/j>`*!eGFbL/j:WWM4WQ}4Z5Xy5h>Z%h5 2U#zU Q_NMBW?dhUh4ag<2_)rzX1^sգW.5zsF36؆M":9&>WBc٦ƒ~ ^QԈl;B؟-\jHLSN@Zh 9XR1OM}!{YBR[u7{6+ izs]bntDx_y%`jL9rRŪzZ'Qq]~أM(])fw|/ ?:Ƭ~1ϝFFG|X';姕׼wf7ҍX_ZkW+_!ȃ];IX_ݹCqfuD\_1V3گ0}bY8zz:Fd F]y~xƞ{u鍮=1~4unU1]'WO[/3T w܂zjdGФ招Fi,MmqιtO(pHM}~xh&)?>֬fn75BC-:v5x$2;'laFq";@͌Y8 o5O+m3JWnhDGMqΛBݫFt6v4,262 _Xl+ouцUj{W_7,1WAVP:{w72[6<⯲TߴdX"R^!J9]mlk^x/Pb} 笗ߙƿj5+QgSWQW_HB+6h^\|[QqM4%\rX2J2I<65T Ų(֠U'6Tyo\K1_;OX _db✹mP|s;2,L7Ec AxjI~HrZrse=aJGP; |52ђKWŦG9OZldaeIef'?:,)(uGXO#|Hh\': t@pMHN$fIc;Ւ K%-8xeŁe--Yq \4=!NH5RJčC6e̠ٜ3NZvzI(>W/RQNw?E V-c:~A}?BNrM樿 ~~~L;ow)rwQRJ1Oπ_R;Q=Jo$4P>B\PtT=B_US6a} R^zAUw[O9xP|;!kn ~F}B?F@ϫ{Bq(UGoR}^) vt e9v阃OG{{"r^ԃwamv.J=ԧԧaG)zwhéջ QF8CZ2lj XX Pi&T PaPTs u9&lRK()纗JDDiBBc89\l'չtwE(#"Џc<'БG!Tgaޔ6NDNXA5zxmIt'j[2*Y"zāJ8s=Vc zݳVxHI/XRQЏ|5ʷXh;e@W>"`>EuZ.RaEEL(.XހuȰR8?NQ7P愵!-9: fByNQrN5iAyvaIu46)+wVTQjT'1Xu0}r)S j}sǡVx/W5 [\S TO)_w򅈌Phg{H*euGIpb 'b%#@"9)LU>ch`/Ml1 l)2GaUd*ԹBjU~CUy? 3 r?ggS3VW~\DHPާr\U)EJ+7szIy ,*@ dV{6OʏT^ߕVbu' o XUsuE='1?CRΊַQ~ i#˘SUNC鏙MiEpMtǣΔrb)7tt{ݪDC;Qy|  Q %8d1*4:%BQ~}TU٫In2^59fN!@#Tp;L}Dz;]ys>>@Gc,RZ0V%V eC9c軝lX`{C Nr)?P-T(\Swdvrr7`(@łҧ<ܥdR ~ROʝznBGP{FaMz@tۤĊn`CU sWjMhiTV ?aiLkzZzo54_-TY|ԣBi82dC("ƹ]4zDŊ6ǀ@~/RV CT22Po(ERX RPjA ?(ߦz#A(s;0@@ys˒P aJE4p.p〿ļJS%XQ'Pe/buc_"q:3AW0D&&!NWhM(3!b*9 @=HnC{?5A=$È9X~_wM y7Ms_E#njzy=!yR~Y>O!CA#_ %*C8~-40uG@H(k>?miY1 ypqXo'0?LAS rPXb|=H;B-E*f <=rGI e)`Qƈ(hsRT8PϴRz.,åg -. gPЌ6ijH)IJ7Y~)ߍ:vIi4[!9 8/sۤ <'e_(-XQQܓpn>#m `aQVRzE,M:uƝ;K:cϰQ4g;f@;@! ep d!*vڅkW+zBWrT^yE2mXF{+G47?*Nr_J7^*ͣ@fqQ`V(.Y/i&BtTOwrGKc5Ica(u,b汘i, .Jc<}Ζ0QEY AJL"2I4(\W/ES̐AI}HRT\\ \ I;bw==!=Tc㎺{PJPxN"<HhsMB(>tGò1أQNbpÊ{tMZx*06to&Z$5ObNsyy20OF4D`xU`q&+ǒ$y)GE%VVW0ijM|b3t&Km츾Kq6}7G{$fNTc]gI5 |/ۂx q݅+N1~Kr6/l)یU\[6M`I7 tf&2$BAL Ƈ@NK/p6 cC _n2R?<+9^\|`hk?q \~gvg8w2;we{UTt!y}%uovӵ7;kyd|P80w~Xy[s0oyĻ]'O=gV㒞wLl(Azq`SaQQ}Nb:s]rLmQ<&!9~ DP\si.d>=P¦6[o8<2qgSG9Qlm)C|w EF;Vtb m: bh/?N*v;SI.+b M\̍0 mbF9_gH/ Y30xawVSO88rH}ĉ<@Ͱ*w# _ıaλ7*P-]׆y0ʽ~ afq[T͛mBrq c$G%GN&9ɔL: 2) be0+|eq}}D `sGoL̞pS\O8jخ('Ucs:,kcq3dnp:IwɃ֍)X=Ua1ZX&?WX)M֍@U&D"p6%Jg10&мDb~P53MIT9 Xb+8S {Бi;z6d&æ]°|1rO{aڔ2򵽀f'É\uj2dFsٴGBiEnSDZAgB`4. DES8EnwX^Y5%sጝ+;*2h^ vq _jaZhZk$pMV~"jh۔Ԧ( F9eFS8Sت)0r"dS endstream endobj 466 0 obj 11600 endobj 467 0 obj <> endobj 468 0 obj <> stream x]Pn {L9Y|Cu.R  I[Ќfg4؝:g^`D\5€u`N7V~=8ymI8wnM;iKh0Z7.8K XۂrUxQ3wd=Y> U71*7!kh9[c4YѤReO3:㚰R3'^c>f.h0]}tq endstream endobj 469 0 obj <> endobj 470 0 obj <> stream x |?Z=L&,L2ٷI2Y$d쐰fLH$LBXD@EE@0Fp {/WQqGLC@y&|{ԩShwW2"kc퟽+BX8XƸ:?EHk<؊䆹m .AHBȲnkz[F"T  ?{z!"[ڻQ8w9m_~PNrn[y.k(΍v_tBu:E2eix 4 rΰ"D*+*FCF 3G"cb)i̬Q٣ͳ+?aS+*kNCYޙ7%VfDF }e؂' EЛP<Chq⟼3%A^@*o%RǃqW3y0ncE2bf S^q\ Pk2`nNhP+ FB-FKP݁DwUpzu)Z+=^tZGk!Jy/rZ./)cBX=h&ڌEHy=oAq9oL_ߊA>vO4z3hڇ }}g]EЏ"p0xK.Z8+u{99=BDYm g͈}]Vq6n87D P?/\kG>1tc(P[r: OB-,\qUhރ\]ytE/@OGA"G!E4ӳcUHy G' uz>?F 9%}t]6mu z.i$h QZ==Ob_t(A2P }3zHVIR$JH)@ q% $E4Ԁu\ӜٳfΘ^W[S]UYQ^6eƗ+).*,ȷ3:{TVf99)16:*j|J\&E,Qb芮wMId۰zJn2sٌ7BrZiNPN1栜Dc:Yd2 )2]9y2'5" ]%[VAy}JEЮHJD} %J\>;s[Adjͬu6i5[zJ6g*r-"lw%] &(lbK1W@yoL)(ͯCf낌@7NtߊĵQCY u.\yY_C, ^o 'MU\Z`LJs\76jSQ[uZ׵/ mPVbZқ hH06hnos ]e.."zWQIY2i_1d:+%xumS+> XցL:J&+Sx\8D.M̤( aHkANIkqSD8a K%ZX^N BxQ.ٰ40}T& EP1 _[;d9KKl\Hc.bхʍ&>d-%u#wbibZy/^5t\L!8`IBЦ8|2Īդd_ 2BKK~YTb35ƒնe ՝-IMMU9!jKBGD< )OA UUkk`򿪺`/6BdRJɉ*D9lEhwU%pqi2! ~i4D4ʥh/bciZVבvaXbLc0#Q&{Ki* y$=KH`0 HMjQ~Ȓ"յ'CׅLu &@q<εF@5^i:Y@2%| "m ݿ N\\u 䡵u/k\4)&2׭֙Ҹ @tCU4%NauHRhhKF5V@)vh;EjQJ%Oɤ?uuTyl%q)AaoDT%Yb*Qi4W.QmJH1nRRs؝|Ҵ0|OR 1QaplT׌Dͩj.yjo$a@`\Xw|`") Chad|8F# ӠaX!-VQohb &3X0T$Z?i=6u0!Lr8jV뤚L*4Y*zDt:c3:B(/2ܒ>Xn/žߔK šWJةY֜:@jJDb@DSKZ?:,iY잢~N),-읞ظc0svEYWO;thτ"?" Elob|ՀXsĖ#,(}k3y&Nq VD{{^wr//9f;˜ۼr¬8[mG=z 8*C  Ui9*Cy\.lvj0kMt>RiʲGf-~Gzq~ϭs<`׃E(O,nkRW&*"撶ZQxNׂe[Χaqͩdk`,x8 O3`Q=~oi\w~K,@#C{<&(D#+/I+8֪[5R=Wrdv٬  hAp?hN/yOqµ iQQi<3]{bz1N 6"45lLh њFqh2{.)1l?h:-.uڴ86p5:ܦ󖔖T%,IdeJd1.Vfy{#rޗG UEH9h Bt` Aր@m~#@1G뜙 Gڕ1EcbtLǻsެsDXviyF9X6q /[LGZѸ@Un_2{ڨ`aMsWe)YM2,i яH NcLu32cdﰨ"R m)D˘hS!v\Լby@|BR>*̔3%p)$lz(%=RCQ_*"D:N)Ƈeh-Z=~ž"I(Hzt޽B:\9Ϭ\f3< 72.1#$4Fg2P] ]t;mf&Ԕ)t7랭VMNqW扻zz>5O gݯRC=??NvrD?RI/i *pY-HlHédH;,eR?ƓgGbmD˟ֺÑ}56d.3 Qi|kA%+-兵 ,t'%wv6SI/4s1(%ՠV'%.EFW+#M;6_C&+%(DErj6A1I}:cLJ1Ձ9&̺|bŬh}bS 8{xV@;M\3̱KM؊Vp_yɓL-[ot6YRߚmQLdg ]ZI姖&U/ع)I2|׈I_=z0H5Bܪ"72fCM:i$zzP"x,K{4 GԳpµʪ̩9U'[6mmKvl-rAc%eZA1)l骊@;`{z YUCE% lM=md&iCЊG f(?;_4=|٪F\&J0[۔TXBʞJ8%-__h>Pez\ ,F2h#c+g5;uEꔘY7rCf~]VvseݢIXQ^mFv2A+Q8JS)% jU"djqMBQ+bĉL! 0Q+%֔,?HodƩwNKtk(Pb>=Tjoi.z~2mf/!rگVedF~2u*أ)WkL%[4C9k\d{,7."pn^xׁ֔9{UN%MtҦdHNŲf;# *LOͭ*𢲻fgVx f;l u=a$ lnf*~g'$@8Dd_[GLф D(J%e,+ 4?l-iobeKoU 8*&aπfJ@ErD."8A.9#CRp4UߕDRrRtU;*QjiՃ/VI>˱s&_qIz|y e`ʻ;ow,t"D ((@``E{"*@:` 2)F~W 9?>mpӕi>xGsdd";1``[!O yՀ䌼j7ݵ55r\kQ)w>.>.HɋxM_:9._7xC[:AwDe,PN"ˈy Iy29Ɲ6Opҵphƍ6mrr?rdG[ax&n~~dƈC.H O8Cи٩z쏰@H}k$plOhW9c50dԯ 0EJ8` 44ksS\)w{ ` {1,JMYX{sʪn+`4c؅vs{hBt ݝqCS&^`%w=Ǘ0VV<"i,Zlg= =e(+`dIYVXwrV*HļfyQfp U_cSKY:yŽ]̃dn9 + rDCTWB2oe1*qǷ\^+-繎o TZ?Se+Ku=?cl3 7)-W2%3>"JHX7(0Ɉ7strxgl)i̇ZF}z|<=3+^7Dh&x&N"rh-2u+e1#EN$"5d۱ Q3tc37&+|eәgPk3GnkrRӏ3s<<9|ďXQT)8|"t=wZ)`e^I\YYeƝn'}YSҹ[S uQjQ)GQ \cUM(͚1c<.5jIa9aNFQixꛣӳFo+zDPq*qXqa}9%-ilG)dɰMshnau\uttwNJHȒr}@OسXQchi{]Wʝep|٭kӻ+ 'LqM];vluX&ktC#SU`oVY|t϶V//wy_<:ߎ=/vdsKe|yqk6eݾ.S'۩/=#Zru1 AGcx?Kwј]{F@+%w^)CFº()ad"63& dS Y]Y5x.x+q}|m׋VGj7}AG`"&A:ZPH{0I:lT$si~l~,7qtG-G$4 4qʗz||ޕ14)q1 CGوW^ߔ][6E)R&`O8H /iY#cM Aj} n.)}%|ֺ2i7 ,|90ab ɽI¬t%짅Q;;vŚ f9cZppdF#f^b8C`x#}`4~m V'ptEs6WG,_Lqp2A䓳= rZH%f=}2S=1&[+-Y}޽/?=QhkLw7ll(~RQp1[/yGu#5+DGaiPߪVkW 0kZE22I)ѱjqwy+dΦ<]k\8is>z-t~23O Phm_:F}߲[iI_3iB;Kn\22ov-Ecfge.ťUkS`msJ(*ڞZ2nԩ1Gf8=FE&$DLAx1xAh$~FFr Y o^Kjevm/{gg‹?;׻ܛER=ҩ0L/Lc2u[w=o׶rcx6U~f^ = sFw`r'<:M`I~ԏO Մ[L܅dqiс9s_B.?"FUV.:H%U)(QͰ`b8q;69E, 4_X ȚQ0~f>v c/x# L~z}g%}5Vx,}hUHY1_LҲgdg0woj7 ⧋mbEu7ܛo0*߅0b'#v2 p kFu 8Z<BjVTZ5`:>pq@C>#? ``9aV4d:k&1,0Z'|GrOjVXx/# Νn9uc3kiY{dIy߿ 6*>((~T1+>00>x9ts X̊kEO( ] nqY )}]Yq0f?Y׿ Tpb\DDQ8t޸ډy9c3qCyL3Fm|g6 c[!bIYn9 ؈4%KEw^]"s6 #U%cX!5J`dɜ|(6vfB Ξvɂ̔%̙Vy Qj!шP??[8,noPC rqHH dJH#LRqd*]nD2LEf։tp&OH5B[ΞeῆXw0iiC! mTCH`M~2,,l8|"'QF >,O#(A/L{5 "vxS܁g߁'x݁g{wWω!f`_*aŪTI΋Nx~YV}ש-gDsV}3>\]v m)閊ҳblDi7K~0m)25_ #VH}T PJ|$>0s!}2/8;[VEf㡡AbC7ᥜي<қW_ܶ]szszto|1P9S&R=8oxj:kuc֦Q⢒F]g˱Fu˟mI*Kzf-p?FY j?r1U[ca ~\߼&]Hw7ZXyeS̼köieV*z=oٲɻ>f-XN[`0?@W}!>^/T&}&g$~Egr7{ aZ6$fw7G_4/d8)ע[9:$p&X'_w[?!|;'|KVF#%S~U%TjTa-'=it;ɭ8GvD:oo/gi~;J[rDr&[,ZH)*5MdC!0¤<@zcYc1`.JI'pk9G 4X .rܕM7`=cn«+E I<)/к(}W6`=" _|FQD?)}@'&|=|;3%Y 3Zv8Ƥ4os%&i#q3Nrnu11 V\]%"Bo4+YaoE\;Fsbu'8O8LCb#"VLƴ|~G3AOռfs PC5{cxcNcQ}-bߛOEވ l<{ ZbPr/3 R#\T XKE,Y%0tdׁ|禗Sz_'ओ^\`0Kz&`dIĎunsT?~n'JO4J/JX6 g?Lc$"~ښuyxxsBdy{ioG@4Y߸1wWEQscCs &DeN=W)ݾ~ -kgl)GFk)̭/ $5ߙĽȲY%KT@F#-ah ʰ)ɴ4 `wx;Ե6mfصeٷq7?@}2A5BOE0AW|+5rC"hu-BK)L!喦QcZ;29`CE={f| S5ژ+-x7K_T}49_+]wuh&/؏)zP!yժ2B6|9R_ۏi_ *VtbA7,mq|)A4T3};Rf7/TO~ڍEOWxM/>U[;839qڝ7U==zbä!lUI0JFGaN 4#m|UP~mUD$J]?}~n/kzSe"_7o7||g)}*H#%/0?8 $:nߒ;nٵ_H2odS߼6~ǽ0վw9=XnUB p#aq%nQR g{>2}}a^Yzh.,c{mvO}~y#kl p}G~gU@oXA(ySܟlDQ"SPm 68'9$۱sbUO;}lnL9>%Fo2Ȫɞ`'s_ Ͻ;7W$q| =42O|sʄoSjP-ڊfy~ t=uPjG۱| ; n?s 0- ɡ DԋaځV`ÛV;aa#ZNk%PqMPb;?{{$x ހ?g\̷l{Rt[8_Jz%$2#ebyVM[qYiR)TU! XUP_I;Ʒ\ӫis-ou ELW?,?y}H߬?b@w;g,:ç5Gx"/'HȎJXXj1len^fQE/Q e e(rddtW2iDSw KjfL>MeȧҔ2^H * xEA,< ,F*-,,E+oeW^e9Ҩ`V%9_|x}L%ɉdy^;keo v*x e6^;2Y`g*^;`^;NesOidԊQ'sBtrGq ~v=M%8s/?xh=gM53Bdț|7rw#\1 [;knMpi>C-:6FTgU ٸ3'H58ՠz*Ѩ˝$r\M&{SmͼV='ʘ=~I\+ޗhoesC46s6iJ$uaupvf^M7xw#itn佁Csi eD8ky\:{LA^.s978s'_Z\Db!']\ۓ| I֤-642vr%]cgN#rO'#6ޏ\mD,$xBm\Vȵeg6.͎pڣcX/l*=yC;r!^.9y7 B>Ph@sVbP'\sy&e\[wFԇvmJ{^wm{v_ߎ?9A)cgȵ!CJ}VYĕk;X35DN^s!|[=ԋ{pkm佥=\hny\EsQa8Gz7pyG^>~[8;a3o/#v2]f>JX$>]Kқ9|](w}C^ӈO2U+5 b6č2CcC/F."s[r'WiYtt!~rsu[c8ҖlZu6^@0oz w&.ўOJy[lζl*xbUy=`FFާ\Ds5>a!}G\[uORRF'6v9ncenut$ڌs[J5ޔ\p:lJܞ6[Н•Ѥ l 3҄4Nes[.{dou3:ȕak:Zn[iu4FGOGwWݙ%Li9Mv.{v(qɣ:sls]v{G7Dq]=n[G#h IvI5rutV,g[4۹Z9mvcokSwKuh-vv}AxOwmA8)MAxC^p\^AxU^c $/ pTpX9A8$  K ³G݂ <%O .AxBv Ax\ 6AxL£YM lAA zAX'k~AX#AX%+nAX!w \ 킰DnłPB nAp B 8CM -*-0W.M( `zA#a P'0M B T B TB A,a B U!WB ,A AH B Y!?51+`;.8{i y'92pw9 `%~vw`af1s)7? ʻ } %a"8,i!H?2 :rd{8^kӅl~X֚R37ƞTӘPcK13sfׄMi:9Ԥ\TUW_۸I5Ie5e\Rr)vbk).I*)J*)Hʯ3noaN yL~#msԬ|{DxI?úGFv! %/%kG$]˔M_)1L'J)]#(=(}KJ_SҗQ>s:KSJP3INcJt)JQ1@Szһޡ6J-JoRzNP:N5J^ c^)@(#tR;0?9:D SrS䢴^JRCJ)=M)JORE J;)JSNiң6Sz&JSH!JR@J)PҽV JJwSZA.JwRrJ(-t;%n"J )-Ki>Jݔ(JRvJmQR+Js)5SSjHR=9fSEi&STFi*JՔ(URTNJ)M4J)RGR1"J (SRʣ4R.Jc(Miۿ(R& J,nr4J41R2$B:N #Q[Gbr,Jє(ER2QNfQI)ԭ)A)R0 J (SS򣤣Kɇ;HIIAINIFIJIBILIDP”u ~\p +π?~|-׀_| p)gwǀNN> }{wM'^X7 Ǘ/^<8 <888p a.>^=ga<x `'/[3Nuxf#&À6ܯ\p@;3A˂s`^`Y f0 6>c5t-5Ĕ`IQ_k}aü'>glA $ĵU'LVNtg*WT9Z+$\f>LaKKE5kPhDWhUݾ=nkVN$2,u gOB Ξn%O+ɋ  tw$t ]tndv&!dXX\0 @ * 7e~ pp#y| % g> pO?| 4# x6$ீo88x 0x eK/}`Y3݀O< x ` Qf#Ml<XXX p``%x.,rR%q1`!`M p@ h4&@#`ffffi@5P(&&J|dF @:HRf@2j]?u _ DH endstream endobj 471 0 obj 17258 endobj 472 0 obj <> endobj 473 0 obj <> stream x]Mn0Ne, V'DjYo_y"L?.6ϋoӥݧ??W:a.b.tu>/sZج]}omLsMJ{u> endobj 475 0 obj <> stream xZ |TՙgޓB`0y &Ry 3ȼ{|E(XkXZmm}Vnavەhumd;Cn~$ww;g&F_B& 5].I2=G$ G|QћK\y뉜oyCϼ|R"H?5, B;o\h?9ф&{hEOգAeϱvBݕ^"s}{E:G3Z_ۏ6ɇ$ᇽ !:Y[/WvK:н@rKMFo }^\i_c}ʈ&;q; oLrbs֤r+q3NN5qO&ڿ1} '_Z_Meнux]k! tmDD$崃"bECk)5nt]O7n;Nڇ047"p6O[g:s{q}r}~уI Fߘ>}>A1=J4ɤ12,}^ߣ&2iMHQRK:vx }>*LOaO'OQ$}H_/3Yxzq =E_ꗵҳ7E K._-vX)͖H^ ndiyO=U%Ho7b.q?Mӻ膺йY@WŔ/L%|gNERӤ<@;.~ٶPkkgǖ͛.޸aE֮iokmYX˗-]r̯97SRTv9v,Q][1wkYۧBNQt TǘJ7LޓF@nQVЊ:ͧϷqiۖ ;Z}!<\"41Ci*ԭёV-ohu4_ /h[6*-kjԈyK[]:jLgⶔnSF뎌>ˆ/n6Flm##{Zs\زfZZ- Oy+5qx$&-„L b̗ԃ9%( x( r79z=ݾjnw Zi(u>/6'ej#VA3 !Z{m]x0l ~_,PXbA>ŚffV6*d|[i&:BI6UW z@ Ze1r|E> {;itv0۹ƭe-IJҎo tx.d]B J^*&Me-벱-kաj.y-5{-9:ZiSfa9hY;20fY:fl580U,IO| 5N-ۂl.\+inɅnf_/Ʒ$;.Qu"㓟 UOy;+LFaShdyYm}dmWN?A]c(>qe#ͣFiH\rK i iȫh[P1pdflyqED}6 8l._WI/n0{K;$?fõe&s"t^G$dFF,YB2,ن3lv:Y ASKvB%e%\cy,9!o%ҹnْu\Lַ[D,Y"wA%,Ғm-N%wY YZ+%ifK#OFKΗ+ܒ ęmfy\$m(idds7O- al38,#UlSW\f9u2mβϋK峂 xʬiNO l`̦aZ_2T8C;K朾/>(m1oB+}`w<l$~˃ԔG/(G7>l0-ZQ>~QT ^˫~^1]>Z?LDMxoHZ5'x0l'x~ؘAkf$-=O.# QIN .myʿWW%;ES+8O͉{DlVX'HN=O_{xF0`8=|mк?Q~ ~?N.M~:Qӭf&3ֳB346rU⤋_'OYDTQh{ܡ'r=e{ _+oӭ;Meשr4i\.NN7uf-Sd2^%O_ 'q;wx}xO|Vsv"b̾ثϓSguZL~UVy{VMa_\8~ ;>jJӮǔE(cLJOJK*NeT#J6(ҡZf@4z* 5 &.SY,/>IyaYYؘ]1]bFT(bebdԈP3;=J,ҕi+j2⇁_ O7†U_D4eM&20 SƖJgR}5%-9ˤ -i2n0<JNdJOan.i0zZ zc6OA8f0 +Qu@Մ "FNvjJ* LSNK}TfR}NcD*ƹs=z,:‘hz:0X'ƐwX2ԅCѩ"Fz/ ( B" G1RJ2I`ECe`j0FA{RtT?at"ЅS ȆBvb}-aVBጦ7VDHT;E~ddR?eԸ\ёS")jf9רq=Azք*3ԃ/LXE5H8Jކ$?Oȓ(=Cʀb8aG͈BD} QH/n@(V?l@[Cܫdb;ٸP3K`IGßD0ں644 Fc蔹\rә1 ǥAɮJ" b  L5>G|8d;,0:,["w bXgbXuԩgUx?RFA` cZ<}҆|#q3HF7g8ęo$|#q3H7ֿBy"jSoAf޺ZUxJypx 1Fy )ca@& k"]uc͓U͋1 /sl0x OF0j7F]KLʻ]O{9<y0pR檤\vvip}O^-_ѸjcK껺tIu[;VuJG:C~KM]M^7uCkZZ)V ۺZ[V7wX^Ia9.kB{h)Y'ϻګΪn;{^ոtplA[~Aw 'NAwU ]mF*h#A7 86g AÂtk]#jA %hPЀ~A ]PFUc͠'W&("(,G*[v\vA &($((RAUPج5A[mIł6 hVA jZPUV P A--D>(h5 jtE T+ܱ=1Q!~T{A T3VΎ9|ͨU Rرt4GŠJAU)| !LP Ał */(O[KSC]md=H$ $axxx#m?7^^^~ ^ k߀_ sg1% O?~>"⎪ <<-o-,p73@G|:5SW8eK/Oc(`O><^S٢U?< |xIǁCǀ彁{];;)=gx=<[WTi埵jЬ'fɁYުtpwʏۇgHy#Oz> endobj 478 0 obj <> stream x]Mj0 >`C2Eh8("L[FO}şdV"NUPABSwoo endstream endobj 479 0 obj <> endobj 480 0 obj <> stream x X}ga2dXaBH'i03(̌3C1*Xڴ6Z:L%FcԨ5.MںVՊk4ν 1Z< 9w{9ePAL !OBm]7QDvyΝbBuvGD8oZLHr>T,쁊&P>*;W坬YթPruD@ P]>G;|=n,eEh(?:B \ S5(+[4J"wɛt]LtA!ɣ 2yLZK;+$'Ν>t❉ I%;ئNfM&߃>/Ofʟ0I] DA~cusAXßjm$N&R\{\IB(_ȏɵzrF"?%W]fHoM0zr;ly7 -OF`C-P5 yn^s/ Cˆacy$Ogq7yJs>[d +$EmŴZhW5gj5`[!{BuX-d(x؀}?wۋI==O-s}pO!MU`1ԋ~>E{V `7;G1 '\sSUX(A8 8ìTRUS޷QTG{f4lj&F3h=]FӅt%/| -.6t7^%tҧaSȖ Vl&:E\KUT(<3=|hIxXj6mކsZ[֮Yj5U喲eK/^(/7'{nzsj!FjԪ0B.(ɮ6t<\[f+TXgTtD9O@S{Zgi=-2ՓĥdiNXm(mohU610kx^ P0`XmClFJsCMF4Zj!kйg%#QEej=PZ]e4xs0>d:+đ;Gu#+n[7dV4,g2Ṷo`ˎ@:eV5N-@4YNJ54e<@C؟tbB:jhŲH:Abj `% ZwMUҿ=P YzG6WUݚ[*X^G󠿵6dfhh =sv ʇH1aF򪫘^bpG*27#o,{ USҫ[]Kl560_Ƽd2߀L|E> vZPg4*em[P!@bX :p/2V,[*R;e(*kY 5LNj\: Fհ7S(SvTPIlgS`*P, N. 0 b^4R/63ĐٚwUyUC{+%ͧ}T 5YƐOyy9/OkOk^jUUMlf4!+W,^6s,ĚaP2)asW؇MK\ [Rd]\ Oň^0b77x֠@ʎ9ֺO U lF(x> !CU+x6J S( X P': c wmhg3N??R̥#TP4fGE@k`e 땬> `v! wᒂhj%Fq(cSͭƱ6ր: .~EJ跜IT/ ٬LƆĂ&.+jA-=j0CP ڲآ6˺5qNE:[(m8\&M5FZEX drbk8NjTc܇tQj$l[4m&΅ ksyTCkZ(})`hZt;@U6M(i4ok)g @D +8^ 5š*vAh9amy8]<:yy4㓓mfOĸ ^8'+'[uzmVEyK1E%DcHᱰAb,Ataz$*b GtMrͲtʹ?S6/֍E={m:ژn }qѱTosafYa¢\TX,XmjPT`ey"Y:=c\9~2ke"ﯜqqsqqwƯΕHxhцTMYi~~}mqI:]R:tN3&}-%)li+`nTU2sJVhHix&l6dF'?&,D)H0VR*Z0%ŋsiqBlႄ  uY;1o3d&JMfA*K{/ 'oI'nWuw ҵ f%`,y8G.@$č;1&~z&iI ZmVzIKr})..AT)+...flm2(8ې%; bY *R8LcVyx|Lᆘٖ# 紴) yKjvMdǯɱdFձ3`׻}NԤwW*٨D)jV>@NX&PYvx3ۙ ]`'Tdқb!G&hݴB䁯O~({D"f2+ZSL3J#~:&A2Xq8^cGE@4rǦS#ؘd( dye||жcaޕV˗W'g$%V|E[ع:V7_ߐE]7ey$C擟̞5 =z5*[RٳuO9$].ds%[!Bca[.8f kIVp!u qp;-bMm.km\p: ][naB}ub{jFMւeeن̴ǒҳ]n|%}0oQJijv‰Ӄ}[:qhH$(- F<a%>>^C[a6n[1c.Xl.v6Slg5nhy3lpDnP ] O$ 'BTД)XMy%GL'-;x :&݁әOf;ӕ{R8ʉL6n\崬뜌 ѡm#}{JSqъy6k ʮ9FGU\rmUWvҶ g(*L&YQX$4iwELcNQݑRv|AYf8C'7I@ sH+$U Q*Xt$U*DR>HW=@KzEU [z`@}1L43L; 2#WvLf2k.EgoMbV2mvw5o\Mk[i ֘cc^0/nN-d)u5DŽ?0?~NjZ\Bq8IpEhFX oxNJMJHHM'NF*KD"E!d: ^c{·xx#Ӎwe}mؔ5!$5uI$5$0;"TUb2d'$dLh|^R`pS$Ĉ׈5>ĐDHQE Q)K?Ǹ~mO=pKz`ඊKO -%!ʼn|˓WKع]1fW_^79ҳUd׷ ڽD cڢתu*!ɵ~ m8tEþ=?}\K7nvHBޫOPGEwp~f'"ãdBW ;4~Hw==E,6-ڔ3՟WLo\DE[}O?0-&*7~N*sgh# 6*dq=k~*EM.;jefB.nyٗr|TRܬ W(3~> :G:Qۄ#[.kR );Oe\#/(KyYJIy9MFȟߗa$Ky'WQ'5Faגua7Ky-,S)!ܠJWwfZQʃR^ rmdF)/'mR^Aµ?JVʇJy8)D^$5]R^K"?k{lTr|$!r5T{MʃuJy )vHy~;R쬿HʃC󃝣o`CRl`gC;`gc. ޏ H>,$6%n邸I%S+԰&H.^I#uhޛ!CJ> 3HϰZT)]:OS0k#rF|}.'O@?'BtNYײgC%A{j̙[#k3\|.HZ: g%_y;AZFN;?a5B5YDzUɊV`iU?Ю<|nZnnĐ.)p}?Mɀ!쁲mv.nԜ:]^SsZ6)Vp>JP:c|М\_+ ud涷Kڸ/3`rC>`32 rY پ0o6Kv[CiڎvnIA:#R l, P su?EK/R/s-|}?k)tNͅ}=|<;)<3 q:$I,6;t^[Pj ?އiR}0~z%ic.ڦ{^i:?On^e _Ox-DW1NV>[#ԇaftjvI=SuJG{btB:E3#{xڶ6)Z:χ}*ξ~|=?= S gһy HӸ^ \~?zcJѕ' 3 B-#YC]<&ڧP4UBVgjC}jnOԳae7™u!;uI>ǹ}vާNkc;z=7l=Ŧ?YE^lpM)7xֹ>y\v}}![ k6nnWX+6:{>sx7;칕nkU{SJPKجETsx}0X[Pja S>8U:>밋~zݬeFjNӈ-.7~Oy0/`s^×{VZ}!.*Z}0iLs<^wtufs|rN緺lT9`'}nt.?q؜]N27 >Ǻw9ߓ-:s`B?q xgg=nq;mz]^\gr|`]va 8`coqewPG^4ZF>g 40S a^7w.V;aVwӌ=U;^ 39[sl>(0w,bJ>(8\`!aNm~.hG{a]˹^ko8٢gq,&mebf ]5_@=lN?,Y!Zz~"4pckkt]LV8b砸d @ܾP`点 @Xzzl~nh+wY;X6w? m?3=w:>fU -NYniqzfuNk*~@e l KZufؤ}TP3jĻXaNoi.\'wcuª^u梠5e~Nc3;XЧ9mCgy8o~@~p<7gy87lST؅R2r A7@TD-\ }}B}h>ՐR[ Cbi#@". [F) 66 :m=/A D B:sa0K>:H [@!n)afz @]>A^ց" Xd^Z奸gNOKwNW#blttu 6\NGTמ.[r<"44E|C?#C.wo# xukW eğ/!^D88ysg #F#D^D1 ή܃-7_#F܅qvį!~ -݈#~q⧈7 G\q '?B\ q%b' 0⇈;!#~4P >. #.B\؆1؂ƯlF#‹8A.Dq\уFt!;†DXq&F mVz:D 9k4! ` C1@ >{ y  @yu@^y y /Q# yȺgA9 4AAyqC < 孃)C yd(@d/ HĆȽ 7 .;AW V_ ?9ܔ@~ r# ׃\r-5 ?1.\KJ;r%Nmw IQI)IW'ɃĜļD!*1%݉&*.6׍јRc1FA̞yMDCKؔ : 1  PRQOJa@8D=Cr NohGϮu:NFt? UWP[Ku95QQ)QB]Ԧ(wd<*jwԽQC&*2%R(gÑF():rw1'*(> endobj 483 0 obj <> stream x]n0 y5-P@*AR=@I\iM4cI;$(95F͍{mi; 7mXqDCgY> endobj 485 0 obj <> stream x{y|U=.Inr$wߗ. HE$ "H1"KUd^>uA֖ CAHp+2 V_օ+uP>o]x֌W'PNHθcIiP׮@ݱh–oV;Q߆w,Y,kY~'PAH#h*X]&rRhuzєkγZmvx}@0GcNn&oӀLYlYM"PC&2v.DEMeL7ѧQ-QӗEmϠmHN?ȟHJ$"AYE7 ,cT 5d;ͤ'9'S]D|= |&BJ޴xρ.rl U'e;;M@nŚ {GXP& !`.XkǗ.o)j5n%T&X L9jRr,C|+8vINHqh˼5a΢5UV8L^UOIb|aya:,zݟO"c'9~E mHO;tzoЌ Edd]-$ (J.Iތ7Ͼ3:S-BA_ʜoZ9(H1eg3ΨD=ۉ .vƼ%\Qvޅ'/X8i҂}cg;s&%-:WP͒a,9Y*t&شgk/v6ś*FK+e>1-2MF2j''y'liңMiFK?|4hCz3ua牸F8Fj[#I6!"F&^BTTtDBԬCrϖ"\*QCP dMUT!S1z"ǐGߍOq&ZmwmGg2mԡWgB})N]Dԥҥb:Ȫ%rt eKmRzv)e+CCI(^`nMDyBy-kCa'ʃhCl#uOj+W7[nlnoU\81uFqtIs&Aِ(o㳦ȧCCvqlP7gݝ;IttwjbDyYH.RVJJD6{׫jR />/<>7 T{T#]HfHgCfcnC:S.9pNN'Dn¾PNd :cbhrZ#㨷ގz;Ꙥ_D(@{h&AS&d4QٓMi=:ѢF+j ߝ!uQחghnVfNн>r3K܇TCNT)o"du [4;ݏiviwd:[g5(\XֳY 2myN:0j0]tc^=~Í~-e~ioSsF#֯wx|||gʧOg`oe[-e Y4;;[y%Z߮D@U܆rI|elD. '~k/3s)&~bNɮ#'9=ohŘV߇O> )(h^w뤆IF5ŕ >*/֌;Tc{<.i2ng"TIzH>0=9dB+'"~mYcj&MI_KDw'Az1NgJ8M2񠟎,j,A\ H-HM"^ u%9QJ*`u腕'Xa9(ECXU٤3,Fѵ愶+6 Ht(q 4(HZH:JS'M?"j^A4jhJ: וRI+=48Ps/1K5Z꫺G*{=8t-Gd~Gow}Y \^JGay{ ȯO> XA;3֙5m ^D%pZ#)F AC#~`q'P - xפSouJ_"7a?q5RC#H& eL$ :\߰_ ]mt-JK5_Qix X2`Z 44>H--|}~x<~p9 Fӌaä _ɞ|s7w/E3PR32OD9e+cwcwۛIy[ѿ[ѿ;ѿ ѿܺx%=qO`w>O^?oGc$u!9zoq(OVyuOa YqzRkx@kg^DۂH=g65#ل5xvWpi5364mA P@+*#Sְ#No0O7k9wU;5r:ܶXv Ӗ/=VunP(غqb6ǹ,%ہI3m|aX*`U ) Lg2!>ǹ g>H57]m 7vJcX+k6v&ɤ.kMv&4i, VPHӜ)ЕC!_MKKhvynȾ[θilc|p01wS=teԶDlL2IϙQU$1!+GCQԑ"EHĴ2!a~1m!2i#ِ4x HZ.!'C;mVkZ-?O nԕ|҅Qh} I0cp,|P #2[QhG=wu} ۘ,`q9p>'mu3>W~VmsuXHR/E1hzsssU*O 9.A'"OIndg>1;A4uYXsLr\lWżV i>][۾xM?Zo:;r9:q3g?j`w,jeio6ze~K^'a}+n0?T#l>v )J]#1x&q|:!wcU *'@lFE'G`|:PLf};t͜vIyaa1+,_70୯z6% -'TF'M{M:&wIU_UOp^W?9~snfa!MyͯsqVt9t ,DTp%XAX8Zu܈՛Y f3{~nJ$xZ 12eVT,sh X\eʔTer6x'meRϠ)'ڄd]}9uDĐLSisvDrmy$P`9E6 T$fyv b:`3Zd"O])W yĨ*{pGy "%DI-bm'TwR.%Wokl'tWi%VƷooӻ ձPt ;#n7=![4Yrƣ ᥚу6҂ހT(\VwѶwhқvl.HݓKS1=}1KgNм^p RڴgP ?T_oB|*L4hM\=ӧ5;LI>;5ZGcҒona߰P:%QEuyz]I,9i dQ)-& >#7S>'ӣܮR0^-T?i(M#(UôZ5 Vy9˄|^!sF,W VdI֚m=GcErmv1W%L&R-ۋ,R/Mz?ސ;hTbjElk.koo^a[Qjyavv{lW7 )γԸ⊊@Ф(TMV S6p+3ajJ1\G' j;LϥQq9ϑ =oJ=PPkY[u+-+tE\bNSfqU/]3{g"w },0!;lԝ\?=h}o[;nȐ)Q~njQF/xwL<0nmg%k u )$Y,)-KcCbӋZ#_IE*ܚXiUtMI]M g`넶z#ԕ2.f _1di9rmIoR Skk;cEㆪxѤ׋<{S 뮑lW4InmAz5=n nv"E{:{>jr~K%iv@\v$i y/b%{`B.pS˩g0N M(M 3yD6lj$s)  5abUT5sU e6e ~Twʹʙ@'\m@)}VAogu'KFѬr_NW~z]V jڟRI|{B9[lynQ.^~qilq$]#R_; \p:( K ;A%TEhf;b&g {f3 #(cH! HD7d!9E]Rlʃ~+d:aW0_^CElb~S|L:3[c<ct,Bg^5]*.g5e-lv*(!GaRJcmSeu^[t=e%+Ip~r<`xَ{堨̧[ԟE!{/%p:/6.}#,vJ~GMhG{#5}>F?p`ݿ*cӲ%%m?m _wX`}8H <Ě5.ݿ22rt$fjݿj&p&*6 GZ=by*,2&k/E] L&y!͂R%eׁ<vk<YtdjK,ڋk;Iņ\/U)=8k>*+(5"Z#-7D*'Bk:vG} zU}zz`rA]W\ 1p2ڊ/2Yְm /BA$.03DQ' ۲;lI(rN(0egf R7pBjBãXt hu\bT]QЈ%x̦*QR+/3n0斥L`|e<>Y2/`eJ|\ԹKDi z=v-u: zF*vvz+;~CKc M ? N9Ig:bHj0';yh=KA=F01x@#i(Q86P#{D6 xsdt^Nv{י>u S&KhGd斛)dդ=6=T9j&mE}Ȧ<m\4t ;&31lݗ;|c'n9anfTW+y BF;mj;dB6ƨJ,v¸?l*SYdn&0MK]+f#:;)u)TC[HxuW_xã"f˝Ta =;EH=+ZY"=[V* uKC=>jLϟqˠ;&""|jfݺ'b ^0{-6X2ԂU{@Rx93L+V7+*Hܕŵ;!zӾŭX^bƴ/Uώ{cJ {3=.MtϽwHӌpniStإuʙi[t*46;=%YŏԴNLa71jrvI˱J,Z…ypDtrZѵ9בCJ%{-<}JfAQxHbZ\U̸JrJ\I˵~$K\0 ɦqY&,4hTVnWv*8.OmQBA$ݜKBR—* nN79T63À"Ge։,GVʩ1fUiL>39}^їg%2O}"-`O[fe5VCV֏wXU$u w2/u*!/ = ܚ¸rNݢq;&bdy|-*T _]wJ^uy xqvǕ TMrk]rFohCk* kjzPy|3{ŕX'Ugm6!2#@U UaFU#>:A\(=%RG6&=+H زR1oo9h jAohhHţn[Zჿu 74!( cS=XWU7`ooi65[VWY2ud4THK=^ {nwUhdhИ^ՕZMX,Uv!0K}4:AK0'pmTA&ejY%ls5j1e|_OGvRlJ %Ix| W aC*JjaO F%-H+d$E_#w6VReAǜ9i"|v6FV`YZz!rj":"MG]M;]L]A`1?$\飾R`܅2NWCG=1Skk~Y=W.;^{:1ktP&짛xi iꢒO*cT'tZ/k|, Uvz]WuQ 9svwC^v0.L,_6~OSD̻n~V M)pb!mi 8KL@ ayKa2%$R'Ȇ~!YmV:kGhY NXp"e]%hNG%=r%Ng"Vl|.|)‡GK'f`QcY<7U&w6ȩKn rfm03wÇiv'e -_{ oi?.n8>8UȊga8,q:LN>8D.dyaLZa=q 㰑?;ùa {]a+oU; Vgz`%͝s AGOQU1scW,kqݢYŎJbUl\% ZRc,p1Z,x,2gҵGEq9q$bxQ(QKkΙb%fxŋ}̘5wќa+,Xxhhinh=ct<ˢO^K!/tBOYZ7\=KX?:~3t[Mpq=*7%{-_}l-gAP@"!j#U䕼 y\'xK#ԃRNC?$)C簏{=_%1X ~3:y_#@>_`yAO2 #p<1?xG>G1rc}oy.Gjgy~&g(0X y'g97y~k-y(Yk5^{Q:I2!W5v7~s :~Jظ_CNFS d/N?Nc%/(S]d'<lF6>V~#䧼! 95oH+9J)  6z3&1jýɍ'7pߴux#kȏ /?vmoYm%~)|!4 a v3HV29J+ {Xj6@tbomF7]O,>L_9̀%pX=)SSS7sy3ÓҳO☝ÉoM7ko8Rkg1GGT"{czp.q5 Rlpz`sa_*ҵA||Mx^y5ϫx^ JɊ*xԽ\)N<"p}:<1Awb4W|lTvH"Q2Zu\> endobj 488 0 obj <> stream x]N0E /a;vR Z*uC> M%u"7]5 ht,ܜ|Ym0a4@:R;: >FC7O%N_)_r_ ÿz`%k,_Tq2xix!ı$̓> endobj 490 0 obj <> stream xWktUs望AJ!z !&IH@KM$67DFhVJE`!)ZE+HZlRZZE (|9Zյ|ۏ3gfϤ1$qXE5J ~ETRYSg ,̩KUĮOۂpֲwDӦ<+\ r(b=;5ș呆a y5doeuY` u6<šƿ * #7;D|MO.T3rW׊Dy:%>f$C?̓WlXiu"wVȝbŨv9&R*Z݃z$Hm{mUIz>(ziCz4뉰4F5OOt)|=^UکCY*K8NlS-Ԏ>60ЖZc]RTXmTq.uZߪeP)WCDJ1z6݆z:7b=* 葭VګgrFt%adtXKJ2m&I{M/KcM2c'VFbmIܪZjڋLMEeMUAJou^$mM+UvB^"KTZg!a&U5ڭrx䏿жZ9='snםj9,p"Rmt>.$wɿ"kA{5FZZ V܉ܕK|FQ S1&SQLeHS+zS+fY\1Oz1GQB(_B55Upcչ٣ |]2fߎY%v3ܥ]v֥GHiJ|;Tb7;]j$\mfILv֡DIJA-u,[Fw;WwOHHYN3Q>9^abw/r'ToO?>w ^,|^xxxEmZvR8f/F (A㘁{/gk\KTܖxy|r]+K.Im=rw]nŌҶ1m ǩ((%f8݆ǑO O Duyɑ O<[P<J}}uP]S(STXWYZYQr%+B}yl˿zhzł@C#:-D|˳keU 4VV6fTWUC ku/Pp+>SJ*PBYBJγМmY_Cg6{g~}Hc"a2Ev]h 4;|PEj7?bU(؉5Wk p*/?f,r; ,Z]N$SM2ueFW 03L⥌yv> b2tUL"Oe*P )%SZ`JӰ$bVqXbMʟ%'^< |!ymϦ3$(f }?T!5>Cq4寴Oq9p-Vi9%'aXNrJ~*wRN` 8hbN2@g,ZNqirK?11~ZQ>jK>}y5aKMQ5e;ߙmo۰kܰx+IԽŌ_PsBPOyߚkVp-oҲS wSvoPz^Ë3ר{mPzt8!xD˒e^J/޻g(߂n+J hY͝::c@F ye=Gymmv[>D0-[d3ǰ-f1l6s c1l9uq,k5Y umF~I OZsNZGӲ7&keMG7;s_%15F3-޿ o2mW`Cٕ݃<)kx?@&U~\F7㞸WrLKic+*ޕ_)/B^4;ִ_ȸwE F%"Fpy1 X3X׬ZX`u ꆫ*Tƈ^\]@Kp7sƽ%/q0s9oq=nfv6Mr%&J72,gt4֩ޒȯeMš5"VInIȽ0 fl?ѕ&25Ռ3x189ɱnFɵ\XcG%bP3B̋sLJsxVvT"G&z5ɽz)# !fys54abtdQ`W7~ipHi̧=&Yy;%" kN[[q:xp7:Nbyxo#ш5]xxZw+͑{ o?IG endstream endobj 491 0 obj 2586 endobj 492 0 obj <> endobj 493 0 obj <> stream x]AO 96О&f&=?´؁L)VM<@x7kQ13.qe0HU5fߖsGcl_[2opzqwȁ&8_{'Hj[8=O6=u.;"_mKuw=.:dKƘۭUHw>,K1)t~ڀ[ITߓbک}Ymu endstream endobj 494 0 obj <> endobj 495 0 obj <> stream xykxTUzԩJ=TR II*@ȋ( h@@B@i@VGӴ`cKڴeA;v& Àc;%!M# Y{U%D}w⬽kݝZ!6wsn=`;zVt\i\ CmW-tqUksKCHSc*d$D5J+Y~Qyt ok_\3=i>_;L*vk^۪yFS PQPsh@KDTiAJZMLJzCdXmL`Sh0L-4p gWaqYT%&`uf pN^ı9ax wo!le>'( *zKbǡN[} [SP/FpDv= 1Y83yCǦc VH'hU? 9,· 9VktG|vq8‹$p߸[xH)oĒB=$`Ozcڔ^Ệ`rJñHpD&Jr;:86 .'n= Q<8aďֈc Ӭ a+aF)Aad)dγ8GaW8Y{RBp{_S^N%6U77o+񀨆^nzidq&tzGzӸW <$a]868k5ؔmi\{KZm5\QN!5X#P KF%S+ JN^<dIOީw9ti#D_T戌~&=,,lte&`.]L-v۬Œ]DavAcVQ}W铇KH?/ Da ?xXd4}@k d|' H0{k~ EeZ 4rQ/ؑw 99|  4yR7߀pyRh3?E3FI? >fPB>Bϊ*H^s zLnv&  o/(1f%܅ (-Sawg;(ݎ6|vHc]؟S}C}MC8mod8ĉЕ\S&3n" q ryD!1lij042._~7=Vo*oH ^TSF{UeL]QQyLڳgl[ KvJЎbV5c*4ШPx&#o/{{\*¤|F9N}]P7t i%Cܞ+N I?K}'n{6bLb,yosYuS|ѫ;rmmU7 `؟+ =/&hS,]VV<}ڙ“'Q\*>;,T<ٞ(ϓ%xy)#o?aDŸ #!#C>@N;G'HF|M'XzB4lMoO3џ_\n7~Fg]⊼i'<5ӞٴG >!43R߄ލ>ZK*uuR L?h-dcjՠL6{(PdcLxǝ)Ofh$V찉o?oXBC5PӘ x;͵˻oz2xcb~YOmhY<+*#Pϐ[IonAz$q)1D,tV&{v*b݊$E;:VŶW6^L:{i[MkEd"rtwbѯ޷/^N%X_S"DX,sЎ؋gG*gnE) UtS{K+E&Q5J. :VY:\=Ѱ߬hY.;h f%+Źc/߁x5J>ۂ/wbvhW}seաRyjCc\Z!,=*MZ:["X5 Ŋxzf>{gDXwyҠґ&Z$C-V VW&?{G&||%աsű -܏,F|kR@~˖UPLJˠJا-J$&IbŨkVY2u_0 Tz* mO}282Tz,ϹlkE3(;R-zj$Ij؍NY}Ŧ>^l#Motbf9y֬!,vn6@l< #P*Nƽ4XWYȶL2 F7Icjy y>+ xM4yDUh}ߑ;n"E qɎYʾyUyey߸ ˙*Ne G&\3۶H9,fŲ˟dF**™[K V^QEX().)̲+J1ݨϥt_SZ) 1qV޴LUH;87ɑ$eR 4r}v^v$Mn Fơk*סh84@V0L/F'^E C^yit)=a;^3g}B/O 5 P_ֻlN-Ҳp.}=+1,/>49 ҟE>3& $x`Z!s k= TWH X6"a_/J|JjVyXfӽL<5a&k>l/61mU41ܺ194mFDo[Sb]CǞ-L?K1\O7zj6P}Fʆ3Bh k \ fLq,[]=["cb績^D}++,rWYn4YL-LJdɌ:-ӂF/_Ha-usڇe^%2.o] ՝[ZV9 kVxݵ7> 7|YY lS*}sjnL,@\z9A# U2U@,T|OeP=J4fͮI O$ W U8w#e5T#gsƖqqګwq\{p&^"pP8@8 _#\_XlLOt•Xj/%\C'!߃k!<+095%I|1zW!f cµO O$ˈX/z!@s^ < 7fwpk\FPq\M8}u{+Wu;^vx1eU;[:f[v|K̴ܴ֘6t9:[Z;77tnjokGenOq<^o_ LwYŜհzes}uqzAGVmhkݾ -5+7u;cOlZB}{:ue1ues涍+n^ռq\WgglOGovhC6U ۮvEψgsȑ'B會p%ʯrY**,) !ߴQa;& EE"'jڑZ>zSRw!ZnOw l95B85@f}Hq\dLxy )%zL6##o\a%8GDoBXGk @e*ʩpDcO%8%.5" ÿ" l9qcp/z M#TBqAdhx! 0ޝGx.l!*dcZV1r^i2 ъķ̈́0,z G9 ԣt&6m"QВDA A5AHP`hb,U`6p?pf!ck+|?oFb˩?EL/g#$#gF~ ~"p١WWham[AGA~Q\+d:ъ>*HgaePu(C"D{UO$\U7ho|N/C#Kx8EPHABIqjW,!xy4eS.5Cz͎<o\|4>F+2zN<;QdQi[s+`sgws\D=)` /K!@^G6'LDPeZ6Yb& \MDg^\)+H Yao72L endstream endobj 496 0 obj 6933 endobj 497 0 obj <> endobj 498 0 obj <> stream x]n0 > endobj 500 0 obj <> stream xܼ{|Ź?<3]]Z%Kd˲-ě8 1$N5 4 -@K)%ВBpiJKi)PsR 6&~ό\9y~ޝٙgwyFo␲i= ~ݲYvSBB;Wni~а~Wk2Bh W^f0eDVxFH2yppvt~8۸i9ݴ \'W8s ɿ5[_tfEhz~C~lHð?=DzN8^%jV7MbNA9Dd.T¾aq#h`?  *gUע52#C=(N2C hBu5ģD1DANB 4N$Z~-٨9P!*G uF >dp޼2(Y9Vy ξhGf@א]~Y9 %5 |PowVEa[bͪ4F{؉*U^1et#YS(.ApV6N$*3+! W&p"#U;PoX)~/}P{O܀8(. :^<=OvTl{O C=P='8y \ͪƉ/CBѯz; EdP5 VtZ6-F]h՗Q @nQuG3K RxJ(loW _ъ/ŗx~D !2@̍pq7T6xm"}OWq=|ћpd.MD"H\>(C _%&8#'qq]/wTUUO'0WE ʕ@ԄZ@~i } D܇_BߢwWۯ n4 ~J7-II$szrlMr۸!U#lTw^^+_1*x4d:\<2غa[W¶`ۆ+l{1} l`-~J@ # #%N2,!öl -BOyr1[ pq/sop s|;_ο? f6Q,x&[FxP'| K\#&!V1@wrzn1,6rr d]][7|mK8UmUTO?O/#$5,uox;Pيϸ۹+/6#=#HO+zzvM_n7Π޿ {: qo?r7| ?q /󤄟ĝ4P?R]<0~{/"zhb-q!E8N츋"܏\c@E`Av&OiM~ })bR r..GyT&6݉s w7h v"˓<{P;o%RˀpǷ&!;kPϻyT/t"Љ+DvWn܍VUSGK+On@h,W&WQG =x.g~埮zQ[dC -z]6CK4{ ֢ ?F*!P={7CySȁszjBeJKڧZ[MƆ|.[Iץx, `z.f%Ѡi5jQP(3;2Oȼy<V_7"CҜ},|qNr^r*՜ʹXQ{}FG͊ȣxe=H<2Y| yk,yɳGlٰsv,x~3y>kuAlߏ1 POdwd-zHe=gyC\Y3"3GLiu׌#"{|5t?3Q KE֭g[KaN{g8o9: tl9uLOw.콬«!zg؜s@.\*û=#xL~S뮌̦)}#ȆAxvox#3[޹'FzW|ЭgKj7jȕ箱Nc /?W(2aD^+CIz"Mpe+ڹ_/FA{\=)ADQŤ?2)k)BL;Q*% OG鑺:* b'(q:;/gH$CՇnWC!ڼw*h ]S=ҽ#^bW/r|S#6/^_4=}]좳sj1\>ǠG@._C_}uvE|,\rNEX9'"ٷshehMD";p=\}S?ZynȜ{z#66mf.ۯ໖9"Pe=&}3{GZJLO@A8@,ʳvv#Jh(ISijEe=XTSс'y"atQ!iE9[-^q84ZyJKO_*n_<ю: .CC>dcp> 4 Rm@Aҕ.%M.nz0./ 9~sΕk՛͛-}۸i㫪Wp|uBݎ[嵻n%j:%.7!N[ Pvh P F;4X3r=}n~+ &(b@¿/nnQ,*V"$+{e"Z5`E"/= 4; 0T\yKŧ8TDycb`@]u AIY2[JYmu {%֣ƣ y<0XFeNQs"BŦx$,B#xA$b{j#_X'sc=S|jX"^"D,Jt&= p zI"~D#kYcAe`iy`$4XG4n)@ej Ncic$ML y4P46[ HD"ft Pܔ'H1d{!Éٳˠ3.6nsixf_yL|pdqɂ!5ȷp7W&ףٕn2!?'T~M/ֳֳK:=h!zF+MY6SGx8A*^˙KKK%`eeȎp.nl <%@IyIXyCχ0ȳZ0X\}<:+w{&FhRb2/*uxUD؜ 8$x 1 iuuf,aEUTIc}/JԮ"`!u 2edIJK=Z 8% x쬪$},{@:BC8MOon[ya[p &$gR(F)bk^3E)6ͯs;@^% m&7v c CC*gxUcQ`y %b}~Yd (2&hhKJfm.b.%b{G9Gr&hE>UHQ @t]Y "KCOjre+Zݭ(-6c EmJZkejtͿdnW_љ9nw`Ǫҧ.lyEzMhJi+J.=QЧdlvh-%+-qrmrq96q}1(avgՓ"(7G1X=Aoj?{x=}bPl8+S121f=O:A+cHxJ b,b8$rO vsLx+tT>-==q,tJK4O:vxW5u4_Demimn%FU!D(J22>dGJ>ԪnqIgI>l áMhQ,B0uuu_f4 sÂ˽FLJKA"OX"÷V>8 E+d ʰ{t%-4eKZj 0,3&Z1( vj;MO@H"smdխkX\<s˥|$W5ofZ޺+י_aMˣ; 3mƦé>&[u\nwgJVў?krQ8qv46B@whdͨgL||v:sԠ $/H%z-:ш:kXz 4E1otoxoUX.q ,Ҳ+UO &yO>Qך^")%n^ tV֭Joxք6& xBwxϷ{$qS8^8}&]'_>M7mcR+T@HD.S E<)L?+(^ i_ʡ Ƥ}jxdﲓ?sv흙mU;0x`昦EAI-/h:2JZsDd(-RB%?[Aʩb&`5 C!HUT%UX0hm\kƶm:~iWp\$]rs㒿!ɲ/:?Zş+PBNpʑPk¤T>$M󓊕a=gbRU,r0hRqsR :NT@Mɫ U;f(  QQ՜Zu.c4愧VJ(fy9h׶qYMe&rJWʬ%y^Xkԛy0F ktLbJ'h_}Hoҵyyʣ.6 - uY.WيUb1}Qt!J`lx~x,nOb[FJV"cVy '%9U@tK^3y|H2{%?7җ@r@q Hk1239mD[k 9 _6{@2H_{̑f3whC]͋xi {IAQP~&_& YE/duq`ć(i(,y&D[cpQ&MsAY.NsAM&.yֹ$)-ą›Th.YFÂxw%5)5=albGC "3fT#E/EHE+OSF dn(5thͤpZ,ZA7; +Tg]/U-=^E5B?a G]ݾU>Wokзru|rwny(r*"e $޼}A!)$BC{C#ЉЩ!t=6ӈyohZJЯzDKO9 呂P?F#h @@!]ǃ=XXNn" A%t;U ˃eۍV OZjQԿSk"0V܊R$J^IXK*I*a*ecR5)&gRK[Kr bo0>G i.˾cͥ-M?{oa\ܾ%X;R3B0{&Yi+7;LRqAq hDID6C KCbPY*)sCv(KIEbI6%ً -I qT4+xBs k4g4zCfk@ Rz0ccc԰{Q@T(URꈩ, aaݰaC-j%wɳJZe^(m2o >L4ƃdH%++ɇq'ul;JsLLϕ@&$.u˥e2VKy5/kCrjR &3Ml\W˯Gk{dgܛ;x2;'bי^gƒ޳o̲6?en hۭ^?yՅQgzVOyD ib~Wh]v+VYY:5RJ :u{:v8~,7~^ɥZp;Th (TM1Fc:3yjou nX?R1bIebJzu7Y~ޔ>~P)n= P*nnK?նİJwJp] 簻Ӄͻs|\,苴Ў6﯐ Gď0yUeCVL :=F<$lB t^Nb"6ЙAF H~d/xB24ݜ }zgoLwz*fmaZ!z^J:8 m;2Fo X ?&La=QS2MOv=lf{fЫ^7vtV;6;$PBΛ6̄r%+܆XK2|ut9EU"U;lx+ oY?;srrNʗ;4Pi+Mku]N8}~s/dfհ% 3,((hT͗iMzܥ}~~^?฀( Sʘlx onu7͝zA'ifսgf,o3)Hжz[ !l yѨ69Yҳ?RWWW;6b91E<Slg7كääYIU;8T Dh)#<ijhh4b$=FDMFѓ!lv/Ic ;ř$lj<}>ғgh 盢j&sj&sj Ah%99@4,%E?PSY#*6]icIj>kj6BWi+*uEu3Ůb_8\TXa!8) #E2R}0VjG*`L9J T O"QFu3Y>i,/F"&QtDa5Qc_GWSk7UG납TJ FRJI)ү9R}MožD5bL5c>> 03wPc]yb:L)]M/C70|)߹oFa5̜fU Z~ '4_„mi2M޼"!e"nZo:IFse&ABյȇUi >‏^Zݐ2LjÏxV D| TqC|s?iG%ةY˫6LIBd_,th%*fCZqUBLP5j(1=1b%K80J>Vb22r'kw2(v{&.hy Y|5tLv֣ibK[O=[7 pR4uW$:}oWvw#Ryć_xcʛK\WyT eVaNxa+Y-`L|T%x јFxsk\ܫ<ʠ26~naq?wm7l7~Ŵ=$dA &C_79#T={:| ̇.i80nna<< H`ۼ̵̽xEኦ+W4l1r:]ʪ":mZ*6h>(>۝27I+鱶SmKխ^xסaCBP|o z4hi}kX DBB$m4V&8"/{f,3s @۟ >HK 2dKO,Up¡ØA%<jSe6[1x:M N 3 fe4:4q+ciU'h^&㺌RxGppNI'6Su1K9S),w( 륵iKifWCsJ|T*#ՇN(@)a\Oģ9; S1K+6ܕw/Ӛ? Ξ~-1ƛ[Vudzolza֫Ө:9We?|ϲ~Sts ?VjJ( wZe%]['HzA[W ^o(PzBŌ [6%ULVQ[4,5e)/)'Q;L)JD#P2#=TQTRXNὩ6{(03f&0iawrwܹ`PM K4~J >գ;h|{K.ھ Cfhⶤp*YUhera}<>ly [>!N(4IɃKLt:,0{dUh@-w ]4b,KHv%+5,x5찭DY) &_XfgV:sSu~3yq?w/֕oGѳ_Ɨ'QǴK9`],$:ovƪ<YPm@MŦ\{]'\atݚڇGY҆dfAfIaUM;OF>SzpI@/dGG1׹OЃ% 5G/_pЋa%1xS9Bzv褁͑K~ez'!.4] A9(nV ;TcufOYա'' x˨NMuRǨ*cJ9 QOl K Ag3tS걷˃iHּЄҽL_,1hRHL|x BψJ$AA{2 ۇ=a7#{,(lDErѻ3GΨʽTyI,*Z@;-;-yl 5%0k * ܥ(Wk)R fZ},@[ž-SL%N2{ cDgr (fycfHDz-9?'ԌEcp7tlQ@14fz7=;6vޝoB{d6gU Q}DR $!Ox]Wis w(b k!0:hXuC>?>et#++A-\ew곽ɩܲ =HK\Фf`2Ēe[ccsssA=v{\oMH8OSD锨h 4UN rBYЬCje5dp>yT;>ПE"!aQ6wiQ{yvJ|̳h_ŴE_Io6yջ9I]urQP gzeb;~R%6/Lkoo~mUUɭՁї$FFyɰڬK*gfE rr9bN1yB9j2C0im (|0l%*/קe8\:Y}^,!j.0-\ߓEZ.Yҹ+ZuGŭ3Sum*nZ`4]ܽx}F4-0oRB12QV+zr#)/%*nrEh^.vx͗A),_pj4cJd+JhleZf>Z]>D)9dT q; 0ʪ⠾Bϼ_X 䪍+dIxo}qQʛkəX O/ m{rw5p mMC7%pol쵙E4JXh#69mTܱ2>MmfrK#nD [;L6[Bmx|Cz|XU`Fz^@g]9Y89qLmOLW n *cNhp%u:m訑vRGӹ |)8]”zq],Ҹ'nwٴE-P) ̍Θ|rKw,O̞lL%-!]!c/q׬L]a޻ f#zI_0Ze0lŀ{Q~~jTbib5f -sr͙ES5g, 62ͼX,oTˢ,s.nw>fQݞf["Zyɣ BuBr:&^Z׼V_>CyhVԮUt9Ýk=Nsu+4O/Խ^.mp2:=Qo >Ǥ175 D'Tg6XJx~PD{jkfs:fi6fil;H+m=-t"&TgYjKK":%FMMA3vuѢޞ ]ّ:>o>4.Cg1T>@a|pr\I<\ xj9p-@D]xQ*0w[3Eҩ@~3H@DN,,=KjYRI5cs :QU9 yS "Q\TL-l:ښo-#-9](k1Zngp`-e$ɵ kMK&R'ј)ddzdAӐ&!c]X#|6#NQ(S\,5B2LydA X*4 !e789} -gFpoĎ{Uڂ7Z^Nu䲽p쇟<9x uUG(o]7zz?z+eڛI^Q=YXӤ}J .澫2^$̒TAu82k9U1) eFe]KꠅɪhjCFd8C`"Bb.[w!YqV_+>?u L@ sǐc :QK`l[:S|0f,UGG0d0;kŠՉX\MpH1ש22Zؒ '3-qxS5f:U&?Z~z4כBonTVh_[?3?ߞGqμU֬Ғ kA(***HM\L]z_Z:;hu9]N 7хz2Lrϻ𾛞8$cC~D-1+5 ly2OMTiw<Ou=$Wgu}$7ڸb4/^yk}-{PB&ֳU1lbژyY[DKui"[(PԀhX)eΡzIcιQ9 || QIJ“ԩ5=Z`dp'>3s+Lqw˻,n~!귅aqzHF$[&>P@}_ Z F{/H9qKR.e1 jQ+yw_~pW=%uQ,)d [Lf> G`__ ڪaGG56PqBMFLM1q`tgNUyǁap;OVδO wLKܔwT,ascx̑-5dpzϖRR)%kA v/6}ĻL=ik 8 xV}-x|(F֐wxì@1tڰ͙('Z$ބ^F:V|HtQڊJhi5Pǖ!ڌ h(fgx9> O/-Uyi}nN&=cQ:dڇ윝tA*1]z5e6dk)-hDQ6\kLxWՠi s_~?50BE(ҨlU+tW`Gaۉ=O'>9񧜾ݒPcx+Fɟ7QhTPB8MJ$ iVtVlmfc"1CpDI{>8;iqL<@ںh_[P6'iB$z; 8K wE]6m-Y>/Es?9z}W;wv~{'QQwD='ݛBq|(Nf \6,5Ttle S؁" f``nj&zzs /Z@G||:ؚi`<~ Ek07!֏2̼aaLX2 IGJm?ƿF!9acЏ2@'@XW&?8zjMj7΍:*\:#IXx^"@IO 8&PTUh( #uՉJ-aDWE9j?Lizi1״r:g{*tǜ~j]mت}_um8wMCWqXsdP&>{U1bǗ&nZr2^E{pCG YP}7tz_i!qzF zp,M"j!1VB4E O1Lz,ER=dn{5O6Љ%"z_bڒ}:֍e}yv{\IL$&L&)!F%F%GտTVJC,I@l[9m|BaKz:5"($FѧLĺcL ]biD`ާ}Mk1h>0؞K%E"KB{C$tXjJsfIDADvؙY#؍tInLd|rO.@Ģ$"%ϤNjk~g pX3e/iߧ :;Xe5 >5F^YRY^ܿrјdg$.h8t܏d[,)^?r{yE|, &n`0 jWfojގ&[-[*nwx,nB8o*M7r}Nqe|rh2kȜb8!t?7 û-?&'$I\s .}]V)\R7=(xO/I/&Y;٤{=q#as#M(=Y8N!; p%9t]S֙N}r$-pFw V^V.ps>Fm1A׬Cnӂ0pDuaƌ9j6ZcΒz=s#2W0_##C 8A<[?) \ܤqk*[hLW\^ "0|#eRyd;ɖ_x6n=lAO[+:Cq͟0ªB%>>Q¸ΰsKyG򎖾YzstMZ,o|6gfNqpfYoۺUv7䔈Bδk*Wk\swҫqU[ wq]9]Fnc\1u%<|^x֩pNBrܣwx٬k;p1R2,)VHG<\_%j` w]*e;Rh kݝ|~T*>#t`T:ea"a\:."T`s;pߴ6u`86=|S3-p5z_YoZ^ȫ\dI /ZM=U.Ѫ8A;εg;߷H]C%;Xk;qUIIJ]4U`ġ+PV=OR>κь#?2e" / ^п]xRӺ3 N0>1o3N.ʌvWT7V;5tAqRXdWJ_[P}>\+ut Y\ўe/L^,tfP ӂ7ޠ7<694$`'jAXuJUz,|NGg zHBƒۋ vž~+邜ޛ>F>}zEB΄nNDHfG:lҏ=#uQfH*)l*nE1néF):p:۱;4iǫ *](+ 5U+&!Ih]e+M^4/tqN s^:'_71fY:,)8,=<ǿJZuR@-_TT 4vD6D`$p  ˘ z'$Zk&/b63w>fS]W~&22(ׂEd?N{c#o[m)ڲCERݲemur"d~pWݎ__xWӎ=Yp0-W\}z,9V6OZ-<'6ϫu";jv̆K1I/N)i܍^Ғj)VL))~1%uסUœ.5RT6eʵuP0 Q\ 8v6fjٽsn.2lE%5&"ɐX{7̒2%)홓\B:d KPXF>|CIuɫ$(jıT}z=XQ]J&;pOیԡL|V72;|7;;}*KL|@ }jenйF6%W[v</bVvlO@0 $U_/bgSŵeANv) 3 9J|֑ v>}t~4zoVgY+Ͷ3l 5̡n>+i(]?DA$AxG)/xf -[ZV4Udd8 ˈ.-[ۑf%2ǵ2Z fvlCƍEƂxʜ';ֲf4WS޽H6^!-/AFM lѲ8qTs.ҭna/Gt3lKN [ {@v*4qSǣaY3؟5RbawbC5`>Wttt][N U?x] flAw>{Sr'\\ӛk+'K ڏAg2 G&W%zȲ\px RYݻ]+GoU`ׇv^Z 'ym5l`&3Y)J2_Pb?ǀbe˽,=?ykRT PZvTC9%<F3AMvrUafcAI&®-قQ3]ʄ,b.b룟 >g{ ʿHS T)E*OVUǫNVbnAJEGanj_[6ښ=j.[шy6c#ϰӈFl5'#W^oG1]8?Q(FZV l!3&MYw#R{ :U6"^Wu~+,}n3b *s ӕHӫ,9RVzSϯiMʋs:m)n|tM 6V:ӐC#U|v3&b%%t=tLf'yjqg+)z1MEuI"2~ w&<3:(@_Ƌa u`x$>Cgn! -0SI8< V 7ƥ+8ˁ)] ~@r}Fb"Q6~;GRO;H'Y[87 I/M{z/@n*SkҗJʚCo, Dj3&V T{ Ff/(! F4hbQCnh=hR6rk4=x}+;4#0 k4A›#hYFP.GhTE=Ԡ{Ix,yy% M5d3Z;gQF`PGAo4th0k4hСj4ChСqFAw5thdBmeX%F[]hzFbdt*)&F1Ng3ngɨua2f1j%Z~NiQ-JywC>lTՁ6(%(64B7 4u |I Az?Ƙ/ 8 [ob2Z x+AXDף H|1?[B4127CQ?pcuKIZ]ƹ-|:l`ivd6:l0ZTYj7>zd(8j9Ch 7ʠskI%ST#ʺmPuPbIF!(MBV0qLoT2*rhݝ&2+MgLU?ױǙ>`ZBokY܄N@ֲ ~z-zC}'X-l a{ū5Я֞LOjczƫZڋy]\_K\Σ-bKz/+52Кug% M_le5vBQW|oPIKbUӡ;k  QyIl86m$*7FGb}ヱRnhH^6~,:(FbEO &|-k1HS( VȾ%غ/_.XaK:' D7ncYypXލÃyx87<1XAѾu&:<QGb%qHot :<.U:cmX_Nߘ<48N˶v+iӍueD8 . xphb!A RYNd& 覵4֥W-uR.˞XKk>+orn\b[b}g S ՈML-T !:4 ->ֵc34훡q/14y ? dߗ/'!_NB|9 \1_o𪼷]mWOsd]s2_n9 CJe)[~k{8W6A3HK'gP/M) T- 3MM!epq)ӾʘCCԴ8oMkļ*)N[7ybJCgȊ1n(!L^~hG ޜ6' $94cI18'NQ<#+@d/s}n K'7#7y؈Sj4G(z"0b4A6 vH-i#=Db5t:]MNnStt$uu'uugu}v]nD7۩ۭ3\i4i"6l SIxw=d-}G ``':p聫X\>IOg9+Y! VD?noev^Iġg)oO{R3 >3H> ; /{t$x }/qj,J.IIIx{|={'b{6O׶zk}{' {x#y%ѺXV5ֺT`aCәYJk|n?T)SIjb<\{ B_ЗP@1f+ƣSG)fr{JgqpO6M~7 M!0ua _ ]`@@'J9)+I$+o(t pIImu6. ڀ?o1>27O4?m6lj?3~.Tg>Xgn3֙! Bf.:%J.]. }̥1D](s$I敒R2י. z2I]Ak^DH4!HuOGvt!ni3R]:>^Y^ߝI埁O;-RQ;7ok.Y >9] r}\.9M%CvL{ioIuG^UzHyujf0=e h)_β=9ÒFVh'2lVVx3r3,N{TtgG^G]һ@Vxz#T]҉Y=,F,^1-/qdÇ8rdqx z*◞tI{?-Y -5^ΒRkd;D 3(xFjŋgJey(AHcarXy@zv?eyUhtkyv{Cyw1WIl;MlU-,ͫBzVyղ: zjdtum# Yr<#m;Iu:ʂIYj,]ΣyedO=*FƋccc&&pq贮-E7tG⑦ɶMhUXDEGvD"#D'sps={{{ʽ߭VV"S߸&<F`1C]Dqê:7.x3.px`?79iDfY}TKMKU 9Oז0(?w#@B$P[m+P|p:cd,+.Fcg0\a+=cT1mď2`(oط endstream endobj 501 0 obj 26459 endobj 502 0 obj <> endobj 503 0 obj <> stream x]n0!{?[4>u͑σ,~洒{wi,uޟ*ǽaݏGBaggsmliLϧ絝~Υqa?ƒ}bCҍ=_3ghjk2{֒ۆ1Z%5IRށB20Z3Ќr^jf ^+ggF xno };dQdԿ?;ONp_|lZ'qS»HF_swONCzF VK_IW!/OǷP)_)M F 39T~ OLߙ Ur}  endstream endobj 504 0 obj <> endobj 505 0 obj <> stream xԽy7^ssg}lα;7.,,0r߰XDo@@IL``Ds<'5>51FٷffY$-5===QX `r?Z+w^  5#k7s=I$nj?PL\z*c=׬B[+-q`˯\ϢlںrCؕB翱y#i [o^}z`3uѩ9|~#>[DJ1E3LP-l|  Gx"Y#jәl._< wtvuO1g9}s_0p%?R5n%U#୎3O8=iA\/Y.5xLVm`  Y p!VҢo VІF?F`^}߯ѧv{al׀*W?>JQNj0'} > F0BN_k5JtST37S?Ŧ|].Iצd"F¡`۬h8VQ L*ah `rlK.r|MO>qR8T е#aW $4d>~ v Cèw;3gLi)V=xJ~JF>׻8=8{3X1WW-_(=i@;c:vuS 9ih۹{\7Z3Ѱ}~Y)=z92\AՓ^3 NyWzOyxti=nV׃+ !zWw9{o޹tdyeDp>xv>Ğ989>ozיori76"c蚷}CX 1|D; P  :~?_1#!ƭGs\!IW>CgD3wQ V8G1Ϝ1-gTL}G$S/˙ OA8|}=A2$%A4 /)ɢA/C|gE΃\P|SVD 3) 鈶<<0_,=AA}mp0< H1ץk/6tA@tG{$c Pc9($95Q4CzWΗ3]>1*&s}}*1ITqQ=U*IѶjf$?:1]R3Pʰjj5j j.pX`,Ƅ1PX!#ċxq \Vˤ͖|PKeRh͙t:H/ܰno^hb'S/X~rZc[(>itzgt޷j2>(4Z)+t31{GL,18&Ꮫ%0 yyj#*Ek}^_4u:=>BwxKģ<6oJ1H h:3ѦHL;ؘb16!Ř0fi(X "b<?{,igka!{ >iJ&< 4cY MKn?=g-,N^Q>I6Bju5ƟsYaW–ux.`)hBu/d>,ZThUeNa hWԧNx({RS|s&ސK7SŹ͹˨krhc.Z4{\0+<jhiAEPd("1Ùj8yW԰,)MOM+s_yD"L1D]dMDu&e13s471eebgC[i ]4:#sg&^u^%EE&*8S+֎RݦɹВVB;9Z2ڧRs @X"4R2)rO]/V52>yK;ƟtYLS|t-5GD6lNSKJ,X߭i2J{Ko|?[FÏkq_km3GS #"D+} FdL%{h8d;+:l @x2Pl!eXB,KXIbY,O2.\2|+ne 0(stYOy/ ?XaP:^>7ٴInr}}4| zFEuGikjmagBȎ܎E4HAzӊQӄ(!F N_PTp`@q <`9dNe08su hFu2UT?|x̀_ b1|nkkEz3lgo5.~wFLh)#mhfǺ-Gxix=\̈EO./4nylWA(e}Gku8԰v f/3X։Θ#kt|ݦE&>wf"phÄ`PTiXȱ%U9c1oc)1+! U+cdeȎR2œ;q.xϹtˉ~~dg=s~~?;gR](-}KcЀwPh(x"7,rRJ*h e1z?z0s^X{LQr+ =G#"Q㢚E4Vu z`D>`$: C+ϥg҃Ͱakػ?wIFdkFt#˼7Jn?bþol (b>C;cY+a0f}z6QxH>3ѓ;Oc|>FFGbjaM :ҧHȳّ,V$!mQ;DoGiouēruZ R2"*4,ъ#|!#6h88kyG+A[T 5+8M0c⎨Ôq>CuCLMxTE9lƅbG54W e3)c9sb5JzѯnQ*9\>Zbɝ\f>R6*gÅ.,@#!4 VaSO^rI20yC4A@ kNvVi朤ӌic94C OA7p>SSaΊьO!ϴaaU˘3mgbʔUS:[$ [%nȺtHK/65=D5"Ֆ{jj?L;FoEܙDiq.Pߙl-ȳvtr3|_F7LcǜތoVOU:9A;7E;&Y7DVXۉa_a_S;e'Afگ7Do)?St h`<~Ќ )d/L̈́rsceɣXٝ[N֎.!topxˍVTf~2ՒO/.Cu& >V)XOߏtkHT$;M3i23E-RYtQp.`F~Q PWCpVlTѡ}M3m&_kDOdBoF* lkz!(%~jR?&ebJ kjTJq|?7Z)}w40yՋmC=+ӳ!ͧ?-[y-Lz UkUk"t$ G*UFR Gk5jF9t(sɇCH< ^=|$fEr&\:%\{zvO{u෹߆:~<լJ$KMx65!vf#4ͺ<6jWENͫB)15cKJl[C!*=6*4!~ \Gn<._FIFsiϾy8ГaqX13[]Mwb#g:h !_C 7g첱xEm! M,>be03W/@>7 rSka("oBwrNQ#ms[^ۼ@R*qF{M/g(ԧlrϴ]LNp{ƅݛziFY4,n}f/s||cw [BUv]SP%[*/t Xdo"/)%tQͻcPpdge ١h쟳Y,:q/:-34?4pj8yGj#S?,[. K&!'i*nX-h"/tPs,N1SQ%c^/+6a׹ v=?rDUN;װ5֛l $Y7n[L|Z.՟ҩd(,UxBV idؓ˺*Q'!xذ{ >:<Qp8$,JLXy1@=bw`)|G`4_T\Ě@xS; O[ (scNM?۵v9h$d^m|rD>2s\-TN} BJ⒢)!OGPM -Z7֓o'w:gI9Z}2tZ@?tiڔo*G,2G~ӗieQ0e2I}F3+E 4-p)FQė^Eչ6gI #Fh $-֞D^&[ tT9R qH!VqBdVAE$Tl__O%όBc0Ys'PDvSdwYqYxSx*,+4ih,]f%NY\iK2;ߡӨ0;2N*o_|"6t gpFИAרd1N_qvDa6ZNR3B*"R_.kA\3r^\E҅VH?0Wա'LmÓyэ+vV<m@xjb)AX.dv;JP~u~beethq[V}ZyYK y-g )6l:zu3WnG̈@JvJ*S]Sk?J5͹g859d4!LD͢CeyGޒݭdv˝4rI6}htbY)#=2JTUHF]FʰyĤU$!I*dLb26tuC LL>d R[OCG 'ٖ˨a[{\n }s>"\Ј wj'_U;9kIT-i3f\c|>ϭmQ3:Mn7'?'>sX1N8GHPsa5F}$K<O@)5i@hE Wj4C#*5Qo6!"4˘P I9dl\aOgY ߇*qx%:Mp|vG)Û;&a{4QݍW,NӡUy<%m;:n|  ƦY,AǯnS}&#o6e5aɟ=` cс.L.QNĴDl,0o |X^UrSS(+x-8gBl#af2F1L{lljB,o=%NK|50 j.s̾'4̘!xS1 kp MmX077QkyR:'Dm5GX.XO q}"GlqDu9]gvpڷ":5jLUVVI ©Iw'"D@& .洧T0iOo[h[lyEy뙽{vG]}s;ڿ{aoll6Eq{i*3@aq^ ؘ[6ܗ>~a&8➌1}%afر3.\,GoP0s"o-&H*6ѱ`2 D |_H&{BpD)#mի#J D Aryb(C$8.jZAMvvVgoT*]^ذX tP13~Id"&˘,>ʕM؀8]6=m KY*=ip<~COe͸"{,Ȗ̬B;lYU*]6S떛iS/?QZ-$ѼmA(ՂPw l$20K ^+HPRRx %]ho\T+J i( 4Qe #3G@J^|ݔol]A>rac-2ݻ8oXzKf*ǖx*w Jgv!b)ڑIzBMuk_gƕ5̻H/LrxâQhu1'p=+vED7ρs9x.GL\^qG)#*QYф. s[}>8*|x)J:)W_XcQ5.4# daxSpWT>eX{-Ìɱx$UzHh-.ETad))ZBI)"pzJP,j)Q@"7Btc/K8:IPAnTX*%i8H :FfK]ř8<^c$]ԃ+zj58ln@_/׉W콒<*XdC} s]Ovuͩ\ȅelrHNXd9w9xx>d5s<>ܕq"p3QohBjPj#qkf&% \aD0YppILnXגh$(@9+.ۢ(Y `RVr~k{[(_BXu%RDs/^8_UMwLr=ؙH3X>Iu\at%>9Q:„z7٦{ӆdhmaIg_0gtIM9qk.Rfj#m&w >{OF{XxN<)ˋvW>gGyK(nU[;5c13Ϻd!HLЁi̶>,qD;##پX ?cC!a0D/AM \NutswH˻J'20z%3aeF @_Y_pSBsU{3񦲍AZ0-WS}gxܢ5Ǔ5p[cnhoMd-=P<9۾i;\pKkBݻjuh!ɛ7=K{L@T 8[o:4.O0J9 3{jӠP@'))EMWNN_TG.$q0fpqx.-jMyLEWH Շ4Ab>o%^"LJ亿Q NG$0$q[43*zt3*|bgb B5fKTD9SDmß.O>S"+3ƦΙN/ܗrڜCyxu`trӞ   ͢Z&>SA q)9a\ZhiZlML򎜢S@A+ "08v'EXbɂJ!ٯzj T+.;ԛp yY-]\PrIr Nj4n>Ӑ?/ҵm ?}Kwۺr94=UȮ\nO,y;X0ewE+W!Z6&)2T-`G#ݒƕăA왉ѨB" -!@7%7lH`$xY~i{nj*$mh[ZZdM-'#a#j ǒIXMK]ϐ41N_WF3mBTS4ǼZTP,> 4u Dp9`PeG:ˎ4٩FcrI@"/tsm졥k^P]mZ+ FsDsn7ԡz)6BSWl\p8d/8yMlSsΫ-*g\6? kŽFHZcғ]XڙR"Ndm{5H#utL׈keR=#]3fa Ui-M9[,6Nuzg3/{n7NܶûKfAryqDBCU͂ЦMdP8_UslWgPIj5Rrc+0aj(8/e / 抗rG]U6.QqXeԧ[]l[ƴuڳٍOF l퍻~~eۉAJgf}guvS'Qjg\>^ˤ8[l(5 송|삫mOɹES\*V6CkӛZ[̙k -̟tJphCdx9##m#}Ww Pb4 <_M8TaOEߞN>|c'qO;IyFw2764q#ͣ/Gt<y( zhV}W.KUcmCR^IH\ H3bdC]x]\:e2eOK &,v[cZdzqu ^sSde´\mcCÉҫUS,qW~\R7ML e+0#H,,)7įQT] \~{UJOJ FJҔתY Q81MA*:4EbUfb*U4WQTf!Ѡ9uI${\6/-[:h+ﶵ;Yevb\=}ߪ.hI4 ?]:t|-OʨQˮ)661!~}ꯑw%OC*A9Wj̆F_E5JzY#]0ƿً|biF](~T~ 4MU*F"Qd~Į2CPPf9SAU;Mrziq:vʫTWk\E\w+5rV=Nb*!8ZA{np夜՜ShlJiT^ DF,"`O uވyHy͈)DsD(W,A"∲-CNYT[nNAvܚl;W0 a|WZ ^A˴.DqqT ,BčX8Kd@CiמnJ:r0ti=ԷIiť wPoü>V`aNG!@ip˭6 UU爝 NO"qtHJ1[{$0/ fTͻdʘL7Ϫ,f@61}RM%NF\jˢ?|,(4B5FƀM.+Z2_bTıD K)laO d 8:Y2}3toaq~ݯ'7Kp{gRBMOd`;fucpk22ĶVdWl_ڭ$$MuwJo?s_2D(j;@:E{Y ΍z3]ؑqQ3jdS{eLr}TH1!X!]ґRFW*))M@B.BqwV8JVU Duwեמ/y+;x]Wq9{ib+pew[sw_Jކ<\Cm3gcڇMR7ɽMRB\;$lz[*krqsal"JUs6h(kUHL3"id_ybxeM&k MY;aa>ߺw B}v@PM-3:ت㔸9_R;Ҵqե7 MJ$f e&IrlXS6)j쵦iV{GDq5 g 3H,g-6Xrtn'LkZ֭t~PsDxHHu-q H`4[Żâh+ܺi_\G;8oelSy /Jҫq%V(fxITWׄ^,{dIDDNeJBT_H A(;%s}&pڜn~yJG+$JC$$Ej( B6TWx F~0xh!ћ`&\2> jPc 0 psriw1i3tt8?t/VJw g$*~ym ׎n'8amܚ#<:,Ҍ "YoaݼL,M>V9Gh \Hs@x f8 f<c6 FcX8pAtc2pcBƙǸqLhL|3v'W…?t*Yitfѳ4vk]+22Q)aoYW+4QJZt'}Z&2Y'ZI=ƯVfdq.(4xsš(/NJfd# 5v]ԕ[(o#1VoekZZ\nQx0ʊպoWaՍ߭"$HXE?JBEUU],?krYTVMI$VHUXTq"۾TCNLmg9Ex7he-~礤k}LʻݳW}r:];K=7. ߉4xwIq^Ut9w%d$BĔ^MTo05U?$+:p~!93*pu\_0Z,R>xlpq=?OjysǩOE2Oc ju qJ%8>VEQ/)B@ЂGUuTfdA_=|xrw깶2$=-37\WWzZ&ǞoS/]XO,?Dm4&%P@ pT8 6ЗQ_ ~u?< ZYqTE BJ>a-޼:ʬVϨxt谍b!UB(8*%5R\F [I޾F=iڷS]əQYl 7|ltF2UǑܗkp+i)3%U7{&U?smnM+}8z²++Zjko^-Z[Zsn9|ۼ*Okl>~Gfx ֬(q,z^8ΝkEfn7σh?P.s, ea?8߱>fc&2f[%j9f,*3mtaqeX$/ꥼrI^R5^ <=ʊQ4݅x7[m;.VZ K"zC4rq!GyES 5<7S+q`/ފI-Je . ׌KW˾wxOG/>?*hV!7* õ]$JD SHkpRZCVit>bͧ?gtKldmĆ\;mO%{CQ+3חq0T9$e~x?͡A(#TH8CVg*ЬHIm '<^mo8p\wn9Zll̍kwc:Y@>!@|H=mMEܑTqC&[`| CJSYx4!=p!9aLiZ,*Hbӝl)vt2h\7OJ^4ىW%TGUm߯lR=dg' ],Rm|$Wu_m*G^Ms~ G*\ |JЗwhB# ة;4M]:Bw,BMIlIiC%֯b$~.JoFq}~G8xĹI m,y7>5.T#RG~/Ѩ +\Şw4˴ϫ P*.zܡKՒ eLEoTQ I!9DXylxS,mJJ4=ku`pqƓs>vV]7iJ--wwv>g;Mo^e[ZkI: j@+n'.b;#}.ϋAEx}^\m_ߠsM(+řk|x%S_S1PMλ@ c"3,L,h$εS ᚬp34c&~fb)>7۪ wƦLŶLyG*'e),dr-xG Aݥ~J&odf: xZ4 ei))ٝss;[)uTM^`MΎLglN #|Fd)dfۦY^?T>!8ّuQzP?z}:tzD싨%JZE@~x#~LN,%o3 ?p}(6cD ƪZ06Y!#x#T36{;+;>$y) V]gDӾiu9eIf͢y{xcWqbݎ򾃃LIÌ5s#dܘNQK FK Cs 22tNxK82Ȯl2-[`^Ñ,;&ʹt4 Ԥfn~^)ֻ}R5xsIҨjjtkNW6[bC7D".2B_0SlM֌ݚ3OF^@cOv)'ށ?_*`y1^_T`L/j%`+oGX]7IT-#C__CC_u>zA}__xsr>8ĻQ$IJV^1*V<Z^/%b^*' ˙+UqVV*6ELA3J2xhQ*L9M! @W.^($` Ǎ4–KSWlRYI,NEgD\gZQc{[Vz?mNg>rϬ}S.`MmLJJuv{S©r+V:Kk.[exTJ%ݍ}'< $uxf1(S d@s;2;#gSF8a6RXCLrXyJ_d-|cio;͑ok9_V5znAU‰~!&? v>ɓNlO+5\ NJI +6e4- e-\P]E_.꫋zQhi)kG mOTSj>HUɽ<niy\6v{FLD ,8 0CVw - &)ۥ?~Pw=W:ㇿG󥥥u)('7 -6_Xp8YF',BPrbI.M߀xrB19R?^q6 "EFX/o^xfygѳ~vί99zo@?{.# 5x |Dq4;IB |x;2lZh\ytwU'6dbIɩcӴXJ Nj٤ ϝRhT\*k02Ǵ NYg)=hlTq64)SI구DҲ1U|.iZ/P̔":[@9CU%V'IJ)E5hU6+%fdco5̝L-~ 9@ 2ZVM`ːT;"0>%sgihi|v> ;%''^@'^ĸm ǷIkJFTY_[X{-1U&Laԑ*@L]c01ӹ\Хl ;yщsk'$]+[ZQmzRs01@IAbVQ([OeqG+ɖe[diWʒH|  [ؖdM7 !$MR4 Kk Sڦ%'IӖ64isMLO}F{gΝ{;3fAjn;aO5!{>1hrud[27{sY"K!ܞ=Bo\KM XX0t檁_779R+ 6aUEwVƯO@rvg3mܤ,9FY%U*;؂~sď.gл)X)S-B@ kt]XaQO9"*!϶8ϜEYuꬥHίq.޲nf77\ZKQkWj.Ͳߵ.͢I#d&t + o0qzTwzۗ4˒MĹS:ψ}]Z%V#SF,]1vKŖwRBW96o7p{Q~G[\uE_2ѩ4k1aLh{_uR6*NjI+B|RYjjbiYABrKɲTO/k)k]TT1,hёqM`ykdF_z,,l[kƎf?}ӲU,=^y2ܾ̫mN 9Yp٦60# 47-"#P i*jt6'P CgaO.r~) |X'1uuluGfmxQFBkWluh<1 Rt;^Ȑo$7|x{#K,n/(ߓ^/; нU.el93b#hCv^}߂¼^Ҋiͺ5+9Y Kz6__l.Ԫ {xD[Kv[6 ]E%Ņe_u%|T0cBkT{_J>p=MsZJ_ߪu^M jIQcjڣJ.Q[jTVd)f::F5ֱx*%#igqX#4u Ȳ}t ㎏i_BH"?cS ر ̣mq2lðuRfX >?Dy(x\1C@(٤o0 dx Dߚv^rG 8a&/.q@|Y'Tee 29ya4޵\<˗|&o{nbƭv&O1Yaͮ,9>ÅkPִݘe06:CsZ ~uޣ,yUdc͟Uz<9]AVZLL]_gP&z>ǯwpKKY]m4q\ᕦN&~U4ȑoTYc-1Y=32 Nɼ:^[L0\욍02 u52!-ʠi*ٟ3/Gh+sʜy'ksyT9н77Z$~'H~Pml ~{ QESS쀂A6o=Ju^RPǼD&~#}T2/E)&x!ZGuZHC}I_eWٵN3itTeCMVƼPPذظܪjծ771onVkc6~D9U/hl2q)Z5+I/^aUZVw2SVVd0\'S 6c8E_aaGhnc1vdؓs!=͓JyR;SL&ٞv.~\K$  ^7O!3PY^238(/7G6_r#~>z=pwSFah=zqsy119 :VhE)q&೴Z%'p-\'rrFpG[v<y.b++٤s[I֪X6 YaȸUϮŎ \E|=Mb~i{4r΢VG[jU5tXfW9EXPX\NϘqW{]Y/ν/ZmӤ-fnB\^G&]ڬ_#j:jؚ"/.ج\|.([!,<4wWB}u5\vݮ3O@ /:*iWbIae("co+*v*f=./rV] K)YV/nrJ+r -M*Kj_l->ӸzM{nPp .OjX<[zAhq}|_q%@e ɧ hi/Gd҃g;FJtcѧd9yVbdyAop7l&؀6kLW׎ɟQ }seeRwͫ U6O@K@vsi`)g]שXǾ`"*Nro!*,y?+*9 ,I4trKnqh'vPT&Eb~1PYG[FB(|ߐ%=f3bKP'>FH:)۾qNYCͪcPETh=ZZUFO7_G=g20.=꘧Qz3Fyt#(>8o4f-W#8 ٨ݎ *Ԧ֡jր 4vB۱=h& ~$m2A_=)Уh S L.es{@ֱ0`8P1Q=^U{iB[>F (*@ُ~K5QgP{Y|\DP(.e3[PsQ :j=~Têsau/ځ?~;6/$XH:`=aW*c0{Ye|6̴9g?T'IWsL+-Qۋ?q)yU*{孞<ߛyd/)R>Vf:zW=mf[-)g@>ghXG@`=N`CKCnkg`M.31MR,>&R6)$i%8 p>&p)4D³'ư.&k^|^*xpW,lLH#h$L#nin_<ӛKCPlk۽(C=}DA%]R2hk(RRٮcR( Ť P,-%bP0YIэ)$ #'D0KnDH]D,cPTBK &%"RpHp12q)!RS%s!7F"X{+Tၮn,VDǣ}P€X[;27$9R.4Aj`yZzwx4Ib&NTЪ! 8PK"ԏ Cݑm}J`SP-eF aP_6zlY޶m"rb(C2".fA1u hJC! &V@onn0s9ϼ sz2< RF]AqjQ0@ 9s~\CZꅼ8 K^A(9Ʃm%涒 W4oûfk84$#uIHcٻ!Ox i[e'hH0f ޒ'bhVRp$A!s&nP0  LF'0%H4ArO%uPI~d^0{);.S=HZMllRNj"FM1nArw+$?JZ-% +Z!r>9T1i3 xMq5%&wJ=J+V^V4I$eI"R#eO/iR): )mARsHEc?CDsQ4ڿ <7MJN$@aRǥ}ci>MeI?{}349ؙl)5'NTw+330?s%D:KpMF>ZvZ}ſ'{/+^t\\eeG?, l}HxY|G}IccOǤ޳iǟ(x$~cKߑs3iG#3 꽝1gi+:D ̧g״:ՖWʠW(L|ԑr޻:$zfOO'ş=cL(aNY|`FOݣ=f݁t=@{_/w8O_(ڙ+YB񭝹^NwbH_%;okZɜeLK7d9hvYNѐYXx 3t4NêuM"Gɜ p t-::P2m RֈhFl)FқPy# +捔^Ӡ#emէ(@F#pIf(c(F|޳@mm.Hwӊ#QkHZȇ?NG[p19AނԇGFΑ@ٽ|Ob WܕtClpdx- _ 2x/ By endstream endobj 506 0 obj 24144 endobj 507 0 obj <> endobj 508 0 obj <> stream x]͎0=Or`"E2菚pR!}9ܶR3:kqU448oxSsv}blvͬOc-}Oo2I}ywgmsd_6N]M_~T_9͓&mes=~o1^vyץ˿S+φfh}85&<ߤaľJ/zZJRml ,gGlϑ y&JJe;oȕB3K1؎&g٨LĘBI  NCKbLq@\; ^w咭aҮ~k0[K8-Zl 5;i?ue.K8%.CG_`NjX#z~FGww{FRl2/᷹$G_O>x-<~+co RO ҷb۞bP?*KJV? ~1~P?I/5zFbOS% ܇yLrɥ)wnqK~@ endstream endobj 509 0 obj <> endobj 510 0 obj <> stream x}y`Tٗ77$̒If2e&}c@B TDり]E~UmmVtoL~t̛{=90>yn@DNTogBߺ!]5zX=m҇vx`nRQ5L :wY?~/DD/E1#}7@|6Ι }&:GG6{5*\?:68\}:/A埠21" )EbJZ FSXmvx |@8TREcUdMm]}+G9`f˩ >9{%{L-{::~>ewIЇJ0F@;5q, Yp"Q5m.p FW4 hoCj@ W["E06Py+&p4g[ӉX?k) u[L1;]urT,g=iR)wh 1trr3u_GZ+>vwwЀ'CY$_TSk=q֭e&dz;i0}d݀no f*~Ξ.vuݹ\TC5,[vje+͕J u03S`a5-Ç20_ /\5q_쵟Ⓘ\ ) dwrON}'iiEwmBWyzT S50x%~aWhwϞϞ$RHDtoS qtvYĨ]Fħ.Lw": nZ0S#V,O9.3> ~/Z^\srF잭׎kS|/-(Ħ_Tf맔5]RĔЋvzŔ֋hw-;)wuXH[dob& [)$5D iAS { |QRgڎgE=]'d\,dwwp1P \Ͼ*wD>7@z]'^@B`"~y0O!Tq%!8ء{#dp25fq}1fÑQ'" hOzI2m4gПNC~o:+'O#d! a$F%.qjF˳fK#  )5-3O@mYXtڬRX׶ӿ Lj_LZM$LL"P?w:X=dPTPAw\H0`'D= XprJFE|MfU TjFm6C!Q,fd9!7?b9)AħOBc^xyɴW@)DS#<)\%ሲ b;$2BQUJEU/4U 7qϵZu!/0/#(RBV;qEzـ"~n;Eie21#&b272KDbKZ 0 ]-LB'*K^_Y` ta^x9EXHϦhK^y5rG}[آҺp@z#o~2=9..t.߿<0h&0+{K8a)T |?yjGGeF3#/~םnePQc/Ś +@)/o@`;wKDIA &8VQQ!eff gzf!P TVXC&JbJ{hn9<=£=2һ{26nd @|ɴKW7GSSƚt;Bdw8sM@-(ǂ!ް`pT=ooW\o UA} T~RD"*qPubZ\t';ҔGN,6$!'$<{g=cHq]붢mQa'mfMoDk5 0 Y`F@#.r 6p<MÖ4Uͭ:Fّuj}eL*WQ__g*aeP[WmR-3ZD@Em|]*QCt|ãh wBu@&2Vj54VC)H^b(bv]qWʵ5"_r|&;3a!wnb_~w?X]JD׾>1w.Zwuwmք̈ͨϼzG֬,X/yʁDN+ۡg(WMô|Q\t&*Kϑkv03/p|1 )A{k~g{wW.:Pz}Ě-c{O/]ɛnZi=.LJEs"8\E"^@!`8q!\K/v"D"-co.cAo3|TOO!ѪӚ"j"g9Y-;K[Tu+WG5 2e;w+*wecQ)+)PxB^(r9@)Ŕu')wGpu=L8S8hԀ˥`8dj,il xe1"C8K7"t2ŬH 1;[$ 1pöq"m,(s7lX\_G;Hٺ-W%onڳ[y&xzxC.ZVGk b5GFW31|xUz@̬BvԃAS-QkJd Drs`T^)$omAH7B8H/yISCcCe3nLS eh(5؇BRL(xgOwօg}V+zV,Xֺ%1.ϭWH2>_jaOuQc7CZZi[ߖ$6]soE%Pbdx|>\ Le.9'as6 ߞ~n7emߊ/z$􈇍G8Es"^X‘%NIHR+锬lTrRJXy,a>1)<=Ͳ\V|fGE7גBlȈ`$7%WUHsx~aO}OѶ۫y^Ҭ5/M{ճ:OoPZ|=J9\:"~ZPhuԒA| \`w"2L{1UjOhž3\$N]> ℰ]Hmz0P, ũb [{,ridњήP /D508 SY:ò9S3<,tDɼKh%Ƶd}[TSǿO6*TZMʟTuM1ro+ ?!u q[K:ubZY~n6#W1yR#r8`~ȦgMThU1.;Dbqlu_yCen߶vTEId|㚧e!_/[`]7ݺo9*h5ѢXUz y򭄂;CVXSU7AsWB5IFģzX__,R( IG8xa$/)䯝²p%>)l4v&o,-ݶCW[~LݵU+(6({yP@ջ3KH}#ܿleU7\Hf~9yk|I+\ J騢N;ܦńP(ဘBYU91)g7V>R@[!{ r  r 6L -1-Nw _`X:u7v\Y>tn[Oۂ]o[[O]2ls1omYx"Vwo~oOٽ*4h$d*]nu/wy }]O8 [TyxI/W,aqxx'8NU/ȑbiJ5l`R% UeUyPoNv8!F\>Ɣ~o)ƹBr@ONFiSȗ)E-9 Cv"U Dbg6/JMW> זԢ;J,E'Jni%aYQu/aށ&e͂8>'ܒשUzo@oU'|WdB-LDZe$-Jp A # :fFDG̋2(_w1R,1y.}hF^BqM4БhcH2p8*+XGT8pwcĜk-  LE#Yt2YM%@µ+OY0; 'OFL%V .v{zCV7&/xq~ c4VܡWpW+H#A)80:ru/Ca Rx"qIbc>*E!K W #o&H|&?ߔu{{]+M&R>̀↹mܥUܭX" Gט9iBb7EMkL#`y,\ H|?BDE͆NQ4V;,ʆhk 2z2p6,ow/d+Lވ=/>+Ik5uSf?{qCЛحshMr*ZVVq 7RXdw|c;q>HF{=j_gomK$bU'QJWYȥB^)¢&^X7(,*P(hBc0y0TV!`h1ltKIttXSJI@.GgN`=#޻~ď2@>DқF‡ui6E'GPcm٭'fyv!̺'pX*0 +2̽/vO2|B6D9 H\uMeKhrmE+k2S^oc r9 cwsv_#7wqς?ݳ^2숷M:gXti!>})θ[ÕϨz#c"Icǡ(Am;i|^І5AmBۮn b@/F(hd A,p<-/b#Q+>}dŇ6빀ӅH1ׅ Wds]4er,-ujpbYA~²y Z I?SO 6vBUDaBaYV}-qtO dvqxsm?Nh@=AQBM2h(&\K Ed2)^g)AևK&x#JX/u z|e5>gŴz3͉G8|2:B'd> J@-RZ}7Āx+SFY2,y.x󃋡P.Ԗb6HEBf*יX]˧%!n$O})A,zFUj:I,\ob#5\"E6 lߥ]TH='d8iAp|/o(q|7GIHvtCC"!zp R$@"f:מ,i;hH"F k~4KjHX/SCky]IE"پ`KPϏPc=^ &&-H bBR(F#T4et/=JS4҇iư^DEq+vÊgP54rR1'XGN# q|};_: 7DZ#p>́|X2vt$=!9]=VFrҁBk| $QF 2֓U\xC NЗJݱR J^>pc q{M nSn^MgWY›WZ.&B[tYPUzzzmZq{xXiͬ 3S ,$) VJvJ*PTfXMQ'g>%ȟЂ ڢ lW QDg̉iJZC&{[޷ow3$50v/k[q<<*d;>; k7n*s~0'40RH ۩m6-BH4*- {(Ć ]Q8/<_qX* IIY2$diu:Vzz."@MqߎKe>IG|@.̤(f.7_iTt$|qtfRT ڼ$U5/deͤP^O{VіU {,.=L,l!"Y+s2)],i}eV/$%vW TpUj96s@B"'aC+tf OuhF(TS'2ٞH $FP-@0"DszKΈYlC]OR&HiiAULVC@Pa h?  pCڟ' +ɗ$HHb;~G: lӳDd}wǯ#D2$J-0:94Cn;FѮL vFaoP8&< qnc$Ϝe_q07效E4`* Ȏ lT>^wI;Qof'd{~yoLH|_p H)7sNO%B# [J'7YOЁNHFTS{v'

y[nsZң"s7Y8p *qM^F,!G@y@㴌t=UKUvDL獛eD8ȏ,?o{6SGh]"6P"z3?>%z#nUt독XFntQΟ E$5T!JF0D \a5-"P"LB@ 9)!lpt5ir(˹MR<Ο>Ȼ#!? h@H=kv@>yoK>)Ҙػ ÅϭG~}۟J#u3_ >Il0拲Zp.]LȳʼH3%'\9 %U֪Kܞ Bے@mdG%xr A BT=GX+O{Z.h`LH%.~h s`v?8o+WE=AcJ ɰ闇CҢ'D"3o-$+%F bDH Ȁ B!v'4<`@`B#YU~)"Y$~ .IgCz^Iqϭ5_w~&u0Fyk9?)نLJ^_oA<8ED; )SvBJF\JA [B*:&Cb:AR l|QԄr ,(p߉|MBq\u:]eb́s³#ν+cS(Yl?IξY7[Ix^WzpyXYe?ubbX׻w :X NeX+l]+I{G +#WgA7E )l'|HqBb $uJO>U5UMQޝ*+-ni\q. b:6' U퓂 p28))Qfgsͪ1D[~j^fM/[| !d6_aAGg?z+D̛TCu1}OA- D?{X8)J@5')N$\xI9ewiE'J]w| }DgM"lQ$EI "WIQrx|*7_f/$ %4L.ܷ |;̓xGazѫ:Qy+M෧[~"EF>" vN@7doy_ݙwb,-sBA҈N?'#[ю?{ }4&>]`w?MFB!H_R> }"D5+,#<áz R7f}(eI!8(Qȣޓ8ڞ΅IMYyoqg%7?I[a\/7l.OXuY, o~!mۍE W|2-w'Cq.h+ٿI6C38qMa(%+*a텟F>s+fzFGDh=f~C~oa8P(6WQ{OR1CvԠvR;gF733oA?v,@Anr}s~xS_@A}53ԧ "TD qjWAHg~Mg#I޺8wϜdf~ʼns'^`$C+'gn 5kԟ (l;3S>{Qr m?)#,[w hBp=I{񃒘uOkzIvVWuM1MLM[SjFQÐz ƌLs29yzufbwٯ?(pqNv]Z/h= ,ts\kG:[Mh HA2|,GN;GQ-R( u9Z <2 VJܔ)`&bi[bo4H@L0di.'9˓,, Whd9'G @4Gk)q\T>'|NNWg,GKÜrt],-ohkYZUs4,OĨ\y=KKQ9_  4,- |9/`i%[ޓqVa>h[YZͶ*G_ci [!7G~ 6B_F{r4n-l9gy`ysqlu`dᑾ7Ecˎl#G73[q5ã_Кј߿uV5oY=7fbԀH?oC` Ho׮c϶3l{qyW^e_WGGD>A%O Dv=+FlՆZ# s׎>T2 j0ǀl5X6g{ނoBuNg5[sSn| (Ew W9 q4##Ö!z5[;Ζ1<@gZ)-{ͥkWW|#G [ؙ܀J̛A?:یj>t?<\ WnygllO ;m{3eye>e[ώzvܗΩͪISڱy5,]ޫ/}9nۏVy3QTAk{ z5q޸~<|Vf֣yRs]}iuN&7ִNb.= Rtq$;q~[ٙ}fwOs2E\G6Wnag38n9ZZrny~o+r}c\ڌf8z؆Jgg w~^aqsm.袍l_hl}-@g_j7["^ ? <X/ T 2-/k6pN00v0X p\\[J 7rxq|K? K|ƾނSEħ:ҟ>!?#RjiWø"r[rr]Ze0|s=l'yNo9tm9|r}n?X#|m-̭gxJr`%NW85N򥑗H {b8{8.bK "q~<c-OO=dC7L޲>?>8 .]~eĽ?`O|Hea,Xt?,C%),g'̖~[Isg}Feg$]F<:i\?\>k-6Z޽`frUQ ~U*⪽!x˕ݻw{v5[&v,;w\.3,wx|ۻ~`]x@5P8H X7e_XDx|:.e"5$:Ah% JXF]z {⑬B#!ǚP$QhN Pp5Zi{= S37hY,p2yɛzyVm ^~S2Mcp4Qx9.> wbvƭ'Oמ WHz!Ԩz2*<2L'9_gUP2*IA^ZU X׍4̣>^P{Xa( V?n l[} Lc·!൯LͰgz Ԫ/>ǁԞAi% ,_c)m[[" endstream endobj 511 0 obj 18727 endobj 512 0 obj <> endobj 513 0 obj <> stream x]M0 xWdr臚pR!J== CVqXo_m/OO2I!i?tkkwm$ kꯇX0ߒQ{YZ( G9X?:a-4c?Gj endstream endobj 514 0 obj <> endobj 515 0 obj <> stream xսy`յ?~hKZgےmɒ-/q8^qر! 8 !!!R0qԁ}y}c)PZ4GxB w$;N]?X9ss3w; 5%j6qA;/ Zػn] P{MOg_46bkPMɥbtKtY~h.Ct} Ǭ$g(έE܆=[c]:5пieu=niڄtڃ4&HJD%R\TV7Mffwx}̬@0;'7΋D bE%Jgs**hY :P_n**4ɷ;SdP DI^T0`-l[zlȃ8&\5 `7*C)xjh=,ð5*Z M6Gӷ8jp| 8 ]ׂgZ] ܈,Boa  ~`\@ۄx |A\j&`xar7  FK 򣑼p(7';ɱj1gNa*B.JĴ" DFei8hu:m9k˕9W^UvյkuOԸ+pçA@7ѝҕ׺&̕F&j>"}Z.tWrirDaM4$ʜ mpV `"U%sn36ER+'} sNg?p9*ݝ:QO[fc5v&(Ըpz wQUWdie>y'4ZTv+y:×&uc[[[j7j5V %#Sk=v~Vzh41ԁT"-kXWՖNJ@9QL1~Ak%ʚ锎t JpP\7Q"|)qATr qs&`GWtSh/wMǁ5n@ǁs;W9}t}tזVT5M0k` =Vme B%>u2XYZ1ѩ3$$Ehl<)fOet:t<ǃUbb5VY|(真1,9;rw]0!MԌQWdNvO*BWJZEXILɂhN @{ NZ[K8F4ZRJIuw饄ni_!Z$ QQֆ`;-4bMPC/p ;5N *N"0Q"^7G ; Sb>"q <3c3wyX323i6{=^La0>$D$GН 05zMgA,,حq5p+\!O緄\+[FJ/J(GK$f-:IM'c&uvj2by7MҬyMuOA>ꛣQh: \[|o4dh-Jy>3(Q5 0eNZyHDb_ <,86.(j,y:ZYbg;ZRPw_țH"j'ߡ֣XeYF?en#8~7m|:;ݜݑM,{$h. JuJ`QWgʬ:SRzy[EMMu}u+;o=38?o BӸϿ7~s^zVޘ ljd@df稁{yyy06&&fvD "S8q^mq[733ϩ]l20*iIErmԷT`j5g6[es+GdNאIАƂAң(x&˨UB`%v dbf|8/̅h4 9B)#4>be'g4 u?iٜ^_e.5-vjncD?(ɺ ϮM+8k'%_td|2K|jj4ʖdYHۤ[*-b Y-j5NrwĈFwB{.da}#ҮiP2,ry> _[`a,x^ Ԥ%s'?ܴf5to~eRikkG2Vrǭ^$anz:V@AsoO0&&5Ԏޛz0RXF,*KPz@S) F|\ 6j% -;Y,; OZ03fPnogʑa\ &&q!BMxtL]1DChUa]LeeV;nĄM1sTepml-.֪q FȂo0L4bZ%jR!,;5 3ǒFoRҎ.f>LRu\(&nҨVbdbG %JfL"~&,A h t’ 元)*29))3M;=sVÌ,vrm9`(u P*'Kf/[EvYh7GpM&$$Z٫;+MFL[Jy>H͔{: zv>u4)59mmn3?'v||CS~|Uc뮡NN*81'v^fNo볲g%Xs/nr> 5!W3=Wu 8}h]M1AXZZ:A9_5囝R}m67zWW7J!njj& mgG% QPnɓU%$g`hKz6OKfgh{Le_4}LQҨҌ2,ff>PrF%{S)3) v+D_.%?eVY\sbi+8{W>N3ڬm&;Ҙy_דm߻r-1o!.r)5H%(y_X$~/Y-?)I9A=d>h&WIndܣ׼8joo-r$0#W"ʽ7 ' BhV7bdCrhQF˘4+#![Hf5l7įݹJ^֊bMZ+oBFIj!F>,;.kv1L0Dt+T#B"a,bJyы㈧ WG #Ep&=DK?rpKGBfYe`$pؾg未N<)P)N5Z[gAww\D@!b1?gIfq8,C5dZ499-9P=)aǘ1%|T /1=!NBŠD[.!O4iTCdw=0p *sbEFO#ђ)17(tdӷ?v_⎣N8T~vF 7,)eRxSrj&!"LD9>lseCS](X~.}W$ouـVb4?|fobEjk FLɤ:nWfD#"&Z2j h,i΁ l LjgrQ`D8^^NSc-P++a0*ǖoxح]lCm[\mt7Wǻgnk  I9j3?b2xh-@ɂhqdqRS#%S;Y'I’~ɈH 4a萎\| : ){j\h{_ s,clBU#gd!Vle#ȁWH_%< ³yaL!1eM--ÛSS@vdx-ia|-6rjv~Vww5[m !BlC c!,-Ǟ)J>L>PMު7 N>.y:n3!$k=9); wr jie\mXfד'o#a 0<2͙[mmM);G2χr` 7[ J(VWVt vW.Fx)#D,B )w >=tO9A8 >iי`Y0>(r©iLt)l1ӡ7~';f rKO-/l-}#PjՈޔ kh5*<vl٫ R6ErHf9kn΋ټZ`{%FU"^sd$M|xjDUi)ǂsNED8/I$"hkf@1⬣J9 ^F"㔋`SgcWcdBA@h!Og. _N (uט o Mxlj:8?I~.8tx6|K@Nn1Uˉfa ksFcDr# LEfwNUO'ZH~ߠ;Ai ˙BJ^3QkF&`[f$7{Yy0 Cy=7Geտ|&q1|<: \^fhaҭ]srK>0y |_\]b1k+}ͪ@ʰZ~~ߟS+>W'z{W VWLKyb.`s=,>Pu̸D@#8;RLB;faƈ1YrE!b- $4W4b]o} f K-[-Z%3z,n"*'?t*e^Ѡu\ƔOF"i@T.nW׋ #j\&y&qyLJK3y|@X-E![$TMvBUKv{_J*?1-\mZZfT˨/ 0Y^AI̓i g`2 8hhC/g|ƘW BvݧCS09 S4Fԩy.UT+$,.>6]N^&-krx[HSSʺ:R ŕZiʨ7ƛ/yt]D&PrWƊl$R0~霿.%HRQ$֩z[@Vf`TJeYY]j^fO.Dj8&}<{l0=ul @ ruN(#$xR^䄜* (L _nPr>Un@`_$өw:%\Ŀ4zdƍZckeIoɴq\ q~ \ 7vs3)ϗN W.=x.Ŷwob3ܔKKMB,r!ܘ2Q}M&³%bZG̀133Àq&5m)(:Z"{rqTKbA ЄҌaE<%jam[{νH˓3c ֳKJwskj?ں7m[aG7?=`sߢ犞&k BT-W4u:Syזı!vy TN\wrB)7zS+bԌ谨oǚU?/Qߚ[Bt_N;m糲stF]H~|zWw#5_~;v|޾!XG{?jm64 }55arz8G"ˆ$ "1w@: w˫4X(Skd^3|+NDE~"b#g1\Bŋh6Ʋ"\-uG#x8"TG?L26U/V./5h;vZts+^޶YJ8\-7λKZ^5;W.۳pc57= .;Y5J/[.1,.ܖ@@:2E:y_he򯗍PjBy d^jkUv{wxĤ:VYv'TڣJO}UCBO{Us]պ!ώoRXZ:{ `K#8xz* #J?y00ۮ{ d\0%, , ~NMg.۩vJST0T<+JM?>?m \e;.=p\=\FNUJKk&:㹕>2zvYoXjqm6L l.^}lµ=8&ٔ3T&XVj |B¯dmVollg_uyѲ-}22YfnZJ{])A}r7SL :i2}jf3=(AJuaARZIBtϑJgk)йcAM>msXi\ƱLɹ|h\d}|^yL^/EjZ.]&_onU*C!4=SJC7n D@: v='D26)!9iݨ^%=9 FDuliUOL蟚%&k͢&G>N\bk(%a1 =fs C0p.hj`(S>?IܙhHkGC)iT3%嫔 !1it;}=-RT+b%OBT$&ĤVp'Q7;$+B:-Q̱8)# -׍@&@/k_%IYr/q3-z +ҋ=.4p dAd}TvCJzAHs蹃Vn=!,LڠvUuYZubG%&{"&0"χ\Vy?loTem{ܫDAܳR@ӵ⹞vHƸ ˸| ,#? ۴k *$,`(ɁV5'+'o?I9Y#+EVO,@9G]j w+jUM< j0;4yvlvċ=|x,{9q#)"LNT\iZdof+PʺȺrj^\1$\B]GS]+g0 "rw!Jd6ӒP'sۖ<_6 V@Bgi˹Aj%-͒ sZU⧓=sX0ӳ٦j/`{(ikm/u"U& "=7%67#?x3X Nlp+vC.t@::t]ұe)(ߟ\x ҸؖHͼO))e,@1L\y(րl* %@vhV 8㴈Cnfu663;h͹p%.8)sH:t`^O!L^o>9iЖKq-ܮJ /n!'Bn:Cݐ|?;H<5;l'_ -O$ށT\<Č]H;ʦv$MI65)Q4GoSF2aMd`fILR(Vi+< Bq\Xݦ]tv%CMF>^Od2Bv\oI)qҬqdVt(h ͥ6SMېVSPSd9aה]O_'DOQm'V}Oe6 /o[_y#Z6ҥunWҦؗ@Ȭ7cbq1"B" yT\ 8Y$J VڐyNJK ABo#9/oSr9 c O,#rbq B{$q)tCzD=ĉdl,gHUGuЩ7Ësʷ荢Ӡ5f/UZ [R]ʲ}|uR[A~A;,dd-Pwb4 + r򓅽魾!ZeW?nIodÞ, At'7֬',&Ɖ?{[|cxCJRC9kW@вg,WaKN$J(yr< x4s>+2e`+ VE7;t]^^# T`($ !Rqkx؍v&yDnyL69Aߗ b6#Q x WAzw&+eҾx?`:`$d(ojz4yi^lc{k&ҕ+*M޻l\_p$L#j;>w}7I 70/FJ&[ݢ?#y #yG݁8qn{ȭrnx 3;x8-_{wfLZEg^!K%RXcX F'Ȕd3(F nUv 4Qh r}V C4cHq@RSQD[[sNCVjhxXpoB +Ļ@9ހGn#xRgjz_aǰ9kD XsIxrV{6{HoȑaW}C40/LtH7qNDG>{˗FrJXiQѷۆn}# G{rLݾ}eEܑ,zK<YE[ ~T'y^:ϱ+%enOگ"IG4bji'71*Rq2 q{EP~a4 Mq\Ѕ8}1=]] Du5BO?cKoȏQ/&%;NNJT.Va,yشU^Jޕ+Һ7?֘W5ס!liUg{"szoXF%ݡD0)ay8,^n#Χ\!^,b{J lӖ#=E]$ʶ|PW%O$g, Yy*e@^[MA֖]zQ\>F)yl]:PχhD1 +hݏ7bf&)fJ6sXB0?B4 PP|eYt&zx#rķ|'?nAqpv;2y=[F=B=s =6S% 0]EDsoFOQՀ%8Cxř]a bZ C BҤu&73@1SMA2S;24O !4uLKD'_. ߊ No@9ǽ)!5g~51X?\xy ¨95VI;c u s76475q|n6Ym+-yE5<҆=5hlxyWbC>^Q5ri IM *^_@TDnCpKgʔ*(m}+6KGȳGNҁ2үoĽ~nᯙSO&. eB~ޔZf1Ė-{$rh&nzYNbUqV:ר(0w *@W0m%Ԟm*PglFP4)6 2c2`Fƈ G+D&9s͞808?zQi}|YC&v`.wՏoMv)rIQ,}ٹz\4ő珍&y.%^8ZujAi7͆d`M| ZT/(+fJp"b9*53F&v7cj$>o-l{olIxbIH{(c}#͋?`kj<ބ8eRW쓯OTٚE): `䏛`w!: DRl6vXjd}z ;?[iI(0X_^+\P)#",+4J#n9ɑủfJMh0}$،uAp=(䍹gg%'`D$\:L,Da+쳈opt>T2D TLg_V~36Cͱmy%,|NJщ׭np D.&%&uX 讨F 8TXS[bΰfJa1g,IA~ o2mJ, L~D;G@-n!2Z h3Vd(*EU9 j `y('A o ] ԢA5u0pS`iju7jlo?X {q ܓNyu=*%!2+x9L/btӵ(PI`4`a%Xi.M `k2IRDVS g"nNpw ˈ'4,Mtx3MSHF(]B|)A|! i6!Rԋn$MC"OӨiDrp&M6vM"`!iAiӴ|AҴXD4-E]ĨhYV!yKY IӈE-GZ`Kr@+p?%i7)VtF4MN#YFH%44,ziMFc@z`G;P4˟hP4Qx~e4W!vY$MȊ7i\U=x~eiͯFߛ)d'1-!K%s;qÛzP{w7 q}CUۄ;U/nr!܋-k̨} was}֡Z}@*ճa(wu۸̾,g*\rS e}z'7va̸t[d \Cw߲a]̛>wzX6ᡁ!gs_W.gUZ344P mٲ%wԜv mX-o)@8:A-:^Їr0T k]YrO ]N'%_ O_]押PQ.TlBը%T u#w6\3Yu5(opՃ=fWݿPWL%}6āt7n¹CB* ̃ntu(W{Ah CXbзeGu'Fx3FЅQ.QP:i(]—t(EH\MhF M/ŻB+CBPo~N ^T9]S"ܫ k\ 0Gn!FZ^}mG,WLT+Kh\Sw^mG[ZMvMKW]ٯY38Gːp)YڍR#$Gs6`[GF%Q{=Y=EE"q.35rw=pk.ȝcRU9x>kfCBY_ ?+cb??cf@3}i?>˟m9KRf~M4?@Yղ` /ul__|O4y7.ϰg3>Cx%|oDÆ/}փLt޿W`޼W޴Ū{={Q{3 N9wހ##Dv:Tef}~ǫvUS`UV]a( FR+t5gX!"XF`ՌFPhI r, Ct9LjuH]nVSd3I4c$ثIe%a%,H¶Dᄶ/At^X1 ֟`4 b9MP褭\zq^u{4ڂ&@۴ihߦowNto ?>[wi)X ; OWCihCSYno@TMS5("?˲"i endstream endobj 516 0 obj 17222 endobj 517 0 obj <> endobj 518 0 obj <> stream x]Mo@=H$ ɱcɇQ k;秊z0,ό=v?Ku>t WGLݒ任s~{eZSz·v> endobj 520 0 obj <> stream x{|ϝ͆<Y!D0 1QuidI&fw&@PJ E$bH_T%P* * "hSI/?M;sν{]YQeP ՐJ΢rOĿD"hN,}"gIS"R٦R_u/4i_)~xUexMl(+Iw!f;(\K3Xt3/8ul~OQ}hуl@P, #xls<*}P>ψѴTYFNK"ՋU\2TOxI4]mZ51eV +}x?pu*+V^%V'^'ub!=MS%[6KF4Ly -3%|HCzqBfe]5/iKӨ´Q-W )[4s2 H>=V(3.Nz[&Z!m+uS]ҺRmz9(MАLLOr;J,R[ζ6^a$-ض^=BtG,KbGџujTb-wX]4+h:r&LF|ODHpdFI|`ԩX-EtJ=jYP6;]H;oO6 [3Yi{muW>'!*EQBxCId;DG9; S|25/=Z6Ŧ߬f{[D ~-3+y3SGUGV,]t7zЪl/Ƙۋۡ-%o.vn84fԇmb?q┩?R[{˦Sw]֩$ZGAwu*lSs5{ ZUuZmcσ".~Y zxj=t7BwGB@ߣ=߅.@Y(ղ%==##-5#C }(VU z{4][0<L.U>OE!x1l>4--#5mxjH DLOR Vxe"=TVU!oJǧgyJ\02{ņ^lq <9A'gC U^ a}Q3J oTuf )#"3_j(uK|Pk2QQ>*> kC~:M#y󜯘MgP+?,J IV2 l~ ~6?~~ ^?yW]㽴VGY !x|||3'G$x~J}yԟem#ЇMJo7u_C{W.|I/Va_zT>;A}OX5_UVɈtOzT en 5W0n]TlW0#js['-9f3LWz>97(s33+-OzTz L$qyct#s5UzmV ǴmumqmK\b;K&VKn1S8n1E~pd"hGjh!!2 /[ʔ+"=j=huo8Ѫy\pf]C|ឡңkG6"Aȣ /@mң{SX?wT\wÚ:..Np 8G:Nooms .<ٸo3A'f3&p,8 3#`:Tzx xЃAuchV2ЁIQD$>F*j013r샱{U/'x8^u;%jj#&\Rܧ}ꊅ+vA;h8wW(RAזOOgo g_ӼyÛn]B^~ ] endstream endobj 521 0 obj 2957 endobj 522 0 obj <> endobj 523 0 obj <> stream x]n <CeJɇ(NA}m@f>EsK>O'8-B'UVMʻLTZnN- 7'^B/JC4ԉqBJPf⻙Pg:}ZnkD.Ulp8Gc h\y;nX$\~QX?m.$Ϟ+l{!nT^0m endstream endobj 524 0 obj <> endobj 525 0 obj <> stream x{|ϝ> $ Fd1  (Āv1$daf (%"BHHZ\PhAPZ"b)-mCs;9{̝⨎T*{ AO$JTz݂!'Rz+=~DEA( <ѴTYFxP8GM!Z.ܴi#5>FfM f:L7* /'TnVQ~TC{*ڣ+ V,'ir QP% SbmOiDyjDEXLr*ZF4vP֫{1劋H'i2fR2+%@)U"/M=UIh+4Nլ _ne!M8!yʠ5k]2Vr:K u5{_H?LZ-☺U40u^/^ͣ%Ӷ~bZJg2V9Fs^[nFe=GV3csB"Z7RO_"]qS^lh g˧R8/.چRE~oz6Ɗ0˖i<^S: &ʲtMU Q%ubi4N4F j涶B{Q5RSNIwZAh\+mތ\vNٟn&{ZA3 =x,ږ4SnFvF?7*fLc`.iF>_I F#ߨraslx̩W4˛!Mw*h \FqiFTPMfz].#/ݝzUJyǪ9k6EX(ybV+ZАaʹ2YQMkuե#ŕ:rq.UZT;rjd]h3(#{$S]2Z"jrUUɵEPD ̺ʦuU(]BMWs$\ޙ\˹ĤLԑTp;܊sn?N)7T>Z![yxc>,mO˅+cXyjx@P4JDGlPʢD~}ϗer#ψaigtU^r,SLŖֹMmӌ>Ŵ2Kk\ÖmO,+K;Yg--dN%@cin/n؟(,Un.$Nn(4_Nԗ1b/ ⸥?V%K;)TZZGAwu*7[VuQVZZe*8K;ɩZ4C֗\kiΣrOiצzmbh;85tWyuBǡ*Nע;{ͯ{;н߅>Ee\;3 TU`uF{4﯎TWJV 򚀯*f6F\Q:6N YSká*__b䛾*3"zb___ Y"AI4J.<~`/b?'}aXr:JsbGؘoVr3 U}`i|eq>kӨJʘĪ玄<`yA٦14}sڏ]çaM$(vC0#ֈ%G|̗<# gR"$5.g:\U* 8_ud?0#a(Y[^c|ِa гYe.޼;]yyA/4.kgwڶ=Yڱqө/wl kz^:fS/}m޽ǎ\M*^XM|"2luȘkZfϦgG[:e(vh7jc#/{m|^]ݦ3~H_?/ σρ1Ϻ{iI)$.x{8;x~Dx;ZYo7uo_F{__ep;ן{Xmx|QTnw`qd='#*3}ң/i(s ?mq2e& FEQߘsؒ>iɑ6ZdDe ?y9gȹF1^3ix=߹ҒG'qf>F9hk 1=B3W0dx+1 D+YЦ8 h lk[ ϽYB7%_lqwW<<8+tNÙ6^]U3"Tpo),P >+x{(oyMKEoG0߿c endstream endobj 526 0 obj 2932 endobj 527 0 obj <> endobj 528 0 obj <> stream x]j0D= ۷1iK~,AkZuA̓fOkK>'8-B'UVMʻLTZnN- oNŅ~gi-1pBJPs1L3ul>GA5"TYUlp8Gc h>{5,RU\~QXm.$Ϟ+l{!nT^?m endstream endobj 529 0 obj <> endobj 530 0 obj <> stream x{|ϝ> $ Fd1  (Āv1$daf (%"BHHZ\PhAPZ"b)-mCs;9{̝⨎T*{ AO$JTz݂!'Rz+=~DEA( <ѴTYFxP8GM!Z.ܴi#5>FfM f:L7* /'TnVQ~TC{*ڣ+ V,'ir QP% SbmOiDyjDEXLr*ZF4vP֫{1劋H'i2fR2+%@)U"/M=UIh+4Nլ _ne!M8!yʠ5k]2Vr:K u5{_H?LZ-☺U40u^/^ͣ%Ӷ~bZJg2V9Fs^[nFe=GV3csB"Z7RO_"]qS^lh g˧R8/.چRE~oz6Ɗ0˖i<^S: &ʲtMU Q%ubi4N4F j涶B{Q5RSNIwZAh\+mތ\vNٟn&{ZA3 =x,ږ4SnFvF?7*fLc`.iF>_I F#ߨraslx̩W4˛!Mw*h \FqiFTPMfz].#/ݝzUJyǪ9k6EX(ybV+ZАaʹ2YQMkuե#ŕ:rq.UZT;rjd]h3(#{$S]2Z"jrUUɵEPD ̺ʦuU(]BMWs$\ޙ\˹ĤLԑTp;܊sn?N)7T>Z![yxc>,mO˅+cXyjx@P4JDGlPʢD~}ϗer#ψaigtU^r,SLŖֹMmӌ>Ŵ2Kk\ÖmO,+K;Yg--dN%@cin/n؟(,Un.$Nn(4_Nԗ1b/ ⸥?V%K;)TZZGAwu*7[VuQVZZe*8K;ɩZ4C֗\kiΣrOiצzmbh;85tWyuBǡ*Nע;{ͯ{;н߅>Ee\;3 TU`uF{4﯎TWJV 򚀯*f6F\Q:6N YSká*__b䛾*3"zb___ Y"AI4J.<~`/b?'}aXr:JsbGؘoVr3 U}`i|eq>kӨJʘĪ玄<`yA٦14}sڏ]çaM$(vC0#ֈ%G|̗<# gR"$5.g:\U* 8_ud?0#a(Y[^c|ِa гYe.޼;]yyA/4.kgwڶ=Yڱqө/wl kz^:fS/}m޽ǎ\M*^XM|"2luȘkZfϦgG[:e(vh7jc#/{m|^]ݦ3~H_?/ σρ1Ϻ{iI)$.x{8;x~Dx;ZYo7uo_F{__ep;ן{Xmx|QTnw`qd='#*3}ң/i(s ?mq2e& FEQߘsؒ>iɑ6ZdDe ?y9gȹF1^3ix=߹ҒG'qf>F9hk 1=B3W0dx+1 D+YЦ8 h lk[ ϽYB7%_lqwW<<8+tNÙ6^]U3"Tpo),P >+x{(oyMKEoG0߿c endstream endobj 531 0 obj 2932 endobj 532 0 obj <> endobj 533 0 obj <> stream x]j0D= ۷1iK~,AkZuA̓fOkK>'8-B'UVMʻLTZnN- oNŅ~gi-1pBJPs1L3ul>GA5"TYUlp8Gc h>{5,RU\~QXm.$Ϟ+l{!nT^?m endstream endobj 534 0 obj <> endobj 535 0 obj <> endobj 536 0 obj <> /ExtGState<> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 6 0 obj <>/Contents 7 0 R>> endobj 11 0 obj <>/Contents 12 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 21 0 obj <>/Contents 22 0 R>> endobj 26 0 obj <>/Contents 27 0 R>> endobj 31 0 obj <>/Contents 32 0 R>> endobj 36 0 obj <>/Contents 37 0 R>> endobj 41 0 obj <>/Contents 42 0 R>> endobj 46 0 obj <>/Contents 47 0 R>> endobj 51 0 obj <>/Contents 52 0 R>> endobj 58 0 obj <>/Contents 59 0 R>> endobj 63 0 obj <>/Contents 64 0 R>> endobj 68 0 obj <>/Contents 69 0 R>> endobj 73 0 obj <>/Contents 74 0 R>> endobj 80 0 obj <>/Contents 81 0 R>> endobj 87 0 obj <>/Contents 88 0 R>> endobj 92 0 obj <>/Contents 93 0 R>> endobj 98 0 obj <>/Contents 99 0 R>> endobj 103 0 obj <>/Contents 104 0 R>> endobj 108 0 obj <>/Contents 109 0 R>> endobj 113 0 obj <>/Contents 114 0 R>> endobj 120 0 obj <>/Contents 121 0 R>> endobj 125 0 obj <>/Contents 126 0 R>> endobj 136 0 obj <>/Contents 137 0 R>> endobj 141 0 obj <>/Contents 142 0 R>> endobj 146 0 obj <>/Contents 147 0 R>> endobj 151 0 obj <>/Contents 152 0 R>> endobj 156 0 obj <>/Contents 157 0 R>> endobj 161 0 obj <>/Contents 162 0 R>> endobj 166 0 obj <>/Contents 167 0 R>> endobj 171 0 obj <>/Contents 172 0 R>> endobj 176 0 obj <>/Contents 177 0 R>> endobj 181 0 obj <>/Contents 182 0 R>> endobj 186 0 obj <>/Contents 187 0 R>> endobj 191 0 obj <>/Contents 192 0 R>> endobj 196 0 obj <>/Contents 197 0 R>> endobj 201 0 obj <>/Contents 202 0 R>> endobj 206 0 obj <>/Contents 207 0 R>> endobj 211 0 obj <>/Contents 212 0 R>> endobj 216 0 obj <>/Contents 217 0 R>> endobj 221 0 obj <>/Contents 222 0 R>> endobj 226 0 obj <>/Contents 227 0 R>> endobj 231 0 obj <>/Contents 232 0 R>> endobj 236 0 obj <>/Contents 237 0 R>> endobj 241 0 obj <>/Contents 242 0 R>> endobj 246 0 obj <>/Contents 247 0 R>> endobj 251 0 obj <>/Contents 252 0 R>> endobj 256 0 obj <>/Contents 257 0 R>> endobj 261 0 obj <>/Contents 262 0 R>> endobj 266 0 obj <>/Contents 267 0 R>> endobj 271 0 obj <>/Contents 272 0 R>> endobj 276 0 obj <>/Contents 277 0 R>> endobj 281 0 obj <>/Contents 282 0 R>> endobj 286 0 obj <>/Contents 287 0 R>> endobj 291 0 obj <>/Contents 292 0 R>> endobj 296 0 obj <>/Contents 297 0 R>> endobj 301 0 obj <>/Contents 302 0 R>> endobj 306 0 obj <>/Contents 307 0 R>> endobj 449 0 obj <> endobj 311 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 316 0 obj <> endobj 317 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 321 0 obj <> endobj 322 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 326 0 obj <> endobj 327 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 331 0 obj <> endobj 332 0 obj <> endobj 333 0 obj <> endobj 334 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 337 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 341 0 obj <> endobj 342 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 346 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 354 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 357 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <> endobj 363 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 367 0 obj <> endobj 368 0 obj <> endobj 369 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 372 0 obj <> endobj 373 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <> endobj 383 0 obj <> endobj 384 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 387 0 obj <> endobj 388 0 obj <> endobj 389 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 392 0 obj <> endobj 393 0 obj <> endobj 394 0 obj <> endobj 395 0 obj <> endobj 396 0 obj <> endobj 397 0 obj <> endobj 398 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 401 0 obj <> endobj 402 0 obj <> endobj 403 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 406 0 obj <> endobj 407 0 obj <> endobj 408 0 obj <> endobj 409 0 obj <> endobj 410 0 obj <> endobj 411 0 obj <> endobj 412 0 obj <> endobj 413 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 416 0 obj <> endobj 417 0 obj <> endobj 418 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 421 0 obj <> endobj 422 0 obj <> endobj 423 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 426 0 obj <> endobj 427 0 obj <> endobj 428 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 431 0 obj <> endobj 432 0 obj <> endobj 433 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 436 0 obj <> endobj 437 0 obj <> endobj 438 0 obj <> endobj 439 0 obj <> endobj 440 0 obj <> endobj 441 0 obj <> endobj 442 0 obj <> endobj 443 0 obj <> endobj 444 0 obj <> endobj 445 0 obj <> endobj 446 0 obj <> endobj 447 0 obj <> endobj 448 0 obj <> endobj 537 0 obj <> endobj 538 0 obj < /Producer /CreationDate(D:20130912115529+03'00')>> endobj xref 0 539 0000000000 65535 f 0000606102 00000 n 0000000019 00000 n 0000000433 00000 n 0000000453 00000 n 0000000631 00000 n 0000606248 00000 n 0000000671 00000 n 0000003118 00000 n 0000003139 00000 n 0000003317 00000 n 0000606717 00000 n 0000003358 00000 n 0000006001 00000 n 0000006023 00000 n 0000006202 00000 n 0000607212 00000 n 0000006243 00000 n 0000008748 00000 n 0000008770 00000 n 0000008949 00000 n 0000607699 00000 n 0000008990 00000 n 0000011280 00000 n 0000011302 00000 n 0000011481 00000 n 0000607847 00000 n 0000011522 00000 n 0000012798 00000 n 0000012820 00000 n 0000012999 00000 n 0000607995 00000 n 0000013040 00000 n 0000015272 00000 n 0000015294 00000 n 0000015473 00000 n 0000608143 00000 n 0000015514 00000 n 0000018638 00000 n 0000018660 00000 n 0000018839 00000 n 0000608291 00000 n 0000018880 00000 n 0000022775 00000 n 0000022797 00000 n 0000022976 00000 n 0000608439 00000 n 0000023017 00000 n 0000024656 00000 n 0000024678 00000 n 0000024857 00000 n 0000608587 00000 n 0000024898 00000 n 0000026144 00000 n 0000026166 00000 n 0000052256 00000 n 0000052435 00000 n 0000052233 00000 n 0000608735 00000 n 0000052476 00000 n 0000055702 00000 n 0000055724 00000 n 0000055903 00000 n 0000608883 00000 n 0000055944 00000 n 0000059621 00000 n 0000059643 00000 n 0000059822 00000 n 0000609050 00000 n 0000059863 00000 n 0000062978 00000 n 0000063000 00000 n 0000063179 00000 n 0000609198 00000 n 0000063220 00000 n 0000064461 00000 n 0000064483 00000 n 0000076628 00000 n 0000076807 00000 n 0000076605 00000 n 0000609365 00000 n 0000076848 00000 n 0000078034 00000 n 0000078056 00000 n 0000146207 00000 n 0000146386 00000 n 0000146184 00000 n 0000609513 00000 n 0000146427 00000 n 0000150004 00000 n 0000150026 00000 n 0000150205 00000 n 0000609661 00000 n 0000150246 00000 n 0000152860 00000 n 0000152882 00000 n 0000191407 00000 n 0000191586 00000 n 0000609809 00000 n 0000191627 00000 n 0000193870 00000 n 0000193893 00000 n 0000194073 00000 n 0000609957 00000 n 0000194115 00000 n 0000196153 00000 n 0000196176 00000 n 0000196356 00000 n 0000610107 00000 n 0000196398 00000 n 0000199561 00000 n 0000199584 00000 n 0000199764 00000 n 0000610276 00000 n 0000199806 00000 n 0000201315 00000 n 0000201338 00000 n 0000227350 00000 n 0000227530 00000 n 0000227326 00000 n 0000610426 00000 n 0000227572 00000 n 0000229527 00000 n 0000229550 00000 n 0000229730 00000 n 0000610576 00000 n 0000229772 00000 n 0000231040 00000 n 0000258300 00000 n 0000231063 00000 n 0000321701 00000 n 0000321881 00000 n 0000258276 00000 n 0000288966 00000 n 0000288990 00000 n 0000321677 00000 n 0000610745 00000 n 0000321923 00000 n 0000324187 00000 n 0000324210 00000 n 0000324390 00000 n 0000610895 00000 n 0000324432 00000 n 0000325670 00000 n 0000325693 00000 n 0000325873 00000 n 0000611045 00000 n 0000325915 00000 n 0000328705 00000 n 0000328728 00000 n 0000328908 00000 n 0000611195 00000 n 0000328950 00000 n 0000331269 00000 n 0000331292 00000 n 0000331472 00000 n 0000611345 00000 n 0000331514 00000 n 0000334035 00000 n 0000334058 00000 n 0000334238 00000 n 0000611495 00000 n 0000334280 00000 n 0000336828 00000 n 0000336851 00000 n 0000337031 00000 n 0000611645 00000 n 0000337073 00000 n 0000338895 00000 n 0000338918 00000 n 0000339098 00000 n 0000611795 00000 n 0000339140 00000 n 0000342016 00000 n 0000342039 00000 n 0000342219 00000 n 0000611945 00000 n 0000342261 00000 n 0000343861 00000 n 0000343884 00000 n 0000344064 00000 n 0000612095 00000 n 0000344106 00000 n 0000346287 00000 n 0000346310 00000 n 0000346490 00000 n 0000612245 00000 n 0000346532 00000 n 0000349141 00000 n 0000349164 00000 n 0000349344 00000 n 0000612430 00000 n 0000349386 00000 n 0000351720 00000 n 0000351743 00000 n 0000351923 00000 n 0000612580 00000 n 0000351965 00000 n 0000353957 00000 n 0000353980 00000 n 0000354160 00000 n 0000612730 00000 n 0000354202 00000 n 0000358083 00000 n 0000358106 00000 n 0000358286 00000 n 0000612880 00000 n 0000358328 00000 n 0000360227 00000 n 0000360250 00000 n 0000360430 00000 n 0000613030 00000 n 0000360472 00000 n 0000363090 00000 n 0000363113 00000 n 0000363293 00000 n 0000613180 00000 n 0000363335 00000 n 0000367724 00000 n 0000367747 00000 n 0000367927 00000 n 0000613330 00000 n 0000367969 00000 n 0000369922 00000 n 0000369945 00000 n 0000370125 00000 n 0000613480 00000 n 0000370167 00000 n 0000372701 00000 n 0000372724 00000 n 0000372904 00000 n 0000613630 00000 n 0000372946 00000 n 0000375030 00000 n 0000375053 00000 n 0000375233 00000 n 0000613780 00000 n 0000375275 00000 n 0000379073 00000 n 0000379096 00000 n 0000379276 00000 n 0000613930 00000 n 0000379318 00000 n 0000380956 00000 n 0000380979 00000 n 0000381159 00000 n 0000614080 00000 n 0000381201 00000 n 0000383767 00000 n 0000383790 00000 n 0000383970 00000 n 0000614249 00000 n 0000384012 00000 n 0000386825 00000 n 0000386848 00000 n 0000387028 00000 n 0000614418 00000 n 0000387070 00000 n 0000388903 00000 n 0000388926 00000 n 0000389106 00000 n 0000614587 00000 n 0000389148 00000 n 0000390946 00000 n 0000390969 00000 n 0000391149 00000 n 0000614764 00000 n 0000391191 00000 n 0000392928 00000 n 0000392951 00000 n 0000393131 00000 n 0000614933 00000 n 0000393173 00000 n 0000395294 00000 n 0000395317 00000 n 0000395497 00000 n 0000615102 00000 n 0000395539 00000 n 0000398138 00000 n 0000398161 00000 n 0000398341 00000 n 0000615252 00000 n 0000398383 00000 n 0000400074 00000 n 0000400097 00000 n 0000400277 00000 n 0000615402 00000 n 0000400319 00000 n 0000402549 00000 n 0000402572 00000 n 0000402752 00000 n 0000615552 00000 n 0000402794 00000 n 0000403627 00000 n 0000403649 00000 n 0000403829 00000 n 0000615702 00000 n 0000403871 00000 n 0000406234 00000 n 0000406257 00000 n 0000406437 00000 n 0000615852 00000 n 0000406479 00000 n 0000409448 00000 n 0000409471 00000 n 0000409651 00000 n 0000616029 00000 n 0000409693 00000 n 0000411097 00000 n 0000411120 00000 n 0000411300 00000 n 0000616727 00000 n 0000616848 00000 n 0000616968 00000 n 0000617089 00000 n 0000617210 00000 n 0000617328 00000 n 0000617447 00000 n 0000617568 00000 n 0000617689 00000 n 0000617810 00000 n 0000617927 00000 n 0000618048 00000 n 0000618169 00000 n 0000618291 00000 n 0000618413 00000 n 0000618535 00000 n 0000618655 00000 n 0000618776 00000 n 0000618898 00000 n 0000619018 00000 n 0000619140 00000 n 0000619262 00000 n 0000619384 00000 n 0000619506 00000 n 0000619628 00000 n 0000619748 00000 n 0000619870 00000 n 0000619992 00000 n 0000620114 00000 n 0000620236 00000 n 0000620356 00000 n 0000620478 00000 n 0000620600 00000 n 0000620722 00000 n 0000620844 00000 n 0000620965 00000 n 0000621085 00000 n 0000621207 00000 n 0000621329 00000 n 0000621449 00000 n 0000621571 00000 n 0000621690 00000 n 0000621812 00000 n 0000621934 00000 n 0000622056 00000 n 0000622178 00000 n 0000622298 00000 n 0000622420 00000 n 0000622542 00000 n 0000622664 00000 n 0000622786 00000 n 0000622906 00000 n 0000623027 00000 n 0000623149 00000 n 0000623271 00000 n 0000623393 00000 n 0000623515 00000 n 0000623635 00000 n 0000623756 00000 n 0000623878 00000 n 0000623998 00000 n 0000624120 00000 n 0000624242 00000 n 0000624362 00000 n 0000624484 00000 n 0000624606 00000 n 0000624724 00000 n 0000624846 00000 n 0000624968 00000 n 0000625090 00000 n 0000625212 00000 n 0000625331 00000 n 0000625453 00000 n 0000625575 00000 n 0000625697 00000 n 0000625819 00000 n 0000625938 00000 n 0000626058 00000 n 0000626179 00000 n 0000626301 00000 n 0000626421 00000 n 0000626543 00000 n 0000626662 00000 n 0000626783 00000 n 0000626899 00000 n 0000627020 00000 n 0000627141 00000 n 0000627261 00000 n 0000627382 00000 n 0000627499 00000 n 0000627619 00000 n 0000627740 00000 n 0000627861 00000 n 0000627979 00000 n 0000628100 00000 n 0000628219 00000 n 0000628339 00000 n 0000628460 00000 n 0000628579 00000 n 0000628699 00000 n 0000628820 00000 n 0000628940 00000 n 0000629058 00000 n 0000629176 00000 n 0000629294 00000 n 0000629414 00000 n 0000629534 00000 n 0000629654 00000 n 0000629772 00000 n 0000629890 00000 n 0000630010 00000 n 0000630128 00000 n 0000630248 00000 n 0000630369 00000 n 0000630490 00000 n 0000630608 00000 n 0000630728 00000 n 0000630846 00000 n 0000630964 00000 n 0000631083 00000 n 0000631204 00000 n 0000631322 00000 n 0000631440 00000 n 0000631560 00000 n 0000631681 00000 n 0000631804 00000 n 0000631926 00000 n 0000632048 00000 n 0000632167 00000 n 0000632288 00000 n 0000632410 00000 n 0000632533 00000 n 0000632655 00000 n 0000632775 00000 n 0000632896 00000 n 0000633011 00000 n 0000633131 00000 n 0000633249 00000 n 0000616179 00000 n 0000411342 00000 n 0000420600 00000 n 0000420623 00000 n 0000420827 00000 n 0000421296 00000 n 0000421621 00000 n 0000424070 00000 n 0000424093 00000 n 0000424302 00000 n 0000424627 00000 n 0000424828 00000 n 0000427848 00000 n 0000427871 00000 n 0000428061 00000 n 0000428354 00000 n 0000428514 00000 n 0000440203 00000 n 0000440227 00000 n 0000440429 00000 n 0000440743 00000 n 0000440924 00000 n 0000458271 00000 n 0000458295 00000 n 0000458488 00000 n 0000459155 00000 n 0000459662 00000 n 0000465746 00000 n 0000465769 00000 n 0000465972 00000 n 0000466270 00000 n 0000466443 00000 n 0000475256 00000 n 0000475279 00000 n 0000475475 00000 n 0000475841 00000 n 0000476069 00000 n 0000488698 00000 n 0000488722 00000 n 0000488914 00000 n 0000489421 00000 n 0000489779 00000 n 0000492453 00000 n 0000492476 00000 n 0000492679 00000 n 0000492971 00000 n 0000493140 00000 n 0000500162 00000 n 0000500185 00000 n 0000500382 00000 n 0000500790 00000 n 0000501053 00000 n 0000527601 00000 n 0000527625 00000 n 0000527828 00000 n 0000528325 00000 n 0000528677 00000 n 0000552910 00000 n 0000552934 00000 n 0000553125 00000 n 0000553804 00000 n 0000554327 00000 n 0000573143 00000 n 0000573167 00000 n 0000573368 00000 n 0000573962 00000 n 0000574408 00000 n 0000591719 00000 n 0000591743 00000 n 0000591939 00000 n 0000592520 00000 n 0000592955 00000 n 0000596000 00000 n 0000596023 00000 n 0000596213 00000 n 0000596505 00000 n 0000596665 00000 n 0000599685 00000 n 0000599708 00000 n 0000599898 00000 n 0000600191 00000 n 0000600351 00000 n 0000603371 00000 n 0000603394 00000 n 0000603584 00000 n 0000603877 00000 n 0000604037 00000 n 0000604258 00000 n 0000633366 00000 n 0000633466 00000 n trailer < ] /DocChecksum /7FD585EDC3D8C1316B03D186005CE37A >> startxref 633642 %%EOF cardpeek-0.8/doc/cardpeek_ref.en.odt0000644000175000017500000156166712214320473014374 00000000000000PKF,C^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKF,C-Pictures/10000201000005950000058937EC3186.pngwTSm7@ADHSz"E b `)R# (&DH=-@("":yYg,g5\3Ikl~IĎG@Sw f`yx[80;N> ћ! >Զ|h03(00PtY5sQt_7 ͏D3VzX$zgeY ?F׫l.=hY1+뤜٬=^hvۤ][544*ji(e %!. ;E0SV(诿ps$w9/u"icED"^eanQ1 J(\(`:({PzL<\AMXT "mMAd%(tCU 5"+) qepq1+/H +2kE "rM<ަ06ޯLG 44KGL}es-b, XmE@T%1 ;ձx-iϟ aeT A49:N ֜#ND{E2HVz3hX+<ޚz6D!ʶu2΃y(MFⱂk+2kݞHHPm@~[c')qüKL4s  򇡸xHjVtV7z{ u!~݋rw(&+8'֌XN'L[pk"npIz|8-fub]Q;tbHGh uF !~1Q4lH2ag5ࠛ(}(_ZA Js QJǚǪوk6IuW[:X^uDiC1L1=dC"M"/,q/D "[Yd깅Rћ5V;Q퐅W_" ܇i{  %hF+Cibޒsܯv͢.'Eeޏ?B8 Nk`0ءz@3<8uܚvD//E+dZ/ ])Rw {@Fa~l/_1A-f6rVܐǏ"wpny 61‘ie\ڻhAKO7 n&ۛ%{ wx3FS˶x8}+i>ʴu^=+vcåLqh 77_ vrd*Vw~rrGO r&,1[˛5y6[)_`{㢄ިs0g*,.\9ǶK^gxb^ j11nz^hnIw ɻMygRrfXGH).ljX}twx E9/hu{IKpiuO2#Den/*U mCPXKMF"88}ڲ~bI'rC @\~t^4cMP~m@X,Rz 5Je) v<;CYrgPb3\׳ f*%jmE;%*v EFH9FDqb7`>* V 5J \k4_3}]r- 7AX{{J.lўQ')-%x0by?iCha79+) Qxۮu]&]!P+s6hx5N#ץЙORدٟ7D<\gLhØ:2+׾&. c8g=L8шaI@xѫH/Z?Q-#ނܺ,_`(ywYb. kmOV5o鐶W}A-8;bere o N-w&<9~}uHcS[ȭoI.| ڳ66->l(o=3[F6ۘbBF\zaqvI(QNRLKRu0i󳆏Fr|;Z2jM%S=U[1,L̕๸]x} uu14K4[wN"v.+喿UO}=Ԝ P@{U sx9(_́uI^Lz;|qp4#S"{ao WrjJ Άop* )jxmqbxT!(dJ7Oc{ œWM=Q@T\[Eh}}~{=^T_? YIUtxɦʣrɣ,c~Ÿ`C0h5O 9.&^`hYu*T2*A|:UdurexkpHܓ]Wv?Pm~αJ 70OGrQ @L/|D9` xЙ+R*c̬s]jE}e(SWWw) Y d !Yб'%MM=OcKa\KEP5D&\C.~)'HQ EC.h΀;qۗҟAi“?[37F^-#|{9;?1b >́Hm7%8`/>+SX{s?#if ; )h=`V\(QD9aR\xSgO򆐝9zU*?@i||oJ g/]Z_ꆶx~c o O^+_jʺz\CF,gaaF[p ~[M=g׆㒖km z<(2?͡ X3 VLOؓHj"cq_dOlאV>@>p X,n¯Ps{+Z7kpL]0C,f\Aز{GYCtц(ԣ/ߴc\[Ww*tmb/ygοQHuΔM?\^WywNܻ2:_D髪UR08aê.˾[S9~AVhsp9Wrk [Ikx56̐mo*irxl k')o,,'I~a>oIΓ yqd̝q9:ɆwB#j I*?q_n#LFGPZIGHGE2{&I۫]|p @lܚitaIR?Xx A36[a/˗N9n(TDC N lVl_ޝ ^(oD~g8)h*N Q_ϰ%_{3S-Ǵg]'v v 8kq;=_ y~L5 ؜lvv`:3.4De nwuZFpsdݗhA֑t򽯘+}giVg][*ASA6r*\&ٹ{BC/6"4ia+9d껟q2:k 2@#= :Zv;M"l.Pਯ (q;6iFy?\Mw^g#'B™ RA,ShbIp$wfYB'w VV4J7r͎FXQ B@*┦Ս`}6w=Wx jATaˑծv L|(yO$.eEHu*3u56òc>yBajF O%+ Ogc5F"NܡRԲH&߆BW)O$ yCӵqkr'rAs"87`GG;'/<ОIgܔu4ahCs=;rߖ쒗q2?UiDύHIYGI϶ep7D"2o[|2cڍz@ H\gE,H]\87ξ髈w61^J8U%1]dfT:Q=v%*kibH!3mbA<5f0Ll.H'@Pf5d '\UXوP/) 'ny!oju<G.=K~0X.|63)&sW<YN~3 i`yĀ5jSHq &K?ƾ3VΨi\A~̡Gœ)a?׉3{zJBmvF?v#-UfwȩDLHGo\OLjCKyDS 㡿g0A7I d61В駯7X0 & S\[ũI0Πab/1:Sm9@f>>Qii^o|W~bMJBMЖG<6Q% f(NX8'}ol:ISߏ<&1!4j͕Vu *su 1[E\+@"agSQ0@f:"_{hbv"k\z&y˜6.%pzetR@vk)Kn Kr M@+)WXWLΐ$tt~Vj}!P,ҥ1 ۘ*6c0M-gO*_o7d=I uД5ZئJq0Gsn`|'TR`5(XB<ט!aa͓W >L:rhg:4٣=Leq | qhrVse-@ШOt`x@eqky).j*wa}Sb,}K^z"C/ g#0,38r" #=hG}tϟ !_^Tb1vn> +[Ư]s~8OC68+ˋ'Y0:- rEek7I|btbo}H7xOoGo?B^P-#:bw$Q $cuB2a1 F6c$Y:gU7Y6_ǟزi" O;? ' xpYm%\on>Yꭽf:?,iNRR-_t)bW;twVn"Kv>aŃ_ ,7|ʚ6iΕ_~4G音-PdI'*PSޅ );{" b,{2d栙Ψw9o!U[ \k#~Lj;Ǻ.bV* =vM] iJ@08lw=Hrˬ{ $vd)˺.2f4݇T>[ܣ*0a+@w5y^a,6 زKFZ^K+ԝC9 &Y*ϲ8lQBpNHkiwF.yS"pίx[˔hns_"iC:LE nbLSCfҷФU1'i| Doۙz 1k=Ooط}Y`HsyM pc5m P6v@ 8#>I"(6 /_hMZ<,AGQgkg扇ɖYW@eNWl2Rw}.D7nEC:K_0,"tsOb7Ƽt] 6%C4o劬r+?Z `v/~˩ *YҪ-:t[7MYK$(9{ҸO3l*Hzu`b~cΒb ,PYiiibn֡5En( .pk%\`~N 5@,g.01]nɚ=h29}/gҜ;sleS?p00~z_&UK# ʖWP(e,M&@U<3%B9 , !MVZhRbX`!VǫazaQ]_|;je}5e`Ȃ})Gg;>@1J5ivq.}.S=ӍrGg5Yl}p޲CtYaPl~|"=hKF,thJh  e b5*<<岇c3ToUK Sn+Wƈ}viMܮ3Kj(ppٷ5%E$uhVΪH4\ ]P_>>^@B@^U PesQ~IU"Jwe"nw6MAaNV AZZ[s>hJToqgeeG6tK?wOgx@8׾Ղ4+KcոR}GxJ Grc)U~y_P jk\U3Y,N2łs .A6#%:aEvەqԴҨr+D&Aq~JAߧ@_UvMo "Wf9v7ꪙ dGbn>+TD59xӔtZP8ݲ_v~ # 1hP_R4&!!a1=y]zǚXo@)onBcw8 YXL*EGG5FK||hDd*mg"{0}o  I|44 &̳Lig7BlSx0EfYJ}u65C(1i(jԘ3^v&%PYia!e?qhx#ŹG~<'l>e 4T({חqqVUP&IlE#9sYj*ogl[{%r =&w@<ZZP-G׮Fr.SRN{0gz(&,w"MFU|?oZiZuCVˑcTnf͛؂'tut{eOy&AE*n.cvfKYaڐD"ef:&wa`PՌ`Z(} '"}wO4lUAa_?OG!EQC E1Ρ$]lm+mI-n{{sױfHLѮHw,++}T x?_'3c :jm\чwW/t,͟қܹݘcnbtˠQ(0/5^ݚx̆$'s[RsWW9zSK(8 Csi}Ut'}Hy胾X$clؕɡG.-0C]=lJ EP[t@A`r:+֬SFx"iJ%ȧ) tz7V4ي{[ =x+4aݩC8[L`ws2g.C~~$Ne_u,TS=Hۉ%ޢ=ʜ9f"uyP4ސYD{GV&4*M4”}3<8йJb W!lt >JkI_TyIm C8ƻ`լ1AnLtUY:hβ0H#ϗy.σT_ʉ"m¨f(*URHH`zo}z#%@nhj}\Ŀ mNx*j?np4kڡlIKX6@X&4V}h rM%MIW'cx|T/eVWp`SM/͇d}D& _:1&$`" \> Je"|hk2,ol746I#\^|eXڃ'ܽE_mO8{|J9g0^grbtlpLpcer?ʸ1 o 3}|!7I6zqڇw6iJLHtG/mHI/gB0 po)/~IHc$vQ Hcppi^?^usNԡza8Rà??]v[P[r}?+8Sc 4NC},Oyv?M9M;ܦ8IПDKn ݱ+E ]ސ+=12"}eEw- ci}Nեw⍌61x2@7G+[BSF+Ջ s`zA3)Je2V; x/. #^r\5&u4"~r.ku*te`$Hn[$'C  ~d̢ĺjM^r`w.igY'|>N,H&ڕ VHq/4F>|%]49q^ut=f x8V.vgK5b;hU | uqp:La`u,XQ(!"Oyn z Dqi3^(<,wiYaC9a偉܎ƥt5CI]Љ 2)X䏫VZj|߶sM0vc~$]6('Ca`ゆ3[c [8GO<z6Q$Jmf8A0 5 `K3i~X̠JÂDZR|(ǺSbH ڏOڄ"w+z֌i*X53iSl>%!()jq%5z_`Y.UyFMzEMI8E1sM#`t}jj!?7 r.̲|mO8'5-F ϙhdv/{P>鮼v5Rh/9Lۡ_2b^l*ˣKlH^6vBs+EFG=Y^oӽ_/VmIv &Y;٬|`h 3Y D1k"FeQ=&g:^k׀>huTW21Lt#VFLz\u[?W:1I3Oqksq&j9mρ]-Xܮ~67|GV+¤՚3Tو]dX; Yv=6cmIV͡%g,bcXW0hrfOGcga#2-6wrrVQΉbߖō*A'f񌥙hF Xxa{;!myN>ƕ@BC"fC̷MHۣV^vYţ$ED0CO5z[_Y͝P^Akaz) X|юʇ @lڤ0lxBD"f6uPh&f~IFr'7fZ3-syݎcmKJd6bRz*׎3 [ $FCi*(-r\Lr(Ehh N`h&͒[4]v[tҔ;MxdyWCiKHZNKt{[Gz}˫/;a*esA6:KC:NbXհ*1Mvʟ(~詝CKHYgow}>PE2z?!L5p%nܳf7t;]"PyJ~,\ƶ ]pY<3GldfI*wrN [?9=@C ӧSY{FP$vBnY7aO26qlax .p[_#K.!hchy4I al?ơZPһbAQ4sK v vd#{#ʡ)bt$br~_UNh{[P5

{Cweh_ʞ0qjGoLzy4ao 02|'n%o]bD/s[VjÖ6˵aKC"UI%={fagNIY']J,ߠٮ=vkٗi|Y3rTR=I~ة態b?{YFU)zlsBt*j=(v;P.kaT'q ^*e%Rri ;6lf5|?|%8kY֓[*&H}yA3\sMPx.h}[aH̏~3ؾĩ,fiils]w_PZ)5Ap9 zOz`roDqS`Z/56o+_J7o_#/^u9>r9jx//؉/T#Ⱥ(TCZ@s :)ju Z)Ԁ|Y07ӗ, ŹW/%'}?_O߄JMY_@UD?z`.c7r6 O:q;a}x= ˴G_s|۝<]xxJayGlpW,RB 7ۄOVy:,{<8-3 @ayB_R@49p?(ʵ0JZlSH2 _˦7.>\֏X~(n!Crz?2:vV׵~> ˈ>QN|n5R'm(A l CۛONf5p|}E nbe{25>j'+GR$2Mֵ%޽+6m)ڀ!0$86zF<۾`Umw_tKE:L6P_4 <>*KpDn?-*3H&xu\%wh 7g+d)ڝ9RoɄlSac΁5e_4L {z\_yRb-鸠*EbnKEj~d*I7N-KO|V:pzG6ll@M< }OОE~BP!*QSN9Pޞۮ:jPvL[YA,HE@vD"zވxR?t?}/rd0@Pc : (в%ןvh$L_5X#ɨ08o'~^3N hH㵑(T[՟aeBI0r2Q}v/Ev('O߲<ӛ'EIT :`"?dpYM<%XoAcrio S#Pɂsk9A=~n'dPt{{$lQgOųM̦XI?P"^$en%;\b+\sEm Zӟԙ$BX͍*4c Saӵ:6x{v>Kl=ˌ씬~={܊{[ `A_)iBKFڣ<~#ئ5ʕr 3ܨ:_&v_?_d ƽwi1|Ψo; l13{Rڽ{QU1's;nsddV͘WvE`,(GZdr@&i 2'%/e=zMemhQfFA3bAPBUB< RlH H $ %D@Z44ߵ6;|Ekk})ZMd22YBDi;3=!Iώ1, '3dDCM ##wމ ;s0 a#,fv X)`3(at;hdלN]]vɓ]W|lG$TآWjt ;l8+?LftzWCJyxt?Q} Σ֍sȬ|!F}BpTUq/ _| ÆH"}fE+aj+F]~ @)`3oɫ׉E8=ueMāEZI>+B>~>%y'&+qNp [* 6*uLƷ^CߖE%%~~8!w@|ÒU/! tSS0~3F(2v\ɡMԬ{SkWd(r|]ANߊ΂BH%Wv ~,˃$BX{; ;WSlavweTyrC 'X8Rp.Hғc/k mw{E]^^OFG=zW,a(::2\`yMɁh&Z>xI>k'\TrYU{EqdݦQ)/kdXھ R^680\^5Q٨ÖG=Z%ގLoVX2-*a[Z8Q@-TvnNK1?G@V1wR)7NGcRuYT@Qeg zw:&/##Cp#%YY\ԏt A_7!eXN .` W;K)=$Qi݅s[bÌ@^0eɃ<;ejf?v4544aͫ-;O#O]auPr#׊ Sc0'3Ű$3 8d.ڮ!zz+O):]ǝ -flerl~Sby|7EXw}S`!{Z6A]l޽*v"->[;P$M.'r=#6I%0Pg+A|,_0#޶0l΍aȺ! +mEOT Q~S\>`JLsmSvħY6޺<줂B9P83 @)ˀy^i,eol#W|0AnZj1݄l0S5ÎםHlQd@:4lU7TU|cػ#a?h­.הθU7l>[8|kFdKBdg ż%Ac^YJ eH8ŏʩ~]>ͭ.->PWtrna`ݒؽPk0&QGbU C]GJm'8GNd\ -Ǻzg~Qrev\Q? (sI~mؒSR#n /7s- s6ƬԐv'¥ez9d]dA|ɖn#^V~zJLgfJkmW,{KL~fN.tG_o)\s2AӐjx+sIiU##ޣnkjvsO䞩sfBԒt/g=~X,o7ij@Ch ]jzi>Ȉrp*{0z!I19d _hfz7mt̗9ē`_~&[({O.lωZey| K/'Fd3M9>'=|%hRf^iO%?ش=oz궆Н@PUh9/rY įb~[N_+|\Kb Ro7!߅_ h[HZL W[T< =8Բ;MW*.ޫL˵h$G7Ód&fؤdVgIUY4Q&/ VdyK5{X$6~%Ca 4}l{LģUF;d̆\u1T 1Kh_RoR]YIH q%:A5OnGfv=0+'ℕdI @kP%(6YI2I=Z"ei[򦧑nLo1"חp(0&k}QY7-Yt0y.u%%0]NXJm,Srb-_Equ&׊j$އk:{(&R @nHJC (nb_#Pj1$_pekrʀi}AdY ;Lp0K$7y:Z\}Z*2 p*:)hl=e|+‡?hAi&+Q;ǮM5p\W]&ޯa+YHs, K d6-U.&QIh8?fDHhTQx'Ֆ0)Ԗ:hJ]1W2oӷ("}=ԱV\5330Y(~NlOy,)=\c6Έ ~1uTGMk907L5U Ybn.NC<.4|2I*n+ ӇigUWvk|u5퉖.1f/6)9ΈBQ"Hn=^XU悎LmFG;J>/^6N:M6 Ȼ-C|~d2h3tbqSsBFVD׊J=e?~$\Bx6, 53Xȑd Gc2!Si|PE8^'UҞDe&[g]rBOɛ;Nxg!=ZDΉXnm݇#;0rM e56V({th5x :iX`G iVqG2:(UAK1j>&BI&ciy^Zx% JwLCΔ" w+9&e2*ΐYXOrPm.L'al%]dMe.1eo_ ?TSrF$|L6 &j ~߬?~@sEa%e8z=Qɉ d8ɨW a{¹[qvQSY7 3v//\kX'@~?sm!ª@\(r m9Y }cxPHP%8^b wL+5SwYYi[PDP؀Lǫ)m~ ړ-vx:SdpJv_.G0 QK>k"y*ƗygPwC0n2 # s"e]\p&^#FE*3ɴݒ%zHc{Qvcªbi$NH J\S9Ce"կ"2Mj}(,>SDJX,gWHɾhLs1GXE#KD~,oxYGAW #ÌGtӄo'eA@ 2vP0h+uL kyϑvP&A !lɰPz7wggCT:K k~`eniȎ'hr+3ϡeogu?l[EE;?$Ջb~ΌI^ $1 rWa>u?=QE|QI+\*a]xw<Vdd2i'YEUnQ`Nي޻l?ScQ,dXׅ\P00~2៽M zǼsx;.d?+]d ~VN}0+9֐^ i Հ~#m1$r|ѾƓdkmdn+vɟ^Um-$!a5U$Y?'x7 #WN'~ Igay\mZD%(PJ3NIAUQz Nol04cQu;`zuV%BnqyHQJfɽ&}xn4hqyT"qk]ʖߧ_|(xGhGsiD&yXv K M\hj/@6 bJp`^R7ſ(6&3PJ0 _v"\ fk'0h [x;,vY p#AQojB$oo=3涳<- Z'12dsNbTb5ڹ4-m{|e 2XAd#^>rH٪&hbMUi n^Ją|x#g'MAOr?r8tSa: O#2!TII0sGE(o\wcB?HҌ%(At8qI}5.GYZp_dmM+/,H`ICy֖UzŞqw?>ӭ&1nLr}L!lz8.h?c(ݫsAMsuUCGDur X8'nkȾg: h1 '47Zga!g.hDR n[fi&2ܓ96Mgv;m^@MݗՕ g+?d(WaIVkf{֨V@[?)~Z_-߶2n.z^$CJ.\B/髛l&6u }B]ҡhn+#fn޸`B)0厄?:<:E:%I}gT7c,6uT˨S3C:@;Yg4ps|G?Ϙ옽_E>'nU[<;Gw۾/k)zb~WAQˠJr݅' }n֩Jy:>t &*SB ۠-};m>ԅ[ KߊHR/?(POt'erKU#:F5[[jg} ~-ψg׆47'qT8ؕIaAqyUwoKv-->맒"mE幎Ɇ2OszGiIwҥ]Y([`mu+{U7bLj/YtZ͑V̽KgbN) ƙ_=Ry#^.Wp_cWl ~ޓ?Ib^-ihY?Y(`ɚЏI0"O !-]zolzz%єHҍdlK.fU-t`:IfrEgl @_iݎZFviNTr/ntY_zL 1mw mujrBޣ ol~=]=b6`Ϩ8$q:+]0xO4~ b~]`Tš!>-00(^YF.""#@.,rVTi2nuP$r13`,VnW<A#hm%ܦ&@6vN{@BC@ `bC5OrYӟH!roU` ( <0P}LKJC7mPBƐÅǂڨ}iPYW[ybEǹ,CR8Tbĩ-ΑX\X~xj.%!(,oCYjymY>JE!${C8PE*}ݶ)c ĩNTS͇QkBUe/$w;g''dFZZS(,9B7ڡ bs&)~!2(7{ vgX3vPM@?>\㆙QUCE|:C?yv|u b8VMF=:fU;&KW~p{BM%y#qS ʆ7o_N1J#˞hz.J?ڀ[h/n3hE17$K5ү7^*ag 'C<A)A;&2yGs6p^=M|sW <̧Nةvyq `J$H)1$B+h!LYp ys@j6nFe -u=~ypXPz2KP5Ms/U٬Oܮ55A+^vPz ~&)0dn6Vg~vwxXkܮ6+lw›4h3Atrt}#G X*>Ա{ ª쨑H a!F`yOS*vr"rwB#ɕ!Rv :)VVjLdݼ]{̊tVFތM!]a$dn?^Ym0٣yfd?+\Z}ܧb~A(*ySX@L1GSҸzVRk_TH_?F"m+S!RYDHH_`)ܹSO&ۥuI?ٛBS]퍄-$n]z` TAF͎Y*`1^\OhZ'Y$[:'࿌x.'I7яZtm~ Ãzj0È 3`\uatRWWOwF*lM>^609 3121LKb>K|:y*{Ar[$ڻ9r!W9â 0zpu"(p d=#J&sC5)@"am9J߽$O5`+p=Viy N=#K%p'}i$R#@l5z1SRuE34 pdI%^Z$/S',V 4")c7(KAo P*'' e{ⴱ<29ߒd4p9Wv m?p ;[1Wh%MBM[1J3\œ_/߼]|NzSaD~9ԆuHK|ӰL?5oU 7džW4 ir{bCny2.eb:DPv# v#t !*[@ [%3Hn?j01$F8mA8l†1FK+R2}jh楝W/.6b河P;oƞ u=x~$2un]8S"Ɨ[!)>$JTTcoDh sͩwHhRt Pr$b!yA|ՇߊuCDflۺb>OjKf/jtޤ*mV>Pa!ʷn^^2/¿26,LO!vfd^ș@EЅw1KW+fȽD-}4:m^-9˞ b9ݏ.\zs׏JrpeCiF)׌am>൸[/!sv_+Z1X<9p}6%@ t,j-%! >]wJ9i&%F^?Hjk| eC#B{bZ?V26K2X\P<`^Mѽ]3˒ˍƾ` EKŬW׋-ll[)3"_BOs<9bTܩ]mLT"VSBt[fLPL y^]+f9\qzI0Ϧ"͗Ot>cgtz.~cE!^^; &gZ6#FOB4~/gZ)Hu*B=Y? 0iRz6/)mB>9-Gi)&;eQiSz[o??SJ ϼݷWur^$F7mN7#=- 3G3TCޏY_=O|b56*oy[9 /2S5 w;}RRVxuʖ%䵗%g`=*H'M˿i;(s;ZGbfjhS m~yX~VI0bPa}^v_gB^t眵2Ҧ~f"ѿ_yfE)}u%Fx ѐntF}&ҟ~→uWyj o.^F+- 0γv--BorVJ2]lv6-]I,xFzdՋǒwmKPj*YɎQs'k6`XP(XΜTId8d}3$ߘt~lcE!N Sנ?Z~veʹo~ )/^ t?!4R{eB?{n "w#ܙ? iˍkE_7L!_)cZ揭 YW4)Mݶ]D^`Hս[j-XM&%ՠ'ěUM9$]&}W%PE Xf ?7'A o:f2yzt<hOv%~}?)wø]VAGd 瘒nyɩ#͇<|eC+5eߡc%#-qVKvt&U^y vD3\6g0]BUkzC8} &:l|Ա_I!4Ѩ!FzJADksd9ltA 白+}=*֕9f,|a)@C,u WVu͘ԩBC^K鴅Ov`ʇB _]+J;N2YTu$-_5=>1k_HԻHRlKJ?$?pӈ92K#q'W3b= u}[Oԏ Bp?dv*L_P~%곸KVVOGeC?̬F'* #ڈ-yb7)ۛZ9>hk2N}5]-9I(yInEt6$s_"="Ȋ(LuckRp)۔:*Ug$fcc[nW),cau8mKkSװq *n ][gYv^Աܮ u"iS8 ]%$IS'XTԆ~KR%͉(beO͠!3Hh̐ͦf)piQUPnUӌwC>ʘ=@|$4/@: {{ ̎d+"N.}XȍV]xKKʱS׶#ZZ7rDUB+]n+3F+g s%3 i=5u*,d"ADŗ6Ա(յ?Ī2-ǘ HLފFק-b@>G(i|생OE>-5w,y0ptG!ʍrFS".gk` yZ~oe(rDхsk)Qw.h3ingk>%>Rcp^ 1®}AyzGzFtU$/]+ͽB9/ eir9\2s;><}+B秚k_'\;E*,)^!oB6g{[j tT&,݅ۥ)OTH?< nLJm?_~s0y{t޽?\Yvdi믖ʭUgbf'aU<'^hzW :B6j6l.M9[5't S/J 4\=Э(Ww^ʛЉ>QpTS>&|9P'mfۊ:Qn秛> VIZOA# 7kvfW>V(2?\6ݛ~cVRNZ|ʥo- x_@ww766EKqe[ԷU2m2un1s “;ǻ6NJօoѪky=^ŷNj2^&-M2„h׋@؁ц%%Hs6Ugl6\ܘW6pgM<|8RAceKs#"[SCCl|^,&:Ug\lme>t[o9f/~KMK}avY)4{=0ᗥyx)T,v{mϚ!&ی{.ߴ딂5Za@&4 pztDMx 7!3YS:Hx<ݩ`Z}[YgϙK,~LD3WSzS*OGJ_?KvVh[}(Ʊ'_m$h.J¹g-VJRA6gcxpxu? =_P׿vw /|ڨ\ hFӕK.y蕙ZAV>u>{͋ǔڏ,UO@F#Mb|h7bŸ3m0gt蝩~7,Si>m 9xÄ=isڕ %:$ނ.N 2hHf[܆oL<]^ӅT?lQr{g/j'6vTtpVӔu:Lmu|+uvzHsܼ:JL\DOgmX|$FkM*?]D&[]QQ>}f/GW]mF3cqڢ^ wڌ!|[5$cMۙ,CpV^XLLcnE yFDXBO!}tR}ruig73:j5S4>([Y7u ~ʄl)Q-=ݗyl103®ġ]y8T ڟ='~wY$^Qd5"{̤VGjp1-nD$I!}QW7_= ba("~+Dei[w!3^7=$fj}̨eABo&N@\rE$; 8-q F(8 Yw}1Y9@wh_b~ +rDB / o!gB>8i.!rD܇9䦴 ˂?B&YZ? ߆y"ayԏDm8+AeuQ$2Lgr78]LV" Yj~ئH?AdqfV$iIC(a >rS SeʙdVi&TNn8 >y,_1PQSc5R'd+i1)X917|Ng.]dsmlS)ǘ`dT#.SltiĄu(ӫPb`(b7AnJގsi=J{6xU=MPjK^w<=a^F%(n)R3dS>@Q3\fk󀸚+tu3٭;BYd4bpAxU&[M^qf, &g/taQU_94p<4W Ck(C1Ʉ-gۓn1Np ZQtNT*E<gmVK É'Wok&ָ;.ó0H6uSa\ ÑoC4kA=jP36 E%b*l-|3γQ5qNu s4ќ֟(r1L-_` kCp&}ByIoԖNF5A#p=軩R3=n)x#)\Jqfk3¬>Ƣ'~5PgZ,6>ۢi=ݶtkң'5H{ c-Gx]Ôoё5F[VZ dCx}õb ;O< 'qQY~ȮE~(4$'6kWqq;1O8do컭 @sOz攌nND^e8dI|w1kZj3lϮ\iTܙE I O?i8:x-\~&^=%N(N"©7\Euy"{k',Y;Qs%_@8+~R# 6Q[nZzM~:at'0<`g:UT"#I6zaRSXpo5+ؓM5fK]F:gfRn}5nf[#RqzMX{HANO4[X4 F_0zM"0$Ж dcѿm|SKM|^OF5|hݏ^/(57Q6Y47iNms"j߷qtsSl4>wxF\LP[#/8~@ (YāJv~gEtvGӺq-$ F~W&^e}l0ިxTֵ \ǒSHY7u###^eg-W+U7,Gsql[)r7y6)+}]jk嫶)+ַfW] hOn fRUR2ӜG)c<'Q}iHo q}6ٍQn[p747up8HVNna=$֛`7ϱ;d6+De55ifYf̅ġA# ,5wT BD8W~íC Bud!g6p䞓j%Jq߫i[C&t.aKG&~/ /N)o`hlsml;J93qw~X׎KS7%:09F[.Ҝ{vOd\8$"w.,AC)9X-vxi@W']J-;k-]a^Ol|+ݹDY>SY #: xƂ;u IoY[eX}(ZH^Zއ\ߴ~"n6|&ϡ,兦6]& ?׳CFr^Z 8;æ1x1-~|bVN(e,] q˷i Μ݉E[Sn#7EM%{$A~*3W-b [So$'i2xP Ԟg<54Yo/`?#rw/kDHUؼq_K5dģeyW_t' Ґ^tBn2/:{px[Q9q~/V Yb-ĎLfSlCݷαёzӌޔ#} 㻞 z7#*=-x$Х7[=ݣq>Cw.&=1\ 'mɰC%?t'+i*j#]cW-)5XnHE-ezk۳v5gudͅS#ۆ:1zh %B$(2 En|۩d"62M6a#GA )MQdӛu '`h|xȉRM'RFeO!?aKQ&KhIׂF^d1i"nI)}5<ӥD(ij1ǘjt+ĨEZ/ jq``TEL>ME1d!s CG(Eiq7AMVñ/3'S0oyJvă Tfdv-Q[ 6_|pC tϜc`CILܸ~qNsgʬU_n100L[(r;Y'` PU-=>#c|>Ls&Z QV,Cb V)zuuGZ(z=$c떁"E*- 8sh*("L9 k65$@RtOևJ"PT<Ԟaa CU9d!UMq+ ZcTH wT+rOGSIR)n7yNT&U뿾0~z۳ɌpDuL; ˾`4$jr m}]jӮRieX5~K!jPfd<)cec lgդ qydTο-w(g/n*U-\:NLR(9\J]So}bjj)>QX8<:}P& /Kd5]`=Q) Z fԀIބ^= b딈q|2:"#:AðICSg EPhM,bS{PwgJ½?b2!9"I& XT›Dի]V8( ;3zhµEYc똾ٍu[ oaޢޢn)k؏W01 3"BNQk?僞'Y"[lfrKHoPuL|5%"5DG(n"r6T}Xر}E>D{~¶alN\/c; 1㸎e7!+k~ihJ8p ze%jS-Rvܕ'4F fDx9`2#%%($jkfJ=3ӴZδ.v>s"W_izZsiYvŻAC0Ƅ=x1ЂQ!?7Hw!JMIO07#e+E3rs_kH' =/d-^#9&\0ND:$G/eբ5ٟikq?7- I$ |Q983ܫ1h-mXL;&=<{vDyDN*\ j@W@x2bXlvTQf_4f8̘21uEÐ'+g̕q;9ruJJ:|El%V su ׾nn0N!~/MSvb#̙XO<_/CMAA>KGpQtMk'J9:En= P7jznu|ˁTeE'l V@x-Ͳ8:()S JQ9Of<\C14{ݪ fF9N { e6//"uI":Y_ЕMc ?Wkuu Ν88ɯzRA2?9%y_ Yc0-S/>j>jhoEGb8 s 2!o>{V>hިhw7rJm(d]ѭ꯮|h('|`;6|1َ 8-D('&~ވѼD*>i_ qMVJ!RZDP׺7{*8u<"^1(;5Qy8GCD'bLnٵh\u8H&՞xsCw(yyk{԰NW͏ڻi+ =ZMܳsATzI~I?otd8N+՝n]%!HM-d.96]9r!ζvWW׆l`AqJp0w-FԌ#;6yFn̦%-Od!`̲gg4!_G8*Cu#h{_vFWdңHBz 5P!8ḧ́-X@U 2SlXoCqƂKR1\c=4dX,OEXxJ&y³[B3 JJf:sWTUr^pg"%8M(hc ̣,}ʭ˝-d;g{\k40oRʇPa|!XkoD0[O%; )މS WϤ =L*Iw1Q76rW KYI E-/ [R[u rWmddaAfX{_wxgѰ>Lܸiyt ;*ћ^32~^WܦDLRY tdku_7p#&ƏSMc N9 ƎZ|xQ3ǚ&QKwpO?b;9g]U+٨E }5tczռˤ敽ֿ;S@Q-N:Mnl ѐq>cK?$IsH&Zʉ0 )sm1ڭG^&B;VkcIq[#r^}7𞒡++/`vrvOak.@ф jexg *]~(*7ܐ+/gZL_a}`x1]Ӓeg|Gt-| %qHI+p0!/#bp:-q)FǠW8lvI^ ug;Ѹ(5i]e|gzEd\Ϻldfg Ԝo޸N+j:{¤M[ӂ+.>[&qo_|1oEMW?(MKD{vIuިг&B &+ȕgƵo6rV*hj|hWy!i`Fё}  [WҺ^pbBs*gf1msQo-J:5rNN~T9"ӲYJ_϶eWz(ik Ol)>},% *|WgBFYĠm" -^J ^{Z1p62|+s$+#4c[mNNfо]I'#Vq)Thnkk=EфKaV_xTaܽ E+ɔ;(J ('@'[ _{yiIdk_s^~hB95CsDŽ^=E"ifGttb#x8v.3'?n7)`#'"yHhx5XE6Q_O4'V$$G8 &yNN1YD鋈LDX3 s%BCjQDS/K1&d3": #II951PF!8X$`0Qǧ(rI+\G򠡊ĉ~VvϝD<7؇(d|»!@V0T$P$R+׽sg 3 SL)LKQ$aJ`Znݼ~Т/EkaqIPoG-1$̛:.=7{CNW .|'W9A彚\BK(b`1'fZUC_z@Y/}IWCGZ0~~j*.lHQ(r3Nmڤ+=[SeBE_i\0Q2LG )%Z>ϗj!CO*&!'WK0:",3Jsh V}&%^U-of>\K &l]ZPglXfkH \Gl-lx;!%.HŠs9T,{8B!ގMx9%`u #"5Zp<#dž̈:EاDK퐙RM ˨~Ce*:+@.‹n݋g*_"QLU49 [Cӑ*%XFڱ 㨁"W.c'TБ|=O Gݷ/Gע68'+t4tMyI%60Ft,@M ?<`]o{Aloө/?5^DH?qLq䤶' !>n-܈%A3&>yy:E" #)<1GPO .7  LN?G iLxsuAeG?$wL;<>65"n^L.:ȻOFV+cIlF'D=Ö^ng^"t^Et$Rs&~9#[{!Y䳂VP?cwfq1ћг V!$b8J0''Ց뎎$Msp|l=&ϼlx%=ՌP=*2iH',<:MTfg`;D #\qUS| ʷ,̧%* !x\u"\%4l˚A,T;)ҝDݤs]ফܽB&B:RcXPY=Fި՛RGR6l혬Tt:4ꂿG a@{^, 1qj^ZXeSU;bd ϟM>E8CϾ(qW+=5):_UZW?)s`@?-*#hH,lhQwUt$DN#[yG@ԂIi.rIϲ+%8. ((-Q~DJJ ?>ܫ=Xwb4wr_TuBsy\=sFC)։֮s?>E/%zoBc.y(K+U1oFpdܻyd: ki ȫS>~fx=ɓwרcHOPlU[_:!I-R6ܳFFFLiD;',NVcQ&K 2 t\q%z7Uߩ***mw8FM?yн;9#df1ZSkfhSj<^Ľoƺ jeo(›ﱂy{\yrɈ0bqLBg'5}!y!)4{zal`a꧍gN7fʊG)D>+ #oՆ*:2M-ΫPv>c#D 8s`hꨚDZz. :Xr|+}_E`alp%S-B.thk7 9K|AKg>P > ۔zd(tFvsxT']lߤ;nt (M[bWerm-;d*;}h|n=7lG<ŁUJX`kkApu]( :w̼R®n۟~^;B!0[ /&|3[__< YkgyyjdwѾ]DqQ[gl/::_]27)}<+73}nj,;,DN&e/tj-=٩pwvs sA2/IqpΣβ}*J6' ^g;QM1U34%XKD{tk;H>P2N^ī\VQSfi/=I:jpu`@4 h-+y!TfȵJ=tf8'f^fűS'_vg ~{[U+EO[& N_g8ޙM]˧#3VNW-4kUUbq%TET:mи:qJNf^FȽS=Zc hA7VѲDNq[:φ௜ & : [ģu"6VVBʲHf^58?ќږawvu wz[!J/:|s$wy@>M~{ZMzM2eCq*"Q.-.,?WݨͿ.fɔ%>aē7gm'rBnE'<ռV(39KFzn$!2e' {e-?4ARV{W2|#0*:&QSuXCBZ$J@Op#dѯYR܇KÑ4HU[gvYw@D[ULNhHe)%|oV[L:ݤ;Pq _|]uhZ_-x7^V[m_m{f^w]"!U[÷22h+8N{:r@];5MΧJ圓1V Oop69il .LO_?*UD;ۘa"v¯ }w?QihɣS|$sF +2UIBւNgR˛D\'LK/2p7yCd?ٺq8#9 ߟ?,0HZ`=[(  oXɽӥW_م݃M`$z( H AxeUuن%I9qP7t-[?f2E"?7C4h,s%{Z2:RNbׯ8ųJ k6B,lAC/5ɼH>KlISYijle=E1Nq;pBrId5ۯMA_@_G\P`\ޮ .n'egP7y$2~x+Qq)i-ht.y2{Af3C]b?՟w@svˌeC(M˷XY8\T@^^K>:vp!jؤ-2¸NOD 3AMnѳLlQS-A֪/3JiMwc7PP0y|í ܛɻ*:(thx(*0_zД朐*b$YBj@ϡA 26`Ih;+ B}民q ~)>/Gۣ)gB4@Dzwafϴt^cufCu"@1V9QP\+bhkLC@18C h'pz& &_&ҊW Ĝ,̆CSxCG|A"m:3y~yy*ran)840 _#έ6#yVIi7HHUq.@J#%m+ 7JJVD7"#]bŽڏ׼_<./PK&D|PKF,C-Pictures/10000000000002550000006C8350ADD0.pngliiz}YwUwu s{xjI ;dSr(r?v蟩PH|\sa4_fcV& Q]}{o֯J|ڷF>GoWT|w!'1y_aN U~o7w?1G3G8 \+ك_|o}@@Cfl9hG/tQ¤ MYN6 }y=w~8b~P,K^{R&s+p   pGf+c%lBOWwvƱ\)(@PzvDOo:緺pl#A6 ?ٿws{~V}y೰@.Ck:h]`l@{ Y3`_hكS4Xxƹ3>O+j̒ >W^d]J%~ I~:z,sFFU+f3}Xnѽ+++o}Ne3ZnΛ *?ۀGo#J:XQ`n/v$  F*?{o^|wV~w_S.ZE(jZ- ?]1B>8:'arz`@Q/ Ϗ&[޿_<+R,99rx,RBdX2{OVdTN?#i,x!,}3'#Y[m;QoMR?󲺬H[4ù=]GJD!;VݘGl&S*ͧ޾qlmԖ,ęDBhk\~X1$3 6{ptv`h@to?(ry;iʘvo8F^~;Ƞ~XT|=/ǁxF@OPyQ2O*$D^TyqɀpXVαI *z'x>JkrnA$|V{%ry:}qbQ6{xssTXg k(dx.<>o6ҝXhY|qW6iEg-/9!}{}JYͽRQ uy @e ޭ7IEn^W5G]gp}QTYZK($݇:(@/6yM~z9nxjڗq|sX;Ɩ+t2BMEU ݐp\u r{8C*yciQ0ID#'MRp㗠׳mYa.J*#i_}}{W۳mQZ2O<Ǖ䌨>A#venzOy@ӂc(ƓFƷ_}E?-xw+y9Ό\Q]ai٣|ƭ`.d20h6%3*9GNo7n)[XrbiŶ_*Īqzl B% e ?%eGɸLpXp@X/] J](FevU yYW2o)rXyB QW/d lX]n:껿S *tP 75IzS#^!x*1+-G`6ĠD`#y;ZϯU^a֊k|OT/c M ؜ d6>K'qn7t6#!C,"agjp* 7YE4b2bKP^}6AqIp|&i c۶dUm"y]" q0'~)"ss98UӰcz)%/%a/)tP<$BAp_9\n+XXze1^E8Nlvvf4\8P|B=qn c3lY @ ($QA{WבD50"{i/# w QN@9PK#gU=TMe(2DL,(. $uzU"   LFXH'pRȕqZ3]E$[JT:A0vZ}.`ڪ7>Y5nֱ*ɩ> :m0w$EqFŇv0 6?=JJ1#K. =ޟAu9߸pv\oUJ2` g`XVŭ{[jFGļh5K Pxw|^(0}/_B_8kY; `"!"=5d07TwaP?"p27Z'2 Mk"`iM=ow) D:&%VV8"/y%B!mv(=3pKk7Qx :czI-! eG0BkYD%ɐ1x0%ƊP9祋NReqq:NP{VZ-ܡ1F!HEΎ(Khv\tݑ"I4EqNd)v{r@˲$Ҭ,h32Wb$]FheW<UF*IX@ʞOD֪HmI)JJOH*vpM}v$ރg${on4@vrz"geE;#Ay@tz/"&9O/q5Mj ."clM"kK'XqC5^Y@`3wz+_m Vk56#VɪKG_KQmc^LIC~od(#kY` gh) K8wE^1gHZȴ7]Cu&(L˙l6#c,ɿO"B"?QKͅm{s;{Q<[GJT .3ԇ(ۜE$e"u|dy).-'P =4ӮӶ7O`q|{Й|DoOY!)(fSTaE$a y͓ҿ(I\Vq[]n6 a7 mBv .IzЌAa<%83\45KqYM`̃^(j8cPR];B76 o-UVN"Rp6md#Kdi8*Ih6V<5FԬ.\Z'#Bb;'y1"]'-$"?8yiS2@u1 j)Y+d Zڒ8coziFĆMsa$MI - dխn~.O!kk Bd<3Sā=$ mqq5W.7?A~995jAipOWu חh0V7G4;TV'#IAP~w1$ ŒjNz-|4'afly"XD ,`xrBND>R<W!fP]Xh_̅;#8 X>EAG_;<(rH\*+IW$I:+$6%'H#gSQ\t)[\bAU،" <ANd2zhE-_8;:7\F_AimQhN d=q?#;f=#2Wg8wԙP{5]'sJh|ԜtT"ރO׶k4`9wi` ;؟>0}hpZׯN?xMt/6C8h8d\fBjr< qLcƲnb:p>'OQ?6Wek{7wn#$?$yy 0ƻ-kbW6]ϞG16N*a,05AVg,J!\J2l>A;3{L1$EQv!]9 /yCQ$s60D/666Jj;sዒ}we+ '3vy(cl2w?leCI!K6S\UGf MSlYdg@L|gg %NF;  :T<&=X1-O~*s^>k]<OMwvspEʬ#}~ ޻,!tMAINAY/LYKk@jzC-ނQ)P6?z_޺9ixc (V_\r% ~lc-#(reiG.Je._&(E][2SR +Dx::_ƒ)!!W!2ywl'8QaEKGGve=Bs_P;J#׼ (B^A p(}].lF{A,!B$cEC3^ z9]fE1]y8Z[ ?sELfp0Dʕ+8Z ɠˇ2A9݋TxU!x7>NzHE!C^]"8Pd8.XP1 k' h2ZNÓby4o`G4IOdG`X(]Z8O|+ "gdymн0GYQQtT*3ĝrxd((r%-bD RE'ib<;9W5|q/q۶Ou-ݵ(hE2‘=^H;qˢ1sT>ɃA.ַ[_^<=RwQ)`ML(@| pͤ!]H]nΌ֝n=j({Ủ5쩹Lm{htwolƑ!dI"4+V)u dxogoNt MB%*QKkFwIv] HHJquȨaFdvc=]n@n5 owX,?ǵ7'7lo MNIɎ\]06nnD2ͩwgỴANcݥKS4z%_pL\Vx(tT%a/_e&Ȓb*Kr:'B`)~j ^ç+Mu'v^1! C/d藻VA.\;s@$ E,ΒH4HSC$V-y=a~Զ竳Wr ʙȻ َtVuUFHx D4`4 $omo;(Wb  J{tRVzF&I4EcMa4FL w &軃!S/?b{ϊ|5Y5 дg~W7EQpL%aEAID0ln48C8Nx4*b, 'cS*IT?_E:)tX\5^Q)CdyT.u`Lb9!m:M$N62R<|;v갾>yrY/n#/XH}ɬFk;>ݟL_9=9Wk2/$Θ]t;sp[78>7' &SR~ssVr$g^?*Kt ۽î)Nql;J|?( tsuO{Cf:tRTtrm7z~oV8iIҠ 㹹k8>DS41$W¡ ˒,Zc"d+ֳ<!\vf M \4QV.jYш<جz6z1-</*4dvD|;Wr~Y7*pZ^'o}[e-{@Ggo9 "@ulףP,cMNdrPPN?ˮ%~EI:_ϫۃ7~Pu}rp. 6@ ג.dJ P`'kTSDRÚ$l!쎇2+ 7[_; [_o9t*opv; 7H-UPnGrV6 [lE}~7kP &ymz/H+ nuH FF<~+d3C@[kڀƫc_bNa`0b z0;SW-p>4\ˣY\9hO6[X6)$bQ)hF ն dB'r:2C沣ИϲL56<sE^,(\d YDQ|a.xdA8Z0˶{3>)GܛHR %=aʻ)Ͽi'z K!!-ApM[˓٭M HBM*h,f5y2F8N'Y˃$͈p˅?ӭ^ü xwZ(Z4%Mf?991|/>|+EN֓)d2Ofe:%b<$)p"'j1Oo^fS(AHY2D@ 巀E0ED6wa ΧAk3hP3I)n6 <胫x0<py`J"LSRqmcjUټZ7-8L/$!Y䓧`:L 2us;(xl{eM( - `U$]p.qߊP)TrTY(u'<'Z"*5ß=7ڌzL,T&o4dT~m{~ܺƽNT-+[+p%XLUJZ/JXGQs+ƤmmMi#/N IE yC_0 ev Ut2}_:ړ'66Ŗ9y+n3RG?=>X/0Ci#G26._dtFLa)?|:R Ev̹? ,1 >WwU_̜KMvQ09.^$H-AaӐ,fˉ2x [)b-2\zV tWgIpaA<'?/^muGN?wԿww6۰U&VT)t{(sE9'Edj,[5 :S,dU@hdrP'#I?}gjHC|@O>1fn{- 1h|R@F,PЕJ?FsR&>\D"^I5,ypԁKy3IN<$li&RF4hLV\t^5C{$xZ-\a㲴z}{6<ǧX7/<$S@埃d$ԁ}+YO, ՛Vpx+a&hb1r3k.*ErR& R(1&$RA03N3ddɥ + NH|yEnRr"-񄐽#xaf.Eb.8 \6SCڥ 'j፴}N:W-|~\$ Lt ){nsH$!xZ/Bqx늂z_~f0W!j$GJo䧆e"ดz5`uZ-EKzOR{ҕãhtmo'rN9JCع距hi{%(|Z5p 4hGs^V!&]/>yBax$U7FR-)qc845Mem0EnNf$F b5oQlg>OS$%OX[IwC/-<8^yu(OgSs:{O:8r޸`=p08"ΣTW`e{?h>'?"N04"mY'sZVKQ~ѯDRJ\@D"ٌ%g TI|?(ϒ"GKlMVOy%Z}{:OCX+IH*]THv#6Ɩ 9UH\Ԭ jWٞZ!+?}A*G<˙m3JH*'l]ݐsvGr0 UE3N|3'JzWPt:d8ŝݣEűk9,4{HV^*h[Ԛ^NpR$Cb\7r_Ns2VjVp, "ZJH Ι1LX.|%0gJ>)T ƃh`\Ńc& H5Ck%c͹BW $QRU02y=8FlPD&մ4K1˰|> 퉹 x=lZ 04E Ȓt<#ȼx~f2J~/xC!\!O3|p #TFQ&ǎ2syIlCBc\¼& IXHT }9غH[~O'c1 $?trl2,&$˭097s3%Wds_`q1<~p烊:pzf]J| x\Ic~0RWGո]eWOܸ>/iZƑ^?%j?:UDWҝ./:ۧ)99:xY`5"%ρrH>+ùZB8ˌJE]J˵[B-&ӇaK$-lo?O&hsMU{)sZ.1/ʈK)WF(KCC={ncY?|ZclDڒs9ǁdV!k7&$wXDiBXuJ* #qm.yD+[M;*McyG`F:1(FK+h|%&QȜItr{6`/9OМXLdrc{hGvϋLi~72CfN1̠c w g>E_&YM}tGRe* Dk'boYS W\JıfHVҭӉGJ*( ' acv3v V;q0Ѹ}vvP%`\^jzeSvh%;+E^VUEJ)},9kKO*sG9Ne817ZM|/WK⢐&iJVϢj,]##~L0f8QGw}Nl13EYMs َ@5>d1sEQn7''ݕZvdnX\,8(V|b^yt6OM$*쉗ldB!?8KgN8,`d_ 0[1R3p\KJzm_[h\LaEY^,V%`*+;%~\|ih #/j6\)"PNiX>;a 6PfdM\J% ԟik7g9 “DRc2Bąlc:,%x䯕s<:T&ΌQRࡸ[0dT\d-=7D Mfϟ 529d:$ay&_ԜēbW\BIGYtf y<#NZ9AaLi/| 08% BWotd` /՛$nB Q ~ |!Ri}^݄i0_ HXl?`M1']2F6:T-Pd@4"-!"F8@SGv!pMZ{a;qB90AA4p{_ۅ"Q7-$ mН+/9͵ %}/fb6y5`_05p7}{vxP$Uatb^ W,naV2 g㠖pI~w6vQxI{Bg4O6ںyf3T+ȮDx4Y3dX㑳p@SW"ךe"Jx+$[^AySPL.7PȦ;=fjC9 Ħe'dH>Y @+4~=.^P.ג !QceQ>2 p53+pm=yEMч#]|HB=j$Jr7c]Ӄ?:nà|\ b购'H$":H)ؒ\>ˢMDgHrṣAVͭc~xw@tnWj~4jFjofD7?(xvF$?Ҭ0 rP;פȭGkHO;+q:w([I!*/2"i`m{.'Qb.[3 ֓a ϐ,Jo~ f4h-]#$ 9WuVcVoFat>y%7ls$ur`_ݼ8RbIΩ%^g |a:lhVijd4zL`wF޽ç.D{;jN~riNE _TMTdvv {7^5Kn| ; %8ldlnlkPo&;mF.(2*+{fl.Mm 8A@)% d=kYF(}8[˪HF!N5Ən/pd"1f9;~?hkzN/ @*4J+%LFŅ㜾8RqE.g27vO?{on8b+%eEr=;!F)@aK eƍStԟ9:ɱC~m9 l ܐ d'%O)*ҧo\!jB'J&S'JϠ~5>ej<@!άy A:BZqY Ȟ?=?Yƍ'l0яNN׷|^0.|X Ŭp{9wObn|%Sʻ0i"Y ,g.͑Q2&EaA&̇N72*C ch|frfUt OxV>Q腌Ei }K/K+> t3"4RNR*W`U7cxLs(=p7āQwrI8rfqY}{0(TnOuwu ̴ z0aˋObÃnn{]nUURfj#) ƾ}K<7E#s?|' xv]? ! Ǟlooc,;xQUŔI}c墶;fNvPě$b_RJ˱T\ns{ 1@j-q$mܫHoF ,vbX$YԀd_?JD*K :EoE /N )Cԗ32;KD S >@L<^tWSMaKh6ޮA@K'IDJy]" 4W807qƽ˵u \Gq-Xf^ ?D{t$+LObV0tWd2{yloX48!IкQkn%-=EPmuޘC$$ÛCZe޼J0&XJE.(Ȯʘ=cZk/0 ,,I!7u͛._ҩ/=i,7IΫ̙'7oolۧ0J7&-0"VbK"N(0GZﵷ U6i;,ސ[5Y$"܏XdYdiHs$I u{>I6CL%`(J@A 88c*Jà8l\ˊ\ tvZMu 9mh&xb|~Ϡ\)C`2Rx9&;þnly;eO> O߸}hϱ%a{Pw1'./R7bȵ!4fMszRuL`IdTOJyh:_1FTdVXCA*-0\퉚t@|D>Q1@O]ۇ L]y i˱ӳ4DKsaX&AW" i?:Gu蝜AXkeAA CjӣF~JҘU$C&"s@24C :IYdfYuY#( l9rTX]Oj8RYzVGi \)px4 Hp".6h{觨pM v ;|KpG%s]|#=-ғ۷l]ZŃZQQ@ÊCH{wTϢ3r}zn;? ᓕ_Dg;2Rtz8XVesh6J4/}x6"$%" Jl}uK#'X]n(Y3*F/]KuyimF%' rr0IIj E]NKq+@MT4?/b$Y,Dp[--Ç'Bׯ\"u'r:!!l6_ՍL1U*!+SꕋƤlgt5c#ƶ簐eE0 .\|tA"#HiwjN$ⳮ0c!K~ӝ`Ca"R8,'ސ&{3\7,ãuF1mǨ vΦۻpW!ghΕk+͆7 &( ;/f˶"< !A$uVw\/R#m\+VJR. .ϽNh@k 58hM q&'_O Z0:ic<(zgb e˲j5U!r+^!M8xxt&6y$,vڭF1K֘YH t؞(nLGA2&-Cht;;DdڐvR\Q ŏ&|T SCb_c6b S T6[zu,| v]^vUE#I"q/"wIͫ 0y P"Ipـ]B0hto_ԝe0bCRW<&,C9}[|5QU:WEU";(?FK"ʀdE=I|1}ݿI6f`;8.1r"P*‡08s8D~Tl("ЄedV1<0#@p% eLf``EuL2K/̵E CZB%] _++9vq64T3Ix\KF Yի.aIB4mYVY9>;r=?)Ռ OE_v&ynP78?6v g>.G,>;xrC& GK$bW 9瘼TZY3i j5Xf %<А RDo> du0*? 7Rճ1*3TA4Y糋Kf%b d/K tj(/w^]6Ddr'Ͼ8yΏ('sL^L'u5- I +ԵFI`:IyDnUZG @RUKkUm!Mrf & ='ݼy3Di^'XE^d ptϞ :>@Oz].oC <(I$Y R,{BO!32^:RT9mBC٧l۶\+A#J Eۍq$#n"=8*t:;:|Y0dQ[aF)\A3BFQ__H[ly{,ϘXeQ8 HP9,^`,8l 5",pHB@n8JhPRך|El,"+74J[e:d*{eᮽHhNϓc _k B D,TFT#Uk"KB㻘jO?=Vl8^I@~} -"J&*$F%NoWod2o~_}r0f4MZk@"t/z,Œ)4Z Bl;SUR $ u2 X`MZ)kȮD~2,.ا;zqR~j(ǢqUfJ_+WMQĶk ]0c&N3Q0"HZQxG7wo5$?AglXz(wͦbj+D1A+d_b- nedʢqTՆZpWx̀>lBFmmF)LJw@1l5h ïD|<:hf ÏoTx@Ѐd@LV#Ӡ]>yqa9Eq MY,, GEX[fE: nl uِxtFsdpr2Hdpt?h4;8j2Z#Yy-Uƚ(jGCϏNHYuq?ˢ*FwB&6&b'CL%8<3O<.3ǔ6pHsN3* bU9 yE/Qr8xS^2Y_NO:'4nŌ|# gEk}rpTG?>/n6qpm=J/#-3QHT+,H`lpu+˧*h 2} >N~V)#B"ԇN#zA ;AE-S<|/YvoDnb#Ot?~.."If`D`号5Q7r /)e:1`!/ })RMQĆp(rDΎkX9V _9ԯ\") AP-oy#-<+_XdW@y~tn^t^Xؼy!?̈̉ӋFweM /$,whuۇ d(G>?|?׷ <@y|AZ-zmU&H⑮"kpN-YGDM'?AӋi>t0 .V^(LЅrΑ$NEĶTG'{.$d>@lkk3$t](uPqJT@Aӝ5˃U0")K@]7_.*6:$z>|u`-Dۼ7"& %Tv6$~s@{ϞH<z`CoYk^Ӻ%{D{DNq=VP_qy. ^5@fl5YCYt_ZTl-wu2 ZAg([l|xtX&oE]1yH&,[x޼vPY8hK)N`1 ADN52hN.Ҳ8Q4Lǝ>DHD'~LTӔNw7"g4ybw6oꑦ6d苪Y}˔5M܈Dm}{/TUWKw1Ń #b6i|lƛl p/>wujRvQzUh֍x/ΗgŜ`$M,4t]eh{>klnZ/?~[ ϸ 0,-TX[BNˉ '$[7͏wBxl2ʤVI2\Qb&Ĺd-9[yxЙ{WE#|99={:8BI0PBHp;.2X]A(|^C/C%bt@z Bhf9aHP=sKOIYH Z-&˟oZ&J(fY6~ߵPi{[¦ƗQf}' eshI&>=\ V5@:LJg[oOO>ABHp/.w {`3;Oߧs4'8G0_@ { у?#@] g)?/Ap<L"O3ԉuC//}#_Ht}Wœ4)E食=:>~O$NgbOgϽfެflPaMNދR<8%N-{cX uASvfjM.2q]eXSR^2%^X OVr4ɐZSdq1W,،J[p{熩,Vr`)"-Y5 f8tIgɤ.KGGgEVu/i[i z?|tR[Otyںu\x}ɂ=`u&EEY%PGd3 `3])Dž3d 0dY@>jC~#W* )t]ZaLI: Q/x"qr-tK9W|كg83YW1&('C?;}_VJ.ܓ8]xl<}* #͑/ *<1 s/eڪVa4/͛7%AD3*WRj nn8f~]Ujj$G/O"z&3v4SF Uɦt*^9{_)WB3[E ^tt I).HUÚ,oT6~V.w=g-r$O^V!Lag&m~Y/<*$ H=qŴ=4{;K^xf4\EE<[ުpML3¶QMtpiBjJﲟZ %vbRr6sC&$̀"N'TQŮخ@/hJ))({b1K#\W MuE>"6wLJ/?Ň][N"rrW˖di ]oM"ES/RS=|7UҴ7Dpawo)_rEN@Ƣ2,wq3F ă ,,ϋ +!>'v+4K. ZU+*//r7jMY54E{AÇ'N`2$^a Tq]o3*I^ծ( oֳ`5^\E/6յp=de\P }¸=SRq/ 6x>c∴GȈ #5uV cCoDoe{mq?㽒Qo[6~Q-|@E-jll.vE84#X?I @ؿ7Ok&% !pz.?'ae(";|Uz\O:G5`.fs2[ݿOL8SXzVmFǐ,GKtdXdYZ/תR5ZRd +4M'Y$ ʢ\,X.U-ѸGLK FwA _Hwc*6oȼZ`j`YooLXHƢx4?I<hPZg~,ְd#|?!yޫ 劦 a\:g^BG(9 N }z)gKٝnR۠*7[xy3hoݠ?23Em =H7zWz= Хz8dN[ՐCmw??$2qڟÓfmC XGI{x'/(R)_T2,rVreGu&EɀEKr^ݪR:T]^ y{yU`WY *jJ6n-=q 'ꀑMqZc\VD\32»'JIC*  gE?Avzq߸M_}#U ;JRAcX:(@ˍMq{M|ʸWs(Rz h7@|E?fP(y\}\%B.Gʆ~4y[~sF|[o]z*צL}BxU׮<'ʻK7ocCs}WV %ƞkNW1+L#wY5Rs ahq|Kh@0bA5he5dNn.BƤ`r8}>GprUZd(;fحmN׫ ygԉfݍ*2!r4[M=nX80"NA}DA(@ Z(BjǗJkWREu.x9Q*mngr2qW.WNfx:9}l׮b\Ƌ)_% ݕ\ }dUX5͝,tNa J`XAs:@+?CNHe]CkcWt1*,4A+ۙ{aB$h0nlZcMVڀA- Z;wWu 4ܼvvq1Mqg=J ܌Hb7GEBF3#3=s{6Qq{pc@.xrJ%ZIWE{R!,Vض [b i3  FFkfz~1*KK2WD{GK脣3ߝ-oAxE@(1q8$nJ,CC*/%S.qSÌf4Gتxвj  ܚ$ -Y?EݱxXA(*R΍HdU 0 g}py.K,EܬV$Qx<{x1޸& A੬k~{Y$ʲc[lYU)2IWge嚡k}bX~G)|^i{ӊ:j-A@56(bBrpp(2Aʊ{^"nRA=߷V+e0-+IS$@ YpQ),^`/('4p V+W0AB& .@}[yy^QLӠމ)ϭULZY)bCCZlH|h+kpmG&/'3e9s=xTQ76['8𙒐H,Y,m"fA2g(~E]4]BϞ|5nϾG \ @F//=-3kO&D i5lYGWS(;Z U@X!MĦɄ Q%o&Y^iY(a8桾 Rj槊aY 2}fDiސ> zRke9QX(#ʲ_չ_/{uj#_.u f FbY -gM)R(NN$ ƅ)#h< y#bH"[אWb@plřTӫƺt.O FxTԍPo&4uISi`e`I 9TJDhWMp2L$_~M(<\mp}4#@-@xi/oIgg45^oK%T>6{(9Η Gpd,l7 q14$4S,`MIRJQQ8H\CQNx#@ȿ/JiAFYUQݪ1FzOkj8h{GVd9d.&s.$ˆ\ztI6l~p!vJKYZݸ5d0Ul5Xu/RlD `)IJ#0x 3%dQį^N{mYv]"OR yFW#zZ,cu/ n=G:ix[ITjeoۛյKi7^sT{q޽v,^Nhk8R%8pBGH Q6Jc^Zxϻ5mdt:`Y7MgqM3䙌8#B4 I I Ga>K8E\ULm}^cTQi-}0cdf^J &ax.jg5FE]z $M $cck$p $%|^Np:왪)h0ށwCw{ C_Yj*6ПtO\aiIdE<R(Km FE*LU,SY`иOڷD =P /Cv p$XɃguTK2w, x- !?Y+.*%Xڄ5^ AG eX>~|~VȁA4hiF%iРUM08( ey",O~jS@7[ &n1]$tlJ\sigTĀpǎ7DjE>$ؿغ}z7w6 yÏr{j$ANj5DAK׌TR}$ۘayiq<жTIB/TuNVίJ Q--I1?2Y<ִVj;DB>_\*PG#0r.d;pB$cOG$e9k> xqZHi [d2GL3nk'z¨\pZf  gRk7<:w.ΜӇLfҼVa0 8X|*! ?j>?p\g'gnWO;t=\,$̎_v_nCTmϷbP3͜ . MEu4",CXH*w֮YhpM]k:5Pc xW,R <n98Ud{.a%Th y`,t=Jm}`5ͧ ncpg(li&/,Ҩ8f2A݆hݼyu` _*|J |/!iVK*ЖCDPrvڕ^#(-7 Zmœzhm[LHY<{vi7kV:n@o ruluHw0Uϩ+WM!#|]b`1}kG~x?y "gRQ}'JX"Q麰t_w}AhJ]Ch$Xnc1&`6&uj.Y6[]v/c,^T-Mpri\yjuQ"JLGR_6 (+34xw..ѿM(¦E*{9-JD2/db N۸3O)8"xE!pDwPVkCUJ)&,|نU7L^aGNuy;O{@RpUIaRY3 tnK<ÔR~e=p l zC8[[;ns3ڭ;գ΢w jɲ 1 gC6%,$rcc2]>y˯nFvɦ^pqZ,WΜρw _.Á4Xn GP`dKElao܎hۭ + ^;(08W( ?aҒ&I\BKE,˒$?{w;2CE7N<^RtZ]RHtg56fNjYp;o}c8h8bgthZ;VU)q%H7j[[MI:X*$$>4Xk ީ`&:[[r+?WnׁйE{y)#.\pݿ!k]O{i0e#^k/d$R<(Ձ–L~40_ؓgKcLqzpL@8HR}{ۊy, dNp2 4LBHoT.ԉhfhb4HP=ǞCW* z:vMY,E~{hw%*KSRW{rs8L=i+F|e>,P+vF@qgeM!H,A,' ڪ\YD9D&, )}cH?날HU!pۢyaǓ%$NY,i6f`?1 Kܒ._~PWnW+Z}h4y2Z&`Kg`*hЛC9 'Lg!y2NQU~SHQ$hLS75|5Tz ›aw5IR/_ДxWV*ыųqj׃ gD_N^z  9bs5EsLLEh5R 4Va/b9ևp`wqzvs\K*[?,/08g1Q aX$R6Z./ώ=xIEm@7(\C=(X-N`<vD|Gn߹ ʗJ q)02#Zz 1tϴ,؉%Έh9Ěh2 A`.ɥ7f$T$L^K VFcjFuVj 2NR3uPqdmvoqzn{mݨZue1W6B2O0p2%)tQ/bO^&,*jvfL$8Kr,pte%qC"N$Su.GR4_YNI4N֪%5awic N2aRyx&Z*$E4 h`Y8Vl:pM9a {q$KY(JH30Hͨ񙷲6\o`RkCS2hLBL/D]-7ҊTbHڛ^I;:|n͏]jWz&j_??r0R}4M~O4h\W%ZXI]&mgh4e8A9M4R.m,,˟-6KY(\%BJӔ#BHbR;eYdh$f~;r1FrF I m_"G.h:捍e1T*wtd`XsQ IfP@U1#}ijԀQß L&/nW*PKJ 8$s"z14#VrJnP̔AAw\%K覓}cb WtSlcӒvR\޾c 3|qYscsQ!=s8%TMG$.ϏM_Uf0%W%SKOdG.f1E$ǩN-Jz%_ڹeuQY1684NX[zt]8&5;*)UŹebEi]%,NO(ruwϙM^ݸl֬.pO>@U ͕[eq#ɜ)'|Ÿq`zNiCBPkg y56 TfC̊_M)XV%j-[RS)M(raB%lK3tܰBQQMGL6K*,뙎_4LI#F!o*LAEYa>puRE1GRE$*.83 (6/ 5^ ͜:{7k˗gPSMM|,aջj5]QfiZTsFI ɱ|6]€|hŪ)*+ft2B5 lؔpv%c{#y@`B! b9JZdJ( @\8^-(r$="jV,# G\.fXH IXƩmHbM YR|='uqV,ED!׬zJREEmP!UR*vj$\hPWW բ%x܅)Jk+j8s& y:ZTj6<CjE& ł4#9Y>Gp,nYdNg4 'l4pj"Pjp")Z^-fLJ'FbNR>Y) Mb 5"6jHM ܖ)T "҈l>U,:NA)2?\N6<@;WE/jE2pWH^*Ib,G0a+2yA50vql&9 Jf|R[d!5f.[a)е{Ǥ[GXq$+nRl2.vXfݳ83Q@4)0/@F~msDάhH*!Xp'$!# f@x?.аeD\NVDd6ҥKWZ`Ln{< z;"y\c/j %0[i믥iRQ-YsEg{҆x(,SP\>ύA,雜6StƯK]|| %Ւozz;6 HTi]vAcWh]Y6CŸf/~KbL*2D`fbyqpD/T5&[(B]=?ʕjmK8G֐dp2 NLԼFENj|\AMzR-˖JZ!jHQlp|j70=7ΔRb|? wn< 6ՠgph)ϩj!cK;JAiueK;Dl~z`OVV,ZJRYJzSX%RH}ԚVLGR#"W/bC'`Vfa cchUSlØ]-,(?Jl%l[sKZ\X2 ,3/CU&LA5_;i\*\@ʡ(e d^ xP H8 dQ e(̤6vVutr QV*i7+Φ$z/_nC!DYɘE  x_FtgK|zpN2bt |:\n,""x46+r b z=q3mbOMItV2[$."a<$ A'+d$Ig )@3ܰ ÄdOJ~If’-KZA)d6op:5LCnւarrV I=و$uw劧{z|[li3U`sE\QECam@VmAƍ!vZsߟpӏnӊNeI[5q$I[I/\D k6[(/gۮʉ`WYsRFz=/银R(JG6-4 a!(D?>۶N Ipyv($U04՛,oE?Lo4Ѫa+:.TvHmz:9onLRcKy'}$" DfQ!c"ږZ(2Tn'U1 (J6T2 |;c_*8FЮ+ L@aK|6N!x]Ss* dl >"*ԵiX};%Dijkk$ɧ/{ .- OȣBq #P-I)#+ɦIBj3P@OLpQ 䙛A"Vq?෍d:s eeC;,wEty$d6,TSk H)R!ſ  $׹<؅ ӳĺx7M+ݴNb~,f''c:F4)2R2%2SZ"94Z Kl-g=+%#ЄLA,LFRQJ1UD *IM$"MX uP*siDPjRROLN5ΎLZdPG"\&g5*M&P[URRf 2!!իkI5ʰɧVGP'.Gg/'K:ҠUI{)!q>2|TRԃ9."\/]ig}s&[Z>-&ir(2}c4%ψ\ AD/P<yNU*qXVåW*|^N$xU )/o2ܪnQq}k :h]n͢S 5Q*DQ!`?EkuZ >e ,F M28.,3fUST2t:` WRHrl`Rt"v::4k"㸊hԙh{R%nB' x[e}_'Mʲ@'}gbz,0JOic*Z&^?#{ LK iʒ$= JҊ/Dl H9y*4%vV"0r-eJűeOs9sbK5[ 8Z<9̙lMfȠNb-ggFM]6ZȖr2Ɣɹ|1- UE$3hX) -'T!.BT/BIV" # BQDggfx T*:FQ,:RJ5AU@P봹H:ǸrEB:UcMR&''[ZZZ*ddYհTbeMQۮlF3&irrmJԢO)4""2Yf*99<؏0lu?}>} /{}B[ZCG /TxL6ǫn4/`O\63>۱l9._ B@.J86ٌB.4m6Xݦ@$E9-+s-sk/3 Ar?pZd)3!өHD"H!^H d+#$XAcY[Jb:\i E+?t9~Up-&eө4Aq,}Vt$gl4eWзR\z4*.Z'#&b1k| ;G䘀NʋpY.ޗn]¦mus\q5+ xPd qi)sj1Ȓz]ݛcSIֽ+f,W/´v-gTAy~dj[\<#lDWҩx:ȆG!7\e&ue+.Ԝ2>#[8ŐM!V444I-9iAz©i4*aSG՛i²3h0fH&ձZp4_{aWñz鑹EHɭ2W(XԵ49ŤrIЦ4y A"N BG͙@St#Cg++Y$paVr͡&hoS&C*xv,_PiQ@S en4S\+rv6(Itee Z:UDy_ KN3Q|*2u_UG% P" ד3c&(Y/NV4ۊ9d`1N V@:7z-am'M` h8򕜻+Jw(* 2*\ cFB[q7b4w(<4* ItG[%ng=vufmlj05pƟ6`ry-ZW8_Pm拧OPih3,OVJ5"LtPd!EP4fMrEʒ [dj`_It+EՙL *Bݺ@;Rchi{ ht:m/ZmFV0:WtiH伯L#kH2r)ɉ"iBЁN|t>#S4͒LW,:yޮX-vʼue^GjAgyb"ͳ,/:T`̓|Jk7ٲ|Y׆U`B@bLC!-m+͂>,ҳ%6>ig ǻ-P}q{@_Q\ygEd6՚aytMXmJVQ8]f -@Th$d\*2uyZzǢIJW,ՊAoy( b.NHI"e Rd`pB;R=i #_`ˊ3ѩu+jRDgzv P2غh"\NPQ^'Ο&Ke&k9L}itzիld4ifEvھ2r|5!:D&\( K/6j tvZ5O5:Ф:o`0 Z;2b4%cBsFsq|qj"'|b6kK%T#E) Wv贪DB<,YԊPU h k&vU43S$R*,!?~V 2aAK.T?ez~k*j.grD FKW)d8}׽_6 Uʄp26gBәCkNmѲ+ 8(?hs.˞9̾~>QM[wPZ.B4?yW\2S ܰèāqI ީoSǏ^fOe1٨?qdeg62AϞ%pR@JO>>xwϟ>dƂ5[6 |qK˳w˳ ߼ۤ[E*x1s>}l\لA̗OLP$' E-tپc dTs{ZѾT?{Z֟ؽ{w._D,A2gn^bEKz/L]8gS`itVoQ> u|~ʶ J)_b9hw-^5n' !"αS'@z/6I șIJ^1hCMYKbz'χwۅ3݂5.e! cI.;?|TFÍMd6N+qK)!TN$4g >qaؚ0O:d3PI|y*䪎l,s[D],:LJ#KB T4(d.$(5B&yu2I).l^v2{̯sݲP-Fh*V;pL|g?yfxX@(\y3sEN nerl:KpeQ+秏;*c'gsrXԜ2e~_~ׯwMY¤'eRs *?_Z2q8;tm&2я۞ذU~&剣"gpwb1V =I]Vt7@(Tq"@Z,WOo6.M^%(+j>CWdbC77E:W\U %6O4+,)7Wܼ5ڲlӪzIdRTx5ahZ"딺H8hWVOOOT@ ׏ݗqb2mvhD}ކ|"~jZ"v\jp|U5qc A) b 2 2Eʗ?u cT yM-/KLڙ\g;>16m#uD)ۈ2^/Xo;=P͖PJV'^x{[6|Pkd+yBhڠ7}HƫWX7қn;/wbHfӑh9Y<z~mdO¿= o-}{8!&ϊSޏvk5<ƻ/WG$znowwxU;|a، 3H^]׵M 〗8 W=kDq '&<텻qh|LJod b≣x.yw[w7~]/&7v=nIs&F Jf/z"hMK#?w]m5j F:ؓx#Fc: c֙ʿ+qx{. Q,+D$dwt?N!_ݨcTE& V,x>$LxwqM|.Xw?z` (5m//z;VU:^6Iw$1;"&{ yDfpnȞH41}@HxN!n;zC/~7x۳١b0X"TvwIN8?=2 Blxgo>nA'wOMBLM<]#;{pﭫX򋥩/ m~2n NzHmhIS|g%NPSO|G,&ġO'zߴ+E~9<{|T>.-ȞWݱxݢҔD؇ıOmP:y%j=.> } aϛQDl-=޷,%>`;cu*|$zȳO}pT'G RP8 SGzF{caf7ΛCo cg>UD"Ͻ96~ĉ鱉ޞɤVDu{6d~ߴw*')(J?=uyZLGb8;{tHO`xHԵp぀?=xȡw98@s!9mԁ7z't:->lkO>z{5{ake2Oyݩr-'p ivp &zj8qdC"(F{ZoLOG~d*(VإǧO1CUϷz) ;1~6+le >!PȘC&tF7mKRjl^,>䃾X,Rf-VXOO$q#Uʆ_o\3e>|G}}=Fvx?;?ϧ'_+备cwq k6@>M OKKlY*8y9D>8)?Qo(6U\ahM 1hI~+?~9Fv%<޽;'IhzE!Y!>?=&|o6??>a*hq ]s%1aZ&ؽ>᭭Ԋ{W6YU8CEd&dirŋ/D"RdfmZ( l90*&$vg#smTag{:Ko /0؛J xܗ ;%8A|$6Ĝ_ |q6ڵd R(AϨ1M+Bu'O?sjHLI=L<ˏ=wG|qo[]g?ݵ?!%@ \R6_ϴ}+d["9$[}_~num8\JY. 4\]w /{DU|v5 ]ήx#V/Vf~OryQ:u=qkn>㦯4m}׿$fhjaޮvmN{C{۱O>察9vB}ΥWvZY7M./lI|IcߵݴϿ_7w>ou2HuqkTdklq" ; ;!OΞw†_d5 LBw'x:7s~$r-?"ƽ1h2 n}h)] ͐)|.jH@ҽ7]Pskԓ'^īoʋݽs]?TB.[ ?|_^u&o^hY Yٱ̹~P_|-H]TX\&Cx?)~z/ĸ~ir߸a \s绀r9aB[Qɧ_>FcOox~zO>}LFK3W^}^49HvA*Gw6]2({ŅHõ2$i>zϗ}ѻn*\\vI gx|:W$6)֛ Wvk)MY0j{oӏOԆdkxvzp 8؉gFZrta4ą|H}¶lL_#)78.A/uyw_yOn)Dy8~Bzw|u" mG>vr]~q?֥mi0ڸJw@ų^?׼x/q ǂ]e|387/BS ]j)NGVFA`;7:*2HK@jbd0MR&&M6V b@k8lG vAF}P-QT b#?2&ֲH;+Q(0͋qC~ɟ,h[ P4w eɛGSSigvZwk$j@Gq'/Ekѓ'xZ) 'Eb>ܓN=OKB#Ђ(8 wY}'vCFi1/71}}zHrϓ[A<$&bfLq.)~#&Q˒OֶaU'zھ((1Ћ5i={ߩ{_zb~;pL[7lyo;Wv^;w^·kDxt,{$^Dߺ/qӆ=LJ߿~5 Hw7}лoj0]BFwS|T;+N#هwn钬+teNv}w֧24km bC{cb5/bOo*ɑb /_.3ى_<_5Lw}hg Rw߸55Sbt,X<_x{H=hG>d/Zs ~Cq!/=;1\g][+e\p@x| Kh =]_?4v^ _VEKW7յg+5\m7 ej`^{xovmKP^XS{ I3 \~#Owl}+{ XwUCOmwD^߾|GA(fejpO.|P|-4n-4i(.=H?/_+ƩK i3ݧ t=WoY}/d{Tdq;B0bqEaWX4" j?1sׇ3—T,CP+r]Q*j]ӡ2EpS۝U-Kre6  gv>"}= (u"ɗЉo|к|pB6 ]kUPt|/\]5(chJQPʫ2 o{Ӵ-[$  {~S4}l>y[-hmͫj &+НC}7]3{h7 ̄j7\3[=:_tY߿'2' |u?;__S$D!!ϐ~fi_駟7OOLƙ:JDLM~k9Jwerr1T"Hw_4;^s#OLR'J,XPJt$ U]%?$)HLZm)ld> 546 (jy|G׸dBVMx,a0#\A* d H$"t `f"BpnI٘>"/sm:EpEK*a8 SBM0ϥFnj,ԀW ϫB=M{U ADhiJdyȓpp |HdSb3{񏳫[J4ۯy o`or>B$umn~oRg2'yezr?4i)Fsfh%ͪ:@#H g~DZ쎁'5TE\Ui:ފ7ܠ!R)]ɝu]t=V DD* 5W>zR)EDD02l$dĨוFi/cj苝[eox'z0H$"T^رUy-r.bᑶU :?J{w=|?2q@@w8 c eqz 3,b1sC<\c<2e,,2AZcP:H6s7񾺲t'4΂ꛚ߭}AN)O̶ށt{ 4BJ'Y$\" X۶+`6m(/ F-KLlf 0Qu]nYQ6} !θlkǏ90mvI w>7aܿ;o"-ꄜyJ6QGES3CW@${T_RY;OXPTP)E4o}! 5`+R= hsƓ{kO.p_+Rݼk=V74z:Nwt^LAlH'_{&ONF Hf#9td e5 *v {:ZfeOVXLwcO>F6V- zrSk9+\6͎L3ߝ[N޸Σ/L1G}T@ %ވҝfYhN,=\<}t2tw\to/j[qEV/Pq|w_}M2r`l>EF>eSD ?垹 paӢ{/ x5Ɠ־iJAf5x^uB=Ѕ;V,@eG3鴌\Brx'ݫ;?+}pCsD ْŷ=Hn8и^N"VgD W)nsՓvH! @cPĭo2Sg(EHz iǰw%,Kv9}@'K*wR&op5pJUoxn&GTAv{bpaM0p:@G~78H^QeJCz9v~wÃǯv9O)(%?0ڤVЙco/*oY` dfB(Š]-5i_Pvd紏` r&'l%c;aaّ#cGvȱl\K _.rI6O eA"o̙# WRtvzM)HOsf(A1x=)^EZR`ڧfܞOܡزD5=P_7l+)޲d9g<{H 7dɁF&M~ݜzLX)Ā|3i}v UIX3@8 rHd2H,$t=(5޿^dܻB DFO$7dqhrǿ0IA2װ+k  1# Ѩ̄w39BD{ãD|1r5OA4 g^k7+A3  $nZj(E/xԴ]1Tt؀,G}Qp[ 4`8;Ef@b kb/H'$)4q\&!Nw]::lsS#ϏǷF70dle}k8^8(MCyߣWO*TSBHK]\m6.E9[G[i@?ZUk* w D*p?Ar2yxl($gT6/B)/E]+_*Q^ 2B?&[,\DjM-8 O>LOvSoVnZf">z А/?<|[o8j*(( d ~iZۺ~AxΝ0mx,'74y2s6p0gӝU)0<% KOaZ8ZtɅb_H+n#I 4B#=mkRUnyl`앩7#F{dJW\ȃ" 8E=ꫯT/Cxg!Rh&xW6]0"E2PNVyhлrÝ%/uv`ޟFM;ɬ{5_1Mx}O|Ո%(;ti7 [ϝϾi%OKt \r|?o[?8*;6( ekљZ|⚹\1!Jnn{sł?ˀK}@ l8QLↆ_ҙ9!L/N|:QC/Y!#W̱1ͫn+U*츀5MDswȁ+kQ$ P+ j_;q78 'Ga5AS"J>wqgBY{Aw 1T* Ԇon+*מ;r>y5]us ##=q=w`*{c&~<+RV5K3@E5NɓVj59?(Ѩֶ=zooI}X#I ©U.Wȋ-sΟ:NYpSCyNo}&We7Q&zwwMKJ<~6^^]# jKoXaK)V?ųۿwŒ7f f@%K9{…K ,;.1aqSqxoco^D32]3u4 d4ˋpgDxTq\M($H&nNT CـCh0ٛ(9݉~ uʙgKpّ t=J%؏gXnF*J8(-mB|-_bzFFrmDj`˒gs$4?7v~1|п{g>n͇v/|a<7ޅǭ$9.Y2792;|47Mnn.u"gD wj}'nʍo;z6ϼȥG?tMqAYK8W}A2Gr{<1;k= }ziczrF4woǎ'u}qn+u ?W{>qm_~>A '06Sί58rufqW]ˍwےU`i4KSpl<*O;zٛ-w͜;sU+-#2ς%rlX4sPwiZ8:pR4g~#%ޜ ?_n֗WmvvWOO5zjOHKh_{^g+yGz; q_lEJ۾kAk}lkyAXWQ lIsғuyٖ_n6R_LY;?1g7=5lz$ L/XOu}ܥѶ vmG.9pvմv [?9V{z iuÚ52[JןjslwlV<5"wy6wj.RȟA_r#$@#஫8}(R36\z־r@x.͍:EoUHQvj.ّϵl|3kֿx SǶY aua߻gmܸNsN`{8<;sٚA {tqorHq=_r6^?)RW~ߢOs޽^#+(%r39ޟ|.?l;{w=l{o.w_~J{ږ18»?a3ytx2n6W_[^]WH3g;:^|W)R~Ng7no#oW| K G:>Ev5|D[Ws>hHZF{=ݛt^;yj-痟uԮ|Ϋ^`]=}p`_ Mߜ9k+OwѨ}m>g\mΟ\X/Lqq}Zh:f5[[|:} X|E`\(!GtJjATbAB+M pԙ#b~8 p@ߞ>ewNӼ#h&P&|OHgFr`vmY`޲w_̀S_b4.+ 1"{w҃™ʲ?ަ|~jQwC|Wv@SU= V9PVhD$N:/ 54U:>Tc LN7_YsM@pg"PPŧr]9B{ǵogG3x8M |sͨ]Ƹ?2T"s@Th(  rLfBuUU>sʖ&A?~;pAc45{K+\.@(R(U]mͷ=Jdζw{Js v@׭^7IcKَ5; XE. @ỹ@ nH&v;/9bc7]u8%|i^kJLW:c$DigG:.#hFuomm)nkXrPsl蛮lH "Ϟ8KJ 'h/çI7Me܁y@W @8bJSV/*׆vwKh/_R91;y~8A)]W/}DL8շ3R3r_!+Ja\ȓ QVt"x:cf<>X9}@jknY;{P v(r]{Ct2YțztZ Hbp".lmm5OAFd4HgY ̭KVcaPR+n?q֠y1 p(:;fdsu}__$+)4WԴ膹KD2m )O6ӉW)75Kǜ >ro"10*PJ]/0L[3̷^}w> s4<9u9 .hqݹsG@,guuVx`N$V'B [B`U( _*w KX$yiۢy_`⎛נ03D`s8'ݡW"c<HM'c +Fl:$ ә8 8Kn`?ѽR0&b@ E!Oq]+Mz #Ԇl3Q| G^dY EwA3DI yPHv _Ia}Oz!\2T?s>rrR<앬YSs-;}=ϏV(qblYgk_p ؚåOL08 ]!9݄e!ѿ P@f7#~A >5*<5}pώ>|e6 ^A1yxlG@;@jR Ez|)cnTs)HD7 G;J Š5:#V {@!#I4~*RQrWJ/_  'cLz=43/-2ǏѸ{04@! L_?gee(Y0!^i]/:쎢)tLR;˄^)7 +9`Zg#1;"SVn=te>Z?㰢VԽ-9x۔@ƶNQ<(b>Ůwb7}@VSr啵@UG!Og#Ɨ7޹ŞMi: @PUWOFł'7<~/y|o2(QUkT0 Oh\'ِeZHA ~sAUB>HSٗ${L?e]Si)e-xW}U'=yO[M@ai3e+Xռ:A98}jL=1]=i_O?>1~/=g(hi۷P%)m'5z?ݝ} +6HW׮y=%t/II%~# XH_&_(l~U.\@1=E36```"Eo A▐׏U9\{~8t\LcDǀe@&۪o>P_]&O{{-owkkdJp]{6ߒAp 0w^zo\fbNNX@9ź&XZjŒ9eŵԸB >;]CM(@Jܼ|d՜څ( /%.&_!VCanQ\Ⱦ b*]X^^2:j x]֛W?k_|Y^ኋ$kq Fec %-B\4-9gc0LX+R7m,鶕mRSJX=?wn7DlYrH&W0S2"L22߲QCiA^_qQF;BZr)O p1R:Ylz mi9 @AZ-&3j[@ 035Jdb"32sWT[Xb 6^9:pva]"y|T t |BÎU+e4M AĞ01`3 )5jQa#]7+'$=1 GrExAۘ1嬪4 CPp)@T:a%ZJ怹y-yLb)i$:~: x(D͔H\z`"4H 5AY*(!FX'J_3$.oF]! RO>5S+nѵ+A59iU(sm44Dz8Ekj yNtm5T7;͔AYL(wZ,.6|$ɻZiο(Vd2ZV- MFگ[?e}/Th5kWܬS@M<RbV+C'Ͼp]Ԏe~Ħ6egl CD:i$A4"@WS76g6[ڈc`O(Br%:1Ury<:񥋚cyB`p*I<qGX//J0-Zs}lK*PQ"8SJ<XX\"Qg;W,xi|N*m3U’9ڪ8BQ[DD4 h'Lp,M$7]Kd2aoQaAmwZT|^sy}7yZR"* 3 ,aUZu%O--*koXʵO5Uq`lGb$+ʚ˗!5wkjj BeMӍmp nɗXR\E"&b$˶{䌶H tGMp[y57T46y&'*HPZ^[W)7DH~OR,i[!UU7.XAq|n2]-7PKR;&s,TXYV*$Fc>>Bq-V^4E0B.?p !u)P4` LhD xhd7e=(8ٛ9E| E"t,H-C*Mǂ}K]qgk  /are}LPQ|BA\V3KiʸH+acL&ml$f,ڧq%4 d(Y"jx4p A,ǗkӋΞ;32QW1c|bW}:l1!:\A0 b/_70βHw$Zb5Ή.)k]^O_2n_!ƁXl7ʴ33*B¤f3\۴?aiIۨgt8h&[P ٞ)k܌'b\1BeI6vSy(ʎŒH<ڂ-!(q6%Y͢]iD1/m+1(GEt5'w( Hţ!0p`',~cff$Vx!״+% cE@ȗ q$<(a S q, K Ye +i07hLL&]FI`J\WFX2q9U/kJB跻3NHU 0=}]esL?.U* D(IϡTb02 Q$e43 IrJcqYH,EB}dʪvo&D˂L.`r ,{ImGp)Afa3"EЀ=)U(Jaߤ+$}0 JbP^t5ڜAFFJnbf2101DxrʢQLX(b/1IZ! $u _q 1N M_=GG8cbXt\( Y<&Is/˜|ˠDPh 0626j6Md&aV FV^T\ ,%@lZW͡xMjA1q%80!az&VHLAD+ Jgu3"i^UB '"jhL9i{ d ; LIri+U}q"EM6rB7ۛbD"ͣCGi6H4jmUiA? 01|rT$t<>$P"7 ˇ=+ʓ ˓JN"L/QëxbB((TpE8,1( cFo8(x2)KbIAbKx8P˦;_) GnaPb`,R!,1w,rLRI-LH iL/2芅*ȾjB%+ })2F J 4̞2O0KJ,&, H*HeX=f1@$txP(&| U !o@*&baW$ SSPM9\ve35j\"t9^fj\6CFD`[o#Y=cʥCH>4AO҃0" $h$`!䐜fڵ垑d2ٔ9 ψp{͎;' 3SB#f޴tA_G@WHV-O[QvDmnA19_<#_)GՎ^@LF8|~ZTq|Ċi:͹GPczNy, yLa*ۑ{ 4^ x02[%  t78kBHt梅B$x/Oj3g8^x+K2g0 IzJ@^C:h>&:27dۋWYU9mM`(ˆ`0fB>OSxx*[.3XjeѨ*EzG0łEttY-ކgU]_0|fLvэRJQO s-w0tp7)%XBJ1妱Irq 8*`^C:x,geHeUb'R'X6YF=(Qe $"<<1uܞB9Eg kЫM6\1 #%7 f9Ǟ5 -%u⹹9z ӳH9F[9" ,I$blѐQ)x6h{l05!Fyq]=/*eGOOVrv/e|A $pًI: M޼_77nf1%,ĒfW(N?V\B >.?VHPL+@p K@wpCo}@lg 0Ro);"7@\HC9`A2ҏdSws @D0' OnkFrĠb&!~(r:wwoS1\KCtT%ʣb`t[&>3&{v#70:rJ/5k^/_gd҈߾ҪU\Ξ}6ˮvx[R]b<\j.ON+*c5F0jHCo:;yb>&r.[.y`˫% RJ)|Zo4a?H ?`[n)8tcOdpCh$;/@~"Ss6,a!ũ }&kzOI{Q$s8RϤ*j A.$dE30ćo?)&Gb= h)+I"'pig0O/VT%EO my/Z?=܅ʻ Z{??~y1{0^W =ώWf(I4A@ӧ/w<+sNYhfqyB22a_۫Ҹ>e79_Gv/.y`f1MžF@^ɣaIQW^Z$}sew!z )o6g=='l7|}IzT[A lP /xY .Ex6[}]Ce._u 6}߽:VJPӯ#iS"0\'Tc@.Z.F+W[R{fdˁVд F9g+`rI7yHr^`"23ؐ8[فxyl*,0g(*OVCRxæm$x`;[:6 18XL[x"-8kfa"n]4r`/owqFfuFxb:Vc3Z$L2QfuFc]/ypףqU?/gN{Oed~wggϮ>?wMM_8MpbDrT e /ɷ,αT4 d Ud`X.%IW,X&I}\htZDW!_VQc;P/ҪH<@7X&ū5]QRd1Y'C][_rќT80yA% γ`JDB~)R$r(Gpʣn@{ht v|YٓK(.G[j5 -ǝNZ fdM")it%XZM^\4?O>~P3~ ]vΥ/jl:\fZ59N"=o}"ֻg ^{{|LxalV"+ʆSŐ."b{9 mǹ<;.`pYo>3+5*;T߂rRz򳃣,Wrb2&=8 ս>68$˯C(s"}`%9=M([QTo5=O^|sNGٛ@jb0yqFVINo$Tz~xӟ,VK=u-IPb A:qӥ.1=??mH^Y*M-Rɑb2?x']h^=b F6"]Y'cl)qS뜶 +6OT u(+eٖ빋%gqej^vU|-VCeZvm{<L$kb/W\8kZ^ox>]ӶdĂ|̃^t˿U[+U prN,y y|O?+PUīOU;5e[|>fT)k߽I Dpߛu8]wY;IX*"&{cc YYC W 0QYҝٶ- RZO1`b/QR2(wͭFߺ YXU3 p2t Z~]Uȳ1[" e/L\k*Sm3!qLc+oce7j'hY"}V>TLu[#q,{H۠4%U'5yK0`m[  2H9QRYa"Hy 4Pt wy&Jb(}kF `!C'id>wa9 5\vQ>"L?i '99f[[%7B) !%RtF+ge^!^:iQY.bh?O qNWn=PuUoEhgDCG EhO~osdM! 3,j!Gr0\1 W(_]Ee \2bަ`8N{#hM8.A/$E.n.aTt=FD ik2;_ zz`CQ΅\/_̭\2!E7x,60 el]p4j,²cH@:(/>;9<KB;)zjC^_MZ ޵\-ן6p)Y\(/Ô51~mHo32x:xNy62Z^ z2ʙRYOjawBnP,_bx&YidBESS,#/o%*'tĮCPi6+U$̝Ml g(rֲMHQ"R(]_^{D ؂"!wG{qo*(Ƒ;aUZR$ b>uQd+)pGC@p7N C؆V_(6)<`z9t AsU>#_"dTv\LrrFQ+4<|G\n'0Zt0,PǑ"S@/ۦU r@;4#=S~ A:Pkz@Dǿm/sy1qv(!2nDdS`ixkv{ \! EBgAdfE1!aL8LH %Ú-әB"_KT J'CcXerAZKըZBYILWАZQ%i.A# V\8_K4:^KGT4Łͦ*КI< "x/BCY3]k&Ĵ|`W::8upL1uIyN{znKRR䕭*/n/殷ENMzֵek]Ի/J6&uki> o[g!Ns ƀ &x(Dq @Q[g'?{eMS=ŋ=.$&!ɺH]GWh"+7v$1Km+ȼ-riM2$(0(+/|||Ï>Q]/ɏ~9=\תϿ|}Uy*f/=p'DKQM"bw5E3xݜaNӱR?dVc;8⌚ o2X)D bnQ^ $.XK8wxA8ANc2ov $s,бx-ƃ Iwf*quMw‰t`@#<:~T)C`Άgs9ME^t}e!E@.J[qfBpsm1=,EE" m ظ#0L3 C!%)TO60)YN1-CKQcDt, FK~3`A 8r)= TJi#YӺQ(";]Wmz6"s'|udz$ԤHm"@ΥV|bsБ 3%xvt|VD˷.3 ò"Ipq4(q?14wY; e%y-eCdhW0OH[xa&ٷI+o; 9ςj2} :=r-Dee-qU4M=xCgҙ t!) EEӔʨ{uqz@ _ Xִޅ) 63y\h<N'+"pGDd1L EX &(*J4F3YDy[ff&5_kuZ mI2Hip0ĩN0`PKT$-gB&;]z$ Y,Y-  )8LR9N( "b1_vx~l^ "6ȣ Hg Qx=)Bd'3V.)f 6*ۿt62)H398珿887EX5++iT^X׳9%cSkKMB&fZ\qVf-fgy[psP Kd 7k,Cc++pF7Q@^!d^O??ӏ?h,ݨ{ I.]-ၫ)r2}{zח_`x OG?uo~|}:W0 6[4.TQapAqș\6ZJV5i -k񕳒NcV˥ Crأ$+@$P1*k=͜i ajı(a8=σZpe+U$zmK܅ '#jE#[ bRtoDElO4dnίW]n; 8ww8Bs^9&T{.N:Fξh#^έ,'6[*ki-|nkAկ$  MW`H$g1XGG`9)j0P8xLȣD!8~hQ|gvC+iF! Lv.Pg|: D }›/" 5Ժv@8ރ<[m2g;r̎,2Cy=$Ci8wEu=)g>mq)kdYggLo&[%{mtZo2X_(&b3ْ'P<`* ]qe37aͼ>C@z oϧ񴅚?f5@2< ߡj1"*8%q0l5O!h+ONl8X_7i9MX^-iZ.&0pL^1|SdaBbgV33ti4euRz1çR+bg\\&mJ)Nk( fqJl63A!p(pŸO⤌ qdY^Op LJ 2V$Z0YqDTިb/GDD,SKkPrA9 d\Rꇯ/W͚$żX((̂LPA+u=G0vY]Dh|dvUS%[Ytw3e}eDI@lISwurZPkR^|xQPYn/opp)\z˫>&-y{L$$Ÿח;S0q;= Ns+7V73JJ7俬5*Y#)2"2HrwWj PE_zr7#)8M PF.[휚N91S@c 56n,jfzk;wKp@r(ބa8+q_ۮ,Gi^&Ga%]ËZ\~bZ|n-]O wkMlX.r͝ޥ$xsT=ɛd2J1: B(Nl~Ч5z <&X4|'Zu# tvģ͇(($"<~k UI,|b0Rz1]2Ct씈0"]N ECդ.-S\^Zt6)2n>jYU1) v29tZ `4jJ0VXG9: 0\R|n#F& ,&f ~H>hPO=C7wu{DѡLQh *xO7nmp͐@1.8Lka~UcpƭfCS5M6졕ϖzTC%IÂU1 Rlo˥y|N?ȍ]Yj#TM$9&ӫ/z{' kkзT D/mT"upC7,dJvxA ]ɱF;"&GJr](\bŷU׶w3`8KaBF5O ^V8qUԂ:KNI!55+#hMZ* !%3YCAIpI6 ЁQ7lbinbA\ ]ksk$}Yd,Z./+cqOm.4Fvxif8vzz*`ZkЁNӕ-s2,'n/Ck?~v>l./8|jO'=m˃s4'G BkEe %m.9@*#u]'`1fF"H \zg9yf(dvBw6/TL` >$hvrX}<OGF>ՉDD #Ӿ%\X0!G@guRryέuL:-# UM C"6|P} eg9M0d%ISQ'/z#S4nnyW4ղ#r$L7 cV$9i,JڥxWNY6M&r;}uq,K=Y<<=>8;hZە+^?Upc_,wQ3ݙ[b3.h($([T1Y=9Ҙ0+ |Oy"0kԌAS@Oۙz$A>vrz3ZQsPt R1@5m(wciJl3FrTMvH0IP@WݗOd9ʊx ʼna|P}u_;huk(l~޳]ld ]HftpԜ Nxw㿚*5O\|:&#{zzq1S{. '2(]UX0)n<#EX*bW6򆖇Nan+J;g-@৤ a꿾ZY΅;#la c,q9꺾quiK)^ф0vӡQjvr6U~qr{ז}I39T.}m[sيvz8S-jm]ovn Z-o}羦qB>>-Ԋ~}(AӺk-O$1$;h;@}`YB piQDzp /|^8/^;=DikplSƚT_p>3t"Rd+l_<|罍 cqxzupZ?y]$ ǖ^4Q|:soXn n8QRei2ګ9ۿ!k[On\bw?_~~T@˾Ӳ,(!![vOо%NhY"+ETC(Qr _8%ٔz|]-fb0`֥z/m?vu{c>9g4Awquy1'NH<|:J4 V&/چE0/8ku p=(eJBK<QH+- / =E-c(/ffBQwFNqyW{UUNuڝ֤DQ6W.daCxxp}wL:-Ms;;w_=;|xc}gy@E.+lq.ww70J.@ĐdܝNTVKFgq́JZz(I:aq^X~ap)1|9~aEct:iFBK7 1 $`TLNR[fP1 B*N#Sg gDrrūrW6* hD`bB0U:&4ӌvԹZ~W*|Tf۝wF1͈SB%ϩM܂O ƃ96>#9s$妎W  9d^:%B 2y"xhpYG> sI(&muKP"ӦrEt%Q-ЂY>eU-OYo?~v]6Ttσv @K ZM$!]CryސRRD|[1^/8ֱuq:ֱiuDZZkaZjTRJ;B>I;|}ُZ;5M1cy3& IZ*JR,7b\qj`3pyqVp8y|j1  >D1t|$efaq9|f)3H.!AcŠ63G)Ia^ m`G`bgɘQoVDct10nj"G>*^r c `S4d!Ug gcAC$#a+\)&<Y&^"Ea#"in+ȟb'Ip qL7C\P ؇S1G2v(Ɗ+ZvzTM}ڍlYF_Ѡ ŒevX+$@сXDOT6V<2l^E (h'++"v+irq.'@n>TxjbvqVZV7ıX  abL7I I`(PI7G&Nʓa;a Rl$-PpO6+qR8h IlJ#<`?-YGYxA0! $L HesH8ybCV2!X? X,=6y649i7[>$BAGƙ!DH-vte֋8ɒxB($}nB ԸGR,IvC-'q5NeWy dC=](B+ I cg3oxl˚{G&qt懄2A"`0:&=/x楮 7NA/LaV#0b$u㬔4Й<Nb܌Zc N<HO(*Br(F'Y.DnΜwOb<dB"0܌m^-tA_+E6f(+Wbf,}N3/V*M/~7Ib]oңL.g,Ao8XP q"m:.d5L _dt1MR@$@Й=iRaFbX:-Agg<"ڽlCx x8:n@ht1[8yX,@y@J0Mgő)%w!Ĺ\ ҅(y* 8(P()rH0&IeiR2w./%9I \`bbD$bcjX8O:OH 8n1z0'2xXI'&s=p#B8BNx|=E*4yҐD,;sj(?-H4K~_+tF^\|$N ʑL~ r g$\?2{ѮL 7S'a1, l Lb]$L8{bXX8x {}҄XRYS3„ёa%'VD]^!/BI,0>ec[itrI,6wnR$bäjM[Ks?Fmк\DU {;[2$/>+&ddJ}yn,;Aώ#$!K DTL]$l"ʵ8 1ry%|cS^IgLfD1Y"BD>'NJr8&C8+BscY[$PR>pc[b/ o⌫ 'T |1izF/.q$]PTs?s~"I:EKO 'I\}8 ғ A4|6RyO*q1q|ƽz b'FlN.>JLy.*"8 iwǽ:('"8BGcHfҏ>>7. q8dyuo|:-m :zDz`66pxv٬ Ya' mpL w3q>1ڏ*}ʗxY(D31> B hnVs_3RH0z/t ևoY~C-Dm,7u۾nN A<2X8v_[rpSݵ֖z-̊idvQ"c—՟5_$OMJ$M 9L^S9c#36sG&&RHmzZÝmI'TC.v&9ςMYHî&pbqX,}M"S$;VrION'@#s?Nm{_{g"Zފ\-'!}@4N X'/1ݼ3J3%M?jY8=v9sL ?2i7A.M">w..'$@9LG r, |ςi$prY&lf<5SD>)e?cpwHcYbl{ud~7%1!M1SKy{w yݴӃo_C~oBZDN:͜|灙`OKt1.+6qH("˛mnŃRb;bHE2rT}{[ϕt6mqŧgT0^g<~!Gz8+A'ctFY.+ %c≘CDǏaǰ~3S0GHIx>?$dF )jx$q.Κ# yyYd7`@F[tqn];lyekI*v2NxIH?;N{绞hwܲiݪ6Qh\kDO^lG XvH|TNVZ~Sak\p֦/vsh@M"#@0Kk̓ gLjkWƒc+5놡.udȥ|wOSx X|K iKa J{JD+hY;kUCl peGgpe'#O4nyh4h sERϥf =ɭ_$GxsKevFVeڬ4LڹG$ b64MʞVDAvS"kxs*p)3~&<28&~}K 4"֎w ,=\;Z&x:3q2U^yr>$%coY&޿r g~_UD}wY,p7}CTG/U+e鲤ne+M޽wdhW^]xqk4=Zm%2fXG&R9Γ;e6 ҰBD%\?۫|ERlxQE;w^SnttⳞ-JwqGD)]--/ҽ!ϏPصa /t:*^ d󕕍0XW\SO-\$1%M3 h?'cj- yJ%*$&xXž׾}dej@"|Z;@)ӄ#o-*ee,I*qow9޺qb!"H}OdɋKJVY> 6Tsbym e3oYw=#I.SE?}[> 9ٟ|Tq؁"_~y:8I3b[]>+h@`y}{ISGEOc#a mٳ||=p|%8ҭG͇^z<)h#%pG\VsVlX 'Qѿ2Hxsl?u/V_nDo+YyIq~z*bׅ{h5&lQV3'3ӓ+rԝ9۠VkUӋ/\pSW6h>nApyZ~h˒GT]^"Y K~ Tnb={lGŶ+ީGÃMQr۶ JF‚c27΅3ãFnrW ug>(Gp21Tz;iMݴ?{^= D$VU{±Peͧk"}ٱzU{Ŋ{J˹l(m>/Š/U_%< IGclR@j#Մutתח毞͎[ k^r;)mkXTTDy3[@izo\:w@Jwȯ'*uH#_U[_Ό6|ՋRe ciN~zMk C[{#e?vvpZq ]{`=tʺKuUm5eRl;uG}ٮijֵJ]:E]6ֵ 777{;à :|ߨ-[TyaQRWޚpCd>c7H }[Nj6[ݐ[ic;};x D-+KF~a>E8[3q Ueo K[~ZWhvU 5'FSu#N_x.]4ju_{]hH̝+Wq=E9~o \:?J@,޴MA;mg.\XDi_jo<} 'Vt\n5Ga͊{!a7\r嫗s-ΝlC_Q6>iR:~䥆]gvV?Q6lٓMyڠ6ۆ%nok̴ zf:E&-nי-VZdz~DDmZ]@_ф6':{mUj,5jv644L?K:!Ziz +pH0m#Nv?92H0 S}hh!VHhOE\]ΡKQSQ6PU%SFr6Yhϔa9`g{j%Zܰr!nCY70}j|Xf2D3Ǟ͇C*/o/FpѕTk>zݘS =v]3 5[ύBņ#tQQFui݇laf @Z4B-V4R;Dl9=]s6ucYj3[ pJ%N{m?f77<ӴF$^=yݦz:OT£G^Kٔ7Uz{ tb98?"!E^H5NKeH7˙Y{飻4oxMAx5y*lwwxH%g[#WyҳMXO"Rfiskjn!&مz܀ *qT֞A_7_&q'Mmn_V%-+ߵ|͍³7\߆?rX]$E6[1 A}[VWu u"%)#f:v `ԷT0X6bl_W\Q1e諶K0w+BԋEeGd0}Fwvy(VXbo[kesyuouuͩ'd[4ZPjQ]_uڡ^8wZ)d3$w4u[VijiK8߯naftv_)k?Bی`7;/>sQYN/As;mG|@z:Qa(尿nUc7~nG2M,x:F?sxJ-S hO\Trܾ|5:V[T"03ڻjk D.5ҺFG;tjΔv;:;A{ÝSF=j6ۑ|pwuxp{q}0%pvW>p`:!Fx#} @H3Ξ #AyN.=yC{vg1԰vb<`/S({v}`iA+OMҧ+gMqAk+̓W7Q0 HR* xJ3?+wbX8@};Rm63}k7]Ŧ _c,$(^޿uinO 4RyjJAb_@ iY/+IR5""I鋤# hϳ1Mԅqً$vo]a#ǛPkWf{ 7"pv_жAׇ#-_-Qd.xfΪ_R0sI1!EXUUQ]=m/|^^7يvܹ%XRB3wu j4]'ϡ_%.XlE.67êwΟ}ohnWu<6l֨i<ĩxFlC&0wm3+wS刬\3`A6݁;߫[$Czt`Nx2 NaJ䳘@P&r8UHMո?[Z XNH<HJ2;h-Ȉc!'2߂pdjH1G}6'E@J:2^znyŇ_ . MlqC---v}ώ?bEr/M>BĀͮVS% -mwx׎(N'S&fPCP)Qevy*gO5_^+G_>:u~9aTg1S `yI=ݷ?;#jCʆ"wm 3ir-,fxw|Arǟ}F;a"Ҝ2Xb}hx:"<1 )G:fUEt_éAM6M6} 0qRݼ`<6 z8,.5:'$h!~b)%\Uƴy Q=Q$2of5vBIC8-&u_p|뿙?]dd Ht!,WA%%*mkkg]#!^z BA"*TAd@8 Rfgdz)eqA Cؼbӫ\Pן~H蜟*#V*}#Ϲy~B\=Ŋf>+9 +V!^ cP3pC 1Ο>$1)>و[j_G(*<%Mɹ DTdf*9Ɏm/)[ܜ i|$>&f1 ƀA/Ƌln馴~;LJuT1>g=uD^Ky]l'y0in6҂}M}d6Ri$C8RlWyj3Jx\aA "(Ѐ&oq"ލ7=^{=~kࡹ (V5viDU+Rm,P&D ygc$/z 40 V;><_-o[G%<c" o1$h] s57%IU>J#MPWWk{^,]=H޽gfKˌڷP"1wOQp{ZY ) zIOճ<{`~R ); .Xqݫ&cM#^dŒ9C͏z# %';ژtR.GqyyJa 9leP{狪Zc(k׾構PiE޽#]f?~ϯ>}XAKɉgKf~ŗ @7@޳w~<zғ~NyܘwچZ[ۗ^x~M0,E!kOmк äW&+rɪ\))7/P'iYF+s8oq"u@ $s2 V3rR("E$@/C:x1"  W)A&G+&7wzD>^ȕţcY#@*೮?;+;DxMCP0W^T~ի$_H!3Pzp;Lm|=h!Eqvlx"OE,HW_d!`}l/nIPg?y]ξwEY P 'Jbɠɤ OD 6Tʜ+|,[ɐ:/EHbFw'Ro|œ*͉G-g̴Aϖ׏(o{]^b'nʯpE~j'eHe["UY2bd ő2â.z<zH5bGIbQN8@8 A74>GW/f ["kPL6˳h45[?{gػzۊ%01nR~Wڗ^5oN@'P|#m=xޡ.`@RН#e>9*7R KHFh"r]|I1o̼;=e99sJ%i :[ۿxP&k,_?ǶuM/5%¹wBj=or@͋pԅ<QFXK !V]dĘQpeN-=3UtL:# 9T(@Br d`|ʆo=u񉂀 W~O;z``t/RFґNu`'dl)R2'g,r԰uaft F-#IIjbDo`NGpvlH)f+I<3N{vƥ%R [V(w2RՊ_Uu܋ 0x| >Br4  )Ib.e"bP[tyXp PrdҸQѸ^dfDw'#C)NK"M/ݨ֢(;DSO_9o._Y6a&?kW+=|עWpP̷<6Atb}q]X;5YXv2 '`I#@zǤDI.6SA4R\F"=wx9vx۾[[a"y&{ϭ{㮳d͛ ѐ|RH=]&ab'$ Ps%"ipaqtB H«}&7u^u/aK%fy1":l?G j g_A 8~wKΣ'-N)/H`BI;śl.H( =ʔ<\ U} 6g d̔#"8\JA/~%ВyOzdKls|2_HHw\YːƄ *6>H7Lʄ$+c'nDSX[B?,059Hq\P2־L\Xoݙ+03ʃW^櫎YF>yjJ6K2\X*' HF}\?&LgijZR4lNyS#M5J:F$qV;5IMf)š$w§D2fdo|2-g.g>ih} wo`v{AρųV]}!<^4G?yGQwOng,4w\+/Yg }ڮ~H4nw{^sVrnK"c9>Ne3!fUۤRᓂAmRVO "EqDRN%*2]QV8)#߅ gf-ʁOlx<xٷO?͚KQ՛,$?n37mӇo3#jy3K~1PUdWWT̙ ;zo !MSsg]Zg՚;'qUU +'rW.^ x2+UUf~%6"'ޭ K̄ xL6@ro\GzdYS ZfzkhlQ=@a IĚA(cnxefgS#N;v7ceQH{)*;ivN= ͔wߴ :xMGcЇ*Őq6[eН9!@ Zhjn䡓^̵{[ԍ;TTy\xuXyT_龡e!f'J6w:S' hRo sȃu.a5 *6T]صfYD:}Ug?sh-.qaڕ vW轼w@ss7**d/ʹ;2@9^B2;xw`Ww&az|M-NƺmAO+A/H[bmƆn}3ս,2Zf|Qӥ___Mt2753{1꞊snݻA;xnQײnܲ9MtPq_&R?@۵Md˶l#<rz7Nm:|R7ޜhJt LN4 DĢFBzN/DG`MCYMCmBaMYΊwXDڴ}~v6?5(BGDvR9/!=OS#۷nx? _ *sT=bHP-WdzdM3鼌{ /,CzY,ւ'v4 r7:|0M9O=JTPp}++,ɘL^# /c}NnK3sl)Y9)?e;'Pqx㓓 xZӛ nt}̩덩 #~CHW@w!lYQbElG#4߀9L>IFhʴ%!Rzł'7dn $Ư˿wm?3P<ߤHi$~|}H~vO Jp|zOHG_^RZyۯ&T?E8}N^XE bwŎgV̑.m\W`0 z'IIz_EVd[q%.z'N?ǛMKb'svۊ&7YduQ,b w 0J^"g{~wϹp6?G~P{ݗ%lnԌ_:O^9ݝWFf.+?T^5mԔ7|b?'hxY*`,ҭ;Ϟ~?^ߺyfISܶ!&O pnDKN B!7*yR{vtz(07^Ѫ㳙Mp_zKS^|{qT۹s皵6T*ܐBYHFvl_?N԰>e=^{?, Jyɴe,bҲse {JcVpzFlmmqɃnxh ܽгywm=1#+ ](yۑ x)PHŚJ~>2%e|3o93pљ :ΠӍ\9}t*x=aZpШ*Ψ 0x|:up,ٙ]&cj1t C/̤!k.T a$URMjVi(:|gAf?= "@i/sǟR,2S'C'^N.C 0&L~`z >=3g_e0u4ӹ!]6Km$g`/ 9|߂jOr?Ǻ/erW'H .vw|ѢܺaTɓ6ra`84^%|L!MM2%uw$硔.=rW#PۄsgEʾ$m;-W^V J-{E_x7mVp}4@T2v㿸˕SCO? + %fhowovsBOk]6JvJgxGLԕo~m|v^e`u=?yTM[Bams{:-&GKh)d&Zb 1+#}NBGZZPW3bÒsrx'J4dRǟ'Dv-h$ 5MjH~$(3FD|y Go͗i=}KiH`]xvAAQGKK.@@TcN׾x+kOO{YP JP .h7^ J+=5y<ݽ[o:;yj ڶ;~Vb<|?&2s#go;L6rm>}.p"[PAQ 8ݍsgIG4f''&^ʮ6j۽!mFPz7IGkzvlpc2Bh4{rH΍O7zmԈɿ\o6vݶ["r݄vګg;7m[ۈ,q+d.rɥ W̾ڮ?mdOuY!h ,τf9ҷ?KsݷNf^́ܳ<k *p3صq+\ G Һlmfr-_=phx@b tNRxƽ+ U8֐$h{r-{:q F#Er<^T{4@fSF7Y&[e1 $A*9KDͬqj526~/};x?9@jp7ĂL&O⃎[;is'?zvw~?BG$___kLlZ=tC_>󓟼QJD^gݠQKIq\R~얝]—] ^l3S(qwZ_{?iGT;JL_^YmEAy{_sр Xny%P: λ릳aV$bnE_}; xIx=p)7w5e^ݽ>1[_]s{7yD;1l<|W~O^,hfbI!kYEwϏJxwWd6:QvX.@gݨu"D zgk-cS^!AV=ꯦ()=|*r>#T!%FǵR|p݇?*Mό_wu?VCQhU_r|hxGK͂;}_[^׬ѾKMZ ~鳟~79ͯ~d~D/w%Cs}+AWnPۯ?83'fWӱt[gXJ x|'=y>ߴ|2R4,Wu…`4'cC)`*5}?v{;pwp~ GZyTJ[ˢD|vFE|>p/{ӯhC~׿`G|f|ϴyj[cwq;:rp|;Ox'&#'jF9{J>vF%M~eOu^j`mށm@?x;oAnǦnk%;6 p_uvBQ"=Ra3+'Nw[ (ť@\ 8.Ϯl~r_@a?Z}b9$yyL vL-ϊҍh SS'2=߼ӟ>+hpGt|w7NxD&6Ԫ=hY6o~6'd+M}kFNf<'NL|>,|?b0j7/BscwCd-@n_wvϜq6mJx rkoK;6qlv~wr5ipYqvt\_b2Lhs r(bQ"D[/ؔo˧OV\Jzvr~CO %8Ozbb=[\^񥗟j_'fw.I>tzqrxϮ- +x=J*;S= %xzJ-ֵ\~]l.K?ï]{g_N{Jj|kJ/\VN=/g޿=7uǭbKcC௼n'N#WzO=uPzt3O<;&?rK'{s}y <_@h1(H9o,$_ܵ,H {=>?{鱽7-WV2Z;/=ſ9>eTeRNHT<87{\lR/[Y<^>xu{v|`&[!ͤ4Byln9rr|û>{]j<[3y+G'<+|d6>6r2xO~uFg_W!;6-Ź/iyywvO~Ο^~ca$qqo&S߭+Q)$br.=wЏ"w :'C~+fIJ?8v,\8yJ=m9SO5KBewI!|p_|}:-I/+8X#O|S_x$ɹikb4[\/^[0;gÓ~2K&M^:ġwFOLw}~Kɱ~G#Tok?o?Ӊ{~qOd8t:<,ackF #/Xno80lӧO #xR\''G&w?}_89 ١ӯsya{-i|S*ej)L D,SLIj2&'(},jrA$PrJ"scHҴFd()e@ l=zWa(oDIN^&9ɢ羛7A"b)_QBJߺ5 3R66M\ (m[o7 9<>u񺫱O|۝R-l1ՓZiv6)N7g$W(5ZV(k>say1UYZ,Nze 3rȚ]F+a5?~՛U.ؽm]Fon~@!WB$ oj ǪRulН㛻bљ0!gsnFP.?7{|?zܦ#㑏\/:[oi5C+8ar.q[\n_$ 4˜8*N% bRV]w~-( NRצy;>ґVvΟv9*Wnw:>Ras L|닟AU_hKns1БH?K_!M/-F+2d:hmfx[u7j"K.{Dpo ժ[[ $7ݞ[ˈHPE@hy<97<^{+ZݯT3ȥnK.' 6wxmwT%e]?jR'uÁO~-{a|4OZmLR+Eq@_?{uUBĀͼHNo~+OLdV@T@x.nܬM7xzB<M"kl,}| 8O޵ tutڝ9!VM^رS KMburxYs/CA.ޡ҈pgҵ I}FT>__(xtz=k6_ww{uZG)+ehq ?ھ5xf܃R99Ч?y{ךRV(2UMZVszԩWlR1r U"Vf/lm=,nPwNj MG"SSbm.M|skbx+e)VuHPDTZ]پqw{λuv͆~of¬ ߷gvZ(;v^e g3{NI4$U{=;% * Br"Uʲ@IC9hwaX#+8B 4EC |UMVz'!R(JVl2l91~*RVP$lU^XpOT:=wNa9;iuGn|uL)[CׯٹZc(D`Ef7pR$֘ 1Nt$AZ\TVcVpV!в:$NI Rm:D2.hj-"-7B*z[ @[W!#~ hTr+1僣SZk z]xx<0h@0(: K>?w>cBbpT442NΤ Lf=aZXT ZȇaMm3r|C=S]x!Y+Zǟ[J,K`gF5Z|ڶPliSozfl8VeYFo[~ԛt0??o dр2+8@U o Y*D _RJZmf͐#~0,/ OiT֬M\_NO9 V.0;mm6PJ B0~y=̩P^Y^q 1ݬu@[,N=Onl&>8} +53~A~* -Օh]I%~VZ\*_;[7MHi[Y<"E D( XEMzJ .Nj0^t`zvswLa۽놖QUX,$t6%3S[nڵE:bdQazӶsKUkMF=99:>~IQ۰Q)~g:LC*\fm#qW'98J惘Ѩ*ֲ[;6NXbE~( tf.^IMxHTh`OmL-k7|m͐u԰AJ󝂶 Oj :UKhCa^ȹWH$%l)Ip8Pɪ2  ekt~r<ʻ9o+ K~h M[ tϞe҉[kO~:Y+0jp`Tn|>EjktV jY(ިma97kQ]4)t$V \F$JEZȡc"GCK=, Z:sN0TyEC)̓PP ԅyfQhorl4hy7_:r(Toܴ3HGyO;,pt}j0#C|]f (ѱ:2#,DR@=[n ˩ZZ45k-5UY dX,OG58ɜhj^>4C D=[bJh>0aRfh94|mVI&}?̏۰ڼeF_0D*sě4Xflj,??y꼺Jt5<9+wyȪ0jřU#3_}gfGz\mT*hAP#ŧf6Ym]JA7RZͫNņ/|!yE(a2$]kpΚK4(PK3 ? &6on3'&FQ*VHҡR*rC X˺n־uv)F-P\{DŽ"[P2JYJӤ\WRgfƺ7xi)Y EHV0>h "NgRX+l1c4(f3  Hj|YoƈsT$5?5 Pfl:fU2j h)'p\|Q&_xtԢ?$S R8eC1ij|s)8z|۰+BIpfmT)ʎU/ܴ]W6u.U$QJ]pdRܸPYp6*RvXJW*Cːi5t,'z{VruzTbaf)@ ⷱob\DX A!57?C"ue489Z 9ɰo'zM2<6=UȤP4 sj1-s$KsT080tj=E&17.OϫY͍x Mz@B`żPiZwg;O,ufgKTʽzhzں5/+ƵM%bj7,8Bvh8F iY|U&-x4Q>jchLiQ 4AkR RI"75qlll b4ϒEPd>|*R.Ox5:Z>:(D&ǪZP%&U$OWqrT!Eˀ_-[6#PV\,:֭כ\i>>?r>If|M1̙tٯ[ϪV!uټUy53!-\$HTˉ?gz }=.dU 0eh)"SecPsJZR)V=ZTE,unj%h#Th|+۶w;LadhUc-G+ds``zhzU6D.$"]ݐhtv++((8+OWj႔R{葟8UJ)848 wI2>ZIq\ ]&+d9 ~)Y$h Da%92^W)seJ242:V6+(6ANW( 9.kݤ0S*\ )Vj 2XbjM`SjJJ#KR FKHI)xZa RRmwEV&NY#vSFx _Εڽ,!B#Ad԰,mtYoYT(!Ӛ zb36I!հZ_~9㌂\)e鐀zV+f=jp.iVV\*38Ѩq b:J4yU͝i5x~ UhJ rTg'fP)WGΠZRX3qV_=u},yZ@XH.wΦ*Ve@]9I&"MOZTw`)oE@, hF .. H<(f5$5\ i V $|}E h8Y-WAʌ 8hz]4(Qiv0 hFtt%\9;W+:FI TjjW\rJ huLIeOM_̖j1sMQ(qBN?;ɋi6[L6hs]JiD\ GJd ^e5YKMATLS|5l/KbjvIlR{{lb/4mw9b*^b+ Q5ԳuJtwi)-rrQVR,V(3l&;F;I%v#rPLTx$jJ  6fH3\Q(Z7?%WRxbm\ P>|%'JեF'&@VAoaNPz}r0OHm JYil51VU@d,. αd  Seh**|>37;ai[R2&G\m\jjC<C0{ةu7XaZT4 ;/GP`W[m0.S"=\sRj.T r"[,lsϏnb!h%ܾ%$GNP0+=EJ{<1RZjC0bF@m+8[h@1e(7,t:@ 3npbB9 Cª!QBprv @psU/cqTu$>CSd4%J"8@@&)l*\lrYL~{=tH|W]9d!x8<#C -\7H)/gMA6K !C}rh 680U=^2PʑrP"*܈9 IFdh*-@+b |6IFZ*s̸(2MW7ܠQJ֬S`кܢhBaL+TFU LR!`ƥ:.UZJh4+\ס*p&d|o U f!h@Έ.% ̤rKT6\eR`1eׯ%*>r\q.U޹8+¥b3PH|܄F}bf6-} YĒPv؍2[ KjаZOze*ͽӽyvܤFo2- ,k2 11z(LkZ909%Ʉ@ 2 WnRp! )FF|S*338;:\0ctFtA*gH"-šm?SrZ!&#ޥR+ Uj}g:|wФbur 5ڔ///WrosK򅲞VU>rqdB17OKfZ86g; KqQiN,Glʃ m'*ey*5yҎ-;ufQLMN#{{8z;mg_xQ+ ɨX.u9v(,@MOzo2[9:cPgmF%,?,6Yitj:J*L Jvӆrdd!tyYh KL*` %PѵXD4ZhIVy bBqB%}|._͗I "(4h/R-e "i4vR!5^z W:JSɰ&0PZC)F |{CdSD*ZastN@$J$UL@"4Q{ 4.%Mڥ7S8%zX 21uB~pbri.^|d i %zJ KHIJૄAKS̤rvy,vNoҫ\.04Vtthi"h- 'l5mkParaZg'i1-(**5+J tNK+mFqxz6 KjrҤ20B-1+Q(Ƭ6٬K 2_V8Cb Sp@U:ehNFG.7|7K l+{-[zPP+4q "*j.\5\e.8T1r Q;5M -3D/;X ,喢JMRKXH-tJc*T妋RKh%#c+*d k?ujRUas3Ƣ\dhYi`0KҪΞB>hn4LiTAZ]VRpEe44z]aJd4a6IcEhV'h1xDtغWy:j8ZTc+2@(8)B2"18=j(B_'2JJ0IƃdLHkfC'PƠv;lm^sGǬ!@ v VˁZSU1\ɛh 4Uk..BjPgj\A^sqRkP&"xYYO4d.LVvG2藉g.ցk5f%"9ߔlfөB1m6HIKJYLѬլ.|!Y6?+F-=;Ho+vrfv5$BAA}م  %9Ùν3smw߾mdU>"23"2Nd;%*PhdgEEF9?}wVp(<^Gu$ɥK70fM)Hq29c;f7KD4a-Hl?|(H&bLY=mv]+,1ZbryNKi :㋋uĈpVP@oL1PCop1(Kn˓V"P1y*[(*q\N6 z-pEz-rYif$,Ɛ Bq|fXKT||zT66vQťxkky-%bO{B.l)z Dΰ+ǣ>)s'קJӑb21dqۘZs96@J{ m4Hbdd2`9n{5ßGxp~NiMFA;PPZt6(}ҚHPnIO_<Ws]9[_Wp Yg/h4M$4h8Ѣ1{E:{X?(qHL@ tga6N=G*-C6nn #,e*yRGM!!)g8嵺D]IvnQmBQa)b.ȑBCU^Lki-e3mdf& pQ6erC<kYe\a9tSZnwoLӁl" ^lE0< 9ܖI6{GV8D^S8OGR '% CßӒYV^Igİ>19sZ1&-GH=?|ϡ9͚`l0˥39pƲ wes?fq5yusFr4䄽Qw>((βӧy1ǜMjOϟ(_NRL2EDrtkwUBi:Yހ"Ƣq~ӃXdHy54n>yz0M+\+}rHZ@)4 ]I'MbB81Sfa0YTȨy g$ɨd|"*&HTF)GY%2E(NGhmt}*pY4^DsoVi72&sm[);ڶg_=Bl &GbHR}xJɧH9d&ˠ 1H]tR:+B<v$eNE}8!(}He!&EdgsYA"EQpVF d!Me3"N%c&ܾ'JR QA]*x4Њ7vi9 Pw[R]g4M 0@768ɉ&Cm d w@&v-0]m\q4\l!`P.[$ f.H9@` XP5Kl_2ІΒ\,)gI%WQ Wo Le)$_B-տ?8k9nXI2lw>d0538Tk~^歐_J=Zj"@;!ndFoݣ|F[s'_F; `.$Nd8O&mY拉CT-1q .RP2 P|)Bz\r\@t ]W+ k>T"_z\ӧ[~(5L:/?ZR9L',O@5u`i`n\ˮtUְ|Ћx2/ p%4'O&~wokCcXr:F=ED-5ţ4M&A 9CSq<\t- Aq+=,hҬWOgpg*[ѮFChF#q(Arp;TʄmJ8"$9{QGHckP1b\a2mIF;6gGg˱ 7!}:꫰BPTc8I 1QĈ r(k;7,C 5\&+j&2Z܌%zmXLy;>~œn)xc먏A݈"%SP A(j/-gArUTہwe,ǫsI2 trw? x:립h6A9{vryKrx6#S[Q$[6/Tʆ |iDPLQR<7,b5e6 R$5"pB4xgyıpQl;H|vi H#F ED"@@@8h +'JTTDM(" ^^Oh /o YbgoMoIx1׶3t7 B\T_'gx($ȩo*ɥ/d4z8rFba`x?pusY tj痂ƻ/Óc(d7߸(K4*U0SP Nhv=zU)<Ph8ô?;."H߈n'L J{ajDTdxu МN9f:$P돛AqǍ0jVV>ZJ~w 0*N]5+w mYF\ {8hk_Ķ,+HCőuNgk#"T@^GA ?_,.U^gb ҋS 8`yy cY pW"U+Ȭh05uYC JX46vPcVbxko^1 V+ɛ9v~q4+B'2G^R1A9@.![(70vvD{}:p+`Jw,Mґh" Kݚ E=~Q~Z3t;+ެ^ZE5qV+ĉ?u)'|^m]{l2uK( 7g/_a/ BiNE6#A LYآ( g6yˆ1,9`,{&Xt2GJFGZ Et2FWko2fy7}o^'ɣWTHGgp0jvǯ1(hL2']m[S۝tM&m.C\3/3Fpר:E v"& G$!lO10L BdDpƫJ<)ceMh@Pl0<TX" Zm)@'4(!9$_&Bp ̖.)uU#+PXEO`"1Ugv"{ |A8MkG YV|ҟ< B1xFhX7ۥֲvyqWV3*HL:>=M'Z"?6G/c'W/Ӆ( qYnW|ZȉaѤ HtOe6At K)mDci5j| j@׫j ;Xi5sb񤡏 VUԗEBj5HL2]x/V Zڗ'V И.Z_=bl#ln@֬^.Cn24 㞔2lMaI 0RaU2W?y=kw<_ܺ!=b8@UY?9|&R4M}y8Qh/_^.ۣ^nN\<8j8S˟]?yrY Ɲvc/݋ƴѼO~vog7zQDW~zc_r'Zf4AjڵZ* [Lzz;bS,P=oh_{oAƀc}m0I DZ@Ɔp-u< m jñf㪪< %ai%2)ꌧވhQ9wpQgx\DQ ҜH2w0OYQ(WH \NO9@? [/R0U^~Z-S@^\z^R hҙ[?4hJқ ۅY!n5~rtAPb:%'8^4N&^3Ltٳ`cIUr9Oj־hZ U2#gzs/IY}ًO$)ҞV&raIѨSC~Mx8Fɴ@ܭ%U|-5磉g!c `_h8qLЯePWL-0E1c[-/7#>>9HRq'?]ԇQUi3s24M16n( )F7W yB8eaoҘrϤ\n'ZtO|u|p!޽{$TM nh7="E KP:{»@TH$A,pm2V9X,BCDxDH,HY*l*i Ũ268í!CMe_,D2H1 /U}X)U>5{ 9Aa![Xf{!IEPp٧xV0دwO^S XTXgr3ˆ^|<;:0Vw?TI""@;CU9@aoR(ON0pSWВ 4(0 @yGvwo&$)ߡ P7 ZUv2e!OWDNiJpnGO}s5^;\z5A HO=#iZKhXY$㐽Rޤ" htF #AZ. 4~Hgx:lng24J&IQYP,Ij $.P0,F"ɘz;"#TgBw$ PUB^v;yCKHrlU {#&ڽҝNoWgodD13BjK7RDN-CiD&%vr4Q6a3;*R$ ګ}Yl?|j[[_)p;oRBNOo7ƆƳ `I]^\ (Yh"PD I6 d ` \<4h?ewQ60|i ܍ dO (&hW\Pґ(3u{ );J=~֣Hv~O [~}:ud8?ڨ5)a;"R22,I pK>&IF4dI-o24NaDpr=Àx='O^<֎ـ2Q!&zg9c<BSJ !Dnh94H1t2^*4MB F/[a٭pu x|,+#q.?Eŋo3i3iI\9V$752I:px :nT2r[ThJ'Ohu#ZYm=4EMGo%Hݝ9@XFV,@Uò?~0N%KT&EJ$G /oy-Ф@/VKxsQe40"ɼԝ`ƣ1;vD$խBAPk4GK qEz#ś>=,o}Np> J踌Edq#9;.{r9Jo<1}pbBb7nla"gZv0_8X:ASPcYu#hYXa@Nư{N._8V':_<|/Ljqr2\.1hVklQE^|Mt=y]-'J{?xItNnCgGYё̵/uzp4O*H?RBv,O 2as [>ot_n@{TU_v^uOFG`5<:{?PhC0F#(IqhIv=)l;O`(r]~J=7r=/rˢ- g 1(YtvҀh4zY8LFQc@ )٫wȩ\^\֡IFH|V=:Ön!Oϟ=z"YHNɥ$  #0ѝ;w0ЕޫOpd;k~rk*j=,̥-Q!|R(#˅ҩ,#Hj_T1Uʗ}Ÿw D EϚC)^zO/&o7ƅ"}P y ׶J!@Zopg]B.C/#B"^ ]ߺŃ*`H&uD&$?oE&2]ְ٬{ NEk:`>WJت[RL3t&~4.+bn[W̙ o2&EPPny+t&'ȃ6lNJ[_qӃO5f %:>xYXd4ZIS77#|uqqy'вJ2!\_F>ryF2$rQ`Zj8.?]vpaQ_W~mLL1$Tꭑnz$5O?Q0,EBqf<$iib,hjGA!vwoܹd%Yɋv&EX Q5IW^zh9!۶gO%>9GY/ڀL8Vҽҗ+םUgQә֢_Dfi@_H s]tDn;BJPm޼;8s )VӦm&HllhQcRyJ4n&$ޝX~0 $x!'i=E=66n6Twqi~?"9$ M-dƈnnwW# g/?{4Ed"'?G85B+*otﻢ_{eOYY~q=i%6ùOo*zV9 h@DE^xۊȆc/O (i:xqqs#H?϶Ey;T.?PW{ J[ɥ)VRX5|>IR)vYLml);ib5B=r~zC77|=y'j9ЎA{wVbN֬}}|QaBtk[>Yb;iЖ  3w;k~yY$픎s6 ;06|?2A<2*GKpi itr GEA(\E4*|!{[Z`j._k{7.[ReӐZq$dڧV*]eK&7}; +ǟL V ,)DJ2)yJ,*[RvTBH[ɻwXH)2l #'dOH@bu< Ҏ4 ޿u AD4JA2(F|ڙgPGi MF1Muz`IjЇ[w 䄶'I=!eDabGdiҒNó9plN`6H0lVPE%LD;,(yfPW~DB܈.S7.T]{ Ȥ (.jPŝ8`]1>L8I $TB,?ڣxXX]}<9>]Btf]c 8I:Po\pسW&o70%)riCQaPb]YO '0ZV cЭ`hAX@#Ds&ӛ5k\oŅ Ұ\+'|@*ku^o pj>vf^5\'lsxdzˮQj`3W\hdOt]rFvza?jį=6HB;nu-!{z\]`\ Yuzzyq 7n&rR4YdALϟ24jǏ?W_5ٳ~l1f`Qa{,Gɚ21 e\"J\h&qNV >F vۨ:BP,߈e0 JÅ:1l!FQ)aZo,jV^gc:\ jTH,g8ŰH 0|q8и7o%B 8_ۻA4%V_ikf$ƃ~Rbcqt:nQ6zSeQl?Men3fH}"pL]Y,AP韱n&QqqҮ_\۹ R0lVD\ϳ C)2k01xLVb4h4dzQ$!~7yYF<0IX.xL Y<>W6S}AtRn6UQGbPN)%91zO+< I= ,Q'py6Pm~UpN!4+oQ8;yvjt:ВʰHfF9Zm\^й5pJȩQ)> )zlZgj|tڭ[jG6a?}5.{GK;9`@O?ysRB c|~2z5w#K7UQQ|Z\wV0 u[$ tFMbI9U((,N Zŝޜ.NBn2(*SCt]ޒf(qh*wRb8X(ұXˣ<)fe Q_4I+b %N"BS{#ñpZi2 *Lh,cho.hpq-q0:+5+Dy@[vޛPu~g]yjuZt:훳lI&||qy-z2]SwP$IlANW_}魷muYY'1X/$+r3\YRtՒ#:>~qK/{8 p}:Y+3"\st-tqhkPi1w 4mX.:7oa +M!,›uID|fi NӦVA {)Z@3S"@wq[2a~FBI,8x$<в,#%YQ@+gu|| y;hvV"r$n*CwO ׸NtZc>?{g7M嶶[\ԠY6"MN%DIaM,x}uI0[S]׊@oetXD+EkY.|*[Wo?}6*Ӟt"M k[쨵g&J);*i?| Vh}%p:::;RA ZDQѨ>tTzeeq)_GJ^^$7{,O[{ÉOT{ޛwh >pGb%hȑ!=qi+ y݋RIqoK_AYֽaCX_Zn;|u_)t8?gIL[oJS+BOOO.ޑSۿ`>'7❭o}wxw . GwoZ>[8))ZHQQc( 0C(#V5$T gS*f`]5 h1" pl(S-P՚2/`2xf4D= hP|q%^ !fzkPkr7BW K q.;haj@ = *D( iSlZ޲C.1%Wy(W'PR,M@zKq"2F ;_wxŘs{b>x)&lonRxܾRJ$IOobH %*A SY f'R-H,#o3)F 0hGX֝wSs%fذB%sJ2hv\ a \DAyѴ=@q*Z.F2.'la+B6 x3I q/iQdw#P2mv03K'-i0۝!;ЗNDFC\ZR<"Ю{Fcfs[73|VևZpV2rX< 1D#Ğ8"t0 H" 1l44IKaB*F8OҐfì8F4}~|R Uk8| BX&PbiN#'o)x(d?Q(:gmrPA0"D$qЇib8K#YcXF%pm YS 87Ar4W[4/%%4LL ŭwBe3N4pTw]*@a_sI[&9\$ hAƤ,eU':#df55ƋRb1 ӒD {?5#$]~V?{=ui(gR@:!ò۹d, D$hQec1M#g~٫ȉ"B>K~:-ҷZx>TRMŎ+Og`Q<r&A!n:r\`Tm<JnbŸͳY??,߻qMkc'~dR~SkkFr{kb$d˙ZRЫhMt_7>qm#4PtVp\ q\d:9w. ڳV4:#IX$ c?$IzlK(K"!gO3[<>4OF ākhR ~0%fq $Ջ?'fij>zO.Lǿ.|rֺٚ25ag58iVOzeizfl.KXtuCAX1GE՟b6|7FFK KM# .Y֨)P!@vƭz#d4tz v ,r,q$-w"S4!"HŸ\M@$`8ZAQPȱk  :|#Բ844lL;o61(=9Dz'K:уi4(v sWfu6)Wɲ" |V~#$~@1 "X]8l@kWb{$&hIMq_b%@[L(n"B V {V3@=![?:FVO/D qU-E GvݷJ/99.RX&!dj9Ȫ;gsW ,NhT+avo HPѵ'b÷F`_:^".WBmnVk]c(:;|vsyMG$Ҷ-DDbY6CjȲ8"[.qE ù,&an܎0 'pKٰDA6<3I[&pqy .;AW,P(DVFˊ,y Ӓ|q\>ۻw v ho+WKm\$d%5a6Bo Iɮ CIBJ[i)z.jt;2vo'BRg̊0`$(wHLNZ娌`S8BFV*bťTdE7Kq*|;)h{+Zs7 tώzf~Ltft r87})nV5 r rvE?vϜqsO巿6=ݔ,,fV+x6EѠ;OZvHo -;UvqOEPz+̈́ J.z}%(1d}a_Z7h/Yf> Wd(߻898׻\@.gvcҳal]=?]8óOC;,C GƨTq8 Nwn GfsCF-ͬVCp>i#/=92]DWR&Tj8Ú%a|ɧrsPD]y˨z .[ +ΰXD)t؂9[ha d㲚ވBcCHQ:/ /et%s39==QtE( ȷ x!"<+7,8Ɵ;pB3Db +(B8_,rڝ2z`65Z\ SI4XLn1(1e˄(2g_n")m[CF}fR稒| \U\<:sI&}E,+Gs[[QĘX XV95j`=W*nJEb\Nt)2 e9p!k|:q3Sݷ 8 A0tRp1~m0D@>F1(Ύ`X,z_N:Gk3EpN|9 Y[.cP٦VF 5'PVyB1 h Unly7U؎%UFNOcgGiѕ*KzyZӘtadvJ&/u4ݼy Bܼߡ`o P҂4?ZPxw;?OAgINR:E-=ydhg=Qlש|fu㞗-ńx5.)ԏ>7 Ecp.C15a6i*%+Q*,L("4'O}>u$jw;D%D~acXOXBgye΂K?knܩqـr N*iܘl޿:HDR* YfKf\fc8_4Z 7< :cś}l jI0|~]PTDC[jsG~M)ά`х|nF3Rc84{4/lP[\\FkMnn*@kSyRCÜہ`?ME$t1fco]MO%T{l f2Z<@T%"˿&Dp5Bv 1LܽM¤`=v]ztbL Vo1;; Ryc:Z.hkY\JߺO2 BTUVqgŵD@;@8ZB&IoD32vؕDYnV olz $e\Ib^y KZ1ͭ M,B5 6{oq&TAưUūVY~6"d gMkF>Zjjz] l@)xso^HOVo84UˤHQ(\}uYlng pG~a&`6WU×`8ۚ_,F/Ex(J`e-Z ҽJCBBA`Wcw-pZ q2΍(j1_U d%Y$a=vbc9?Yu xasĢ?G3k=O(o(Z| bDprǟm<_!j$.3@(H9xf ZF;'ppTUoj,}QiuHufP?%qN՗_>fvL &O(Nk.f_ږp|_6 $\zweD?bZzGO&\9OA-YJp>㻘][ƒ[o:ƫB&*ShM$j!i Ġ([훵ZT1*E=De@vo$z*_E; w>_]MZ&5lw5!ZLT.{!%H[F\h rJ={j2eKZ2'nFu\H3:8ҙ&%*jl@ QތUY&/.ƣÇK--߳.'ٹ/%cgG'ПԎH7$Ez ,;hO'- GJq?1KoQ(d6ұh= 0e?G x$43r6A= 5Q XH) !N]< K-BhQfw0\{ 'iOr!UIvJKCEG(0C v x>ZQ/+.0kLT`$[LRt>B}RV.N]oq]c!G!|UE >o7g{o&b9߹pYڹ45† WΑV Kvᔘެ9U49H +FI-8(ڲ BsPOgY Aqih~C&!=T@!9֓wne)Ȑ_s&u *~$)p~o#1'@\9 h2`4%Tȏu94zZZs*rńAi2Gϑp­Q $sQZYbj  Cu9voŠ.#A"vwhO&,;c/faN9i՚fA7k2.FJ>z}yuʖ$=AwCjuۘ[ӫZZ.!]A<6}Zk夎)(9BK3x DQF0J㊋K,#VdOZ3"ŬȤk@KAhcA}P{EsWrUq}Tj_>|$!wgB"DM$EI8Bc"?-kW>@d(d冊0$dC`W!>"ZZV8 X>-WCп܏Gn{_g(`r{~ ':c qۙ& >"#18zˏwʁbMJ 7ȉGXb¹^X9"~FofhCEW+k( X=]ێ4j2HenLFo<ョ?vnLa>hN)Lѣ*M%bA!h 0_4F!*Yɱ~ ʅ)_\q[ pwH`WWk5k(W,,,#vlrSlE7Qd*zzsPߵSo4/]TZKދJ Z ;@g}SdǏNep,ZghRQ۞CfR;wXl_}A|g gKTTSD ۿ $,˵AJoo^ ~%c%25Eo t<׶pE{ LmiEH؍DIhkDXL7́=Yuy8axbY=9!'S0h%xEx%f0jI2fRoD&ҥ4=19oomRDqlq%;ΦQ|do%)ϓ26w=mAc-PwN'c{7u2NQ朠d V\\sgqRM\6޼;FĈt,,]"SJ%`&+NR,T A't?q\le{/})I\L\w۳H]=kِݕ(%+\Vld̄b<ָ9Zᾔ= ڣIoM*?q[#ߝjz]hvӨ!WKE`WiWtJ@ݗUFFRφsIh** QB I;05g!%CX>S4aFT)y|؞1@ ;F[h4ҩBl3õ@ۓ NW{Q^r޴)-Y%;XD`Oo]N FYFaP#t!/7ȸH훷 ^5Qy՟MeL`گ}7f Þ~4dB;0q`0K#p\HKZbsla85[^BqxCI^ko߶X;b"C3pfۓ E奮3{b=h4ʭe,24 4x) kWP[3ZYs9گ Hyk]C[RN!eE`;F܋)4|yF }XXB^^x~p2'kM*P N' 8h7+^ i@ά%:EudB,H4|?Ii/kǽýNQi^P6I&:Ͽ\gx09L&&]:WLL+m< "k20\݁6dT] Qk7 ߮–NB,m!1lT/.s%ZЬȟPO+X2gDoDPHen-C4yx4;=kWPI:({^,ihTZjio5l` aV &frKтיI1N{Ng m?{! !aNqm <RF2qoБy7ltM^4EvԜ8w8$+R)d6G)ʣgλɩ_mnFբӹua*\΁cK.*!z-ΏGf<$B1V2é5 b:*y~_YgWƻ<ުOgKYzO, rZN`~Y|_}IkF֓s5c KTcAJjcxrxt3>F~5 &Ǐogq?t.9ۿM7C0:@P"Ii!ܹqj̣TL* ٧S5vnAR6cvk6ˇip0V-l&Krn,1afisӉdin/[?[3z(mgvٓ班yR;|T}UE:!\"6>@`FőRl>k,? )0+O-O иzh7q' @$𗑅'spYF@]^j}QE8]1}qZ|hwdx,hU[j)+UoTΪb\(RVzLc`XK0:;Of/ĵX,eU/9Έ %MTU  !lJ=PMccD>D)|նNbbDAPVKWVgs2U6K$"6ȂxT1X.=_.m;7:/E~IZӮWi]xYia\<;Ee-Wx؁0l:eU8<"tIJavq6Iq'K3`2ڍ[A КMDkw N=Ex gg&I4dѨr2qroxՅ (]4%Ijo6h (d⽖𴆰: `q䙨:Fd9$nQ9<:ع`"`859$oqIkt! Q?lVno93aB;4)A[O==ŖӗOӱRж\^u~KOю~csL"TǘvKrln(iIGE6gԘ4anY$?xPoFU<x'mӀN\[%bڨ<|2s'p3Yб&i:doRzoWx{_::Pv̎Hw? ux]gc0.чuU7 Yckkk]x6H|XXK=_ddX:)mj<"#DNޣ^git[RƃRW&|ߎm'_iMNj{٪-C:sQ`7olRd4oE%O0@y38(kkZdɼ ŪLnmV`hmM^>|N,̇®;z󴰹l zQϦӥu'_ %| sazuxq|F壓;lc`QLRV%4H. /D.wED 0 W5":lI(}}?_,;( `>811n f'?,b t1l_]lm cJSj]:$e\tjf'+1)Z%8}wɳ}t,e'<:F1 ɥEgϖơ(zrrJxr_?cE!C o|]d7ߧt1Y߽N\<';7Zރ{m=O҅b_,sgni4c~Ӎ{i8Uȯqj3l~Q1wzh4#+rӠׯ<~7!MzΑĬ62Z}yb8.8=wFgޟJ6NDUjM;J 1|'x@pk>vdc Ƃn0>9eBD&`{r?]174=G%RQ;[{uUx]5p&pZW"ǔ\}IuZG_3l?F gӣ^$S>E P<E|(=q `HMEF7!n@`3{*ܪ\"(d|&9ƺ{\=_@F^7zcR "Fr2F0tq 4lul5l !`磎(=q!QjBG5''I*He?CI y1 D_fhKC5%ttT*l:4z 8C XYPbBư_VbiFR Cq(EPjZa#md׷ ڤwFK7,d **Q1nd,NcVkL$Io5`N;'6iI6Hzrx)W;*<:ޟ4u3 5'u3Ѩ>''OIYX{<0f\,T:a^~@(].^=UJHɉyn2 K$c6pDh  lA"nK8輚YV%[*Az ZḻUn`c ÈfQ 1 RRNb>ϥ(Rhq$Bd)|B~eXH(m| <ѸD  LjJ%~@Bpr rt&[nQי?9@n U,Y8?KcA_\c2MA~ci5[TvzQQKHeԗ1Vj?{ɱX/O^$+ h[0 A`,36I򪣆gy.''!7p$r9#DQUHS>`O~+%QDY/z`Ьč&S-C2E~gݿ>~MWAk~5S`yȭ#15R퐨ۨ6䘜L Y^岨}@A&RQ[L6TG^DPSs_ FM%fw oIܺ#f2i) ;/>;[M$A(32#cD^V7R01 )ZJ3(%;3~nXNv\AE$Ӈ'<(Fh1/Dw^mM$B!fXm:vZj4ܟp~y(x^ehnn&8nF1ja8-0Cc4G|=S̬Ie9E{n+ICxcܷ\j()nR X h^~!'s* Y@GnN}#ϛɲ \!tLeU 0:˶GdAZa)HO 2QIJ 8S|wNIa5eH#Cjdc&?>O- Y,G߄ ti,BEGɀ/ߑzq{"e.9؜ BR%`ӛ/e1pAj&%9F#[`.pB^أ*)K"Ig8AB^T| dX <|% *ru6Z.DрLS5%Ql4ryv՘B1]땨=JV`NX +L.;1&tµ1rWmx(D87CaF$d8/Vo 2J)w0{lE~[6:/琹W=z>) >`6ٌq⅋Pb|n~(d9Bʯ͆2^3q1F8>՛T6 k_Q'J5G (06ڸTno:F%'p:Wvm&-OӓˣLBS04'`a\֯cSԤ #68dʴtf'k߸{޺xywn.H6ȱqu>[Q~$ ˔2}o$d.""3_-]=56K@ +'Fr$W%9'OYFyx܄WH [o6(B=2M!4E C6|4M3 ),'=~uv~Y8{{"wooYRU1 P F⒢/N-w)}7܊Nj[}bEC:N<״FG'!EEЃ{_}I o6?{|IlI4}ED9,~[o ;X :62[Iv~wvkK֭]eOOxUAЦeѼ%sEROn4_Tlw_F.Z^c=>J˭6^x5e-)[2Y MBƧn۲Bhx{\<`?|9Z865 FqjU7pvC:"(ūKsYÐOΒ8,5s:!e ,-X UZ>j1}MF~0'7S7V(ɱR6W܊U @ |F16+88aԨ:/$ᧅЁ_ٜã3{JBB"ROOf]ɦ0NqP(Y-g<˃8Nqy.6kִCYz2zXk0DQA W}rJp /([ p hWÁڣ1 kN9X;PaøɒDRbg0o2B {m'6# b[KU٬VZcrG߽ubLO%DLI&^reNypg/璐G2 wj.`.FMAĨ@OYa@Ԏ.NI)U9Έ^==)*EӁwc9E /.x7$=]`M0-`i PS77Xb2sAсsZV 56 iX@B&%FǮ+'ti7zx yVb;)T6άgxPX5)ll'z0NjTO<?:]Lp* @(NR4!qowGFUoΜ!zZ=K 8{_}=8y77ɴV7v*^K2WgW9 !Ҵ5_5_%:艛EJE B),kS0|)$4+ KzfwQl=&ӌ kBi$%|>8AHd<.UU&^.k Ys0:?xD80竚&!/,]wZIU)e~"R4kr>U@}tÑ|q>i\@}#0(g})+{ ,|a%QڂHIX:/'3K鍾% b{> MK&rM#,>ٿ[(RV=Xѝ,ɪ1ۚ?-%L֥ݎ`n!0/&΢^_iD@C&BfZ깾O:5kԵm'Dn-~gg+y . >ᬖD&`ɕdxHZ:xZ[^>SZz ˧GC`&lp"o%\||έ@T|[m# UpUq^;~o_X{{k$"B.GN1F*#E׃2t AqVNƐ8\Z TL 3IFTjM%L'"ޮJ4 FGfvMrHUNLMQ ^H5ƚTj#\Ir0Aj\a붵`B4 mKV@igl0 *xX!z-AQcF8d]<_܉sZ&g/ܿs9'݇%q$(T2y6(?a6i7fFNTM+C4e2CdO G@]\200&;ZN0]|7ƋyHR)&vo߽ӥޤ?_}ɿKxpӚܽ JbZs?['G((@ı.@ .˯>epg|>|u"QUţA/*6~tTO|}͋5x>xu#.@WG_|/~Iĵ ,@wtS-Q~'__z"RBO{n.9hU~}A(}gCq©+jk94OO>_lhmƵG/dl OFދ_fbȠGAV?N?mfT6Wx߈R`0kc>*E5 D^R^+# U>7zϰxT@rT(^w_mntK!`R8S"[ΝhLr[oݹf_VN덦CˣjQ8}x`!wbz-~y\~dU>$"?m3'}Q8j$ `>8C11cׁ8?8m@'Pht\-!U5]=rLU8VqrhV@ 3Pיx19BɊ٘`Cṕ]`p@^3YbOOa΅1k4v+n'/ܴ,N "$zY::;%@pO|(bHF%5\Y8֓o$[b lڽ1uB:[([S{r)LaRh^ISX Q>6-ce"2PhN_ ޳/N< '_}Qvx3NUzqNƲҨ#xfVOM$cE pWTΟӆ*y~0/._Re7i۳UUU5̳s&^>qV^ ;\/Rԇ벶#`ȢXxݥwc`(üi&Υ\).Sk{,:Ͳ;? JMX,[nFa?eo[ %__R oJj򫋽c2VԨH`:6xq-9 eȆ:QF4YP4͑<םݚ(q̵kC\x l2 E)Eȩ) _P7$Z:-8vsV3kS'{uS G3r1* ZioXVH{i;d";8bZpow@ͦPT< I*;_ ǯC8 Åu\qbY6HS:*39nދ!G1FK8AI CI\^}Gh 09p K[N[_{WqޫfCZI+; H%H^ry_᧼5FIlX YuX֮V,gǐcx4fNUsvwvRdyKaU_WA+?) ?MKlD$h8v8irYlf!$T | -'yz_RYRE$NײxAOl٩=cbmBңUdƃoGHjbpYۜ!5R 76qcRKDŽͲx%ƥ]A:lXܺB ޒ$K32`$v@g6R"WK[ýMf|T_֒'Y$N"y)Ώ~t8ngFcw^Ae^:ԺZ/JFv$dkanwT燡e)ehx]u<~lx81|0L -{,xG9K10l\J)A&M͍}]/n>6dͣ;'46MGZkJ VviRz*?Sg S#ALIñ>L4\ $:Wuo JO}aN5"1ʝ;EKPBsU;NŒ*OW/ a}U 1s0@9ϩ,%ZFE>ػͭ0K"/|T90Nz|yzˤFH铑IxTJ;od e JwVr8//P-8MF(h<04pzo b)fˮHo4q|pGQU?Փ3(}Chz+26:M٧¤9M,bpѻY*#V`>h-1hSeo:h7x|b6q\(hTh\[@pb^m &N֕ h>y{lLD|tTN-A51\cOag hU9=„GYQÄeBpo>݅LBS^O?jC+޷߼BU+]aeʊ"j! ~ŚssBIvkl0Y^6= o4j|FX,&X^J /pfq|V;U>nz8gC8:a FfuQdZkiqw$I.Fչ*Ch TGS*b/復ɂxqݦ½ޣcY\ܹ! 110O0>hߺ)Rl,A?l^{j.1o*0<4-Y ᠴ]B,S#E0O'˅f.GKqWl3|1[ j:N"Faӽ`*LZ}&%(a*-<1);lWkG|2d)e,H ), 2$)uCyP~E1; gC14~zbi FPJ=8#m@F~QVۿ x&T~#'aYgRċIM@btMlKXt<؈RJa4*X(|$D@D>ij!.%H| Œ3ì ʚ(1& k;`ɨגp(| P<HK_481 MW23!gExZVCE4:s fG qZik-qA+KшЙ?1pJH4lo6LLs2civ\s$GJ|}lOLjr,^zBss9qL:۹̉zwf.l~Zk)Vb UݿcfT7Pu{ r[cDxc¡kM$H4oOmsjۡ $Eo٣q`1vǏjedֶE%_z1<8>s/O 9qnMlۆF{t2؈1YE˥-o? 7sܓn5Zqs:S Hv{Gぁ*"+cE)4:C2иKJl=H08kw)%2!TɌ21v4p>4c>$EF"")SӁ,\.tjxQ$>BtTc8T6тoc|Ja0yhvshӅOз9>Ʌckq%JD !J9D۹lvlbyIRC ![Z _EeQM$U)v핋d=w¼ hAE,h% pN"U!H:J^.'|M Ђ + qE3MB x6`…8 HHPs+ %KRP#|FIr/_L. |!A).1qo]*o "JM7mf2'JgBK3ir|1qxɳ18.]̽C S~c(u\ځ(V>%V5S՟V$ﴺ77@)GCK{v̹s.Zwg?݂SGYAtL ]p]7TRj7Kil?}6o:lya,n&7Av6/ qgϪ˧ X56p}&\~n"!?zR$Y.]5TB1: /~}SH8Ȯ Y Vb N=$rgDʹw>~RA^BZC)y!Ai1j=U>7&)J:246ݪU ĻaԪׂC:5޽@.BjOjƓY#..w'Ƅ ¥Y9l1$ȕ˾i` >[ 6A0 ޻s 'k.YI7q$ 6q:!GEJ:G3{fn~|h8dJ?x+UI ᝝|6#84"k'&8It<))*׋TXydݻ"K갎dFHeQHXz0^/$tZp<|l Q[rVVrχ=t9P=ST˖x>D1,JWspI0,YG4iP& bw=tIP>'mxPuKfdw L6i5[Zxs BAD4.1A4 X}hj4: dw&dCP{r@9vPŝ|1tR᷷[oq2:~Jk5Sj9)=l!уpzxx20.i$E:[Hc|tWj ł1h@B1Y>]kuŭzi.(xLeu7ݫJ9pw,˙|*Nk0jCgKgVk40oq6ӏZk/'bq}?̒˗VɝJykAخeXc j~ҲWu'<,Z yVv[ݎW1  H!pg]Y7lg"Py>r;s  PL p4{}hCx:@*e,\RqN 6ݮ /j5Y.~7Wr~뛿c헯(8{l`Tpۯ r~#T*d:}~ޏ2ah5numgoݽj6"9iKW;j"6[o\~o߫*t{an khMcZ l62h? /7)O0;(,5-($E=w*O2TxPn҅b]se>l4mgW[pm.hgp{`S| .^FKUUc\l `~A]1@HCIȇHs6,&35% pװբ'80/\9"bZ%:nѢ2tzkHhD^%Rcɑ"(5`4 x0&h6`h|cd chGFs:_˗U*#wV梺+ S{ _ RSxP! N/I$BAqr Z2 5H֔ ,E+vzsU/doq'93Eg>Mg<=Ch,Kch#yE1;}lxNQ$\QA^0οV蒂9/_dU|2oX\| TQ9υy%E%UOg'fD/SfɟNK|RKoGyG{'镜hv[]vf=&|T%:\_u\T0&/8Ԋ/>F¯ŠYQK~ލqvvjЁ;^]zծrRќ46!.cJ^} 2*c"u|PteƖ(OВ.Dj(/J~Woɶ4 5qww7CgF}YV>gA1<7Ӌ+++uF444b=שڞkMj 1Arrr(((rs100/Z  Rq}O=:_C|Ac!Q ~'Rhn= s5]Ml-84AUC&55U /ZZZswD%Jo9xKLֲ =a1}A!jvRiGjcUWdT9#7$teaI `>\ -c9H871zL}i)jylja$Qܟ˧‘l(@]LI|6?L, }B%VE=!KtB2' ¯*v8<] qyi)MQnGFvPR+iF~ <.3L8ٝQP mk^S(s`HfʕY fȊZBY] (؁4PFF&D8dyK SnwZV8$e8;{>"rʰ1&(s-ILD,b hڀK41}(~!=W>/Ih#CQHje)qlq=Qҋ{>YRYΑcYkP)_+6I , @Vr $j; xn5͠Uۧ*ip˺bvv6^#9܋Tv $@0}Z Y}%tkTgfɪV"JOIc,"$Ŕ4N vXi1擻B یT/bܽ%0wͳN:y~ M]RmU8`Up`Jkz3!1-p#nw $$qBXmb 1o T[oBiV-T63㰚"vxG)GC|U( sа0x dNw[?lߵ ,%cIr ;/B@Ϥ .yxio%8y4@*((`?t?Rk"S&C"ȫȟ"-ڑ*&Wm!iF-?@IiOg ,|b׃?2tpVb;fUm1&A%KY44n D& sѲ{3jDPx(.*:rXjCj*W$u; oi| E~Bhu+ 6洍O@BćɅL,"BǠYR֨W1WFl /SfPK5rͷ|9+ q|S,"7RTYhnss]SZ@L%]Ik]" "Khᚭf89Ʋ%'GpB 줊 +N{v ;R d6w< ;++,"bUɒ$ZtlfuN%C9(cR#Z*ig\UH=%=;bЕ6iʎE4s3?$/B,d ^~L[Ӣs9& !WiTڌ5+k.o -vYPM4My>zl, Q2Hh2E [%=O%ؠhsz^@e0 Pp!Fv=n8Z7)-hã ))' `XEEAh &k 1FsķP8 wVuk;2dWaHT* Ցx< :QNNIck+<7vpkL>d;GrR:qNbSěu:=TQ!BFFŃjdz5H%y؁c ‘2- Jw8p.(rJiW]ۛ2+A6Q[WfTkOh^N)OlKb=%7?sWNNЩW8ik_oox}8As鳘xN7EDU:U| v677ndg_rz+svt$Ŷ4IO䙯#[LKrW@r&=@$kg2(9)hTf6-^:9MzV)BOwI H?ZW*,jU-#v[xxxvksp0f`p"desL(;˩ΨYPW/nwz[oS`X#ãyՃܧYxYVV&:[r8 _m)+n-O3bgKeG^*fu5#\9Rt=qUq̍ KIK}}BE-}r oakn0[#LjpJ>6uis-: ͘v)L!I9Md7]+SQ)?E✆ rTqGzpڌahP;NfmȬba)&ϟp]+ʜ:_\"Gk"PEGp/ΐ *Œ2`Vnw9Vd&ښ`:]:RRx#qACٮ׍PS<Ԯ6&!)K]T.\ %*Q)g22x>2TȿLQY|~ l:V[@]J%UZa|]tgc4y{o-r\.tP#tvCD~:$JEA̙VeOrv33\Q@C:1zP P!rѐ9^)@)Bhcǿ̲P n]ElؖF2aR"`172Kf  ;S{AZt?\h`?aR(>noI ÛO{~{_{i4%>U. "qq)̡ u|ɝ91Tgt{uCyvB*G*?sE B-L=[}29ᘳ/N#>O3„Okpo<=; 8xɢR O@.XuV5dГt7|2~_8 ݒly,*UbSwxv9 <=9C%D(Җd2xeczZ[J ^cxS{ႜA Ŕ#C b$FG5ͩbywQ1?k4 ċs%Hݨp; Y T9 i p`VxMEݗ4i F+ ΋j<'\\.|JAnWh7-gL+SFL )x qֱSBc  -,DiY2Y;K׾3ٚ4j S<!2F{}e"KhtITJDsRr6nE/ AV7 2>>6W> VM˄dEZztIIYͨJB<1`!_•i?wCթصbFZ|.7ڧ q%y^OJRfdZZIZkzO֛RMM-nXn,+KCʎڶwji+ {+-}|fLuz,ؘ +덗 MsX;;uu)WabhK<CZRtZ=nJqӡEׄt'6vޑ8Xm~\Š ȸmJ4V6Kbo_֣ZO*,)ic-t`~/d0Os\SC'2s? 55kjJeF>$`sqpL+r'x,K~:ޢ:?lvX\|h^F&KbU;QjͥW{|W\P}~s0/MDQXL}!S*beZa=ɑ<>[ݤ}>T7}PZI豣k52dDZMc[ҡ*4omV/.)dΙDV{qd:0%2^p:xcnf$tV,/sE۸{Â~MdAd^u&n::8 vc^B[]pG,Fd!<6Jy9? Qη>ly=.7L&א@>$?^ZʥsS̅c6;pH`z„ n6J`]$-@7Ow{&-VKKjK(l"-x<||'QE婱"/2_̤b tc/r|%S$KOfffi緗9лHtG pNS؍pqӰo =TDTo ]YVF uog0,_JqgQB:R SUlpq! gc}"9h}p7b.Z3n g).7p c]!:<>/q^r-;ꛈ>fujdahrrluRocm >ɨ3'?5S Zg6WXBb r4twUL+zGp 2Q+з'Dad =w|kE# Wksx&ިKZ#pX6=6цzA>~+8HIq⑽PNLY._k>03!ڰkK[!`h_+)33ړDaݽs>:Zuwob {*99][\ϑJ^rٿ} fuz664}A$NODK!~!| K k\ "UlF0yBp[*0>>_Me6}xcK^.-*vE{~ծ:lu~^>sK $>T1q0)ry @FG{{H=`ba6@Ѡ8q`(n54ԨT:Lko ^ޟjCXۚj%#/mi M bVɐe8?-\1 npnjmI[tcq)Ej|/Vzv>Wx|)046WO7I?;+b'G[J?|r3p>n[gmOk|gQH(lK<5nnA3=]4"劙@}X ] 1E0HG۠M2ʑ˝c ~. l!&2?4N {f4N f$ݎΒjSأ}/צAyF0-cr;2-C {U;qK!Oa2k6p*s |Oen:!/a;WUQ[[ <e]Mdz%yV80j,~ĉ㘪]+F^{\4mDDKXXBd3:2_23O \r?#$/9mo[߾q]i қWY5{>.S v'e /{/JgF~ w8S@GI%ͫ%DEdY[[ZrΆ)7oEYq#͋4,nwOly.,;]< z\lRN5Bgou{re)jުL@ހ(pWN٨=*%%C¢عZG1Œd,ɁyEprtq3ύy%2ex3OBFkSw2Iu Ǒ:u1xTn߼i(uh8Yiu|üL90Bh2lMU/]8xgN wg T|􇓁{T$jIoik'=[ )ՕK! bڈ .̆ `JJ0+Z9jtn' 1024'1l(A%3(TȵJ~HblaH˲CJn)%Jv*fp.ʇe+Q 5η 䴚B b>qf6=9~79f^^ "\u?M )~ʈJ~'bE?ɠwU/yJrdSHT P%~NVSӟ2durO?꘩^Γq>CemEo>=!/烻.S Y2}o\#[K@:dt$N=W8ÿ,*ː smwP%)_Dt'K4 Bǿ}~?DZf)>XAڪ:[ړSM | pW>[!!./m|P,_SXXHE4oXʖnE&_a}QKY%.ziT F0Ɓ\>^Z,>|ZScJ[ͪmXB,D~Z l}+t>[?^H{r)ADF7,@|VL˕i* vZj9ߓdqg(l I")E3SE7mwR%)j\iK2ղ9sf~8KgZQY7Dq6TnGUcR0w'd#~ըTXV8ؚeaaЪYA)<:y=aUztɔT4*3~LJv>WhjT9WT;5VO3L=<(ʨF߾ )nxi⢡e殚鶖#TupLvs[ n([EVd3jOLң]PGuuɭw%CPPQAQ@PPdldhjjdobJHź2\E7y}PV[A)W(^}hW,ڦ%nsm|"D5v65%GWP5WD(Z4ŽK^ )ܮƞ~-J*AG9${*%_qXCSZ"' o2 UV4yޘ[NIƓ}Bs z|hsz_kazܟJu&;"j0GELeQiœ95%bwr By$JT&GoL*C6Q tDU +%M=6"_q { 7`4=<#:tݔ`a?giII,@ fIZYXasR熣?kGHAK%=9BZWXp5Iz6ZEJz&4Tex3Lʼﳊt)4r6ͿIF1 N8MC,^wwkӿhNXՒڅ Y9ٛq^FٿIvsM'0L>&r02nI t9 J^`joR|5VN}j 2qϟC[LN}Wro99 .{i", TڡH]A?ZtyycMt|#F8ݚRPp:q[ dLXYxqE7˚+EGUZ櫆2C `KKFB. 8+C'#/BX$CmHnub*t#%Fz> xF-E\֦>@=^'3YMMѷåtՄ{'WGi4Sى a3:x=;iҾadۆ K8P.8Hf웅-k;R){]clW$өLJΉBJ+M:#򜳯UӕJoln&V< P;HHϵE|!w%?qObKk/NF*R)R"2sxp0-cU1ڄ&$]&0~h@GK/m}Q$B{.D[\S=NAz{РXG%Nb1aH DAZZ!Jy źY*9]0qFOB>& gX /iQWaUò}Q_!جjȵ2N +0)-hxx.+aKiy2CGYQl ̥.YnalX4D@ X~Aօ O,-=POa1L̶0Ȓڕ^‹ؼb`-6q%g{%{rϱ丩f_rMvUްTQJ%eA[#Z= ɞ? +%@|ނpp04r59X4!NbfdK^jr(٣pд!0Ba]scX{%ػ{d`,[PJסqo_P*~Kp2B\nnmlbVv Ҷ0VɟPڤo 4>>[pufqù"ƊVxv^7x\9.>>3'ge8UPpLJjtFGwo\t|Te8vfU'mp sYxwbDZ]7Wwȯ҉^I?tZ{^][WFAKK +i9""c#b] 888&156Jn;W:qq7[eP2yxٸK+#PN⥢isjuȸ$Uf,M77Śֿf{l?2CbiH~ŝ2%r.~/;^$^+9>#=rs,H2]V!=O6k$.ύo/Q쿿kufXXYX GyaO446cl3XZϩͣc$oPwǡeg.!?k4`8_j-vۃȬEm.fu,B$GKZ񔜙՟SCX=\ߎhhwFj=ּ%o X;A)3R'Z`MLI5<ճSzzo鞙E 04pokilllΡKtt3{U8A\\\e,`>ŷld{h$"2./u/;)0f$c"06T#S]ܺ >&RT Uh5ARDîeH|f)"a.XzK|l'M3zrrC%lzԂ`ͺ+#|j)d6f$V rx.~j&v" >X8ܥa0["vh{}<²cE_^Q.ܜP4(ZzhފE2>bQ"BQ]iE݅D2͜,P: BU_Ls޼[R9 mfz4mH @ +d}vysظMƻmvw{tllD|O܏ngl,Nɡ=8 QFσadvIӑ- ֪I;+/2*jI.qM6ݽ%y0lvdtPx8*?0誆.J(-CJ]s(cp*rr]WeQ7>!kܽlVz QH6Pj1rw~qm.`O3ɑx"acZC2vB^xGb::wǼ*9g0ksYyuYޟN 7oD77pHzw#tv5Z?>Hk&[;9/4ln9n5I>|m>7 6ç#NA3M[>ێj[ Ր\ #! Z \^wc׏OJ˜bܿ˳KJJ v/Jؕ.Js *W aPv veJ7=V۝ҼZ ˴ՖQh6)Q%I{M::lK(]'_4\try#dq{kk,Ϗ!őqSz봂o! sRsc!7/e$ zna m'f-0 o}凨<!@6m~[p]j#>i[!}cD!df٠^4יk&O pߐ ^)B pDmٽ =6h;w9C鎌.7xpROg u0"B:QzP %)i~=\j j6.oDԚ=!(]&r}R6{C,LͶVZסV)CK@@EVT^V~ZjIN{g,ccʖaeMr2]oKE (_*0>-l/ {e.Ⰻ%0[]6k%a|-o/`^ JXDtw{={]?/_ZvY14'X5~g8V}Ú7bӿ1Օ )HF r&IB"*]p"1ö\i*gr"몔zxR?:4l9lfd$~'GGd j.3-toOy*}cV8,'TPV*777|7ʱ]O=.J}R3Vs;\^(NAH}]RbʕOU)T.};8<).. $a5e?b93h8yHJNhǔK"j,C|4Q.ծ 4wy9VKBg}ZMM„jw伭ol-U߯b7w.G.L-S̿^_}c1%"-6~|6:]oUCAq^w==Sy w8:ݖKL'Ks!lոJN2Q  gey-hl[5LMws;a67 DT = 5lO}o2oݲoZls>Wf4Ƈ_ jRMm, Ց\2}XMd Y ^:RStޢ@ d{>N*x\ 78CEwv]Z.Wozp@UZZ vJZ= 8;C1Յ :Z//rd9 _+%&m*uCqqt =wYb$jzA}@`5C?Ym A=EzNeiqn(-7MMwƒZmᒞ6Ǖ-u='Lz ?7IeF9MyY~A87;uRt<ttv&f,̔f;G o?8KpyxiE3*ґ^L4ߐKq, Sr߃]@17&Nph{hi-s>/l<+o5uNOKEqڼKs$h`;ZJolnFeQϗ+r/T-;(ll (g$7'8?O555@ZNZ^S3m&&[r:hs`ln/v  -(L |yJK/K'N8 `i[rFFu2L|ҥڬNK t.gCãeZX@8;u!ED.㖚FK=j50N Íj=.h0FW1 6 8Ml}(qlubfV_b4Ʒˆ5)"tHX{;vƾe-c{sXp~z Pw]ofE3e="M}mC,dRZAO R#~ TaJ Lƾ.Qq0,;mso5,+g%±LkOto)4㩙:_yu #13lᕉlTL²pv&̑skΝr]n%M +LXo ʥGBK_MKMcXK-琐Ԫ%Po)U`ptzZL)C+:wLW4W]o(2[*LMX[GŧԚ5ϟkñArsU$["~a`b<e+B&N)p#Jځx(GwvEUMa?!׫Guf8@צ]h?=sͭWڔ#FRTOe4/4ł^.++#cwE 4mMv%;Tm sWϽZ2 B8vC<1??/BtRg+%P~wh@,"''Ȫ $#\l6yqF U) X{tXy7)]iKOIY]O$=E瓠vjE VnU+ݪ8yiTϡxc/f$ңOau$;;Wo$cae'tOYa ?aPN{.VWE'jv**h ׄIp;[p Aww*%;UP9=;~qq ص\sv@k|i&:"*{hv#oD[[ֵ}w LII9ғ)-CYB!6󔈈{6 ppBDxho^g qWn5Vub!]o<8???9xmETf`^)ncYPPCwxdG ߞ$hᦧ)kEͶɒ!""B$#jT8kNbr<* wQ#tz hB]rtX}dycUo19Yi*$tSY=ٺCP_0`L}oo~E {X}Tcǰ2W{0_Rk YHg 'FH:kU~O2:rhrWKa. =Mq8,E. mįMh]cŭayQ3Ylpi\V׌݇߻#q9NCCHOf zF߹l0Fۖ83#{v wcl-q`Lk#<`73PHmV]+9+=3밇y"}645i5aOBݿf vnNfD(&L +-9 k[+ԣ6ߥEv,hD,hk+~|ͺ@09ZT9>Yp8~(wLK'~ =3Xds]Y/=ȣIԔF0al\F I]s0tm]{b |Ʉk=GRKG6EN-u{У1(5= SU;ts:+^*E`ffeܔ){_G&a;aطg`ZyQدVy*ߊ2pf v .OHS,>}2g?Hnv{5N6z W--Rbu>A?`*חay+kg/uS$<V%ORX<߼awMR0TmS䓪>>^h\F6C64MmL!;RRhc bڣBA㤢1yY$eߧ i8{4 s lI[l DPΤAek(l>!XW-\M` jsy}`ַ>睃zۊ(i8ٮiAwxcSPܭ&ut[wA͂,_5( $_Ηk6 k+ݑq%dR]u/֛ Cki_tbDLj5Cn djWrTA?b?ڠQe`jR3~fcA;)Gw$wo2?TTPX 2?aޮ~o|L?7ߝ/4N[YlN:[-ta-u W&]_𝪵-72O8%E%jXC r0=&v'WZMjd>ҚHH[K}s\?kfpUh3".\8ᆹvW3ɦFG ,N3蚶KQ*lxM)J1vkT*Ҝe6A. 26s-%#Փc(q#+'SM/U~:72 V Mp~iU9RrE F֛-\d\MN6PM̰tKyDIV4wogTLx&iu-ZI֭[C+y u)wzV1v2w~6S).SeK}0Zש+._%cmO<LיT{.IiO@"9 ḽ;=\;1m\gYITw+8:U׉ &}Vuqu]-og6[/w4"FoFcVQ` lV%Wc&!m`tJFyY&]̭Qcࠄ|etߊAZtN~8IFMhAB_%y\U\`\NKǝvWop@qGKMmo-y4M]])d:I&Uy{4ĥ>p2~8vvNp7#n~ PzǏ{2YY-4jvBl= M rD>^1Զ_˿GvT*`7_m4Lѷ)C1b!m)~ Gͨ i4A@DE t-w?Anlm(֧ۨԄ8'YX+R̂'>YYY-k-nrcgKUulB`-~R178:^]t5u M;dӧOmS}}K~vDˬfȄ}rPeortl1>"=ʡ(i͍ߜboNjuDn4g6\hj(F:N ;K;jN^t\~*aGQx6Lj < #$df>TOPp^ɲ`NJ͐ƲE٤W_0b@fRM )=ak)\Y*#f (^Rf5@e+&HFj_n y2WVտy(|nB Qq}(m8"QclR⯀/E[#Im~ j=[#vYÆpL3wY{:Z$o܎ݱ QvMK(\1qO1 .Ӹx: h 1ƸϒF/`D@ ===vذ"M-~#ƐweXI_'3Fz%ɷ7/NO|PY&b&Fy]Z$ "L_$" ck-&,ւ~An`)MȬs +Y\\iiiT 7/WWz빦ׯ n]otdթ+heF'`/|hr!ܬq A;~7a\ei[=(hI+ru%_ʖ(d($)CcN3C % c?~K`mf~tbB7|bwnG` jPLw!B-1XZ& 2'e;,]qyg>ɧ|-/玹nWaْpJ:g#r$>2kc0zͫgMo9I,O%?$5O|(ߖU<&5lgd3XҁN[QکoL_lGr7l3H6&ج"z 0+kjDzCPe4>"&NSoJ=D`ڲݦ&^pI^}}˽΀l.N΄ޒ$I%$פ!վ%BsiRZ$S>.- Beh?͠o{ #с_! zj:H1b|m0mvULDx F'ʂ;/xmhsuvFBJJěƩ=<^>)@&D232>: z%^P.b1btv %164*k#ɬf*k|l!ͭ{Teq濟u"yBa"3;(X䓡336aӊC#[5GF*D2dgeCa:xn Kx>A3:$`b7;]w"tcV.cTr re15l5Q,>q Zr?]19Ec;7a<-[j)~U:tznūP61OlЉ'zZZZڭ7=kwz!r㫝'm~q a?ǜW#Ţ0X Uz{c=U =%ہ, f89 zqj`ŦH'~#Qtn9u r=[l]+VӸ +n k0Ì^fZtӠF9'锚ݍ ʢqx RoJ82Bpe\*ϙ"m`FA/f=04oX0)aٷa=3y`Nn%b<-D2?73L& ,kêM0새=%Og&d]꾜ϝV0Fm?YQ3q}7M{t@}z`ɜǻ3fawe.~V@s*K3Se-Ep""[[Lq#C@'Ү _7VVPɰHx~54B0QIe%sÌEE<%dA&mA݌kii0 M4 -:H+>%4T@r{y6(*88 8Tpplg ?ǣv?=8>_TxVL ߡU} wQGEziqƇK)r [qxl50'a In0e{v p*FL U!ti(SSsq[۱0D { i\J 'h/q37'G*cs[ 4ꚪl DixzC+0cf.:#UšBa r#-Ron7Z,.>E Jk 믩c &OMMKd._Kʶ4g;%YNpwNiќGG|XeȐ|Le_!#UCN\AS]gK*;2ͼ .lY=٘>hGKr?LAQ^*#WUGW|1tq RbS4T pf!?xۭԥ =Yy*zˢ}]X ŢVzH=R ,1q{toZ!td`l?yO< ܿFJyi<|}XIj0'C0>ys~DExo{CJO"6V S/gF}.Fz*MsqNg% VSEś1`X0{tlB¬\2@Ը]=%L*ȕ EF+k`gx<446]9iL`X``DrX#]wN@@FEq1#.c%C˱f10.  m(z*+!88's;_0  I!1$g697 D)XRyNi}X5}>\d+c g躍9 J)>F{ݟ᳓5ml=Kz[7/,G ;{8zw9ՂAӹd8g$#oo[;3m"H\Pkb)55UBku]LY% õWVQiKU@y]:@_LG.7/_J $D;e،\u?U/v z="eq{dLu\J8H@{gž[΋ʿẅ́,xdPWW+Rt'088㙲@HNs DurƑMXK{?{9n 'GfGY.);x[c5uuԗ=-Z(% j<=u=Ԅ 7ay2Yսzx#vS./ϖZ-Kؑ-ށ:'oN@<}(+><83tdG  56:T0MW!/[!$1F[w>cQǤ Ra.wy;bశ$IjT)~q/!tA[تC䗩'lԋ!X8 8ͳw)}#º."_e4nHզc*ugWy03] 8%9 yeGeIj`XB᫐XR@}ĢĠ~wYf`\%)W{̊kᶛf`0#$=O%8ncjj >|F1cYLa,㄰%R° Ȣf͔P4o_䇇W(KiDF²ҟ+u-oN`#M4ׯUs26bC Ytv MIU|3enkDUg7=K=ԂXL')g?wӪ!vB/֤]Pw:C$Nbflފ#F:˚I8#_CYq8kUܴss^ɑ뮂uG=!ɌI鰤ܜ.=ٸ-'2.+#urՓ{j} ˇ[S|'\V2G[zBec67Sѐ.8#BV&U첌~pD êAuAQgYMwI{j~qqj*/-1cw&GE@ kVepFF׀Ozo"3I'+8 E@ViyF1m0'̵?2k4is,M}:y|viU2K,1_DoΔ_^ENlu gYB>fJWgW-p]8&ݧ' 3/oOE+#g[TzBpEő.ghJ0?w>\ [L_|HTN0aj%_m}qZ[^ )e.+SElMO1ǫfLElfB0YY[3vm5*RXi"MܶEe cO:k0l10|19'IiJE`~qT@>t4&d 8J=#i(ߊْ&M쁗̮Sq/ ss+2/֪it tz@5T Da_}w(wizk_ "v)C'o[H[ V%5Tm #͎3(,֢nE 6п)7`o&^hFn:bAWIv\2=11!!sKqw02!<ԇ.xabZ-BbȆEod~g+u j҉t@7'AOjWYf䍵@NUx;|3:LB'6ۚ@0>9sjm4yxfc@`SSS'%b,;|\GnwP5qromP[yE>! z!At'0`1DOO_Üeج"[XؿKu"^-~~"J=*Wb[X0TӮYQD9̪I;&"-{wEÜXEmlYBG懱J;H)dEUVlỸqh+TuF[:[V209g, j`f/Ho:>)L+lu[s/U~@ɧ"QV.ãìb{FQN| d:I|yK'&5A7ʒQFm`;7S˓^@|!oxklj}s*ӚXࢯO$V]gMɲkQ9l]c5F\h -^XwwwdDbIf|7JCC Oa"OW@XY d-VdW>i 998 .s2Kaus*=b(RlxTDH$b*Q-;,D2z4M >t år)P?f#~Ijh8/SQ1~s2vPNݯh`}-0رA+.=)ԳJ"*f"+LӌQ! GBk|gLBwR55eh<@]ufJ=larճQbtSzuOioǡ2J]F:{T|܎?vh֮zC`rMƞMeIF{n +%3ZCͫZEzBCs6.@ ~ݍ/M"_N. 2>^0t%MZ%=~ˬٰ4oY5ț_-ܾNex/9_ҷ)`3؊Xhށ)x] ?+Q}s>P(5@HB CJo3ޮCNZ^ @v?OH݉oy0ӧoPq~G_rR.btqfn9҄!UPI7WS#_q'{5dEf`32}p0~x,yKR73>:V^l\RQ煟/Nذ?7i~w@t<=5u*E ~MPPKcɭ{PKF,C-Pictures/10000000000000C8000001435B9EBE6A.pngzeXϗe6;'@C@=w;3;H^z-T`˫W)5\Spf{%;SѥUiXb#_3ƼYXx!B0=ՕW9t%rw׏%(ѷ{^m!cbFcPayKIaD $A xx1(Dt->%=VD*j# F7$Qyyb\gII8/t/\M'7y/< X@Z3%꩚Gl!ݍ肞Ô1nn*6;x DB3w`AEp*+ZY_7Dp=_Ƣ7-QRLKKrGc䃼P*v`.j:+ٷ]^ZAUhMF^j$~Y]aׄ[֢-Y!2-h%VVl ˆs "B<Q[y= o|‹ₘ另51:PSRvcrE]_zu]?8Fmx^znk܊m Z`HWƏӁ$q@F 96tڭ1LEtT_4% ]f ||6Bށ@*êx%ĚEߓSs${cqnN!FBq3=ҴNz-89'մy}8[! Қ]+Pnȼeo0=$ PgPM+ܰ6H Tu7 {d+ǎ^..uMaUuCZӚ[ډFJ&)ʲ sAŽT@D_Jc{ХMc@11ąBJO23+)\G;l|cWuٰm6$WǤ& b+AEgTAB\UAy?g[Amt8Acr;,l DW>bwif>n{u$,Miii## {s& 5vKˬ?!7ꎇRO2IOesfŽDz wʝf#Sk)8 q'%nuz߽nw[ߓ~!摕DžP-a2*\+=wt%"9gJt>l|`tZ]4y97S: E{Aeju uB]Fw6k%cjåg1H7v'ܤM;Vt5IUϠf Kw2 ݅r !iJGkC_@?ȝ~AZ伖03#hJG,N P쯇LjS^.7b_Rd0;j>P]\^&λ +"'Ѯ-Rß'}G\&dWM`0}QX\=JzӰ\U^RhK>ؽ0i5Jhde5N8taM =?훤g}CG^%U]CvTQ2{Zt4P>DBǓ No+VR2ώ.o'7u#F y^~ ؂!Y).~3lk_\jɤ!QQQQAQAAKa:|<v"{RWJ:?1V=_.23Fʈ+o@d]'7.W4iSZ?q*/tMU`G*[.E}SCS(IZD`00ZtH%'Sӷءf-d Bmzgnn^mB Xʿ۷oGJLXCߤ4`kh0 l֨%5EɭUrF*&6@`KR4&3Ƌ3Z}2%'T 4"Ϋzّf\Q=_5H.d`23Rtql߅`:7;ez}QEZOIHF G|>K"v[? ⇘j>j~s%"*B/1=U.9*ODw%`:]đңmC9r_Z/Lc~6@#7Ma,hЄw~{{]`$XRP:Xj6jב>9W]IOQsrچuTibv9дX~}@G@~bX=~>(>J>*_eșuV C8=#Y ڮ8/isX9R|A e_otv< E{5g-)܈( |"X2 ͍ٖj+hTP ZRX$-fYWfB-oXc F)QU뢿3^9^kXjO>=A4 YwS)ar^3Ub)v pMÞ&:3d?ɩ&'-U|lӬS kqHiGbFz.  begxAAA!zs<=ì׫G[*3/c (<:k6F/LBR 1so[|f/5htedt;NۄJK# c$m}lG0.ʿ\jvָoe5_8ΖR)-,itr**P|Y<\Yj;g[smN-$x#PDXD_t8B${UҞXXP{:e&‹BB~ni*+C'FlgVQ&..VG_jjbcULJ '݅5+-+DۛǐPL\Xgnms5>U>&&|xrV? :uXp0feQ{SLonx '`CxNKUw!"f^Ѕ^9!">@*Gaw:ZRa2_B,/OjkpUf4cQe`9h qJ$|?wh&>>Lj&v?@qj.f}8^rT,V*aT=0}8f18w(S(@( )Ax+ڇM Fk;fel'rCgX4K?ktp12ºtWIT]ES8)04~I~zr{_p~_;5?>C=K˰P4@*ztgx.:u8w`X;_cqUXesyY_UPtttZR}|IO%%oN )nIz#}abZ )8$#5I| q,zRjTSSB^K9OGu\tt$L@fOX;\3pwFO-ћ NexPb +d62j !4cPgaչ9Z0Qtrrr D1zk0dom￾zwb*@V9{Jz~y51HnJF@f#;p,րxbgX\tTm+@z٢3j7C2\\'pg1<;쉢 FxH{jKr4o&uq:&Nc+<KK* Q1"9\E> '2gN:/O8'S\E?B$K2unp]-6#zW*Yĉu' ,}sHNrr()T 05^3uXOрTUkDXA! I$W: ZTh$AkE=O)m"=T=4$oPVMxiMIWAPPg=U'ϗ"q3'LZ' :_PRY]1NV-l$٠ο?/ 9ܛx{?'7QvvwUwD_Z1B/?1Np \n>G#I2+=y_hdϏ'̓oCzù܌7%{?F嗭3===%us:.s#i| GI 5ZXo%aT+ ckyጣ|  7OqX*_<\.h7)G(ϫOӽio})`) bidp% <978n*!# -ݥ8/٬r{?@ɞ[[[u^Z_M Wu/Kz`E(QaD1V?2 f0#Yw=#sV;<<".;t|| {HI#^֡ zߒU/XXPRCʹZ 7`/ַۛ_iَ,G>kccbx\o;sPD 7DnwDDccv#Q؛m'H)3]+o߼8S<(,Q8ıTWWkm4nW%6eQ.YR8`wc.X_q _oB書;dx>]ˆt?sR읟4rZZwiZzn^LeX(g߯9CCE]Z~ܵ? 3;sqܛkpajWnF~ ܠL"~qJA~/bS#E|=~F4PD ''=j(a "aE'kRSU~&t]iU ogH0'Jz.: ^%&%#U$wS(jR̐?˂ 6Hݓ[E VKё|?*KF$u1,(&23s 5>-,\%}"tN]Kk;,/_ o!(;A=ssEt'N|:dAF`p;j?NNWwޢm"N9F}? IծuqV t#C+[1E݋OoP# $S{ʪWp-!Qaol6YO`gjw$)))P<cXT$, V"@d{L^G`nVOA :^WL:&b؎@xmKtGsXK&j}8*Wq|VaM{~TR:ZX<QMh< I96T&/hױյe56R裇YmuYOni[&o6;1gg1 wFꙚv76n~pق,X&Q ܡAګŀ:NWtD8|KsxY Q)<@t9RG3iHDRR^YUԇ@!l L2=x..ѯ۸=0O?߾I{53L%Pˆ.6긖fG!uHbw~Gzi4l jM]N *Sl"L8B6:ûwB,ߋ:99- h19RV'+s"2wFgd} ;,71f* V^f͜nG@"g2[Pdl:S [߇-e4,(W |u=aee^f1g&nIe2 +wUvyvs˒ 55ѝ\#k2B(A<&FF4]McsV0 kLXU/)ucFRC֩n|t3`Zfah]IDNjkutdA$4?zZMށv`L CN3;orU|.m?z5hQ!K-C%(9|Ύ0ETݻ&6˔F(ȃݶHT JS)%X)zo49Tӫi(BAw2e+@|2}-rQnrZA?cGǵވҎ"aF7Frb@z`m2wTY?강1NWz;_Wo|ډĉlV[7t~$GNCc#!1ձi$x ;Aϗ ]'fNXu! DDt $:ݶ} 9)߸O }X#k_7GxU?oJH󓥕 y^Agg1t*$`w_WۊVwCF 0݆81And(oI| ㋰s:~1l!Z-pI7d]<={*BJ '5E&'1) Wxu"tcbjq~?f>J`_#ha k?).#DOrߏhn:@g\6*Z0'5*|b)%4dSfՐdzI['qqgE#~'$r/js7ݞH3$2t@ys_0_*72Ø@pMRґZl80s4^\]/oDѻ]^1 =DV2˅lg7 cN߫#/D-(q$pW] HA ym"iLlv^3XtX.ŦyB! wyX/uz- TzLmw"_7#a%7g) 0Sצ_txSu2{l_3fuaܺ(>qȵ @AJ)iGo (AFՇطDbNnL#kާ~|xOyԆ,חM H귻)vxKN^2xFV̲ 'd_ u?DDFluj^ >ƒ98867788π]Qǯ@.%GG~ɊύvշӃ$DަdW Z9!NƋGFFBOIH_.#3k+A %!oF\&{ۧIw\Or9wexΟ. 1w4L9=^KwYI;R&'~[@Ǭ熪sEnP] o^ DHs&z GPۻ!j(Vٝ[a潅E7ik|'846} ^ Y1@]5@~%%%%ҪS%"xlmi0L sss(D^nÿ]]K] 0(m 1kr$ki* |B9^xOx0h?tºXҕ idieʾFfAn3CRCJQOa_%\p#  S䧫mدWaH6gv-~-n=pݲlxhP寇X#96Gͫ}Aw>`v0u؇tY=Q` {x.}ooqQIhiO{`rrrP8(x@(l|O4<K`=H@A3vfqgr%uOFQqbBho6RQk yS7]7.ackX\= 8?S=Vw"s_&JFV+aJ,TTh0N3Y׵2=KEo`.ck}9$2" ; *hnfljWo>`?OX;țL ~$W&#ȼg=N8~C>_̢pq9mUhQ0c %}>-ka`@4nΗ|MeV!3JCCh2t~N iXɤbxJR:Jr^u}!bg< dŸ)6[S@D?D7H_QA fmL6-8SO{f (Kr:[>r6 1/j`PSpRw(lĤrĎe\j+$Ahn)/k\(v-x*`FIYqj+$0 Eq4 Ls(II]q<5G&UѤ-iq}A`z?^o+!;ԫ@6K80D@Ե76à2spa~up"mڛ7/F.^08lH<1D;1l ͞"qj T/73D,Q@{{Zw_ni֙$c 03:LIéG{>hs]ІaYP"caAK/W+#ᝧObІ{ԙ"?H>ā4r&%ATh XҌEB|jԾ*4XZD?Y(5L bN(IjDsQW554+ H)+QZ )X)19u×X3ȷpI=4fF< AQd$KW6{s7(S@RWgSrJ?5 `jB1yjNͶ^:R(~Iج7owإty>4[g{caa굹X)eSWAB"s8`ã*`[]~w8}Gڽ2.2"2I,R42òNs&ҩ0 ƱLSW̦ɀmW[D1W% kkE DB*HIsAx "fD=HSS*IJ6;c VuSC*J ܽU %ֆ*BgQPq]ni5:I)nbXb@͗ah2)grXmF)anAS_H5/P P]^eYGsf @XS1AK]!FN6rI3!\#hFquy[pxz5Q@%);I;6f; 4>ݻXj.HdIuGx1 L SSȾFDd0-aL7oR^zDt.E2{Zӛ.313ƁSnh @giq/DFFljCebH ,ˉmQ^7虮jqu IUl%F'EEE9>VcqO o K"q&I%3Ney=D,fo\lOA-l&=A7~bZ puq|Ȫl¦ij{s=& yQ|+I8L>LtIP4җxGAQk!~=5q f -l،dň]dZ1{(9 ',UNtVܼBZ׍F[)Dp;X0g!>% 4īp=R=ի ђJSu' "c-& DdKy \{RRBG\Ħװ6YSqu| QAI**'kOoTƦ91O77),FНoD^תej<_&^8qL Em@c">t~oЛTT::, ֺT|Tv+b\?q0yN44k4rr9.ዑƉg@*d%֣qkμAN ^bC@(د+vNU2<ڗP~aK<vZiHcvE1feqU6_uPfZ^wQ` JUAK/`}#+ٙk>Mho~*i|)Cg;Ӈºg Tn"~^%N!?s<^/VQ3UVvJ]^ag؏צ-_yTpAJ TRj0^klh}y{^-5.]G.jK|/-- 9|&i$nv '-U |@5:$t\'_hOFkm$TCv7|{-+Lp A>L&?nͦ2x]aYrBfsZ!:b4XJ"C*;m;PRcgcfffU'Di_/bxqV{{BKs+ 33344lOYw Cv@躠bBjI~yy߿1!PAr{y&$Wg[*Rf@fqqͥm[*/lb-b._-E'd8.p 2x3ێ#g}"*H4B2@t]/v!~ ^[=,2 M?z5*l2?2"0X 8 5j+V".o%˷^tN`4V5cȑI'B{cNIk"C/B=$B!(:vwTDz( da-{cA::8L)R{N!krq%1<\_;|EQ!?ZTL€['cdNǣh&sx2&[66U OxxG+p?T0Lm? pso;`g) %5$hvvWMSYZȷ6Й-܊:"a6U~vQIA5X*$6y4Z-[zkm;LO(} \^ R DO%🤚CvSyE@}9; ն=;PاDD_adU_y5W$TʚÀ@O_ޢN۬P(4IOdg6Ґ2I$|{{~H0y-YTB P4`@-ְ5ftqwWwY_oƮ*ZA,?]vj'f; lc>U Հ;l P̈(6֔3& %0(;nF sE IO(9e ܢkgd7_q@~4pEM7ebl/53922 bT@ wŸESLeyhppp,YjvdXW 6X]}t$ls>:*=,{iO`IdT WWneM]1fE,Zؽ|$yg$ 7$Uo,梆ŀZo=g9YNdhtks^nQLBj0!2uw1!ݝ>a<HͲv051l6R8Mj5Oƀ)'0He_l)iTxxWUyw>R9^'Y[[2@vVpFDL oI|ْ bW>BT*W9m75 Øifݖ񯳅 gf|yϗh]n?_BP.}5?73WNdB!hv瀜B d<<͞)Wa۸{J?bq{"y0),C(\f7V%[@VE8 y+ҩՕY#5l~~4죵4-.$NM4'4+7,ձt՝IyXHh-4az=\*d:z쏢/Uh u?{KUAqňF~ GP5OxT.hjh-OoD\nb٢E8Q -͎8*3C>n7lWs;q6*4XE4Oh}bh75T^M\ItT_y"@3W4u&{AeN@J2 /ԍh,_ )t:{0^p2v-vIe m WqՇ:***y'uL7p+v׋5WJ9|OgIc$ֺʿS~3 vk8W̫c8M:= ewC Z;0#kCEGWYn65?a^,q,+&5v`pb]qwrK|l`ky }u Sss#Đph4`ig#ϯfA\ "GrM[q6W/!ϯQiA]f[~݇o.M)̎/F`-wX: 2GۍU/g'ф5k8E6sAq/s'{{=h1 ZZۓM5fuYtʜ %%PLt2u~snj=>u}@E_{w'fqNs6xCR{+st9>EIK&%ՁUѹ`o\V&c1_,6nsȼ>C.ξW~X뚚ec E 6X9.#Ezܙztth=FcoR881` ҙ߆MƲA 'r]D1nm|SӧOrg\DYo4Z.RqH{]gc`{wI|wY?'/K;]zƖK6@G/lԍ~ú=d'FG7COROphZYˡS!zς]]r/.y@k  //Hm;.RB+H]/#K"&K-cx_P c4|c.o֖12Rb> E-n `4'1JLJ9m/]v0鋱۬f(XLeKIU{gLV dǗZ1TEq`^u򺪼1;Hp??Cf5Z Y#-H)MCX}lt_67صC <kjjlqӟ7ͦC'(C{6S{"t~6 #a#G=_6VVʂHVF\ ok1_E:ޝOw[km/ @{h5[xυ-V&݊Z.“)&gU-(Ǘ7dώ8 3|"1_[Qp jmWzV}`~RFYe\Ck++$.yQe*7FJ'OۃKUfZ[qo/ҫJJ( -:Nck&8>?0u.NCo+6A|myUL%,(&*>DCC?_b2">H;>GI,&,zǏ}B?D,jdQjkKaq%[fd~ӎ}Hhc% M sRdA)fp ?bd#nzR0\6 s\BrKA>!klO6Y0.p t%ptM ^s\NTx!&.9[L>jW*+TtxrI LpF$RY0.דe6kܬ&[,RZ ÌWˋ#|W "O xtPJ\*YJùixzolE3UoJ0$Gg߰,Q>%aW=:Z"|t@*ݜ)QZU֎z|2Gͺ 9]Οm8zH^0"F-g0A;3_ɉݔ‰?@X?X ZJw&gd,?SdOH:pʝo <'ϲ|aIO!ek]+\;?=gF 7Z*{ԜZKzc ($4m>j1}0PbI#/±,ɡԝൻx_Ein9n Uvjsr"u<9OUJ쫩-LNo_H@è}B8X* I;)) *fxϥeLPxdƬK},ӒHMMaDM]ϰ#r>bۊ$# _V-`o t|SILKOs+,EUƿսɜj;)8px[KXS~W2=kHV8nN8%55-*01Q\{7k5Bpw(!ڍ#ٝ.K q1rRaFi1L2-rOZʟ #M0uŁ@t<14VcG,|OBO,vtir:ݮR蒕,cG5sbTOp45FUSQ5̜+&{;/h!W?;:m (元Cx|\i.9] &>l=C`g<ۇg GWMJƲˀXCcqxu~t6jeb^ꊕAY gk]Eq̟g3/X`y\`@S&Z;߮LƿnXIxYPWNxT^3&H n4jY.~[.Yի6tim,CeFL]]( 5ԧr;{o$0fD]4-\ޚ pE-. Ўid^ܼ0sQmAtM6ېtF=*>}&cJtf׫PLIYKzjLv6d$uu]tUMAW.Ѣl݄'&hawLO!9gU>Ŷ> GUr,ȜG" j~{p jnL,k=7@#iDn]48MlfACß}ץ?o3N ;1-/NIA T:amY43s)mi.!@lmj ]mUkO_fϡJӫLEȼRl LT:SsRW \ JgX߬2PA vJ(`)Qw;+%&AOI>Kt޺WWںзQ![T7:fP9ao9(\aEȍ][5W?b>7>|ZRPNW|iffw&'MmXQ( AbŅl)Qfn< M\цLƊG]n L%TvH4gBW9BGg٨SՙuVrha_%X{YC#ɿT8Rn<WFIr*isy,1HJKKp?qfC *es'<'Y궈3'Z{Q ? <=N!&7ݜw\"T !,i|r"T (4UMwi(HQ?;誽i wNރWi=8?:nē`\LzZ fX{/s*LM+`/VhU&LNfW{+1bL&F>iəb̢T]3H'^Gpy|2)_1n;-HH:O*̻쪖f< f–*N 7mھؔ?cugUAB 42X*%&bw Y*mbiC _ƚbu z`AcTer? vtHEAqEMjC?:-ksTuGX!swn\{h2S|^ϰOpMl{3eµG>C :,m"yrwLwR-:R&%:̟uձy\&*4 @|<*Rj# UIa ÚE&3蹟–i;zG.KVĘ$ĨZZttt\ KYO2u atؐŧ 1tZj#B@ì})۬XZѱ뚿gӔc>rAs` w0ń{(Y6KԞC!SbAlht pK`,H)"՗gTuZjQzR2?m8,hVVhVr0aaTM̂MȾt+F Uh'&22D}8ںmf`u"N( 4QaW)?,XeF?#7N "Z僦 hqC -}+(L 0%d$444,kh &&P>_ʒ6V^ (+LH\?C-JyѾ%Ի 9 k,c:6μLށ ?U\ /)@;tFqJ1YyzMx\IĄ +bowϟ? {%P©oirĨ\'G^PI/G'1BYZH:lfRC?EPY8=\v+'V2=:X6Olb1-KWS&7ފ#5<_TR&Yj4ZZPFOLɕb >H6#[#vL.UxoM4;̯KqF%RTܯ;$LoW*GIIU>QHAȚ&f!uFp&+~+ŧELTjJq涽(#~CTȸDŹDCW妬ֱ(1Y JjEkF)솓#, L<Uʇ` ۡ~̹vJ- uo('uEpɵX#|bT!,P)';]l~tnW6I<^7ܐ@@kCzdU]2{N3xÎoBNK?Aj(:xG??=uб \R߀.g[NI#<eAKտR}a)0% h)U]nzK@Y(h )7&Ǿj+vFh:`l侌0]10dZgXT@ .4͊!H.z|rQ[ 7EgÃ{5fCI,E6BPu@^娲R끵 CJcu.tQT$RFF N.#=D3D*ԑU$by3+)^$1Ť(HQ~o qa iwSZH- >HIcsiUf%sV9t-~l7])=#~lF?"+1/,6Xm8aǣ x8n֍߱%&&'Z+ŗꋘPo(/7e f᝖rj\+݁n|DY*U"IR]~Ii1[>5CרUx4-Z ṪQ* 0=}GGGX@00Y9tƽG,y/?6&Ï}Q}K9D z&M05G-$͛t_"+g>?76ع%D_ XR05LmXFEHcCl%=BId?s/R;ZD<c->[Jl?G(?hT*s8Vs댎2TUJԛHA د]w|Ό}intZ)Z+DB܈6eʵnG-NNĔQ@YH.,v57$WtL"Z)%iUW.ĥC[ ohh~\6u 1Z[vR{4[5:4O<򴐉56Ȭm1今<1WT *I4I#̇5jV: ^!{tEzp#@DSdeK-%δ&{x8DH_khmjlE'/i'n Vê]s*'Lϯ+Zl4` +)В!L(3k^ N9]~h}-}p_jbfvⴺ[GDRȅj?ZWL󉠾ZӚ ٟ>t2>pJB+|.]m]_uGiQ9=C2c|Oa){F{KklVJB:=VDm-ЀՂ'ݛ$v'(b>?P>mk{uXpO3âuFentx8}\#`"03ct~,Le!{wg&k/Yc|QPlvGr,$v M[] Fg>YixkA7 $s]RぢoXHi rZ]_9Y}8d/8|;WC!oҫxC֖F N@b7>4a 0wԺAUf;;h)r]Ś"iiiB6R%OX6m$ g>Ov3Nfžm Uk9k~gNK.,m #r"3)ej~<"5t|N|Wd:[#i:~ʏ_jV43/R9&i`^BfEXE^Mc@4$*/:Ube'4*Y̬ ^Qk?ЗO|<YFjn ENj>KY0|Yێs-$r?Mbv`LwE5ծFPPTPt)&Tz^DE@ Az ^{ BZ{}ƾ8f_92|o{gw~[WDOʷL%* :_N6V&:vQ)%eg!8wYlL. 6}}2Ep u <cUC<D?%Db<_|UT\a^Uo0 `GQD7(HSgqKԪq\LZ/V&7؏\@0Ʃ驼lڵ8""MBE:#bָ5^fK]L,W3OW-ڋ&3Y΁9|PO8Qݞ xpЋ:)d> Pwz&gڒ(uԮ.ΞX^C:MEXt?'GcN#rl1R[]ep6Wc7qz <ȸid:3CNqz_}$A3OilTm ^…qo$+{OՖYnU>Jn6C:@hߣ)q,\3J%?6je^2G']?xL$"?1'-%@Y`Z7/m;`o sܤ=`zsQ]Kko,ILhcE/J?D}m w{6+̜&ukoTml\\\R%qwԮmTꥱ(xb{+7E%nHt-Uv/I-0)wM\~Z IDX1·{~3SCC5=ZG4Lb&|_G-ۙQ }Jn~t>ZK*ݼ1htW ncԩ:gZWRxyUB U!m>a+]b]pt.|(#R&P7331d>{.6Aƺ專XP2h]5.7_ ~cKUw( lZKDǞ'J}eV߿߼prn|ew)L1ey@e:d+?Cc~'ЕqrpֺNs|`;qy@O*;ɀtHξWV[ tmAחMg{zz68&+ 뭝Ϲ>/Pyd]ȮAR_Oty ju^c qoyF2ԍO|Z0:$۷7!%%)"_Ŋ mږs6ޙ8q2wcBYwut M.L+v/j)hX6 ޴.1 }m>;6<2r'Q][7_cӶ𑟱q[j4f˽mMδe EWd(duRh0 i[ݹ{46i>=`c%etجOI9IZt@@taW`[w[wDqBͿC&;w;Rj94mNOI~TIWO4e%_ZN %kXt٢kQj- n(Uoz__b }5eā۝n鄱V/7!5%@454r'CJ͢("2h݃662/>m e\;X6ɹr25$ϫĦ NH=yUuT0&R}Oܹ{Ds̯6>ӹ0b|f7X[ZTt4 sv2 8"}ak-Maz{ ZgIQ?~\ǭ'GvC)nK: NZk-m? -3,MEmS ݟ-czܟ;; Jeߎ+UMД'r'o9։|:->J)ux7Rcm!a3iZMkӺ|XZU!vdo 3{)^RR˝ո-A": x#ˇJIBgM1bɺNǙ59B]T( Y\@+޳yu+Lӻ^fC j>V)g9J<_yåQ=K?2<11Q/&:3ZN%F:fί.zzU]31[]}WPT wʉBw3]$}.Mȿ.ɞ 4Kozn.GMyTC6w"X*5T$~a)AA8Qb ߨ6ۋroN.qP/nʹ!|'eQ,\pr~_oT;c9z6L~0VkMLa*h$[LJg("2.Opd峿'z :-G%nEai;LA5g6]x22x79j,6> 1]Δ+z]wǛ! v1O%p8vYM$oBҲ5QV7ǧ%dZuSN h=Fqƹ+A Hn&HL'B'$d;e{bϒ$寿Kn;EfAF)6w3#2Ҡ=VK^Zj_ k[Q)$k,l:$PC ڝϖyoHMEֿb Trtrc@3]Ȫ#7ՔCbb2"عH^OIw8S*i׵hCQobIf٦`DJDKB^H ӆCP6>2WT'y_[8 CBXNezqݨf!$ u3")߈:ְ]S&6^fM=~cUo"%Ekj͕+) 9 VȢ)ym:&ծskoq%c^K1eW@>H Ѝٵq%NH-nhid(AF7Y {8Ǵ'<6Bd +%=FT[=Bm dV{]pQg%j!„r%H y݀6\,MVjymf 'gWs8'*ɱs.smiݿFFL~?E=N,g&lq| 69=1/ڥb EG<{ sdx{X4yDc/'ϝvfALiGϽ PG J=ݟ.ݑU5fʻ4OK@w+Sw{IV"fFEGnL4^kgmu) E{SvJ]c秦zƩ|;uZ GǕw1UUUDgM#XD,K"b/KatCrA՟?],<>8zikhzM}N3\Vnz}ٮ\ fCa"1D8x"lveFr+x\B T˗t} ŭ61{O~ɫ͑R P0.Z{wfrZë8viSc'- oWYax'jQ Qb!@qw>qܺyC%бZK|w(9_Imb3tw*##1={0'/)\c*nb9/x3~q^EBhYaAu_)SCmP Iq9Q6$<:W-u( $)nAkfX7^W[M3|{8uxb=h Zh6KT@O>ej3@G>}c3y_j}|lK8;)w; .5'JN}'@?>G@̘$dհ_瓒"j)z}@. ;5/^!e MVVas{$kcˇFuuJ -5|{˭R]plʓEsS K ~=Ѝ&49q-e*bq]Ƥ5%(& WRjSc݇n^(JH(![ZMUhN,-d|>:$/aƞFEXu*iL2!d c޻G8 eC.bS+NDj bʪ}S9mMnnUjpzU"dOڰΦ4WCh1pQpv?io~GE0xcu$1썄e~U&~hLh\*QZdf[pu&yW3jinѐ+\ Sxp Ȇ,iTFzB_Pz=j$ڙ r'vLiӫ=E%wlhC4! @[J%t/4xAY SwďC!se*ٙ, @% up Zό`=mos|0'#֚E`)tN7l[Q>qTnژ[8QmG-$A\>WIZ uˮcׯ?v]݀?&Ŀ{{_|?[Ӫ;6qg~;ِ!|:K";2e=RU~gAN?;}bcҸ7l q6-޿qV83m zYż4>wo-z\)ogY:I5}. _,@b}2uc3O`dS:?(PnD9)nJ_5yuqA$/pll`!-Ě#mE+ Uͨ!$N;Mks>&ׇgN27DTV~}(/|Hмl#P$KIv X#XȤ$rynZ3ڡG^PBkPިc.͸ \am灶MN5ue`p8O5]A82`|Ѝ"!΂^b(VRbw`'@(GBњ c"VH&4`DxVhEze>^677ob>Xro8ݬ5(-:|\3h޺AH[pk$^,}˛$Ǽ"kitZQʕ!f0g PRge=#w=ѷU.*(vܾ+cn??}'?)ُ"B~;ǥa4u58wu y` #ڕE/fԵ5qٴ liy9(WM@B|mk{$4MGXI6Jb8 dhǰ'=q \ @ymiE@=ޞ_$v$(+b@'Yl6(V17 vZN/º`k.Q&Ga Ct*ӳs9f+΢8(_wPrFs`渽cH׌% ʿg%^:a:J.t'7ld__g޸vm(pWB<4h._XV"C0=`#=}}}==WڱcwHf8yVE7Ԓzc2}'!73;?^- 䩣m']E֔ZJfgtJ\]]F2Dx=78U~@uH2Fl(ԵXy8Qy :6 $l$O{7p@ƉZ@ }*,޿HJ+Lu -Jf;ي)/Gp I#OԪ”pQSpbOX+ΜYUzvn:LI{R?Oyoz|y ڦEF`kywu4;ljoTI(Duawӭ+p?:'H.cmVwח$}9c W1z @]88m۴LMݖ}Fm5kCڗ/c8a'ѢH0ޥtYNQw?#G$js6zԓ卍,]bz @slgjj&TG#j'~<9اU\8v|a4 wIWy/9_M:)Ir,0!QvlFYG/"s~P*:Z8b_2HZZ#g&ff~MF|RBBpMdyS(w$zT寗>4j_] >xYL9س鑏ڰF2kq MzIQ<Qf`Ir!{j$B8O̬ӥMLr+9P&0G{s~Eؼqy: Yh[_:! H蓣/hG]i؜ ǴCD_m*[n7["]V;R>oBĺ{bCPa#S جzCA&<[ڰyWnt'meb&z-:)Rox94LLʗO+S>dѢ \Elsb - K-nv/zps5#[j氶ޛ߉yPg ,M.*NpK蔧9DöVqNm 6/_rڹrL?\"͠UaWpS/#zGsU?~KTEG%'xNԠԲnjFحD|t[IU!E)6mMqqq\&]p쏎(9km}}seE’GO{#ҒlrlĺUNӏSE21r%ֶdg;hFK(lQẇk\T00jf@c<:fi$yMLx8rNUXh'3Kk݌߻8&$kѳ0зf;wZI{_ ~avٚ;ʒ .x PnEj*#$v^gP4CpUZ[&ۙL{J| rC:rHyO7/F+pM n(?jTNEԇ/ʒn Ǚz3I].fD6nF@A &Yr#ik^00ԈGy .*'2e@WZzaYL6_ge8H4gvNJM^1)1x)OK\jq=[[ʱ{"uD~FotUIg5|j+|[4Wӟ^Xo4sG.? ?::҇ c'c7ü})V:0mR$9e&~p5`bzLfdzW{z58ookV6`5GM}{.9OeznWlwfXJÐ6IapdW<4e;)+`#`fgz` E`A&kBwh0V-Bu?v,Fnׯw{dXQv%Wz[jAŤ_c9Gt(k褩aTO/ LU#g˿ cPnϷEEcp>=))j!pYYY:յ59^m{Q ^gʪBxr/t zqv13Bp aOiOOW-111l_?_n>ߛEҽO1bE"SSSD٤vvzo~LgB# NMMwttE.&,Ȉ},E؛e?$pT ]\ȦN[YY_nRD"BTd7:3QZJNQ::ÑVoXA<É(f*ԉŝq_@ k0.~ Ͽ=xq]2#b'6鷱Yqw*Z _(+,VHIK{} f(&}?u~D"fu;[^ߝI'/T}(}b).TeڍBj9jhvNeӬ驮$DtQ<ޕrꑙ$v޸zs،ƒ3EI #;.BqrXƦI__pV]vgd4CՁ+Mf\䙙:1kS8OWW?ײyunFLG>oy##:\ovÐ%B^O[l;A]y*?T&/;K+(̶qTi5RZu9nEzݟ<9 = M@jpdp*]$HҦ?4/xI&Q\\vAw!?qZ~{)}Llln竾/wʨ{qg8mU¹Tw@kĦQYSRR7;xgH6*Q꼨+5#E°SS:E][Ng~jvVwPPߌm|}t^=o͠iG6>'Q}f#Ou%y`dWEoDQ jG@7&'7Y&W/k#ACe-S.?][."E7,~@,KGG2\*R̄~5dX&R`&[T=Kx,rTn~ 44eOe$UsDPd" ^%rxOE U f2ݯ$~yz!3 L%Gu̧'elTAd@RdAmm)"5Cr\!^Pf,xwfb䋄 ###+&ځ߿؂!*jvm*Y}fP>e~Xez[TB1h\:W[Xuj/ŕJ/DxsSg.B}HӳdIؾڏȡI~'hjK1!FkeMJ--ӧf~m #5];[۪GE.=]m!y5N:@R(0 ;^^~HZ̊c,".* 2HjkP峹Y-tPJ]8MgL?otGXH +l~pCki?z`?$CA@<(3$I>}qp{PyolUC-,DW2EN_y%`MA߽eftJ8Y|y_v1 b;-e-6uP6`A,-}'+'''# Potn)()'ꛚ ڝ@Xo>m`mj ~(M%TJ%X_B ̧,ְow>i>9`FcD~dddOp'|0fWbZr34j?,fs]gsV:-B„?@5d5fD25&&f<))7w hH0y hؙ-TPkɇͼm~,D;F3G\r}{2" 5%cSZg̼kcvH?3"bsK䒔y{QdzÎk ^}a,α\U\snQu٠h _i¨{̌ Rye../@xZ{}t;2@L+t׏K:)Z36[j.\OM%!"Bk=zX_Q"DCT$O&uS"7ki5 F 2Q C&2,CB3v9׏+ˍ Qğ gf屽I|} SBkrc{[nGp3bw|?><%Ee4ѧHePm>HFezO]Z/ 93Py4?c|7{$ȿ CQjp}=Él֞ )vlp6{.ϯЧK|z\|+p)0Z:}UW@g%d9Ѯi/qqv5x@;ZAv94ltkuWu$*>5+fٴƆ?:6YsHK%6(Wޯm b>X7Wm48]&ENbplR[ȫZY1W:yjg p@vePL*>cHċ@ "ِ 'p!0`)ҠD>[kc-q!̑[&\"HQSKn8Qb`m͏]~ 5}^CZY 3+4J) xsqqqfb2a<@>ԭdU2&%vU7+3 < IdLf'Iԯ s$ưvMe~1| Cǧ{𳰰Qs`cәԊ7hH`3G[5]~Ky]e?#SFnFH ^ƒ6$,/:Z( K:M&ȭE{]oDƫNbЏ.U &$Fe)綏z/L/ :8A ?g҄yh1RWp,KzWkkx~]] iOA*㈞xcY; (+T(׭6`{׳rDՇJX^`5\- 9elW9eaw,0ܩ!hm֫l^癆\al粄3b# Ƌ"49ۤz11I!7pE(t4ZqB#hVA H81n_;.IǽA?Vͮ~(R88i2J|(!א8?g:5D4=j,~Kݛ)6émQ",k4r얄3~ѨszBRlkdH"qZ@C}ڍ7|}J[~p/:ٕY8mRv3oTI{dἽSojĴW|b%fIIM,IUXA0{P҆شSIjݥO"8큮b~+F; 0`rgG4Ξpp& E"/D>C&@/Kn'Y۰Νyn2@\+M Tw )Bb|å[1ދhD!'ÛUo%|8/%ry&r/B_ȩyۼ05@.A-LS!}L)B|u.)ݹSEZ1L 1]qwDF葭شI.؝ 2jul ZM911^E%'?ç~l$՝=8X =Z:E(/p/BHg6Ֆ87?Hjvd( 'ee_944LlhE#TrIf?Jsq,6$(OMO{VZ{&ْ9[պsV+E$<q7N*uj\T$|;<|]^d7,b9ޛM0J¥dQn p@f#$-lvR gW4VII)d=(;OWd?:)"vG ǫ+ dT3Q);\\"]2)P}a-BGc$=)7CaycaQ (#O*>ܤ"|ŴRLZ,Sҫ}.[6mC\ۊ1Vr][~rB喿3j=o6`_s;ee!DmyJ! g1KB}n/ hP'iNn{kri2v濰,l9^>%R)`!wvNN,>o xM挗]:9I8PltME}Ev@wyУ/@4vP"GHȁNEv@b dw7 [.b]4BII6}aݺ \zӁhqߊ_PG:q@Sla~}tf@=;4¨` eӐE/ΕŶA3H3s"ִp/$w^kG䔔IՇ1ֿ~E_vhyyw g+u_Ѩ(|zAg,s[@?^%}D}61[=_y_kUOUFT3kCRa*,BӐ 4GfCPGh[dH1֕ JY0fs7ACl6 '6-ȼZ0˹nqUNR3TMf*:<6Dk*6\fGS[ 3vg>*d.%lis ||E)E{x1jCzޛrD4^- C%ۧVQ~ wKM2Rd;r= s#OhhbpZaZ""C:IJ WjL"D l,=b\]CfP7@sJ1BޔaaP%:ۑ֌p:2~(ok"O8$i wSQ_ߺ;hZ͆0`HdkK"N.U &B0Dqslgj=vF0!=j7^4s( $4" R4Ԩ`$3Ys:w@W'^?[z8Z!Z?p̱cs:P$$(m޾gT3QECF %A^&EH8lm`qCQ`A V;\i}8`'zI}͔kݝZ1e| 'PjFauյiZqs>97}tM1˔p|v'$8gW1reN=' 53c2v beab -$/xE[РuKrX:Jߛ;ZIWгc-SRI[Kú{)T%F^%9K}TB~76Ë`=5fW꒤LK̫R ~Zb7 xWs;3n*U, v^l~M K:;642&w6gMͼG3[M_X(i;n֦`OުԕKǀwڬTYTPm S0 zXBՉ6TojRVH:b9Y~bme$LaۜWzz:IMla"rJ!ro#&V#(p3 ok0uR˄3鰲>8Qhӡ O02 Ѝ/I_s'9 i+U$Ȫ)߫OvhĐIiV_9ߝ=ɋAB%җRѤZ|}r=9#kTL{m씘KMg8RUU9FѡeNu[ɪ\~ASvajt۪78:مLqvfv ժLj˛ZK~O5涠:AsfTv_` ԡ ϑXHT*4[L-1HNfD"G:02&t˼=:c4j k9SZ-Aj< _IHvyt~m,pʷ-`$A5Cˠ66E6H0YIޞ|u0_Y5 _nUn^rj͛dHZS)N1&sqC'G2\bRRBۋEtuuJ9hA#9Ց_HSQ T4xU6OHyW,Yů} fW *CVxgɀCQH5,LSLs޹b7rw) yX_фPm`f6؄  PY#`C7g7(3}~ ']5yudnKZ J"">`(<@zww1 cIIs>Rg-[Qib G?1#va/2{' J4B2>M)ZimڠUe sIV^XW)\M,5Fbed"˄b4<=E2G'٣%"Q4ʈO;F,cJafxRnp8*~}"Q0[ ʭ8=9J6U{KJK_re4m_+ N+ M*L̴VDAlRKH,IRI ?P5eO,#2}"&D&1htʷVoV$<ב K͛_*ۯ<_ŸzWﮕ2aK&av#2{݄K &~sK-837@4pjx,vz>=#eQZ %)S|2°JidMoѼ'1J\]Mp4V t0oHuN<)2e3umEыqqX `bRɒ**/j߶d+S/jkY$m) ,HdHp*ASUcVinD{Ym>;F,Z*-wQZj!mP ۻhlj`TIWG,_g. 7swK.Ymݮ;smf.#ծ~ZғoScce_ّ x93+Ց*  W6~bY0_MT PY\ zE2r'9# M㱑B:֦@-k(&@b^gzAlh ^Y1r~||̤B3B ?T4<\n1t3(O2#QGN!}jK̵StFX|LX $.a]B|=/a(ҹH:N:؛윝@n]&Y0OtG:ѢKll AX>QOrhTCEm)\mXMG'^'^+_/#K;)ϝJhSaZZZnnaoʿ(hEŠꐂL-SU)$g#re w0Dq,8|eO!'H(h\Ҷ3kuYѯ̑d<%≯&0b_ƿ ȂbMfdֶNNVo,65Wbn:V }\H|>*Ĝ0Zn7Ͻ8`+<`6mN"cC 'CW0Ic]\\\؂ʢ\6DC8NdDݍ#З&Av @ S*XPH'GT0P?/H\M#B iTTAC)alLP |QvueU=Ϟ 7<-c߅z}}B_7N11bJ(/jafAo<옭DF0di}uvkjƶQ>gx-0a}q.o=Wn1̥GkF0ѐp̻bbnͷua|LOb1 qb":lD$>M]i iYoB.V*@!{-\~h;6G[B{r>L<8B -ۿI$,P uYm}y)wxLMAaII*=o[ N~u/"_jg~ 4jT_k6_zi _ωYbL%T-], Lj`TH>$o.'2 Y[v[h |g@_\BC=~ǽFX,Ԓ#61M2dwtc-գ* Kҩ((DV*挰.^jfG'_!bjG v2G2O#BbXoRM?J@kq}Ӵh.ɀip *#Oh/"7qE2]էKppex!su"a@)DVyەݱh?ldeeg}a.s~?cQU*~M9 ߽E R*W1 (W;:/L0sRyD%JNSTDwGccL#DﰇlRLf,'p$FQ8H'ttT!L_`)]b.r=L>zt[eP˳ͤWLl^EùVq"$hyׁ]iY@SÏZS@m_%!74 5G"5fgLXg`1T9l@gi.l)9\6vN/KT.\z0tR(d^#E@vZ[v}AO( g#4jJB\k~ZK3qߴYhl׽(M]f>$yQEzB; %+R향ɥSD !CzbWh;h_'ぜ,|@OaȨlBgǍۧJԤro ݀Y5{z]7s$,^U&f鯵XAj$SWf#4-KD CG:>^|zkg\\mux^ko~=h x)&[vNCOW:{-jdQR\X}FZV?qUedh3V]=hbl GxCe_E1 y1c59U.yyzIrXU)9Ȣ=U?eo~7faQq]\KB?q1§ 'ȱ٢vZlq{{N)NiVS>A;>OcccE[Geյk߷]Jww )H Ht"% ݍtwMϳr]5yXsu\^Rϯ1 FLy-홯 CwXPvb` Ü/@Tngr1JN[Vb6?BmeaA4S"iWQ속jfbVˏxRyE[[UK6o5"m]rΈ؞&s4ҖuG6%pMe"=߿_UpϪ,q&WS d/TIIy`t?BEɖ} ?6&c}F҆ϊt_uC-gE.eZw_%%c[C-Xx! Nǟ#!\bϮ>u-du.tzPd_K!*zQC#6B.h)xLF|&1H':eJL8XO ނ¼*Iݳ}&|?lAI2)w$PSW/8lzuF*О$.IBDf6J2tQHB`l;(޳S%ơ g"*mHP4==x}d,A(FI-f Qc-ޖbo |}⟆ey1^)fFqP-2b%ObV"]P2,4Rc%K3&+Y:f*()n03{)e s;u N>-BahSnsBլ;Z@hV_\ѡS`:ZS^I–kWi ~ =Xp*i83Z^^&H[i?`]oukRRRB)moo"$2j(Y%LU+bo)oşe!1x-9ޠv &L^N_Ss=5Q]Uyk}\_u`łUB=x|H|EK8ͭ=~k]r!r+fKIK?Ol6㪢ZQ22mn~ke$K(y7쓪t*0 ^bkJ^!K*}KU^zI5NhUde/$;Tfl!X%.MAutõDW$Byj סѤX  ;!zy yu )sm>U vtzA.9Fpbӏnz;&d_ME؁8lq#!b+|6%ƻidž)UXS*#muo^\8wU*5! @>BǷ/1["΀uK`DVr7nmff5 7wX.A&--d_)1NO+7R"#R.otl-wc@Mq{z)͗. %&Ǝn ٧"Z\"R[ı0BY;Vs)**"ww 9[|tfP~/V_.1]rL;~\X bHZ@P巈85|N.P;SWrMqĞ7O_ɠ^ fE.[sn(Uz].#Gnq111mnҊ)yKٿare{G-o(u!><&HDbӨ{沌9] tk8#y zXU5R z̦)9y1#/ݾ3@j,/桢lY@0k\ %ɂ5$yln3vg\*"Ѿyx $Ov# H1E7W幈||lƗT5kpP|NCrjNrHFkpxNm9AwUGkKcR?rbzѫ-go.䍮Dթ豀Gl`Щv7U{`9Y%r@Pn ΘM~ŋ1Q7خ/kuޡoxy,]C5Eb7O@coEpu3bn f_xNO$dme?:a(ߣ"U3ǝIju=os*RwzvVGfkd-:}5Dvi2g59(:1Sēf$iuo .Mbϟ&zu.9S%Pp쨽VYj7<1,ZJ_\Ķ`ah) JǿA/}CN@qwr u7e8[ ,QQ&&&, u3u[FǗZоhV~q B E/=z q}S6ӜTCMM{Mu8in"}q>Fcj,QQxk:/4k&^Hۛ:E?9' x⇲4]_a5z-:wTZM6$84VCwQj*#ӊ +mdUR[m|%TW\ICi< ?{z>kVa_ZS2@\I(nX׭3h}#$Εv {ľ_&@blБL܉''W#+{?kH Y^괿8G"-0]Uz et1}n u!Ji=Dty#8OEp^ȿR) E {ž":ȋ}WN*lռ!lȈy,R?W ~Kٴ|:Sʇ.(@,kNEW@\0|DpAcA/?&Ci)15hII[p `9jf8@q r7oPC;4^ U]p!cbb*Ҭw9ɊF l'u#''_>d3u{3nvؤYm=S[Qaonz9#C*VX@O4sQ"㙞z=_4%jV8q:P.PH:|_M22?ߨUg#J^>8]sRIii@ϟzl g==A@9t(ctd q;|ei}tr|<6DVJlX7:0ԋ56c7v9zNnkܮVܦJEm϶6LYSKZ2nI$m4 ']zAu14q՛¸O nLH 8-ypXͲN?=')Ϙ&Iy o֧Ǫ}q ZEBVD@oP$uىǡź1^ 0^aYbPQtUfuՆkF|>Чu|B:"q/`?ydq0RfՅSɹRӠds2;.ɝ@ 4UgDEhkk+E# a4Vځj&Q1@)z&)q?`D-CQkoa މa/&tnv>iY^HZNԟ=r("!B/xuȸ2ޥK_l} yA/^_[+H s 41qq2|0=F&c٪啕gEWGC`SxpF@# x6ƪ*+cTmYlmDڧΖ `8m3#"HEP&׺[74^4ۭA> Zt .듎~ꕺJ3 .(y11; sĐY0}v y 1M`%ѿ{8g:?`P׃bbof{~nIAW[zng")U >Pǭ0v.hp2mAQL Sd#䬜 MǓ>!L5Q2#"u6¨^2/٭_3GFY.rt5(Y8`&wZwIxz Nrr1!Nł$_≁tUVb*.Uܰ`a:$PGuJlOIw8Ra0KXH _%EՃP!,*??psLHHH^YR̿6Ѳ hqveeUࠬ,:{SǔT jv"<6s <{crtq[a(*G*SVA(t4R6e@+)^$a7՘p!qV ‚3\t(wؒq%qnrw臭A|gu^9X(Vuuu|*J&aWtF\q'6p>uUurnk.ڷjk͋D$qʖLGt[p$](ST27[(n SQQI xuTEVajֽ^ݐ1BWXNJ 2 \B__~_A,2r dGnn.UXwd-l1RrDJXgnþ^%_FUpd>]N-'JŐC@Wڕo<;¸rrrJE>Q-A!KtbXӳ ?*auj_ϯ4 \ c4CtGfpjrd\TW[ڇV-oח8k\ f~nghh$0LND3zh\3IDm<o ׸l%sLJzh`3jQW,(9Ō򪃙W݃aVTT?<1lGi?X>rX!(LiUj_K| ^VB-d=?|گ_Ɠpkuj\RƅrԜ$;pt26|Tr?O)* ˢx퉮e!"yHhf6*L9)&y\N^㳾/e6e  Ȗ>%s2yԗ199و Vꔼa0}q;C3Ge)~b!eE0aU,WtgsG_`5腖GrCaHT%~4)t]6zGtttr*v;{{&QzB\vp^\+k;B_;`URT/f,,O:N]'9RV[΀qm  3&&;h^\ىyؼm[tt?-+BY_J~*zٰ棃[n ~-0ral&î/ 'Y1qqjXۻ4iݚQ ˊbX/tL⫵PzR[[k9SNȈ' D:\Avm73- @5ߛ.Qb_3w\擾{k}COoo˩ɹ+Hf[yT=K N{o j|! mͦh^( GwIG\=U0\R oĊZo?S 3==̳_epϤHȗ>>| SR}7a}W~6iwhL4E*dmht.xX@ǜq3r 2,7a?i_9X3%.f ADZV|ҿ20:X |):;KVffB/}C1150耹UP@6( =6 'ZO0V zƭdn]޴DZO$ʨ}?C8"DﵮG?RరӴVM. ;m8pz`H+I.&pЭU<tЪ]\(((pC..R=uB#RWr"c޻:\<%` Btt_ТN"+ 丯GT+Z3Blj ҪQR@*ʼn9^  ($GL鞣?l%ƨeWWWg5[?tNAD|^sr!?Gw(+?ܝ-<:+M/`jMjk6N)wF3|jbbp}}}xhmnv/=BT&Ɍ}8{@UɱH).64$#F;{##e-~M4_^Z/5/>ϖ Se=&p7 pfk[݃P csc#';eJq\滿 φk;##d^4"Sյ5&9qdpڼ_oXf:PͣV7/ٗ<_/96>PR^>ǧHb.=ĦǿzĐ_0đ8 9Wx6Rx~M3@|ǭTf1 (E9g488?A;rG~şUUް;\v@dٙ i @ @-G9a3.fgg7S{̀ 6J3ATK ~ /YO;¨2KU T3cq1 eWSV625֟f` Bcbbv:\GU.ªk=` ux 6.tr[-WA[ܵs3Ywq|CloiIDZ/$Z!"EnQ;ႝ OHd9 LoѧOq:$:OsSS2ŦlK#{kieŬ@'"X,6rot%09R1Me NAFPE㠃-Tҕ` _.#]/W6x;^dcQPP:*Z9`zW:S) x&뽕@"hL(H L fs輼x^e\WY5TB뮗+d趮]Jkw3bRx4 m *pXLZ$RK7o|YIBS4U70 N^ _҅>U ʍTD;s1ԑ~zTYʞGEEsoJ 9㳧5WDˠ%Z< {ttvv4@j,*Huhh_1a:mr+#S>(4xJf>"#%N_u-bjVQ},C؝*v KIddq,6[ 񱘭|n+%E U[KY td_cwooSxǏo"T2[@De/EP>$⚛;$ɵJǺ Bޞ\FVGiTy2]Ŧ49}Q0&ؕҜjl*=_*?vӦƚck\n6]bq~>L[?w} -1Ѕ5@;'EowXYBp,E ۭjrvtY]^Ķo5qqqmovƸA+}8"s5x1N0 !!!7BC#cc >@=V;`ż]1t ރ8Kdt3;Zv%m |;;`Fsѫ00 z&o#,*'`P)CV֖FȈtab7~^~(-ؙb)))fvJ(4$88L2rrr\ms t))*N.ɱcũ6Pʥz؟Ҥ>m 6Z6h\+w)<@'|_\5&,氞uOL]{qt .#/HƯP0$,zmt"23[x/ 8˾VF%z $XR 6lP/d!Г0:Ȭ T2b@Ωr?c59^υEo^Tq+RY}ct1^***; ,qS>L)8;v ޜ@儈5'ԦDή|Z۰pDgrrCPIo/iQX-&(XظVC:B,,,NoZJi TmծBBD~H"Z!"s(K0$g0h2s $Naӕ55q+`:ހFR5/ò c<ҠI)[ FL{C}'v&&8>BuBe(y^\m%Cm 'r 37w]B(+˓ @@sqqQQU5PJ$ hv*@01JgP X[YO ĩvzXÞOT^V.xe h(4v=.n%Ѩa!!?Aڝ,ֆGjOD<A~r=,{`4 }{YBz=!^^ۡmhv/8o$Ik,io4;Ժ"YH[B|X :ero+H[p7S17Lf~#&J3ͪ#x^V]} LJBFIvw ?Ff>Ơ!0>⽃fC 5]{wfITO~cֱ¡ռS3a٫)wnjj"WN3dEU} /l RSG8[S ìdd 8 Z"MRi 21y\4{!92I]F`8͑_yudlf5 l:EvX(/Jn!fxO4 $v^54yY ,Ѧ~ ĝ-N?,?]XUw"ܮuZ[0>܌ aM0iDDĉqr /w&hޏ..wLHHm D7=Fe`JCA)5H3zd~0sR\Es8~ V8LL`?2\KGzxxl$uzk/hߟ(f+$O'L%hY< o;ộ߄hr #HRF2} g)$!KKKWכÖGUHF}Z1mWIdM|.+&/$78WI>]Ew ]~Ci3Ti'C#\[SK/ /z0~r sIQիZߢKl02$ɿų.>6 脉od`QPPOĂLd=՛ 41H^E,9RUSVkJSgibbr0_w*4nSZwY[# fŰ>(噹P,##:Z֖rRpa >(i#9uO?~k |z(mGs'^cKn kH6D$0 B!_Bvt's;+LȸЃ`dS{OJJ/uM8i傀i-]p̳ c}~~>gƋ_uri ,5KsO䥥 c_ޏ<@"j\QWY }p8l^[Kkz'CsrV/4I٘eN\qMn]NKEX^vԎ HGIɉ@3ujQ*jcKHno?]੩4˗fS!xtK v>&&&@y+dQ=99E08"ykmE*ǽC7 R?R%FTE i!~у*N)~{@@*Hr} - $@|A LYn5.{h5A8G SÊM6PX D3]̸n/xd6 _(e|xmW!1Vr(@"~7-=OA"VRrk"74TZRXԚJne%F;w V -(RZ~Ž E J/0Ü ˏ&֤)%9ϟ߾qH^o~z``a~+ t2AG Q_V^k c-*.KyX~x|E5Xm5|  p&ZNd,wqb [`uQRRj5ˢrgj*㚴a"i?3j|Ŭ #y: K'Yu'F;w(8xž\ajv>>>ll[DDd/hDo/=! cK!`QPg>Q0ucl[-#fcc#(/?^EQ!AG1‛sDqfUySc}#\F%crIl;/m"͚ =svG pqqny]1V@)005|dOW5ag#L"y%%%z}tHb\z^o Zw:-5~*y3= fX쾙lil>, r|ܒtP |armzz`oooCD' Ԥߊ Ŷ*vt),S{0!=areb#y׽J(UUk(V=Qxw([۰<:OT6=P:J4ކDE%TRQ̾y(.i߿,N%@TfaaayEnk~5S&\ =rrOHmtLgSx 08>&-Ԫ;وnXHրv/ec/cDwGtc&f1X,v]40ز*VmOu~L1TtvyRĸN\lFC&| ̪_\lNi&ɔQaS{i<={]D~cdiHe\;{4ػ/r$U&rV.(qCہ5p~#"}D_X|'>ksA )5pw}Կ|3YY?BĒ)DS<j\sD [aTY xy=حDԹ]ZU[YYZÏjikҦE?չ\g=< .8,,Q #b8E&55u(Nlir;+Tbpww˻Ec$Ğt|RA%-|S>.Q|".ׁҪE+;d9߼r-w~Z11ɉGRV|⺩24ճ k>n+x'wf6 bxڀEAL˜D>$ WWPbg$Z@55#$?:,mk^JKw7HtwwI4H %"tH |vx_XK59~ck6AX@'1zMnjj773{x6plp5ϡIo;:A}(PX+kiMMN@JhL5R`s$/8[p]tkW/%yg$%ě;==5 ԵQ4? [)9"FgtEm;8zzzXX(JyCѣ.Nir7dزl: 7efL}69MMEtEV2-}:Dt{[[999[|۳P2Aeb| ۷0Mo $8Ԧ/|\|0C]3Օݮ./9QeGYC \/I((Ϳ^M]K$33|wBYHwMmʉQ h}TL.IY@tX?0 I nAVza9MV >SvIVh |fTϐ7[( X$7vP1Ulo*ZUUfk;@eӳ51)֗h`;9)g-r8zC n&&PH-pB$_N-Q@^KS_r@VN$~B{ vrҒ8=y- 5>2sDGEXSGJU01:Z!i4bC^ZbgdCu3@(&'Lpor__nJPVw6Th8/A72 5trrfѩZhp֨= ceϽiS9kM:CI${d; ׯsGa~0n@uҬ áBbE?k|Au~} p YYb~x\o9ˑp.:`;Se8PS_• {0>JD LAd+01=IAB A3 z(y4V6k8+>(9랤rz 8W P/ l-`h`) c{jEn4koB_hU=4oѯINO==8_tfg9#H:>]J*WIy|rN}ZAlN&- ;l%7X;< BQ D|FܖuLG%jVuM~`|󆂘xgk+ 5zOoG¤jI 1bKcܜ5w-q{ܼ.> 1, 81OFo7%ufkWenOmNJkkkbbbl05pG1*=V+:#K-.g8泯裥A-#F}IÖ I;Vv+S'spTC)DŽ*sBr}wΉ"4鳒u $`P6"d 0wo-D m$h#c4J_Ͽ',Y`5d,,{Cev(R`T_~J&!T_~M0RRtjHyٴTMķWuu)S/Q7*zaz+ 44ƿ,wyCwyPR/uZ}/YI` R]Zç~慸&5RM|yjV%l{3%p#Hοz(&Xhng٨YٰQ[ .'5CBAgqX>Q z שUZ*c5Y]_w}gF{:4Wor]Ҧ~|`IM]ؘ㩭355bffV}#jko36]M)dLak'OShGDC(={㫬dEc0,  XX,xv \[0~xtrʰeɓRHJ9y?W K^$HΡ#jȪ ?k>浛T!l}zvf* J2[$_i,cq-ބo(ސ;lyhxXEEeA{UH__;W)N/>44k<SZ~ RF ++P @p-~ pqBbs7H6".**rOA& g;{\ZޮvgFR/ǦG?&=w6JRiyy'K͗HWȚ;rDEMMMuH.H*p~a4*SKBy/~$6W Mrp đdt4ǩJTHUOCѱÑߏ^nh;n0F!V<_d7C\"$qr/Ẉ͔E}rV(OiN5<+ ,gP'ˎU5%^3s LnQ/˻g@X"_iMtzֶΰ_ ez/s 5D8M)l3Od9B@]y,eß<"%QC9:F=#E%`UPVM^ vwhtMlMm))*^]ms$xxxK p>77EZ`?ACӊVKRxmdMLQ(_t"wCppZɥSU"K!tww7\,dPύJwBcL\틤`9\1C,N/ @˅l)|t-Ikjʳ3-؃CvI6mdڅ2؁Đ  p쨅z^u*,b9sCC/#Mn ͭ-$h8bfP| SmdBvu{5&~Q#UgS߽:P_ۯ1إ?\7{hFf!ꁃ "VL@tٍSJ,RTuL^bP~|Z}eQQ.zq-qDp=p Nj kkCl9"j VTn^b Z mVq1nf58-6Ni LcWQCȀEfj<ʹY-NӅXf>[A_S9%A.a` C^jÌfL5E:TyT"e a6dlj@ E`jWOwŐ+۾3k~+Nj*Xn}kil,w1|oRh&`7ACXqX 볽Bxx ܎-YjL J] !Ŕ.|GS *2D̺iq} 0h \k~S7lbYxXoOHAv˯<5&7#7큆~Z%⫝̸? RȊ΀R⤃]iGtbo.R-^J'ѷZ(ZX/C41S3l DhlZ~dcՀpUW]Mͱ_zh7k^EUW S\j)5|k5zk bڛ. J޽CǏp`cz(Ai' u **AOOOfV Yxr!aOȭp ,0djE O }t\Tr9G)jq>+LoxsU=L89Km(b>{oޝJ$#¶`#_| ^Ž9D0 ڢqyq11 m i  0 ^e 򵺴4JXԧ&2QA5'Mp^n.vk$/ȵ+|8E=ENP.ONNpjjmD4X\[/xtu]j Qo;jx8^S44,mlM8WĻ p$o@he:ܨͯؼ$J{04K( 8/f[[E_`DV[+9 z3uqxKss029*U#MIZv{{`Ra@ܹqN!L=3<\(Vsq,|xڅ|_G4sƾ/̦d< rՉ߿ICpcn~e+˶Qve ,(㷥:n X,\稁 Klj ,A\SHCKz(P<ƙ71MD7c?Ku (%&v7*RSFک{3srukWd`[+t8@H$%՚xؓ=T>0mqUa cP{9Nj|"Pao"e~~~qCL .&(%RKn} $85GŅf *DPR{ڽ|j^sU۷ Z ȡeOn74θ7T}.i~ǢSUVQq+$$dii9g6 l;C>%P}}}@ Uh ^̬[ ҇G8}dA| bP甔Ͽ/+cdbRޥ|J3ϟ @VQR*g=,;צ#Vlmᨑ&3j_tttΉA? E?zzh3Fښ< *E1rKfPZ퉆8vOpv!aHR "QT1 Y Y~{#J(Sx@@"- /._RRُZ ^_`r{&ržWǖWnNw4q6A.A$vQF/&K/jfTJi:W;$5CUPtYͤ,>;ώc^gtJT|u>r6 y?n$5/TKÎ##91FEE%''XK̼ okkN_Q99S޿P((0$fb^(b(xg%uP ]Ǥ>5ޞ!ͩOG$62gwzG\ [2Qf~!ÂwW)+B#*l%I %Q# \bl AwzĂ+CumxTkE_5lsxm~gwzy% `[45x &#Cy mlwPXUSS Ma3]į0|Im&5njp/vaUAwGH8S+ jea>@†Ch 5e6v_PcGCi>PL|~'lFzugooqG]!#p_4 b=<8E[ j;K++Jyy=Zckjjgkk97 ;>RȔ ٷy7j?Tcە@_Qfgg t]*VST<ˉ_fg/7uZ_"49ʺ4 `;0002k@~n~?܉pBOì,A1O_BUTTn٠uMMMG$J7Da ijhdFMLLxߋÓo {l" r9% =k|C$suRRT8)mc#5CfvcA!!|<y@KK+@/bދ6+˶"T@vo;<{ol\ ˲Ҍ B,,*| U3ICE&YꭉwJ@\_= u<\ɌFO>pؼ@DQз} ]Fe)БN{55c_Hp}/Tp322bbbb3hx U$i{wz{vۜe2rѹ!xJ}q+<[['""- U9N6Y88n~}s, ˗IIXF+y##:59yzzZV:`dT\XN'|Fq1GHNErt!dĈ;|}icnNC-(H}'G)#(U_ 9yJIu(`cg+<%dSes˗?bb`sbXtb^ x7c|;Ɣ ɵfj}"8w;.W~sC5vj8̘Èd0z{{4XS纺 `wǻ]dlsOQn=lGppړNoF-9NTj=EF3< h~a3B#ˊNPy46Z!)f13{qyhZyv~H:TSNR;C9 P@I-^0>9S+hփ fSEij2>lō/VsAFȝ>Bo(Xt# vs"|щމ|=VHRCKCu[G>(֪І~#FׇI)N&_"x/ 0'B-.Rҡ/^Љ}t'Vw5Doo!Xe Hz???94_'6{LG"#-ׂHL %KgpB07+5ۛmhL Ꮒdb/@F줡yY.0@1~TC=?r[\fA7VZC,?9/_-xc23sq~TMT:SXNM;vV& k_:ÐFs4E?_.uf8('%ki<8 }><=ƺjO&S@ Q FZ}c~l;69*oBP/enxj{))8 }|!E-ޥy N߿& ؍U}GtLmMP~HKKSUo\8 Tcw[qdx CV 0[P> i ǁ2~d.dX U q6ZagsrFLJ7_TZ{P}|p7XE4ccwP3Fv-/0IV@gӘ=aoO$tOrGo߮18$/K)(TGB{WqF恭x )MA}1yyyX\zzzTBfꋃe>Vl=FRX({Bplr=%qal{s%S*YܰCͷY3j9ac _b RŻv+]!{J|tW[VV4h@W_Ɓ߾}CPUTXW-׼7-\6퓀Ð`0aJ]Kk>R_S7ˁ`xw"AC>I-wI?ljZ&_|߿풵y4?1I*Khp\adn~5oVV>jڮ}sv꽖vWNkN '֊bccyfaIȨ'')͡..+L%pn;sqeXwa2,"?J%Pk.6-ʘd`~TjfZvyf H+=<=kh**@Ϧt7-\b-|v_)EiSr5cnKQ_e0Uu5`Izz:~OOZUS}=L&E D]ԻBj㼦qYd|yJPJ,j#IƺkE`ݓsOZ ϿTiA#=5TtggПgrr X=Ÿ>|#!3fQKFJL>}zL_B~4F#cO ;>d$s/^&8/6O \Q^8>9zq:d/1_cvh+:͞PfXLkc;Ow|: saҾYGt ٫6CW䵅78͑>0Rl C8M5?llgAh |Q!Ӳ BAF\h솃f_$T.WKm(*fyȔJ9hD`LV$nM|'ᶈֹ\"ʊEC^WNPCb",OwJao8<|OBɕz& .tyrOrc0-WW[:QsWWW lC޴Dɰf-IOzjjjRXT/ؙW>(/,Ujdmt_s&2ZZSwĴ|v6CYX#I^M N *ag2}'pWjeY 'kEd:'ɬ9QD 1T{1U~~~Ź: 8[N _P>}"w [\lP0 { YeX[kk˗$+HA{zz*gq!Y`?W256!{v,M1H" ; 1W%+z(}7%Ȍ:f좊" rYCFFFu---Vh-:Xk436 R@lœhˢ C² N,o\MS· rC띪gIuń@ ۦpN*UQ^>Njm8go,JQlF|tt9"V#BҒ8e;> )S-I夣ipppb|\s|́[XX Cr^n7}KrƁg ]omm?P`c#76 k8P\π̘# {(ȱ:84Ps,hrjJM]]pOu{P6zllӘYQeȼ;B_Jԩv`Yd$"pa-耺 =m֚"e^TFN6;~]ߣK)FuD-jl vdruabׁߨ|8'/T?rC* ֏7ƕƁz\LvcH|Sx6nZ}q5sY_Shڼ(XqTaƇ&jRC,ߑ466x)N? 9@/XD9 a]x$5Ce Ғ@{OWאixV{@t B?ZxG̬_k 19&ՄJãy[IڒRIx ɣw{TIL$}<0: '''&$i(`A/B*=""V2n5V}-^lpb;L4tt0^{LF4LT VT]`2&oXmP"LJz+F6{츭S;'9,dī=޶A&TTRXS{7shh(ɥ o

Gf%YG)Hg!z k,vnD5yyyF|D%{(Utr[m<.'Fmx3XnI;BNB G=`KT)/dUb+{Y\)fP)kL.Az}iẃd[i8#OȻIiϓP\]ty <7(Y7^@,)˦=/zzCp՟M6^.Imcl~UN))))CinA@nFRKs~37sֻ|Jz%>9+B:: fx5dLFjltЧ[tpg*Vù~$w}X ݪQ@XWVV"-u ۼ4ߝBk5Xo{Ee6KggNݷ(N{ͷ;#c)a$[vv.v7Fo5{珐gM!x*&NR1wBE(aXf*/77Go{d?j"$tL_:l~f:Q6*Jx %dde+ぬ:;jFHBBB#QQA\ZSQ***%Z|y=aZr2l[-dί @had,)AZQѵ;)}y8Wľ~1@TrcU V! #|9WHӰ$$^^^N_|r|E3<"I( ,[lP+`'V>?i .=I;^F/U*iTFiXUU5T_^>h9`"Nsk@9Ǖ>=z|9&P (^_e6tsYhN҄ױǕ K]Jv 8b.~|V, Z"H;A/Z' YO<=P?#3wL똚0y݇aߧX elz͖E\ THx][Q7D+o~$MWNۇPyŝ[8+#SEhzu6_W?! hDOXϊDs9Z NnM4jp瞀y/T[E<@&#Yp`#j8kw7p+ߕsged̅4b)H_5|,ษAljfByg!LVED\8V>8?p~PyCZZ3)++No4:.80T oܼ}UI.tC7sVS|6紷hOJM_W\z@Q{VMښ޳ *v'_\!174A pvQȃ_F󍎌1yZLgVѠ?) -XZy3}>a^e5H:dp~AAv[d\v}2kADiegp| lpFIIK8!3ɿE8;)JΦ3DΕo}ģ;Vt^+~T44%,g8*~Ke%$ *12QAWݒF9ET?-U%ݕYudtDЄɛwo[Z8$:kw "-D4E,~$'P^ 1vEJN'nWZL,vAe׃ؑZEq-NB/|DŌ$Hɂ0-ofU.@:oo9 Q>}}r)Q63r_OΣ)wPXXt(8^fB="r. h&$"2kp" 8:::#[&fݣ=ŀȶ"ч0;H8DO.Z;bG Ao6 b.cCNklVoc==UmdD.kgL^6=Z$!+'띇)yga{f?S_Qļ{xס v.=5/KMIH5lX |#^zzzT1r=]Ă77\ 3ԳB ++YFWomQ퉇bj1IAt$MB3O9 b/*֪#Bܿyݗyn<;YUp86VB 7x=E:zmiA;][c~q%BS 2Gy )y峱AZRo߾eLllQi}N! J8JoU®6%arzGFӒrO0[2FoG*2 {MONFTdLZ1[ŎU+^ՒcO]A? 4ydk=ZZ] Pz IA\YW]` `V?(/JU*εϹ{|^v<*H5kvE v5RGfÓGjٿ`#dj)KvtM"zPGG8XGF׭KtIZ>2-R}LMEDDd'0YG,48.Xgw{쳘"5l,(Waou= C>Lfgyi{?Ye4d.\P;ճFQXXHGGgkk+|w8Svv@KL*P#i)|8\뀡B8 LSlem_T^mT=r)bUk_-=fiCsxrPaznD*F@;wmRѯnfș08#gtEc{rDFMwh @+-V> ֈ3-ZPKVr-FkVL"jo e'm7--ci}"%/^>UvTR:x: !/B$6,,2٘ȏ* 8daO22.͑a;oxE*xFrf 1J^ꄚwᮈZN?~ Ԡ#CaQFl~8ХU.*l.j^y d5@$zotΧ}}ѹ HSeMMnf I0=OCg ut2zVڍb2 ҳE!g=w}ջȤmyk nreɓZ"+.x_~E?|$2.7𽐡b<^ZLݨ?G3p| krT%>Džm쓥? l09QUGQ @v%O*JD뮬X·"1 9RQ~[h |Y"o1_/Cy`N9J $o~Y'37&3TZ?b& =\-ۺu.Z˙jNIUWԩ_$^?U77烃__y9aV9Mͯ}1>MJ=Ҋ OF zQo_yc|5Q1& M/_RRAD6F]fdLa,Ikp̬5"LYβo߾=??ly ۉy^""nq)(('>"Cb &]J~LeXl\SJ%PH cߍ,b8{\n= jr'[ћČJ^jԟ60@tlgbqퟬ14hQ H y(oBxxbt?n[\9VwbQ_B.89PeyyכzW D%F^Ye9o~v xRn{aLR9qqqg#ecx\O̫~[B4myIkϻ (q(,<99kk,k5e/JщhKHCfN zzK_曟؋#@%@Aߊ3RQ&\]].y&&&qقlYO,ٿRY|GeFe${y} X Ett4Pg7rC#6|vcjJ*% DLL8ͷeIMipڇJȢ[|( SsHA[cgb] rxwi TݍQPChok;Yn )--= xL0&$ QQQ$&on.~D XlA d`d%;jOj':pUS>߿@+ȩڽ>W)*ϴTdY,k]Hu?[ߏϟ:ma6}8=v4HIv}yj3Bo]ZA!s|@\\9\>Δƻb-m:,xr/niMN'tEVr}\Uz7ɐ>pC2k}})o QVתdKFi=x `GԀZ]@M]~Y A}eg8;I粙PBONjtAu)`[՟qZݔ'Oja! wef"]-6Vg2> N6덮p JcEcR- 1bݜ-EFDRȲۯ;NPxi7RmTd{JS[kjVRj,'VOV%)tah(_^Fa&6ÒfCvgAQ4 .xݠ"?Ե:L~h%tћ)(ŎMf>no >'ƾoWCLc\vDly;)MCcc-&Y(4& ^053oPa 0GF?'?*) d}> ý޳稧ں}BCĵΏ \(X.W{UIL;(c>[6p mCoj$*-}!V0SMOLt;X|2եAP4`Q3{.G@e&nU; y"CFk@!H BspjO$xpii@~-+&[['~8<00ߎۍ;319_V9ɪc%w}LP.Yn%!Ef6.ѡoT ]ZgjfS|3"9ƒK5s~K;_@]Z4c08,rzwOF~~ք80 /HO,*oeb1_A,$,C\+EVnJNzC%><22Vm `YhxU7CɍfT%`=pܵLƉχ>e&AA֛4@ $:i}:e[}3M1IMM谹}sBj4FoM(K! >5_TIT(ts Al\௸w@2#FW]oԆog,(hGvLoA4&C>TbOw EaTX] n~.x>XN@ x푺Ndeg?B_芉zD0`Utg'l|PKqǚXRoYyn{Rrw*)8vj !bk?& ނ(P/^WT6]lHu;wDr~Hm d˯޼FF䅵= ez btRRq*"&lO/*5ul WhhfM"3 7;BqUUSKr!Cf!'I96BC]+1%// +!67?*uے>> TܺWrwYN2ų#9cW=Fmen@/҉PtêQ**L)\i1[ZZxʟ,H;[[=ۛ0$V2wس4p7m1ToEУT222:>[șJߜZ.=b{/2L4Q.LvCrj7LY"VFGA>+[lNH^-I`ޟݚ/-Z z6?jrKf9AdZNJcBIAAfǕHju%+(UU6J:kMNĄl'cm㜮'[BAXX_-5766e@qd7a`>! ] KKHXWDb !x ?z:kd{```h3绞$]qE,Zbدk /vn[ɽfOy7A>[GTvN ]_zW^ $$ߪJ:&NxS_Xqnܧ u|P}JHHRID~Y620AZX~G Uq=cDxx/=pۣ`}跹р\ XUT#}gjj>"S|X|DZS_e~0{)*Sͦ[H†;YFKDАb2my偋q bN"""{XׇF&lpC3֖Ƌ7ח@@{UMAο|yL;BN;C=h"z}0ev x}E:aUlllvh (8ػ_<<#KCE}gN^-~@Î . Tqf+|! QG;Н&FFrr>7>] *Zg'tHt_"8ee-Se_?~-Rkƾ0@f`?hؓ2 aquT2Ų('.̎#j B"eWacc+T 7mU aob ;~~o>, DžIE+ּҬB,bY_OsFE/:H8k xR.ia=N~_xK# K=^AfQ555н_P $^%9#0,!qq- \V 0>imkTԕk=h!tMk ͊l55Â֧2~pL][?mנ Ư5*MP+QBъuFrb6.Ew?LQYlך䟕{9fSHnɏ=E6A nsRkȼ`:Ǚ8|YLdY>X/ $+ZY ~uzBťo>KU"V k- {oD_.(b&R:+_G7>aKtGYsssXd{ue5"O"44y}kE"ĩQtu$"ѐaA0[*iAAEMVQZ:6d:&z95x>ӝ\p&5%Ve$ naB`lÇ ʲȃX_"~7d NX\6 9lE`.Վz]|:)P~0) 1Sby|TH0S6ů ʗ>cFdfdP 0C@$LOudz 4{\j8GNF6[gBϟ?F 7CM {X8Jal|-rRLZz!@L}-ٚUkT2v~?` KGhs& ' k1XF Aq;VV>ΓG&`uNNt* ԯBkk%YYH 0d\Hj9PtpF"mpضӭ߿]W{BՁE]࠺0}OO6㺴p)|lC}@T~~MMMG:;W7~}V~,TNKK;|@J_u~s]m&] ZY~=Ө;C]Z*ׯI͓;Eܧ}qk}Dn,YiHEQ"4P1LUoM.'/83=j>mjH͟./<%><:ZS#f3Y;YbXlfE3~=55<&g Ӷ3[zU#=nvGzZ3 Gֵ:|No6cdxXͪ%)eI&QJA F,<$7|/*AT2D m&fKn.%&74TxbWHueeEQF 7#̓@R!@YYYۓKKE9Ky3]5 y9:ɨ!kn}88\G%\8}KHQ>۲#ž+q1'6@Kb'S@Gj6{kƧz݇[XX[c%smo?r8;ӫKN!o$O>sWTUaOkj*)^"! ,1B=;&8Fi!/BĐT1)Gd"1.;''ַW/tZkzā.JMKh'o~P @ .] ,JX̳8ZeG|Pv,vu6ʒ :y++XMtcB5qS;nN;[<`!,d<S&{l~݃] Qh;K4r9;,6K_mҍ[D#433JЁp>B&{Ԇ2>,$7rU6~7 1{|\SHYU傐nbϫtO@BtJV Us7G*ryݖ~}\ݐ{C뙾2. Ց'+i>^x{([RGz#`BoD\*D@鵴 9jb&(%_ j%tpLә1t('s }13 0 #DFr$}^nrصs){v+ُ84rCJR*tw1υ}B\\9ERs5HHf ]1޾w`Cv=xFk[ B{l&?ȸ3-,,@ô988xNM ,$2T^uTUNN|G&-FTЅCI޾ יz% r>#E+YA\>*srr@}/@||̀_g %XՒ,bwHH.>xJxwu[}_怚oɀ667/pe~%7@k&xU3]#>K͡eD:P#qN f|Mx-5}]3~)L=++* 01eDj!<( (x*.F i>` hT]7Çbt:̓V~lK(o3Xw ֪?A-^( >bu7e?̈K֤:x̻ܤZ? q=^p P3OaSx3Yj6 wfp}8O^KB4Vbjj*""ҺhC pmupxfa! F+>T殤544D# D׋ˆ~D8.=JFJc6?FΎ@h|z'cU6J! Z'jNeJŪUCS:a9K|lc{z\s{k z㎡A6P59,f Dp]OX[{o?:^㸿1H-jMޮuD B \6(obB}a˛G`ޖOANPp>7 hYbb^*HH~n/8b~Trs=WuO>#qoI3m\o=ͫLL$Vojcl +]iOhzҭ$hMrip<@ӮlZ()###I !|z؊)RRh+2p,u. Hss _eɽݷ8=%aRQOΤVBG,h?}%J$w,Z%700{Fɚh q\4l2 LW6;Hh :tz\=ܒy1w3U_Iȟ-5&1W/ѵF o֖l\i@>ushV浖+V&BN:vENnx``OwWw7@K%VP[b+3C]݃"З/|XϣW)^vj,ltⲿ}gCXXx1 ~}ס@Z!LPYBW[&rv9Zj)7O lcFGW,,DDxXk4854LNNZO.hI ?stbidt DD$f:+WWW[BO6)wKVWWgluLXտTYE:YsјYYo,C\( |7?a2ApT)`*| 2LYb2 E>~Oj bk""w&Sqó>4N~HO**%FƒOۍ/Qn\.SXGݻwk)TM{p:BCqu^2   &((S.jRN唋Iѡlv]贚"Ex׮tnz!xgg`x]O^\Z]i?0uR=~Fh ; .N$#RZGo?6ErF&o1K Ώf51ɓe@MqyrF"gﰼ}Ǵ2~Gx|{S/ET0Sje^X]Aj߀" jhPܾGrk{0>Kb؛ 8j Q6wޛW˗dMNP- }L"J(ƺ431E΅<(΢&T1Rؘ='M8(#9b7y#GZ5H?,S_x666. Qgc& B7Bӑb>wXlGpsԻ5csXͭ9+88Xj/3unO_g|*e\>$,ϥrb>^nn‰q0II3Əm2y1}ʵx\_hqc0*k d b5񆦢+~3u[N=[v JҞ0z0&0 s9 A bpjQA,. O)}VVl)'S@H.{2G< qE[̲I!3WeLQZY8$$B8x@7y`S,)/qSyG5մF)REHU@@EAH(wM)zz Az/*BI[oK2ff߳XX.u(=K*h7IWshuV{{{˯U0(ެTcպFurפL4?V&E *?vD|qHY_Gigϯ#KBzcf@hFK($6z{,fkcS]]m7ZpsP)j߹C)7ZZ{_d&5/O///߻#bpGO+pүu|KAJ*+{(sd%x菇ʆ:VwnS"xb3YGKSNvZo?y4(Fÿi;>% A/O6,*Znpȑ: q{jXas5Yn:ȮEd: Ydnf0GW|ThTfkA#heFߩW]5:DL|Vn|wzb1sss5?988fU$fd4ٌ Tpss:'T}j;/sxx(rb)WQlŷnq4d%kw]fX+9l^^^uϐ5՛y@ɬ;-=d~y4L&hr:X @.Xt5OM,sssg?-J\F*s2O~SXXXc W倐`dd?/K3nlNC@.!}ݱM;)4m=ɢIӱs?KC*A{JjzMf"-;fWKX 9Cd1}TRYhz(3x8O,h=ȈVZ"j$!wiի~:'pCDV44)}o,uQQ玛?C6͈3 []mWgwbXxx 5؎lMnEvj jqQuqxV*AW2´ U:K_ ?gt889 ?[ I h,Uf*ܜVC . 5s3)2Α. 0]-rAyn>l3.o߾ޝMAKKMFEɑ =6ш^D+CF.nj݊]CG+s_!>l[w3|@[NN :ۺ  ***~ſJ<F,S |́=w裒5L5f#F-*TnPks|B Ga0@Cd߇§G'&^SW{2 f4Xl3D,_ZF;/^K+=t4e w^~ AI߾Ưcz۔[ac5] ^Ѧ=Eq"LyKIoiT*i9M>G[I ATvSmҎ3.į9EVuT*\Kx5f@2mqqĔ. xN9ތ^x[_ Z/8ODqMn\|])HEn$RyxR޵*+yQ=P_fӎI#bLmx/vFVt~ 丠Gş˕v[,aX{/.x#Z1q@1 I a$fyct>@0oh{ >Q"ն\40ͮEp`tvqx<;qt O,%'7N}K7T;.ؿYE%Բ$]]\xz Ȭ`G1׺\uʲ fҲwurrin2w^t(mm# 4tА|Q9'Rhϸ{<OpV)ИYybo?g;20e_ԵTC*I0"@S =헿*([*A1& &?׊SZ`yh.ꖖWeyGHO K7ɊkDx‹ȲW$?QH, \0%lb5u9mv ΍Ux+,%IOOw5u>]l'8k5߿M|Љl=!{ly)Q?(ȵC 9[d3~'o.mT(. qHXl 4P.ƣ944*;tZYR}W.'l?g1Q,++XaFMs ?0V>2w*կaҏg{VQ9bNɀ{aoaB RP^jh`QH]N^-Z0 ,]#5,k HuR}ؐl;O!g0cn]a$NP}7()!TY"NZ>a}<W>m (#]`-p;]BV'մb{7#\B+/^qQiξ|RBrvmaRS+ōqPw r>S9U52,M{XZ>8J(O$p]:h7…b‰sN_vjm> /qӝ7P"$2 5b;:[$4#Lh\n|b7yLOu}Wqy4ddf z|1?V?I_s%>;ZI )UN:fFj]- T+jW'd=hb7sKBPz^šב4NDrx+$a;nzPB=Tɸև,6\f3-tQqꏂf[vvJ5[]\>X_2rNJ)җ.@g٬+~\GM)"@܉G_Fg~+ '[~z7] rc50seQB-80Ӡh+QTt]% cJ 3q[T\ b1}I}Qw 0,6Jpp(x\]ryq9y,N)ILp j'bL=wuR=* XA۟%kye-)b&X]9Fχ/~{+x5DŽ,/Nk,бt7 ;80۵@#/w{oJꆲ p>p_Fz$vqqaŗ w a&᳧%I󸁋ː3LƖN~~RFO[УmD!;Bo25 I7!Ԕߨp(<SQv]݋}r(H5-;2|~'Nb)}lm-GXSlyfM!Qqq2L)3Tpn+i:e C"}& cl=3~1 ѠwdS籬x5\DGvMՅY* {ƆY$jLzn1u>_$S|cMKG'tNe4-̆=Z)R{(?ljzCJwNE Jjd'TY[{c :Sv(eTKBU3³[bg[IFo#}.M7è+YB$]dU}}Cץct]_oFj4G5~csŧ`J6)*ZpPOj'שIRlBްɽ4FxN_Å`{_`F9VG$,%EXhE3gyI~9 CFcxL JXS.Tr3rEpjhZIʬs0~!VJ6}E5׹$)MƗjf4V,YYbA-f7Xh/{CCygj4Y^{`]m#b[LG.L CurG%mVԯ_Śt# kn_L _ < @[LCO4J3bTǧ4J]/aȑ\_'M?k^_I~~?k-b% dI!0p3n8͐8ĝʩ_Ǿ -i*)+~[sy[;|nޛsW{ub"н1efz[ !Zaa҉(4/C%11ݛ K-9v*MoCvhbM'mcoQmM{ko- [|o|H'&&/Թ+0}1s{PgFZڳG'=p KvYR2KK݇&">22 P{*P}|H%IAu)ĩx3xbi .;f \ʢد"vMDHCBlGJէG֖HW$%IYIW @Z `h]Ҿ:kZN8O6jDnX;W8I'1ޒfnq$;0fRG-jcQiEUn;^IJtkwCmͧ5~xyt4WI2SONL3,{*{uو ͍6pCi7ׯyÂBZ\OM v*fJú\wu_t6@9"&-0@~.:(SI#Pd66v;`Ohhr. ^MPثgrVky2P_ cSp\׌bpsx 8c?YG LFS':%mS#}qM2#YD~;/(F3J 9xEgVn])`^Sڀ|~L;&@VaC ]@yʒUUl"Vz[{+c&Z60C}f_z{ ;<0q\5zt)۴|~~cFwC͎M@EޑYHWižNRAڏC&Y}R"6s7wrϋ6WJJtI//Ϣc.5wY-7g K: ʦD( oٔ瓓sTڹ@9psgzJ-i'gnpUY{Z%x)*W&PK٦uH1KPKF,C-Pictures/10000000000001EC00000139103B1727.pnguP\-܂5{ ݂[p`syU>cݲ{}{E(I###~YVFB<͎Њ/_e%D5~d_c ?1DE@!T:ӈT]ŠR G\4ha@N9pA6xHysl,Wd[1bCޣ0+8y0Eژ[XFy%y7~E[蓢ܻ{qk>`C%<[ki> zWi}!Y`#i&&B ~" ?[+rmW$ 8`[')C 8~$*='5kf|H,+/u֘T͂`^{,&?""Pgy5`U,=vx6.Hr sJJhlh xE>IS-dKV엫g͛%W^\9'~eXIoyaoW 4ngZu/mm|宫Pomm{w2qjl*=]G]Va_CL"7 QeD`}ަ!Gbz@2ߕ ﺘ g}3;$?T|DvPT݆`51 Ͽ\z_! ^rqBm _tn;]j)0eeɻ˃m*Zfvb;==Jƶx|+lk[ ^ȀWj9u{T|av)((1FɡZ[512S 355%5c{,M\Y,|׆FXY\,^7&(Gz~<%Oa1X$QWVv1h<9w&S+C7t5?]WÔ"!#SO'({]mdD ,iW-V6{` uHc@"dfS,TE ~X QaiJ {/x i>&t5DsN}K 2l2tt/> T?m'`[} ,"y*)0%J?~rDnԍ1ngj"nJ_;dq:O$ V\t"#A|v291ݸ˷y[nfv 1X*Ê)a jBXQ%J9e" {Muaoh 9IVw{R_Ǚӆ˸$ DžUJcgk-. VB8_mr?O>HhɑC" B -(qKu,cYs %AAC#R_Uĉ}+#I' kA} h`wu {>vEXNupscr\c}="U! a3ɑ&PAJ>:X4_Ϛ7|^Jմڪ5!S Cnnn>v߹UWđt`z///KuďcʠDм<S6≉h7:>`__ܑ52Y'KM;m!Y֨8'Ĭءзo| mLHJMUfO}Kl|0DHfϯ8{epے=̈+(++!@@(:ˣZ=Ԫ֙ ~RXTj !,Ox?PO;?9 .OrRIFHabj!S|kŊ2gKwp>zr :{7%`l9RWS` 3LѲ '5γE@ ڠ.+ :7D_*fJU6b+=}Z( ciU[}r|a)Tqzn(Tَ^)W'4ʹ2Ej]eS:YZ])hi#+c8D~Qf2hE# AyyX6#80hqxE:eeM TZJj"Obb~95ߟ@:~hxq̄+gM|)mWa%e3Z|:紙Oc1F!*EdR/j`FT(x/bULLCC 4B#b%W4#vû4?W)rhl. +_T]]ٙ@fr`=pPX.mSO50Z ٣N%JR̓MQw&oʑ l+0'-0As0-38UD4!Sfʾ@BBz^)Tc4̥ⰚQR6k]Eʙ!EQϩ #%bOL>#QH^`%Z 5{!?X%Gw݋+NOL@φ^)!IB2)}#%U-j0{@)i]Z8 m%KlP6"PC$VQ9rfQj\ ,,&-䳔pA ˄"^5{ȟ kEHXo'+ Y -N`y8QS? ( 'a+AGcp< s(71FR-v$d֪SG(3 X %@z8mO:|oTrL3S\s]o#E-29w@ӧbH'wjW/rA$ K$ŀ˴Wk_SIQS!uF`&W 9KU=^HAAA+-#~*".aɗW Q0Oe$,T}m/:<2;A_ FD'8dd=huy8mtD}9:*V80oO}J1mE|>CE<+gWev(A 7"L 0 v)KĦh]8G%~J^@:`!kCNΰ `i-;˕n)zΖ,O9ItDFb!fL:Y~_yC^1>|soثmJ=B+$X,ق5^)=%[1I"D-Eyd$mXS;=ׂ]`)kk4(jژHl+{4x/Dvgy3dۺوװ)Z8Id`&*b[?uDx7G<˷_{$1J_kK3YJ4''\|_4I?84$*3.$eՉpI̔1-hU"`iI^n0;Gg%WodAǭzaohq˥|&VgSjaVD6׷'_CtrqP6~!^g+sE huv1SH5F ͎YZGK~B}AC 6 {ϳCw8̏X^ ë~o 5۵t\\MR4R~jK['Wz|\ ;j/k脑y%H>}*Zb~fݳ>k U1|%5懥,e>px~N/ k9]@Fv"2aI( Xbr%d`WvvOXz 󾼉ch\| V*cׅ6q -EMڷ>o$}jwI"Cщ׫E9~t,/H(غD'ewΒR}2͕b(3 <~I}qf ,J>D^^?1|UKM g8mBHB5#1qkj OIMG{nkXQZ^w6޶zL rc!BeS*KMz|(`?.G:gu._RtbՀHhW)D~gLIK]CDilB"24s<0Wbb7g/mq0$E5A[[KCL\*5Hw1ZVtfeJ%6T7m+Jj*^v& bOԝMIG4S٪MJ/!,/ݲ?T9K ӴOKۘef\*_S˭$Ctifd˂9=Xvn~0,O.ר7nzg%şֺ-|}H k!+w)y?l6.YhʅI0Ls/sHd&wM,RʬM<+9d+''\=i;dz!$5pp+|e`<7ERD j;Cw߰bSFQYNn3@t.KHÙO%(!{;&vkt0ɽ}^ z]SEۨaөU 2dҔ_ ưIlf]r`۽y"٬;tSsyxp J 3Z%Oܣ1NaUZyXh}-HtonjBֈmim)jEh⢄ZoO_jԍ&avY )@-qX@:}e?z!@6~{@qc=)/N};!8Oҿ!P!b*>hcxhE/5ݒlo.J!V@'=:BxLWؖՇ{=2E~ac)ᲳrNِϗF$Js c˜Tێ 1. irڪ~|T{Qr]<45=wj.nҍͥ*רXE C_xzVhEuSŸH'&M:ɚ;'׍M'|wةeVnMZp!!H׼:4LK}^v%E5s>T)##bZx::΋C [^E8y_`R/w\u%OiP,dg.sʊDNS"[Tu4|M3\}˗W- |EPPJRc)satEQEPwK} kƨkh&>5 78A7EHc_+PԗitVIY mP2I0ERg=:㟍g͑5CN%Q⾧i\ Ҧ5H_USΓij4@ N=>Uga}dõQAUC :~W{# F)FmoO+Q[֌4 7[8%t{1ΡXdޯ8NG`P\:x3aJ{7npݰ<<\-Ϫie #! 9jkŔؙ&}^٬\烌CL}`fyEv^n}G7_NIo ^t| _\&s ڜw"1T&-mZA5^sZTv.q`**z&7uQvvowaq]nn B5h8$l]YF0Yc *3G ޠ{Sm+˄T>,z/K uۖD4f< $|³|W 1S4vpY$'g(-(x+yyO}n|zu?srBg7} KoŒN=BFmѬXwШ,-'z&n|\"3I/\5V+\Ua/JlV^ɼ%Z-m|-A~Q{x1*Jv61sB:~8 ~lrrRQQqbbdo/T0EJZ%p- X؋˫knہ:줋AP}{i 6 :0CkxU_UIJf#y.`\x =VAԼ#CЧIօ4(l`ސuCVr&;8#2EE^.:/aqpa 3hf|=vzp^meŭM>("cidȨXk:^T7/agqhu+9D/l;5~RXE&4c|gm+H@ ’.#0g= 488DsLM};Ae!bNv2҈)-)2O ?&7ڌ`pSsPmzvPb-s?$ y8U'J.~ЌX +dS0{X!Ȅn'fWޖX*e+JLtv[fH;Sfl5vܛ[ZJւ y=ᕳJ&V8kOox_p(RRPbzyIV p!ݴ/fdb⮖vj"#<ܚ'zH!~4(L7f0ƴ,iRBK*B?s5#=R4g,+ g(xgTТWl1;Xd7؉Bq6_Vq zRtEw3}xR@^ܸ?n^=˨{igki:r:r=SiEιUގ>7Zܻ5dFL;ۛI#1.͉ mݫ:nJ&!\I.]U5RC۪{.hr3MH)Eu`eQy5 \x}O;= _k--=--__Y^]yjMM ~[CEs]QF#^E5)?4 = jӺcvi? v^\}"g`ƼaEJ̀[/6vIJG|e[ǿqySY:oݬ@tN9FyFsxmsS5#mn)@kΠ_{dCw7Gn*Pb5 }  {$H*|~MJ*\l! L4[BZIVj/naHD(EM4nfg P/$ (HA|Q-Kk9(򇘘VZ\뚺p '@.iF4rK=.8 ǟ"}0gG[*3C\*=v^ޏW|;/(GXt> rʬl{AFP*_:a}tJ.| Ȋy* CDJH)\: $U:C nj܌^hVA1|2MI)pǢ,Ӌd^31()lL?TwsIy7M LGebmiH(渒1=k`v"9לU[=, _A./}!(qz co?wAwP ` R²WŸ*xvE|zδxH#ý76:-Vh"FDx}4-mž89;;H>WVVGWu"dٙX__3'EW5,*-0!xMeRg?%YNdPX;|0)*ѹT߁ӹ )NCYbDǥl+C"͗oϲRmnLvkqG~ϣJZq,4wxTƚ{`ų޼P69pa9EJd8 b`$ӿCfԫIAJڃz;8%;Aъ[9Y"%5()igSm U mꦄ1&>GZkZgDaCnԥ~#9Qb`]z*M`ƸY6H/z~㵸NO=~P*MX 59?r,vhERW#v(պd] toҿzOJit$-VN20Lq"֍qǓ/Q -Y, =>YƷs歊 r8MQr:86_'ӷ- [JMyNE{.y ܹ6~Ɠˎ鼞:GLb[`6[I{1VْQhfr-h\ќ5͘w8 LsV6SȴBNOL;Պѱa6 f˱qAQ&C7T, &\ K__#a%ȿ}󇓓ջV5f)^ eq׵{%1 xz=+ )A oVʦ,O())nwYmO$y9uJHDYd]aVթ bWCM}>@IR%rH)}3\C hРc5cB~:|M)};pZ)f^r03`-N}ZB e~ns[W's{Xs53G3S'=V@pRH߼f=bTjԡHDٱEfђAQ;cE&{ICtx /c1=afIлQVrTsvޟp;si_3v1b/"J9qf h%CED*w"|]""߆^__;}cX; '=ݿ7G/[jn赮/)R;:T?| ls'm1q%cIxy1S=$?#9f46rԯ2=%o@`"Z3lX{#x;ِ Lb'Akd*GRc7/&h]<>'Vf{܀{p<5Fn9 {0*w?TH$ m2{FOn\/X_=ߤAqDB._0IJԭ~ TCٝ}%ݠQEDs?;"?u?fz5\lEFTVVCb~o*z`"W=Ѯiy[m0VRfM+>ƙ>$'[Z >ۥ0C|ˡg{q_!#FAnҷ@C䂐*F&(;%j6Ƨ%Ձ[gIrFoјw(>8; 㕡afUZ?3Oatr[1$Yv8[g.z=bU7[Y4B?el;'tNdhȖKܓL:ϬD  o- 'C2+ [\r߅8SV٥*/wv 6Ehsr>sdJZ:6"dXf=VEBA[t?4k:jZFޑǞ.u)~0;F>-zxp\pgmueju=#eK $ /PY1RE$3RRGH s?]a_Mldcb4~n0ot8.k9F.r>AFoصWͪWjs?QNag[m=M㏝ sJ4IWLN*!zyԬ7tR3(\XϿȼ'?bRɗ'-+46K{;o}V %S yϺ- 1CxmF+@GW1CӉ<M'Q\|htBVRI tY>gť\31Ϸw[;EYӑxT7HHH;N@.ؘx6 m5I^©ٙ}J`1l&ݛy<<N ϘN"B~P'bؠڛׇw!JT'u[x_ou\>AYW)~& 3i2pR5Wzň.?^~ ԩh@&z=-x%ڿWWWHGLbCm ifz!CX.GA)ڒwX.F\O1_R*j8K3ʫnV gC3?svkyg ci6قGR5F/cl 9bup?">}}/[*?G^dDjv&tt:x'mš`/NE׽M, =eݟQ&kh;Ds7e0fUV?!?_nWz㢺ohlѣ>Șw`jzsvq(4!E#@fDq؁1v}I ~ϞO,x켕TWnf뭼F2 \h}$$9JnۺQܜRW~rC&zYT񔧫^o!2g6c}HW*7/d)?VEuV[hzw4-^WI2!,5~$CRS-EL%܀?3=qm6{ O,fPC."%78<~;2+8SRPn/NWvV3: GIoox/4|l/ w݉.mNwQE:-oi_Ց敕Z4dgrxx>oJ8rZyaƬ{5[5Ot"fngfvOnTN D\iW OC8[:=K^R89$ptfEaU hmןz',-<4k8q(jwhqBkҮrqFuЂ27>>xߝK,~Xu( Nq-"|^/CTÄ Vv}CsȿDIF;/?*o ;'``p.'co $P^^KˬL5_8ѫtIhAi'Ij)xWr'+%$((o5@? G|(Qq=_TVM-UE# ݼLŜ֌p~FDRBU`r\Ǡ `R&yF u"(;>O~Ov)(c39!n[=É43r\7XL= nm6Ҥ񹝯0ϕ{!?YRtM ޝ,x=k5ʒdff"` /xp$K1h7}A@nB-/L6 xl;WfyJo`@!SIIn8QdEo/=CC;kLL898ska6aZ.b!P)U %VԏnYBmfc5W; 2ǃ(}Ӕs(VXK0xݚXWWwǵ]NX(RN?p$pAX@Qckϲ$ro_}|F DvIQVXkX'7{:\z ())IV1 /۽vI3Qآh>׳R5-u,dd jق"V;XXXC)C-H-󳳉$_^j=7 "S} G) d۪0DqzeKܦ->RիP?r1 yw"R?g[a 8(!fCC/lR{*;(%%jX!@AM}upjwOF1Id`ڄý<L<I"{{}5f Fg·JkVB[]`wJ:= <ظ춴%HIZE8_k&2y_^.:''ME|O+..vm,7ޣx% g,W>A\ W>[4PdNG=3S}E8AZ#v: `Q/v9b@rz#RY_^^UoKspA)7Z7 #mgeRbR%B|tQbc8Q=?=9tK `]U=O#Q8sm7$Y 4js%*g+Z GvvY#ՀgpF]4خX/1g@{1EYNRr7-To"}׈co-K";2ўK^2p}m^@(DߧBkwz[dLX<3ɴd՝<#ۣK7<<6#W;) '~[q+<@|[u,VB|+`nŲgcSV/Gfaa1z*b`SoёX&s=2X n\t,"Kq)gR+;.[l-B([EAKĒxx}Dx1 Y-?ժki=?yaM/yV]l=/+QOO+jKgkBkr~Ofp!#za A!n3PPnhx/Nʪ,^eS1t)rC:7Ew:ש57iu="qZ >Xxx'^ܼ@kt[]m:f9HPL=EHHb^liBPy6N e drzNr=VUp0z &"66JNwse%C5qS?u4~ZFFo#lf㰼LP3*@szB@ݜ.܅ AECC~Ba)Ө9apowfҒ΍ s @35mX3B9#be7ܪ;1pPϗ+3ęo@d\nuj_ǶgȨޏTYoT:]jN 1!h/[%+1ڽ ,|UT]>hhO†$%9u:(96Ҥ\\HO #3?...LoZ W:xN d& TF$???շx^Wrd}T3*pC'Vi c(ԩ bGGGވ_=̹)( ~sL+{@ȃgWOp4l nC))'2E p۔,wěߕ=/Lq)KIu̗R"#j cɑVyBbo|׳^%a^K>͗".w~>k-(,4”L&Lc|3Pqӂ+9cܿ ل_AفIgON"2j]PPj<ЁF;hK:sXH@*#~T=p.LilP+))!19;ۧ%@u>/!Z&z?A]TSّ|\F5[*g=:X"!. vLR0(P]d 4B]$Ulu#$NtG~6sm3y C@\/R;n~OlY5`v_yMw` &z`ׯ6]=J,+6D0B灡lmizXa6BY|ב+-\#:,ءXZ&#C:sqigL_[& 38\Ztl@BO,~;y{?Dxc!iD })h1 1t bEN1ƣ|y/Yv@hpShIxH$7'P,ʴ8k;Vj-;yh%/+FDP^6@Nٍ#"6h4%!.o,8zA=;Hz] >Ϸ(slٚ{X88 :-hs%ZĽ{#ɡ-hg@we)ѹOʋn0O^oHI4~4XhI6tvvKHѐ):[yQ.#ܺâh++ON$(WY&a^m "ݬv1Hs7j?=Msea~y{y ; ̓ʹ-TM;8:tdG2竹@B1L[0A[ġ3R-;8ZH 8q)ԧU$$(hﻻɢy|ϖYU:ICo"7="Vh,C0RMpD0s| $$$}sexǴ1x\Qt-KlDt:9ն 3Qz1^ #[P7_\= 84:/{ɞ=&$r9gt?Oȩ?n\>_*TVi[ sz][1,茅DGCFtv\+2N Y CqWpaN$:am3 Tn9}A ldd32)c}L[pW܆>/!XȑkvU&&Vݞ֩֗FC 7ʼnT ±g˳1^sBfӨjwGS‰`m|tLP)YRC~bts*TLIJ_͂7CثӜPsXw a᳸S̥-/^je >+ F:00S}ޏM{: WuJ J EfcL+wk 2zr5 ,,,&cUUvd2NMO3d|nߔFM?=B_!{,e$AƳj?fs;EDdbY+phFQ;,O]OT](RCpHfff"KCvC`2PtAP Fӧxo>..swmVD}:x.:3$d~ֵ9(bQaͅFPx pf&&0666

b%1aJ*I2V8#5DSJv&6@Nlp!  n({"rrv7kkk#m49ƄACl]kq)$1\,à%ucBp)R9} ''hh_K(HVss %[c2Z~ NO?atx%g j{ǂُeTƏi=-~;:o#'JP&_)Azࡧve<z+Q%AgkW]HlTVc_ F8{LuŌ)>vv R%~OBK ˦5Z3"UsH<}5K{dLR\c-ʹo=EtCCM|\t@8ʼ{6'OU#KM>U^gFGiARu*ņ tMɂ]F0:;HPc1ׯSo?V.z5cnVwww|^% cֆ++3ŌC|rNJyRWƃ4ZY,idn̑B@\9XfAߤ䦱?&# >H(J4Ph]݌7yH?@e.68ё̌:3V&V_U5| oĕbSPT$i)׃u-B(Ә 2 /jbԑ\3DOJ3=1 wDB 5 Sf-TS(ս=Fۋu\CP_h蚿?abZTTjjj_[[R75~S5\㚍}5Q f4m휀Ѻ@G1E}F[aU5.Fh]S'6^zf eGk?N]o$yHCCk힬ʪ( c+NQؼB ImNKwi }777俽k8z Ņ8hi+5Cccft_&3Y(dcrm;Ju^儩6_> cYogv2>G/t?"~]\i|{Kk5L9c /9D 8?3,*vGo/7QMr nTyf'(^z-Fޠ992}GΎ!G>ygx?GK zR)mOwLtNTRS6Z_POe0=u#LsKm&%_U_9IŔ;DkSKUo!4,4 9߻6$dmI{y9P-ׄ&T]`h?ź;~5DDE399nrr\V! [lGFFr>as}ܺ|So|B<_<՗/MՕvhOcé['s)wn^F:LLk߻ }5ç\M |,W͖!|trVӉtȯaFqdi?"~z4BGvav)z|7Rџ\:tffyM2WSU{]LJl`ݐ|$2ޤSA|{tؒ'ʼnD$!bRͷyK"āDaگ+NטӛW}$97`7.N9 RFoo {F>$=MߕliU8Bol-ɱ,afkȀkii۳2s1NþG/PY[>9/[+m]\(tB̊':hz[.ރ%]b6w);|Alk88 9: vLYl_J*Ct ߦ~gDevtVL%2D7ڹڡ w/ dKM9-r'B2RDQ3$HGv m%klBU5 ڕuLR7mVSEC5qAhFlx PhWuĬs{fF<׵bDDMTZ4LI!mz} KL> 9=ͲRoӫ?DT&;9ds nXjb^@ؙ@SQRVP+)H" d>&>?Zu{is/**TIruC,Qv3 ײx{*eױ aIPɁDR9Cd<əXMEMɸ3]QSju r H]qlq^InyPPs+e/T3mfilWK; iV\)(AO͖ccAatH+٥?5OBlq(@!R7yb%{|5r1wjvxwfv](*͐+eOd"q}DqJܤHE"_HW!Nq%!ݖ!PY)?)=BD ;<,EE5$׽q& e拓odM%y8bIcm¹q~W ~Ϳ5"Fz+#$-} "jiH4kzP3r=HKkyna 2+h0S21+0397BGS)hQ`2T&T#?ڬ fɅNU`fliUO@ Ƀ*wlv64`~}!yN9u1u+ᐰ=%&(*2O:`1s+Z!م?#s6B°^)ޱE\El@oCѿMNYB| WdәbDn1|{fkE1 DY= d밇i*A'mxqTR\L=] We[ 9Pu~YّpPۼ֋JJ'''Ż8.UUC1r\ˉ?[lTmoj5_N٘nǟ8ۭuM0o)@/ew_4{KhR! ۃ\GLmS\]M_|ݽ]< h(n,+VVV/2އnxetܘBۂj`D&KDGs6˾sڎe' 嬼pAmPz$h-G6L&hNuga,Bg&c1΍@t_wpمc{i{&uqUU%9X6KuIJ¨ahh} \wm!ߙ pX!w`AYDRRĤmvN^~  Y93{vږN?PNpW4R{y Ag@M.xS|۞l r5:CA=)|B|+fD.;h%-&%_D(@j(};LLWB=߈7 1 xuAD_=cpDEkoى12\"?x8 ((tK}zy?==.+XXW[6YMi}s3rq;-bGCC1ZQY1&i5򣹺S̘U3eSӾ^ǛA.epQ3Z]N Vݿŀ=+BB<_H*6֛琔3_4sX5H2V8i>d_v/RBO$'NFyRt>L8224umMɭ3Mcр~5CiwB u@@]s54 \ Z[SYU8'A$v)om6auNA=kpQ0 OXx%ܝ<lٜr~ë*I8#5+KK}fVV] }@Σ\`{ij@fvy{ߤIIGTW FDAӳg Nb 7,Q~ws#w;JM(Uiz8hLS.EÃ?3+t|R_. #5ɼ$s{e{}Ў>bG[=΃!"'8vQ짮G16fcX8,lշ4.nn9[% }nv>=NDL9(7,E38@etXo3p] hZ+rBA!F?KmGh٭o%Z0u}{dt](FMGGB) ڰX6W?SS=/ iͺ[=CLf9Խ$~x 5mL~h4XJ8444׫^˲Е_3Ed<*M-"KLybrD<h*% E쮷+8%_i3Y,دiS(R{xpZC?_) I}BEbw[[WGlzC>O}[wi>'OE*Hp[ ;˥x=aE] =sxe<HF$_ʽ-#Nd;,SޛB~LsSwkaa?b҉"/e"ݏN0@~Xtm6w T!1](齒_J*+wOMmώl'%'&_mXċdJW: h PK5w{PKF,Cmeta.xmln0} v C6UETT.k!,ߊK<+FFֺڃ/a9j4zQڅx୺chV3ûc_Tǜ`Uz-ƠIyij{ε ¾FVyJr6#%T:# vhv[ Tz#p^JZg) s pewe1VqЛUI!!N33J x+`Cbr% CihB!T?P^;|Ⱦ>{cA:Ѩ>\)[}a\3#htϧ, 6֚_J8S1cq)v )=%#zL'NrFM휯߹ZQ0W X_xY4ǡƢYm7dy`Ly+_dz.$k.Fi:?\;յ\lI`Y7z_PKiPKF,C settings.xmlZ]s:}"4$0  !훰HrW2)S&ؕV{Ysi*DqU?y' | B1Oާ?78>4>U5=Nu[/L!X 5>ݰ++[ouܨTJ^W>Y8?U[Wȼ.:;?;XIN6|sv͛i!29\6Ke%kԼ~=ߒ&{;zӝPhY>_n*f7݇β}VSE݋z1_!/2]תA@IsP;Z&GO%.<`WG?X|V*;;Tr}\{R^$yVq2_<1p5]Ir,=ree?@x<4@+5y[qhϦ6TA^<0h3Z,w̱N"%lJE(bwԚ(wqhSğ(h*]&}.ڴDC&ـDڝdKw4-G{L /qa)]jNCG/;臟̂Z We8H*祓Ga0-M_2%,t)Z*db ^;/]z.915mK}Nl~0bXG脂hܯ4J.ȍpy+mKKkIW#T/${T\tF;idWb48VJlF ,cSeLfW J;+-xXN<1 HSfN%NA bHvuMr4]lgolZBp{~N~B`hTNwMFPa$Uc;LOv͙}/M%tC)"S-sL3-Q?;^Zen$Ag`t4""eg5FRa0/8. X5uiF囧.-4&Y'r"Ċ$<|?ү\M.[*^sPx3pAP;P{ܟB#|:/&Aɻˏ -N-nh ھ)/aNf[1&_)1Ҷ%6gn Wq?ᮦAC9]/ZG@Դl%>%|"aчԳ֤ɧgXa||}k=bi_> /{zx|NO+ߡwͦ!\ѽ ZE{ ńIcV]axB zs8{Yمo=\ZEo)RM}{YMvwybP@)Zo'~yoO>yr1ŽE>8#(#!-hr|s0߿ޓ)#b:8Ø0 Ű݇ grǫѭwl{+҇w`?4noU7%9/c}h\@.N@uI|/Y}E )k'Z^-6H|x:bCIf7nian?3@[/%pUa?a>[Sr6#S'xL?+˓k@i1D-ݶ%Tȿ܄g#>r|R ѕ=/mKy ?灄R>yϟ9}Taސ;(?^`/&@@yΆ}.z9};rۖsdw0쐔bT젲z`mVS{fQĚn}awG;}b7[r$l fwS,p Jf% 5|ږ/O>c2k9k n-q|~%cTZM9@=~^y~RX^{ά]>nOtEYen POUq_ ݻr~ߧ+|sϱrZ3@Tp*X|,tc/nVy2_m7Z `v9W8̽:[oAІ~~gPS@݁ϰ@Ԃ9O|x\8ΦZP9pfO5iLO8g4}8PWaH_;!M]h6JB*qM@$sĚ~Gh<)lpuiX돩#ЙC!0X h4{O˷6sI[v!Fr0K `/;&_.΢bp rEfǝ""U/ہ"GKov 7ZAe;oZAe;o蛭 D[EZP4t7Ccςv1&5Q$Fy& IA;UT v8%Y o4d%th:l~JЯFo<ԄP~^NFQ8^ѵb¨-GCEmJc4VR({NHKp(Kp(Kp( Kp(JKp(|\<$3V6H Ɍ 9=ԾxΠ $1B2A4/8G@ D# cf^Zu[+a'Sy}^?lvlSg=9f =f#dLm0x U&rx6pL͑kmj :D=&?\x'3@%n;,qw \3~6a`[jؖ[,_@X^[{[K܄wϜW/ ĝ2馾~ 1xD3p#B#e 4=({Phd'OكGFɴ?'HfLZjK.{Cl`҇7M_ÕKkJss v2ăOXzn/@R;aR` @=U' {?zfƿ=NXco-e1tT?y6wM ,$ ^!{. ̨\<|+vИGRVԘkRFhi su,C: >۸(Zc0 Ъ1Dc,_hPM}L3 M<33kC+Ff={ϜxbV곃dfȉі_~`^98 Dcu$qX%YJJ&32I\U23ՉUgXZ%9*o 'B*(lM׌ D|Zc{^s[Cm@C(dbx "h"n"hvۙ.;X[XݮZLm ȳv O!] |.5>Rz6Y>g֭9F3 7x&m8XLJ MkB<+|5Lc8ّa$~'oG&wBHk&wd)rm6e N-׀, 2pKwwp5,^(h&.q\]5,+s2I ̜F#8twh\6uR: 5tQK(]epC~ˍ|4 j^; j3 J6F[)xid6dJ>\}y^uT1$/M}RKvX=J WOo>K>_/aq9gwbٜoǶ˹ѿWu<{ MH8-?lGPCR=BhĚ%CN ]sG{PAPFk(kh]/$qR^UoZ〸Vh{n$y6ARMh3˟54\ $C0#MhliDuԓ1-3?Dp 5~r> dq ) C`-LsTꦚ#\qmkSUP)W+7S6Տ*yU?n;Úڞ~v3OJ`ǿX>p'#@7I,#Z"eq]VPAz֌ttwBy+ʆVR4x cyj M%Qtqs4hu`"H4jçj < sL4%Zt=a9T^W4CP-4.RTm{O]v˅&/tUCNoGtܟZC3qjh\cr87Doa$f945&DC$}N<,K2k32G:5tގ5tr;xk -[6M MSf%^g[CjH-#vJnd)]5.7SC{ZN׵Pk]KNdq:Qhh2QvDIըj}RCі n:IG"d?j藽 iL{|lO"5#!l(NqТ{;\TfZ !!VCj[Bjn$w/fe9!q .D N4Ru-XYg]=B%:T+Џ-rĚX*%ܝh EKrePsd[c/uo{ㅰ)Z&-AѪ{w>oiZ Kk=.ѩ2Z6P(i!ͪr-e`#y[ͪݍtTF:ZMQ4_jZUr)Lr_6pGj:Wg\ﲴ6uî^6`VeQ پpv U2"U/o󞼱L{r3x&D{6\;֔^Uwfpb ,)5ZKt:V)fx e6D-r5x~M%Pgx5l/ɬZ+q:`2tʵ IVCd X=VTx.׈'VT8Qae@jVTx.ׄ:;nBo3K &K,<6#%:\1^/=6#eڤ8 Ge㓷+L&)c"UFD6cEœltR oϸÜ9Oxͱl0RG=f2e WVe CפVfG6_ΞZ4y]j5Eٜǃmc]ĦȦ@nA6Y'9F`3ld{f(hJ曑f3e3@6D(n$D6d.ӷd:4-5M1G&>uxM hm6N.z6e$ȦI (up<W0'@klDLl l:fswqlΚdo), Y[ oS=wodk !"6M . }f$(wM `>m6sJ6bY(p(blfsd(0IPp*m6wIuzYL:\%`ld5U5Eu67I2fElNlr|nHM Ip4gBl:& 6;JT2nS< \ N":6;hS29rY}!7;&0jhdt)`,C-d9v -FnCW wd#@XINQ+$;O KobEe}qsB[Nv^}PTϾwWCFvT#wR'*md1g%gIKv,ˎ뫇bu)|Ua+dC: ,UZggȕv+}k9}P$&ͫn ͎X+ 7_!~ 1-Yb#UD6JRbFQTg4JFQ)=E}Eۘ2XfYC:;fL]ٙ`_ ^~+ FpcEC$L)5;HP2zUʡ9T3PmRfK |-QShS3ew[>[ϊG,Mpح sW~TBIaU5Y8XMP'.S,EUłdƊ&y}j_, 6E(ha^m*:!s"d@ v=ZcIii`g@Œ+k^UZ]U?bGDlUVp`{'KPbjBeUcUbbU``U|k'jktU*nU`v ejJK < CLU˭ MW9I=6BA Vgא [P VP'jy`st_pC< V5PF )ѯjłrۧ%yꁬb&i>dre=7w/h V5P* )P[ V|RpH5|mZ_H V}rl[Y ΆOVձAajT* NOV'@V|Rp:|WkYs>)8U>YU &XUp*XZCZ(XYӂ߿A9dO'}Ư_ComⅡ?+Vw(>`=4/r0 -3|䌲|@)2W7' +\*+7Nds8 k6re {ELI^Xwd-YvrYi0sQ`f̱` @YP{xmIfg1Ǚc/창 `VƐm9BƝͿ;߳;] :e =?it86'TIe[/v-wJ0e6V&~,;7J>g-V7xf@-' "ݵ<4§ mrg/U';vͮ{Z':zgqw-k3dq|\5վ~S)밓|ٽ3l?hof!КͰ^ OnV Xa@=IvgqY>eAK+@1,FG^8v5J wI<+qH;3^pb9=~6տ?bLJPg DkZǚe˱JNk7n?=`IO@[&*Ԟ6zƙlwF1gҚ)^ĚG(]`V-{l|a44ch_՘S%z1 EEF(_՘3 =cߢ"#1'c[TcP\/#1f-*2 ?[÷x$HU$.h]'[A+Zɖ.FZt11]lbdL#h+_%Fo16۽Kc8 VI/#{X4IX9x䀱CYyoYٕOFxAYyQoY=+/Ͳሄ0"(fW^eW afE/Yf5fW^LeWafF:Yn5%09 fI1c"}f73Wo2NԊpMVMh 7Zo4`Žo2b351'Nt]bY]bK8"fuGƮ.h%VĊbVXqD+[ǒXav.gV8"vu#bV82vuaV8*vubV8"vuֱ?]?]]㈘?]]h?]]㨘?]]㸸u,QXmnHKc]VF/-St=2Z:d4hexB#CF[c%{dA#8Nt1V2-]b-dK#h)cAKZɘ.FVKRE+8BWHqDa⨂]!$B TtG )*RQ+8HB U$$Z$Z$Z$Z$Z|$Zf$ZP$Z:$$(%uY:$*eIQ˒8C%qD!.K]/, jtYG$+R6KB$$Z$Z$Z$Z$Z|$Zf$ZP$Z:$$(%atY:$*eIQ˒8C%qD!.K]/, jtYG$+R6KbeI-eI4eI2|eI4PeI2$eI4eI2eI4eI2teI5HP6K]8 Zɘ.HJtA2 -]-eK$h%c A[r4Aa$ɖ.HJtAV 1]l-eL$h)[ A+ ʗ $ $989!sχ{CGh{lǜͺ2v [ Hw w\ %߾65Ѝ|~Pww"EY#Ik'z^0It#zD &ntDya$'z^/It#zD %>^?oI:OZ=7pٷ}moN}6|/^S:JN@^z;#1a)_b D!'{_OdAy064<9-9!m%'EU>$hp/^EPԥL 5ʅU804`8SA2K>}XL+p!pVGZ P8kp~oMڣX=ZxO~@xjr4O72pۡm9J@ղ%cD3+C`55 W~D[kXɔ5l*o07[ yǞV*Fk0`:S҉]~Uvӡd#&w͡0"&=aB̮?mXb%1k0\*'+1p>U4rRg1Ay*1=\ =?PȆ>|6e6I80'Ů7u<;9'ia`&k16rd=cO҆I /RMedU z&G7iېf/-OM]"rcǖK+76a˟'o76X*z!g 0 pi.'ʐU…"\[%IRc:'>眝r䝬S1PrCXDPG4Y[dSZ~ӕC硬31O$:05p|[PC;!Jk XQ#=%n*qb-|0ydϡ֏f$fm&ea1qS-GW)_{)ٻc( ,zًwHnXe&| Ɗ$ SlAʒ5Q{+:m&Qn(A1<-mhB ZNt@3K_p/EunR,nDu5[6J *q  AINa\\xNss^'ţY˥P sx9aL8^,^?\Q0 5 VSppJA!_-<lLR~;|.ǿ 'r50Jl~P R|}/X=b'+~eB Kc]q©`rM|NfT5 t<\yW7p@,7L**i~9 ۏYw@bT [;O͐bTn`SCt]? S` K }v<!E$$%WRdĊ6\;F'OtQmBa-I>2jHy@lzcp^س'sdjf_p<41ȋڽY| LN_~aֶ;uVԎLFXzusq}EK*b)?Esq)5͂BM gh=d=z<[eTqQk8:eBf*v,3Exnތ6m9Ïp=oOT2a^^s.e֫q+\N{ӾPxrE5x W;r*8 w*PL mWE(/H-H1I|C& }>%>ႚu!qT KӽTCߑ[BLxR 7opJQ`IYmoOGWB;HR`̀k8>xL11EU*Kk%:]jaBv_o&tvÚ$Z`i4|~IЍy]x" ni%:o"`u{beڌq^+׏R;%"͏T]6 FFfVk׍PE]]L82hd/'heȬ< mX𗁙 -8ڍخ|{r~'1M^t}n ,R*XCΥ@ :"}^{o`0-I?k1ZUPH1Vŷ5&Ļ,>aYVi0u]%эY5:"r NFc^at w\/ost$op<s_LfV{_IT.D/Ş,IBD| VB(bR/pUj]hWGL _ߔLTuMt1W!=55f9(*0 0Йp9zlل43)s`FN XkYṶn=4 Г`"pY)oUP[d%a*;9ED9wJ$XzYlS޹) $h:BяTQ~dQ 1sՁ 7HĀ2'r iU},L9V,mb6d!< !]%'Qez}}ϥGoYUI_V|GY ώ≑aSif>w(ް7x'-s \K'^sƆ94>zgYz{X3=L1h$(r˳jua M8WT#=H)^C("@F>!y crŐ9,qJѲ+igPH쫖IIQ|WsLh$.\gV3L=kzVX Yb!TCVE [)U2!=wg?r^ So[8(ZB ?G:3|P,\Ba;g[.1O?]w޴N ѬLOġږw;AIe7FQGQETtrLc$HLK$g,GQ6]v0]7"?#\/~wPd2Л5OGS9Z+?KRѲh/< P$ )d m}o>UBmL>.(΅E:-3;)9CtS{ϣ!Oc[YDC"Hv3 O-l4dfli5uFpp,° N4xcMWG:k#l6Z4oGݮŒt%"4%T<yGHpfX=q}SW07*22QCLqQLPjk+xz_x ϴ Pqik=lC}+z]#8 "X5C&g=յnUSFGbY;l rk60d2oUmf:[wIM֞.Daރ,ġwbo<ougQIpD5y 8:=Of9(wt_o)`ؕԣgSY-ܭw."k.7Ǎ7`O' rŃ@aG!&BL~D%)7>(5&@.+BwBr_ G7חQ&. .laѰǁC3֬G߾xw{MGcmPgGM+M\wNn籁E§i7Nܴok4HZzS )& t?–?]}-GP#z~s&kp5@ ,7Ox˲ 'Cczjh=H Y:+;Nnpl*V\1 1.ϝ16NE533\ Sd,#Eu d}KS9hH̷_1Vп&q_ٿۢ[˝{>ivD ^<ڳgL?S__oK&W w˓qonT-2b0ΎsiʊQ 5O1CFij;hi⳴H 3ǭb˝^(:r?*d}*-8b ~@aS /2 0ju. z'$6829Շ#mz#=*6{/=3 =+K|βfVw[T:>Y`\%rK\ {Hq:D™2!#u~8eŔ2;N%Ҝ`\7u"0}! Y1|PbF&;X/|oL{LTlscF 3ojg9,}[8owʡlE4LW!橀B-Qjo'w|;`k[m |̆-׍J<+wZbkT_L~EhP$|'֚$؊?dC!x>%u C-p<ϙXTq]ܢЮ r /h]U:W(dn|22L'3$tDfҁS%N1ϣҰ p=B眻J[6?ҊZL5㽍 LQ>1Tcxt!|Y& ǢsQ`Vw0X$B,My@i[0[D%qFQH<*b53P7{QOb@Ө+,u~17m$OyډoyT9Wa _ee-l$\na^0D%%"UXAߘ+nL/d,HTכ.:0\Zo{p{a;i)[zX'/&@\XwmI(yb))s#+cM rzP\qr,0hA"FSlS=5M6#RM ^?|9|Wrj/,9u$ r6q9.w<MS:"ɳ):E:MY9+I)a{hi@4M  `=ayG;\#)&>3J%/-鈃8l4tF  Ӧ0_X!k>zq{a+]p<򟇢x=~m֩i]7Cd477]t>,KcV<"Hm%wthO+MMDkooYg!2jӨ>t5ehuZ„ lQ]|k6juȍEpQ6:5Z-gg4y J_1eO„F]ރD" s%Yجa{ 'ojɛsg ~FD63ٯ`G԰T#H_`!tQnR_#3KTjH~YOoL `&ir\0pᖫ{˦8l- x<蛇&l^ܒAܮ}s=}sZkaU FZ}0" ZoLAm, ̺]`M$8zĄDcܔ%kE,Fō؃ܔ))j H]p!uStNYWQEa)Z/]oN;r2zѳ$V .TOׯ^WA@_ob|b=_EՉ!xD\5?uϰ˭e%{$RuMhPD0GMGdqDag6⒥KW`M/l+U.!@S: Vs :s;k4Ȋ:q27-G-Ʈo#K{xo6-v#SEr w1}S>RiBo+clz]^ Q%>|o`(9b'li~ Nf] ZBNl1 +뵛_lo!owEy  k1VNN[የmt*Q^L"f4 nd"ex!.Eh)^enq+1IbyJ߉qNbm2 ;_|#i?,zW%!&:`Z~"e,K˚P`ל[:[=gUⅹeطS%;)os5AtEg<|%4+4y ,Ev׿yX; Tqi69z?P5v鏛̮d?r]`)6$U*2@xa@Rto[>3/n/g~hrK4.=Ivx|c3NI!\TPHA#8׻+MI3\( :RЃK&QH.B#mFl X\P_yoS.!U!)uC:YϔP~K2v-u`̘dQh>r<,E"iuƆ &qf\yNN ,{J\e4+"8}YSKd/V6TtuOȝȨ-E}*=wmZnfAO SĩʜR@e9ܜ5`6Mi0֌=ÖQ1 lߏ)&r)@0]wʎwqy~s^4r$K E2UMPh8ޜ=o QS7oX{Xyd<$_mWx>Bma*B22lfsM{a,>T?£9++Ҫ5i Op=h(Ө%iT eYIonfo^H|?A;jB@ ͙<0=hg8HB4AR0_!yKzG*arO,d_ [qi +_!0yjO[ޭhJʧ.y1;l-`D)!ŋYno[ Nud^4-8fd--5U3H43je*+}GfID`m~lZ"*c$0Zgڥ}}WnzhKP3Q7a\@ މJ&~j` _ygﭩr}ϵo8I@pL":+<jwPe$ ,y޽cmI ekN)nj]&JKZ&v[w^3 Y+%lirЄff{[[3cOhcE,&] 2ߪR:av4k3| !;.tka]BdrK1#d%Ū-IZ \^so !7SdmxgNQXM7 ÏQMugc UW.a]Uh=1d0r2܆5Xk^y,)>Bp&|>~^?},`Q eٞlxB< 7A;RHQ75̶ǘ.i:T>4k̄cX#}` c?04}4ʵbGh(Ogi"gN]jTdgzsxXG]uXE}t4֡j~{:M74'͞X`! 4ߑ0(GAYXv,NfdxS`{lTBvk75Zp2%pQ"qvVjSS (tB}uk nj5:;ch\JƲ>;ש>Ir+놈InIN-2%D߹ʝ::+X `d* AzOI{NI4D ucb;@(Ԗm_{8#0A($@'Zz?}uZڎv`lhaj9UGzb$*.R$54trє5;)qi! 8~mFU{~<5UɄswg+vA0ԈwGdMÊݒ9`f:eSp*" pfNx>樸$sw_A]/a=c=/|T5n fb;u8l<{qa?.Y zy@?^ W>`UGıt65F?q3k{q"x4ޫpegĊ@&H4M%djTΆDƊ7.b}6S'>eZNYr`OEhRT`/cT7E` ; CIFSEc 7HƯK#blD%爈+Q-fb#=y⫚[dXgǛ?)_h 9-B!^"a,fqߒ'D`DZF, ŀWFKRj-t X z*(C(2#uy[S]ַbPcwD:lSF"J$IO^ʝfBumbV3Xw)6k1c4t A vMDcD.+)ٹ˟>oZtVB yVE 82"A:=O/-Oa~+:Ŝw 6imMy>vy1SV1KXTg +gҞ9f^/rVq@nWD@ hat.ЁB\9 eHۢY3O{xvC,6p/  xvQݳ6 *lTTr*i3gETF?e6ai*hV!]YOiPVW|呦xS,%+Mune)דakF}v}Vi m?ҿ>-ݚmg][EUE{8σIFi_(8b[LUyfTVc&s!6Ϗ+ΗC 㕏AOKY`[ZP^Fa(N3=%2j СJX}]=}P_An*1<m &BvR^?_CmئRRW/h,zGx.g-GH^L,x,XZla>~f;,ZDkHZ@᮱}jbpH#h©5{gM9 +YZ`R~`k B`[3Τ:]j_#, 4 MM$>ZD sDuK~Q5F_I{9 _Yo+L$ׂ<6 `b|Rք)uQRgEiJ\uL2 [&y|B&^%ǡ5Xk0x/=з;yyxV.k`l4g6s9cg^}ePt9XfD#R~%KV˵O K_ļTO+i]jE471ZG3BuLMxZg~OxϔN,>NP$8T.U b#}X'?_r)mN6gAA-<3ѬU]8*ԁ9VTn\*wo_׺/IH S>{Tl k R˫ש pC:9FSnmqsr02QGD,OlFE6 ,oC[MH)0JiÂ^[xVKZ+^{FY*c9ftʀvlwߡ{m h*S):=$Z'^GBt˪#*{a9V 7zˎ `B Z6h6,e ioBZ|~j/a WœZֶJk''PC- - Kf fFˠcJ3RXt^E{l8nN,p f>qybҏ4 JxTYmT/ eh% sPqH@1rO⬞F,|=]o۔2bFj(keN-)Yg|eLeeò$n4q[){<Q"2A5kl])+EKuD}yXKXUO9 Dsxp._?>>bp$y|h,A`w>>N{=XY5]fKDJ92 i>X3=/BK"B=C[X(nrCa{eX|A>ouCt"xtd׍_֘k,ʣƌg6 s63cfs/h]fi4[Cb\XN5z՝; WdG}uP G Bx枭 n{Q\6 ix& /fRƻC6ٷưL1jP\JɒY01e=CD>`o] LNԱG]ndT^ͶiBU-N )C}X1<Nbvod&5!׾"VDv [h4ځ+CmACܴuS0|jL}[xO[.  ? 8gɗ Jl6Qq4xNItQQn@\A,"M4_wkV`  eAEӟvtapרtJG~gD5vԃ왢[R!FNH; 3cWʵ_Z놧z8mJm[ŭv XRs7)Í#/µ`fOa\>e!=dcB"hug*=ٻƆoj7 [ȷ Y>Qk%\}ϩo[`opwND9RqB0a 60`N3 =PQߤ^hYG='ēMQi.Pp]u)IO8Qyzc9A%%e0]|x#;;FG(JnW2D!\zu^=M"&ehkniXb{|-QSj$bk `3wQxs|wZ(UYe'ŸLjJ  W2DR+Pbi(p(dsE׭P##(~vc¬ESlI׿/R˪ .qBK"}1gxnܔku6$i{gi|D{C߹m$w\_"! c`dlzn#z/ʬ;@Tr{cvFH2+I$XFKy.џG1.0%}FM8WϹK.5mT;S%"#[P~Ɗv=*[97f%.ܳ;ߡH3iWG.PgGFR)v1)&R#:Xy(Vk,d!eX{I,t(SuQ; >FX8{ؖѢ/bDžfK bx-pPT[Ƌ& @kOh {L`M+H43>IbJ , K7*d9#HnYϛ"=H jtJ6>G<@aߋkQ`V6U  +aCEAu $y3ON~[in/u[1M5@xgqce8AS=gPS_x?΋3N<)ٓ[Z|'qw[2cM@8{4SDiDӇFWf'jFZlxSLSĮ@24ae#|nrSkS(6+g *Pt v'|т%J {}oFb(.c%eK]U9n}+ؒ \cNʍML=$B؟ i,'aG5YISs` oLW@%YL@ƒ8{.<r{&n,1 Ӓφi-MIeSE  p:zT9aWM 4)_aĎE&MPö'9]&*⣕Nَ#pu*G䏾+SΜHn3Y+6ps -{𷦏`Vet,1-nGY[0{XػGߘ9i)d؝N"cI1i{v\i+d<: Th0d,ߕL:dN 88Bkcp{Tԣ|h-igI19۬jWNQ@RfIەvFE^aaePy)~G@TT]LH5n"raHp:Q]ʉ1ф1}&Nd߽i!=y@퉓:zOk? NKӉF1[ ~sd(=SLh6 xV7TɌx)uz|?Je*nΑ_YZ  h AtqwH#T'^N~[$ q cȉ˔ $QDM~|Sꨒ`n\:m90[r<\msO˛L2nQ.}un͌;$<fX-a]q" /9D*;+\ں$"0m<ٛ\pD\|>%_oE,> LJSĜ~8N]h&ԹC Kyyg[ D(!BNQP UjVѠO;-F0+6jJV,@xOyM~Qz81zeX)Mj68 oUҕ0Ƥ?28s6E OIIY'F'q Hg Hu:ab~mu[n'È/~Xd7`̆o1[%q֪x7Q.y''Kk"?;TM'gq5ـS@]t<ea˙Ʉt[ yo*|qHj$sJS _h(}9r%-7ۓ@mii uõ-)[P1*+`L'M$ Lxcv2ݽHJ q~J[6~|ϰ$ 6 kRzMˍxɲ-LٯSHa)wAL3Wq,.5drie+xUbFH*1we:APZxEfS]Gb X\aHl=ۨ1iq<2:iCa=$|&p !9`܊1XNSjRiys2m Sro20=#!6G씤duݐƓue3ɸt`gr$H%Ia}[% >$B+RG" pe4e9mH]݋r{P1җHk#YiQXh+BQ:ɓdL*MCΤ_ rm;N= X1VOoLȁovr(8ȼ?PhMfu7F&{[(WDh0a6$QO`;`܂ŋx_(҂/`l }m:fH:B?0.*f[J`G=?4CN ҨJY^]&+v]9 Y* ,d/ؚC&Ȉp{-BeCꢏay HIP!Nn9;O߬T iA)&ȸLOb 5%ıߓKQ2SJFoCrAUGʊ66m1z˯GTʫӚq1-Y_#we..0@ WVLYcdUn*|oa/Qtz4٥*2-fmLa%@@)nX KV$'Az88P+f\Dh<#mcY!s۲('SkĊV$_Z$Ĭ>3 {5B4~#d ˛2WcE`Dm(ɖGS磬+/RM())Q#)a$ѡ`S9^Zi57I+#+)?GjnmށIJ.~5v`cWhƭEj~fkuWl èk2-lf>=3뿒m!eY3uJcj=gˆU MNkKMzG+urqvE/dV :x5U/!)Paer*Mũp9\mt.ؠ]4_T WLCUuT$7VJ`C=32 P&j/˜}V R[`[`fPvWڏuhY V5WV{o'ܣ~MC:,* gY⛟7 aNpmoyC3M&\һv޵ɯ5Hb@  Yo=RAfvo7myd^uVpj]V5!/@8v Mz mWnFͳ`ې:HAPNxGc_|}I gSQ+*B*g981q+*2?$ϭ&(I CmҸ~ud*Q;}\>nf$tޓ׏8MS!G`9f Vl̼5 uM^ umՍ{iUZaQԃ$-i vGqܠ)V@o>HIRmY96*u},SPeٽç6>T뺊*S$xQogT`+`TV  Oמ¿9V(ۜmꓐ$ʠ5%pz NawL{k/M hZ3̴e`žc ;zu| peڋvG[%,!@"r{v0m:; @iju-oN_/,`}ƎbC*v(vtm7 31sv@rokYz/VA`DAᆐ3;u&d^beYe Css {1;9*B[([ua%K@~W6_LrzH 듹.Vpu7[ h!Q_'G}I@+A<\ǔeA-O[^ i+ۂCoEO{jwVЍM9jKχapu>k®vǍc7~#th"]fZ-5c-fjyasq\rܼo$N@y%;P q"1,af b"jᬢX{ӇڝL v=\=рѻKogOb > "hvC<f|am&.`ckE}Q7H:xLY9yE`rra d#@^GJ#-QHw_l*0h&gַg?[ 4 |s-oч)gJ طNLuc wKsn/&?C#qD_~J =Cb ag<<0eS0L*4㚂q2݀j+o>Ä(Ǿz`XT~j85)M)IuGb|ni١QԲlnyj>*Rfz.co,O#Sw?Ǫ'u6YAR[1dϑ:DmҠ$mzU7 (x G&N+4PӂﴓdMY q2i$xOoi[OSU09|&D-=BZ}(S]>+.7N4 Nԃp)XVB r 2-4O2 ݚegNejjMP,g,gzYN6blAU#Ee+#rDq<1@R/kuSTRvss>|4VDK2`֠\FG!<ǎT07ԁx;mˋ ]?8Ź0~I5TBmh~M&Y/r(`뼁;&`.&շh:j;w:@/ZYx?46(L8ehrjxry&a1(Wl:ҷ[WhSZu'P [B4 LXl:`-VjZOl̪qI+uc5ݎ(O|S&Y IWmY+sC9}/6(1QllmSaXz>ֲ$__u/xXcI(3Ntd貭M:)x,9Ammɩ6&+pncJ󛒰@[m}q43=?˵kϡkM-XMy+aZ)̏o@mc%ȼqa]wT&G8"bu1v']Jq= Z#*>En|; p֦۫Kh0Z|+Mʸ?q H(dt9[Q]_xA|Ӆ[\zvՕ=QC? W܄|ጡ<o:ަ?Jޱ7YvthHSt/Yj/bN16qͻde[gF] YH,H Mr]n)= -./=E'RÃPh-젡)-(s;^`LUaMɓs@;JXn+ D}$3`'s M;V˿ /JOE' /xo{7U7U'DGޱƣQ:7[Oi<>6h3hV>sM]UFuç%{Ô^; @w!dAl~nODtĸ7}mszW$lWQJ͝(LMtǥ(d<#GI# MG80/jU)WqVu>m7M4}`wGZccЉ$h?zgPs 0C0^ ) Z.tȩy2W@Idؙ j#7Mv>x;o}E$qf~I(ni~.=beR|ycUO=d~ezvTY}nm5DN0/]XΊIX̧Nw O R=_!Zwa7ʼn Bxw2}L?$!u0g3mxv\KE߼=V|*$i=t?6jw,2{A []\$z eBFl03}fp<AY ]QuJeG`EB)^BUI]܁Z>uQ^۵ݳzs8ȞyUWzUFqxb8V(L"ۃ5~]snMp64d5?y~UۛWJ'2d'sa`a_Lmvn;f88lk֧-Wp:ضhmξd->|>}8āQ(!3o!Jh#^Șlwq>zɟSre2 bvΧ7Źب_!z(3i$q$9إ?yn3*wDTÅw9* \0[[#&-)3@<$Wx| < e1N#8Ͽ#3M4ik1*o A17 uz͡^52FJ  Q(iJx4n LҬ_m{-#%|F͜[!:a޷ 2+W0)d"{(?#:9}A樘ppsosɹ7{˸?޼~cr c7ez︌ycGLVak6Kn,Bv~i-07_V{x-o-3zCqYO+,*5LwW{{18f ə1fAE}:ȥ50Œ%aXei-l6x/^ WyV~܅YkwawU\>f vyK%8oA N0$Qxخ(vTzn{=Ɠq ,2'U>DZ-1ZMy-Ȭ#Aw׭UYpvé~HAF-UV2~R Nabڷ٧_'uMzI*j @U"q#;.R' l<1 nI CŸz-_HӸ,Snŋ7NҞP21l0Sc4Gz(YjjRb\%ɹ6E^ـgscgd/A~Tn=A@ABA;2Uq *vmyJ^C HfF89ڕ|R}$)c9tA)Áxd$OCF鞡X*B氾 @ўz  >? S;9j~w0 CA؁zGa`g3c0ǃtZ?'cUF+*~5dSD)Gh4aжAǏ9iLx6C4t0 Xin'b;A]A~l?l4+T26:sC91胹ʾf %CZٲ3z(g : 7X&m!fvSZ46LdÿzFm3Y26nN([JncJSbU-,ТN.-ǻ+٩]ۑ>4)AIR2 9Bo[ &;ЮNxK+Bb0~"ba6jJGfB9V|Vl&/{n*mѺ<ɇ)ivm\ZLêXҹMvS*>!\aڜ8},ӳ* dmEGGEww$0~[$89=gFo _7 'F)0 | 4R`J\[ ОbG*)h4.OtM=g>A6ø*Z,pV6uw-NC ky)(F+SUOr?>! R O@IW@`<oOR$ȁy!LONJ?.ɘ ɀ]~ԯ{\@'U4k\0`ܓD& rƶ&^xH.EC0[C7Иzڹh8o{,KLylKEQ@IQ@LX ȨS,rCECr}=Hˇ p..DW%LD䉝̝X1,9r%Tyz;5,͹׿ha_3祵wqGn,'h2 Lq#4K^qcD1Sn;_N1<YO{g%fh~DqTn(Ԫ~Z'O2g2ae^v}cݐZ7ܲLoEQL%zl5ޅ;C.%zql4;%9ϠJ%ۂ <7Ԡ:A6d3i[)'qq긭dGDtA]7K;s4{~+p/l2\|7[AQ o6hdD639b-U2N!@<#q?//DQ,̘n$w_֭dc5 y+D 3r<|lZ 1.Ғ0P+soV uf]B3O"Ͽ܌i.h= )ReaKyǜsk8>}\GljZo\%"jwZhs?9[T1=̨Y>2} ne YJJH v%%7Ԑj`}Z v7r`=erp'F~# gKZ8 > 4]P\앰ܮ4mv`x TSuf@Ŝ"9E]A޹\]_`M3ԠKJ ..&_lh DsIޞvKnr,Th0:d_va\hZUH1LdG-XZ ˜oG^?2Z! QkrR{¥l< ?7+=#R1^4 @,0eae |C3 Pq;ɚ3ӊ=BKQ:0}K:MZ;#̿,T H|Kb7]!OUJ_U 2af;eŎ"KBv%S}ziL5ʋksGUUƆ"5V1[%owot92@M!: u;Sc۩/ap&FJSjB(S$CVsI=.-K3.E=XI=lR\Zw_]qe94||-"#N{}K%h/E orDX D贉 98%9dܐI%h2}{iwV0֎֐ 9gBLpqDv,DfjZ[hvD;?[O])HhF Eé,t$6@:Ѯ)yshl3 ͆t:1/0/58fT .'* T̓*8]CS)< ~sP]WW0:= eVlMK ;X9=TZNa%'L&"G{a߄6%A^16&qW]8g!g>$x؅G6vp(dɵ]6.ɵk /0 +bD :ryT(ơ"J饶A&2* q*c "f4]ĉHiZ'( ^iB4Ie4|3={ABkY Q̌qRtPF C~n b 6'F-NhNg@^rky9DEЭNtC$" e-\ۚ7'&AQ){yɒh1t͎(uƦ#곶ʂ3?@ &<1wfI3AܞG:T$QvJwAOԘ\zs-?w i_B!r']c^zLw,z%/KC9C 7A^20J _.7;[|1CHxue]S63EhƱTm`%'D3G0o+!8?;U`8C 1O[0Os~,< 0Sbu/sKv8zÊњ9 sKmKzxSWƩ+\Ld%[wLE͜Yݕi;:UsL>Mz9S?jƷD*+pM<U*EWFʳq$A}zt +JU WxU YTp>.5njCDƼ`",Ov{`wLd\-HXнD uA^Z*J _A̷`w Fʄ6{X GuٸJEg-q;ظ#[7nH6Z4lel:}٩s0m V?TYM}[41co%6:SŻZOl=\)ѮN?ʐ4\#T؋bQL}oyiPU(TIn"De?^:,)M:ܬIqCp\r=rR%|P 2z"JżG&e/Q{W|#Z<'XTմ#C= `卹yL8Ew-eFX=C?[`>7WTnDjtk ?%r s.JMp&"M (kBqx ѝ]F! fU-^pt0s[LfTi]ڢ^!L#LKs?pIpf2I&-!xf>7m5]0kE2=XR8TާA[XԄL[ -Ҩm-I?[S|X,-|>_4J&mfL)%hIEJ0u}8A *@'ɘd:kZ=KXtzP4K̖W;8f1/J:}QGpAR~Xu0ȐZeoR52:C"9F o8\xk%j5u`oS| )ޮVw7!5E,2lX!P?I {BEsVAyFiuGfE*wK$RC=N~TNC)z?wt:t W^!u0S: ; :p~BQ*x^ֽZ+mD½bߨK!f2i}Bĥ c4M_ˀ*={ԁ\9 s  ,2X_>Ř&`ݪ"41rƇqCoD0c.r(-a-]uڭeVZkњKe+HYbZcI"'H!94-[c1Qh ĐS"` IrvEroʼn+FP "12vr '+N06ZM@ƒ!Ȥ+VcY+Z?lC.luQB񿯹yq k{+~h4ͥ> R5p/쓱ґ3Z0ڏ]r<㧟b};7n&R3${pq3j{8Ͽ;W!fR3.-ͱvH'B,dwh~cs&,aXj7pcAtNJ"Çʄvų|PRB %t+Zr8\nzvX17@JEɛw܈Hs#gz =t㙋:wZԖ- 탪TSQH8`KgPHF{AE[v|Aڐ4SbV3 /R,\Gj'bH{Tv2(t+T)5ζL*)] ūNwRLHm-pkݵ9չ+ɛ 7]SR6zfڵ6%k#rvؑ+f,TQmIcrڥu >qm . (\"^J1–1)HO%d"T:#>Ir!)Y6I^,UaB$_;&4/j@[ 1}dB-'6M㑍nG~*Oi{Hw7/?MID ي{FدeP[ԕyn%w66=T&I-H[Jfzš0V(kC`~rUZVgwͻeג$/zußvN߽y]j5h4?DI\iGջ`y(+9z8(av^o8IݨAցJ7nh%n-'{.߾hbtl%aZtX-i ze[[}4bZo]N3oMh)~[3NMT֏q}vCb~p eh(tr [P)co-FXԄ7 ~RS\҄@>Of|`h8*=zKPou"t #2;¨tW.kB@,^{{/ЫK'EgܛfsP5rDt4koEGr]9Ǟ! k0Q=\:d9Zi =??E?~傒)Ұ/׶#( 3p, XkCoiAqM]ٿYH}]1[lwv{.˿Z0H& V Yy"Uz$hl4u|"FtjXܢ%pI"aqP9}{|$)BdC1뛐 w,^I'9"FK㘇ԋ3ب{'?o~GfV+\oyɟ2h_\^`,y~`O3aAspk7 | sev,s0ZJQ9?{~oecDOx50?i%䬆*>Ove$R%u`ZlQ TCv1Y^/nMACokaWMϙ^LFh~Rsn @$_ZR=I#%&ǗP-~:1n0Qrf/pH֖N*-ͱPcfyN>tb$A^[c$̯XnR_Zl._ȧvɐa(ɋ^7S@% EZٓP̥ƾLIv2 ܘ|PNAE]UJ%gk$[ַDic3uBʙsP?lNzmS$jQ\DӥWj zjէF/o>LD-oO@ Nqul%g3{Ͽ _xnfMo`A-"pEE?3 L:8/Xm bm$"L9G8$ aQcA@#UZ&c!;*^%{k\]ºeFԗGpʚ*iɃH# 3,m"71O^LH:GF2 uoyݎ^xwܗrJ7 u Kv`3i#/vZeȂ-lT* %216ޓ pt3~~i_3Oj58Oi`:!ڌsVf _y١.{ %+56-S {UPa;Kvs6 lSXߤ\$$7{-z6>P57'@zvY7xf_^:bz Q&;^?Վ7/?=:N>?;igUw{dk*goG0; e`2>]~NjڅNǹLt5)!%'opu]]<×<ۊj\JiU+C@/_7_C ?PKcqSPKF,Ct Thumbnails/thumbnail.pngPNG  IHDRzAIDATxyOgCv}H"'QNJ'I մI)J!irD? ũYJ([t"Xd>=y̨i~=>>y^ɕgIȕ0kQFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~0 a(QFa?~8)~aǎϟcIVꫯZhQzL>*S~[*_ K/er4G}駟nƆ ƹs^fMƼ}#F+W.͍馛J,YRMc[`Axɕ? /k}۷of\LÓҏ={\|ş93{ /04k֬sO6Xb)))W_}uywyկ_۶m&L(PgѹssoR袋|Mԩӻ۠A&Mp5N,}֭[9u]]vYLNZti.1I&#.f ;-r@…Uv*Ƙ ?{ڵk#E;C;*|ͬ N:{W 1c7x8_hOqcʕ'|a~^x b3gΜHK~YnOLLdh!Q_}ԨQ'7~x>;v0M,㭷 u2i?gΜO>r>,H 3/_eIL8ͪnҥK~%/y!C;B$ 8%KZjիQFi:GOz(~")J ,*sDmAib ̗_~i%zSΜ9Id.P]n~ǰ2ux `?t`T}dh$GIDB > K٣$1X[Q;nڴLqYgwH\s c;Ca]@@aW_n!RdD0{A1T/L<~8SGJ> M)}H4~ H|5xᇉR0ܲ7(qQ[oe`p X i>C (:/h{Z\N)`)zEw1,6~%,X"08p|{\oXjնmFSt#bSy!-GΙ3gRRYf۶mWZUNӧ*U*%%Yf @ǎQܛ1r[ɓqԁgw}r.[3f ߨQ#mҤI÷lقM69r]j׮[n7lp͚5eʔ9Y7ҭJ*D#:ժUcS`Ӂׯ d];\/Zu"˽v&S::2h̯Pqhed8J6{\N( -< (NpdJI 'Y2Tjָ[t wuԓPmbw.$s\UnǝɰQ@)e]Mg {ߊO 'ۊ-8tL<{&~$j*ƑgQ;(S6EuxșN@G)]ˊ:օ"~mMNa6 ҩ&^+xt~0it$ڏS4 v_硠+}g0z)nM>p:),$9I[p>6%I惵eY}pvz#Rn~\YG7{ʌ⌞$yt 7ZOݝTBb3s%爜xhE~$rp:j U3&grd95 RI{b oDMgTpPQo gMX%}@2!!l 1T~ar&Cy1HA#[Ao8%ZLvN训&O1!$Re-,YB-%Q {gNѶm 3$NY ` 4?ACDBy)ضƳ`]@?o!o?'$ٱ2oŖ\n݇Q)7 t G >[҃ LB>w~A~GŎr6 JX7 5=?$cgffF ,mX/,SUC~H8BR `=OXVVXE 1i=(NL}erh'c368ے?1cCIy|y!<!#TS}_1$Cn–'%$*#<@ß*tdc;GXʡ{yپdaҟ0z.Z! PGO1#~Ш8Ңzm߾&M)9Г$:CQ YiRH睺jC 6KUlLqƶJC-f؎-mego@_M\-{;x #l!b#43|-L ԳVIHU#AAeA>;6X9PTY4"OQ!;,H!jvEwF$yJ3QBM xCHzV11qse,Yށ8Q |:^Ibi-M{镵jy}mQ5{m%;MKGc;p?-֏^y/v=OQu:ΠWpjl {DnίihgM^oy\˨jIʨ9@;@!!JezefH- ͩ4E38s\y}> i^]9(գϙO숳Nu+4IմpEqlx*GZb\6tCZlRKW0ѐ 1L՟g_ƭ"R0n 9͆9R2T3NHV9\oSuTqKօċN\q?z (eh3Wګȹ G-^'OwNGz=IU-6D{/**3_gI;1W<6W-wbѮ9/jԫuv*}nKSGW:8dbPJRTO]y:%!S][Z-Z+RI22,W,Go,"gB+f̹js 0.+|ht p.WiglM-ei8篌Byʐ ^2NnZT<{'|el/\B*fsڶ^cJ0*H?I79`:׺~Φ͉@:]~Z7 RM^'U'~&0; p|  K t4^7fv!]lQC7JKBhJ黦4e~]^}cu)SVJo3(r5IxY\m$$+F>_\,$=Ӳ5F95˹H\:oGH6Eɱ/SQ@rAfFFI ?gm?f{?}|Cb-$)R X\F岥_* ' &Nt(@ &̒}Y/gڭtun"@4V9rg rе{JUb*=\ݥq::*b$o*Ә#{X $ޓC! 5Ĝ=fBZ4a, VAP3Qv3ۑ'-ْ-qpE1 * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include #include #include "misc.h" #include "asn1.h" /* includes */ #define ASN1_VERIFY(bs) if (bs->width!=8) { log_printf(LOG_ERROR,"ASN1 operation requires 8 bit-width bytestring"); return BYTESTRING_ERROR; } int FORCE_SINGLE_BYTE_LENGTH = 0; int asn1_force_single_byte_length_parsing(int enable) { int retval = FORCE_SINGLE_BYTE_LENGTH; FORCE_SINGLE_BYTE_LENGTH = enable; log_printf(LOG_INFO, "Setting ASN1 single byte length parsing to %s", enable?"true":"false"); return retval; } int asn1_skip_tlv(unsigned *pos, const bytestring_t *tlvlist) { unsigned tag; if (asn1_decode_tag(pos,tlvlist,&tag)!=BYTESTRING_OK) return BYTESTRING_ERROR; return asn1_skip_value(pos,tlvlist); } int asn1_decode_tag(unsigned *pos, const bytestring_t *tlv, unsigned *tag) { unsigned char element; unsigned room = bytestring_get_size(tlv); *tag = 0; ASN1_VERIFY(tlv); if (room<*pos+1) { log_printf(LOG_WARNING,"Error decoding tag in tlv"); return BYTESTRING_ERROR; } room -=*pos; bytestring_get_element(&element,tlv,(*pos)++); *tag=element; room--; if ((*tag&0x1F)!=0x1F) return BYTESTRING_OK; do { *tag<<=8; bytestring_get_element(&element,tlv,(*pos)++); *tag|=element; room--; } while (((*tag&0xFF)>0x80) && room>0); if (room==0 && (*tag&0xFF)>0x80) { log_printf(LOG_WARNING,"Tag length error in tlv"); return BYTESTRING_ERROR; } return BYTESTRING_OK; } int asn1_decode_length(unsigned *pos, const bytestring_t *lv, unsigned* len) { unsigned char element; unsigned room = bytestring_get_size(lv); unsigned i; *len=0; ASN1_VERIFY(lv); if (room<*pos+1) { log_printf(LOG_WARNING,"Missing tlv length"); return BYTESTRING_ERROR; } room -=*pos; bytestring_get_element(&element,lv,(*pos)++); if ((element&0x80)==0x80 && !FORCE_SINGLE_BYTE_LENGTH) { unsigned len_of_len=element&0x7F; if (room<=len_of_len || len_of_len>4) { log_printf(LOG_WARNING,"Length of length error in tlv"); return BYTESTRING_ERROR; } for (i=0;ibytestring_get_size(lv)) return BYTESTRING_ERROR; *pos+=len; return BYTESTRING_OK; } int asn1_decode_value(unsigned *pos, const bytestring_t *lv, bytestring_t *val) { unsigned len; bytestring_clear(val); if (asn1_decode_length(pos,lv,&len)!=BYTESTRING_OK) return BYTESTRING_ERROR; if (*pos+len>bytestring_get_size(lv)) { log_printf(LOG_ERROR,"Value length error in tlv at position %i: expected %i, have only %i",*pos,*pos+len,bytestring_get_size(lv)); *pos+=bytestring_get_size(lv); return BYTESTRING_ERROR; } /*** { log_printf(LOG_WARNING,"Value length error in tlv at position %i: expected %i, have only %i",*pos,*pos+len,bytestring_get_size(lv)); len = bytestring_get_size(lv)-*pos; log_printf(LOG_WARNING,"Attempting to shrink tlv length to %i, with unpredictable results",len); } ***/ bytestring_substr(val,*pos,len,lv); *pos+=len; return BYTESTRING_OK; } int asn1_decode_tlv(unsigned *pos, const bytestring_t *tlv, unsigned *tag, bytestring_t *val) { if (asn1_decode_tag(pos,tlv,tag)!=BYTESTRING_OK) return BYTESTRING_ERROR; if (asn1_decode_value(pos,tlv,val)!=BYTESTRING_OK) { log_printf(LOG_WARNING,"... after parsing tag `%X'",*tag); return BYTESTRING_ERROR; } return BYTESTRING_OK; } int asn1_encode_tag(unsigned tag, bytestring_t* bertag) { ASN1_VERIFY(bertag); bytestring_clear(bertag); if (tag>0xFFFFFF) bytestring_pushback(bertag,tag>>24); if (tag>0xFFFF) bytestring_pushback(bertag,(tag>>16)&0xFF); if (tag>0xFF) bytestring_pushback(bertag,(tag>>8)&0xFF); bytestring_pushback(bertag,tag&0xFF); return BYTESTRING_OK; } int asn1_encode_tlv(unsigned tag, const bytestring_t *val, bytestring_t *bertlv) { unsigned len = bytestring_get_size(val); if (asn1_encode_tag(tag,bertlv)!=BYTESTRING_OK) return BYTESTRING_ERROR; if (len>0xFFFFFF) { bytestring_pushback(bertlv,0x84); bytestring_pushback(bertlv,(len>>24)&0xFF); bytestring_pushback(bertlv,(len>>16)&0xFF); bytestring_pushback(bertlv,(len>>8)&0xFF); bytestring_pushback(bertlv,(len)&0xFF); } else if (len>0xFFFF) { bytestring_pushback(bertlv,0x83); bytestring_pushback(bertlv,(len>>16)&0xFF); bytestring_pushback(bertlv,(len>>8)&0xFF); bytestring_pushback(bertlv,(len)&0xFF); } else if (len>0xFF) { bytestring_pushback(bertlv,0x82); bytestring_pushback(bertlv,(len>>8)&0xFF); bytestring_pushback(bertlv,(len)&0xFF); } else if (len>0x80) { bytestring_pushback(bertlv,0x81); bytestring_pushback(bertlv,(len)&0xFF); } else bytestring_pushback(bertlv,len&0xFF); bytestring_append(bertlv,val); return BYTESTRING_OK; } /************************************************************/ const unsigned ANY_TAG = 0xFFFFFFFF; static int seek_index(unsigned *pos, unsigned max, const bytestring_t *data, unsigned t_index, unsigned tag) { unsigned cindex = 0; unsigned ctag=0; while (cindex<=t_index && *pos int main(int argc, char **argv) { const char *s = "6F 25 84 07 A0 00 00 00 03 10 10 A5 1A 50 0A 56 49 53 41 43 52 45 44 49 54 87 01 01 5F 2D 08 65 6E 7A 68 6A 61 6B 6F"; bytestring_t* t = bytestring_new_from_hex(s); unsigned tag,len; bytestring_t* value = bytestring_new(); unsigned pos=0; char *tmp; asn1_force_single_byte_length_parsing(1); tmp = bytestring_to_hex_string(t); fprintf(stderr,"%s\n",tmp); free(tmp); fprintf(stderr,"retcode=%i\n",asn1_decode_tag(&pos,t,&tag)); fprintf(stderr,"pos=%i\n",pos); fprintf(stderr,"tag=%x\n",tag); fprintf(stderr,"retcode=%i\n",asn1_decode_value(&pos,t,value)); fprintf(stderr,"pos=%i\n",pos); tmp = bytestring_to_hex_string(value); fprintf(stderr,"val=%s\n",tmp); free(tmp); bytestring_free(t); bytestring_free(value); } #endif cardpeek-0.8/lua_asn1.c0000644000175000017500000001100712201415744011726 00000000000000/********************************************************************** * * This file is part of Cardpeek, the smart card reader utility. * * Copyright 2009-2013 by Alain Pannetrat * * Cardpeek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cardpeek is distributed in the hope that 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 Cardpeek. If not, see . * */ #include #include "lua_asn1.h" #include "asn1.h" #include "lua_bytes.h" #include "misc.h" static int subr_asn1_split(lua_State* L) { const bytestring_t *tlv = luaL_check_bytestring(L,1); unsigned tag; bytestring_t *value = bytestring_new(8); bytestring_t *tail = bytestring_new(8); unsigned pos=0; if (asn1_decode_tlv(&pos,tlv,&tag,value)==BYTESTRING_OK) { lua_pushinteger(L,tag); lua_push_bytestring(L,value); if (pos