gpsmanshp_1.2.3/0000750000175000017500000000000012224332745011710 5ustar migmiggpsmanshp_1.2.3/Makefile8.4.40000644000175000017500000000306312224327702013750 0ustar migmig# Makefile for gpsmanshp.c; for use with Tcl8.4.4 only!!! # # A layer for writing GPS data to Shapefile format files # using shapelib from Tcl, as a Tcl package # # This program was developed for use with # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2003-2013 Miguel Filgueiras (migfilg@t-online.de) # # 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. # TCLVERSION = 8.4 INSTALLDIR = /usr/lib/tcl$(TCLVERSION) CFLAGS = -Wall -fPIC -c -I/usr/include/tcl$(TCLVERSION) LINKOPT = -lshp -ltcl$(TCLVERSION) gpsmanshp.so: gpsmanshp.o $(CC) -shared -o gpsmanshp.so $(LINKOPT) gpsmanshp.o gpsmanshp.o: gpsmanshp.c $(CC) $(CFLAGS) gpsmanshp.c pkgIndex.tcl: gpsmanshp.so echo "source package-8.3.tcl ; pkg_mkIndex -lazy -verbose . gpsmanshp.so" | tclsh$(TCLVERSION) chmod 644 gpsmanshp.so pkgIndex.tcl install: pkgIndex.tcl -mkdir $(INSTALLDIR) cp gpsmanshp.so pkgIndex.tcl $(INSTALLDIR) clean: rm -f gpsmanshp.o gpsmanshp.so pkgIndex.tcl gpsmanshp_1.2.3/util/0000750000175000017500000000000012224332745012665 5ustar migmiggpsmanshp_1.2.3/util/package-8.3.tcl0000640000175000017500000005014007753211206015272 0ustar migmig# package.tcl -- # # utility procs formerly in init.tcl which can be loaded on demand # for package management. # # RCS: @(#) $Id: package.tcl,v 1.14.2.2 2001/08/24 16:19:10 dgp Exp $ # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994-1998 Sun Microsystems, Inc. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Create the package namespace namespace eval ::pkg { } # pkg_compareExtension -- # # Used internally by pkg_mkIndex to compare the extension of a file to # a given extension. On Windows, it uses a case-insensitive comparison # because the file system can be file insensitive. # # Arguments: # fileName name of a file whose extension is compared # ext (optional) The extension to compare against; you must # provide the starting dot. # Defaults to [info sharedlibextension] # # Results: # Returns 1 if the extension matches, 0 otherwise proc pkg_compareExtension { fileName {ext {}} } { global tcl_platform if {![string length $ext]} {set ext [info sharedlibextension]} if {[string equal $tcl_platform(platform) "windows"]} { return [string equal -nocase [file extension $fileName] $ext] } else { # Some unices add trailing numbers after the .so, so # we could have something like '.so.1.2'. set root $fileName while {1} { set currExt [file extension $root] if {[string equal $currExt $ext]} { return 1 } # The current extension does not match; if it is not a numeric # value, quit, as we are only looking to ignore version number # extensions. Otherwise we might return 1 in this case: # pkg_compareExtension foo.so.bar .so # which should not match. if { ![string is integer -strict [string range $currExt 1 end]] } { return 0 } set root [file rootname $root] } } } # pkg_mkIndex -- # This procedure creates a package index in a given directory. The # package index consists of a "pkgIndex.tcl" file whose contents are # a Tcl script that sets up package information with "package require" # commands. The commands describe all of the packages defined by the # files given as arguments. # # Arguments: # -direct (optional) If this flag is present, the generated # code in pkgMkIndex.tcl will cause the package to be # loaded when "package require" is executed, rather # than lazily when the first reference to an exported # procedure in the package is made. # -verbose (optional) Verbose output; the name of each file that # was successfully rocessed is printed out. Additionally, # if processing of a file failed a message is printed. # -load pat (optional) Preload any packages whose names match # the pattern. Used to handle DLLs that depend on # other packages during their Init procedure. # dir - Name of the directory in which to create the index. # args - Any number of additional arguments, each giving # a glob pattern that matches the names of one or # more shared libraries or Tcl script files in # dir. proc pkg_mkIndex {args} { global errorCode errorInfo set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"}; set argCount [llength $args] if {$argCount < 1} { return -code error "wrong # args: should be\n$usage" } set more "" set direct 1 set doVerbose 0 set loadPat "" for {set idx 0} {$idx < $argCount} {incr idx} { set flag [lindex $args $idx] switch -glob -- $flag { -- { # done with the flags incr idx break } -verbose { set doVerbose 1 } -lazy { set direct 0 append more " -lazy" } -direct { append more " -direct" } -load { incr idx set loadPat [lindex $args $idx] append more " -load $loadPat" } -* { return -code error "unknown flag $flag: should be\n$usage" } default { # done with the flags break } } } set dir [lindex $args $idx] set patternList [lrange $args [expr {$idx + 1}] end] if {[llength $patternList] == 0} { set patternList [list "*.tcl" "*[info sharedlibextension]"] } set oldDir [pwd] cd $dir if {[catch {eval glob $patternList} fileList]} { global errorCode errorInfo cd $oldDir return -code error -errorcode $errorCode -errorinfo $errorInfo $fileList } foreach file $fileList { # For each file, figure out what commands and packages it provides. # To do this, create a child interpreter, load the file into the # interpreter, and get a list of the new commands and packages # that are defined. if {[string equal $file "pkgIndex.tcl"]} { continue } # Changed back to the original directory before initializing the # slave in case TCL_LIBRARY is a relative path (e.g. in the test # suite). cd $oldDir set c [interp create] # Load into the child any packages currently loaded in the parent # interpreter that match the -load pattern. if {[string length $loadPat]} { if {$doVerbose} { tclLog "currently loaded packages: '[info loaded]'" tclLog "trying to load all packages matching $loadPat" } if {![llength [info loaded]]} { tclLog "warning: no packages are currently loaded, nothing" tclLog "can possibly match '$loadPat'" } } foreach pkg [info loaded] { if {! [string match $loadPat [lindex $pkg 1]]} { continue } if {$doVerbose} { tclLog "package [lindex $pkg 1] matches '$loadPat'" } if {[catch { load [lindex $pkg 0] [lindex $pkg 1] $c } err]} { if {$doVerbose} { tclLog "warning: load [lindex $pkg 0] [lindex $pkg 1]\nfailed with: $err" } } elseif {$doVerbose} { tclLog "loaded [lindex $pkg 0] [lindex $pkg 1]" } if {[string equal [lindex $pkg 1] "Tk"]} { # Withdraw . if Tk was loaded, to avoid showing a window. $c eval [list wm withdraw .] } } cd $dir $c eval { # Stub out the package command so packages can # require other packages. rename package __package_orig proc package {what args} { switch -- $what { require { return ; # ignore transitive requires } default { eval __package_orig {$what} $args } } } proc tclPkgUnknown args {} package unknown tclPkgUnknown # Stub out the unknown command so package can call # into each other during their initialilzation. proc unknown {args} {} # Stub out the auto_import mechanism proc auto_import {args} {} # reserve the ::tcl namespace for support procs # and temporary variables. This might make it awkward # to generate a pkgIndex.tcl file for the ::tcl namespace. namespace eval ::tcl { variable file ;# Current file being processed variable direct ;# -direct flag value variable x ;# Loop variable variable debug ;# For debugging variable type ;# "load" or "source", for -direct variable namespaces ;# Existing namespaces (e.g., ::tcl) variable packages ;# Existing packages (e.g., Tcl) variable origCmds ;# Existing commands variable newCmds ;# Newly created commands variable newPkgs {} ;# Newly created packages } } $c eval [list set ::tcl::file $file] $c eval [list set ::tcl::direct $direct] # Download needed procedures into the slave because we've # just deleted the unknown procedure. This doesn't handle # procedures with default arguments. foreach p {pkg_compareExtension} { $c eval [list proc $p [info args $p] [info body $p]] } if {[catch { $c eval { set ::tcl::debug "loading or sourcing" # we need to track command defined by each package even in # the -direct case, because they are needed internally by # the "partial pkgIndex.tcl" step above. proc ::tcl::GetAllNamespaces {{root ::}} { set list $root foreach ns [namespace children $root] { eval lappend list [::tcl::GetAllNamespaces $ns] } return $list } # init the list of existing namespaces, packages, commands foreach ::tcl::x [::tcl::GetAllNamespaces] { set ::tcl::namespaces($::tcl::x) 1 } foreach ::tcl::x [package names] { set ::tcl::packages($::tcl::x) 1 } set ::tcl::origCmds [info commands] # Try to load the file if it has the shared library # extension, otherwise source it. It's important not to # try to load files that aren't shared libraries, because # on some systems (like SunOS) the loader will abort the # whole application when it gets an error. if {[pkg_compareExtension $::tcl::file [info sharedlibextension]]} { # The "file join ." command below is necessary. # Without it, if the file name has no \'s and we're # on UNIX, the load command will invoke the # LD_LIBRARY_PATH search mechanism, which could cause # the wrong file to be used. set ::tcl::debug loading load [file join . $::tcl::file] set ::tcl::type load } else { set ::tcl::debug sourcing source $::tcl::file set ::tcl::type source } # As a performance optimization, if we are creating # direct load packages, don't bother figuring out the # set of commands created by the new packages. We # only need that list for setting up the autoloading # used in the non-direct case. if { !$::tcl::direct } { # See what new namespaces appeared, and import commands # from them. Only exported commands go into the index. foreach ::tcl::x [::tcl::GetAllNamespaces] { if {! [info exists ::tcl::namespaces($::tcl::x)]} { namespace import -force ${::tcl::x}::* } # Figure out what commands appeared foreach ::tcl::x [info commands] { set ::tcl::newCmds($::tcl::x) 1 } foreach ::tcl::x $::tcl::origCmds { catch {unset ::tcl::newCmds($::tcl::x)} } foreach ::tcl::x [array names ::tcl::newCmds] { # determine which namespace a command comes from set ::tcl::abs [namespace origin $::tcl::x] # special case so that global names have no leading # ::, this is required by the unknown command set ::tcl::abs \ [lindex [auto_qualify $::tcl::abs ::] 0] if {[string compare $::tcl::x $::tcl::abs]} { # Name changed during qualification set ::tcl::newCmds($::tcl::abs) 1 unset ::tcl::newCmds($::tcl::x) } } } } # Look through the packages that appeared, and if there is # a version provided, then record it foreach ::tcl::x [package names] { if {[string compare [package provide $::tcl::x] ""] \ && ![info exists ::tcl::packages($::tcl::x)]} { lappend ::tcl::newPkgs \ [list $::tcl::x [package provide $::tcl::x]] } } } } msg] == 1} { set what [$c eval set ::tcl::debug] if {$doVerbose} { tclLog "warning: error while $what $file: $msg" } } else { set what [$c eval set ::tcl::debug] if {$doVerbose} { tclLog "successful $what of $file" } set type [$c eval set ::tcl::type] set cmds [lsort [$c eval array names ::tcl::newCmds]] set pkgs [$c eval set ::tcl::newPkgs] if {$doVerbose} { tclLog "commands provided were $cmds" tclLog "packages provided were $pkgs" } if {[llength $pkgs] > 1} { tclLog "warning: \"$file\" provides more than one package ($pkgs)" } foreach pkg $pkgs { # cmds is empty/not used in the direct case lappend files($pkg) [list $file $type $cmds] } if {$doVerbose} { tclLog "processed $file" } interp delete $c } } append index "# Tcl package index file, version 1.1\n" append index "# This file is generated by the \"pkg_mkIndex$more\" command\n" append index "# and sourced either when an application starts up or\n" append index "# by a \"package unknown\" script. It invokes the\n" append index "# \"package ifneeded\" command to set up package-related\n" append index "# information so that packages will be loaded automatically\n" append index "# in response to \"package require\" commands. When this\n" append index "# script is sourced, the variable \$dir must contain the\n" append index "# full path name of this file's directory.\n" foreach pkg [lsort [array names files]] { set cmd {} foreach {name version} $pkg { break } lappend cmd ::pkg::create -name $name -version $version foreach spec $files($pkg) { foreach {file type procs} $spec { if { $direct } { set procs {} } lappend cmd "-$type" [list $file $procs] } } append index "\n[eval $cmd]" } set f [open pkgIndex.tcl w] puts $f $index close $f cd $oldDir } # tclPkgSetup -- # This is a utility procedure use by pkgIndex.tcl files. It is invoked # as part of a "package ifneeded" script. It calls "package provide" # to indicate that a package is available, then sets entries in the # auto_index array so that the package's files will be auto-loaded when # the commands are used. # # Arguments: # dir - Directory containing all the files for this package. # pkg - Name of the package (no version number). # version - Version number for the package, such as 2.1.3. # files - List of files that constitute the package. Each # element is a sub-list with three elements. The first # is the name of a file relative to $dir, the second is # "load" or "source", indicating whether the file is a # loadable binary or a script to source, and the third # is a list of commands defined by this file. proc tclPkgSetup {dir pkg version files} { global auto_index package provide $pkg $version foreach fileInfo $files { set f [lindex $fileInfo 0] set type [lindex $fileInfo 1] foreach cmd [lindex $fileInfo 2] { if {[string equal $type "load"]} { set auto_index($cmd) [list load [file join $dir $f] $pkg] } else { set auto_index($cmd) [list source [file join $dir $f]] } } } } # tclMacPkgSearch -- # The procedure is used on the Macintosh to search a given directory for files # with a TEXT resource named "pkgIndex". If it exists it is sourced in to the # interpreter to setup the package database. proc tclMacPkgSearch {dir} { foreach x [glob -directory $dir -nocomplain *.shlb] { if {[file isfile $x]} { set res [resource open $x] foreach y [resource list TEXT $res] { if {[string equal $y "pkgIndex"]} {source -rsrc pkgIndex} } catch {resource close $res} } } } # tclPkgUnknown -- # This procedure provides the default for the "package unknown" function. # It is invoked when a package that's needed can't be found. It scans # the auto_path directories and their immediate children looking for # pkgIndex.tcl files and sources any such files that are found to setup # the package database. (On the Macintosh we also search for pkgIndex # TEXT resources in all files.) As it searches, it will recognize changes # to the auto_path and scan any new directories. # # Arguments: # name - Name of desired package. Not used. # version - Version of desired package. Not used. # exact - Either "-exact" or omitted. Not used. proc tclPkgUnknown {name version {exact {}}} { global auto_path tcl_platform env if {![info exists auto_path]} { return } # Cache the auto_path, because it may change while we run through # the first set of pkgIndex.tcl files set old_path [set use_path $auto_path] while {[llength $use_path]} { set dir [lindex $use_path end] # we can't use glob in safe interps, so enclose the following # in a catch statement, where we get the pkgIndex files out # of the subdirectories catch { foreach file [glob -directory $dir -join -nocomplain \ * pkgIndex.tcl] { set dir [file dirname $file] if {[file readable $file] && ![info exists procdDirs($dir)]} { if {[catch {source $file} msg]} { tclLog "error reading package index file $file: $msg" } else { set procdDirs($dir) 1 } } } } set dir [lindex $use_path end] set file [file join $dir pkgIndex.tcl] # safe interps usually don't have "file readable", nor stderr channel if {([interp issafe] || [file readable $file]) && \ ![info exists procdDirs($dir)]} { if {[catch {source $file} msg] && ![interp issafe]} { tclLog "error reading package index file $file: $msg" } else { set procdDirs($dir) 1 } } # On the Macintosh we also look in the resource fork # of shared libraries # We can't use tclMacPkgSearch in safe interps because it uses glob if {(![interp issafe]) && \ [string equal $tcl_platform(platform) "macintosh"]} { set dir [lindex $use_path end] if {![info exists procdDirs($dir)]} { tclMacPkgSearch $dir set procdDirs($dir) 1 } foreach x [glob -directory $dir -nocomplain *] { if {[file isdirectory $x] && ![info exists procdDirs($x)]} { set dir $x tclMacPkgSearch $dir set procdDirs($dir) 1 } } } set use_path [lrange $use_path 0 end-1] if {[string compare $old_path $auto_path]} { foreach dir $auto_path { lappend use_path $dir } set old_path $auto_path } } } # ::pkg::create -- # # Given a package specification generate a "package ifneeded" statement # for the package, suitable for inclusion in a pkgIndex.tcl file. # # Arguments: # args arguments used by the create function: # -name packageName # -version packageVersion # -load {filename ?{procs}?} # ... # -source {filename ?{procs}?} # ... # # Any number of -load and -source parameters may be # specified, so long as there is at least one -load or # -source parameter. If the procs component of a # module specifier is left off, that module will be # set up for direct loading; otherwise, it will be # set up for lazy loading. If both -source and -load # are specified, the -load'ed files will be loaded # first, followed by the -source'd files. # # Results: # An appropriate "package ifneeded" statement for the package. proc ::pkg::create {args} { append err(usage) "[lindex [info level 0] 0] " append err(usage) "-name packageName -version packageVersion" append err(usage) "?-load {filename ?{procs}?}? ... " append err(usage) "?-source {filename ?{procs}?}? ..." set err(wrongNumArgs) "wrong # args: should be \"$err(usage)\"" set err(valueMissing) "value for \"%s\" missing: should be \"$err(usage)\"" set err(unknownOpt) "unknown option \"%s\": should be \"$err(usage)\"" set err(noLoadOrSource) "at least one of -load and -source must be given" # process arguments set len [llength $args] if { $len < 6 } { error $err(wrongNumArgs) } # Initialize parameters set opts(-name) {} set opts(-version) {} set opts(-source) {} set opts(-load) {} # process parameters for {set i 0} {$i < $len} {incr i} { set flag [lindex $args $i] incr i switch -glob -- $flag { "-name" - "-version" { if { $i >= $len } { error [format $err(valueMissing) $flag] } set opts($flag) [lindex $args $i] } "-source" - "-load" { if { $i >= $len } { error [format $err(valueMissing) $flag] } lappend opts($flag) [lindex $args $i] } default { error [format $err(unknownOpt) [lindex $args $i]] } } } # Validate the parameters if { [llength $opts(-name)] == 0 } { error [format $err(valueMissing) "-name"] } if { [llength $opts(-version)] == 0 } { error [format $err(valueMissing) "-version"] } if { [llength $opts(-source)] == 0 && [llength $opts(-load)] == 0 } { error $err(noLoadOrSource) } # OK, now everything is good. Generate the package ifneeded statment. set cmdline "package ifneeded $opts(-name) $opts(-version) " set cmdList {} set lazyFileList {} # Handle -load and -source specs foreach key {load source} { foreach filespec $opts(-$key) { foreach {filename proclist} {{} {}} { break } foreach {filename proclist} $filespec { break } if { [llength $proclist] == 0 } { set cmd "\[list $key \[file join \$dir [list $filename]\]\]" lappend cmdList $cmd } else { lappend lazyFileList [list $filename $key $proclist] } } } if { [llength $lazyFileList] > 0 } { lappend cmdList "\[list tclPkgSetup \$dir $opts(-name)\ $opts(-version) [list $lazyFileList]\]" } append cmdline [join $cmdList "\\n"] return $cmdline } gpsmanshp_1.2.3/gpsmanshp.c0000644000175000017500000006732012224323660014065 0ustar migmig/*---------------------------------------------------------------------------*\ gpsmanshp.c A layer for writing GPS data to Shapefile format files using shapelib from Tcl This program was developed for use in gpsman --- GPS Manager: a manager for GPS receiver data Copyright (c) 2003-2013 Miguel Filgueiras (migfilg@t-online.de) 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. ------ This program uses - shapelib, Copyright (c) 1999 by Frank Warmerdam and was based on - gpstr2shp.c, Copyright (c) 2002 Miguel Filgueiras (mig@ncc.up.pt) that translates files in GPStrans format to Shapefile This program provides the Tcl gpsmanshp package defining the following Tcl commands: GSHPOpenInputFiles BASEPATH GSHPInfoFrom ID GSHPGetObj ID INDEX GSHPReadNextPoint ID GSHPCreateFiles BASEPATH TYPE DIM GSHPWriteWP ID X Y ?Z? NAME COMMENT DATE GSHPCreateRT DIM RTID COMMENT GSHPForgetRT GSHPAddWPToRT X Y ?Z? GSHPWriteRT ID FORGET GSHPCreateTR DIM NAME COMMENT GSHPForgetTR GSHPAddTPToTR X Y ?Z? GSHPWriteTR ID FORGET GSHPCloseFiles ID ----- Revision history: 1.2.3 06-Oct-13 change of author email address 1.2.2 15-Jul-13 change of author email address 1.2.1 08-Jun-11 path to shapefil.h change of author email address 1.2 05-Jul-04, reads .dbf fields for WP and UNKNOWN from files not written by gpsmanshp 1.1 17-Nov-03, reads POLYGON/Z Shapes as UNKNOWN, and ARCM and POLYGONM as UNKNOWN in 2 dimensions; reads/writes part (segment) information for polylines (TR or UNKNOWN) and polygons (read only) 1.0.3 08-Nov-03, avoids warning in gcc with -Wall 1.0.2 07-Mar-03, avoids warnings in gcc with -Wall 1.0.1 27-Jun-02, avoids warnings in gcc 1.0 12-Jun-02 \*---------------------------------------------------------------------------*/ /* File: gpsmanshp.c *\ \* Last modified: 15 July 2013 */ #include #include #include #include #define VERSION "1.2.3" // #define DEBUG 1 /* lengths of strings */ #define WPNAMEWD 50 #define WPCOMMTWD 128 #define WPDATEWD 25 #define RTIDWD 50 #define RTCOMMTWD 128 #define TRNAMEWD 50 #define TRCOMMTWD 128 #define MAXBUFFER 1024 typedef struct wpstrt { char wpname[WPNAMEWD], wpcommt[WPCOMMTWD], wpdate[WPDATEWD]; double wpx, wpy, wpz; struct wpstrt *wpnext; } WPDATA, *WPLIST; typedef struct { char rtid[RTIDWD], rtcommt[RTCOMMTWD]; int rtdim; double *rtxs, *rtys, *rtzs; WPLIST rtwps; } RTDATA; RTDATA RT; int RTBuilding = 0, RTCount = 0, RTLgth; WPLIST RTLastWP; typedef struct tpstrt { double tpx, tpy, tpz; struct tpstrt *tpnext; } TPDATA, *TPLIST; typedef struct { char trname[TRNAMEWD], trcommt[TRCOMMTWD]; int trdim, trnsegs, *trsegstarts, trsegsmax; double *trxs, *trys, *trzs; TPLIST trpts; } TRDATA; TRDATA TR; int TRBuilding = 0, TRCount = 0, TRLgth; TPLIST TRLastTP; int RTRepr = 0, TRRepr = 0; #define WPTYPE3 SHPT_POINTZ #define RTTYPE3 SHPT_ARCZ #define TRTYPE3 SHPT_ARCZ #define WPTYPE2 SHPT_POINT #define RTTYPE2 SHPT_ARC #define TRTYPE2 SHPT_ARC typedef enum {WPs, RTs, TRs, UNKNOWN} GPSTYPE; /* the following 3 arrays must be kept aligned */ int SHPTypes[] = {SHPT_POINTZ, SHPT_ARCZ, SHPT_POINT, SHPT_ARC, SHPT_POLYGONZ, SHPT_POLYGON, SHPT_ARCM, SHPT_POLYGONM}, SHPTypeDim[] = {3, 3, 2, 2, 3, 2, 2, 2}, NSHPTypes = 8; GPSTYPE SHPGPSType[] = {WPs, UNKNOWN, WPs, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN}; /* to be indexed by GPSTYPE (not UNKNOWN) and 0,1 for 2 or 3 dimensions */ int SHPType[][2] = {{WPTYPE2, WPTYPE3}, {RTTYPE2, RTTYPE3}, {TRTYPE2, TRTYPE3}}; /* max number of fields in gpsmanshp-generated .dbf files and in others*/ #define NFIELDS 3 #define MAXFIELDS 50 typedef struct shpfset { int id, settype, dim, input, field[NFIELDS], index; GPSTYPE gpstype; SHPHandle SHPFile; DBFHandle DBFFile; SHPObject *shpobj; struct shpfset *nextset; } SHPFILESET, *SHPFSETLIST; SHPFSETLIST FileSets = NULL; int FileSetCount = 0; #define CHECKPARAMNO(number,mess) \ if (objc != number+1) { \ Tcl_WrongNumArgs(interp,1,objv,mess); \ return TCL_ERROR; \ } #define CHECKPARAMNOS(min,max,mess) \ if (objc <= min || objc > max+1) { \ Tcl_WrongNumArgs(interp,1,objv,mess); \ return TCL_ERROR; \ } #define GETINTPARAM(index,var) \ if (Tcl_GetIntFromObj(interp,objv[index],&var) != TCL_OK) { \ return TCL_ERROR; \ } #define GETDOUBLEPARAM(index,var) \ if (Tcl_GetDoubleFromObj(interp,objv[index],&var) != TCL_OK) { \ return TCL_ERROR; \ } #define GETSTRINGPARAM(index) Tcl_GetString(objv[index]); #define RETURNINT(value) \ Tcl_SetObjResult(interp,Tcl_NewIntObj(value)); \ return TCL_OK; #define RETURNLIST(number,vec) \ Tcl_SetObjResult(interp,Tcl_NewListObj(number,vec)); \ return TCL_OK; void cpstrclean(char *s, char *dest, int n) /* copy string of length at most n, set to zero trailing chars */ { while ((*dest++=*s++) && n--); if (! n) *--dest = 0; else while (n--) *dest++ = 0; } SHPFSETLIST findset(int id) { SHPFSETLIST p = FileSets; while (p != NULL) { if (p->id == id) return p; p = p->nextset; } return NULL; } int nodbffields(SHPFSETLIST p) { DBFHandle df = p->DBFFile; // GSHPOpenInputFiles must be revised if there is any change in these fields // the same is obviously true of the GSHPWrite... functions switch (p->gpstype) { case WPs: return ((p->field[0]=DBFAddField(df,"name",FTString,WPNAMEWD,0)) == -1 || (p->field[1]=DBFAddField(df,"commt",FTString,WPCOMMTWD,0)) == -1 || (p->field[2]=DBFAddField(df,"date",FTString,WPDATEWD,0)) == -1); case RTs: return ((p->field[0]=DBFAddField(df,"id",FTString,RTIDWD,0)) == -1 || (p->field[1]=DBFAddField(df,"commt",FTString,RTCOMMTWD,0)) == -1); case TRs: return ((p->field[0]=DBFAddField(df,"name",FTString,TRNAMEWD,0)) == -1 || (p->field[1]=DBFAddField(df,"commt",FTString,TRCOMMTWD,0)) == -1); default: return 1; } return 1; } Tcl_Obj *getdbfotherfields(DBFHandle df, int n, int oix) { int i; Tcl_Obj *ov[MAXFIELDS]; #ifdef DEBUG printf(">getdbfotherfields n=%d oix=%d\n",n,oix); #endif if (df == NULL || n <= 0) return NULL; for (i=0; ireturning from getdbfotherfields"); #endif return Tcl_NewListObj(n,ov); } int getdbffields(SHPFSETLIST p, int oix, Tcl_Obj *ov[], Tcl_Obj **eflst) { DBFHandle df = p->DBFFile; int n = 2, i; if (p->gpstype == UNKNOWN) { *eflst = getdbfotherfields(df,-p->field[0],oix); return 0; } if (p->gpstype == WPs) { *eflst = getdbfotherfields(df,-p->field[0],oix); n = 3; } if (df == NULL) for (i=0; ifield[i]),-1); return n; } int GSHPCreateFiles(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPCreateFiles BASEPATH TYPE DIM */ { SHPFSETLIST p = FileSets, q; int id, shptype, dim; char *basename, *type; SHPHandle sf; DBFHandle df; GPSTYPE gpstype; #ifdef DEBUG printf(">GSHPCreateFiles, %d args\n",objc-1); #endif CHECKPARAMNO(3,"BASEPATH TYPE DIM") basename = GETSTRINGPARAM(1); type = GETSTRINGPARAM(2); GETINTPARAM(3,dim) if (dim < 2 || dim > 3) { RETURNINT(-2) } if (! strcmp(type,"WP")) gpstype = WPs; else if (! strcmp(type,"RT")) gpstype = RTs; else if (! strcmp(type,"TR")) gpstype = TRs; else { RETURNINT(-1) } shptype = SHPType[gpstype][dim-2]; if ((df=DBFCreate(basename)) == NULL || (sf=SHPCreate(basename,shptype)) == NULL) { RETURNINT(0) } if ((q=(SHPFSETLIST) malloc(sizeof(SHPFILESET))) == NULL) { RETURNINT(-4) } if (p != NULL) { while (p->nextset != NULL) p = p->nextset; p->nextset = q; } else FileSets = q; id = q->id = ++FileSetCount; q->settype = shptype; q->dim = dim; q->input = 0; q->gpstype = gpstype; q->SHPFile = sf; q->DBFFile = df; q->shpobj = NULL; q->nextset = NULL; if (nodbffields(q)) { if (p != NULL) p->nextset = NULL; else FileSets = NULL; free(q); RETURNINT(-3) } RETURNINT(id) } int GSHPOpenInputFiles(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPOpenInputFiles BASEPATH */ { SHPFSETLIST p = FileSets, q; int id, shptype, dim, nents, i, f[NFIELDS], usefs; char *basename; SHPHandle sf; DBFHandle df; GPSTYPE gpstype; #ifdef DEBUG printf(">GSHPOpenInputFiles, %d args\n",objc-1); #endif CHECKPARAMNO(1,"BASEPATH") basename = GETSTRINGPARAM(1); if ((sf=SHPOpen(basename,"rb")) == NULL) { RETURNINT(0) } SHPGetInfo(sf,&nents,&shptype,NULL,NULL); if (nents == 0) { RETURNINT(-1) } for (i=0; i MAXFIELDS) f[0] = -MAXFIELDS; f[0] = -i; } } else df = NULL; } if ((q=(SHPFSETLIST) malloc(sizeof(SHPFILESET))) == NULL) { RETURNINT(-3) } if (p != NULL) { while (p->nextset != NULL) p = p->nextset; p->nextset = q; } else FileSets = q; id = q->id = ++FileSetCount; q->settype = shptype; q->dim = dim; // this must be non-zero; otherwise the set can be taken as an output one q->input = nents; q->index = -1; // gpstype may be UNKNOWN (an ARC/Z Shape without gpsmanshp written .dbf, // or a POLIGON/Z) q->gpstype = gpstype; q->SHPFile = sf; q->DBFFile = df; q->shpobj = NULL; q->nextset = NULL; for (i=0; ifield[i] = f[i]; #ifdef DEBUG printf("set %d:\n\tshptype=%d gpstype=%d dim=%d nents=%d dbf=%d usefs=%d\n", id,shptype,gpstype,dim,nents,df!=NULL,usefs); #endif RETURNINT(id) } int GSHPInfoFrom(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPInfoFrom ID */ { SHPFSETLIST p; int id, n, i, k, j; Tcl_Obj *ov[7], *fov[2*MAXFIELDS]; char buffer[MAXBUFFER]; DBFHandle df; #ifdef DEBUG printf(">GSHPInfoFrom, %d args\n",objc-1); #endif CHECKPARAMNO(1,"FILES_ID") GETINTPARAM(1,id) if ((p=findset(id)) == NULL || ! p->input) { RETURNINT(0) } n = 4; switch (p->gpstype) { case WPs: ov[0] = Tcl_NewStringObj("WP",-1); n = 3; break; case RTs: ov[0] = Tcl_NewStringObj("RT",-1); break; case TRs: ov[0] = Tcl_NewStringObj("TR",-1); break; case UNKNOWN: ov[0] = Tcl_NewStringObj("UNKNOWN",-1); } ov[1] = Tcl_NewIntObj(p->input); ov[2] = Tcl_NewIntObj(p->dim); if (n == 4) ov[3] = Tcl_NewIntObj(p->index); if ((df = p->DBFFile) == NULL) { ov[n++] = Tcl_NewIntObj(0); ov[n++] = Tcl_NewListObj(0,NULL); } else if ((i = -p->field[0]) > 0) { // get field names and precisions for (k=j=0; kGSHPGetObj, %d args\n",objc-1); #endif CHECKPARAMNO(2,"FILES_ID INDEX") GETINTPARAM(1,id) GETINTPARAM(2,oix) if ((p=findset(id)) == NULL || ! p->input) { RETURNINT(-1) } p->index = -1; if (p->shpobj != NULL) { SHPDestroyObject(p->shpobj); p->shpobj = NULL; } if (oix < 0 || oix >= p->input || (p->shpobj=SHPReadObject(p->SHPFile,oix)) == NULL) { RETURNINT(-2) } if (p->shpobj->nSHPType == SHPT_NULL) { SHPDestroyObject(p->shpobj); p->shpobj = NULL; RETURNLIST(0,NULL) } n = 0; switch (p->gpstype) { case WPs: n = getdbffields(p,oix,ov,&eflst); ov[n++] = Tcl_NewDoubleObj(p->shpobj->padfX[0]); ov[n++] = Tcl_NewDoubleObj(p->shpobj->padfY[0]); if (p->dim == 3) ov[n++] = Tcl_NewDoubleObj(p->shpobj->padfZ[0]); if (eflst != NULL) ov[n++] = eflst; break; case RTs: n = getdbffields(p,oix,ov,NULL); ov[n++] = Tcl_NewIntObj(p->shpobj->nVertices); p->index = 0; break; case TRs: n = getdbffields(p,oix,ov,NULL); case UNKNOWN: ov[n++] = Tcl_NewIntObj(p->shpobj->nVertices); if ((nsegs=p->shpobj->nParts) != 0) { if ((ppov = (Tcl_Obj **) malloc(nsegs*sizeof(Tcl_Obj *))) == NULL) { RETURNINT(-3) } segstart = p->shpobj->panPartStart; ppovnxt = ppov; i = 0; do if ((k = (*segstart++)) > 0) { *ppovnxt++ = Tcl_NewIntObj(k); #ifdef DEBUG printf(">GSHPGetObj, segment starter: %d\n",i); fflush(stdout); #endif i++; } while (--nsegs); if (i != 0) { ov[n++] = Tcl_NewListObj(i,ppov); } #ifdef DEBUG printf(">GSHPGetObj, about freeing memory\n"); fflush(stdout); #endif free(ppov); } if (p->gpstype == UNKNOWN) { getdbffields(p,oix,NULL,&eflst); if (eflst != NULL) { if (n == 1) ov[n++] = Tcl_NewListObj(0,NULL); ov[n++] = eflst; } } p->index = 0; } RETURNLIST(n,ov) } int GSHPReadNextPoint(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPReadNextPoint ID */ { SHPFSETLIST p; int id, eix, n = 2; Tcl_Obj *ov[3]; #ifdef DEBUG printf(">GSHPReadNextPoint, %d args\n",objc-1); #endif CHECKPARAMNO(1,"FILES_ID") GETINTPARAM(1,id) if ((p=findset(id)) == NULL || ! p->input) { RETURNINT(0) } if ((eix=p->index) < 0) { RETURNINT(-1) } if (eix == p->shpobj->nVertices) { p->index = -1; SHPDestroyObject(p->shpobj); p->shpobj = NULL; RETURNINT(-2) } ov[0] = Tcl_NewDoubleObj(p->shpobj->padfX[eix]); ov[1] = Tcl_NewDoubleObj(p->shpobj->padfY[eix]); if (p->dim == 3) ov[n++] = Tcl_NewDoubleObj(p->shpobj->padfZ[eix]); p->index++; RETURNLIST(n,ov) } int GSHPCloseFiles(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPCloseFiles ID */ { SHPFSETLIST p = FileSets, q = NULL; int id; #ifdef DEBUG printf(">GSHPCloseFiles, %d args\n",objc-1); #endif CHECKPARAMNO(1,"FILES_ID") GETINTPARAM(1,id) while (p != NULL && p->id != id) { q = p; p = p->nextset; } if (p == NULL) { RETURNINT(0) } SHPClose(p->SHPFile); if (p->DBFFile != NULL) DBFClose(p->DBFFile); if (p->shpobj != NULL) SHPDestroyObject(p->shpobj); if (q != NULL) q->nextset = p->nextset; else FileSets = p->nextset; free(p); RETURNINT(1) } int GSHPWriteWP(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPWriteWP ID X Y ?Z? NAME COMMENT DATE */ { SHPFSETLIST p; int id, entno, dim; double x, y, z; char *name, *commt, *date; SHPObject *pwpo; DBFHandle df; #ifdef DEBUG printf(">GSHPWriteWP, %d args\n",objc-1); #endif CHECKPARAMNOS(6,7,"FILES_ID X Y ?Z? NAME COMMENT DATE") dim = objc-5; GETINTPARAM(1,id) GETDOUBLEPARAM(2,x) GETDOUBLEPARAM(3,y) if (dim == 3) { GETDOUBLEPARAM(4,z) name = GETSTRINGPARAM(5) commt = GETSTRINGPARAM(6) date = GETSTRINGPARAM(7) } else { z = 0; name = GETSTRINGPARAM(4) commt = GETSTRINGPARAM(5) date = GETSTRINGPARAM(6) } if ((p=findset(id)) == NULL || p->input) { RETURNINT(-1) } if (p->settype != SHPType[WPs][dim-2]) { RETURNINT(-2) } #ifdef DEBUG if (dim == 3) printf("W\t%s\t%s\t%s\t%lf\t%lf\t%lf\n",name,commt,date,x,y,z); else printf("W\t%s\t%s\t%s\t%lf\t%lf\n",name,commt,date,x,y); #endif if ((pwpo=SHPCreateSimpleObject(p->settype,1,&x,&y,&z)) == NULL) { RETURNINT(-3) } entno = SHPWriteObject(p->SHPFile,-1,pwpo); SHPDestroyObject(pwpo); df = p->DBFFile; if (DBFWriteStringAttribute(df,entno,p->field[0],name) == 0 || DBFWriteStringAttribute(df,entno,p->field[1],commt) == 0 || DBFWriteStringAttribute(df,entno,p->field[2],date) == 0) { RETURNINT(-4) } RETURNINT(1) } int GSHPCreateRT(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPCreateRT DIM RTID COMMENT */ { char *name, *commt; int dim; #ifdef DEBUG printf(">GSHPCreateRT, %d args\n",objc-1); #endif CHECKPARAMNO(3,"DIM RTID COMMENT") GETINTPARAM(1,dim) if (dim < 2 || dim > 3) { RETURNINT(-1) } name = GETSTRINGPARAM(2) commt = GETSTRINGPARAM(3) if (RTBuilding) { RETURNINT(0) } RTBuilding = 1; cpstrclean(name,RT.rtid,RTIDWD); cpstrclean(commt,RT.rtcommt,RTCOMMTWD); RT.rtwps = NULL; RT.rtxs = NULL; RT.rtys = NULL; RT.rtzs = NULL; RT.rtdim = dim; RTLgth = 0; RETURNINT(1) } void forgetRT() { WPLIST p, q; RTBuilding = 0; p = RT.rtwps; while (p != NULL) { q = p; p = p->wpnext; free(q); } if (RT.rtxs != NULL) { free(RT.rtxs); free(RT.rtys); free(RT.rtzs); } } int GSHPForgetRT(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPForgetRT */ { #ifdef DEBUG printf(">GSHPForgetRT, %d args\n",objc-1); #endif CHECKPARAMNO(0,NULL) if (! RTBuilding) { RETURNINT(0) } forgetRT(); RETURNINT(1) } int GSHPAddWPToRT(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPAddWPToRT X Y ?Z? */ { double x, y, z; WPLIST wpp; int dim; #ifdef DEBUG printf(">GSHPAddWPToRT, %d args\n",objc-1); #endif CHECKPARAMNOS(2,3,"X Y ?Z?") dim = objc-1; GETDOUBLEPARAM(1,x) GETDOUBLEPARAM(2,y) if (dim == 3) { GETDOUBLEPARAM(3,z) } else z = 0; if (! RTBuilding || dim != RT.rtdim) { RETURNINT(-1) } if ((wpp=(WPLIST) malloc(sizeof(WPDATA))) == NULL) { RETURNINT(-2) } wpp->wpx = x; wpp->wpy = y; wpp->wpz = z; wpp->wpnext = NULL; if (RTLgth++) RTLastWP->wpnext = wpp; else RT.rtwps = wpp; if (RT.rtxs != NULL) { free(RT.rtxs); free(RT.rtys); free(RT.rtzs); RT.rtxs = NULL; } RTLastWP = wpp; RETURNINT(1) } int GSHPWriteRT(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPWriteRT ID FORGET */ { SHPFSETLIST p; int id, forget, entno, i, dim; WPLIST wpp; SHPObject *prto; DBFHandle df; #ifdef DEBUG printf(">GSHPWriteRT, %d args\n",objc-1); #endif CHECKPARAMNO(2,"FILES_ID FORGET") GETINTPARAM(1,id) GETINTPARAM(2,forget) if (! RTBuilding) { RETURNINT(-1) } if (RTLgth == 0) { RETURNINT(-2) } if ((p=findset(id)) == NULL || p->input) { RETURNINT(-3) } dim = RT.rtdim; if (p->settype != SHPType[RTs][dim-2]) { RETURNINT(-4) } #ifdef DEBUG printf("R\t%s\t%s\n",RT.rtid,RT.rtcommt); wpp = RT.rtwps; while (wpp != NULL) { if (dim == 2) printf("W\t\t\t\t%lf\t%lf\n",wpp->wpx,wpp->wpy); else printf("W\t\t\t\t%lf\t%lf\t%lf\n",wpp->wpx,wpp->wpy,wpp->wpz); wpp = wpp->wpnext; } #endif if (RT.rtxs == NULL) { if ((RT.rtxs=(double *) malloc(RTLgth*sizeof(double))) == NULL) { RETURNINT(-5) } if ((RT.rtys=(double *) malloc(RTLgth*sizeof(double))) == NULL || (dim == 3 && (RT.rtzs=(double *) malloc(RTLgth*sizeof(double))) == NULL)) { free(RT.rtxs); free(RT.rtys); RT.rtxs = NULL; RETURNINT(-5) } wpp = RT.rtwps; for(i=0; wpp != NULL; i++) { RT.rtxs[i] = wpp->wpx; RT.rtys[i] = wpp->wpy; if (dim == 3) RT.rtzs[i] = wpp->wpz; wpp = wpp->wpnext; } } if ((prto=SHPCreateObject(p->settype,RTCount,0,NULL,NULL,RTLgth, RT.rtxs,RT.rtys,RT.rtzs,NULL)) == NULL) { RETURNINT(-5) } entno = SHPWriteObject(p->SHPFile,-1,prto); SHPDestroyObject(prto); RTCount++; df = p->DBFFile; if (DBFWriteStringAttribute(df,entno,p->field[0],RT.rtid) == 0 || DBFWriteStringAttribute(df,entno,p->field[1],RT.rtcommt) == 0) { RETURNINT(-6) } if (forget) forgetRT(); RETURNINT(1) } int GSHPCreateTR(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPCreateTR DIM NAME COMMENT */ { char *name, *commt; int dim, nsegs, *segstarts, *segnxt, i, k, kp; Tcl_Obj **objvPtr; #ifdef DEBUG printf(">GSHPCreateTR, %d args\n",objc-1); #endif CHECKPARAMNOS(3,4,"DIM NAME COMMENT ?SEGSTARTERS?") GETINTPARAM(1,dim) if (dim < 2 || dim > 3) { RETURNINT(-1) } if (TRBuilding) { RETURNINT(0) } name = GETSTRINGPARAM(2) commt = GETSTRINGPARAM(3) kp = 0; if (objc-1 == 3) { nsegs = 0; segstarts = NULL; } else { if (Tcl_ListObjGetElements(interp,objv[4],&nsegs,&objvPtr) != TCL_OK) return TCL_ERROR; #ifdef DEBUG printf(">GSHPCreateTR, %d segs\n",nsegs); #endif if (nsegs == 0) { segstarts = NULL; } else { if ((segstarts = (int *) malloc(++nsegs*sizeof(int))) == NULL) { RETURNINT(-2) } #ifdef DEBUG printf(">GSHPCreateTR, memory allocated for %d segs\n",nsegs); #endif segnxt = segstarts; // make sure 0 is the first one *segnxt++ = 0; for (i=1; iGSHPCreateTR, adding %d seg start\n",k); #endif objvPtr++; *segnxt++ = kp = k; } } } TRBuilding = 1; cpstrclean(name,TR.trname,TRNAMEWD); cpstrclean(commt,TR.trcommt,TRCOMMTWD); TR.trnsegs = nsegs; TR.trsegstarts = segstarts; TR.trsegsmax = kp; TR.trpts = NULL; TR.trxs = NULL; TR.trys = NULL; TR.trzs = NULL; TR.trdim = dim; TRLgth = 0; RETURNINT(1) } void forgetTR() { TPLIST p, q; TRBuilding = 0; p = TR.trpts; while (p != NULL) { q = p; p = p->tpnext; free(q); } if (TR.trnsegs != 0) free(TR.trsegstarts); if (TR.trxs != NULL) { free(TR.trxs); free(TR.trys); free(TR.trzs); } } int GSHPForgetTR(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPForgetTR */ { #ifdef DEBUG printf(">GSHPForgetTR, %d args\n",objc-1); #endif CHECKPARAMNO(0,NULL) if (! TRBuilding) { RETURNINT(0) } forgetTR(); RETURNINT(1) } int GSHPAddTPToTR(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPAddTPToTR X Y ?Z? */ { double x, y, z; TPLIST tpp; int dim; #ifdef DEBUG printf(">GSHPAddTPToTR, %d args\n",objc-1); #endif CHECKPARAMNOS(2,3,"X Y ?Z?") dim = objc-1; GETDOUBLEPARAM(1,x) GETDOUBLEPARAM(2,y) if (dim == 3) { GETDOUBLEPARAM(3,z) } else z = 0; if (! TRBuilding || TR.trdim != dim) { RETURNINT(-1) } if ((tpp=(TPLIST) malloc(sizeof(TPDATA))) == NULL) { RETURNINT(-2) } tpp->tpx = x; tpp->tpy = y; tpp->tpz = z; tpp->tpnext = NULL; if (TRLgth++) TRLastTP->tpnext = tpp; else TR.trpts = tpp; if (TR.trxs != NULL) { free(TR.trxs); free(TR.trys); free(TR.trzs); TR.trxs = NULL; } TRLastTP = tpp; RETURNINT(1) } int GSHPWriteTR(ClientData clientData,Tcl_Interp *interp, int objc,Tcl_Obj *CONST objv[]) /* GSHPWriteTR ID FORGET */ { SHPFSETLIST p; int id, forget, entno, i, dim; TPLIST tpp; SHPObject *ptro; DBFHandle df; #ifdef DEBUG int *segs, nsegs, k; printf(">GSHPWriteTR, %d args\n",objc-1); #endif CHECKPARAMNO(2,"FILES_ID FORGET") GETINTPARAM(1,id) GETINTPARAM(2,forget) if (! TRBuilding) { RETURNINT(-1) } if (TRLgth == 0) { RETURNINT(-2) } if (TRLgth-1 < TR.trsegsmax) { RETURNINT(-7) } if ((p=findset(id)) == NULL || p->input) { RETURNINT(-3) } dim = TR.trdim; if (p->settype != SHPType[TRs][dim-2]) { RETURNINT(-4) } #ifdef DEBUG printf("TR\t%s\t%s\t%d\n",TR.trname,TR.trcommt,TR.trnsegs); tpp = TR.trpts; i = 0; if ((nsegs = TR.trnsegs) == 0) k = -1; else { segs = TR.trsegstarts; k = *segs++; } while (tpp != NULL) { if (dim == 3) printf("T\t\t%lf\t%lf\t%lf",tpp->tpx,tpp->tpy,tpp->tpz); else printf("T\t\t%lf\t%lf",tpp->tpx,tpp->tpy); tpp = tpp->tpnext; if (i++ == k) { printf("\t; segment starter\n"); if (--nsegs == 0) k = -1; else k = *segs++; } else putchar('\n'); } #endif if (TR.trxs == NULL) { if ((TR.trxs=(double *) malloc(TRLgth*sizeof(double))) == NULL) { RETURNINT(-5) } if ((TR.trys=(double *) malloc(TRLgth*sizeof(double))) == NULL || (dim == 3 && (TR.trzs=(double *) malloc(TRLgth*sizeof(double))) == NULL)) { free(TR.trxs); free(TR.trys); TR.trxs = NULL; RETURNINT(-5) } tpp = TR.trpts; for(i=0; tpp != NULL; i++) { TR.trxs[i] = tpp->tpx; TR.trys[i] = tpp->tpy; if (dim == 3) TR.trzs[i] = tpp->tpz; tpp = tpp->tpnext; } } if ((ptro=SHPCreateObject(p->settype,TRCount,TR.trnsegs,TR.trsegstarts,NULL, TRLgth,TR.trxs,TR.trys,TR.trzs,NULL)) == NULL) { RETURNINT(-5) } entno = SHPWriteObject(p->SHPFile,-1,ptro); SHPDestroyObject(ptro); TRCount++; df = p->DBFFile; if (DBFWriteStringAttribute(df,entno,p->field[0],TR.trname) == 0 || DBFWriteStringAttribute(df,entno,p->field[1],TR.trcommt) == 0) { RETURNINT(-6) } if (forget) forgetTR(); RETURNINT(1) } /* Tcl interface */ int Gpsmanshp_Init(Tcl_Interp *interp); int Tclgpsmanshp_Init(Tcl_Interp *interp) { return Gpsmanshp_Init(interp); } int Gpsmanshp_Init(Tcl_Interp *interp) { Tcl_CreateObjCommand(interp,"GSHPCreateFiles",GSHPCreateFiles, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPOpenInputFiles",GSHPOpenInputFiles, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPInfoFrom",GSHPInfoFrom, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPGetObj",GSHPGetObj, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPReadNextPoint",GSHPReadNextPoint, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPCloseFiles",GSHPCloseFiles, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPWriteWP",GSHPWriteWP, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPCreateRT",GSHPCreateRT, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPForgetRT",GSHPForgetRT, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPAddWPToRT",GSHPAddWPToRT, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPWriteRT",GSHPWriteRT,(ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPCreateTR",GSHPCreateTR, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPForgetTR",GSHPForgetTR, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPAddTPToTR",GSHPAddTPToTR, (ClientData)NULL,NULL); Tcl_CreateObjCommand(interp,"GSHPWriteTR",GSHPWriteTR,(ClientData)NULL,NULL); Tcl_PkgProvide(interp,"gpsmanshp",VERSION); return TCL_OK; } gpsmanshp_1.2.3/Makefile8.30000644000175000017500000000301512224327667013614 0ustar migmig# Makefile for gpsmanshp.c Tcl version 8.3 # # A layer for writing GPS data to Shapefile format files # using shapelib from Tcl, as a Tcl package # # This program was developed for use with # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2002-2013 Miguel Filgueiras (migfilg@t-online.de) # # 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. # TCLVERSION = 8.3 INSTALLDIR = /usr/lib/tcl$(TCLVERSION) CFLAGS = -Wall -fPIC -c -I/usr/include/tcl$(TCLVERSION) LINKOPT = -lshp -ltcl$(TCLVERSION) gpsmanshp.so: gpsmanshp.o $(CC) -shared -o gpsmanshp.so $(LINKOPT) gpsmanshp.o gpsmanshp.o: gpsmanshp.c $(CC) $(CFLAGS) gpsmanshp.c pkgIndex.tcl: gpsmanshp.so echo "pkg_mkIndex -lazy -verbose . gpsmanshp.so" | tclsh$(TCLVERSION) chmod 644 gpsmanshp.so pkgIndex.tcl install: pkgIndex.tcl -mkdir $(INSTALLDIR) cp gpsmanshp.so pkgIndex.tcl $(INSTALLDIR) clean: rm -f gpsmanshp.o gpsmanshp.so pkgIndex.tcl gpsmanshp_1.2.3/gpstr2shp.c0000640000175000017500000002517612224327460014022 0ustar migmig/*---------------------------------------------------------------------------*\ gpstr2shp.c A translator of GPStrans files into Shapefile format files This program was developed for use with gpsman --- GPS Manager: a manager for GPS receiver data Copyright (c) 2002-2013 Miguel Filgueiras (migfilg@t-online.de) 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. ------ This program reads from the standard input; its single argument is the (path to the) base-name for the Shapefile files (.shp, .shx, .dbf) This program uses - shapelib, Copyright (c) 1999 by Frank Warmerdam A similar program, that translates "Generate" format, is - gen2shp.c, Copyright (c) 1999 by Jan-Oliver Wagner The GPStrans format is defined by - GPStrans, Copyright (c) 1995 by Carsten Tschach \*---------------------------------------------------------------------------*/ /* File: gentr2shp.c *\ \* Last modified: 6 October 2013 */ /* Format of GPStrans files: - header: DDD (decimal degrees) is the only position format supported Format: DDD UTC Offset: -6.00 hrs Datum[061]: NAD27 CONUS ||| |||||| ||| 0 1 2 3 4 5 6 0123456789012345678901234567890123456789012345678901234567890123456789 - a single data type per file - possible data types: waypoints, routes, tracks - waypoint files: one or more lines W\t%s\t%s\t%s\t%lf\t%lf with name, comment (40 chars), date (MM/DD/YYYY HH:MM:SS), lat, long - route files: one or more of R\t%d\t%s with route number, comment, followed by lines for route waypoints (as in waypoint files) - track files: tracks are separated by a blank line, each track has one or more lines T\t%s\t%lf\t%lf for time-stamp (MM/DD/YYYY HH:MM:SS), lat, long Generated files: - point or polyline shapes - attributes in data-base: - for waypoints: name, commt (comment) and date as strings - for routes: number and commt (comment) as strings - for tracks: date (time-stamp of first track point) as string */ #include #include /* #define DEBUG 1 */ /* lengths of strings */ #define WPNAMEWD 50 #define WPCOMMTWD 128 #define WPDATEWD 25 #define RTIDWD 50 #define RTCOMMTWD 128 #define TRDATEWD 25 typedef struct wpstrt { char wpname[WPNAMEWD], wpcommt[WPCOMMTWD], wpdate[WPDATEWD]; double wplat, wplong; struct wpstrt *wpnext; } WPDATA, *WPLIST; WPDATA WP; int WPCount = 0, WPNameField, WPCommtField, WPDateField; typedef struct { char rtid[RTIDWD], rtcommt[RTCOMMTWD]; WPLIST rtwps; } RTDATA; RTDATA RT; int RTCount = 0, RTlgth, RTIdField, RTCommtField; typedef struct tpstrt { char tpdate[TRDATEWD]; double tplat, tplong; struct tpstrt *tpnext; } TPDATA, *TPLIST; TPLIST TR; int TRCount = 0, TRlgth, TRDateField; char Buffer[256]; SHPHandle SHPFile; DBFHandle DBFFile; #define WPTYPE SHPT_POINT #define RTTYPE SHPT_ARC #define TRTYPE SHPT_ARC int getline(int skipnl) { char *p = Buffer; int empty = 1; while (! feof(stdin)) { if ((*p++=getchar()) == '\n') { --p; if (skipnl && empty) continue; *p = 0; return 1; } empty = 0; } return 0; } int cpnotab(char **pp, char *dest) /* cp string until tab, return 0 if not found */ { while ((*dest++=**pp) && **pp != '\t') (*pp)++; if (**pp == 0) return 1; *--dest = 0; (*pp)++; return 0; } int badheader() { if (! getline(0)) { fprintf(stderr,"no header found\n"); return(1); } if (strncmp("Format: DDD",Buffer,11)) { fprintf(stderr,"bad format in header: %s\n",Buffer); return(1); } return 0; } int badWP(WPLIST pWP) { char *p = Buffer; if (*p++ != 'W' || *p++ != '\t' || cpnotab(&p,pWP->wpname) || cpnotab(&p,pWP->wpcommt) || cpnotab(&p,pWP->wpdate)) return 1; return sscanf(p,"%lf\t%lf",&pWP->wplat,&pWP->wplong) != 2; } void saveWP(WPLIST wpp) /* save a single WP pointed to by wpp */ { SHPObject *pwpo; int entno; #ifdef DEBUG printf("W\t%s\t%s\t%s\t%lf\t%lf\n",wpp->wpname,wpp->wpcommt,wpp->wpdate, wpp->wplat,wpp->wplong); #endif pwpo = SHPCreateSimpleObject(WPTYPE,1,&wpp->wplong,&wpp->wplat,NULL); entno = SHPWriteObject(SHPFile,-1,pwpo); SHPDestroyObject(pwpo); if (DBFWriteStringAttribute(DBFFile,entno,WPNameField,wpp->wpname) == 0 || DBFWriteStringAttribute(DBFFile,entno,WPCommtField,wpp->wpcommt) == 0 || DBFWriteStringAttribute(DBFFile,entno,WPDateField,wpp->wpdate) == 0) { fprintf(stderr,"failed to write .dbf field, WP #%d\n",WPCount); exit(1); } WPCount++; } void transWPs() { if ((WPNameField=DBFAddField(DBFFile,"name",FTString,WPNAMEWD,0)) == -1 || (WPCommtField=DBFAddField(DBFFile,"commt",FTString,WPCOMMTWD,0)) == -1 || (WPDateField=DBFAddField(DBFFile,"date",FTString,WPDATEWD,0)) == -1) { fprintf(stderr,"failed to add .dbf field\n"); exit(1); } do { if (badWP(&WP)) { fprintf(stderr,"bad WP: %s\n",Buffer); exit(1); } saveWP(&WP); } while (getline(1)); } int badRT() { char *p = Buffer, *q = RT.rtcommt; if (*p++ != 'R' || *p++ != '\t' || cpnotab(&p,RT.rtid)) return 1; while ((*q++=*p++)); return 0; } void saveRT() /* and free list of WPs */ { WPLIST wpp, wpl; SHPObject *prto; int entno, i; double *x, *y; #ifdef DEBUG printf("R\t%s\t%s\n",RT.rtid,RT.rtcommt); wpp = RT.rtwps; while (wpp != NULL) { printf("W\t%s\t%s\t%s\t%lf\t%lf\n",wpp->wpname,wpp->wpcommt,wpp->wpdate, wpp->wplat,wpp->wplong); wpp = wpp->wpnext; } #endif if ((x=(double *) malloc(RTlgth*sizeof(double))) == NULL || (y=(double *) malloc(RTlgth*sizeof(double))) == NULL) { fprintf(stderr,"out of memory, RT #%d\n",RTCount); exit(1); } wpp = RT.rtwps; for(i=0; wpp != NULL; i++) { x[i] = wpp->wplong; y[i] = wpp->wplat; wpl = wpp; wpp = wpp->wpnext; free(wpl); } prto = SHPCreateObject(RTTYPE,RTCount,0,NULL,NULL,RTlgth,x,y,NULL,NULL); entno = SHPWriteObject(SHPFile,-1,prto); SHPDestroyObject(prto); free(x); free(y); if (DBFWriteStringAttribute(DBFFile,entno,RTIdField,RT.rtid) == 0 || DBFWriteStringAttribute(DBFFile,entno,RTCommtField,RT.rtcommt) == 0) { fprintf(stderr,"failed to write .dbf field, RT #%d\n",RTCount); exit(1); } RTCount++; } void transRTs() { WPLIST curr, prev; int on; if ((RTIdField=DBFAddField(DBFFile,"id",FTString,RTIDWD,0)) == -1 || (RTCommtField=DBFAddField(DBFFile,"commt",FTString,RTCOMMTWD,0)) == -1) { fprintf(stderr,"failed to add .dbf field\n"); exit(1); } do { if (badRT()) { fprintf(stderr,"bad RT: %s\n",Buffer); exit(1); } if ((curr=RT.rtwps=(WPLIST) malloc(sizeof(WPDATA))) == NULL) { fprintf(stderr,"out of memory!"); exit(1); } if (! getline(1) || badWP(curr)) { fprintf(stderr,"route without valid WPs"); exit(1); } RTlgth = 0; do { RTlgth++; prev = curr; if ((curr=(WPLIST) malloc(sizeof(WPDATA))) == NULL) { fprintf(stderr,"out of memory!"); exit(1); } prev->wpnext = curr; } while ((on=getline(1)) && ! badWP(curr)); free(curr); prev->wpnext = NULL; saveRT(); } while (on); } int badTP(TPLIST ptp) { char *p = Buffer; if (*p++ != 'T' || *p++ != '\t' || cpnotab(&p,ptp->tpdate)) return 1; return sscanf(p,"%lf\t%lf",&ptp->tplat,&ptp->tplong) != 2; } void saveTR() /* and free TP list (i.e., the track) */ { TPLIST tpp, tpl; SHPObject *ptro; int entno, i; double *x, *y; #ifdef DEBUG tpp = TR; while (tpp != NULL) { printf("T\t%s\t%lf\t%lf\n",tpp->tpdate,tpp->tplat,tpp->tplong); tpp = tpp->tpnext; } putchar('\n'); #endif if ((x=(double *) malloc(TRlgth*sizeof(double))) == NULL || (y=(double *) malloc(TRlgth*sizeof(double))) == NULL) { fprintf(stderr,"out of memory, TR #%d\n",TRCount); exit(1); } tpp = TR; for(i=0; tpp != NULL; i++) { x[i] = tpp->tplong; y[i] = tpp->tplat; tpl = tpp; tpp = tpp->tpnext; free(tpl); } ptro = SHPCreateObject(TRTYPE,TRCount,0,NULL,NULL,TRlgth,x,y,NULL,NULL); entno = SHPWriteObject(SHPFile,-1,ptro); SHPDestroyObject(ptro); free(x); free(y); if (DBFWriteStringAttribute(DBFFile,TRCount,TRDateField,TR->tpdate) == 0) { fprintf(stderr,"failed to write .dbf field, TR #%d\n",TRCount); exit(1); } TRCount++; } void transTRs() { TPLIST curr, prev; if ((TRDateField=DBFAddField(DBFFile,"date",FTString,TRDATEWD,0)) == -1) { fprintf(stderr,"failed to add .dbf field\n"); exit(1); } do { if ((TR=curr=(TPLIST) malloc(sizeof(TPDATA))) == NULL) { fprintf(stderr,"out of memory!"); exit(1); } TRlgth = 0; do { if (badTP(curr)) { fprintf(stderr,"invalid TP in TR: %s\n",Buffer); exit(1); } TRlgth++; prev = curr; if ((curr=(TPLIST) malloc(sizeof(TPDATA))) == NULL) { fprintf(stderr,"out of memory!"); exit(1); } prev->tpnext = curr; } while (getline(0) && Buffer[0]); free(curr); prev->tpnext = NULL; saveTR(); } while (getline(1)); } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr,"Usage: gpstr2shp BASENAME\n"); exit(1); } if (badheader()) exit(1); if (! getline(1)) { fprintf(stderr,"no data found\n"); exit(1); } if ((DBFFile=DBFCreate(argv[1])) == NULL) { fprintf(stderr,"cannot open %s for writing as .dbf\n",argv[1]); exit(1); } switch (Buffer[0]) { case 'W': if ((SHPFile=SHPCreate(argv[1],WPTYPE)) == NULL) { fprintf(stderr,"cannot open %s for writing\n",argv[1]); exit(1); } transWPs(); break; case 'R': if ((SHPFile=SHPCreate(argv[1],RTTYPE)) == NULL) { fprintf(stderr,"cannot open %s for writing\n",argv[1]); exit(1); } transRTs(); break; case 'T': if ((SHPFile=SHPCreate(argv[1],TRTYPE)) == NULL) { fprintf(stderr,"cannot open %s for writing\n",argv[1]); exit(1); } transTRs(); break; default: fprintf(stderr,"bad line: %s\n",Buffer); exit(1); } SHPClose(SHPFile); DBFClose(DBFFile); exit(0); } gpsmanshp_1.2.3/Makefile0000644000175000017500000000522112224327576013363 0ustar migmig# Makefile for gpsmanshp.c (Tcl 8.4 except 8.4.4) # # A layer for writing GPS data to Shapefile format files # using shapelib from Tcl, as a Tcl package # # This program was developed for use with # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2003-2013 Miguel Filgueiras (migfilg@t-online.de) # # 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. # VERSION = 1.2.3 TCLVERSION = 8.4 INSTALLDIR = /usr/lib/tcl$(TCLVERSION) CFLAGS = -Wall -fPIC -c -I/usr/include/tcl$(TCLVERSION) LINKOPT = -lshp -ltcl$(TCLVERSION) gpsmanshp.so: gpsmanshp.o $(CC) -shared -o gpsmanshp.so $(LINKOPT) gpsmanshp.o gpsmanshp.o: gpsmanshp.c $(CC) $(CFLAGS) gpsmanshp.c pkgIndex.tcl: gpsmanshp.so echo "pkg_mkIndex -lazy -verbose . gpsmanshp.so" | tclsh$(TCLVERSION) chmod 644 gpsmanshp.so pkgIndex.tcl install: pkgIndex.tcl -mkdir $(INSTALLDIR) cp gpsmanshp.so pkgIndex.tcl $(INSTALLDIR) clean: rm -f gpsmanshp.o gpsmanshp.so pkgIndex.tcl G*.aux G*.log www : GPSManSHP.tex hyperlatex GPSManSHP.tex chmod 644 gpsmanshp-www/GPSManSHP*.html # scp -p gpsmanshp-www/GPSManSHP*.html gpsmanshp@ssh:public_html distrib: GPSManSHP.tex gpsmanshp.c gpstr2shp.c Makefile -mkdir -m 755 gpsmanshp_$(VERSION) rm -fr gpsmanshp_$(VERSION)/* cp gpsmanshp.c gpstr2shp.c Makefile Makefile*[0-9] gpsmanshp_$(VERSION) chmod 644 gpsmanshp_$(VERSION)/* mkdir -m 755 gpsmanshp_$(VERSION)/doc pdflatex GPSManSHP.tex pdflatex GPSManSHP.tex cp GPSManSHP.pdf gpsmanshp_$(VERSION)/doc # hyperlatex GPSManSHP.tex # cp gpsmanshp-www/GPSManSHP*.html gpsmanshp-www/*.gif gpsmanshp-www/GPL.txt gpsmanshp_$(VERSION)/doc chmod 644 gpsmanshp_$(VERSION)/doc/* tar czvf gpsmanshp_$(VERSION).tgz gpsmanshp_$(VERSION) # zip -r gpsmanshp_$(VERSION).zip gpsmanshp_$(VERSION) # chmod 644 gpsmanshp_$(VERSION).tgz gpsmanshp_$(VERSION).zip chmod 644 gpsmanshp_$(VERSION).tgz # scp -p gpsmanshp-www/GPSManSHP*.html gpsmanshp_$(VERSION).tgz gpsmanshp_$(VERSION).zip gpsmanshp@ssh:public_html sha1sum gpsmanshp_$(VERSION).tgz > distrib/gpsmanshp_$(VERSION).tgz.sha1sum mv gpsmanshp_$(VERSION).tgz distrib gpsmanshp_1.2.3/doc/0000750000175000017500000000000012224332745012455 5ustar migmiggpsmanshp_1.2.3/doc/gpl-3_0.txt0000640000175000017500000010451312170760664014371 0ustar migmig 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 . gpsmanshp_1.2.3/doc/GPSManSHP.pdf0000640000175000017500000035114012224332745014615 0ustar migmig%PDF-1.5 % 3 0 obj << /Length 2328 /Filter /FlateDecode >> stream xڕXKsܸW̑SeA qlIll\l iXS$dy}96h~|n//|shkv$*. 'z8MǪ&*Ql|U@ۦDRjIt[wOmoӨzp<vUí}^FJG:r@XkӹI*v66At\4;P,Їѡ0ӎU`ϗW(ҩ*slj軶wq;*FeœoyS$#7"%XsZYqy W&M Qxt^nƜL r6xDV^G MKc Om"$fR,LDee/  @XInڡ@̪n9 /|>T[6:2o)76dvף|?0 6B5Q!͗$p,筎,mQ1%ku'15Q4"!ihi'"OTKN0) lF쀥]{9Hi*_⌅3C([cmWݡqTbRy0/ll5 c@z,LE^9Bډu5£Ocd" 5QoBJCy& lnJe 9c8M6!T@DcWVэMuTf*2:Iy=K*"T/I!xE@cB[f!Q3xan c=d?=LU +H,?b5NbH Nƈ0pOR';dž4d FRr^X9^CL{g^ W8@0fQ8>̌%uŀ 61I]'<񑕄{2r l0"C_ls$HԘ,4+Jo8`a 3aFZ(9Y,jOu[P[MYr(V$9(P}`?BCoѰƥbZb:nI^QZ$ɖIbbJ"2y<.oLl.ET6$,(daR?xgKЫhA f6pD*6Ϟ&EFəBKaCj/gJeh䊌뫣 Fn26aҹr+p-sn'22+Oȁ2Ǝ0+W+;?>|Y#(TJi4$Ԅ*(+"qBBR-~ JЄYy,;N9 JdWZ" Ab %U gR]K6Ht}F~wSGt.hTvCJo0΃:)K{)9u[TIe^E_ɃVloq@+csgPV8 H U6R$<8YZχl nii$,J6 IvgX|v0m}ǕŸ|{$>•k!+G~~Ê-\,n 7/, ex w_9uIl)ݗ}z Ŗ{R[F 6|w,)Rj|2Mק[r TfzĶ 6屆5 ~l+֫.56H4*(PÜDZMzWAo endstream endobj 15 0 obj << /Length 1614 /Filter /FlateDecode >> stream xXM6W(k>CIvd1&MEj%W.;Cdɑco==Fp^̟sYZ9ch}ް |Fh"в\c[eMV܎mgF> ~3 p?6T#!QZey0XMke͇h kڜ2f>:fVSA[i~sp4qK*]^Og2Lb t^~/q(!QܶY"U;IM )4}|2S[@ EPeO;Gd,Dw~p$H ȹ4[ljŕ.`WRl-PQ 檝/;3 qٷ g\y*Y4G]UE"o5x&lFݍhm fjo'd :ЧiCvA>JN/բ?eUiـk Jjc j8QߋqYe!c@cU>OYhw;sJOkunxȌ11ep= I_l'D{PBZP8yRIc=^dISxVX!;zD6=y\fS5.2[ _NV·is{'=¢6E߷'06aZg pXE>,6)f@DF_p+PLU(C$W8`xР{"f(EeY!?r:K,mvtP0@qXT}.MfQ64fK'qew_*YJb٧ˌLM3d;sWVcrOPRЫT|=ssx{~E5wWWoT`/:VZzSw8 ௑>aW>wQQ}sBB=|<2;ilE#w,*+vn&WnY`+d%yEi _gp !:t_PPWW9F̛EQ?PF{ ,L #<@$gb'<#$p7mp$}6͐p)8.+8X.9"!}h/mU$-}K3_:D3PGL$tNٜ~?܏m[jQ)n`qXvC-w]:𢅍[k)=[I= AF|a\nENʹ3/j|~H1#w x (3g8Zv[2w&ýޝ|d1Um‰.F0ՁmF34Լ,[O=¶T$@?f> stream xXKo8W(*R =6vEb݃bѶHrpzEn6E45 yp~Y?{q!Kb]bIzaXg?׿~<˲Oz dN4jjxx剈hE05ӅGTi5˕RFNvy綢qsk]": Mۼ*]+<cmfű%<'bUejߤ%MJ;h˿^--H|o,?A!R~c;. ,ߌFԐx:5M;-&+{O3ŚVw@sȍz`J7I:"-^1`wZBf+(>-wd e&.L#h x$NsyNVFWSk3o&syc"{Tx|]k(wW߼spyyyu}z}v>~ⲳi)^lP*`{E;>mT> K4d?RL?P!dx#3.r]r@虂}h#CJύE<<CHέHVmzL`nO "c)!_NUCl/te 5 {*Nii`1/ !A39PxW7ݫ鐔yҴwijAzwУ=x0EXY/)*#ty1&OK RXV ΜkS^ɑW")jnm=k77moڂ+ۼDgk8]*ccK>%NʼnG仢JO yS&OdrzV'29¥hs^<g47Fsz:]e?˲ueOk2)O| )M.H[^'n% UBOhIs̔d85(!U[L[(񁦳4DNvTI|d;K&N+ i;l(%Xs63ra;C%g s5~\2*,`@1uP|!1~Nr0v!:J 'Oo>k>UyZs!{+UV,{Ͼ endstream endobj 22 0 obj << /Length 2425 /Filter /FlateDecode >> stream xڭr8Б82qfvkT[9쁖 3%S/P$Mq6~l0rޭ2J8|u]ڲw/6/Ƿo/}t<&P'fmŊ*;YK*UȨX8 6Ƕu@=# ZZ:Y_eS˦N84z` GZ گ1QP͝L,u"(cxcN4Mוm bh7ˮmHbaJE(vM{z$H رJ?SiLp8w1`TXCc[q 4@!;nʻK`- FpP5aptpl;>*Q5:fjL5=QM“8y! 1(^Z#"`,1'ԄiOӿ.,Y[Vw"ϧe|/'uuhAOΈke/$QÍ|>K|=x;7ǻ-4Q,|5kUDw#Da2[`* 5Xv,8(ptiUIqBR#~<$~PH $ B%O1mA2/ %sŠv-A4c;~oc7Zn) ;D*n*k(aUNtҩjnVzޭ+CKϷ BYk|Scrdt8Nc>bGIQ#V$f- O,$-c EߺɊH ~_VFB^ E9PPYuƛ*rfuVMIa}Raʇ%PqHo]%knC⤍XjA=Es::VπH.hx${M[䣓!$k^cn]7\%VJ4M-pw !Bi7 _SC ]SU nLd~h\кMɩI(Z-)M> stream xڵYK۸WLDUYX 28ٚuyǵsH9!)۳(RfsM<~|hw?J*s}usw+of{}~uvE_J{u~fNMqJǖykc%*Q]Yl&YT4ܶ[Znfu힩aWs5$ .q6,&ut_/vH278a5*U87_,oٝ/clqj{bWڤWkmKIZh@imH%5]TsfnV}XqO}T>S[(?W7>h77UFyNM]R6T ;5Z'Dv/Iqt-ZjVgqiIm +fWrS"좶WGn,NE-aוߐUΝr0X/[1i"XQQm LoFv@ G Fe2RO8+Vp UR[0>=j.΂ߔu2b29`fv!A8 3SI6 W^>Cr';ZhFXד=$(pgӂ-mˮܲf[4Wgp~'{ۛy$z7@GVtt FGb4wu'-v9^ᒘM G>2< 38㣳%yNΆLt6O ?T2P̰8d[ \l i6Iʅ=1}oauyx F#mFsIFc  $,;1]ʘ0 -ۡ+(V}e9YMԩ#YPnUa T97%ĘK45BܔW";vIj8XBg2~hL#!,a}yz`w$8I2]2H`wRj$f#+=Ka`ɥ3E# EQf%boq4egDwyw~^$VG, .<*C\LSF?3A `Z`1p DRd})6;AƒA\!QO;?^LkfGȘv!v4B| NA;tB(qP6FD6? X1N8~dQڻ]!C;+?CJkk9p SL<\O2a\? %y;G]3od}xx8Zz"ϻBKȼMR0"]DwAܒ]-\;T>qTea@iHyr=ϴpRӮlf˦%~\*O 0tv3"U2gء`A6֚yJҨ?7r΀{RC SV0'Y.s'ō/҈<{*B2IX+Al/m4uԢj:I|&Tl8_N!%c d!(٧&K}|/ jVr)օf}`X%Ssad=P.RfRzº֏/;1H gكn»4_!E8d% fFez4@ZnCO@I)(ch1V7y.j0D 66̔5[ϗ `W}ITS|$Q֏|'i z9&D%(| Yz:wlv$XԽ!$[6hkPy{>={AiV]̼@nUP<"XJM qrsZdY)xT#K: El-i} 5IdRt'd E{PTKI:q .s9t4')D+[s0;ƖX iW~C_8 BXOreR ,ɯ^ܲ?TCAw@ێ1B.0>=r2JrZϊ@oԃ[0VNQ# @-cF< bC2LՓ| N!-Kr(S3j%؛fXxzgt_qm&LC>x,vn ZIJuw.-\4H:,%3w|2HK+pC7?2?|n^F4a. +k%-kk+ 5u]}Xk]{z2|}PQZ1,Cn'zxuu'2O'qb.C+xDLSU= F{\K9p.=\swC>Uڨ1\ -y{Y.+:!i5 .JȸrۻsRֻ/AukL9L$!JI1eCZ );1(Cnv~f5yæW4K*}}4[k V^B>WG3ERBH,=ˈ"@>v#!ݒ{ݒ?Gƹ&"S?qqo×Z§b7h"(c$$H84+0tuT,z&J % *$ g˗>wrsnLu@3wCsO6e!8#\,P)k0^ lXƛ7tuoFCi'@!GX ؖ ȵ)p$-˰ƐmNTh`$ BH9as̢5$onuiބ3*.`ݛv!\?,w/C9@iVL $`e|ʍe$ƞQ?F0@$D(99@}09}MR?%D fp!3|8uܪ[ٲu^ w=U&Hv 1K-2ԅĩRfA ttUNH8ږ\8֯ʃOǩx$/YbVKac)(t?Aw/hÞ-m?Y>Y{p2 <)-1ȞB/!5H?C^zp΋'ľ7mИ)sLL:iO[{ׁ̄"`F]Wng,彆x#W3Z 671~cV'6JG,4pR?2&ËwU endstream endobj 32 0 obj << /Length 1295 /Filter /FlateDecode >> stream xڝVKs6 WQҤH&u&MgL۴3;ח^;r$!>?/_J>Z',4I_e13Ls!*+&TG%__N r g3k2p[$zs4t8t`xm8Wm;T oQغ+f ]٬# &膩zb跐Lxw W*j~5-@DX"g.2akvBye8Uѭ+pG&!I1+uin*Z@@zTe"CL TC4\*xNh~pMl ,@ i0mQcj Ŧ)h%0kC6)@>QY,"Ǹ5J*>]NB#Y*ߝ_|:28\cPu0S\!Gª +CXU Ea՟s{[Y(rCn.gbłɅz^52}7Gѡ[\\;xkɪq7۴M2͡[kipg750 &θ/Ю*u2oL S`ԈGs@ŤZiޠ4 Ҝc)meE0`DSC y`:`̝bM:ni+`iQi\ smkm}mSmy7-YUsn"1X&>3Vj25a{%g]ޗG@j7gX RbY]Yߖ`/4u X(aaQ`D$ά]FƆ 5_;=F Bπ5pT.wп`PEp.…b POh\ SP \_]G#C4t@O%AO2?Q)2@.h&B"t vmk NDRsd2ed,_$ endstream endobj 43 0 obj << /Length1 1397 /Length2 5860 /Length3 0 /Length 6802 /Filter /FlateDecode >> stream xڍtT6aЍ )  0 " *)HJ4RJ{y}kzV&]y{-DC$EmS~ @xP+o;1aPD@(M B0@E$E%@ @GHJ`/= ha$"utB qܿy7j` ] ?RK9P||޼`7$/( xCQN> AxA_5^(n "x E~_ `4?v; ɋ+ 0{EBCݗp]`po'( {Ow>#6A HTD x;'_ }!hpwMu`/BxB??`CG( f_gP^?~7Ka1r*(}aG@Wf۪ dT9H7?G6?+  aH/A]} BkCV쿡&wo: V<_m"U>{](%{ PD< КsATYvAВgIes#`_<'a-R{xap:@ _YH_$D =~4oC >;icǭU<#ғ&"gWzA5_*vIz&[4*qw1 s.5q v{9vv:}ZpbU b,:h A)=N=v΀j #n mYA"gZ70><31l?+79"D7ȅnV׫D*#ʰ16ȵ1`JT D_˲52@SnH:#,1s{]&Yɫz{dB_!1jqѼct/B%Fw= R2 B8BSw6PZRAl&˽d8N+z!Frt8{Us["=*Y.!{igW74u*ϥN5k.I.}) 1q[C]?Ҝg| :2NVs&nm>ێR*qKᙜK 2]_YY>dN5MF>sq59ѶiYYTݧޒ** & L=X> ƊI&6~w5*{cCYs2CvlfmhKr>U *yÉ" 5^.!y>g?NԱҁVm6W)K-*gRLnޟZXZ`+b~}պb9_fZd\W5͛|}>@T@aqKJU6>~Nyd,K+3n}#f)٧4zDZ/^XX<"Z]lqlşY|7W\h]sP#h7yv Gkx.W*WK-8WNbKy@ }Vt;M.g.!65JK|5Xi.d .$D(cmwԫSjA;ɭK']S\۱vS0ix 3=7ǖrEU GRHg➲s~[t6[hiS }ppvaGms;RU#iJ-Z?Rv޶<3:qb.[4 \ٚeWOR7-7{x;Q>M8%.ʝ]+_G@4?)&~%Xv^VKaAKp֚Ef 5KAASŶɳKՓ~;s߸ בv!oGB0I+eZһ?gh]W,r#kr4[dˇ7G77,-`vn Ak^mQ*6 z9/ƈrbˊ`i'iwѪ2yR9Y⥹аOKуKr=5 մ&(9ҞTC\"W6VfZ2~ɼL|?'d#Ĝ$ k;(gQ|EUW7Wd6)t2?Ǿ{ELY;T3*n.x +>^(z^EBX~-?fNBRΒelRFG><Hi* ZCmh\Z{jca!wU[]%LwGii ꥌ<_ZBrcp#iE-.P 4qҌFZi>6ߠ*&0R-#G4 xDCT˴bޠB4BЩlrD2z8i~*oy>I0yYƩR}2UF!{v%57w\,K 1cS}iS`n|̹s9).m;XtvN!V,diܔp:Sm]kEdP<>~ An"g]3 nKIsWZMn8dqvT52@#oE6TCǵ/t&Zȶl*T">qk~p3{ѺE^ iWj$G]?ﵙw^g8I]drn|6)cKc!+]V’YVLNm{uX~7RXd򈵅l T8dSA=>kŮ%ϕ-&1r ߵY69Q Y7@c6񡘐*qRNR\`Mǘ끢defLu6<9Gϩf?Fnh)b:NIl5p#ϵ=!>; [ucj~- \a]"؛ُ~0#JM̚ JB2O˗7jh}}(wݑrm_kABiLl=}12%2ӝ핬1LsMz+"K5./>?=͛YgG!f '! L[ȝZxPߛlM{5_G'LbP=o{ĕĹqOje꽷.jWQ pM"e񠧑u=8q"wfRg^\*[FŰ(ҝ(N=j7*N P߸`<p%X؜W[2$f.i']z8S}m*Ė)bVTȔش XO]&{w 6%EX\$״lP.]!j*;_MI"|G=6H\ڽoObRni4d}+N $Ǽ zxi1,{`} T $h%`14wX,]ݠfB^ɰ'v|j[e\ C n w.V4Y׭MBt Xj@og|!/A%kLfkrR1|]?pb4G:{8vX!YkR%hHO1»zHJ׷T} DK)^wxD)培=!kzN Jr=7\/xU.R 0bjpnfػc6bP^ "ɤ-0x=f": .'1 :٤B7z2$0vU )1cK+ݟ x(7ck>(w/`Vuf!N-4ANzvBo#G$vƶ#=someHzQnͬlYQʹHOD ,]沧MTꌦvY'8֭ {(D'S9S`B+UUn8Rz2v))bikgr:;B/Uw 9M}|\28(SLCn-3Csӆ@V#4LqQ{~AV]X2nZtO|v<3F.9xe1[*JMqYhq̆<9iLShS̔So.)ܾƻ^\tbrz_<ISGMݶg}fLq1c1jjSaiC&ĉ[. _@_O [ 58P a9/Vvy@[uEBݿΆ 0p@PTcx0@v` x9C #b$nJ5q:wIx~CF;pl8CߠiTspX⋋ 8Og% KFVX#1 pCr1l=(v0-L9$0hFMs8ZX[£+vxTMNjTqʪIK`EnSڰ?qثjlHcfWg_KΫ>k36$^ښ[33حȀcvz0{O/|37Õm K5n,P/M^\I%ى}(r>"e-Ib&p络: J og. >j[\ E~ h$1ȏh`AZFT=!Vk=I-f=^: z0f&)wkd_<4n)luAMDx '} ["Dg43'K_PPإ 4c@EK.؁)cSz}f2%P _јd//+*(h}GZӰ[ N.ʞ,҆@fy64m .?#UNmc;]$6&8\AFM󑏖v1$|@(IjT Zĺ`@\/zP7SS#%#5x;OPX #FУFg=>@0;Fږoˡr7NPBIS'h\}N{q$oO ҉\Mqӗ0zdgB 9vaI:c11R[U WS 1. ye -j(Gİ:zIpZE#s3=eY3!hFM% ㌯}KuhVc1]1kRaA2R;޷BaQJ;R^=Raٙ8ߨbS%KpY.6e}ic8`5m*x endstream endobj 45 0 obj << /Length1 1857 /Length2 11535 /Length3 0 /Length 12688 /Filter /FlateDecode >> stream xڍP-Cq{pw 8ݡHBq-^]w-=szϼ7I>_{oPٛY8X:vv.VvvNd ?vd- lo'[$t~:*\l\^A>Avv';!@W@ gorBw-,_/ޔ! g:@@gKKGS @ r–llnnn@['V{(3 l P9 3J@[Xi`n@b^R\@Kw@dW_̀O(3hjjoY6 33hgG % M^W_vpvbu2/,eg&iok svBc`=\k;{7; s4\4. ٷǼY<|#njG ПN?/|/4@>`sp|~w7BM& _ C=qEafv6yl2LS)!abpp88|< V (kgnʠ{mAE ga7}^?SGw"i?@[/zvq~ E Pm_ -aoc>YgˆYs`'i;Lljs /mv {'|/;gj8՟.JwK);S{?v@/xq,OmX_R/|?n&/`8l2".Hl"^?H_Ri_`ɴC3tAM4ͅƓ@+՚ x~nJS3@KM#6ŷ  շ U Ks:]\5 7? 싴c(:V:;y. |SAo R( n΅]H}v8N$]R/0xBR"Bcig\\.^V"ɡ8>W&tV7+]/0K.|d7Dff-i|o\CP,lZpwbWu Jh9z)#Yf`SG{E-aHB̅`V͗_ke#kOٯ_cS AR|]& ?XĝJ Db#8#"De~[nX:)ZzŗN?I&(il: 3mkm*xn4 RX|xMTxxEl,zCEv/Vr"o3qܧ;WKN#>PdDz]|3YlST4J)2Li$ab$u,$|׉ 56WwW_#^p|d `Gn[:t(hOTh3{ S^WE!DȴSz6)W'~jƊ 2>K]i>ˤcK-l-F~vϭ"ҤX'8N#&Q tVO* ;SMnUK@H~.2d~N迫PĚ1+B{CzF[,>ʍz%_tKU9<6LTx3 \ۧ~Ѽ ]b˰Ș^Qw'؂&|Kы)SEDPrBrLȣ$r߻ gm(Po'N{n^"+>i*PHNs.8(>&}K1Ԁ4N|J{'7N8l+e`TFhשmC]1=uU fvٕ~9^S,1 ((?{((+&sTX{`8_Nɗ)>{|rCu~;՘m( WN%Rm.ꅼeœR7$kJ)S$ҹgQ?}b̦:`cï+wÂTV3{"E4D"p0 J³Ik*xJ *:C&Y7>G 4 ʜ?6Jӵ,6_VԹ ZiG h3Z)@O w.Uȝ.L86fW[uŦ Na xrz_]GBvĴÕn#q*' lb(yPß1G#h? <࿮|RcKp9;SU76'7p⡋68T!s/T 1FX`!bD.pk@ҥ.uR Lfe5/K߶)*kVuKR%n>Mcᒳ\0\iu2ïF"h2|dyB4k'~_"廌 il@c)f\}I iy)VlihAi"ZdO*mE&[া~sfe6.߼ $\62!{]55$9z7v;ϼݖ8jY^ɧԫ!~CD7W1VEYć40Zϋd6\Č@j}~iPQC? |/_>@™Zk_ I4.zƚ|<8')&*kuq`-T@RKpcJ+'GEOÌ=CFs4 hM0b\;7x;"6Q]#MrVe:jTnM7g!" #blD7i?Yy7 $7d)5@J- MZRw,ƒ։"IQ,]Џ?靔nIa]Lv'=RaNB1iÂo Oρ_&B7ef3T | ÿ.<ar)՚~?, -lt"v|e rq NMFYGv;qK|%39xš )Gq_BrLC,Uh*l-`I; 0y{iv3X Q!p֊9Wxzݞed\ü QinUð\_}FuNi}{@"0t0䩉\3?+%6Wg~h+G, Iب8^h"J)m:8 gjRJ5݄ CFy6)J12;E4QokIiexCke'rqzte6(E2A] ]ǶErlnHuAF{P7$Krp43nZԴvxTܢ}BU+ FN/[ϼRCo(4 /2I% b.OW{5VO׫4h*4l$M!,В1 7l^g>f;}7!5-YW-Q*y GSLtǼFlK^#'l?vk}&&ANϗ^W`'ŵk)-LgXVi29_]L~ccUlן/uEcU27iQBɏ/Ms=wjhO.Tt#sߠl1Z)IˢڢɐVh•վGNU /{ΐnj$6"AQ _I_7dnNںKXe65I&Zm@]+cyjFTzTrcFx%CBY﫻`Y:JAX3|uӲnrM+eJ{?>l =wv(G+]/=+GCtjF4fh-~&{ӥٞ׹ߕ2Bsec]ݲuͼNx&6 _Xϐlv%tm\lmH8~H8~_?>PWg NE~ YNRq[ 5Pc}ϢBMsHFN]/IbCs̚?|JI/sSvG3ߜo)[oNWVk"<,ڻ_FJyM| 3uN26hIJcpcft^EsM½j=bKqdu_%/K} M`ewgi~z53}m3a趭#=qxFI]{hw%g]e5W6J*:r,յ,„[/ս$0`}}ț5~C'/r!A|q>_&v5*-q^g+fhf7\V+^Z2\$F8z'GK=یԟ)DY-$xev$tcpt|ҏBBv@گ[llTyE5D\)O?6hVT F ~ExJE Z0RI$d|g*c.ۺFׯ_#kd<|MH˻%pO] À4sw%6ˡ\KV<п O?$1M_tL>k"懒ÜF7-xϧ oZEN^JW4v'mNQEAW: -.g\Z5gE0R= /ARotgѵ1U3\_JxRk`xTvkB FcpF= +h-m}BƫOP J52"L6`ۯZgSƱҍuQA`wY[h^сj{ӊym8xTC{Bi qWݓ2fMW $4d+kq̩v]xd oiW{p pWSMrͰ@01)Fœ.^#$ BǼZ-s3qh= xfMGYjG+Rqɐf~2[;E욂Fc~/N@K$lĒ &u˪fϘX}&[,Gz&eRN˨K4p'Hd8h TEC=F^;9B^Β>۝&Dx< zuWoZ%{m&ٓX4m[lǯGP? 42$d|o,8~OҪyS u=xO:#Q+NzB\.x~ |[q]P$A!j.{QדSJB ~wgfm?Zщo_hMg_"6i4Wٙ?&b z/ ih^]MKW3}`Dy.TڎcY}Ai\_PFc5vF [nWs8[D` ];]-Z]L높4Le@7\qښhn4[PYoݢ;sH>ԯ^>X{VL<)T(e;/;ӷVwEVJdA<$Y mZ^l-x,}=i~o9Ed%ٺkcY9?V@.1{9\0m 瓫B^׾,ZLs7ig~¯ #bdBT5LQ7ds\{ C/0s$?&ԕ{70H8PZ=:`{*Xj1YAǗr<]؂0߈!z|[ӣu6W`Tutчk:ÖJɗĮ{Kܠx'Y/9 |!_~JAOuLf(o%E'Z)$zU dW+@|^ʨdH^VlDn0N¤iqBTr<$ỂQk`ߛ}I21 6`m҈5yڐYZgTky;baw?k)Jdծ۳ ӓ.)>UwMZeOC ᧌l& ]oaGa748+1(7n)UhZX 3t4+8iX\*ad0Μ8ڕ@Cc8p<33i?;X֡y>bރO-x=8(m95Y;[ T,DQb"lT' {<" T%hZ 2Ƅ?8nc&@YCLj{n[訁gЫ;~  Lp9]V9u2VZͫaQT &mΞ`'{e˛E튭%&͏Dta*rv >*g^b`pL8uDױX؄#+`#qz"]PW7"B!u&1|4S,2ω{P@ξ8j¹v wn7#,klE6f!ZYpCa: 5\/Ea# %(:@jTs͙1W Txs"؁q8HOMuL9UoX -erNC$epamWUMit{'_RWK͘))"~)4<vsUJ&Mc1-1sMi5SE817!j$́<0`qhjq9gPQT_DX&AMh :"C ֹMGw#F*S4;2TYfc)ͦ׌uxs +"w9 ;,9b%:<ʼD<&&p 埶7FoK8OٍtOtNjW_['"K1\ʯZYz{EM}PJ3q^}vvb=}"\evu23)*uKjlVg.s+/uBIc"L\cX-[ Frp׸'RF%H6 *` ڋP>ٔ@H3$gF{ϲ}*F$J!88L|vjVDt&4} YVz1~$̋RAO ZqAxVX2JcNՓٚ/%C>81|)û¶(K  JQެ9&vn)S`F%Wod,sdKz,*fg"o-?#'@X*t%W%R`t(<ݰ@Y['F e^)yɿ2)5雽M\wzfH)O襎_7c:W{la8gea}HM9,6wWnzs@Ni&(=DOL?|98 o&1$aϡ_iְ$Վ|cʔ_|Mxgԟr-d8 UA Շ⨜7X҇4kKtPv9qȉҨ?Kcm+?%˘d^ۘ?4=n (@Iꏢ93|EEhae$D(mfFš}DWKBW*㑝❡Hkcrӕ<'AfNP: DR lf&;#b=/H2ןw %75%f ɷbv1IP Ǩ85}B9?eNx5v MܜOIZpJ,ޢcq9-45ni3܇%A}_ }M7xsjFrD9~Gib`GL jAl?an]]4XU%)ޗ F 17Of:پEPD%m.;d>u?R iyEʿqLKj *:K( U_7: G 0S){7$$LuZ \)L>^x 3vzlЩ{GƠ:66^t5ne; s+*Hpy4<Ȱ@#m)ۯG$_LNG,=-F96@aǞ;<||ǁQ1G=6$4=:w|MYĮ'p ٪b$Q?!F_G9>֪Î{ Uyǵw'z>3i1=K`cR' ^6O3eԆm.1̄z`:Rk-{n [$I`V)4w)Ga?? ;ZW(]+~Z@03,ZMƅh)XSww#Dl7C ٿ&@`;1%P&3*&0K^,&T`4gѲ,cZ{pց #6 !jwfS/>M$Pdh2>)@z9f{DLHWAKۓ0oqr?io+cRQWnhttwߌaAoI{um*G8rSW۷6*EQGqNshMyjVӇ>F#Cicg6ȱⓂ\1Zkh>w ΀fª"0Y)Y;lw xQB>}-i/+i0M L9#]d(#!Dz֏rÚ~jj<64FE>!Cutlb\wэ?)U9$޴}\D_^}ٌqGV<Ε殣puNۺrDq~?J=(zl-w7O\L "_ӹEh5Ÿqɠ#,e-C0mxO8FHbBE@!a]U,nU07;7K!'pN=q5Ӄ?Z'K`RK+xް04}4#"v7D4J4{Yay5]Ă:Q] 8!zh~ T9x@g1{RL.dgTٿ"?ǛAtC/G/uHg\ Ӛ>U>h mJz67~k(+V-Y:C9H% AMF%]#p y+=#Z+XLM㹼o?)3K%]JT dR o_>x?꘼׏b6SJLKa⛂g۳9eyEͬ{q@;]Yѕ!1jdVV\)O}-W){|hA#]/Y!|Z.K8 ˬ͑ %h`s`W\E{.0Q~~K"W^Ws̰F0b :]Jj9>W 1Sa˲?QU~0aԓf/jg"0wfц.⭸ d[O( .LQu#`&&kki_K; _BϯFTe+Ok3xgŎ>=Ӹ_:rʃ,{&/|JgA a Qn,0,szLbl;oB{.eIft!WƷ&VH7G@SP2^wP{LDh*ΐǣ?}+ƼZ-iNg ͹`NIaFvCݭtv$62V <94{,LbǂWA+z'[ë͙:/K8@Ȋ_}6{iレcYgHL'ǎ-47v-KݎYM % D__WQ;+͍1h|a&[_ endstream endobj 47 0 obj << /Length1 2577 /Length2 21694 /Length3 0 /Length 23165 /Filter /FlateDecode >> stream xڌP\wXpw иk  ݂]w۟{=k톂DQ^(noBSff01201SPZS-x0qdF. ;9{; `ab@ :S;x:Y[@eB ` d t41XmAMl*&@pqqadtwwg0ufw2秦[X@'7)ூF*cZX:#W7sq7r@K3Hvc@7fF&&Fvv3K @A\Å`dg=dwFq!%s6qtpqfpDƿh@]3ڹ8vO&kmgn/035SWF5;KGW& o9 :&ѫz:V2%U`04ཝ܀'WESK17;H 4da3@ejog2 IJSuoz6&= ;%=/*YRvfj5?uTjF2@{uؙL@?]_,ow[MGmdkih]]@Bt8,4tZ)#3o--=.&*;[uA?:Ё3](ΠY37౰s.@w?B@ Ҽ 'OmBg(v5R齗]a26n{ޯnQ.x5|nWj}y6Um_?'#WyqQh딦vtBVEw/] UګAx.R ,1Μ!v'A;@A˚x#=b-d0V܅KCq6:[x?I{`u`ѣ8 .y=>Kzr]coRNv"%N|MI#fUAK 5pLxV*`{ 0eqT6<2@r?8Q$/@`L#f“N U2ޥxO et!3I l=oEù|,ꂍ;^[0qgy>aF(UNXhJ%Z`lp)fh'lOŋA6)݅p O[eea_T9?|PrVH/۞3&;Qv#mFP=UNW*%JAY$/sgIoQ:@McKm=;Čk_)2V ڇ/^UTsɼ6.Lm&-bkGB~ YHHj޴.TLP>;8&ige?Pfb)HYv/n@!3GbִD`~Z8e|7)xYw5:P I"B4`MQ#`mQb F'](+|AD|BFbZ'RC7't G o|gٟ6*`q 8 Ft;<ؘ>LK[FAHmnuqe>`}JSyeU/RQ;5{C4gBDxҲǦFnp'Ւ[}VW9gǴAXv)' T>ͱ0{ wrN#ex:%ð*s8LM-1"m&-,s 9\2EiF=CJ౼>{S h86q?+3<(n*\9K׺k\jYVB7 <,jw[Y.JN]?Aﵑg4/+Ohxs9ȚNWn03F ~@ OrCm Wm Ӡ:k c@tg0 *Zv! {t.Bk_]w1m,l RAۦ%]W#ű|BB8#n6~5k.S.X Е(xLc\v3#5%$Y0 psͅYȵ4AhA-Oe=R*ñ ]C'M%!)twE).V9Feڜ$pu~@E$hӈ>ulpJ{Dx{N5\?EoZ1Ĕ:?,1q:0jPiXF$#I.rpF$ M]/fpBiפ%R!Rj*HvWnZlL5X o^lM#4bUx!Vky X\ pœ~O]| H"b!}J}?PKcIXY?QnW!;-k<'9 &4 B#fj|`asG+B#e8Cu_ 8V6~%U(BG[c,4,T NUJ)]Tźחܚ燪PɷpFW*8?ih9}j  ">+>^Ï_Fw͡HFR6i+ H-mP%etSs}xζD=Т]1{A?hg`!-K$_+d|Ei3 <=8EHxjŃAy<qR ~cxBi؆NXٽ[dH6!s=<{-tRVk-I]ҙ2{v{R~NVᗫgFT%Jt.:?%yɹ80>=zVR[6 XjG) * tyd/heԲUAn읮`àm@i/~b_!]7L8=A0T3L-Q eE* haIBp)j`,R󶋐<,]RD:AȊ9F\7h(CɓbݫUM 6Jxe3]3 .xaTp)oxv\ k1<Ũ$Fx[0W &XR6{/nq5FV9^> 8](1,BEGWaC`-N[hCu1@KVeugxP,K&Ulj7TFv.PLHJ<>|@2 &;[<+CoR VtLQxiTJ?@@v5ӂj<*kQEiSԒ(%↌"Ѓ,z"1Eˏ8,*i93fjC|UU΄urM*2_i՗jqtFm)w*ޠN!nv3ŃtkJY*H<=۶y.fh1yC%OȽb4eHJ?Q8M*QZLy fXSCI!J!`vjlD,BA vx+ϵ?rkVɗ`JQV(E,S>ɄK3*H7 =vzXDb0imbcFXiB)eYC[s33r읐 -Vrqh_!pH04}s2i*ıӏeMo.Y%zϒG2C!ox@(8 _G/u-$]R["ZmҤ׶>(Oy՟MY?Tjm bHcϰ~#^\ 4~nRf8Jyq e@Sm]|&EԺ=h^%n s߰\95~K s](4Y99cq?܃t-/{tQ+䎔P1PІky@Ne4Bћ[eS"5@ *}i :Eo*pep?ʔi︛W 8 )Ef]TˤǂaZT| @;kk  7rvUDZ/bz٩CyOg2bäӵaR_h0_FBhW:?}'Z*Rk2?43Z/=׋TZ> H>d~&ɢV,6p=( HQ;C+?ȿJR\!Iz-"?x[d-ygW1m}PS(Id/) 'rײQ,>ԙ %}iDڲVXe7I9n*xZ_Vp*eƋN =}6UY.񚿩TX 9| fُRMTIE/(oEͧaa#;/}B|dU xJlۊzXϢUX>ԙ6.?KgaU\b/,i|_FAڎqF?, U- 9 ~3<2~;DCĩW˫ S2!cX/<K%Kx X =šFʮbXPepV#v⤤"g7vщ֎0}0\^ڐYh.X(~AXomW -z:O}"|ghyHl?m×CE꣢ VU@RNQ}G)V ɯ}!}J_2".!P{*MH:M9#DqIa2&xb?1ޯDCm];`"Jv?wGvF-tD> }zgzQk}'ǫ)I|GxE5GmL@R\1ɳOS<ݪ\o .kiN4͕`p%OO]2 fp*Cz*{L+ %$;9wp>{bx% Wy|\WK8;\Co`ai 7G' _jVtut#$ߍVU-~h*Ah"ңX.y3^jU#Q(Gb=lrւ_vߚ =P)a>crD"'xLŲ/ŸIHC:+:'8I7۫2L-T]l!G^RN%X 2EP'—WS먜R4-?bvb^G|ҙe}, :r|_5- DJQ[Ht\-&T7[ ½j1.T$YR4,|cw ?fm -Ӷv;iiN# /RNE]9IIzymV! >n˴,-ASzP**?n6Ak"ZJ]9DY7tQ)Kkr"V5Vz+"!~O![zTY3O?t," ӣWڲHEN@ts# me_Sdc3O'X*2NΞM Xq(-b,t:nz×N-VW[J,JVĺaVx?.9~TYn+ZV,B=όI7M9XhE]`O4mdc̣9̺q;4[)e#OpM{88;f J;NhA<сg_iG9&J^%yZw鶏,ܱJ6nKT5$ C^Q,=nd'hTҭT.`t0CBQ).}!&|0&2Qf/` 2$+1ҧ2`)H$kD!ɻl<ٞ pςXl#66孝 a/q)VYN)']Wӹw_L [F[}kT&9 QAA"9W2/V+.{EŨܭO%;o_sgm]1pM.5ZZΪT-%D˙㭫7K+B1\U὚`AE"Xy*waWi,G]+> "6 ^i) f}TXC;@th(|-b{Lܷp u1E{܀j5\^j@?X?j߭ ajdwB $ '>yp {v@jK̀Y Ȝ%:οMb&i)1*lUN+FbD$NoC~m1 &AY* Y`U7?$2Tb:̇W<à@9^7Z3;c: ̉Uz}=o98H48Xci3ynNG$!Ì<<oJse#FͪPz\(&˿oDrPFbZ8/wVJY+Ri\iy qO1Ge\REv2uGik5I9G_puЕ)*tzڡTZMpP-0ʘ}sqYt'  s`eCcqk- !_r+|BWR&o(?26b_vH=v'r0vP$.9)V㾼2pqMYr,ꦋ頥QyŰ70\5&! gP5\PooH^'7)ǩ <8bqf' _U9]lm4RhG)+ h6qi׽2%/x#c)~毜:߲MYxZx:yYHT@r$]: 5c]^[xZnb}2S m)M'ϣ;$羲hft{oyl]^@1jhN$R?4N!sӞjE!TlL$04pe?b>dJg[E-}YAOٽE^Z҂ ַQgv$+AWC2`c+cl(ngiՉ{R7?xqN$ dܓh/W _u?i'o8I-JUtj?a jLⴂ Y\sYu-#}CA6⹉'25`Ti7MQ sTYt1VāFnsI"TwcȊûyR>/L6 mtu SAA}S{6>&}&4&v~ǥMaqs Z(.;ej&ר@=RYvԷK_$za,/xbXdÇ|mgW`g.!өlQa7.DH"]yL/=[0[Œ!8;!QB%67*9#,(<4HY]Q;1RRo}gugRȀ"k 7En{C%u9LWp=s(])cw(IZ?ML3j_<z: Lct4ޡ-ӑ!WV ɏ@LX^$;ffԷ 6,j/ hP@22?(puxFd4E9Fv=,'WlNkG+q) lRn13Y]E9(d`cy2ηOZEJj w5Z_ KOzof8oqa=~Z/ Cz^yo;J]5㡰aL5I8֫Ez+Sey\GO#4ҿ+Ay Ώ-~Ɗcp:"=VE@: a"P6U< K!$i͏{hH}WkCkAqZeaJljA*(4\bp߶FtuD”>gd>==")5$̡G|н͈.*2]rQ4Jc:[ abG!>:ccYxy~YpYf.߸( Pw="쇆N^Ԟ-D+cVQZ,1z*"ssok.wJ_~p̂@׏1 &sRsc.*n-T߫2Z~"vFph5՛f3bN |}N)1Es#MO}F;UE꛲&}*T%u4 $G5WXU_] GHUگ`<|~O[ ctOeDrůlN 8ɶC+8؂a;ޞC)zzf#׫KԌއZ"qd|?%Rrb7/٪P?$PD͓(+f*.Nd$*H]Uɞd2~Xg=}6n?jV>Ku$(K]N7-XB8  ͭ[ ́kԛT / ci/eG+j 0KBi=yPBj[wF+m- GvO0D!xD>7‡z*/T~w ?T-U ߂fG~\5UE5u3ǢH%H*޹G7Dz8w:1x,RhV^ʪr823*J MAe?7 `] 8xF؜IgSWi6~蕪 T7HE?]ꊔgjfekEzufd`TE"H"; VgAg{Ɯf̧y^)өDYbH Olkhʠw[i"C˱5կCa2p )(4 Cw>}|gM_WSv:hp)f(tY;;A yxB$bJs2*e;s jgm9U|Xp**9{;W32Yۚ}UMΖ=S%@$OA)\V͂S'pu7Ez#.YsK2" Uoċ<[% %#R!1㲶o99QNd1OJpau37fJG܉B=b߃h`Aq֧UQ& Qdt: R +AV95qFܗ u$a\ǥWBP'gR [TkBvwczb 50jõݞևۨϿgyQp8O{  =y =5xCPhhJ924bշTPF A}j4yO27$UCR7{NUZ@TNaKw)bU/`HUWmZװf+-Z"U^ZԚ]*c EHtbeDLzLys4P=ĭUw7cb9gPyJaaf-b+%S5^ XT_t9 H5Սpb'Ri@yJ!tz!9P-6l@.K oFGMLn Ѯ2qj#֒ \cE=|b ^TgK5PՋNQzk\2`p[+}k/QD'c]uR {0oq%>_7ŽwWw )Z085Sn>9* u_)MZWa<1k-m:_ 8gUQYS-|ļ5P~ ni"w{NsEcoc.\ѷ7g[\x5GX>} J(H򍚙 "n=6noYt3emHy V m[Rn'n-MWcTЗq1Oہ&?ˢ5\rV5ИBR]\Zaalhtwt_k|n(,6.=#g򘑱ѡzRjp> F^Si9 L0QlQﱅ[wݾnHVGy8NXՉpT6SWЕUNFFx5H2f":J0D 񽔯ieO()a[0 W=15OME LE-O=4WXb譇 1%sub>/ (tjjeAt0WdzTZ. *~"5V HSx9sP%ȗy0G䨅7m/s| ^^|e˽%;+Jn>*je:̒0f@t8x]c4aDMmtdQ٫Gf!d̷;bJl2Dޝȕ y"\ǖL;i8=ch%!Ȃ݇zb4FCFhb ?}'>0m(=A&HX\2AS@x<ѣֱ\~uL; F qZځ:1:LFdx@$M2BǢڡ\ǝ/%Q͠1&D9!r6] j0?h4:8[!w?B~ܠ~]y u)[ WiS[؀~͡jslkyX;rEG5NBmWرTVEg]W$raUχ u_-g'T#9Jј\yCez-D=bQyh>/wkͼ#W:,i_ڂ}LR"E"33eDN('7 !Zo:,GJѷ2D+IK*OaLF:ظͅ^ eLkqiEUиhIͥݨ[NuLyE8md3yU73wo1a&aw3˗/md%榷m*Y"A/ߌy8pC B۰8 Ye{EG`f+0& khzܓ@y5mP$|R3s^Ȕ4N %ݿ~]#70&4{DsJÌz*+^a 1^JvټP )L<J^/u^6fی!(!?ɰH.DNu)zTi6Ჯv$M%ƍŞ#T GhG܄E!kxa|몜YNS$Fv^=LϼA̺5T 1Bg/O3#]ijSSzw#>])ǻW[*ܾ$,|Y}Њv;_7/#}hW^xmM7VSμ!v)d2!܎q&J+*rx"&H֊V)&e wMO~/v "V79H7Y*+Cӧo[ /߶eC(>ZTM:#f,Yj!2:{oƼ%RnIG|r5wYW ;nZ-2ņ𖾋-YoT/X i8<-V!q4AVˡ{5[n׬?\="Ҥ$SFR8"mƘ+-U-G੘ȍ^u@byRf2zsD ='n .,yFg+zY6Q̣u(b4W\jFJq7"XT`;p )zk]D~g~gM;Bb>.9Ls?*(qQc{Ϊ30$ L62:_X qQ;c]:u}o& &+8w>ArBYƣv%}sr fÅ0GN[0O҇IƾO$2<${9^ Ii_ގiir<p։/k us Lė2V{ wA^b׆BLy+l܍>42~LH-Mٜd_ NLDo)#3t=A =}W;rV9T +V5pFIodR\a!;ݑuN_ʋa &j$5ȕflG"P2hqv|>hK. QW`VOw}ޡ(,kں]*Y DuџjHN_dv7ɛ~쌝b!>mk !KEƪ?Yhe]0=9k郶C"W7!G*6d)t*L|pa=jgB#2 ߐo9fEaK0glfY1b>OU2|Y)0r7Ø(އy7mH̕+:i޽\>ZO\AzWo'7cS!y׵3-6e # mdX0&,:7gLqi|=^p5*%-LT~c*XZ (.\Wn*tRE H#nо[|,K4{TʉSϰ@e[FA4v AOC4i, Cqt/I*ȹCUo1qֻC~H{p?f`M}NP`vJZjmF=6l,v99>sqnE#%%YZ;&,?)bSci9 b|9T.BL4 |5 ^Bߤ &ouۄGǒU,:K$Z%+#\= #qc/R[6ʣJ4b^"Vf+vғdGQoA[z.GvΪ0-GUjĠnc>!*k0mVJl kOaKy`mpRacMWΝ񩎒eʗ-GSԛ5F9^NQg̒INGωJ&hLbi47h'͌Ɗ9(Bm)^ W05}oyfubPgoD+q47~3uk7Y3guϡn2Q]$"~[)2؁ISXJ50.0ˑ%`0Շ%G7AtI_?Gu9bS{^jh;N/Dh@]IR6>aRvˎd4fg]Qj<×WnOQibhC9YBa%\p4FTqqlόY!@cK.{Vsw-,A+U-kOߢHe$Ry=j5 DGs!CzA`Cg {ryW] ru{Zۓdh^2{ -P;Jn6AW Cc.}3 ݨ$~˴ ʨƓ w+R @ Y@(='* Ixv;.b õv3%\oןQIMfwRZDTǫ/.ٹ&V`¾MǦJ Bď*~^sXq^ن"wŪץ cm*Ԧ "FNK}>B4a-m|$XVwYBx۩οJ]+#mH2O2U{B_P\5be|첄wwF9i]-J((K.a~XSMtS~ [ME4*na{vW[1n"voo鍔;_x}@`:ްZ^Y7<%^ ȁ{8PS, /+v,Jƭ.DdyX.]}f˘!+gƓ"&#< SAs~? ۪ԥ-HKR_u]hP.-(i,I<6,_=Mݳ߉ nߣ;a|y㒂߈Pf<Ȩt X ՒN R wI hQ9ND3+ 젌<$F󕏻q':I"C1><37TeqPdol#=''AAT*Z)ZQT;pz3j[nZSwξX5O'ns( ;+=y#%PZ0j0j,_9V aԂ7T̸ =$GlG >oF;)E:#* _puK+M',OQAws y-p4Ż;E[$ũw7$ a%6Q$r`{̖tEI.mki|?f  p;aF0֍¹E7_ym0ǽmz᠀b 0t(oX^걠ae"K q<^Om4\1jEcj ,w,Q͔<۬6ڨWE!,?_68z S8fcN$Tr}@/.k9?IScj%&$X@֮ڲ5ª~.0scŪjl}8#cysg1>6P`nl+Ά')Br#c_]o6w0)o)grMu}Ecߨ߸» mgSA mɦ/,{&-z*k# uc柼1c<¤$=`rBOuAqxid4h$٩Rhx*QnB/9qosIO9q.؎$f0v7uS \~ QY3ɯw2re`LqmY-d{WВS.I7yAVn"R&9ބ"/pZfo`)B@B1Gfr}iPp[L.s%0 -^2S0HKP( B.L-gLb%KIqU7N¢;Iv>{- wzJz!h-,o g+pHӚf'f]+ ykHrRh=F1#X, 0-\ITw.r\*"ҟbqن|aSiH .VFb0yE1uo+u 466)jߩdFȿ]St?$pFuR;> ϶L< JK%~:<*.dՓC93هaW,uhO t&EAY;{09*b$ $zkK!2Ϛify$Ws+zg:BEo1zx[@FvZ;AdI(wCAQֽ1E4a]0Q]Z4yB r|C#ਆ2#Ip -Y ^0+N4؜;\$j2}gl:J,ǼB3aJ=Ih +KIvb^:~ ) Gj,yM]Zh<g:y4S`:O Wv-r !y!|" }uAE=Zm3-"pSN}EoӪ/z.ux$k,z?iFl QqkѨtSUn\c[˨'q? ~0M:D8 \5u9ͯv{S?{HE jy=Ȝa:,&R]`U.:9lw.Vkw(D2'k .{KOjȦBu4-m/KPKWgE*hMB <6G!VfrN)X*`#4 #%SLxcrrUDz1|NlP4g&RV,{hem A| %/P:ޔ~A*PSm Cr]0vˠe}5ɑF< yCB{մ__~ՋTh6eҊ#|Dz*kh15/t&Q?eK*匜fH>fJFK_v<AV"SqŽZp!${}OfBGM&<3X@GK1㺛пAr[Z :şJ}@$MSl!q Iy 0/|ct+N GC*eNχNDZcv\c-݈ݫ!fLyWт R|څ5nVf9fk~Ebe9o;Vtʈ3 S\'wUkx Y}^vѺ3?N4k /ilIW `V\t5@aMG+y > stream xڍTZ6L#!9t Rҝ3 CwwK7H -"  |x}k}ߚyssg̠-r?u¹x ]>~(c33C̆`*S?iBj>88 (Z{A@ +ͬ ;O-;OLLr 4`mz0$$p7q^^oookW4;w=0/00@3lfϸ<!`C'>h&?3 xG5Ax>p.5;lmέOta =x< ο-y8e%(H {`ޟ"}8v_?o A &@nP'XU񯔇?1{0 E`wցwA8b~0OpF||C?vˇA|fe^ W?/S9?˻B|1QQ*?֐GPj dž_]İ{MׇV|ssQUoz] ξ%L PAA- >hy HY0?r vWIVؚ'_n =`[W[Ǧ9jonYfQ6;3>?lC.ۅ2aG ftgNπ_Su]؋F^5bpܺ:v 1{i_y)4WLD- tvq~Up'$V1S0biq]%*WK(Pot=Zߣ )-4^'uD=6?lԒyJD5>aS%ͥ! CxUmGTƃK+ r,,#)jd#m2u h E"5Ŕ!G%6]_#imóR ٲo_gx3:w7㵿Lr|n:һ;rD`nm k(Rᤎ'k.!ANȔ[!Ъ3ܢ qÞW5}3|MRmP}/W_[,OK39 %zsғL㦸gM;3ځɷgGe@Ij{=y|\MĦZ)ώfK-ZI+;9?,GT/(qStF!qZff6 ߱ ޏP⾓5}}oG.E!o\\uBg؀<*^ t,1m(&4^h$5,s :ZL9!$!h4HPo 3:w^fmIoVb3KME7 7,Vnv S0!h'5S]Ne sf}fm 9Y"2:,dy(CCsYw/9b]tXń7UE0JE(ӌk΃)К~&c4Jk7GrMӖ;mVbdB< j>eSG&_GbA7~ 02vW)?JΕGzeѻp NyA~{oqeZ??o&4~Ȯ6zMKk;(u{H!tA]eYEƚɽI8cz/1Qda՞^B%DFBFWDZ{+<$C"7o҃e:PgڐXn9Pxm[DeKyist1/m'KU9o 8 a/~,J728r`f7ms9TS@KD$m5ٹZҠGvsڲtߤ%ݰDᡖ,dGK*P萱l,fk_̸ٲ"8Hli4KD:N׺k坰 2[4 E"}'؞R!?1zAK.5HLFOo˜sK;Dwwn lt^"|-b5ru!儏23- 8so6Sϟ fR~Xr}Vʢp_XHw۬M8:C`lzLɣEs:c ʵ4n@iNo4KuOpP`nĽq.ɑٴFN # __:Ye~-Ý[CSY<Wr@MZNzaa'_~H0_N5Bxw2p.)XjEsE~ʮ1b}s!/}L,z+Yk r((HkSy*ʀt1FaJMn4'[ڲH̫h6ŗU>['d: +{lzZקx!GE^pLn+I1Fhn1^ݰ"iq*IÍhT%kz[RA׺ۇUTOk3^z3|nm;JJ"8 \AV1r76 QЗp4 g{wબZL!4PF}5g^.sOrGi 8'5滗Ƨim:狷yICM!uBM؆Ybrqq_JCeܒ6 KX?\}nRR Zl/kjiҫR':o~͖MxkJs>@_ ͕>#{j&'Na߯J菶jP׫~@2OM`N5R|CNrqI;99t@8R0U]"uYƹݮ*_̜#|8/[jrI2&xp(etcpΒW|ER1-]bAշ h#o``e^cM7LA   TdDg_.yI_/M[/f>s=tl*ð/EI (T- JhHZ uHu CLPTY7ND(-:JY< W~mɵj,F(t>)=fO@ ׸3Cma-/Jb6z(~) c- (/~WlL`²;NWRסƥ'|]Pu~-n2MWRbBRߌ,}&'}B[ E I/Ҳc{kr{BS(ޡ|FaD~w/uIIE"U1&3mwR/ a<\1Tʛcd(T*L͋۹aع]_yT1xV@a4IWz7=QP&`GOh GNj<&?FM⊈iccvX0{>D7߄tA۸τbuxPzh(Bt=俤CS8~H7 ]iq;*.WaR qH'ehzBlVum`Kk\"(p $7Fho"1}[Ltdg_^qE͌:~RCO =%HՄu~ND{|i&g*j!x-k9 1 ξQYSzjUBPǮ3VOzB0VRӏ )P eǔK ܉% V]iu (3yv6a[D`ɞψko9D3!D]VS6;$Ү~hg:sDd='nzR\$o!cBNAw=n5' rh7Xtߘ5xkn*4:!|k>{0Mi4yUp%ҁvTi? b'y@0o}/v^T (H%(C^GGfNhVqv>iMK-EǦQCSn[YMdqml[$du5?)B0__gEIG>ΩLJo4- ӟh6TخX/ ŜRl)+4]ǁ_L> 3,D씆ESV`BwTZp"퇃Er/$}:$b G+vL?CG#+?B1m./5/?737 =wI41ܥugU5A#0~|j_q$~j},m(уBv1ΫJAtm|8"c1}7SdKʈb[[ 0g5"M/dZ;,D0})ryʸ5浭>RԔWg|D>lhTM`,<5: ,ƶ(ط㱔3q{NcLoKrS5bP>Xfj^\s4"n ˞Uw/~^] K'byio+FhS07Y0'kC;vrN[%D"7[OaЯ%tb*7>([Z8b%-]j Y̳:R1;|1K)hI1?-w›0X3@QBrqN)Dv,(}*'g37mV $w5nNC.MfΧlKsT9J_"8CA$Ɋƞ$8t6(LjXOWc,%Q.i Fo&~hj@8/}1>#JXs iO`߆Ft3(5USuP#\"^\ӂE^&/յw(m8%:D ~:]yd:HɵL-N|Ȭ]>NU9Y JNANuW,qH,=trQOol͵q?oU_^Fm~EO1CFPɘBN^mvLٚȧ\te߽49S#{M/_]; ULla;Ј)թ˹dˊq5┚/'` lZۣ#dw[KgIo[$q2x#\qR9$yPP4&iVt6o95A[^HO.̎xK>̚jj)Rn|w M( ':V"-4#ĦyC:+͉);/[E w3Xi~&dľH=Le(xuk=!tLSu&~ccqޗmEq2S%ʇpCW!LkZ (wKQZWxNH>q9esbUE߽"8)pz)x>4'T/s\'.|hڢhTsw`]rsk[I1 sO&~pFKC&UG5Q`JJ&O`&Ѧ.03]&"tm 0AU$5O-~'wA(&eN&]nڻ6OCe%;[06;^pЩX6;f= ڏa .ޫi@#8SĬ8p?>Q)NgD]0N3yWĴFq?{eV'«[~$۴|7_x>\E>DĜ0m'n( 5'I;WZ楽 jfȧ F؍O6.PqݔuXq[OUWWq;N vVWOU~e>D6+#h|Kgv Z0Gt=#:a( ׽{".YGPRR^k|NwZZJߣMD 5٘* yO$(r>*W7!F)R 5d} Y) x55^sҏEk:Ii~] 504xhSAo3cjIYR1C0N l&ׅ ѯj]2^M{NLnH#˘+YZhթk?MdNEW@r??E#aʹ|d]1i-2Y]2[l֮D(KB<. ]5H~c5;)5?C2yɆs0BD! ^U+U(7(؅݁6#:bJ9.luGD`. ǾOtG+kI eXn/eVg4^psQ0ckx>4S5ϝg @|#.KƮVIHeJz&Ul֞O>.sS޾xy>4 DQ$=I+a$)ޏ R6vN)QX2x t*-iⅬEA| )[M$Ļ͜Hf(23Xp<.LjNb,7ɮJ^%|L2z5`x:\RiVj֞NKm 6a}k^7t;ӷ@8JB*5"c›džuA A? vl0aˠHbI[IK8}Kf#De6TA 6CFjڢJ )4yjN+,!8v9B}V,o6NrբvN埻1BD7Kb_$乇K1.;x wza%&r?=^$i܉s_u+*= kj܆uD"onN.p(C],JoxP4O_C269"Zb* (VYeNEDlM{{l񂂫|ծCrT9&6F6Em~i5oePS妿'׺ A2 1ݛ#BHs6J{ZܤV*ʙqc /AH{ Y&k"dcw;L̊_Lf5AR%AonM/hs.Ho]mhjJdiCXrX̮|WWvȻ.GYb>K#"WQScn@aV4 7q/V Lyr ]Nyy#RSЈ ﳗ.z+kGɩ^2 C:p˭ŨV|\mU]}XIJ# rY?.$\ocD ,EOm>ꕿf,<~o3hҢ  [XwKa18O2gPV?Uݾ^f6#a3|jD7y<NV$(4TUYF~܁D/)ś 6x"p1=H c8nL6\x"Lv_-k h=}*襙q'-EVfC|ﳈr4b&*N~ |9M)IER@h;'H6$(O_iZȎ`2hp5:'7v41~%7QC%'9ǂI ja+  -I[Ue>mIcC'AjGFg ן_3(Yil?sVj ^ڕ$6JRXԩҕX|}ȶ.zUгmuaOjneMm%[6PrK_}mJp%Hˉ)<7w1-2%tT'H2?g;ؐ,{c#kbC#ec4jʏ˫8ЍQ^H>oQ}&S-6jWOgH\ j oQ\\txcj ߝeT,5˓FtTb2s7/R@<"9k%tn`;5#fJĻ!C73ļiuȔ[Ӟi1BEޫ.*f> stream xڍP-C kCpwwmn5@Bp ][xdf{Utm묳>5: (0yll,ll( ;_fj-3W&a\FVAv+h __~_x/b""V?cY^{zQf!!65!mUDۣBS) N+3VE? `-mJ][${>lC oh6݊2??Vp(ZGL̬nG+S:ѕC%ֽWڣpN[yIXi\̙.$H 8gWS8cdr (Gzkf58^^ Ox%yjb{4wBc>1f[.P|<Ȥ'Z|Sc, Q) "1`:9Yw=RyWު-dCR=.57*ex#}k@3nO*ͨ{Jv÷z G +^L.i y,/gW!YEA?S(遛QwBn ƒ|x8q5!FcʽY}=N %|t6G*^tƁnz%iay:sFb kj ^=1&Y{4^&.WWR^Ʋ9-=WBoˮ^^YAG&$T%9Ȅ¿$w1ij|c`(q1&IlYZͬ7j(.HJYBְd-ihqOmmx;:aFZ3!pS{FJf OQFDy>LkO2sNBlc&eƫ ׈|i/td5 >~.yl^;,)%>Kg-c 60]=C}DS,[ErR#e+vF=(Sg C9-`!?X;M~H"L# v1Dz|bIc&4yg4s_]-a5'-%yYjeټW6IO> MC U#tn]F8ܐ7^ T^єZI-f9f[8TȪr"=x;ƪ]OZ+Gwj@Kэg]w'0LCX/tfSTCWn%ȬU vh~Z/hx 6$ caJZ"bL.b]( s!!f$oʂ|2M lP`nv'b1RPIY-BLQ0ög:\t&8>/ m#RZI洚{37=2gHXz ֹsG w,Z6l8cl?}r4.<܊ҫh_Y:Bji"ݕ/Zw3o MpYxhmve "@ې=͞ũawJeߣ.?2 Iҗ2Ы$/[ 1̪/C]}soNU{ړ HH=++=Cm䭏R[2& Kͨ\(/T•b3c<C)&7R_(l.P d3[Gw:$쬂 ۘ:iM': ]%)˹RDEwnc݉ ǂv;sJgYDINrŨx2!Q] ٧xgs4ѽEm6Euԣr_*tEwT[˧},S%9I0y|VC+cs)1>t6piY b 'RJ6 Sc_I%\7hs~pY\ƅ%Sv Pdz+1f?-sB0TZ5ą Dnϸ"XFe2BM8w~V[ ]NrT~T<].BV*前GX h"VDSD,EٍRMp.2o?DND{V&d\2 K3vM[^/SMzyઍ; j䕌pbk=~lxN]!G m:Lk(Er @xWs72UBfNA/TOni7Z3o؋P`I"pP,fޥQgScۗ.l VT%]+;F k\+ZP,}#tc\4N2!6&iڕISd Pu#իN|n[(kL3mCʻgOQ"OWv9z3ZβGƗwh%jʳ䘌~g)@)M{ S)+&zfcS"bl ЫLCZ¤D.]%B%d77a M<\F!hxm&tCy@ғAZsc7;sw /4>I=pt B,ŶB^c 7P"V GˇK& BpMb8*|S;i'ȳo{:UŞ|w{D5@㚢rlJ:(ZؐL$WYGwRIYQ ێ`*YI, O4Rрp $Z';*/8o=.L\Uj/dc^N/o`B&EE[:s?Y!y@)'êB1M YUi:7drt}8 |Jtrcns7&?HJY7L$C>bXAB?lW4Oh<lI͵E15$h@n{솃~]Sva49UT}I!ʧa#Shr=.wM2,BK:}L˘ /| uk5G@": jU2Sڋn4uK q5%?@:Iz )A~ń+6T fQE}QE?UXOT.K'63ٱ)j?D `c?9/Bmt*\ [I4D T>xD ԽWBK<hR!B_0Q^D)~. GI`Y? Eu籺Qk9js\I4e]_Il3Ի*`3a5a* W=b)$>n|7t-vx誝2h~ڿEޗ,[a' xaKS|U[v(Bݵ\dt`k@ Uli8ŀp@mpfE)7m1Y,3M+s 2e[5rderi\v2jEDDz\_GYJleHOAs|v/VUM4o]& Rńk&OT0iq8*II,z3)+15!hFJBҫ%xN[C-/YgVV#S'$ҧ9eo⧽]=ĵB7jOmkX5أf_|RaqO;ǮhX+8jf'k%wvly߈!77`/߬͸^ h)\XvaCG ({@]sx¬H$pc?Gk231I&fXdI.YnsDǯwӮW󳋯~~(C k )qTv1ɪ?^YɅ KwcOpUf;@}I])k`^oU ́|ZIKܳxW ҵ^'#y˵^,TAD bMp 9^ahU{7){uSXjaԳoIΧQM<4H.sݘUv'"d^UmsDQ裚 )ڐal̃0_B3 \wn=mOoɖ/>tRLj}4t5,dT9X(E4$t{gKnGfĺZ7bxU>1qXt Y&vT%5Q&UOtԄϖm}cHa%XLصAq S>3ߐc ּ^ni|Lz:`mvX;wYzkh$}a{AQ!>7E&px$#3j;#zT  a'>[-UcKH(K@E!2\W2Ϫ vR槙Iy[ZMR"!>h I,`)$L{h_!t°Sɝ9- \M`I7}*u%9?s2;~n`S2=yX' vGOPR4pV9 4{˅Ծƣ$C(M|͏^8:*&<0262= UY~{Ų4zFޕOX1$[U0=ʚ!>J9W IN;[,Yz2+SԠ(lc2^D婸LFGٳT7Y$;%V=a3GNŠ~Ꮔ:LFʴx-Y/i^tAmk{>[׮L}I2αKq80&;Šg=J4zG0TsV ~O%82 cu:'({>FP8EI GWYj|rtr2DZO*9SXOeh?_efN> :7G ۂڴ}LW֭L9-?m##9~Czϥu$k.e4{e|򒡨OJo"--䍪'KJH\jRDs{ؗ )7mb1^\5Mɉlp3|= ˦AY~A,"87-ƣL>S]}|Q=DIa;8,yOf L+a_h(M{<ࡎ{ƵSusfF-\[}stہl%lRjuߊ~J,gsp#Ҋm|v/lg4b5UvjKC4ÐP1>(oYdv8C\h< $<Fd)í;Ey``XTΈfWGVB|?WY*?^T땪 OqooRAєۆCG# V`љsxQwdƂSSuƼh@@nZ)aP9HC(slNy8>Em AG (Py@ a:PV+t ~F׌HiO҇&k%¯ mmN{TEۨ®>}xt, pFFʘ;ʚ%|f^G io}Uyȩ`[qQM VOW BøTSfc ց]C< |{ݤ]>k[nO?C$+tQv%~Z&Neox۱:} Vpb<>V5t oM5돹?ƫdkxFuK cfFذb4RNFؠu^ 3зp,f3  SW(<-Z#E_3:4{Ę+b/ ӆj- Qdud1 4r6朘q>k8ˎ_KjfڃPJmo1'rc \<_mZF0a[Ye cٟrVNpdLlNxpp:f M#1Q*}בW %rO {#3,熸 2-m Ǜ(']Ld؏#[*%3&u|atz2j y4U? j8eOu:9"O*]Fk*OBB͏{ O,[t6Q ^hMqquXY]!*6͖BNmRBFSii pyI0A[6Ru)h;ЇȒ=g V#M ja",S)-Q4akRry*kjɳdI\HzxkSRh42aaZg*c9M8RkX5\rbv(muC;xdAS)3ⴻlSInwDjb5"" W_ qAՂ.deD[)|~n]0Z$-(Ty۝@Sـ?LD< h?m: qKn, = |^`_v>6J ՊS2gv4eL E&Se TmδΌ ѷN/Ȕ`}刊+1oy'\rC"z9cƤwMZl"̝XjZB=ʞ$%-i |5oWj*m`O7ۥwe$쭧9q\s7\a0a oU+-?<0D,D_Vven0M<[SZmT`3$.szKD"r)1yYcV0 }}X Tlf,lMFBTS~Mg/UE-%~~W%'2g! Wf άQ!" RVI oq  C}݅܋)YFhլ(d~n#}F]I 2Ya|{ABiXszF_zI+5h ;>G;tߠ\FY27 Ã2bn2L+&bͶŷ;4_\P7X-cQ?)9~99Ĩdh۩cLvQWogEF kKl#+41%Aq^:x[*P=vrSVSA{,MFj7{u]ɫ}ŞuT$l`?RN`uמ"gb.m냋戯vc:z#%2~Es8 '#w (/7$ NZޤI>Zf ڞZ❄ n'g+Ǎ=7|%gu?lOѾ2$V!m))p5<EY/;n`%͕5{%$lCᨠ5IW9n˟REmB#f<dAo'$қ= jZK0&᠏<_>K:M/; ;s|]T[c?W endstream endobj 53 0 obj << /Length1 1398 /Length2 6203 /Length3 0 /Length 7153 /Filter /FlateDecode >> stream xڍt4[.%z A A.z 1=] {5zwZY7{?o~w2p' P{$de5?(!aˮPhLBiauW((J$;EPHBV'bgBW{ x~5N (@n <= ,rBvҜ<wFn`/-71>BV=ևۢA0 @!` #}5 3Y௫+W"w0 yB`v[ VCyx /G Gǃ@( .;5B!!_ A_FΧAѷ0;Eՙqq)偆فQ1q {XJn m wآ)}!`7`_m@Q+Fhlg<0@ ge֖ <1PPM<+$ b￳oQ䯳 'C}wpK 'h5eϣ r2VbWz"4蹀!@\۪'Cf!HeF#{N:p$3  =k֎o=J.9AQyމ{5GChz[8W?EG#ղvE [ =`ؚpf n-¡Ei;ڐ8ړTN^D91^2geEı\rG/_8dg56&6]\Z덮5~~M@v(:kCb¿崈],92>Whn?DqI'vPj!W3J'Lbgw]#S2*zRI,rrVHw1%Ml[%û$y Gdn `9 koX)0"֛WrTK:@nAwto:?F~*^yKSˎC3b*3(#,I1+Xj|!نa鼙oo o,I׆=g।b~Rxuv|ĢoKSA`ϼ{dWoCM_DŽL.!B7p'3 Q, 5fKr8wb3~ghXNS^.Ա 3 R8#y>=\#&W'+/fG {DW17)'zCBl[RYyѓn^ź5D=|Y__MT N8VnK+ c(Qߑ";hd:`r145 h%8-L<ҌI1hl sod9::AI)>W*;~:]d?;[4SՐ.Yi;r.KPP%)1X("XAIC=A٩='q_ V.Hhú٭_]:"$2Vk=Pk!2םdylWߵ]Z?ep1gS@#̴eܘ >BDM BeMn>Ry{v3 2Ah99(LYivKe/wti o$Ζܯx3t+<#mǓs薲wzchQ${W]nFG;5Srf]5LOnFiiy{ye~}OO[\vƗ-\jHplֲĹSb#VL+}3لҨVi뎵-o ݢ-R(;;=XRrBW=is+VhtsMP/Ң QJqZBBFvAZFK䍈b9E+ &^QΝf-g3J7911osX!\кb2tbмvI̫x5+Geټ294Gw]G''AFgY7fC"G{]؃Rd;6\="J~9}s*Oem>tXH)4VE =A%;lϒ ) P}S0+`J5g4x=XRL6̄ް@κkDLARkܻQf7[|M}FHvk/uU4,.vsl>2o/m UrԏI.WM/s"HUQBiE9A. 5]+$;҉ĿH0T*ljCbhJCMV&_QXԳʨ\zs]{=pVUw4@߬>iu~bXeΩM6` Ëw$]CUI}:~(V]-uN$hbbؗ&c:v쓑aC(G%gk'jjvcJ,8-5[ɚ8hqHlxEӍY휢T:v{}'C/t}ئ{7X 97Ϩv":0fk3dΐI!8@(^phrjPx+햄[ͺrq`XE% *vj/Ϊ]FY7%8B;~ʈ|&~eV;D[U,x ذܜNKE*,hՈn\~~3,pM[tqr,e-bzL~dne[,4W-FIje:e)t#j(DtPP,Fa[qvxy?el-R P:1Vt`qһծ J݅52ʰ@(zirm{)2Y, [k]auQJ #5Wo9ت{|;={"=@`lE3uOPSr+Q`Cq>F-lX,3ʩi^C**=wo3WV*qkpGW|L2`"-Aa&uq˳Ҫ~׏18,Lsw*: UvfeА0"v./I4}{bh{\xrX.s}HMz3zוD 㤊1E-FiׯYqMlVvv^˚"1O՛ekÞ1;[E'\ S|7њkuW rlmQ)'[|Sqieߠ(f_ #`h(4凷^a3h 髎RΠ(I6MbFӶllb}}||b &UXV6]43L1(#p~QU!Ñ)u֙=;-{ \GX^ZCXi9pJ^J+Dҋȳ)PP[)O\ZOP2jG.6OIkkPeKW;vgp_"Jɽ@]*5vxYw^b-PM*Nw{(]n@|=lSς_N7щ؆#Ro٢ݘu~L l㖒פ&;q=;XeX,MWSd敃VK~wzP[_Fw)㔂u`8h|:IrAQoøWuLx}"[DmjQiN>"L?b4Di*XL·7eqE\}^Eُs6S&%) iY/CW&>|gfegi6iy3 \ly-p'ณvP\Ԍ'JKzWN~FftLuN tnhaakVմ{+)F9?;AyO=BhWqɬyl!=mLNRmalFEǽ[`b9Иa6r~^իL>܊<@;ևhw%mY% '{CiME˦٧!y7ዂ}ߕ^xYq%TBv޼5O_=ϫGla$c|!3Yor-^**{_9{k ߥ ~-`J2(*T k~[ܥ2c#;P^̽xBjo[)d/7# uw3ަh x&x=)3nsqnV #|gc hf܃q0Uje1Ke4/NӀ&+ɯ2QmK:fiun&m}\<>9TMarX$?M(h{{fN:e`AѐVLZWGQnĒ]q#()"uF)Uy-s!g/rP)qǜz?2gmKdNL=Ҳώ1l,P:Ẋg6ls+WE4&/>\"jFF(H$=M9QaK; Ź*Jd\:8@zÛj9hVÐ5޽4~чvY]bX™ՊD`$/IO _^. kb&m0(Hdaa1TXm]哖j0/r=DMt58YٽOiQ-?)/|l˜&s峪oL_ˉ 2xX 3H!M ,*<(ԸBpnAh 5$7cO%v\- oqOwsZzHz@mlae'/paĆB7jjS.,ԝ٭tWZҌ y{[af^&瘵=[?/\u7 ^3 `Ys2p/ylG;g koV"p!w6o5nh]i3,1Y%KWܱ;2=!2k*>"YTܹήFM0ҫh; [ڊ<}w;1.^YpQP O^UX׭pUԦL2r61sFFJwEN` ';!KNK/nh$kQG%ǣ5YcƬ'Hx&59!ei=@,d' R,+ h! _Qpޟb` endstream endobj 55 0 obj << /Length1 1444 /Length2 6292 /Length3 0 /Length 7275 /Filter /FlateDecode >> stream xڍx4}ۿV3]{QV#B$H=jUM)iQ{׮QfERoڻ<'$? E{D @  ʺ, PT!0ᐿDw  ewC]$ť%@(!]tZHEġtq981y~pyRR.wЎLF0x hFJ yyy \PHw9~ 0 {/= 4A"# C P=xw 2ˀ9aA+ #]\A!}5A7B2QH?0K  ?P`w+%afU2@~էs1}3\g CCp2A< *l0" hPJ\\Lq@BB~+1\($`>P O O?OD{ 8DC1wy, ^z0U4ԵT@RI H 1@?-5T5P$@/ 3 >CP Ƽ kqCosE {_FPQj' Q'h58NR\"8pI,*oMwS8Q^:b]6.DB۔_ήQeu:qP% av|֝BY`/4lӞ?z(,b* BI: 5[ 4cuZ/Eœ%qm;ɾD=`ޞӻب)v”WU]=ύ 25hPy 57o*JoL1kGh!X1xyBs&T``*5k ߴIs?!xDK }/ְpd1r(1$Ȗ4*Gܷ͓Td!m Zk/X?iPw=mKm\̻Ŷ&Ȩrú%b=$\\p2UV?6iQEOdv|P[)e<7gR8NjDZ7n%~$:ILL-O!0Sdmϖ$rk%VlRL4RN+1Tq$#R!kwM T<7.Ϣ,uyH` }0dbY -{L΢-Oh׳+~2s~NFXDK\qZ/?y&Nױ9ʟȯ$΄Kxޑ` XS'KV(K9M6\+ mG5בT%6&9H^$<>~Pqxr/3sU)ux{&M|.Jʥ|쳴Zm;jꕂ5Y2A/FqC;򞳾읽 3&ҏpEꓥ;3yI%p,Xv.G綦6썜)$덨f.U,VϽ cl2[6XŎ2ŕd)>x">ďkc{!v~\𒾷@TrSqj2&[G}Ǔ\on|>}ZoQ^=P6Żb:?-C?(,$_1ƥ{{gVofOmR@m=F{ c6"s@l˫]VQ/p0ݲ{t[_~^up❄7)|ͦ_cK+P3*%<=l~\#uܝ=5tBk}'uz7G`'@}CEӱJd%AT&v4fT*85[ 9R_ -r^e> (=9e2 1u޾{)Y$gc4e`#}έdAy.8`MK )ߛzс-}7KL{RcӚONU&{ڧN-x섫g^%̆> 9k0@ Oڎڹ[/AvIc$BbyUG~-DƥY+˱Q#u`}l^@G޻w/G}^O]sxm(ICgbvF7}'eYɓo&lڣ|m Jy`w)̞!KN_6@B,ѫo277 4^=_`N_mk 0Ȣ#'zήV>MCeȔ^g"`CM5{_)t4_]{6Pβ Wsv;*XИwiJIx*-%2ƣ{oeU-EGFxd AVz"1CKBYvݑvI3ݩ%QeGߥd(PvpʅT0ECB#ˎ;HNw7~rn #}#BvJ7x[z_#8ba=f(HܲM2J4蔍_vkG*9ѤǜWRW3%vJ` N>yA(Nԉy8PSmSZ2DO$bYB_B.¹{ؼ+>S1Mu}׳z$uNPręw迦MST%j2c%b] EJ:G]dOI;"'ҕK&kj3 5y$XK.dg}q'2J6eɢ;ynֆy Zq5Il ?'b`(4@@Pn-$8W~k`p{3:uLa'՗ mpwьՖc95QtZ? 9t5C<"蛅&ztMըbף|ΚE̤ieކQtdCuKSyDq?[I~ Q%NcvmZ93AIVXޣ'*^F}5mȹKn5?}¿4@xRQ-Z!^zՂb^=ѪV%a6~Jk2l?Ylgu޴NZ ;n&e5-jQNӾR~B_q{W?'uN h3?u3=VkZʾI,.¿A.Ys*c= A(;M=݄r^O!{Z0㡏-kc{v|]s*O\^Gk毕;U" ^bnXa_mE=+ V='Dnx^|6nZ/R=;a34͎ <-noﱂ_M3èuĪMf )h (IY9[o*E?H%m{-#cȟU`;=m/l_Lg 57W\vבy!`2#8RrO\mzp՚6[϶;v ^pk}O)Οi$~<3wQdUM<ӊ*pE:Y0ݠX 1>k+[͹(%;GOܚQZe# ${SN#>gQ]4;z`őȎ+t8R|LCs5فmWF},h, endstream endobj 57 0 obj << /Length1 2292 /Length2 16243 /Length3 0 /Length 17598 /Filter /FlateDecode >> stream xڌtk ǶI4mj ۶Xm;ill=z5k̵}{7CNB'dbkqcgȩ21YU-Ñ-lma!4t:}L,&vn&nFF3## m.&9z \#(L\\Ɔ69C'sGFcC+BP;9q30Z;:S\-@G e5Rؚ::+ c㇋ "% PX_7Dp+Άƶv66fS + @A\͉`hc򗡡퇿чߥą ɑ/ h5D-}wgZغxZؘEَA(%o n %PudK`Ama t4tޞT/cbX;f6p`a?&_~0[+?1&Ϳ)W),lc1X8\_Tߵ#-_>z. / 3~L3@g011^]M_Q_V$le_?zCk +[|Lf~5k&W+d!B6fVmD1|D*:Zuc-?Ǐ[ب(fclk1  ?拙 &@G@oc` 0uH B A0A\"F`  A.}d>A E|G>?}dW>A5Gv"Їg}}m>?Ο俐 [++CX|'ćſ{?M-\?L?:d_!sw;s?Y~?IXw?"ܖ )fc4×RiGQvn^?9>LDheh|g NJ'g>u4u76vv?d@71҂1Oڠj!|W Y=T*:%vg$$̀ {1;eߞ'С- J/^ߔZ~Ma LЩ {Ro&ϱwDRCtp/] YSگb-V_4Gk}ʉ y~-{X i4OM昧yrUf.\2\mB;Ϟ‡؋ŅQ|YT c^$g:Rh،VK\cdޭu {*vԵv'H84y M}zCa4&r.[KwZ'w2'g:#:۰pۘkC1n9 fx~ lWn*aeqz7ֳ1TNWWwB)6#Fδ1"h8 Kej? JT N˅kcڳڿG܆jCk5>|=ְ2CEmwn+QI5hYYj7y}1UDz=8;SOF./v< U^SEB2s֙Vz5V#=.[]~O_Of !!*A%9BcY]_KNlѹ-mn%NXp+7BZah *67zsޛMijfx$y9?>S6-(szdA@1!8#4 窄*Kmb$ ]e$(<#m͗gWn m!T*\QU)0<)񣚇fD'ɀƵ|`nZ08seB~};d3ʖ ͌voE4]-Y=L;*|)65;%}ᵸ"V ,Er-{SWfPp_No1ONt{=W F|;C׃N9.̆?YzHAUO 5ya[,PQ_Xɏ0"1`SEVtW]}\MAY9T^oOBg[4'dTǂE otc!IXZ~A´>Nf8_.im>\NS&UR@Y=P l"Rgfm*rzFH0+# Ҍ[9Ǣ7O|Ͼ~ 0,-v[T/2N㪁ǐ61r%NAksQI7 ְ'umM0x?,(14׃APU* ZCmy1@[_O_\Pمm QAi15ߗuN3*% đ9tCw{cug# ۋYjyH*2ٶb05ZM($Tro2ܖV *{t2I=^:N@ 0'z079Pw"0FDcRW$92@<ɁǥS+́n/N$T{Q3Z!D| D wCIm%_r1(ca10Uv먽Th[#,Ai"6ެC՞j\b s[X7 lq; |ܶcU2M4蝇L%^]5x^li`ZZ4xBs˜҂Zy}nA2Ο#'tCw'tE#FM-yH t3 }Z+ ~S%5%">i}W<-f;a@0< lbx@p( δANub7Yk pP"G2th̽vwM V?ZL22:HYôNofD jOQ}K-0E 6tH {p"dI8-(c氍*7b (&M-=,ODXIfA*@l8H7`dÜ*Y+s0LPߩB˝sAQ ld?[ gD$c(Xf}~TD&c[=-`>En$T]Ge4)qJUKˌfFY &0peQS`)vXzGn˞zƺ축! wCN "'I +8?}hyÌÚc1Ku5}]߹ (VIS{OU R qzt&8nch WA]*Kv(=-]-j"S!)Z!٢-C&_pUQ}QY"qsYHc j/KlCSb4?wb6{ihS>OI Np(kD~ƭZv&v!&"Ju?Z%/2u-|~ KBӮ,f7m 'PiE% 6\[0 t'$sėP{`u@P<[~D;a:#Lj753a\顎x ^wM >ȉg8OkBcUJId^⠮g |PjaƐ֚[-?}60,pm&r_[K ZF'?cA(BYqZ҂ACt/ q iB!,^q j,^Փ *8^|B$cbٛe}f} h<?Cb¼ IGiJwKFqK&OTјOݱlE'[ܔu_ XEqnWJBOuMh#P'tg(a}AuWr]-S`:H )bXpI#j  U㍥j:]6 f1g]:vYOȔL%QxcXCZi$EeQyτJ W 0vg"p ֽ| JWuΦypWRy_KҨFbNgki~ NN9mJZvpEx"vxɻNYf&W_Sx'>ݽ,:@ؔH!`A9k{vIM v{_I$a8Í]&Zq;s:[;Jk{ƀ$ҙ&X^ϐ>nv x }b׀B 9*UuDAYdӉ {σ<(V/@3_)~ F$Pћ9 SIO Zs3ӂ9JL5Þ훑s<KwvY9 0nɹvoD-WfQRdwIcrDž#T7[2$#1V`wDX a.p2A*ڼmrzYb`[ a&@D=F?XM^kfhw3F.zR"³/r*RQs.hKÆ\bXVK+2 SF{v8%7ig4K`kA!ELzk v0'RnOD6/2q!1cBErg}EgeNM6q]U k>Q)S&44XO5~ԭ¨46&!rޓZiF.frlڶ}ku39!>g=sNhQrSw,u8S3A!Ll13[?;R2 xn:k!i4тDF(`݇+kH Wm_s" _OwRu=^du&zdHL6Λ^wG{}S'@,x.AUy^ZPkj6ݠ52-BY.F% .b4iw+ gR !Ơfb}}qQBjiaOۇm3B[Qc6 GvZ YM-m0N>ED$GeąkNHs.0~gYn5go}8?XWu6i􃍎ɜ☎z/ vOVyf>6m`y,܆>Ï\%M寁p9@4f8LI%s?*]U?j$,0g+7jPj dD(d0bL,t@հM$=ys `-ugPc7ITz2 5EnhBW:(|dzIEc!ha0B-PKLD*ۃGV4Då]n%3|$teH 6 > %]nMpO b-(GSr=td ӺRV.K&Q:DN-Ӯ< ?4T8O<CU.j|IA@;t*jsƘ,GUEٽ_ͷo?IúMa(bᐫF9Yg#4PBtb4a8w spOl[R<{1 8ׄwx5>i8{N zo|c#e; <_6*64g$U+|Qq} DIALh3;VZӸ UJY^VZ?\PT7)IXTW6rGTՊef +Jo#>B2q=$*PT/E ^2[ m_ g"Rr#f' d's;hf};OK9EZҔίҫg>_ZWqe x I/qF118{REu؎<&YĐLCZsz7ZoxN% Iنݷߕ`15ztTRfL ؃> QMuŲZ@`nDɭ)&& Low- ^=288s`_qgՎ.Vbm\zI#JJE,&o1| 0>R.+xM3X80;$QX%qC  b X/ ݁މ BhЮsHaGQR|Y<`|i|䁁5,CX5/^5Y_M鹁=Ճœxh핛2fNC֡gYQ ,Rg9].S1PeP+ȾS=j'>g s%\u OMί'C@S{\Ӽ0s۟1CGPvY.Z."s6*cwAꗙwfL4Pp~v\Go-RHjz9B' 寛\*x m!_<5w^͛@i+d|a٦-֜5dhgQ_d{ ӻtg&A7 :f%2ItϏ@M-hd)wyLx8,5d[(/[f] hYsU#**R2욌C n8{\ELeX]/Ҩ?‹3شz*>1]9o S^XOF4S%/f:ӫi]a2E̐O j_2{ؓjUN7EWokrp&71b ?ᅈ_MktI},+dQ YyU}SkR)'ѯK_d>rw mcNY3Vdn,B>=9}S]5R:ڞF/2-Scu4F` *6r04qtN'Z֎S_bayUPByWgg[ٺK`g*Z+XxnKw#~ݴYRf3_;-Ŧ꘽OH]e吾j+лN-{B4lO.jxTE5FO8וclyJǚ3靾9k,K7냕$Nφ ZDg!f=#yXsÆ?2kn`֞LqrrU%G[v,d'mYm!/~UkjM$H8ÚN%lBaD-XM[0~]2Cu#GkS-[:Y_=XˠGL>6X^oD |;c揇/'u5iu yzaާ;Kqg8˸,ߌ7Jt948Q܏s)'VTin`\Z"nJuM"W?Ŗ!OT\"gf$peiג,6P(iKm tUsu>gj*>l܋^+8/3\F.q,WCZA(tZ.0GөA@?.1?PXptTg>wCC@R?(:%utV(y],5&6BZk dE}c,R2BdU +[/HWmKrZWIK*3T6ڻ =a+J-o͈nGL@h)l.8ǝl!8D}_1cd'U5Ǜү(AXB\ҝZrM~ :Mep،~dfn#K'TX7\Ҷ &-FƊ1۵ =~fBQCAӝJbBA,N4d2-})9/by =L`43W5\!"wfl0QWFa" *m]ېy>H_1)}ntCF^綹arM|HB{ :.|y5TZgjg4=ހ|X ~V! I:M'~>|UPk*i%'ڥ8S~8y*mlh e_ -)s-NغrXp΍QohO΃%ˠY^s#ڙR*[/[7@V7t䓅I2B`|y#%io}*K:YSRrtMQQB]!~bN _bzнkB\%7S-(NW1"@wˆxRS?3vIc>K#t+ȅa/>(T綾C,9^2$IXR:1ļ ivL /m$nhu))V+͌ݎʢy(XKbxkz^-uy5bfrЉ.MШik{ K49\b폩Cn&[Y}/X/[b}g(xh j~&FPrS ltxI!ƱxT aSGVp:Eb?\Hza_Us;3se#R%cBxl9x!:FTd`9"5cMەr/`&Jmf; ꔻ6X]zybBO. +Cka"gŋTQPQl42'C$ EĤ { `p ٿ<)­l 7 3򅶍%{U+Nj\7KFwO^6)d KLJyN1ڏ# rd5HIiF9ɃHPL }ybdՄHU[mGo&T6]Q poK]3!~s9râ٬?!)w{"7klDdNS`DS FE}CPȎH|Bɮ ^ocCZnv܀Tb^?WB+iQtۜw]9}+6HCrECPZel Gk5L4bee1UmZɐs>90BVfYB]&Źx&0C>:nl{!^rG&n֯8 ja0>ՊˆE FfhǚPyۘF78}ZܘgR)Y g0wE;&=da*f cG!DQ0Ո|~6 AjJ$yP8/$^ >f|("| . y#*/+[ lDcՌ8fГ<[A- m1,]qK,r&dcc|=heнJp0;FQ$QC?&h*Ö)v92.!M5q%X#Յ<ɯנDYwP;T?:橱ޗ7M-<Ӹ%lvkߕlKՀ׶BoE38ҍꓵ3ӻ,zrў),L?!i E]) b;|*=  >.& ߜTqa _,$hulêѳR٬ҁԌdy`uhbFȢ؍'v<5]6ԀWA CH: fRz g.BQ4[G7~{&y/>%]ˠg ;=ZS2!|WcN5ALGE=: _dd@S_Sj1 ry7鷴c|E>LwXO N3b4mݒǺƚ+|$У3Y&.VpM|Xce)EYlɾ/>Kͅ"/͡}UmwWh{kMHv$mWs<1ZZWʩ'XSOe) kNqR5~%VB*͐B'2g(xDej*{Jq ',?j韝ÊXbD>-$cʰ<٣"ȱ=v5֚s3?4cN,Rɺ r:~E+̆SyYs(lZϥ'p9)'x,mC̗[~;Hai#>B45ȋ,)V7c3;6Q' ԕT^_Aցdc;kA'v4Whpp.i:lrLDmw(Ym RlO/-ȣ8wϛTHQk\v+.3/Yyས+N2]X/XӍ=%z4t)KEl^ټG ^%~f@t+#g˥`R f:qQXB|L@=iX.@@.+?İˇ>6=&9-DT57DZ;9 I讛~}a Q%?U'XL ryps̏q7., h"緼̈́/M;@NBԚFUG֋A]t╻uItfOe@/6AKeųP4,zHs>-=|XzLίq깠1UyKQ9 <>m"ըѱ-cʥAcAq bnz9$)^Ci/nXWn.6D|YQ-cn̊ϵ,kcGV.HDc"ͺ0+Qfo~A)H1*?= l@mU6(4^4 ${"S>$s-a`:Hm],Q>NȕN_d,d k4 'WfCᒕ%O`,@Րϱ260jHp@C{glc_ v# F=MB7:b IⰜ{B5MLő&$kLa9zg |] gW_  Uw!~o͆KltmuD' %'Jʩg!,Xeds|ٲEZ6:mCt @`S υ_UO#bj eY+!ֲzN$uM(ه{YnmP%Go^ˡ.dzU+Z:Jl*с'>A:t:ΌCI罅Ztx̦j4E̅2DŽ6ffvoada3I+b<ډF!ʇ8]-#D}lDbqV!gH}GEXDnfk\\ncҘFF2tW@K%ϤK*3ђq4;'I ՝c ,oaዂR.]WyȬAϩc0[ P٣Н7k-w`B"%規Tk󿟛5<%d# !g)  I[L0Sc hϩfuC ,K%S/4ZjGWJcÖjL+nah#I(:]T`0*Kí<[U(>cӏ.c %rV4nmVc!:՝>]| tmAUhzbW so@*D5Y[H4\xj 9e ~FVdT!)0p|l(.ߚݓz!mFXQhߝn(R=d-Ҽ:BD߆q/n쯌ÏfjZ(~YljtaR e iڮ~_ }.j^glW -W OY5ԧtk6)wI7a|EfaBV8P&ǧRr~Yw̉gms)bza#x;  Xď޲?!wMe;/SZ%1;xq[r`?:iҚn>D-#'$"ϴ 2Q?y)ެk)n9*MOuskZFc0cQ0g-KW{r&Q'jp=B˴G_\k^^܌oR溶sF6eTn4+L}$gV+'vҺcf ]ÑXz5s9GoHmՖQق*ymM>OZ3+K˕LC/P;v)(:\6䖭`p\n^r8W^d]BTO{]ZD~%"> k_*,j@}nf۱X} )_#_TML=U& hgٹf/D:ӱc+"6ϦNUXh12Wo앹IoňF?XqUꐨ9cwsa KrjR_X*BԔShaZ͵ q4*Bɒaܭrub5߫SзV+X RN~)&\b$3Ib&֥ὌQyf5@A3}h bR2R~!`bv O[!6uu2sG&?,cq.,؂ TnI8z0tf1q ЫԶb%zg^|apgCEή2<}%q1`#@2׷ąe<9e&˱6 w{FS-%P"/?V~zA-nw;DuL~kQ.'qN;GC56< %a"gC%8 m.`St"gWKj̲@Z L?MۭN:mwZ) =Fw!?2Goփ_N ԤJDbH:uPOX~6NT g3שbhˮT IBЃ|B-. jZwg醕;s w2lOfy )qR_0kqL兰7sxM'}s\==Jk@ll!SQٵ\>WvI mж-S"ul.ӗ_FvǢ1fʳڥ4)4dn˅K &d dN3Z,F ǘ\imh U|+oi _1qv{Q {^Lv_䒟 pd߃̮d|mF`ReR&딁KI(/!kʩa~̯s:nj@(%_j4j=fXS2cLpsIyjl% k݊>>_ 2m<;}Jq/sNXexoWP]Њ-.y 5Q\}Հŝʘ3sMfԼoyFhQt5QoH9|X0wB"Y ]OŸV}ǾTqY@qMwہ !:c5RחdҫؠG]1W:O> hZg`Hz5^y?82)A@8Rn/LCj^]iВM4[Eo|]1D;A7/Fe_VLv6^*1ͦ~ 3TlQb|sm68$0"1{]e&:Q3q|7;#В# 6)}/N傴R&Ǿ4i''LS*>A|K_?M#oq(uPrHQM{]zL{caJ}jzE]}}/5iF W4='qpS~->Gy,w}$-Y%Yr|!;qd7C^49-_ т9s&ц A)]]v'z~H 2zA'E; uK1yDB>Tlz==vn3:3 BgGdZEgu*]Zj |ݭA|0ʀ$UͶ*=HJ1ed:9ݡţ-)C[oFR7ZYl?m"}!fMPssέn%uC,x2}YaCW\L&Qɜwc=N0=I_\^&^]J9]Ig$&ZmVMuʶ7j8>c;M yzˮ10l=z:@.NL%fI\)lxQ4cd#.RȚ֍s%͉?6҆ endstream endobj 59 0 obj << /Length1 1688 /Length2 4060 /Length3 0 /Length 5104 /Filter /FlateDecode >> stream xڍWd[Vhpsw$2*3+쌲g"!2N,#>4x}~_q!~s)u C$PPiha@p4GB,pT<"tK,4Xi!4SB+WeH$+Z(0zD$8'g*# ;+C!u3Qxa!L`0OOO(ʕ%NI83``X M0BbRB gœHD(Xtq'`d$,ᇱI(wہpgMt%8cc(Ջ* mCBQ(訛(O~4GR~#l; x&KR ‘h޽a?B z|!GMNYpnX]6G愥p8\AZX/3l;7 DlA~$" pi`pXKAy`*@ 8`pȟ'㼀p|pi=w|u +Gn `we޽w0[lGz׮* :?˜ؔ 7-x ;B3vD3Ϟ5bL+7KO^'SB_2n2^}.)ַO1"WM%U[/AYr?֛^>Xi$Bk]ܮ9^:vTӽθxGgsᰶ 8%Lo,:.0M&/] v|5:Hz#Lj '˾-?C^yGsg2HS<PI8\q *pljo~(@g9d׽y1XMڏt8}8NL7Xx˭5~e]/xVHH(W>Rj[k% <)VGmJlfq\FNftcP[Pdl6/RҚi`rNX0,-F#(jF~v=p;T9g\q-_JҌ[t_Sm߭r@u6!]%Y { 6[ŔM >"w;w4ҧz!۳iMUgq~ )T~)azfYQ)I>bYyo)xicY`Tu'i!RSDEM;)":B)s}hd.}|)^O,dO,/7b%#,sꝠ6ʐ`fzWb wpǐk4i:X;oU"-"ȐތP O.WeQP3/T[MRp(Q3CJ #iZDW~ -ypY^)u#f[]Bz<#̕Q Kߍٶ(rf 5=;R~t őQrsP\meo㔭gnj̬̓_̴ѺrWcZ->+Vv|uܑqUSynx~ͫl4" #krJ:p].׉-ƳRM7r{h =:*8$ws(tw7˹6n~q(Ms2, ##;f%ƪ :1i sVSk757;?/0 u.ʦ`Q̽Xd,_JWg.S遄).6cYͤUE_>\!^s6UW3K@c)]ҡ$6͠=-dC[u}MJ'JQ}Cؕka{H܇ꈎJ#ŒÛH>l+a&D#n$^a]çޯNOCz?*Tbd3xc  V>wc8^KYCRXCެ4 1o]NPQqG~~޾V>[ψ#߿t3Y%RqT$6ʀ%)z#[$;!7f61CRy7Ǎtɿ"FEF MS*=4b*fSnbm]jGQuA e~aF;f}Aа3n=7`~KOJXFnNh- P{\C=oypUDZBg*e }jqAaMl9*Y>#>c,A y紿:7$ u|Qb*"I2Nak}Mwi'QYB}5 o :JGMfkUnn0ڷBxANZk5=VV6}#˹m])y mF 8-_Jl^ yQ@UrF6U8&ZrL= E,zO*ƴ}ɯ6bݓ:)=L P>뉧j8,d_B_SFHKGZ?rp8.^I\ty7TC@7һ2KZ5F^R&^щe=h/=oݖEwA-mKeT\Y W&BU56(=a 2Kǚ<C+p[~Ԣt;Lo{/Hrh 7^[DRJoh@F[NQ-Jm}_ Q SB"V+Yo>ffNxk:/B~NpX˒*ϪgrS$m=|uqGM+6 h|_vP[?sKe 3W޵xl+af(WYU6PDX 34Gc ,ɠǻ3GPi̤ d5JdbާZDs7 s wp5!`y ˾kˏ;$T)ҍBLĐKNKomTJ}[ӭj`@C S}*'JJw|<9tշhIZc5>)?hX 0?OTV^}Z?r㐧m շJL.br-W}9G)e#b;VOٺ۾:A5x雩|L,1$e]`&A{157tw&b2:ĤLjNqպ^BIŷk֌&PP endstream endobj 63 0 obj << /Producer (pdfTeX-1.40.14) /Creator (TeX) /CreationDate (D:20131006201133+01'00') /ModDate (D:20131006201133+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 11 0 obj << /Type /ObjStm /N 45 /First 338 /Length 2155 /Filter /FlateDecode >> stream xZ[o~ׯ9(,o@P*Nc9; Hk[j7Jڕڲ X#.9of8$VL0ɢg0%񥙖 6 0S2̇f! ,FoAmڄb*i >jnTTԨ6m*JDaHHM#<#dd ؀ m;mY1c] QtĨAAhp&b)iKL] IOuD8&-uv?H4D+%o70 ɕƒ(s~ȫ"hEzd4ditbA™2wPi!I"]`j:2]jf޷ QkVdƓVuмdS0ħj5QjKs+ьJB-$^]m\UѨkK*ɝ9tcRr;eNZRA{U^->GږiG~(8C\#uVB*9Ni3+يgB6qGxj84i~~cɄEKaG"Bzc: DU95\d,ErJչ[˸49$ʒ_O4x,.h95ɴ⩏ ϭ}ۖiEӮi؝B ?*PʈB9MZ񲒐,:N4j#V *.IC3ͶcQdzOWo#J[jn]fǍ6)$?. t?(dx;O5FN?~w&F˒̱n ;ֱE[t6/\v>]\~^^1'54#iմ7wo.Giq0rVMžW ]ËAo634Ӹ܇=}xCW9ip43W;/wS7$>1)c_1gDVC:99i&7ݣ ]܎X4C[].=OZV:%m^uVn{hAϫYhUNo*P*h#t~KH2(#6ꕴ_{+iu?ÛYU ~?>;nwcF4@'W @J;dYUSMumcI_e並!M#uB^,ok羆]3S2I%uԫ?ӫ^n}ݭj7\ƥrЊ\6G}enb wh F <4CF919ED0231789DC54525042B68F021>] /Length 179 /Filter /FlateDecode >> stream x7PssιAaBkVTʨt|3)@ UODS4DWE