combat-0.8.1/0000755000175000010010000000000011615566707011056 5ustar fpNonecombat-0.8.1/bin/0000755000175000010010000000000011615566705011624 5ustar fpNonecombat-0.8.1/bin/idl2tcl0000711000175000010010000021666511615564650013114 0ustar fpNone#! /bin/sh # $Id: idl2tcl,v 1.2 2011-08-01 18:00:08 fp Exp $ \ # \ # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 # # ---------------------------------------------------------------------- # Initialize. # ---------------------------------------------------------------------- # set myDir [file normalize [file dirname [info script]]] set parentDir [file dirname $myDir] set orbDir [file join $parentDir orb] set killDir [file join $parentDir tclkill] if {[file exists $orbDir] && [file isdirectory $orbDir]} { lappend auto_path $orbDir } if {[file exists $killDir] && [file isdirectory $killDir]} { lappend auto_path $killDir } if {[catch {package require combat} oops]} { puts stderr "Error: Failed to find the required \"combat\" package." exit 1 } if {[catch {package require kill} oops]} { puts stderr "Error: Failed to find the required \"kill\" package." exit 1 } if {[catch {set argv [eval corba::init $argv]} res]} { puts stderr "Error: corba::init failed: $res" exit 1 } # # ---------------------------------------------------------------------- # Command-line processing. # ---------------------------------------------------------------------- # proc usage {} { puts stderr "usage: $::argv0 \[options\] " puts stderr " Options:" puts stderr " -v Verbose operation. Use more than once for more verbosity." puts stderr " --name Name of the output file, else use the first IDL file's." puts stderr " --impl Generate an implementation skeleton file." puts stderr " -I Passed to the IDL compiler." puts stderr " -D Passed to the IDL compiler." puts stderr " --ir Process this Interface Repository rather than IDL files." puts stderr " --ifr Command line to start the Interface Repository." puts stderr " --idl Command line to feed IDL files to the Interface Repository." exit 1 } set infiles "" set outbase "" set implflag "no" set verbose 0 set irior "" set ifr [list] set idl [list] set idlopts [list] for {set i 0} {$i < [llength $argv]} {incr i} { switch -glob -- [lindex $argv $i] { --name { set outbase [lindex $argv [incr i]] } --impl { set implflag "yes" } -I - -D { lappend idlopts [lindex $argv $i] lappend idlopts [lindex $argv [incr i]] } -I* - -D* { lappend idlopts [lindex $argv $i] } --ir { set irior [lindex $argv [incr i]] } --ifr { lappend ifr [lindex $argv [incr i]] } --idl { lappend idl [lindex $argv [incr i]] } -v { incr verbose } --* { usage } default { set file [lindex $argv $i] if {![file readable $file]} { puts stderr "Error: input file $file does not exist or is not readable" exit 1 } lappend infiles $file } } } if {[llength $infiles] == 0} { if {$irior == ""} { usage } if {$outbase == ""} { puts stderr "Error: must supply --name with --ir" exit 1 } } elseif {$outbase == ""} { set outbase [file rootname [file tail [lindex $infiles end]]] } # # ---------------------------------------------------------------------- # Figure out which Interface Repository to use. # ---------------------------------------------------------------------- # # # Look for the following in the $PATH: # # - The Interface Repository service: # - ird for MICO # - irserv for ORBacus # - tao_ifr_service for TAO # - The program to feed IDL files to the Interface Repository: # - idl --feed-ir --no-codegen-c++ --feed-included-defs for MICO # - irfeed for ORBacus # - tao_ifr for TAO # # This can be overridden with the following command-line options: # # - Use --ifr # If this command-line option is provided, we contact the Interface # Repository at the given IOR and dump all of its contents. # # - Use --ifrserver AND --ifrfeed # - must be the command line to start the Interface Repository # server. The server must write the Interface Repository IOR to the file # "ir.ior" in the current directory (the command line should include # appropriate options). is spawned as a new process and # later killed. # - must be the command line to feed one or more IDL files # to the Interface Repository. The "-ORBInitRef" option is added # to this command line to set the "InterfaceRepository" initial # reference. It is expected that this command preprocesses the IDL # file, accepting the usual "-I" and "-D" command-line options, and # that the names of one or more IDL files are passed at the end of # the command line. # proc findFileInPath {name} { # # Look for a file in $PATH. # if {$::tcl_platform(platform) == "windows"} { # # On Windows, look for both $name and ${name}.exe. # foreach path [split $::env(PATH) ";"] { if {[file exists [file join $path $name]]} { return [file join $path $name] } if {[file exists [file join $path ${name}.exe]]} { return [file join $path ${name}.exe] } } set path [file dirname $::argv0] if {[file exists [file join $path $name]]} { return [file join $path $name] } if {[file exists [file join $path ${name}.exe]]} { return [file join $path ${name}.exe] } } else { foreach path [split $::env(PATH) ":"] { if {[file exists [file join $path $name]]} { return [file join $path $name] } } set path [file dirname $::argv0] if {[file exists [file join $path $name]]} { return [file join $path $name] } } error "$name not found in PATH" } if {$irior == ""} { # # We know about MICO, TAO and ORBacus (though I haven't tried the latter # for a VERY long time). # if {![llength $ifr]} { if {$::tcl_platform(platform) == "windows"} { append ::env(PATH) ";[pwd]" } else { append ::env(PATH) ":[pwd]" append ::env(LD_LIBRARY_PATH) ":[pwd]" } if {![catch {set ifr [list [findFileInPath "ird"]]}]} { set ORB "MICO" set idl [list [findFileInPath "idl"]] lappend idl "--feed-ir" "--feed-included-defs" "--no-codegen-c++" lappend ifr "-ORBNoResolve" } elseif {![catch {set ifr [findFileInPath "tao_ifr_service"]}]} { set ORB "TAO" set idl [list [findFileInPath "tao_ifr"]] lappend ifr "-ORBDottedDecimalAddresses" "1" } elseif {![catch {set ifr [list [findFileInPath "irserv"]]}]} { set ORB "ORBacus" set idl [list [findFileInPath "irfeed"]] } else { puts stderr "Error: Did not find Interface Repository executable. Please make sure that" puts stderr " the following executables are in your \$PATH:" puts stderr " - When using Mico, \"ird\" and \"idl\"" puts stderr " - When using TAO, \"tao_ifr_service\" and \"tao_ifr\"" puts stderr " - When using ORBacus, \"irserv\" and \"irfeed\"" puts stderr " Alternatively, use either --ir or --ifr and --idl." exit 1 } } } # # ---------------------------------------------------------------------- # Traverse the Interface Repository. Generate a list of dependencies, # and then produce a post-order that ensures that definitions appear # before they are referenced by a later definition. # ---------------------------------------------------------------------- # namespace eval Deps { # # 1: n1 contains n2 # -1: n2 contains n1 # 0: neither # proc Contains {n1 n2} { set l1 [string length $n1] set l2 [string length $n2] if {$l1 < $l2 && [string first $n1 $n2] == 0 && \ [string index $n2 $l1] == ":"} { return 1 } elseif {$l1 > $l2 && [string first $n2 $n1] == 0 && \ [string index $n1 $l2] == ":"} { return -1 } return 0 } # # 1: n1 directly contains n2 # -1: n2 directly contains n1 # 0: neither # proc DirectlyContains {n1 n2} { set l1 [string length $n1] set l2 [string length $n2] if {$l1 < $l2 && [string first $n1 $n2] == 0 && \ [string index $n2 $l1] == ":" && \ [string first :: [string range $n2 [expr $l1+2] end]] == -1} { return 1 } elseif {$l1 > $l2 && [string first $n2 $n1] == 0 && \ [string index $n1 $l2] == ":" && \ [string first :: [string range $n1 [expr $l2+2] end]] == -1} { return -1 } return 0 } proc MakeDep {dependee_name dependenton_name {forward 0}} { variable deps global verbose if {$forward} { set dependenton_name "_fwd_$dependenton_name" } if {$verbose >= 4} { if {$forward} { puts "Adding dependency from $dependee_name to $dependenton_name (forward)" } else { puts "Adding dependency from $dependee_name to $dependenton_name" } } if {![info exists deps($dependee_name)]} { set deps($dependee_name) [list $dependenton_name] } elseif {[lsearch -exact $deps($dependee_name) $dependenton_name] == -1} { lappend deps($dependee_name) $dependenton_name } } proc AddDep {dependee dependent_on} { variable deps if {![$dependee _is_a IDL:omg.org/CORBA/Contained:1.0]} { return } if {![$dependent_on _is_a IDL:omg.org/CORBA/Contained:1.0]} { # # dereference template types # switch [$dependent_on def_kind] { dk_Sequence - dk_Array { AddDep $dependee [$dependent_on element_type_def] } } return } set n1 [$dependee absolute_name] set n2 [$dependent_on absolute_name] # # ignore if dependent_on is contained in dependee # if {[Contains $n1 $n2] == 1} { return } # # If something within an interface (valuetype) depends on # something outside of that interface, make a dependency from # the interface (valuetype) instead. # set c $dependee while {[$c _is_a IDL:omg.org/CORBA/Contained:1.0] && \ !([$c _is_a IDL:omg.org/CORBA/InterfaceDef:1.0] || \ [$c _is_a IDL:omg.org/CORBA/ValueDef:1.0])} { set c [$c defined_in] } if {[$c _is_a IDL:omg.org/CORBA/InterfaceDef:1.0] || \ [$c _is_a IDL:omg.org/CORBA/ValueDef:1.0]} { set if [$c absolute_name] if {$if != $n2 && [Contains $if $n2] != 1} { set n1 $if set dependee $c } } # # If dependent_on is an interface (or valuetype) and dependee # something outside that interface (or valuetype), mark # dependent_on as a candidate for a forward declaration # if {[$dependent_on _is_a IDL:omg.org/CORBA/InterfaceDef:1.0] || \ [$dependent_on _is_a IDL:omg.org/CORBA/ValueDef:1.0]} { if {[Contains $n2 $n1] != 1} { MakeDep $n1 $n2 1 return } } # # If dependent_on is a struct (or union), and dependee something # outside that struct (or union), we may have to forward-declare # the struct (or union). However, if the struct (or union) is # defined within an interface (or valuetype, struct or union), # and dependee is outside that type, then make dependee depend # on that outer type. # if {[$dependent_on _is_a IDL:omg.org/CORBA/StructDef:1.0] || \ [$dependent_on _is_a IDL:omg.org/CORBA/UnionDef:1.0]} { set c [$dependent_on defined_in] if {[$c _is_a IDL:omg.org/CORBA/InterfaceDef:1.0] || \ [$c _is_a IDL:omg.org/CORBA/ValueDef:1.0] || \ [$c _is_a IDL:omg.org/CORBA/StructDef:1.0] || \ [$c _is_a IDL:omg.org/CORBA/UnionDef:1.0]} { set cn [$c absolute_name] if {![Contains $cn $n1]} { AddDep $dependee $c return } } if {[Contains $n2 $n1] != 1} { MakeDep $n1 $n2 1 return } } MakeDep $n1 $n2 } proc ConstantDef {obj} { set type [$obj type_def] AddDep $obj $type } proc StructDef {obj} { set members [$obj members] foreach member $members { array set elements $member AddDep $obj $elements(type_def) } catch {array unset elements} } proc UnionDef {obj} { AddDep $obj [$obj discriminator_type_def] StructDef $obj } proc AliasDef {obj} { AddDep $obj [$obj original_type_def] } proc ExceptionDef {obj} { StructDef $obj } proc AttributeDef {obj} { AddDep $obj [$obj type_def] } proc OperationDef {obj} { set params [$obj params] foreach param $params { array set pd $param AddDep $obj $pd(type_def) } catch {array unset pd} set exceptions [$obj exceptions] foreach exception $exceptions { AddDep $obj $exception } catch {array unset ex} AddDep $obj [$obj result_def] } proc InterfaceDef {obj} { set bases [$obj base_interfaces] foreach base $bases { AddDep $obj $base } } proc ValueDef {obj} { set base [$obj base_value] if {$base != "0"} { AddDep $obj $base } set absbases [$obj abstract_base_values] foreach absbase $absbases { AddDep $obj $absbase } set supporteds [$obj supported_interfaces] foreach supported $supporteds { AddDep $obj $supported } } proc ValueBoxDef {obj} { AddDep $obj [$obj original_type_def] } proc ValueMemberDef {obj} { AddDep $obj [$obj type_def] } proc Traverse {container} { variable elements global verbose set contents [$container contents dk_all true] foreach contained $contents { if {$verbose >= 4} { $contained _is_a IDL:omg.org/CORBA/Contained:1.0 puts "Visiting [$contained absolute_name]" } if {[$container def_kind] != "dk_Module"} { AddDep $contained $container } set kind [$contained def_kind] switch $kind { dk_Constant { ConstantDef $contained } dk_Struct { StructDef $contained } dk_Union { UnionDef $contained } dk_Alias { AliasDef $contained } dk_Exception { ExceptionDef $contained } dk_Attribute { AttributeDef $contained } dk_Operation { OperationDef $contained } dk_Interface - dk_LocalInterface - dk_AbstractInterface { InterfaceDef $contained } dk_Value { ValueDef $contained } dk_ValueBox { ValueBoxDef $contained } dk_ValueMember { ValueMemberDef $contained } dk_Module {} dk_Enum {} dk_Native {} dk_Typedef - dk_Primitive - dk_String - dk_Wstring - dk_Fixed - dk_Sequence - dk_Array - dk_Repository - default { error "oops: illegal contained item: $kind" } } if {[$contained _is_a IDL:omg.org/CORBA/Container:1.0]} { Traverse $contained } if {$kind != "dk_Module"} { lappend elements [$contained absolute_name] } } } proc DepthFirstTraversal {node} { variable deps variable visited variable postorder if {[info exists visited($node)]} { return } set visited($node) 1 if {[info exists deps($node)]} { foreach child $deps($node) { DepthFirstTraversal $child } } lappend postorder $node } # # "main" function # proc BuildDeps {container} { variable elements [list] variable postorder [list] variable visited global verbose if {![info exists verbose]} { set verbose 0 } # # Build dependencies # Traverse $container # # make depth-first traversal # catch {unset visited} foreach element $elements { DepthFirstTraversal $element } return $postorder } } # # ---------------------------------------------------------------------- # Produce an output string representing the Interface Repository's # contents. # ---------------------------------------------------------------------- # namespace eval CodeGen { proc emitRepoId {obj} { return [list [$obj id] [$obj name] [$obj version]] } proc emitIDLTypeName {obj} { # # Emit type name for a primitive, named or anonymous type # if {[$obj _is_a IDL:omg.org/CORBA/PrimitiveDef:1.0]} { switch [$obj kind] { pk_void { set res void } pk_short { set res short } pk_long { set res long } pk_ushort { set res "unsigned short" } pk_ulong { set res "unsigned long" } pk_float { set res float } pk_double { set res double } pk_boolean { set res boolean } pk_char { set res char } pk_octet { set res octet } pk_any { set res any } pk_TypeCode { set res TypeCode } pk_string { set res string } pk_objref { set res Object } pk_longlong { set res "long long" } pk_ulonglong { set res "unsigned long long" } pk_longdouble { set res "long double" } pk_wchar { set res wchar } pk_wstring { set res wstring } pk_value_base { set res "value base" } default { error "oops: unknown primitive type [$obj kind]" } } } elseif {[$obj _is_a IDL:omg.org/CORBA/TypedefDef:1.0]} { set res [$obj id] } else { switch [$obj def_kind] { dk_String { set res [list string [$obj bound]] } dk_Wstring { set res [list wstring [$obj bound]] } dk_Fixed { set res [list fixed [$obj digits] [$obj scale]] } dk_Sequence { set res [list sequence \ [emitIDLTypeName [$obj element_type_def]]] if {[$obj bound] > 0} { lappend res [$obj bound] } } dk_Array { set res [list array \ [emitIDLTypeName [$obj element_type_def]] \ [$obj length]] } dk_Interface - dk_LocalInterface - dk_AbstractInterface - dk_Value { set res [$obj id] } } } return $res } proc emitConstant {obj} { return [list const \ [emitRepoId $obj] \ [emitIDLTypeName [$obj type_def]] \ [lindex [$obj value] 1]] } proc emitStruct {obj} { set members [$obj members] set elements [list] foreach member $members { array set md $member lappend elements [list $md(name) \ [emitIDLTypeName $md(type_def)]] } catch {array unset md} return [list struct [emitRepoId $obj] $elements [emitContainer $obj]] } proc emitUnion {obj} { set members [$obj members] set elements [list] foreach member $members { array set md $member if {[lindex $md(label) 0] == "octet"} { binary scan [lindex $md(label) 1] c foo if {$foo == 0} { set label "(default)" } else { set label [lindex $md(label) 1] } } else { set label [lindex $md(label) 1] } lappend elements [list $label $md(name) \ [emitIDLTypeName $md(type_def)]] } catch {array unset md} return [list union [emitRepoId $obj] \ [emitIDLTypeName [$obj discriminator_type_def]] \ $elements [emitContainer $obj]] } proc emitAlias {obj} { return [list typedef [emitRepoId $obj] \ [emitIDLTypeName [$obj original_type_def]]] } proc emitException {obj} { set members [$obj members] set elements [list] foreach member $members { array set md $member lappend elements [list $md(name) \ [emitIDLTypeName $md(type_def)]] } catch {array unset md} return [list exception [emitRepoId $obj] \ $elements [emitContainer $obj]] } proc emitEnum {obj} { return [list enum [emitRepoId $obj] [$obj members]] } proc emitAttribute {obj} { set res [list attribute \ [emitRepoId $obj] \ [emitIDLTypeName [$obj type_def]]] if {[$obj mode] == "ATTR_READONLY"} { lappend res readonly } return $res } proc emitOperation {obj} { set params [$obj params] set pd [list] foreach param $params { array set md $param switch $md(mode) { PARAM_IN { set mode in } PARAM_OUT { set mode out } PARAM_INOUT { set mode inout } } lappend pd [list $mode $md(name) \ [emitIDLTypeName $md(type_def)]] } catch {array unset md} set exceptions [$obj exceptions] set ed [list] foreach exception $exceptions { lappend ed [$exception id] } set res [list operation [emitRepoId $obj] \ [emitIDLTypeName [$obj result_def]] \ $pd $ed] if {[$obj mode] == "OP_ONEWAY"} { lappend res oneway } return $res } proc emitInterface {obj} { set bases [$obj base_interfaces] set bd [list] foreach base $bases { lappend bd [$base id] } switch [$obj def_kind] { dk_Interface { set name "interface" } dk_LocalInterface { set name "localinterface" } dk_AbstractInterface { set name "abstractinterface" } default { error "oops" } } return [list $name [emitRepoId $obj] $bd \ [emitContainer $obj]] } proc emitValue {obj} { set base [$obj base_value] set bases [$obj abstract_base_values] set supps [$obj supported_interfaces] set inits [$obj initializers] if {$base != "0"} { set base_id [$base id] } else { set base_id "0" } set bases_id [list] foreach abase $bases { lappend bases_id [$abase id] } set supp_id [list] foreach supp $supps { lappend supp_id [$supp id] } set ninits [list] foreach init $inits { array set ie $init set nmembers [list] foreach member $ie(members) { array set im $member lappend nmembers [list $im(name) \ [emitIDLTypeName $im(type_def)]] } catch {array unset im} lappend ninits [list $ie(name) $nmembers] } catch {array unset ie} set mods [list] if {[$obj is_abstract]} { lappend mods "abstract" } if {[$obj is_custom]} { lappend mods "custom" } if {[$obj is_truncatable]} { lappend mods "truncatable" } return [list valuetype \ [emitRepoId $obj] \ $base_id \ $bases_id \ $supp_id \ $ninits \ $mods \ [emitContainer $obj]] } proc emitValueBox {obj} { return [list valuebox [emitRepoId $obj] \ [emitIDLTypeName [$obj original_type_def]]] } proc emitValueMember {obj} { if {[$obj access] == 0} { set visi "private" } else { set visi "public" } return [list valuemember \ [emitRepoId $obj] \ [emitIDLTypeName [$obj type_def]]\ $visi] } proc emitNative {obj} { return [list native [emitRepoId $obj]] } proc emit {contained} { variable container variable visited set name [$contained absolute_name] set kind [$contained def_kind] # puts "emit $name" set visited($name) 1 switch $kind { dk_Constant { set res [emitConstant $contained] } dk_Struct { set res [emitStruct $contained] } dk_Union { set res [emitUnion $contained] } dk_Alias { set res [emitAlias $contained] } dk_Exception { set res [emitException $contained] } dk_Enum { set res [emitEnum $contained] } dk_Attribute { set res [emitAttribute $contained] } dk_Operation { set res [emitOperation $contained] } dk_Interface - dk_LocalInterface - dk_AbstractInterface { set res [emitInterface $contained] } dk_Value { set res [emitValue $contained] } dk_ValueBox { set res [emitValueBox $contained] } dk_ValueMember { set res [emitValueMember $contained] } dk_Module { set res {} } dk_Native { set res [emitNative $contained] } dk_Typedef - dk_Primitive - dk_String - dk_Wstring - dk_Fixed - dk_Sequence - dk_Array - dk_Repository - default { error "oops: illegal contained item: $kind" } } return $res } proc emitForwardDecl {element} { variable container variable moduledata variable module variable data set if [$container lookup $element] ChangeModule [$if defined_in] switch [$if def_kind] { dk_Struct { set type "struct" } dk_Union { set type "union" } dk_Interface { set type "interface" } dk_LocalInterface { set type "localinterface" } dk_AbstractInterface { set type "abstractinterface" } dk_Value { set type "valuetype" } } return [list $type [emitRepoId $if]] } proc emitContainer {obj} { variable postorder variable visited variable container set container_name [$obj absolute_name] set to_visit [list] set new_po [list] set res [list] foreach element $postorder { if {[string range $element 0 4] == "_fwd_"} { set elname [string range $element 5 end] } else { set elname $element } if {[Deps::DirectlyContains $container_name $elname] == 1} { lappend to_visit $element } else { lappend new_po $element } } set postorder $new_po unset new_po foreach element $to_visit { if {[string range $element 0 4] == "_fwd_"} { set realname [string range $element 5 end] if {![info exists visited($element)] && \ ![info exists visited($realname)]} { lappend res [emitForwardDecl $realname] } } elseif {![info exists visited($element)] && \ [Deps::DirectlyContains $container_name $element] == 1} { lappend res [emit [$container lookup $element]] } } return $res } proc ChangeModule {c} { variable data variable moduledata variable module variable container while {![$c _is_a IDL:omg.org/CORBA/ModuleDef:1.0] && \ [$c _is_a IDL:omg.org/CORBA/Contained:1.0]} { set c [$c defined_in] } if {[$c _is_a IDL:omg.org/CORBA/ModuleDef:1.0]} { set newmod [$c absolute_name] } elseif {[$c _is_a IDL:omg.org/CORBA/Repository:1.0]} { set newmod :: } else { return } if {$newmod != $module} { if {$module != "::"} { set oldmod [$container lookup $module] while {[$oldmod _is_a IDL:omg.org/CORBA/ModuleDef:1.0]} { set moduledata [list [list module \ [emitRepoId $oldmod] \ $moduledata]] set oldmod [$oldmod defined_in] } lappend data [lindex $moduledata 0] unset moduledata } set module $newmod } } proc AddData {d} { variable moduledata variable module variable data if {$module == "::"} { lappend data $d } else { lappend moduledata $d } } proc CodeGen { _container _postorder } { variable container $_container variable postorder $_postorder variable visited catch {unset visited} variable data [list] variable module :: variable moduledata [list] foreach element $postorder { if {[string range $element 0 4] == "_fwd_"} { set realname [string range $element 5 end] if {![info exists visited($element)] && \ ![info exists visited($realname)]} { set contained [$container lookup $realname] ChangeModule [$contained defined_in] AddData [emitForwardDecl $realname] } } else { if {![info exists visited($element)]} { set contained [$container lookup $element] ChangeModule [$contained defined_in] AddData [emit $contained] } } } ChangeModule $container return $data } } # # ---------------------------------------------------------------------- # Produce (print) an implementation skeleton for interfaces. # ---------------------------------------------------------------------- # namespace eval ImplGen { proc emitLine {{data {}}} { variable indent variable out if {$data != {}} { for {set i 0} {$i < $indent} {incr i} { puts -nonewline $out " " } } puts $out $data } proc Indent {{increment 1}} { variable indent incr indent $increment } proc TypeOf {idltype} { set kind [$idltype def_kind] switch $kind { dk_Struct { set res "struct [$idltype name]" } dk_Union { set res "union [$idltype name]" } dk_Alias { set res [TypeOf [$idltype original_type_def]] } dk_Enum { set res "enum [$idltype name]" } dk_Primitive { set ptype [$idltype kind] set res [string range $ptype 3 end] } dk_String { set res "string<[$idltype bound]>" } dk_Wstring { set res "wstring<[$idltype bound]>" } dk_Sequence { if {[$idltype bound] == 0} { set res "sequence<[TypeOf [$idltype element_type_def]]>" } else { set res "sequence<[TypeOf [$idltype element_type_def]], [$idltype bound]" } } dk_Array { set res "[TypeOf [$idltype element_type_def]]\[[$idltype length]\]" } dk_Interface { set res "[$idltype id] object reference" } dk_Value { set res "valuetype [$idltype name]" } default { error "oops, unknown type" } } return $res } proc emitAttributeDcl {attr} { emitLine "# type of [$attr name] is [TypeOf [$attr type_def]]" emitLine "public variable [$attr name]" emitLine } proc emitOperationDcl {op} { set params [$op params] set allpars [list] foreach param [$op params] { array set pardata $param lappend allpars $pardata(name) } emitLine "public method [$op name] \{[join $allpars]\}" } proc emitInterfaceDcl {iface} { emitLine "#" emitLine "# declaration for Interface [$iface absolute_name]" emitLine "#" emitLine emitLine "class [$iface absolute_name] \{" Indent # # class inheritance # set bases [$iface base_interfaces] if {[llength $bases] == 0} { emitLine "inherit ::PortableServer::ServantBase" } elseif {[llength $bases] == 1} { set base [lindex $bases 0] emitLine "inherit [$base absolute_name]" } else { puts stderr "warning: [$iface absolute_name] uses multiple inheritance" emitLine "#" emitLine "# This causes \"diamond inheritance\" and is not supported" emitLine "# by \[incr Tcl\] yet. You'll have to use delegation here." emitLine "#" set inheritances [list] foreach base $bases { lappend inheritances [$base absolute_name] } emitLine "inherit [join $inheritances]" } emitLine # # method _Interface # emitLine "public method _Interface \{\} \{" Indent emitLine "return \"[$iface id]\"" Indent -1 emitLine "\}" emitLine # # Handle Attributes # set attrs [$iface contents dk_Attribute true] foreach attr $attrs { emitAttributeDcl $attr } # # Handle Operations # set ops [$iface contents dk_Operation true] foreach op $ops { emitOperationDcl $op } # # done # Indent -1 emitLine "\}" emitLine } proc emitOperationBody {op} { emitLine "#" emitLine "# operation [$op name]" emitLine "#" set params [$op params] set allpars [list] if {[llength $params] > 0} { emitLine "# parameters:" foreach param [$op params] { array set pardata $param switch $pardata(mode) { PARAM_IN { set dir in } PARAM_OUT { set dir out } PARAM_INOUT { set dir inout } } emitLine "# $pardata(name): $dir [TypeOf $pardata(type_def)]" lappend allpars $pardata(name) } emitLine "#" } emitLine "# returns:" emitLine "# [TypeOf [$op result_def]]" emitLine "#" set exs [$op exceptions] if {[llength $exs] > 0} { emitLine "# raises:" foreach ex $exs { emitLine "# [$ex id]" } emitLine "#" } emitLine emitLine "body [$op absolute_name] \{[join $allpars]\} \{" Indent emitLine "#" emitLine "# Add implementation here" emitLine "#" emitLine emitLine "error \"Unimplemented method [$op absolute_name]\"" Indent -1 emitLine "\}" emitLine } proc emitInterfaceBody {iface} { emitLine "#" emitLine "# ----------------------------------------------------------------------" emitLine "#" emitLine "# code for Interface [$iface absolute_name]" emitLine "#" emitLine "# ----------------------------------------------------------------------" emitLine "#" emitLine # # Handle Operations # set ops [$iface contents dk_Operation true] foreach op $ops { emitOperationBody $op } } proc ImplGen {_container postorder {_out stdout}} { variable container $_container variable out $_out variable module :: variable indent 0 emitLine "#" emitLine "# ----------------------------------------------------------------------" emitLine "#" emitLine "# Declarations" emitLine "#" emitLine "# ----------------------------------------------------------------------" emitLine "#" emitLine # # First pass: emit declarations # foreach element $postorder { set contained [$container lookup $element] if {$contained != 0 && [$contained def_kind] == "dk_Interface"} { emitInterfaceDcl $contained } } # # Second pass: emit empty method bodies # foreach element $postorder { set contained [$container lookup $element] if {$contained != 0 && [$contained def_kind] == "dk_Interface"} { emitInterfaceBody $contained } } } } # # ---------------------------------------------------------------------- # Type information for the Interface Repository, so that we can talk to # it. # ---------------------------------------------------------------------- # # # This file was automatically generated from ir.idl # by idl2tcl. Do not edit. # set _ir_ir \ {{module {IDL:omg.org/CORBA:1.0 CORBA 1.0} {{typedef\ {IDL:omg.org/CORBA/Identifier:1.0 Identifier 1.0} string} {typedef\ {IDL:omg.org/CORBA/VersionSpec:1.0 VersionSpec 1.0} string} {typedef\ {IDL:omg.org/CORBA/RepositoryId:1.0 RepositoryId 1.0} string} {enum\ {IDL:omg.org/CORBA/DefinitionKind:1.0 DefinitionKind 1.0} {dk_none dk_all\ dk_Attribute dk_Constant dk_Exception dk_Interface dk_Module dk_Operation\ dk_Typedef dk_Alias dk_Struct dk_Union dk_Enum dk_Primitive dk_String\ dk_Sequence dk_Array dk_Repository dk_Wstring dk_Fixed dk_Value dk_ValueBox\ dk_ValueMember dk_Native dk_AbstractInterface dk_LocalInterface dk_Component\ dk_Home dk_Factory dk_Finder dk_PrimaryKey dk_Emits dk_Publishes dk_Consumes\ dk_Provides dk_Uses dk_Event}} {interface {IDL:omg.org/CORBA/IRObject:1.0\ IRObject 1.0} {} {{attribute {IDL:omg.org/CORBA/IRObject/def_kind:1.0\ def_kind 1.0} IDL:omg.org/CORBA/DefinitionKind:1.0 readonly} {operation\ {IDL:omg.org/CORBA/IRObject/destroy:1.0 destroy 1.0} void {} {}}}} {interface\ {IDL:omg.org/CORBA/IDLType:1.0 IDLType 1.0} IDL:omg.org/CORBA/IRObject:1.0\ {{attribute {IDL:omg.org/CORBA/IDLType/type:1.0 type 1.0} TypeCode\ readonly}}} {struct {IDL:omg.org/CORBA/StructMember:1.0 StructMember 1.0}\ {{name IDL:omg.org/CORBA/Identifier:1.0} {type TypeCode} {type_def\ IDL:omg.org/CORBA/IDLType:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/StructMemberSeq:1.0 StructMemberSeq 1.0} {sequence\ IDL:omg.org/CORBA/StructMember:1.0}} {struct\ {IDL:omg.org/CORBA/UnionMember:1.0 UnionMember 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {label any} {type TypeCode} {type_def\ IDL:omg.org/CORBA/IDLType:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/UnionMemberSeq:1.0 UnionMemberSeq 1.0} {sequence\ IDL:omg.org/CORBA/UnionMember:1.0}} {typedef\ {IDL:omg.org/CORBA/EnumMemberSeq:1.0 EnumMemberSeq 1.0} {sequence\ IDL:omg.org/CORBA/Identifier:1.0}} {typedef {IDL:omg.org/CORBA/Visibility:1.0\ Visibility 1.0} short} {const {IDL:omg.org/CORBA/PRIVATE_MEMBER:1.0\ PRIVATE_MEMBER 1.0} IDL:omg.org/CORBA/Visibility:1.0 0} {const\ {IDL:omg.org/CORBA/PUBLIC_MEMBER:1.0 PUBLIC_MEMBER 1.0}\ IDL:omg.org/CORBA/Visibility:1.0 1} {typedef\ {IDL:omg.org/CORBA/ValueModifier:1.0 ValueModifier 1.0} short} {const\ {IDL:omg.org/CORBA/VM_NONE:1.0 VM_NONE 1.0}\ IDL:omg.org/CORBA/ValueModifier:1.0 0} {const\ {IDL:omg.org/CORBA/VM_CUSTOM:1.0 VM_CUSTOM 1.0}\ IDL:omg.org/CORBA/ValueModifier:1.0 1} {const\ {IDL:omg.org/CORBA/VM_ABSTRACT:1.0 VM_ABSTRACT 1.0}\ IDL:omg.org/CORBA/ValueModifier:1.0 2} {const\ {IDL:omg.org/CORBA/VM_TRUNCATABLE:1.0 VM_TRUNCATABLE 1.0}\ IDL:omg.org/CORBA/ValueModifier:1.0 3} {struct\ {IDL:omg.org/CORBA/ValueMember:1.0 ValueMember 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {type TypeCode} {type_def\ IDL:omg.org/CORBA/IDLType:1.0} {access IDL:omg.org/CORBA/Visibility:1.0}} {}}\ {typedef {IDL:omg.org/CORBA/ValueMemberSeq:1.0 ValueMemberSeq 1.0} {sequence\ IDL:omg.org/CORBA/ValueMember:1.0}} {typedef\ {IDL:omg.org/CORBA/ScopedName:1.0 ScopedName 1.0} string} {interface\ {IDL:omg.org/CORBA/Container:1.0 Container 1.0}} {interface\ {IDL:omg.org/CORBA/Repository:1.0 Repository 1.0}} {interface\ {IDL:omg.org/CORBA/Contained:1.0 Contained 1.0}\ IDL:omg.org/CORBA/IRObject:1.0 {{attribute\ {IDL:omg.org/CORBA/Contained/id:1.0 id 1.0}\ IDL:omg.org/CORBA/RepositoryId:1.0} {attribute\ {IDL:omg.org/CORBA/Contained/name:1.0 name 1.0}\ IDL:omg.org/CORBA/Identifier:1.0} {attribute\ {IDL:omg.org/CORBA/Contained/version:1.0 version 1.0}\ IDL:omg.org/CORBA/VersionSpec:1.0} {attribute\ {IDL:omg.org/CORBA/Contained/defined_in:1.0 defined_in 1.0}\ IDL:omg.org/CORBA/Container:1.0 readonly} {attribute\ {IDL:omg.org/CORBA/Contained/absolute_name:1.0 absolute_name 1.0}\ IDL:omg.org/CORBA/ScopedName:1.0 readonly} {attribute\ {IDL:omg.org/CORBA/Contained/containing_repository:1.0 containing_repository\ 1.0} IDL:omg.org/CORBA/Repository:1.0 readonly} {struct\ {IDL:omg.org/CORBA/Contained/Description:1.0 Description 1.0} {{kind\ IDL:omg.org/CORBA/DefinitionKind:1.0} {value any}} {}} {operation\ {IDL:omg.org/CORBA/Contained/describe:1.0 describe 1.0}\ IDL:omg.org/CORBA/Contained/Description:1.0 {} {}} {operation\ {IDL:omg.org/CORBA/Contained/move:1.0 move 1.0} void {{in new_container\ IDL:omg.org/CORBA/Container:1.0} {in new_name\ IDL:omg.org/CORBA/Identifier:1.0} {in new_version\ IDL:omg.org/CORBA/VersionSpec:1.0}} {}}}} {typedef\ {IDL:omg.org/CORBA/ContainedSeq:1.0 ContainedSeq 1.0} {sequence\ IDL:omg.org/CORBA/Contained:1.0}} {interface {IDL:omg.org/CORBA/ModuleDef:1.0\ ModuleDef 1.0}} {interface {IDL:omg.org/CORBA/ConstantDef:1.0 ConstantDef\ 1.0}} {interface {IDL:omg.org/CORBA/StructDef:1.0 StructDef 1.0}} {interface\ {IDL:omg.org/CORBA/ExceptionDef:1.0 ExceptionDef 1.0}} {interface\ {IDL:omg.org/CORBA/UnionDef:1.0 UnionDef 1.0}} {interface\ {IDL:omg.org/CORBA/EnumDef:1.0 EnumDef 1.0}} {interface\ {IDL:omg.org/CORBA/AliasDef:1.0 AliasDef 1.0}} {interface\ {IDL:omg.org/CORBA/InterfaceDef:1.0 InterfaceDef 1.0}} {typedef\ {IDL:omg.org/CORBA/InterfaceDefSeq:1.0 InterfaceDefSeq 1.0} {sequence\ IDL:omg.org/CORBA/InterfaceDef:1.0}} {interface\ {IDL:omg.org/CORBA/AbstractInterfaceDef:1.0 AbstractInterfaceDef 1.0}}\ {typedef {IDL:omg.org/CORBA/AbstractInterfaceDefSeq:1.0\ AbstractInterfaceDefSeq 1.0} {sequence\ IDL:omg.org/CORBA/AbstractInterfaceDef:1.0}} {interface\ {IDL:omg.org/CORBA/LocalInterfaceDef:1.0 LocalInterfaceDef 1.0}} {interface\ {IDL:omg.org/CORBA/ValueDef:1.0 ValueDef 1.0}} {typedef\ {IDL:omg.org/CORBA/ValueDefSeq:1.0 ValueDefSeq 1.0} {sequence\ IDL:omg.org/CORBA/ValueDef:1.0}} {struct {IDL:omg.org/CORBA/Initializer:1.0\ Initializer 1.0} {{members IDL:omg.org/CORBA/StructMemberSeq:1.0} {name\ IDL:omg.org/CORBA/Identifier:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/InitializerSeq:1.0 InitializerSeq 1.0} {sequence\ IDL:omg.org/CORBA/Initializer:1.0}} {typedef\ {IDL:omg.org/CORBA/ExceptionDefSeq:1.0 ExceptionDefSeq 1.0} {sequence\ IDL:omg.org/CORBA/ExceptionDef:1.0}} {struct\ {IDL:omg.org/CORBA/ExceptionDescription:1.0 ExceptionDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {type TypeCode}} {}} {typedef\ {IDL:omg.org/CORBA/ExcDescriptionSeq:1.0 ExcDescriptionSeq 1.0} {sequence\ IDL:omg.org/CORBA/ExceptionDescription:1.0}} {struct\ {IDL:omg.org/CORBA/ExtInitializer:1.0 ExtInitializer 1.0} {{members\ IDL:omg.org/CORBA/StructMemberSeq:1.0} {exceptions_def\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {exceptions\ IDL:omg.org/CORBA/ExcDescriptionSeq:1.0} {name\ IDL:omg.org/CORBA/Identifier:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/ExtInitializerSeq:1.0 ExtInitializerSeq 1.0} {sequence\ IDL:omg.org/CORBA/ExtInitializer:1.0}} {interface\ {IDL:omg.org/CORBA/ExtValueDef:1.0 ExtValueDef 1.0}} {interface\ {IDL:omg.org/CORBA/ValueBoxDef:1.0 ValueBoxDef 1.0}} {interface\ {IDL:omg.org/CORBA/NativeDef:1.0 NativeDef 1.0}} {interface\ {IDL:omg.org/CORBA/Container:1.0 Container 1.0}\ IDL:omg.org/CORBA/IRObject:1.0 {{operation\ {IDL:omg.org/CORBA/Container/lookup:1.0 lookup 1.0}\ IDL:omg.org/CORBA/Contained:1.0 {{in search_name\ IDL:omg.org/CORBA/ScopedName:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/contents:1.0 contents 1.0}\ IDL:omg.org/CORBA/ContainedSeq:1.0 {{in limit_type\ IDL:omg.org/CORBA/DefinitionKind:1.0} {in exclude_inherited boolean}} {}}\ {operation {IDL:omg.org/CORBA/Container/lookup_name:1.0 lookup_name 1.0}\ IDL:omg.org/CORBA/ContainedSeq:1.0 {{in search_name\ IDL:omg.org/CORBA/Identifier:1.0} {in levels_to_search long} {in limit_type\ IDL:omg.org/CORBA/DefinitionKind:1.0} {in exclude_inherited boolean}} {}}\ {struct {IDL:omg.org/CORBA/Container/Description:1.0 Description 1.0}\ {{contained_object IDL:omg.org/CORBA/Contained:1.0} {kind\ IDL:omg.org/CORBA/DefinitionKind:1.0} {value any}} {}} {typedef\ {IDL:omg.org/CORBA/Container/DescriptionSeq:1.0 DescriptionSeq 1.0} {sequence\ IDL:omg.org/CORBA/Container/Description:1.0}} {operation\ {IDL:omg.org/CORBA/Container/describe_contents:1.0 describe_contents 1.0}\ IDL:omg.org/CORBA/Container/DescriptionSeq:1.0 {{in limit_type\ IDL:omg.org/CORBA/DefinitionKind:1.0} {in exclude_inherited boolean} {in\ max_returned_objs long}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_module:1.0 create_module 1.0}\ IDL:omg.org/CORBA/ModuleDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_constant:1.0 create_constant 1.0}\ IDL:omg.org/CORBA/ConstantDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in type IDL:omg.org/CORBA/IDLType:1.0}\ {in value any}} {}} {operation {IDL:omg.org/CORBA/Container/create_struct:1.0\ create_struct 1.0} IDL:omg.org/CORBA/StructDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in members\ IDL:omg.org/CORBA/StructMemberSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_exception:1.0 create_exception 1.0}\ IDL:omg.org/CORBA/ExceptionDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in members\ IDL:omg.org/CORBA/StructMemberSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_union:1.0 create_union 1.0}\ IDL:omg.org/CORBA/UnionDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in discriminator_type\ IDL:omg.org/CORBA/IDLType:1.0} {in members\ IDL:omg.org/CORBA/UnionMemberSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_enum:1.0 create_enum 1.0}\ IDL:omg.org/CORBA/EnumDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0} {in\ name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in members\ IDL:omg.org/CORBA/EnumMemberSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_alias:1.0 create_alias 1.0}\ IDL:omg.org/CORBA/AliasDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in original_type\ IDL:omg.org/CORBA/IDLType:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_interface:1.0 create_interface 1.0}\ IDL:omg.org/CORBA/InterfaceDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in base_interfaces\ IDL:omg.org/CORBA/InterfaceDefSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_abstract_interface:1.0\ create_abstract_interface 1.0} IDL:omg.org/CORBA/AbstractInterfaceDef:1.0\ {{in id IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in base_interfaces\ IDL:omg.org/CORBA/AbstractInterfaceDefSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_local_interface:1.0\ create_local_interface 1.0} IDL:omg.org/CORBA/LocalInterfaceDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in base_interfaces\ IDL:omg.org/CORBA/InterfaceDefSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_value:1.0 create_value 1.0}\ IDL:omg.org/CORBA/ValueDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in is_custom boolean} {in is_abstract\ boolean} {in base_value IDL:omg.org/CORBA/ValueDef:1.0} {in is_truncatable\ boolean} {in abstract_base_values IDL:omg.org/CORBA/ValueDefSeq:1.0} {in\ supported_interfaces IDL:omg.org/CORBA/InterfaceDefSeq:1.0} {in initializers\ IDL:omg.org/CORBA/InitializerSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_ext_value:1.0 create_ext_value 1.0}\ IDL:omg.org/CORBA/ExtValueDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in is_custom boolean} {in is_abstract\ boolean} {in base_value IDL:omg.org/CORBA/ValueDef:1.0} {in is_truncatable\ boolean} {in abstract_base_values IDL:omg.org/CORBA/ValueDefSeq:1.0} {in\ supported_interfaces IDL:omg.org/CORBA/InterfaceDefSeq:1.0} {in initializers\ IDL:omg.org/CORBA/ExtInitializerSeq:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_value_box:1.0 create_value_box 1.0}\ IDL:omg.org/CORBA/ValueBoxDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in original_type_def\ IDL:omg.org/CORBA/IDLType:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Container/create_native:1.0 create_native 1.0}\ IDL:omg.org/CORBA/NativeDef:1.0 {{in id IDL:omg.org/CORBA/RepositoryId:1.0}\ {in name IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0}} {}}}} {enum\ {IDL:omg.org/CORBA/PrimitiveKind:1.0 PrimitiveKind 1.0} {pk_null pk_void\ pk_short pk_long pk_ushort pk_ulong pk_float pk_double pk_boolean pk_char\ pk_octet pk_any pk_TypeCode pk_Principal pk_string pk_objref pk_longlong\ pk_ulonglong pk_longdouble pk_wchar pk_wstring pk_value_base}} {interface\ {IDL:omg.org/CORBA/PrimitiveDef:1.0 PrimitiveDef 1.0}} {interface\ {IDL:omg.org/CORBA/StringDef:1.0 StringDef 1.0}} {interface\ {IDL:omg.org/CORBA/WstringDef:1.0 WstringDef 1.0}} {interface\ {IDL:omg.org/CORBA/SequenceDef:1.0 SequenceDef 1.0}} {interface\ {IDL:omg.org/CORBA/ArrayDef:1.0 ArrayDef 1.0}} {interface\ {IDL:omg.org/CORBA/FixedDef:1.0 FixedDef 1.0}} {interface\ {IDL:omg.org/CORBA/Repository:1.0 Repository 1.0}\ IDL:omg.org/CORBA/Container:1.0 {{operation\ {IDL:omg.org/CORBA/Repository/lookup_id:1.0 lookup_id 1.0}\ IDL:omg.org/CORBA/Contained:1.0 {{in search_id\ IDL:omg.org/CORBA/RepositoryId:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Repository/get_primitive:1.0 get_primitive 1.0}\ IDL:omg.org/CORBA/PrimitiveDef:1.0 {{in kind\ IDL:omg.org/CORBA/PrimitiveKind:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Repository/create_string:1.0 create_string 1.0}\ IDL:omg.org/CORBA/StringDef:1.0 {{in bound {unsigned long}}} {}} {operation\ {IDL:omg.org/CORBA/Repository/create_wstring:1.0 create_wstring 1.0}\ IDL:omg.org/CORBA/WstringDef:1.0 {{in bound {unsigned long}}} {}} {operation\ {IDL:omg.org/CORBA/Repository/create_sequence:1.0 create_sequence 1.0}\ IDL:omg.org/CORBA/SequenceDef:1.0 {{in bound {unsigned long}} {in\ element_type IDL:omg.org/CORBA/IDLType:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Repository/create_array:1.0 create_array 1.0}\ IDL:omg.org/CORBA/ArrayDef:1.0 {{in length {unsigned long}} {in element_type\ IDL:omg.org/CORBA/IDLType:1.0}} {}} {operation\ {IDL:omg.org/CORBA/Repository/create_fixed:1.0 create_fixed 1.0}\ IDL:omg.org/CORBA/FixedDef:1.0 {{in digits {unsigned short}} {in scale\ short}} {}}}} {interface {IDL:omg.org/CORBA/PrimitiveDef:1.0 PrimitiveDef\ 1.0} IDL:omg.org/CORBA/IDLType:1.0 {{attribute\ {IDL:omg.org/CORBA/PrimitiveDef/kind:1.0 kind 1.0}\ IDL:omg.org/CORBA/PrimitiveKind:1.0 readonly}}} {interface\ {IDL:omg.org/CORBA/StringDef:1.0 StringDef 1.0} IDL:omg.org/CORBA/IDLType:1.0\ {{attribute {IDL:omg.org/CORBA/StringDef/bound:1.0 bound 1.0} {unsigned\ long}}}} {interface {IDL:omg.org/CORBA/WstringDef:1.0 WstringDef 1.0}\ IDL:omg.org/CORBA/IDLType:1.0 {{attribute\ {IDL:omg.org/CORBA/WstringDef/bound:1.0 bound 1.0} {unsigned long}}}}\ {interface {IDL:omg.org/CORBA/SequenceDef:1.0 SequenceDef 1.0}\ IDL:omg.org/CORBA/IDLType:1.0 {{attribute\ {IDL:omg.org/CORBA/SequenceDef/bound:1.0 bound 1.0} {unsigned long}}\ {attribute {IDL:omg.org/CORBA/SequenceDef/element_type:1.0 element_type 1.0}\ TypeCode readonly} {attribute\ {IDL:omg.org/CORBA/SequenceDef/element_type_def:1.0 element_type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0}}} {interface {IDL:omg.org/CORBA/ArrayDef:1.0\ ArrayDef 1.0} IDL:omg.org/CORBA/IDLType:1.0 {{attribute\ {IDL:omg.org/CORBA/ArrayDef/length:1.0 length 1.0} {unsigned long}}\ {attribute {IDL:omg.org/CORBA/ArrayDef/element_type:1.0 element_type 1.0}\ TypeCode readonly} {attribute\ {IDL:omg.org/CORBA/ArrayDef/element_type_def:1.0 element_type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0}}} {interface {IDL:omg.org/CORBA/FixedDef:1.0\ FixedDef 1.0} IDL:omg.org/CORBA/IDLType:1.0 {{attribute\ {IDL:omg.org/CORBA/FixedDef/digits:1.0 digits 1.0} {unsigned short}}\ {attribute {IDL:omg.org/CORBA/FixedDef/scale:1.0 scale 1.0} short}}}\ {interface {IDL:omg.org/CORBA/ModuleDef:1.0 ModuleDef 1.0}\ {IDL:omg.org/CORBA/Container:1.0 IDL:omg.org/CORBA/Contained:1.0} {}}\ {interface {IDL:omg.org/CORBA/ConstantDef:1.0 ConstantDef 1.0}\ IDL:omg.org/CORBA/Contained:1.0 {{attribute\ {IDL:omg.org/CORBA/ConstantDef/type:1.0 type 1.0} TypeCode readonly}\ {attribute {IDL:omg.org/CORBA/ConstantDef/type_def:1.0 type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0} {attribute\ {IDL:omg.org/CORBA/ConstantDef/value:1.0 value 1.0} any}}} {interface\ {IDL:omg.org/CORBA/TypedefDef:1.0 TypedefDef 1.0}\ {IDL:omg.org/CORBA/Contained:1.0 IDL:omg.org/CORBA/IDLType:1.0} {}}\ {interface {IDL:omg.org/CORBA/StructDef:1.0 StructDef 1.0}\ {IDL:omg.org/CORBA/TypedefDef:1.0 IDL:omg.org/CORBA/Container:1.0}\ {{attribute {IDL:omg.org/CORBA/StructDef/members:1.0 members 1.0}\ IDL:omg.org/CORBA/StructMemberSeq:1.0}}} {interface\ {IDL:omg.org/CORBA/ExceptionDef:1.0 ExceptionDef 1.0}\ {IDL:omg.org/CORBA/Contained:1.0 IDL:omg.org/CORBA/Container:1.0} {{attribute\ {IDL:omg.org/CORBA/ExceptionDef/type:1.0 type 1.0} TypeCode readonly}\ {attribute {IDL:omg.org/CORBA/ExceptionDef/members:1.0 members 1.0}\ IDL:omg.org/CORBA/StructMemberSeq:1.0}}} {interface\ {IDL:omg.org/CORBA/UnionDef:1.0 UnionDef 1.0}\ {IDL:omg.org/CORBA/TypedefDef:1.0 IDL:omg.org/CORBA/Container:1.0}\ {{attribute {IDL:omg.org/CORBA/UnionDef/discriminator_type:1.0\ discriminator_type 1.0} TypeCode readonly} {attribute\ {IDL:omg.org/CORBA/UnionDef/discriminator_type_def:1.0 discriminator_type_def\ 1.0} IDL:omg.org/CORBA/IDLType:1.0} {attribute\ {IDL:omg.org/CORBA/UnionDef/members:1.0 members 1.0}\ IDL:omg.org/CORBA/UnionMemberSeq:1.0}}} {interface\ {IDL:omg.org/CORBA/EnumDef:1.0 EnumDef 1.0} IDL:omg.org/CORBA/TypedefDef:1.0\ {{attribute {IDL:omg.org/CORBA/EnumDef/members:1.0 members 1.0}\ IDL:omg.org/CORBA/EnumMemberSeq:1.0}}} {interface\ {IDL:omg.org/CORBA/AliasDef:1.0 AliasDef 1.0}\ IDL:omg.org/CORBA/TypedefDef:1.0 {{attribute\ {IDL:omg.org/CORBA/AliasDef/original_type_def:1.0 original_type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0}}} {enum {IDL:omg.org/CORBA/OperationMode:1.0\ OperationMode 1.0} {OP_NORMAL OP_ONEWAY}} {typedef\ {IDL:omg.org/CORBA/ContextIdentifier:1.0 ContextIdentifier 1.0}\ IDL:omg.org/CORBA/Identifier:1.0} {typedef\ {IDL:omg.org/CORBA/ContextIdSeq:1.0 ContextIdSeq 1.0} {sequence\ IDL:omg.org/CORBA/ContextIdentifier:1.0}} {enum\ {IDL:omg.org/CORBA/ParameterMode:1.0 ParameterMode 1.0} {PARAM_IN PARAM_OUT\ PARAM_INOUT}} {struct {IDL:omg.org/CORBA/ParameterDescription:1.0\ ParameterDescription 1.0} {{name IDL:omg.org/CORBA/Identifier:1.0} {type\ TypeCode} {type_def IDL:omg.org/CORBA/IDLType:1.0} {mode\ IDL:omg.org/CORBA/ParameterMode:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/ParDescriptionSeq:1.0 ParDescriptionSeq 1.0} {sequence\ IDL:omg.org/CORBA/ParameterDescription:1.0}} {struct\ {IDL:omg.org/CORBA/OperationDescription:1.0 OperationDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {result TypeCode} {mode\ IDL:omg.org/CORBA/OperationMode:1.0} {contexts\ IDL:omg.org/CORBA/ContextIdSeq:1.0} {parameters\ IDL:omg.org/CORBA/ParDescriptionSeq:1.0} {exceptions\ IDL:omg.org/CORBA/ExcDescriptionSeq:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/OpDescriptionSeq:1.0 OpDescriptionSeq 1.0} {sequence\ IDL:omg.org/CORBA/OperationDescription:1.0}} {enum\ {IDL:omg.org/CORBA/AttributeMode:1.0 AttributeMode 1.0} {ATTR_NORMAL\ ATTR_READONLY}} {struct {IDL:omg.org/CORBA/AttributeDescription:1.0\ AttributeDescription 1.0} {{name IDL:omg.org/CORBA/Identifier:1.0} {id\ IDL:omg.org/CORBA/RepositoryId:1.0} {defined_in\ IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {type TypeCode} {mode\ IDL:omg.org/CORBA/AttributeMode:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/AttrDescriptionSeq:1.0 AttrDescriptionSeq 1.0} {sequence\ IDL:omg.org/CORBA/AttributeDescription:1.0}} {typedef\ {IDL:omg.org/CORBA/RepositoryIdSeq:1.0 RepositoryIdSeq 1.0} {sequence\ IDL:omg.org/CORBA/RepositoryId:1.0}} {interface\ {IDL:omg.org/CORBA/AttributeDef:1.0 AttributeDef 1.0}} {interface\ {IDL:omg.org/CORBA/OperationDef:1.0 OperationDef 1.0}} {interface\ {IDL:omg.org/CORBA/InterfaceDef:1.0 InterfaceDef 1.0}\ {IDL:omg.org/CORBA/Container:1.0 IDL:omg.org/CORBA/Contained:1.0\ IDL:omg.org/CORBA/IDLType:1.0} {{attribute\ {IDL:omg.org/CORBA/InterfaceDef/base_interfaces:1.0 base_interfaces 1.0}\ IDL:omg.org/CORBA/InterfaceDefSeq:1.0} {operation\ {IDL:omg.org/CORBA/InterfaceDef/is_a:1.0 is_a 1.0} boolean {{in interface_id\ IDL:omg.org/CORBA/RepositoryId:1.0}} {}} {struct\ {IDL:omg.org/CORBA/InterfaceDef/FullInterfaceDescription:1.0\ FullInterfaceDescription 1.0} {{name IDL:omg.org/CORBA/Identifier:1.0} {id\ IDL:omg.org/CORBA/RepositoryId:1.0} {defined_in\ IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {operations\ IDL:omg.org/CORBA/OpDescriptionSeq:1.0} {attributes\ IDL:omg.org/CORBA/AttrDescriptionSeq:1.0} {base_interfaces\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {type TypeCode}} {}} {operation\ {IDL:omg.org/CORBA/InterfaceDef/describe_interface:1.0 describe_interface\ 1.0} IDL:omg.org/CORBA/InterfaceDef/FullInterfaceDescription:1.0 {} {}}\ {operation {IDL:omg.org/CORBA/InterfaceDef/create_attribute:1.0\ create_attribute 1.0} IDL:omg.org/CORBA/AttributeDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in type IDL:omg.org/CORBA/IDLType:1.0}\ {in mode IDL:omg.org/CORBA/AttributeMode:1.0}} {}} {operation\ {IDL:omg.org/CORBA/InterfaceDef/create_operation:1.0 create_operation 1.0}\ IDL:omg.org/CORBA/OperationDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in result IDL:omg.org/CORBA/IDLType:1.0}\ {in mode IDL:omg.org/CORBA/OperationMode:1.0} {in params\ IDL:omg.org/CORBA/ParDescriptionSeq:1.0} {in exceptions\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {in contexts\ IDL:omg.org/CORBA/ContextIdSeq:1.0}} {}}}} {interface\ {IDL:omg.org/CORBA/AbstractInterfaceDef:1.0 AbstractInterfaceDef 1.0}\ IDL:omg.org/CORBA/InterfaceDef:1.0 {}} {interface\ {IDL:omg.org/CORBA/LocalInterfaceDef:1.0 LocalInterfaceDef 1.0}\ IDL:omg.org/CORBA/InterfaceDef:1.0 {}} {interface\ {IDL:omg.org/CORBA/ValueMemberDef:1.0 ValueMemberDef 1.0}} {interface\ {IDL:omg.org/CORBA/ValueDef:1.0 ValueDef 1.0}\ {IDL:omg.org/CORBA/Container:1.0 IDL:omg.org/CORBA/Contained:1.0\ IDL:omg.org/CORBA/IDLType:1.0} {{attribute\ {IDL:omg.org/CORBA/ValueDef/supported_interfaces:1.0 supported_interfaces\ 1.0} IDL:omg.org/CORBA/InterfaceDefSeq:1.0} {attribute\ {IDL:omg.org/CORBA/ValueDef/initializers:1.0 initializers 1.0}\ IDL:omg.org/CORBA/InitializerSeq:1.0} {attribute\ {IDL:omg.org/CORBA/ValueDef/base_value:1.0 base_value 1.0}\ IDL:omg.org/CORBA/ValueDef:1.0} {attribute\ {IDL:omg.org/CORBA/ValueDef/abstract_base_values:1.0 abstract_base_values\ 1.0} IDL:omg.org/CORBA/ValueDefSeq:1.0} {attribute\ {IDL:omg.org/CORBA/ValueDef/is_abstract:1.0 is_abstract 1.0} boolean}\ {attribute {IDL:omg.org/CORBA/ValueDef/is_custom:1.0 is_custom 1.0} boolean}\ {attribute {IDL:omg.org/CORBA/ValueDef/is_truncatable:1.0 is_truncatable 1.0}\ boolean} {operation {IDL:omg.org/CORBA/ValueDef/is_a:1.0 is_a 1.0} boolean\ {{in value_id IDL:omg.org/CORBA/RepositoryId:1.0}} {}} {struct\ {IDL:omg.org/CORBA/ValueDef/FullValueDescription:1.0 FullValueDescription\ 1.0} {{name IDL:omg.org/CORBA/Identifier:1.0} {id\ IDL:omg.org/CORBA/RepositoryId:1.0} {is_abstract boolean} {is_custom boolean}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {operations\ IDL:omg.org/CORBA/OpDescriptionSeq:1.0} {attributes\ IDL:omg.org/CORBA/AttrDescriptionSeq:1.0} {members\ IDL:omg.org/CORBA/ValueMemberSeq:1.0} {initializers\ IDL:omg.org/CORBA/InitializerSeq:1.0} {supported_interfaces\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {abstract_base_values\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {is_truncatable boolean} {base_value\ IDL:omg.org/CORBA/RepositoryId:1.0} {type TypeCode}} {}} {operation\ {IDL:omg.org/CORBA/ValueDef/describe_value:1.0 describe_value 1.0}\ IDL:omg.org/CORBA/ValueDef/FullValueDescription:1.0 {} {}} {operation\ {IDL:omg.org/CORBA/ValueDef/create_value_member:1.0 create_value_member 1.0}\ IDL:omg.org/CORBA/ValueMemberDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in type IDL:omg.org/CORBA/IDLType:1.0}\ {in access IDL:omg.org/CORBA/Visibility:1.0}} {}} {operation\ {IDL:omg.org/CORBA/ValueDef/create_attribute:1.0 create_attribute 1.0}\ IDL:omg.org/CORBA/AttributeDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in type IDL:omg.org/CORBA/IDLType:1.0}\ {in mode IDL:omg.org/CORBA/AttributeMode:1.0}} {}} {operation\ {IDL:omg.org/CORBA/ValueDef/create_operation:1.0 create_operation 1.0}\ IDL:omg.org/CORBA/OperationDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in result IDL:omg.org/CORBA/IDLType:1.0}\ {in mode IDL:omg.org/CORBA/OperationMode:1.0} {in params\ IDL:omg.org/CORBA/ParDescriptionSeq:1.0} {in exceptions\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {in contexts\ IDL:omg.org/CORBA/ContextIdSeq:1.0}} {}}}} {struct\ {IDL:omg.org/CORBA/ExtAttributeDescription:1.0 ExtAttributeDescription 1.0}\ {{name IDL:omg.org/CORBA/Identifier:1.0} {id\ IDL:omg.org/CORBA/RepositoryId:1.0} {defined_in\ IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {type TypeCode} {mode\ IDL:omg.org/CORBA/AttributeMode:1.0} {get_exceptions\ IDL:omg.org/CORBA/ExcDescriptionSeq:1.0} {set_exceptions\ IDL:omg.org/CORBA/ExcDescriptionSeq:1.0}} {}} {typedef\ {IDL:omg.org/CORBA/ExtAttrDescriptionSeq:1.0 ExtAttrDescriptionSeq 1.0}\ {sequence IDL:omg.org/CORBA/ExtAttributeDescription:1.0}} {interface\ {IDL:omg.org/CORBA/ExtAttributeDef:1.0 ExtAttributeDef 1.0}} {interface\ {IDL:omg.org/CORBA/ExtValueDef:1.0 ExtValueDef 1.0}\ IDL:omg.org/CORBA/ValueDef:1.0 {{attribute\ {IDL:omg.org/CORBA/ExtValueDef/ext_initializers:1.0 ext_initializers 1.0}\ IDL:omg.org/CORBA/ExtInitializerSeq:1.0} {struct\ {IDL:omg.org/CORBA/ExtValueDef/ExtFullValueDescription:1.0\ ExtFullValueDescription 1.0} {{name IDL:omg.org/CORBA/Identifier:1.0} {id\ IDL:omg.org/CORBA/RepositoryId:1.0} {is_abstract boolean} {is_custom boolean}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {operations\ IDL:omg.org/CORBA/OpDescriptionSeq:1.0} {attributes\ IDL:omg.org/CORBA/ExtAttrDescriptionSeq:1.0} {members\ IDL:omg.org/CORBA/ValueMemberSeq:1.0} {initializers\ IDL:omg.org/CORBA/ExtInitializerSeq:1.0} {supported_interfaces\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {abstract_base_values\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {is_truncatable boolean} {base_value\ IDL:omg.org/CORBA/RepositoryId:1.0} {type TypeCode}} {}} {operation\ {IDL:omg.org/CORBA/ExtValueDef/describe_ext_value:1.0 describe_ext_value 1.0}\ IDL:omg.org/CORBA/ExtValueDef/ExtFullValueDescription:1.0 {} {}} {operation\ {IDL:omg.org/CORBA/ExtValueDef/create_ext_attribute:1.0 create_ext_attribute\ 1.0} IDL:omg.org/CORBA/ExtAttributeDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in type IDL:omg.org/CORBA/IDLType:1.0}\ {in mode IDL:omg.org/CORBA/AttributeMode:1.0} {in get_exceptions\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {in set_exceptions\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0}} {}}}} {interface\ {IDL:omg.org/CORBA/ValueBoxDef:1.0 ValueBoxDef 1.0}\ IDL:omg.org/CORBA/TypedefDef:1.0 {{attribute\ {IDL:omg.org/CORBA/ValueBoxDef/original_type_def:1.0 original_type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0}}} {interface {IDL:omg.org/CORBA/NativeDef:1.0\ NativeDef 1.0} IDL:omg.org/CORBA/TypedefDef:1.0 {}} {interface\ {IDL:omg.org/CORBA/AttributeDef:1.0 AttributeDef 1.0}\ IDL:omg.org/CORBA/Contained:1.0 {{attribute\ {IDL:omg.org/CORBA/AttributeDef/type:1.0 type 1.0} TypeCode readonly}\ {attribute {IDL:omg.org/CORBA/AttributeDef/type_def:1.0 type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0} {attribute\ {IDL:omg.org/CORBA/AttributeDef/mode:1.0 mode 1.0}\ IDL:omg.org/CORBA/AttributeMode:1.0}}} {interface\ {IDL:omg.org/CORBA/OperationDef:1.0 OperationDef 1.0}\ IDL:omg.org/CORBA/Contained:1.0 {{attribute\ {IDL:omg.org/CORBA/OperationDef/result:1.0 result 1.0} TypeCode readonly}\ {attribute {IDL:omg.org/CORBA/OperationDef/result_def:1.0 result_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0} {attribute\ {IDL:omg.org/CORBA/OperationDef/params:1.0 params 1.0}\ IDL:omg.org/CORBA/ParDescriptionSeq:1.0} {attribute\ {IDL:omg.org/CORBA/OperationDef/mode:1.0 mode 1.0}\ IDL:omg.org/CORBA/OperationMode:1.0} {attribute\ {IDL:omg.org/CORBA/OperationDef/contexts:1.0 contexts 1.0}\ IDL:omg.org/CORBA/ContextIdSeq:1.0} {attribute\ {IDL:omg.org/CORBA/OperationDef/exceptions:1.0 exceptions 1.0}\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0}}} {interface\ {IDL:omg.org/CORBA/ValueMemberDef:1.0 ValueMemberDef 1.0}\ IDL:omg.org/CORBA/Contained:1.0 {{attribute\ {IDL:omg.org/CORBA/ValueMemberDef/type:1.0 type 1.0} TypeCode readonly}\ {attribute {IDL:omg.org/CORBA/ValueMemberDef/type_def:1.0 type_def 1.0}\ IDL:omg.org/CORBA/IDLType:1.0} {attribute\ {IDL:omg.org/CORBA/ValueMemberDef/access:1.0 access 1.0}\ IDL:omg.org/CORBA/Visibility:1.0}}} {interface\ {IDL:omg.org/CORBA/ExtAttributeDef:1.0 ExtAttributeDef 1.0}\ IDL:omg.org/CORBA/AttributeDef:1.0 {{attribute\ {IDL:omg.org/CORBA/ExtAttributeDef/get_exceptions:1.0 get_exceptions 1.0}\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {attribute\ {IDL:omg.org/CORBA/ExtAttributeDef/set_exceptions:1.0 set_exceptions 1.0}\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {operation\ {IDL:omg.org/CORBA/ExtAttributeDef/describe_attribute:1.0 describe_attribute\ 1.0} IDL:omg.org/CORBA/ExtAttributeDescription:1.0 {} {}}}} {typedef\ {IDL:omg.org/CORBA/LocalInterfaceDefSeq:1.0 LocalInterfaceDefSeq 1.0}\ {sequence IDL:omg.org/CORBA/LocalInterfaceDef:1.0}} {struct\ {IDL:omg.org/CORBA/ModuleDescription:1.0 ModuleDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0}} {}} {struct\ {IDL:omg.org/CORBA/ConstantDescription:1.0 ConstantDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {type TypeCode} {value any}} {}} {struct\ {IDL:omg.org/CORBA/TypeDescription:1.0 TypeDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {type TypeCode}} {}} {struct\ {IDL:omg.org/CORBA/InterfaceDescription:1.0 InterfaceDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {defined_in IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {base_interfaces\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0}} {}} {interface\ {IDL:omg.org/CORBA/InterfaceAttrExtension:1.0 InterfaceAttrExtension 1.0} {}\ {{struct\ {IDL:omg.org/CORBA/InterfaceAttrExtension/ExtFullInterfaceDescription:1.0\ ExtFullInterfaceDescription 1.0} {{name IDL:omg.org/CORBA/Identifier:1.0} {id\ IDL:omg.org/CORBA/RepositoryId:1.0} {defined_in\ IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {operations\ IDL:omg.org/CORBA/OpDescriptionSeq:1.0} {attributes\ IDL:omg.org/CORBA/ExtAttrDescriptionSeq:1.0} {base_interfaces\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {type TypeCode}} {}} {operation\ {IDL:omg.org/CORBA/InterfaceAttrExtension/describe_ext_interface:1.0\ describe_ext_interface 1.0}\ IDL:omg.org/CORBA/InterfaceAttrExtension/ExtFullInterfaceDescription:1.0 {}\ {}} {operation\ {IDL:omg.org/CORBA/InterfaceAttrExtension/create_ext_attribute:1.0\ create_ext_attribute 1.0} IDL:omg.org/CORBA/ExtAttributeDef:1.0 {{in id\ IDL:omg.org/CORBA/RepositoryId:1.0} {in name\ IDL:omg.org/CORBA/Identifier:1.0} {in version\ IDL:omg.org/CORBA/VersionSpec:1.0} {in type IDL:omg.org/CORBA/IDLType:1.0}\ {in mode IDL:omg.org/CORBA/AttributeMode:1.0} {in get_exceptions\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0} {in set_exceptions\ IDL:omg.org/CORBA/ExceptionDefSeq:1.0}} {}}}} {interface\ {IDL:omg.org/CORBA/ExtInterfaceDef:1.0 ExtInterfaceDef 1.0}\ {IDL:omg.org/CORBA/InterfaceDef:1.0\ IDL:omg.org/CORBA/InterfaceAttrExtension:1.0} {}} {interface\ {IDL:omg.org/CORBA/ExtAbstractInterfaceDef:1.0 ExtAbstractInterfaceDef 1.0}\ {IDL:omg.org/CORBA/ExtInterfaceDef:1.0\ IDL:omg.org/CORBA/AbstractInterfaceDef:1.0\ IDL:omg.org/CORBA/InterfaceAttrExtension:1.0} {}} {interface\ {IDL:omg.org/CORBA/ExtLocalInterfaceDef:1.0 ExtLocalInterfaceDef 1.0}\ {IDL:omg.org/CORBA/ExtInterfaceDef:1.0\ IDL:omg.org/CORBA/LocalInterfaceDef:1.0\ IDL:omg.org/CORBA/InterfaceAttrExtension:1.0} {}} {struct\ {IDL:omg.org/CORBA/ValueDescription:1.0 ValueDescription 1.0} {{name\ IDL:omg.org/CORBA/Identifier:1.0} {id IDL:omg.org/CORBA/RepositoryId:1.0}\ {is_abstract boolean} {is_custom boolean} {defined_in\ IDL:omg.org/CORBA/RepositoryId:1.0} {version\ IDL:omg.org/CORBA/VersionSpec:1.0} {supported_interfaces\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {abstract_base_values\ IDL:omg.org/CORBA/RepositoryIdSeq:1.0} {is_truncatable boolean} {base_value\ IDL:omg.org/CORBA/RepositoryId:1.0}} {}}}}} # # ---------------------------------------------------------------------- # Helper functions. # ---------------------------------------------------------------------- # # # Print a huge (tcl-code) string, not more than 80 chars per line. # proc DumpIt {file data} { set where 0 set data [string trimleft $data] while {$data != ""} { set idx [string first " " $data] if {$idx == -1} { set idx [string length $data] } if {$idx + $where > 76 && $where != 0} { puts -nonewline $file "\\\n" set where 0 } elseif {$where != 0} { puts -nonewline $file " " incr where } puts -nonewline $file [string range $data 0 [expr $idx - 1]] set data [string trimleft [string range $data [expr $idx + 1] end]] set where [expr $where + $idx] } if {$where != 0} { puts -nonewline $file "\n" } } # # Wait for a file to appear. # proc WaitForFile { file } { global verbose if {$verbose} { puts -nonewline "Waiting for $file to appear " flush stdout } for {set i 0} {$i < 50} {incr i} { if {[file readable $file]} { set f [open $file] set d [gets $f] close $f if {$d != "" } { if {$verbose} { puts " ok." } return 1 } } if {$verbose} { puts -nonewline "." flush stdout } after 500 } if {$verbose} { puts " failed." } puts "pwd [pwd], could not read $file" return 0 } # # ---------------------------------------------------------------------- # "main" # ---------------------------------------------------------------------- # # # Load Interface Repository type information. # if {$verbose} { puts -nonewline "Feeding local IFR with IFR info ... " flush stdout } if {[catch { combat::ir add $_ir_ir } err]} { puts stderr "init error: $err" exit 1 } if {$verbose} { puts " done." } # # If the --ifr command-line option was not used, start the interface # repository and feed it the IDL files. # if {$irior == ""} { # # Start Interface Repository. # catch {file delete ir.ior} if {[catch { if {$verbose} { puts -nonewline "Starting up IFR ... " flush stdout } set cmd $ifr switch $ORB { MICO { lappend cmd "--ior" "ir.ior" } ORBacus { lappend cmd "--ior" ">" "ir.ior" } TAO { lappend cmd "-o" "ir.ior" } default { # # Assume that the user has provided the correct options. # } } lappend cmd "&" if {$verbose >= 2} { puts "$cmd" } set pid [eval exec $cmd] if {$verbose} { puts " running, pid $pid." } if {![WaitForFile ir.ior]} { error "oops, IFR did not start up." } # # We could pass a file:// IOR to $ifrfeed, but reading the file and # passing an IOR: string instead avoids any problems with (a) drive # names on Windows and (b) whitespace in the path name. # set file [open "ir.ior"] set irior [string trim [read $file]] close $file # # Feed IDL files to Interface Repository. # foreach file $infiles { if {$verbose} { puts -nonewline "Feeding $file to IFR ... " flush stdout } set cmd $idl lappend cmd "-ORBInitRef" "InterfaceRepository=$irior" foreach opt $idlopts { lappend cmd $idlopts } lappend cmd $file switch $ORB { TAO { # # tao_ifr prints "processing " to standard error. That # makes "exec" think that the process has failed. Redirect to # standard out. # lappend cmd "2>@" "stdout" } } if {$verbose >= 2} { puts "$cmd" } eval exec $cmd if {$verbose} { puts " done." } } } err]} { puts stderr "$err" catch {kill $pid} exit 1 } } else { set pid 0 } # # Connect to the Interface Repsoitory and dump its contents. # if {[catch { if {$verbose} { puts -nonewline "Building dependency tree ... " flush stdout } set ir [corba::string_to_object $irior] if {![$ir _is_a IDL:omg.org/CORBA/Repository:1.0]} { error "oops, IOR does not smell like an Interface Repository" } set objs [Deps::BuildDeps $ir] if {$verbose} { puts " done." } if {$verbose >= 3} { puts "--- Postorder" puts "$objs" puts "---" } if {$verbose} { puts -nonewline "Generating Tcl code ... " flush stdout } set data [CodeGen::CodeGen $ir $objs] if {$verbose} { puts " done." } if {$verbose >= 3} { puts "--- Data" puts "$data" puts "---" } # # Generate Tcl file to feed local Interface Repository from # if {$verbose} { puts -nonewline "Writing output file \"${outbase}.tcl\" ... " flush stdout } set out [open "${outbase}.tcl" w] puts $out "#" puts $out "# This file was automatically generated from $infiles" puts $out "# by idl2tcl. Do not edit." puts $out "#" puts $out "" puts $out "package require combat" puts $out "" puts $out "combat::ir add \\" DumpIt $out [list $data] puts $out "" close $out if {$verbose} { puts " done." } # # Generate implementation template # if {$implflag == "yes"} { if {[file exists ${outbase}_impl.tcl]} { puts stderr "warning: Output file ${outbase}_impl.tcl exists." } else { if {$verbose} { puts -nonewline "Writing skeleton template file \"${outbase}_impl.tcl\" ... " flush stdout } set out [open "${outbase}_impl.tcl" w] ImplGen::ImplGen $ir $objs $out close $out if {$verbose} { puts " done." } } } } res]} { puts "" puts stderr "Oops, Error:" puts stderr $errorInfo if {$pid} { if {$verbose} { puts -nonewline "Killing IFR daemon ... " flush stdout } catch {kill $pid} catch {file delete ir.ior} if {$verbose} { puts " done." } } catch {file delete "${outbase}.tcl"} exit 1 } if {$pid} { if {$verbose} { puts -nonewline "Killing IFR daemon ... " flush stdout } catch {kill $pid} catch {file delete ir.ior} if {$verbose} { puts " done." } } combat-0.8.1/bin/iordump0000711000175000010010000001342111107157223013205 0ustar fpNone#! /bin/sh # $Id: iordump,v 1.1 2008-11-14 02:12:35 Owner Exp $ \ # \ # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 # # ---------------------------------------------------------------------- # IOR Decoder using some Combat internals. # ---------------------------------------------------------------------- # set myDir [file normalize [file dirname [info script]]] set parentDir [file dirname $myDir] set orbDir [file join $parentDir orb] if {[file exists $orbDir] && [file isdirectory $orbDir]} { lappend auto_path $orbDir } if {[catch {package require combat} oops]} { puts stderr "Error: Failed to find the required \"combat\" package." exit 1 } proc usage {argv0} { puts stderr "usage: $argv0 ?ior-string-or-file?" puts stderr "" puts stderr " Prints the contents of a CORBA object reference." puts stderr "" puts stderr " If a parameter is supplied, and if that parameter does not begin with" puts stderr " \"IOR:\", it is interpreted as a file name to read an object reference" puts stderr " from." puts stderr "" puts stderr " When called without parameters, or if the file name is \"-\", an object" puts stderr " reference is read from standard input." puts stderr "" exit 1 } if {$argc > 1} { usage $argv0 } elseif {!$argc || [set arg [lindex $argv 0]] == "-"} { # # Read object reference from standard input. # set ref [gets stdin] } elseif {[string range $arg 0 0] == "-"} { usage $argv0 } elseif {[string range $arg 0 3] != "IOR:"} { # # Read object reference from file. # if {[catch {set file [open $arg]} res]} { puts "error: cannot open $arg: $res" exit 1 } set ref [read $file] close $file } else { # # Use object reference on command line. # set ref $arg } set ref [string trim $ref] # # ---------------------------------------------------------------------- # Some helpers. # ---------------------------------------------------------------------- # proc GetCodeSetName {cs} { if {[info exists ::Combat::CONV_FRAME::codesets($cs)]} { return [lindex $::Combat::CONV_FRAME::codesets($cs) 1] } return [format "0x%08x" $cs] } proc dumpORBTypeComponent {component} { set buf [::Combat::CDR::ReadBuffer \#auto [$component cget -component_data]] $buf configure -byteorder [$buf boolean] set orb_type [$buf ulong] puts "ORB Type Tag" puts [format " ORB Type: 0x%08x" $orb_type] itcl::delete object $buf } proc dumpCodeSetsComponent {component} { puts "Codesets Tag" set i 0 puts " Native char CS: [GetCodeSetName [$component cget -char_native_code_set]]" foreach ncs [$component cget -char_conversion_code_sets] { if {[incr i] == 1} { puts " Accepted char CS: [GetCodeSetName $ncs]" } else { puts " [GetCodeSetName $ncs]" } } set i 0 puts " Native wchar CS: [GetCodeSetName [$component cget -wchar_native_code_set]]" foreach ncs [$component cget -wchar_conversion_code_sets] { if {[incr i] == 1} { puts " Accepted wchar CS: [GetCodeSetName $ncs]" } else { puts " [GetCodeSetName $ncs]" } } } proc dumpAlternateIIOPAddressComponent {component} { set buf [::Combat::CDR::ReadBuffer \#auto [$component cget -component_data]] $buf configure -byteorder [$buf boolean] set host [$buf string] set port [$buf ushort] puts "Alternate IIOP Address Tag" puts " Addr: $host:$port" itcl::delete object $buf } proc dumpTaggedComponent {component} { set tag [$component cget -tag] switch -- $tag { 0 { # TAG_ORB_TYPE dumpORBTypeComponent $component } 1 { # TAG_CODE_SETS dumpCodeSetsComponent $component } 3 { # TAG_ALTERNATE_IIOP_ADDRESS dumpAlternateIIOPAddressComponent $component } default { puts "Unknown Tagged Component, ComponentId = $tag" ::Combat::DumpOctets "Data:" [$component cget -component_data] } } } proc dumpMultipleComponentsProfile {profile} { puts "Multiple Components:" foreach component [$profile cget -components] { puts "" dumpTaggedComponent $component } } proc dumpIIOPProfile {profile} { puts "IIOP Profile" set major [$profile cget -major_version] set minor [$profile cget -minor_version] puts " Version: $major.$minor" puts " Address: [$profile cget -host]:[$profile cget -port]" ::Combat::DumpOctets "Key:" [$profile cget -object_key] foreach component [$profile cget -components] { puts "" dumpTaggedComponent $component } } proc dumpIor {ior} { set type_id [$ior cget -type_id] puts "" if {$type_id != ""} { puts " Repo Id: $type_id" } else { puts " Repo Id: " } puts "" foreach profile [$ior cget -profiles] { set tag [$profile cget -tag] switch -- $tag { 0 { # TAG_INTERNET_IOP dumpIIOPProfile $profile } 1 { # TAG_MULTIPLE_COMPONENTS dumpMultipleComponentsProfile $profile } default { puts "Unknown Profile, ProfileId = $tag" ::Combat::DumpOctets "Data:" [$profile cget -profile_data] } } puts "" } } # # ---------------------------------------------------------------------- # Main # ---------------------------------------------------------------------- # if {[catch {set ior [::Combat::IOP::DestringifyIOR $ref]} oops]} { puts "error: $oops" exit 1 } dumpIor $ior itcl::delete object $ior combat-0.8.1/bin/Makefile0000700000175000010010000000256711107157777013270 0ustar fpNoneSDX = c:/Software/Tclkit/tclkitsh-win32.upx.exe c:/Software/Tclkit/sdx.kit WINKIT = c:/Software/Tclkit/tclkitsh-win32.upx.exe LINKIT = c:/Software/Tclkit/tclkitsh-linux-x86.upx.bin COMBAT = ../orb TCLKILL = ../tclkill all: idl2tcl.exe iordump.exe idl2tcl.exe: idl2tcl.kit rm -rf temp mkdir temp cp $< temp/idl2tcl.kit (cd temp; $(SDX) unwrap idl2tcl.kit) cp $(WINKIT) temp/tclkit.exe (cd temp; $(SDX) wrap idl2tcl.kit -runtime tclkit.exe) mv temp/idl2tcl.kit $@ rm -rf temp idl2tcl.kit: idl2tcl rm -rf temp mkdir temp cp idl2tcl temp/idl2tcl.tcl (cd temp; $(SDX) qwrap idl2tcl.tcl) (cd temp; $(SDX) unwrap idl2tcl.kit) cp -r $(COMBAT) temp/idl2tcl.vfs/lib/combat cp -r $(TCLKILL) temp/idl2tcl.vfs/lib/tclkill (cd temp; $(SDX) wrap idl2tcl.kit) mv temp/idl2tcl.kit $@ rm -rf temp iordump.exe: iordump.kit rm -rf temp mkdir temp cp $< temp/iordump.kit (cd temp; $(SDX) unwrap iordump.kit) cp $(WINKIT) temp/tclkit.exe (cd temp; $(SDX) wrap iordump.kit -runtime tclkit.exe) mv temp/iordump.kit $@ rm -rf temp iordump.kit: iordump rm -rf temp mkdir temp cp iordump temp/iordump.tcl (cd temp; $(SDX) qwrap iordump.tcl) (cd temp; $(SDX) unwrap iordump.kit) cp -r $(COMBAT) temp/iordump.vfs/lib/combat (cd temp; $(SDX) wrap iordump.kit) mv temp/iordump.kit $@ rm -rf temp distclean: clean rm -rf *.exe *.kit *.zip *.tar.gz clean: rm -rf temp core a.out *.ior *~ combat-0.8.1/ChangeLog.txt0000700000175000010010000000426311615566225013437 0ustar fpNoneChanges in Combat 0.8.1 (August 1, 2011) ----------------------- - Fixed updated name for TAO naming service. - Fixed "WString" typo. - Fixed "valuetype" typo. - Fixed a bug where a connection was not reestablished after just closing it. - tclkill: Fixed an issue in pkgIndex.tcl that caused an "Error: Failed to find the required "kill" package." if the package was in a path that contained space characters. Changes in Combat 0.8 (November 29, 2008) --------------------- - idl2tcl: Instead of setting a "_ir_${name}" variable, directly generate a call to combat::ir. - Don't import itcl::* into the global namespace. - Support for request timeouts. - Accept scoped names instead of Repository Id where applicable, e.g., when throwing and catching exceptions, in a servant's "_Interface" method, and with the built-in "_is_a" operation. - Add -ORBConnectionIdleTimeout. - Bugfix: recursive type marshalling was non-compliant. - Bugfix: don't get stuck in an infinite loop when failing to connect to a forwarded address. - When waiting for a request to complete, go to sleep waiting for a request-specific variable rather than a global condition variable. - Update terminology: Use "object reference" instead of handle, and "stringified object reference" for what was previously called "object reference." Also rename "pseudo object" to "local object." - Retired Combat/C++. Changes in Combat 0.7.5 (December 13, 2004) ----------------------- - Some support for wide strings when using GIOP 1.1. - Implemented IOP::CodecFactory. - Implemented CORBA Reflection. Changes in Combat 0.7.4 (July 06, 2003) ----------------------- - Support for long long, unsigned long long and long double. - Bugfix: properly handle tk_null typecodes. - Support for ISO 8859-15 code set. - Add -ORBHostName. - Bugfix: GIOP 1.2 was broken. Changes in Combat 0.7.3 (March 26, 2002) ----------------------- - But a lot of {}'s around expressions so that they get compiled. - Add corba::dii. Changes in Combat 0.7.2 (December 6, 2001) ----------------------- - Bugfixes. Changes in Combat 0.7.1 (October 25, 2001) ----------------------- - Add support for IBM-1252 code set. - Add corba::duplicate. - Bugfixes. combat-0.8.1/demo/0000755000175000010010000000000011615566705012000 5ustar fpNonecombat-0.8.1/demo/account/0000755000175000010010000000000011615566705013434 5ustar fpNonecombat-0.8.1/demo/account/account.idl0000700000175000010010000000057507365745563015572 0ustar fpNoneinterface Account { exception Bankrupt { unsigned long balance; unsigned long amount; }; void deposit (in unsigned long amount); void withdraw (in unsigned long amount) raises (Bankrupt); long balance (); void destroy (); }; interface Bank { exception NotAuthorized {}; Account create (in string name, in string password) raises (NotAuthorized); }; combat-0.8.1/demo/account/account.tcl0000700000175000010010000000155011107157300015545 0ustar fpNone# # This file was automatically generated from account.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{interface {IDL:Account:1.0 Account 1.0} {} {{exception\ {IDL:Account/Bankrupt:1.0 Bankrupt 1.0} {{balance {unsigned long}} {amount\ {unsigned long}}} {}} {operation {IDL:Account/deposit:1.0 deposit 1.0} void\ {{in amount {unsigned long}}} {}} {operation {IDL:Account/withdraw:1.0\ withdraw 1.0} void {{in amount {unsigned long}}} IDL:Account/Bankrupt:1.0}\ {operation {IDL:Account/balance:1.0 balance 1.0} long {} {}} {operation\ {IDL:Account/destroy:1.0 destroy 1.0} void {} {}}}} {interface {IDL:Bank:1.0\ Bank 1.0} {} {{exception {IDL:Bank/NotAuthorized:1.0 NotAuthorized 1.0} {}\ {}} {operation {IDL:Bank/create:1.0 create 1.0} IDL:Account:1.0 {{in name\ string} {in password string}} IDL:Bank/NotAuthorized:1.0}}}} combat-0.8.1/demo/account/client.tcl0000711000175000010010000002014311114313477015377 0ustar fpNone#! /bin/sh # the next line restarts using wish8.5 on unix \ if type wish8.5 > /dev/null 2>&1 ; then exec wish8.5 "$0" ${1+"$@"} ; fi # the next line restarts using wish85 on Windows using Cygwin \ if type wish85 > /dev/null 2>&1 ; then exec wish85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing wish \ echo "This software requires Tcl/Tk 8.5 to run." ; \ echo "Make sure that \"wish8.5\" or \"wish85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require Tk package require combat # # ---------------------------------------------------------------------- # set balance "(no account)" set bank 0 set account 0 set name "" # # ---------------------------------------------------------------------- # # GUI # # ---------------------------------------------------------------------- # wm title . "Banking Application" menu .menu -tearoff 0 menu .menu.file -tearoff 0 menu .menu.acc -tearoff 0 .menu add cascade -label "File" -menu .menu.file -underline 0 .menu add cascade -label "Account" -menu .menu.acc -underline 0 .menu.file add command -label "Exit" -command exit -underline 0 .menu.acc add command -label "Open" -command Open -underline 0 .menu.acc add command -label "Destroy" -command Destroy -underline 0 . configure -menu .menu frame .balance label .balance.title -justify center -anchor center -width 20 \ -font -Adobe-Helvetica-Bold-R-Normal--*-180-*-*-*-*-*-* \ -text "Current Balance:" label .balance.balance -justify center -anchor center -width 10 -padx 5mm \ -font -Adobe-Helvetica-Bold-R-Normal--*-180-*-*-*-*-*-* \ -textvariable balance pack .balance.title .balance.balance -side left -fill x -expand true pack .balance -side top -fill x -expand true frame .buttons frame .buttons.deposit button .buttons.deposit.but -justify left -anchor w \ -relief raised -bd 1 -width 20 \ -command Deposit -text "Deposit:" entry .buttons.deposit.entry pack .buttons.deposit.but -side left -fill x -expand true pack .buttons.deposit.entry -side left -fill both -expand true pack .buttons.deposit -side top -fill both -expand true bind .buttons.deposit.entry Deposit frame .buttons.withdraw button .buttons.withdraw.but -justify left -anchor w \ -relief raised -bd 1 -width 20 \ -command Withdraw -text "Withdraw:" entry .buttons.withdraw.entry pack .buttons.withdraw.but -side left -fill x -expand true pack .buttons.withdraw.entry -side left -fill both -expand true pack .buttons.withdraw -side top -fill both -expand true pack .buttons -side top -fill both -expand true bind .buttons.withdraw.entry Withdraw label .status -justify left -anchor w -relief raised -bd 2 pack .status -side top -fill x -expand true update # # ---------------------------------------------------------------------- # # Initialize ORB # # ---------------------------------------------------------------------- # eval corba::init $argv source [file join [file dirname [info script]] account.tcl] # # Connect to the Bank. Its reference is in ./server.ior # .status configure -text "Connecting to Bank ..." update if {[catch {set bank [corba::string_to_object file://[pwd]/server.ior]} err]} { tk_dialog .oops "Cannot connect to Bank" "Connecting the Bank has\ failed. I was expecting to find the IOR in the file\ [pwd]/server.ior. Error message is \"$err\"" error 0 Ok exit 1 } .status configure -text "Ok. Open Account to continue." update # # ---------------------------------------------------------------------- # # Commands for User Actions # # ---------------------------------------------------------------------- # # # Open an account # proc Open {} { global bank account name mutex toplevel .open wm title .open "Open Account" frame .open.name label .open.name.text -justify left -anchor w -width 20 \ -text "Account Name" entry .open.name.entry pack .open.name.text .open.name.entry -side left -fill x -expand true frame .open.pwd label .open.pwd.text -justify left -anchor w -width 20 \ -text "Password" entry .open.pwd.entry pack .open.pwd.text .open.pwd.entry -side left -fill x -expand true frame .open.but -relief raised -bd 1 button .open.but.open -justify center -anchor center \ -text "Open Account" -command "set ::mutex open" button .open.but.cancel -justify center -anchor center \ -text "Cancel" -command "set ::mutex cancel" pack .open.but.open .open.but.cancel -side left -fill both -expand true pack .open.name .open.pwd -side top -fill x -expand true pack .open.but -side top -fill both -expand true grab .open focus .open.name.text .status configure -text "Opening Account ..." vwait mutex grab release .open if {$mutex == "cancel"} { destroy .open return } set newname [.open.name.entry get] set pwd [.open.pwd.entry get] .status configure -text "Opening Account $newname ..." corba::try { set account [$bank create $newname $pwd] set name $newname .status configure -text "Using Account $name." } catch {IDL:Bank/NotAuthorized:1.0} { tk_dialog .oops "Not Authorized" \ "You are not authorized to open account $newname.\ The password was probably wrong." \ error 0 Ok } catch {... err} { tk_dialog .oops "Error Opening Account" \ "An error occured opening the account: \"$err\"" \ error 0 Ok } UpdateBalance destroy .open return } # # Destroy an Account # proc Destroy {} { global name account if {$account == 0} { tk_dialog .oops "No Open Account" \ "You cannot destroy an account, because you have not\ openend an account." \ error 0 Ok return } set idx [tk_dialog .oops "Destroy Account $name" \ "Are you sure that you want to destroy the account $name?" \ warning 1 Yes No Cancel] if {$idx != 0} { return } corba::try { $account destroy set account 0 .status configure -text "No Account." } catch {... err} { tk_dialog .oops "Error Destroying Account" \ "An error occured destroying the account: \"$err\"" \ error 0 Ok } UpdateBalance } proc Deposit {} { global account if {$account == 0} { tk_dialog .oops "No Open Account" \ "Open an account first!" \ error 0 Ok return } set amount [.buttons.deposit.entry get] if {$amount == "" || ![string is integer $amount] || $amount < 0} { tk_dialog .oops "Invalid Value" \ "Cannot deposit $amount: not a number." \ error 0 Ok return } .status configure -text "Depositing $amount ..." corba::try { $account deposit $amount } catch {... err} { tk_dialog .oops "Error Depositing" \ "An error occured while depositing: \"$err\"" \ error 0 Ok } .status configure -text "Deposited $amount." .buttons.deposit.entry delete 0 end UpdateBalance } proc Withdraw {} { global account if {$account == 0} { tk_dialog .oops "No Open Account" \ "Open an account first!" \ error 0 Ok return } set amount [.buttons.withdraw.entry get] if {$amount == "" || ![string is integer $amount] || $amount < 0} { tk_dialog .oops "Invalid Value" \ "Cannot withdraw $amount: not a number." \ error 0 Ok return } .status configure -text "Withdrawing $amount ..." corba::try { $account withdraw $amount } catch {IDL:Account/Bankrupt:1.0 err} { array set ex [lindex $err 1] tk_dialog .oops "Error Withdrawing" \ "You cannot withdraw $ex(amount) because the balance\ of your account is only $ex(balance)." \ error 0 Ok unset ex } catch {... err} { tk_dialog .oops "Error Withdrawing" \ "An error occured while depositing: \"$err\"" \ error 0 Ok } .status configure -text "Withdrew $amount." .buttons.withdraw.entry delete 0 end UpdateBalance } proc UpdateBalance {} { global account name balance if {$account == 0} { set balance "(no account)" set name "" return } corba::try { set balance [$account balance] } catch {...} { } } proc UpdateLoop {} { UpdateBalance after 5000 UpdateLoop } # # ---------------------------------------------------------------------- # # Enter Event Loop # # ---------------------------------------------------------------------- # UpdateLoop combat-0.8.1/demo/account/README.txt0000700000175000010010000000114111107157300015077 0ustar fpNoneThis demo illustrates implementing a CORBA server using Combat, and a graphical client that uses Combat to access the server via CORBA. First, run server.tcl. The server writes its object reference to the file "server.ior" in the current directory, prints "Running." to the console, and then runs until terminated. While the server is running, run client.tcl. The client brings up a simple graphical user interface. It reads the server's object reference from the file "server.ior" in the current directory. Open an account using "Open" from the "Account" menu, and I'm sure you'll figure out the rest. combat-0.8.1/demo/account/server.tcl0000711000175000010010000000537511114313477015441 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat # # The Account server # itcl::class Account_impl { inherit PortableServer::ServantBase private variable mybank constructor {bank} { set mybank $bank } public method _Interface {} { return "::Account" } private variable balance 0 public method deposit { amount } { set balance [expr $balance + $amount] } public method withdraw { amount } { if {$amount > $balance} { corba::throw [list IDL:Account/Bankrupt:1.0 \ [list balance $balance amount $amount]] } set balance [expr $balance - $amount] } public method balance {} { return $balance } public method destroy {} { set obj [corba::resolve_initial_references POACurrent] set poa [$obj get_POA] set oid [$obj get_object_id] $poa deactivate_object $oid $mybank goodbye $oid itcl::delete object $this } } itcl::class Bank_impl { inherit PortableServer::ServantBase private variable accounts private variable mypoa constructor {poa} { set mypoa $poa } public method _Interface {} { return "::Bank" } public method create {name password} { if {[info exists accounts($name)]} { if {$accounts($name) != $password} { corba::throw IDL:Bank/NotAuthorized:1.0 } return [$mypoa id_to_reference $name] } set accounts($name) $password set acc [namespace current]::[::Account_impl \#auto $this] $mypoa activate_object_with_id $name $acc return [$mypoa id_to_reference $name] } public method goodbye {name} { unset accounts($name) } } # # Initialize ORB and feed the local Interface Repository # eval corba::init $argv source [file join [file dirname [info script]] account.tcl] # # Create a new POA with the USER_ID policy # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set mypoa [$poa create_POA MyPOA $mgr {RETAIN USER_ID}] # # Create a Bank and activate it # set srv [Bank_impl #auto $mypoa] set oid [$poa activate_object $srv] # # write Bank's IOR to file # set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POAs # $mgr activate # # .. and serve the bank ... # puts "Running." vwait forever puts "oops" combat-0.8.1/demo/hello/0000755000175000010010000000000011615566705013103 5ustar fpNonecombat-0.8.1/demo/hello/client.tcl0000711000175000010010000000254311107157305015050 0ustar fpNone#! /bin/sh # \ # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 # # Load the Combat package. # lappend auto_path ../../orb ;# Known location of the Combat ORB package require combat # # Initialize the ORB. # set argv [eval corba::init $argv] # # Get a message from the command line. # if {[llength $argv] == 0} { puts stderr "usage: $argv0 " exit 1 } set message $argv # # Load the Interface Repository. # source hello.tcl # # The server's object reference is in the file "./server.ior" in the # current directory. # if {![file exists "server.ior"]} { puts stderr "Oops: File \"server.ior\" does not exist." exit 1 } set obj [corba::string_to_object file://[pwd]/server.ior] # # Say Hello World! # $obj hello $message # # Print the server's messageCounter attribute. # set messageCounter [$obj messageCounter] puts "The server's message counter is $messageCounter." # # Release the object reference. # corba::release $obj combat-0.8.1/demo/hello/hello.idl0000700000175000010010000000013511107157305014654 0ustar fpNoneinterface HelloWorld { void hello (in string message); attribute long messageCounter; }; combat-0.8.1/demo/hello/hello.tcl0000700000175000010010000000053511107157305014672 0ustar fpNone# # This file was automatically generated from hello.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{interface {IDL:HelloWorld:1.0 HelloWorld 1.0} {} {{operation\ {IDL:HelloWorld/hello:1.0 hello 1.0} void {{in message string}} {}}\ {attribute {IDL:HelloWorld/messageCounter:1.0 messageCounter 1.0} long}}}} combat-0.8.1/demo/hello/server.tcl0000711000175000010010000000321311107157306015074 0ustar fpNone#! /bin/sh # \ # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 # # Load the Combat package. # lappend auto_path ../../orb ;# Known location of the Combat ORB package require combat # # HelloWorld server implementation # itcl::class HelloWorld_impl { inherit PortableServer::ServantBase public method _Interface {} { return "::HelloWorld" } public variable messageCounter 0 public method hello {message} { puts "The client says: $message" incr messageCounter } } # # Initialize the ORB and load the Interface Repository. # eval corba::init $argv source hello.tcl # # Obtain a POA pseudo object and retrieve its POA Manager. # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] # # Create a HelloWorld servant and activate it. # set srv [HelloWorld_impl #auto] set oid [$poa activate_object $srv] # # Print object reference to the console. # set ref [$poa id_to_reference $oid] set ior [corba::object_to_string $ref] puts "$ior" # # Write the object reference to a file. # set iorfile [open "server.ior" w] puts -nonewline $iorfile $ior close $iorfile # # Activate the POA. # $mgr activate # # ... and serve ... # puts "Running." vwait forever # # This program never exits. # combat-0.8.1/demo/random/0000755000175000010010000000000011615566705013260 5ustar fpNonecombat-0.8.1/demo/random/random0000711000175000010010000000166311107157632014453 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 # # Initialize ORB and feed the local Interface Repository. # lappend auto_path ../../orb package require combat eval corba::init $argv source Random.tcl # # Get the server's object reference from random.org's Web server. # set obj [corba::string_to_object http://www.random.org/Random.ior] # # Show some random numbers. # puts "Some random numbers:" for {set i 0} {$i < 10} {incr i} { puts [$obj lrand48] } # # Release object reference. # corba::release $obj combat-0.8.1/demo/random/Random.idl0000700000175000010010000000034707365745540015172 0ustar fpNone// IDL // http://www.random.org/Random.idl interface Random { // return non-negative long integer in the interval [0, 2^31) long lrand48(); // return signed long integer in the interval [-2^31, 2^31) long mrand48(); }; combat-0.8.1/demo/random/Random.tcl0000700000175000010010000000046711107157632015173 0ustar fpNone# # This file was automatically generated from Random.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{interface {IDL:Random:1.0 Random 1.0} {} {{operation\ {IDL:Random/lrand48:1.0 lrand48 1.0} long {} {}} {operation\ {IDL:Random/mrand48:1.0 mrand48 1.0} long {} {}}}}} combat-0.8.1/demo/random/README.txt0000700000175000010010000000151411107157632014737 0ustar fpNone Note: at the time of this writing (November 2008), the CORBA interface to the random number service is not functional, and the Web site below only says "to do." This demo retrieves true random numbers from a CORBA server on the internet, so running the client requires a live internet connection. See http://www.random.org/ and http://www.random.org/clients/corba/ The client retrieves the server's object reference from http://www.random.org/Random.ior and thus requires the http package to be available. The file "Random.idl" contains the server's IDL description, a copy of http://www.random.org/Random.idl. "Random.tcl" is just the result of running `idl2tcl Random.idl'. Run `./random'. If the client fails to connect to the server, please check the above URLs to see if the object reference's address or the IDL has changed. combat-0.8.1/doc/0000755000175000010010000000000011615566707011623 5ustar fpNonecombat-0.8.1/doc/combat.gif0000700000175000010010000000723411107157730013542 0ustar fpNoneGIF89a¾«ãŽŽŽÇÇÇUUUÿÿÿªªªããã™™™ÌÌÌrrr999ÿÿÿÿÿÿÿÿÿÿÿÿ!þ Combat Logo!ù ,¾«þÈI«½8ëÍ»ÿ`(Ždižhª®l+0àÎtmßx®ï|¿Å°„0!óȤrÉlŽ‚Ã¨°è¬Z¯Ø¬¶“z§Û°xL.›¡ß/ÕÌn»ßpS7M_Çïø¼~‹¦×÷€‚ƒ7}~„‰Š‹Œs‡v“”•e™’–œžG˜™šŸ¤¥¦3¡¢£§¬­®©ª¢›¯µ¶ž±²«·–¼®¹º³Á‰È @ Ʀ†ÄÄ´Ïm Ê@Ú1ÕÃÒÅLÉÊææ ÈÀÞŽÛî0ì•Ñ~áiÔ9 Ìïý éñôÛ6 Þ" ²æÙÃgCßÀ‡ÚˆG.[¿!œVÏž†þ4ð¸àÜH œ˜Q¸C öùPK NFL9°¥ËŽá€z”²…‚‡9x—”ÝÒw8*L¨4«CÁì8 SÛ‚uTnëoÀEESc°Š9 kÖ¢+X„*¬¶Œs·Ý ”6FSl5¹ O‡¼G²ÀàbwõmV*°¦¬jà¦;0ꈓž½‰u:Ïdm{-YŽ4øíVÄÚ €1YvvÝÝÎ# '®ÖªV_åѵ‰ÇfW+Cù܉9 ‡‰ù£ð›±_ä=w7šN½úG½:Á¯ô³Ú;÷¤§xBóç‰×La·irâþAŽb¿„€n³ ¾XÂS¤Écž}i¦Â|ý,‚]©eà˰Á0@‚Ðà5v¹'ÁTy-à`pRÚu6 ꃘD'ès£ˆ>žsN‡"“S?y…ÁáG”ÌÅPcÈt@D0,P"N Lx8–‡bÆæw\ùΔÄ"–…Uð&D‰Wž“Z¡Ñ–!EÙ™†ÈA¤œsð]‡í·†Ú°I@™k†!œî4#¥ÛÂd“xæÉÃfî©_$pä6²aIˆbÙá¨îp°*7pE©†úÝ cv8az—Føm:œ9Z¨"þ*꡵€"RÌŠ ̺çÙÖZè6Êi;(m?á‚Wl§DXÈ‚µ@lËB¶**%öÆ;ÁhIF¹[n#j®oZJg"+dë £ÃþÐÏÀxË»qú­Z9d›êoÊKšˆUÀMO`×ÇùÒê!º+ZôÕ¾êià0“ƧÄ ×9¡Å ¹ÛD*º°0|2›îŠ0ÞÇ/Ð'vÌfð’•¢g­D ö93æsuv§DË@ŒíÏ÷zÝÏYœ ÔQ£Z2 ÐŽ<· O-â¿Xv E¼RÃM‹6Ðm-¯Ë6Šk¶þÛvK?©Á]gx›JrÌ5–^Ñ…§é†‡s,q¹ƒ@^G§'qtí3´ÃÒÜœÁ›= ¬Ýðã\¶¼Ÿu·Ü)Ã8§ÛD™øp㞇ì÷Ð^ÅÆÖ³ÀvsÌ™8Û¿ nsr?ÛVïÒÌ¿ãÜÂ}×zµº¬.Úxv÷ÓKÁÑè7º¨*CÌ]Þ¼ÂU!º[ÌÒ enëh¸âVã\2¡þ D»A¡äõ½Ä1ËE0pµf¨õè.€ÌZ†¡^W©ó¡Dsª¹®ÅÁÇ9ÉIa &§ÃjuæwLÉꘒB ø‹†ïhß)ð@èí I òMþ1“6˜h";ÁÆx÷¨)Z€mÆÃ@Á ?ûýíe¬ÒÀäÄ¥"JÀOaÌßþ¸ˆ½{|p`´ÁC¸1èMÐû^rh@¬=D^›Í—öÀ¢ o‹\,Ö9ÈT²$Ü@Ѝ;¤ëkØX/¥6FÒfq„¢6Â8†>ªA“b$ JIÀOªq V|%’A<Ââ,øÞ*ݸA <°b¶üH±Èà'Û, ˜J‰å¥Fw`9󆥬ˆIRZqs¡Ä8ßÐÅÙ=® Ü£eXš¨ÁæiÀOášœ¨¡…StÍå;\¹¸o>ÄFX„C4¥‰66”Òš)°XþºEnI˜aZ§ £¸£‰ì~ Œé­eîpLnhgÚ®6’ŒÀΡĹRš”sº):a‡¶Ù±žç®Z•P²¥™;#'TºÒ·lr !`wG3Ž©Ûäé0ßhÔq…3 @e9±yÅ@w"ÓÝO­ð’ DÓunØØZ90—ÝXµ¬4½ÀääXTj«V3£Hñ:Ô ¤Ž•3ŒŒ«²¾J@ale*Ll ×7T2ƒíÙÈš£Ó±Xض´(¸5”2ƒ Ÿ\ƒ‰8Ö.,gtʃ¶¦BOµ‚ŸþÉ×T«[-ì/Ë5á굯é™ÒÆèþ:Ðn’6™T…—Ä2%~¶µJØ»¦°Ü^á´õP^À–ZuÚóŒÏÍ*¸w^‰R€‚ì…Ìz(*§ö.CÉtïÔZ§H¶å_P±1‘1;¯z£ÃÈ9’£H”Z=§ô=;’/¸n,üpÊÕþ\·‘U`!${·&aA5bê÷&syìr þ°H3 Å§@ë÷ôêIõr.ˆÁvY¥øhFÏ؃aD Ûµ®h““לd‰¸ÞJí@©¹Ý‚`5=?EÅV$%rŠWæœ8B¦(82í D@è ÄX Ñ‹B¤À9VT£¹Š±½S×bUÌ:Ã÷ØXþe@£ zhFÌÒ·è¢Í’É!ŸÔ´¡¥Qk¥kÞ78ªÎMçÁ”6U,•攋-œþ+ín—S‘óÄÑxe$€H›†L’n=PÌÞW~9®!•×+.¾]Ú·geVäù-óQKæª&U]@âþÒR¹¥x¤ U¼À›~úçŒzÇp~†·…¥_K ’Ën¯­¼+‡ ÚHfw÷#iC%îvÚ·I*O¦é¸Ø<®è›Ú/1c/”ÞÀi³p ½96áVv¸[ýjÜê›Ò’á®”a{«ÊK"7G ^­¨"S€ËI®xI‰I:Á‡RNòþ€—õæ3§åTÌâr›€@2,‰Ñ©ÝhÚ±Æ'Púšîtzì[êX¾·kŸ«gýë¯Ø:×[ƒm°›½b;"ÎÎv¨S½ãdo»Ü»óöWÇ}îxG{ݹ¾Ò¼û{W{fþþcaEŒðw<ÆSö–lãqF<:nmë˜ýñ”Âá%ïÅclín×FæÛRY΃bô™÷ºt\úGkÖôµm=ÜUO‰´·~ó°§çeO„x°ž÷šl|îï ü±?CôÅO}é‡O‚Ýóžöø½Ç“Ozæ—ÀöÔ¾<<}n'Sxß»óAߊîdüN]þމâi©×]͸,¿ùWŠþôþC„#í?>Õá?ÙwX0ó§oÔ7€~ôz·°†{y“ÐPýG€X€Ðw=?cp ØHzØç—)åCÝ¥~Ç4 x 4)è‚Ñ€™4‚*Ð'XK+ˆ,È‚Ú}NÕ]CS3˜K7ø€A9H„ÑGH‚ã1„‚QƒLh‚?X’ÕNEøU¸GOHYX|W¨·uQ…a€³ç„LØ…—ð…®ÇydX†[ø|KR!I–{fyox{bˆ,r4Öç7wØuèhˆ*e1ƒvüw†mø†y¨Hȇ}¨jø3“H€‡ÈT‰‘H.(€¸fþF8 ±‰%ø‰ZhŠñ§P²c,—ˆx‰„‹ø„Hm%Ö‚¤xo±8{¨˜ŠgP‹‘p‹×—‹vW‰\8‹)ÀfâŒr Œ‹·‹|Ô‹–ŒÊ˜fÌøCÄ|ÆØ|@³)ÙȆո.Œø~ÝÈø‹Ó`×(Šáøv­ÈtêèEçX¯H„8ƒwEðŽäºg\؉þø$GÑüÈIé8YŸS0ŽyS¹id߆¨È‡hxÝsô0‘HÀÊ·‹y\•³Ð‘D‘¦j; (™’Ùµ’׿Œ.I_<@I“ ’|‡“¶·º02>™@™þo")vL /p”ch“î$”æQt°YPIƒ IÎ…˜q YyRÉ~]ÙCA–ÁHŒcéhö€‰? –q”{X–íU ‘–ryŒtY–Ó' 5—{ Òç—·W”?™—ƒ;˜g˜¨7?‰Š¹˜KR˜Ž©I™ ’“I™Û÷k¦‘þ’‡™›É™k|nÕŽ…çà˜ÃB€’)˜¦y€Û¨šäØt \ò›²Yšµi «¡„Ib†ðU(¾9›4¦—Á™Kd眡f™€ÙœíËÉœ¯ùœhwaШ© ° ™hè:Ù‰ÒÉc¨m yÔ9 ¤EþW٩ݤžÝéžqàž~@ŽÚižO ›Šžø™Ÿžr=Þå›v@œ4& ¿Nz|PÈ˜Ëø›Wwž´¡€w €Ð…Ë™‘ œZ 2x×ç ö© ¡#j >ÈTŸ):u3[-ꢽ£Í‡¢ûiéy£Hù£‚ <ÚjB#¤@YµG¤Š‹Ú‡¤I*…ò@£9h€°¥€§S· ê7÷†¥`zŸÔ˜„aZ¦›• ¸ƒif¦lê¥Ëx*mʦè Í7§m:(úxš§.°§_Ú§~º(*›*¨tʈ:§¸É§‹:¨¨p&Ч¹¥Y] ¥“Ê|hÊ0HE©™:|•êWú©}ÚˆJªƒ)†§Šª© ›¬ú¨'詯º‰¸¹ª³jš­h«·Z›ƒ¨«»œVŠœ²ú«¹y‘G¬Èš`;combat-0.8.1/doc/combat.lyx0000700000175000010010000040631111114313516013602 0ustar fpNone#LyX 1.6.0rc5 created this file. For more info see http://www.lyx.org/ \lyxformat 344 \begin_document \begin_header \textclass article \begin_preamble \usepackage[bookmarks, bookmarksnumbered=true]{hyperref} \newcommand{\ddash}{-\/-} \end_preamble \use_default_options true \language english \inputencoding auto \font_roman default \font_sans default \font_typewriter default \font_default_family default \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \paperfontsize default \spacing single \use_hyperref false \papersize a4paper \use_geometry true \use_amsmath 0 \use_esint 0 \cite_engine basic \use_bibtopic false \paperorientation portrait \leftmargin 2.54cm \rightmargin 2.54cm \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \author "" \author "" \end_header \begin_body \begin_layout Title \begin_inset Graphics filename combat.gif width 50text% \end_inset \begin_inset Newline newline \end_inset CORBA Scripting with Tcl \begin_inset Newline newline \end_inset Version 0.8 \end_layout \begin_layout Author Frank Pilhofer \end_layout \begin_layout Abstract Combat is a CORBA Object Request Broker that allows the implementation of CORBA clients and servers in the Tcl programming language. \end_layout \begin_layout Abstract On the client side, Combat is not only useful to easily test-drive existing CORBA servers, including the ability for rapid prototyping or to interactively interface with servers from a console, but makes Tcl an exciting language for distributed programming. Also, Tk allows to quickly develop attractive user interfaces accessing CORBA services. Server-side scripting using [incr Tcl] classes also offers a wide range of possibilities. Applications can be trivially packaged as Starkit or Starpack for easy cross-platform deployment. \end_layout \begin_layout Abstract Combat is compatible with the CORBA 3.0 specification including the IIOP protocol, and has been tested to interoperate with a wide range of open-source and commercial ORBs, including \noun on Mico \noun default , TAO and ORBexpress. \end_layout \begin_layout Abstract Combat is written in pure Tcl, allowing it to run on all platforms supported by Tcl, which is a much wider range than supported by any other ORB. \end_layout \begin_layout Abstract Please visit the Combat homepage, \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.fpx.de/Combat/ \end_layout \end_inset for the latest information about Combat. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \begin_inset VSpace vfill \end_inset \begin_inset CommandInset toc LatexCommand tableofcontents \end_inset \begin_inset VSpace vfill \end_inset \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Section Introduction \end_layout \begin_layout Subsection About This Document \end_layout \begin_layout Standard This document is part user manual, part reference manual. As a result, some sections are more verbose than others. It is arranged so that it could be read from top to bottom without too many forward references. The reader may want to make a first quick pass, skipping over the \begin_inset Quotes eld \end_inset reference \begin_inset Quotes erd \end_inset sections, returning to them as necessary. \end_layout \begin_layout Standard This document is neither a CORBA nor Tcl tutorial. The reader is assumed to be familiar with the Tcl programming language and should have a basic understanding of CORBA concepts. Prior exposure to CORBA software development is recommended. \end_layout \begin_layout Subsection Quick Start \end_layout \begin_layout Standard Let's begin with an example of a common Combat use case, accessing an existing CORBA-based server. This assumes the following: \end_layout \begin_layout Itemize The server is running. \end_layout \begin_layout Itemize You have the server's stringified object reference, i.e., the \begin_inset Quotes eld \end_inset IOR: \begin_inset Quotes erd \end_inset string. \end_layout \begin_layout Itemize You have the IDL file that defines the interface that the server implements. \end_layout \begin_layout Standard For example, consider the following IDL file, in which the server implements the \begin_inset Quotes eld \end_inset Bank \begin_inset Quotes erd \end_inset interface. The Bank supports the \family typewriter create \family default operation to open a new account. An account, in turn, is an object that supports the \family typewriter deposit \family default , \family typewriter withdraw \family default and \family typewriter balance \family default operations. \end_layout \begin_layout LyX-Code interface Account { \begin_inset Newline newline \end_inset void deposit (in unsigned long amount); \begin_inset Newline newline \end_inset void withdraw (in unsigned long amount); \begin_inset Newline newline \end_inset long balance (); \begin_inset Newline newline \end_inset }; \end_layout \begin_layout LyX-Code interface Bank { \begin_inset Newline newline \end_inset Account create (in string name, in string passwd); \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard Without getting into all the details, the first step is to process the IDL file into type information that Combat can use. This is done using the \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset application. (For more details about the idl2tcl application, see section \begin_inset CommandInset ref LatexCommand ref reference "sec:The-idl2tcl-Application" \end_inset .) Given the file \begin_inset Quotes eld \end_inset account.idl \begin_inset Quotes erd \end_inset , you would run the following command in a console to produce the file \begin_inset Quotes eld \end_inset account.tcl: \begin_inset Quotes erd \end_inset \end_layout \begin_layout LyX-Code idl2tcl account.idl \end_layout \begin_layout Standard With this preparation, you can launch a Tcl shell, load the Combat ORB, and load the type information for the above IDL file that we just generated: \end_layout \begin_layout LyX-Code package require combat \end_layout \begin_layout LyX-Code source account.tcl \end_layout \begin_layout Standard At this point, we are ready to connect to the server. This is done by passing the server's stringified object reference to the \family typewriter corba::\SpecialChar \- string_\SpecialChar \- to_\SpecialChar \- object \family default method, just like in any other programming language. (For more details about this command, see section \begin_inset CommandInset ref LatexCommand ref reference "cmd:corba::string_to_object" \end_inset .) You can copy&paste the \begin_inset Quotes eld \end_inset IOR: \begin_inset Quotes erd \end_inset string, or you could read it from a file with a few extra lines of code. \end_layout \begin_layout LyX-Code set Bank [corba::string_to_object \emph on IOR:\SpecialChar \ldots{} \emph default ] \end_layout \begin_layout Standard The \begin_inset Quotes eld \end_inset Bank \begin_inset Quotes erd \end_inset varaible now holds an \emph on object reference \emph default that we can use to exercise the server using its IDL interface. Calling the bank's \begin_inset Quotes eld \end_inset create \begin_inset Quotes erd \end_inset operation returns an object reference for an \begin_inset Quotes eld \end_inset Account \begin_inset Quotes erd \end_inset object, which supports the \begin_inset Quotes eld \end_inset deposit, \begin_inset Quotes erd \end_inset \begin_inset Quotes eld \end_inset withdraw, \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset balance \begin_inset Quotes erd \end_inset operations. \end_layout \begin_layout LyX-Code set Account [$Bank create MyName MyPassword] \begin_inset Newline newline \end_inset $Account deposit 700 \begin_inset Newline newline \end_inset $Account withdraw 450 \begin_inset Newline newline \end_inset puts "Current balance is [$Account balance]." \end_layout \begin_layout Standard This simple but complete example glanced over some of the details but should give you a good idea of how easy it is to develop code using Combat. Feel encouraged to follow the above steps to interact with some of your existing CORBA servers. You will find that the ability to \begin_inset Quotes eld \end_inset chat \begin_inset Quotes erd \end_inset with a live server from a Tcl console is a powerful prototyping and debugging tool. \end_layout \begin_layout Standard A slightly more elaborate version of the above example can be found in the \begin_inset Quotes eld \end_inset demo/account \begin_inset Quotes erd \end_inset subdirectory. For a more well-documented example, see section \begin_inset CommandInset ref LatexCommand ref reference "sec:Complete-Example" \end_inset . \end_layout \begin_layout Subsection Features \end_layout \begin_layout Standard Combat has the following features: \end_layout \begin_layout Itemize IIOP/GIOP 1.0, 1.1 and 1.2 (unidirectional). \end_layout \begin_layout Itemize Straightforward IDL to Tcl mapping that supports all data types, including TypeCode, Any, Objects by Value and recursive data types. \end_layout \begin_layout Itemize Asynchronous invocations, callbacks and timeouts. \end_layout \begin_layout Itemize Support for the IOR:, corbaloc:, corbaname:, file: and http: stringified object reference formats. \end_layout \begin_layout Itemize Server-side scripting with full Portable Object Adapter (POA) support. \end_layout \begin_layout Itemize Codeset negotiation (when using GIOP 1.2). Thanks to Tcl's encoding system, a wide range of character sets is supported. \end_layout \begin_layout Itemize Download of type information at runtime, using an Interface Repository or from a server that supports the CORBA Reflection specification. \end_layout \begin_layout Itemize Fully event based, the event loop is kept running while waiting for a server response. \end_layout \begin_layout Subsection Glossary \end_layout \begin_layout Standard These terms are essential for Combat development. \end_layout \begin_layout Description Object \begin_inset space ~ \end_inset Reference A Tcl command with the same interface as the server object as defined in the IDL description. Operations (or the getting/setting of attributes) on the object requence transparently cause a server invocation to happen, i.e., a request is sent to the remote server, and the response from the server is processed and returned. Object references come into existing using the \family typewriter corba::string_\SpecialChar \- to_\SpecialChar \- reference \family default command or as a result from a method invocation. Object references are usually stored in variables. Object references are the equivalent to interface \begin_inset Quotes eld \end_inset _ptr \begin_inset Quotes erd \end_inset types when programming CORBA in C++. Object references can be duplicated using \family typewriter corba::duplicate \family default and must eventually be released using \family typewriter corba::release \family default . \end_layout \begin_layout Description Stringified \begin_inset space ~ \end_inset Object \begin_inset space ~ \end_inset Reference Also known as IOR (for Interoperable Object Reference), a stringified object reference is a \emph on string \emph default that uniquely identifies a server object (servant). No operations can be performed upon an IOR directly; it must first be incarnate d into an \emph on object reference \emph default using \family typewriter corba::string_\SpecialChar \- to_\SpecialChar \- reference \family default . Stringified object references usually begin with the letters \begin_inset Quotes eld \end_inset IOR: \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset corbaloc: \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset corbaname: \begin_inset Quotes erd \end_inset . \end_layout \begin_layout Description Local \begin_inset space ~ \end_inset Object Like an object reference, a local object is a Tcl command with the same interface as the object it represents. Invocations on a local object do not cause requests to be sent to a remote servant, but are processed locally. The POA, POAManager and POACurrent are used via local objects. A local object is not associated with a stringified object reference. \end_layout \begin_layout Description Servant A servant implements the state and behavior that is associated with a CORBA object. They are the target of CORBA remote method invocations. In Combat, a servant is an instance of an [incr Tcl] class that inherits directly or indirectly from \family typewriter PortableServer::\SpecialChar \- ServantBase \family default . Servants are \emph on activated \emph default with the Portable Object Adapter (POA), which creates object references that clients can use to interact with the servant. \end_layout \begin_layout Subsection Interface Repository \end_layout \begin_layout Standard Because it posesses no \begin_inset Quotes eld \end_inset compile-time \begin_inset Quotes erd \end_inset knowledge of object interfaces, the Interface Repository is vital for the operation of Combat. This is different from other language mappings, where such knowledge is generated by the IDL \begin_inset Quotes eld \end_inset compiler \begin_inset Quotes erd \end_inset and eventually linked into the application. Combat instead pulls type information from Interface Repositories, at runtime. Before an interface can be used (either as a client or a server), its type information must be loaded into the Interface Repository. Before accessing a service, Combat must learn its type. \end_layout \begin_layout Standard Most commonly, \end_layout \begin_layout Itemize Combat knows the service's type (its \begin_inset Quotes eld \end_inset Repository Id \begin_inset Quotes erd \end_inset ) because it is contained in an object's address, and \end_layout \begin_layout Itemize Combat knows the type's interface information because it was generated from the service's IDL file using the \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset application (which generates a \begin_inset Quotes eld \end_inset .tcl \begin_inset Quotes erd \end_inset file) and loaded into Combat's local Interface Repository using Tcl's \begin_inset Quotes eld \end_inset source \begin_inset Quotes erd \end_inset command. \end_layout \begin_layout Standard Alternatively, Combat can also download interface information from local or remote CORBA Interface Repositories, or even from the service itself, if its ORB supports the CORBA Reflection specification. \end_layout \begin_layout Standard The most frequent caveat is that a stringified object reference does not necessarily contain the service's Repository Id that Combat depends on. This typically applies to stringified object references of type \begin_inset Quotes eld \end_inset corbaloc. \begin_inset Quotes erd \end_inset In this case, you might need to apply workarounds described in section \begin_inset CommandInset ref LatexCommand ref reference "sec:Issues-And-Workarounds" \end_inset . \end_layout \begin_layout Standard See section \begin_inset CommandInset ref LatexCommand ref reference "sec:The-idl2tcl-Application" \end_inset for more information about the \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset application. \end_layout \begin_layout Section ORB Operations \end_layout \begin_layout Subsection Initialization & Features \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::init" \end_inset corba::init \end_layout \begin_layout Standard Before any of the other commands can be used, the ORB should be initialized. This is performed using the \family typewriter corba::init \family default command. \end_layout \begin_layout LyX-Code corba::init ? \emph on parameters \emph default ? \end_layout \begin_layout Standard All ORB-specific parameters (see below) are consumed, the remaining parameters are returned. It is common practice to pass an application's command-line arguments to \family typewriter corba::init \family default , i.e., \end_layout \begin_layout LyX-Code set argv [eval corba::init $argv] \end_layout \begin_layout Standard Afterwards, \family typewriter argv \family default contains the remaining options. This allows users of the application to pass ORB parameters (such as initial references) on the application's command line. \end_layout \begin_layout Standard Use of this command is optional. If \family typewriter corba::init \family default is not called explicitly, it is implicitly called with an empty parameter list when the ORB is first used. \end_layout \begin_layout Standard Combat accepts the following ORB-specific parameters: \end_layout \begin_layout Description -ORBInitRef \begin_inset space ~ \end_inset \emph on name \emph default = \emph on value \emph default Sets the initial reference \emph on name \emph default (see \family typewriter corba::\SpecialChar \- resolve_\SpecialChar \- initial_\SpecialChar \- references \family default ) to \emph on value \emph default . The \emph on value \emph default must be a stringified object reference. \end_layout \begin_layout Description -ORBDefaultInitRef \begin_inset space ~ \end_inset \emph on value \emph default Sets the default initial reference. See \family typewriter corba::\SpecialChar \- resolve_\SpecialChar \- initial_\SpecialChar \- references \family default for more information. \end_layout \begin_layout Description -ORBGIOPMaxSize \begin_inset space ~ \end_inset \emph on value \emph default Limits the maximum acceptable size of incoming GIOP messages. By default, GIOP messages are accepted regardless of their size. This allows a denial of service attack on a server by sending a huge message, eventually exceeding available memory. If set, GIOP messages whose size (in octets) exceed \emph on value \emph default cause the connection to be dropped. Each connection will also accept up to \emph on value \emph default octets of GIOP fragments. The size of outgoing messages is not limited by this option. The \emph on value \emph default must be a number; it may be followed by the "k", "m" or "g" character to indicate kilobytes, megabytes or gigabytes, respectively. \end_layout \begin_layout Description -ORBConnectionIdleTimeout \begin_inset space ~ \end_inset \emph on value \emph default If a connection to a remote ORB remains idle for this period, it is closed to conserve system resources. The connection will be transparently reestablished upon the next request. Connections are never closed if there are outstanding requests (e.g., if a server takes a long time to process a request). The \emph on value \emph default is specified in milliseconds. The default is 3600000 (one hour). \end_layout \begin_layout Description -ORBSendCancelRequestMessage \begin_inset space ~ \end_inset \emph on value \emph default Controls whether a GIOP CancelRequest message is sent to the server when a request is cancelled (using \family typewriter corba::request \family default \family typewriter cancel \family default or because it timed out). The CORBA compliant default is to send a CancelRequest message in this case, but some ORBs do not support this message and may close the connection. To avoid issues when interoperating with such ORBs, set this option to false. \end_layout \begin_layout Description -ORBServerPort \begin_inset space ~ \end_inset \emph on port \emph default Initializes a TCP socket to listen on port \emph on port \emph default for incoming connections. This option can be repeated multiple times to listen on several ports. If this option is not present, a port will be selected automatically once the RootPOA is accessed for the first time. \end_layout \begin_layout Description -ORBHostName \begin_inset space ~ \end_inset \emph on name \emph default The host name that will be used in object references to refer to the local host. If omitted, the local host's default name (i.e., the name returned from [info hostname]). In environments where DNS is not available, it may be necessary to use this option with the local host's IP address. \end_layout \begin_layout Description -ORBServerId \emph on \begin_inset space ~ \end_inset value \emph default The name that a persistent POA encodes in IORs to distinguish this server from others. Also, if a persistent POA is created with the same name, and if an object is activated in this POA with the same object id, then its entire object key will be \emph on value \emph default . The object will thus be accessible using the URI corbaloc:: \emph on host \emph default : \emph on port \emph default / \emph on value \emph default , where \emph on host \emph default is the local host name (or the string passed to -ORBHostName) and \emph on port \emph default is the automatically chosen server port number (or the number passed to -ORBServerPort). \end_layout \begin_layout Description -ORBNativeCodeSet \begin_inset space ~ \end_inset \emph on value \emph default Sets the native codeset to be used and advertised as SNCS-C ("server native codeset for char"; see the CORBA specification for more details). If omitted, the native codeset is determined using [encoding system]. \emph on value \emph default can be an OSF registry value or Tcl encoding name. \end_layout \begin_layout Description -ORBDebug \begin_inset space ~ \end_inset \emph on level \emph default Enables debugging output (which is sent to stderr). Valid values for \emph on level \emph default are \emph on giop \emph default (GIOP message exchange), \emph on iiop \emph default (IIOP connection handling), \emph on transport \emph default (raw GIOP data), \emph on poa \emph default (Portable Object Adapter operations) and \emph on all \emph default (for all of them). This debug output may be useful in debugging interoperability issues. \end_layout \begin_layout Standard Any other options that start with the \emph on -ORB \emph default prefix cause an error. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::feature" \end_inset corba::feature \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::feature names \begin_inset Newline newline \end_inset corba::feature require ?-exact? \emph on feature \emph default ? \emph on version \emph default ? \end_layout \begin_layout Standard The \family typewriter names \family default subcommand returns a list of feature tokens supported by this implementation. For Combat, this list is \emph on core \emph default , \emph on async \emph default , \emph on callback \emph default , \emph on type \emph default , \emph on poa \emph default , \emph on register \emph default , \emph on dii \emph default and \emph on combat::ir \emph default . \end_layout \begin_layout Standard The \family typewriter require \family default subcommand has three possible usages. If called with only a feature token, it succeeds if that feature is implemented. If that feature is not available at all, an error is returned. If a version number is mentioned, the command only succeeds if the implementati on provides that feature with the same major number and at least the same minor number. With the \family typewriter -exact \family default option, the given version number must match the implemented version exactly. \end_layout \begin_layout Standard It is expected that a feature is upwards compatible within the same major version number, i.e., version 1.3 supports all operations that version 1.1 did, but version 2.1 is probably incompatible. Major version 0 is an exception in that it does not assume backwards compatibil ity. \end_layout \begin_layout Standard As long as the Tcl language mapping is not official, Combat reports the version number of the supported features to be the same as the Combat version (i.e., less than 1.0). \end_layout \begin_layout Subsection Initial References \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::resolve_initial_references" \end_inset corba::resolve_initial_references \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::resolve_initial_references \emph on id \end_layout \begin_layout Standard Obtains an initial reference. Depending on \emph on id \emph default , returns an object reference or a local object. Valid ids include \begin_inset Quotes eld \end_inset RootPOA \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset POACurrent \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset CodecFactory \begin_inset Quotes erd \end_inset (all implemented as local objects), all ids registered using the -ORBInitRef parameter to the \family typewriter corba::init \family default command, and all ids registered using the \family typewriter corba::register_\SpecialChar \- initial_\SpecialChar \- reference \family default command. \end_layout \begin_layout Standard If a default initial reference was set using the -ORBDefaultInitRef parameter to the \family typewriter corba::init \family default command, and id is not a registered initial reference, then the default initial reference is concatenated with \emph on id \emph default ; the resulting string is passed to \family typewriter corba::string_\SpecialChar \- to_\SpecialChar \- object \family default . \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::list_initial_services" \end_inset corba::list_initial_services \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::list_initial_services \end_layout \begin_layout Standard Returns a list of ids that can be used with \family typewriter corba::resolve_\SpecialChar \- initial_\SpecialChar \- references \family default . Note that the \begin_inset Quotes eld \end_inset RootPOA \begin_inset Quotes erd \end_inset id is not listed until the Root POA is first used. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::register_initial_reference" \end_inset corba::register_initial_reference \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::register_initial_reference \emph on name \emph default \emph on obj \end_layout \begin_layout Standard Registers the object reference \emph on obj \emph default as an initial reference. \emph on name \emph default will appear in the result of \family typewriter corba::list_\SpecialChar \- initial_\SpecialChar \- services \family default and can be used with \family typewriter corba::resolve_initial_references \family default to retrieve the object reference. \end_layout \begin_layout Subsection Object Reference Operations \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::string_to_object" \end_inset corba::string_to_object \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::string_to_object \emph on string \end_layout \begin_layout Standard Interprets the \emph on string \emph default as a stringified object reference, and converts it to an object reference. The \emph on string \emph default may have any of the following formats: \end_layout \begin_layout Description IOR: This is the classic CORBA format for stringified object references, a very long string with the \begin_inset Quotes eld \end_inset IOR: \begin_inset Quotes erd \end_inset prefix and the remainder in hexadecimal data. \end_layout \begin_layout Description corbaloc:: \emph on host \emph default [: \emph on port \emph default ]/ \emph on ObjectKey \emph default This format contains the server's IP address, its port number, and the object key of the target object. If \emph on port \emph default is omitted, the 2089 is used as default. \end_layout \begin_layout Description corbaname:: \emph on host \emph default [: \emph on port \emph default ][/ \emph on ObjectKey \emph default ][# \emph on name \emph default ] This format references an entry in the Naming Service. The \emph on host \emph default , \emph on port \emph default and \emph on ObjectKey \emph default identify a Naming Context. If \emph on port \emph default is omitted, 2089 is used as default. If \emph on ObjectKey \emph default is omitted, \begin_inset Quotes eld \end_inset NameService \begin_inset Quotes erd \end_inset is used. \emph on Name \emph default identifies an entry in the Naming Service. This entry is read and returned. If \emph on name \emph default is omitted, the reference of the Naming Context itself is returned. \end_layout \begin_layout Description file://[ \emph on host \emph default ] \emph on path \emph default Reads a stringified object reference from the given file. \emph on host \emph default should be the empty string or be an alias of the local host. \emph on path \emph default is an absolute path name. The contents of this file are read and then passed to \family typewriter corba::string_to_object \family default . As a special case, on Windows, if \emph on host \emph default is the empty string, then \emph on path \emph default may start with a drive name followed by a colon. \end_layout \begin_layout Description http:// The referenced URL is downloaded (requires the http package). Its contents are then passed to \family typewriter corba::string_to_object \family default . \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::object_to_string" \end_inset corba::object_to_string \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::object_to_string \emph on ref \end_layout \begin_layout Standard Converts the object reference \emph on ref \emph default into a stringified object reference, using the \begin_inset Quotes eld \end_inset IOR: \begin_inset Quotes erd \end_inset format. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::release" \end_inset corba::release \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::release \emph on ref \end_layout \begin_layout LyX-Code corba::release \emph on typecode \emph default \emph on value \end_layout \begin_layout Standard Releases the memory associated with object references. All object references must eventually be released using this function to avoid memory leaks. \end_layout \begin_layout Standard When called with a single parameter, releases the object reference \emph on ref \emph default . \end_layout \begin_layout Standard When called with two parameters, the first parameter is a typecode, and the second parameter is a value that maches the typecode. This version can be used with complex data structures to release all object references that are members of the data structure. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::duplicate" \end_inset corba::duplicate \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::duplicate \emph on ref \end_layout \begin_layout LyX-Code corba::duplicate \emph on typecode \emph default \emph on value \end_layout \begin_layout Standard Duplicates an object reference. This is usually done before passing object references to a function that eventually releases its object references, so that the duplicate can be used independently. \end_layout \begin_layout Standard When called with a single parameter, returns a new object reference that is a duplicate of \emph on ref \emph default . \end_layout \begin_layout Standard When called with two parameters, the first parameter is a typecode, and the second parameter is a value that matches the typecode. This version can be used with complex data structures. A copy of value is returned, with all object referencesthat are members of the data structure duplicated. \end_layout \begin_layout Subsection Interface Repository Operations \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::const" \end_inset corba::const \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::const \emph on id \end_layout \begin_layout Standard Looks up \emph on id \emph default in the Interface Repository. \emph on id \emph default must be the Repository Id or absolute name of a constant definition. The value of that constant is then returned using type any (i.e., a list of the constant's typecode and value). \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::type" \end_inset corba::type \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::type \emph on cmd \emph default ? \emph on args \emph default ? \end_layout \begin_layout Standard Handles type definitions. Can be used to ensure type safety. Its usage depends on the subcommand: \end_layout \begin_layout Description corba::type \begin_inset space ~ \end_inset of \begin_inset space ~ \end_inset \emph on id \emph default Looks up \emph on id \emph default in the Interface Repository. \emph on id \emph default must be the Repository Id or absolute name of a type definition. The typecode of that type is returned. \end_layout \begin_layout Description corba::type \begin_inset space ~ \end_inset match \begin_inset space ~ \end_inset \emph on typecode \emph default \begin_inset space ~ \end_inset \emph on value \emph default Checks whether \emph on value \emph default matches \emph on typecode \emph default , and returns the result as either 1 (matches) or 0 (does not match). \end_layout \begin_layout Description corba::type \begin_inset space ~ \end_inset equivalent \begin_inset space ~ \end_inset \emph on tc1 \emph default \begin_inset space ~ \end_inset \emph on tc2 \emph default Checks whether the two typecodes \emph on tc1 \emph default and \emph on tc2 \emph default are equivalent, and returns the result as either 1 (equivalent) or 0 (not equivalent). \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:combat::ir" \end_inset combat::ir \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code combat::ir add \emph on args \end_layout \begin_layout Standard This command is used to load interface information into the local Interface Repository. \emph on args \emph default must be a string which is the result of processing an IDL file with the \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset application. \end_layout \begin_layout Standard There is normally no need to call this function manually, it is implicitly called when loading a file generated by \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset using the \begin_inset Quotes eld \end_inset source \begin_inset Quotes erd \end_inset command. \end_layout \begin_layout Section Client Side Scripting \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Invocations" \end_inset Invocations \end_layout \begin_layout Subsubsection Calling Operations and Attributes \end_layout \begin_layout Standard As already noted, an object reference is a Tcl command same interface as the server object as defined in the IDL description. Using the object reference results in a remote method invocation. The generic format for method invocations and attribute access is: \end_layout \begin_layout LyX-Code \emph on ref \emph default ? \emph on options \emph default ? \emph on operation \emph default ? \emph on args \emph default ? \end_layout \begin_layout Standard \emph on ref \emph default must be a valid object reference. The \emph on operation \emph default must be a valid operation or attribute according to the service's interface. \end_layout \begin_layout Standard For operations, \emph on args \emph default has the same number of parameters as in the IDL interface description. \begin_inset Quotes eld \end_inset in \begin_inset Quotes erd \end_inset parameters are passed \emph on by value \emph default , as expected, while \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameters are passed \emph on by reference \emph default , i.e., by passing the name of a variable that contains a value (in the case of \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameters) and/or will receive the output parameter (in the case of \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset parameters). The operation's result is returned. \end_layout \begin_layout Standard For attributes, \emph on args \emph default can be empty to read the attribute. In this case, the value of the attribute is returned. To set the attribute, pass the new value as \emph on args \emph default . This returns an empty value. \end_layout \begin_layout Standard Valid \emph on options \emph default are \begin_inset Quotes eld \end_inset -async \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset -callback \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset -timeout \begin_inset Quotes erd \end_inset . When used without the \begin_inset Quotes eld \end_inset -async \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset -callback \begin_inset Quotes erd \end_inset options, two-way invocations are synchronous and will wait for the server reply before returning. One-way operations are always asynhronous. See section \begin_inset CommandInset ref LatexCommand ref reference "sub:Asynchronous-Invocations" \end_inset for more information about asynchronous invocations. \end_layout \begin_layout Standard The \begin_inset Quotes eld \end_inset -timeout \begin_inset Quotes erd \end_inset option takes a single parameter, which is the timeout in milliseconds. If a reply is not received within this period, then the request fails with the IDL:omg.org/CORBA/TIMEOUT:1.0 exception. \end_layout \begin_layout Standard Note that the ORB releases any object references that are passed to \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameters. \end_layout \begin_layout Standard See section \begin_inset CommandInset ref LatexCommand ref reference "sec:The-IDL-to-Tcl-Mapping" \end_inset below for details about how CORBA data types are mapped to Tcl. \end_layout \begin_layout Subsubsection Brief Example \end_layout \begin_layout Standard For example, consider the following IDL: \end_layout \begin_layout LyX-Code interface A { \begin_inset Newline newline \end_inset short foo (in long val, inout short flags, out string name); \begin_inset Newline newline \end_inset attribute string bar; \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard Now, assuming that the variable \begin_inset Quotes eld \end_inset aref \begin_inset Quotes erd \end_inset contains an object reference of type A, the following Tcl code could be used to invoke the \begin_inset Quotes eld \end_inset foo \begin_inset Quotes erd \end_inset operation and to access the \begin_inset Quotes eld \end_inset bar \begin_inset Quotes erd \end_inset attribute: \end_layout \begin_layout LyX-Code set flags 42 \begin_inset Newline newline \end_inset set res [$aref foo -1 flags name] \begin_inset Newline newline \end_inset puts "Bar = [$aref bar]" \begin_inset Newline newline \end_inset $aref bar "Hello World" \end_layout \begin_layout Standard The second line passes -1 as the \begin_inset Quotes eld \end_inset val \begin_inset Quotes erd \end_inset parameter and 42 as the \begin_inset Quotes eld \end_inset flags \begin_inset Quotes erd \end_inset parameter. After returning from the \begin_inset Quotes eld \end_inset foo \begin_inset Quotes erd \end_inset operation, \begin_inset Quotes eld \end_inset flags \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset name \begin_inset Quotes erd \end_inset will be updated to contain the values returned from \begin_inset Quotes eld \end_inset foo. \begin_inset Quotes erd \end_inset The third line returns the current value of the \begin_inset Quotes eld \end_inset bar \begin_inset Quotes erd \end_inset attribute, while the fourth line sets the attribute to a new value. \end_layout \begin_layout Subsubsection Built-In Operations \end_layout \begin_layout Standard An object reference also supports the following \begin_inset Quotes eld \end_inset built-in \begin_inset Quotes erd \end_inset operations which have the same semantics as defined in the CORBA specification. \end_layout \begin_layout Description \family typewriter _get_interface \family default Queries the servant for its interface. Returns an object reference of type \family typewriter CORBA::InterfaceDef \family default . This requires that the remote service is connected to a properly set-up Interface Repository. Note that use of the returned object reference requires that the IDL for the Interface Repository has been loaded into the Interface Repository. \end_layout \begin_layout Description \family typewriter _is_a \begin_inset space ~ \end_inset \family default \emph on type \emph default Takes a type, which may be specified as a Repository Id or an absolute scoped name as parameter and returns true (1) if the object implements the given interface. If Combat did not have type information for this object reference, if type information for \emph on repoid \emph default is available in the Interface Repository, and if this operation returns true, then Combat will remember \emph on repoid \emph default as this object reference's type. This feature can be used as a workaround if an object reference, e.g., one of \begin_inset Quotes eld \end_inset corbaloc: \begin_inset Quotes erd \end_inset style, does not contain type information. Scoped names can only be used for types for which information is available in the Interface Repository. \end_layout \begin_layout Description \family typewriter _non_existent \family default Returns true (1) if the server providing the implementation for this object has ceased to exist. A false return value (0) does not guarantee that any following invocations will succeed. \end_layout \begin_layout Description \family typewriter _is_equivalent \family default \emph on \begin_inset space ~ \end_inset ref \emph default Takes another object reference as parameter and returns true (1) if the objects referenced by both object references are equivalent, or false (0) if not. This operation is implemented locally. \end_layout \begin_layout Description \family typewriter _duplicate \family default Returns a duplicate of the object reference. This is equivalent to \emph on corba::duplicate \emph default . This operation is implemented locally. \end_layout \begin_layout Standard Note that there is no need for an \begin_inset Quotes eld \end_inset is_nil \begin_inset Quotes erd \end_inset operation, because nil addresses are mapped to the value 0 rather than object references. \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Asynchronous-Invocations" \end_inset Asynchronous Invocations \end_layout \begin_layout Subsubsection Calling Operations and Attributes Asynchronously \end_layout \begin_layout Standard The \begin_inset Quotes eld \end_inset -async \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset -callback \begin_inset Quotes erd \end_inset options can be used to make an invocation asynchronous. \end_layout \begin_layout LyX-Code \emph on ref \emph default -async \emph on operation \emph default ?args? \begin_inset Newline newline \end_inset \emph on ref \emph default -callback \emph on cb \emph default \emph on operation \emph default ?args? \end_layout \begin_layout Standard In either case, the call returns immediately. Instead of the operation's result, an \emph on async-id \emph default is returned. \family typewriter The -callback \family default option arranges for the given callback procedure \emph on cb \emph default to be called when the reply is received from the server. The procedure \emph on cb \emph default is called at global level with the async-id as single parameter. It is guaranteed that the callback is not executed before the above call returns. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::request" \end_inset corba::request \end_layout \begin_layout Standard The \family typewriter corba::request \family default command exists to monitor the status of asynchronous invocations in progress. \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::request get \emph on async-id \emph default \begin_inset Newline newline \end_inset corba::request poll ? \emph on async-id \emph default \SpecialChar \ldots{} ? \begin_inset Newline newline \end_inset corba::request wait ? \emph on async-id \emph default \SpecialChar \ldots{} ? \begin_inset Newline newline \end_inset corba::request cancel \emph on async-id \emph default \SpecialChar \ldots{} \end_layout \begin_layout Description \family typewriter get \family default Waits until the asynchronous request with the given \emph on async-id \emph default has completed, and returns the result of the operation, or throws an exception in case of a failure. This also extracts any \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameters \emph on within the context of the \emph default \family typewriter get \family default \emph on call \emph default (see below). \end_layout \begin_layout Description \family typewriter poll \family default If called without a parameter, it checks if any of the outstanding asynchronous invocations have completed. If \family typewriter poll \family default is called with one or more \emph on async- \emph default id, it checks if any of these asynchonous invocations have finished. If yes, a single async-id is returned. \family typewriter corba::request get \family default should then be called for that async-id to retrieve the result. If none of the (given) requests have completed, \family typewriter poll \family default returns immediately with an empty result. \end_layout \begin_layout Description \family typewriter wait \family default Similar to \family typewriter poll \family default , but waits (enters the event loop) until one request has finished and then returns its async-id. If called without arguments, it considers all outstanding requests. If there are no outstanding requests, it immediately returns with an empty result. \end_layout \begin_layout Description cancel Cancels the asynchronous requests with the given \emph on async-ids \emph default . All information about the requests is discarded. \family typewriter corba::request get \family default shall not be called. If a callback was configured for this request, it is \emph on not \emph default called. \end_layout \begin_layout Subsubsection Callback Procedures \end_layout \begin_layout Standard A callback procedure receives an async-id as single parameter and is expected to (directly or indirectly) perform a \family typewriter corba::request get \family default for that async-id. Here's a simple example for a callback: \end_layout \begin_layout LyX-Code proc cb {id} { \begin_inset Newline newline \end_inset set res [corba::request get $id] \begin_inset Newline newline \end_inset puts "Result is: $res" \begin_inset Newline newline \end_inset } \end_layout \begin_layout Standard Note the behaviour with respect to an operation's \family typewriter out \family default or \family typewriter inout \family default parameters. When sending a request, only the \emph on names \emph default of the variables that were given for the \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameter are stored, and these variable names are written to in the context in which the corresponding \family typewriter corba::request get \family default is executed. So unless global variable names are used (i.e., variable names starting with \begin_inset Quotes eld \end_inset :: \begin_inset Quotes erd \end_inset or those declared \begin_inset Quotes eld \end_inset global \begin_inset Quotes erd \end_inset ), they will be visible in the context of the callback only. \end_layout \begin_layout Subsubsection Notes \end_layout \begin_layout Itemize The \family typewriter -async \family default and \family typewriter -callback \family default flags can be used likewise on operations and attributes. \end_layout \begin_layout Itemize Ordering is not guaranteed for asynchronous invocations, not even on the same object. \end_layout \begin_layout Itemize Asynchronous invocations are only processed in Tcl's event loop. \end_layout \begin_layout Itemize If a timeout was specified for an asynchronous invocation, then upon expiration of the timeout, the associated async-id becomes ready, the callback is called if specified, and corba::\SpecialChar \- request get will raise the IDL:omg.org/CORBA/TIM EOUT:1.0 exception. \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Dynamic-Invocations" \end_inset Dynamic Invocations \end_layout \begin_layout Standard Calling operations and accessing attributes as described above requires that type information is available in the Interface Repository. If type information is not available, a \emph on dynamic invocation \emph default can be used to call operations and access attributes. For a dynamic invocation, type information must be provided \begin_inset Quotes eld \end_inset manually. \begin_inset Quotes erd \end_inset This can be useful for generic programming, if type information becomes available at run-time only. \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::dii ? \emph on options \emph default ? \emph on ref \emph default \emph on spec \emph default ? \emph on args \emph default ? \end_layout \begin_layout Standard The \emph on ref \emph default and \emph on args \emph default parameters are the same as above. \emph on spec \emph default must be a list composed of three or four elements. The first element is the typecode of the return value. The second element is the name of the operation to be invoked. The third element describes the parameters. The parameter description is a list that contains one element per parameter. Each parameter is described by a list of two elements. The first element is the parameter direction, i.e., either \begin_inset Quotes eld \end_inset in \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset inout, \begin_inset Quotes erd \end_inset and the second element is the parameter's typecode. The fourth element of spec is a list of exception typecodes that this operation may throw. \end_layout \begin_layout Standard Valid options are \begin_inset Quotes eld \end_inset -async \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset -callback \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset -timeout \begin_inset Quotes erd \end_inset , as above. \end_layout \begin_layout Section Server Side Scripting \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Implementing-Servants" \end_inset Implementing Servants \end_layout \begin_layout Standard Like other ORBs, Combat supports the Portable Object Adapter (POA) and its associated APIs. Implementing servants is therefore very similar as in other programming languages. \end_layout \begin_layout Standard Servants are realized using [incr Tcl] classes that inherit, directly or indirectly, from the base class PortableServer::\SpecialChar \- ServantBase. The implementation must provide public variables for IDL attributes and public methods for IDL operations. Methods follow the same mapping rules as for client-side scripting, including the by-reference rules for \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset parameters. \end_layout \begin_layout Standard Note that the ORB releases all object references that are passed into and out of an operation. Use corba::\SpecialChar \- duplicate to preserve object references beyond the method invocation. \end_layout \begin_layout Standard Because Combat does not have compile-time type information, run-time type information must be supplied. This is done by implementing the public method \begin_inset Quotes eld \end_inset _Interface \begin_inset Quotes erd \end_inset (with a leading underscore and a capital I). This method must not take any parameters and must return the type of the most-derived IDL interface that the servant supports, either as a Repository Id or as an absolute scoped name. Type information for this interface must be available in the local Interface Repository. Like with client-side scripting, this is achieved by processing the IDL file with the \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset application and loading the resulting \begin_inset Quotes eld \end_inset .tcl \begin_inset Quotes erd \end_inset file using the \begin_inset Quotes eld \end_inset source \begin_inset Quotes erd \end_inset command. \end_layout \begin_layout Standard It is the application's responsibility to create and delete servant instances using the normal [itcl Tcl] semantics. The application must not delete any active servants. \end_layout \begin_layout Standard Servants are not immediately accessible from the outside after their creation. They must first be \emph on activated \emph default using the Portable Object Adapter. \end_layout \begin_layout Standard Servants inherits the \begin_inset Quotes eld \end_inset _this \begin_inset Quotes erd \end_inset methods, which works the same as in the C++ mapping: \end_layout \begin_layout Enumerate Within the context of a request invocation, \begin_inset Quotes eld \end_inset _this \begin_inset Quotes erd \end_inset returns a new object reference for the servant. \end_layout \begin_layout Enumerate Outside the context of a request invocation, if the servant has not yet been activated, and if its POA has the IMPLICIT_ACTIVATION policy, the servant is activated, and an object reference for the newly-activated servant is returned. \end_layout \begin_layout Enumerate Outside the context of a request invocation, if the servant has already been activated, and if its POA has the UNIQUE_ID policy, an object reference for the already-active servant is returned. \end_layout \begin_layout Subsection Implementation Example \end_layout \begin_layout Standard Considering the following IDL file: \end_layout \begin_layout LyX-Code interface HelloWorld { \begin_inset Newline newline \end_inset attribute long messageCounter; \begin_inset Newline newline \end_inset void hello (in string message); \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard Its implementation could look like: \end_layout \begin_layout LyX-Code itcl::class HelloWorld_impl { \begin_inset Newline newline \end_inset inherit PortableServer::ServantBase \end_layout \begin_layout LyX-Code public method _Interface {} { \begin_inset Newline newline \end_inset return "::HelloWorld" \begin_inset Newline newline \end_inset } \end_layout \begin_layout LyX-Code public variable messageCounter 0 \begin_inset Newline newline \end_inset public method hello {message} { \begin_inset Newline newline \end_inset puts "The client says: $message" \begin_inset Newline newline \end_inset incr messageCounter \begin_inset Newline newline \end_inset } \begin_inset Newline newline \end_inset } \end_layout \begin_layout Standard Here is a second example to demonstrate usage of \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameters. As with method invocations, \begin_inset Quotes eld \end_inset in \begin_inset Quotes erd \end_inset parameters are passed by value, while \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset parameters are passed by reference. Considering the following IDL file: \end_layout \begin_layout LyX-Code interface A { \begin_inset Newline newline \end_inset short op (in long val, inout short flags, out string name); \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard The implementation of the \begin_inset Quotes eld \end_inset op \begin_inset Quotes erd \end_inset method receives variable names for the \begin_inset Quotes eld \end_inset flags \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset name \begin_inset Quotes erd \end_inset parameters. The implementation can then \begin_inset Quotes eld \end_inset import \begin_inset Quotes erd \end_inset these variables using Tcl's \begin_inset Quotes eld \end_inset upvar \begin_inset Quotes erd \end_inset command. Therefore, an implementation for the above interface could look like: \end_layout \begin_layout LyX-Code itcl::class A { \begin_inset Newline newline \end_inset inherit PortableServer::ServantBase \begin_inset Newline newline \end_inset public method _Interface { \begin_inset Newline newline \end_inset return "::A" \begin_inset Newline newline \end_inset } \end_layout \begin_layout LyX-Code public method op { val flags_name name_name } { \begin_inset Newline newline \end_inset # The next line imports \begin_inset Quotes eld \end_inset flags \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset name \begin_inset Quotes erd \end_inset \begin_inset Newline newline \end_inset upvar $flags_name flags $name_name name \begin_inset Newline newline \end_inset puts "val is $val" \begin_inset Newline newline \end_inset puts "flags is $flags" \begin_inset Newline newline \end_inset set flags -1 \begin_inset Newline newline \end_inset set name "Hello World" \begin_inset Newline newline \end_inset return 42 \begin_inset Newline newline \end_inset } \begin_inset Newline newline \end_inset } \end_layout \begin_layout Subsection The POA Local Object \end_layout \begin_layout Standard A local object for the Root POA is obtained using corba::resolve_\SpecialChar \- initial_\SpecialChar \- referen ces: \end_layout \begin_layout LyX-Code set rootPOA [corba::resolve_initial_references RootPOA] \end_layout \begin_layout Standard POA local objects support all operations as defined in the CORBA specification. The usual type mapping rules apply, with a single exception. The second parameter to the \family typewriter create_POA \family default method is a list of policy \emph on values \emph default rather than a list of policy \emph on objects \emph default . (Note: This obsoletes corresponding factory operations like \family typewriter create_\SpecialChar \- lifespan_\SpecialChar \- policy \family default .) \end_layout \begin_layout Standard For example: \end_layout \begin_layout LyX-Code set myPOA [$rootPOA create_POA 0 {USE_SERVANT_MANAGER PERSISTENT}] \end_layout \begin_layout Standard This creates a new POA as a child of the Root POA. A new POA Manager is created, because a nil value rather than a local object for an existing POA Manager is passed as the first parameter. The new POA will support persistent objects and use a servant manager. \end_layout \begin_layout Standard The \begin_inset Quotes eld \end_inset native \begin_inset Quotes erd \end_inset data types from the POA specification are represented in the following way: \end_layout \begin_layout Description PortableServer::Servant Servants are instances of an [incr Tcl] class that derives from PortableServant::\SpecialChar \- ServantBase, as described above. \end_layout \begin_layout Description PortableServer::ObjectId ObjectIds are mapped to Tcl strings. \end_layout \begin_layout Description PortableServer::ServantLocator::Cookie Cookies are mapped to Tcl strings. \end_layout \begin_layout Subsection The POA Current Local Object \end_layout \begin_layout Standard A POA Current local object can be obtained using corba::\SpecialChar \- resolve_\SpecialChar \- initial_\SpecialChar \- re\SpecialChar \- feren\SpecialChar \- c es. A POA Current local object implements all operations as defined in the CORBA specification: \end_layout \begin_layout Description \family typewriter get_POA \family default In the context of a method invocation on a servant, returns the POA in whose context it is called. \end_layout \begin_layout Description \family typewriter get_object_id \family default In the context of a method invocation, returns the Object Id identifying the object in whose context it is called. \end_layout \begin_layout Subsection The POA Manager Local Object \end_layout \begin_layout Standard A POA Manager local object is obtained using the \begin_inset Quotes eld \end_inset the_POAManager \begin_inset Quotes erd \end_inset method on a POA local object. It implements the following methods as defined in the CORBA specification: \end_layout \begin_layout Description \family typewriter activate \family default Switches all associated POAs to the \begin_inset Quotes eld \end_inset active \begin_inset Quotes erd \end_inset state so that they begin serving requests. \end_layout \begin_layout Description \family typewriter hold_requests \begin_inset space ~ \end_inset \family default \emph on wait_for_completion \emph default Switches all associated POAs to the \begin_inset Quotes eld \end_inset holding \begin_inset Quotes erd \end_inset state, so that incoming method invocations are queued. Queued requests are delayed until the POA again enters the active state. \end_layout \begin_layout Description \family typewriter discard_requests \begin_inset space ~ \end_inset \family default \emph on wait_for_completion \emph default Switches all associated POAs to the \begin_inset Quotes eld \end_inset discarding \begin_inset Quotes erd \end_inset state, so that incoming method invocations are discarded rather than processed. \end_layout \begin_layout Description \family typewriter deactivate \begin_inset space ~ \end_inset \family default \emph on etherealize \begin_inset space ~ \end_inset wait_for_completion \emph default Switches all associated POAs to the \begin_inset Quotes eld \end_inset inactive \begin_inset Quotes erd \end_inset state. If \emph on etherealize \emph default is true, a servant manager, if available, is asked to \begin_inset Quotes eld \end_inset etherealize \begin_inset Quotes erd \end_inset active objects. \end_layout \begin_layout Subsection Limitations \end_layout \begin_layout Standard Because [incr Tcl] does not support virtual inheritance, Combat does not support multiple inheritance. Single implementation inheritance works, so the implementation for a derived class can inherit from the implementation of the base class (and will thus indirectly inherit PortableServer::\SpecialChar \- ServantBase). \end_layout \begin_layout Section \begin_inset CommandInset label LatexCommand label name "sec:The-IDL-to-Tcl-Mapping" \end_inset The IDL to Tcl Mapping \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Mapping-of-Data-Types" \end_inset Mapping of Data Types \end_layout \begin_layout Standard This section describes in detail how IDL data types are mapped to Tcl types. \end_layout \begin_layout Description Primitive \begin_inset space ~ \end_inset Types Values of type \family typewriter short \family default , \family typewriter long \family default , \family typewriter unsigned short \family default , \family typewriter unsigned long \family default , \family typewriter long long \family default and \family typewriter unsigned long long \family default are mapped to Tcl's integer type. Errors may occur if a value exceeds the numerical range of Tcl's integer type. \end_layout \begin_deeper \begin_layout Standard Values of type \family typewriter float \family default , \family typewriter double \family default , \family typewriter long double \family default are mapped to Tcl's floating point type. \end_layout \begin_layout Standard Values of type \family typewriter string \family default and \family typewriter wstring \family default are mapped to Tcl strings. \end_layout \begin_layout Standard Values of type \family typewriter boolean \family default may take any of the forms for which \begin_inset Quotes eld \end_inset string is boolean \begin_inset Quotes erd \end_inset returns true. In a result, they are always rendered as 0 (false) and 1 (true). \end_layout \begin_layout Standard Values of type \family typewriter octet \family default , \family typewriter char \family default and \family typewriter wchar \family default values are mapped to strings of length 1. \end_layout \begin_layout Standard Values of type \family typewriter fixed \family default values are mapped to a floating-point value in exponential representation. Depending on their scale and value, it may or may not be possbile to use the value in a Tcl expression. \end_layout \end_deeper \begin_layout Description Struct \begin_inset space ~ \end_inset Types Values of type \family typewriter struct \family default are mapped to a list. For each element in the structure, there are two elements in the list -- the first is the element name, the second is the element's value. This allows to easily assign structures from and to associative arrays, using \family typewriter array get \family default and \family typewriter array set \family default . \end_layout \begin_deeper \begin_layout Standard Example: the IDL type \end_layout \begin_layout LyX-Code struct A { \begin_inset Newline newline \end_inset unsigned long B; \begin_inset Newline newline \end_inset string C; \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard can be matched by the Tcl list \begin_inset Quotes eld \end_inset {B 42 C {Hello World}} \begin_inset Quotes erd \end_inset . \end_layout \end_deeper \begin_layout Description Sequences Values of a \family typewriter sequence \family default type are mapped to a list. As an exception, sequences of \family typewriter char \family default , \family typewriter octet \family default and \family typewriter wchar \family default are mapped to strings. \end_layout \begin_deeper \begin_layout Standard Example: the IDL type \end_layout \begin_layout LyX-Code typedef sequence D; \end_layout \begin_layout Standard (following the above example for a structure) can be matched by the Tcl list \begin_inset Quotes eld \end_inset {{B 42 C {Hello World}}} \begin_inset Quotes erd \end_inset . Note the extra level of nesting compared to the struct above. \end_layout \end_deeper \begin_layout Description Arrays Values of \family typewriter array \family default type are mapped to a list. As an exception, sequences of \family typewriter char \family default , \family typewriter octet \family default and \family typewriter wchar \family default are mapped to strings. \end_layout \begin_layout Description Enumerations Values of \family typewriter enum \family default type are mapped to the enumeration identifiers (without any namespace qualifier s). \end_layout \begin_deeper \begin_layout Standard Example: the IDL type \end_layout \begin_layout LyX-Code enum E {F, G, H}; \end_layout \begin_layout Standard can be matched by the Tcl string \begin_inset Quotes eld \end_inset G \begin_inset Quotes erd \end_inset . \end_layout \end_deeper \begin_layout Description Unions Values of a \family typewriter union \family default type are mapped to a list of length 2. The first element is the discriminator, or \begin_inset Quotes eld \end_inset (default) \begin_inset Quotes erd \end_inset for the default member. The second element is the appropriate union member. Note that the default case can also be represented by a concrete value distinct from all other case labels. \end_layout \begin_layout Description Object \begin_inset space ~ \end_inset References Non-nil object references are mapped to Tcl commands. Nil object references are mapped to the integer value 0 (zero). \end_layout \begin_layout Description Exceptions Values of an \family typewriter exception \family default type are mapped to a list of length one or two. The first element is the Repository Id for the exception. If present, the second element is the exception's contents, equivalent to the structure mapping. The second element may be omitted if the exception has no members. \end_layout \begin_layout Description Value \begin_inset space ~ \end_inset Types Values of a \family typewriter valuetype \family default type are mapped to a list, like \family typewriter structs \family default . For each element in the inheritance hierarchy of a \family typewriter valuetype \family default , there are two elements in the list -- the first is the element name, and the second is the element's value. An additional member with the name \begin_inset Quotes eld \end_inset _tc_ \begin_inset Quotes erd \end_inset may be present. If present, its value must be a typecode. In an invocation, this member determines the type to be sent. This mechanism allows to send a derived valuetype where a base valuetype is expected. If no \begin_inset Quotes eld \end_inset _tc_ \begin_inset Quotes erd \end_inset member is present, the valuetype must be of the same type as requested by the parameter. When receiving a valuetype, the \begin_inset Quotes eld \end_inset _tc_ \begin_inset Quotes erd \end_inset member is always added. The value 0 (zero) can be used for a null value. \end_layout \begin_deeper \begin_layout Standard Note that this language mapping disallows valuetypes that contain themselves (such as graphs with circles). \end_layout \begin_layout Standard \family typewriter custom \family default valuetypes are not supported. \end_layout \end_deeper \begin_layout Description Value \begin_inset space ~ \end_inset Boxes Boxed \family typewriter valuetype \family default values are mapped to either the boxed type or to the integer 0 (zero) for a null value. In the case of boxed integers, the value 0 will always be read as a null value rather than a non-null value containing the boxed integer zero. Shoot yourself in the foot if you run into this problem. \end_layout \begin_layout Description TypeCodes Values of type \family typewriter TypeCode \family default are mapped to a string containing a description of the typecode: \end_layout \begin_deeper \begin_layout Itemize Typecodes for the primitive types \family typewriter void \family default , \family typewriter boolean \family default , \family typewriter short \family default , \family typewriter long \family default , \family typewriter unsigned short \family default , \family typewriter unsigned long \family default , \family typewriter long long \family default , \family typewriter unsigned long long \family default , \family typewriter float \family default , \family typewriter double \family default , \family typewriter long double \family default , \family typewriter char \family default , \family typewriter octet \family default , \family typewriter string \family default , \family typewriter any \family default , \family typewriter TypeCode \family default are mapped to their name. \end_layout \begin_layout Itemize Bounded string typecodes are mapped to a list of length two. The first element of the list is the identifier \family typewriter string \family default , the second element is the bound. \end_layout \begin_layout Itemize Bounded wstring typecodes are mapped to a list of length two. The first element of the list is the identifier \family typewriter wstring \family default , the second element is the bound. \end_layout \begin_layout Itemize Typecodes for a \family typewriter struct \family default type are mapped to a list of length three. The first element is the identifier \family typewriter struct \family default . The second element is the Repository Id, if available (else, the field may be empty). The third element is a list with an even number of elements. The zeroth and other even-numbered elements are member names, followed by the member's typecode. \end_layout \begin_layout Itemize Typecodes for a \family typewriter union \family default type are mapped to a list of length four. The first element is the identifier \family typewriter union \family default . The second element is the Repository Id, if available (else, the field may be empty). The third element is the typecode of the discriminator. The fourth element is a list with an even number of elements. The zeroth and other even-numbered elements are labels or the identifier \family typewriter default \family default for the default label, followed by the typecode of the associated member. \end_layout \begin_layout Itemize Typecodes for an \family typewriter exception \family default type are mapped to a list of length three. The first element is the identifier \family typewriter exception \family default , the second element the Repository Id, and the third element is a list with an even number of elements. The zeroth and other even-numbered elements are member names, followed by the member's typecode. \end_layout \begin_layout Itemize Typecodes for a \family typewriter sequence \family default type are mapped to a list of length two or three. The first element is the identifier \family typewriter sequence \family default , the second element is the typecode of the member type. The third element, if present, denotes the sequence's bound. Otherwise, the sequence is unbounded. \end_layout \begin_layout Itemize Typecodes for an \family typewriter array \family default type are mapped to a list of length three. The first element is the identifier \family typewriter array \family default , the second element is the typecode of the member type, the third element is the array's length. \end_layout \begin_layout Itemize \family typewriter Typecodes for an enum \family default type are mapped to a list of length two. The first element is the identifier \family typewriter enum \family default , the second element is a list of the enumeration identifiers. \end_layout \begin_layout Itemize Object reference typecodes are mapped to a list of length two. The first element is the identifier \family typewriter Object \family default , the second element is the Repository Id of the IDL \family typewriter interface \family default . \end_layout \begin_layout Itemize Typecodes for a \family typewriter fixed \family default type are mapped to a list of length three. The first element is the identifier \family typewriter fixed \family default . The second element is the number of significant digits, the third element is the scale. \end_layout \begin_layout Itemize Typecodes for a \family typewriter valuetype \family default are mapped to a list of length five. The first element is the identifier \family typewriter valuetype \family default . The second element is the Repository Id. The third element is a list of non-inherited members. For each member, there are three elements in the list, a visibility ( \family typewriter private \family default or \family typewriter public \family default ), the member name and the member's typecode. The fourth element is the typecode of the valuetype's concrete base, or 0 (zero) if the valuetype does not have a concrete base. The fifth element is either an empty string or one of the modifiers \family typewriter custom \family default , \family typewriter abstract \family default or \family typewriter truncatable \family default . \end_layout \begin_layout Itemize Typecodes for a boxed \family typewriter valuetype \family default are mapped to a list of length 3. The first element is the identifier \family typewriter valuebox \family default . The second element is the Repository Id, and the third element is the typecode of the boxed type. \end_layout \begin_layout Itemize A recursive reference to an outer type (in a \family typewriter struct \family default , \family typewriter union \family default or \family typewriter valuetype \family default ) can be expressed by a list of length two. The first element is the identifier \family typewriter recursive \family default , the second element is the Repository Id of the outer type, which must appear in the same typecode description. \end_layout \begin_layout Standard Examples for legal TypeCodes are: \end_layout \begin_layout Itemize \family typewriter struct {} {s short ul {unsigned long} Q string} \family default \end_layout \begin_layout Itemize \family typewriter enum {A B C} \family default \end_layout \begin_layout Itemize \family typewriter union {} short {0 boolean (default) string} \family default \end_layout \begin_layout Itemize \family typewriter struct IDL:S:1.0 {foo {sequence {recursive IDL:S:1.0}}} \family default \end_layout \begin_layout Standard See the description of corba::type in section \begin_inset CommandInset ref LatexCommand ref reference "cmd:corba::type" \end_inset . The \begin_inset Quotes eld \end_inset of \begin_inset Quotes erd \end_inset subcommand can be used to retrieve TypeCode information from the Interface Repository, the \begin_inset Quotes eld \end_inset equivalent \begin_inset Quotes erd \end_inset subcommand can be used to check TypeCode values against known types. \end_layout \end_deeper \begin_layout Description Any Values of type \family typewriter any \family default are mapped to a list of length two. The first element is the typecode, and the second element is the value. \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Mapping-of-Exceptions" \end_inset Exceptions \end_layout \begin_layout Standard Exceptions are mapped to Tcl errors. The \family typewriter corba::throw \family default command is syntactic sugar for Tcl's native \begin_inset Quotes eld \end_inset error, \begin_inset Quotes erd \end_inset and \family typewriter corba::try \family default can be used to handle exceptions thrown with \family typewriter corba::throw \family default as well as errors raised with \begin_inset Quotes eld \end_inset error. \begin_inset Quotes erd \end_inset \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::throw" \end_inset corba::throw \end_layout \begin_layout Standard Exceptions can be thrown with the \family typewriter corba::throw \family default command. \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::throw \emph on exception \end_layout \begin_layout Standard The \emph on exception \emph default value must be of exception type according to the type mapping, i.e., a list of length one or two. The first element of the list is the exception's Repository Id or absolute scoped name. The second element is a list of the exception's members according to the mapping for structures. E.g., if the following two exceptions were declared in interface A: \end_layout \begin_layout LyX-Code interface A { \begin_inset Newline newline \end_inset exception EX { \begin_inset Newline newline \end_inset long value; \begin_inset Newline newline \end_inset string reason; \begin_inset Newline newline \end_inset }; \begin_inset Newline newline \end_inset exception OOPS {}; \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard Then these would be valid uses of \family typewriter corba::throw: \end_layout \begin_layout LyX-Code corba::throw {IDL:A/EX:1.0 {value 42 reason "oops, what's up, doc?"}} \begin_inset Newline newline \end_inset corba::throw ::A::OOPS \end_layout \begin_layout Standard In the second example, the second list element could be omitted because the exception does not have any members. \end_layout \begin_layout Standard If this command is used in a servant in the context of a server invocation, and if the exception is not caught within the servant, it is passed back to the client side. If an exception is not caught within a client, the client prints an error message and terminates. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "cmd:corba::try" \end_inset corba::try \end_layout \begin_layout Standard The \family typewriter corba::try \family default command implements Java-style processing of exceptions and other Tcl errors. \end_layout \begin_layout Standard Syntax: \end_layout \begin_layout LyX-Code corba::try \emph on block \emph default ?catch { \emph on type \emph default ? \emph on var \emph default ?} \emph on c-block \emph default ? \SpecialChar \ldots{} ?finally \emph on f-block \emph default ? \end_layout \begin_layout Standard First, \emph on block \emph default is evaluated. If a CORBA exception or Tcl error has occured, then the \family typewriter catch \family default clauses are searched left to right. Each \family typewriter catch \family default clause is associated with a specific exception type and a code block. For the first clause whose \emph on type \emph default matches the exception's type, the associated \emph on c-block \emph default is executed. The \emph on type \emph default can be specified as a Repository Id or as an absolute scoped name. \end_layout \begin_layout Standard The special value \begin_inset Quotes eld \end_inset \SpecialChar \ldots{} \begin_inset Quotes erd \end_inset can be used for \emph on type \emph default to match all CORBA exceptions and Tcl errors. If a variable name \emph on var \emph default is present in a \family typewriter catch \family default clause, this variable is set to the exception that has occured. Regardless of whether an exception or error has occured and whether an exception or error has indeed been handled by a \family typewriter catch \family default clause, the \emph on f-block \emph default associated with the \family typewriter finally \family default clause is, if it exists, always executed. If there are no \family typewriter catch \family default clauses, an implicit clause that catches \begin_inset Quotes eld \end_inset \SpecialChar \ldots{} \begin_inset Quotes erd \end_inset is used. The return value of the \family typewriter corba::try \family default statement is computed as follows, in order of priority: \end_layout \begin_layout Itemize If a \family typewriter finally \family default clause exists and its \emph on f-block \emph default completes with a return value different from \family typewriter TCL_OK \family default (i.e. \begin_inset space ~ \end_inset causes itself an error or executes a Tcl \family typewriter return \family default , \family typewriter break \family default or \family typewriter continue \family default statement), then this return code is used. \end_layout \begin_layout Itemize If a CORBA exception or Tcl error occurs while executing \emph on block \emph default , and this exception or error is handled by a \family typewriter catch \family default clause, then the return value of the associated \emph on c-block \emph default is used. \end_layout \begin_layout Itemize If a CORBA exception or Tcl error occurs while executing \emph on block \emph default , and this exception is not handled by a \family typewriter catch \family default clause, then this error is used. \end_layout \begin_layout Itemize If no CORBA exception or Tcl error occurs while executing \emph on block \emph default , then its return code is used. \end_layout \begin_layout Standard One effect of this return value handling is that all code blocks may execute a Tcl \family typewriter return \family default , \family typewriter break \family default or \family typewriter continue \family default statement, which will then be correctly passed along to the surrounding code. \end_layout \begin_layout Standard One caveat is that it is not possible to collectively catch all CORBA system exceptions as \begin_inset Quotes eld \end_inset CORBA::\SpecialChar \- SystemException. \begin_inset Quotes erd \end_inset \end_layout \begin_layout Subsubsection Exception Example \end_layout \begin_layout Standard Here's a small code example demostrating exception handling: \end_layout \begin_layout LyX-Code corba::try { \begin_inset Newline newline \end_inset \SpecialChar \ldots{} \begin_inset Newline newline \end_inset } catch {::A::EX oops} { \begin_inset Newline newline \end_inset # The variable oops contains A::EX data \begin_inset Newline newline \end_inset } catch {::CORBA::COMM_FAILURE} { \begin_inset Newline newline \end_inset # The remote server may be down \begin_inset Newline newline \end_inset } catch {... oops} { \begin_inset Newline newline \end_inset puts "oops: unexpected exception: $oops" \begin_inset Newline newline \end_inset } \end_layout \begin_layout Section \begin_inset CommandInset label LatexCommand label name "sec:The-idl2tcl-Application" \end_inset The idl2tcl Application \end_layout \begin_layout Subsection Introduction \end_layout \begin_layout Standard As already mentioned above, Combat requires that type information is loaded into the local Interface Repository. The \begin_inset Quotes eld \end_inset idl2tcl \begin_inset Quotes erd \end_inset application is provided to read IDL files and to produce a Tcl file that can be loaded with the \begin_inset Quotes eld \end_inset source \begin_inset Quotes erd \end_inset command to feed the IDL file's type information to the local Interface Repository. \end_layout \begin_layout Standard idl2tcl works by preprocessing and parsing the IDL file into a CORBA Interface Repository. Because Combat neither implements an IDL parser nor a CORBA-compliant Interface Repository, idl2tcl must rely on a third-party ORB to provide both. Unfortunately, the syntax for loading IDL files into an Interface Repository is not standardized. idl2tcl has built-in knowledge how to accomplish this using the \noun on Mico \noun default and TAO ORBs, and has command-line options to work with other ORBs. \end_layout \begin_layout Subsection Usage \end_layout \begin_layout Standard idl2tcl is a command-line application with the following syntax:: \end_layout \begin_layout LyX-Code idl2tcl ? \emph on options \emph default ? \emph on idl-file \emph default \SpecialChar \ldots{} \end_layout \begin_layout Standard Each IDL file is preprocessed and loaded into an Interface Repository. The Interface Repository is started from scratch, i.e., before the first IDL file is loaded, it is empty. Type information for the entire contents of the Interface Repository is then written to a Tcl file in the current directory with the same base name as the first IDL file and the \begin_inset Quotes eld \end_inset .tcl \begin_inset Quotes erd \end_inset extension. This Tcl file can then be read with the \begin_inset Quotes eld \end_inset source \begin_inset Quotes erd \end_inset command to load the type information from all IDL files into Combat's Interface Repository. \end_layout \begin_layout Standard idl2tcl supports the following options: \end_layout \begin_layout Description \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset name \begin_inset space ~ \end_inset \emph on name \emph default Names the output file, instead of using the first IDL file's base name. The \begin_inset Quotes eld \end_inset .tcl \begin_inset Quotes erd \end_inset extension is appended to \emph on name \emph default . \end_layout \begin_layout Description -I \emph on path \emph default This option is passed to the IDL compiler. \end_layout \begin_layout Description -D \emph on name \emph default [= \emph on value \emph default ] This option is passed to the IDL compiler. \end_layout \begin_layout Description \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset impl Writes an implementation skeleton file to the file \emph on name \emph default _skel.tcl, where \emph on name \emph default is the base name of the first IDL file name or the parameter to the \begin_inset Quotes eld \end_inset \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset name \begin_inset Quotes erd \end_inset option. This skeleton can then be filled in to ease the effort of implementing servants. If the output file exists, it is not overwritten. \end_layout \begin_layout Description \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset ir \begin_inset space ~ \end_inset \emph on ior \emph default Process the contents of the CORBA Interface Repository identified by the stringified object reference \emph on ior \emph default . No IDL files are processed. The \begin_inset Quotes eld \end_inset \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset name \begin_inset Quotes erd \end_inset option must be supplied. \end_layout \begin_layout Description \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset ifr \begin_inset space ~ \end_inset \emph on cmd \emph default Use \emph on cmd \emph default to start the Interface Repository. \emph on cmd \emph default must include appropriate command-line parameters so that the Interface Repository's stringified object reference gets written to the file \begin_inset Quotes eld \end_inset ir.ior \begin_inset Quotes erd \end_inset in the current directory. \end_layout \begin_layout Description \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset idl \begin_inset space ~ \end_inset \emph on cmd \emph default Use \emph on cmd \emph default to load IDL files into the Interface Repository. To \emph on cmd \emph default , idl2tcl appends the \begin_inset Quotes eld \end_inset -ORBInitRef \begin_inset Quotes erd \end_inset parameter to set the \begin_inset Quotes eld \end_inset InterfaceRepository \begin_inset Quotes erd \end_inset initial reference, the set of IDL compiler options ( \begin_inset Quotes eld \end_inset -I \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset -D \begin_inset Quotes erd \end_inset above), and the name of a single IDL file. \emph on cmd \emph default shall return a zero exit status in case of success or non-zero in case of failure, and not write to standard error except in case of error. \end_layout \begin_layout Description -v Be more verbose. This option can be used multiple times for increased verbosity. \end_layout \begin_layout Subsection ORB Configuration \end_layout \begin_layout Standard As mentioned above, idl2tcl requires an IDL compiler and CORBA Interface Repository from a third part ORB. idl2tcl has built-in knowledge of \noun on Mico \noun default and TAO: \end_layout \begin_layout Itemize To have idl2tcl use \noun on Mico \noun default , the \begin_inset Quotes eld \end_inset ird \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset idl \begin_inset Quotes erd \end_inset applications must be available in the search path. \end_layout \begin_layout Itemize To have idl2tcl use TAO, the \begin_inset Quotes eld \end_inset IFR_Service \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset tao_ifr \begin_inset Quotes erd \end_inset applications must be available in the search path. \end_layout \begin_layout Standard There are two options to use another ORB's IDL compiler and Interface Repository : \end_layout \begin_layout Itemize Use idl2tcl's \begin_inset Quotes eld \end_inset \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset ifr \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset idl \begin_inset Quotes erd \end_inset options, providing the ORB-specific command lines for the IDL compiler and Interface Repository. \end_layout \begin_layout Itemize Manually start the Interface Repository, manually load the IDL file(s) into the Interface Repository, and then use idl2tcl's \begin_inset Quotes eld \end_inset \begin_inset ERT status open \begin_layout Plain Layout \backslash ddash{} \end_layout \end_inset ir \begin_inset Quotes erd \end_inset option to process this Interface Repository. \end_layout \begin_layout Subsection Troubleshooting \end_layout \begin_layout Standard This section notes some common issues with idl2tcl: \end_layout \begin_layout Itemize The tool that loads IDL files into the Interface Repository generally requires a C preprocessor to be available in your search path. (E.g., \noun on Mico \noun default 's \begin_inset Quotes eld \end_inset idl \begin_inset Quotes erd \end_inset uses \begin_inset Quotes eld \end_inset mico-cpp, \begin_inset Quotes erd \end_inset while TAO's \begin_inset Quotes eld \end_inset tao_ifr \begin_inset Quotes erd \end_inset uses a preprocessor that's defined at compile-time.) The search path must bet set so that the required C preprocessor is found. \end_layout \begin_layout Itemize Some IDL compilers use built-in search paths to locate standard IDL files (such as \begin_inset Quotes eld \end_inset corba.idl \begin_inset Quotes erd \end_inset ). When you are using the pre-built idl2tcl package on Windows, which is based on \noun on Mico \noun default , but otherwise use a different ORB for development, it may be necessary to supply the appropriate include path to idl2tcl.. \end_layout \begin_layout Section \begin_inset CommandInset label LatexCommand label name "sec:Complete-Example" \end_inset Complete Example \end_layout \begin_layout Standard This document has already included a number of code fragments. This chapter walks you through a simple but complete client/server application. The code can also be found in the \begin_inset Quotes eld \end_inset demo/hello \begin_inset Quotes erd \end_inset subdirectory. \end_layout \begin_layout Subsection The IDL File \end_layout \begin_layout Standard The IDL file, hello.idl, defines the following interface: \end_layout \begin_layout LyX-Code interface HelloWorld { \begin_inset Newline newline \end_inset void hello (in string message); \begin_inset Newline newline \end_inset attribute long messageCounter; \begin_inset Newline newline \end_inset }; \end_layout \begin_layout Standard This file can then be \begin_inset Quotes eld \end_inset compiled \begin_inset Quotes erd \end_inset with the idl2tcl application: \end_layout \begin_layout LyX-Code idl2tcl hello.idl \end_layout \begin_layout Standard This results in the file \begin_inset Quotes eld \end_inset hello.tcl \begin_inset Quotes erd \end_inset . \end_layout \begin_layout Subsection The Client \end_layout \begin_layout Standard The client is implemented as a command-line application with the following two design requirements: \end_layout \begin_layout Itemize The client shall take a message on the command line; this message is passed to the server's \begin_inset Quotes eld \end_inset hello \begin_inset Quotes erd \end_inset operation. \end_layout \begin_layout Itemize The client shall expect the server's stringified object reference in the file \begin_inset Quotes eld \end_inset server.ior \begin_inset Quotes erd \end_inset in the current directory. \end_layout \begin_layout Standard First, the client loads the Combat ORB. \end_layout \begin_layout LyX-Code package require combat \end_layout \begin_layout Standard Then, the ORB is initialized. The application's command line is passed to the ORB, so that the user may specify ORB options on the command line. Non-ORB options are returned from the corba::init command and again captured in the argv variable. \end_layout \begin_layout LyX-Code set argv [eval corba::init $argv] \end_layout \begin_layout Standard The client expects a message on the command line, and complains if the command line is empty. \end_layout \begin_layout LyX-Code if {[llength $argv] == 0} \begin_inset Newline newline \end_inset puts stderr "usage: $argv0 " \begin_inset Newline newline \end_inset exit 1 \begin_inset Newline newline \end_inset } \begin_inset Newline newline \end_inset set message $argv \end_layout \begin_layout Standard Now the client loads type information for the \begin_inset Quotes eld \end_inset HelloWorld \begin_inset Quotes erd \end_inset interface into Combat's type repository. This is done by simply reading the file \begin_inset Quotes eld \end_inset hello.tcl \begin_inset Quotes erd \end_inset that was generated by the idl2tcl application above, using the \begin_inset Quotes eld \end_inset source \begin_inset Quotes erd \end_inset command. \end_layout \begin_layout LyX-Code source hello.tcl \end_layout \begin_layout Standard The client next reads the stringified object reference from the \begin_inset Quotes eld \end_inset server.ior \begin_inset Quotes erd \end_inset file that the client is expecting in the current directory. One option is to use the \begin_inset Quotes eld \end_inset open \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset read \begin_inset Quotes erd \end_inset commands; another is to use a \begin_inset Quotes eld \end_inset file \begin_inset Quotes erd \end_inset -style stringified object reference. These require an absolute path name, which \begin_inset Quotes eld \end_inset pwd \begin_inset Quotes erd \end_inset provides. \end_layout \begin_layout LyX-Code set obj [corba::string_to_object file://[pwd]/server.ior] \end_layout \begin_layout Standard The \begin_inset Quotes eld \end_inset obj \begin_inset Quotes erd \end_inset variable now holds an object reference that points to the server, and the client is ready to make remote invocations on the server according to the \begin_inset Quotes eld \end_inset HelloWorld \begin_inset Quotes erd \end_inset interface. The \begin_inset Quotes eld \end_inset hello \begin_inset Quotes erd \end_inset method takes a single string parameter; the client is passing the message from the command line. \end_layout \begin_layout LyX-Code $obj hello $message \end_layout \begin_layout Standard The client can also read the server's \begin_inset Quotes eld \end_inset messageCounter \begin_inset Quotes erd \end_inset attribute: \end_layout \begin_layout LyX-Code set messageCounter [$obj messageCounter] \begin_inset Newline newline \end_inset puts "The server's message counter is $messageCounter." \end_layout \begin_layout Standard Done with the server, the client can release the object reference and exit. \end_layout \begin_layout LyX-Code corba::release $obj \end_layout \begin_layout Subsection The Server \end_layout \begin_layout Standard The server is also implemented as a command-line application. For simplicity, there are only a few design requirements: \end_layout \begin_layout Itemize The server writes its stringified object reference to the file \begin_inset Quotes eld \end_inset server.ior \begin_inset Quotes erd \end_inset in the current directory. \end_layout \begin_layout Itemize The server runs perpetually (until it is manually terminated, e.g., by typing Ctrl-C). The server just runs in the foreground, i.e., it is not implemented as a \begin_inset Quotes eld \end_inset daemon. \begin_inset Quotes erd \end_inset \end_layout \begin_layout Standard First, the server program loads the Combat ORB. \end_layout \begin_layout LyX-Code package require combat \end_layout \begin_layout Standard Then comes the definition of the \begin_inset Quotes eld \end_inset HelloWorld_impl \begin_inset Quotes erd \end_inset class, which implements the \begin_inset Quotes eld \end_inset HelloWorld \begin_inset Quotes erd \end_inset interface: it implements the \begin_inset Quotes eld \end_inset hello \begin_inset Quotes erd \end_inset method and has the \begin_inset Quotes eld \end_inset messageCounter \begin_inset Quotes erd \end_inset attribute. As explained in section \begin_inset CommandInset ref LatexCommand ref reference "sub:Implementing-Servants" \end_inset , the class inherits from the base class \begin_inset Quotes eld \end_inset PortableServer::\SpecialChar \- ServantBase \begin_inset Quotes erd \end_inset and also implements the \begin_inset Quotes eld \end_inset _Interface \begin_inset Quotes erd \end_inset method which informs Combat of the IDL type that is being implemented. \end_layout \begin_layout LyX-Code itcl::class HelloWorld_impl { \begin_inset Newline newline \end_inset inherit PortableServer::ServantBase \begin_inset Newline newline \end_inset public method _Interface {} { \begin_inset Newline newline \end_inset return "::HelloWorld" \begin_inset Newline newline \end_inset } \end_layout \begin_layout LyX-Code public variable messageCounter 0 \end_layout \begin_layout LyX-Code public method hello {message} { \begin_inset Newline newline \end_inset puts "The client says: $message" \begin_inset Newline newline \end_inset incr messageCounter \begin_inset Newline newline \end_inset } \begin_inset Newline newline \end_inset } \end_layout \begin_layout Standard Like in the client, the server initializes the ORB, passing any command-line parameters to the ORB, and loads type information for the \begin_inset Quotes eld \end_inset HelloWorld \begin_inset Quotes erd \end_inset interface into Combat's type repository. \end_layout \begin_layout LyX-Code eval corba::init $argv \begin_inset Newline newline \end_inset source hello.tcl \end_layout \begin_layout Standard Servants must be activated with an instance of a Portable Object Adapter (POA). The Root POA local object is acquired using corba::\SpecialChar \- resolve_initial_references. The program also queries the POA Manager instance, which is later needed to switch the POA to the \begin_inset Quotes eld \end_inset active \begin_inset Quotes erd \end_inset state. \end_layout \begin_layout LyX-Code set poa [corba::resolve_initial_references RootPOA] \begin_inset Newline newline \end_inset set mgr [$poa the_POAManager] \end_layout \begin_layout Standard Now the server can create an instance of the HelloWorld_impl class, like any other [incr Tcl] object. For simplicity, the instance is activated with the Root POA itself rather than creating a new POA instance -- for the limited purposes of this example, the Root POA's policies are acceptable. \end_layout \begin_layout LyX-Code set srv [HelloWorld_impl #auto] \begin_inset Newline newline \end_inset set oid [$poa activate_object $srv] \end_layout \begin_layout Standard Next the server wants to write the servant's stringified object reference to the console. This is done by first calling the POA's \begin_inset Quotes eld \end_inset id_to_reference \begin_inset Quotes erd \end_inset method, which returns an object reference, and then the ORB's \family typewriter corba::\SpecialChar \- object_\SpecialChar \- to_\SpecialChar \- string \family default method to turn the object reference into a stringified object reference. \end_layout \begin_layout LyX-Code set ref [$poa id_to_reference $oid] \begin_inset Newline newline \end_inset set ior [corba::object_to_string $ref] \begin_inset Newline newline \end_inset puts "$ior" \end_layout \begin_layout Standard The same string can then be written to the \begin_inset Quotes eld \end_inset server.ior \begin_inset Quotes erd \end_inset file in the current directory. \end_layout \begin_layout LyX-Code set iorfile [open "server.ior" w] \begin_inset Newline newline \end_inset puts -nonewline $iorfile $ior \begin_inset Newline newline \end_inset close $iorfile \end_layout \begin_layout Standard Finally, the server activates the POA -- this is done via its manager -- and enters the event loop. \end_layout \begin_layout LyX-Code $mgr activate \begin_inset Newline newline \end_inset vwait forever \end_layout \begin_layout Standard Because the variable \begin_inset Quotes eld \end_inset forever \begin_inset Quotes erd \end_inset is never written to, the \begin_inset Quotes eld \end_inset vwait \begin_inset Quotes erd \end_inset command never returns but keeps running Tcl's the event loop, in which the ORB listens for incoming requests. \end_layout \begin_layout Subsection Running The Example \end_layout \begin_layout Standard Running the example is trivially done by opening two consoles, and changing to the \begin_inset Quotes eld \end_inset demo/hello \begin_inset Quotes erd \end_inset directory. In the first console, run the server: \end_layout \begin_layout LyX-Code ./server.tcl \end_layout \begin_layout Standard The server should print its stringified object reference (a long hexadecimal string) to the console, and the file \begin_inset Quotes eld \end_inset server.ior \begin_inset Quotes erd \end_inset should appear. Then, run the client, passing it a message on the command line: \end_layout \begin_layout LyX-Code ./client.tcl "It worked." \end_layout \begin_layout Standard This message should then appear in the server's console. \end_layout \begin_layout Section \begin_inset CommandInset label LatexCommand label name "sec:Issues-And-Workarounds" \end_inset Issues And Workarounds \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Object-References-Without-Type-Information" \end_inset Object References Without Type Information \end_layout \begin_layout Standard As explained elsewhere, Combat normally uses type information from its Interface Repository to properly format CORBA messages. This relies on the ability to extract the \emph on Repository Id \emph default from object references -- this Repository Id is then used as an index into the Interface Repository, i.e., the data that was loaded from idl2tcl-generated files. \end_layout \begin_layout Standard In some cases, however, the object reference may not contain the desired Repository Id: \end_layout \begin_layout Itemize \begin_inset Quotes eld \end_inset corbaloc: \begin_inset Quotes erd \end_inset stringified object references contain addressing but no type information. \end_layout \begin_layout Itemize Even in \begin_inset Quotes eld \end_inset IOR: \begin_inset Quotes erd \end_inset stringified object references, the Repository Id field is optional and may be absent. (Admittedly, I have not seen this occur \begin_inset Quotes eld \end_inset in the wild. \begin_inset Quotes erd \end_inset ) \end_layout \begin_layout Itemize Sometimes a stringified object reference contains the Repository Id for a base interface rather than the desired most-derived interface. \end_layout \begin_layout Standard The symptom that results from using an object reference without type information is that all remote method invocations will fail with the \begin_inset Quotes eld \end_inset IDL:\SpecialChar \- omg.org/\SpecialChar \- CORBA/\SpecialChar \- INTF_REPOS\SpecialChar \- :1.0 \begin_inset Quotes erd \end_inset exception. \end_layout \begin_layout Standard The easiest workaround is to confirm the object's type with the built-in \begin_inset Quotes eld \end_inset _is_a \begin_inset Quotes erd \end_inset operation. Given a Repository Id or a scoped name as a parameter, it queries the remote server whether the servant supports this type, returning true or false. If the result is true, Combat takes notice and remembers that the object reference supports this type; future remote method invocations will succeed. Consider this example of accessing a CORBA Naming Service: \end_layout \begin_layout LyX-Code % source CosNaming.tcl ;# generated by idl2tcl \begin_inset Newline newline \end_inset % set o [corba::string_to_object corbaloc::localhost:1627/NameService] \begin_inset Newline newline \end_inset _combat_obj_1 \end_layout \begin_layout LyX-Code % $o to_name "a/b" \begin_inset Newline newline \end_inset IDL:omg.org/CORBA/INTF_REPOS:1.0 {minor 0 completion_status COMPLETED_NO} \end_layout \begin_layout LyX-Code % $o _is_a ::CosNaming::NamingContextExt \begin_inset Newline newline \end_inset 1 \end_layout \begin_layout LyX-Code % $o to_name "a/b" \begin_inset Newline newline \end_inset {id a kind {}} {id b kind {}} \end_layout \begin_layout Standard Note how the \family typewriter corba::string_to_object \family default operation returns a valid object reference, but, even though we have loaded type information for the Naming Service into the Interface Repository, using the object reference fails at first because the \begin_inset Quotes eld \end_inset corbaloc: \begin_inset Quotes erd \end_inset string does not contain the Repository Id. Then we use the \begin_inset Quotes eld \end_inset _is_a \begin_inset Quotes erd \end_inset operation to validate that this object is indeed of the expected type. Combat then remembers that this object reference implements this type, and from then on, invocations succeed. \end_layout \begin_layout Standard A few more notes: \end_layout \begin_layout Itemize This is issue mostly occurs at bootstrapping only. Object references that are returned from a method invocation (e.g., in this document's initial example, where the Bank's \begin_inset Quotes eld \end_inset create \begin_inset Quotes erd \end_inset operation returned an object of type \begin_inset Quotes eld \end_inset Account \begin_inset Quotes erd \end_inset ) typically contain proper type information. \end_layout \begin_layout Itemize Before giving up, Combat attempts to query the remote object for its type information using the CORBA Reflection specification. If all servers implemented this specification, there would be no need to feed Combat's Interface Repository. Unfortunately, this specification is not widely supported yet. \end_layout \begin_layout Itemize Combat also asks the remote object for its own CORBA Interface Repository (using the built-in \begin_inset Quotes eld \end_inset _interface \begin_inset Quotes erd \end_inset operation). If servers were configured to use an Interface Repository, there would be no need to feed Combat's own. However, it is relatively uncommon to set up Interface Repositories. If you want to go this route, consult your ORB documentation. \end_layout \begin_layout Itemize Combat can also access CORBA Interface Repositories instead of its own, if one is configured using the \begin_inset Quotes eld \end_inset -ORBInitRef Interface\SpecialChar \- Repository \begin_inset Quotes erd \end_inset option at ORB initialization time. \end_layout \begin_layout Itemize You can use the \begin_inset Quotes eld \end_inset iordump \begin_inset Quotes erd \end_inset tool to check if a stringified object reference contains correct type informati on. \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "sub:Missing-Type-Information" \end_inset Missing Type Information \end_layout \begin_layout Standard Note that the \begin_inset Quotes eld \end_inset IDL:omg.org/CORBA/INTF_REPOS:1.0 \begin_inset Quotes erd \end_inset exception is also raised if type information is not available in Combat's Interface Repository, e.g., because the application neglected to load the type information, regardless of whether the object reference contained a Repository Id or not. In this case, even the \begin_inset Quotes eld \end_inset _is_a \begin_inset Quotes erd \end_inset workaround above will not help. \end_layout \begin_layout Subsection Proprietary Bootstrapping \end_layout \begin_layout Standard Some ORBs implement proprietary bootstrapping functionality, i.e., means for a client to discover servers without the need to transport an object reference. E.g., the TAO ORB implements a multicast protocol that allows clients to discover the Naming Service. However, Combat does not implement these ORB-specific protocols. Therefore, even though your C++ clients may not need an explicit reference to the Naming Service or other services, Combat clients do. \end_layout \begin_layout Subsection Non-Functional DNS \end_layout \begin_layout Standard Combat by default uses the local hostname, as returned from Tcl's \begin_inset Quotes eld \end_inset info hostname \begin_inset Quotes erd \end_inset command, as addressing information in the object references that it generates. Clients must therefore be able to resolve this hostname into an IP address. If that is not the case, you can use the \begin_inset Quotes eld \end_inset -ORBHostName \begin_inset Quotes erd \end_inset option at ORB initialization time to set a host name or IP address that Combat will use instead of \begin_inset Quotes eld \end_inset info hostname: \begin_inset Quotes erd \end_inset \end_layout \begin_layout Itemize In a local network that does not implement DNS, you may want to use your local IP address. \end_layout \begin_layout Itemize When using Combat over the internet, you may want to use a fully qualified host name. \end_layout \begin_layout Subsection Incompatible Codesets \end_layout \begin_layout Standard Connections may rarely fail because of incompatible character sets ( \begin_inset Quotes eld \end_inset codesets \begin_inset Quotes erd \end_inset ). When a client opens a CORBA connection to a server, it sends its codeset information. If the server does not know about the client's codeset, it may decide to abort the connection. \end_layout \begin_layout Standard Combat by default uses the codeset returned by Tcl's \begin_inset Quotes eld \end_inset encoding system \begin_inset Quotes erd \end_inset command. If that codeset turns out to be incompatible, you can use the \begin_inset Quotes eld \end_inset -ORBNativeCodeSet \begin_inset Quotes erd \end_inset option at ORB initialization time to use a different codeset, which is specified as a Tcl encoding name (i.e., it must match one of the strings returned from Tcl's \begin_inset Quotes eld \end_inset encoding names \begin_inset Quotes erd \end_inset command). \end_layout \begin_layout Standard Combat uses a small built-in table to map Tcl's encoding names to values from the \begin_inset Quotes eld \end_inset OSF Character and Code Set Registry. \begin_inset Quotes erd \end_inset This table is at the top of Combat's \begin_inset Quotes eld \end_inset codeset.tcl \begin_inset Quotes erd \end_inset file. If ORB initialization fails with the \begin_inset Quotes eld \end_inset unknown native codeset \begin_inset Quotes erd \end_inset error, it may be necessary to extend this table. \end_layout \begin_layout Subsection Interface Repository Discrepancy \end_layout \begin_layout Standard There is the potential for discrepancy between Combat's Interface Repository if the original IDL file (and the server implementation) has been modified but the idl2tcl-generated file has not been updated. This can result in subtle issues ranging from immediate connection failures to misinterpretation of data. \end_layout \begin_layout Standard Note that this situation is not unique to Combat; it is equivalent to independen tly compiling and linking client and server programs using incompatible IDL. \end_layout \begin_layout Subsection Reentrancy \end_layout \begin_layout Standard Because the ORB enters Tcl's event loop when waiting for replies to any outstanding requests, there is the possibility that other events are processed. E.g., Tk might react to GUI events. That potentially allows for reentrancy, e.g., if a button is pressed while a remote invocation is being made in reaction to a button being pressed. An application that processes events from multiple sources needs to take appropriate precautions so that this situation does not cause any issue, e.g., by ignoring GUI events while remote invocations are being performed. Applications can generally be written to tolerate reentrancy. \end_layout \begin_layout Subsection Leaking Memory \end_layout \begin_layout Standard Just to reiterate: because object references are associated with individual Tcl commands, they consume memory that is not reclaimed when the variable that contains the object reference's name goes out of scope. All object references must eventually be passed to the \family typewriter corba::release \family default command to avoid leaking memory. While it may be acceptable to be sloppy about memory leaks in small scripts, it may eventually exhaust available memory in scripts that run for a long time and that \begin_inset Quotes eld \end_inset go through \begin_inset Quotes erd \end_inset many object references. Either way, it is good practice to be aware of existing object references and to free unused object references. \end_layout \begin_layout Standard This applies to: \end_layout \begin_layout Itemize Object references returned from \family typewriter corba::string_to_object \family default operation. \end_layout \begin_layout Itemize Object references returned from the POA, e.g., from the \begin_inset Quotes eld \end_inset id_to_reference \begin_inset Quotes erd \end_inset operation. \end_layout \begin_layout Itemize Object references returned from method invocations, including object references returned in \begin_inset Quotes eld \end_inset inout \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset out \begin_inset Quotes erd \end_inset parameters. \end_layout \begin_layout Itemize Object references that are returned as members of a complex data structure. \end_layout \begin_layout Section To Do \end_layout \begin_layout Standard Combat is reasonably complete. Some random leftover food for thoughts: \end_layout \begin_layout Itemize Multithreading is not yet supported, at least not explicitly. It is perfectly possible to load the ORB into multiple independent Tcl threads, but that results in multiple independent ORBs. It would be nice if there was just one thread-aware ORB. \end_layout \begin_layout Itemize There is no collocation optimization. I.e., when a client calls a server that is implemented in the same process, the request and reply are transported over TCP/IP. \end_layout \begin_layout Itemize [incr Tcl] is nice and allows the server-side language mapping to be very similar to C++, but it does not support virtual inheritance. \end_layout \begin_layout Itemize It would be nice to avoid idl2tcl's dependence on another ORB. It would be even cooler if Combat could directly read IDL files. However, parsing IDL is frustratingly complex (mostly due to the IDL language's \begin_inset Quotes eld \end_inset #pragma prefix \begin_inset Quotes erd \end_inset kludge), and then you'd still be dependent on an external C preprocessor. \end_layout \begin_layout Standard Note that the author's motivation for future development is partly fueled by user feedback. I would love to hear of projects using Combat, or of plans to use it. \end_layout \begin_layout Section History \end_layout \begin_layout Standard Combat first saw light in 1998 as \begin_inset Quotes eld \end_inset TclMico, \begin_inset Quotes erd \end_inset written in C++, using the Dynamic Invocation Interface. It was tightly coupled with the \noun on Mico \noun default ORB, using some of its proprietary APIs to map between Tcl's and \noun on Mico \noun default 's type system event loop. For a while, Combat lived on the \begin_inset Quotes eld \end_inset bleeding edge, \begin_inset Quotes erd \end_inset with frequent updates as Tcl, \noun on Mico \noun default , the CORBA specification and compilers matured. Even the Unix landscape was much more diverse then, with considerable acrobatic s required to support multiple platforms. \end_layout \begin_layout Standard TclMico was renamed to \begin_inset Quotes eld \end_inset Combat \begin_inset Quotes erd \end_inset with version 0.6 in 2000 when the implementation was ported to other ORBs. The advent of the Portable Object Adapter and Dynamic Any specifications largely abolished the reliance on ORB-specific extensions. As a somewhat undesired side effect, this turned Combat into an excellent test suite for these parts of the CORBA specification -- with a considerable number of bug reports against pretty much every ORB that Combat was tested against. At first, ORBacus was the only ORB beside \noun on Mico \noun default that qualified. \end_layout \begin_layout Standard The name \begin_inset Quotes eld \end_inset Combat \begin_inset Quotes erd \end_inset was chosen out of belief that a catchy, snappy name is better than an accurate but boring one. It may be expanded as \begin_inset Quotes eld \end_inset Corba Object Management By Application of Tcl \begin_inset Quotes erd \end_inset if you like, but who cares? However, \begin_inset Quotes eld \end_inset Combat \begin_inset Quotes erd \end_inset has proven a poor choice because it is \begin_inset Quotes eld \end_inset ungoogleable. \begin_inset Quotes erd \end_inset Searching for \begin_inset Quotes eld \end_inset TclMico \begin_inset Quotes erd \end_inset proved very accurate, whereas searching for \begin_inset Quotes eld \end_inset Combat \begin_inset Quotes erd \end_inset \SpecialChar \ldots{} you can imagine the result. Even with more qualifications to the search you get mostly false positives. \end_layout \begin_layout Standard Building Combat remained a challenge. A diverse landscape of ORBs, operating systems, compilers, and their versions made the entire process somewhat hit and miss. E.g., on some platforms, it was not straightforward to load C++ shared libraries into a C executable like Tcl because of a static \begin_inset Quotes eld \end_inset libstdc++. \begin_inset Quotes erd \end_inset Some platforms still shipped without ISO C++ support, and gcc availability was far from universal. It was frustrating to spend so much effort on porting. \end_layout \begin_layout Standard Having been involved with the development and therefore very familar with the internals of the \noun on Mico \noun default ORB, I eventually began to apply that experience to the implementation of a stand-alone ORB entirely written in pure Tcl, avoiding any ORB or platform compatibility issues. Initially released in January 2001 with limited client-side only functionality, the ORB rapidly matured. \end_layout \begin_layout Standard Combat version 0.7 was released in October 2001 as both \begin_inset Quotes eld \end_inset Combat/C++ \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset Combat/Tcl, \begin_inset Quotes erd \end_inset with near equivalent functionality. \end_layout \begin_layout Standard Combat 0.7 received a few patches over the following year but proved very robust for a wide range of applications. One of the more significant additions came in 2004, when Combat joined \noun on Mico \noun default and Orbix as the first ORBs to implement the CORBA Reflection specification. \end_layout \begin_layout Standard Between 2004 and 2008, a few minor bug fixes trickled into Combat/Tcl, but Combat/C++ saw little use. The pure-Tcl ORB proved just too convenient -- it required no porting effort at all between platforms. While Combat/C++ may be faster, Combat/Tcl's performance proved more than sufficient for my occasional use of Combat for ad-hoc GUIs. Therefore I decided to retire Combat/C++. Version 0.8 of the Tcl ORB took over the name \begin_inset Quotes eld \end_inset Combat \begin_inset Quotes erd \end_inset without the \begin_inset Quotes eld \end_inset /Tcl \begin_inset Quotes erd \end_inset qualifier. \end_layout \begin_layout Standard The original intention was to submit Combat to the Object Management Group as an official Tcl language mapping for CORBA, and to reserve the \begin_inset Quotes eld \end_inset 1.0 \begin_inset Quotes erd \end_inset version number until that time. However, with Tcl's popularity eclipsed by other scripting languages over the years, that never came to pass. \end_layout \end_body \end_document combat-0.8.1/doc/combat.pdf0000700000175000010010000114215711615566707013567 0ustar fpNone%PDF-1.4 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (1 Introduction) endobj 9 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 12 0 obj (1.1 About This Document) endobj 13 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 16 0 obj (1.2 Quick Start) endobj 17 0 obj << /S /GoTo /D (subsection.1.3) >> endobj 20 0 obj (1.3 Features) endobj 21 0 obj << /S /GoTo /D (subsection.1.4) >> endobj 24 0 obj (1.4 Glossary) endobj 25 0 obj << /S /GoTo /D (subsection.1.5) >> endobj 28 0 obj (1.5 Interface Repository) endobj 29 0 obj << /S /GoTo /D (section.2) >> endobj 32 0 obj (2 ORB Operations) endobj 33 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 36 0 obj (2.1 Initialization \046 Features) endobj 37 0 obj << /S /GoTo /D (subsubsection.2.1.1) >> endobj 40 0 obj (2.1.1 corba::init) endobj 41 0 obj << /S /GoTo /D (subsubsection.2.1.2) >> endobj 44 0 obj (2.1.2 corba::feature) endobj 45 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 48 0 obj (2.2 Initial References) endobj 49 0 obj << /S /GoTo /D (subsubsection.2.2.1) >> endobj 52 0 obj (2.2.1 corba::resolve\137initial\137references) endobj 53 0 obj << /S /GoTo /D (subsubsection.2.2.2) >> endobj 56 0 obj (2.2.2 corba::list\137initial\137services) endobj 57 0 obj << /S /GoTo /D (subsubsection.2.2.3) >> endobj 60 0 obj (2.2.3 corba::register\137initial\137reference) endobj 61 0 obj << /S /GoTo /D (subsection.2.3) >> endobj 64 0 obj (2.3 Object Reference Operations) endobj 65 0 obj << /S /GoTo /D (subsubsection.2.3.1) >> endobj 68 0 obj (2.3.1 corba::string\137to\137object) endobj 69 0 obj << /S /GoTo /D (subsubsection.2.3.2) >> endobj 72 0 obj (2.3.2 corba::object\137to\137string) endobj 73 0 obj << /S /GoTo /D (subsubsection.2.3.3) >> endobj 76 0 obj (2.3.3 corba::release) endobj 77 0 obj << /S /GoTo /D (subsubsection.2.3.4) >> endobj 80 0 obj (2.3.4 corba::duplicate) endobj 81 0 obj << /S /GoTo /D (subsection.2.4) >> endobj 84 0 obj (2.4 Interface Repository Operations) endobj 85 0 obj << /S /GoTo /D (subsubsection.2.4.1) >> endobj 88 0 obj (2.4.1 corba::const) endobj 89 0 obj << /S /GoTo /D (subsubsection.2.4.2) >> endobj 92 0 obj (2.4.2 corba::type) endobj 93 0 obj << /S /GoTo /D (subsubsection.2.4.3) >> endobj 96 0 obj (2.4.3 combat::ir) endobj 97 0 obj << /S /GoTo /D (section.3) >> endobj 100 0 obj (3 Client Side Scripting) endobj 101 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 104 0 obj (3.1 Invocations) endobj 105 0 obj << /S /GoTo /D (subsubsection.3.1.1) >> endobj 108 0 obj (3.1.1 Calling Operations and Attributes) endobj 109 0 obj << /S /GoTo /D (subsubsection.3.1.2) >> endobj 112 0 obj (3.1.2 Brief Example) endobj 113 0 obj << /S /GoTo /D (subsubsection.3.1.3) >> endobj 116 0 obj (3.1.3 Built-In Operations) endobj 117 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 120 0 obj (3.2 Asynchronous Invocations) endobj 121 0 obj << /S /GoTo /D (subsubsection.3.2.1) >> endobj 124 0 obj (3.2.1 Calling Operations and Attributes Asynchronously) endobj 125 0 obj << /S /GoTo /D (subsubsection.3.2.2) >> endobj 128 0 obj (3.2.2 corba::request) endobj 129 0 obj << /S /GoTo /D (subsubsection.3.2.3) >> endobj 132 0 obj (3.2.3 Callback Procedures) endobj 133 0 obj << /S /GoTo /D (subsubsection.3.2.4) >> endobj 136 0 obj (3.2.4 Notes) endobj 137 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 140 0 obj (3.3 Dynamic Invocations) endobj 141 0 obj << /S /GoTo /D (section.4) >> endobj 144 0 obj (4 Server Side Scripting) endobj 145 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 148 0 obj (4.1 Implementing Servants) endobj 149 0 obj << /S /GoTo /D (subsection.4.2) >> endobj 152 0 obj (4.2 Implementation Example) endobj 153 0 obj << /S /GoTo /D (subsection.4.3) >> endobj 156 0 obj (4.3 The POA Local Object) endobj 157 0 obj << /S /GoTo /D (subsection.4.4) >> endobj 160 0 obj (4.4 The POA Current Local Object) endobj 161 0 obj << /S /GoTo /D (subsection.4.5) >> endobj 164 0 obj (4.5 The POA Manager Local Object) endobj 165 0 obj << /S /GoTo /D (subsection.4.6) >> endobj 168 0 obj (4.6 Limitations) endobj 169 0 obj << /S /GoTo /D (section.5) >> endobj 172 0 obj (5 The IDL to Tcl Mapping) endobj 173 0 obj << /S /GoTo /D (subsection.5.1) >> endobj 176 0 obj (5.1 Mapping of Data Types) endobj 177 0 obj << /S /GoTo /D (subsection.5.2) >> endobj 180 0 obj (5.2 Exceptions) endobj 181 0 obj << /S /GoTo /D (subsubsection.5.2.1) >> endobj 184 0 obj (5.2.1 corba::throw) endobj 185 0 obj << /S /GoTo /D (subsubsection.5.2.2) >> endobj 188 0 obj (5.2.2 corba::try) endobj 189 0 obj << /S /GoTo /D (subsubsection.5.2.3) >> endobj 192 0 obj (5.2.3 Exception Example) endobj 193 0 obj << /S /GoTo /D (section.6) >> endobj 196 0 obj (6 The idl2tcl Application) endobj 197 0 obj << /S /GoTo /D (subsection.6.1) >> endobj 200 0 obj (6.1 Introduction) endobj 201 0 obj << /S /GoTo /D (subsection.6.2) >> endobj 204 0 obj (6.2 Usage) endobj 205 0 obj << /S /GoTo /D (subsection.6.3) >> endobj 208 0 obj (6.3 ORB Configuration) endobj 209 0 obj << /S /GoTo /D (subsection.6.4) >> endobj 212 0 obj (6.4 Troubleshooting) endobj 213 0 obj << /S /GoTo /D (section.7) >> endobj 216 0 obj (7 Complete Example) endobj 217 0 obj << /S /GoTo /D (subsection.7.1) >> endobj 220 0 obj (7.1 The IDL File) endobj 221 0 obj << /S /GoTo /D (subsection.7.2) >> endobj 224 0 obj (7.2 The Client) endobj 225 0 obj << /S /GoTo /D (subsection.7.3) >> endobj 228 0 obj (7.3 The Server) endobj 229 0 obj << /S /GoTo /D (subsection.7.4) >> endobj 232 0 obj (7.4 Running The Example) endobj 233 0 obj << /S /GoTo /D (section.8) >> endobj 236 0 obj (8 Issues And Workarounds) endobj 237 0 obj << /S /GoTo /D (subsection.8.1) >> endobj 240 0 obj (8.1 Object References Without Type Information) endobj 241 0 obj << /S /GoTo /D (subsection.8.2) >> endobj 244 0 obj (8.2 Missing Type Information) endobj 245 0 obj << /S /GoTo /D (subsection.8.3) >> endobj 248 0 obj (8.3 Proprietary Bootstrapping) endobj 249 0 obj << /S /GoTo /D (subsection.8.4) >> endobj 252 0 obj (8.4 Non-Functional DNS) endobj 253 0 obj << /S /GoTo /D (subsection.8.5) >> endobj 256 0 obj (8.5 Incompatible Codesets) endobj 257 0 obj << /S /GoTo /D (subsection.8.6) >> endobj 260 0 obj (8.6 Interface Repository Discrepancy) endobj 261 0 obj << /S /GoTo /D (subsection.8.7) >> endobj 264 0 obj (8.7 Reentrancy) endobj 265 0 obj << /S /GoTo /D (subsection.8.8) >> endobj 268 0 obj (8.8 Leaking Memory) endobj 269 0 obj << /S /GoTo /D (section.9) >> endobj 272 0 obj (9 To Do) endobj 273 0 obj << /S /GoTo /D (section.10) >> endobj 276 0 obj (10 History) endobj 277 0 obj << /S /GoTo /D [278 0 R /Fit ] >> endobj 281 0 obj << /Length 1396 /Filter /FlateDecode >> stream xÚVKoã6¾ûWè(+EÔËRoÙ¶ l6»£—íd‰ŽÙÈ¢BJyüû~ál/’…“œ÷|3J ~"UW¢Ê4‹óMÐWÁCÄERÔ©¹Üƒû°Êó’u7b!^}>Šà7½úº ¾®„·-¦£³íÛÕÕ'QA7NEl÷Ašˆ8ÉákQdÁ¶ûþzóíãõ:ÊDÞ¶F“îøø¤¦ï¶ëM¶ýúÇö ØÄy™Q*âÆÉÄßÄ–Æ*=°|W$ ïu W°÷8%½*®*Öû´®ÒÐ4Ã=´ÒMøEõ½—ƹ‰ W•%ä³8ÛNþ/½†Ø#ýÉ#ýïÖí é—aZð›$ñþ³$¨âfÈ}\@VÀpê ^ïìdšvbá´> G¢,ã’âE\Š C¥áµwÍ?y*Kk6¼,H‚sƒÈŠMø¯l'æ}“³´þðÑèûuZqà8O‡Æsš¾×Äy² GzWDZ—G9ÿ©™ièý+ßm¯¼œõHfq•bIPˆÚ%Ò ɦ¡…yšGG‰˜…j`¦wNå¯J*¿£ŽFß™æxä6·o†»¹¹“±óöÚÙ Ìå¢fsyš\Èg«:‰ÊåYÅW@x-.Lêƒö¤.Âþ…³•û¹÷4Ódc•ã  GQœ¡ç?+Ë]N9ˆyY¦æ{óé§©^ žêX[}‘ý®—|ö7 ;ŒØ,SÛ,NxcTÙ*”#o—YM†‡ó̸´ò uøùæ i4¬)x¢¶º§þ§‹êf6ø‡æ¹ÎêÎéH$Œw1uà nxBiޞƊYÞ4“d Α„š…ÐI&øö!"µ‘´Ouˆ¬žMë] $Ò´è f,š«)ú[QyhŽ»;ÕÏk†mq~‡ñôÇu’£(¿?U«_¿Õx¥™ýqÉêÊé\Ùݪkj¯nÿº¨äóhp­ÿWƒT¾Aª$|2jšk:(¿Ž³‘¼ƒKº»4N«úü²sýIcâÕM{˜5„ÂÀ{í­AË›õ=î]ÛyäÚiã*L´ÝòäT§¹L¾kzPîN¼cËBÍ{O›Kwv—ñÀhQÆk#îÁ }<Õ)ÐNñ8´É˜?ht¾9ÿê_z¼ãÔRe>*Kh¥¥ÿ""ÚeUè|ÐG9bà|ðM”žDäô­Zú.9LÓøËÕÕÓÓS¼ŸãN^ÁÌ\½î,‘&qR.íå†ÐO1 (öj w%ò7žh JíŸRÜ‚"ÞÔõ;Ýûoæ"¨@æ@+§9€Á'->ïs§!Hnõûvõÿx;Yendstream endobj 278 0 obj << /Type /Page /Contents 281 0 R /Resources 280 0 R /MediaBox [0 0 595.276 841.89] /Parent 292 0 R /Annots [ 289 0 R ] >> endobj 279 0 obj << /Type /XObject /Subtype /Image /Width 446 /Height 171 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 3201 /Filter /FlateDecode >> stream xÚíɹ¤ FI„@„D„}§@"l^bר ?80(nº?Ÿ¥Ô=Ü©iGwyC ‚#càëÝß| |½©ÝŸ} |}ªÝ ×µÚ z=«Ý ×9»A¯S“9èõŽnÐëšÝ ×1º¯ctƒ^×ìnÏ(ó‹è:§§”âœ=ëíâR»ÛÀœSbê÷Ôî<ýœðŸC¨“lñŽÛª]É\O F‚ƒ‰æ3ßxCà÷к]9xZèÁuë/«•e:å É…§­cO»éži³,×½³ÃxH!¯ç°³°;Ñx©›¸½¤b%2ÛfºVJžg¼dÝ™c9“]1xÆRfç5ÝžMT:ή<š îøYÆ‹Ös{/v„^ÞVy«4¼OôÞ>hY²Z…]ýNÑZƾÞŠæ=vvЫ°«É&Øë Ù𨉋ñL·WôÙºQ$ÛÞdg :aÂÚÌ–‘™:“‚ŸÂî”+oÚ©‚Hd›´9¼©’ÛkQùNiWAxÚ®¦˜„ÜÆíµ0œà9vS¤ŒÄ¥ÈýÓW£ î«À:¢W›&9*Yßp¦•„·Mõžô´/¡¥ýÆ¥ŽŠQpn‰Éˆ×‡˜#]#_SˆŠ¨š¦ßŸ—̵àsU]Ìm.=ϵÇa•þ”R¯(¼ªè˜öÛḨR’óп mZÂwß½çí§¢ÁIq$Hþkö ÛÁsTosò£ê e;º£íÔU \$Ú?í¶¯DÂ$úS+2¬*ôÒ-Ÿ¢ÍtK?¶v–²ØÉY*1Ï)ï‰êIǤÔÁ2 ÔÂÒ³¢Q‰ÊÜ^¼¼Vɶ/c"ÙMZ.e–ó³L-¢xýÃ"æç"SÆl‚ôU5q{ðN$¾3h‘ËÑéÅ>ÒìÙ¢-+Ÿè|-V‡EÌÆÑIê_­¡ƒ‘¬¾–ÛkowÈIq$`Ð]f11µLÿé#q›‰âÐ~þ/²tÉ‘¾‰V^ ˜Yž¡ìÓü}Ž¡%jGÖ· ŽXê¼nfâI×,÷­$±¥žbåKêã{áØç.S|ž9ƒ7lá2OH¾L,ÇKÈÍ}†èZÂsÞ qñÍï‡(ŸÊWj-°gÈÃ*Üï¥0”œƒ)•lÀ‰³Iœïj?лv“ÓÛÚÍŠïyÚÆÓ*‚—Æç+¹Ÿü*\‘(¼‰{,q†/<¾Ö3°nߘ˜‚=#yÁ(% ¯òæ–¥¢âõ†¢½±) )·/ñvWâ(Yc+­ Œzë÷÷þLJާ‰ÿFGLl=¬›ÍCä¼úÛ™­;;^@å)\M$cóÆYý0ÎàYÂ$Ê T¦öIJu’ê:ì|§×f‹)#D'yy2å*‰•|Á¶ÚÉÙû*÷-O*A|¯Ð fWîM,pû:?›áµÜL k?NʹŠÌÏç[ÍÏðŽs‰BnE_q?-ž'Ø%Y>,0ç±Ðݨï£b[ ˜Ç ¨#øã ˆ`üúq3ΗR<ÏnŽmd°sà v}±sá YvÅÎvzCñ:cçÀÂlï/ïðºU¼ï.ð½Î¬¦åô®/^>ð® ïÍ(5Ø[q̆w§·qð··“ÛmæÃ;»ÂrÜ …GNaWhì, ¯½êå* ø»ðHWö²{‚e¿=¹ŽÒeûÁ_¨°œ¤z[Æ]sOW:P=rIÕÛÊ%›Þ_ÂÉø¯ o÷êF&s€èr$.¸˜Ý\u,þW"WcW„ß.Ì—Q½ÕBa PrM?ÝŠ_ãxõØU`Ž}äCNwÓà×*^%‡^[ÆC{}€\QóNx¢(޼rNêÓË!ïÃoïS®Œçñ)rM»yš ¼¼ Ñ`e¡†ë dçio¹¾î5æWM"dËÛ8Š+G-çð«„o¼ l‹I½¿†R —fW´'Ò®ÓJäêìÊvEH‚¥e +¯Ïn:¶ÂÉ*H¨^ðºäWR’‘¤ x=ò+(Ëð~hU@}~ÅðÁ‘’~¯Š6P¿zªGºc׿"BÝoêåèŠ_ |äFðJ¬Ì/ßÝà•X]ýЇ,ÝÃ+˯.þÌŸ^Zo¯ïBã—¿„°>r[xùe¿À_é'Ÿ[lçï‘–©;x ¼üoŸ½ ß^)$•WÐìV¿ïª“$½›l¦Ï¯ˆ &Ç~E+µÉÅÀ+Á¯Œ ÝÃoã>Qz·ÚÆ$Ÿ_íò÷ûOži\?~^~¤¿#o !zwÜ*3mµ‚mï× opÛ­ÅHÖËMøMyø¦éÖûÂelR?=òìß}S¿ãü ®@,JÏ­ÁÜþ8 Ôç7àÕX²}XˆùAx‡Öîþ*yþ"½©øÞXø xû ž…dÒ#?OÏ*,^@ývûß ç2<ßP½2z¸ %IGð Õk¤«õä­$Il„7èmB—{ ¤~Ø$Æá z„dKŒ¤ ~þóh8K÷èß-ÙÄ︘Ǫ̈{åJž÷„çÐR+³„}uÒ™ú# IméúºbÐ;@/ÿVs¸Ï^Êù}¨¾à z;ñ•r/~¶<íEæ£fh4ƒÞ|…w ˆÞnNb;1zûéìb7|es©}ÿ„a7¾ ûå8žÔBÝAï ôbrLc:Yð6à«"¤„cKâªwz9 |žÉôrbÄòøâʇF1èG/Ž<–ѽÃF-|FƒÞåèM©ªXðH^?cCGjл¬OéýðúÃ7ÿáÅ zÝ:Õ|^øþEð z=à‹ÐðzÀ÷.¾üôî”Pxä ƒÞ-” xýáû”7ƒ²ÙXÚ÷ÙŒgÐëSûÀŸ¼~ÏñòBÇø¼Žñ xãìúMÛ‡âuÌoÀë˜ß€×¿!ƒ]WÉò¿®O‚·Àöãçøendstream endobj 289 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [251.646 330.439 371.293 340.648] /Subtype/Link/A<> >> endobj 282 0 obj << /D [278 0 R /XYZ 72 765.769 null] >> endobj 283 0 obj << /D [278 0 R /XYZ 72 740.862 null] >> endobj 280 0 obj << /Font << /F18 284 0 R /F19 285 0 R /F30 286 0 R /F29 287 0 R /F31 288 0 R /F32 290 0 R /F15 291 0 R >> /XObject << /Im1 279 0 R >> /ProcSet [ /PDF /Text /ImageB ] >> endobj 295 0 obj << /Length 1258 /Filter /FlateDecode >> stream xÚíš[s£6Çßó)xêÀ]AyK²»tÒf›ø­ÓÉ`,'´R.™¦Ÿ¾GØcïnÚM7†‡b,9þéè.:糓ï?ÀBÔ#”[³¥`+ ¾ aÍ¿ÚyædWÒq‘mnKç·Ù0*´„'8Qƒ|ËÅȈé1Èqfö%¼ÛU‘;.\u\%0Œµ(e£†©·S3 ^ÏçRø¸/,Á´¬™Öƒ‰‘±}6w\Úy]ÁԄس‡¤4wïrý$®W2sàÞÀl{pñýã¹ CTpC[-ØYÜý¥NbÅí…“Ú·UTB|;_â­\`ó6i`pBb˨ª æË¨¬@Ð+"gƒöMä?¤yYFųãRŽÐkáf îK#²XF±4’r#A¢;/“*W „á$ ;\ù®“…ž [žO{}spAL®µ¯•E¤|m9àlùg:[¼v¶—YR%Qšü­ç4nö;³– `´#`ˆŽ]À6Kgaì‰5SÞ2ÕT¥vœóèô4¸ Ešlÿ³¨ú}#Õ‘KèÒ˜#0…1£#uÈ<€"³CMÑÝ2Ζ%ÞÞðf§ßÈ¥,Tì/³ø•£”7ëÃ]X3î (gž>9àå]bÀߊyÃ;`â8öo8¸qÿ¦IYÊè"Ù©º¹+eñ”h""ñûu‰ôu©¬Š$»¿«ò»\Ñå@W‘e4C87°7¤zŠÕá£pp)EjG´R•°!9}­bû""ò÷P¤ÛõcšÄ‘ªÈŸMuŠ>@w0ó¢_P‘P/îø â‡cðƒŽ‚öE tT ËùTšü²Mûž¤R¦ùÜÄpO€A¤ 1ØGuãuV è<ªNOuˆ\¨ª@8UZ>a­h ôH/¤b«öHLíñ"M¤9è3%ÈÛd!›»¸H+ Œ([ÏÜ->65ÍŽV“NåQ­ß“úÕëµbúÁT¼ñÚ);éÔ&/¢45Ë6”8©£laÜä™ö¦òÎëJ—+8}»,;„ü8­VŸ‰\ ïÿŠV)X»8Š#fôµ¶Â|^'iå^fû2óp„[VƒÃ{‹d]=+Ÿ3}DÿPäY^—fî—J&Äh•¯u ) jì¿<õ°Y” ]”²†Å·ñÕûq§æZÈ?kYjÿ=%ä»ÉФc;ó¨Û6óQõ<5Är¡Ï¢ vÂ)_”y`[Øø9×) ÙÔäò°Ãþ¢-Ž¿{΢URn"t”OF»€é'º0xÓÀ¨3¡[Y<9ºûâP&„TxƒèáLÈ,"ÝdB*Îl[u.Ûú*ý¡Œƒ{ÒÏÔJR:å?½%ì‰ÝœuwÁ®\h'´£u­ÿb¡4?6ȯU—ÙCs¾öñZ!<3ô®÷gšèæ€N!‰pôÙºËÁÒƒ`/ê¢X76«§W­Œ7í×ÝÃ:BøŒöMvæOQÝkµÞGlV÷¾(šŽÿ Š´P7¯’URµCÀÙT`{ ãÀ$¤~èÁåÂÃ7íœðääýìäÓòÄ«endstream endobj 294 0 obj << /Type /Page /Contents 295 0 R /Resources 293 0 R /MediaBox [0 0 595.276 841.89] /Parent 292 0 R /Annots [ 299 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R ] >> endobj 299 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 707.988 151.087 716.856] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj 301 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 696.033 209.257 704.887] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj 302 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 682.141 161.78 692.931] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj 303 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 672.122 147.587 680.976] /Subtype /Link /A << /S /GoTo /D (subsection.1.3) >> >> endobj 304 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 658.23 148.403 669.021] /Subtype /Link /A << /S /GoTo /D (subsection.1.4) >> >> endobj 305 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 646.275 199.352 657.066] /Subtype /Link /A << /S /GoTo /D (subsection.1.5) >> >> endobj 306 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 624.36 172.164 635.164] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 307 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 614.341 217.585 623.195] /Subtype /Link /A << /S /GoTo /D (subsection.2.1) >> >> endobj 308 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 602.386 187.013 611.24] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.1.1) >> >> endobj 309 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 590.431 202.257 599.285] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.1.2) >> >> endobj 310 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 578.476 186.321 587.33] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj 311 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 564.201 284.872 575.375] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.2.1) >> >> endobj 312 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 552.246 259.418 563.419] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.2.2) >> >> endobj 313 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 540.291 283.737 551.464] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.2.3) >> >> endobj 314 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 528.718 236.98 539.509] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj 315 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 516.381 248.24 527.554] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.1) >> >> endobj 316 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 504.426 248.24 515.599] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.2) >> >> endobj 317 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 494.79 200.929 503.644] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.3) >> >> endobj 318 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 480.898 211.913 491.688] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.4) >> >> endobj 319 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 468.943 250.62 479.733] /Subtype /Link /A << /S /GoTo /D (subsection.2.4) >> >> endobj 320 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 458.924 194.815 467.778] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.4.1) >> >> endobj 321 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 445.032 191.163 455.823] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.4.2) >> >> endobj 322 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 435.014 186.736 443.868] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.4.3) >> >> endobj 323 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 411.162 192.56 421.966] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 324 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 401.143 160.425 409.997] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 325 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 387.251 292.563 398.042] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.1.1) >> >> endobj 326 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 375.296 205.273 386.087] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.1.2) >> >> endobj 327 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 363.341 228.431 374.132] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.1.3) >> >> endobj 328 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 351.386 224.474 362.177] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 329 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 339.431 364.636 350.221] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.1) >> >> endobj 330 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 327.476 203.419 338.266] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.2) >> >> endobj 331 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 317.457 231.778 326.311] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 332 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 305.502 167.397 314.356] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.4) >> >> endobj 333 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 291.61 202.617 302.401] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 334 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 269.695 194.199 280.499] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 335 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 257.739 210.53 268.53] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj 336 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 245.784 220.822 256.575] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj 337 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 233.829 212.937 244.62] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 338 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 221.874 250.343 232.665] /Subtype /Link /A << /S /GoTo /D (subsection.4.4) >> >> endobj 339 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 209.919 254.189 220.71] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 340 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 199.9 160.84 208.754] /Subtype /Link /A << /S /GoTo /D (subsection.4.6) >> >> endobj 296 0 obj << /D [294 0 R /XYZ 72 765.769 null] >> endobj 298 0 obj << /D [294 0 R /XYZ 72 721.036 null] >> endobj 293 0 obj << /Font << /F37 297 0 R /F38 300 0 R /F15 291 0 R >> /ProcSet [ /PDF /Text ] >> endobj 343 0 obj << /Length 922 /Filter /FlateDecode >> stream xÚí™[Sœ0†ïý{.@r ïêijGmG·ãEÛ d³J] Ù¶þû&²Ñq¬cGÙ« <ùò¾_¾Ýomb>‘ x4žŽ1G\ˆÑxò $A(PÆ×21ÇàhÿØhe[Æ  ›¹‹'iYæÅ•9‰!B²àÇøÓö!LýC 2 !ŒD’¸WD0alî_<Ž1PS×î§:µGöUˆƒ»2M#ë d4Q&qì¸r6ˆFøŽò(^ƒŠZ¨2Yê\µ½“WþLø.£¸aŒP$b±º‰_HÈTu™îìèëJÙPýížxˆ®z æ½€mBv™cu„”â·4¾ÿœOêyâ–§—§¨ÒÛÒ(6ÒjéÀƒ:ZöÀ³ˆ³Î‘á ]|Ò5#Ì'3¤;ßûP–³ 1îqVª—L€9ØSÆ?¥nÀÙ©læˆ`q„Ì\ÙÛ»^—õ?$ˆDœ£•¼8ÁÝFËæÖULÿ!c̾Ÿ?«  Ü#HÌ{€Ç½7Ë¥q_´õ[4tûü÷µt9^G~.«_–¸¬ì/ï0TákÀ&=ÞÀ¼7œÍ‹ÂWT<ù• @³Mð.xÒ'wFpT×s[‰jöÅÄ\"ªº (©ñåbR71“Åw½?¾!àÞ >_šKÀOiç*ÓnöÎäTV²Èš›ó‹\_«¹î©‘µNRLUuÛæY oÉ S²¦'ÜKøI^׋·‚Ò Ÿ¹á“ÕáÓ8Þ6w™%ë‘ îµùK¥Ê*—:µ•Ës×mE•®u勳|¸Üð‹ÇNrOUÚ”|^4û÷tÖÖ±OÏŸ%¶ðݰšøªHfòm³€/g]²ÖHd-ummvâ š¼—&]­1Éjšf­BžI'˜ªÎµr+Ÿ€ý¼Î*Y¦Ef‹°C(ösc]&%e[sH8"›Lõå“·˜ezãÝüDÞ6ñÈÜ@~ ÖGòVgõ¢­bÛ?m•KW÷U_åB4Ãîêrî có`ƒyÝÈÅCO¯Õ=¤eösˆQ#ØÜØì·Æ[q¾ýÀendstream endobj 342 0 obj << /Type /Page /Contents 343 0 R /Resources 341 0 R /MediaBox [0 0 595.276 841.89] /Parent 292 0 R /Annots [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R ] >> endobj 345 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 727.966 212.716 738.771] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 346 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 716.011 215.067 726.802] /Subtype /Link /A << /S /GoTo /D (subsection.5.1) >> >> endobj 347 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 704.056 158.35 714.847] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 348 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 694.038 197.277 702.892] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.2.1) >> >> endobj 349 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 680.146 185.104 690.936] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.2.2) >> >> endobj 350 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.852 668.191 227.656 678.981] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.2.3) >> >> endobj 351 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 646.275 204.471 657.08] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 352 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 636.257 165.377 645.111] /Subtype /Link /A << /S /GoTo /D (subsection.6.1) >> >> endobj 353 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 622.365 136.631 633.156] /Subtype /Link /A << /S /GoTo /D (subsection.6.2) >> >> endobj 354 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 610.41 196.088 621.2] /Subtype /Link /A << /S /GoTo /D (subsection.6.3) >> >> endobj 355 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 598.454 181.203 609.245] /Subtype /Link /A << /S /GoTo /D (subsection.6.4) >> >> endobj 356 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 576.539 183.278 587.344] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 357 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 566.521 168.531 575.375] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 358 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 554.565 157.603 563.419] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj 359 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 542.61 158.488 551.464] /Subtype /Link /A << /S /GoTo /D (subsection.7.3) >> >> endobj 360 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 528.718 209.894 539.509] /Subtype /Link /A << /S /GoTo /D (subsection.7.4) >> >> endobj 361 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 508.74 212.832 517.608] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 362 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 494.848 310.298 505.639] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 363 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 482.893 224.419 493.683] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj 364 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 470.938 226.66 481.728] /Subtype /Link /A << /S /GoTo /D (subsection.8.3) >> >> endobj 365 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 460.919 202.147 469.773] /Subtype /Link /A << /S /GoTo /D (subsection.8.4) >> >> endobj 366 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 447.027 209.451 457.818] /Subtype /Link /A << /S /GoTo /D (subsection.8.5) >> >> endobj 367 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 435.072 255.462 445.863] /Subtype /Link /A << /S /GoTo /D (subsection.8.6) >> >> endobj 368 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 423.117 160.259 433.908] /Subtype /Link /A << /S /GoTo /D (subsection.8.7) >> >> endobj 369 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.944 411.162 184.329 421.952] /Subtype /Link /A << /S /GoTo /D (subsection.8.8) >> >> endobj 370 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 391.183 119.007 400.051] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 371 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [71.004 367.331 125.544 378.135] /Subtype /Link /A << /S /GoTo /D (section.10) >> >> endobj 344 0 obj << /D [342 0 R /XYZ 72 765.769 null] >> endobj 341 0 obj << /Font << /F38 300 0 R /F15 291 0 R >> /ProcSet [ /PDF /Text ] >> endobj 374 0 obj << /Length 2196 /Filter /FlateDecode >> stream xÚ½XYä¶~ß_1OY50-ë>&O»v6ØÀ€gÃð[bOË£eŠÚÞAÿžº¨>×»@€<‰¬*É:>Véíã«oÞ¥å]œ…iVÜ=nïÊä®L£°ªë»Çö— ^­ã8Š‚÷Ã*gÍj ßvn\g†Õ¿ÿËë»8ë<ÇåÑÝ:IÃ*ŽyuHë“Dif'‘ü}îÐà Š=3„ QÓ„dðb±>=wãØ O¼Äàvâ-^áøˆ¨N"\¯ŸçÑâÿû›wv³hŒ<}šf¨vÏ%u“;ãi×àWDG$Ð#ûto$§Ï¦T¢yZ’“©[Ó÷— 2ÄLÙÑLKðÖa’±¥?DqymO$°9o*Úá|18³N¼;áõ~kÖƒûåUù•ûýŒédfÖ}‘§—åã ©^‹&gá‚*Ù„ @^¿âùPL¿ç5]¨Cy Íïøñ½Á¨™Å…hÿßòýwßûC¥Y¿p•óé‡ôAOW€xO9m·ªÑžç‰TvbBY…™°§×‚Óxâ(\'8Qq8ïè¸0[’ ™§=SÇ <Þ „A>B™Ì7„ßPtPÂñ°ëèAĬ…§kQvvt˜óÑ gä軣SߪáYŠ¥Ø©&ë„‚ý qðºyà´¸’äiøæ]]]ay_7ð9}iæu*B†õj«¨zeÕ†¿žG䌊‡_àvÌìq7°‹¡ôÒGî½g^=¼ô÷'õ ë,oø–ÊÉ ˜$aZçgÀtadWfÉKñ[=𩻿iQ&R÷×ZŠ0ª a# ·V®µdyç~/|w¯ô@4§E)/usËK0J²›^šÂk¥ðEa\Ç4qAǂ˺aIÅr‰ãÉ¿¹vŠB(aÎŒúÑt-‹xKÑäC”GèAÏhOƒ±Þ`NáHíQ?HƾÎGÅ‹õþgÍ|䣜7ç¢ø¸d}ã®ÿ¹¥íÂjœ…h²3ÃJÚ]]œÇƒÚ#âàð{„wöÐ~ÍÑÏcfLŠ”ä~òM Ö1OÚ9FÀrkÃ3…(‰2 ]0hµS]?!2V'ä¥yÀU“Ó#“¹wÍD_†)AXš\(fèUô¸\†J¾—‘Ë(Ù`€¶i/0ÅúÎÝwZ1!¶6.u ¥=1€Su\KQƒþÛšA{Inu€È È»¶O\ÓKKºǾkèL¢=¾¼Q¸ŽÛ[ÒÏöä-”t³;Û'xªko\îdC„Ðëê¼bß^á$ Š£ÚG°ß_;®Ÿ„%­Z¼XŸÇIt‚Ø!œo){¼¬è¨,zà õÍ0…2ìB¯”ƒ¥<¶ÈÊ–zäÓ;_uã~ø†›^Ÿw>”Ú¹¹¬SŽåIzuz•šþÜu˜7REÜ+ˆÃ9–øR¢%K¢Á1kl†1¤p4Z=*ëÝ•FùєȦÐÄA¯æÁ×8WüYZ<œL;Ý÷¢¥7ø‚÷Ò<8 {œC™/Ê‘•2,O„ê¸ØÑωѷ¤H:M·k,ß{QÔá%‰i©*9s¿\L–4 ~› YR„ªŸ;Ý>|ÁwlýQ5ÏÔî¢ï¬þ}î¬L ö67b2³õ ï½îÿ*X}#uO‚ÿZØß7 [Ꞥ¬—û¡5°8àÞÖ¾ˆÃHêœx"{ ¤Ž(–ŽI"8†2þË8†ÂùçDGƒ7…òñ3ê^Ëê‹n…¨*˹*ûƒßUØŒ þÇŸ)ÄÊ(Ì}åÓ»Q¼ß¯ÎüJѹñ»œ» NR¨þ|Yµ×𦑩[jK7°ßù^8£z[äAþ–áÄÈ/Ÿ˜ å ÿˆzgP"Q@ÒÿEA[§Õ¸ó»\§tÂS{0à'etü¤À/ð‘)ASÆ1Z*ÁsXð'Pû†±`:Ì?ãÿ(‚`2Œ¦‘<þ'p¶Ó~øö’_¯4÷«ì‹ bG€BÍ„ó·|®¤Óí$]ù?)ý#¸FfÿC+óÌ-ö8Пœ¡S·ô”ôO$Ůޭ¹'L ⬂\¬ÃJ~¼dÈyõ—ÇWÿXÛ:¡endstream endobj 373 0 obj << /Type /Page /Contents 374 0 R /Resources 372 0 R /MediaBox [0 0 595.276 841.89] /Parent 292 0 R /Annots [ 381 0 R 382 0 R ] >> endobj 381 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [178.717 304.076 185.69 316.029] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 382 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [268.674 160.011 291.14 171.963] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.1) >> >> endobj 375 0 obj << /D [373 0 R /XYZ 72 765.769 null] >> endobj 6 0 obj << /D [373 0 R /XYZ 72 740.862 null] >> endobj 10 0 obj << /D [373 0 R /XYZ 72 721.036 null] >> endobj 14 0 obj << /D [373 0 R /XYZ 72 601.241 null] >> endobj 372 0 obj << /Font << /F37 297 0 R /F39 376 0 R /F15 291 0 R /F14 379 0 R /F40 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 385 0 obj << /Length 2450 /Filter /FlateDecode >> stream xÚ­YëÛ¸ÿž¿bq8àdÜZÑû±ß6{Í!‡¶lŠ$h‰¶ÕÈ’KJqö¿ï¼(ù\ ä‹EÉáp¿Òož_½~›7¥_fñÍóú¦Ìü2Ènò8ð‹²¼y®?xV‹e¥ÞÕ}áÖ‡ª7+uwgÓt›ÏCÿy± ½~õo] ‹OÏÏpæ湟—7q{÷øtçû¾Ì:Ú9Îü,HdÖ'Óy|Å¥Ã'ôË0§YÏ[½XÆiî} ¢¥ƒo¸X&Ià}]¤™§ŒjV­ÌéúE”{ìdÞ¶okËtÕ‰,Ñ‘Äiì§Q&Âà¹ièÁÙ–q^z;z­ùÛUô¹8ý(pǶjàý‹¨ðD¦ 6§Æh…2ôüÕß´©š‰êjµùJë[úçf3ÈÞýöW4%~§7ËT–f$GÓáòA›µª´¿Xæeâ=¨¶%6IðVIRz+Ðç/hVË}Ôqe´4k9c¯ß/–$š¾cF£éd‘b¿‚™GþAõ§‘}WɆëÞðd·w¼Gq«ªYgŽ·tÜ@ΙÒ9Û¦Â[ÐIœxvÜ£¨¹×RX§À ·©5Ÿ¤·Íp+^f4th†mm2;Ü¢Àó°êê™ÅJµ ÎâFó3åØ+.öÁ`c—.Nƒíž-?ϱÇ6àöß^þ®vSû½²öЛúÓ}ü|ÂŽ‹'åNº@”pàçÊŠýˆªÅñŸFc´[+ŠáNc݉NøËœOþO×ÿRMÏ[dgàÍnO!íÕ8p£ê‘8YC³©Eèí°1MßО5wz4ð[ȹßÉÄ~Í_vhÔzPMkÏvµÛ~l…ݦùŠp#ó_o?rGÉŒž=ŽÜRV5µVÓ–—Þ’a!ˆ©ì ·Ðôµü% o­ù<-z"*ÙLs×4úN]©Ágü|»(OëVöêÀVFmHYG;¬û¶=–‰ µ’ÃMJeºôþLÊ ‘T%ç@g»rz±G"ö!E­†©ú[c>Œ=<>½¹ç4-ž.˽áéÈ0|hÚ–×| â„B: `'‚ˆHR«¦]§™Ó»u„6J*‰>/äiíìЛ¤BŸ4L[°ƒ,9Vc÷󢈽ªeÈ©RúV ¬LSÜÝÏÊçlcÖ£,Û›~èãeϺâ„cµ^›ÍDÄE[®›â0INl‚ÎR϶ÍfKfl_˜B‘ÖÍ=Ý’C üªAh¬ c)q £,uQ–^w"äöM¹˜O%…Bƒ' u ÐRs³éÎØ2Þ³€¯TUQš˜er—e’üud¶u³äœzERPo^Ð8< $(#ÊåÏŽ•Fb“´í²fõVãNK ˆø€(”¾eŠÕÚ5*NµÈ)—œ—7Nž5úL”ûEÁÂ…~ |B€Ø· Hõ:F£í%È¢§~\0¼ÎpÀ»nÕyÒœ#ò–µv0‹{Påp'%G¥•S P"–ñcæ—a#rE#)êÝãû׿ÃoúÁ­k…âþΡòr‰9 Æ®©ÃzS-PBÿR¬%o÷ÿ‰õ Lq|¨^ȰÊ€T†ACJ: Ìá ÄÚKü%Å„5¹«S W§I1:ªA GŽ_vx‹Z€ ´éªv¬…g»¹9eìiµ–¹÷äç/ˆ‚ByD{­ÀvË+È‹E–e…®x!µÿ‰Rí¨ÏPt=B\O`‡À²#¦~:ÙÿÌÙÿh‰{ûÒ1›¾ëGñVN-j\ЉßT Ú•ªPÌ/öì C³Ó=4?ÌUŽ ë"HBb*¡«‘ ïW­}Bì àcBBùªÕw :“èìÞè€ÍtGkp®Ã—“jœ-†Õ8iÈDÛ©xö)ÿ.mS˶2Í~˜ÀC’%êe$ä“|õ~Á:S+—ëÏ…¿GÖˆ;ûaJ¦ûïqý=½àç‘~”óMÑEÅ{¤^§7ýиKQ’,‡­–ž^Ød<Ã`cÓ2Ë(p¡à·<‚‚__„ŒE™$'Ç;@µ»ÅúƒÒ¤rlÕm¤yµ¼” 1ªÑJÚ~c/¨ëå"¿q.éÚ^Õxù‹¨H˜Nð‚‡šŽT®œs0rK„ØEá¤iDé¸ùîø̤§£ &sâËÒHÊ2Ú‰ Ç×püJÅz†æs°ÇS} J~‚KcœÎ‰”,ç­(lµ~”ª©8ÛV@\ÏE(kEp^Y]ßž”Ì=ž'E7Œ£Bô MÜ;x»N"=Á›¹ eN˜ÍŒ‚‰S!{òÜd(]äßY}­ø™ïŠXeR%RýÞöÖ*°îwËŸé]ÉŠˆà$;W\¡ikEj'ijžUNtËéæª<'wqºýŒ8ˆpYâ¬õ4Áó¥eáèîêž}~ª3°7áeìð¦â›öø¥–Þ°Õpý;°ò;š}æûExö´s´¢ÖtŸÒ5¯Ã:Ü1¢R:Ëý =-¥¹f* K9? ß/³8÷O_SxÂ*i¾tod@Üè=êµå/ér_*Oƒjhàâ®­¤†}ЧLŒèd©³ŒþÏ(YçžÚkåÒ<¥›nCx߬=ð%YFŸ-BŸ5Qªð %øn•à‰îßÊÒk|íC3 ǘd´ƒpµn·ãø>fÉf¥u»~ÐÇÓ€²zÑåYÅ- š…&“6‹bžuê<üd_¸–ò©1¶j¦‰Ûò¢ˆÉfY%éäpÅ\½³ªßÉvÍ|ìž)Ó#ÁåQÜsH;=}­KbR§ÄÚÕpóý8 ññ:§Õ•¸9pQÜ`_ñ:¶·Ý»@äwzØJògú|Ò ÂKiÚܶˆü<ÏNžD™±GÊÄŠQF;*Êر$ÉNˆùÓäɽÁR Zò$;³Õûı—$ƒð߆YµšáH&ô<~ò‚}ÅŒx½_,?ïãÞ‹“³{?0KE-ð¿Q»T ¡KÏ8ÖÈœ‡_¥óô´å7ï£Sá?î {5×-Wû¶›â ÏwággE;š[K—îUd~Y¸<0Ý(áe(téú$ƒ‹=1ñëŒvY¶ÕʺËÂw¤ ³Òƒè4då•ÿBb? ™ì‹Æ!'€8òÓO›âЫ¿<¿ú/°Íû‰endstream endobj 384 0 obj << /Type /Page /Contents 385 0 R /Resources 383 0 R /MediaBox [0 0 595.276 841.89] /Parent 292 0 R /Annots [ 389 0 R ] >> endobj 389 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [326.455 542.661 333.428 553.452] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 386 0 obj << /D [384 0 R /XYZ 72 765.769 null] >> endobj 18 0 obj << /D [384 0 R /XYZ 72 529.72 null] >> endobj 22 0 obj << /D [384 0 R /XYZ 72 288.18 null] >> endobj 383 0 obj << /Font << /F40 380 0 R /F41 387 0 R /F15 291 0 R /F42 388 0 R /F39 376 0 R /F14 379 0 R /F38 300 0 R >> /ProcSet [ /PDF /Text ] >> endobj 392 0 obj << /Length 2778 /Filter /FlateDecode >> stream xÚ•YKÛ8¾Ï¯èÓFÒ‰Ô3{$٠ЋÌvôm2°%º­‰,yE9Aï¯ßzQËÉ`/–X¤ŠÅz|UE¿yøéçwº¸)Ã2Ó7û›\Ýä: ‹²¼y¨ >CÓ=5Ÿ#Øzw« Ü?în³$øÓV#>Ú½lWÙÝïÿúù]œÎÜâ$ó$¹‰ˆÙëÖõðI\_º~§Šà[‡Ã<0ŽŸw»Û8¸ÿȃÏQíûAfºÊƒÑýiw ovÀ¥f-¾Y^†²¥™— “lÀ-~ 4…_Ñ”[ D¿¹• ÐÆm‡eš’Ðý’eEÁ0—†Ã'r¥Ó'j>}©Â2Oåð¼ÝVEª ³Â/Fv9wÍζ}fæMm;TØÈâ:^cøá,j`øŠ P/HÛHÚtÕ°2Q%!Ú2 þÝËg¨]äbƦïd› ÖOêɲ•vy=,Ì¢À V;¢·$Yœ™Øw¼ÄtL¾C+#¡n¿Û翃Ì* š‘×ñ@g'#<øÀƒh¹-(§«ÌЙ‘·‹ðñúiÇa4xx¢½[öÚ]Š"Ày »Thd$‚¡é±5\®Ã¸ÔÂãì&ã&Ѽô§ÃLå+Uýðh^½b‡ø匃?†‘NáÛ\v‹%Z]¦* ¶y*6We.žŠì¯cÚÙM‹n…QãhŒÆßšñÀoãÁòKkÇ‘ƒM|ŽTÖ{O(ö pyH\Fm{Ú¤¢ÐÀy@A­“yMgŽ–æC>ýnU–zTFÌß#Œ(pÌv Iõee˜äÞNï›/;ö—äGý6ŠeŒÇÁ6ŠÀŸ‡ö+­#¡q¼ÐððaW$A%‹«þx4]Í XÛH&m#É"„ Ç;“©¼´ÂW“Þ“$L³üGh¥8˜à9ØÓ`)˜³ÃÐÏfd%ðð'›b_qÜ“ Fóás><ŽW‡GBÝóú®—}+sv–ç ˆæFá<ÊÊ9”a‰˜[/1þûc?òÑ£Õ¡×RÂ5øì•Ä:x<£AÀc ƾœ9¡u޲ú÷dN p%Ԋ΂‡ƒ|óáy¾~¹¡¯}ÚQæð•ºz½~Þž‡a:•†0Ä9OB|mÌ¥4W޹°-/I”Dk½öI­/üä“qd$ç䛆‰â8Í„(ò<(½M…€¾0>rŸ¢æ/Øô íq vƒh¾º‰ ó¢ðÕl’ä—Æfbs<µö¸ôn¦s`áW#“_ÙHIAž•ÄÁP4„Jôñ\…ËVY‰ÇJšfvoï?¾šAC9úÓ³€e…Ã2œ±Gd^Ü, F3<Ù‘‰ýžiž–ûH òÑŽ–®æIFŽm@ƒ$)¸Ì]ÇËÞö”_ Æ‹†´g˜ßV¿™h"Ë0iP(Á#RYÂ\Rí…×þé™4›y(üGU zÅ×tRyŒvhF¡/‹¦°‘RvÆçç¹ýGÚ¤`•Äa¤<þè‡Ñ<¶]ϯ^}’ÚÉtãã®V°qÙ"ù1;î\H9¶¬.T¨¢ruz4í¦üˆ³0‚úšYšjl¾¢s×WC ŠbY+ù¹ˆ$?Ãˇ%T:SîWeHK0T›åq\µ  ””ŸìÛ¡©&;Tƒ©V€‚„)Ô ˆ «¶±> I3iÆëˆ 0„’bb=!•Ï{Æc—G¥DÂqií£nÊ¿ÅoÆï‡)X;V)Fq'øŽɳí‰Ê‹Þ5c?Gq¾V|Q’ë–«lFÇCN€ÐýË™_xúÚtHB·¡S)ºFPÑqÕ]!ÞÀ ÅÛqE3òL#[U=ÛÖ4y(.éx 92Œ… ÐÔ54bîšI6z»e¥,ÛßÿOyI”.•—D’H‘¾ÒÖ Çċ֓I ïGkíÐ’‘g¾áÇFX-àçöt‘€ðq”ý½ +âB„Ü­~°ùÀ*' Î.„.ÌhhÛ¦nÕXµrÙ(€¥T-V^|Z™F‹zI^TÇLÍÌ2\ñc!ØOh!Â?.õQïsÔã’·|bN‹tDZþƒVïî¢û‡p¼ ¾Ï¾Šb$€× ¿ª}áxˆò»þÕˆçUÐÉŠs?S{x–œß<|SÃÎNÕ(º¸4`x6‚ò~øB­ÖПIK8Q[W ä€zjÜ$B&ÖAñ]Wýd§^náñ™žÉ£<È~ïsÇpôDê´™á"¬?A¶É ˆ‚dÃjŽ'èsJgJ»^f­à©If…Ý#8 Gv–÷Ø(Æóß%Û6̨tXÄ13ã©mÆÆ´Í=úåIð7n?ßíJ‘y†2a{æ{ÏÜ3d–iäÿVh€ó_·¬¾’Œ¤‡~æuqÚשªœš1ù´ádÄüâ¯\޵:y^ìµïµ/î€Ö;·Þé`ýü±ÆRYtbkºÞÔ¾wÔQàŸ—1!múïå"häž|}çaœúÛ ª,‹Â"‰§•sμø‹'Õaz½U°s\løBŒ¦Á/ò]¼`Ÿ‡eî/Nf0G ¹Ëm7H“0òuÝ/Wþ†ÊBþ ®F<ÃU?ýóá§ÿÌÛendstream endobj 391 0 obj << /Type /Page /Contents 392 0 R /Resources 390 0 R /MediaBox [0 0 595.276 841.89] /Parent 292 0 R /Annots [ 394 0 R 395 0 R ] >> endobj 394 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [434.938 295.143 441.911 305.934] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 395 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.911 283.188 143.883 293.979] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 393 0 obj << /D [391 0 R /XYZ 72 765.769 null] >> endobj 26 0 obj << /D [391 0 R /XYZ 72 545.605 null] >> endobj 30 0 obj << /D [391 0 R /XYZ 72 269.175 null] >> endobj 34 0 obj << /D [391 0 R /XYZ 72 240.526 null] >> endobj 38 0 obj << /D [391 0 R /XYZ 72 222.935 null] >> endobj 390 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F42 388 0 R /F40 380 0 R /F39 376 0 R /F14 379 0 R /F37 297 0 R /F41 387 0 R >> /ProcSet [ /PDF /Text ] >> endobj 398 0 obj << /Length 3304 /Filter /FlateDecode >> stream xÚ¥Z[ÛÖ~ϯX*Còðꢉ“´[4±aož’ àJG»¬IQ!©µ·¿¾óÍÌáET¼^t_tΜûÌ7Wî·7_}ýC_å^ž˜«›ýU^¥Æ÷²<¿ºÙý²ú¦ªÖ›(0«7ëM°z÷í:Xmºãzf+»-õM´Åx´:mQÛÞ¶ÌÿÕýÎZ¼¥éÊVØ£YÓÚ4ÈÄ¢µÒØ6‡îTcŠÝ½$’1«þ^ÇZ[å¡ÄàáNHçê>ÍíOíÁî¼õ&É¢Õu/ä²[ÿvó¯+ÿj^Çü¼mS×Ía½1tر-¶}¹µèE«¾QjÑuÒ*t^q±o{&Ê^óHôr+ ¨¡€`0P·9Bq"MóÕÍ}©ó‹ª¼iÿÔ ^°d?Û2¹‚•"[!˜%0@ë )€´É|/%-8%|á)&!V‚ÓvMà¿WLè8\‚ë@Ek÷¶µ‡­íD-0Á¡’¯‡ISØÍ!'àÎã›$š(šáüç»Ä¿ÚÄØ,eÜ$f%áaágQCc?Y]ï— ß‹’ìK`›ž9€»sM/gmIHVÏ·ŸðȲ¯×™aˆÇùªÔ‰¥Ó6´kÚãr£e/b MB¨‹gìpªlëcá<:]Wñ9Žv½ðþ㽋Ã0 D’ªÚ°…­,0ÀÙîO…ñº©ÉÛB'[`u컳CöÃ/#Çйb€Ó‰ÆÀˆ½W"“MÔu¸‘B¹Æ†¶º&y½³Nºf"²ÌK'²m¼Ü3LIóò÷åˆ\‡ÉÀœì& ѸSÞ[¼? Cy?bðUS@4E 'xô#/"Kt~å™uI<“º;9µDvæeI>vk»¦z°¿—\‰oôû¨¶Ë“‚4ôâ$ ‘‰¼èS«18…ékB/H£Ïs/¤9Q¬s<±W7÷XC’J’ô‰Í’‰b|žúÕ{«dv}KdüY5@ Í‹“ÕìVq=ðÇ»ÈÀx/ùݧªÿS`Ò/MâÿW;Ú™ÄXP4sb Ò+Þ.b ¬õ3ÚçVÈ%çyv, •ÃÓ`!öúž fFbߨª›VY_ˆX³¸ÄQç‘Ïúë7o,>½/ÿk/s30_ÂM‡Å—u ~F&P×IºøT fj!À¤ûâ¶Ò Nç»]¾ãÿM=\R·²]WÜYvå&]}û(zk’ÌÌôf'P—܆¼•ÛBzrƒïÄh¥^kï(J©l§ÓØ1ú°Õi¥‹‹Cþ&Ѩ‚w"Ü0lÆàBȼdgâÙ‡]ŠºÚ -1¯ï‹-~¸‘rà‘ÆØ,J#^Ÿ„þ­º+;섃ãü{ŒŸî¬ô”Ä¡˜8dp¨¤'r–²Ô~ÚZ;݉ÆÖ¤ÊEY©‰\[B"»eâÙGzžðEË'MåaÈ—6ŒPSPaüm1L+¨ gÛžÔVÃ!"Ê/ØIrTùS¦ 2÷-Nî|ñ³tüVò5öÄ[ 1Äyͽ•œGˆ»¶9j´ctD«ï‹!ÌÆ í$»|óÈË"3cËǹU˜Ÿ«Ž+F…z: í’{È oóÔ«Iƒt΄©²+‰SDm@Ù·ÅÝ®àUaÎî„ETX iƒS×0h@eŒ±²*Çx T°"?ð ÷’<œ1ãÇ" c3ÍŠF-ˆ„"Q–Î=œÙÃe”BùæIççéÒÃÑ9£pÀ՘hµgˆÔd¸ýF‰GCX=;Rg²EHÆûÌB°âíÜaî©jAA|ñáìX­^Ô/ÆÇ·:z§46÷2U²ÊÍț˥®%™JÔ{|(«FŽîm§ÉcÍh¿£ƒ 1,½ÕÔyŸ»ò®VIž©¾}¨ô¥Ø•JÞ)<ÓëAI®Éß”µ%L]ðQ1ù?|†Ç‡eb•H•‘ݼ¨õÞS(l£4²w9¦†÷å®ÒqõÌ‘Ã)ÍÔx¼¤rg÷RŃ!Êgb™PS’jE&q'm¹[Áö ¥{ìz[KƩݲ›taŸ[æ ÷ÅÈ@b“(ŽNi‹CGÔ=]!ÝÒmm¯]v÷î>b…VjÈæ†]Л’®ØOxRÊ€%GóljöAîHÙÛ(åN&‹CæUœVºhfä^ÚtŠ[1,% ÐEÕýñ¹r¦wb½;`͈ϺS!£ÂW>øÂ›Š<æ òS5®ÒЗµ=+ ´j\m7_¤w‚ —¢s?óLö”ñJ=2“Ì qਥ–.jfbE´„Š]7¹ÏÓðI&kuŒ²eò~:c‰I|ü%ÆU¸î „ò¼/Vú÷´¼.(®Þ {~ÏqAïSãQþ ½­õ¢¶©à€ò‰;àƒN ±€¦Z³{Èõc2^ê.zEÕè4§ $_šÜÀEÔ˜ÆmèkuJùphî”AùRRÈÐ:ê©Î¹€ãgñy1A¤{]ÈNk½£º0 áNz·ž3™Ú݉´oúQéÏ!#ö(6«×$òo´<Ó fS(+™4@K:ZÚa^ƆÃ[ieq8W‚z!‹ƒØÈé±KNÊ\`kg¹žDîü¤'vM­óé–—ÊÃ;\ÅÅ1aÐI㾦U ³FNÉâ>X%U5P‡@:læd‚ …£ÕFÑÚV7p¥,àÅl°šR7”JXÇB_ÑE;•Â^Kª-”/ xÎÞÆ2ÉågJ°B<׊¥ UN*ÝRÔ5öÃÚg™Òr/¶}‹°sY@J½(p6ï¸&_2L;î‡åkI·)Zí$X+äçæ5’Cze'î™_,–¾—üúEÕ¹IíFG™/,ð²¡pB· þä–gR§«B ”²`ôFˆ_%çÜSgó\Ñ "gU—ƈæˆk¸°(®¿ä75ú­úòXéD¸µN™DAmwJgÕªq‚K„3¸qBC{åCp”dz[ ͱž" BðÍÇÏI`K¬NuŽÀ6jä±€+ÇqЕ¤ŠSß `²•dWêêÃWe}'þ»éß¾_¾™×u‘’uÛq(Ë uùYÝl|FmæŸM×ÿ4T*gØ'P¾–iB/ OâÔMN¹ë%O: J!ŸÓd¨¿GÁ-áZÿ°âį™Cú•ô@˜T±x Ç@Ž®Ç4î8ݶÒð¨¨ÉÈ]“yö‡[#\ ?qº"µè{þh'+"O6c[Ž•ü9„Æ&Þ$¦1™k žõηr3²á‹¡Ð÷mS ýTÜ„ˆs°à7æøªó˜XŒ›„ eÛj6xå§0Òü‰ÒOVßý¹¼—N©ã¬h¸Lì 0ÐŒ0foŒñºÐ Q‚ØÂ«E«c, úeÎù0†Â”*%_Œ=ŒëÄ3™ù i¹OP×oUKv;ÒäîØ=Àõn‰ÿ”’õ0xFì'•Š$T±¢%€G«ç;±l‡``P|tÞòú—3’Õ¿×oÞ)œÅïŽv"ó}¢„ÉYê”iˆ>ÃJ>âÓÀ™%G” GîAq{×°©‘ì%O–Ä‹G¤LÑÀh½~·­3û4C]~â"jt¢4¾ñ‰‘.Øe/cì[¨Ïö v%þÉ1°5šaKåPÏä€äRâ(S4¹tfÜý2§¤DÒûi~v†Œ×Íù1%qHËTºe«ö´ù÷ "ˆû”¥êS²ñsÇÂÕŸŒr>ï£LLP¢a¼aÍ…¢É-ƃáR¤(¥au˜yIgÆeâÛSuLå­¸p,”@"W=íçw×BáìÀiõ«W— ©Ña²Y¦ ™uÔ {„”¥OFB´Kºï†_/w!s‘=ƒÇ/åß?>Þs¨Ó^’[B¹sòÙ—ÑŽã·l R&\œ9> endobj 399 0 obj << /D [397 0 R /XYZ 72 765.769 null] >> endobj 396 0 obj << /Font << /F15 291 0 R /F40 380 0 R /F38 300 0 R /F43 400 0 R /F42 388 0 R >> /ProcSet [ /PDF /Text ] >> endobj 404 0 obj << /Length 2679 /Filter /FlateDecode >> stream xÚ­ÉnÜFöž¯r¢w…ÅâêG‰`"Ãfq °É’ĘMölÛúûy[qiR²siÖòêmõÖê_oøé­I/2•Åæâöþ" .ã«4Ë.nË?½ÝÍû_ÿȇêó¥ <{Õ^îà[Úv¸üëöŸ?½ ÍtTû©Ò¹ðéäç¼>YÒÑd´ £P`M³Ð-"$žÌ ³¦Úë,ƒ·üÝÃfê@O½-y”7nP.è†jÚ’þ¸ú°»âñG?òìmÇ”;dûb§u¨âDã@eQD {D3Ô†ÙK=b-Ôwßv²…`y÷ãÏ0 0o‚dEˆ+Pî^ëQ¼#‰j‹ê£oÂ(áb{©½†áGÔ‡¶\¥òªî­.wqj¼ë{†iÕ0ØòÌÌŒæLÒ_H·”&ÈŒWõü:¶;T *ç§¾jxø§mܹq­ê{øK‰‘Óý~¤Lö # "•ê@`мa¤ãeãÄ-Þ|x˃Î>TýÐ=ñìóe{„œ¦¨8üÞ^‚†Šš'K¾éÊ0OàðìÊV™;Ê.UæÇ KA4zËovzX;G©0ND¤Ú~¶õ†Ø‰J“X`~oò}mAýa‚úé©§íi8ž£é~y¬ØÚx©’S½mО}†V‡ÒvXLšÅÞ¿Q)y]•¼ª‹Hu‚­nu¥u¼,øOêdÎ;»Fƒ&©ü8…ÇùPµÇ dZE™#ˆBÿãúæx¯Ž½ƒíûü£€÷ù*Ž×‚Ÿx2å˜@^¹?Õ |¸³ Ú€1s'5&ÄeÀ:!m`Ê÷U] ŽŒÁèÚ“›iO úuLyÓŒÀñAªŽÏ¶GÒ-O†Ç|àQ?äÝÀÀ_ªáÑmoøžŽE.cèÚð‚ ±sƒcg11}eœEzaB¹(ÂJÛm…J%Ê$ Äuˆýˆ ŒM ¹Ž|p¦nŸ¿~}oóáÔm¤LR©2iÊEÃ+6ÿúZ„ò!‡Ñ"Æ9©-°ï¢ ¢˜Þ/`ü,lgÿ{ª:¼$Z½_vö+NóbøE8ÐKµã’×B¦9£ààQì 6ÐD*œ¡¶]‘f…Ä€VŒY"Y8udÊ`xéãöqƒŒˆ¾‹ˆ£vVÆà"Rb)ÚÊ­òHgAÔ† †<>5ädÞE¿Ä•Q·¸8´Ÿ¨ââS1à=²³@ÀáR#_dû'øGª‰º:k{$G¡Fqµóö“dÇç¯ÚbØçÃ+v²0ƒŸ.î}àè6Ì “ÿökŸ cåÅKÁÑ7ŒV'*4.¢m„fÀ4åÆþ©)6ó§Nõ÷¡ f\àÜÓ¤ø´Q~CøÊ¾ãðt|^43Ë7°¼˜t ÀÆfàˆDÏðƒuží6[‹(6/csRVÕfvI§|3Oe*Ö‹ë?°®‡×¯«n3ëÐ èb|®RÈs>iW3pÚj¨ DÑs~iµ Úv€MV‡=®‰—õ}Åi=À’j¨=’$vx¤€¼jäXm›ú‰×r^×È©!ß5¯pn:ðz* kKŽ»»$"Õ,)MR—Í`4á… ¹(~Éí) KŠ-ë(ɘëo#hZÙ¥”Ï­BUSH‡úd_K¬'Y×(Mšq²KRNvK¼WÜäü‘NÔEò³Ö‹$9q¤’rËW¶¸8Ç©«3¡‘®6§ûÆê‹oF£ÆÓ=ÇS¤Hö ŠÌ¥ …½c×’rªÒöî)F“Ra"V!xׂõLXsPaí µø›Ôóm‘IÅ(I*Ú‡…Úæ½ ™y؛᭚Pb[¬}ï?̦`XgR?VéX C‚‡ä¾ák•CB¸ÃþÚ°ÇÒžcíA:ì† ž_<(+PP™~ÇýC¢¥S/åÝ!\§‡›¬ ¬$ÇTˆþ€Ì”¼1'ÎEŠF&þ„Y’ƒâltFN‰×Ø6ÆÒLÆxNÊØ‚23n±EàfÎ £aÌžŽÜ¹€ñæ])‹`°G°6 >ŒV„u4£µ ÄWŒKsÓÁùB*\ØPÞ  T^[%É!)«~©"zZ˜E9Òó÷ø¾2Võ®×N#¸-/I©¤šaÊŠÜšÆ=õ:\s00¿¿à¸ã:°'žUͤ?*yRï_“†Ö>xf¡ç»þƒ¿cÿµ°Gyv’%×ÜLF%õQÉ/s`ÊA‘ASs³Üçd­Ÿf·O½ƒp?µC©Ù²Dé€è!jÉ–ß?bzÂÃ/[ lï:¸ZCë¢÷Ü:äÇcåV‚Š˜Å…:š¸¨rŒîXìOÅ"vvn šKD¤[.LDîÀÈ-#<¯|QMâN®ÇkYÑ{VûYpHúŸš>‚™Ë4…¼äYXÀfº"7á2Øö½£à¬C+Ÿjnð² Ç>uhøx•FÒÛQgê¼nª¡Âª ï½½·m ×[Ì[Äe‹ÐæÍ!¨¡­ùú®b¬wÝÂÿGϘÎû@&jïPWÏ]ô~I¢Æ²*·2?Pq¶$v³ò #H˜øäŠa2’ãÅ‘&?ìRðôßÄ2mÃÏ®7öˆ‹W(¦/0•B!eó.ò£©•›XìówÇ™³F0œa)jŽ ¢ED(HŒù㣼¯¤* Ͳ,ä°‘aØ«O¥¼Ê|ôÿ=£o‡w7`ÞÀš~۸«)¿N]ºN ($8®Ü›wñ–X)†¶{Bà8È/Æ·¥e–-™ùl:Y]éÞ£&‘{~¥ã—0‰B•rž°wÑš¢Ú’gwÙ½a€/7àgHvãÅcÞA@à¹(æØ!‡6úŒ§±­aÓGû[›J¬éµÖARщÅZŠ6z:®™(KE$µí£$Ñ$I¼ÍÔ.ˆæìÿ qKnïë¹_nõ«Ħ%×ÒŒéØW™Y¾zò?(šl*ÇÒÞç§zàµÉ-õä–Ò/àÒ4 JOZþ®ÂU×ä_þ+ Ô×"ÝîÍnδ¼¼]¹&éüÏ’—nog2£’(>Óéx‹i$·˜„(øÛóWz¦ˆ»™Ðsw`Ü<Òw!Xñ†ÁØj“pÒª&óá<àMLDøê^äƒmrt¾õëµ"ëÌþ…ØŠ™Ò‰ëÑ>Ë€KyÓÅ×ÕnW’ P𸌠7µº Æ*ÔÑò‚ѵ í]»§ º6ÜÀWA²|>Hðÿ³ô‚§J#N )îüðûíÿ#3Åýendstream endobj 403 0 obj << /Type /Page /Contents 404 0 R /Resources 402 0 R /MediaBox [0 0 595.276 841.89] /Parent 401 0 R >> endobj 405 0 obj << /D [403 0 R /XYZ 72 765.769 null] >> endobj 42 0 obj << /D [403 0 R /XYZ 72 603.444 null] >> endobj 46 0 obj << /D [403 0 R /XYZ 72 371.312 null] >> endobj 50 0 obj << /D [403 0 R /XYZ 72 353.422 null] >> endobj 402 0 obj << /Font << /F38 300 0 R /F43 400 0 R /F15 291 0 R /F42 388 0 R /F40 380 0 R /F41 387 0 R /F39 376 0 R >> /ProcSet [ /PDF /Text ] >> endobj 408 0 obj << /Length 2226 /Filter /FlateDecode >> stream xÚµY[oÛ8~ï¯0°+1#^tË[§˜:»hióÐcÓ±fdÉ+)móïçR›N2;»‘u.<ß¹Ñ?ܾ¹üIæ‹‚©\Ün™Xd2fyQ,n7Ÿ"Áào¹â<‰£uÓÞë««ªìú»².ûRWwi¿–kÓ-¿Üþ|ùOFBñbÅs&óÌÒùøT/EõúûmUñ¸U(Vĩݟ)â{Ä $ˆ^à· P¹1ýc[wË•*x¤ñGH’š-­Xꛎ&ýN»×k]ÓÒýr¢Z}ì̆–¿•ý. K¬˜å'J´¦kª¯f¦Gk¶¦5uPž –¤Ž[® žFšÞ 0 Øï ~¼XÉ,ejÎYâgŸcß4Vð¦ÿåÏþ-¬qø¨‘ÆË•”2*;zÖMO< 3ÙðH–++š"W¨È’Ï"úLEŽÉœèçXª¶s;ðè©;EE$Lªtœœ®5(R;€n8¼ó¨Ëÿꊔ)^üÝ8°pFDú†øµ¦oKóuédòHQNR CRæ‘áØ¦²XøS"_»Jü­'Š$ºÊ©p”Yˆõ´Ók0©¼¶º/›º :ùÄ/0ãs'ï@«úá®oîP‹T ZüüÛóB+ ¿‘ÕÌ«!*©ÂÛ¾ ø3èÀ8Ü”Ï{Ë´°†B%}´ž;Q*™Ìø ,DÁxœOüU*Ù ôM‰qvˆÙ°<‹È}°úΕƒ7¼X7VÖ¯øÏ´½£^ºÏ,è[=§‹¬m1EÔJe<º i ـً§© f¨$Ÿyî^£pO”D0,j?ILiFד˜Ö'‰JFÛ¦ªÜðÍúðuËí^÷ÝU¬àΖ×7WA›d±¡·;Ìw*."ÿ´¼q°®t×Y¶kZxw}óÃ[’ØSƒnhi4¦ ´8°¨å4­;C>ѬjP[O×ks¶Ym´PÄÒÙÉcúûÊ!‹Ð(Úw¢ 5{]Ö̶¨é¹3ßõƬ˽®hßF÷:P L‹¸4ÉG§­lô‹ÖWÞÑåø‘ÊWÞ?vMןÒœ)o­O)“©Ï'‡egÞ†¨Ä¬ð|¾\žRÉAvðkˆ*HhÝÿË<â'ÉX¬’~$!!yî=³×d7À½ÛD‡ LedîºWï¡oõfÙ¡!z³{} Š­íijé?îñ¿«q[÷Öb‚Ë ÐPÌP18Ö4ߨ…?¬4çü°×íƒqµ`êŒ_càPIô~¨gÒŒq™¶á£mf ’·/?›}ÙûZ–GÄzGÄy1/W;بµ[ݘ­†z$W.!GœÂë¡TÓ˜%CiÿßCUý5¨~ `• öV§´Øš&±ˆ%€üü¤œ 8â^ó/â‹ñÁ?@ÌüÆ“RÉÎmN‚§!÷@WÁ°‡K¥{E¦†Á½/m܇ñGÓº2QÄdŽ)¸±6´pá<¦SRXp^·Aûæu¹$}6dŽgñ<†$çŽGžµ]®f&äç „H剕ã:º-TwšÃ!Áø >æ{ïN#èœÔ•ÿ5e¬m9çÆFœÌ;£PÔœv4†2ÛW50Ó+k¼¶äí68é*‰ePX8ƒ¸à¯>¯l4QNNr›áÄÌGê'\Š”é°}ÒîÎÎ,æ%öžð!Ü8Låɉ½lQà¨úed¦Èw 7ñAΨ„÷/vfÇæ¤GCãå·d3G¦~¹5zC#Jýv ïXPUK"“‚³Aã3­bÆÄÖ<·ÉóÔ§=>é~i×–žÃûÇ0žàضBÍ[þ3•ËVú¤œ¨öªBÍS™«ËËO§RBÓÏå‹h¿H0ž‹ià×¾ñ<ê¹séQ~æÂŠTĶ<„Çqy K³,Ž “óU‚GÛ¶ÙÓ ªjaðPRÝQÓ”`]@êH6Z ¼ñ'ÓíšÇÊÉ5^»MY›ý¡Gh>¹P ˜ÏÌéš j‰[zÄpâ;z]•6Çã¾íQ/]ÑåÙÚ¬0GáY¸<ÉE:€a³Æù¬<ñràó¾kªÇÞ]-€]GW±ÑWÚ\D×Ðä 'â{Úd§gë*|žƒ@ þü>àÈ¥BMKè^Œ{ ½àéML<½39måÑ™îÃ<‡E¤Åx͉Ñã­ó|M‚tT°B〄4Ôp½Xëθ°Ð8Qƒ¶ƒº¼Î½)C¡(‘“:ä "9èâ(]R, ÏŸŽ094 ¤ÿÅPýÖ§bäŠñB¼ 5C¹8kƒ;(¦]ÑMœ-X]½Ú–Ãõ^ìÚ Éy#l_»2÷~ ë((0$4Ž¡¨Ç%g"Q.ìÑÕþn Yß ð)Ô¡rìsìuÞ_¢=]”ÙÐÚ¯7ÿÆõиà¬YW ´Žz÷9NâÖüç±lm̼ÃÂöu‹þ@˽ÆùK,è*•ãç+„<ŽÞ÷ŽMÀ¡`]ÆÓ¯iÉù9ÖpÅÌ‚îöËÔ9ï°×O¯ôŽ€) …”Ø{ØËól¸W;úµfr›†<Ï]¼üO~­!eîzëö3VçïÕ Ù¼òRíÝéMÕ´›;iFŸ»$DZ7L‹þ¬œ%CHGÒ[çjGéôy9.üÏ ¥¿‚„?½h¡ÎÇ~‘…s8q( swóYà‹7?Þ¾ù_~*Qendstream endobj 407 0 obj << /Type /Page /Contents 408 0 R /Resources 406 0 R /MediaBox [0 0 595.276 841.89] /Parent 401 0 R >> endobj 409 0 obj << /D [407 0 R /XYZ 72 765.769 null] >> endobj 54 0 obj << /D [407 0 R /XYZ 72 740.862 null] >> endobj 58 0 obj << /D [407 0 R /XYZ 72 649.667 null] >> endobj 62 0 obj << /D [407 0 R /XYZ 72 544.524 null] >> endobj 66 0 obj << /D [407 0 R /XYZ 72 521.819 null] >> endobj 70 0 obj << /D [407 0 R /XYZ 72 217.169 null] >> endobj 406 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F40 380 0 R /F41 387 0 R /F42 388 0 R /F39 376 0 R /F43 400 0 R >> /ProcSet [ /PDF /Text ] >> endobj 412 0 obj << /Length 1897 /Filter /FlateDecode >> stream xÚåXQœ6~ϯ¸·‚”%Û`î¥JÓFMU©R{Rš>øÀ›Ûf¶À^rÿ¾3ÌÂmî*¥/}Ù5f<žó͘ïn^¼zËÕU™”9¿ºÙ^ÙUÁÓD•åÕMýG”%<áñ†1™FUÛÝêëëÎìîMüçÍO¯Þ29-M¯6L%\våoMœ©hП¯IT¤“h&’2Í­|.H~M»`a*¼€MP¸3Û¥Òk“RÊçkަjkoò²Œîõþ´â冥Áñ¹]ù+éïãM¦x4ÜdÑÁÚîÆºï[EÕN¦&ÉO»áŽ^··ñFÊè/SA´£&ÁMÓ™¦2}o¬}½ßâ9Š/DIóƒêÝ[sgEdèDNz¿wFÝZ‹ŒW±7¸¹ŽYÔã¬÷í¹N=õ»æC¼áýÜõ8ÑöÔTîmÜ|Kÿ·³;·»š¦|Dp !ûŽá ð ÄlŸßïŒSW½¦¦(`¤Üþ¡5h6¾<¢å>XÛÓ½$‘n<2ÚIOhb ¡ƒIàµdpÖ|±ýÛ%4Àzžy0‘cžfðºXsMŠÉ59º£Cö ƒ×ÒÄQƒWèQ.ÉÒ9oÞ§\txÊ\A1ˆÀè?‰Ø3‚=*WÑѾ"HÖÆéÕ3fÜ ?9šAÛMŠ­§³3¤´¸£66\IPªt…fÜÙC±o¬ˆsÝZWÖú%dä á ÄÎ]OSȆ4ˆÆÙSoƒ Ó.¸0ªÚÃqo>“@­MÓýЪáÔµ$á™ÃNÂi­dÄ$Œ;‰Ïò‘`§ÌtgÆ\À 8‹;'ØnIÌá”{ëÞÆ„°ò6˜”I€ßDÛbNÛõé¸ßU@=·z&qç!Åzý|K¢U jмHßNd…¾Ÿ£û‰$Îx¢R6sä{!‹k`l›¤üŒ(dp¶ˆË4ó¸„%þÿÔ;’Eñºm M»£Þ¶›8BU :½¸Ój1)‰úà1 ]|‰ ÁIN!ó+ËüÅÈüKRÜ ý—H±wlڷ瀞:BÌñvC·”Îôàr7mjãxF:0Š×R ‘š~¶¬±üÉåáãåaæ?|Ô«Qh·ËrÂK™”ÿ7õD¤EÂÿoÕDžW‘új‚£ƒ*tÒ–‘ºý¬Ì¬œ '­Û’’ç©K]\3+)¸ÖÂ#|ñà‹#а•ô%ˆ®q4•Ü âñÚ‹­Y´/á㬤„…“»  5õËî±/Q›¨ 9d¬«@âb :¥• tõÚW¤òÊ{A% Àše®$Ù‚”Éè]slq‘ËáD:lµM«BB' §Å¡ÁíwuŠ0ù Îx§‘ïúÕêT0Ø*aóê°ë‡¯TùÝaUÊ ÈñÒeï®^)Be–(%g*¦j?âYäÀ–Ç%{ž”Š]PÌ@oª¼’Cî[¬Ü†4 zî‚n Âuþ{h’åöp„‰ié‹ûOÜijÏ&“Ä´ÿxèhgMÿmGBú¶o÷§Á­m€;Üû-ýk³§¡ÉGG%À¶,›sImëšâ ²S1 T€). L>éyQ¿€œr|3³-ìŒ%ø,ãȧ*=¹K“ “¦HÕ=¼OeºKL9.”B¯pv¿ë‡ÐœÂqÜ™5ßô+d²ÎÑŽ WŒG§aö„þR$Ù<Ʋö’÷kõ˜ØÛ­$Z–¾û«õŠÂ y‰o— d’ùZ¬»ýÓÌÛI®VÌ?hü±ÝíXˆ«´÷{!¢7Úµ7SžÀé·DYÏoצéG"^Qßë­¡“§ŽÊê7ô^¥þ0ÚáÖ5µo›YÚ?‘=PèàÕõ:×§jv\3HÀ *è†xøÉ è"¿Ä'2eææ ™>Æøë"Cy>cHæé( Ò©èæaßž“•ïW—,™ùSmY’…,™z³ØK¦Ž%™cÉtbIK}™TIZª8æ ½v}üœ™lŸÓ$BèÆw—hej!|ϱ‚Ðó®f…u6– Ê+–\¶„Ç»%ÆJà+ŧ+b í˜ÁŸ ÚX’í"W]‹ŽËW½7wÆ~À@ ¦ ½fÑMR8­n‰†‚'¹Çã#ú¡UJ=ÅPCKßGV. eè BS"H%ö·p¬Wôs,‚nX\¸"ö¬˜nCè U;ÛŸö®ˆò .#RÍî–Ú ÙY¯í¡2šÂ*xEÅ!ÃÉ¥“\MØñTÙ´2ãúGJÒóÀaþ>íîcì#öP£a~X¢„Á­ƒg¾s*°YBg0TÙ2ž‚%b<Ó¼€ÎüθžF ~v£‰•Z9s&á˜gaK:Q~ð\—:Ê€oV]²*ØX Õ8Û¸KúKú4ævl 2VÎXfv¿oQÄ:—Ñã¶ÅkM,ÚúH<’CŽˆÂµôåc„Ðvƒx ÐHxAõŠ¥øêÅ7/þ˜¨Ðendstream endobj 411 0 obj << /Type /Page /Contents 412 0 R /Resources 410 0 R /MediaBox [0 0 595.276 841.89] /Parent 401 0 R >> endobj 413 0 obj << /D [411 0 R /XYZ 72 765.769 null] >> endobj 74 0 obj << /D [411 0 R /XYZ 72 740.862 null] >> endobj 78 0 obj << /D [411 0 R /XYZ 72 588.177 null] >> endobj 82 0 obj << /D [411 0 R /XYZ 72 435.437 null] >> endobj 86 0 obj << /D [411 0 R /XYZ 72 414.669 null] >> endobj 90 0 obj << /D [411 0 R /XYZ 72 309.584 null] >> endobj 410 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F40 380 0 R /F41 387 0 R /F42 388 0 R /F39 376 0 R /F43 400 0 R >> /ProcSet [ /PDF /Text ] >> endobj 416 0 obj << /Length 2432 /Filter /FlateDecode >> stream xÚ•YKãÈ ¾Ï¯ð-2Ю–Tzö‚žÉ ÐA²ìxwÙÔR¹­¬,9ztO#È_¥‡åÆLN.U‘,’E~d•?ìßÝ~ÖÉ&Ui¤7ûÃ&ö7±vU’¦›}ñÇWÒÛç…®“7§­öǬ¿»+Ûí?÷½ýì…«»Ùy‰ÒILœ__ë­Ÿ8}öíŽIw"õ•ºÑfç»*Žy'n%ïB?t²¢>o¦]¢ÃNÈ‘µOÝZ‹çj¥½¾?–Ýv³¸Í)« þ°“Cgd¦oð×wª&³4l†iYnìÔ¡iOY_6õD¼ýQè*˜Þ<«øûa-êgs&š¦+û¦}Ý&ÚQb¶?Ù¤“Hù£ÕÛÐs®Yî{*ŠR!;áVC×ó6´‰ì™!ëf¸±J€W¥aH\]ß–õií¼ËÍ:ò'ù ~Ù:´ðë9ÝPõüÝø÷ÜŠÙ¦ëFaYÍ¿ùçwW•Hz)ûãB8.ûnYT~ŸW0ô¶»À‹œì|®ÊœüNNÚxFA DrÒөϧžSãaUjûjg˜¢6tî0ÓËLN„8ê9d`tê\Î(!zÐ+ÃÖs2’YÁ©ÎÍê”=SYÞò„*—}õ:Éç=}p°©yÑâŠÅ‘Ç@BÆKâ':±…¹|`O¦6mÖ“Hç ª½òøª ‡÷eR˜èLûŒT¦©jXŽØ) YmoÉÈ)¾J´! Djd…¡PâƒÅ„Ü…:t~‘”llïÒ~˜˜ÛOŸ"sÙ 3þlÍ <ÊS'ÓZŠ‘>ž1æq¼…a*õ”J ŒX±q™(cÙÖ¶2¨s>À˜'$Ç´1 Ó¸qâXˆ·ñDX'Ù˜ÙXb®,GH´hz·®nWª"¸êJõôU©Ç@ÿ絜Pù¾­Í™5[ ÑÉZ¿-ÄsU&£I™µœ0P€?¦ÌT±Wæ„üyEO´ ¢x鬂Ö9ó$õ" YAˆÍ©jŽ/˜{ÞBJdUYðç2Tab U£ H(ŒV zQ¬Ü0}Eª‘‚3ŸÍu å%?ªd€J†s%Ï‹öDx®ŽyÈ…rM[ÜX卸~¢\O/¢,ˆ%e’ù“Ö9Ü\)½,á3*xš•LF¤½Y{-vUªƒïw5¾;¾#BJ'e/HÄ)Rq gŠ­&&=g-ƒ"ÃÊBÄÁu‘)'+s”E"@½âE‰t*5UM.Òn¢ü Yxf¾µvakjQ`pκÎkߤ x×&ß#t×yΪÁ¬¤•6ðô¸)C;È7ßär)K°}]%Û£îÍÐsɇÆ] KVÊz¶ýÿFø‘Va¬/¬Äåü0ˆÐTF¶!”åµq!r=Çk¨ÐMm_©Œºa€{ 0&Õ8úáƒ#5×QQÏré…N´¶Ì+cy¨"„X‰å>SÎ[¦ÄBÈ ¿»¡KElÚëCw±ã…ƒƒÀ9dx²G]Ü6í•bõRR£ [·&7%Wzž]†þ<ô<…3ͤehé£QËP´ŒVZê”Ê+E‰,/—&`éõ<)½ax .aÈåc ¿Ötö²Ñ-´(ßÎPðîD€}~ô#¸ã%¶*åÔË¥ Ï19>ÌéÜ£ß_ù“ïhÝSÛ5ÁÔ¨‚p<ˆ8{ÉÉ÷x‡ð\Ë5âþ BèP®Jåyêy:‹B¡òÀ5sM>„p ¸Ïl,æ÷R!leßÈ­.ãÖeFR›ÌõÔ¬k,ÐØâßë^ |Kfe'é@,è–WJ>…ñÚ3¦£’Z§#¥Ý%ÿЦSA]+ªx¬7‹æi¹àÝx²†€Óa—u¯uŽŽó|žÄkßc–c°üa5µhË`°ëË“‘dBázÿÆD7²0»rCIíÚL·ÆY:%ƒÕj®†ÉT¯âP%a¼S1 ðNé…zÝýdâmðì•Üv¾ŽÙ3H†š!á±mMì*š«Œe8ÅòñóÔ„ã4ÙIrfw\h͹M¤èÐòû Tô(Æ—ÚŒ6`Þ®ç¢oÀÚƒjÆmÁ8±Kñ%û«òÎÈÃ~håó€Í‚Á©±r/J$”ÍÁ ¶Ý‡dF'ñ›W‘7roÑã2è@w¸>òÙ :eà~F *c˜±/•È1_à‹ßz7‚eA%;á‘m…B¶;A”ದ.Г4 ‡ÙÖ¡=nbêÞ|;8j’Î+cÁ3˜=Üï%‚½8k¼”Ûå ×ãžÒI•øïÁt"þ•U7ɽ ….ò®9=©¦}ºýøåç÷·û‡¿úòËþÎSî•À3ßrs~ãi‹)~â›0=Ûd—x ;ØJY¨%½A`ƒ5¡ãxÁ¡¦«·,rÉé.Å3´é±ÇãåföÀ4k¼xVÿÕÂDÆÊ .7ùì†Î[…ö‹Î¢ju–—ñÂ@ûUـ°L”sœs’ã…7ëå:Å5[Ý ²†ž²³¬\X+Ï2jýö4Æ ÔŽ(Æ(_^ >´¥9ð Ó§oÙé\™ï=-MÍ Ö7æ‘: ÙÑ‘ë Ó^¼ášJÜ6^ø0ßx}_^§Ëz¼æàãû=ÿü‡C‘_ïÄÇ¦í™æÐ4<°-%Ž«5À\ZnxD¡ÂÃ9{•=uB1­Ë34ޱYÇfòý•œ™5@—lYûÞ¶B+õÿûþÊÿW¼ò»“€ @¨ë†»6Mm’ЈP-¹¼>À¦H†o8»8v$MŸïñx—Vî/Ó+ù™.ß ‘æ ûÎ㘧îo˜CTJW1SÓû"æyæŠwóf¨ŠEVò‡4#üž0{à"Ä%ãÊóò·j¦Çèe­]<žM²ç¯f‹¿ çá'ìƒ"úwWExî~ªÉ+zžwŸöïþl1õendstream endobj 415 0 obj << /Type /Page /Contents 416 0 R /Resources 414 0 R /MediaBox [0 0 595.276 841.89] /Parent 401 0 R /Annots [ 418 0 R 419 0 R ] >> endobj 418 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [275.666 341.847 290.385 352.638] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 419 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.911 282.072 143.883 292.862] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 417 0 obj << /D [415 0 R /XYZ 72 765.769 null] >> endobj 94 0 obj << /D [415 0 R /XYZ 72 740.862 null] >> endobj 98 0 obj << /D [415 0 R /XYZ 72 618.338 null] >> endobj 102 0 obj << /D [415 0 R /XYZ 72 589.69 null] >> endobj 106 0 obj << /D [415 0 R /XYZ 72 572.098 null] >> endobj 110 0 obj << /D [415 0 R /XYZ 72 269.326 null] >> endobj 414 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F40 380 0 R /F41 387 0 R /F42 388 0 R /F37 297 0 R /F39 376 0 R >> /ProcSet [ /PDF /Text ] >> endobj 422 0 obj << /Length 2698 /Filter /FlateDecode >> stream xÚÙŽÜÆñ]_±0„dh²y/+9F6lX^ –°è!{vqÈ1­÷ïSWsx­$äeØGuuuÝUóöáÍ÷?…ÞMæfqpóp¼Éb7óâ›$ðÜ4ËnŠßÎô»}¤"çXé§Ž‡¡Ú}|ø×w³÷}7‹¢9`kì÷¿èÖåtÓð`ï¯ÐÕúl>n`¼ ½@|÷V·<úûõA·¿Û8>Dÿ4U%”ü§i«‚~ÿ“]™°W!qaïgnꇄëádvû Šà•yS<®ÊZV/ºëðÕ8ÆâW˼·G?xÊû¼Ã †)œláõ½iåÅ ,~Ë/ˆ€{X\xšï9wÇckú¡­Ëú‰§Ç¶9oðJЧ„þ R©ÓþÐwš ­˜V÷eSÿ @ãpƒ€”0"¬ÝRÎsYU¼w`l<wâº7r´oø œÞÁN¯ËZ6,•ÀÆØ80ÏSy¤=Oo„QFDì|´Þ@×4.{Š„:eE,¬([D”VÀ0â :ž00ȇ¶5@#PÆ #]OË£œd¡²q¾Tæ,!¸[@?•ìÉkeµ=X ì^nx lX¿}åÈDß©›~CAO$Ž1VdÙ£ÑRYƒ]œÉ—ó™ ³‚Ñ<ÂÂh‡¨~DlüWù~VU5UÕÒùT”°ÝE`ümÊb­± Ø^f]¨%R‹¹BYéC5Þo_cDÂÄÍ2Æ©¥{ó7­ ?‘üÑgáã·GI0³`6â¼vÍÍ|V&AD Ä(^p =S É(?Þ½ÁÀ8u=?þVz® |Ö–.|³(Ãø=·“¹„áÔûÎ_;^œ)†ƒ$³ vFÁíähÅ88Œê ´Ò<}FÌMû‰¶j#! xÍà[t’“µú òÒž\Êz+æ´8âD-oÚƒ®¸àÈo9]‹bHKØš*B jW0'ül“0P\#¤c௬–&V‚\ËRç·©7#|à¦5³P75kX:L± #_ŒyyçV4cHCŸÎ¡lj¿¸ÐñWQÇho8–õ+AÏÚÀü?‘ŽSüǺ©ÍŸe×›ºßH&¼Ç†²1÷ ’H<8„éÇ)¹Ñ#™ft¢Ùu¶¼{Ø) Nå§gÑÔÙ[žÁ3É`[H–z '-¤æF£ü81«Žæy¡Í*ˆ .W’ ¡ ®·ôdÀXDe_ÀLð„ °;U]˜²êÂài€è(ò3V®”~Þx‘«Ek‚ ?bJ°5)¦.Œª$±(Sgì•Ñ›¨øI° × U/×ëz«H󨮲ux¿Už…ž'é´¾ —Ö‰¿ïBÏs35wádHô¯Ö\l³´ÙsCÿªS’±¨j!ý{ÚQ‹ŠÚÊ*”dw¹A +¶@5/M’¡1&ã1Ö€ëÈæK˲«ò¬ÈôA»”e š¬šVŠjʪ¢L Fª­‘¡Cñë%\£dƒ–rƒÔ'ŽM¹U†Bš÷äïšØjUœqSšB jLä‰Ç¯=ÔÁš‚øK Ü0VSùÇO)$<§€ ß§ª9 †ã˜˜.Yz.é™8³¤§WÅ“™<ü{eŸ0ý³›Pr—Íü(v½,ñhV+Ëba,çŠAîuYu˜?M>ôÖ7‹€AëÌ•–wÖå’+TŒ3I¥(a7•0ãÓßÄoþñðæDlýýendstream endobj 421 0 obj << /Type /Page /Contents 422 0 R /Resources 420 0 R /MediaBox [0 0 595.276 841.89] /Parent 401 0 R >> endobj 423 0 obj << /D [421 0 R /XYZ 72 765.769 null] >> endobj 114 0 obj << /D [421 0 R /XYZ 72 625.779 null] >> endobj 118 0 obj << /D [421 0 R /XYZ 72 287.777 null] >> endobj 122 0 obj << /D [421 0 R /XYZ 72 267.009 null] >> endobj 420 0 obj << /Font << /F40 380 0 R /F15 291 0 R /F38 300 0 R /F43 400 0 R /F42 388 0 R /F39 376 0 R /F41 387 0 R >> /ProcSet [ /PDF /Text ] >> endobj 426 0 obj << /Length 2659 /Filter /FlateDecode >> stream xÚ½YKoäÆ¾ï¯Œ¦M/M6©‹±ÞØÈI6ð*ðÁë5Óu–C*l޵Bàÿžz53”•õ!—a¿»«ºê«¯z¾½yõúû¬¼¨TUd7w&½0Y¬Êªº¸Ùýe*Uéå&Iò8Úvým}}ÝÛ­.¹ùáõ÷I>M/6I©²ÒÐÌ›{ËCt< Ic¥†‘8â¥õL¡òÔŒƒ‡ºÝ]n²,‹ìgçe ·ºÖ ]Ï•6§^?ÔÃÑscwÇßÚ?µÛË´Œîû®í޲Žk±éWüáw[®ke.ôÒ÷¡ïö½õ^áq/6eªâ܀܉ªò‚úá‰êÏ×çòc!e5¥ùš6yšG{+ÚÐÉlj¥²<¨ŽDظÝùÇGz~‡®i¸ôÍù^I\©2I_ÜL—ÊT‰ SJ}ÃZIòRqöâk7üÎP<{†mÝnm³²}’«X'_¼½ì^B3¸Õü¦Ç[Û88DQT2ý§Ë¬Ó‘eÇYtdCr WÙ¦c²_ðÈèÔ†¡g” +n¸_ÌÔÑÞ‘}ÛVäHgIA_麺çΠ”…ßײ1xçCc»»‚zGõ%œoÇ›öv8ö­?œèØ ¬­´Ð ¥¥½ ³¦UΰÐ=WÚžÜòŠWAçQ}‡’=z®×-íç­}Àñ\uô-àÒ}XU¶©ùsW»æØ[u¹ÑY æÂzïŠC_o‡iØõ‰+ã4îŽ|8©ÆÓa‡kCŠ/d}¨ûúÚëýù½ä‰ÊM°/¼RB¢¼Mæ&Ú^æIÔµœŒ{ç cXC`t+3Úõ„4³-“JÅñˆ»¸zP‘D͹9ÀØ$ÉdìÇ8½µŒ”·|] ß t%j­Ò®ì E—sšÎ=%‡ TÊNïPD‰ŽP7ÝqzÆŠÁ;ŶQ»h3¥‰ÎÂ|t! }òÜæîdz¸[l중µŽ ÇbK»sí^†ŸG\¬Å¥W£ ôÞ×sLdÙbUš,S\ Œ²ŒýLENnìYõé4\;šµÎS8 «Nç.°µk­zþºÞ®˜IšÁ’ù1Vö5`naC|Ðe!îÓPtÒIúÇ6Ô?~kRÝ“EAÿ^N' ‡ù¬o†i(#»¡;0³;ÈOî€Z>Æ™n¿'•çIÊÖOží¨Hɼ Ñƒ42s„Mª9ÙW;çCƨŽç4"< Ä æh’’ÌQ§zˆ,"\…´K!4'¾)fëW¹fe=@™Î&\wF°ÿ®™m‘Ⱦ€¡©ÑãÛE&ooEh`õŸfÑ?z k@AìdôÏ?g0b¿ÁÁÙ¤¼’ÖIéE€‰­ƒmh4[K¨ÊAËóHJФ8Xªñw¤°ÄÈZeH+c‰T@¿ýL>Í—¿¬tS¬NÆwÎ1F¤œ*áD×R;a~óD¨½’‘H®…^"X²€rU•Ù /ztƒ»éÁ¦æ¯3pºMMdËþ0úµÇáç‡D < Õ¡¢§…kþÌïmå]d/U¾|™‹ÝÊÁ-ÿãv¿I‰t–ÄJçå‚ox+²£IQáçç4C…?¹Ý/kú?2ý«9Q¦Šó×2 –ÿJ÷àG2nñB‘CÆÀ³“ èÊG…á²\öód„˜Ëå±!h"-­ÊxùòÒ5/ÄáÖ ye(<önH¨ e¡ã ´\fõhbeÌRñÙœÌz¼wÌ8d‘iB?oÇ7~fVé$O¿Ó6aÞ)'б\²Û#çïEn¢(½î5¤[ï¹¾oBà½Åçœy¢2h *‹µ¨ GOŒ6ÖúNY…ü5%*žD³˜¹BM’Z#¯¯Ù Ђ߰°¸²·+Hµ³[ÈR¬<Ìãì}Ó¸¡®p c2E$lz!âʯtÉÞÝ8/îãS>]x)>ÏŸF,ƒ3A'…`¿Ââ3® …+ .oÕ3ÈÕzA >ƉY‰p3âùü¿ aĆÞ98hUTãëJ»òôL ˜ðF„ÿt¾RÃÓñ.Ëë½Q±]¹Š£g ɵÆ}"lyt^ÔÜɤ%ЇÀþ£©‡¡wlZ¯Îu¹I@¼²\äÄ/+ó=0ë~LŽœüqCLöG€,±‘pzáz‘žü÷“=ûBtu²ƒa–k´mnðà^Ò…Œ¡ˆþArMz.ÍS¬—…óþµ"Œý€&0] |‚¢‚»Ý »l›À³N3~4ˆñ¿$Ùÿz­˜'§¥¦ü6?ÁP.† ë(=A#ûp˜žà鱕ó\£å9Óã j îþ(óϯšž/–ü×BZeòö€SŽ!fðÒöóaU/é#¶u"ÿ[w@h- tÖÞËa.O>BÄšøå¶ÜÆt«Þ¤] ܱ?lq~ê ËÓã*|OÕx%ï­Œ; }ØF¤ áçòôµ@Ä ’ßýù¯×Ýa¯º~ÿúíû¿}óúæÝß¾{ÿÏ›ëDÅ·Ë4üßYRåÊä ÄTÈÞ ÛP’a׫ïn^ýŸÔ jendstream endobj 425 0 obj << /Type /Page /Contents 426 0 R /Resources 424 0 R /MediaBox [0 0 595.276 841.89] /Parent 428 0 R >> endobj 427 0 obj << /D [425 0 R /XYZ 72 765.769 null] >> endobj 126 0 obj << /D [425 0 R /XYZ 72 740.862 null] >> endobj 130 0 obj << /D [425 0 R /XYZ 72 439.704 null] >> endobj 134 0 obj << /D [425 0 R /XYZ 72 261.26 null] >> endobj 424 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F40 380 0 R /F41 387 0 R /F42 388 0 R /F14 379 0 R >> /ProcSet [ /PDF /Text ] >> endobj 431 0 obj << /Length 3017 /Filter /FlateDecode >> stream xÚÙ’Û6òÝ_1o¡*#¼ä—-Û‰«´åd\±6ûà¸R šÁš‡–‡Ç³_¿}—8Þ}F£Ñ@ß­7Ç?½Óû¥ü}ÝÏ7Ip“èŸî÷7ÇÓ'Oûz³U*ˆ¼ŸŸª¬´ùf«“È;Tx_7Zy5@”—g­«vóùø÷ŸÞ©èfïïcôv7[•ú:MˆÜÛ¬(lu¿ÙI ;•waê™F¶<«N8H¼,ÏMÛøY×5ö®ïL+Ë‚2m LÉmåi½Ÿ¯øc·1ÿîmcdg÷uŒß!Γp˶:×MIŒ1Žuü1Ñ(ö2[dw…Á[ÓEñcº¨…=:Ýà †ðb°«3Í9Ëô»áóêÖvuó´ICÏßlc¥¼ÃYvϹBÐŒ+´ü­êÄ^2cïåfî4ÀI8a0 'Ø'þ.Ö‘å“p¸Ãc¾Ö›争O»mº÷U¨ewž ?w#·©×·(ºJM¯ãØvZ+’½Edž LK}@ éCîD8(¼Y§Þ;|¿º‘UþŒW‚‰­e¨éÖY|ؾxjÞ0yj”ˆÓ·Ï—†UÍžàÂSuàþ¹ veF ôpYµö|*”wèHŠq σñaÏxî kïŒwDཀྵLC 8ÿ¾ÉÊŒå%B@‚gÆ_ê Ïuh<,¯K#|8gpÇߦ¯¶+×ìl‰ˆZ{u%—$,úû0œ¡~|bƒÈ¾½½Üš…ƒàfºJYEêæ.{õêdíf7ú›lRã¦8ð“H´±¾LÜÑ”²_¤Î®Q;?ŒRYo ¼a¼ß{íÅä×´¢Ï“Šü ØËrÖܯ0~Æs Sƒý4œ¿ÄñÁ¬²ò£;¬AÃÖ¯è©ÄOöîòhU×tàú»`` ݯ8ud|8î’âðlh™\ocx@¾/Ô©×f¥€2‡såžýkfHt¯7í…®ÅNi#ð7‚:±S8k´S<˜?¨‘òè½óÄè®TŸÝ#[É·À÷\÷ û² NüXÍ}™)LiXµÑ3…i@Ûê0/ ÃÕa4 bì!¹ÀêúÌrsôY Ä:^Cþ&Èèj×7Ùù½Y2Ðt¦ÿßù‰ —¦§][ýÜi£»ÑÝÓw â™þ‚'›<ˆMÌ!î{°Í‰‡s0‹ó­Ã—£.Iò ÊV§”.#»VÈe+×+,Š,H—.¤¨1â½,%-©+Lm+ìI¾Ä]šP @2(©mrlŸðŽUî$ H´† àAê}a*v¸ ¦¢²3sÇÌcI2Ä Çà·(–:æ5ˆ2È|ˆ¥ <ÊGÓP)Cj'ÞGKnGì& aŠÓJ Þ-Ð~ªÓò•J‡ò‡ ‰¶RÅDg`UáIÝw*%óïí)[tbáíïoZ|(DÞÖ%Þ÷޳2P¨þ"q¬éZÆf;€µ†K.‡„àÝ Nü Œ“Q^#±SvaËÀŸ»h÷ᡯa¨È&û-¶•„Úf‘Õ×èX"°°C¹–+^F³àGÒh¬ Ç.ñL µ"h|™«¤˜,ëæ‰g­-!Qmxéšl®D3åa8É•§Èªû>»ß(ö튶³3$!bN<ò·ß‰žCÓ˜Œ‹ÿ¸ª§oi^é{Fþd«¼áám'/>ó,/àt¦ ¯\ß¶£._Z<ñZÝ8œõÜ€v1áï.kÍä0NbVŒzª+tezèW¯>NÄqå Ü (bø€7áx ù‘-'¢u)ÀǬ g“‚Iý]AÕŒvÕkc‘–A\öÀàðó{Ä\âëJK€`ÕZõ5ˆ]݃øÉ–!LL× ¼c¢¼_es2Ù\5¾Æ#Ï%y"õS¤‡%E;–x¹°^Ü3¼éùž@ [r•V² mËÀÖù¥—+× +ú“h·–@Í9[Ø‚ U¹˜QÓs: Fvžz] ¯£CfÓ—µÉÊ<ûz&RüVwF*RVîØ±pj×­)6 NY·ÝÞÁ²ª­]›ý6d^¬øc5ˆœ_\EÄË$C€œ:%”:az…*K^Cò @®¿üY¶o‰ÎáÄ‹õrOÅëÙ][}'ܵ¹ËÇe–ܤ¨ ¬Ùã¬yù™Y8Ï¢gJ‰TKÑ=iDéÍw6§T/ÒY=—#ÅÛÑz`Æ®'#÷Áú£Šh wv ùkEŽúN›üªâÑ›P‹•.ß1Ä–Üâ:a †õ¡ñÿgdňÍ%Aè^Q ûᬡٙJ¿½%9™æ(E΂’@áã<ñ–I«5˜48qÏ$0Ïûºk" GBEc>]ׯaàG®q½¦î‹ê–n—‰ÕkDáêÖ—ömâGiü¿ XöI2¥Ž\ó¥]¤sÜ,c ; ¼ýñG^)A9á1^É}ü$ÆëÀ«üªø£ÝÎû'ø,¢¢R¡¢Æ¦ùÖñ Å^EDœâ_¥†Ô\%cë–»ˆÉøç™ÔúK`nGQ¿ezSªÌ#æ©/Òà±8Q®ê›rÝÎ%äÞr¼u ·¾uº­÷¡Øëŵa…[kš{nzrí}ø½ÿ w)ÿÅ6¥½`Ž$G@#O%„)—7‚!–b*^c‡¢3§—ü,»NÀµÂ­åÒ©ûyù~‹Ä_sþħÇ.u…Áá×ïo)`¡¿p@Æñöxøc£Î@”ÇÃío¼A=xA×_Ðq:fh×Îÿb”Så.‘» îRDÌ %'$eˆ†/˜ÔA×áp¨Q‹¨Hu‹§íìñÄ¢®¤‚6-ÆÅ*j\TÜG~©›­ßÀ=âÊ‹_Ž/þ ÍåÈ×endstream endobj 430 0 obj << /Type /Page /Contents 431 0 R /Resources 429 0 R /MediaBox [0 0 595.276 841.89] /Parent 428 0 R >> endobj 432 0 obj << /D [430 0 R /XYZ 72 765.769 null] >> endobj 138 0 obj << /D [430 0 R /XYZ 72 740.862 null] >> endobj 142 0 obj << /D [430 0 R /XYZ 72 508.268 null] >> endobj 146 0 obj << /D [430 0 R /XYZ 72 479.619 null] >> endobj 433 0 obj << /D [430 0 R /XYZ 72 216.62 null] >> endobj 434 0 obj << /D [430 0 R /XYZ 72 196.695 null] >> endobj 429 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F42 388 0 R /F40 380 0 R /F41 387 0 R /F37 297 0 R >> /ProcSet [ /PDF /Text ] >> endobj 437 0 obj << /Length 1253 /Filter /FlateDecode >> stream xÚµ]oÛ6ð=¿ÂpL"UŸ–å>¥mЏÖu±‡eh‰Ž¹Ê¢'RIƒ ÿ}w<Ê–m¥i·ìÅ<ñŽ÷ýå×ó“—ï‚dyÙ8Ì—ƒIìédF¾7ɲÁ¼øÃ‰¼‘›ø¾ó¡ÑJ|äFYèè•rY‰£ùWMrI'Ã#pjþwÕŠC{3 SGŽ\øÍ™²:¹±Ÿ:byÀ[ñúf”ŒF"èrÅ”PÖœwô±0ì8¯,.מ&Ó¼0ì‘Kaµ°r„V£?çïAè¥ádà—%‰±ùã”xtQl%F‘U €Ï¿Î~û|~5{K#\–"¹s7šÄÎ)aØ(p*%¨ ýÅsM5_òšW¹å¹”õž”¸5Ð%c@KInI:nK¡Z®º©+^xhÚËwQ6hÍZÜ0ö2 gê…a`,½”ÂÄ™­7%_ƒ#‰ pLçü+C ñëæŠ.›xÑdb½‘¦G-ªë;–²,%ªz»ÅÍÞþBÀ¥Å%ŸóØß1oU >Þ€Qi^/:,}/8°ý]ÖeAß÷Lß‹“l/˜LëZ,mß•µ@hÍ•b×üló+óÞ·OÇæé–û ¥xé'>d²•&ƒ;ì/·G™‡WÇŽt{Œi›tÂ8ò CƒñnC¸\6h=‚¨`åû)ðÉ“5ßé]—Ói^2¥ü‹œŠ+Ôã G‹jñ×DõQÖš-Jþ ²•×Ó)rA˜Uú5S¼ÇÙ›faJˆ|©WÒºþj¶øû‡#=ö«—j€ˆ†Óé.Q†°ì?yØÓ'9Òç†Õ­éKºóŸàе¨“L÷–×ã6µÎÑ6.Ãùʪ‘—‚WÖÝŠÝ©)?Y–ÃD•×½6|Û1½™ü}‰|M0ŒlQx2:‡ÙQÌm1ZÒYð5ô]3m¾Ó(L"ì©×–‡ ž—~èËFÀuiL;ňj·a5ƒhðZÁdË‚û<¨C2n…^ÑK0STE¯#{G™‚ÆŸ‘keŽƒŽL`ž¦3N`õÆ ‚ÈòŽ`êðeÃ-ÃÛ•(í“}cǾ5ÖbºÆþ àã’ÜÎ(ðT'6ù¨mòé37ù³'ZŽZA›!¹9nÏ»^ÃÊS‚ŒƒlÑì^/Kv­,Åßéî¸ñyZ»©ß(Ψµ¶u¸7+œäÜxBßPPcÏÝÔ4”5ϹÝÝÐâÔ6-¼A,’vC ¦œ°C!–ìoQÝ:NcaRÓ ¾E¸Sx±Û‘:»›ÿ袇ϳÃYâ¥I8pá/pЛ Aº“óùÉ?}0endstream endobj 436 0 obj << /Type /Page /Contents 437 0 R /Resources 435 0 R /MediaBox [0 0 595.276 841.89] /Parent 428 0 R >> endobj 438 0 obj << /D [436 0 R /XYZ 72 765.769 null] >> endobj 439 0 obj << /D [436 0 R /XYZ 72 740.862 null] >> endobj 150 0 obj << /D [436 0 R /XYZ 72 703.351 null] >> endobj 435 0 obj << /Font << /F15 291 0 R /F39 376 0 R /F40 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 442 0 obj << /Length 2338 /Filter /FlateDecode >> stream xÚ¥XKsܸ¾ûWè§jÅ%>À¹É.9¥TÖòJ“\l×Db$îRä„äHÖ¦òßÓnð1Õ\Éeñèn|ýu7ÞoÞýüQfgBøYŸmvgix–ÊÀWYv¶)¾x‘/WçB„±·y0«s™ÆÞçë• ½ êü½ÿÐËu…ýÈ»†ÙÞÝê< ½ßLÞ¯¾mþöóGŸe~–HÜ?8;Ê—*µÛã.Rzì*Þú ì'´ƒØ5-5z+…Œ¼ZÒ¬„×ÓȼcÙÑ`s×ë²6º²¾§fÞ´wz½nM×TO«0õ̶¬Ë¾ÔÕ¶5;Óš:7Ýšä‚Qþ0ò³ 9;ÁbBY%:Ä`¢¶iúÏ×Ôù2;Á ]N ¹7´ðÛ©¹ÎÎ #13]SÓu4£;ì÷ÐJ½¦íiDW5ú`ZÝ—MÍó5ÿæk #k;ܸ¬iØÞ6>\ß¼¿ oÝÞ aò—äv7u‰ˆ`ƒsÝAó±=ÊÿÂkhèQï÷x7` Æ#hÛ*4“‰sª—•’ÞOØÏ¼ç²ÀVìiš€×[j›ï¹Ù;AdÆø…¹É›º I{ÝêGÓ›–º}CSPÇÓ›Wʇ« ¬Tykto¶xÛ'wÇ~$ÝDØý®ˆ´ÈE®Ê®§V³£d—¦*ó"œàAFÒU<3Ñ“®`£AÐeÊ‚À?X=Uúé[ÂJ,´Ð¡vÔ|U€L²ˆ7oî~3«Xxº1Bå§Ð¢™p±Ê¼¯A|BŸhz³†!€ÀæÁš„jîÀeàV:’ œˆ¥© raßé¼oÚ^Ãp Ljý¾²;¹L !ᇠ?Ù1™^jUîà8]o÷VÀQÿ©RBÄ~àÔ÷Aa±{.‚À²dv?³ŽÁÌwý¸¯Ìµ`#\f–Ç—‘Wþ2£™ m? ¿ÿãör{{yóÏ kåÍö—‹O½¼¡¯Ÿ/on¯n7—Ÿ6ÿy“sˆ¨ér¢ âmÇ‚ÇjóLšìG^Á“rüôP¢8UACyü·œ‚ Çêý¸]ê]øÔ»˜O‹¼_t­ïߨ)Y<’µºˆÂÃ’%)}èÌL²º¬fÄChxZ"e ïNaˆs7ʹ´4}œÅ1¶d#ã.= R,ÃE¼Ø|ǯà„lClj5#„ÇK‰DðW×Ùàótç¤2Ô@.n‰]²‘éæt¨Àœ¸ïóóNj\[qpæx¢(žàˆs½t05.êOâxG#ºB1rÍ»š £QÆõt©¾N*£h&!)¿aPƒçS$‡žÀè“x…îyŠ9¨*ǯL¨Î#Ñ'Úz}NÔšeÀ¸siñ^wæ'¾\aº¼-Ùõ 9Ád`/ƒ@ã/Xß¡µ~òªõ¯1é,Ô¯ŠÛC,Ní¯G·¸*º#4a&4‘VRRÿlhvK(-À¨[œû`3$ôZ×ëÔk~/ÍB\¤/CÅJ}`ꆩ?¨R„*E¬xÚ\iQrîŽÏõ•й4‰^-M> m¥ˆx]­"\­Ûk°u ÚòµZE µJ:åæ4sg0cÁ×YHÕQ%“â—š–Þ QË¥ ŽT­ÀTW­àª©Vlj,È©9Sâ…#¢³ü*1cy4UX'rñà4óš¹ßPDà¢Vä"b€4“ó”m2¥`†ì{Ó/'â‘°©2áóªÆ`/\®7Þ0cïi€²AY˜gî8PÖ[4VL ¢€òfnòúnBcp &!n[ÓÚº;’e’Ê„ÖH8øüÐtSYÕDֲ繧‰Ÿ¤jv«p•)ü…Ü×ÒZ:£5´!&ñy¿-è+ ¡51¤L8i“I<\ ‘P•sçU ÒÙžÊsD{"§áh¨ÙY×.£bŸµ_¯Ü¦c¼Ü½ëL—ŽÉ‹ v¶¶‹”Ärf;6==8í\‡ÑOŸ¤µ5~ì}D_lð{ÅKì%Èc'ùìì• ;%/ùÆ#ËH\œT¦®3nïÒÖÔ¥­Ù‘¥`À¥›“×uü4朙MÄ ³e@ó1œ^R7iæô$óUËé4ñ’¿@cWS¶ÂÛ˜1Ö<Ã4,¤a€þ ¶+¾É^PÄ–OP¥,ÐWâ+áJÌÛç²§ Ê0d\l¨Rù'’红Ÿ&Ìöd›’¹„9… Œ¢6¤!Ù`ƒúÌ)Õ½3ÒÝ`N›ï™L×wK ĪMè¡© f´†—È I? Ü[Ƴ.û-ÔQÛ|„ð¾{Ë(M½T©ÃR)–혦lGlœØ'v„žµ#þ“Ϧ֎(9hÎFL2"Ò˜RdE»B÷Žª!,> endobj 443 0 obj << /D [441 0 R /XYZ 72 765.769 null] >> endobj 154 0 obj << /D [441 0 R /XYZ 72 740.862 null] >> endobj 158 0 obj << /D [441 0 R /XYZ 72 453.549 null] >> endobj 162 0 obj << /D [441 0 R /XYZ 72 333.497 null] >> endobj 440 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F40 380 0 R /F42 388 0 R /F38 300 0 R /F43 400 0 R >> /ProcSet [ /PDF /Text ] >> endobj 446 0 obj << /Length 2175 /Filter /FlateDecode >> stream xÚµXYã¸~Ÿ_Ño+c®xèš tÏìb,0äagh›ÝV–:”<ÝÁü÷T±H¶Üv’Ù›g±ªXõñ+Ýܾúñ£,®8gE’\ÝÞ]eâ*“1Ë‹âêvó[¤XºXr.’è—rWvº+›º]ü~ûóyrU°"•¸+¾ZòœÉJŸÊúÞ- ÈvíL2È?~|qô¸p6ýÑ¢¾BFmCãÝöŒ¤»ÆRCÓ† Èý‚‹Ì†Æ×•n[ßÔ5-òÇ{ |Ó6¶'qö 'gp28¹sw H5wôOšBc¥ÝíJÕ ƒŸã$Öõ†:eU…M(uï•õ¦´fÝUÏ´P&]ЭèUe>û7ûæk'i¤É57p:Æš̮¸bR¥>¥`…ήc7†ÀsЧiôÓû_°V6ô»(A¿ë‡¸Y/vœ VH–sNb÷Iv,e–›àÿ½îð¦2Ò%ž!Úàϼ6¹{»-½—Zð]?¸hcÚµ-WC0;7ÒÿÆtº¬hݶAï<ÒŠ+H¼tç3¥ÉQ‘¶þFwÚ'…ñèÿ>gçDÿçSƒ #(¬~µˆ«RDxNŽâ í<"f=’§,æäàþâÙºÚ£¶Bç`üïÐÐg¯/ÉPñ #,"Ú-fùÑ1"e\%~Íëc ±ðÓUBb"!fO/“°¯Ûò¾FÏ&3'TÊ$ìÈþó ¦+²ü¿0ñYª`" îÂ?’a,ÒCíh–²(Xsc¼9w^΃8ŠÑ<=ˆÑ<¡… £?´Ô- &̽±40‰¶X¦±ˆ>XÛØ6v ¨C¯Æz½·tˆCÂ;jkZ`”¸¸¤Qó´Æ5ÆlZ¯×ÖkìÙïܬ-׺"—xóÆ/ŠÕõ½™¢íØ*‡”c«(ÇVTOý޲g‚âã$žÉž„ÉpÕwU£OeÏ ±9œ‡HÞ4{@óc’3@ÈËd árJZ ŒEñIÀ\jÁµŸc™4îÙÛ"<‡Už%À¸‹òÿIßð%,Ï“ï|mg˹‘ÀÌŠ—S²`ð¨ù'å \« =‡/Z®üs ¼nm°?ezÚ~áí?à`¸ÌUÓTþYÅyX5d0J×8vD=íX›âƒ[? Üj×öMjFkZ`¢¯G„‹“òr¸]=¢~ÚæCËšxa¸.íGãàI|§+¢M~E`j|`o¨iO¬z0áß+”›ugþO4Yoµ‘ ˜éå¹pBJÁT¤߬Ðû½ÉçqÅ'9=x¨2õ}·õι’Å,MÄ©\Qqæ¶ãÿ9g,IÛ¹+ŸÌf&UbxëÕÔ²½‹,–³ ËÜé þc¬¹.!eF.}VRÑ@Ó#Ù¸ Y*›'¥µ/nJô,®°æ~\òxËàÂÆ™ñÞxÕ „À\TH¹ñ„,ÅD)- µðÌu1Žcýƒ y•pÀóŽÆ{ØÀÕ3L¨jĆçß´ÔÛÞ¶+÷2ÐyÄGðßÕ¾^­¨[zµ5uÇ>.ÌÀsàŸ6øeJ¶—÷Ä#Êý rxÝ]Ƶ!±ô8æÚ2öHó³á•W¡†· Ÿ{«d6¥s yšExfQ,Ë‚nU¶â&¤ÒG|u<ôÑ=:Ã*3®4àJ#”æ Ö“V{ë¾`H¨5PÊI0ârr e•T„óÀdûã \ÑQ9ÎÐy0€zS „„Z~²ÀR6Ì—íd6wÒYì¹ Öz‡ªã»Ò/„±q~,e¢ã~®?d¿² Ró8ÜtUQ‰ÛxJ7çÝR ?Sj~`ø´¦w¯ßã¿5à*§áH lóìºÔÿ„A+´µ”Šîã/Ü÷¢bG!wÆ@Y¬~&rx?÷º$ˆ}çÞ^ðcqíœ8•±8 e“Ç*%$K¡âù‡'ŸTÞ೟ ßMúªü p%<‡§ÿQn9Í®éï«;žÇL%ùägÊC׺y;sçÚà‚wo19’ùíí±3–3zÒ(üF“^Ìn9º /æªçkýg¥réÓÈQ<àéë M) ä‚šïhÉ׿ ]×þ"Yc«Í·oÈÈ.Nóゥ×s8™$LõÕï'ã'õL…5qëÅÏD”b¹Ôd^ð€U{Ȥ/ƒÐAæµ×O{8„"Õ<àëQ°íí p…ìyoÁ Ò„ŸA^üj‘‹3üˆ8 j1ð~w¾ž™–0*g¹ü“¹{~0s0†ná/ׯi@ü•þߟM7úÔî˜}`›xQx(°¡WDU0ùàâ¸!»¨ã*Å•ã#Ðï!Êri•g®CiSZÓ¬çSc(­ÝûAÇPjãÔÚ˜Û8¢ý¿£¥>±?Á²Ü§¹«°þÑtæUÌSgu âäƒjÊÐkÓv}Õ¿nvÚÆIó‡]AJ@/,ºåB°¹ÆçÉÙ ÚHˆÁ¼˜AųÙ4UPbéäýš«dÿ €Œâ¹/øa3ŽÓ„¦®G˜8ŵ׉"#Ÿ ŒŽ1BœžE˜T0‘eçæ…òÈ€Ì_Fg}ö a“'ïO@ž¦Lä IÆ”¤cx†S¯>ܾúendstream endobj 445 0 obj << /Type /Page /Contents 446 0 R /Resources 444 0 R /MediaBox [0 0 595.276 841.89] /Parent 428 0 R >> endobj 447 0 obj << /D [445 0 R /XYZ 72 765.769 null] >> endobj 166 0 obj << /D [445 0 R /XYZ 72 740.862 null] >> endobj 170 0 obj << /D [445 0 R /XYZ 72 671.102 null] >> endobj 174 0 obj << /D [445 0 R /XYZ 72 643.007 null] >> endobj 444 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F37 297 0 R /F38 300 0 R /F40 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 450 0 obj << /Length 2993 /Filter /FlateDecode >> stream xڽ˒£Èñ>_Ñ·AÝ,PEë“g=³‡caËëƒÇ±Á R ÐL·þwç«x õc¾ˆzfå»2³ônûæ»*½Éų̈›íþ&‰nøi–Ýlw÷Þ×yç£mó¾lênóí¾ûÆ“ ÚtxÐòŸ6©òòêl»Í]”d^³ ½=ïÑÁ¸GG¾‰RÙcëóñl¤|“)YÒo¢Ô{<ÌÔ³ 9o¥qÌO8‘xvÇ}#߃¬°5nhàÁrÇÃ}ù9PÚ¶‚ðç ¾•ý¡9÷r­zäNmwÊ ‹øÞÜ…aì›Ø`ÃÏâ˜PýåœW$ }ZÀšØÏ4óô!?ž*ûýæNë˜ÑTJy÷GnÌ©½`^‡…éÍ|ÞÅQì½çÏ>ÜrãGùþþ¿¿¹äñÝ ¨&,¾8ncç˜÷Åx|@&ó,s…ðe ´·Ý¤Ú+*ît}[Ö÷¼âs?Âsc®pw‘ö³™C3ñ¯õº®)hédE×T˜xÍž¿ù%ËâÀOb§£g¾¢p™¯‚+ G`[iˆÂ¥¤p8€ §BS·*»~ŽQeëûþÀíȱ«ÌÛêJëvØÊE/y âz·|WvE[‚´C¯¬ó¾ioY³Ø²x¦ŠM [‚„¸z½³ûü\õ¨•( ˜ÌÀ:ÑDia*‡ÀYÉ£="B¢-áo˜îlÑÔ;nÏчñì¸=@þµÍ©-ó^X"Oö©éí`G#ý!G+ÍD±1`Ž"ï¬kÕÜÈ«®á֠ߨií©µ NŽ„V€Æ?Ê>ÓÔEk{ÙõuÒ@9O×… °o›£;·âF¨¶Kôª\°©ºg-Äé‚ F{ÿ´x”Cø³ÝÛÖÖ…]1›Ìø:qîöSSßÕ%©¼À Ú õYë¡1×z ­‡ïͰxEs<æõ®C¹™Øû4;'^œƒ¬ZžEºœ„~ ÷ÐTÔóãÑé4 çSŠð8Ò‰E:Ø œ+ŠƒÛ¶|óóÞèýCaOWn¿8óã`íöS`ãdÿŠîK—dÀ•eî t'¬øZ_ñJJ®Al,” ƒ2òJÀ\ñJ¬¯„cµ€!Ÿ»Q÷¿áy É2ƒWÙÄaAÇY<˜·Ü‰„–ê™ðȉ™PdePVƵéJð`<øqÇ«ö„ ËIS‹|¾Ð>âØžç'¶{‹#é¸uðN¦Â=Sƒ¸ ²x+3€5‹?ÝíŠ'²¿œKÑ·ºŽÄH" ¸ÏEn¥‹Rƒ[YœÂb\å°Ö!?ó«´ÏÝ¿Ðojè4DzïÙF#¯Ü3Œáx!A’Ç…¹CÞñ\ÝÌc?³ðÇÝ Mæ§Mæ<#:§-‘¨¸ðYsP&ñƒ0Z³"ô{q+Fúp—ʾ¯¸§<Ù+F”]±¢ç½ÜÜŠn™]Uù¯Íz€ªü—;Ž%¾ÌßδÉÈ´÷i'ý‡Ãl^à éM,ÊZLõ nb?L’¹éÕpÝ”}^µ9ò%„Á­‚ab2(û “1ÊMâèy.k¢qëÈ 9â-‚nû˜„ m£UFÎ}A B—x19z$-„̆ _ ˆÝ”‰ü4œ»)Œî킬/qg@c0ÉDŽ˜NNx+sÃíƒþ*N¼ßÖ<žïv%z—¼âþÂÀx3ň·0œÛÜžüÜ?s §c=¸„Kç4ú‡,|%¨‘!D4zÒÉ,{R Am‰"ÑA0 v°KXŸ‘éØûÂwr†5³³¢¡ïÎÒ¡ìÔ¼ã2Ü÷÷WQ ø-(W$úC)X\² €ì "keÍ®eáÁ˜ƒd6Φ ‰lxjäP„-3M0ÝÒÙ8q´l6y]vGCðL·JÕRËJ@í¸•óú#ie|P“¥WÂëWl‡Îa<)b”}ÆíKûÊní†zp’€Ût$¿g#­þN5 ‰´+Zá;¬gS­¡Àw¸ƒ“á΄FÇ©KRaɨMØû2jöƒ'áFÇ–`2oI; å‚R 7²íð"\³—»ê1|<å-Àí9倴üo[óLk [~•\V“(¦Ñ匚ÛTå8ª§¶&+ÜĶã=yE¾1'âÜØnGRÓÚe^ËWC€{Iê4ÚåM’ßëÑd±sî\\ÍÑ—RŽNr窎tN ôVJ”¨ÝE&q¹ÅbHŽUy}Îï-KìÃS;AŠ4ÎOUœäzb¼ÌG$Cˆ–ã½ÁSöØÙŠMM–#/º³»Rq[.3÷m~:Žäz/Y”mQÙn’5L¯Hǃׂ"7+%-¥})ºÜ£O…“z+’®›žÝYⓦ%3¾ Æ !1<Œ½k0{XÃŒ)—(¾#i<° ÍéUO¥É‹â®8QW(F"Á³0‘±šòp€¼(¬°%çÌ4FÊ» w@‘'Ž–5í–ìW‹tfŸY ‡ Qä«lžŽ’•DYÂu„ß™südv÷kàõǚǥJ‘™?—ˆðËÖØ ±=pý!™¢Ø¡c b!™—D?ßJ‡9D9ÒgHÅ#¯–Ë1y÷RdWN¢X-Å_‰¿e†NÌÜU4µÙ¡N(~sEºŠbB¼Z]‚y(&ò‰ÚûË£¶È56ÄMP3,ìb€¶€ÐwðÐû†9/Vîí̃í¹Q ¨aÎŸÚæ ă/,äÌR£(n€(aÍ6C?ˆWkŸ‘æK¾Ï”ŽM쉫VlÁdhvk<,3²ŠÍ3Ò‹ÔÏjøK±‰òˆÏ®æ }Š P,¶AÌn‡F2‹¶äºÇœŠƒ]!§`Iíì÷‚±žp6窢yú9“•b4\’²] Q)ÔÔlãØ t°qjKÈ®%€“¹¹Û¾Lžb퇙cæ×¦Ü­Tž? Í7]J Nð_š¦²yýL6yˆ;£;Àõ±‚¤Ú¼ DÕ€0×)I^FɹîÊû• Ë9WPJ”OŒüä 'Ãà™0›Ùè¯C²_£¦dÂë°)ð“°æ xrzé—AÞWMþ+ä;±kÎàÄVÔ,ôU¿–Yנʼn¿[Å!o_o:Á1­ÌçW^H‘¼i½š+à*Bߤó發~¼„„/Šiú”©y‰c5óàJ]«¡“ƒ+%êÇ2ƒ¿â_ã§i6 sŸw¯ïšs½ãJšß¡=Kŧ~'¥—,B-iµæ‡6øHMZ\"4cI['Ó* X…ä*¨™Ô‹ôòÍjLЦÉäœÕÌz%øI9ž”Wt)…]Ùë”iþÊ1”¡`pŽù$ƒ0’0 ¤°&Ó0ü(3Óüí525 R5'TWÖ›¦i3Á5çŠhD ÇŽÐuÅ>%É4 Ö¨A°àa)C9Ù5­F¥¿I©ÓqÉw)×7õÅ_V¬ä;ˆîÛUãU­þÁÆúuò½©ÔHq 5keâDûZ…³¢÷ é±E×ÙSgûéÒöS±ý”m?l?sÅ4«IŠæÛZª6N;Ò©å§KËO ³7MÆŠz@6ëY=ñy-Ðá$;¾Ê ´òiõÿ?Á/ä“bs®èp èÀ•‡ƒH^Ô|Q£8œ^õyîãî–ß÷)¹ BÎ ‡tœ6T9^Ð4‹°­:{;ûS@H¼³•`uÌåq;_Æ|nŠÈOM8¯=O,k.ŸÜÅa,´ÆÈì²¥üݰ@Æ:"©1WPãÁÃÄ7¦ôÀ=J?aÞrt.=ùçÏ¢ØË_3.ì;=b‡9&‘È£lj®$Áîì;.šÍ޵—6ÝIAq¸Ÿ/«‚|!SjuëòUW&ÊÈTÌ»ø;ŽÀÒþöm·ò÷¢I]é !àN•Æ·$_‡Q¦8õæýöÍÿ]=½nendstream endobj 449 0 obj << /Type /Page /Contents 450 0 R /Resources 448 0 R /MediaBox [0 0 595.276 841.89] /Parent 428 0 R >> endobj 451 0 obj << /D [449 0 R /XYZ 72 765.769 null] >> endobj 448 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F40 380 0 R /F14 379 0 R >> /ProcSet [ /PDF /Text ] >> endobj 454 0 obj << /Length 2959 /Filter /FlateDecode >> stream xÚµZI“Û¸¾ûWômÔUú6k•SSåJ¦oq”Du3#‘Rj·ãòÏÛÀ]½xfN±<ï}o¸yó·_´¹Ê¢Ì%W7û+­|ä]|•&*òYvu³û×ê£Òéõ¿oþ#m?+ñ•¢7×±_}¾¿^CQlk*wE{½6I¶Ú× Vü*g"FõDR'ÎUYWóE`V‡1§á*L;o ¦}¼^kX@¯î¥ÇNµ äa‡²=qC½çòPT·§;îÝ#‘ˆœ›èz:½º¹“…>ªÄ4anq(ŽE…»‘†RŽz‚áp†«µVŽ6¾Ö:ʬ¥í—;™S"±¢™sÃèÈÛ§»H›Àؤ±ž7™Àþ[à}µãúhØ€{ÄòÄ£ÓÕ? fUÝ–§ºù̽ïwo±GÚsCŽ$®­%î–È¡C¾9ʪâ€m!;útʃlçHtd‘\!±Ê¥Q–9Uïù®¼ÆCúDiÐ/›WÇg„:# ƒ“ûPcûÁ»²Ý6tÂcYåÀZ:î—Þ×çeåɵs.HÒð€jt´O%HãU^a©WÅÃuœ® ùªðã|DºÂ¥†;h·0m°n û³NÉþ ïES3yÐh„¦ÓR@±ZÓüñ*ÅnN_6Úy¸w|hNFZn³+ÏË{j"× ó®ØççÃi.ò ʇQûÙ2a}ðS„SH“"5îäÓu@º»$/ØGˆ1œ·mM«mËüdYóµÒ$Ö8Úô±±:’3`wÍhº†ÉVÿQÐMœc>%.E1›ó=‹’4Mñ¸-îO‹`cU”êd}‰6I¬v̰‹ »4‚?v±Ä[v±ít×ʲ1"Ë.íG¡LWÒP¶Âm0Êû‘ ÒýÄÞ¿@­”}#L©Žï Uq–öËÔÅú°¡5C[l$´Eby И[$ŠPƒeÎE5`vl¤uº€8¼—øk ¸¯Š†Ç$ÆØ§?Cæâ„¥Ò'gJ_(5B~¢8#ÔaÕªòcÑ’åI‚ž§½žcë¦3<&ئdJø»Vúg*•‚JýåúªRÑW•.:I1H_Pöøï¹¨¶Å‚ðØômUA[¡2ÖVh mU¬­Pˆ¶*ÑVl ÚŠƒ;$•YaçAMâDÕPÕè¦X:¸I3v“#:‘»‚ «qú„;x?Ï p¯’¤×âD§ý*ïu¶CûŽÛ˜îë„›"§cßúˆqý`3“ä@¡¿¤ˆ}ЛŽ<€°IE±²ci¸?½`¯-YÝ7E+½oY´‰õ‰¤-Iz= fá|`ØwmP©sµÃ-&@}þTЇg&³‘Õ¼¶(ѹêOŠTŠÝs ôÇ5È[Ñ o.Y¼ p‘ÉäM“^p­¡–¦ô`ýÆú=¤?¸2Šþ@Ä::ýÁÁÁÚeᲡ±Wø»–ÐP¶aj^d ëæõá…3É3LÆxß± Bœt„ug #©èHÚϸèk—áà™P˜n(Ä:¸¼—_¤>›{(²È1zäŸ/ëµ2;dôHf?ßÃÁIJm,RŠ4ÆXXÅÙ5hD>¾øªD_¨Œ„(âÅX€ÓN E®ðE>¬Jú¨W Ž1 ƒX:+æ»ú¨>ÆQ¯b…'XÊ®_õªÎ [dG¬êûv„afõ&Ó¨×(7ènY5¡ÃüýÏ ñRŠ&'?)LÐ.I˜hçÍëü ßVÿ)¶ÈOïVM±¯ˆð?Çö…Sì ß}J9‰ŸØtš]s™s!‰Ïa/ÎèDÀ»¡MÈ”øáØÕ‹€ŸøáØ@"à]'cçì•wÿaC¼˜'ô \ù¦Ûïnx!ç‘€."±ŸŒ~ÿÓ¯ó-ǰÎ+«SÑìóEoc3,ÉLâÐ1’iÀÉààX›E'ÒF± *´/9^eÛb—]$ÛHe,mZ@‡¦B¤M3O©%H›6t^Elìå >ÆP£ù"yjÑG:ö[ &3ñÓL˜eØÂ.3°€&f€Äú™`ÐÌ ´JWƒ´DÜ~’åmEÞæCb»ò¶ä§¥ U‘vÁ˜Õ ’¡A2LGæ¼9”Û &1 Â,9ÀWÆŠ/=ƒèÀ„ Ö¼dˆmÀ+hYÊŠX1+²¶:„06í“ãvúø`}‡K>üDW8ªŸÈ½jɽjÕæ T›á¬ïZîµØ6ÅIÆnr ] H9HµRXhºGLa!¹£\XÈ……zwŒ§ï˜…¬ 6WîrËY6nÉæÃMÚ$ÙÄ€DšÝï}°šmbQr¾ g`TAmá…?ÛSSV·<$øu%«} Ë…÷Áá]ôTEIH5mÏí©>>ë¶Íˆ@ìž”§5ò ì5_ò´MžVœXuù¯æ\mó½TÍmJ ¾ƒ~Â5Ó±×Ì¿Ð&Ϧ'¬¼‚b%çBò#8¥sCF§Qq”uàSR;š $’ç(,?„–—@ÈòC(µ„ÔTî8¼|ÙÁó'~L´;ãWA9gomYg_o燧ÞÔϤòPmtx:ðîD¯‚iô²_Jru9•Áž}x²ÌÔ’‰Tœ¤7ŠK óÜØMéÌ¥šðØ\ªž'ÞˆŽàïR†$I¦‰8§÷cÈoO’ˆËn]ò²(#pô{´&—ÛsÓ–ȸ©‹Qñ“ßy2~Ì„²>Ÿ(qƒ]Ó÷¢Œà¶”‘ .¡Îläú<.¨ð ¢Áy28êPâÒzùøi ±Ö½Ò7c‚'ÛftÆ?ŠGÌɶ$‡’ÖMâ$RÚŽ<‹îµÂ³7EH'ª.g]FQM¢wë;UPüâT>½È§œŠR<«£±EÈ BR<ÿl–dZÖ‚E;çõÂΘE*‰ÜTc¾-˜¢9}摄§;ð³àûNˆèž“E`V˜æäº«i‚ݪ©>N¬Á¶)é‘1âÆp.†èŒÏ÷óc~¼?„T=Û#èÛüÀm#CóãÐÐPN³x7Gá¯ãžÉ]&c¤<å—¯RJ"³½«é:¤ë\a0‹À„Ÿ‡ºº•Iÿ9ä†|}F]Úe yÝï¹ü‹Ÿ[à¥+0|ŒN?8õÅ妮EÈæ"ÂÉ ú±‡wòþ§_ßýöNG²“/ûº—Ô½ÌЧè(j÷µÊmÁ'Ïÿúõë\{DzÉ2óÅU.¨±Ó,ÒH‰Åšù•_ƒ‹Ûlòwïf¦@³9ümhÛO‹#$då¨sÅÆ!Êp10(VH=Å8=F§B÷öÌÞÔ¶>9ªÁµs¡º®{n égÓ…T¸y_ðÒ—u QÊÁ!@;!Wì!jÀ¦.¹tõžaM²„Ô4Å-lò0T? WXJô!A¸œ¬ÉüÄ0‰O ‹÷'†:ñü\t|€ ް ¾ߟ‚îë⮀6·yY˜ü½âßlª˜å´9Ùø„}FØ{ڊΰëÍÏ7oþ-ÅZáendstream endobj 453 0 obj << /Type /Page /Contents 454 0 R /Resources 452 0 R /MediaBox [0 0 595.276 841.89] /Parent 457 0 R /Annots [ 456 0 R ] >> endobj 456 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [291.691 172.519 314.157 183.31] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.4.2) >> >> endobj 455 0 obj << /D [453 0 R /XYZ 72 765.769 null] >> endobj 452 0 obj << /Font << /F14 379 0 R /F15 291 0 R /F40 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 460 0 obj << /Length 2084 /Filter /FlateDecode >> stream xÚXKoãȾϯö²0êa¿øP†7ñ^˜`×ÈæÐ¦(‹J4HÊ,üßSÕUM‘ñEbwë]_uñ—»O_¾êl‘‹<Ñ‹»í"U‹TÇ"ËóÅÝæ?Ñõa©Uôºüïݯ_¾J{¢SV¤Z-bOõïe¦#WËn¹ÒFGÍ–þû¥Ê¢×Çå þJâaâÄŠdw˜‘"s!c(Ú’ØîÝ#óܰœÿUähYW]?U¤.ýn¤ÔóR¥Q#–+“êènÇŒÿŒµiûe]îËóFÅÖõ|b^ÑøÿMù-س9‘ƒa‹Uf…MÒÅJJ‘[ëMêà5O§½¼åJF#™šeê S›èiiïjAÞÒù"ðÛ.VʈÓ„lb@ñY#ô¨Ážv&£-ÖM sÊ•{®¿8v”Ö §µv ²æÓr¤§ù„fVÏäù…z*¶"ŽÕGý-³<Ô\ÇlQFY×$4ìR É}:“B)3q_ë*22Ø+æSxpªðN¥4Î&¹è’å:䯘Á6+ްôü~§—y :ÃAtxqIM\8Òt(ݳܵ‰Ï“ú2N§©+8ÛâT$$žâ÷Ç/ëK±ô°R@.ÓwDƒV'Ñ©ÈÓ®CÖ\ª¸Ê•Ç âLõªY5Î!‘¤êÄpieôSc„ÊBšd.eT#¾Ñë@M=z°…Õ©,£6üŸ´öË‹ÕÃ-…ΚÈà„Mux`Іÿwåðʨ‘\€0xQÚfQ…*‰RðÒ 7‘*CÁ½#Fb|¦3±Æh94™Ì7™T§Ôdðhh2¸˜4Ü@žA ']ð ánr4øçg>ù­$S›®ê@ØŒ£Û sfÕÜ}×ÔÇžytEsBtÜ8¸}9R 'Y:ô,¥@}ô߸O¦‡e¥½3aÉÎTìLØ¡ðàë`2ŒÀÍ}éSƒ3¢ ÌF‘FÍ„ÕVÚ%ȇݮoElKìFÆÄÑx(ã­LTm‰®?³”‚¹mêš8#VœâÊ]{1†Ò÷K8Ý”E ÍsCgLEÞ*Û­+ƒ®g*Þ7ótR˜ÕaxËBG¿¦¿¿¼î2ÆfF„t7ü€¾nÐN$yÂ+Æßf|­Q[º®9Õj†ÝÛƒ3¾}û×ï¬ÕÛ§dÄé ¸&þIpèîÊQHšcÍè5° lª+>ƒÞË­ruù%h6ükV\agГˆM@šì¼ýÇ?××_nþXK>1n›è¯'‡ËúXÒÚ¨‘“ñä@û?5~õØ}¦õó—®ÇòÁõÑŸòá¦)pyõÓÛÛL(.u[¯¯×k’¸›Œ»Egç¡ sy†‹Ûík¼›8“ F,à›arᆂƒT§ Á¢Ù{ØîûrzZ¸cÇ$,NMz,7 µŽ–‡¦'úÃæò´ ƒÊ™§œWë•RcO˜7)êê\dÌ$soa$^2¼Î­N×XXx¼”ÃÅO2PHë–]ÙRžÎÑ¥žçmè˦hX´#BÏÅkKkB¡'Æ2ø-ú ‘Qf<¾ Ù`Ë)_|¯Ž,84Kl}T c_p¾¹ãÃ.ôºXú‹šÏÔÔbyn,¦¨Sñ+¾Âÿ£ë¼·ðùÞHú5g ‹º:uXPm°Á%&óÁÁ-畈ÏM ô™‚4lD:g„›+²AüçpÝdì+†-7† ÇPæ ïËœ~e×¹‡2Ð0rA_ ª8, ü;xÿr­†Ëµ:»\ÏM-Óñpv¤ƒë¡IÍÇ& DÊ‹yû"âÅxfGüê(S1+VÝéjvÀcËÉ ^º4¦á–˳`Ö@Z¢áÁ_àá•nxRȳ‘ð×ôlÖã+ºM… êûº)¾_2ÔZÈ8xõ *´Øzø”‘"ÓáÒÝ¿>Î)Ù¤«`„ £ß З-0F†‰æêí’ƒ„èfÃȳzÏ,H¦AÕ+²HAWÛêàêzÆai&ŒÌ·d~ÙÉ4ðIÀ ã8}­àNþyfêIE:N=AèÙ÷°L†q‹>LäQy6ú@]nz¤¤¾$Žþþþí·_®ù¥QÇ‚%}½ÈÆ_XrJRzÜ9ÆuPÀmwã›®¿1—ÙIVCÍZ9|ðÉua˜ŽÅéÃAíø†„š·<™Ø@’ª³[®õ¨¼ó=ÍÂPn{z¢)MEmÅÝãÈzC8>óùB* ©-ÿ¿¢*‰(Jb|0à:»¨rts°2Ìú–¾Â_>çU8§´9DÕåT©V¬ l†¯´ÄÄÁ{Gã;ƒ‹´Z˜lŠ._1ÊZ•q§À‡adT¨È6|~Þ5Ý̨.#~Á ÀÏê3.‹aôõ´·Rĺ‰x;3ýÉØk*){îçKír=ªïU•V"W£¢BþåKY© H™ýV‘aŒþ¡ý0ðjxž~…)Bß Ó¼–v=ÝÅŽ›·¡çpÃqgþ4’{Qã‘7h$ÇœQøg#ˆ˜SFÅxôéæîÓÿµ!£endstream endobj 459 0 obj << /Type /Page /Contents 460 0 R /Resources 458 0 R /MediaBox [0 0 595.276 841.89] /Parent 457 0 R >> endobj 461 0 obj << /D [459 0 R /XYZ 72 765.769 null] >> endobj 178 0 obj << /D [459 0 R /XYZ 72 705.007 null] >> endobj 182 0 obj << /D [459 0 R /XYZ 72 634.824 null] >> endobj 186 0 obj << /D [459 0 R /XYZ 72 277.772 null] >> endobj 458 0 obj << /Font << /F38 300 0 R /F15 291 0 R /F40 380 0 R /F39 376 0 R /F41 387 0 R /F42 388 0 R >> /ProcSet [ /PDF /Text ] >> endobj 464 0 obj << /Length 2664 /Filter /FlateDecode >> stream xÚ¥iÛºñ{~…ñZ 2󉇮ý¶I7hÚ ¤û€Mñ Kt,Ä–\IÞ£ÅûïƒÔ±ö/ýb‘Cr8÷ ÇïnÞüüAF‹Ld±^Üli,2c‰Eše‹›òŸÁÍÖ.W: ƒî°\©$°E•ïr»Œ¢ ßqCš_C.W©Är%ãdö‰qU.Wq–E^óù5#äɱ³%6M»ü×Í_þ`ÔH™LCFjQýÃaI8Jû¦()2úm S¶‚¼/–* ¶ Êwމ÷×_Þ]2Ìâ¶ûÂúª©;·¯vTÝ,Sîmۦ퀳Xêàã†9R³X) BÔf±’@J! ©8ÈÛŠèXÊ`½Ãq®ƒ:ßÛS†ãHH9Fnóö”U™Š4NÜŽ éÍLphmgkd´g@Uó7wW„“+JEòÙž^–Æ^žÅ.5½]®L˜ýÖßé¹Ë×;ë.u+uT&ð»uLÏdÍ ~›»ÝÛ܇SÀIQ[[ ¯L¥³h&Þ/ö[Þ–;Ûá±( ÔH”w[ ¶ $« ½/Høþf5n ©•ALâšÀKl°4AŸ:ô¢QgÇ7 Î<êTSZ@Šl…3~Öt§µÎO¶pãÎ{Çz >ó0±¸¹NÓHD‘|Y§` ':H='–…"J=ÊÍj½kÐ÷Šïg+1˜lÞuNtUÞ{âïª~Ë£ñ¦)ñ)Œ¼Eoªœôáô “©ùŒ³ê•óÈŠì t}_u½_Dÿ#÷»C/Éñç¡cÛÒ*a2·-{o‹cæ·2iÈÎnb¤¿Åk ôƒº9eIªT«ç¢2p4ã©ÕÆ™à¦Ð±?쪂˜ÈÀ¹‰¼ë ”Â\lmÇ€×Då(v. û1;^9ô¬µý±­™qvv úìŽF #'²˜8 ÷Óú¼ŽAÄ&ó:.šv_\ôí5G‘ˆ¥7»®#ÚM;‚á–¢ÙŽla0#ß‚ÕM³;…Ýw$IX¡@ߦ-Éga“'ôÐVM rES¸p”˜‘ÈZBÆÑ¤Ø,¾†29¥^×h)ã΄"‰²í\ ™èGvn(Ä 9;ìŒ “¾;uÝ ’ˆN^åºvf "ÝÙÞº;Økñ’œÞp<ÚMËêk¨5ø†W7m³?'#’ÌÇ¡›÷Ÿ~½þÛ)a˜Dö(à £°í4Æ‚Ç1ŠÁî6ž©„L,L’žóž§ˆB Ã53N霣 0géLàC ‡£¸^ZçWÎã8pœ:ûÄøŽb¥ÀÇÕhFEÓôŠ+¤O5ª÷8}ãú½;Üm+,RpÈ6PÕßNýFÅPà JxÆmÀ“ÓD ú^ã]R9‘zª§5‚<…b½Tš@e§g1u¬@äC €ïÔ@¢L$ñË)ÇÄÑãÀGm µžÌp0µ€iáu3Ûk|îÏ*^öµòŒ¨! HåƒañBŒ2rZïÂOYÖ±HTúJ»Ó»Ó «•†׿ 2-ëBWÖÉp´;úà3»Ã5gwŒêi»ƒ¤g†’üwØ–ÆÕ¥2ô•ù)Õ\7=¼U±Ù%±Ó{T‰bN|ÒÒ”‚¬¡_aiñ–V³Á8ŠæeøŠÀK½:²Ì4 È놿^ÅpÏTXT'ðwTñ”<~›€…“c³šaÝ«·>^´ñÿ€šgRÔâ›/Eç*^„©w /×5E 6Lé»ÀÄ­Sòl„ºH¦'©_ÏS¿vÆ„üÒŒ¤®4E=¹qP°èJwù'oA[ûîîÙçÎòˆ(Ÿ­ ã}2QëJ™Ðü߉úå4Éø™4 ¹@ ý¨py&]C©éséú-kLkh` ¥UÔÁ ç±µÏ ônô†Ð¶ ÈóÞeÎ)v ª‰¬©yç»#˜ø±.+ÞaFm æ#Øî”+²/†"ÇÌt‹dZT;ÂÐðˆ RIÏ²é …#\àSÓuuÔ73ÔóÀMŸÑç1¾shìà”¬ O:ÏFX÷Ð8ylïñðØä¡3î‹o%:vq±òÏjˆM™ý;!»òÁBЊԩÓQð W‘H3Mg"¦÷Ê( ®&aLøê>ÇbûÔ °% ŽŠþ%õŸ:ˆI1Ýž›X§NoNÚVÚ}ÓõmÞW^ç÷Û‹3ñØìi‰ yžl«ê˜ÿ’ $¼É£yÉ(„ïØL×8ÜüÆg9c0š‹ úÕ?xÖ4‡î·ðÿ×鑊ƒÛ¡å1¸KÀåòªv³É%eÞçg(Œž¦ÐÙÆûëÏŸýpùñÓ/_®Ð˜h¯y=¥-h¤wãζ·øÅñ>w2]»Å²¹«…(òWÈuf'“Ÿpûµ½?€£a¨ˆ¦õ¶[ÿ#îý風’xŽ61BoEZ3)Ú£3„¾Å€ï¶’|Zõ”ipyÀfGNfÊ8³…¿ˆÝK‹TJÆ&$âò>ÖK A Λ Êc1¢xÚ½.©á¨ z@´/xâ0œç¬sÏš: ·ë¸sOxálÍ-L:þ÷±j­Cë[›0¢´vuá°Þ4í>÷P座*Ø5yé/®˜”†¸6*náÔÉ-y…üã6Ûnòžé,~±|uÓU}.Ì}¡8qÖi$Áª$MpwÈdr&Ú ]”Þ%„ì–eQ¥¸‚4âÉ£þäQk³£—:ÖØõ죢Ls,)9/ ­÷/¸ÚB†ôŸÂ“}TØ’èAš&Q¾£‘¸¼‡d»kŽma]O j›¢Ùï™Ì„3%~7Ö–³³Ê1HH8ŒÓ´>×5‚fº±ª‘Ž©FqþC%—Ÿ¦.vy§VØŸeÜþlZ,¸T–•>.ZËÊ:,dcL¸‡dAòv„é8øˆ.Œ¢À‰×ŽÑxNå5‘ðãó3 ›óH f+yd¨ÒÕ;Kýž'óóÌã4¨måºô0©0/z¿îF-Vø’uœwþ@ݸAÎkDõŠdU>´#ñ´ãe|@*ü> endobj 465 0 obj << /D [463 0 R /XYZ 72 765.769 null] >> endobj 190 0 obj << /D [463 0 R /XYZ 72 471.937 null] >> endobj 194 0 obj << /D [463 0 R /XYZ 72 310.132 null] >> endobj 198 0 obj << /D [463 0 R /XYZ 72 280.377 null] >> endobj 462 0 obj << /Font << /F15 291 0 R /F42 388 0 R /F40 380 0 R /F14 379 0 R /F38 300 0 R /F37 297 0 R /F39 376 0 R /F44 466 0 R >> /ProcSet [ /PDF /Text ] >> endobj 469 0 obj << /Length 2698 /Filter /FlateDecode >> stream xÚ¥YI¯Ü6¾ûW¼›Õ€[‘Hj  ¼ÄÀL’ç9$¡§V»5QK=”ÚËüú©ÚÝv2'Q%²X,V}µèÅÓo^ëì. ý,ŠîŽw‰ºKtà§Yv÷pøÕ‹}µÛ‡¡Š¼Ÿ»ü]¹ûýáïß¼£»ÌÏbóƒ»}˜ú:Mhzu¨U_Ô»½ÖÚ«:|/ç×¢=Ÿóæ°¯«¦dJ~¹ÔU‘÷láµ»ÐkxÁ‡ª?ñŒþ$Sm]·;•À·æ“ºOÍN¥^Ÿüö[–Ë£\ÊøYƒp@É¢¹pço²$—˜Äb'ÂÉí¥¯Ú¦[3ÖpZ­eÖ—0ðM”ÉwØr¬êrÍÆ¤~’…2Í÷ýµf÷aœùQÎÎð}^à¡A=*ÒÞý«ðà·@؅ƨv|^ly±-Œ¯(»®D%ð“òàxNÝæ‡RÆ«³å·¼‘-˜ZÚc^ÈoÊ R¯íª¾µŸv©öüÝÞ„‰÷p*¿zÕLÖ®Ïm‚€È¢Ðc:ðѶg˜“Å^WؼçÓ? `µO‡òåõ‘ø—ÇÖâ–YÄÖƒKQ=¶ëù…•&ÔZ¦’ @c…8þȽŸO(Ï—eŽ­•÷@>žìX5 Æ9GbÂíÛòx«d5UVÞ‹VôÖ ©÷ÝLlíe Å3`pÏsª‘´R5Éy!ºY ¼¶ê{~ éÞñ™óãGŽ /NQ¸¨jûWkE^&à8Ÿ¯8ó¸Dy]~–Åy'£iëãæ(µÉd- †«ÄºJmÒQB ’q/Ö¨ÀχgÈ7V~„ƒwp9xƒ÷TÉFãÁe3Ƕ@¶2z$ç’ï¶Ìe_9ñR‚®½Ú¢e<Ü84Ý…fïœá ñú¹©ÌNM°’\†·(fEiÌ£Çã§—° ^óþ©|_x1NÚô}²z†Õaê@vœ2EY­ Ö%2åG˜‚~nœš„âÒµG$¸È©¬GÀ ã t=!Q¾cˆÅeGæsíèL–S82Ž„Z#—ò©ÈÀÞ#”06Œ%¦V­U6Z5ÝÈÞÄ~á|v%ÝyÙ„‚ºVô§Fåĉ¯Òä¦þ”öM˜º8¶u]aäÇ!G±0’ûº_ß\Õ|/»ü¼h½]ì§Úݨxí`.â¨C¡_r|ãçf78xâ‚´Ý_ƒµeZ¤ç´µ–>T~¨•¦¦¬Tâg¡Sæ¯ßmò\âð>¯¯[l†Òx(Tî¶àJYenò€èoX¢oG*æp()?Ò–æ¤U*i\þ0•Žé*ùj!FåâUSÔ׃lIm/¶Êû’¥›u$ÈÆ”å™ÉfF6@"zIy]ËÏþ”÷nTò`yJ -NùÔ1Y<¦O„Ѻéõ]ÙËâ¡p£ÍÛ…cð[`(Úee}p†Ñ.\uÆ;/ç€0–s.×ÿ*ø:Ô6i&éø_·I­¿dzàAÚ‰\)e\ÏÄDjÀs/$T|lYÁúò=NY\ìVÍwŸKHãmdÓ Ò “Ä·d?rD/t>”Q¸ë$qïfr ìH® àÖ•žÝ>@ù}SõoJù„9Õ¡Á,äI¦àÙ•TdÇ®ˆå‚cÖm`$¨ê”H‹#ô>Ü+سÊkæ0X4FÎ(YËf\6iW!Áe [­iÑ>ð»8ôŽ9YB}µtűëÆ‹žçz‘µ”üÚ S¸9äVf—Öº½ËEyéoì¼¶ ZýµXõ~à ¡^Rƒ‚ŒçÖÊHR:± ®”äa»àâ¤wè¯CñÅ«æDéR»¬¶:»¬ãHŠ vMa1ï= R¤)ªi[’O>íëïåLà¯~iîkiî8 gDÞ˶A«}wµ\}}¶ßŸ‡ç‘ï<Íö¨“ïÚÍø5çFÙÄמIô  fÙò?Wˆ5Â1oøÉp ƒä³ðv)*NÝj ¯º¡HäqâGªìVáqÉ]Eù“ô¹uÊ宯UÝï+¹ú?îjAIó®ÊF3MëµUéUÑnÀè|˜Â>ܨYù÷øI:e¡™Z{€™«Y«ì· LÖìqàÀ†˜¶î`rgb¸fÞÔ»z²mù* oŸ&òƒ$ÃܬùÀiÊÁå(ñx\úr¨ÇìeøDa@¼)ùLn-GÁª¯ªóÇzhŸ.öïÊܺŸ,Ü)éOþ†vCLE†ÆVüíê¥v³•v³©v3Ö. &×üŒç±°«äþõ›·ÿ‚‚¶ºËI"J“}Þ¾…*aòu®¸lV”ÿ±³™Aq1*ε9k †¸˜t˜±×.4W(TO¸^t*œÌlôº+ó’‹ÐíÃŽBö´CÌH;L*™8V+iRÜ’È€Dë¿£ƒÝJGM;Ô‘úi7íJTv»'áZÀ—Yψ9WåwPù þ»Ö¡Ÿ*N7”ÂOO¾xò?_7^Üendstream endobj 468 0 obj << /Type /Page /Contents 469 0 R /Resources 467 0 R /MediaBox [0 0 595.276 841.89] /Parent 457 0 R >> endobj 470 0 obj << /D [468 0 R /XYZ 72 765.769 null] >> endobj 202 0 obj << /D [468 0 R /XYZ 72 740.862 null] >> endobj 206 0 obj << /D [468 0 R /XYZ 72 325.171 null] >> endobj 467 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F40 380 0 R /F41 387 0 R /F38 300 0 R /F43 400 0 R /F42 388 0 R /F44 466 0 R /F14 379 0 R >> /ProcSet [ /PDF /Text ] >> endobj 473 0 obj << /Length 1849 /Filter /FlateDecode >> stream xÚ­XKã6¾Ï¯èC€‘¶FOKš9mzg° ’ ˜C&ØmsG–´$ÝÞ ÿ=õ¢-·¤È¥]E–ŠõøªXì/ׯÞ|È››4›²¼Yonªì¦Ê“¸nš›u÷c´Š‹Å2M³2Z/š"²ãá¾×n7.–yÞ ÛÅOë¯ß|HË›&nV9ªHn–içuEÖ;ã@:Ï#§[oÆ™"F¯Ãú¸×Lµã~Œs‡ ñhüŽ)Óõ™oû·rjq:5-â¦(àè&.²”Žþ”¤Õ¥yHd`$‡'—uäÁ£¬ŽÆÙ&ò;µH#ÏL?ªÎ±ØWÿü†×>%yÑkY5Ã"cü­èüŠ—µÝ¨VóÞ÷zâsœñ£}b¹­´U}ÿÄ2Vÿ÷`lЭøçŽ÷&«'˦¶Ú¹Ñ­7)ð’HðížÄðàÕý°(W‘2½‚ò²ø÷ ·ÇƒeÎie[\Ù1?)¿‹Ë"_ßeò>ÞÆ·×bž€*ØH`¿5íxú¬Œ“ª‘׎µJ²Ò ?),4itpz¶µMËvšnƒÀ*zÜ™àÀzQçÑ?ÐÖïæú¼6{M§¢PLV`U}±kÑÍ2ƒ'åYupnJÙtÇKʳ€w»–Þìu q‚“‹"ˆÁþYTǨ²†ý"«ÀBÏœä͇¯1ž¬aA4 b:æîΰ°úCϰš×Úf< €÷.¾,«%— –ÕªÊ_XV?PEiÅS¤+‰O[ÇKº?˜Þ/‹ÈÍã„<ÆÉ1‰%†_öâŠò¢Áy5tÊv¼-‡V§*e¦LÜa®Y‰!ˆ˜v´÷*6h c3_)«;†6I(f”ÕL6E")AH@ø—ä$³ÒÄdO‘IŸe©-dA¾å”fèF”xt·‹e™'ÿ£¨Íñï½rúÔ —šWЖ!gY¢•ˆàYùñ\4E’Çy“Åc/í£¡\‰$5o°qáOg ¹¶4¹çÅï¾ÿ’‰ "?ëôº¤ûqÚkî›px±ZEƳĞZØ3X#U$G1­°¢N ,»Ã4õam'²jš 6ÓŒAš,eqt™i3´ý¡“«IªŠ…úüé*Š¥hò ¯ ¼XQÕdp%«(ȸΠRWáEš$ÑTB¯¹ùªŠÞƒ¿¨=Z«W/Ó újZÏ.Ó z^'%páB¶ˆvJöUoµêž˜O:–Q¼HŸöøWZŽåqÿ-G #QÀ¥ .Y¼·d²œíðvb½ƒЍ *§jòA÷#¢@õŸeÿXBÈøŒÛØÏ¶:³_^I †j™5A“ˆöUâz#¦½qÚ2´,oz&ºÓ¤C³Ž“³ÈªA>é±ùÒqwÈ`×ì˜4"éƒ*l)ÞovºïG¹‡ª@ɱî _·4€“Aó9 ó^ÅUÅCT§a £¦šxâƒùÜÐVÏæ-µFJá-/¡1€ZøNó-'ÙÄ%´lF¥žD½ŽÆµù°#ãY‘ÌúŠ€9“ÉÐ ÇÙ¨Ïþ…|mß1ÿ+å=Mâ¢lÎ’ÿ0!›™ÄîŽY@ÚyKv!½ÇÖ°ÕØÍß]’ò úñÙwwc°ò —Æüöî2öË+ΞÆ`¾”8j1 ­P§±dñf¢¹¢cá½u‡‘‹‹¯\˜Áü…Ù_‹`øƒ¹õÐ{wÄĹ•s×Ñ5>NEß^RÙó*¸£BÏ¡òþúÜè2: Að‹ dÞÕh ÂPŠ€’œÁ#¦eo}ëó÷Jñ'%aA#©†’sf;„@ÂLGÝV‡ïþÞWOZÏÚ$ónÏ&½ú¼¦ü àIQð9‹’¬­¢ÀÐmŠÓGÇ›¤w8—" (Ò°x¦&,NÊÑü’Ëœ7S/’ÐÄ_‹ø>T—…=Nr§I§ÿ{[‰\ù,rå)re¤‘£[Ùóá£ç^„N…#RÁ¾—Ñ žiÿ9~nõǧV”PQ͵‹*å¢rÔ²ÃI±Ï úòãö`mpä2ˆ³[*ç[êTþ3Ä}0ÖùÛ³Z/Î#á=/ …hüP"saü¢fCógB6+yþ0 Du/l[z@³›`Rñhš×)ã²Æ«Ýx£zó? Ï£e Óõ:ÈÎêþµHKs`=0u‰™Â#Ð& ×éÙñ·LÑ{¯>¾÷æB0cÛ+Ù:MÈi¹‰G•Öld…‡n,Ü -v üË2ˆ=(¤|Áë ÆÖÃòº ~úa yþ`émŒ+ žë¯ÃT ½Wo‘~‹¾âÎ)”ØbÄV™!\žœºô³ËÆ\‹¯©fø_Öà¿>^1zx#¢@ÏS?êÕ˜¡ùl:-|b?]â.mʸ*¡ÏdM\Ë4–å(÷êýúÕïÙÊendstream endobj 472 0 obj << /Type /Page /Contents 473 0 R /Resources 471 0 R /MediaBox [0 0 595.276 841.89] /Parent 457 0 R >> endobj 474 0 obj << /D [472 0 R /XYZ 72 765.769 null] >> endobj 210 0 obj << /D [472 0 R /XYZ 72 740.862 null] >> endobj 214 0 obj << /D [472 0 R /XYZ 72 584.849 null] >> endobj 218 0 obj << /D [472 0 R /XYZ 72 518.761 null] >> endobj 222 0 obj << /D [472 0 R /XYZ 72 354.073 null] >> endobj 471 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F14 379 0 R /F44 466 0 R /F37 297 0 R /F40 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 477 0 obj << /Length 1943 /Filter /FlateDecode >> stream xÚX[Û6~ϯ0‚Ñcu³¤évMºÁ¶X´Åv€}˜Ú¢m¦²è%åL‚¢ÿ}ϲäq6“}±y9<$Ïå;õúîÅÍÛ¤˜Õq½Ìfw›Y™ÎÊlWu=»k¾šgY­[£»«´Œzî뇫yZEzÝ{Qü·×Þ«-­Ê#Ûñ`?¨±û½êî´Wó$2¾a„­2g%fó?•ÔÒÉ”‘Ãèý¡¿‚ã}ºª²(¾z¸ûñæm¾8]3Íãz±œÍÓ$.Ó%]·)Ò"úã¾mu·íwÜýF¹í‡n÷ÿ/þD³dçE=›'I\)9Ñ(ãûF;Çí—G4ÉíHá‚Ûkýõ%)\Lté¦g±„fç“ýøÐ^Xçµ,\1lˆû{~Á?Y4Ý#úW¬žVi´F;sT8F´ê*‰/âdu‰ 2ÝÆº½ê F®‚îDwý¶HÿÐmkÿþ² ÏÑn L$àÑeZ(ú´Û¨µœˆ=ODZ<òÆîQj…'êqö•ç‰ Çrš»Ö›Þ:”ežÃÈÝÂè©])¶–˨±mÐZqˆQÛZi;­Óm¹Ãa ßYÞít±Ã ÇýºåKæy ²ªgGT­dÇ­î´S½nžn;h7M›‚.î¨Ã¡5k19 ¬ø®¸òþPÒ•ytôxЧ—’ OêíÑ­µ3)C~)¯JGZÌA8\ùyÈè³Їâûþ(-4µçf¤}ïàRíM&ƒ! ÷/Šè=ÀUX·ÑNwkY²q9S-tqíØZK.6ÖI@V#wÒ"ÕO–Cº0ºMŽmä¤ ž%€'Êô—=?Ïìac}tnP‡qpŠ]¹y™gÑÏHczJKšRÚž4Zþ?z}¶ÞÙÊÙ:¾j‘,™Ã”¸ ˜+ %./—r)qÄË4”õŸAë{¿£Â5²^Ž$g¾”f÷­Ä:‡'ÃA9ˆwØûÛs²Åë„c#–uPÞ†#8ëxþŒ¾uúyéòÍ&da5a³¯¨'ØìZ QU­·2Tsvð“Ë_ 5E§È ÞØcpß T&^¸Ü>‹‚ž37ÔÙk!‘÷'„iŠ%y¸àê}I'VJñÊ_ ˆëñfÆOíK·ÃZxóòKÆf}o)4SÅ”ù4Ñiµï /D`RñÑC8´NÀÛéV«ïƒ‡>[(„ÏžȯŸ÷4Xö$Ë 7hqVÏ‚ÕÇ–(ãªHiyg°’€º¿âý¡$2±xjPôdgU5Æíz:Øgð«%liX¨Þ‹ét#ÓAŒÿ$ç˜{2qâ‹Ä³è-òa+Û·5kxŽ@ÊS¾Z µ>¨ ÛµŸ&Ûm´¨Œ„%[rã%P¦*½—Ôô’4I~²KÖÍsXUÇe™ qHʧÄF ú'iÏæ+³10éµ`™éýÿA5$þìR Ü0óHÜøÄ!ó„ÿ Ç/#ŽGx^³c£Ìù²h”*¯¿Ê(Àc'… úîH5Zò\ròßUK/"¿ÅBðδ<„Uú—Õb8?Zà±7¾c0éë:Òñ6–æð¦A9 ³W–ªˆÞô®¿-“˜ÎÎN}Nï>¸ë8|K8ÿ oQ½u€nÙ;ÖqèNJ^Œ( œ'QÊé·t}£€jt1ùœ^ñ F!üÖ8ß_"¥Ø:»…Í“­ågÏø*ôø­àñÛ³ÌÏÿzý¢QhÂ|,¡¶8áO°U'ןû.3657Mxozé1µÃÖ »¢òx¶ ïò ÞÀºŸ¿}{Km|uð_ÃzqF¾ ä?Ê[öÄì“Ýq£«9øôÝãECêM/8õÈðÊ«ø•—Ëg+)·2ŠØ pÿðý?‘™|iâ )ˆ3ÑÂÇ×ÂSó‡•Yš.âeQA’® Hsœzñ÷»ÿ(¤Ç®endstream endobj 476 0 obj << /Type /Page /Contents 477 0 R /Resources 475 0 R /MediaBox [0 0 595.276 841.89] /Parent 457 0 R /Annots [ 479 0 R ] >> endobj 479 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [506.786 172.519 521.505 183.31] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj 478 0 obj << /D [476 0 R /XYZ 72 765.769 null] >> endobj 226 0 obj << /D [476 0 R /XYZ 72 344.285 null] >> endobj 475 0 obj << /Font << /F15 291 0 R /F40 380 0 R /F39 376 0 R /F14 379 0 R >> /ProcSet [ /PDF /Text ] >> endobj 482 0 obj << /Length 1757 /Filter /FlateDecode >> stream xÚ•X_oÛ6ï§0²µØ•-Ë’üÖ+¶a[‚Î@Ò  e&æ*‹IÙí†~÷Ýñ޲l MúdêÈ;Þ¿ßÝÑ׋WoÞO£^>ÊgqoñØËg£<šõÒ8eyÞ[¬îúÊå|^”ÂÚÁ0™$ý_dYêÚ”ƒá¸¿zP›mIÿ î¿õÆÑhšä½áx<Ê“„DTki”£S·Ú8±,å_Ò줙ÏQ ®Eå®…•^Ftľ­—¥*ˆ{#ÝZ¯hýðkå¤y…äû¿é‘ 2ÒÕ¦¢CóycÈêÂs ;X¾é3;Óg'ŒBk‚vÖŠ'ùNרÑ¢°h±,ë9›¶µã¸\,Ö¬FQ*Y±»­øjç´¼d‘©ª06|ß1ÃŽhû7ïÇÉ!­†“©Ï«á$ÍØ‹¿«ÏƒIÖ•'Y÷ãï´ïÖ’æÚ‡ÜóÖ®Å]H/ÁMUÊ)Q*ÜúWÚy7®¯èª-d²ªžˆ,¼ü¯´SèÍFT«a©*æÚ # @ÒX:áô™X¼îz0î³tàïpo©Å DÄqÜwþÂ-žFãã5Ôf#œÒO>¼–´øM"ÈWïýq7cÞu<NÇ)úýà€,ÞDÖDy§7ø¹îõA™ôH™@BŸÚ*§ÍW¼jDmŠŽ€ÊàBPh³ó9„3O˜§]‡[¬®M@¯Ïý›—¥–ŒA’pñxÖ÷öÕÖÑײ± >DáÐ! ¸àÃÉ‘÷Ê­q•öÅÝå—ª²NTsêG–@?·è3.bD¹‹@•¿eáˆÿ-ª±[_ðħ(‰noú•€Ïñˆv€Äå#Nozdøl¥ÈuV–´a™GÌ¢¢•w5¡o$¶JîÏ„µ"pž1¿Iw+A‡o” ¨ÙÖ&”{Éøòå!²ˆ“_8,À²ä MÙÐiÐ-´‹~’…aNQrë èsÈ:€…%†·Öú“¨¾ïŠx Õê A>¬Ò½¤î[\õR0É/è‚d®EIø½ÇLkµ*<«y &cÙÅŽmŠ8^3‹u†`€UTQ#‰§>”°«ˆ ˜…F´¦ÈßÙ\Tè *Da˜Dc¨ñŠo ¿+]ñÉ%á²+Õâ©ÁŽ;I|‡*i¶JM¸he~b©U«§5êm<CÇÉFbŸ[+œªÒ£V0I:t†yK_”@´n; Í ,dz \u¢&Œˆ âY>gWtJ´UÁÀ€ÕgÙ2žÄ£$ËA²nØ, Ž[½JsÜŽôÑH;íHb3¬ÐA€àÖçÕPMR9MFøñŽåt o˜g£YwCÏsEF`ì»]LisÜÎôœI²@ö}ç¬yõ\‚¸‹—u¼ka¨'·rä<µUSáxµlOÆ{BŸsa·sˆ è§ýh‰™ÇIÙ ü'ŒEmŒ¤aC[AówÜÿÁñ®}TáIz§·2rËtSW×ß“d\`6åëÓa‹(|'ñ¹j*¬)µžìì9Ý"ÌSl¶'ã–ªÀ,.-X½á}dõ±ïM|(2I>ʲÌk ¹[¯~^¼úé³?®endstream endobj 481 0 obj << /Type /Page /Contents 482 0 R /Resources 480 0 R /MediaBox [0 0 595.276 841.89] /Parent 484 0 R >> endobj 483 0 obj << /D [481 0 R /XYZ 72 765.769 null] >> endobj 480 0 obj << /Font << /F40 380 0 R /F15 291 0 R >> /ProcSet [ /PDF /Text ] >> endobj 487 0 obj << /Length 2112 /Filter /FlateDecode >> stream xÚ­XÛnãF}Ÿ¯0f7X4ïåi2ñ,$ãÀc I`´È¶Å ÅֲɨÆ`þ}ëFR”4;Y`_ľVWW:U­ïï^]½ ó ßwó8¾¸{¸Hƒ‹4ôÜ,Ï/îÊßœÔKßbç¶ošªy\,Ã4vî¶‘s ³Î³Ú-|g_ëÅw?^½óã‹ÜÍ“ÅyK?sÃ,%i“ ?s:’ ûq3u*+³mõW¥êú…»¥idÁfdŽŒšýb¤Ž>º€þ.1›Ø½Âºu»¢>uÇr¶#£ìË,‘£Àœ­ô·¦¯ÑNYêìÛªA5:žª:ËãüÆÃ+é’çÌf±ŒçO]ÈâV?èV7y€‡~÷bOq³6dyµ ”º¨vªH8¬õy¹ÆÙ80p`¼<'§z#fo –DëÑ7YÖ­L+~Œ×†=jƒ5ªo‚µš/:«¨+Ífºä™½²–‘³•¸\ñg§-ZÄ*@ç£èeæXAxìv V˜­«F ™ €TéËÂ÷õºãÆ“i?êÒ}ýwÁAÉêZ5èyh#е9±–Üøú“Í¿µ<2O—µ Ó ?rÃ( 7R(C:ò¨B¶Þj–„þ±NµñI†¿ûv á–\ør&Yôwâ¼½¹ýþ 7Q#+G¨!ax¥Í1Ä<4Ô¦ª+¢ù™1üÕÏ]«ŠnZÎJ¸‰—‚v”Œ1Xz¿ÆV|³0d•§ÎK7ö±ýH·Ó…Ói‚à6Ž]/MgÆ¢‰Á`9f¼0¶FCzààºäï°ˆã [às™S2§d¦jJý<4ɧfÜ,R4]§7Ÿ9=‹¤//v*—£Rº£RujK°„%ÝAŸÚ“—grã`<à†²€–ºÑ­b앇Lm‰ ò(š™pȨÖì„W e9·ÃèÖ &¤Ž–|vyĪGŽ 'DZ¸Š ˜kÌ”ªÉvª:féR[(„¥Ùœ)šs \µ.…¼ýhN Ð pøé)ú°ú0s¦Ý¨ÚÓŠg®N$î8JÈÃmãñ¶Ñ!Lçƒ8'>/ËV$°Mß &‘Ä7§¦ü‘nÜÓÛ.ù*ÿÛ•¯9e R^>)m4ÆúæVLù×#¾wt}ØÅ×'1£Ær8ÌžÄ"b,ò ·–—ªpÀoKE‹—Ki DÐÙŒ6Â%+e‚{&D°6zƒ³å®ê$.ê1*ÁêkÁ9ÉgÛðĈT«õÑJ­!PEßN%Ð ŸªºtÑšTtýÜ÷¢´«¨Ú rª~ðƒŽ"LÎÂᙳpEi‰£‡®Å¡Èb Ïi(DbÂF4¨°QV¶ WN¤ç*ÚâUóß*KÿÛÛ-K OòŽŒ r§“ØûcÙu`U®É¡¦µ/»}G” &[lAXö5ÕàÐN…V/±JÅ0çèÏócƒâÐÓX×à!G1 C³‚ì±Bj(áêá”éô£¶Ì\åX#2ŒÓ¢t YóºUÕH»íQáMDðÃO+³{tMûxEUÆÕúýÝ»ûÛë_n>¬|×›*|ý\èýÈPó “Ø?Í¡”µPŠtÜy"%¡¼„ÜÁå%“9àK•| ôÆÛÉ0?WfLôí°… © x•\oÜM_ÕÝ’¢5eÖ[,áy_ãߣñåvIÈb,±…„—q8ÿª%ÈIª «0ÿ4‚"¬KžÄ¯âa[ gÉ|£0!Ó ËKDê^µ0ÕQ&Ž2ŸžB8ýï‚D[^D×ÅQ Ž/Â,AuÌÁ9ÛE+Ñ3œÌÎ`Ïöò@1-U¾Y>Ô`Ùî/¹Œiu×·üç-i{Í-bø>¨Új¬_ȃHYDAJ)ûÇ¿DÑ!)×÷©Ô÷8¥>Ò…e%zUˆDÊ-,z§ùU ¾¯£º/2Õ1½†ù¼ðÁô9·P˜$æXý/ QÙƒ…dóà6Ü5ó< 0O9[Iá2†9ÌJ˜c^è‹BÃûŸbئ±UIH ªœÞnúÿ‹¦bJys¯Èy¯vãì€ùï½­¿áw´5}‹fÃö[cYÜôÞþîüÊÛ’»›þJõ{æ6ƒx-ïußߨè[­¸À¹ïٰ̽q–+BÄ—)V«ÚªÞBZùI^jZnøÇ™ï ³ð¡¼{ÿL=" ýS“9Ìé_uµy}Fæ£b'|Ì>Ù0š°í —Aw":îm§ºÞŠ‘o~þå§ë»ëîߣ¼›Ï_6Þ +$#5W«ÑI«ßb:ƒè„‡ãõó¹°ñ¿~ÂW¬ÁüT‰÷E—U#Ÿ>–ưdsnÉI}åç±›ÆP‰%¡ùüÏHàºW×w¯þ^¼ÕLendstream endobj 486 0 obj << /Type /Page /Contents 487 0 R /Resources 485 0 R /MediaBox [0 0 595.276 841.89] /Parent 484 0 R >> endobj 488 0 obj << /D [486 0 R /XYZ 72 765.769 null] >> endobj 230 0 obj << /D [486 0 R /XYZ 72 740.862 null] >> endobj 234 0 obj << /D [486 0 R /XYZ 72 583.984 null] >> endobj 238 0 obj << /D [486 0 R /XYZ 72 558.124 null] >> endobj 485 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F40 380 0 R /F37 297 0 R /F42 388 0 R /F14 379 0 R >> /ProcSet [ /PDF /Text ] >> endobj 491 0 obj << /Length 2790 /Filter /FlateDecode >> stream xÚ­YYÛÈ~÷¯˜7SØÍû˜7Ûkc'HƆ=AdƒCµ$Æ$[Ë&=žüúÔÕ°Sýе†;¾lâÄ)êjÇ]ý°ÙN5{Õ©¶T×ÐÏ2ça襥¾ /ªµÌèápÄ[]mý,uC/…†ïæqL÷y¤É07Ìœc± ðä‰Rëb§vÜî‘þ$×gRÕîu×XNÂÜ®L>Ê”»¢qû£ê¾T¥]‹RkqÏ^Ÿ­¹e²êöÏÎ 9˜ª×ÝÓ& d7òœÁŒû´bǾˆ~Îò(:dÅsöEUn=÷¨3Òy`ŽËb0²‚ÎáyGX¨5Ý®¼A¦€êÃùžç@@ ÒÜÙiÞKŽkµQj渨ڳ˜ïl䛈·;w³‚ĹÇi(EÚý_OÖ-îº^|³!~ªÌ§‚/¡xYÊ:£Ÿ¾€È˜YÖàÈÆ­Êpk T تÝ)‚NÚÛe²“ú*¸*{;g7ä7œ×ºAêÃt¬’KvªQ òÿ ˜ \Ë}Ãñ¾aäèï,®†”«€IUsªá~&Yj79»ë5ÓŠvÇÓöÜZN¥ëBK·2 ܪc£$É˾f(KšK¼ø‘›G‘0”C/yÚ^=òQîä¾-enÄE“1B@'°0ðÓµÁÂF æêžxŒâÈ¿(cÅÝF›¾~â¶pPÌEqã—Uˆ‡uZQœN¤´ª­IŸá3/uÞÍt—ÆI…¬ÊÊÆü’tD'a#ŠèÁÞžÞ·A÷Ö‘.…O•ùßz üÝ‹=å\|¹<¹D@K´»,Nž“¨ìÖU_5w]_ Äí:GEO—¢0ëUÑ~~nìá`i:ª'ÊšÄç®ä’¡³"a@ âç&0îÏç>¤c_nèQõ@Âéñ|…¿@~U5¢·Y3œsêÆ›^P«£'qרÝ2$ º¯ÔžÔ!JCçP}a¼¥3œ®Ñ:g`Mh4M0Vô½jN¨à¸ -Rÿš^"Ó• EØ_Ø=$+Ä%o Û)³Mf𯿠ìÍæO™ˆéRŒã×ï>¼z‰Í|ø©äÕ0h¬­Ðƒ•"ÎmæûÎí^ô ®yµgLžž•5Yš8Ö£DÐý­½AQ†“T'×#¤‡zwŽãƒ' (ü¦NËN(½Pö#…Ì=½©Pld@Ú-ÑA’¬¼$[“8Šœ¿£€û¡ũǨ!­ÖÂÚK|ñEì rÓHx¬v¸Ëš33œä]oÕ퉄Ûÿ,4/\¥¨––ùl¸Å–#%o(¡mx¦î@àÍ“¦PðÛrG†Íó8 H«x‰hm6]#€˜”œEÝo«öÿ!lZø ägƃ9Œ,†ÙÝAàÇ–z%æ ä->íaè8¶¨Á—¢$lm„·ó‹ðз"ÏÜÂ'QM°§®EúZöÁ{lõDIöH™žay ŠúBç7IV‚1Öï®ñ@p2=ïUɺNÕ :šgÚQ, 6„{ ú‡‹Œê¹1œø{$-aP)ã^x_z%Ö´ Ü¡k¼£xÍ~ã —±ÀX½ §¦·4Øê~¦fzÏØåÍv³/)ÿT×2WÆ M Lh¹ÁZI-ˆÜŒá¶¨6Ïe™"À¡9È*% «Ö°­+€ñÓÐ[ÓX/“4ò÷ØÀhɰneûJ¦•z®HYûšxò5Öûoáî·»|P%,883¢º>&6) tËã„6ªþkYë«ñu%©õ½ÇJþäcýUá%¿T”„¬úØ`Ï CÈm¥»ÝМ$ƒKüÕ<‡"‚ÑÄ£*QôŸyCw¹6Pq>F úv<ºŒ€`sRŠ*äªSeäTÝu²â<ˆZ¿â:¢ ó+;¢ ðø¦n–ñ’Ì à|?ˆ¿UÆÚóع߄Ť[ÙØ’Ðs)¼Jæ†Y6¯³ø‰ÍÀüX@$ûí¯½ÑÍÁÕÝá)ˋۻû·Ÿ>¼yÿîãïzüažC¢X* -Ø…,…oõ)]Q‘ S3öròỶC‹ê…Oª²–#{ÿ؃‡…¥œWuñP+&S” ߥÕFʹ3‰×é|‘3=mf1fK¶à€ËXXx‡Ó©®Æ­:Ô,Iœq²æ/ÖnΖÿf¨˜âT‡¢ÛÕdÊðá)W€/ä+èþl0%°X%Ói<¯¶`w†jºpsÅ+ž;Zd¨ÇÍ(ʦ( L×r*< yIŽ‚¦à9lƽ²0à<ÖLÎêc”Äόݪ$–Œ]{÷™êqà‘lZ_p¥A/Kfàà*Œ°%ç©GUŸ.é w¦}¡hß{H˜À ôX±óŠÀ½H¿£ruƒöÐêd¸%þTwcòi~Zpž­£u&…š’vœ³‡0aVœA%qQ‚F¸Ê•f£ŠVN§°ʺ×Ì}²´ðÝU¦Ô¬j’2"ÕpÈ?f,ëg}¬°ÔIÖÅ·Öųé…ï³ZøÄGkiL§ðÏ÷×øõý ¿}…©óFu²a>XHPä—ÈÌ;>–]Œ¬êFxÈ\@úlä,xŠ^ëëo×±ùÍq0h¸/B•³€ÀIU~Aª4J @c¬ÒB[ª´¨[±l¦lbeyÊÎp]6/nâ6’5åKŒç9$µ½”Q-³2Î'fâѵ!å÷°ÚQ¦Íå“yù;°åohû6í¸÷ú—_xÊRf@h F4u˜ l0’°H q 4ÕW´Ç•LY˜:ø—2©0ŠÈÅ÷SIFâY-FkÓ#1ñ"'Ä8™´[‚èþ3¦'Ós§ÛíÛM9£~³úõîã÷LÎ"(ޱËRÄöNí Ù±nÍp‹ËÜШm¹­æþQ›¾-Ef$.ó§‚ö¸°Š­{´>eý\¦Q$®l¹—–ۛƆžíŽÎÇ3ŠÝ®w·½è¼Á꿇üÌ ¶µ½)ófÿÌ£‹@ÏØ\Ðö(ÃïAµ˜õb^Á^ä¼^`&°ñ02½·:ÀÝ[bÂŽD*‘t3YhŒÞ‹vºYâ •IíoÉÁ0Þ¾—> o‡’Ž‘_È ~Å=&Ö'â±i3ÖU¸áÀý’O±)û|•ÍR~ƒ;Þïù9%!‹Ä"uì%Ð@_z`ILƧåTdž¨†œ Sb#î]!XM ÌB‰¬Pl†k5v©ÁÑ,x>CÎ :ô~ VáØ³¯sC¬¯²¦ñÇÁ¤¸·í‚Gûƒ‹ìô[Õ~ƒ£_cú­äO‰ "½æV‚`o„øøfõdD!ÿ„†± ÿÇF7jK“KÀÊߥ> endobj 492 0 obj << /D [490 0 R /XYZ 72 765.769 null] >> endobj 242 0 obj << /D [490 0 R /XYZ 72 438.008 null] >> endobj 246 0 obj << /D [490 0 R /XYZ 72 353.55 null] >> endobj 250 0 obj << /D [490 0 R /XYZ 72 259.839 null] >> endobj 489 0 obj << /Font << /F15 291 0 R /F40 380 0 R /F14 379 0 R /F39 376 0 R >> /ProcSet [ /PDF /Text ] >> endobj 495 0 obj << /Length 2747 /Filter /FlateDecode >> stream xÚµYIÛȾûWôÍà¦ÅtN¶Ç<˜v9ÄÁ š,IsÑT‘ãéüú¼­¸´äØ@’‹X{½õ{ï•^Ý=yþ6©n¢(¬²ìæîpSÄ7E²˪º¹kþ”a¶»¢8 ÞõõÐÕhî[½»MŠ,x½‹‚šqÐh§G·ûÇÝÏßFÙMVy‚‡íon£2LÊ‚Îz=ô½®G3ôveQЩ]\؉«à8 —º}àùƒ2-·îw·°R×jršG†Í–,©wqœWãy£¶ÛÚÇûz ƒ™~ˆ`" w·iU;éžW+9¸50ËG!áÌTyv €xFiæÌóû¯^ÂtRõÌ>ôÓ}0<®øã´ý)×öÏ›‘¿N÷ã5f”ñ…´L»ìèƒí^<äqðî wôú ÚòDÇhÇÝ~yÝç~Àe_„D–ÿ0É,·æ5#^ù<%2Ó`-^ä*I˜+ø.º‡u®M£y‚Å’ÌwZÙ ,¤+9†DD”†Ušn(y=txú½Â½y æ#wåx×AM-M$˜“ãa>†®ˆ¦­'ÛëæñyIp·+aSûTÎA«Ò½gÜôG^åܨ;´0PLZ]§úÔ”%9«)G=ÅkÉ—·WØD’Hq±¨$>øŠÇpÇ O+G! KR*v€Õóbv1<ê$ äé ùØÍÖƒç½öBú¨Ga,ÎÁ)¼…Çš`«ÐћѨ–Èù—Zަ»fP#Ý3E1 Žâ~c>í“DÛÙq°^éì2Ö{25®8ñnºÖqÛ‰ïÖxTŠzÅ3”ÛܪM´Üy¤T\Ö«Nó$≠uHdä8LV89ßSãBHª®Êp€äMÄîpWàde†à vN>!”z¿»f„°éu¢ª(÷6È÷=ž”dÞa’Œa+\§Ú–Gî'ÓŽ·¦çÞ¨‘±9ð·Sgn¬}º¤²hÝv÷ï» nm'?î¹Ï<4dÄ÷ûo™²×cÀ×Üd·WÙbÑÜýˆÎúh@'HuÈòË"àâd/ñžû–‚ޤŸQrë5`i.õ~*{¦p¬[¾5)ÊíµÕˆï ã;n!£{ÑÃð2ïa8ΡÍÿÒ;˜ñôc‘„©÷A ÷泸ÿŒîâqÞª0~ÙÁnÀ>]ƒ}²B&ç,»t¿‹±ìsŠZÒ—úLÉËàÌ80øƒqµõëϨ־~øzbSÒ…w'À"„¿ŠôŽ_’$6Î$£aD¬*D?‡H ´yGjõYá]4(2qÏ9æ"¸ok.8òŽQP[f ‡ˆ5ÄvÏ‘v؆¡•,åLr€@v…¼w?üÄ 6·+Vƒ§XGùâKÃ}Ó[Ý ód7 "8!Ú¨ÿ2\=½òÕOœ–N ÁÀŸ–HU[Çý9w‰‚§2¤¼ç¤ †Zv5ŠI)&LèÔÂÓ”G†‘S'ØÂÀ¤ûr2%jðU½àÛ,vΠ>Ò}Ã}™(ó±ñùÛt¿˜V\EaQ¦@8=À ö^½xau«•Ó—†Xa’fóbÒðúú‚øF2¬$¯Â(®6ªng³‡’\ô޵1Hc§ 0G`¶.³»8£jÃgÿ^‰c<^èÚá|^²y“Ä+ÄüpésBA/Ûå"C}Zs¦4$Éå™Ù/ {ØgµåP¤ž”è¶ð’CËå\U¬À;FT98†U&ºßyK‡%v’5\"ÒÙÔo †QÁïe¬0ÖàœÉG9ÕîÇÁÚa:ž¤:¯*N_©¬En®qK6Mþ pªxe×è³¼1’pÁ¤äŠ$=NK(£—­ΪĻœÔvÇÙ)n0rC·œÔ7Û{\z_ó©gçåÂ2¥ìs~"ÌÉæ+—ÔX{œ%mæˆôBœ4ÝF èĹTÙQqéÈÜ`?~•&Ï3õéÍP e~7¼À’(üÜB ¿Dþ:¿¸ÿžn¹ 'Š“0++ÙêÁÒªù~Ë!>v†q £Ùÿ™ÑõËVüå=ZëKy ’¤hû˜:¯EO2 r?_µ¼s}›MnýLÆÙÖ‚ã,Y½ã,ãO³oáÔW²w®¾0;¯ÛIj³ì‘çнdÕë»ãÍÝ ç÷ÿ;`zÀa’Í@±‹4ý*’àYA±­±dý–ôþg¾ yö:ÿÜ>©+YH8©ùQCô,3„<¸R†ŽJ…(øƒðåEžF;Õp¸\¨²°È¢›Û< ³}BÇ%N=ys÷äß¡Hâ> endobj 496 0 obj << /D [494 0 R /XYZ 72 765.769 null] >> endobj 254 0 obj << /D [494 0 R /XYZ 72 740.862 null] >> endobj 258 0 obj << /D [494 0 R /XYZ 72 589.041 null] >> endobj 262 0 obj << /D [494 0 R /XYZ 72 494.947 null] >> endobj 266 0 obj << /D [494 0 R /XYZ 72 388.899 null] >> endobj 493 0 obj << /Font << /F39 376 0 R /F15 291 0 R /F40 380 0 R /F14 379 0 R >> /ProcSet [ /PDF /Text ] >> endobj 499 0 obj << /Length 3359 /Filter /FlateDecode >> stream xÚ­YI“Û6¾çWtÕB•»iîË\¦l'®tj-oâ,L³âæawS&7e…U]ß<´¿õæ.Ž£(xØÔI0lîÒ¢ ¾6¿>üøú}œßÔa]¤¸,º¹Kâ°Š+Zõn8n’*Ø*+Ò40ÿ³`ÔʽÚv_˜Þ ÇS§7wY–?GÍ£ê[؃ÚÞ¹·û¼IÊ@LÝÁe€Æ¿­§É ; Óþ€kœý»\6[. ÜÖYvs×a”ÆtãOQ\^r…xæÎwZÓïáØ²"¾’² úÁqã ]Q:v:ø’£Óí-6ë@É`¢pg««@?:Óâ©Ò…’Á½Ì⳪·D1ìtã:МIãr”µfÛi&¹—tƒj…r¡ŸþýÙE½ÅqXç9ñhz’깊Ò!r} ‘búVó9Z<™GðÆMÇ–’ŽS°šíäºä£#dÅ‚¬òª$Yáþ¸Í0uí·|6”Þ4Ò¢[ì¼ùèQÈ´“óým²bÐC¯ýTdõNá´G¼”Ú {<n^Zß[Z_VV_i}r¥"cg*àî÷›¡ëØ åÌÐ3u€{œqu4ÿ¥Rš÷¡Q5e<tÏ›)Ù«3‹Z±¯ºÎrSñD«ÇÅ‹Ô+u¾ü£OeÝ ±÷ÓõXåÿ4 +Ú’ý€Éf)(è?&í5ÂSÉ4|HQ^sbˆ]ùŸ(î"<¼ûøúþ#;Ü_£«_Lßàæ5¹ õWî‘„à_¬®Ž„ )Ô!ÚåfXÞ`°ã5­;Õï'µ—MŽêt¢„Cä¼@\̈²ÃÙÒM§F9h`â»W¯@ÞY”‹¿ÂqWTÕ²~´Dë`Ç”Ïft“êX‰¦6Nõþ«ÄLÎG+g§îÂ8tDÒ±ðAüEÝ“<#+LÛ%®é¾µÜ= q~9ºSÏM<Èzâˆ]œZ_sÍŠ ÏÁБ|?³ãÁÕºVBA¬7²]­uCñ’<(¸uÿÝ?¹ñ)J³Nc”,Ò2øahUÑ…ÐPõ1xŸ­XÒ¼º³-ƒÝño„PÒïýYü€ãñOþ¤<:v¾L;iÞ„í¬|!ÐYY–ΖÊÀþ§(‰þvÕþ¨˜p5ró1Ä3¸ýïÝÔî˜ÇÈE)N…s…7lÑ»–RKHj,3’iBï88óy“çô@cЃÉM£,kÅÒºátÔü¾JP‡A#»¶YO´Xw#¡½Å¹D/ƒÉj¿½ÖíV58ö;B|Ixä‘…ÛÉòÎÇXë¥dÈ <´’<ì8FÀ€¹ßÙÈ‹;‰9¬Å!neÙÈsyµO`;•üp{ ?N¢ÎÖ…‹¥IXf uãH°îƺ‚å‹ ·¾¹ENN6Zy -Å™GîtFÀ(Oä·0⺆¨Rq‡0í’Dòj|0ÍpËvžå fˆŸN÷ë=2 Ûi™Î¢‚A¶ýîK¯Ž¦aê}?ëå9\ðƒ`Õ;%ú¹‡Ê£°"³Ž+%öÓ‰í§\–yìô¯ßgg(<KØ]à50{)ñ¤‚ T2bí-ïìy…­-ç @$;Šqò†‚=F£åvo>ÞÛÕ«”#úB¶ÓÙ«é–I¯#pÁÉã2 Ë8=ÆK.±Uþ9“y•žIrõP9áiyÅ!j}±Nyx~IĬ€$ p8a˜Oòà=Þ˜œ¤f|sÕÂNÓs_›1ncxë–»d uêIF †nå¡€»@øõv Hâ‘ö'Õú¡6¹'‰.v³üLróÙ*G¸"‹Ù²@Ý^ ¶¨Ã<)¾^°h:™çv~æô†›V ¼wcÐg×À«FË"zì å&z”ëÆÜã!$Æß/Ï{/'ý§7OÜ‚ÕÚF-ZÍâÙ¡H6uQvöÖsJÔ ›8ªq[Ñ^'æ”D÷"Å)Óî-é¥ÝÄÌè¨(O$ÌÜŒèß4vÚ+ZÁßÃKïY‚ˆ!¼S¤£å2'Ú‹ªÅHa€9Ê% `gÔ°ð`ì8™·X©<ü‘/8ÃKt†„(,¸a„DQ$ç1(ˆ%¦IëŒE4qµu*Á!à’9ºq¡ˆ"6%;-X?Ðy XT{î½´dÇÿus`%áÜ>•µE;B‚ç_I&¼Ù?“,žã?Mëå]ÇŽdFzmî–Aj°×Ý—+o€âð8tÆHIi-B„ƨ;£/cD˜VÈþݳ³xB¨FÒ)bà·¼JñŒí„‰°7(³l–4HÙmÛ¦ hôú+w›Æ^_«¬c^%«ºöåÁ¿~jtÇþ>k ÈŽrPlÙÉ tÃ&¡0=h+4ÄW–›¤]å†DÚåÅ胣`î9¶Öq{Їɝ[qh°š-ß÷ ÏÄÂÄ|³>ðÆµÜ "õvÚ3aÔ³­[¦¨½2=q €¶ÎyS‚þCÓDÀðÀ½ä›¸1ÖšˆÎø[g €þâiøÔ€€IËËÉ`#u³¥Ë[·WÒ#8P5“½RÁ™k Cï t;lˆTHœ—Ïx^…qVü?°™ŽL,ûþI0©ß qXœGE¾WôR )®F=ôÜ?‘ÔKoNŠ(ÜñjÅ¥gª3Zp/0Ç%»('ê#­B€¾åÛ+ˆùIIÙìêoWJE·˜“ãr íßó’;©¦™ kÔ/FM.8ä™l6ŒŒ,rXÎ#®‚"å¨üud>9vôÓ â=ZÐ#å™HqÜ*îžÅN$|P=d›ÇHí­lÿæ„åXrÉ4à_Þ0Ñ JC8ÍùNÜ'g4¿“7Ü^«EN¾hp¤& Fmÿ»”§—Kž^qžžÆùUÛ@°uPRÃÀTj.tùºN«ºù U 1£¹X"Zm'P1Õ‚ø_ÀLý^*ûNóû¡¼Ïqü ãV(,Ã0y)Éy<.¹6:cƒ4[­kYÐóÆuË Ï#—IÓ“ ÀCÁרü5`çÌиêdp0X] €nù+ªµ‹•^ÙyCÃÕÞP9:_òZ*Üh¼qE¸ôpª„æQ]¶ŒùY^ç´scÌçycÚrEØg‡k¾.ƒŸJTçsc~~k°¶€÷|¼½L'¸?‰Î3èúÁšô”°¹%Þ´”G÷ü­A /V3á" 6JK¡¢x´d—£x˜ó#ž‘ Z‡o_ <Œìsª¶²ˆx %-SŽŠÊ®¹/Êæ30£ô¹ÔSb©GP N_à ö8í’Î|òÑð ”J]߇{ªÍç’xÁÞ’àÂÜ\ÓŒœ}2W/L‚ì•»•/BÀ¼b¤B‰|&ŠçÏDT æ†=(\8­3ÛQA>myhÁL8¨d!ÿé'ÝLYy)Ç@¿aç<Ô µ½ÚÒ""o¸î ×°®m^½Bç Èe/ù•/‰Y¾»Xù£ôWº#I ™-PÐ!ù…ÎýÏ?qƒB VIe”•Ïó`ß4Ü3<4Êtjk:Д¼Zx¬.è쨆‘¾wBkêÅG«:´‹ŠŠË—L®@*ÅYúøÃ/ÍÜ\Ý”þ0çq+‡‚ÔsžG¦ˆ6Ï9¸Ü•ÁíúöY¾‘&^Áø y³ñøn®4àD…d1…VêÓTÆôO4ÙF/–JŸêv:‘¾<ØÛ)ùÐñÂö|.åÚsã»Z±Ê€Í$Ïþâ7Û0¸Ö”T® naÉ€¬¼çKeB>…ædöˆ==0 »'ÒŠñ¤i£'|¬˜W£8kIpË9ÁE:Ö„c5¹ZßÞ©Ž¿n±q¯¤€w51œK“’LqúCÕhl‰ÃÓGúSÍ_`ÈL$é’”"’s)o’¬Ê{±OzŽ'àbíXt°µä€8xßÃ{ÆBÅ1¸øÄdu˜Gù¯ÏØþQ›“¯1™DQü¼¬Òª šùûâòծà õœl즾Añ+ºùlÏ{¶d$£:™Ö/KM/¼ÍÏËÑg5$Da) ‰¾SË×ZŒ²ü™v)MÿÔ¸a»¤¥#Ï ÌÕ걓8 K71G¸ÊkœUùHYdÏ`×ko«Z7Jø¥g»Ÿ¿`Š¿‡t ‚ŸÅŒ7QobÁá‹ÄYˆI…EžšÔaUñgǤơo¾øæ}3Çendstream endobj 498 0 obj << /Type /Page /Contents 499 0 R /Resources 497 0 R /MediaBox [0 0 595.276 841.89] /Parent 484 0 R >> endobj 500 0 obj << /D [498 0 R /XYZ 72 765.769 null] >> endobj 270 0 obj << /D [498 0 R /XYZ 72 740.862 null] >> endobj 274 0 obj << /D [498 0 R /XYZ 72 500.191 null] >> endobj 497 0 obj << /Font << /F37 297 0 R /F15 291 0 R /F14 379 0 R /F44 466 0 R >> /ProcSet [ /PDF /Text ] >> endobj 503 0 obj << /Length 1082 /Filter /FlateDecode >> stream xÚuVIsÓJ¾çWø†\ÄŠ–Ñv|I=xPE¥Š2p€wËc{@£!ÿžÞä%$'õ6=½|Ý£ÛõÕÍ›8[Ta•§‹õnQæa¥Ô¢H£°¬ªÅzû5¸ëÛeRí—«4J‚(,Hgjc¡ÎlY¥ù³3l1h_£þ`FÖôÈÁ‘"0Ž%þ`äPß4¤~°ÝžEd¨År3Iƒ;s#7sî‘9×o¦Ñs »Þ]÷`·r£ÓÝ^È~·üý~±Š¥¿Šã°Ê2J_Cckímßár¥Ò2¸ïðXœá1úr@´½j´ûÎ~‹RUëcó,ÖÛ­%WÌÖº{Ûñ7‰"u$â`DxÑà¿÷¶ƒÌ!ä›7î±{iQ†y‘."Šüƒ­{¶9ïpR†I¬ÄDw[öxï6ö7×@EyX–Åe0Þ4•DÀÌ ®q@eÁýÇÛÙ¦ç¯m‡Æ´hcŽ8wqGþAR øËL•aå8,WØÑZjˆšâ{¦E·Æpo/J)*&S”¨ˆJ¨¯*(!´*ͳbe›iÏÞþÑ‹Œw¤4F^ac½o°nEL£f@­"&gVrK ¶¢z:, ûÎÃQpԠ홫ûîdÛÙSÛ@÷-J2¦,IJÿŸ“u³ÏN|pßzçyŠA‚½MAÀœ–Óº‘H7ÜèóvT‡H*S†F{åg0KTðå`© yôWAQÖj=2#W0³Ó£7G,/àè2ZÌW¦ ‚¯×`U’ŽqxµîjññWQÁRF´þ ;¦Æ rÏkª$û"-n,o§4 Ú9^ ¹)u­G@½nXm-.¤â´ Y ßa.âMoWñ‚·ŸÞÑöR)¢Æ™G šwüÙ¨m)`x„#h±·³Ýe•Å×gÄœqç3ÉÁÂÓL!Ÿf_Rif«²9¼¸wà‰œ4½’ ‡jx¬U4#·â=~ÍB~O” H!‚F㸇¢8­ˆÃHZ¤s§G~À‚RœäŒ" Õ.·NRîfv‹¹zal‹+RåYð_Ú+r…š@žÁ¬ ã•> endobj 504 0 obj << /D [502 0 R /XYZ 72 765.769 null] >> endobj 501 0 obj << /Font << /F15 291 0 R /F44 466 0 R >> /ProcSet [ /PDF /Text ] >> endobj 505 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚuÑÁJÃ@àY- …\{ë‚y9æ:þ«‚IØ,Ìðí¿ ìÉñQ–I*s”µ2·r—ñŽ­ÏRõ·[^æœ\‹Í89GÊI~!O÷œ,/OéJn0²æ|%ª„cô ZQ æDŸZø(Iï0mãµÒ ^`Ó†Cý´öØ´è`QPDa̺ˆKšt1®h:€¨¦´ ÓÐfh®‡½)†°x¦foƒˆ¿ú×a˜’¢ÊýqãC£¤êõŸû |–ó¶™Âýendstream endobj 506 0 obj << /Length 204 /Filter /FlateDecode >> stream xڕϱ ‚pÇñŸGØÚz/P%ƒ\Ì ‡ ¦†hªÆ ¢ÖêÉÂGñ¬;!š[>Ãýáß Â7fGÜ÷9qðΧ Cz:©_¶J22+†df2&“Íùr¾îÉ$‹ ûdR^ûìm(Kˆó&¬wi£SD\´ÜÐx¢„UY/ jÀ­%D\pÇ}±`Çî_š5ÕüÅ¸Fwè¶¶îmkAO[ºZ5Ö¾£”¢f+×ú‡Þ½zhšÑ’>¬V?Hendstream endobj 507 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ32Õ3°T0P0b#cc…C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿ?Dì?˜?Ðm„XÍåêÉÈÅyAÀendstream endobj 508 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚ± Â0†O:né#ô^@ÓØ”âT¨Ì èä Nêè è&m-ÒGpì jÒ+ÒYá¿ËÝÿ'™NÒ”"Jh,IÍH):J¼ Š­‘J¸r8c®QlIÅ(–VF¡Wt»ÞO(òõœ$Š‚v’¢=ê‚*Þ§µ Li™AX<À70jÁ{ºã. @ëD[ ,Ë®-ë™Ù‡aͬ ³ü ÌÛ±ùÙÌ~£Û^°7ߺ}õdÿœ…sõÍlŒ³wÿ€ ü¥ŸTÕendstream endobj 466 0 obj << /Type /Font /Subtype /Type3 /Name /F44 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ 4 -1 77 57 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 77 /LastChar 111 /Widths 509 0 R /Encoding 510 0 R /CharProcs 511 0 R >> endobj 509 0 obj [82.11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49.08 0 0 0 0 0 25.09 0 0 0 0 0 52.77 ] endobj 510 0 obj << /Type /Encoding /Differences [77/a77 78/.notdef 99/a99 100/.notdef 105/a105 106/.notdef 111/a111] >> endobj 511 0 obj << /a77 505 0 R /a99 506 0 R /a105 507 0 R /a111 508 0 R >> endobj 512 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ37Ö35V0P0QÐ52S0µR† )†\…\¦&@aS¨Tr.—“'—~¸‚© —¾‡‚)—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Býø&ÿÿA¥ r\®ž\\¿í4 endstream endobj 513 0 obj << /Length 289 /Filter /FlateDecode >> stream xÚmÑ;NÄ0à‰¶Xiš!>Ùˆ@è,-‹D $¨(ÕBI‚Ú9ZŽ’D‹(ÃÌzìˆGë³ßOšúè¸2sÊÏYeNóPá365Ï72•ýn[,oMScyÉ«X¶WæõåíËíõ¹©°Ü™;>æÛõk~€ò¨~0y°#¨\53 geS¯QùUô¢‚4 ŬQQˆŠVþ ;kì¤Q‘í¢BܤQp^£¬ð}Qò6jtºKõI!›ÑWÒ{ÑeƒV4ÛYå“F¹ÝAƒj-}TuÒ£ßâ´}I_4ü›…¢¥iIJ]$%9¯­â&ýU(Ú-â·­”Ê·õüï}Òôx/Z¼Áo)Ñ endstream endobj 514 0 obj << /Length 274 /Filter /FlateDecode >> stream xÚu‘±N„@†‡\A2 À¼€‘P‘œg"…‰Væ*µ´Ðh vÂ#Pnqaœáä0 |ËÌÎìþÿéeYJ*Ù•\¬¥XK^ÊkÆœMå:›R/I9y’¼àäÎâœÔ÷òõùýÆÉæáFì+Ï™¤;®·BDî O¬ÎSU•Ú#GMg¬:Š{c³GȪ,u°mQx˜ÞaŽÅ-¬¬‰3[¡Æà—­çjb¨´`tä02þK;–Bm«3l Íšœ£Bš5û—ÖdIG Kš#û%ísJh<%4Âh³oë`¬«Ü¼Æ^ä`•é÷YídEç%bj¸U:Ž3ÒÆqâ&Ä·5?ò¶ý·Ïendstream endobj 515 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚUÏ; Â@à‘ir„ èæ%$ >À‚Vb¥–ŠÖ›Îkå(9BÊ‹ëÄMŠÀÏ·ðÏ3i> 3 )§iDó˜’Œ®>0¹ )ÉÝärÇeòHiŒrË5ÊbG¯çû†r¹_Q„rM§ˆÂ3kPLlÃúÖð#mºZ±¶†‡ð¾ƒ-ø¦3p¶ \š>j£Ùt=’cÙ l5²OùϧœôÎÒ©KÏ Ö·‚— þ*»Qõ¢;Eu›7¼ð§pSàêÆw¿endstream endobj 516 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚeбNÃ@ `W"yÉ#Ä/—S/R;TŠD$˜02Á|~´ãMò;„—èX¾Á–ìßvîÒî¨%ÛÒ…%×Q·¥‹GÜ8­¶ÔíæÖóî{4´qhn´Ž¦¿¥÷ÏW4û»+²hôh©}Âþ@Ð µüB\Ϭþ3ë´Pe> stream xÚmÎ=jÃ@à'T¦QënçÎj‘V%°ˆŠ@R¥®œ”.lìz÷hs”=‚J›±R%¸ù˜˜yuýäZ.¹å•ãºájÍ_ŽŽT5:,¹j7ûm²\5d_tLvxåóéòMvó¶eG¶çOÇ历žb& OI»« èb!ðb)t’%­ó’,&¥˜¹*F f„G7byð3ñiFþ“%°ˆJ;ų›ÆÓ÷T¿¤û £¹éy wú×\éendstream endobj 518 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚmÏ¿jÃ0ð  ·èt/ÐÊâ%‚4…z(´S‡Ò)í˜!!å-c^ÉÐñ#ºd0VïâFN¡â㇬?è³-o³9eTÒMN…¥bNï9nÑZ^̨(Çõ—š²Í/£©i¿ûü@³|º£ÍŠ^sÊÞ°ZðP“†ÿ×Núk›Épmý¢‰è¾‚|òR`uçY׸A®ë^«’a2íAd"ž@Çtw‘ãG[)å„ÑFŠG§ÔÍÅٯdzªõu4›ÍeÕY ÛÁ/øWz'Í;n|¨¼¯ðC—®endstream endobj 519 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚmÎ1NÄ0Ð¥ˆ4à¹8ViSYZ‰HPQ * ¤Xµ}4ÅGp™"Z3¢yÍHÿÏ8^Û™{žùÊò8ñpà7Kg&Yö<Ì¿—×:.džx˜ÈÜÉšÌrÏ_ŸßïdŽ7lÉœøÙrÿBˉ•” Ж Vá’Šð¡K(èRsÚJ· jg…JZˆ.CW|p¹)ðÙmð¥äŠ„È€’jCü‡ð—&ø€6 ]òQ:\”x$^ï¬Rß–=µFè  Û…é£`Ïendstream endobj 520 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚuÐ=nÂ0`¢ ‘ÞÂò.@M !ê)¤*µSÄÔ22€`m²uä\%#WˆÄ22D¼¾g§„ÁØÖ'K¶ÞßhôôàŸÇ!†/øÀø:äMþß¾Vd >ù¨?€ÊÞp»Ù-A%ïS @¥8ç` ÈRìñú\*Y*Ö?×l|¼ˆ'1?tR+ÿqZýJô Q‚]ãÕ®gl$ÚòîÎÑú’顾±¶+»ù½¥]2VÖžÕGM»Í­é¾6þÕƒÕ£¦“±îÜWzÔRù’°‰u}×®O÷¯|Àu‡¤endstream endobj 521 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚmбJÄ@€á‘ Óä2/ ›Èï@ œ'˜BÐê ±ò®´P´NÀÂÇðUrø"ël™"dœM4›áçƒÝ-vvÍò$]PJgtœQ~Jù‚¶>£1²™R¾OŸpU¢Þ1¨¯euyC¯/o;Ô«ÛKÊP¯é>£ôË5AÔÀÿ/Äm0™ë‚Å\¬æ6Aݳ÷ïø“ÜØ«VlU'ºÈkň›¨ëAð©©î xª=(™r¡bÌþi¡úvÞ½“ÁùkðÝÊà“20«æ×8®½ ˆÕÈ£ŠúáŸÎ”¼*ñÚ“Šendstream endobj 522 0 obj << /Length 207 /Filter /FlateDecode >> stream xڕαŠÂ@à_,¦ÙGȼ€n‰"HêÁ¥88+‹ã*µT´ ˜Îײó5|„½.E07»¬øš˜áÇý$æGÜ‹x0àdÌëˆö'†<|nV[šæd–'d>%&“ññpÚ™~Ï8"3矈Ã_Êç LœNã”èzh=$«e¿Ã[“‰æ*/îP7 }©¨Vª[…8µ¨2+ww©â\[SzïU«ûÐ¥rêÀvªL¤¢€¶”­ þ¬ïá¥}ä´ _R’endstream endobj 523 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚÐ1NÃ0`W*½%7 ïà¤(T]ˆT‚„¤21 ¦–‘‘8Gà*•z!l¬ºÿ‹pŽõ)ò{Îïx2;*'œóa9åã’˯ z ¼æx¦'¡¶¼§¹!}&Ò(6—üôø|Gz¾8ã‚tÍ7ç·djVJµ Úc±–‚ô¨T>b;àRÉ×ÑíVÖ=h@6•p*¼ / pBŸ Y Œ#.Fú@éUä¯ß]|¤ùfô$ §}öGñxG¬ÿ@Ž—g±Ëz ìÃ]й¡+ÚHvn±endstream endobj 524 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ32Ñ33V0P°PÐ5T06P0µPH1ä*ä22 ¹–™ä\.'O.ýp#C.} 0—¾§¯BIQi*—¾S€³PÔE!¨'–ËÓEýóbÿBöô„ê!èý‡  b„" b†  ÄA@ˆ‚~€<á2þð úDÇüo?Bý@ÔDõóìèÈ(æ \®ž\\{Udendstream endobj 525 0 obj << /Length 280 /Filter /FlateDecode >> stream xÚeÐ1JÄ@à?¤L3G˜wMb„ÄfÖL!he±X©¥…¢ÝBÆ“Øx…t–N9B˜ø&‰»¨ð¾÷ç…dRV‡ÇG”QI9U9ÝåâQ”—'ÓÛ±¬EzMe!Òs®EZ_ÐóÓ˽H——§”‹tE뜲Q¯(rÒ‰Gã¡= ‡×a0È·­m¶V·PêÝèVwX¨êÓ¨ 0°t0Xl´ƒê'Y(·Ó˜žŸçãÖ×´³ðK¼ÀÁ0©e™±þ+^àD³ kªMŠ‚€x/êxf–Å ‰W&™Ô+¾Âê?ñBâ{¹±v›Ü¬øË†Ÿœ8~MÙ!±ã¹bþl>¡ÄY-®Ä7†©ñendstream endobj 526 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚ]Ï?JÄ@ð/¤¼fŽ0ï: Ù%¦ÙÀº‚)­,+Ýr E»…Ä“ð^!GH9B˜ñÍ&âŸbø=¾˜ï-óÓ²à” >ÉxYp~Æ=Ò¢”0弜nî÷´®ÉÜò¢$s)1™úŠŸŸ^vdÖ×眑Ùð6ãôŽê Gj‡ÆÊ¿zßB½½M­?ÚªÇJ{è€;RЕ~1Êk™l#ôBÀ’Ãwa‚üòÉ£@+`&úˆgœLª ¸#‰Ó­”OF-ç?v5c…Ä ÄŸCX<ò=ÔÔ*–@5ÝÐuóy%endstream endobj 527 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚMαjÃ@ àßÜ`ÐâG°^ ½3q!žÒâ!ÐNJ§¤c†„d¶ÍâGðèÁœ"Ÿ -œ„¤¿¬^܆W¼*øÕñzÃç‚®T:žßºZ:§ mk²Ÿ\:²-“­|¿=~Ènß߸ »ã¯‚Ý7Õ;²€`D:ýå|ŸŽh:3AZAL@"é¤d‘QÉ#ƒâ1ÒDú¤"JÐÝdÓB»3ƒâ#}Óêù™Öwø. È{=ãÅ 1²´¯éƒž‚jendstream endobj 528 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚMбNÃ0à³2DºÅÐ{°)-S¤R$2 ÁÔ1ÑŽ ‘»ñ¼J$^$ˆ0›+Ç¥ ÄÒ¯o¸;ùN.Ïí’,ÐQqFsK§KÚø„åBª–æåØzxÄUfCåÍ•ÔÑÔ×ôòüºC³º¹ Íšî ²÷X¯ t“E€ÊkÞƒ‹·ðÖuÚCàØgQy–!õ#vÙïŸù÷ÁÏÁN“§‰“:‚”„ÉY€Ù ÄViÚ>®u-ô7{Å ÊBpA6G9˜¹?¤ ü” O¿Yj7™§Æ^'ŸÓ?ìû ^Öx‹¿–Óendstream endobj 529 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚUÍ1‚@Ð%$Ópæºl\H)L´²0Vji¡ÑÎnâU輆7pKŠ #»4I^ñ~FŠñlŠ!Îq$PF8‰ð,à2Ds“Eל®æÀ÷(Càë6žoðq^€§Û% à†GÈ3dš¥K)>¤ý÷¯jŸXø £Ø×Å¥vé¨N”£ëäËka…¥@–²ÓÁú¸–f€gÑCjƒ23ó V9ìà3kSendstream endobj 530 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚ=α Â0à …[|„Þ hR[P§@­`A'qRGE7ióh}”>BÇ%çY‹äþ„»$fšÄdhN“ˆCñ‚.Þ1žI(íòws¾aš£>P> stream xÚeÎ1‚@Ð1$Ópæº, j# b"…‰VÆJ--4Úåh…Ä PRqÖeµ0™×üIæO_öÆCòhD]Iý€‚í%žÐ9ô(ôfwÄ8E±&?D1çEº Ëùz@/§$Q$´‘äm1M °*[©œêÇ5J-2 í¡5M“±¼•Òù‚Ëxi¶Q·ÕÆ_½+Qé(YT¸ ¿0awˆò¸Eγ§)¸ƒûù.ÎR\á´a`¾endstream endobj 532 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚEϱNÃ0à‹2DºÅà{p¬4 ,µTŠD$˜02´j·* êÀkYâE²±1à!ª97U¸áþ“þÓ•ú¼,(§ŠÎ4•%ô¢q…³ŠÃœŠËqóü†‹ÕÍ*T7£ªoi³Þ¾¢ZÜ]‘Fµ¤GMùÖKq‚ip möåÁX±÷ÐZñ•ÙÀÎÙp²l·>*}ºA:ÖGÌhŸN¶}z`íhvˆvÜ7É­ÉI~>)}stuÿçG!@ûí¸!°íþ÷§>ãSá=t Ð^×xðÞz¦endstream endobj 533 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚE̱NÃ0ÐkyˆôÿAý~«‘Z–F*E":TL´cl ¿Õßð'xôÙ8.U—ó¤{õn]ßš;®xÆ7†ëOç¼3ôFÓ1¬8ܼhÙR¹I•Ùö‰?Þ?÷T.ŸïÙP¹â­áê…Úã ŠØK/£-†âשAý8´Êxÿ¨ÐiWŒÈÐ5N„¡±üŽ™Ó˜é3§yáDÄie&œ)NTA#1X }t@Ls8~; ‰Pi¬A-­éd"endstream endobj 534 0 obj << /Length 260 /Filter /FlateDecode >> stream xÚuбNÄ0 PW*yÉÿ´Õ©Wº\¤ãè€Ó ˆ @°U4ˆß ’µl‘ˆ0.w=1@†<Ù‘-ÇóÙA]QA5í—4¯ivH×%ÞaÕH² Y³y¹ºÅe‹ùšªóIcÞžÒÃýã æË³#*1_ÑEIÅ%¶+röØÉÝÛ”0–]ö$b§^ð3{õºQgñÇE“ÀþIö¾SA4¾Ó!eÐ>ê!ýåÂV0“>›Œ ¬”nu“*‚¶2—  e>û‡¶:ÀB=ììþ1üÖ É }Fýد©(Ÿ™0oŸQÆÍ̲¢Œ]Ç]1()ÃãÏñí’endstream endobj 535 0 obj << /Length 259 /Filter /FlateDecode >> stream xÚ]бNÃ0à‹2DºÅà{HR’– K¥Hd@‚‰1ÑŽ ؉Ô×ò£tc͘!ªù/n¥Š ß`ßýwN5?ŸWRÈBÎÊ…Ô…\\ʺä7®f8-¤®W/¯¼l8”jÆù-Î9oîäãýsÃùòþZJÎWòTJñÌÍJÈ‘~Á“¡4ôd}ö;óf;PëÍj³^Áí¾úeÕIèFÛ'†IrÑ]ݵQÍö:Ih?©ˆB*ÚOµÑþ¿.ºC/&hB€íVuo"3™Œ­?¼Rí(õª™Ö<®¬«Õu\á7=ôV#©íPïQŽ`”L,&ñMÃüå"‘£endstream endobj 536 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚ}Ž;jÃ@†áB0ްsdWHyU ~€UìÊ…I•¤LacwBøb:ŠŽ r áÉlb·f˜¯˜ù˜ùK÷øR°ã'~ȹ|æâ•¿rÚQé8Vñö¿ùü¡iEvÃ¥#»Ô1Ùêûã7ÙéjÆ9Ù9osvTÍa0E&­‡‘®—¾ÆI C¢è“€¬K˜€×F1jë ˜ Š´W˜îŽ‘ý×u4êhŒj$A4¤ñevCoÎ"×m£aÔö—; Äo´¨hM¿.GYéendstream endobj 537 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚMÍ1 Â@Бir„¸Ù$‚VBŒà‚Vb¥–‚ŠÖñ&^Å£xË-‚ëd7,ÞÀŸøÅd˜Ž)%¥x :(¼`žqNÛè.û–å†ò å‚×(õ’n×ûe¹š‘BYÑ–?w¨+€˜%L°)«Ù b1Ì6 XÍlëià, ¿¯Þž ^Π÷p¢8qÐU'Aã‰ÀxõÖZÚŽÁ¹Æ5þ¦œbendstream endobj 538 0 obj << /Length 294 /Filter /FlateDecode >> stream xÚMÁJÃ@Eo˜E`Δf~@“Ú+UÁ,]¹WêÒ…¢à¢4óiù” Ë,BŸ÷M 3òÞ}™{ßâü¤Zùʯüñ©_ò,ýË̾ÛÅœÅÊ/Ïç7»ilùàs[Þ°lËæÖ~|½Úrswég¶¼ò3_=ÙæÊ^äÉB²5{ ´azH@Ѹm‡" îPO”»)êˆímÄx¤”ÙýSH4ýÒ™¸N\%~gÊ>“`~¢‘ Ÿ|QBÎ××p£Ú*Ôê^ÙªCŽYò¬6÷_ò×ÌÓ¼Kå"MÖ!I A8é#’ŒÈPŒH‹*`ŸÙ ÚÞ“"{Ôäˆ 'ÜÏΈôØB¸±-ý TÒñ¯ƒ.öº±÷ö* †ƒendstream endobj 400 0 obj << /Type /Font /Subtype /Type3 /Name /F43 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ -1 -26 81 59 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 49 /LastChar 122 /Widths 539 0 R /Encoding 540 0 R /CharProcs 541 0 R >> endobj 539 0 obj [49.08 49.08 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 74.31 0 0 0 70.99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 73.53 0 49.08 44.19 44.19 49.08 44.19 33.21 0 49.08 29.52 29.52 0 24.63 78.42 53.97 49.08 49.08 0 41.65 40.43 31.97 51.53 44.19 63.75 0 46.64 40.73 ] endobj 540 0 obj << /Type /Encoding /Differences [49/a49/a50 51/.notdef 75/a75 76/.notdef 79/a79 80/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102 103/.notdef 104/a104/a105/a106 107/.notdef 108/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118/a119 120/.notdef 121/a121/a122] >> endobj 541 0 obj << /a49 537 0 R /a50 538 0 R /a75 513 0 R /a79 514 0 R /a95 512 0 R /a97 515 0 R /a98 516 0 R /a99 517 0 R /a100 518 0 R /a101 519 0 R /a102 520 0 R /a104 521 0 R /a105 522 0 R /a106 523 0 R /a108 524 0 R /a109 525 0 R /a110 526 0 R /a111 527 0 R /a112 528 0 R /a114 529 0 R /a115 530 0 R /a116 531 0 R /a117 532 0 R /a118 533 0 R /a119 534 0 R /a121 535 0 R /a122 536 0 R >> endobj 542 0 obj << /Length 117 /Filter /FlateDecode >> stream xÚ32Õ31S0P°b#3c3…C®B.C˜ˆ ’HÎåròäÒW04ãÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0Ø0Ô1üg„ÀŒ ˆ| ö õ ÿ!h€ —«'W %– âendstream endobj 543 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ3²Ô37T0P0W04S0²T02TH1ä*ä2 (˜B$’s¹œ<¹ôÃÒ\ú ¦\úž¾ %E¥©\úNÎ @A…h ŽX.O…úÿ?€è?}àrõä ä¿Izendstream endobj 544 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚUÐ;NÃ@à±RDšÆGðœ kK,¤‹”‡HPQ *BIAµs4ÅGp™"Êòÿ»Á6…õÍ®w»~¹¸óV¿ûÊüƒ*ýRÏuÉ%ƒ÷O]×ê^Ì{u{쪫íûøó¡ný´±JÝÖ^++ß´ÞšÌC‰„S¢É{)zÐÉü™\"i%»¬4á”6Íò‰Uj‰HSÑK&eo©ÂTF€çg³K´±³ðÿ5Ѥ²¨r#ïãŒØk¤ÁDV#¸ Ĉó7èÿ¯—'Šîïp*ÃSó¥±AÎ ×]­Ïú >à™endstream endobj 545 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ36Ò30T0P0a#Ss…C®B.cs ßÄI$çr9yré‡+›sé{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(00ÿÿÿ‰``bö0‚A<€ò⌰G 0¢A0ÀˆÿpâŒ`D`3‚ø#Ø-œ÷Èúÿÿ?œ:ˆËÕ“+ ÁpSsendstream endobj 546 0 obj << /Length 282 /Filter /FlateDecode >> stream xÚeÐ?JÅ@ð )Óì ÌžÀ$þI,ÄÏ'˜BðUb¥–Š‚Åƒäh{”=BÊqÇÙìl0X$üv‡f¿úôøâL—Ú͉>oôK…ïX7|.ýÑžßpÛbñ ë‹[¾Å¢½ÓŸ_¯Xlï¯u…ÅN?Vº|Âv§!%¡#û ÔŒa#xŠ‘ƒàjσGn!±‚ÔÌ0 zÁœ†Ëˆï€>¤! ]Ÿ‚8Ši I%S€K#²€Ä)'ÈÓ!b¤éíÈt}@áWó8¿,Ìõÿ •V(+­¨AÅz|Áa ]0I+ ÂÃx‡Ä­à×£5@À¿„ø¶#9qž›ð¦Å=þ)ì_endstream endobj 547 0 obj << /Length 291 /Filter /FlateDecode >> stream xÚ]ÑÁJ„Pà#..œÅøÃÌ}‚Ô(u1 Lä"¨U‹hU-ƒ) \úhΛ½€ÐÆ…x;ç\G-PüëÿŸ(<‰Ou Ïè%œÇú)ÄWŒbZ¼äƒÇÜfèßé(FÿŠvÑÏ®õûÛÇ3úÛ› ¢¿Ó÷¡0ÛipM `L=GgŠ hTà6GÐ xŒŠa, B9Ǫ(A R}a9¡²Ø¬+ð,jX0ï?r¯•@5°dì'´ÛÂÆ¢ƒ„Qp,œÚé!@{F5Á(IÍ”’å€T@‘ÒÀõ£S’ _Ò =ß#¤ÂÏ% HÊŒVè–¿ HΈ^Z™ùƒGöÉ¿Ü (xš\Œ5™/3¼Å_Ë||Áendstream endobj 548 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚmбN„@à!$Óð;/ ÀHlÜä<)L´²0VjyÅ팷ƣð”äpþ9L0@¾e†ef§./ëZr)6r±]VWòVð«R£¹ÔÅœzÝó¶áìIª’³;sÖÜËçÇ×;gÛ‡Ñ÷<’¿p³"ŠO„ËO-“±.”4Ð7RD×Ê‘S4áEúYÚRÒzcéf‚ÒcÅ=¶T‰‡h\KΕÿHg:Ãd@ůq è¸_eÂÑ\·‚oÿŒã Ó™“ÍŒšEc†¶¼@[ÆÑµWðK›‡·†Y6' ÌPÇ¢ÕѶ’·‘›plЬ>ß6üÈ¿ƒmyäendstream endobj 549 0 obj << /Length 261 /Filter /FlateDecode >> stream xÚMÐAJÅ0Ð)]fa/ð¡sm+¶"ïìBЕ qõuéBQp×­Gɲü iœ™hMIyM:™ÌdhOúsj錎Oièˆ'Ͼa?ðbKýEú³ÅíˆÍõ67¼ŒÍxKïŸ/ØlﮨÃfGµO8îÊceID``g&@òY”â›ñ95³ü3çØ•’#­Ë™œœ¥ð “fW<@Ô ‚€E¿Çs>‰(Rµ §’:$ÓV.Á»¹bãAû*3ÂJêËü´€ î«Ê˜sìJ´¯Ú›?&¡JI_B”´›)J—rí&| eàýüD¯X‡×#ÞãdŒ?endstream endobj 550 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚMÎ?ŠÂ@ðoH1ðš\@È»€Nbj£àº°)´²+µ´P´ $`‘No°g‰7ñ)S„dgFA›ï/ê÷¢ˆ}q7`Âo:PhŠ>‡Ãgg³§iLjÉaDêG—IÅ¿|:žw¤¦ó/HÍx°¿¦xÆ@@6/ïcGÇÄP‰Âà”¨!×Rˆ^!ª'“ÌâTH3=™â,ÑšÅæ×R˜;÷â…g¹X²Kž%Hs$h%Æ¢uõg·+> stream xÚMÏ¿ŠÂ@Çñ‘-¦Ù70óÞ&a…ÀÀ‚VWˆÕ¥…rWšGË£lgé–[„è¬QsŧùMó¾yK)¦!õêúJp©á1¦Á°¹|îpœ£þ Ô žóŒ:_Ð÷ág‹z¼œP‚zJë„â æS‚ º¶àÄŽÿÔ¬jußkÉÀzçäEª’¥òÌ «¬°Q)Ü]ÑÈx’îÄŽ/ÊÕ¬eQPú»¬xÏÑžc=þrÔ_ÇÁ»°0’%t£ÿÀà,ÇÞ!_‰endstream endobj 552 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ]ο ‚PðOîœÅGð¼@]ÿ éb`955DS5¡öfö&>‚ã$»)5üÎð}œÃñü‘Ë6+X8!Cо¡ %j¡•P¦f•¢¶J`Rôò¢Ûþjµ×Ÿæ—­ùZzê FB”!Ì‚ž¥_©ºC4KhEoçM>endstream endobj 553 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚUαN„@àÙPLÃ#0/  ¼æHÎ3‘ÂD+ c¥–íH ± Ó7ðY0¾ˆ@IAXÿÝcCl¾bvæß?;9Î2Id#G©d¹¬Oå!åg^å&²Þ^îŸxW²¾‘UÎúcÖ奼¾¼=²Þ]IÊz/·©$w\î…ˆÔÌGï ~=ÑBç‰Oá \N nk¢m`ˆª`Â\MèðÕd³G :5"ìÀ€šÕ»>ƒfÆâ®g¢ä|w3±ãÇòÞŒT8Ú¦¢º¥ŠLH[e"4ûü 8 ¿Ð6IõÔŸ—|ͬÁkÞendstream endobj 554 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚmÎ=‚@à!$¯á¼ èòS $Љ&ZY+µ´Ðh²…‘åfx“=%-l,¾f&™LCö9áQÀQÂÑ„)LLès›ý‰¦‰ ‡ ‰…‰IK¾^nGÓÕŒ9oöwTä ”€Ý×pŸ< ÑAZ-¤Ý@:ÒÔh½M¦,ÃÑ™òTYõ(ûÖPà zãõG÷ãߨ IaévíÁU.R8Uk®èÏÍ ZÓ¢ Bendstream endobj 555 0 obj << /Length 216 /Filter /FlateDecode >> stream xڕб Â@ Ð!‹? 4? ×Zµ¤­`A'qRGE¡C©~Z?ÅO¨[©&‡á\îA.ärI»ÛêôÐÄf›–ƒ¶ƒÝ>n,؃íÒµ‰N¯Ì­w0 A.ÐvAN(2œâñpÚ‚ÎFh pi¡¹‚0@!D-%ŒŒð\"ùƒ¸ŨÞr"Ë®R\uêŠTÇP\(z>Sa¼¡Ø§#|¡sf’ÌC§¢ÈuªŠLç¯1>|Sþ¶Á$^IÁk,b&â…rŸˆñÕs\ ãæð;ø]ªendstream endobj 556 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚEοJ1ðY¶L“2/ Ù¸{ºÀy‚[Z]!Vz¥…¢ ({ûh_$°¹"¬Î,»ÚüŠI曯^ŸSE º5Žê=:|ÆzÉÓŠÍôôð„›íŽê%Ú+ž£m¯éõåmvssAí–îU÷Øn @ð‰ÉëE2 ÊȨ èž1½JàAE8èƒA‡b„räÈßg|¯FÆí‰Ã„äÌ d¾]¥ 2÷ÑG€d˜÷Æ3úKê–‚ú'Îè‘'BÇ¥„žx`:!s\ÁIŸ²`~zNx /[¼Å_¨TdWendstream endobj 557 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚUϱJÄ@Ð7¤^“ò~@gãfa„ÅuSne!Vj)¬¢`•̧åS"þ@Ê-ÂÆûFaæ0Üa.wª³Óª’™,䤜NžJ~å¹Cˆøü÷æñ…W5Û;™;¶×ˆÙÖ7òþöñÌvu{)%۵ܗ2{àz-” DfJ £HŸGº„"|„Z¥ÑÖ¦ÁçÑԠÛ)ä€ò`ötfTvhÌ"Ã?|@‘×QZ×計VШó@0ã1ØE–Îã×¶-eý¶ƒÒƒ¯nOæ;`ëDŽhI|Uó†´éd"endstream endobj 558 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ…Í1 Â@ÐR,Lá^@ܹ€nŒ¦¢‚)­,ÄJ-m5âÅâMö)Sq79€3¯øÌ?ŠÃ<æ~ÈQÂq̇.ì6µŸý‰ÒŒô†£€ôžIgK¾]ïGÒéjÊ!éoCv”Í^a JH˸ìçø;%ü¢‡ŽB·‘Xœ[O”ë ÔŽgUð[¥kM•4FF~ŒúêÕxçÊÏ•€ÓìBTð hžÑš~; 9õendstream endobj 559 0 obj << /Length 215 /Filter /FlateDecode >> stream xÚ•Î;jÃ@à_¨0La]ÀDsyõˆ¬Á?À* I•"¤Š]¦ˆI Eu4ÅGXw[á‘× Æ¾f†™Ò|ø8☣Œ£¤à,æ<çuBß”¥Ò޹HÝìó‹¦%©7ÎRRK*Wü³ýÝš¾Ì8!5ç÷„ã*ç  /&bw¥ÜUa-« pÐð ¿6èu<ƒ@ôŃøÏâÉ×gè9{+p+tjkâܼ]]´GËsŒåw´¼¡QI\§•˜6¨Ñ†€ÿrYÛtZ”ôJ'L{JÓendstream endobj 560 0 obj << /Length 248 /Filter /FlateDecode >> stream xÚUαJÄ@àY¶X˜âòr™ÐM.ÞA\8O0… •…X©¥ ¢íeå _ë|“XÙFlR,‰3…m¾â˜ÿ/ʽe4§Ýœög4/é6ÇG,r|ð{¹¹Çe…ö’ŠÚSŽÑVgôüôr‡vy~L9Ú]å”]cµ"Ð-€"ÀŒ4ÉÈ6"ñn"ja ‰g\ô ôê½… ßÃ}abZvL£ºRÈ´WÝ€î¸Wq‘þæÏz=Aè…æ³ã=AF­…Zp2Ǥ>}Ýþ±áÄm¼§ÿ1¾fxÔ‘0Sè!9„¦ƒTxRáþé^ñendstream endobj 561 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ}Ì1 Â@…á‹ÀæbæºÙ…è ‚#˜BÐÊB¬ÔRPQH!š£å(9‚eŠÝÙµ¾êð”(E!¨/I )ÒtxA©M )»eÂ8E±!©Q,LF‘.év½QÄ«I m%…;L¿ð>?9›:À^ÖÓj¬šµœŠµ7óœ’ùNÁ‚ÿ÷Ö=¨»Öj •‘Av†G ¹Êç)®ñ ®E‡endstream endobj 562 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚUÏAJÄ0à?dQÈÂ^`0ïÚém…2…q»tåB\©K¡ŠBW-GÉà.&‹Ò1MUÆÕG^Âÿ¿dùé9Í)§“”ò9åô”ŠW‘-üЋéæñE¬j‘ÜQ¶É•‹¤¾¦÷·g‘¬n.(ÉšîSš?ˆzMÌ`@d9¾W²ÇQGº]âxYò­‘˜É–i©ŠÊ²Š½†í«¶Òlð6“º©ëƒàRÙͤéÀíèÆ¶JM­Ð#2ÿ 6`ÁÌùÐ?‡Q©ý#þëÊúÙ¤õ›¸2”pW„Pnõ›Ù&”pÓ„pnì&”ð­–¡ìÓÿÜ—`(€â²·â—‹x/endstream endobj 563 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚUϱjÂPà?ÜáÂâ ˆ9/Pc0$Bj¡;u(ÚŽ…V2H¼à‹åQî#dtí¹É`]¾á¿çÿáÆÉ8ÉxÂ)?DÏxšògD¿GNxšõ/ß4/)|å8¢ðYb Ëo7»/ çëKºä7é¼S¹dÏâ蓺øù@7=æÊbTªEV´žÓŠUш?âI4›öà´õMÔÐâÚç;žØ@ê½A¯êmQSuj#Síêõ}7µ÷ÝÈ~Ô9ìÌÜ`^¹©ÀBË× è©¤ú’tUžendstream endobj 564 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ=ο ‚PðO„³ÜGð¼@]ÿAµ(˜AAM ÑT Em¢B/foâ#ÜÑA´«BÃßóÀ›;¼â™ËÇþ‚¯.=È÷tè°¿œ6—;Å)É#ûÉ­ŽI¦;~=ß7’ñ~Í.É„O.;gJ Àì+ˆ¯‚92´È =™ ¡¥Y5"¡ÙÕ$*GE1À_ßkÐMŒAÛŽÌfb)­n!ê ¢Êa—!"„ºt¨5¾}€6)è•GÏendstream endobj 565 0 obj << /Length 238 /Filter /FlateDecode >> stream xÚ]Ï¿NÃ0ð/Êé!÷Òš?"R)èÄ€˜ZF¤‚@ê€j?šyó=D ç¤$¶ôî|§Ïjr¢ŸÊ=.ÏYMxzÁ«’ÞH•]õlºo-_iVSñȪ¤âNêTÔ÷üñþùBÅìᆥ:ç'z¦zÎÈLfÜU¸ò›/à2¸k`£­¸Ö&[ˆ~‡ÜÀõ6bòÓùÝ‘Tƒ~4óЃ{ÚÎh{“FRýD“öJÎÊÈ*+o£Ft:‡^˶ñCØÆf\8ØŒ&‡†Ñôи%F–Ó¶öŸt[Ó‚~JlÓendstream endobj 566 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚUÍ1 Â0à_:ÿ`/PìMC”v(j3:9ˆ“: U:ˆÍÑz”¡£ƒˆIÄ!Ë7¼ï‰é8âQL#NN"¦#Ç ¡ÃˆDòkgÌ%²- l©cdrE·ëý„,_ω#+h§‡ö( ò¯¿ ß0¬R‚GéC:k3•d¦V™ª4PÖ`  {@û1¼ÿ€¡gy9x–Ρoi|KãZ”Cf1.$nð ñÿ> stream xÚ=ͱjÂ`à2î’7hî èŸäÇ6]ˆ fìÔ¡tÒŽ…*:H|±é(V;Qû¬›X¶’¤\FjÓÛeý%E)æM“TÌ‚k1åRvûO1Åjª±˜™¾Ç}H9S Ü Á¹B†4øÅ7Z4^ë7^󝿬üð;r<×ÿŽÌȇ0È)¤ Êèz§»!ËB–e,; eá£__ß=Fʼ”W¹|/Hdendstream endobj 568 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚ]Ì1 Â@Ð )Óì„Ìt“MBÄ…Á-­,ÄJ-+³GËQr„”Bt ñóªÿá«|(¢œú1%Š2EûϨR.#Ê’ï²;baP®I¥(ç\£4 º^n”ÅrJ1Ê’61E[4%o!¨Aü™u4§x@ÕuŒ/øòØÓñYë¬qDówßûk;Ôp×pÒÐjh´WOü: ¬ðm 83¸Â7Ä¡Bendstream endobj 569 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚ5É1JÄ@†áo˜"ð;ÉMB¢™……uS,he!Vj)¬¢°•›x¥9ÊaÊ)Bp’ÍS¼oÓ\^]sÉ-_TÜ´\·üZÑÕëK®õù¼¼Ó¶£â‘ë5w1SÑíùëóûŠíý WTìø©âò™º##„M~!ÝJõ‰Ë&Ò ­zåt9FìaÆô¹õ¹u‘Þ"øYa€áÌ b&ÄõÏ9ã1¬ÄM¤‘J·°‘^-}´ð‰?Ÿ°9:o,”U ÛŽè;¢VFendstream endobj 570 0 obj << /Length 205 /Filter /FlateDecode >> stream xÚUÍ1jÃ@Ð/¶L!]ÀXsxµ^ƒ¶¬"W.B*'¥Á v+éh:ÊaKÆxl%4þ†oÝlÎ9üdxaØüa苬•2gëÆËþ@ËšôŽ­%½‘štý§ïó'éåë3Ò+~3œ¿S½b$PTˆ§h»$&wÊ;.CÕ¹ Yw¬þÐ ¡A ß †¿ ¸HD†‘)Ô€ TøC‰8À!ö#Çÿø_¢^P=”W¼ÉDC)´ƒö­kÚÒ V²Ašendstream endobj 571 0 obj << /Length 238 /Filter /FlateDecode >> stream xÚUϱJÄ@à?l±0Åí ·óš,GHŠ`à<Á‚Vb¥–Â) r—GÛGÙGØ2ENÜS8¦ø`vfv¦,Ï]ÅW|測y]ñ³£7* žc]§—§WÚt”ßsYP~-iÊ»þxÿ|¡|s{ÉŽò-?8.©Û2" 5Bõ¶×+hßú……–‰&Q[Xo}ÝÂöÆïfô?´BÜÏôAqaú#ÐGØÏ L0P3 ¨(E§È>QZ–ÐAj4‰ú„¯ÄNq1 ‚2!šQydqõ-«`l.ŒÜÝvL¿@WÝÑaÔendstream endobj 572 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚEͱJÄ@…áR Ü"y¹/ Iv"f!XW0… Õb¥–B…KœG›G™G¸eŠŒ,Ææ+þSS_l8ç’Ï .K6—üRÐ;™ís6Õiy~£]KÙÍ–²Û%SÖÞñçÇ×+e»ûk.(ÛócÁùµ{†òÊAzD¬jÈUW>õsèô‚ÕnVÐnŠ¡í-t‹ ¬ß+Ãʼ2ýü3¢;Ž_| üJà%Ár,¡cQvŽ$FŸŒ)úêX£‘F \ì@7-=ÐsºJÅendstream endobj 573 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚUпJÄ@ð/l˜Â¼€¸óšÄäHŠƒƒóSge!Vj)DÑN.>Z:_ca;S„à·Q9m~ ³ó)³“âT3­ô8¯´,´¨ô>—')Œfº(¾îeÝHz­ÅBÒ Æ%m.õåùõAÒõöLsI7z“kv+ÍFá˜QÁ¸‹Ø–Ú"qõ Ißîé`{¿ƒ}w3ÁˆÕ ¢™á›fÀÆÿaBì™»=ÑÌð3ã ÓKˆ·žM;tŸÄ~®è±='sŸ.ìC˜Ë±ä |G ew´†UuÌ‚%s‘LáárÞÈ•|–ob3endstream endobj 574 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ…Ž1jÃ@E¿P±0Eöš $+1˜Ø`bp°Š@R¹0®œ”ÛØ Î:šŽ¢#l¹…Èf Å<†?ïÈ<ͧ\ñ”k–9Ë3Õt" +–Ùýrø¡UCnË"ä6“kÞùr¾~“[}¼rMnÍ»š«=5kFÞç¬7Ê`€åhÛøÄß –#2o²YA¡;´§Ð `’°Hh¼ÎZ‘´"i‹¤Í ´É °!ó(£ðRF½ÛØ£µ±ÃÑDmå#þ½5ôI@%?‡endstream endobj 575 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚmÎ1 Â@Ð iô™¸ILÀTÁ-­,ÄJ-mMŽ–x…ÁÒB\'î6æÿæO“„BÊØ(£4¥]„'Œ»v±;¶,4ªÅª·¨ôœ.çëU±˜P„ª¤uDáuI0vŽìà±ó[€>Ë™iÁ7 äw40`ÔV.Àªœ›óv^–'žVOȬh/|5V þÌW5cjSKü.[HGendstream endobj 576 0 obj << /Length 277 /Filter /FlateDecode >> stream xÚ-±JÄ@„gI±°…y¹ü/ Iî/Åaà<Á‚V"¨¥E!Åá­øbkåkì#l™â¸ÜÿG‹ýŠfvþbzZ”ÑœN¦TœQYÒSn^ͬb1£rþç<¾˜ecÒ;šU&½bÙ¤Í5½¿}<›tysA¹IWtŸSö`šQì›ØA;(yD– Cõ˜Ž‹5£jÕ]ÆhAàG´ÑNùuÔ+7 œîÕÓA}Ù8¨o{õ‹Ä©=j‡5ÿ‹-?È nÿ_¥½L³s'æ¨;†ŒÅ¹è‡›ãt†¡-"s—=âŒHfÁ…¨{.Üî]=ð1#衇WC€Çà `.skR@eÝendstream endobj 388 0 obj << /Type /Font /Subtype /Type3 /Name /F42 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ -3 -17 72 59 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 45 /LastChar 122 /Widths 577 0 R /Encoding 578 0 R /CharProcs 579 0 R >> endobj 577 0 obj [29.71 0 0 0 42.44 42.44 0 0 0 0 0 0 0 25.46 0 0 0 0 0 0 0 58.45 0 0 0 0 0 0 32.01 0 63.84 0 0 61.72 63.66 0 0 60.57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42.44 38.2 38.2 42.44 38.2 25.46 38.2 42.44 25.46 25.46 38.2 21.22 67.9 46.68 42.44 42.44 0 35.01 33.95 27.59 44.56 38.2 55.17 38.52 40.32 33.95 ] endobj 578 0 obj << /Type /Encoding /Differences [45/a45 46/.notdef 49/a49/a50 51/.notdef 58/a58 59/.notdef 66/a66 67/.notdef 73/a73 74/.notdef 75/a75 76/.notdef 78/a78/a79 80/.notdef 82/a82 83/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118/a119/a120/a121/a122] >> endobj 579 0 obj << /a45 543 0 R /a49 575 0 R /a50 576 0 R /a58 542 0 R /a66 544 0 R /a73 545 0 R /a75 546 0 R /a78 547 0 R /a79 548 0 R /a82 549 0 R /a97 550 0 R /a98 551 0 R /a99 552 0 R /a100 553 0 R /a101 554 0 R /a102 555 0 R /a103 556 0 R /a104 557 0 R /a105 558 0 R /a106 559 0 R /a107 560 0 R /a108 561 0 R /a109 562 0 R /a110 563 0 R /a111 564 0 R /a112 565 0 R /a114 566 0 R /a115 567 0 R /a116 568 0 R /a117 569 0 R /a118 570 0 R /a119 571 0 R /a120 572 0 R /a121 573 0 R /a122 574 0 R >> endobj 580 0 obj << /Length 100 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04F– †† )†\…\@Ú$l‘IÎåròäÒ pé{€IO_…’¢ÒT.}§g ßE!¨'–ËÓE¿Aþ€ýƒz ü†õìä¸\=¹¹€ìendstream endobj 581 0 obj << /Length 132 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04Æf ”bÈUÈehäƒEÀ2ɹ\Nž\úá †\ú@a.}O_…’¢ÒT.}§gC.}…hCƒX.O9†z†ÿ ŒÿÀP10üc`¨a ð70È`°ÀPFÿa¨(ز‡ËÕ“+ ~5+üendstream endobj 582 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ-‰1 „0Dû9ÅœÀŸ!­«` Á­,ÄJ--\ÜÚ›G³°Ã+o\Yø@CuÔŠe U®ŠÖåjèÿϲ£Ž‘ÖA:zHìy~¾¤^THÃIifĆ×îy);Úˆ7î< endstream endobj 583 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚÎ1‚@Ð1$Ópçî be‚˜¸…‰VÆJ--4ÚŠGã(’‚8´˜—ÿ5I> stream xÚ]Ï1ŽÂ@ Ð(Üäñv'C¤­FV"Tˆ ()Xí¶Ép³%G Ü"ŠqHó Ûò·Gé§ûâ„m–GcvCÞ[:Qê´š°Kï­Ý‘&™5§ŽÌ\ëd²ÿþüÈL–S¶df¼±œl)›1àk '0)µÄ"|å•U( äThZê½Då“þå ŠC‡¨„G‡8èîÐ!‡¦¼¢)7š–úí2Ew߉Kñr@äF¢{¹@}g´¢+òn!endstream endobj 585 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚ=αJ1à )Óì#ì¼€æâîÂYœ'¸… •…\¥–wh'î>Z%°0`Ø8¹ì^ó1ü?ÌLÛ\v×´¢Ž. µ-u†^ °YsÈñUi^ÞqÛ£~¢fúŽcÔý=}?ßPonÈ Þѳ¡ÕûJ@•Ò˜±ÇYò b@•‘dqÆŸ€ª (·P9® V9¦rPÛÚ2›ê1Ôùä&ÅLÈøyx1 ¼¾ÏLg₈b!ˆPàÏ‚“AþyéåOAyù{ ‘I“LvF¤qˆÀ¿|Þöøˆÿi®ƒæendstream endobj 586 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚMÎ=jÃ@à*^³GØw¯„,Cªÿ@T’*EH§Lã@*KK_I9It•*–}y2$¤ù`fšYV‹ú† . e¹âjÅû’Þ©ªyn4^——7Z7乪ÉßjM¾¹ããáã•üú~Ã%ù-?•\> stream xÚEΡnÃ0à‹"É#øž`‰»Eê2©“640µ…­:Z‡íµò(*54°z;Ïʾ“î÷éÎÍãCÛQMZKi4µšöO¸ŠaÛß—Ý×#Vï´ê°ÚHŒÕøB—óç«õëI?ЇLnqÈxÿŒÈ"Ÿä — +¾”7†’y³°ŠK«Bá”Ïr™ï­˜Å”H®rA¶'Edes4P¢Ÿ¸ƒÉîÐIÂ;¹=CÁéÏø<âþÍøfþendstream endobj 588 0 obj << /Length 180 /Filter /FlateDecode >> stream xÚ}̱ Â@ à YúBó¶Ç©àb¡V°ƒ “ƒ8©£ ¢«×G«oÒGèØáH¼êâäðþ?!#3O)%­ý2:j¼¢ésÚÇÏæpƼÄdKFc²ô5&åŠî·Ç “|='ß´ó—{, °Ò@$dâÀzòbÅÀSvŠ£Ök”‹kå² .ôž?Øsð÷n`fþguıG".i•H –%nð aŸHžendstream endobj 589 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚMαJÄ@à )¦ÙGØy“ËUà<Á‚Vb¥–W(Úf·³Ì+­Õ=ÆåR¦Xvœ=XµùàŸŸfÓ^t—TSS ›-u ½4ø†mGi"ñÜ<p7`õ@m‡ÕŒ±néãýó«ÝÝIÞÓcCõ{(Ù(öÿ)`θLÿdì/£l-‚Q:,Šh”AP«^A/J˜ãN-r6‚MŒ æŒž!&hŸ1ßN8Îú¯Œž|(XûX £bã¬æÞõÌ †O‰)‚ŠJ¾Z‹ðzÀ{üßfnyendstream endobj 590 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚmŽ=ªÂP…O°L“ ™ÃUÁÆ þ€)„÷* ±RK EÛÜ,-îÄ%X¦î¼ñÙZ|çÌÎŒÜ`<å!—¥‘c7ácIro=|ËÿÍáLóŠŠ-»’еÙTT¾]ï'*æ? 6wÉ;»ÜSµd =m‘é ^;èC’é ê´C= É[ˆoñH»ßÕ—ñ4Õ“à+õ‡¾µÍ|ƒèÛ,æÊT%µ`¢öCˆ UE¿ôe„U™endstream endobj 591 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚ}Ð;Â0 àT*yáHõ Úò˜xHt@‚‰1#VÚ£õ(=#C„IXuùDZü;MºÙcL°£˜ö1Ó¸×p‚4±Õ{Ã÷ÓîãÔÓÔÜÖAå ¼œ¯Pãå5¨)n4Æ[ȧ(„Æ""rލ²okë3ršoÓ²=Á#,îë’èÁÚù!+?ºçðî:úɖ·j2ò–M޼â¿{kôÉšoó7ºÎ¶t /Ç%ŽE‹xq¢’O]òñyc鯳VðŽ»fµendstream endobj 592 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚEϱJÄ@Ð;¤xM>aÞèlHv‰ ÖL!he!Vº¥…¢`µÉ§åSò )§2¾·ÓœâÎÌåNU^n¯xÃ[¾(j®*.wüVЕµ¤’WG¯ï´oÉ?qY“¿“œ|{Ï_ŸßGòû‡.Èø¹àÍ µìÀÅ ›#LJ™bc‘O.Ây€l@Ó „“¾›¹9™3v\ÈÇìÌ„|Xpÿ4ýB§$Á$˜ Ñ&`vBJ³ŒRÅÅY×F™ Ŭ„…leµÎ;É $ùƒÐ H&õR¼¶m\"ÐmKô  íw%endstream endobj 593 0 obj << /Length 191 /Filter /FlateDecode >> stream xڅο Â0ð¯t(ÜÒGè=iª:üvtrAPGEW«o¦o¢oà˜¡ï1ð ä._rv+/8ekeëXÎ3^YÚR¦ÅTïÎrCÝŠÌ”³‚ÌPÊdªïw‡5™î¸Ç–LŸgrsNUŸ@rÊË7­iïÏ*…¿ ôD"öÉÝ¡¼Š³C8Å3thšHÝ+ýêCÇPX  ~„%Ô$Bfôþ„ÚõS²îý& *šÐ ÆàMcendstream endobj 594 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚϽ‚0à“[xî´ (š˜(&2˜èä`œÔÑA£+õÑxÁ‘Pƒ‹mò w½ŸÆÑ`4Å'Ø'q4ÄSWˆŠ˜˜Ôñóä£äŠâ ó5Þo3Èùf!È ÷!È3B8/Â}½ê—6Ñ>ùóøüVQ©£k*× 5b¼Jq2"- õd芆©EÑÑp›–ÚàX*ƒkyw?°¼ ž¥4ø–§!µƒbŠï>3^ `4ÕÍÑ)5Öºd¨Ti®¬Í@Xæ°…Yåendstream endobj 595 0 obj << /Length 241 /Filter /FlateDecode >> stream xÚMÎ1K1à/Üø–ü„äxw\ku Ô Þ èä ÁvTtmRýIøG®— áâ—k=òÀ›@ÞwÒLU¥ŽèLÕ´V«°™Q®rÌ·w8o±¼RÍ Ë3ºÅ²=WOÏk,ç'ŠòB]תZb»P"€Lö?"zþ0#›‘~$î–E0‹,9Š O¾â‡¾ðú•0ÂsßKÏ¿#ñ„ã_^t"9nEêö ÄnË„ •ÈwªÓÛ7Ú4èm0 _2…ßì¡Âo-K6Ò·€÷p,ž¶x‰¿JpGendstream endobj 596 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ%É= Â@†á iÒÚeN`²ù¬b·´²+µ´P´ÝÝÎkå(9BÊ!ëþÀÃÀûMU®ê åÄÖöT9ÕŒî _X”¶}úÏí‰ÀìLE‰ÙÞΘ‰}ÞßfÍqK¶[º0ʯ(ZRŒÑ2¸Žò¤7{“£³'z' :' ´Ãõ’kÉÁQ0+˜¤r1ªßÀÍš>1]l šwOøcHK endstream endobj 597 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚMαjA€á‘-¦ñ2OàÞqÑÆc W’ÊBREKAEÁ€ÜmðÅ,Ræö®LqÜdnOIøÙo˜ÝfM:¸SL©3¢tHË·hŒìq»¶ïkœæ¨çd ê'¹E?Ó~wX¡ž¾> stream xÚEʱjÃ0€á3·xͦ{‚ÊÆ©!Ki õPH§!SÛ1CBºÚz4?ŠA¥‹!õ®2Ü÷ß­»»û 5Ôó¬{êzúhñŒ´FV9¼Ÿp; }£nƒö™+Úá…®—¯O´Ûý#µhwth©9â°£*è:šuš2˜\ ¸RŠw.&?º ,Ì4Ÿ…4yþ÷ÁÁ*Á$ŒÿD®*BZ £ ÕqÔLÖAŤ„ïT3‘ù õ¬ S•E˜kÅk€À§_ñÏsc‹endstream endobj 599 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚEÎ1‚@ÐO(H¦áÌ DM¬HP)L´²0Vji¡Ñv!ñb…#PRlv¡°x›ÌßìüÍÒÉ|ÉSN¦zd3N|MèAi¿DÇáær§¢¤øÈiBñVcŠË¿žïÅÅ~Åš®ù¤oÎT®p@ 5"i‘K‘ΓOï;Ïú=lÐÁ†-LÔŒòZ¦RæÏég;ò~z _Ý(l ¢Æ ¯+HD+êj­/ÍðÚ”t /’&O…endstream endobj 600 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚ]Î1NÄ0Ðmiš!¾„°^•¥e‘H¢‚-·A»ÎM¸JŽ’#˜Î…ñ06«MÄXzÅ·Fóõòtu¥Îä´—JŸ«å…zmét›Ó•>|½ìhÝQó¨tKÍ­äÔtwêãýsKÍúþZIºQO²ôLÝF¡ª¨q€ñû“eŽ@´ÞÁ:ƒÂÛÑôâP‹Ü×ýÂ3D'¿ƒˆâO?¹ð0G –6»ÏƬ\¯\‘• ±LúJÖ¾Å`Rgæ> ižÊÂ|ùd9&‘ÆÎÜÏŒ3Ãd1×OZ2» Ýtô@¿bÏwhendstream endobj 601 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚUͽ 1 ðB–>Âå lϯ©p*ØAÐÉAœÔÑAQpê铸*>Ê=‚ã ¥±N‘$ùCòn§7"EƒÐùº}ÚexÄ\Q¬0ÆÃö€…A¹¢\¡œ…-J3§óé²GY,Æ”¡œÐ:#µA3¡¤¾µ}‹+Á‚ë”ìRföúÁw¯…k…ƒÒŠ´é+ çøˆsú Wè[C ؈ÿâ’uCëÇëŸ*Fâœ\âëLvendstream endobj 602 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚ5Ž= Â@…ŸXsÁ9›¸*ÚЦ´²+µ´P´“£å(9BÊ!ãŒ?Å~ìÌÛ÷ö }4å€'z†öc>…t%ïul4áx¡yBnÇÞ“[é–\²æûíq&7ß,8$ó>äà@IÌ€@Gj ' ‰©HÉÒ 5Ò¬UÊ?Ú%"(ºPh5±«YÕ›[Ti¡¶ŒjÓ x}ÑfHxAMOC­Ðw Ú•þ•Ö¢°>¹ÆiŸŽÕû´¥eB[zõäQõendstream endobj 603 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚEÍ1‚@Ð!›LØ‹’`e‚˜Ha¢•…±RK ¶ÂÑö(ë ()ëȲ!“7ÉÿSÌb>K—“Lx-$¥’®˜dœã.—;æ%FGJ2Œ¶\cTîèõ|ß0Ê÷kâ\ÐIR|Ʋ ð4€ßL„£­ÀQVèÔPS3eXeq 0øŒúQgyNkùÎô^‰Æo„¶- ÙJªªƒ¯azÖoZðŒ~â¦Äþ¹Xendstream endobj 604 0 obj << /Length 206 /Filter /FlateDecode >> stream xÚ5ɱJ1ÐR ¼&­]Þ˜fØêÁº‚SZYˆ•ZZ(ÚNò'þJ>%Ÿ0eBb2Ë÷À½w7^ßì©§©f7Ñ8Ñû€_8¶­oµoŸx˜Ñ<Ó¸Gs_W4óý|ÿ~ 9<ÞÒ€æH/õ¯8 "/3ÈÐè‚jèâºÀNÖ[ñË;í3ƒö©â’m,À620@:cAlÄz]ÈW²²ÈU¤ òL–k“\U%êS‰OQ”R"TV°ÙàÈTPïf|Â!¢aendstream endobj 605 0 obj << /Length 204 /Filter /FlateDecode >> stream xÚMÌ=jÃ@à'R,L³GМ +![(Õ‚"ƒU’*EHe§La“´’ …¯¥Î×жT±h=+¤˜ÞümŠÇíg\Jm¶\”|ÊéLE%9‹1Ž_T·dÞ¸¨Èì¥K¦=ð÷åç“LýòÌ9™†ßsÎ>¨mà’0$N…1™u$ “p›o¯¼UB¯$v¼hÁkÙóéÊð0Cp°+XQ=ä°û‡±D<Ò•á ¡‡¬tô¿‚ 3è0* €|íZz¥;©uWaendstream endobj 606 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚ=αJA à,[,¤ÙÖÊÉ8»ì¹pUà<Á-­,ÄJ--mgNîÅöQö¦!LÌ ^ äl†‹Ë-u4ZoFFzéñ‡5ëÖq]<¿ánBÿ@Ãý¥è§[úüøzE¿»»¢ýž{êžpÚ¸Ù@S\*ýÑܨjn qI“ð—ÀžKþ.øX p]¸’•,!aN”òO%pvn;‚ÿ8f(jˆÖ¹’Òä:K+M®¸í…™•ZqêÔ$Àë ïñ"fcendstream endobj 607 0 obj << /Length 247 /Filter /FlateDecode >> stream xÚ5Ï1NÄ0Љ\XšÆGð\’(É*T‘–E"Tˆ ()@С$×JÇ5|„”)¬˜o³Û> /FirstChar 45 /LastChar 121 /Widths 608 0 R /Encoding 609 0 R /CharProcs 610 0 R >> endobj 608 0 obj [43.59 43.59 0 0 0 0 0 0 0 0 0 0 0 43.59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43.59 0 0 0 0 0 43.59 0 0 43.59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 ] endobj 609 0 obj << /Type /Encoding /Differences [45/a45/a46 47/.notdef 58/a58 59/.notdef 73/a73 74/.notdef 79/a79 80/.notdef 82/a82 83/.notdef 97/a97/a98/a99/a100/a101/a102/a103 104/.notdef 105/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118 119/.notdef 120/a120/a121] >> endobj 610 0 obj << /a45 582 0 R /a46 580 0 R /a58 581 0 R /a73 583 0 R /a79 584 0 R /a82 585 0 R /a97 586 0 R /a98 587 0 R /a99 588 0 R /a100 589 0 R /a101 590 0 R /a102 591 0 R /a103 592 0 R /a105 593 0 R /a106 594 0 R /a107 595 0 R /a108 596 0 R /a109 597 0 R /a110 598 0 R /a111 599 0 R /a112 600 0 R /a114 601 0 R /a115 602 0 R /a116 603 0 R /a117 604 0 R /a118 605 0 R /a120 606 0 R /a121 607 0 R >> endobj 611 0 obj << /Length 192 /Filter /FlateDecode >> stream xÚ…Ž1‚PD‡PlÃØ èÄŠ1‘ÂD+ c¥–m…£q@IAˆû;“WÍÎÎL0›† vÙ xólÎaÌgnäû¢ºEãét¥4'µgß'µT¾áÇýy!•n—ì‘Êøà±{¤> stream xÚ…O; ÂP±lãÜ è{IüÄ* L!he!Vj)¨h-GÉ,-$q̃´ÂT;ß…ÃñL­NuihuéÉ—›V'Ç/2OÅì4Ĭx“®õqžÅÌ7 õÅ$º÷Õ$Mô |€ ¨,G\ WÂ{¡ûFÇ9úé^Ù€"J[|š¼ ¬µÐîrè’YÁ"Ö±4nT?…”pGrjݬc_e*[ù«ËM*endstream endobj 613 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0U0Q0¶T01SH1ä*ä26Š(˜%’s¹œ<¹ôÃŒ¹ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. L@ÌÀß$äAD=ˆø$˜ÿÄÿ€Ä?€Ä ‹³ÃÅíáâÿáâ?Å@âP¢&VVÌŒ.ó.ó.S—áG—;ì&.WO®@.n=Þendstream endobj 614 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚ]± Â0†‡Â->‚ÿ˜ÄK…N…ZÁ ‚N⤎ŠÎú¨>‚c‡bMN8¤>È÷] çy’°ÈáÁü GGbŽÎÂO%ÎT2[0“YFK&¬p»ÞOdªõŽLƒÝS¨AZZFý¢HW 2"ÃòL}¦¾Tß©oþýï»­® ËÐ"І¾Öº?¦endstream endobj 615 0 obj << /Length 114 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04WÐ5W01T0µPH1ä*ä22Š(˜™B¥’s¹œ<¹ôÃŒŒ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿÿüÿÿ†þüa`üè?’›îçrõä ä—5ezendstream endobj 616 0 obj << /Length 116 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0VÐ5W02W0µPH1ä*ä22 (˜™Bd’s¹œ<¹ôÃŒŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿÿüÿÿ‚êÿÿc`¨ü¨æ`°›ÿp¹zrrléIendstream endobj 617 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚµ± Â0DQXúKä'2Ò† á * D” ¨Ãh%#¤¤Âü#6HáWÜYòóMíÄÈà0žÃp œsº‘µf˜¹Øœ®Tz2{XKfÍ1¿Áãþ¼)·Käd*rdGò”R/¥RA-œ%¡a|¸½ݠЂ´V$‘Q¬ùµñžî†·êÞoÄ×e«ú¿U¿ïG+O;ú‚a endstream endobj 618 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚµ± Â0EQ Ýù €miCp¢ ” ¨“Ñ…(©0¾ó i~ñϧ{~37õ <& ¸ ~‰³¥9—Jƒ¹Ï“öJu }€s¤7©&¶xÜŸÒõnKºÁÑœ(4è^J©øåøqÄ^©.JùNQrŒ?)F#ŒPäëQ1H¢)3RŸ;™Ê;Ù˜J~.؆xCÙˆ?ZÚÓOYbÍendstream endobj 619 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0UеP0¶TÐ5RH1ä*ä26 (˜A$’s¹œ<¹ôÃŒ¹ô≠ô=}JŠJS¹ôœ ¹ô]¢  b¹<]êÿÿÿÏÄÿа—«'W *›endstream endobj 620 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04U02R06P05TH1ä*ä24Š(YB¥’s¹œ<¹ôà M¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ü òì?Ô¨ÿ„êÿØÿ‘ÿÃÿ‡¡ ÿ0ü`øÁøƒñóöìøØ7Ô7ügø.`àrõä äj'.çendstream endobj 621 0 obj << /Length 136 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04UÐ54R0² R ¹ ¹ M€Â FÆ0¹ä\.'O.ýpC.} —¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ƒüûõ?€ðÚÿ‘ÿÃÿ‡áÆŒ?˜?°PààP—«'W ŸÒ,5endstream endobj 622 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04F †† )†\…\@Ú$l‘IÎåròäÒ pé{€IO_…’¢ÒT.}§g ßE!¨'–ËÓEAžÁ¾¡þÀÿ0XÀ¾AžËÕ“+ ‰;“endstream endobj 623 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0UÐ5W0¶T0µPH1ä*ä26 (˜™Bd’s¹œ<¹ôÃŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ì@ÌÀß#äÁHÌD؈:Q'þ€ˆ@Ì&> f0ñd˜82î>3Ñ dfâ ¸™¢Dp¹zrr@Ä:Õendstream endobj 624 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04F Æf )†\…\††@¾ˆ –IÎåròäÒW04äÒ÷ sé{ú*”•¦ré;8+E]¢zb¹<]äìêüƒõìäðì:¸\=¹¹{-=endstream endobj 625 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04UÐ54R06P06SH1ä*ä24 (˜XÀä’s¹œ<¹ôà M¸ô=€\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ü òìÔ€Aûòøð Žöêá´ÿ#ÿ‡ÿÆ ?0`ÿ ÿ þÀÿ†ÿ@¡.WO®@.…8endstream endobj 626 0 obj << /Length 110 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0V04S01T06QH1ä*ä26 (Z@d’s¹œ<¹ôÌ͹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿÿÿÿÄÿ °‘§\®ž\\ºâAŠendstream endobj 627 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚEɱ ‚@ÇñŸ4ÿÅîÿz ¹t`955DS5µEúh>Šàxƒœ]8´|†ï7Q³4ãÇsN§Ÿ#º“úÅc5žÓ•ò’äžUFrí2ÉrÃÏÇëB2ß.9"Yð!âðHeÁðÝ èª t?b íŸÊ@XmXaà[`á9>^¼'ŽÞoá™ ÅĈ~WÕíèÆ:êÞ0­JÚÑèrAŒendstream endobj 628 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0W04S06W02TH1ä*ä2 (˜B$’s¹œ<¹ôÃŒ,¹ô=L¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]êÿÿÿðÿÿÿ0 âs¹zrrå$~endstream endobj 629 0 obj << /Length 179 /Filter /FlateDecode >> stream xÚEÊ; Â@…á,·É„Ü8™<À4Ħ´²+µT´“˜¥e)Y”S #)l¾â?'MfYÎKŽçœJÎ$Ÿ%Ý)ùňãd\NW**{Nrë!“¨6ü|¼.$Ší’%‰’’£#U%ãL=Ô“Þ7ðú@cbþV ‚NA[aó€†ï®…Ò®ƒ2NCYg ú?ƒpDi6ìà¿…§iUÑŽ¾8«@´endstream endobj 630 0 obj << /Length 117 /Filter /FlateDecode >> stream xÚ31Ö3µT0P°T02W06U05RH1ä*ä22 ()°Lr.—“'—~8P€KßLzú*”•¦ré;8+ré»(D*Äryº(Ø0È1Ôá†úl¸ž;¬c°ÇŠí Èl ärõä äÇ\+ßendstream endobj 631 0 obj << /Length 168 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.cs ßÄI$çr9yré‡+›sé{E¹ô=}JŠJS¹ôœ€|…hCƒX.Ovþ;¢ù†: ÁPƒNØÿÿÿÿÿÿF0Ø1ü`€uŒ@¢†ñQÄf ñƒù„Àf2ØJÆìó~ ñ€¿‚ñ;—«'W ÇžsËendstream endobj 632 0 obj << /Length 251 /Filter /FlateDecode >> stream xÚ…±JA†'\!Ls­ÝÎ èÞ±žšÆ…Á+­,ÄJ--íÄ;ðÅy‘µ²4åB–[çO"h£ÍWì¿üßÌì¹Ýf,•4²s n,Í¡ÜÖüÀÎéc%ûÍ:¹¹çIËöRœc{ªÏlÛ3yz|¾c;9?–šíT®j©®¹ fDT„¿P&E—{åh+ç•9G2ËÏD~þ>/BG¯Eðô$E7è~ }§ø¬€ŸK…ÑvmV›:¶¼«$ê,HŠ@•%¡j»}¦W”}þa³ÂzHõ‘ ¦OØ#b£¼A=ðb2ñßãà~|Òò0Žendstream endobj 633 0 obj << /Length 247 /Filter /FlateDecode >> stream xÚ5ϱNÄ0 `G"yÉ#Ô/iÕ+…)ÒqHt@‚‰1#¶Ó¥ÖGé#dL¥ª‡ãÐåÇ¿½k.Ûª¨¡‹Žv5µ×ô^ã6+ºjóËÛ'î{´ÏÔth﹌¶ Ÿïß´ûÇ[ªÑ襦êûé4”˜)Á pŒàaYàñ˜Y £„¸QDî+ÿ`|ÔÂ.;™1£‡ràÆ °á§ÄšX6”7 !0Z˜6Œ Ós„I¸1Â{ãá8bþgU3/­BF ‘)„™Ó)sàˆ9rá'Aóì±ÀÞõø„·³…Šendstream endobj 634 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚŒ1 Â@EGR¦É2'pÖa!F0… •…X©¥…¢­ÉÑr”!¥EÈ8 I¥ ûàÏû33;MRŠ(‘oSJb:ÅxEk%GU/˜hvd-š•LÑkºßg4ÙfA’sÚÇ°È \à1×0·2wà˜{(Ÿ¡`‚« ÃUOÂ\+rBZt‚ð%p ¬á#'*=•žJ@« šŸðõÒ¿Ï«F»a;ÂWh—nñ ³ƒIendstream endobj 635 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚmÉ=‚` à’.žÀ߉1‘ÁD'㤎]…Ä‹‘8p n #¡~ $(}úö­ëL<ŸL²å¸6y6í-<¡Óvf{¶ÝÃÅšÅ\¶(â]Î׊p9% ED‹Ì-Æ4 ð•Óžgö&ëÉ{ô¼øâ!1îå¥qƒú?µ\ÀÜ P˜ùCÁµ#ýA“dZz–4Àu ×,iºÔu8‹q…/ÂaoMendstream endobj 636 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ}±‚0†K:˜ÜÂ#pO`iÀ‰1±ƒ‰NÆI4º æ£ðõ®ØîKÿëÝùÓd¹Ê0FM•j\i¼jx@½˜%\îPPGL2P[ê‚2;|=ß7PÅ~¤K<ÑäL‰•s ´Â9×óËy|¥9#l K#‚vÓœ_ó[¹Z²½äC„N Ò_‹¦C£•èFôŒÏ,úa8è—‘[NÔøXT®®þQ­€ü÷âŠÝendstream endobj 637 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚÏ1NÃ@й°4¹¬—QY AÂTˆ (‘A‹ÃÍrÁå 3AzšWÌJÿ_¤ãæ”kN|y¹9á‡H/”–v¬¹Iû—û'Zun8-)\Ø™BwÉo¯ïVWg)¬ù6r}GÝšÅ3J•~ ZýôªýT™Mè¥Øa.åˆÊ)¥œ- ™oö̤Å/½ó`t™œÝÿ˜þRôø27ÈäVÖ¯½ifðöƒíh·¾hãÛ`+-·Rû¡ÔÑÒìNç]Ódvg9endstream endobj 638 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿÿþÿÿD|?€bØ0ÿ ÿAD}°ò€ÿÁ&> f0ñH0b!þO ¶ƒn%Ørv¸ƒÀî³?sóˆ?À>û æË `Ÿs¹zrríÇGendstream endobj 639 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b#SC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õÿÿÿÿÄÿ Øæ Œ„ † ‚ƒ`|$€lthv›bˆ)ØŒ‡6 ¢Žä£ÿQ Ø.WO®@.ÌŒ‡rendstream endobj 640 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿÿÿÿâÿHìó"ˆ Á€ƒø$`@±ØCLÁmQDýÿ ÿ!Ä( ,ÆåêÉÈæxôendstream endobj 641 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚÐ=NÃ@à±\¬4๬¥PY AÂT(PR$‚ÖÞŽkÍ ¸7eŠU†ÙI"QÒ|Åìß{;—Ý5袥ùŒº½´¸Á°ÐaC]8®<¿ár@ÿHaþVÇè‡;zß~¼¢_Þ_S‹~EO-5kVE*#TòÉPËŽaa¥'\¦BÙƒ°û‰«oè¹Ò\Qéõ4÷pf<á¢`2éß”²Oà$‡Ì˜gãßëíµúD> stream xÚ31Ö3µT0P0b#SC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õÿþÿùÿŸñÿ?cÀÀ€êÄÿÿÿ±4± Nàô%—«'W žˆ‡äendstream endobj 643 0 obj << /Length 108 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bc SC…C®B.crAɹ\Nž\úá Æ\ú@Q.}O_…’¢ÒT.}§g ßE!ÚPÁ –ËÓE¡þÿÿÿÿÿÿà >ÿ†Áޱ¹›ËÕ“+ H¨X~endstream endobj 644 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚEÏ=nÂ@àE.,MÃvN€m M,ñ#ÅE¤P¥ˆR%)S€B‹9QPr„ø.]¬lÞÛÈ¢ØOš·ÒüLÒÑt¦±Žñ&c&ú•ÈFRf1K~|þÈ<—èMÓ™DÏH%Ê_ôw»û–hþºPÔK}O4þ|©…3EÓµ¦s|–Æ@F öÄAÖ¤ÃØÈHaÀž8pnÀ…\]Ï­GЈ-8¶j<ì\  8hP÷Ãýÿø­žHF¬é–=a…‹,oËÚ>“U.k¹9‰sendstream endobj 645 0 obj << /Length 123 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.cs ßÄI$çr9yré‡+›sé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿþÿÿ€L€Å˜ŒÁN|Œ?ˆ êÿÿÿÿã?*ûÀåêÉÈé f’endstream endobj 646 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b#SC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õøÿüÿÀ ÿBü`°ÿW$þð‰ü{ª1ˆy Ÿ‘‰ùŒ0¢Ÿñ1Œh†í͇ÄqÑ|¼F¼‡ï™aÄ Ñ𕨠‚l¢è·?`¿!°—«'W ±,ˆendstream endobj 647 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚUÏ-Â@à%ˆ&c¸Ì 迨¤”„ P‚$ޤu½Ö’[GEÓev›¶ æKÞ1Çî»hÑ8º&nL؃-;CF¹XïÀA_ í>¡ôpŠÇÃi º?!å—&+ŒRå"c¢(ɉ(§N+˜ÆµGÍSroˆ‰›‚W\¯Š‹"­àЬæüÏ ¦+éÕtI…–ðߣmÅ›h5|Ö ¸üˆ‹¢dXB]/†qsøº‰|endstream endobj 648 0 obj << /Length 170 /Filter /FlateDecode >> stream xÚÅ1 Â@ERÓx„Ìt³Ž)R-Än!he!VÆÒBÑÖä¨9‚¥EØq™Š†Wüßü7sžæe”ÓÄ”Ϩ¶xAæƘ‡æxÆÒ£Ù3šUŒÑø5Ý®÷šr³ ‹¦¢½¥ì€¾"h é`,ò‚T¤'ÀuID ˆ§x¸/„ˆ¶Hÿ ¡øÙ÷®î9 ƒ›Zª¯šëpéq‹o¡lªendstream endobj 649 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bSC…C®B.cs ÌI$çr9yré‡+›sé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿÿ0üÿÿÿˆø"þ3Åþ70`øH؃þ@‚ýŒ`?€#^¬„ùŠ^°Q`Cƃ-YÉ ²œä fƒ€² Ô$êÿ700€ F"Àb\®ž\\æ„wNendstream endobj 650 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚÅÐ1nÂ0Æñ/Ê€ô–!ïÔ &HYj‰‚Ô •Ú©CÕ @°Æ9j1CäÇ‹KªÞ ’õìåû{iËŠs.y^,ØV\.x_Љ¬ÕÛœWËûÓîHëšÌ[KæEïÉÔ¯|9_dÖoÏ\ÙðgÁùÕ† ùƃHLd€ pÝLià¡'ÒîAi û?’NIû¬ iïÚ&tZÁéà0÷^gú±È…Ÿ¶X{c¹þ‚Y7‘öÉ01ÖÞñ¿<¶5½Ó ¯ endstream endobj 651 0 obj << /Length 197 /Filter /FlateDecode >> stream xڕСÂ0à›jrfÐ{Ø::"#a‚‚ ‰€€îÞ e0‰XvtmC‚ùÄßöîOõh˜Ž)¦„Š´¦TÑ^á µ²aLiâOvGÌ ŒÖ¤FscT,èr¾0Ê–S²iNûf‹EN†`æÒY9†»Q‰¶3p‚qNÊNÙ3¼ÿ¶ßO0ïÉn‹ßè¶ ×ÄZ¿’J4½&}þ5tÊò›¦y+™A²ý ½-ؼ+Ô€³Wø2>z endstream endobj 652 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚu1NÄ@ E½Ú"’›a|˜„$ÕHË"‘ * D”H»$*â£å\!GØ2HQÌw€‰æÉãÿmÿ©«ãæT ©å¨”ºæDJÞsÕ ‰gõ­Ü?ñ¦åx#UÃñmŽí¥¼<¿>rÜ\IÉq+·¥wÜn…˜™åº2ûÐÌÌ4w„C0Mý€¤LúNÔéL”túAø ¨9ÁçÒ„Éa=tC¹6”8y€ÇF¢Ì›Ôa¥OÚ2éý/òaÁ<Ãô&ÄØùE>oùš¿åxvendstream endobj 653 0 obj << /Length 124 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b#SC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õÿÿÿÿÄÿÿ¡êêð@†H0 zÂþÿ(Qÿÿ—ËÕ“+ +òT¬endstream endobj 654 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚÕË1‚@…áG(L¦áÌtYY +ÄD ­,Œ•ZZh´†£qŽ@IaGhôf'_ñϬ‹gÉ‚#}SËÎqbùléF.b27§+e™=»˜ÌZ3™bÃûóB&Û.Ù’Éù`9:R‘s)U*µH]JóíØý^‡¿w˜ŸøÂ¤Ôè¨%ÂH«´RQCôª/ê‰~ú´*hGo8‚˜endstream endobj 655 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚeÌ;‚@€á!$Ópæº,‚Š1q ­,Œ•ZZh´.FÇ5¸”\5šo’2ã¹s? ›šqòò98^Ñ}G›|ç»9^0ÈväÈV2#kºßgdÑfAYL{NöELi iÛwÐw?>Í,À¨Ì Ìʰ ]’ xB˜i ¿´LHäÊ›1VÞL0óJRþa”…¢Vèu¦èZ À¥À-¾òViendstream endobj 656 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚϯ ÂPð#†Á)>‚çt»ºËÂœà‚ É &5mÂ.øb_CY°N wíztøo,È¿ðNøìvÓéE‚‚ì69‚æWh .-rZùe¶D/@sL¶@³Ï5šÁ€6ëíMoØ%n}šðÏŸÂ :ƒš–ßæ}v%Ö$@ö—F•´T÷iX°zÒûÓ[õñ¬¿VÎÉ!zyMŽì-¹ß+_ªX=”Ey>JÍ3CN™.°àï{ŒKendstream endobj 657 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚEÎ1nÂ@б\ MÃ<'ˆm ÕJ„Hq”T)"* L‘(i½–RøZt)¹G L±Úá±EáçÝïÝñŸW‹¥2Ã3ŸÉ¢”}ÉŸ\YVØÖ>ì>xUsþ&Õ’óg¤œ×ùþú9p¾zyì×ò^J±åz-NS={èÅkg`ÕgÉ?EJ €E£AJ>.½€dÝœÀôt &Ú¤JI¡0rÏî熻ÇqžMÎþ û›û5¬·.M_Íf…[݆{ÂG¨èZµ>’¯‰±_õ?ÕüÊW®Kq{endstream endobj 658 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚmÌ= Â@à Óx„¸ ‰‚Õ‚?` A+ ±RK E[“›™£ä)S,;Îh%Xìûfæùh<¥” }å:exÅ\³T¿:8^pV¢ÝQ>E»’m¹¦ûíqF;ÛÌ)C» }FéËEÜ$ s­´àXBט^H”ȃ©ÁÃ@ž?|be¨®ŸàzY©E—ƒâÿðTZ_Õq×-`öRÅ!a~…ˆƒ„®K<.KÜâj/\endstream endobj 659 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚŽ= Â@…g°¦ñ™˜„Ä"•#¸… •…X©¥…¢­ÉÑr”aË€!ãN;±˜æï½GÓY‡®âg!ŸBºR¤³@[]/”òw%ä¯Ü”|³æûíq&?Ý,ØõïÝåLƹ©¿+ðx•ƒ“À—´€"Ò¡@±y‰Rx Œ-¶0ª±éþ~Ð*ž?¢uîmÖ½rç!0±ƒe¥æ] ÔEÓ`ç%ÐÒЖÞ*Åszendstream endobj 660 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚŽ1 Â@E¿¤¦Ik—9›°° Än!he!Vji¡h›äh%G°L2ΦÐÖ…}ðgÙ?of§óÇœêÅlS>'t#k5Ñ?œ®”;2{¶–ÌZ§d܆÷ç…L¾]rB¦àCÂñ‘\Á¤"iJzŒDˆÆ=á[5/”ÈjLAOåQ~Ñý‰ß¡@«B_ÕZ¯h4èÊJ—â5¡Î«µ^RMuZ9ÚѲuEJendstream endobj 661 0 obj << /Length 193 /Filter /FlateDecode >> stream xڕα‚@ à’.<} L— &Þ`¢“ƒqRG®â›á£øŒ—;[pqÓᾤ½´ý 5)+ÊHñ+•9ís<¡’^&¥|ìŽXLפ*LçÜÅÔ,èr¾0­—S⺡MNÙMC±€Ä  ÿ$z1Ú1Þwxï!"Ëûâ>ô<æôZ™iá&³N°?â>cíH ãRa¸ÊÉHŽ'c Ë:ÇÑ´m™¸O,Î ®ð —ºYKendstream endobj 662 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚmޱŠÂPEï’âÁ4ù„ÌìKˆ¬® ›BÐÊB¬Ôr‹mM>í}ÊûËâì}VÌ™;ܹ“ú³™i©“Ô¥ÖS=Tò'uÃù9&aÿ+óNüFëFü·â»¥žO—£øùêK+ñ ÝVZî¤[(²€ÂÐÛ f#2³;܃J>ÂPD´Cˆv@Z }•ˆ„‹÷c½C  ¤7¸¾Ð'Ð* 4u‘ö.æ7ú¹mp Ìb2ræcÀòÝÉZþI÷_þendstream endobj 663 0 obj << /Length 154 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0asSC…C®B.cßÄ1’s¹œ<¹ôÃŒ¹ô=€¢\úž¾ %E¥©\úNÎ @¾‹B´¡‚A,—§‹ÿû@âÿÆÿÿ˜AûŸz ñHð?°*;&põÿÿÿš4A€Åðk£aÿÿÿ[~ `1.WO®@.òÅ^£endstream endobj 664 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚ}±JÄ@†ÿ#E`š}!óšÄä”k.pž` A+ ±RK E»#›ÎÇðUò(y„”[,g‚²ìǰóÿÿÌÖÕÉzßòq¹áºâꜟJz¥º`;볟Öã íZÊï¸.(¿ÒwÊÛk~ûx¦|wsÁ%å{¾/¹x vÏ’€4¸ˆlnfxYé•DdöItÁ§S¶n\Å#7@efd=º`’El6X4jB*²`„éá¾fÀ}E_éh0‡íb•ôj“1SLÍ€,xÝ>v*‹Å!*:MÃö–Æ¢ó½:²?-y‰%Û§F‚Í@—-ÝÒ7ãè‚>endstream endobj 665 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcSC…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @¾‹B4Pe,—§‹Bý øÿ¬“Œ‘ò@dý ùóÿ? ùûÿ ùB~°o’äAdƒü ÉÀ$ÿÉ?Häz“õÿøÿÿÇÿÿIˆ8—«'W ƒzúendstream endobj 666 0 obj << /Length 132 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcKS#…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ì ò ØþÃÄ@òx@ýÿ@ü€á?×C1;}pýÿÿþÿÿÿ†A|.WO®@.üØO)endstream endobj 667 0 obj << /Length 169 /Filter /FlateDecode >> stream xÚÍ= Â@…_°¦Ð#d. ›ÍŸ B Fp !Vb¥–жnŽ–£xK q\‘`eïÀW¼ïñЉ£~2â€cîé!Gš“·š¦ÎO¤j‰Ô .»m÷Oñë1üêâþdXˆ÷„ÈVîŽ|¹¢-M -è§úXendstream endobj 668 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚÌ;‚@à%$Ópçò.¨H)L´²0Vji¡ÑV¸‰Wá(xŒ…[Æ_­Å~Éü³ó‡Á0ŠÑEŸ_ècäáÆƒ=’¹2Êb½ƒ4gA ΄Spò)§-8él„ôŒs˜ÃQ¹yÀendstream endobj 669 0 obj << /Length 115 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b e¨bÈUÈel䃹 ‰ä\.'O.ýpc.} (—¾§¯BIQi*—¾S€³ï¢m¨`Ëåé¢PÿÿÃÿÿ‰zÁÀ<Œˆúÿÿÿ7ñÿ,ÆåêÉÈî{\Wendstream endobj 670 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ½Š= Â@…·[˜&GÈ\@7!Q°1#¸… •…X©¥…¢õ^,7ðæ[n±ì8šÎȃ÷WÃÑ3ä‚r„Å9œAl&’ø]ö'¨-˜\À,¤c—x½ÜŽ`êÕ s0 nå¹Û =œî=Cê¿bq䙣Ò1 S¥e¬”ö‰K•vI'ì’ö‡mrÿ/)Tžòì8R`ßû¾‡¹…5¼ízfÊendstream endobj 671 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.O…úòþÿ¨ÿ$þÿ$ÿÿÏÀPÿD2þÿ`ß$ȃÈù@’Hþ“Èô&ëÿ?:ñÿÿÿÿ7 “q.WO®@.‹£llendstream endobj 672 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ}Ž=‚@…‡XLÃvNàBL¬H·0ÑÊÂX©¥…F[Ù£íQ8¥…a†‚Îb^2ï}¹™KJ)*%³ K†w4÷Ò‹ó +‹ú@¦@½á)j»¥çãuE]íV”¡®é˜QzB[Ä_P¥ ¢:˜…ðá9o’.êAµ@9(¡dq%Ÿ»7@â'a¸ý/=ßµÓGÃ.^¬ÄTyhÆ ‰”pÁ A!\\[Üã>P:endstream endobj 673 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚ¥= Â@…g°¦ñ™ èfI"¦üSZYˆ•ZZ(ښͣä[.(w“€–‚S|Åæ½7q4HRYs_8Ö ù éL‘WCNâvµ?Ñ$#µá(%µp:©lÉ×ËíHj²š²&5ã­æpGÙŒs” V,ÈS*7;(& A‰]ƒt,¾à -À•ÇýGTÎÀµ@Û8×=ÓF–>¼®á ¡¯†¾$Úñ¼Ë_È¥÷ªùF­Ñ<£5½Þ¯ìendstream endobj 674 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ­Ï= Â@à‘ ÓäÎ4 ÙˆVÀ‚Vb¥–ж&7ðJ{¯à Lig³ Z 6_ñBÞ¼Õq;éQH1µ¢.é„â­#Ü¡Ž$ )ѯO«-ö3 æ¤# Æ’cMè°?n0èO$éòÓ³!W© É¾Èùb Á|3à1³õP¢_6Äæ¬ri©Ölxz+=Õ>jO=®Ù]qÝu¿ôìªÊç÷B·V–ŸÅ´~…º[ëÎÿ)×DÅ\|kse8Ã'á·vGendstream endobj 675 0 obj << /Length 158 /Filter /FlateDecode >> stream xÚ­É1 Â@ПJø—ðŸÀÝu£Äj!Fp A+ ±RKAEëõh9J¼AÊÁqc!Ú[̃™Ií`4-ØԈËÞð™m»îjw쎜{Vk±«y\Yù…\/·«|9ê½e_Hx’+5ÐCôÑ8´äÂ#‚$ÒRC®¡¹šˆ\õ¡ì¸ÿBÿ"¨¿xo<ó¼âõõIwendstream endobj 676 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚMË1 Â@ЋÀ4!s7q5Æ@T0… •…X©¥EÁÊÍÑrr‹ñ,,Þ2³óÿÔŽg©D’€MÅ&rŽùÆv‚=ê×þpºr^°Ù‹°Yã—M±‘Çýya“o³YÊ!–èÈÅRÈùr¨êGB®ù7 }Kïÿ´D#"×eZS¨¡W¡ÿ!§ˆ("P÷B Ca÷£}­¢9ª6A«ª=> stream xÚ31Ö3µT0P0bc 3…C®B.cS ßÄI$çr9yré‡+›ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä€Àž¢þÿÿÿ @ü¿A€ÅH2…‚ù`€hàÀ ß €AþAý~ [@óÿ Œÿ€LxÀÀåêÉÈþ:B„endstream endobj 678 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.O…úÌÿþÿ`ÿ…¬ÿÁ $0ð()DÚÉ? õþÜÆðêdƒ=˜”ÿH2ÿcÿÏÀåêÉÈÄ£d>endstream endobj 679 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ5Í= Â0ÀñW:oéúN`ú¥ÐÅB­`A'qRGE7©…^Ì­×è êØ¡4¾Ø”É? ‰Âé,&žQ@áœÎ>Þ0ÔÍÓ[}pºb*Qì)ŒQ¬¹¢zÜŸévI>ŠŒ>yG”½•¥:ÅôJ•^ý›]ƒS |Á-,ZHZX:È^<rœ[CÂ×Á准’qÊz¤b&Õg¤aì¦QŒ¥À½†¿À•Äþ$›Lãendstream endobj 680 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.O…úÿ `Ôðÿ?ÃÙaCÄÙ00~ @2?ÀDv`²N2~¨+þߎ ¿#Èß``’ ?Ÿ‡“¿¿G#«¾g``¨?øA6 Hû†@Rž¡†ËÕ“+ Ém¢endstream endobj 681 0 obj << /Length 202 /Filter /FlateDecode >> stream xÚEŒ; ÂPEoH!Lãœø£‚UÀ˜BÐÊB¬ÔÒBÑN!…Û²³t î@Ë!ãL@,ÞaæÌ»·µ{¸£¯Ûá¨ÏÛ™ lµÃfOÄܒ£¹©ZrÉŒOÇóŽÜp>âܘW!kJÆ‹/ŸLnRüQ;”H¡(Ô+€Øû­Üp{Íçh¼¯€/ O ¨.†êçê«oŸk> ¹¶´¬4¶ú…¥4Wè¬&F&ž”™äRŠ¢ª§ÚÑ$¡}¨xY&endstream endobj 682 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚEαjÃ@ àßdˆ‚ÁzöìØ)ÍCšB=Ò©CÉ”dÌÐÒnÆvÈÐ×jé‹:tÍ&É=Žûîî$%ñÍpÄ!ø:ºãdÀñ-¯"z¥X£!—Znh’‘yæxDæQâd²¿¿}¬ÉLæ÷‘™òKÄႲ)—Ö³µ[{²v§È­õöð+ïðOPy5À‘ Æ@®²äÌ©¤äUíð·-Gÿ[ùÙ;z¿Êßàµ[*ö‚l”ãŽBÉ;¥v\ɼHer”;åSú¾H‹R §Z88 ¾~íKôÑßÍa{endstream endobj 683 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚ= Â@…_°L“#8ÐMLRØðL!he!Vji¡h'š£å({„”!qœ-–6ß²ó`ö}›ÄÃtÌ!'<ˆ8 9ñ1¢ Å© å»äp¦iNfËqJf)c2ùŠo×û‰Ìt=ãˆÌœw‡{ÊçŒÞ@в¶^m ´­…ו„û•W÷¨”x:ô däTLdOñ”€_Öû'¤X`–*ºw]!WÒ¢qµ½z¨‘º9KõUóïÐ"§ }}dÃendstream endobj 684 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ31Ö3µT0Pac S#…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]Øø XŠí¸ˆÿ7001;×ñ¾Äójä‘Ô®ÿÿÿÁÿÿÿ?À0ˆÏåêÉÈÅFJÜendstream endobj 685 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚe1N1Eÿ*…¥i|„Ì ð.›-V Ab $¨(U ¤A›Ý£ù(>BÊÑóÓ„,?kÆÿWíEw¥µ®¸kí.õµ‘i;¯O%/¶ï²$=iÛIºó®¤á^¿>¿ß$­n´‘´ÑçFë6Šx0ڄʬ ˜íÍŽX⌾T†~ÂèËϰœfGvÄlŽâgØ×ÎOÈ —˜À<|žðHTGÇ‚+î©¥µ§Ë‡D5ÿWôTŒL3ü*Ù¡¸=·‡2šÿÐþ‚½,·ƒ<Ê8hñendstream endobj 686 0 obj << /Length 181 /Filter /FlateDecode >> stream xÚ•Ï=‚@à!$Ópæ.¿ bâ&ZY+µ´Ðh £pJŠëL±hë$ó%ó^5YºÌ Š(áÍʺÄxÇT²HN)Î7¬4ª¥ª §¨ô–ž×Uµ[QŒª¦cLÑ uMþÁÄ„B9ÓÌÆ›‹‘ñGÐ3aç(if ãMŽÅ( Œ/½#ì˜`Ëc„÷—V2öOZË¿Z;ý®5îñÜþtýendstream endobj 687 0 obj << /Length 207 /Filter /FlateDecode >> stream xÚ¥Î= Â@à‹À4{„Ìt³&)!à˜BÐÊB¬ÔÒBÑÖ,x¯’£xË’qFEÐÖæƒÙ}o“¸v)¢„ZŽ’ˆRGk‡;ŒSʱóÚ¬¶ØÏÑÎ)NÑŽeŒ6ŸÐaÜ íOäÐiá(Zb>$Ã\CÈÌßÈÌüǹ.ì5ïªTʺ)ñ7¢ ½œùPÐ €ù\è)'…ߘ'å-,e›ù$9óÒ‘• i«ÌŒþ `¾AƒYÒ Öš G9Îð-²c—endstream endobj 688 0 obj << /Length 241 /Filter /FlateDecode >> stream xÚmŽ1NÄ0E”"Ò4¹ž @’T––E"Th+ ¤Ø´±æ£ø)S„ ãÍ“ü=3ÿuíEÅ5w|ÞpWsÉ/ ©í5ÔgûýóüF»ªGn{ªn5¦j¸ã÷ÓÇ+U»ûkn¨ÚóSÃõ†=6™Ì@! `dÕHpÑë³Îç³¢˜¢¢Œ°0g0º°¿p ã†\ÏF<'Ÿ"D´MÖbLz[‚Îë€õZj6]*7DEñã?°?(£j”A…LP5ãË GÕÔ¡˜µ(O•Y*GÒ@BRƒæ ›è þ5pIendstream endobj 689 0 obj << /Length 183 /Filter /FlateDecode >> stream xڕͽ Â0à+Â-¾Þ hÓ NB­`A'qRGEÁÉöÑú(}„ޤzW©Eqñ _Èå~3°#ò) ¾¦À';¤Æ#ËI~š×Ïö€¡Cµ"cQÍ8ÊÍé|ºìQ…‹ iT­5ùt]ãÁ‘ Ù'é`œ010%p1ßà ­‚içBÆt*R¦—€t 2;nB)¼û½¢¦•×4㪙_T+~Ѭý‹.œ:\âãM†endstream endobj 380 0 obj << /Type /Font /Subtype /Type3 /Name /F40 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ -1 -19 45 58 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 16 /LastChar 125 /Widths 690 0 R /Encoding 691 0 R /CharProcs 692 0 R >> endobj 690 0 obj [43.59 43.59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 0 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 0 0 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 0 43.59 0 43.59 0 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 0 43.59 ] endobj 691 0 obj << /Type /Encoding /Differences [16/a16/a17 18/.notdef 34/a34/a35/a36/a37 38/.notdef 39/a39/a40/a41 42/.notdef 44/a44/a45/a46/a47/a48/a49/a50 51/.notdef 52/a52/a53/a54/a55 56/.notdef 58/a58/a59/a60/a61/a62/a63 64/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73 74/.notdef 75/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88 89/.notdef 91/a91 92/.notdef 93/a93 94/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121 122/.notdef 123/a123 124/.notdef 125/a125] >> endobj 692 0 obj << /a16 629 0 R /a17 627 0 R /a34 630 0 R /a35 631 0 R /a36 632 0 R /a37 633 0 R /a39 620 0 R /a40 611 0 R /a41 612 0 R /a44 621 0 R /a45 628 0 R /a46 622 0 R /a47 623 0 R /a48 683 0 R /a49 684 0 R /a50 685 0 R /a52 686 0 R /a53 687 0 R /a54 688 0 R /a55 689 0 R /a58 624 0 R /a59 625 0 R /a60 613 0 R /a61 626 0 R /a62 614 0 R /a63 634 0 R /a65 635 0 R /a66 636 0 R /a67 637 0 R /a68 638 0 R /a69 639 0 R /a70 640 0 R /a71 641 0 R /a72 642 0 R /a73 643 0 R /a75 644 0 R /a76 645 0 R /a77 646 0 R /a78 647 0 R /a79 648 0 R /a80 649 0 R /a81 650 0 R /a82 651 0 R /a83 652 0 R /a84 653 0 R /a85 654 0 R /a86 655 0 R /a87 656 0 R /a88 657 0 R /a91 615 0 R /a93 616 0 R /a95 619 0 R /a97 658 0 R /a98 659 0 R /a99 660 0 R /a100 661 0 R /a101 662 0 R /a102 663 0 R /a103 664 0 R /a104 665 0 R /a105 666 0 R /a106 667 0 R /a107 668 0 R /a108 669 0 R /a109 670 0 R /a110 671 0 R /a111 672 0 R /a112 673 0 R /a113 674 0 R /a114 675 0 R /a115 676 0 R /a116 677 0 R /a117 678 0 R /a118 679 0 R /a119 680 0 R /a120 681 0 R /a121 682 0 R /a123 617 0 R /a125 618 0 R >> endobj 378 0 obj << /Length1 750 /Length2 576 /Length3 532 /Length 1110 /Filter /FlateDecode >> stream xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž44P0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥r‘g^Z¾‚9D8¥´&U–ZT t”‚Бš @'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<8”0äs3s*¡*òs JKR‹|óSR‹òЕ†§B盚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l ‘È,vˬHM È,IÎPHKÌ)N‹§æ¥ ;|`‡è»zy‡jCã,˜™WRYª`€P æ"øÀP*ʬPˆ6Ð300*B+Í2×¼äü”̼t#S3…Ä¢¢ÄJ.` òLª 2óRR+R+€.Ö×ËË/jQM­BZ~(ZÉI? ´©% q.L89åWTëY*èZš 644S077­EQ˜\ZT”šWN+Àà€ñÓ2A˜šZ‘šÌuóZ~²uKÖômm+ë\_XŪÏùóÄÚ—7ÙD쨛™Rl:/P1½dÉ«…¶öϾ(á•l=U¸h‹d¯_OÜ—EÂk¶v-X1¡Át¿Þ`ñÊæ®i¼ÿ´Õ_y. ›1§õ‘´Õþ¢Ç³:•un~Q®?Á3/å…SÔâ}ßï]ãÒ š¤¥$e~sû]F1ñÊ»Ï/ËÚQ?ý¸mò»³·|<ċݺÔ/¦Ùq'}Iüö„+6­ìâEíÀgޝ¼xT.‘òGÀ¿gtÅÙ¥vÕG‚—U|íª“®¾~ª€]üRÇëÞ…_kü9¹öË:½{ápËñGúý îûd}dN<6Îø-uBÛošHºÁ=c¦MÏvHžÎzºq½aûÿìRKë~,KÌž³}Š¬Ë›ªÂå»m¿‡Š÷Öêyo›ù~ÉîÃÜ×v‹ Û_¹éÜÿs>§ß¶.#ßҭߦíÈè{­/þô­É™kÜ—öÉ\mü|¢Ðr¢úÿXöÑñßϾØad­j|ïÇéÖR/ü,2 p0, HÎIM,*ÉÏM,Êæ> endobj 377 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /DQJKUQ+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/bullet) /FontFile 378 0 R >> endobj 694 0 obj [500 ] endobj 693 0 obj << /Type /Encoding /Differences [ 0 /.notdef 15/bullet 16/.notdef] >> endobj 695 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ36Ô34R0P°b#CS…C®B. m„@ $‘œËåäÉ¥äsé{€IO_…’¢ÒT.}§gC.}…hCƒX.OöòìÔÿùÿÖÿ±ÿ!ÿý—«'W áš(endstream endobj 696 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ36×36Q0P0T0´P06T02WH1ä*ä2² (XB$’s¹œ<¹ôÃŒ,¹ô=€„§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ÂÿÿÿÂ\®ž\\Ï5^endstream endobj 697 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ33Ò32Q0P0bSKs…C®B.S3 ßÄI$çr9yré‡+˜šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]øÿ Æÿÿ€9ÿ?©úÿÿ€Ä~0ÿa``Êü«cRòÿØ:ìÿ€5ÚÿSõ`”üÿ†ÿÞÿØ)ö`Šñ˜R( Cþƒ^ ¤yÄPÀø:ô5>ŠËÕ“+ Šcendstream endobj 698 0 obj << /Length 383 /Filter /FlateDecode >> stream xÚ…Ò±NÃ0`G,yñ`¿$ªÒ¡Š¥R$2 ÁÄ€˜€‘R‡JñÆc‘7àÂdô帳Âèô9qï¿;e]ŸT§ºÔ+}\éu¥ëR?TâYÔ+|Xêº oîŸÄ¶Å®W¢¸ÀÇ¢h/õëËÛ£(¶WgÏ;}[éòN´;ÍëXüåÐGI¢ŒQæËEuvìÛÄ"ó/5A|bGKþ§&i“tHŠ½È™¹EÙ¸(ñÅ)9H»HÑô84‡&iŠÊÁ%ITŽ*…¥qK; g2Iù Q+G~C¤Æ¯™=ø\ÒÞ/ÓüêcÆËt×UšàßPÙ¤À†ØI’0Œ;Ž-P¬D >V9j•Â̘aÈ&‰b»‘aœ ê¶ðº¿-”‚÷>HÂgØ à's8É•QÿÙ@ó€ïºÃ³EÔu>Ð<{å=ÍTe±ÞÄ”ÅoÎ8 Ú0Œ°P†ê%½gøŽŠ9:´Išk‰óV\‹oØæfendstream endobj 699 0 obj << /Length 289 /Filter /FlateDecode >> stream xÚÑ1jÃ0€a †·èÒ j‚“.1¤)ÔC¡:”NiÇ-íVlß$WñQrL^¥÷¤¸Ø`*0|’—ÿI›ÕUnR³²ß&3ùµyÍàÖî,u[÷ãð»’'³Î!¹³§”÷æëóû ’ÝÃÉ Ù›ç̤/Pî°K7¯QE;W}Zv3EØ/Hâ0SŒç)Ä c>¢Öú"T(ôùÛ8¨ŠÑGÿŒ’Aƒ ù}äõ!:êF /iÅùò$jVlÅÑqûGKYq¾j„Æpó>_»9'*œ(ëîƒT9QtvMäÀùE¤žã…˜H’Cð 1éÌñ‚óG)—FƒhÍj(Þ笖â½*~ØÖÕÑ»b÷_Ám ð iÊZendstream endobj 700 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚ¥ÒÁ ‚@à‘Â\zç ZÑ< f‡ N¢SuìPÔ¹ÍGñ> stream xÚÅ’=NÄ@ …MÉÍ!¾$)Èf«‘–E"Tˆ (‘AKr®’£äS¦XÅØ“Ù,=S$_> stream xÚÅÒ½ Â0ð‡Â-}„Þ˜ìÇV¨ì èä Nêè èl­ÒGpìPz&±M„ˆÐÉ@á—„$åÓ$BgüK|Œ<p8äs9‡3d°-Æ!°%_V¬ðv½Ÿ€eë9ÀrÜèï¡È‘ä°øxë©Ô)Q©TóÅ”ïxÔô²©íe¥4ÈG¤ªzMÄa)[¼"ei=šAikÊëL¹ôM¥!çCÕhÕ×ø.TC×Ê#³¦igÖ^w†£o¶êªî´î¾J„-ã$äŠKH…­We¦N'Q<‹6ð¯?Kendstream endobj 703 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚÒ½ Â0à„…[úæžÀ´[' µ‚ÄI'õÑ|£ƒìµÐ´Ö@ໄ\þ.ôû]Ô=ô0âÖƒa»:Ô›=Ä)È%!Èi> 2áéxÞŒçcô@&¸òÐ]Cš ú¶ŒuãŘPŒq‹Á"p3q%ŒÚÑ«áÒ§™ÎÐN°¢€¾ðß(WUyxû¦9ø³8¡ ëÑVÁ6q¯Ã1 D„=¸¢$Ø¡¨•D‰÷/À$…|®±ßdendstream endobj 704 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ37Ð31R0P0b3S3 …C®B.3rAɹ\Nž\úá f\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.O…ÿÐ@€>À`ÿAJ3Bi†z(m¥å¡4?”f‡Ñ 43š+ÍøF3| @3€hf4;”æ‡Òõ`è+¢h˜z„~vö1’HƒiP¤~ ‚ærõä äœÏendstream endobj 705 0 obj << /Length 300 /Filter /FlateDecode >> stream xÚÍÒ½N„@ðÝP\2 pó ÄX‘œg"…‰Væ*µ4Q£5÷&÷*< °åÆ™`¹øQ{ù±,ìÜÌ¿,OÓsL1Ç“ Ë3Ì/ð)ƒ7(r^L±ž<¾Àª†ä‹’k^†¤¾Á÷ÏgHV·—˜A²Æ‡ Ó Ôk4ü#gÌ«`Id ßKD-XûHT±ú…HžQìd[Ïë;'Ûøë¥n—ü1‰ªÞ“ÕÆi/jœ®óÇ{;_…ã÷ƒZŸÓöX\‹?b.®´ ê¿«QÙ_äËó%þ5Üt×õIÿ¥ôs&µüAÚÉciÇUÝ h’NËN SµÓ¤#þvPHDH‰&‡4MÎÒnL˜Ï•OÝ!“è|&%­Ig]‚«îà ê¤ùrendstream endobj 706 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ31Ô37R0P0aK3 …C®B.cS ßÄI$çr9yré‡+›ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁlƒü†Q3è¸\=¹¹‹iƒ%endstream endobj 707 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ33×36T0P0b3#3 …C®B.Ss ßÄI$çr9yré‡+˜šsé{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü‚ „hû £4š½?Í£ðÓò8h{4ºþ¡¡43”f‡ÒòPºB3ÿÿŽ×ÿÿÿ¤¹\=¹¹¯½¢aendstream endobj 708 0 obj << /Length 278 /Filter /FlateDecode >> stream xÚÓMJÄ0Àñ”. o“ H›˜dŽÕÂ8‚]ãÊ…ÌjtéBQ讽‰WéM캜Å0ϼøW:…Ðþ(üyÄšüt–+£Îܲf¦òsõhás·aˆt²}†eú^-æ oÜ.èêV½½¾?^®¯”½RV™ T+…xþi[Dü2hé; Ê_Ð.°#ÄŸ ì ÉGˆf È,D¹#¤ ²½ð¯ H_W3H|ÝÀ ¦ ¨gQPÜMAP]Òr :)8P]Ê‚‚ŠiP]Í‚ê®.êY¸ ¸cá‚’ö4ƒ<Ê]:‚l_Œ@êcà0‚˜æÀÂÏŽ… áðáù»%Ãåœü®+¸ƒ/]zœendstream endobj 709 0 obj << /Length 277 /Filter /FlateDecode >> stream xÚmÒ1N„PÆñ!$ÓpæÉ*l¢!Y×D ­,6Vji¡Ñd;<Úe`Iaö93o,(H~<Âÿ+ mÎÎ×TÑŠ¯vE-½ÔøŽœUr+žßpÓcùHÍË[>Ų¿£Ï¯W,7÷×Tc¹¥]MÕö[ !@‰õí:,è]øáW`¬Ñt~]'Óå¬!LêdDUHZ•KZ•i:j4¥®DGD i•¦Uš6L…KGT:¢Ò´JÓ*M›Â¤Á%#Q’Ž’t”¤'¦Ô%#Q2bâ´‰Ó&N»Ž¦ÜÅ#&N›8mâ´+L\úÉT…+we®tA‰ f ®ÎU,(we#Ä¿RWâ‚Yû›ðXMÑ×endstream endobj 710 0 obj << /Length 286 /Filter /FlateDecode >> stream xÚ½’±NÄ0 †sb¨äå!~èU ë1U:‰H01 ›€‘sîÑú(}„Žª;¶RÐ!F:$_þØŽk{sqVã ×xZa½Áõ%>WðuÅâ k»yz…m åÖ”7,CÙÞâÇûç ”Û»+du‡ì³‡v‡Î¹‚:—>¢˜ö‚H%Ï0„èhâ}ÁGOÉäàNÄhI¢öl+÷­›Ñé"‡$§>ªx$O‰‘Aâ9Ñ3Hà:ƒ7¼¦ICc0C0˜Â” üdÿæ4rªGðËZƹ3h醥AŸ¡°:wß*¯½8,´;$Á¥qQRrº¤WEö¤½g‡Ž½{ !“Љ̳A:>6@ ÃøcòhÙ°Áu ÷ðž¤ö}endstream endobj 711 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚ37Ó35V0PasC3 …C®B.3s ßÄI$çr9yré‡+˜™sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ„ñÆøcüo€100ÈUòƒŒÿ@ õ  ûPˆ3øúÑ v,ŒÔf [Í=èn†ûæ/¸O¡~0”ñÆ85 †)šˆcp¹zrrÚõÏ\endstream endobj 712 0 obj << /Length 355 /Filter /FlateDecode >> stream xÚ½’±NÃ0†¯tˆä%oÐÜ @š‚ÚFª©‰ •`b@LÀÈ‚ )•x±n¼F!cËÇÝÙ ˆ¢ŽD‰üù|wv~ÿó³“ìÇ8Åã,ÇYŽÓ2ólfŽŽq>K÷OfUšôg“^rܤå__ÞMºº:Ç̤k¼Íp|gÊ5@D;ЇÈéùPÂÐTÈò8àiB¡Fëb’h͹R+Ù…$V­ÿt¦=x]ó¤b¨í#ÚöÀ/O{ˆÔ²ƒî‘hz(üy©Ý‡*€ý«PýÀý'8Oæ?˜höeé h¨R‹ÚªðÎ+k\„ýÐjF m«v ïrq…]ÀR®1q É5Æ´`ÔrgŽa'Û8o ¶ÏÖ¨`Û´‘j8Ò5®Ž4ôé± 0´{àV¸Uò0è̹ðì/¨üAEú † þüVÜÚ‚¹(͵ù3(endstream endobj 713 0 obj << /Length 251 /Filter /FlateDecode >> stream xÚ­Ñ1nƒ0€á‡: ½…”wÖ 4ÈYŠD©†Hí”!ê”d̪™áh9 GÈÈ`ñj°1RaKd}22²äây™PD zŠI¾P"éãeDÝ“¬Ì›ý ³Å–d„b­—Qúù¾Qdo£ÈiSô…ENÜôèÅW§Æ©uâJ3d€”k«¾YA¿¥W©¥í ù©² fuýM¿<7'MÕäž»¥ïnžÚÝ€ASýwMRàö \S¿ošÖ'ðæŠß%u—«vªrChë2<š>úï¿\+#_ç2ò˜o¶cibBרÂ÷?ñi hendstream endobj 714 0 obj << /Length 305 /Filter /FlateDecode >> stream xÚm‘½JÄP…OØ"p›¼€yÍf‰‘aa]Á‚Vb¥–Šv É£åQò)#\î83w‰.x›Ìï9“zu¶ªhI5–t^S½¦—Ò½»j-Á%]2Ïon۸⪵+n$ìŠæ–>?¾^]±½»¢Ò;z,iùäš<àH9àØ0w{‰1‰àÛcÁ]Ω<² h=òQŠ=6 zh¾,ÝŒ$üûýd˜ˆà1bŠðÐ׆«ا¨#X«êéÉA}Éëă¼ÞiMËÖ©¥S¬Ñ-d§ÚpíAÜiÈÌ$ r¢ñÉ0cúðGÖÝ‘»Ò"Øyäž*\ެŠå'¨ªÍ5 ‰Ðš?ŸÛ)¦ÔœhVVQ¥»nܽû÷ó× endstream endobj 715 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚ37׳4T0P0bs3s…C®B.3K ßÄI$çr9yré‡+˜Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(Øÿ‡€D1þ1ðÿo`þÿ þˆÁ`ÿ¡þ˜!ÿ¡žÌ`G0ê æ5#F„Á€ñÊøñʨ †Áe0Œ2¨É`'â\®ž\\TÒË.endstream endobj 716 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚí’= Â@…G,Óä™ è&"ù©þ€)­,ÄJ--mMŽæQ> stream xÚÓÁNƒ@à!HöÂÀ¾€Ò5Z5!%©5‘ƒI=y0žÔ£&áÑx#Â:3»’/d¾¿-íþ”:;>Wr!Oä‘’JÊå…|VâM(EñB./ÍkO¯bŠèߤDtƒ¹ˆÒ[ùñþù"¢õöJbº‘ø¡G‘n¤Öºƒ¯8ýW·tx@NC¢­8Y™«ÀkccŸUÛØ×%€SÛØcUS•$œÜÊÆFýðS¾Æûy(wPAâ¯Áßá£RÀ‚©pXi¨V@}ôjH-—DqL ³jymVFyK«ÑÅV/ŠUÒ5¤¬/J/ÍjŒÂý¿{HÃþLe·©ìÅ‹2+Wó™‹ÃrøAÑ0' ' ¾þ">5×"®Sq'¾<ú7¨endstream endobj 718 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚ}ϽNÃ0ð«J¡l¬ü¹³;Ta?ùìûpÛœ7k©äBÎjiÑÃkÍïÜVb»¹Ì7/;Þô¥­8Üj˜C'Ÿ_o6÷×RsØÊS-Õ3÷[¡&Òå±0’Æ`Q·Ð0‘|T*õM *pŠÓŒ_¬°·ÃÅ2ô $ŠL‡o1ÔJc4|îÐåÝœŽä~82ý;á eSz™ñéºÒ)<Æ8`¯ÍŠN9y{ƒÑ2Êhà›žøål¡—endstream endobj 719 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚÅ‘; Â@†7¤¦É2ÐM4ñÑ(øSZYˆ•ZZ(Ú ñhà̶Ü"8ÎÆP+q›æ±óÿ3Íz­ ‡ ¬ú¶±ÙÁµ;MÐÃV‘Ym¡œc€sd4ÁÃþ¸ÙŸÐ9Ä…Þ¢!Š8üˆ¾Â~Âúƒè̸¥Œ+‘fÜ’^Æ áÜke˜ÄÙ"eš,®”æŸˆÕ tŽÞGd?ÀË„bú›$UÊ5â“ÒŠflì$*lóÞÍMgnó ´C¦JÙæhVÊ·3Ë®FÌàiÔpendstream endobj 720 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚ­1 Â@E'l˜&GÈ\@7‘E±1#˜BÐÊB¬ÔÒBQ°’£í‘R¦gEì…áv>ÿ¯™'SŠÈÐ &3!3¦cŒ4#£Nq›ÃÓõ–ÌõRdÔùŠn×û uºžSŒ:£]LÑóŒ’> stream xÚÅÐ1 Â0à”…·äyдÒ*N­`A'qRGEçx¯ä ¼‚7бCéó=q(8‰òÁ ÿŸv«ÙŠ1Ä&]lwqÁ†Øy,ÖÐËÁN1‰Áy 6án»_íûÍpa8‡•‚&:2)Ñ™¡BztòŸÊU™«ÇUN­ËÇ+æIZÔà^Ü>¡àj©‹$qÍ©ÂÆIMîMRÚ'*ùmseÿ c¨ÒL@… ÜI 9Làwn¶iendstream endobj 722 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚu=nÂ@…gåb¥i|Ï’eÅÒYâGŠ‹H¡¢@T’Djûh>а¥ äÉÛX ÉŸVï½yšyñÏÞËD¦òä%¼J˜ÉÁó™C€8‘0Ï/*v[ ÝdvÕ»\/_Gv‹¥xv+Ù¡hÏÕJˆÊžˆ2Õ†(Wí ¨F¢ºO†¶öFF›l@²Ä&¿%`Ý}b —ÝÈzdüeL,¢>2½¿Ýÿ°~dgygL[41Ƕ¦³Š» ÚÖhKy“êJ BaûsµQø óºâ îDŠendstream endobj 723 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ36Ñ32V0Pacs…C®B.cK ßÄI$çr9yré‡+[ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ700ðÿÀÀPÿÿãÿÿ?˜ÿ÷ÿaàÿÇÿAþ<ø$ìADýÁÿ‡áÿ0ÁüH0 ¤ÿA6b#È4oˆúÿ@ÁåêÉÈèü® endstream endobj 724 0 obj << /Length 281 /Filter /FlateDecode >> stream xÚ•‘=NÄ0…ÚÂ’!sH›´––E"Tˆ ()@Ðß`¯ä£ä)·ˆ<ÌØ‹Å$Å'ÏÏ{ÏIן5-5tA§ç-ukZwôÜÚ7Û5¤oßZO¯v3ØúžºÆÖ×R·õpCïŸ/¶ÞÜ^Rkë-=ˆÔ£¶ð„/ÀqZq€gÞ XŸxÂqdWŒjï£Ip‹nIU¨ì¤iÿÀ+ÂÿñW%KK"5²-CiÖKìŒ #;–A˜ 58©E,˜ æ½k΢SvàYlK³ S^`‰%*#ÃGÝÅ4dP€ãã”ɲ€1ê:¼^.ei³À¥üiþ‘C–¨žÌ%ý>+éÁ^ öÎ~ÝèÈñendstream endobj 725 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ33Ò32Q0Pa3 ²TH1ä*ä25òÁ\Dr.—“'—~¸‚©)—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓE¡þüÿOb†PŒF±ÿSöÿ@Ôÿÿ€ÔÁÿÿ©ãìÿ©ó ò ê>ÿ? uBýP?Øÿ©(ÔlÔ¡Dýÿÿ¿ùÿÿø(.WO®@.Jå×mendstream endobj 726 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ36Ô34R0P0b#Ks…C®B.#ßÄ1’s¹œ<¹ôÃŒL¸ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 Œÿ˜ÿ7°ÿ?Düÿ #ˆ P¨¨’¨?Pÿ1ÿ?ÀH{ôp¹zrrÙðDendstream endobj 727 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚÕ¿‚@ ‡kHºÜ#ÐÀ;#q"AL¼ÁD'㤎áÑx‘Pïü·°¸ÚäKš~¿m<똅S µ"P¢èácmÇŠf_w8cfPn)Ö(—V 4+º]ï'”ÙzNÊœv©=šœ¼@´Aö/ òq.çònï×1x<„Åÿ‚Òç´ò¹¨}æÆ!ú77AÇuÐuÚ¤•í˜Kñ<Ó¾‹+À…Á >ÙÖƒendstream endobj 728 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚÅϱnÂ0à  H·ärO€“¢´bB*‘©L ˆ‰22´*+ö£¥êÀc¾c"û¿… F,YŸÏ²ÿ³‹A/áŒû~oü:àÏœ¾¨uʰXoiT’YpÑ'3õ»dÊÿ|ï6dFcÎÉLx™s¶¢r‘­"?D+§c¥~DRãdZ¡ÞÛ+-ˆЭARÔ«.à·Z”£§T7œ™ÿrBŠ ‘³Ê°U. (]Ÿ«],ᮣD> 4À¶À§ù®±Hsz/iNW^`صendstream endobj 729 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ36Ô34R0P0bc3K…C®B.#S ÌI$çr9yré‡+™ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ê0üÿ‰™˜qàÿÿÿ7 c.WO®@.„S—œendstream endobj 730 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚíÑ? ÂP ðˆC!Ë;Bs_ë¿*ˆ‚V°ƒ “ƒ8©£ƒ¢àæsrôz‡¥GèØ¡4¦vÁÝ!ðû’l_»V©5É¡ºL»Jõ­\ÜbË“ìä1?,7ØPϨå¡Éu0¦ýî°FÝŸ ÈEíÓÜ%gOp2V RfÓãNlr2Ç%æHxfNÊ…—ØNUÔK„×Pe¶±S(ówÁΠÄ7°¸*çCx,˜ÈS,ñ“±0* Ão …æÏ7ùÕ K/Ù/Äa€S|û3ü$endstream endobj 731 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚ33Ò32Q0Pa3 eªbÈUÈej 䃹 ‰ä\.'O.ýpSS.} (—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹C}û?†ÿÿìÿ7€¨ÿÿ©Æÿÿ©öö€Tƒüæÿóøÿ10þŸ¡ö@¨ ìÿÔê6êÀP¢þÿÿßüÿÿ?|—«'W ã[«endstream endobj 732 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚ¥1 ÂP †#B–¡¹€¾[¥S¡Vð ‚N⤎ŠÎõh=JбC1&¶ÕE\|>øóó’?ádäùäј†>…c &tðñŒA$¢GÁ´éìO˜X4 "4 ‘ÑØ%]/·#šd5#MJ[ùh‡6%·y=æ\0`..³ªYå°€óßAK<ý@\À@Q‚#6·§-WQwˆu©;Sðwð ÷?ñkB·KƒnÏú•¾ÍÐ&jÑ×´…„–ìùû1³´Áa®>7k.ˆs‹k|]Åfendstream endobj 733 0 obj << /Length 227 /Filter /FlateDecode >> stream xڵѱjAàY,„i|çtïôN´Œ‚Wbe!V&eŠˆÖç£-ø>B|„-¯Xÿ•D„ÄT±X>ØÙeçŸíuÚLéJ+HÞ—,—×”?8»‰ô²¯ÒêGÛ¹äÛ)öÙϲYoߨŽ^ž$e;–E*É’‹±P鑪SݽêT+ðé†(5OTÓ@u%ƒBMwF=p§±ŒºoHý-euŸaø~ÏÿììÒnlÞ]£Tȇ`1æ)†6AâÆ¯bXiú DAãŸü O žñ¥ÜÆendstream endobj 734 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ31Õ37S0P0bcS…C®B.cK ßÄI$çr9yré‡+[ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]êêþÿoüÿàÿÿæÿþÿïÿÿHôÿùÿ¾ü?æÿûäÿ1þß"~À‰`‚ÿãÿì?€ã ÁÀ€L 7ñÿ?Ðbl—«'W oÆendstream endobj 735 0 obj << /Length 223 /Filter /FlateDecode >> stream xÚE1NÄ@ E?šb%79Âø0;Úì"ª‘–E"Tˆ (·AKÜq­%GH™"б´4o4ßßþv]_ä+^sÍç™k{wüšé6[í{¹T^Ž´o(=òfKéÖdJÍ~|½QÚß_s¦tà§ÌëgjŒ8êU•ʇ R:EZ Ê·cªV¢ÿG@­‚V‡•ŠjçU'Øø„3r¸Ø¹Ó–½µ—£å:ªÓ ¾Fg ñ¾©u·Ð1Ìv¥Mª#†bj¿2;Ý4ô@¿* endstream endobj 736 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ31Ö35W0P0RÐ5T0¶P03VH1ä*ä26 (˜™@d’s¹œ<¹ôÃŒM¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Œ°ÌXv8Á'äá„=ˆ¨ÿ3ˆàÿÿÿÃ,X  wˆ'€þüÿùC=„`?À`ÿƒ¿Aþ<Ø7@ïÿÿ ¡ÿ? ærõä äÃuendstream endobj 737 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚÕÊ+Â@ài*6Ó#0€í6ÝÚ&¥$¬ … (ŠD@@/G[Ç5ê°8¤Ã‚¨Á£¾ü"e9¥”ÓÐP!Zj îÑZ)%Ÿe³ÃÊ¡^’µ¨§R£v3:N[ÔÕ|LuM+Cé]MàD Ì!æßÄ a9PIÒcУd€/-x>ƒo£;wàê*”Ì!aVBÌÝð7õœ8\à ¦ä¤dendstream endobj 738 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚ}Í=jÃ` `-¾A¬䳋M)˜òõPH§ !SÚ±CC ÉÑ|”Á£'ꫯ¡¸’oþ4J$ëüQ²LÞSþâ<ÜØh‡õ'+v É3v/ز«^e»ùþ`7žO$e7•e*ÉŠ«©¨*…ÚÝ#ÐÑ3‘Q€Æs;Ðþ*ÑØ— ø‰/‚Ô@iàh#2ê+1@îð„[|áiöÆ¡ÙyÚÖ(ÛÆsöÄç“G=‘Ö· ·G¨Ô#¸ô¡î–ʳŠßøà•pHendstream endobj 739 0 obj << /Length 234 /Filter /FlateDecode >> stream xÚ}±NÃ0†ÿ(C¤[ú¾'¨”±4R[$2 ÁÄ€˜€‘¡lU›GKß$/à Çù¼0Õ²õéì»Oþ››euÅ%ÇÓ\s]ó[E;jj­ËXƇ×Zw䟸©Éßé-ùîž?÷_ïä×®Èoù¹âò…º-‹ü¢•p ÐÀiB1íŒE¸ mQ,GE!ýA‘Ë0)29÷Nò3Dœ¤hœIƒ¤AÒ iþ¡1µ„„Éæô7ºVÎpHšÉ4Y0Ml¾3ÃEˆg¡°²P1€jDßEæK ÛŽé(kЉendstream endobj 740 0 obj << /Length 267 /Filter /FlateDecode >> stream xÚ}ϽJÄ@àRn“7pî h~˜(Âb`]Á‚Vb¥–ŠB !y´ø&û)Sdw<óƒd„>¸ÃÌ™SŸ¥äRÊq™Ku&ZËsÁo\iLs9Õáèé•× g÷Riή1笹‘÷ÏÎÖ·—Rp¶‘‡BòGn6bŒ¡ØÌÿ™-Ñ‘eFGZ0ý‚Ucc^ÏpGí))€¡$ ·ô)ˆY†€È=ò ÜÆ¯ã—¥[Ç4Yêitìj·uGj†¿ wAlhA´_Bóí“gô6U¹ÊT÷¶2uƒ­Œ¶2H¾–òø’ƒo÷í^î_Ë„>áë>ƈ¯¾ã ø‹endstream endobj 741 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚm±ŠA †±XH³0ywGAnÁSp‹­,Äê´´PÎÚy4eáJ 1&ñ´20$Ã÷g&{C.¹¯'8FÞT´§Xi_Zk?;7T,9VTÌtJEóÍ¿‡ã–Šñü‹u:á•*kj&D+½áAZÔ7„³3á¤C@.¨Ñ‘?|þ³+­2“3FÈ%½¨JU•ªj=¨p®>i05K¦¾¨™ïΓ©9´€ÜÕàê“¶»öÝ'ß-Æ®øão°Ï½#MZÐ'´}Õendstream endobj 742 0 obj << /Length 126 /Filter /FlateDecode >> stream xÚ35Ó30T0P°b 3S…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(000````ò ¢H0ÿö@âÿ,Äáÿ0%#Œzÿÿl—«'W ØšŸendstream endobj 743 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚmбNÃ0à‹Åöï³Ïãú¢|ïGý¿ýÓÀ/¼Òq¯CýyÜófâîίFî®0ËÝtíß^ߟ¹ÛÜlýÀÝÎߣÌO;O$™ˆ9Á 1!˜rðHõâ°Ðdš…Úˆõ4›f¢&˜ç‚p–B•l9{„ôŸÈÃÕ6©8ù,Ö´Â/õvîK¤qb´ûÒ·í¢+tÍÙŠ%+ ¿N»C7¶É"­EB´8Ñè¤V‹êP Í#R¨I*š‡h~ jÁ:¹Rᕤè[I®ÍÆlÍ`Φü˜þÊ—ßò'‰Ä&endstream endobj 744 0 obj << /Length 258 /Filter /FlateDecode >> stream xÚ…±N…` …{Ã@Òåú $÷g%¹^Ltr0NzGÎðh< ÀÈ@¨=…ãâò íééicu]”RH”«Rb)U”·’?ø­XHU­×w>5œ?É1r~geΛ{ùúü¾p~z¸‘’ó³<›Ñ 7g!Ò‘ˆRUc¦ÚµŠ’R;Q2Q½P:X Ja2m0{´þ£ëûtÆ”yíl[ÀJ8ƒ XÏ í¥-ÖAvH¸xÎiO›zÚM¹Í÷YýSgâ¢ÄV6ë•Óo†¬GÐbìÔùÇÉÆï2ޏ´ÀºC’lÄLñUú‡[ÏŸù]~(ß6üÈ?údµ£endstream endobj 745 0 obj << /Length 216 /Filter /FlateDecode >> stream xڭбjÂPà„ ³ärž 7ÁDpI *˜¡ÐNJ'utPÚ-4Ù|-7_ÃÍÕ­…ôæÿmzàÞs/üœ{ÓñCk¤#»Ò‘ŽS]Ų•dbû¨k»‹åFŠRÌ‹&1 {*¦|Ô÷ÝÇZLñ4ÕXÌL_mÌ›”3ulåŽó‡š´Ø]â ðI@B’¨I Ü/àßsÁ„ÌÌÈ'©È¸à€ßsABN–‘jÀ¸à€AOB¾/#ù&-ª¹Çï¿ü'5£o#óRžåŒÔ‘endstream endobj 746 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚ¥Ð1NÅ0 `?uˆä¥Gx¾¤‘^:éñè€bF¬4G Ç GÈØ¡j°]&`£ª>EIcÿµï;Gy:räõžî>áÎófG}¿žÜ=â~@{M;öœ·Ñôòüú€vyJín¸Ð-2ЀÉL]_~ÔEÕI-jV£¸€8«Yåz&Á? …}—Bæ£Öæs훃$–SéÂhjääMM|wSSYNñ-ðµŸN¿m£²8±®NZôTÜÔ2fé5J÷ü’äD 2ЏMÐrà[μ©Ñ‚΂̿˜51ÿ=ž x…_‚²¶dendstream endobj 747 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚ}пJÄ@ð9®LsoàÎ è&p›6pž` A+ ±RK EëÝGÛGÉ#¤Œîs&åüƒ~Ålvfö õIYI)AŽ+ •ÔAî+~âuÐb)u½?¹{äMËþZÖý¹–Ù·òòüúÀ~sy*û­Üh£[n·B´@""‡^­H1Ñj$—¨éÉeŠÅLЯÓ; tËY½Ñ;su ÓVÈfLæ5*}:˜ñ›…ý;8ÝCD§á­×ëxÏ:H:n2Áæfìfu«Y›ÛÿrÐVÿµùißL=Ý’½züÊ! å´äŽmNû@¢½Hö´ h––ö”‡ø¬å+þy×-endstream endobj 748 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚ¥Ï= Â@à )Óäf. ›@LìÀ‚Vb¥–Š‚…hŽ–£ä)SuvVŒ°qŠv–÷–íF? Ÿ"jÔ )ŠiàØ—¼î™›õ ª…1ª ¯Q%S:N[TƒÙT#ZrÑ “µ@g¬ÄϽi¿¶K±s13Þ´é•»úpa¯bg¶ÔZ¢]ð œ 7S­—‚DA¢ Ñ·å±…ÖݼÖ3fRóáÍ(õZ«¡ý¾t~êþ¡s—Wê/â8Á9>?æŒendstream endobj 749 0 obj << /Length 290 /Filter /FlateDecode >> stream xÚU±NÄ0D7JÉ?!þH"]ÒZ:‰HPQ * ¤AíHüX>ÅmJ–—Ù=N:š'y¼ž™õ8]öƒëÝè.7nÝË`ÞÍn„Ø»i:Þ<¿™ýlº·MwÙtó­ûüøz5ÝþîÊ ¦;¸G=™ùàˆÂFD53h™W"Ï ),m¦*S]¨NT1Õ™š(WB¿X^lÁöÄxÆM™”E'YÞ¶HB’b3œ-—ªPÃü…?IJqD´¶bmN £¶MʬJÑÆ<K“e›àÑAñzó‘VDlaAD‰ƒ!I„W¶J{Ææ?1߈íx’^¶Ž~ÓM“ü•-ò{ ÊÝ(kÏM;¯Ú†$‚¹žÍ½ù«C¾endstream endobj 376 0 obj << /Type /Font /Subtype /Type3 /Name /F39 /FontMatrix [0.01004 0 0 0.01004 0 0] /FontBBox [ -6 -21 114 70 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 28 /LastChar 122 /Widths 750 0 R /Encoding 751 0 R /CharProcs 752 0 R >> endobj 750 0 obj [62.24 0 0 0 0 0 0 0 0 0 87.13 0 0 0 0 0 0 37.34 31.12 0 0 56.01 56.01 56.01 56.01 56.01 56.01 56.01 56.01 0 0 0 0 0 0 0 0 84.6 79.64 80.91 85.86 73.53 70.42 88.05 0 41.72 0 0 67.31 106.26 87.59 84.13 76.53 84.13 83.56 62.24 77.91 86.09 0 115.71 0 0 0 0 0 0 0 0 0 54.46 62.24 49.79 62.24 51.11 34.23 56.01 62.24 31.12 34.23 59.12 31.12 93.36 62.24 56.01 62.24 0 45.76 44.19 43.57 62.24 59.12 0 59.12 59.12 49.79 ] endobj 751 0 obj << /Type /Encoding /Differences [28/a28 29/.notdef 38/a38 39/.notdef 45/a45/a46 47/.notdef 49/a49/a50/a51/a52/a53/a54/a55/a56 57/.notdef 65/a65/a66/a67/a68/a69/a70/a71 72/.notdef 73/a73 74/.notdef 76/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85 86/.notdef 87/a87 88/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118 119/.notdef 120/a120/a121/a122] >> endobj 752 0 obj << /a28 697 0 R /a38 698 0 R /a45 696 0 R /a46 695 0 R /a49 742 0 R /a50 743 0 R /a51 744 0 R /a52 745 0 R /a53 746 0 R /a54 747 0 R /a55 748 0 R /a56 749 0 R /a65 699 0 R /a66 700 0 R /a67 701 0 R /a68 702 0 R /a69 703 0 R /a70 704 0 R /a71 705 0 R /a73 706 0 R /a76 707 0 R /a77 708 0 R /a78 709 0 R /a79 710 0 R /a80 711 0 R /a81 712 0 R /a82 713 0 R /a83 714 0 R /a84 715 0 R /a85 716 0 R /a87 717 0 R /a97 718 0 R /a98 719 0 R /a99 720 0 R /a100 721 0 R /a101 722 0 R /a102 723 0 R /a103 724 0 R /a104 725 0 R /a105 726 0 R /a106 727 0 R /a107 728 0 R /a108 729 0 R /a109 730 0 R /a110 731 0 R /a111 732 0 R /a112 733 0 R /a114 734 0 R /a115 735 0 R /a116 736 0 R /a117 737 0 R /a118 738 0 R /a120 739 0 R /a121 740 0 R /a122 741 0 R >> endobj 753 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ32Ó35R0P0WÐ52T02U03RH1ä*ä24Š(XC¥’s¹œ<¹ôà ͹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿ7@ц`þårõä äܧàendstream endobj 754 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ32Ó35R0P0RÐ52T02P03RH1ä*ä24Š(XC¥’s¹œ<¹ôà ͹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿ7@ãÈ@pÿr¹zrrÞ”Þendstream endobj 755 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ37Ñ32W0P°PÐ52S03R† )†\…\¦ aS¨Tr.—“'—~¸‚©9—¾‡‚)—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Bý0`€PÿÐi˜<—«'W ¦5°endstream endobj 756 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ó35R0P0b#CCc…C®B. m„@ $‘œËåäÉ¥äsé{€IO_…’¢ÒT.}§gC.}…hCƒX.Oþûõê?üÿƒ žýþ.WO®@.!"$†endstream endobj 757 0 obj << /Length 168 /Filter /FlateDecode >> stream xÚ31×37Q0P0UÐ52T01V03RH1ä*ä26Š(XC¥’s¹œ<¹ôÌ͹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. @ ",@Dˆ(€@Ä f€3˜h€ì`¤ŒDð9!'l°˜7§éƒqšŽ0x`LGŒÓt„Á8MÇä‚ËÕ“+ 8Ô6Øendstream endobj 758 0 obj << /Length 111 /Filter /FlateDecode >> stream xÚ32Ó35R0P0b#Ccs…C®B.Cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]øìÔ¨ÿðÿ ‚xöø°Üê¹\=¹¹Cr7ƒendstream endobj 759 0 obj << /Length 109 /Filter /FlateDecode >> stream xÚ37Ñ32W0P0U°T0³T06RH1ä*ä23Š(ƒ%’s¹œ<¹ôÃÌŒ¹ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿÁà„úÿF3 €î.˜{¹\=¹¹X@endstream endobj 760 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ}É+€0DQ?«˜ðúÚ4TóI¨ … (@" àÙy!Á#®9×i •êisZÇE±Ãú Ã7æ E„ ´Ò0@bËó¸VHÑ•THÅQi&ÄŠ)¥û/Ô=–Þ-˜endstream endobj 761 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚ3·Ô35W0P0UÐ54S07U0µPH1ä*ä2³Š(˜›@¥’s¹œ<¹ôÃÌ,¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. @PÀÀx€;ã3„ñ€¹…Áø€Â8ÀÀ΀Âjá‡0øp0€zå TP¯ ˜TiÊj©3d@nÄΰ¹,@ŽE0êÿCÀ(ýÿœ×7Ôò1þC÷(¦Sá¾ 3ÚèTŠH.WO®@.{3x$endstream endobj 762 0 obj << /Length 170 /Filter /FlateDecode >> stream xÚÕ1 A Eÿ²]¯8;êÀvë N!he!Vji¡h«{´9ŠG°´ãd±QÄÞ<~~ „¸~·p\p/•³ìJ^[ÚÑ L}¡­V[ª™9J2ãä’ >ì2ÕtÈ–LÍ ËÅ’BÍ@.ÀY®*åtÀßà“}4˜I“½¨™kÆ\Ðê7B <µÄ/z‰¢ñ…íž¿aúš×³?I£@3zóÕºÃendstream endobj 763 0 obj << /Length 257 /Filter /FlateDecode >> stream xÚ}бNÃ0€á‹$; ¡ÔMhã1†dèê4×¥?`ãÁ!$úкÙáÝöàMø ÍAž]endstream endobj 764 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚÑ= Â0àJ‡Â[rß LK©¥S¡V0ƒ “ƒ8©£ƒ¢s{4Ò#tìP“ö¥qj |ä‡÷Ã[Æ‹$Dõ^†Åx àQ¢Î¾>ê‡ó 2ü€Q|£n‹->¯+ðl·ÂxŽÇýˆ¥^oÇémIiTEí¸²êud=X4ƒi;87v¶LNó7މoò™üTÏŒêd²T}Xö÷_õ§—QOË^Wþo5Q;ŽG2Ê7öOõ×Ò<êq.ÖœÔWX ØÃuRÖäendstream endobj 765 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚ½‘=NÃ@…Çr±Ò4{ÏÀ¶D¬¤ÁR. ¢@©€’"´ØG›£ø)S¬2ÌîÄ`qVZ}«íü¼×,/W U´ ‹šš+Z,鵯*«^Yæå×–OšÇòNÃXv÷ô±ÿ|ÃrýpC5–z®©Úb·!hd ‹p®,DN)"Á³†HËà„5¥÷à•úKs ý Sʨ¥„ã32OìÙÉ[°˜±àXæ—žÛ‰aNÇý_!ù'Ný¬ÿÄü<ߌ'£íã~hûºÁèÓÃéS€éu ¦ß×¹aH®@vŒvhYÕ8êïG0?b õÇ4›UýÓˆi¼íð¿±q> stream xÚ37Ö32V0Pa3 Ss…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ@˜þ¥ÿÃè õ?ØÿÓp,ÿBóÿ‡ÐÌ@@4#P2Íðÿ„®ÿ€JÛÿ@£ÿ@hytúú?iBöÿAu?œ†ú«þª¿aá¥aá ?öÿ¨á[ÿþ°ø@‰Ÿ?P\®ž\\2oÉ™endstream endobj 767 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ}б Â0à+Â-}½'0­Út µ‚ÄI‡‚¯ì˜¡Û¤…¦VÇÇår~>ÅS hR(Šéâ#^ô¦-Ç &ÙŽ"ŽlUÜ"“kºßgdÉfA!²”ö!”)isÞÀKT •¡oéY<py~# ³ˆ?@Iæz­S=©Z¿ˆ¿‹Ah1s–Ì!oâ9)ù–¹ÁÓʦ«:#Ç¥Ä-~·Êendstream endobj 768 0 obj << /Length 262 /Filter /FlateDecode >> stream xڽѱNÃ0à«2Dº%à{p<¸-“¥R$2 ÁÄ€˜€‘súh~”> stream xÚ37Ñ37V0Pas#Ss…C®B.3 ßÄI$çr9yré‡+˜Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÿ‡H|ÀÃ`¨ÿÁÀÀøÿÃÐdüŒ!íAœ b"—ËÕ“+ ¸0Õendstream endobj 770 0 obj << /Length 101 /Filter /FlateDecode >> stream xÚ36Ó32T0P0aSs…C®B.crAɹ\Nž\úá Æ\ú@Q.}O_…’¢ÒT.}§gC.}…h 1±\ž. ÿÿÿÿƒŒê0 uŒî'.WO®@.•õy9endstream endobj 771 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ35×31V0PaScSs…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þVŠ¡þÃ0¤ØRüPŠ %BÙ£Põê?˜b„PÌŠÿ˜ªÿÝÿ8(.WO®@.‹†endstream endobj 772 0 obj << /Length 252 /Filter /FlateDecode >> stream xÚ}Ò±jÃ0à·è ì{‚ʦiëBÀ¦P…vêP:5;´´ÒÁ~°~?‚Æ &×S !HÁŸNËw×ÅÙåŒ :—[UtqE«ß± ½"<ÃÇë.tOTÍÐÝI]sOŸ_kt‹‡*Ñ-鹤â›%1oAŽföÌc ‰¹ ´Bh÷à˜?˜EüæN8¸áBØJ?ÁÚ¨!f.ÙuÓJvÓÅ4ØBL-³)*É>O’}“Rû”µWÃ$ó­îSÚÑt)ÍÎBJÍÙ4ÿž „á§lý)ÖCÂñÀ°0y¯x¿;G´Ýþ‰· >â:Ö (endstream endobj 773 0 obj << /Length 261 /Filter /FlateDecode >> stream xÚeѽJÄ@ÀñYR¦É#džÀMü¸\·pž` A+ ±RK EA±ˆ¾™¾I|ƒ³Sˆgwv/'W,üfþÅn³¿ÓìQEþ4»tÐÐuw8›Ë\ùÑ/®nqÑ¢=§Ùí±Ü¢mOèáþñíâôj´Kº¨©ºÄvIÌ@ƼÚÀ˜À èøU´Á;€é=zÅ‹¬ž'|+ž|1 #G”R (¤ø¹¤2))€RT¸58BÒ )*¤¨¢BŠ ˜0Dtc„㈒ß(rþTd¾†À¿á±<\B¹…"!OÈL¬ÑmÁ%”‚Á£è!ü)ä Y‚Ùµx†n«Äºendstream endobj 774 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚµ‘1NÃ@EQ Mã#ì\Ì*Š •¥$\D‚*J(SAíÍGñ\º°2üñÈ "JË»Ïþ£ïÿÍã]>‘{™Êm”,—éƒ|DÞr!B~ôÊzó’Ó¥d‘ÓÈœ– ùþúùätöú$Pçòϊ˹‘vdW¢º3Vª-p¥uèÁµ›/ˆ «Æ—=›:Ô`Nzº¸wÏèʼn¬8røöØ,œÍVÃpÚž£¯Ý¥xèçóœðdnÿ¿&8둉ç°;æb9©•ßÞ³µ0ÔrEÓªõUXîЂyjóÖA‡^ªýŸó:œŸŸ'?—üÆ¿°ÛÈIendstream endobj 775 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ33Õ32W0P0b3Ss…C®B.S3 ÌI$çr9yré‡+˜šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ˜ú¡þA¨ÿ õ?øÿQŒÿ€( Ä Êþ2%ÿ…úO&…b ª Pk!Ž€: ì@ˆ'@Ôõ¬q%vŠËÕ“+ .Úª'endstream endobj 776 0 obj << /Length 233 /Filter /FlateDecode >> stream xڥѽ Â0ð‡Â->Bï4bÛ­àØAÐÉAAëækù(>BG‡Ð3͇‚uP=¤òAYý‡Ú¯K]¹k̵ÚpÍ&ŽËœÛÈ…MšÊgd ŸÎoç°Úk|x–¯pÿ +‡Â@Zä/0ƒ´d73(Mº\5|¢³3¿WU =e0ƒ>¬ßendstream endobj 777 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚeϱNÃ@ à?êÉyƒÆ/iJ"•¥‘J‘È€D'ÄŒ X{÷hy”^åc¡¯êŠ™D5‡=îþÙü:þé§“ÎÇ|ñ_.þ(Ø_’ IŸ˜4B±±ÌCjÑz8½–nZ:Ð7¡6endstream endobj 778 0 obj << /Length 152 /Filter /FlateDecode >> stream xÚ33Ó31V0Pa3cS3…C®B.SK ßÄI$çr9yré‡+˜Zré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìÿƒANúÃÿÌÿêi†úõ Zþ@ˆæ‡Ó5`šNW€ifœôýà˜fÄI3€i0™4?(pÓ\®ž\\wG³æendstream endobj 779 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚíÑ1‚P Ð’.^@?'ILtr0Nêè ÑÍGã(ÑP[ˆ‰““£Cû_Û´Ë‚Á0$êûy4Šhïã CmJ9î&»#&š5…!š¹´Ñd ºœ¯4ÉrJ>š”6>y[ÌRbæ\æò €[B§øãgpq ‰¸þD¬…b¢ ¤û7 ›%é¸ÇXzÂ’¯²+pîC‘7 M=$¿©¯¬qÓ˜«ŽÀY†+|œ¼Tendstream endobj 780 0 obj << /Length 273 /Filter /FlateDecode >> stream xÚ}нNÃ0ÀqG"Ý’GȽ8®DK#•"‘ &ÄD;2€`«Ú[ÝáÇûç ìüþØ>9ÌŸ¡Z µ&&òÿÀðߘ„êÞ˜­¢aôŒô/JEÍ802F¦x)åZ0SðýFf ÖÇàa2+t o"A$h\(ÄØ+º_$ n•RMLœ(š˜)8Q5ñ¥‚[gõFÁ‰ë€¦Wpb࿱Ñ® Ø0´÷°¥æJªGÐW> stream xÚÑÁJÃ@à 9ö’7èî hšÒÒZÁ=yOêу¢ÐC1yŸÄCÄYðrkKÆ™ÝMEÛƒ·YþÙ?[Ï'j¬&ê(UÙ\Íæê."›Òp¬f ÷rû –¥H®T6ÉERž«ç§—{‘,/NT*’•ºNÕøF”+…ˆZ"(ÐüǶ…€Wëžœ;ËÁ÷ b#yí6ì sû"¶ßÇü¾ô£s¨Ý>‰Âæ·yGA¡¢Ú9ß¹±ŽÉ!yCacp^Wƒµµ$ä–ެÛéà ¥°¹·–ƒ;ë »êBú9>׺‰vݱ Õ°µî,û˜ü¡½)”7²?­c”䝯yD¿‘·Ö¾S¨míL?h:ƒ3E©öX÷ÞCÛà›7ÞÜÈWìΛÛ9à‚i÷-ÙÚ›CyÛvø,qZŠKñ ydõ•endstream endobj 782 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚuν Â0ð+„[ò¹'0­~€ÄIí›™Gé#tì =猪‹!ùAþ¹—úù€RÊÉG4Ó!Ã3vYªW}ØŸpR ßP>@¿}±¤ëåvD?YM)C?£mFé‹AhÀ0W–¹pµ•(Ô†Å&áRŽ_ïÕGW«¶RM©Êú1|šŠw5áFò—ú«ýö ]Ÿ÷æ·ñ¯¬5IW¦†º'C»§{p´Ü:ކ«ƒV†#Î \ã 8.yendstream endobj 783 0 obj << /Length 191 /Filter /FlateDecode >> stream xڵϱ Â0ÐH†Â-ýï L«–ºj3:9ˆ“::(:·ŸÖOÉ'dìP{^ŠCEœÄ<¸Ü%¹$“Q”`„c^ Ïc¸À4å¸ }âp†Ì€Úâ4µä]Pf…·ëý*[Ï1•ã.Æh&GA‚}1è”t@%’c55lË)É1•’¬(*ÉÚúzí¼Ãºgã û¶?øqÛÛ[®ë„­Da_½=@ÖMÐ é4ÕBÚ3²ò'`a`Otí„€endstream endobj 784 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ•Î; Â@à )ÓäBænbÄ*#¸… •…X©¥…¢­Ù£å(9BÊKÆY#X[Ìó‚?›M³ŒbJ]-(Ó9Á¦¹ô±kÝâtÅR£ÚSš£ZË•ÞÐãþ¼ *·KJPUtH(>¢®> stream xÚµ= Â@FR¦É2'p³$!vÁ-­,ÄJ--­o–£è ´‹dœ±ò¯æÁ·3ì<6{AŒ†\±Æ¸+ [ˆÎDi,7P3ŒP#¾eƸßÖ ²É5¨çƒ˜->E) ït´ÿD›ŽL®Ì”Z&U¼×!˧Òm,—J¯¿–yÿ"LŸXœÞI?ðåµ]ìÀ&^-Vìæ±gÇž·Zêø¿n$ù̴ɦ†¦p h¥Áendstream endobj 786 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚ]ν Â0àS:wÉ#ä>m©Ð± ì èä Nêè (¸¥à‹õQò3ã­ þ\È'›3ʇEÁ)çrFçï2:RÞߥ}ì¶×”¬$S2{ZÏù|ºì)/&œQRñ:ãtCuňCèà:DávG|‡iÊFy”­öÐV;¡tPo¼0ðáƒÌ7ÀæÙ÷âª{äKxÕNÄ. P¡5­ô €’’ÒÒ‚¦5-éQle€endstream endobj 787 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ3²Ô3´P0P0a S …C®B.c ßÄI$çr9yré‡+›pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä?000þÿÃÀÀþÿ?÷£¾ÁþÁÿ†ÿÿŒÿ¡óFÁð¿FØ1 bˆÿ ÓÑbõÒøÿÿÁåêÉÈŽXo5endstream endobj 788 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚ…½NÄ0 Ç]1Dòropõ @Z5§2Qé8$: ÁÄpbÆÁœ¾¯”‘WˆÄÐñ†SŒVHLDÑ/–ý÷GìÚ³ÖQE Ö-¹–šszªq®oE«ÕzÜáºG{O®A{-~´ý ½¾¼=£]ß^RvCÛšªì7rJ“€xþâP0ów4Éð{\ .c9‚Øð3vüGPŠ<þ'åÌQ›hµ´²¶•ư`>=G€¥:`©cͼÈì&yÞ™³„RMµŽ¸Œð'”픣 ]xÉäAZƒÒ/»?œ¢ªôòŠ^s‹¤“›£®J>¢[’1<«Øð€W=ÞápÞ˜Óendstream endobj 789 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#S …C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ3Á$;˜d¦%YH2ÿÿ$ùÿÿ’ò@Aæÿ6Œÿ˜ÿW€É òÃÿÌÿ ‘ H$Ã’ÿÿÿ±ÿÿ“ärõä ä WžHendstream endobj 790 0 obj << /Length 123 /Filter /FlateDecode >> stream xÚ32Ó35R0P0b#SSK…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØÿ0ðÿ!ùÿ("”ªÁþ3Ô#!öÿ ÌÔFÿÿÿ€#.WO®@.œNpendstream endobj 791 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚÍÎ1Â0 PwõÒ#Ô(i‚ í©‰ H01 &`dÁœJ\,Gér„I+: F,=þ°*G² ŒÒ ¥rBjLyI‰gTÝ9£i>dûVņTbfI×Ë툢ZÍH¢¨i+)Û¡© ë¸íEì¿ Yßëú¿Lì!æO`ý’@7Ú[§=·Û¾9nÙ…ÝØû4?ú×#nç×ø`9yÚendstream endobj 792 0 obj << /Length 198 /Filter /FlateDecode >> stream xڵб Â0àJ†Â-}„Þ˜TZèV¨ì èä Nêè èj}´¾¯ÐGè˜!ỗƒ:Èw÷'„dfœ¢Á‰ßiŽYŽûNf¾6\ò`w„²½Æ4=÷]Ðõ/çët¹œbºÂM‚f u…~ÑCQýÓˆº¯*ÇSÕK¦cã;[È©›èXeÙ°c£–ÅF:Ô‹’!÷ö1HÞ¿B !ù›%ލõÔ‰=Ûˆ…ec'lô’ü_Ù‚ì§0«aOP‡Œ±endstream endobj 793 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ32Ó35R0P0b#3S …C®B.#˜ˆ ’HÎåròäÒW02âÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ügø„Øÿ302ôÿÿ8ârõä äÉWøendstream endobj 794 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚÝÍ= ÂP ðˆƒÅ#4'ðµˆ>AÐ vtr'utPÜZqðZÞÀHðÆ¥SqêàB~ù ±ýVÇŠ/mž&+Û€l»ZÊr°Ùó(b³Ûe3Õ.›h&§ãyÇf4KÀ&”U þš£P¨ 8¥fN„¢†œ†HT €€Tå]qsC§î‰ç¨Q\Oò2ªÚ}¤»q^ž©ãAqVUB±«Š¾ÿE@î7ÀýO"^𦋵endstream endobj 795 0 obj << /Length 151 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#cs…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ1Ô`øÿùÿ Éÿÿ”gþ$mÿ7°ÿ«’Ìÿ>0Éÿþ`þ‰l@"üÿÿýÿÿ˜$—«'W Žá‰endstream endobj 796 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚ31×37Q0P0bScs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Œÿ000ðÿÿ$ëÿÿ’ÿþ700ÿc°ÀÀþ‡Aþÿ2 \ i$Á €Êêäò?ˆl •Ä4b>Ä.dÛ!îp!îdræ~ùÿ€$Ø_\®ž\\,6nªendstream endobj 797 0 obj << /Length 193 /Filter /FlateDecode >> stream xڭп‚0ðš$·ðÞ h[I;˜èä`œÔÑA£3>Â#02Î+šhÔM‡þ†ûúçK£`¨#Ô8Âc¤1ˆqgàaÌSQðˆ¶H-¨†1¨ÏAÙ9žO—=¨t1A*õA½›¡ ]‘O›Pö±’JA…äy)Iˆ¼r&õÓ~ó®ßþàÇmý—·’ªkÂ]Ÿ{77”Ôx­Ü¿f}N$¹nýCâù&L-,á‹ endstream endobj 798 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚ­Î1 ÂP à‡B–¡¹€¾>ÚÚÍ‚V°ƒ “ƒ8©£ƒ¢›ðr4½I ›ƒ#Uuù†„?ùÓ¨•PD15m›RKqF ‹kL2F”ƯÕ|…ÝÍ„’ Í@çhÊ!m7»%šî¨GMASKÑ Ë‚Àð©†\.!ƒö97„;9ûwWð…ÃÚ è*¯=išÝ§ÕSùA÷uSyïÚA­û<»‰öÔÖìÉá& NÎj(GÕMÀ¿trÿû%Žñ¢‰›endstream endobj 799 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ3¶Ô36V0P0bcsJ1ä*ä26òÁ" ‰ä\.'O.ýpc.} (—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Ã?æ ÿÿñÿöÿDM}Ãÿ?þ`ÿ÷áÿæÿ@Ä8ÑPß$쀈` 4'þÿÿ‡Ap¹zrr8WÖendstream endobj 800 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ%Œ= ÂP„7¤¶ñÙÃCcðL!he!Vji¡(X„$Gó(á•[„ŒûHñÁÎÌθ|2ŸËT\`&.—kÆv™éi!¸ÜyYrz—qº5—Ór'¯çûÆér¿s×r²Ê™ËµPá1zš|ÇZP¬5EZi7ðé Z"˜ü¨±£Úø&€ýذ°£$|5Võž"ƒz¨»ÊÂÎ6m¤ð#ÛQ€~‰oJ>ðÓaendstream endobj 801 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ36×34V0P0bc#Sc…C®B.#K ßÄI$çr9yré‡+Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ø0°<¶‡âz þÁŒ@ÌÄòÿÿ?ø„™bTÂðÆÿ ÿ7~`øøƒýÿ@Ç400ÿcàrõä äÍGRendstream endobj 802 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#cs…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ30ØøÿŸÁþ?’ý?ãÿÌ@5J2"‘Ì0’ñ?;ˆlàÿÿ¨Ìèâúÿ€¤üÿÿA*þÿçrõä äðŒendstream endobj 803 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚe̱ŠÂ@Ð7¤¼&`Þ8Éš …(¨ ›BX+ ±RK EÁBÐɧ䦜"8ÞqaZÜ÷=¸yÒÎ$‘/$ëI§+ë”wœå良þ±Úò¨`=—,gýƒ+ëb*‡ýqÃzô;–”õD©$K.&âœQÎ~8¢˜¼-x¥)؇%‰à Vd‰.hUAëmPþ[‡0ªÃ+|D0|D] ×zy‡ÊÝ^Öœ}÷b‡Uc\6úù?ù»à?#Zhendstream endobj 804 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuαJÄ@à9R,L³opÙ'p=öÂÎL!he!Vji¡(\È>Ú>Ê>Â^ñÈ8³¦fø˜~w~ráLeN¹ÝÚœ­ÍsoèV> stream xÚeͱjÃ@ `-~„ÓôìÆ&lpˆ‡B2e™ÚŒZš-?šó&†¾ÀA–Œé– î㤻_*³—‚2z•S¼ÑbI_9þ`QJi©ŸßØthwT”h×ÒEÛ}Ðßï鈶ټS޶¥}NÙ»–˜a÷lÌ}ì!â!xHĢ µK{Ñ0S%¦ÓYLæIŒÙ±„4¬^½vA:ÓCžõÿ5ûÏ2?¹j,TÓkØ„pÂgÙ àe3D^63ÔìŸÅU‡[¼}l*endstream endobj 806 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚeϱJÄ@€áYR¦ÉÜÎ è&^¢‡óSZYˆ•ZZ( Wœ$/%ñEò[nnœYäÚ|Å,ü3[åû%åt@{Å!•Ç4?¢ûŸ°¬dšS5ÿ}º{ÄeƒîšÊ ݹÌÑ5ôòüú€nyyJºÝ”ßb³"fo8ü7a êLìàŒ¸{؈kq€ÐàEoÄÚ›A ª I¿sLÅlL;q›‰é6‘­˜ð,ú)þˆŽ"pøkë'ëaÒö“šß “6ª«jùTº…vûMtÕ%ü¥yþÖpû®É7«±šc%^–Æ ð¬Á+üš~oìendstream endobj 807 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚMÎ? Â0Çñ_ÉPxKŽÐwÓÚ‚bÁ?`A'qRGE¡ƒÐ-Gñ;ˆñ¥.ù@^ø’W EÁ)çáŒ9ñ)£+åa–†kx8^hV‘Ùq^YÉ”Lµæûíq&3ÛÌ9#³à}Æéª—Þ{÷G«¼-m,@{L¡?˜ y㉲§C¦|Ï uäj%@ª* éy RM§œT—rR)§~ØØI;Ýó¶Ri+&¶éPÚ¦¼•õþ¡eE[ú´åfNendstream endobj 808 0 obj << /Length 188 /Filter /FlateDecode >> stream xڵб Â@ €á!K¡y½^) µ‚7:9ˆ“::(:WðÅ|”>BÇ¥gÌ quù†ÜpùcÒij(&CMÆPbè¨ñ‚³Œ‡1%‰9œ±°¨¶4ËP-yŒÊ®èv½ŸPë9iT%í4Å{´%Aà r @å:÷ì!èÁÁ¨ƒê1n!… Dµ1×¶Ó}á˜þüúRð[ñ’žaçcj)’6©”^_.7ø\7ø!Ý—endstream endobj 809 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ31×37Q0P0bCS…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä€ÀDübvQ$þÿG%úAüȨÿÿÿÁåêÉÈA2\endstream endobj 810 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚmÏÏJÄ0ð¯,Ì%ÐZ%c‹ã7¢â!¿02I†ñ||ë7\Cï7ƒßwò"ýȸµÐ ϲ¥¹óý(ͳÒÌ×þðz|’f{sá;ivþ¾óíƒÌ;÷ hD¡šQ©žàÒ¤¨§Ë„RcXJM!š4A3»~ ëB"S$g»âÖ~HàU_Dpüb0_Ù;܉ÔÖV³œÃó\°baÅ2ã U".’z!°âÈÜHF‘ùÍ¥QΨÉ$é?Èå,·ò ÔI—³endstream endobj 811 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚ}±JÄ@†ÿbaš¨‘endstream endobj 812 0 obj << /Length 188 /Filter /FlateDecode >> stream xڕϱ Â@ à–…,÷6Oàµx¥K©P+ØAÐÉAœÔÑAQèP°ÖGé#tt«—ªtò $áBb’yb8ä… sløÑLdóPRiœo”—¤l"Ò[%]nùùx]Iç»ÛjÁGûåDeÁŽãø­ÅQ#¸„o8ˆîHúPÁf0…ìEzlE¿&0ƒ5¬`/ºèA»ªØˆ [Í` køƒ¼fêïêaÂDZ—´§/mÇzendstream endobj 813 0 obj << /Length 229 /Filter /FlateDecode >> stream xڅϱNÃ@ `G"y /€t~z’([+•"‘ &†ªSadÁÚˣݣänÌ€âþ.R;t`ùÛ÷û\·ó¶–…4rWJ]ISË[ÉŸ\µ(¢Üüuö¼îØ¿JÕ²D™}÷$ß_?ïì×Ï÷R²ßȶ”ÅŽ»ÜQt=Ñ¢SÕþ Éø5’1=˜$€€ÿÈmØÙÛ #¹©@^Ê3,êI#æ4Þ€óáD:3^pÆ* …QO¤+’5 MñÃÁâ—”i\Qn+ ¥YrŠevœE3¬á‡Ž_øÒÊ„rendstream endobj 814 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuÏ=NÄ0à¥Mã#x.N´ŽV[YZ‰HPQ * ¤Aíp³%G0¢ÀE”a²» ÍgûYš¿<]z®ØóIÍÞsãù¡¦gZ¬4¬¸iv?÷O´nÉÝðbEîBcrí%¿¾¼=’[_qMn÷5WwÔn0€L@)ÒéËôC9 vE‚À¤B`s9!ä£Q1[²b 6)fˆI«r<£wùò)ùê¤Ó3öÚ5 ‡¤Ø,yÏx@‚þÿ#ü0n±yÏnÜyð4¯0è2±/ä]÷AÛÃhmÑyK×ô •+™€endstream endobj 815 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚϱ ‚`ðáÁ{2á3—H0ƒ‚š¢©Š‚†H­GñĺïŒt©¡~Ãÿ8îNý@Ñ€|êy¤ò‡´óðˆÊãã él%è®HyèÎ8F7™ÓùtÙ£-&ÄiLkžÙ`ÓtÅ0Ÿ\Ù!ej±K±ó·7ûW'Ó†%À ¨ÄRkˆf¡wZ²™‡>ò¨¾EL¡µn5+­ÙÑêh7–­ÎOÿtä [ž°ôù8Mp‰/¶(t±endstream endobj 816 0 obj << /Length 252 /Filter /FlateDecode >> stream xÚEнN!ð!›ÐðÌ èÞæØ\®"9ÏÄ-L´²0Vji¡Ñš}4…G ¤@Æ™ÓxÍ/| Ãüîrçqƒ/&ôg/“y7Û=/npžwžßÌa1ãn÷f¼áe3.·øùñõjÆÃÝNf<âã„›'³­– @ ÐªW] ¤!ƒËŒÍ6-ÌPÜ™,¡ Kq±£$d—,ÕÀô¸D˜šø6%# "€H!%™fýÍÛC‰TmT¥E «¦Wà>\.¸ÞA ê8ÓHàb%g]Ã_f~Q‡˜ô)Á)K?ÐÅ\/æÞü|e“„endstream endobj 817 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚmÐ1NÃ@Ðo¹°4°s°­ØŠR­‚„ $¨(U ¤A½¾ WñMØ#¸ÜšapJ‘æ³Úù·]_®[®¹å‹†Û–»–Ÿz£ÕƆ5wÝádÿJÛžª^m¨º±1Uý-¼¾Pµ½»â†ª?6\?Q¿cä Ài‚&dš r¢˜†2!Œ.ÁG?pS8’ôÈ|9‡]ó'ø?‚XP‹T)æL%—ü[2Õ/±jNl¥›þ§”>9Û’¼5þ‰FX ü”éà¢=Ø … Œ–W¨UÊUG@—˜ºîéž~Tƒ–endstream endobj 300 0 obj << /Type /Font /Subtype /Type3 /Name /F38 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ -6 -26 97 62 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 28 /LastChar 122 /Widths 818 0 R /Encoding 819 0 R /CharProcs 820 0 R >> endobj 818 0 obj [53.05 0 0 0 0 0 0 79.57 0 0 0 0 0 0 0 0 0 31.83 26.52 47.74 47.74 47.74 47.74 47.74 47.74 47.74 47.74 47.74 47.74 47.74 26.52 0 0 74.27 0 0 0 72.19 67.93 68.96 73.23 62.74 0 75.08 74.73 36.21 0 0 57.43 90.64 74.73 71.73 65.27 0 71.62 53.05 66.43 73.46 72.19 98.72 0 0 0 26.52 0 26.52 0 74.27 0 46.42 53.05 42.44 53.05 43.77 29.18 47.74 53.05 26.52 29.18 50.4 26.52 79.57 53.05 47.74 53.05 50.4 39.33 37.66 37.13 53.05 50.4 68.96 50.4 50.4 42.44 ] endobj 819 0 obj << /Type /Encoding /Differences [28/a28 29/.notdef 35/a35 36/.notdef 45/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58 59/.notdef 61/a61 62/.notdef 65/a65/a66/a67/a68/a69 70/.notdef 71/a71/a72/a73 74/.notdef 76/a76/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84/a85/a86/a87 88/.notdef 91/a91 92/.notdef 93/a93 94/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122] >> endobj 820 0 obj << /a28 762 0 R /a35 761 0 R /a45 760 0 R /a46 756 0 R /a47 757 0 R /a48 808 0 R /a49 809 0 R /a50 810 0 R /a51 811 0 R /a52 812 0 R /a53 813 0 R /a54 814 0 R /a55 815 0 R /a56 816 0 R /a57 817 0 R /a58 758 0 R /a61 759 0 R /a65 763 0 R /a66 764 0 R /a67 765 0 R /a68 766 0 R /a69 767 0 R /a71 768 0 R /a72 769 0 R /a73 770 0 R /a76 771 0 R /a77 772 0 R /a78 773 0 R /a79 774 0 R /a80 775 0 R /a82 776 0 R /a83 777 0 R /a84 778 0 R /a85 779 0 R /a86 780 0 R /a87 781 0 R /a91 753 0 R /a93 754 0 R /a95 755 0 R /a97 782 0 R /a98 783 0 R /a99 784 0 R /a100 785 0 R /a101 786 0 R /a102 787 0 R /a103 788 0 R /a104 789 0 R /a105 790 0 R /a106 791 0 R /a107 792 0 R /a108 793 0 R /a109 794 0 R /a110 795 0 R /a111 796 0 R /a112 797 0 R /a113 798 0 R /a114 799 0 R /a115 800 0 R /a116 801 0 R /a117 802 0 R /a118 803 0 R /a119 804 0 R /a120 805 0 R /a121 806 0 R /a122 807 0 R >> endobj 821 0 obj << /Length 327 /Filter /FlateDecode >> stream xÚ•Ó¿j„0Àq%C ‹`ž *½B]®W¨C¡:”NmÇ-ív¨–GÉ#dt—&æ—?RiDø¨ ~ýi]_\V´¤;½×WôzGß*òIê’šMš ¯dß‘â‰Ö%)îôYRt÷ôûëçû‡Z‘â@Ÿõm^Hw ‰YmVìaܶb«Nß4RbÕXM›Î”\u®N›n•ònbÁý |ä± –mˆœbçÞ©¶‹LEæ´]$â±±7æ!3äi»ÈlŒzçÚ.2Ob'Þzº>¸Ñƒtî!ò¸´—Æ9™7Ê ×˜CîÒ.Ík&) 7L³Èʬ ¦k–üÓùì“ËõÁóÇ Á͹!¾·!×Kk¹KÛøÌ!×#°€Ü¥m<æá“ÆÌþçÎFkó(­°¿4J@?û¯ÉmGÉ/ðc ¥endstream endobj 822 0 obj << /Length 267 /Filter /FlateDecode >> stream xÚµ“=nƒ@…Ç¢@šfà9Al%"’C$SX²+V*;eŠDI£pJ ÄzÖ°òÚîÌŠÕ·üì›y^çOÏ‘=“Jftˆñ“ˆìॽ±ÿÂEŽzKI„zÉWQç+úýùûD½X¿QŒ:£]LÑæ™óÑ@G¦j…ÌQ¨P¦˜ÚϘº§‰iz‚ÿVÈ8Jy›Ž¦<_’â­oSÈr¡ûºãJ^CoC¿âÁàK(®¥vR“ਾB,á|.ÅÝÚWK¥uÅÉ¡Ë`DuO6®KNý™‡‘¯6‘_i JGãT+É­”´ ç¤KP±„û²¡J¨ðÿ~ ßsÜà uÍyëendstream endobj 823 0 obj << /Length 338 /Filter /FlateDecode >> stream xÚÍ“?N…@ÆgC±É6½€QãÚ¸Éó™Ha¢•…±RK vF8Þä%^€’‚0Îì ‘¼Z ø-;;3|óqvrX”ºÐ§ú ÔÆhs¤ŸJõªL¡ù6Ç~çñEm*•ßiS¨üŠ^«¼ºÖïoÏ*ßÜ\èRå[}O‰TµÕ@W‚€dªR‰ˆ;Ȉ,Q–ˆG¨9ÛCi ì7rXKËä0—Aà@$ˆs;’²º:ñ>GOÔ11PV¨GG’ª à{ ré(µëÜ‘  J}1*7S(»$;SheIÙLõ>âoúCø¨^¥f­i0Ó¤ÚÙIñ™Î§ÉÌô¬ð§ Cœ4ôqú¢ŽHºèG®¹‹nJÛè°¬‰®³œcÔC +{ç7ZÛÎÛ¶>»ƒ Úà¿¢‹*E!¼Õe¥nÕ/ÙÏíãendstream endobj 824 0 obj << /Length 258 /Filter /FlateDecode >> stream xÚÕÓ1nƒ0`£ ‘ÞÂx'¨¡b€ ‰¦R"5S†ªSÛ±C¢d†£õ(9BF†ˆcWæGµR¦Z}lÀþ_ÇYÂ1§æÈSÎù#¡=e¹éÇ}·¿ñþEeEzÇYNzm®’®6|<œ>I—/Oœ^ñ«™æª‹kªo?nÁ‚>ƒíCK¹(Iç¸ÖªoïÐv^سs`'rVr\wƒ Iã‚—ý˼ÏÞ‹‘/ÞÁÈí¤íýênp=g¹ÇÍ?ôÿ;³†¸ÎØ—¹=Å  13èr…Ù‹ “E7™ÛòŒ™ÇZ€1µÓŒk kmªgjÖ.=W´¥€Ms³endstream endobj 825 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚ•Ò=‚0ðgš¼¥G '° FØHLtr0Nêè Ñ™£xG'k1øð£6Ø”ä×G ýøÇÃn¿'10OÜ«ú&Ä=F‘?*Õ‹õÓåBDʉ©¢Ì§âx8mQ¦³‘QfbŠ`…y&tÝnÐVÀõ€i] ’Ob$Ô!A£Â¢D}ËwŠ·Qç¼|еÀ‡<§‰“|’®eÚŸjæ¾~[þë^ßûŽ®.UÇõCÕeZäÙtþsŠ7*é¦I‰EI—”5EIT”NE‰­eŽX=“mØ„ãçxòIU]endstream endobj 826 0 obj << /Length 123 /Filter /FlateDecode >> stream xÚ340Ò³0Q0PaKK #…C®B.KßÄ1’s¹œ<¹ôÃ,M¸ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿA Dþ!•ÍÀþÿØÿo`e Èb†á gS’7¹\=¹¹üïbendstream endobj 827 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ3±Ð31Q0P0bS #…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ÿA ÉÀþÿÃ(9THü±ÉåêÉÈ’:Õ°endstream endobj 828 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ3·Ô30T0P0bs #…C®B.3K ßÄI$çr9yré‡+˜Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü Ä0ø!Ô(c2~f0ÂH`0ãf°c0øáŒP†<Ãƨ‡1þCŒ0;ŒÁcÔCÌÀ¤ø Ãàrõä ä6n6endstream endobj 829 0 obj << /Length 311 /Filter /FlateDecode >> stream xÚÔ±N„0Àñ’oé#´O ”\<'HÎ3‘ÁD'㤎ÝHàÉ ÆÁÑGð‘áBýú•Iû%)ð+,ÿ¦`ÊÕÑz­ ½ÂaJ£OJ}oà Œ9Æ™ÂÙ=º{„MùµÆyÈÏqòæB¿<¿>@¾¹<Õò­¾1º¸…f«­µ£ #q·8&ÏtáÞ3ûŸxž=%Ýüæ·õT]ˆ_¶'V1ü´± òÃîˆSï>8ƒ|º‹bGýx ²¦~Ù‡©¨_‰(Jê¯fÔß2L©Šcâ–# ןî8º~w‰¢[ÙstýJptýU,Ýr´,]ÿÄû±ž#öc},»=Ö3Ö³Tëc)íÛfôÑrLi‡G’vKA;+DEï ñß1¥]þ*Y÷‡¨ÄB8kà ~oˆ§Lendstream endobj 830 0 obj << /Length 325 /Filter /FlateDecode >> stream xÚÍ“±NÄ0 @ÝPÉK?¡þh H×›*‡D$˜02€`¾û´~J?¡c†ª&±ãrœNldH^âØŽ{U.+,p‰'%®Î°:ÇçÞ ºð‡ú…%O¯°n ¿÷_óÜÜàÇûç äëÛK,!ßàC‰Å#44~d´32DCÄšˆZAOÔ3%ä,F•¢b= _&gŒåË2‡½·dõÀ‚FL¤dtæ½Èêˆ^c;È“ºh†MZE=°p¡8È}ÃÚ‰âèÝ´1ª˜M¸Ótøµž°=Š[’l¥ÔýiÂþÿâìéñq<”3Mu;Ëúo˜ê†Ïš0Ñï÷q¯fUËȱ„±çšà:ëØ „Æåq’ñÌ×Ä·€•ZwÑ»¾$D#ÌB·HÜIè!iÐýh²Dåß W ÜÁxkD—endstream endobj 831 0 obj << /Length 290 /Filter /FlateDecode >> stream xÚµÓ±NÄ `H‡&ÿÒGèÿJk×NMÎ3±ƒ‰NÆIMÔèÜ{4¥ÀØá"R ÜßÈ%)ù ~ø¡Ùœo®°ÀK<+±©±¾À×>¡©Lcuåz^ÞaÛxĦqkšAtwøýõób{%ˆ>•X> stream xÚ}ѱJÄ@à?¤l“v_@“pÞ] !pž` A+ ±RK E;!÷hñMÎ7H¹à’qfwO ¦ù`vv23»œ•µ)ÍÒVf±0õÌÜWêIÍ%Xšú8œÜ=ªU«Šk3¯UqÎaU´æåùõA«ËSS©bmn*SÞªvm€| 82"‡7@бï, }8$´þtHIR2>JØÜJ =°MT;4[6ÿ±ùR׳éÄÄ~“û íD©Ï}~k£.:Âíì£6ʃH«¬Ï±¥DÎJ†wðkñ©8ÊÌ1ÁÛ‡=Iszÿ‚‰6üÑWÎBðJIľ7ìl¢:šÇa²hJ½Ý7ùCÞ¦ûßÍ8‘ÂýðˆþÝÆðâÞ5,φýkV›Ôqœ<ò Òöè÷Ã/™„µXY×dã|…ËvRJµêJ}áI±endstream endobj 833 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚ³4Ô31W0P0b 3 C…C®B. rAɹ\Nž\úá \ú@Q.}O_…’¢ÒT.}§g ßE!ÚPÁ –ËÓEÁþ?ü!žu€¡þ?3õ‡Äb°ÿSÿÂâÿWÿÂbÿWÂbþWßa1þ«g€°Xu0V6V ŒeG,ëŒeÿÆ’'Åc1Œ²†%‹’œÍârõä äãCì> stream xÚ­Ó±nÛ0Æq pá#/8ŠÀ“$)PÚ©CÑ©íØ¡E³ ²ß,z=GPħ£íZ™êáðáçNþëõÝõæÎݸ[wU»zýÆmnÝ·ZÿÔõº¾q›u~ïë}¿Ó«OðCµ^½׫Ý{÷û×Ów½ºÿðà@Ýgø¥/z÷è"¼‚ØÃEwø lì…€;ÀiŸ€åi24> stream xÚ•‘±JÄ@†'¤Ls°óšL® œ'˜BÐÊB¬> stream xÚµ±NÃ0†/ê`é?BîÀ‰dSº`©‰ HeꀘhÇ XI-Â#dÌ`å¸s‚ºtÅËgý÷Û¿î·×~Iyºª)x ö5¾£_‰XQ¸™&oG\7èväWèEF×<ÑçÇ×Ýz{O5º ½ÔT½b³!€ÿ€œÈ£‚™Oª±ª–!2J`@;€÷PŽPÈ<²;…‘GgÈ3E9c̈¹*lÊ0´9Útüø / Îà Ýìi†Õnʲm'¾©¿;)¤ø–),åˆbÈߘ^‹ìJq™©Ý‚§®£zµlÑð¡ÁgüÍF‹¾endstream endobj 837 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚÕÒ½NÃ0ðT"ÝâGȽu¢~n–ú!‘ &ÄŒ ˜Ý7è+õQúíØ!ÊŸ³¯ñ‚ŠÄ„ˆdå—‹³ÿÊl4¬æ\ñ˜¯jžU<ñsMo4HQÇúæé• Ù{žNÈ^K™lsÃïŸ/d·K®É®ø¡æê‘šgáʱ‰wƒ_ s=Ìÿ‡$ p8E €.¢° (±s‡×…¢ÀŸÂ4Ž2ì¥*ȱÓ| ]¹Ñ6&âÜ´LèÎpßàÚ‹À_à‡ýøËÇIHGN!ÄXÊ>±] ³7ž#†Ýfæýß".ŒÎF«?«Ç^Q 3Ò™Ö Ýщb=endstream endobj 838 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚ…¿J1‡gÙ"0M!óº·`D«Ày‚[ZYˆ•ZZ(Úºy´}”<•aÇ™¹ãôP1|ðå—?üâéáIO :¢ƒžâ1ÅH=>cT¹Pc;÷O¸°»¡Øcw!»á’^_Þ±[^‘ØÝÊ™;Và8ƒŒ‘?dm˜gPÇj·\R…q :“dÄ„*Á |…Vbn¶;ƒg³Eó çd˜ö1Öo( Ø÷aãhDBÿcü³!ýD[Áo˜¬1¿En¥ ¹±¦ä%iêÝînª6N:ó\ÒZÛ` æ]H›_ÙI<ð?yë­œendstream endobj 839 0 obj << /Length 324 /Filter /FlateDecode >> stream xÚ¥‘?JÅ@Æ'¤XØ&GÈ\@“HòBª…çL!he!¯RK EëÍÑÖ›ä¦L2Î쮂°áÇîüû¾É®9o[,±Æ³‹w565>UúU7¿–Øv1ôø¢÷½.î±étqÍïºèoðýíãYûÛK¬tqÀ‡ Ë£î¯|¢QÑÑ’“CD–F°³"RcB|&;¦Jª ÀÌÆeÂ%w¹pU¾ëö3Bú?OûþÄÂ|€ G(ú‚^±'€f ‰]âTH¿Ø¯ð“|X9éʶÌÜ/O8E.‘> stream xÚ37Ö3°P0P0bsC c…C®B.33 ßÄI$çr9yré‡+˜™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ì0€Áÿÿ$0˜a †aÃÿeüÿßf0ÿÿÿÌà‡xûÿùõÀŒ:û`PÛãçã?Hÿÿß  e00°ÿ?€Ìø‡ÁøCãÇ(ÎøŒv q€—«'W lù2 endstream endobj 841 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ36Ó35Q0Pacc …C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìþ``üÿ€ùÿ0fÿÿ+†ÉƒÔ‚ô€õ’ ä0üÿ‰˜aˆàÿÿÿ@Ç\®ž\\ÍÙ¥;endstream endobj 842 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚÕѱJÄ@à)ÓänžÀMˆD­ç ¦´²«ÓÒBÑzïÍôQ|„-#†wæ_ñ°ñZË·“eþþäà°ã†uõG|Üñ]KÔkÝh©›Í­Fr×ÜwäÎÓ[rã??½Ü“[]žrKnÍ7-7·4®¹¦B‘ý,³Å?¶ ûXø€¾á ú-ä,fXN°pùµMõùÞËV´¶¤µ%‡\{œ`rùô‰Ä_ |•­¹»7fçZlžP‰Íð \X°~r„þ[ƒ'-pG NZpZ¸£ÛYÌŠŽê4ú_ÒÙHWôn¬$endstream endobj 843 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ36Ó35Q0Pac c…C®B.#K ßÄI$çr9yré‡+Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ì0üÿ‰™˜aãÄÿ„޹\=¹¹µ‰Ãendstream endobj 844 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚíÒ½jAð WÓÜ#Ü>·ÔŒ‚WZ¥©LÊ+³vrp!E¶›üçT°+‹ ó›Ý-ÆÙÇvïÞXÓÅqöÁt;æÍñ';ë±j-->x˜súŒÇéiNó©Y-×ïœgOÙ‘yÁÌ+ç#CYEI ºO$RáxŠ%4ˆDJʤnï«Ò 󢣨Ò×®U¶¤ Hª@Yûƒ$߸»Np·â§¤D@¥(€þ¿ØAx^ƒæ §¨å9ìÅE…ÿÇÍÛ„ÂÆip xœóœÿvÚiCendstream endobj 845 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚíѱ‚@ à& &]xúÞÜHLtr0Nêè ÑUy´{ጃ „zwÀ¡Í×6ÿÔd4”’™JBG´ñ„qlfiG{Ø1+P¬)ŽQÌÍE± Ëùz@‘-§¢Èi’Üb‘¤‚˜µ©ÒÁc®|æÚ!P÷Æái à±®!`{èø.ÿT¼ÊV6ß¡ýAÓõ_°yÍÀ4Õ8+p…o âøšendstream endobj 846 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚµ‘±‚0†kHná¼Ђ±0’ &2˜èä`œÔÑA£3<šÂ#02Î^KL%!_sý{½þ¬æI‚!.qa¼@¥ðÁCT±Ý9ß +@P% 7º ²Øâóñº‚Ìv+Œ@æxŒ0> stream xÚÍ’¿NÃ@ Æ]u¨ä…G¨_.!MB§H¥•š ¦02€èœ<’GÈx•ªÛ¹F:¡.§Ÿ¾óùÏçË“«è†"Jèò:¡lN錞c|Ã,5¢<WO¯¸(Ñm(KÑ­EGWÞÑÇûîÝâþ–btKÚÆ=b¹$(“#ýÑÃ!@5@÷Šøo˜J ÿ§4ö{®aäÁ³ÅŒòßëŽfJ®`o}4¼‘.lO­%Þw£‹m_…mt§¢e4](z†`_ëTÀU‰øµ` endstream endobj 848 0 obj << /Length 169 /Filter /FlateDecode >> stream xÚÕÏ;Â0 ÐtõÒ#Ô' ’VbªTŠD$˜02€`nÆQz„T d¨jœ20õXö“üYœé™žcŠš+ã4xRp“s?¶aq¼@iAîÐä W<i×x¿=Î ËÍÈ ÷ ÓØ Eá¢^¹˜6¡–­É±Câ‰:_øˆ:WóÑ«}ßÍO_ /h‰ Æmƒú ýIž™–¶ðj^¤ïendstream endobj 849 0 obj << /Length 259 /Filter /FlateDecode >> stream xÚ]Ð1NÃ@Ð¥°4¾;ÛŠBƒ¥$\ ‘ŠQ%Ú¬æ£ì\¦°v˜Y)¢yÒî·çÝT—ëk.¹æ‹Šë57 ¿UôIõJ/Kn®æäõƒ6O\¯¨¸×k*ºþþúy§bóxË[~®¸|¡nËXÊp8™ÎÙë…HDÑFä#ò°Ô々Ú~Àþ¨¨7ö'ÉQÈ”´^;LKZ+45qj@.dêtÜÇv“ù!¤¸Ç"iíÐÄÌôehÖ”ôÁjÛ]ˆÿdVçµ³½ÍSuž‡è ±ýõ?h©›ÓêgåcfKxýºëhG¿Á•¡Zendstream endobj 850 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ35Ô34S0P0RÐ5T01Q07SH1ä*ä21 (˜›Cd’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.O†ÀOþÁN2bÌH$;É&åÁ¤=˜¬“ÿA$3˜äÿÿÿÿ?†ÿ8H¨úANò7PJÊÃç‚”ÿÇ`$ÿƒHþÿ ÀØ`ÿð(Èþßÿ ýß E` q¹zrr:é“pendstream endobj 851 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚíÑ1 Â@Ð  Óä™ èfÑlì1‚[ZYˆ•ZZ(ZÇÎkÙyÛt¦Ž»‰… а{üáÃÀ»°O!õ¨­(Võh¥p‹ZÛ0¤(j.Ë ¦匴F9²1J3¦ýî°F™N¤Pf4W.ÐdI àñ˜Kü#ZX€ƒøã+üÏÞ8ä¯È’ àö„wåÂ6î .n ŸÁÉÁNÃõ<sUÃv‹öÁ848Å”Ìðnendstream endobj 852 0 obj << /Length 252 /Filter /FlateDecode >> stream xڅбJÄ@€áYR¦É#d^@7¹Ül œ'˜BÐÊB¬ÔòŠí°¸×ÊÜ+äR¦gvE8°X>˜YØŸÍ/Η%”ÑYJyN«Œ^RÜa¾aB«¥ß> stream xÚ…±N…@E‡PLÃ'ì~ >ÄX‘<Ÿ‰&ZY+µ´Ðh+ü™| Ÿ€ÝK$\gfÑX)Éæ°{÷žúä ÚøÂʪýÑÆß—üÄu%ûB·úáî‘·-‡k_WÎeÊ¡½ð/ϯ¶—§¾ä°ó7¥/n¹ÝySÌÿ‘º…Èí‰壼£'7¬ìe†"Ê0Ò›0ÅDr„ì“92•ãD˜ÓIÙ-Ù¨l‘ÎèðÞ+s@!ËÊÙ˜Âb4ÐHëÜþfƒoöqŽ!þÿC»?ù„õI?b`6ÅÀ|ŒtC t} lL™D2r1uIU'‘TuIk*’ÖT%5P%5°­!Ä.ƒ>“ÏZ¾â/1¢¸¾endstream endobj 854 0 obj << /Length 310 /Filter /FlateDecode >> stream xÚ…Ð1NÃ@б\XÚÆGð\œ8ÁM,… á * D” è"ÖT¹–o+ølé"ò0³³DQXOš]yþþòôx:ÁNð¨˜bYâÉÆæÙ”OG8›…£û'³¨M~ƒeaò ž›¼¾Ä×—·G“/®Îplò%ÞŽqtgê%Qmÿ3¢ "Vì–åÏŠ<³Ÿ³•èXú1f3j îÔ„MÅVl!e±y‹ ºo+ =̃ï¬Zy·Çê½ÃÎÈ[‘ÄcoFG\{SZ·êƛЦQ?ƒä‰`߈†µ™=mÿ»•;4ëMÛ?l½þœ};Y«íTj¶Ä­õj´Ó©Ú õIP×Z§ël§klku釾2#}UJ.´Ò†RÌym®Íaɽïendstream endobj 855 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚÍ’1 Â@EG,„i<‚sÝl±F«@T0… •…X©¥…¢ur4â,-‚ëw3)–.düfÉÿ3tƒ8–Hœô­ ­Ä#Ù[>±s#‰ÇUewä4c³çØÌ!³Ér9_lÒåD,›©l¬D[ΦBÔöá$þ‰»å½:À¨ë[þŽRI9Šùƒz%”î 7t„ø | t}º½€GIÀ³¦ã%EPþðú_üþ+µM_*|u°69X~o ©hFš˜æW§©ÙjÒš»nîDµ!<ËxÅo†sendstream endobj 856 0 obj << /Length 137 /Filter /FlateDecode >> stream xÚ33Õ37W0P04¦æ æ )†\…\&f  ,“œËåäÉ¥®`bÆ¥ïæÒ÷ôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQ```c;0ùD0ƒI~0Y"ÙÿIæÿ ò?&ù¤æDå(I²ôÿÿà"¹\=¹¹VI¢”endstream endobj 857 0 obj << /Length 301 /Filter /FlateDecode >> stream xÚ}ÑMJÅ0à)Y²é’Ø–G_]x>Á.]¹WêÒ…¢ëôh=JŽe¥ãüˆ? Ú¯if¦“tߟ ChÞ¯6 §á±s/®ßÑ\¦¼ððì£knC¿sÍ%½uÍxÞ^ߟ\s¸>kŽá® í½Ào@£B,D¸'€DdZš"-š,-ÚB/6¨3"x‰š¢äç”™œ®—ÓÊ®k‰í ƒËpÞ7q|Ì$pãFúæš¿È »ùdíL™@ÚAvüZ´H¥ÙFÓ¬¦YM«5Þk|,ZdÖìI³eb4Ðj`Môä³g!@Tt¶«`[ÈBÍ».àA8ã²EþõËwÌ•b«ÔŠW¢’üÉü'îbt7î}tû”endstream endobj 858 0 obj << /Length 305 /Filter /FlateDecode >> stream xÚ‘½N„@LJlA² À¼€ÅgErž‰&ZY+µ´ÐhÍ=Ú> @IA烋 á·ì|ýgf.ëK xQá®Âz¯•ÿð!ðe‰õ•Y^Þý¡õÅ#†à‹[¾öE{‡_Ÿßo¾8Ü_cå‹#>UX>ûöˆ)Eà§£‰¿ŽˆN£ÈGG#›"ˆqhfHøÔ8¾ÏéäfEÊAEIÅÈ=¿ÿ„Å-ˆÎ’%$©#쵂H\ÀÕWèfä¹  Íhg™…™cgݺi†¹8iZþG«`©s+´¤É,25×ô\iÜ`2[Ì[¸¨ÈE3)Dä/ˆþbZÁ1.8Gƒ ƒ•I¬³éUuužR¯áÍ:îXÔ&¼oÝ´í]Ö¯"MºÎÝß´þÁÿéýëoendstream endobj 859 0 obj << /Length 225 /Filter /FlateDecode >> stream xڽнjÃ0ð ‚[ôº'ˆìPÛt±!têP2µ;´4›qüh~?‚G‚$ÎýÅC»õ@ú¡Bw—&ó,㈮+]pöÈo1}R2æ¢ñ8^¼~в$ÿÌIF~{Í’/wüýu|'¿Ü¯8&¿æ—˜£•kžnûLMÔÐ@;ÑÁž&žEõD-twñ>‡5 pU/jh:ØŠ¶,PW+D5À^Ôh ma#:ôYÀVpÔ=ìDÓŠºb~9¬a€g‰æ/ÌÿŸuøÿwiSÒ]]Óqendstream endobj 860 0 obj << /Length 285 /Filter /FlateDecode >> stream xڭѽJÄ@ðY l“Gȼ€&áH¢ ç ¦´²+µ´P´N-²°`“b¹u>r‡"X?²ÙLæ¿Ó6']‡¶x\c[awŠOµ}µÍšéñLß<¾ØMoË;lÖ¶¼¢e[ö×øþöñlËÍÍÖ¶Üâ}Õƒí·hF8ˆs0;àÛ¤Ž¡+*³¯Lʨ€•Yñ ‘ iþŸŒk›àäï!%Nó¹4tíaà(.JÚ‚bÒî> stream xÚ’=NÄ0…'ÚÂ’›!sHRd ‘–E"Tˆ ()@ Qa-GÙ#¤Lyxcó´‘•Oòóx~ž×ÍaÛrÅ Ô¼®¹=âûÚ>Ù¦ÁfÅíqRîí¦·å57-ϱmËþ‚_ž_l¹¹<åÚ–[¾©¹ºµý–‰ÈÒOdÀ%2…È ¸9SQväTòÔy2ÙSÁ Tà» 2NXFvY òŒø_ȹèíC!š‹"Þˆº%R­î/ºQ‘‰(Œ¶"!×V$ÞMÀ x#$“0"»W ­ ÎˆPrÂ(¨ì$Ó7´Ày?â Âîßèö"^Ò\æ%òˆI‘Éd¾«^EÀ€AíÈRɯiP7ë@tÊê4F¦¾Ã}œÒ·  CÔGƒÉžõöÊ~†\öendstream endobj 862 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚ­Ò±jÃ0`™[ü¾he…ÚÎTAš@=š)Cé”dÌÐnÁò£ùQü5˜8²þ@mp CoÐ'¸ÓJ“§,ã˜3~Tœ>óLñVÑ’Ô%cžMq³ÙÓ<'¹æ$%ùæÒ$ówþ>þìHÎ?^Y‘\ð§âø‹òGÂGT‚ ´%ð1Šîs °à< (G˜®Ï‹(ºnhÄÉõ<œA홀°OîÐÂS€ÆiüX+ÒÃé"¬]ö1¨Õö n\PrÀ䚇cDôÆÞ§ý+Á"ZlÎ`eºúý1´ÌiEWÂÁLendstream endobj 863 0 obj << /Length 339 /Filter /FlateDecode >> stream xÚU‘1NÄ0E'JÉMŽ`_²)²ÊÒ²H¤@‚ŠQ-” ¨£…›øéHayøcARäIñÿù?ûî¼ïÍÎtæ¬5ûÖôæ¹UoªëðqgúË|rzU‡A5¦ëTsƒÏªnÍÇûç‹jwW¦UÍÑ<¶f÷¤†£!*y"<–Þ3Dà‰ê@¼àȓơ©ŠD,#DQÄc!C<– S 1¹©úŸ`}½EØ fðŠQæjÙÀM5ÏA°˜øcÁ²¦Ç.%ó‚Í€€ %‚Æ ç œ9æd’QÿÅœrè™’t‘pI#xÙï$u_"E`—-5KˆfXÊz‘ qv, /&Áy¹6:)z…‹©veÒuFµA¹EøÅ”àVxXVˆ;Õ³]äß‘^KFƒùa9 ÔjcªG²ëÜY•ëAEJ˜¨ëAÝ«D©endstream endobj 864 0 obj << /Length 312 /Filter /FlateDecode >> stream xÚ’±JÄ@E_H10Íüy? ÙÙ(uSZY,Vji¡hý´|J>!eŠa®ïÍàÅsàN2sß½Y×'MÃ+®ù¸âuÅÍ)?VöÅÖµˆ+nÎÒÎóÝt¶¼ãº¶å•ȶì®ùíõýÉ–›› ®l¹å]Å«{Ûm™È`Oòô˜eÍ€@ªAÕ"dek¦v"ÂDÅLª8O92!~l@Ncï@ŠzÐÐ.1öaiÂŒßáÿðBÿÚ v?Qàƒàt>—p„ C 4‚s9¿ŸH]¶>Ÿ0BÁ/@ IL}~¦-&¾ÃÇ\²^+—™˜îèävq°€ÑÈpÚƒ Ä:ŠTNëµ&­ÐøXaž*ÌE——3ìµq}µˆNd”!ýÑ«ÌId/;{k?žnfendstream endobj 297 0 obj << /Type /Font /Subtype /Type3 /Name /F37 /FontMatrix [0.00836 0 0 0.00836 0 0] /FontBBox [ 2 -25 134 84 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 48 /LastChar 121 /Widths 865 0 R /Encoding 866 0 R /CharProcs 867 0 R >> endobj 865 0 obj [65.77 65.77 65.77 65.77 65.77 65.77 65.77 65.77 65.77 65.77 0 0 0 0 0 0 0 99.31 93.5 95.01 100.81 86.32 0 0 102.84 48.44 0 0 79.01 124.77 0 98.78 0 0 97.76 73.08 91.47 0 0 135.85 0 0 0 0 0 0 0 0 0 65.77 0 58.47 73.08 59.81 0 65.77 73.08 36.54 0 69.43 36.54 109.62 73.08 65.77 73.08 0 53.39 51.89 51.16 73.08 69.43 0 69.43 69.43 ] endobj 866 0 obj << /Type /Encoding /Differences [48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 65/a65/a66/a67/a68/a69 70/.notdef 72/a72/a73 74/.notdef 76/a76/a77 78/.notdef 79/a79 80/.notdef 82/a82/a83/a84 85/.notdef 87/a87 88/.notdef 97/a97 98/.notdef 99/a99/a100/a101 102/.notdef 103/a103/a104/a105 106/.notdef 107/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118 119/.notdef 120/a120/a121] >> endobj 867 0 obj << /a48 855 0 R /a49 856 0 R /a50 857 0 R /a51 858 0 R /a52 859 0 R /a53 860 0 R /a54 861 0 R /a55 862 0 R /a56 863 0 R /a57 864 0 R /a65 821 0 R /a66 822 0 R /a67 823 0 R /a68 824 0 R /a69 825 0 R /a72 826 0 R /a73 827 0 R /a76 828 0 R /a77 829 0 R /a79 830 0 R /a82 831 0 R /a83 832 0 R /a84 833 0 R /a87 834 0 R /a97 835 0 R /a99 836 0 R /a100 837 0 R /a101 838 0 R /a103 839 0 R /a104 840 0 R /a105 841 0 R /a107 842 0 R /a108 843 0 R /a109 844 0 R /a110 845 0 R /a111 846 0 R /a112 847 0 R /a114 848 0 R /a115 849 0 R /a116 850 0 R /a117 851 0 R /a118 852 0 R /a120 853 0 R /a121 854 0 R >> endobj 868 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ1 Â@E°L¡70sÝì ’@°ˆÜBÐÊB„€ZZ( 9ZŽ’#XZ:IV›t«þ 3ïOÌØÄrÄ#²‰xjø¨éBºN%7nt8SjImYǤ–’“²+¾]ï'RézΚTÆ;ÍážlÆ@TðJô ø@ ðhxÁ«jze/¨ š]aöåÙáýÝ;¿íÇÎAdDÉ/ak+ÚÎ?i¶¥”T“‚RSÊ"§…¥ }G«@endstream endobj 869 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ1 Â@E¿¤L/ :ÐÍ®A"ˆEŒà‚Vb¥–‚Š‚…EŽ–£äÁÍ$±ÐNxÕÌgæý¡˜1‡qß„l">hº.§!Ǧ^íO”XRÖcR 7'e—|»Þ¤’ÕŒ5©”·šÃÙ”s Î@ t€h~//i¹ÝKxO`L®Ð“tIVãçßxÅ?üÞù¼¨>ö‡©(=C±uÚ•¿/ñ@ªÅRÓr•iniMoEËBsendstream endobj 870 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ32Ö30S0P0WÐ52T02R03RH1ä*ä24Š(XC¥’s¹œ<¹ôà M¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿüÿó‡a0C ¹\=¹¹µ hendstream endobj 871 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚÍŽ»@@Õç+Îp÷.Ù¨=[H¨¢B© ü½Ä#ñ2ÝL36ŽŒ£¡2´Jut–“b…&5Lã/ 2é¨ ¤z<Ä×Ü·c†dMN…ì•f€/x×üš÷¥G‹^ÿhendstream endobj 872 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ31Ô35R0P0SÐ52T06S03RH1ä*ä2²Š(XC¥’s¹œ<¹ôÃŒ,¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Œ?øØ¾á„ËüýóƒðÚcyn€8£žáÐ@§Ô­ÿÏ¡A|8X¤¤^þ}ÜÇÿ& ð…(¼À…ã.WO®@.QåXÙendstream endobj 873 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ô35R0P0SÐ52T06S03RH1ä*ä2²Š(XC¥’s¹œ<¹ôÃŒ,¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. þ```ÿÀÀÀâÔ±=700ȃ0P’ŸøÐ aþäy û]ɃÔÔƒôÑÃ} p…(\ìàN9~ ×r¹zrr°Wßendstream endobj 874 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5´T2u MR ¹ ¹L @Ð*•œËåäÉ¥®`jÀ¥ï¡`Â¥ïé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢PÿÀäÿP *ÈåêÉÈ- +´endstream endobj 875 0 obj << /Length 130 /Filter /FlateDecode >> stream xÚ-ɱ Â0…á gð 2œ'0¹-Õ̵‚D(¨£ ¢sóhy3mQ¾íÿËjîô\²ª¨uàEñ€zŽÊúwÎ74î@õp›!ÃÅ-_Ï÷®Ù­¨p-JBli¥—OäQŸm–?“M2©H…Le"3±ä.`±Ç+Ç#‹endstream endobj 876 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0UÐ5S03P0±PH1ä*ä25 …M 2ɹ\Nž\úá@.}0éé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢ÀÀÀ`ÀC‰ú ÔÐô—«'W —á)Ðendstream endobj 877 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ-É1 Â@EÑ?^á ¦xЙIŒmŒà‚V"ÑRPÑ:³´Ù™&Nwo¾\ø’ž+ε¤V\ó¦xA=y1žö:À¨n×w¸°ççý½ÃÕ‡ ®áYé/ ­tò‹½4è’M22ÉD³˜ÉT&2+•<å*ØñBQ#³endstream endobj 878 0 obj << /Length 95 /Filter /FlateDecode >> stream xÚ32Ö30S0P0bCsK…C®B.K Ïȉ&çr9yré‡+Xré{€O_…’¢ÒT.}§gC.}…hCƒX.O†z†ÿ 0XÏ ÃÀåêÉÈZúvendstream endobj 879 0 obj << /Length 153 /Filter /FlateDecode >> stream xڅ̽AÅñ ɉ¨ŠóÌ—eëµSH¨"‘ ” ôÍ£xw³ÓN¦ø5çæþgvZ8œ8K¿àÜñbñ€·²–>žÎ7TzOo¡×²C‡ _Ï÷ºÚ.)k̓<j*¥zÑP ¢±‰R˜è.NÑO|[ƧÕmÈÜÏdSéL6•Îeé\6•NdV;üxÔ*Æendstream endobj 880 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ö30S0P0bCsc3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7À`=ƒ 1S—«'W eÕ"·endstream endobj 881 0 obj << /Length 140 /Filter /FlateDecode >> stream xÚ32Ö30S0P0WÐ54S0´P06SH1ä*ä24PAS#¨Tr.—“'—~¸‚¡—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEA†¡žá Ö3È0຀`ý™ PÈx€±±¹™¨Ò‚¡€!ËÕ“+ ~e,”endstream endobj 882 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚUÌA ‚@à7 ÿÂu ÁÿŽXÓJ0ƒfÔªEBµ ,jímŽâ¼AiÒ"ßæ=xj1›kŽû¤)«%gš/ ÝI¥ÊÆå|£Â<°Ò$7}MÒlùùx]I»'$K>&ŸÈ”ÂGƒÈ½mÞ~¹¼ûi\Ô…ÎáðG8Ô¢x­8ÂM lÏŸj„¨0­ íéb+12endstream endobj 883 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚMÉ=@PEáþ®â®À¼™x¨ý$^!¡Rˆ ¥‚°{ äTß±4J2:*5¡Å4嬨`ö¢£ÿÆ´"žfšû¹@ò¶ BJJ7"”¼ï몀Ði ‹endstream endobj 884 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ32×3³P0PÐ5T06V0²P0µPH1ä*ä2‰(™B¥’s¹œ<¹ôÃj¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Œ Ì Øð107È0°3H0°1X0ð10ð00È0$E@øPôPŸc0nøß`ÿàÿû0\@Œíø€Ìärõä ä;g0÷endstream endobj 885 0 obj << /Length 90 /Filter /FlateDecode >> stream xÚ31Ô35R0B#C##c…C®B.Cˆ D"9—ËÉ“K?\ÁÄKßCÁˆKßÓW¡¤¨4•Kß)ÀY(è¢ ÔËåé¢ð $—«'W Rˆendstream endobj 886 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ31Ô35R0P°T0²T06V0µTH1ä*ä22 (Ce’s¹œ<¹ôÃŒŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 5ÿþýg„" Õ1ü*Êl*,,0‘ƒ—«'W /¨67endstream endobj 887 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚµ‘½ Â0ǯ,ÒÙÁá^@Ó@[ÛµV0ƒ “ƒ‚: Ut¶–GñMê%ZpÈPA/Ã’ðÿàÒ|,sŠ(¡‘L))Éè ñŒÌˆÏ$~?íOX(kþ€bÎ÷(Ô‚®—ÛE±œ’DQÒFR´EUôÁ«áƒCð-àƒ‹–ôœ¬ ´Ü±¢‹v0£YÑAO³ƒaÍŠr¸ÊÒ(:¸7vêý}Í®u»Õos´¹~TŒ©v14ŽíþyË8S¸Â'EHQendstream endobj 888 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ø0Aý? Áøƒ½ýãù† ö@CÿùA2þ€’@5@’±D‚!™dþÀðPI¸ùÌCdþÃÀþƒ¡þÿƒÿÿ “\®ž\\^åˆÓendstream endobj 889 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ3±Ð31Q0P0bScSK…C®B.SßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.Oþ êÿ³ÿg``üÁ~¿ùûÆÿüäØÿÉ?`°gàÿ¤êàÔ õN}`o`üÁÀþ¤›™ÚÔøFÑ¢¢˜ÿ0°ÿÿƒÿÿ? Q\®ž\\à  endstream endobj 890 0 obj << /Length 154 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]øÿ0AýÿÆÌذIù~ iÏ"ëÈ?P¨†ñ3õÈÿ@€JR×|Z“ÌÀ0ù Çÿÿ@&¹\=¹¹)“ endstream endobj 891 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚåÑ1ŽÂ0Ð¥°49&E‚R!±A"Tˆj¡¤í¶K$.NÀ|—)"Ì$ ±+¶¤c$Ëoì?nœf½8ã>DzÒ'¯cÚQšHßoÛöâsK£‚̂ӄÌDNÉSþÚoÈŒf“Éy)É9Ú!r:\àÙƒZ(œ«°¢A ¡.Ђè‘ý…ºþƒ îžî \;%BÜWCYø[ý‡[&²ð"l º9xëýÉûò4.hNWh—Ë{endstream endobj 892 0 obj << /Length 330 /Filter /FlateDecode >> stream xÚeÐ1KÄ0ð WbV‡“ä hÛÓëUw'ØAÐÉAA…Stp±7?S>ˆC>BÇGë{I<»üšòþÿ”‡ûÓJåê@íMTY¨2W÷âÓn檜„“»G>¯yv¥¦3žá6ÏêsõòüúÀ³ùÅB<[ªëBå7¼^* ák¬‡µÎ›Ø[ojW^ar¯„*ºóG½áÉ¿ý*šo¸ŠºhÈ¡YP~˜hˆ)?£_Ño`Ã`@tÑ6Š×éó£¯J[êL©žmS/t Ý]ŒÑ#”¯zð‰ŠI™m€’&Å+S£ % -%• -3_¸ÄP}ÑÒ˜w4ò&ë!Y½¬¯¼ðkC1 RÛ ¤u㛥ÞFt(×X@;xë1¸lYÛÀ1NNÛ|1`×'ÿ1:?­ù%ÿ©£rúendstream endobj 893 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚÌ1 Â@…á· LàœÀMŒÀBŒà‚Vb¥–‚Šv¢9ZŽ’#¤L!êÄ‚ºËWÌü0aÔíìs_„D¼hO¡Ïõ—±«-%–ôœCŸôX¶¤í„‡Ó†t2r@:å…œY’M¦€zÜáæ&óÐÎc¸¥§ÜÁ©ÎPÕêöøp±t¼¸e£] 0.â,$+IJ’“‹¬áâ­õ§_ÏFn_óoõ^:,Íè Àv;rendstream endobj 894 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚmÐÍj1ð é^=;OÐd-ñã$X ݃ §JAh{,´EoÂæÑöQ|„=zXL')¸Q6~Ì„Lþd<ºMHÓo3£±¦Ð®µ/ýÁû. T/d ªgî¢*V´ûÝ¢Z¬)Gµ¤×œôK€)„uÍ¡‹sÂu K‘”•§7¹›=ý,f˜ÕžA3MOÄ|'g+c*2U"BØIXˆÎÊ–ÃÑç\KÊp´>@Ö2à~}‹æ;§[¶<½¹p¼ÀÑÄ?²¿–6þIë8–sçkð©À þ#·m»endstream endobj 895 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚ•±‚0†0Üâ#pO`Amd3ALd0ÑÉÁ8©£ƒFgúh< ÀÈ@¨…«Ú´_®íÝýýe4fÐÜ,¹ ¹¤kˆ”µÓ„íÅåŽqŠâH2@±5§(Ò½žïŠx¿¦EB§‚3¦ i3 €5C8ZA–›À/:LÊ^ÕÁ­ûpšôXpžÛôkÚF¶­±bIF°Ü2ÕéqžËUœNÐC¨™E>ª_…ñ÷c‹ð+v·d¯ó¯åínÔâ&Å~VŸPendstream endobj 896 0 obj << /Length 260 /Filter /FlateDecode >> stream xڭѱJÄ@à? LaZ áæ4‰Üª[-œ'˜BÐÊB¬ÔRPÑÖÌ›ø*¾‰yË+Äuv²g!–Bà#“ÍÌî¿ÎïúnÙñÎ;ÇÎóMG4÷Zly¿›¾\ßÑ¢§æ‚çžš-SÓŸòÓãó-5‹³#Ö÷%_vÜ^Q¿d ˆRPDZT†¸R´öR ÊOÔµ þ@ù*˜(ÞAWEÁ],øR‚º˜IµRê5ú7P­Ñ&?”2oÆ(~#FLØàgÈü5=dF#ïzv¢L;mf–Ä&,—mXJ[°Ìa Þ#å }Rº:%e-vÁvS½•Ô=U:î霾šes–endstream endobj 897 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚ33Ö31V0PaS Ss…C®B.S ßÄI$çr9yré‡+˜špé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁõBýc``üßD@.ƒý0ÅÿL1ÿSŒÀÃ?UBÙ7@¨`JJ=SüPêŠýê (<ö¡9ÅñP¯@=ómrüC%h˜ACž  !@ y`> stream xÚuб Â0Ð  ·ô¼/0­ µ‚Dª£ƒ¢³ý4?Å/iLsqˆð’»INÍÆª œ&vª)©9 ¼¢‹åý¶O4¬4Ê©åÊFQê5Ýo3Êj³ ­ioK¨k2ýè D˜ÒÀ€§dFLƤ1’(­C8^Qˆ€„ÉÆDð¹ïɰ|pÃ1ÆÛ½Ó.þ"bøÿyÒ€Œ)™gëºk¸×¿àRã?UŸ’~endstream endobj 899 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚ35Ñ3R0P0bSCSs…C®B.s ßÄI$çr9yré‡+˜˜sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÀd’ñƒü†ÿ Œ`’ᘬ“6`R‰äÁAòI68ÉØ€L2`%™‘Hv0)"ÿÿG'!âP5Ⱥ‰ A€J$ãÿ `G@%¹\=¹¹Mÿx×endstream endobj 900 0 obj << /Length 254 /Filter /FlateDecode >> stream xڭѱJÄ@à?l˜&yM"&`µpž` A+ ±:--­7`ákMgé+ä ¼òŠãÖÙÍ& XšæKf’Íì¿]{Üt\ó)p×p{Æ =SŠu¨ÄÎæ‰V=U·ÜvT]j™ªþŠ__Þ©Z]Ÿ³>¯ù®áúžú5ð(ü6S¬ßü`À쑊-Ì— oÕ¶¸áÖë¥d‡ˆ¾¯ I¾Sòý03a‘™LlB".€¿Ñ!1ÍúOx½&ÂpcÄJÂ&ÆHù‹¸£…¸Û…˜„rI)¥ÌÜ” _ò,v0Ÿšõù{lØtéT–‰é¢§úî”Ûendstream endobj 901 0 obj << /Length 125 /Filter /FlateDecode >> stream xÚ33Ò32W0P0bSKSs…C®B.SS ßÄI$çr9yré‡+˜šré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÏøÿÿ?TŠñó bü78) À¤¯s‘)hèb y.WO®@.×¥6endstream endobj 902 0 obj << /Length 106 /Filter /FlateDecode >> stream xÚ3²Ô³´P0P0aKSs…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿ†€ˆ¡¾aècWüÅåêÉÈ2=\endstream endobj 903 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ31Ò33W0P0VÐ5R0¶T05WH1ä*ä26 (˜ZBd’s¹œ<¹ôÃŒM¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. öÿÿ?@"äÿ000°ÿâ„=ˆ¨oÿ`#ø?0üoõ ü ä0X0È`a°o`àŠ2°7Ãñÿ qõ \®ž\\ŸÎ`¬endstream endobj 904 0 obj << /Length 140 /Filter /FlateDecode >> stream xÚ35Ô³T0P0bKSs…C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÿ€™dü€þ3 eR/i& 0È ò‚d“Ì`’LÊ?`üßÀðÿÁ@!¹\=¹¹Afl÷endstream endobj 905 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚuѽŠÂ@àY BÚ ç Ü„p V‚?` A+‹ãàÀ»òŠ;ÎÚ€­µbaikg!¥Ep¨xF²3|³ÃÂDaË÷É£€3 è5¢O0lsïm1˜}c7F5¥°jȯ¨âýýοPuÇ=òQõé×¼cÜ'c€Ã1Gc†ûqEpÐŒÆñ»”Tb›1f•Øp^ÊkÞ.–•Ð')KXÔ,è$P· ©á¥ 7Ï'ƒ2¸h D. à$á ‹šÕ3š{+ܬ"'- ³øvRƒ“ƒ1ZjiŠãþƒÊÀAŒ<£¿Â endstream endobj 906 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚUбJÄ@à?.0…ûfŸÀMNÖÃÆÀy‚)¯²+µ´P´5©|®ˆ ¥`*ëT’"ìº;{Ŧ>þ˜â?Z,W²‡nô±Ô+yWÒ#iírá£?Ü>к&u%µ&uê ùüôrOj}y*KRy]Êâ†ê´Ȭ±¶ t8Ðô°=·øf|Ì×óa˜wÓ¹§ž¦‹©z&##Ù0LHìŽÖƒMè™*Œc²‰IMLbØ·˜æ“©~cò?F˜˜,ÎH˜óŠÄõˆ¤#\e؇ï{3 ³š¶ô4`†bendstream endobj 907 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚ­‘±‚0†Ï8˜ÜÂ#ô^@D'ÔDŒ“::htGáxWÚœmš~éÝßöú_LÂyÒxJsNgoô(ò»ÌéŠIŠîžÂÝ5‡ÑM7ô¸?/è&Ûñ~IŸ¼#¦K¶ Cµ¥ Ô¼*x1F%¨À)dBœÃè ñ‘Š…¬ªA«ÑŸ8çEÅjGîU…Ò(ßNk¼ûÈ4ª,— ~ÐjÔ…}Á<ÛC¿2[|Žþfa?­-ÈÖžÆ3ë ñ“­oŒ×œÈ¾}°]Ñ=ÂUŠ;ü”K‰Éendstream endobj 908 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ35Ó35T0P0bS#Ss…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü‚ ê„úÏÀÀø¿,ÊÀ ÿLñSÌ? Ô0Åø™adªT Y;ªÑPû ¶CÝuP7ÈÙÿÀÔˆ ƒ™….ĵ˜—«'W ŽK€¿endstream endobj 909 0 obj << /Length 309 /Filter /FlateDecode >> stream xÚ­‘±JÄ@†ÿba æ3/ I ‰ Bà<ÁZYˆÕii¡(6‡Y±õ¡ò>D|I™"Ü:³$EÀÒò…Ù™Ù™ÿ/²Ãü˜Êé -¨àŸºKõ£Î3Ž&t”G›½¬t|My¦ã Žë¸ZÓóÓË½Ž——g”êxE7)%·ºZà[ÈÙV°óþz=ÞªEd€°‘¥ê€šKzNä¬.{7Aâ|®Œ$sQèЄÒ>j"‡vDÉmvsÔý#ƒL°ÿb~ÃüöùdóáGŒûñ¶[ÞVužeø½ÿajÖEyȳv¾Y©:À†%*?ñʵÑJî¤~D`q£ìû€@\qðíBìcáÌšpê`¶èŽÐþ ™j‚óÚ·²<§Øq}^é+ý 6²¥Éendstream endobj 910 0 obj << /Length 221 /Filter /FlateDecode >> stream xڕѽ Â0ð–‚ì#x/ i*Uœ ~€ÄIí£ù(}„ŽJãÙK Í"&…äHrÿt¢F*ÄÇ8 q¢0šâYÁ È€f4ãÊé óäžê ×´ 2Ùàãþ¼€œo¨@.ñ 08B²D­uåÐ uf,HW§‚ ô¥lüfëç¬(ºz¥eõ§Ö~ûüæÞ¦Øô§¹_Qš@™ñÍëõ6Ò+L®6ŸñeålóZ¹šÿ«›v,X¿ÕKéP~ï‡ÞEÔºe¯Ö©úN=â’¹«vð™<›Âendstream endobj 911 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚUϱNÄ0 à¿Ê)K¡~h{=îÄB¤ãè€Ó ˆ @°!ZÞ̉èF%Psw ²|Jì8¶ç‹Ãª¦’æt0£ùŒŽŽé®r®^j°¤EµËÜ>¸U㊠ÕKWœkØÍ=?½Ü»buyJz_ÓuEåkÖ?€ÆŒ!òÎf°l#>Ù3ZÎ;@Î'€ç7Àîx ïÉ&Œ&È–Nm9ƒR0—!¡G/aEïFD+E$½ÑŒµ²MX‰¿„^É>a‡-úÆü‘Mˆÿèû=¦×:upÇ´–¤-µiÞ}õèGŒˆA§Š^{s¦ywÖ¸+÷=Ÿ†#endstream endobj 912 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ3µÔ³4W0P0bSsJ1ä*ä2ñÁ" Fr.—“'—~¸‚©1—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÁþ?<@£0ÿg`ÇÀøùA ˆbüP¢>€©T*L`¥€)‹`J+ŦF Åþ¿Hʃ‚ârõä äWÎr°endstream endobj 913 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚåÐ1 Â@Ѓhk!d. ›DÖh%DSZYˆ•Z *ÚjŽæQrË’u6‚â,–·ü¦ø½°Fìs—Û!ë눷Ik }›”“Ížâ„Ô’µ&5•˜T2ãóé²#ÏGó*`Mɘ1pMñ‹cRà–ÁðÒ’JªL]:jBú¡ ¿4¥¯;ÐsÚ2à¸òäWÉáHî<áÊ2 Ûª=sµx&·¸&Ã;h’Ђ^Ö„a¹endstream endobj 914 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚmбjÃ0à3‚ŽP¯¹h%’Ð¥4…z´S‡´mHgûÑô(zŒÕ“5T Ž»ù¹EñP,IQA÷-Í—ô•ãÎÝ‘×GŸ|žp]¢üàå+ŸQ–[ºœ(×oÏ”£ÜÐ.'µÇrCÖ¶•­o¶ÈZH,¤Æ+4€3áÌå‚§rB ö®ØQ¨¸cgìØÙx3vzõ¦¬ å^ß®{L:j½\ÔÕ ¬EoU»zÿ®ô(ÖxgfÛL{³f™^Ulëí!¶3½I§#ûOYÁ°O7N‡Ä—ßñ¾dšendstream endobj 915 0 obj << /Length 307 /Filter /FlateDecode >> stream xÚuÑ1KÄ0àW „ãºv8ÈûÚôÎb ç vtrá@ÿ…?'â)ΤC¹ø’£âMHøH^ÂK^Yì/Pá÷æX.°8ÄÛ\<ˆR¡ëÅÑvçæ^,k‘]b©DvJË"«ÏðéñùNdËócÌE¶Â«Õµ¨WhíÀ­í"kÿ·ä@öŒæ¤àmDâ$f~¤#; Hl ¿¥½8@£ÁŠwdFUšì¨%[pù¤^q(é`J7)¯Iˆ’›ÑMk¯T¢äRÙñRI JN%}¤½Ö<=“Dt2l¥IÜ©yÑÑ&ôFš:Uï; ôAš9ÉOŠ} ô5*¡¿­ºÿÄÿ‰°­ ÄœŒE'"'íEÑ<´¾¦®_g'µ¸ßÑÆ©Ñendstream endobj 916 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚÍαJAàYÈÁL›"y÷.p‰©b¯L•BAS¦P´Î=’p²2EÈ8»n@ô,†ofgÙ§“ËÉŒK®´¦×3~©è•ê¹ÎeãâyK‹†Üšë9¹[=%×ÜñûÛdžÜâþš+rK~ЛÔ,Yäx ¿µ€B{é»vª Y-¯½i±îìYƒÐûaqúªÕ·FÙ¡j¸Ê–*¤ÅSTB¶‹ú`ζÑñÞ&‡í%‹ãE¶Ÿ´§QÒÈ0›b4è3¾Ýe}÷¿Íÿô"Ý_馡}«l­endstream endobj 917 0 obj << /Length 204 /Filter /FlateDecode >> stream xÚmÌ; Â@à . ´Vf. ›´1àL!he!Vji¡(X›£å({„”Á8ë£—åø‡ùÝéÅQ—Úš’˜º}Úi<"ÏÈŃ÷f{ÀQ†jÅ{T3ŽQes:Ÿ.{T£Å˜4ª ­5EÌ&¡€º6äü¥…°%/_x÷/PAP02gøýÁ0Ò¦–yp&îî¬dBw›:Œ+0ðÁüâ}¨AT¾yóMÞ6Ó¢5lö–¢.Ë5²Ài†K|¤øT£endstream endobj 918 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ31Ó34V0P0RÐ5T01V0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃT‚D0S$ê00|`ÇÀü¹A¾ù;ÿæ ì˜ÿå˜00þ* àÄ?8Q"êI&êPMÊøbÛ½`Ëßœq ä ã ò Ìê˜þÿ:]þ—«'W ÈckAendstream endobj 919 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚÎA ‚`à'?( ‘œ ”ýüºÌ A­ZD«jXÔ.Ì£yàÒ…Tcu€ßæ 7f: y̆‡šÍ„MÀMg2ZB‰Ãïe¢8%ÃF“¿˜ütÉ×ËíH~¼š±¤ o¥³£4a¨ð^rUY 2U£q*«uKõáª:°šP trñüSþët"ÀŽ Ø^¾W¢ç–8ÙÍd¿ÂÝ)åÀi@ó”ÖôÕX<ßendstream endobj 920 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ31Ó34V0P0VÐ5T01Q0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÿó‚ÁþT‚zó !ÿHÔ±÷`øÁøþó†ú쀶¤ „|P±=˜i«‡u âÉDª)öph‘<„ÚkrF=ÈAï?0þ`<ÿŸ¡†½ÿ?ƒü?þÿ ì@‡s¹zrroXhIendstream endobj 921 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ]Î= ÂP ðyàƒ öBs}mJ],øvtr'uTt“êÑz”¡ãDØA ü $!‰íuúrÌíˆm—mÂÛˆŽdc)†lûßÎfOÌ̒mLf*e2ٌϧˎÌp>âˆÌ˜W‡kÊÆ í€à\ýÂsªT•WéÒs~ÜqýH\ n_i.ž?^uHŽyíV“=*½CÉ^-7º@S—hy8«Rþ‘‰h’тގO?Úendstream endobj 922 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ32Õ36W0P0bcSK…C®B.# ÌI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ê˜ÿ70ð|À ßþ€ÁžÿCÿ`ÆÌ00ŠÿÿÿÇäè§3ÿa`¨ÿÿ޹\=¹¹¢&[endstream endobj 923 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚ¿J1Æ¿00…ñ v^@³9ïäŠÃ…ó·´²+µT´[¸}´> stream xÚ31Ó34V0P0bS …C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ì€à?É&™iN‚ìaþ`ÿD~°’È700nà?ÀÀüDþ“ØÀÈä‡$Ù€‚ëÿÿƒÿÿ7 “\®ž\\yendstream endobj 925 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ32Ö30S0P0aCS3…C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜ø0È@A@ 8~Àüá? ±q©ŽØ0üÿ‚¸\=¹¹'FE_endstream endobj 926 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ32Õ36W0PÐ5QÐ54W0´P05SH1ä*ä22 (˜Ãä’s¹œ<¹ôÃŒ ¹ô=€\úž¾ %E¥©\úNÎ @Q…h ®X.OÆ ìø   P?`üÁð†Ø€¸ôE6Œ?êügüðŸ‚üc?PÃ~À†Ÿÿó.WO®@.ÿ§Wõendstream endobj 927 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚµÍ1 Â@Еir3'p.#˜BÐÊB¬ÔRPQ°ÍÑr±0EÈ:? êdÙ³3ó7èuÂ.{Œô¸òʧãH‰ÆrCqJzÆGz$¯¤Ó1öÇ5éx2`ŸtÂsŸ½¥ […RÊüâë?´LõºæÝ3Ø‚ærÁÊkm‚¨„;xÔÂ3êH†Kv¤Ø@%¯â.êýoÔ nn—**ŒÉù@Ô¦ôDrendstream endobj 928 0 obj << /Length 108 /Filter /FlateDecode >> stream xÚ32Ö30S0P0aCS …C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?0ü‡!þ ̃±ÿ`øÿÿq¹zrrÅQ-endstream endobj 929 0 obj << /Length 179 /Filter /FlateDecode >> stream xÚ3³Ô3´T0P0b3scs…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?ð`Àðÿƒý†ú@úƒ=ãƒ:†ÿÈ77Ø3ðnà?Î ßÀüÿˆþÇÀDÿa`ÿÁÀNÿ``ÿ€þÀÀþ`Ð O€âÿÿƒÿÿ7ÿÿNs¹zrrxˆLendstream endobj 930 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bcs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ìø?00üÿ`ÿD~°’È70ðnà?ÀÀüDþ“ØÀÈä‡$Ù0½ñÿÿÁÿÿI.WO®@.‡e%endstream endobj 931 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚŽ1‚@E¿¡ ™†#0Ðeƒ6 &na¢•…±RK v9Gá”Tâd)H¬ÌN^fþîþù‘žÌ¦ð”Çš£€Ã9Ÿ5Ý(ŒE”qÑßœ®”R{cRk‘I™ ?îÏ ©l»dM*çƒæàH&g8^W‰S­œQƒdHàVðá•R¾ ò!J*¨- Ài~ nNû/†ooñkg»Íîõ$AéÖHåŠ> éáwlzZÚÑIKÚendstream endobj 932 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚα Â@ àH†B¡y½ž­uj;:9ˆ“::(ºÚ>Z¥p"ØŠç]qÐQ |CB’?Šû2ä€Ü“1G!‡#ÞI:R°«aøm”d$V$f¶O"›óùtÙ“H–$R^K6”¥ŒÊ¯À¨\ƒ¹UW0÷Â/¼º%>Á«°T¨5*è´4hy~“ÿÌ÷ö²¥ý¦Ýß> stream xÚ31Ö³0R0P0VÐ54S01Q06WH1ä*ä21PASc¨Tr.—“'—~¸‚‰—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃùŒêØ0üa<|€ùÃãìÊð?`0?À€Áþ€> stream xÚ36Ò35R0PacCcs…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ØÈ3üPàÿÃÇþ?nÿÀÿœýó3 ~Äo˜0ÿah`þÁÀ€‚?P³Íüÿÿs¹zrrjÙF„endstream endobj 935 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚ=αJÄ@à¶X˜fßÀÌ x{›`TñSwÕ‡•Z * Wî£í£ÄÊ6`“"8Î%GŠ™ùÿfŠ|q~ÆK.ø4p¡ó‚½R^j¨çåÔ<> stream xÚ36Ò3²T0P0TÐ5T0²P05TH1ä*ä22 (˜Ad’s¹œ<¹ôÌ̸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  Ø W á Œ@Ì Äì@,ÿÿ?Ã(f„ÊQ „þ0‚pC sC3ƒ=;ÿ?°f.WO®@.uH–endstream endobj 937 0 obj << /Length 153 /Filter /FlateDecode >> stream xÚ31Ó34V0P0RÐ5T01Q06WH1ä*ä21 ([@d’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oæ ìþ`üJò`À‘p’ƒºBþ`°ÀÀðƒ¡üÆçÿì™Iùÿí@’ùÐ.WO®@.1cendstream endobj 938 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚU̱ ‚PÆñ#‘k[çêªWJ'Á rjjˆ ¨Æ†¢¶ˆûh>Š`›Ph—º—jù ÿ¾@ BŸ\ò©ïQà“ÒÎÃ#ŠHE—Äè³l˜dÈ—$"äS•‘g3:Ÿ.{äÉ|Lò”V¹kÌRj×_œ œÒ.Á.X ,g0i)à <¡¥©¡pƒ¶&†®A†=éjœ|c(v‘kØ]þb=ÀÐ(Ô¿áúO¨ÁI† |F£?êendstream endobj 939 0 obj << /Length 233 /Filter /FlateDecode >> stream xÚUÎ=KÃPÅñs Xx³v(æùzËíËb ­`A' ÖQ|A7©‘|±€Ð~Lïx‡`¼7UÓN?8gù«áá°Ï!ñAÄjÀÝÏ"z$¥ìr·¿~nîh”¼d¥HžÚ™drÆÏO/·$GçcŽHNø*âðš’ WUPñ÷6¾Aß´4æðŠ5¹§q ‘þ" bxØ%âtÇq¿Á_ù®cùGˆÅ²h;²š÷L€ Ëtè5Â<þfúOk…2·|âµÁ+ñ–ZlECÝdÑ ±ï(°ç˜ÂÑIBô¥Y_™endstream endobj 940 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚMν Â@ ð)(¡«ƒÐ> stream xÚUÎÁjÂ@àYi® Î èn²Zõ$¨sÚSE¨GÁ½‰æÑöQ|„x ‰³²Iéå;üÃüü=ÝF¤(¢N8 ^DúÖ!þ qª¨¯ÝiµÅIŒò‹ôåœs”ñ‚ö¿‡ ÊÉÇ”B”3úI-1žQY¦ãâàAægà//7ˆœŽ4gËZŽvª*Ì 0‰Ã¿˜Š+ã]S‡¸CEÉ@QsüϰFÕì,IqSn/¼'¶’gCþbŸ^m‘mjg`ç1øã'>ÚŸKøendstream endobj 942 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ%Î1 Â@…á'ƒ$œ˜Ä•  QÁ‚V"ÔRPÑNˆGó(Á2E0¾Å_ÌÌ·°&î5Ô3}5±"¹ˆ‰8‡v´‡ýI’T‚šH‚·¤K½]ïG ’ÕT¹é–Ov’ÎtRUeÝÓ)ÇpŠšŸüwÈÎè¼Î˜<3ä6dø"k”u¤ ýç¿A Ò9\Ò:R—ÔmðH=ÒiÛF:ÊG§¬ø›ÌSYËI:BÜendstream endobj 943 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚµ1 Â@EH!L“#d. ›ÍºˆBŒ` A+ ±RK EÁBb޶GÉR¦R×l´6¯˜˜ÿþPtÌ+îǬƬ5$Ii;ŒXÜf¢$#±a¥I,ì˜D¶äëåv$‘¬f,I¤¼•í(K~ |[äj¿„W¢‚opGÏà ÀÄ!´—S‹¢E¦ /‹òèzù´ÌO¾6x+Ó¸YÛ~åÕÎÜuдñí…æ­éÂÕ`úendstream endobj 944 0 obj << /Length 121 /Filter /FlateDecode >> stream xÚ31Ô35R0P0bc3SS…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]0001;Ëñÿ ÿaX*6T°ý†úÿÿ?À0—«'W ¾NÚendstream endobj 945 0 obj << /Length 228 /Filter /FlateDecode >> stream xÚmαJÄ@ÆñoÙ"0M^ป'p÷WóSZYˆ ¨¥ ¢`eòh>JáÊ+ŽŒóé5‚E~°;ÿY²¬šc­té_^iÓèC-/’³Ÿ+9¸’u'éZs–tî·’º }{}”´¾<ÕZÒFoj­n¥Û(Ê-€~‚Ù€8¶#J^ÎQì0CÜc…0áùîÈDÌ_úŸžÓÁïø:ßsöNüaçü™r$_΂[-> ³À,°ˆ, %‡s„'äƒlÏ"³ÈÌñ¥™aAZÒ›M°¿ÈY'Wò TŸc|endstream endobj 946 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuÐ1NÄ0ЉRXšß`3', ZiY$R AE¨€ ´ØGóQr„”[¬0¼„‰"OÊŒóÇ“ãîÈ/¥•^—ÒŸ‰÷òØñ+÷ÅVüɾóðÌëÝ­ôžÝ%Êì†+yûxb·¾>—ŽÝFî:iïyØ™-­2È9QµµÕ EëPõE6‚f¤LÍôV»&‘ÆàðÌÔb&e6‚€§Ñf“õÕŽó‘òY (yâ/ifU ý°Å_ cBüÔ¨M>Õ‹ý‚¸Ÿ™°y¥ÿ€‚޵¸2_ |ÃßÇ›jhendstream endobj 947 0 obj << /Length 188 /Filter /FlateDecode >> stream xڕν Â@ ð+ At-(˜'ð®¶µkotr¡P?ÁQðÅ_ÄÇè èý‹­³ù‘äIàõÃ+FŠÃ!¯=Ú“™º,ñ‘o)Ñ$ìG$'¦KROùt8oH&³{$S^z¬V¤SBĢ⊠ØÀ©iƒèA«äf°1ë€h‚.p;»Áö`¯Z  \2ðoóŠß›ÿÂy™³54Ö4§òý`öendstream endobj 948 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚ•Ï¿jAðïnaÜ ˆÎ ˜½s=b!j W¦J!‚`R ìnÍG¹G°´8ÜÌœEH:›_1;ödÏyŸSp¯ÏnÈyΟíÉ9)¦œ¿Ü_6[šd?Ø9²oR&[Ìùð}ü";YL9#;ãeÆéŠŠÇÀŒÇæÒºÂ„ÐpQ*Å+j .+xsº7á”xÄ•‘Íç–Üð‘\ƒ }µrÓþ† ”¿ø´•R þ/:tK­¬uéîNTc¨'Û¼‰Ä'ò¡jìiT”2ƒ®D¥×‚Þé+XÑendstream endobj 949 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚm½JÄ@…OØ"p›¼ÁÎ}d³ƒÚXW0… •… j)¨hëäÑò(ó)S„ÏD…m>†{çüÜuuìVZj­G+­ÏÔ9}ªäMjÇa©îägóø"›VìÖNìÇbÛkýxÿ|»¹¹ÐJìVï+-¤Ý*Ðô@ P„sŽºø‚&¾³¾[ D>#E@ƒ¢Ç†r˜Iõ~2û> stream xڕα Â@ àHÁB}Ѽ€Þ]õ¤“…ª`A'uª(¸ÙGóQî|ƒšTZèàà‘û†?$w#3°i²ÔhdÈŽéhð‚CË!Çá·s8cœ ÚÐТZpŒ*YÒíz?¡ŠWS2¨f´5¤w˜ÌHŸP˜Qžç®ÎëY’ 4aÐ:B@à ¸Ç8 ‚—1¾ìn -¡SQ¼üRá-8­ð d“_Ñ®Ó+ÈJ¢_<ÿ!’¯tùâ<Á5~lúQ-endstream endobj 951 0 obj << /Length 265 /Filter /FlateDecode >> stream xÚMÁJÃ@Eo˜ÅÀ[8мÐ$A„ÒB­`B]¹WêÒ…¢ÐEÁù´ù” ;#Ç›*ÖÍyóî{wæÎquÔLµÔZ§ZŸjÓè}%OR7KmN~&w²l¥¸Öº‘₲í¥¾<¿>H±\Ÿi%ÅJo*-o¥])L OÄ[ À`;d1ëa¶°3X`LpÀM6{ä{xÖSÏœ˜°Hpžî|tO¥0£1l¹6Ì ùi4ÈþÓ,ìÀe3zŸÓáw™gRÒô¦SÅß@v伕+ùÿcåendstream endobj 952 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚuÏ1NÄ0бRDšÆ@ò\œlÖBT––E"Tˆ ¶¤AKr®â›ì!eŠ3³ ˆšgiÿ_×'aE5t¼¢æŒB ÇŸ± 2¬(œÎ_žpÓ¢¿¥& ¿”1úöŠ^_Þvè7×çT£ßÒ]MÕ=¶[‚b—….'0SÉ2*(ÙŒ`&p ÞÁõBì!Ît ç¼àÒð_èÝ_èR¥c§Ø™%Éž 6{6Cñ!I¬cˆ“Ä)A×ô?€Ö«ÌÁ“ôXZ1IÁØËN+éOVë”ùÀäqY‰-Þàú m9endstream endobj 291 0 obj << /Type /Font /Subtype /Type3 /Name /F15 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ -4 -21 83 62 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 16 /LastChar 125 /Widths 953 0 R /Encoding 954 0 R /CharProcs 955 0 R >> endobj 953 0 obj [27.68 27.68 0 0 0 41.52 0 0 0 0 0 48.44 46.13 46.13 69.19 0 0 0 41.52 69.19 0 0 64.58 23.06 32.29 32.29 0 64.58 23.06 27.68 23.06 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 23.06 23.06 0 0 0 39.21 0 62.27 58.82 59.97 63.43 56.51 54.2 65.16 62.27 29.98 42.67 0 51.9 76.11 62.27 64.58 56.51 64.58 61.12 46.13 59.97 62.27 62.27 85.34 0 62.27 0 23.06 0 23.06 0 64.58 0 41.52 46.13 36.9 46.13 36.9 25.37 41.52 46.13 23.06 25.37 43.82 23.06 69.19 46.13 41.52 46.13 43.82 32.52 32.75 32.29 46.13 43.82 59.97 43.82 43.82 36.9 41.52 0 41.52 ] endobj 954 0 obj << /Type /Encoding /Differences [16/a16/a17 18/.notdef 21/a21 22/.notdef 27/a27/a28/a29/a30 31/.notdef 34/a34/a35 36/.notdef 38/a38/a39/a40/a41 42/.notdef 43/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59 60/.notdef 63/a63 64/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74 75/.notdef 76/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87 88/.notdef 89/a89 90/.notdef 91/a91 92/.notdef 93/a93 94/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122/a123 124/.notdef 125/a125] >> endobj 955 0 obj << /a16 884 0 R /a17 882 0 R /a21 885 0 R /a27 889 0 R /a28 888 0 R /a29 890 0 R /a30 891 0 R /a34 886 0 R /a35 887 0 R /a38 892 0 R /a39 875 0 R /a40 868 0 R /a41 869 0 R /a43 876 0 R /a44 877 0 R /a45 883 0 R /a46 878 0 R /a47 879 0 R /a48 943 0 R /a49 944 0 R /a50 945 0 R /a51 946 0 R /a52 947 0 R /a53 948 0 R /a54 949 0 R /a55 950 0 R /a56 951 0 R /a57 952 0 R /a58 880 0 R /a59 881 0 R /a63 893 0 R /a65 894 0 R /a66 895 0 R /a67 896 0 R /a68 897 0 R /a69 898 0 R /a70 899 0 R /a71 900 0 R /a72 901 0 R /a73 902 0 R /a74 903 0 R /a76 904 0 R /a77 905 0 R /a78 906 0 R /a79 907 0 R /a80 908 0 R /a81 909 0 R /a82 910 0 R /a83 911 0 R /a84 912 0 R /a85 913 0 R /a86 914 0 R /a87 915 0 R /a89 916 0 R /a91 870 0 R /a93 871 0 R /a95 874 0 R /a97 917 0 R /a98 918 0 R /a99 919 0 R /a100 920 0 R /a101 921 0 R /a102 922 0 R /a103 923 0 R /a104 924 0 R /a105 925 0 R /a106 926 0 R /a107 927 0 R /a108 928 0 R /a109 929 0 R /a110 930 0 R /a111 931 0 R /a112 932 0 R /a113 933 0 R /a114 934 0 R /a115 935 0 R /a116 936 0 R /a117 937 0 R /a118 938 0 R /a119 939 0 R /a120 940 0 R /a121 941 0 R /a122 942 0 R /a123 872 0 R /a125 873 0 R >> endobj 956 0 obj << /Length 97 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P04F¦ † )†\…\@ ¡2ɹ\Nž\úá@.}0éé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢ ÇPßPßðÿ‚Ør \®ž\\-r"endstream endobj 957 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P0QÐ5S06U05RH1ä*ä26PAS ˆLr.—“'—~¸‚±—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÁˆk øÿ```á Ì ü€„@0?700ȃ0P¹=ÛqqFÀ´ÓÇ0.b.WO®@.Ð`9eendstream endobj 958 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P04F¦ ÆF )†\…\† ä‚e’s¹œ<¹ôà ¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. r õ õ ÿ@ ˆ-Ç€ `SËåêÉÈÃ7(bendstream endobj 959 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚÎ;‚@€á!$Sè `.  ,ñQ‘ &na¢•…±RK ¶àÍä(’‚0bbkñ5³“_ÏÇ¡&Ÿ4ÒЦt ðŠ:”¡OѬ9^01¨v¤CT+£2kºßgTÉfAª”öù4)]Àk=ˆùÌl »²SÛìTK`¯OÈ;1@ÜÉEÖs´¢ùS·›ý¸ù÷ώ܈?· Èäv+ ´4ÒTK[%¥´à1H;àÒàß0)P7endstream endobj 960 0 obj << /Length 181 /Filter /FlateDecode >> stream xÚmν Â@ àh‡B–{„æ ¼Ö£C§B­`A'qRGEçë£Ý£Ü#8v(‰àærù;W-–ŽrúFEnI—ïèJÉsMµp¾aÓ¡=+Ñnäm·¥çãuEÛìVT méXP~®¥G€”Ã@ÆÜ+²àÁôi„9¤oH~¤,x!aÁ(™RRõQѾIÿ0é>F^ÆXnÊŽFIxùP\w¸ÇòFZhendstream endobj 961 0 obj << /Length 186 /Filter /FlateDecode >> stream xڕα Â0à“ Â->‚÷¦5Rqj3:9ˆ“::(:§Vß$Pq°Ci¼¦Š¸øÇݧF½¾¢À?5¤AD»¨"_4ßö€±F¹"¡œq¥žÓùtÙ£Œ Q&´)Ø NÈXpù¦Fü‡IAÜœñpçÊšŠÉ&%t3Q@Çcy¬ý!gÄO¸¥¨›_p€Ï«`œ5ñîêÞ+ëåþŒ;Ô²§—øÓ>i;endstream endobj 962 0 obj << /Length 191 /Filter /FlateDecode >> stream xڕͱ Â0à  ·ôzO`Z#…N…ZÁ‚N⤎Š®¦æ£ô:vwÕÅEpÈwIþßä“©¡„¦|LN³ŒŽ)^Ðd<'2ÊÅáŒezK&C½ä-êzE·ëý„º\Ï)E]Ñ.¥duEq…û"ࢎ±ÎòÞA „BÔsT܆ŠgÀ4Êæ!ßFÁýdx?V,HÔHJ|ÄE]1Vú–Ë}§üà;°=·¶ÅE|Ÿ9g1endstream endobj 963 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚ]= Â@…_H˜&GÈœÀü,‚°#˜BÐÊB¬ÔÒBÑ6æh9JŽr‹%ãD;‹¯x?3Ï,f…ጿÌÙ|ÉéN&WMr Î7*kJlrJ7êRZoùùx])-w+V·â£žœ¨®±ìˆ´¡H‰ô±‡¤]Òζ¾ùÑh³‘ñïhí@û°ÀÒ¶h’N0Æ>òúÛ"N·Xé uM{úpTRÿendstream endobj 964 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P0bc3…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. òþÿ``üÿ‡ùÿ?v æÿÄþ1Ȩao`À†ëÿÿÿðÿÿÿ0 âãRK)¶ÿÿÿÐü0 âs¹zrršTendstream endobj 965 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ3¶Ô32V0CcK3…C®B.c ° ¢’s¹œ<¹ôÃŒ-¸ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õþ@!êA3i„ýæ@ÝÌßÿÿ``þÿÿˆø$€†zæ ö Ì@Ä8ñºDýÿæÿ?þÿ?þÿ‚‹q¹zrröƒcCendstream endobj 966 0 obj << /Length 160 /Filter /FlateDecode >> stream xÚ3¶Ô32V0PÐ5&† ÆF )†\…\& ¾ˆ –IÎåròäÒ*áÒ÷ sé{ú*”•¦ré;8+E]¢*c¹<]êÙÈ30üŸÿ¡þÃÿÿ?ÿ?’ÿÿ`¨“üê?þ`àÿ`H>°o’ìÐÈ;š’õþþÏðÿÇÿÇÿ€|$Álˆ8—«'W ti0endstream endobj 967 0 obj << /Length 168 /Filter /FlateDecode >> stream xÚu¿‚0‡¯a ¹…Gè=-T'ÄÄ&:9'qtÐè*<ÒG`dh¨=Gsù†û÷ûÌzQÒ´Œ˜™‚šh4qÅ–×;VÕ‰ŒFµ‹STvO¯çû†ª:l(GUÓ9'}A[HÐŽ ÂI†ÐeCÙË>se—%$C Éø1ãü?&þwÇ?óD:é8“³ÙÁ.v²·øÈüJ@endstream endobj 968 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚ1 ÂP †o²xs}mŸT: µ‚ÄI_VoÒ#TìPÓ§ “ƒ$|ßðÿ‰‰!OªïÈH´óñˆ&tê0z¶ŒSÔ+2!ê™è¨Ó9O—=êx1!uBkŸ¼ ¦ ÙÂfÀ7.€\3×`™Pœ³l¦jè媂®C¡Jè|P ÔOÈJÕ.¿!ίqþ²çkä"%\µg¨»¤J ø–3òo8 §).ñ °thendstream endobj 969 0 obj << /Length 142 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P0bcC…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€|…h –X.O†:ü¸þÿÿÿÿÿÿà >!=x°£Ã ö ì›øÿy ùüÿ00ÿ?ÀÀðŸËÕ“+ ŒLAQendstream endobj 970 0 obj << /Length 168 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P0bc c#…C®B.c3 ßÄI$çr9yré‡+›qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]êÿ±ÿðH|øÿŸH€X`1þy$âƒ=û;Lâ8øÃŽùñŸ âù<(Áø|^2ñ}Þ(ñŸÿÃþÈÄ?v QÃü€ËÕ“+ ««SXendstream endobj 971 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚE±‚@ †kHºð×'ð€#1.\‚˜xƒ‰NÆI4ºàÑx‘pö·~éÿ·ý«–óTQL)—ZJé’àUÆ:vÒ Î7, Ê© å†]”fKÏÇ늲ح(AYÒ1¡ø„¦$= õ¤¿h|ç½ÙvcÔ2DP К!*‡‘ ŒÐ!èº_ç=?õ{"gäîÖ§¼#Î8Ùÿz¾«'áž3¬Õ¶ýK\ÜãÌ­Gvendstream endobj 290 0 obj << /Type /Font /Subtype /Type3 /Name /F32 /FontMatrix [0.01338 0 0 0.01338 0 0] /FontBBox [ -1 -17 41 52 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 46 /LastChar 120 /Widths 972 0 R /Encoding 973 0 R /CharProcs 974 0 R >> endobj 972 0 obj [39.23 39.23 0 0 0 0 0 0 0 0 0 0 39.23 0 0 0 0 0 0 0 0 39.23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39.23 39.23 0 39.23 39.23 39.23 0 39.23 0 0 0 0 39.23 0 39.23 39.23 0 0 0 39.23 0 0 39.23 39.23 ] endobj 973 0 obj << /Type /Encoding /Differences [46/a46/a47 48/.notdef 58/a58 59/.notdef 67/a67 68/.notdef 97/a97/a98 99/.notdef 100/a100/a101/a102 103/.notdef 104/a104 105/.notdef 109/a109 110/.notdef 111/a111/a112 113/.notdef 116/a116 117/.notdef 119/a119/a120] >> endobj 974 0 obj << /a46 956 0 R /a47 957 0 R /a58 958 0 R /a67 959 0 R /a97 960 0 R /a98 961 0 R /a100 962 0 R /a101 963 0 R /a102 964 0 R /a104 965 0 R /a109 966 0 R /a111 967 0 R /a112 968 0 R /a116 969 0 R /a119 970 0 R /a120 971 0 R >> endobj 975 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuѱjAàY<„kínžÀ»Kâ­ rE V)$ ±²HÐV®óu|„ Ë> stream xÚŽ= Â@…Ÿ¤L“6•™ è&&’µQðL!he!‚ –‚ŠB ‘=šGñ–[:[›¯xü÷eY³­9æŒ g-N5o:PšKsÚù\Ö;ê¤æœæ¤Æ“*&|:ž·¤úÓ'¤†¼H8^R1dàeBø¯‡FdJ ê%,|ë=àYÿŽš n€ PFôºëpý"¬ðüà÷VÁõ…U³ÛˆÝÚÞí®Äwq©ÝÄÊ3â@L/pÎpö QA3z8 > stream xÚ32Ò³0V0P0b#Ccs…C®B.C3 ßÄI$çr9yré‡+šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿö”@þ S¸\=¹¹=7œendstream endobj 978 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚŽ1‚PD‡PlÃØ èýFi AL¤0ÑÊÂX©¥…F;Bðf…#PRàò5±5›¼bvggô|NØgÍ£€õŒ§ >t#íó0Óð³9])ÉHíYû¤Ö"“Ê6ü¸?/¤’í’R)ö”¥ ôܾbt@ŽV·´k8•SÁ®ÝRONÛXÐE‚¼¹ 7âñó˜æ³Éð$­u%¼1 L«…ÈC?įîÛÙêKÐ*£½ì@Cæendstream endobj 288 0 obj << /Type /Font /Subtype /Type3 /Name /F31 /FontMatrix [0.01338 0 0 0.01338 0 0] /FontBBox [ 4 -1 72 51 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 77 /LastChar 111 /Widths 979 0 R /Encoding 980 0 R /CharProcs 981 0 R >> endobj 979 0 obj [76.38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44.58 0 0 0 0 0 22.83 0 0 0 0 0 47.92 ] endobj 980 0 obj << /Type /Encoding /Differences [77/a77 78/.notdef 99/a99 100/.notdef 105/a105 106/.notdef 111/a111] >> endobj 981 0 obj << /a77 975 0 R /a99 976 0 R /a105 977 0 R /a111 978 0 R >> endobj 982 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ32Ô36V0P0SÐ5´T02P05SH1ä*ä2‰(˜›B¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿüÿñ‡a0A‹¸\=¹¹n‚`7endstream endobj 983 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ô36V0P0TÐ5´T04U05SH1ä*ä2‰(˜›B¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿüÿÁ8¨ ÈE\®ž\\àY_\endstream endobj 984 0 obj << /Length 128 /Filter /FlateDecode >> stream xÚ-ÉA A†áOSÔ—ü‡ï03;Ùv‹ËZeŠ“ƒ”ÂQ!®Ì?_«¶÷ö¼™Ÿ† §\?“ÏUèâù`ÙšSºq¾±Š´{•´ë–iãF¯çûJ[m—ò´µ^îÈXkŽš©Iß´H½.“ èc„!Æ(pÇ \EîøÀ—'endstream endobj 985 0 obj << /Length 90 /Filter /FlateDecode >> stream xÚ32Ô36V0P0bCS …C®B. Ïȉ&çr9yré‡+Xpé{€O_…’¢ÒT.}§gC.}…hCƒX.O›ºÿ@PgÃåêÉÈj*endstream endobj 986 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚ32Õ3S0P0T04Q02R0´TH1ä*ä22PASˆDr.—“'—~¸‚‘—¾‡‚)—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Âÿÿ—«'W µ? endstream endobj 987 0 obj << /Length 158 /Filter /FlateDecode >> stream xÚ31Ò33W0P0b#Sc…C®B.rAɹ\Nž\úá &\ú@Q.}O_…’¢ÒT.}§gC.}…h ÊX.Où ÿÿ000c`à?ÀÞÀ ß$ìl†:ù `ãÁß$H øü$nÔ@Ì@Ï<¨ÿðÿÁåêÉÈcýu´endstream endobj 988 0 obj << /Length 160 /Filter /FlateDecode >> stream xÚ31ѳP0P0bKSc…C®B.s ßÄI$çr9yré‡+˜˜sé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ìð?``üÿÃþû¹6 ò üêìäücÒ@òƒýŒ?à¤ó *ÊÉÿ p™¤–ÉÔ%ÙA¾º¶ùÿ’ËÕ“+ åZ‚Òendstream endobj 989 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚmα Â0à …CíêÖ{Û¢Aœ UÁ‚N"ÔQPÑÙ>Z¥Ð±ƒ/qh* w¹_NGrFùHIrB§o(C®]ê‹ããýÉýwÑOÖô¸?ÏèÇ›9qwA{~rÀdAP€Y DiãT-tß-ô?†^ƒá«… Ê,®Q®I=›Â3ar×BdnièZ8¿LM: Þ5:Œ«”…§”Ò‰^5“¢š”‡óxëL?„¦4p&§0xœÎ­€?JMp™à¿Ÿma!endstream endobj 990 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚÐ=‚P àGHºx{ð“8‘ &¾ÁD'㤎ñh…#02°?$8BàKÚ÷Ú’&ñ*Zc€} ½!ÞBxBœR,!\[ðO§àï( ¾Ýãûõ¹ƒŸ6Hqçƒ ØzŒak±5ngÜÞ8eÅòËf»Tkv¡63¬§*íIÏRúË,êÐôF¬9ãuÓéx_kÿçzj˺j7ÃvªRµ›þa&–ïaôãfØÊÀÖÂ~;2Šendstream endobj 991 0 obj << /Length 240 /Filter /FlateDecode >> stream xڥбJAà¹"0¹Öâˆófïô6±88ˆr… •…X©¥ ’t»GË£Ü#¤L±dÝÙE!XÚ|Å¿³ÃÌ3­æ\pÅ—lJ6WüZÒ'U3lL|yy§EKú‘«é•I·w¼þÚ¼‘^ÜßpIzÉO%ÏÔ.HŽHÆõ9àÜû@jd{Ô[œï0¶èzŒ,޾Ö* (›xa“ƒ8Ú{·Ùðkí?ý˜7Ñ^ìÄôDˆNÄì¢ú7Q™!óÏœÑë0vù{ *(ûª4Mz¹C¹É$L œ““†>ݶô@ß‚7[Šendstream endobj 992 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32×37R0Pc3SC…C®B.#c ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…ÿÿÿAㆌ€n€»‡ËÕ“+ @£P3endstream endobj 993 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚ­=‚@F‡PLØ (¢®ÆF)L´²0Vji¡ÑV8šGñ”DœYvbì%„G¾Ù}fÔö¨C}juÉ ÈôèàMÂa‡Œi*ûN2Œ7dŒcœ-éz¹1ž¬¦Ä錶¼g‡ÙŒ‚ äÉë½*(Á$ 3R€¨¸sÀk*[ö^~)¯ü:p.õPð¶‹yS$Èi! ‡Üâ¡9"Emñü´õïy t$; B§–«Ôz#qãU _¼Ô„ó¢–œ3n“}:»Îucç®ñ —q¯endstream endobj 994 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ35Ò32S0P0b SC…C®B. ßÄI$çr9yré‡+˜˜pé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…ÿÿÿÿc`’ÿ€É ÌØÿ00þa`ø&ëÁ¤}ˆ”?&€H~dò$’z¨9&×#ldÿÁÀv ˆl‹3 ÉüDþÿÿärõä ä“mìendstream endobj 995 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚϽ Â0ð+…Cpu¼дjÔ­àØAÐÉAœÔQPѵöÑò(}„ŽbÌ%ê"~á.—ûG»²Oõ¨Ó#9"Ò!Ä Ê)dz¶³?á$F±!9@±0eñ’n×ûÅd5¥ÅŒ¶!;Œg¤µ~€A§ŽÀ{ƒÏÕ7Ÿx8¢ÔÒVŽÌÒ(È+ó3÷}L•7$n» ÁcM9Àù¾ÁÏ-µgy ŠðÉÏþ’V nQe"Õò4ÓÔÚDË,lÌøù™{:cÌqã?õ(†{endstream endobj 996 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ]ϱNÄ0 àeˆä¥¿´½¶ –«t`b@LÀȉA-oÀ+䎭CtƾtbùäØ‰í´³ƒÃ#®¸åý7ÇÜ5|WÓ#5­&+îºmåö•WÜ´TžišÊᜟŸ^î©\\œpMå’¯k®nhX2BrÀGöØñð«ð‰bt‚æZ2z¼A3^àÿ“·eýƒ½6¢Ò¯ Q‚hXˆ†^$‰E&+ÛsYÿÞtd´FoëVĸ‹ß!ýacÆ “íœm{í=×á::ã+» I$!Öét Kú8 bõendstream endobj 997 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ35Õ31W0P0bS#SC…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿ@ð…l`ÿÀø¯†ýƒ]ˆ”+‘|2D²=‘ìÈäÉŒŸd‘ C‡äÿ$äÿÿÿƒBr¹zrrÛibÛendstream endobj 998 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚmË= Â@†áO,„ira纆P hSZYˆ•ZZ(Zg;¯µÞ$Þ@ûà:ñ§xŠwfLÜŽ¸Ã†[!›˜MÄ›ödª(¹ûÞ¬w4ÌH/dOz"™t6åãá´%=œ8$ò2äΊ²”‘[ îo@`K ‰È ±Ê ûÒ(  à5/¨ .P/¥·êà ¯ßüEuì÷ø%øà¡ —£W¸ÄîïV]®Þ6¼d<Ð3šÓSþQendstream endobj 999 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚ31Ò33W0P0RÐ5T01P05RH1ä*ä2 ¹Æ™ä\.'O.ýpcs.} 0—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ó†ÿ¨;ˆ`¦aß$þ?``þ|àów†:æ ö Ìä˜0ðªì@ÄÁ &~LÀ €˜÷b<Ø"°•o@–Ÿg¨a`nn:ˆè4†z.WO®@.‡qd‰endstream endobj 1000 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚͱ Â0Ð[:ÞÒÕ­ï4ISÁNZÁ‚N⤎‚Š®ÚO˧ô2:5EÜÎrß½<“´aÅ5›ŒMÎ{MgÊŠ*6ãïew¤²&¹æ¬ 91ÉzÁ×Ëí@²\NY“¬x£Ym©®â Ø7Ð y´q{á„O‚´Þö·½{ðúÓocm0HLR•8œD~ùÈ¡KØÐ4«iEì+9endstream endobj 1001 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ31Ò33W0P0VÐ5T01R05RH1ä*ä2¶ (˜Cd’s¹œ<¹ôÃŒ-¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ö@Ìÿ…`¨g€JPJ°ö€Ä~{ÆÌûØ0þgà?ÀðŸA¾h°©„õ ¢Dü#™¨ƒP7fG=ÄJå ÌØ÷ÿaø!gÿä´? üì¸\=¹¹ZErendstream endobj 1002 0 obj << /Length 180 /Filter /FlateDecode >> stream xÚ]Ë1‚@…áG(H¦ÙÖŽ¹€. h¤"AL¤0ÑÊÂX©¥‰m£q”=–\”ÊâkþyÅ5ã€C+ŽBŽb>)ºQ˜Øp4ý]ŽÊ ’;’+›Ik~ÜŸg’ÙfÁŠdÎ{ÅÁŠœ!4P½W ׈ÚÓ¢§ýÚ홾¦pLçUÚA×u_-€¥U R`ÔókÌE@4¸zÚ1nƒ·°ûáв -}œ…@ùendstream endobj 1003 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ32Ö31W0P0b# Sc…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ÿ00°ÿg`go`°ã?ÀP#€áüÆÌüƒùIøÿÿpLª^r0û†úÿà˜ËÕ“+ ŠèQKendstream endobj 1004 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuޱJÄ@†ÿba÷ÄÐ$—­.pž` A+ ¹J--í²à‹Mçkø)Sgƒˆ…²ÃÇîüÿü;õÙñœKžñQuʵ՜*z¦:uK>©¾¥û'Z¶TÜšŠKëSÑ^ñëËÛ#Ëës¶÷Šï*.×Ô®@°’.B‡OÉúîCܶÉÅKxÞBôb&'hà¶ÿc²LæiÌ¢µÀõ`_`/p`þÂáB‚×1ANµG®ºK·ÑÔlÄè`iMBˆéÿÄ.©É’&)yc eòÞ6…j4ÍLtÑÒ }PªW¿endstream endobj 1005 0 obj << /Length 152 /Filter /FlateDecode >> stream xÚ31Ò33W0P0bCS#…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?000üG%ØA3•ù@¢þóǘ?7Ô00g¨c`þ"þ0ØC‰pâM ö õ ÿÿÿÿAp¹zrrïo^€endstream endobj 1006 0 obj << /Length 116 /Filter /FlateDecode >> stream xÚ32Ô36V0P0bCKSC…C®B.C3 ßÄI$çr9yré‡+šqé{E¹ô=}JŠJS¹ôœ€|…hCƒX.Oöþò ÿ{Àþà?ò?`'òø\®ž\\°„> stream xÚ32Ö31W0PÐ5QÐ54S04W05TH1ä*ä22PA3s˜\r.—“'—~¸‚‘—¾P‚KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùûþäñæ ÿaˆýˆK{dÁü¡†ùÃ?æÿØèÀ?þ5ü ò ò@Nàrõä äx‡O€endstream endobj 1008 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ­Í= Â@à )Óä‚s7?&h%Ħ´²+µT´ÕMð"9BÀÂ!ë¼4jo±ÌÎÌ›¾×‹Bö89 xëÓ‘ÂXj%›=%é%‡1é©ü’Îf|>]v¤“ù˜}Ò)¯|öÖ”¥l—J)ó‹ìb›âË Q VîÉÃ0 ö³^µÐ€ú*T7tGXë¶»Hq‘ç9 ´7€ªA£œJ™Ü˜‡)?Ð$£½Í£kCendstream endobj 1009 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ32Ô36V0P0bCKS#…C®B.C3 ßÄI$çr9yré‡+šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ØüCþì4üþƒ—«'W ÁåFÚendstream endobj 1010 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ33Q0P0b3ccc…C®B.3rAɹ\Nž\úá f\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.Oæòþ30üÿPÿƒùÿ†ÿÔð3…>7ØÉ0~``ÿÎ`oÁøƒùƒ}ˆþÃÔðAÿ`?€L`o„4ûûŒÿþÿ?þÿŸýÿè4—«'W üYz0endstream endobj 1011 0 obj << /Length 142 /Filter /FlateDecode >> stream xÚ31Ò33W0P0bCcc…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?È`øÿ¡þÃÿþ0üÿÜPÃÀþ¡ŽùˆøÃ`%~À‰4%Ø0Ô7üÿüÿÁåêÉÈÝLtendstream endobj 1012 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚŽ1 Â@Dg±XøMŽÝÄÅÊ@Œà‚Vb¥–Švr´%GH™"ˆk¶+áóŠæÏÈl”pÄcÆ,S–„O1]IĉËÄ;Ç e–ÌŽEȬœLÆ®ù~{œÉd›ÇdrÞÇÈæ ÝH_]XB5ºÂ R5t¥%Z„ÀÓ# Ìá®p™/¸xZþŸXÿ¯‡ï(Ñ!¨TëË®ý*¿ï³”––¶ô’ô=Úendstream endobj 1013 0 obj << /Length 188 /Filter /FlateDecode >> stream xڕαÁPà?9C“³x縭–ÚšT%:H˜ bÂh ¬Ô›õQúW îи.!a´|Ã’ÿ?Q§Ý‹Å—Ž´‚®D¾„¡¬ÞrøL}‰úïÓrÃiÎj&aÌjärVùXö»ÃšU:HÀ*“y þ‚óLH'¬¶ìµ4°7áÝ‘€j4 2h–¤ÑxQ9<ý™?ðÌoAõ)uõ¯¡IñdQƒ®gº¸×HŸàÀŸxÆamù sžòÝiendstream endobj 1014 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚ•Í;‚@àÙPl2 7¹€îâBBG‚˜¸…‰VÆJ--4Zà 8’ÜDŽ@IAÄhŒ¥Í7ɼþ@OBCš ý‚)CÏh"îj ¢÷hÂÄ¢Ú‰P-¸Ê.éz¹Q%«ù¨RÚú¤whSY;q+ZW‚hœd% p+ñ¯„¼2ˆx“ˇ®çùÙ/ÃÓáýä–¢ãpçN-9«õ ãVLñ/YÎÇ]ûç×øÛµEàendstream endobj 1015 0 obj << /Length 132 /Filter /FlateDecode >> stream xÚ36Ð30Q0P0b# cc…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]˜Ô0üøŸáÿãþ†ÿÏå°¿“?ÀüŠÿð70ÿ``€ãÔÁì@³þÿÇ\®ž\\`d@.endstream endobj 1016 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ=Ì= Â@àWE˜Â\@Ì\@7ÙPþ€)­,ÄJ--…tÙ£åžAoÎ!ëøƒÅ×¼7óB¿«ì³æNÀºÏa÷HGúFßfw¤qBjÍ:"5—˜T²àËùz 5^N8 5åMÀþ–’)Ã:hØ<Ôb„mÑDñá|”?5k€¬b›‹®-å_+­kß"69<áš;Å—l¹¨d¿F O“âaïÈ3š%´¢VZ@Uendstream endobj 1017 0 obj << /Length 142 /Filter /FlateDecode >> stream xÚ3²Ô³0W0P0TÐ5T02S01SH1ä*ä22 (˜˜Cd’s¹œ<¹ôÃŒL¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  (¨†>€#1``ÿÀ ÿÿß0b‹˜q vÆl@Äð‡¡N†Aþû.WO®@.1¹>šendstream endobj 1018 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ31Ò33W0P0RÐ5T01T06VH1ä*ä2¶ (›@d’s¹œ<¹ôÃŒ-¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÌìþàÿD°`¨gKД¨G%þ30‚‰Œÿ~0ïÿÃPÇnÿ‡Aþ`ÿaÏÀåêÉÈjdGendstream endobj 1019 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚMÌ» Â@„ᑃ˜ÖBð¼€înV+A#¸… •…‚Z *Úzy3!ïb½¥EHÜ`¼4_ñLK6Ûš%‡ÜP¬»¬C^+Ú“î¸(Yë÷²ÚRߘ±î¹LÂŒùx8mHô'V$"ž+– 2g2û#°è]}‹:<‹JNÞ5”ž¨¾AYbœ±.9=Ü ê·ë‡ØÄ(ð_R‡—|p×ÿÀ~qÇ444¥R<¥endstream endobj 1020 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚ35Õ31W0P0TÐ5T05Q06RH1ä*ä25 (Cd’s¹œ<¹ôÃL¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿËÿoüÿ•bÿÁø‡Á¾ýã9æ ?d@Ô ªa€Sê,€2ÿ àTã†5J5){fþ†ÈÔ %߯~°Ac ¤øÏ0?f€S옿¨ŒPê;b|ÀPA1¹ˆËÕ“+ ?šYRendstream endobj 1021 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚE; Â@†ÿ°``rÁ9›˜é` A+ ±RK!Š‚…øÀƒxÁ‹XY§L±dµ±Øæ›IÂV'æ#yIÈq›Wm)N¥þ•®±ÜP/#=ã8%=’”t6æýî°&Ý›ô9"=à¹L.(°µž-ÿPìÕ38GàŒ¸à toO y¿Á €ÿq¨Ê¼R÷ƒË`]æ bøMqkl©û‚†*€Ô)¹œB!žWˆrÜeÍ4ÌhJ_`±Jrendstream endobj 1022 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚUαjAÆñï8ð`±µn^ Ù]ר©Æ€WI•"‚ZT XÅ}´}󛃈qn/¤ùßÀŸéêÛ;Ëš ߘÛ{¶^Z“í˪¹;¨Nów¤^ÙöIe'ULx»ùX’>?²!5â7ÃzJň÷¿n_þ‘•È}Z¢é’„pÂUÅmà­Šèˆ[¹› þ4½¯È¾\ä(¤G?BrŽHú»]3«9|$‘æ.pJi®…U;„Bþð@O½Ðœ>F½endstream endobj 1023 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚ3¶Ð3Q0P0VÐ5R06U05PH1ä*ä26 (˜Ad’s¹œ<¹ôÃŒ ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oþ õ~Ø10?ào`?„ Ìø˜È30~a{Æ lTUÇÀðÿc`øG ŒÍl˜Ý sÈm`w!ÈÍ ·ƒýô —«'W ˆ1bÓendstream endobj 1024 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚe1jÃPDG¨ló/¬½€-É?†¶QH*!•í2`‡\Ù:šŽ¢#¨T!¬ÌÏ'UŠÇÂÌÎ2k³GÍÕêt®¶Ô2×}!'±Å\ËypvŸ²ª$Ûª-${¦,Yõ¢ß_çƒd«×µRÝè;3Rmi Œ¢qDÒºÚ m&0í’Îyê¤wuÜ»&“¤Hzº€áÓ€YÀÕÀˆhß(ßPCðüÞo†fì¡yî\ÉøŸáÎÝ 92»à%L—²¼aç˜ÝýþyªäM~šUÊendstream endobj 287 0 obj << /Type /Font /Subtype /Type3 /Name /F29 /FontMatrix [0.01338 0 0 0.01338 0 0] /FontBBox [ -4 -19 63 56 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 27 /LastChar 121 /Widths 1025 0 R /Encoding 1026 0 R /CharProcs 1027 0 R >> endobj 1025 0 obj [44.8 42.67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21.33 25.6 21.33 0 38.4 0 0 38.4 0 0 0 0 0 0 0 0 0 0 0 0 0 57.59 54.39 55.47 0 0 0 0 0 27.72 0 0 0 0 0 59.73 52.26 0 56.53 42.67 55.47 0 0 0 0 0 0 21.33 0 21.33 0 0 0 38.4 42.67 34.13 42.67 34.16 23.47 38.4 42.67 21.33 23.47 40.53 21.33 64 42.67 38.4 42.67 40.53 30.04 30.29 29.87 42.67 40.53 55.47 40.53 40.53 ] endobj 1026 0 obj << /Type /Encoding /Differences [27/a27/a28 29/.notdef 44/a44/a45/a46 47/.notdef 48/a48 49/.notdef 51/a51 52/.notdef 65/a65/a66/a67 68/.notdef 73/a73 74/.notdef 79/a79/a80 81/.notdef 82/a82/a83/a84 85/.notdef 91/a91 92/.notdef 93/a93 94/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121] >> endobj 1027 0 obj << /a27 988 0 R /a28 987 0 R /a44 984 0 R /a45 986 0 R /a46 985 0 R /a48 1023 0 R /a51 1024 0 R /a65 989 0 R /a66 990 0 R /a67 991 0 R /a73 992 0 R /a79 993 0 R /a80 994 0 R /a82 995 0 R /a83 996 0 R /a84 997 0 R /a91 982 0 R /a93 983 0 R /a97 998 0 R /a98 999 0 R /a99 1000 0 R /a100 1001 0 R /a101 1002 0 R /a102 1003 0 R /a103 1004 0 R /a104 1005 0 R /a105 1006 0 R /a106 1007 0 R /a107 1008 0 R /a108 1009 0 R /a109 1010 0 R /a110 1011 0 R /a111 1012 0 R /a112 1013 0 R /a113 1014 0 R /a114 1015 0 R /a115 1016 0 R /a116 1017 0 R /a117 1018 0 R /a118 1019 0 R /a119 1020 0 R /a120 1021 0 R /a121 1022 0 R >> endobj 1028 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuбNÃ0€á³ò«O¯8ïÑßShÑ_Ë*úþ†>Þ?_ÐÏo/©C¿ ‡ŽÚGìîÒ8jWÃqy[ixwTËceÿÙMídÃÙuÖ­99›–SÐÌÔ. § /ÈŽû ¬J¨Af Qµ¢Ù\iÜND.”[j4Èé‰ £*A3=¹¸TÍ(÷7¦ ÆòåõŸxÕãþÌÜ/endstream endobj 1029 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ]Ì1nƒ@ÐA[ M³GðœÀ †"©0‘B)©\X©b—)Å5ÜÌe@Iòó—2Zí“fÿþ©ûÇ+ìÀ[WVUv)õKëÂÒᘂOm{ '« Ï|ÕпØÏ÷íª¡}=Z©¡³siÅ»öÉð+â€(9°ˆŸý*»Åd Á˜˜È0ù™ä‘d#Ù0‰q˜ù ¶F“Cj0'ãLÜH¢Cl×íà°¦E1‡>õú¦èŒgÙendstream endobj 1030 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ3±Ô34R0P0b3S#…C®B.˜ˆ ’HÎåròäÒW01âÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0þa‚ÿ8H~0ÉNe’ÿˆ¬ÿ$ÿþÿ€ýÿù@²(Áþ¤Œýó?ƒñ?2Ù2…<@‰0JÂlØ qÄ=ߨÝöìÎ`77ËÀåêÉÈI{Çendstream endobj 1031 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚÎ1 Â@Ð/)¦É2'p7l!6b·´²+µ´P´NŽ–£ä)S,wé-æ1Ÿ™âÛõÒ²áiVl-ßsz‘ÙÄ—Û“JGú2éý¤;ðçý}.[ÎIW|ÉÙ\ÉU % PHˆx$ãb„ò‰ Y(º™º ׺…H üM=ÑÍTSôl@Ú¤2¨$ÒøØeˆ­Â§€vŽNôÁ1NBendstream endobj 1032 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ36Ó31W0P0bccc…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Œ?äþÿ¨ÿðÿþ|üçÿïãÿøÿ·ÿcÿÏÁ`Èü‡ýãö ì(Åÿÿ@Á\®ž\\³M'endstream endobj 1033 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ-̱ Â@ à@‡ƒ,÷æ ¼¶çЭP+ØAÐÉAœÔÑAÑÕޣݣœop£BiÌI‡’?ä·‹yUQN6)ÉZ:xÃ2eyZÓátŦC³§²B³–M·¡ÇýyAÓl—T iéPP~Ä®%à·WÌ^‹ÚÕþZ(?üe~œ°àAp€^†žG¨™]úS)L4G€^èA‰,~&ÒFP¥ŸýÌ13|¥'ÔpÕáIKW¼endstream endobj 1034 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ36Ñ3¶T0P0aKs…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]l0p þÁŒPÌ Äì@,ÿÿÃ$Ì'3À‰ÿ±701ã~†ÿÿìø?0p¹zrrÒÜLVendstream endobj 286 0 obj << /Type /Font /Subtype /Type3 /Name /F30 /FontMatrix [0.01338 0 0 0.01338 0 0] /FontBBox [ 2 0 64 52 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 65 /LastChar 116 /Widths 1035 0 R /Encoding 1036 0 R /CharProcs 1037 0 R >> endobj 1035 0 obj [66.72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42.98 49.12 39.3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36.47 34.88 34.39 ] endobj 1036 0 obj << /Type /Encoding /Differences [65/a65 66/.notdef 97/a97/a98/a99 100/.notdef 114/a114/a115/a116] >> endobj 1037 0 obj << /a65 1028 0 R /a97 1029 0 R /a98 1030 0 R /a99 1031 0 R /a114 1032 0 R /a115 1033 0 R /a116 1034 0 R >> endobj 1038 0 obj << /Length 136 /Filter /FlateDecode >> stream xÚ32×3°P0P°PÐ5´T02P04PH1ä*ä24Š(YB¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ @Q…h ¦X.O9†ú†ÿ ÿᬠ—Àƒ€ ãÆæfv6> † $—«'W ÷ '®endstream endobj 1039 0 obj << /Length 180 /Filter /FlateDecode >> stream xÚ33Ö33V0P0b3 ²PH1ä*ä25òÁ\Dr.—“'—~¸‚©)—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEá?|@¥ÿ``¨ÿÀPßÀÀÀÿL1C(FÅ¥* ” %ƒâÁCñA(6ŃF1¢dP(U¦ÿ€¨ÿÿ±PP9˜J˜>TÃxH¥èJ‘Œÿ€(`¬ýÀ ¸\=¹¹|3„äendstream endobj 1040 0 obj << /Length 259 /Filter /FlateDecode >> stream xÚ]ѱJÄ@à Lá¾™'p<¢×8O0… •…Ê)V"жæ*Ÿ+•Ï‘Ê:•¤Ygw‚ÜÜÂòíìÂÿ{tx-(£9ïbAÅ1=äøŠ…Ÿ3?úÃú—Úk*æhÏùmuAïoh——§”£]ÑMNÙ-V+rn`¯f² ‚\uǦxéYÿ> ì `=jïx烷­±lµi'š^› b8çövœžUx…è°ˆ™endstream endobj 1041 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ33Ó36Q0Pa3C3 …C®B.S3 ßÄI$çr9yré‡+˜šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁõÿ„úÁÀdòEë€L0 Jþ˜â‡Pì Ô0Åü…ú¦Q©ÿ¤R(Ú¡f¢Zµê¨Ëä ¹¨D}ôß‘¡L1þ¢À±‡Nq¹zrr¥¦’)endstream endobj 1042 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚuϱJAà¹ba ï ¼yÝÙhº…Á+­RˆPK E;1 ¾Øt¾Æ½±»âp½‹ S|Å?;?¬ŸÏxžjösö3¾­éüTCÆÍÍ=-r+öSrg“kÎùéñùŽÜââ„krK¾ªyrMÍ’a{è„Õ®lBŠ-`a:`Ðu)xªu‹w­äG½W‹˜ÕùÇ2©&e˯œɦá¶ÏÚnh›‡Î ÙÍhüuð‡aǨ‡k}ÿ¡ Þ[ bÔªµoŸb»ý"E“z“†O¾€Nº¤oÉŒlaendstream endobj 1043 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚÅѱ Â0à; ·ø½Ð4X-‚P¨ vtr'uTt•7)7´&/¡Â“²‰Ž hÀ4³“"¯rM¾ò¨Ó˜îzd‡Úendstream endobj 1044 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚuÏ1jÃ0àg<þÅ7ˆÿ ¤²‘ã17x´S‡P(´ MHÖXGÓQ|„ŒBÜWS(TˆôúŸ ÷à ÍÔé4×"Ób¦¹ìÄ• y,‡›÷O©±/êJ±+Æb›µöÇ­ØúéQs± Ýäš½J³PD7¦@Ÿ®à>!º “ ¦Cê’€$¤?TIGÌ@KÎ-Fú?pÝá,üKû‹©F2Îøb ¼±:ÃÆ%£Àº±gqÌ1ágüˆûnx[–<Ë7„ôV3endstream endobj 1045 0 obj << /Length 156 /Filter /FlateDecode >> stream xÚ3²Ô3·T0P0bc3s…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ø000Ôÿ```ü!ÇÀÀüÁ$TßÀ à?hö ¢žAÔ30üc T"þÿŒ ¨h2ÝF»ëÿÿG&¸\=¹¹aök#endstream endobj 1046 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚÍα Â@ à;:ò’'ðzxµ: µ‚7:9ˆ“: *:{ÖGñ;œs]úÈù“!¹éë3pç‡cÜk8ƒ‰YǸØ¡´ Öh PsNAÙ^/·¨r9E ªÂÆl ¶BéuL[“Vùeˆ¦T³½ôÉŽdÞø@ú‡`_µ¬‹’wV| ýÿšð‡äˆš …oafaosKƒendstream endobj 1047 0 obj << /Length 125 /Filter /FlateDecode >> stream xÚ32×3°P0P0b#S3s…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØ€ÿ‚ˆ¥ˆŒþÃûæ? : æ ÿÿÿ€ .WO®@.»P endstream endobj 1048 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚÅÎ1ŠÂ@`CŠW˜ ,äÀI0­QÁ ne!VºåÂ*Z'7ðJÞÀ+ä)Shžóþfe=€ó1ófÞãOãA2∇n'MxÓž’ÔÝ#½êÃö‡ò‚슓”ìÂUÉŸ|<œ¾ÉæË)Çdg¼Ž9ÚP1cïÖsK^4ЇÞû ¥þg Z7-¬áVj]p a­zÕ¯TƒùÌP)ñ*êýªÿåܨFíü½7̽ ,a† ò„0@ AÂæ/¹¤vPô`¤iCiŸ¥yA_ôúŠÜendstream endobj 1049 0 obj << /Length 110 /Filter /FlateDecode >> stream xÚ32×3°P0P0b#S3K…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒþÃûæ? ŒC 1ÿcøÿÿq¹zrrp^Úendstream endobj 1050 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚåÐ=ªÂ@ðH˜Â\@ÈœÀMü BÀ0… •…X©¥ ¢­ÉÑö({Ë«ãî+¾¼b†ßü§˜aÖé8åž«|Äý>2ºPî³Ô~±?Ѥ$µá|@jáRRå’o×û‘Ôd5åŒÔŒ·§;*gX@l$Æu¯8lSyÕEÈžñn!Ñ­Á£X#xiTCÄÆ©F•þHjODO' 0¿ôvÒÊÝö§þ³B÷J#n Ò$"¡ˆù&š—´¦ݤ›endstream endobj 1051 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚ35Ñ34W0P0bSC…C®B.˜ˆ ’HÎåròäÒW01çÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0þaüÇÀðÿûÿ@RŽý´`üÁÀþ§€ñóŸ ÿ`ø$@äÿ†z É€ ÿa/É òmÃÿÿ?ìÿÿC&¹\=¹¹?qjSendstream endobj 1052 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚ= Â@…GR¦É2ÐMtý©bSZYˆ•ZZ(Ú‰ÉÑr2EH|›((vÂðí̛ݷ«Ga_<éIÛ=Ý—½Ï'Ö]ˆžQêÎîÈAÄj-ºËj™U´Ëùz`,§â³ eã‹·å(¢8!"«Ê@'-À1¹à4r²Sjed=L A Ñ‹]l»ÓŒßÄñ V0ùee˜þǯÛ̬äsnãÄ…«òíž ²Áœ¬Ì”/óÍKÝ´í*ëßàYÄ+~PûZ>endstream endobj 1053 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ36׳4R0P0a3…C®B.c˜ˆ ’HÎåròäÒW06âÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ÿ`þðÿ‡üŸÿ?lìþÿ(¨gÿñà?óÏÿ6ügü  u@lÃøŸñþC{Ì ´÷ÿÿpÌåêÉÈÈöPêendstream endobj 1054 0 obj << /Length 202 /Filter /FlateDecode >> stream xÚ]Í= Â@àYÑ6sݬ®+Á0… •…‚Z *Z»G²´ÌQr„”!ënÄ5Ø|Å›7¼¾èȈBêR[ìÑ^àË0$)?—ÝG1òÉùÌÄÈã9]/·òÑbLù„Ö‚Â ÆÒ:c:¯êk€{ê-Ŭ`m8ë¦8•u¨ t&p2 l©µ™Bâ̘ÑϘúê½> stream xÚ½½ ÂP F¿Ò¡¥Ð¼€ÞVn«“‚?`A'qRGE7Áúf}”>BÇÅšÞ‚Šè*3$|9º×î†ì³æV‡uÈQÄÛ€¤}®+ê5“Íž†1©%kŸÔTڤ⟎ç©á|Ä©1¯öר8Ux·èã”À*à%V7±38©“ÂÎ \Aî&°rOP ådeyÜ¿¡>Xý ?c\%éý#øë£æË'q¶(I£©fÔ‰µNšÄ´ ƒ…)endstream endobj 1056 0 obj << /Length 259 /Filter /FlateDecode >> stream xÚ]ÐÁJ…@ÆñOf!"·."ç åÚÍE0p»A.‚Zµˆ ¨vµ ôÑ|Á¥‹ËÎgH0?˜ñ?p´¬NÎNmn¹ÊÒ®×ö¹wYUºÏ¹å‹§7ÙÔâîìªw¥§âêkûùñõ"nssa q[{_ØüAê­…ÙÈB´aD4%;˜>Ú#îp¨§Ýà{%*eÌdl”鈧W”]èHÿ‹ùOË·ž¦…dfä 3Âױt¢KÒ‡óF¼oæû¼³MØfl=³oÂ,"†EÌ"pLΉ~WІh–Fš¥F³*Ö4×€& !Œ3ž´DWþËZnåÎvjendstream endobj 1057 0 obj << /Length 285 /Filter /FlateDecode >> stream xÚm½NÃ0F¿Èƒ%/~ƒÚ/IQ: F*E"02€@b¨HÍâGȘ!Êås[uY:Ãõý9÷–ËóË…/|éÏ.|¹ðUå_ææÝ”…O¯Z~žß̺1ùƒ/ “ß2lòæÎ~|½š|}íç&ßøÇ¹/žL³ñ€Ð'ÐbFÔÈz¸NEØ tÔª·ÃÙàXùÝ !¥½‹©¢‡Šv$ô´t¶S2éWÄðÍáSÔ’K8Z©d¥ef-UwN: VB•DXMµv U=ÒÀŽ+¦OD6í(´‡$´ìƒú÷8³”¼Úㇸb+N=îÆ=BZ!r5ðB<Ÿ$gVZ¡}F=sÓ˜­ù´{~Êendstream endobj 1058 0 obj << /Length 262 /Filter /FlateDecode >> stream xÚu½JÅ@…O˜Â}‹;/ I$7¦ \¯` A+ ±RKAE;¹ÙGË£ì#¤L2Î&"þ _±»ÌùæÕÑÉš3.øð˜‹5—%ßçôLEÆá”Õòr÷H›†Òk.2JÏõšÒæ‚__Þ(Ý\žrNé–orÎn©Ù2 ñ€•hÝŒØ!P#îa]âa:ã‘xÛ-ˆûÚ}bh~mhœ!?0…áÿB~! ø?#;CsŨ¨Ð^À¾¨ßJÔ´¼ãIPG^`ÄM !A#`ü‹xøBo’~^°Ö}gt ëtÚ†ºìpêY…zL¨Gûðê%NýCŒí:kèŠ>¹Œƒyendstream endobj 285 0 obj << /Type /Font /Subtype /Type3 /Name /F19 /FontMatrix [0.01004 0 0 0.01004 0 0] /FontBBox [ 2 -19 79 70 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 44 /LastChar 118 /Widths 1059 0 R /Encoding 1060 0 R /CharProcs 1061 0 R >> endobj 1059 0 obj [27.08 0 0 0 48.75 0 48.75 0 0 0 0 0 48.75 48.75 0 0 0 0 0 0 0 0 0 0 0 0 63.63 0 0 0 0 0 0 0 73.09 0 66.34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48.75 54.17 0 0 43.34 29.79 0 54.17 27.08 0 51.46 27.08 81.25 54.17 48.75 0 0 37.92 0 0 0 51.46 ] endobj 1060 0 obj << /Type /Encoding /Differences [44/a44 45/.notdef 48/a48 49/.notdef 50/a50 51/.notdef 56/a56/a57 58/.notdef 70/a70 71/.notdef 78/a78 79/.notdef 80/a80 81/.notdef 97/a97/a98 99/.notdef 101/a101/a102 103/.notdef 104/a104/a105 106/.notdef 107/a107/a108/a109/a110/a111 112/.notdef 114/a114 115/.notdef 118/a118] >> endobj 1061 0 obj << /a44 1038 0 R /a48 1055 0 R /a50 1056 0 R /a56 1057 0 R /a57 1058 0 R /a70 1039 0 R /a78 1040 0 R /a80 1041 0 R /a97 1042 0 R /a98 1043 0 R /a101 1044 0 R /a102 1045 0 R /a104 1046 0 R /a105 1047 0 R /a107 1048 0 R /a108 1049 0 R /a109 1050 0 R /a110 1051 0 R /a111 1052 0 R /a114 1053 0 R /a118 1054 0 R >> endobj 1062 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ36×31R0P0F¦ :Å« Ì ƒYɹ\Nž\úá@—¾˜ôôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQàg°?Pÿàÿ¬`€ŸËÕ“+ è±"gendstream endobj 1063 0 obj << /Length 368 /Filter /FlateDecode >> stream xÚÔMJÄ0à„,YL/0ØœÀ¶ƒè ÆìBЕ q¥.…Qܵ7ð^¥7±G˜å,¤1_R¦ŸŒ¡-ORZxßþyqœŸÊ\žè}q&‹¼…x‹™^ÈíÜœzx«Jd·r1Ù¥YYu%ß^ߟD¶º>—z¾–w…ÌïEµ–ÄŒ„Äñ—ÓwÙvݶÚ4U»èoÜìë'ú7Oúhp> stream xÚµ“±n„0 †ƒNòÂ#'( µ¦H׫T†JíÔ¡êÔëØ¡U;ãñ(<#"/ľʨÛE"|NœÈþ×7W×¥Îu…_¥ëJ ø„²vvŽ&n¼}À¾ìY—5d÷n²æAý¼C¶¼ÕdýRèüšƒ¶§1*¥> stream xÚÕ”½NÃ0Ç/òÉyÔø  m¥ K¥Hd@*bFHÝ’Gó£ä2vˆjîü•Eb&Cô‹íÜÿö×ËË«¥ÈÅR\”b‹"ÏÅkÁ?øªÄQú.íÜË;ßV<{«’gw4γê^|}~¿ñl»¿Ïvâ©ù3¯vèѾQ¢5@d°ÖºµÈ´ÖG`ÊÌ·ìdQö¸bB\‰"dºÁW› Æ'œ‰º1é)àP’l$bÝ.µ¯DƦ9†hbY´±p‚ôÖ>bP:Ä`VE•S˜`ªœØåt¡³€ÖÆèÜL©t„Ç9”3)ï|Šõ bvóØÔÿ GÖÿNs@9ƒÑdSLç±8:›pÜ ¥1¸ eÃPQJn„gCÊ‹Áû9„RÞ@(ðƒo!ƒÞD¾E¢¼œiM«aZÓj$MØŸÔ|›h×f•‰ÖÛöj¨cÕ[ÔèÒæBíï’¥KÁï^~ïñiÂéûü¶âü+8éjendstream endobj 1066 0 obj << /Length 367 /Filter /FlateDecode >> stream xÚÕ”½N…0ÇKHºðœPÚ“{™H®×DŒÓÕÑA£3<Â#02*==-í$¬BÒþh9=ý·RÜ\ö `W;( …€7É?y!@¿RìÌÜùƒ+ž?C!x~¯Çy^=À÷×Ï;Ï· y~‚ â•W'`ó©ŽÙ§TÊb¤”›H+â¬gñD\·Œ©†~×æÆ ç&푱ÃÙTOGƸluk¢ÕÍÒªe–þD+ò€Þ“ v§3Í(“Uk²U”1rã2÷W¡9²%˜}øìVíW`æd$N‡€SÇ£þ¤JŽ,s<­rÙÇj× 7wn77±Z¸ý/¼ºö ÔsøCí¼ºwn¯§pß=Nœf†UŽÞú€#§ÏîB·VÏm¨í@ÿ½]"êy2%I2+\òÏ Íè0×& Ò?Ë™g…ÞÈ3vÑ¿+‚ÓçŸ,¿òþ]äßQîîâwâ¿Aýendstream endobj 1067 0 obj << /Length 313 /Filter /FlateDecode >> stream xÚÅÔ±NÃ0Ы×ÎÒ×@êÊÁ0·Ì=ÌãS,,D¿ uÇê‡Í+u|mÇêŠï‹ÛOö³ëîDîOæE;Y—ðЊÙDê3i S%wÎû3cH˜€ ;›<$érò”¯Ùét ?F7êðºÂ{ü‡ñ,\endstream endobj 1068 0 obj << /Length 374 /Filter /FlateDecode >> stream xÚ…Ò;NÄ0à?JÉ`_’ ´@e‰‡ÄHPQ * ¤AKr´ÅGp™ÂÊ0ö˜ˆ] ¡-¾ÕÄžñØsr|xzf;{bŽìæÔö]gŸ{õ¦6M¿¾;’oO¯ê|«Ú{»éT{âªÝÞØ÷ÏÕžß^Ø^µ—ö¡·Ý£Ú^Z ! à( *¢˜lˆÐ4±ÎC #ê™]xKt¨"ûå8ÆšM`5ïôÈ©õ$šdÍŽH5à’`!Ùaõ+ëV—ÍêUúË\·Y¦==¤R(ÎÅ(š¥( ¸UÙÐP,RÎTå|²’J`(Ãúœ@>ðZÊÂuÁT2äŽ(üNÍ©YS9Ô°åpcY Vr6®±çÚõžÆËDýÍjøÇyW/jwÊ{NÒ‘ùq”ŽÜ(8È +Z°ä„KJT͈i°xHc@0§5sóL‡Š<'Bz ùtÿ!Yçg˜ÊÓ««­ºSßÔŽæ;endstream endobj 1069 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ³4×36W0P0bK#K …C®B. 3 ßÄI$çr9yré‡+X˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìÿÃÀ"˜ ì`üÁþó ó”)ÿÁþ”Éÿ¡¾ÊdÿQÏe2ÿ¨ƒ1ÔÀ˜ 8˜pfAfœiA&óœióΔ¡œÉg2Œ2G™Ëe^L¦ýÿ0• @ “ËÕ“+ »Ïöendstream endobj 1070 0 obj << /Length 374 /Filter /FlateDecode >> stream xÚÓ1KÃ@Àñ 7´_ Øûš¤CI P¨Ì èÔAœÔQ¨¢s#~±lý·¹IÆ !ÏÜ»{w5‰Ö Ç—„ð?.qŸEs‰™8‰4i"bþÌS5ŒD™[÷O|•ñp#Ò9/Õœ‡Ù•x}y{äáêú\Ä<\‹ÛXDw<[ ¨™ºvÿ1ÈÑc(Ù²A2¿-õ#ÌkgSrí̪öC›wYÉX@–­ÁÙ7öŠ®skÏØÏ».БÕÒy§=ê¹DŸ¨e©=AW=/Ô2ÕNе³ ÞöÜPºÇ¯›ø{Ro0åR¼¶öó¾ J7ñÞ=Œ7ÆàÑ€KgŒŸW/´1>1®1x;à†ÒM¼4†Ÿö$.ÊÕñd¬s».(ãM.Æ[·Á£A—ÎmüdÐ¥c|b];·ÁÛA7”ŽñÒíYû@¹ÊïÖ|äÃÞ[3Ø3çOçÝ×/nœéþËæØ÷<.;Çí=ó‹ŒßðoZÎ)endstream endobj 1071 0 obj << /Length 262 /Filter /FlateDecode >> stream xÚµ‘±JÄ@†ÿ%ÅÂ4yƒË¼€nnàà pž` A+ ¹J--îP¸B¸<¾Ðº%wϾ$w-ÛäÚ~Ý¿=“[ß^rEnÃb´¥vÀ äËÇ¢ ŸŠ€£ìf'ذ#̲<ÈX!ž/ô¢HaTTÀœ¢TdêjÅ0ûF>þ„zÍhDg¼'H_{Eø?LŽ415¨]ÏЧÀôÅ¡ÏDÖçši#h.°]¦aÙ”Yž\¤º«ä}Hnb!z3¤9ô±Å¦›g4M,ήZº£/»ÁzŠendstream endobj 1072 0 obj << /Length 267 /Filter /FlateDecode >> stream xÚ‘ÁJÄ0†'ô°0ûî¼€¦SX ë ö èɃxRoÉ£åQú=îaiœ™DYO¦´_˜ùû'ùãV§«–rtÒ’ë¨;£§_Ñ5$Oçrçñ×Ú;r Ú+.£®éýíãíúæ‚Z´ºg£6PÍ c™FAJ[þšY«‹ |¨Gè#È»dçÂÄBn³”eÕÌŽ±“™L¥nfù[ú"fµÂ«ÃB_ÀîÐÃ+âÂ>RŽC=Ïá âècÌÁíÁD=fA% ¨B'Ä¡ jIàHƒ„ã¼îyöþÌn“^@5j´‹¨[ìuá$P'YŒl/¼Å/ÁæŽIendstream endobj 1073 0 obj << /Length 351 /Filter /FlateDecode >> stream xÚ­‘ÍJÄ0ǧäÈ¥¼€¶‹µ‹§Âº‚=zò ‚ =øu“mÁë£ärì!4ÎLRuD¶„™ÉÌüg¦^îW¦4•Ù;(M}hêÊÜ-Ô£ªKCÿQ•\·jÕªâÒÔ¥*NÑ®Šö̼<½Þ«bu~lªX›«…)¯U»6À_‡GzahBŸ ‚Õï„—ã›t ]æ2 º‡¦G6Da)…Æh˜rûÅÌcf÷EA¿1-Û?pλëÛÕ³«÷³î I}Òˆš6Ä¥£P€gOén Àâܘ’ÝÙ'û+ít‰c¢„036u! è’¡AÒMÄ"9Ñ%ûÈ} |H³=¤X9ÑZ±H v¹÷]Ͻãm³E=L‰QVþgÎq)Ïœ¯ïRþT7éØD]àãn²¤Çó cˆ»Æ’|´M É'bÛ<Î%øªNZu¡>ÚvÔendstream endobj 1074 0 obj << /Length 219 /Filter /FlateDecode >> stream xÚ37ѳ°T0P0bsCC…C®B.33 €˜’JÎåròäÒW03ãÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(00`öÿPÆ"Œ0C=Ã~d3ê@Ìÿÿ@üÿÿCö àP³?PÁ ÿÌøÀÀÿÄ8x€ýˆq¸¤Íþ83˜qÈøe0‚w`Œ0H+Èû¸p3Œ2¨ÆÅ>ãÿ òÌÀøþÿÿÿf qƒËÕ“+ ‡ÞPendstream endobj 1075 0 obj << /Length 142 /Filter /FlateDecode >> stream xÚ36×31R0P0bcCKS…C®B.#ßÄ1’s¹œ<¹ôÃŒL¹ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  Œÿ˜ÿ30°ÿoÀŠAr 5 µTì ü@;þ£af f€áú!Žÿ``üÿè¯ÿ ȘËÕ“+ > stream xÚ36×31R0P0bc#C…C®B.#3 €˜’JÎåròäÒW02ãÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(0°70ðÿo`ø†™˜†ëG1Õñÿ ŒÿÃúÿdÌåêÉȸ§‰ôendstream endobj 1077 0 obj << /Length 207 /Filter /FlateDecode >> stream xÚíÑ¡Â0à[*–œÙ#pO@·@ ¨%0&H@! $¸ñh%Ø#L"Çu€…D´ùþ¶—KzzµÙ¢ê²™Í"\¢1’CÝÅtíõˆŒAÝ“SÔiŸÖ«Íu{СuBãˆÂ ¦ ²åà³U|0Û€ù‰Ø–ØB%/Q@Px¼·à_åQvØïʲ#€rˆO‚û ^‰Ëç7\©ëŸ‘†ýãgpÓ÷x'A~^ɼ™¹P²Ù/ÀnŠC|U¸ýendstream endobj 1078 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚ­‘±NÃ@ †}êÉK!~¸5Ç©©*ÁÔ1#æÜ£õQú3T9l× êÈÝIßɾü±‡Ûë5•TÓUEá†Âš^+üÀ:p°¤PŸ3/ï¸éÐï©è·Fßíèëóû ýæáŽ*ô-=UT>c×€Kxåiôi$Þ«Š@v”#W@Áø!ç'=rå4à8 E\)™æGCÎ †B1Š:‹6ŠÓ½bê¥:wZ¹KÿŠ??²"XÖi=Ì1w«½fùbpêYœ4?Í]óšeä[›ƒã©ÄßÙÄt~xßá#þ°´”ðendstream endobj 1079 0 obj << /Length 288 /Filter /FlateDecode >> stream xÚÕѱNÃ0Ы2Dº¥ŸûHmÚN–J‘È€SÄÔ22€`%ù4£Œýƒ*Ÿà1CÔÃg[!uBbˆòîbŸ»Éèt:£ŒFtr6¥IFÅ9­s|Âbl³ÍòðiõˆóÓ%cL¯lÓòš^ž_0ß\t—Svå‚ ÒPiˆYÇÜY0ë„Ù£Ö-$F°i nüQC$««­ö‚l±réÚ¢•ÈîWFÐ$\E‡aë×}!î~"Ú÷bÀÇ ö€?ÄqëÿÁ®·®Q®uæ{3}>t^ ãuCaÊΟ jëeG)…Am´«êÝø¢J¿IãŠe­Å[W.Üç¿¢jØ„7ý¼,ñ?n·Ùeendstream endobj 1080 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚÝÏ? ÂP ð¯,d°«ƒÐœÀ×ÚVt*øì èä ‚ Ž‚ŠÎ¯GëQzÇNÆ÷:ˆƒx‡üÈ—@ i¿—Drj*ñ æCDJb“Cíb¢qNjÍILjn¦¤òß®÷#©ñr©)oÌ™-åS†¯†/ž–ÂX¥ˆSeF·Ô•+^¡+ˆkÛª»d%ôA¢è3ðv×X}Xþ´øÅ~äÈö"õ7i–ÓŠ^¤Ds.endstream endobj 1081 0 obj << /Length 281 /Filter /FlateDecode >> stream xÚuÐ1NÄ0Ð¥ˆäÆGð\’o$"-‹D $¨(PR€ [mr®â›#¸Lv˜q v š'Ù3þ3Éêì´n¨"O'5ùsj<=׿Íx/—5«¥òôjÖ)ïÉ{S^˵)»úxÿ|1åúö’jSn衦êÑt8ä€å©zÞ[dŒö yDñbDΰƒtÁ‰=Z¨b‹è°M΢ýÇûyqPû¡©“Újë•e^Œ5X*³>ìYëŽYžÌ:#•õB´IjÆ!¥MlGÕ-ƨéÉâH]$?r>Pçäcš6òŸA§Ù ÓìÖ~¢þ¥I"v˜¶ÈfD7¸ˆ(Ÿ0æºl@/]æª3wæׄŒœendstream endobj 1082 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚ35Ò31T0P0RÐ5T01U°°PH1ä*ä21 (XXBd’s¹œ<¹ôÃLŒ¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. Ñ@ƒb¹<] @€ò>’ƒdF"Ù‘H~$RLÚƒÉz0ùD2ƒIþÿ@ÀðƒD1aˆ’Œ¨L²ÿ``n@'Ù˜ÿ0°3€H~`¼ücà1ƒ(¸l@Aÿà(ÀáÍþÿ8¸\=¹¹~@‡Øendstream endobj 1083 0 obj << /Length 357 /Filter /FlateDecode >> stream xÚÒÁJÃ0ð¯ôPÈay±æ´k‡Û ƒÂœ`‚ž<ˆ'õ(LQ˜§æÑò(}„{(ÿ4 HÙÁCø~|!!ÿ$åærµKQˆ‹\”Wb]ˆ×œ}°²@s)Ö+7óòÎö5ËEY°ìm–Õwâëóûeûûk‘³ì žr±|fõAcdeŒ"côMd:¢Ê *¢¦%â½s'˜kàŽõcTsk¿Žkç4XNŒÊ±w"]/µ¦‰QSœ…“;GϼË`Ôr ZÀ1üϽÁ¨GäÛÁ¬á­wÛxkI'˜ EÖGoUKX‘¶ndlÝzË4XÁm4ºR‰µòÆy·°ŽG§-·–Î3J‚5Ü%£¹^X“óœâàîùè¤ÛÁ3ï-EÁ=<,FÇý ž{#Rð›Ýèh°?bë·±îFÓhím_üŒÿܹןº²VÞ6ЧÖÒÙÆH¦f75{`¿ŸõÒiendstream endobj 1084 0 obj << /Length 257 /Filter /FlateDecode >> stream xÚÕ’±ŠÂ@†G,Óø™ÐM$æ° D…K!he!Vzå'ÚºûhyÁ2…$7³î ,]Øý†™açÿÓ¯AB¥ÔRÓ8¡]Œ8’dDãôVÙþb^ ZÑ(AõÍiTÅœûãª|1¡Õ”Ö1E,¦Ðm@NØœº©øíԚѭ@3zgKËdœ¿€¸ 'nf\A®Dœq.îv,L SBÓ³(Û!<¢ÌâòÚ¢Ò†¼Æâú™xù?·^mÐïÚ ð€¶8^¿¼¶¢´¾ë..¨½$’Œ3Jf¬œ‰œ¥6˜¹ÛÍ™Ï[Ñg.ñwÓÄendstream endobj 1085 0 obj << /Length 380 /Filter /FlateDecode >> stream xÚ’¿NÃ0ÆÏò`ÉK!~HƒÚ N‘J‘È€bF¬M-’GðèÁÄÜw.*$D駞Ͼᄏæôxé®qG'®©ÝzéjûlW.ܺÉ'÷OvÓÙêÆ­–¶ºà°­ºK÷úòöh«ÍÕ™«mµu·µ[ÜÙnëˆt"üÊä”"!–5Q¥‘&|ÔdÑŽ9‡?5“â1p·'ÍYœf€r0#0@ñ…˜JÀüñS¾'KŸ ß(‡b΀ò–L ɤ ’5º‹¤¸;–¬ÒLÚ£Y‚Ö>‰º6MÜ"v(™Þ÷Nì}N~˜U¤ÿÍù •UTã[¤²Tä°ðµåçfñ‹SUÄ•AT §H#ä°dÈQ)÷ž¼Ò{ˆ£6´R2ô"@¤òX:î!rTŒ¿Aÿ\§ü¦ú„ÔS^ªë¬EŽj,òp ŸÇdØïŠtÌS‘Ž'BZIÌÊë¦òò±â®,¦=ïìµýÖYÙáendstream endobj 284 0 obj << /Type /Font /Subtype /Type3 /Name /F18 /FontMatrix [0.00697 0 0 0.00697 0 0] /FontBBox [ 2 -30 99 101 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 46 /LastChar 119 /Widths 1086 0 R /Encoding 1087 0 R /CharProcs 1088 0 R >> endobj 1086 0 obj [37.42 0 67.4 0 0 0 0 0 0 0 67.4 0 0 0 0 0 0 0 0 101.06 95.47 97.37 0 0 0 0 0 0 0 0 0 0 0 104.87 0 0 99.22 74.89 97.37 0 101.06 0 0 0 0 0 0 0 0 0 0 0 0 59.91 0 59.91 0 67.4 74.89 37.42 0 0 37.42 0 74.89 67.4 74.89 0 52.41 53.16 52.41 0 0 97.37 ] endobj 1087 0 obj << /Type /Encoding /Differences [46/a46 47/.notdef 48/a48 49/.notdef 56/a56 57/.notdef 65/a65/a66/a67 68/.notdef 79/a79 80/.notdef 82/a82/a83/a84 85/.notdef 86/a86 87/.notdef 99/a99 100/.notdef 101/a101 102/.notdef 103/a103/a104/a105 106/.notdef 108/a108 109/.notdef 110/a110/a111/a112 113/.notdef 114/a114/a115/a116 117/.notdef 119/a119] >> endobj 1088 0 obj << /a46 1062 0 R /a48 1084 0 R /a56 1085 0 R /a65 1063 0 R /a66 1064 0 R /a67 1065 0 R /a79 1066 0 R /a82 1067 0 R /a83 1068 0 R /a84 1069 0 R /a86 1070 0 R /a99 1071 0 R /a101 1072 0 R /a103 1073 0 R /a104 1074 0 R /a105 1075 0 R /a108 1076 0 R /a110 1077 0 R /a111 1078 0 R /a112 1079 0 R /a114 1080 0 R /a115 1081 0 R /a116 1082 0 R /a119 1083 0 R >> endobj 292 0 obj << /Type /Pages /Count 6 /Parent 1089 0 R /Kids [278 0 R 294 0 R 342 0 R 373 0 R 384 0 R 391 0 R] >> endobj 401 0 obj << /Type /Pages /Count 6 /Parent 1089 0 R /Kids [397 0 R 403 0 R 407 0 R 411 0 R 415 0 R 421 0 R] >> endobj 428 0 obj << /Type /Pages /Count 6 /Parent 1089 0 R /Kids [425 0 R 430 0 R 436 0 R 441 0 R 445 0 R 449 0 R] >> endobj 457 0 obj << /Type /Pages /Count 6 /Parent 1089 0 R /Kids [453 0 R 459 0 R 463 0 R 468 0 R 472 0 R 476 0 R] >> endobj 484 0 obj << /Type /Pages /Count 6 /Parent 1089 0 R /Kids [481 0 R 486 0 R 490 0 R 494 0 R 498 0 R 502 0 R] >> endobj 1089 0 obj << /Type /Pages /Count 30 /Kids [292 0 R 401 0 R 428 0 R 457 0 R 484 0 R] >> endobj 1090 0 obj << /Type /Outlines /First 7 0 R /Last 275 0 R /Count 10 >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R /Parent 1090 0 R /Prev 271 0 R >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R /Parent 1090 0 R /Prev 235 0 R /Next 275 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R /Parent 235 0 R /Prev 263 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R /Parent 235 0 R /Prev 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R /Parent 235 0 R /Prev 255 0 R /Next 263 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R /Parent 235 0 R /Prev 251 0 R /Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R /Parent 235 0 R /Prev 247 0 R /Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R /Parent 235 0 R /Prev 243 0 R /Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R /Parent 235 0 R /Prev 239 0 R /Next 247 0 R >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R /Parent 235 0 R /Next 243 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R /Parent 1090 0 R /Prev 215 0 R /Next 271 0 R /First 239 0 R /Last 267 0 R /Count -8 >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R /Parent 215 0 R /Prev 227 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R /Parent 215 0 R /Prev 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R /Parent 215 0 R /Prev 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R /Parent 215 0 R /Next 223 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R /Parent 1090 0 R /Prev 195 0 R /Next 235 0 R /First 219 0 R /Last 231 0 R /Count -4 >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R /Parent 195 0 R /Prev 207 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R /Parent 195 0 R /Prev 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R /Parent 195 0 R /Prev 199 0 R /Next 207 0 R >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R /Parent 195 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R /Parent 1090 0 R /Prev 171 0 R /Next 215 0 R /First 199 0 R /Last 211 0 R /Count -4 >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R /Parent 179 0 R /Prev 187 0 R >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R /Parent 179 0 R /Prev 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R /Parent 179 0 R /Next 187 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R /Parent 171 0 R /Prev 175 0 R /First 183 0 R /Last 191 0 R /Count -3 >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 171 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R /Parent 1090 0 R /Prev 143 0 R /Next 195 0 R /First 175 0 R /Last 179 0 R /Count -2 >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R /Parent 143 0 R /Prev 163 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 143 0 R /Prev 159 0 R /Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R /Parent 143 0 R /Prev 155 0 R /Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R /Parent 143 0 R /Prev 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R /Parent 143 0 R /Prev 147 0 R /Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R /Parent 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R /Parent 1090 0 R /Prev 99 0 R /Next 171 0 R /First 147 0 R /Last 167 0 R /Count -6 >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 99 0 R /Prev 119 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 119 0 R /Prev 131 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 119 0 R /Prev 127 0 R /Next 135 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 119 0 R /Prev 123 0 R /Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 119 0 R /Next 127 0 R >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 99 0 R /Prev 103 0 R /Next 139 0 R /First 123 0 R /Last 135 0 R /Count -4 >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 103 0 R /Prev 111 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 103 0 R /Prev 107 0 R /Next 115 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 99 0 R /Next 119 0 R /First 107 0 R /Last 115 0 R /Count -3 >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 1090 0 R /Prev 31 0 R /Next 143 0 R /First 103 0 R /Last 139 0 R /Count -3 >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 83 0 R /Prev 91 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 83 0 R /Prev 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 31 0 R /Prev 63 0 R /First 87 0 R /Last 95 0 R /Count -3 >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 63 0 R /Prev 75 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 63 0 R /Prev 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 63 0 R /Prev 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 31 0 R /Prev 47 0 R /Next 83 0 R /First 67 0 R /Last 79 0 R /Count -4 >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 47 0 R /Prev 55 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 47 0 R /Prev 51 0 R /Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 31 0 R /Prev 35 0 R /Next 63 0 R /First 51 0 R /Last 59 0 R /Count -3 >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 35 0 R /Prev 39 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R /Next 47 0 R /First 39 0 R /Last 43 0 R /Count -2 >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 1090 0 R /Prev 7 0 R /Next 99 0 R /First 35 0 R /Last 83 0 R /Count -4 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 7 0 R /Prev 23 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 7 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 7 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 1090 0 R /Next 31 0 R /First 11 0 R /Last 27 0 R /Count -5 >> endobj 1091 0 obj << /Names [(Doc-Start) 283 0 R (Item.1) 433 0 R (Item.2) 434 0 R (Item.3) 439 0 R (page.1) 282 0 R (page.10) 413 0 R (page.11) 417 0 R (page.12) 423 0 R (page.13) 427 0 R (page.14) 432 0 R (page.15) 438 0 R (page.16) 443 0 R (page.17) 447 0 R (page.18) 451 0 R (page.19) 455 0 R (page.2) 296 0 R (page.20) 461 0 R (page.21) 465 0 R (page.22) 470 0 R (page.23) 474 0 R (page.24) 478 0 R (page.25) 483 0 R (page.26) 488 0 R (page.27) 492 0 R (page.28) 496 0 R (page.29) 500 0 R (page.3) 344 0 R (page.30) 504 0 R (page.4) 375 0 R (page.5) 386 0 R (page.6) 393 0 R (page.7) 399 0 R (page.8) 405 0 R (page.9) 409 0 R (section*.1) 298 0 R (section.1) 6 0 R (section.10) 274 0 R (section.2) 30 0 R (section.3) 98 0 R (section.4) 142 0 R (section.5) 170 0 R (section.6) 194 0 R (section.7) 214 0 R (section.8) 234 0 R (section.9) 270 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.1.3) 18 0 R (subsection.1.4) 22 0 R (subsection.1.5) 26 0 R (subsection.2.1) 34 0 R (subsection.2.2) 46 0 R (subsection.2.3) 62 0 R (subsection.2.4) 82 0 R (subsection.3.1) 102 0 R (subsection.3.2) 118 0 R (subsection.3.3) 138 0 R (subsection.4.1) 146 0 R (subsection.4.2) 150 0 R (subsection.4.3) 154 0 R (subsection.4.4) 158 0 R (subsection.4.5) 162 0 R (subsection.4.6) 166 0 R (subsection.5.1) 174 0 R (subsection.5.2) 178 0 R (subsection.6.1) 198 0 R (subsection.6.2) 202 0 R (subsection.6.3) 206 0 R (subsection.6.4) 210 0 R (subsection.7.1) 218 0 R (subsection.7.2) 222 0 R (subsection.7.3) 226 0 R (subsection.7.4) 230 0 R (subsection.8.1) 238 0 R (subsection.8.2) 242 0 R (subsection.8.3) 246 0 R (subsection.8.4) 250 0 R (subsection.8.5) 254 0 R (subsection.8.6) 258 0 R (subsection.8.7) 262 0 R (subsection.8.8) 266 0 R (subsubsection.2.1.1) 38 0 R (subsubsection.2.1.2) 42 0 R (subsubsection.2.2.1) 50 0 R (subsubsection.2.2.2) 54 0 R (subsubsection.2.2.3) 58 0 R (subsubsection.2.3.1) 66 0 R (subsubsection.2.3.2) 70 0 R (subsubsection.2.3.3) 74 0 R (subsubsection.2.3.4) 78 0 R (subsubsection.2.4.1) 86 0 R (subsubsection.2.4.2) 90 0 R (subsubsection.2.4.3) 94 0 R (subsubsection.3.1.1) 106 0 R (subsubsection.3.1.2) 110 0 R (subsubsection.3.1.3) 114 0 R (subsubsection.3.2.1) 122 0 R (subsubsection.3.2.2) 126 0 R (subsubsection.3.2.3) 130 0 R (subsubsection.3.2.4) 134 0 R (subsubsection.5.2.1) 182 0 R (subsubsection.5.2.2) 186 0 R (subsubsection.5.2.3) 190 0 R] /Limits [(Doc-Start) (subsubsection.5.2.3)] >> endobj 1092 0 obj << /Kids [1091 0 R] >> endobj 1093 0 obj << /Dests 1092 0 R >> endobj 1094 0 obj << /Type /Catalog /Pages 1089 0 R /Outlines 1090 0 R /Names 1093 0 R /PageMode /UseOutlines /OpenAction 277 0 R >> endobj 1095 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() /CreationDate (D:20081129144835-05'00') /PTEX.Fullbanner (This is pdfTeX, Version 3.141592-1.20b (MiKTeX 2.4.1986)) >> endobj xref 0 1096 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n 0000028970 00000 n 0000287344 00000 n 0000000054 00000 n 0000000086 00000 n 0000029025 00000 n 0000287272 00000 n 0000000136 00000 n 0000000178 00000 n 0000029081 00000 n 0000287186 00000 n 0000000229 00000 n 0000000263 00000 n 0000032139 00000 n 0000287100 00000 n 0000000314 00000 n 0000000345 00000 n 0000032194 00000 n 0000287014 00000 n 0000000396 00000 n 0000000427 00000 n 0000035765 00000 n 0000286941 00000 n 0000000478 00000 n 0000000521 00000 n 0000035821 00000 n 0000286816 00000 n 0000000567 00000 n 0000000602 00000 n 0000035877 00000 n 0000286705 00000 n 0000000653 00000 n 0000000704 00000 n 0000035933 00000 n 0000286631 00000 n 0000000760 00000 n 0000000796 00000 n 0000042771 00000 n 0000286557 00000 n 0000000852 00000 n 0000000891 00000 n 0000042827 00000 n 0000286433 00000 n 0000000942 00000 n 0000000983 00000 n 0000042883 00000 n 0000286359 00000 n 0000001039 00000 n 0000001103 00000 n 0000045571 00000 n 0000286272 00000 n 0000001159 00000 n 0000001218 00000 n 0000045627 00000 n 0000286198 00000 n 0000001274 00000 n 0000001338 00000 n 0000045683 00000 n 0000286074 00000 n 0000001389 00000 n 0000001439 00000 n 0000045739 00000 n 0000286000 00000 n 0000001495 00000 n 0000001549 00000 n 0000045795 00000 n 0000285913 00000 n 0000001605 00000 n 0000001659 00000 n 0000048154 00000 n 0000285826 00000 n 0000001715 00000 n 0000001754 00000 n 0000048210 00000 n 0000285752 00000 n 0000001810 00000 n 0000001851 00000 n 0000048266 00000 n 0000285641 00000 n 0000001902 00000 n 0000001956 00000 n 0000048322 00000 n 0000285567 00000 n 0000002012 00000 n 0000002049 00000 n 0000048378 00000 n 0000285480 00000 n 0000002105 00000 n 0000002141 00000 n 0000051609 00000 n 0000285406 00000 n 0000002197 00000 n 0000002232 00000 n 0000051665 00000 n 0000285276 00000 n 0000002278 00000 n 0000002321 00000 n 0000051721 00000 n 0000285159 00000 n 0000002373 00000 n 0000002408 00000 n 0000051777 00000 n 0000285080 00000 n 0000002465 00000 n 0000002524 00000 n 0000051834 00000 n 0000284987 00000 n 0000002581 00000 n 0000002620 00000 n 0000054995 00000 n 0000284908 00000 n 0000002677 00000 n 0000002722 00000 n 0000055052 00000 n 0000284777 00000 n 0000002774 00000 n 0000002822 00000 n 0000055109 00000 n 0000284698 00000 n 0000002879 00000 n 0000002953 00000 n 0000058231 00000 n 0000284605 00000 n 0000003010 00000 n 0000003050 00000 n 0000058288 00000 n 0000284512 00000 n 0000003107 00000 n 0000003152 00000 n 0000058345 00000 n 0000284433 00000 n 0000003209 00000 n 0000003240 00000 n 0000061811 00000 n 0000284355 00000 n 0000003292 00000 n 0000003335 00000 n 0000061868 00000 n 0000284223 00000 n 0000003382 00000 n 0000003425 00000 n 0000061925 00000 n 0000284144 00000 n 0000003477 00000 n 0000003522 00000 n 0000063798 00000 n 0000284051 00000 n 0000003574 00000 n 0000003620 00000 n 0000066547 00000 n 0000283958 00000 n 0000003672 00000 n 0000003716 00000 n 0000066604 00000 n 0000283865 00000 n 0000003768 00000 n 0000003820 00000 n 0000066661 00000 n 0000283772 00000 n 0000003872 00000 n 0000003924 00000 n 0000069286 00000 n 0000283693 00000 n 0000003976 00000 n 0000004011 00000 n 0000069343 00000 n 0000283560 00000 n 0000004058 00000 n 0000004102 00000 n 0000069400 00000 n 0000283481 00000 n 0000004154 00000 n 0000004199 00000 n 0000078775 00000 n 0000283363 00000 n 0000004251 00000 n 0000004285 00000 n 0000078832 00000 n 0000283284 00000 n 0000004342 00000 n 0000004380 00000 n 0000078889 00000 n 0000283191 00000 n 0000004437 00000 n 0000004473 00000 n 0000082003 00000 n 0000283112 00000 n 0000004530 00000 n 0000004573 00000 n 0000082060 00000 n 0000282979 00000 n 0000004620 00000 n 0000004665 00000 n 0000082117 00000 n 0000282900 00000 n 0000004717 00000 n 0000004753 00000 n 0000085291 00000 n 0000282807 00000 n 0000004805 00000 n 0000004834 00000 n 0000085348 00000 n 0000282714 00000 n 0000004886 00000 n 0000004927 00000 n 0000087686 00000 n 0000282635 00000 n 0000004979 00000 n 0000005018 00000 n 0000087743 00000 n 0000282502 00000 n 0000005065 00000 n 0000005103 00000 n 0000087800 00000 n 0000282423 00000 n 0000005155 00000 n 0000005191 00000 n 0000087857 00000 n 0000282330 00000 n 0000005243 00000 n 0000005277 00000 n 0000090426 00000 n 0000282237 00000 n 0000005329 00000 n 0000005363 00000 n 0000095060 00000 n 0000282158 00000 n 0000005415 00000 n 0000005458 00000 n 0000095117 00000 n 0000282025 00000 n 0000005505 00000 n 0000005549 00000 n 0000095174 00000 n 0000281946 00000 n 0000005601 00000 n 0000005667 00000 n 0000098414 00000 n 0000281853 00000 n 0000005719 00000 n 0000005767 00000 n 0000098471 00000 n 0000281760 00000 n 0000005819 00000 n 0000005868 00000 n 0000098527 00000 n 0000281667 00000 n 0000005920 00000 n 0000005962 00000 n 0000101698 00000 n 0000281574 00000 n 0000006014 00000 n 0000006059 00000 n 0000101755 00000 n 0000281481 00000 n 0000006111 00000 n 0000006167 00000 n 0000101812 00000 n 0000281388 00000 n 0000006219 00000 n 0000006253 00000 n 0000101869 00000 n 0000281309 00000 n 0000006305 00000 n 0000006343 00000 n 0000105652 00000 n 0000281215 00000 n 0000006390 00000 n 0000006417 00000 n 0000105709 00000 n 0000281135 00000 n 0000006465 00000 n 0000006495 00000 n 0000008023 00000 n 0000008162 00000 n 0000011828 00000 n 0000006547 00000 n 0000011714 00000 n 0000011771 00000 n 0000279123 00000 n 0000269473 00000 n 0000263006 00000 n 0000259559 00000 n 0000248302 00000 n 0000011541 00000 n 0000246260 00000 n 0000239774 00000 n 0000280373 00000 n 0000020396 00000 n 0000013352 00000 n 0000012014 00000 n 0000020282 00000 n 0000215767 00000 n 0000020339 00000 n 0000013811 00000 n 0000199205 00000 n 0000013962 00000 n 0000014118 00000 n 0000014273 00000 n 0000014429 00000 n 0000014584 00000 n 0000014740 00000 n 0000014890 00000 n 0000015046 00000 n 0000015207 00000 n 0000015369 00000 n 0000015524 00000 n 0000015686 00000 n 0000015848 00000 n 0000016010 00000 n 0000016165 00000 n 0000016326 00000 n 0000016487 00000 n 0000016648 00000 n 0000016810 00000 n 0000016965 00000 n 0000017127 00000 n 0000017289 00000 n 0000017451 00000 n 0000017601 00000 n 0000017757 00000 n 0000017919 00000 n 0000018081 00000 n 0000018243 00000 n 0000018399 00000 n 0000018561 00000 n 0000018723 00000 n 0000018885 00000 n 0000019047 00000 n 0000019202 00000 n 0000019353 00000 n 0000019507 00000 n 0000019663 00000 n 0000019818 00000 n 0000019974 00000 n 0000020129 00000 n 0000026093 00000 n 0000021496 00000 n 0000020494 00000 n 0000026036 00000 n 0000021843 00000 n 0000021994 00000 n 0000022150 00000 n 0000022305 00000 n 0000022467 00000 n 0000022629 00000 n 0000022791 00000 n 0000022941 00000 n 0000023097 00000 n 0000023253 00000 n 0000023406 00000 n 0000023562 00000 n 0000023713 00000 n 0000023869 00000 n 0000024025 00000 n 0000024180 00000 n 0000024336 00000 n 0000024486 00000 n 0000024642 00000 n 0000024798 00000 n 0000024953 00000 n 0000025109 00000 n 0000025265 00000 n 0000025421 00000 n 0000025577 00000 n 0000025733 00000 n 0000025884 00000 n 0000029137 00000 n 0000028454 00000 n 0000026178 00000 n 0000028913 00000 n 0000179838 00000 n 0000162942 00000 n 0000161552 00000 n 0000162781 00000 n 0000159088 00000 n 0000028601 00000 n 0000028752 00000 n 0000032249 00000 n 0000031791 00000 n 0000029261 00000 n 0000032082 00000 n 0000137785 00000 n 0000128632 00000 n 0000031930 00000 n 0000035989 00000 n 0000035257 00000 n 0000032399 00000 n 0000035708 00000 n 0000035404 00000 n 0000035556 00000 n 0000039712 00000 n 0000039536 00000 n 0000036152 00000 n 0000039655 00000 n 0000117090 00000 n 0000280491 00000 n 0000042939 00000 n 0000042595 00000 n 0000039836 00000 n 0000042714 00000 n 0000045851 00000 n 0000045395 00000 n 0000043089 00000 n 0000045514 00000 n 0000048434 00000 n 0000047978 00000 n 0000046001 00000 n 0000048097 00000 n 0000051891 00000 n 0000051096 00000 n 0000048584 00000 n 0000051552 00000 n 0000051243 00000 n 0000051400 00000 n 0000055166 00000 n 0000054819 00000 n 0000052041 00000 n 0000054938 00000 n 0000058401 00000 n 0000058055 00000 n 0000055316 00000 n 0000058174 00000 n 0000280609 00000 n 0000062095 00000 n 0000061635 00000 n 0000058538 00000 n 0000061754 00000 n 0000061982 00000 n 0000062038 00000 n 0000063855 00000 n 0000063565 00000 n 0000062232 00000 n 0000063684 00000 n 0000063741 00000 n 0000066718 00000 n 0000066371 00000 n 0000063953 00000 n 0000066490 00000 n 0000069457 00000 n 0000069110 00000 n 0000066855 00000 n 0000069229 00000 n 0000072830 00000 n 0000072654 00000 n 0000069581 00000 n 0000072773 00000 n 0000076337 00000 n 0000075980 00000 n 0000072941 00000 n 0000076280 00000 n 0000076119 00000 n 0000280727 00000 n 0000078946 00000 n 0000078599 00000 n 0000076435 00000 n 0000078718 00000 n 0000082174 00000 n 0000081827 00000 n 0000079083 00000 n 0000081946 00000 n 0000108370 00000 n 0000085405 00000 n 0000085115 00000 n 0000082337 00000 n 0000085234 00000 n 0000087914 00000 n 0000087510 00000 n 0000085581 00000 n 0000087629 00000 n 0000090483 00000 n 0000090074 00000 n 0000088051 00000 n 0000090369 00000 n 0000090213 00000 n 0000092607 00000 n 0000092431 00000 n 0000090594 00000 n 0000092550 00000 n 0000280845 00000 n 0000095231 00000 n 0000094884 00000 n 0000092692 00000 n 0000095003 00000 n 0000098584 00000 n 0000098238 00000 n 0000095368 00000 n 0000098357 00000 n 0000101926 00000 n 0000101522 00000 n 0000098695 00000 n 0000101641 00000 n 0000105766 00000 n 0000105476 00000 n 0000102037 00000 n 0000105595 00000 n 0000107215 00000 n 0000107039 00000 n 0000105877 00000 n 0000107158 00000 n 0000107300 00000 n 0000107620 00000 n 0000107904 00000 n 0000108089 00000 n 0000108619 00000 n 0000108725 00000 n 0000108846 00000 n 0000108923 00000 n 0000109107 00000 n 0000109476 00000 n 0000109830 00000 n 0000110118 00000 n 0000110420 00000 n 0000110703 00000 n 0000111023 00000 n 0000111311 00000 n 0000111628 00000 n 0000111943 00000 n 0000112230 00000 n 0000112547 00000 n 0000112798 00000 n 0000113158 00000 n 0000113473 00000 n 0000113756 00000 n 0000114079 00000 n 0000114347 00000 n 0000114620 00000 n 0000114891 00000 n 0000115200 00000 n 0000115491 00000 n 0000115831 00000 n 0000116170 00000 n 0000116460 00000 n 0000116716 00000 n 0000117341 00000 n 0000117617 00000 n 0000117921 00000 n 0000118314 00000 n 0000118511 00000 n 0000118687 00000 n 0000119012 00000 n 0000119247 00000 n 0000119609 00000 n 0000119980 00000 n 0000120326 00000 n 0000120667 00000 n 0000120959 00000 n 0000121252 00000 n 0000121518 00000 n 0000121835 00000 n 0000122108 00000 n 0000122404 00000 n 0000122720 00000 n 0000123029 00000 n 0000123296 00000 n 0000123591 00000 n 0000123919 00000 n 0000124171 00000 n 0000124517 00000 n 0000124822 00000 n 0000125092 00000 n 0000125410 00000 n 0000125672 00000 n 0000125952 00000 n 0000126210 00000 n 0000126506 00000 n 0000126791 00000 n 0000127109 00000 n 0000127405 00000 n 0000127728 00000 n 0000128019 00000 n 0000128275 00000 n 0000128883 00000 n 0000129192 00000 n 0000129539 00000 n 0000130039 00000 n 0000130219 00000 n 0000130431 00000 n 0000130613 00000 n 0000130859 00000 n 0000131149 00000 n 0000131460 00000 n 0000131748 00000 n 0000132031 00000 n 0000132291 00000 n 0000132600 00000 n 0000132869 00000 n 0000133167 00000 n 0000133482 00000 n 0000133753 00000 n 0000134051 00000 n 0000134372 00000 n 0000134625 00000 n 0000134921 00000 n 0000135207 00000 n 0000135474 00000 n 0000135789 00000 n 0000136054 00000 n 0000136333 00000 n 0000136595 00000 n 0000136881 00000 n 0000137165 00000 n 0000137458 00000 n 0000138035 00000 n 0000138321 00000 n 0000138627 00000 n 0000139033 00000 n 0000139305 00000 n 0000139572 00000 n 0000139819 00000 n 0000140061 00000 n 0000140255 00000 n 0000140451 00000 n 0000140706 00000 n 0000140957 00000 n 0000141141 00000 n 0000141369 00000 n 0000141585 00000 n 0000141764 00000 n 0000142001 00000 n 0000142188 00000 n 0000142423 00000 n 0000142613 00000 n 0000142870 00000 n 0000143053 00000 n 0000143312 00000 n 0000143509 00000 n 0000143757 00000 n 0000144088 00000 n 0000144415 00000 n 0000144686 00000 n 0000144950 00000 n 0000145220 00000 n 0000145518 00000 n 0000145781 00000 n 0000146008 00000 n 0000146233 00000 n 0000146540 00000 n 0000146740 00000 n 0000146928 00000 n 0000147226 00000 n 0000147429 00000 n 0000147686 00000 n 0000147960 00000 n 0000148210 00000 n 0000148464 00000 n 0000148753 00000 n 0000149030 00000 n 0000149346 00000 n 0000149550 00000 n 0000149797 00000 n 0000150066 00000 n 0000150343 00000 n 0000150649 00000 n 0000150920 00000 n 0000151187 00000 n 0000151449 00000 n 0000151722 00000 n 0000152003 00000 n 0000152237 00000 n 0000152570 00000 n 0000152811 00000 n 0000153023 00000 n 0000153272 00000 n 0000153550 00000 n 0000153745 00000 n 0000153996 00000 n 0000154231 00000 n 0000154494 00000 n 0000154774 00000 n 0000155065 00000 n 0000155303 00000 n 0000155568 00000 n 0000155803 00000 n 0000156031 00000 n 0000156297 00000 n 0000156551 00000 n 0000156833 00000 n 0000157150 00000 n 0000157433 00000 n 0000157654 00000 n 0000157956 00000 n 0000158217 00000 n 0000158504 00000 n 0000158825 00000 n 0000159339 00000 n 0000159895 00000 n 0000160478 00000 n 0000163175 00000 n 0000163151 00000 n 0000163262 00000 n 0000163447 00000 n 0000163623 00000 n 0000163890 00000 n 0000164353 00000 n 0000164722 00000 n 0000165037 00000 n 0000165423 00000 n 0000165732 00000 n 0000166020 00000 n 0000166273 00000 n 0000166653 00000 n 0000166837 00000 n 0000167066 00000 n 0000167424 00000 n 0000167781 00000 n 0000168147 00000 n 0000168412 00000 n 0000168847 00000 n 0000169178 00000 n 0000169563 00000 n 0000169805 00000 n 0000170093 00000 n 0000170551 00000 n 0000170863 00000 n 0000171172 00000 n 0000171466 00000 n 0000171767 00000 n 0000172073 00000 n 0000172320 00000 n 0000172681 00000 n 0000172928 00000 n 0000173139 00000 n 0000173405 00000 n 0000173705 00000 n 0000173892 00000 n 0000174181 00000 n 0000174423 00000 n 0000174716 00000 n 0000175023 00000 n 0000175264 00000 n 0000175567 00000 n 0000175820 00000 n 0000176066 00000 n 0000176362 00000 n 0000176676 00000 n 0000177023 00000 n 0000177311 00000 n 0000177517 00000 n 0000177863 00000 n 0000178201 00000 n 0000178497 00000 n 0000178830 00000 n 0000179174 00000 n 0000179468 00000 n 0000180090 00000 n 0000180521 00000 n 0000180963 00000 n 0000181722 00000 n 0000181907 00000 n 0000182091 00000 n 0000182274 00000 n 0000182456 00000 n 0000182704 00000 n 0000182895 00000 n 0000183084 00000 n 0000183260 00000 n 0000183548 00000 n 0000183798 00000 n 0000184135 00000 n 0000184423 00000 n 0000184767 00000 n 0000185043 00000 n 0000185307 00000 n 0000185649 00000 n 0000185851 00000 n 0000186032 00000 n 0000186250 00000 n 0000186582 00000 n 0000186923 00000 n 0000187252 00000 n 0000187497 00000 n 0000187810 00000 n 0000188153 00000 n 0000188385 00000 n 0000188661 00000 n 0000189014 00000 n 0000189439 00000 n 0000189718 00000 n 0000189989 00000 n 0000190253 00000 n 0000190529 00000 n 0000190800 00000 n 0000191035 00000 n 0000191379 00000 n 0000191616 00000 n 0000191819 00000 n 0000192072 00000 n 0000192350 00000 n 0000192535 00000 n 0000192803 00000 n 0000193034 00000 n 0000193290 00000 n 0000193563 00000 n 0000193843 00000 n 0000194067 00000 n 0000194334 00000 n 0000194564 00000 n 0000194793 00000 n 0000195072 00000 n 0000195387 00000 n 0000195681 00000 n 0000196006 00000 n 0000196286 00000 n 0000196554 00000 n 0000196756 00000 n 0000197068 00000 n 0000197384 00000 n 0000197652 00000 n 0000197961 00000 n 0000198276 00000 n 0000198556 00000 n 0000198888 00000 n 0000199456 00000 n 0000199921 00000 n 0000200415 00000 n 0000201306 00000 n 0000201713 00000 n 0000202060 00000 n 0000202478 00000 n 0000202816 00000 n 0000203125 00000 n 0000203328 00000 n 0000203513 00000 n 0000203750 00000 n 0000204141 00000 n 0000204546 00000 n 0000204916 00000 n 0000205342 00000 n 0000205598 00000 n 0000206137 00000 n 0000206487 00000 n 0000206810 00000 n 0000207143 00000 n 0000207467 00000 n 0000207871 00000 n 0000208138 00000 n 0000208356 00000 n 0000208679 00000 n 0000208866 00000 n 0000209178 00000 n 0000209442 00000 n 0000209753 00000 n 0000210088 00000 n 0000210337 00000 n 0000210676 00000 n 0000210942 00000 n 0000211209 00000 n 0000211541 00000 n 0000211891 00000 n 0000212281 00000 n 0000212590 00000 n 0000212807 00000 n 0000213188 00000 n 0000213573 00000 n 0000213878 00000 n 0000214243 00000 n 0000214637 00000 n 0000214956 00000 n 0000215375 00000 n 0000216018 00000 n 0000216366 00000 n 0000216793 00000 n 0000217406 00000 n 0000217675 00000 n 0000217943 00000 n 0000218127 00000 n 0000218309 00000 n 0000218566 00000 n 0000218820 00000 n 0000219003 00000 n 0000219213 00000 n 0000219398 00000 n 0000219609 00000 n 0000219784 00000 n 0000220017 00000 n 0000220199 00000 n 0000220419 00000 n 0000220661 00000 n 0000220835 00000 n 0000221080 00000 n 0000221250 00000 n 0000221452 00000 n 0000221732 00000 n 0000221984 00000 n 0000222239 00000 n 0000222473 00000 n 0000222761 00000 n 0000223171 00000 n 0000223436 00000 n 0000223752 00000 n 0000224041 00000 n 0000224381 00000 n 0000224655 00000 n 0000224916 00000 n 0000225162 00000 n 0000225496 00000 n 0000225701 00000 n 0000225887 00000 n 0000226132 00000 n 0000226352 00000 n 0000226675 00000 n 0000226998 00000 n 0000227317 00000 n 0000227564 00000 n 0000227953 00000 n 0000228254 00000 n 0000228590 00000 n 0000228820 00000 n 0000229090 00000 n 0000229410 00000 n 0000229797 00000 n 0000230108 00000 n 0000230392 00000 n 0000230670 00000 n 0000230932 00000 n 0000231210 00000 n 0000231478 00000 n 0000231699 00000 n 0000232016 00000 n 0000232251 00000 n 0000232453 00000 n 0000232683 00000 n 0000232959 00000 n 0000233147 00000 n 0000233406 00000 n 0000233633 00000 n 0000233901 00000 n 0000234177 00000 n 0000234459 00000 n 0000234679 00000 n 0000234954 00000 n 0000235185 00000 n 0000235418 00000 n 0000235681 00000 n 0000235994 00000 n 0000236284 00000 n 0000236583 00000 n 0000236846 00000 n 0000237114 00000 n 0000237315 00000 n 0000237623 00000 n 0000237938 00000 n 0000238206 00000 n 0000238512 00000 n 0000238835 00000 n 0000239112 00000 n 0000239457 00000 n 0000240025 00000 n 0000240600 00000 n 0000241220 00000 n 0000242373 00000 n 0000242550 00000 n 0000242778 00000 n 0000242965 00000 n 0000243239 00000 n 0000243500 00000 n 0000243766 00000 n 0000244037 00000 n 0000244295 00000 n 0000244525 00000 n 0000244762 00000 n 0000245002 00000 n 0000245250 00000 n 0000245525 00000 n 0000245747 00000 n 0000245995 00000 n 0000246511 00000 n 0000246745 00000 n 0000247013 00000 n 0000247254 00000 n 0000247569 00000 n 0000247848 00000 n 0000248029 00000 n 0000248551 00000 n 0000248657 00000 n 0000248778 00000 n 0000248855 00000 n 0000249038 00000 n 0000249220 00000 n 0000249428 00000 n 0000249598 00000 n 0000249772 00000 n 0000250010 00000 n 0000250250 00000 n 0000250542 00000 n 0000250817 00000 n 0000251137 00000 n 0000251319 00000 n 0000251626 00000 n 0000251873 00000 n 0000252167 00000 n 0000252487 00000 n 0000252712 00000 n 0000252980 00000 n 0000253245 00000 n 0000253500 00000 n 0000253769 00000 n 0000254030 00000 n 0000254254 00000 n 0000254570 00000 n 0000254803 00000 n 0000255000 00000 n 0000255230 00000 n 0000255501 00000 n 0000255685 00000 n 0000255937 00000 n 0000256160 00000 n 0000256419 00000 n 0000256688 00000 n 0000256960 00000 n 0000257173 00000 n 0000257441 00000 n 0000257664 00000 n 0000257889 00000 n 0000258148 00000 n 0000258442 00000 n 0000258721 00000 n 0000259015 00000 n 0000259262 00000 n 0000259813 00000 n 0000260186 00000 n 0000260578 00000 n 0000261208 00000 n 0000261524 00000 n 0000261795 00000 n 0000262053 00000 n 0000262307 00000 n 0000262526 00000 n 0000262782 00000 n 0000263257 00000 n 0000263409 00000 n 0000263528 00000 n 0000263653 00000 n 0000263870 00000 n 0000264131 00000 n 0000264471 00000 n 0000264736 00000 n 0000265046 00000 n 0000265340 00000 n 0000265631 00000 n 0000265868 00000 n 0000266116 00000 n 0000266322 00000 n 0000266623 00000 n 0000266814 00000 n 0000267098 00000 n 0000267338 00000 n 0000267628 00000 n 0000267853 00000 n 0000268136 00000 n 0000268424 00000 n 0000268764 00000 n 0000269130 00000 n 0000269726 00000 n 0000269981 00000 n 0000270311 00000 n 0000270640 00000 n 0000270817 00000 n 0000271266 00000 n 0000271647 00000 n 0000272126 00000 n 0000272574 00000 n 0000272968 00000 n 0000273423 00000 n 0000273694 00000 n 0000274149 00000 n 0000274492 00000 n 0000274840 00000 n 0000275272 00000 n 0000275572 00000 n 0000275795 00000 n 0000275999 00000 n 0000276287 00000 n 0000276617 00000 n 0000276986 00000 n 0000277252 00000 n 0000277614 00000 n 0000277886 00000 n 0000278324 00000 n 0000278662 00000 n 0000279377 00000 n 0000279641 00000 n 0000280001 00000 n 0000280963 00000 n 0000281058 00000 n 0000287454 00000 n 0000289890 00000 n 0000289931 00000 n 0000289971 00000 n 0000290105 00000 n trailer << /Size 1096 /Root 1094 0 R /Info 1095 0 R /ID [<8F922E781FE6A884A3D8ED3B4CAE5950> <8F922E781FE6A884A3D8ED3B4CAE5950>] >> startxref 290345 %%EOF combat-0.8.1/doc/Makefile0000700000175000010010000000022411114312643013230 0ustar fpNoneall: combat.pdf LYX = /cygdrive/c/Program\ Files/LyX16/bin/lyx.exe combat.pdf: combat.lyx $(LYX) -e pdf2 $^ clean: -rm -f *~ distclean: clean combat-0.8.1/LICENSE.txt0000000000175000010010000000271411615566225012662 0ustar fpNoneCombat License Terms This software is copyrighted by Frank Pilhofer and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. combat-0.8.1/Makefile0000700000175000010010000000307611114315736012501 0ustar fpNone# # This Makefile is primarily used to generate the distribution files # directly from the CVS repository. # all: chmod +x bin/idl2tcl bin/iordump chmod +x demo/*/server.tcl chmod +x demo/*/client.tcl chmod +x demo/random/random chmod +x test/*/dotest chmod +x test/*/server.tcl # # To make files for distribution from CVS: # # make VERSION=\"\" CVSTAG=\"\" # where: # is tgz or zip, or "dist" for both # is the file's version suffix # is the CVS tag or date, e.g., \"-D now\" # .SUFFIXES: .PHONY: dist tgz zip co VERSION = current CVSTAG = -D now TGZDIST = gorilla-$(VERSION).tar.gz ZIPDIST = gorilla-$(VERSION).zip dist: tgz zip tgz: $(TGZDIST) zip: $(ZIPDIST) $(TGZDIST): co (cd co ; tar cf ../combat-$(VERSION).tar combat-$(VERSION)) gzip -9 combat-$(VERSION).tar $(ZIPDIST): co (cd co/combat-$(VERSION) ; zip -r ../../combat-$(VERSION).zip *) co: rm -rf co mkdir co (cd co ; cvs export $(CVSTAG) -d combat-$(VERSION) combat) $(MAKE) -C co/combat-$(VERSION)/doc rm -rf co/combat-$(VERSION)/C++ co/combat-$(VERSION)/idl2tcl-win32 chmod +x co/combat-$(VERSION)/bin/idl2tcl co/combat-$(VERSION)/bin/iordump chmod +x co/combat-$(VERSION)/demo/*/server.tcl chmod +x co/combat-$(VERSION)/demo/*/client.tcl chmod +x co/combat-$(VERSION)/demo/random/random chmod +x co/combat-$(VERSION)/test/*/dotest chmod +x co/combat-$(VERSION)/test/*/server.tcl clean: $(MAKE) -C test clean $(MAKE) -C bin clean rm -f demo/*/server.ior find . -name '*~' -exec rm {} \; rm -rf co distclean: clean $(MAKE) -C bin distclean combat-0.8.1/orb/0000755000175000010010000000000011615566705011636 5ustar fpNonecombat-0.8.1/orb/cdr.tcl0000700000175000010010000015537611517354004013110 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: cdr.tcl,v 1.25 2011-01-24 19:50:28 fp Exp $ # # ---------------------------------------------------------------------- # procs to read and write CDR data # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval CDR { # # Simple ReadBuffer for primitive types # itcl::class ReadBuffer { private variable data private variable index private variable size private variable encaps private variable endofchunk public variable byteorder ;# 0 big-endian, 1 little-endian public variable cdecoder ;# Char Codeset Decoder public variable wdecoder ;# WChar Codeset Decoder # # byteorder can be 0 for big-endian or 1 for little-endian # constructor {_data} { set data $_data set index 0 set size [::string length $data] set encaps [list] set cdecoder "" set wdecoder "" set endofchunk -1 global tcl_platform if {$tcl_platform(byteOrder) == "bigEndian"} { set byteorder 0 } else { set byteorder 1 } } public method get_data {} { return $data } public method tell {} { return $index } public method seek {pos} { set index $pos } public method align {alignment} { if {($index % $alignment) != 0} { set increment [expr {$alignment - ($index % $alignment)}] incr index $increment } check_chunk } public method begin_encaps {} { set encaps_length [ulong] lappend encaps [list [tell] $byteorder $encaps_length] set byteorder [boolean] return $encaps_length } public method end_encaps {} { set ep [llength $encaps] if {$ep <= 0} { error "no encapsulation to end here" } incr ep -1 set edata [lindex $encaps $ep] incr ep -1 set encaps [lrange $encaps 0 $ep] set byteorder [lindex $edata 1] set index [expr {[lindex $edata 0] + [lindex $edata 2]}] } public method begin_chunk {} { set encaps_length [ulong] set endofchunk [expr {[tell] + $encaps_length}] } public method end_chunk {} { if {$endofchunk != -1} { set index $endofchunk set endofchunk -1 } } public method check_chunk {} { if {$endofchunk != -1 && $index >= $endofchunk} { end_chunk begin_chunk } } public method char {} { check_chunk if {$cdecoder != ""} { set res [$cdecoder get_char $this] } else { if {[binary scan $data @[set index]a res] != 1} { error "[$this info class]::char" } set res [encoding convertfrom iso8859-1 $res] incr index } return $res } public method chars {length} { check_chunk if {$cdecoder != ""} { set res [$cdecoder get_chars $this $length] } else { if {[binary scan $data @[set index]a[set length] res] != 1} { error "[$this info class]::chars" } set res [encoding convertfrom iso8859-1 $res] incr index $length return $res } return $res } public method wchar {} { check_chunk if {$wdecoder == ""} { error "no wchar decoder in [$this info class]::wchar" } return [$wdecoder get_wchar $this] } public method wchars {length} { check_chunk if {$wdecoder == ""} { error "no wchar decoder in [$this info class]::wchars" } return [$wdecoder get_wchars $this] } public method octet {} { check_chunk if {[binary scan $data @[set index]a res] != 1} { error "[$this info class]::octet" } incr index return $res } public method octets {length} { check_chunk if {[binary scan $data @[set index]a[set length] res] != 1} { error "[$this info class]::octets" } incr index $length return $res } public method short {} { align 2 if {$byteorder == 0} { set code [binary scan $data @[set index]S res] } else { set code [binary scan $data @[set index]s res] } if {$code != 1} { error "[$this info class]::short" } incr index 2 return $res } public method ushort {} { return [expr {([short] + 0x10000) % 0x10000}] } public method long {} { align 4 check_chunk if {$byteorder == 0} { set code [binary scan $data @[set index]I res] } else { set code [binary scan $data @[set index]i res] } if {$code != 1} { error "[$this info class]::long" } incr index 4 return $res } # # In Tcl 8.4, with its 64 bit integer support, we can use # the same trick as above (see ushort) to get an unsigned # value. Before 8.4, we just have to hope that the value # is not misinterpreted. (You might want to throw an error # if the value is negative, but then, some people insist # on sending an unsigned -1 for signaling purposes.) # public method ulong {} { set res [long] if {[info tclversion] > 8.3} { if {$res < 0} { set res [expr {4294967295 + $res}] incr res } } return $res } # # In Tcl 8.4, we can use the 64 bit support. In older versions, # we complain about off-range values. # public method longlong {} { align 8 check_chunk if {[info tclversion] > 8.3} { if {$byteorder == 0} { set code [binary scan $data @[set index]W res] } else { set code [binary scan $data @[set index]w res] } if {$code != 1} { error "[$this info class]::longlong" } } else { if {$byteorder == 0} { set high [long] set res [long] } else { set res [long] set high [long] } if {($high != 0 && $high != -1) || ($high == 0 && $res < 0) || ($high == -1 && $res > 0)} { error "[$this info class]::longlong: value out of range" } } incr index 8 return $res } public method ulonglong {} { return [longlong] } # # groan ... Tcl only handles native floating point values # public method float {} { align 4 if {$byteorder == 0} { set code [binary scan $data @[set index]cccc se1 e2f1 f2 f3] } else { set code [binary scan $data @[set index]cccc f3 f2 e2f1 se1] } if {$code != 4} { error "[$this info class]::float" } set se1 [expr {($se1 + 0x100) % 0x100}] set e2f1 [expr {($e2f1 + 0x100) % 0x100}] set f2 [expr {($f2 + 0x100) % 0x100}] set f3 [expr {($f3 + 0x100) % 0x100}] set sign [expr {$se1 >> 7}] set exponent [expr {(($se1 & 0x7f) << 1 | ($e2f1 >> 7))}] set f1 [expr {$e2f1 & 0x7f}] if {$exponent == 0} { set res 0.0 } else { set fraction [expr {double($f1)*0.0078125 + \ double($f2)*3.0517578125e-05 + \ double($f3)*1.19209289550781e-07}] set res [expr {($sign ? -1. : 1.) * \ pow(2.,double($exponent-127)) * \ (1. + $fraction)}] } incr index 4 return $res } public method double {} { align 8 if {$byteorder == 0} { set code [binary scan $data @[set index]cccccccc \ se1 e2f1 f2 f3 f4 f5 f6 f7] } else { set code [binary scan $data @[set index]cccccccc \ f7 f6 f5 f4 f3 f2 e2f1 se1] } if {$code != 8} { error "[$this info class]::double" } set se1 [expr {($se1 + 0x100) % 0x100}] set e2f1 [expr {($e2f1 + 0x100) % 0x100}] set f2 [expr {($f2 + 0x100) % 0x100}] set f3 [expr {($f3 + 0x100) % 0x100}] set f4 [expr {($f4 + 0x100) % 0x100}] set f5 [expr {($f5 + 0x100) % 0x100}] set f6 [expr {($f6 + 0x100) % 0x100}] set f7 [expr {($f7 + 0x100) % 0x100}] set sign [expr {$se1 >> 7}] set exponent [expr {(($se1 & 0x7f) << 4 | ($e2f1 >> 4))}] set f1 [expr {$e2f1 & 0x0f}] if {$exponent == 0} { set res 0.0 } else { set fraction [expr {double($f1)*0.0625 + \ double($f2)*0.000244140625 + \ double($f3)*9.5367431640625e-07 + \ double($f4)*3.7252902984619141e-09 + \ double($f5)*1.4551915228366852e-11 + \ double($f6)*5.6843418860808015e-14 + \ double($f7)*2.2204460492503131e-16}] set res [expr {($sign ? -1. : 1.) * \ pow(2.,double($exponent-1023)) * \ (1. + $fraction)}] } incr index 8 return $res } # # I don't think this is getting any more precise ... # public method longdouble {} { align 8 if {$byteorder == 0} { set code [binary scan $data @[set index]cccccccccccccccc \ se1 e2 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14] } else { set code [binary scan $data @[set index]cccccccccccccccc \ f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 e2 se1] } if {$code != 16} { error "[$this info class]::longdouble" } set se1 [expr {($se1 + 0x100) % 0x100}] set e2 [expr {($e2 + 0x100) % 0x100}] set f1 [expr {($f1 + 0x100) % 0x100}] set f2 [expr {($f2 + 0x100) % 0x100}] set f3 [expr {($f3 + 0x100) % 0x100}] set f4 [expr {($f4 + 0x100) % 0x100}] set f5 [expr {($f5 + 0x100) % 0x100}] set f6 [expr {($f6 + 0x100) % 0x100}] set f7 [expr {($f7 + 0x100) % 0x100}] set f8 [expr {($f8 + 0x100) % 0x100}] set f9 [expr {($f9 + 0x100) % 0x100}] set f10 [expr {($f10 + 0x100) % 0x100}] set f11 [expr {($f11 + 0x100) % 0x100}] set f12 [expr {($f12 + 0x100) % 0x100}] set f13 [expr {($f13 + 0x100) % 0x100}] set f14 [expr {($f14 + 0x100) % 0x100}] set sign [expr {$se1 >> 7}] set exponent [expr {(($se1 & 0x7f) << 8 | $e2)}] if {$exponent == 0} { set res 0.0 } else { set fraction [expr {double($f1)*0.00390625 + \ double($f2)*1.52587890625e-005 + \ double($f3)*5.96046447754e-008 + \ double($f4)*2.32830643654e-010 + \ double($f5)*9.09494701773e-013 + \ double($f6)*3.5527136788e-015 + \ double($f7)*1.38777878078e-017 + \ double($f8)*5.42101086243e-020 + \ double($f9)*2.11758236814e-022 + \ double($f10)*8.27180612553e-025 + \ double($f11)*3.23117426779e-027 + \ double($f12)*1.26217744835e-029 + \ double($f13)*4.93038065763e-032 + \ double($f14)*1.92592994439e-034}] set res [expr {($sign ? -1. : 1.) * \ pow(2.,double($exponent-16383)) * \ (1. + $fraction)}] } incr index 16 return $res } public method boolean {} { check_chunk if {[binary scan $data @[set index]c res] != 1} { error "[$this info class]::boolean" } if {$res != 0 && $res != 1} { error "illegal boolean value $res" } incr index return $res } public method string {} { if {$cdecoder != ""} { check_chunk set res [$cdecoder get_string $this] } else { # # backwards compatibility using iso8859-1 # # # length includes the trailing null, which we don't want # set length [ulong] set dlength [expr {$length - 1}] set code [binary scan $data @[set index]a[set dlength] res] if {$code != 1} { error "[$this info class]::string" } set res [encoding convertfrom iso8859-1 $res] incr index $length } return $res } public method wstring {} { if {$wdecoder == ""} { error "no wchar decoder in [$this info class]::wstring" } check_chunk return [$wdecoder get_wstring $this] } } # # Simple WriteBuffer for primitive types # itcl::class WriteBuffer { private variable data private variable encaps private variable chunk public variable byteorder ;# 0 big-endian, 1 little-endian public variable cencoder ;# Char Codeset Encoder public variable wencoder ;# WChar Codeset Encoder constructor {} { set data "" set encaps [list] set cencoder "" set wencoder "" global tcl_platform if {$tcl_platform(byteOrder) == "bigEndian"} { set byteorder 0 } else { set byteorder 1 } } public method get_data {} { return $data } public method tell {} { return [::string length $data] } public method align {alignment} { set index [::string length $data] if {($index % $alignment) != 0} { set increment [expr {$alignment - ($index % $alignment)}] switch $increment { 1 { append data f } 2 { append data fo } 3 { append data foo } 4 { append data foob } 5 { append data fooba } 6 { append data foobar } 7 { append data foobar! } default { error "[$this info class]::align" } } } } public method begin_encaps {{nbo {}}} { align 4 ulong 0 ;# dummy length lappend encaps [list [tell] $byteorder] if {$nbo == ""} { boolean $byteorder } else { set byteorder $nbo boolean $byteorder } } public method end_encaps {} { set ep [llength $encaps] if {$ep <= 0} { error "no encapsulation to end here" } incr ep -1 set edata [lindex $encaps $ep] incr ep -1 set encaps [lrange $encaps 0 $ep] set encaps_begin [lindex $edata 0] set byteorder [lindex $edata 1] set encaps_length [expr {[tell] - $encaps_begin}] if {$byteorder == 0} { set data [::string replace $data \ [expr {$encaps_begin - 4}] \ [expr {$encaps_begin - 1}] \ [binary format I $encaps_length]] } else { set data [::string replace $data \ [expr {$encaps_begin - 4}] \ [expr {$encaps_begin - 1}] \ [binary format i $encaps_length]] } } public method begin_chunk {} { align 4 ulong 0 ;# dummy length set chunk [tell] } public method end_chunk {} { set encaps_length [expr {[tell] - $chunk}] if {$byteorder == 0} { set data [::string replace $data \ [expr {$chunk - 4}] [expr {$chunk - 1}] \ [binary format I $encaps_length]] } else { set data [::string replace $data \ [expr {$chunk - 4}] [expr {$chunk - 1}] \ [binary format i $encaps_length]] } } public method char {val} { if {$cencoder != ""} { $cencoder put_char $this $val } else { set ival [encoding convertto iso8859-1 $val] if {[::string length $ival] != 1} { error "[$this info class]::char" } append data $ival } } public method chars {val} { if {$cencoder != ""} { $cencoder put_chars $this $val } else { append data [encoding convertto iso8859-1 $val] } } public method wchar {val} { if {$wencoder == ""} { error "no wchar encoder in [$this info class]::wchar" } $wencoder put_wchar $this $val } public method wchars {val} { if {$wencoder == ""} { error "no wchar encoder in [$this info class]::wchars" } $wencoder put_wchars $this $val } public method octet {val} { if {[::string length $val] != 1} { error "[$this info class]::octet" } append data $val } public method octets {val} { append data $val } public method short {val} { align 2 if {$byteorder == 0} { set bytes [binary format S $val] } else { set bytes [binary format s $val] } append data $bytes } public method ushort {val} { short $val } public method long {val} { align 4 if {$byteorder == 0} { set bytes [binary format I $val] } else { set bytes [binary format i $val] } append data $bytes } public method ulong {val} { long $val } public method longlong {val} { align 8 if {[info tclversion] > 8.3} { if {$byteorder == 0} { set bytes [binary format W $val] } else { set bytes [binary format w $val] } append data $bytes } else { if {$byteorder == 0} { if {$val >= 0} { long 0 long $val } else { long -1 long $val } } else { if {$val >= 0} { long $val long 0 } else { long $val long -1 } } } } # # taking our luck with encoding -1 ... # public method ulonglong {val} { longlong $val } # # groan ... Tcl only handles native floating point values # public method float {val} { align 4 if {$val > 0} { set sign 0 } else { set sign 1 set val [expr {-1. * $val}] } # # If the following math fails, then it's because of the # logarithm. That means that val is indistinguishable from # zero # if {[catch { set exponent [expr {int(floor(log($val)/0.69314718055994529))+127}] set fraction [expr {($val/pow(2.,double($exponent-127)))-1.}] }]} { set exponent 0 set fraction 0.0 } else { # # round off too-small values to zero, throw error for # too-large values # if {$exponent < 0} { set exponent 0 set fraction 0.0 } elseif {$exponent > 255} { error "value $val outside legal range for a float" } } set fraction [expr {$fraction * 128.}] set f1f [expr {floor($fraction)}] set fraction [expr {($fraction - $f1f) * 256.}] set f2f [expr {floor($fraction)}] set fraction [expr {($fraction - $f2f) * 256.}] set f3f [expr {floor($fraction)}] set f1 [expr {int($f1f)}] set f2 [expr {int($f2f)}] set f3 [expr {int($f3f)}] set se1 [expr {($sign ? 128 : 0) | ($exponent >> 1)}] set e2f1 [expr {(($exponent & 0x1) << 7) | $f1}] if {$byteorder == 0} { set bytes [binary format cccc $se1 $e2f1 $f2 $f3] } else { set bytes [binary format cccc $f3 $f2 $e2f1 $se1] } append data $bytes } public method double {val} { align 8 if {$val > 0} { set sign 0 } else { set sign 1 set val [expr {-1. * $val}] } # # If the following math fails, then it's because of the # logarithm. That means that val is indistinguishable from # zero # if {[catch { set exponent [expr {int(floor(log($val)/0.69314718055994529))+1023}] set fraction [expr {($val/pow(2.,double($exponent-1023)))-1.}] }]} { set exponent 0 set fraction 0.0 } else { # # round off too-small values to zero, throw error for # too-large values # if {$exponent < 0} { set exponent 0 set fraction 0.0 } elseif {$exponent > 2047} { error "value $val outside legal range for a double" } } set fraction [expr {$fraction * 16.}] set f1f [expr {floor($fraction)}] set fraction [expr {($fraction - $f1f) * 256.}] set f2f [expr {floor($fraction)}] set fraction [expr {($fraction - $f2f) * 256.}] set f3f [expr {floor($fraction)}] set fraction [expr {($fraction - $f3f) * 256.}] set f4f [expr {floor($fraction)}] set fraction [expr {($fraction - $f4f) * 256.}] set f5f [expr {floor($fraction)}] set fraction [expr {($fraction - $f5f) * 256.}] set f6f [expr {floor($fraction)}] set fraction [expr {($fraction - $f6f) * 256.}] set f7f [expr {floor($fraction)}] set f1 [expr {int($f1f)}] set f2 [expr {int($f2f)}] set f3 [expr {int($f3f)}] set f4 [expr {int($f4f)}] set f5 [expr {int($f5f)}] set f6 [expr {int($f6f)}] set f7 [expr {int($f7f)}] set se1 [expr {($sign ? 128 : 0) | ($exponent >> 4)}] set e2f1 [expr {(($exponent & 0x0f) << 4) | $f1}] if {$byteorder == 0} { set bytes [binary format cccccccc \ $se1 $e2f1 $f2 $f3 $f4 $f5 $f6 $f7] } else { set bytes [binary format cccccccc \ $f7 $f6 $f5 $f4 $f3 $f2 $e2f1 $se1] } append data $bytes } public method longdouble {val} { align 8 if {$val > 0} { set sign 0 } else { set sign 1 set val [expr {-1. * $val}] } # # If the following math fails, then it's because of the # logarithm. That means that val is indistinguishable from # zero # if {[catch { set exponent [expr {int(floor(log($val)/0.69314718055994529))+16383}] set fraction [expr {($val/pow(2.,double($exponent-16383)))-1.}] }]} { set exponent 0 set fraction 0.0 } else { # # round off too-small values to zero, throw error for # too-large values # if {$exponent < 0} { set exponent 0 set fraction 0.0 } elseif {$exponent > 32767} { error "value $val outside legal range for a longdouble" } } set fraction [expr {$fraction * 256.}] set f1f [expr {floor($fraction)}] set fraction [expr {($fraction - $f1f) * 256.}] set f2f [expr {floor($fraction)}] set fraction [expr {($fraction - $f2f) * 256.}] set f3f [expr {floor($fraction)}] set fraction [expr {($fraction - $f3f) * 256.}] set f4f [expr {floor($fraction)}] set fraction [expr {($fraction - $f4f) * 256.}] set f5f [expr {floor($fraction)}] set fraction [expr {($fraction - $f5f) * 256.}] set f6f [expr {floor($fraction)}] set fraction [expr {($fraction - $f6f) * 256.}] set f7f [expr {floor($fraction)}] set fraction [expr {($fraction - $f7f) * 256.}] set f8f [expr {floor($fraction)}] set fraction [expr {($fraction - $f8f) * 256.}] set f9f [expr {floor($fraction)}] set fraction [expr {($fraction - $f9f) * 256.}] set f10f [expr {floor($fraction)}] set fraction [expr {($fraction - $f10f) * 256.}] set f11f [expr {floor($fraction)}] set fraction [expr {($fraction - $f11f) * 256.}] set f12f [expr {floor($fraction)}] set fraction [expr {($fraction - $f12f) * 256.}] set f13f [expr {floor($fraction)}] set fraction [expr {($fraction - $f13f) * 256.}] set f14f [expr {floor($fraction)}] set f1 [expr {int($f1f)}] set f2 [expr {int($f2f)}] set f3 [expr {int($f3f)}] set f4 [expr {int($f4f)}] set f5 [expr {int($f5f)}] set f6 [expr {int($f6f)}] set f7 [expr {int($f7f)}] set f8 [expr {int($f8f)}] set f9 [expr {int($f9f)}] set f10 [expr {int($f10f)}] set f11 [expr {int($f11f)}] set f12 [expr {int($f12f)}] set f13 [expr {int($f13f)}] set f14 [expr {int($f14f)}] set se1 [expr {($sign ? 128 : 0) | ($exponent >> 8)}] set e2 [expr {$exponent & 0xff}] if {$byteorder == 0} { set bytes [binary format cccccccccccccccc \ $se1 $e2 $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11 $f12 $f13 $f14] } else { set bytes [binary format cccccccccccccccc \ $f14 $f13 $f12 $f11 $f10 $f9 $f8 $f7 $f6 $f5 $f4 $f3 $f2 $f1 $e2 $se1] } append data $bytes } public method boolean {val} { if {[catch { if {$val} { append data \1 } else { append data \0 } }]} { error "illegal boolean value $val" } } public method string {val} { if {$cencoder != ""} { $cencoder put_string $this $val } else { # # backwards compatibility using iso8859-1 # set ival [encoding convertto iso8859-1 $val] set length [::string length $ival] incr length ;# terminating null ulong $length append data $ival \0 } } public method wstring {val} { if {$wencoder == ""} { error "no wchar encoder in [$this info class]::wstring" } $wencoder put_wstring $this $val } } # # ------------------------------------------------------------ # CDR Decoder and Encoder for complex types # ------------------------------------------------------------ # itcl::class Decoder { private variable buffer private variable tcrecursion private variable marshalrecursion private variable valuerecursion private variable nestinglevel private variable chunking constructor {_data} { set buffer [namespace current]::[::Combat::CDR::ReadBuffer \#auto $_data] set nestinglevel 0 set chunking 0 } destructor { itcl::delete object $buffer } public method get_buffer {} { return $buffer } public method get_data {} { return [$buffer get_data] } private method get_indirect_string {} { set pos [$buffer tell] set ref [$buffer long] if {$ref != -1} { $buffer seek $pos return [$buffer string] } set oldpos [$buffer tell] set offset [$buffer long] $buffer seek [expr {$oldpos + $offset}] set res [$buffer string] $buffer seek $oldpos $buffer long return $res } private method get_indirect_string_seq {} { set pos [$buffer tell] set ref [$buffer long] set res [list] if {$ref != -1} { for {set i 0} {$i < $ref} {incr i} { lappend res [get_indirect_string] } return $res } set oldpos [$buffer tell] set offset [$buffer long] $buffer seek [expr {$oldpos + $offset}] set ref [$buffer ulong] for {set i 0} {$i < $ref} {incr i} { lappend res [get_indirect_string] } $buffer seek $oldpos $buffer long return $res } private method TypeCode {} { set kind [$buffer long] # # Handle recursion and indirection # # When entering a potentially recursive typecode like # a struct or valuetype, we store the tc's original # position in the tcrecursion array. Therefore, if we # find an indirection to an entry in that array, the # typecode is recursive. Otherwise, it's just an # indirection - we then just skip to the old position # and re-scan the entire tc again. (Otherwise we'd # have to cache all typecodes in the stream.) # if {$kind == -1} { set curpos [$buffer tell] set offset [$buffer long] set origpos [expr {$curpos + $offset}] if {[info exists tcrecursion($origpos)]} { return [list recursive $tcrecursion($origpos)] } $buffer seek $origpos set tc [TypeCode] $buffer seek [expr {$curpos + 4}] return $tc } set tckind [lindex {null void short long {unsigned short} \ {unsigned long} float double boolean char octet \ any TypeCode Principal Object struct union enum \ string sequence array alias exception {long long} \ {unsigned long long} {long double} wchar wstring \ fixed valuetype valuebox native abstractinterface} \ $kind] if {$tckind == ""} { error "unknown tckind $kind" } # # done in case of "empty" tckinds # if {($kind >= 0 && $kind <= 13) || \ ($kind >= 23 && $kind <= 26)} { return $tckind } # # handle "simple" tckinds # switch -- $tckind { string - wstring { set bound [$buffer ulong] if {$bound == 0} { return $tckind } return [list $tckind $bound] } fixed { set digits [$buffer ushort] set scale [$buffer ushort] return [list $tckind $digits $scale] } } # # Complex types with encapsulation # set tckindpos [expr {[$buffer tell] - 4}] $buffer begin_encaps switch -- $tckind { Object { set repoid [$buffer string] set name [$buffer string] set res [list Object $repoid] } struct - exception { set repoid [$buffer string] set tcrecursion($tckindpos) $repoid set name [$buffer string] set count [$buffer ulong] set members [list] for {set i 0} {$i < $count} {incr i} { set member_name [$buffer string] set member_type [Demarshal TypeCode] lappend members $member_name $member_type } unset tcrecursion($tckindpos) set res [list $tckind $repoid $members] } union { set repoid [$buffer string] set tcrecursion($tckindpos) $repoid set name [$buffer string] set disctype [Demarshal TypeCode] set default [$buffer long] set count [$buffer ulong] set members [list] for {set i 0} {$i < $count} {incr i} { set member_label [Demarshal $disctype] set member_name [$buffer string] set member_type [Demarshal TypeCode] if {$i == $default} { lappend members "(default)" $member_type } else { lappend members $member_label $member_type } } unset tcrecursion($tckindpos) set res [list union $repoid $disctype $members] } enum { set repoid [$buffer string] set name [$buffer string] set count [$buffer ulong] set members [list] for {set i 0} {$i < $count} {incr i} { set member_name [$buffer string] lappend members $member_name } set res [list enum $members] } sequence { set element_type [Demarshal TypeCode] set bound [$buffer ulong] if {$bound == 0} { set res [list sequence $element_type] } else { set res [list sequence $element_type $bound] } } array { set element_type [Demarshal TypeCode] set length [$buffer ulong] set res [list array $element_type $length] } alias { set repoid [$buffer string] set name [$buffer string] set original_type [Demarshal TypeCode] set res $original_type } valuetype { set repoid [$buffer string] set tcrecursion($tckindpos) $repoid set name [$buffer string] switch -- [$buffer short] { 0 { set modifier "" } 1 { set modifier "custom" } 2 { set modifier "abstract" } 3 { set modifier "truncatable" } default { error "illegal valuetype modifier" } } set basetc [Demarshal TypeCode] if {$basetc == "null"} { set basetc 0 } set count [$buffer ulong] set members [list] for {set i 0} {$i < $count} {incr i} { set member_name [$buffer string] set member_type [Demarshal TypeCode] switch -- [$buffer short] { 0 { set member_visi "private" } 1 { set member_visi "public" } default { error "illegal member visibility" } } lappend members $member_visi $member_name \ $member_type } unset tcrecursion($tckindpos) set res [list valuetype $repoid $members \ $basetc $modifier] } valuebox { set repoid [$buffer string] set name [$buffer string] set original_type [Demarshal TypeCode] set res [list valuebox $repoid $original_type] } native { set repoid [$buffer string] set name [$buffer string] set res [list native $repoid] } abstractinterface { set repoid [$buffer string] set name [$buffer string] set res [list abstractinterface $repoid] } default { error "unsupported type $tckind ($kind)" } } $buffer end_encaps return $res } private method any {} { set type [Demarshal TypeCode] set value [Demarshal $type] return [list $type $value] } private method bstring {tc} { set length [lindex $tc 1] set got [$buffer string] if {$length > 0 && [string length $got] > $length} { error "Combat::CDR::Decoder: string exceeds bound" } return $got } private method bwstring {tc} { set length [lindex $tc 1] set got [$buffer wstring] if {$length > 0 && [string length $got] > $length} { error "Combat::CDR::Decoder: wstring exceeds bound" } return $got } private method struct {tc} { set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc set result [list] foreach {name type} [lindex $tc 2] { set value [Demarshal $type] lappend result $name $value } catch {unset marshalrecursion($repoid)} return $result } private method union {tc} { set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc set default "" set dtype [lindex $tc 2] set disc [Demarshal $dtype] foreach {dval type} [lindex $tc 3] { if {$dval == "(default)"} { set default $type } elseif {$dval == $disc} { set value [Demarshal $type] catch {unset marshalrecursion($repoid)} return [list $disc $value] } } if {$default != ""} { set value [Demarshal $default] catch {unset marshalrecursion($repoid)} return [list $disc $value] } catch {unset marshalrecursion($repoid)} return [list $disc] } private method exception {tc} { set repoid [$buffer string] if {$repoid != [lindex $tc 1]} { error "Combat::CDR::Decoder: wrong exception tc" } set result [list] foreach {name type} [lindex $tc 2] { set value [Demarshal $type] lappend result $name $value } return [list $repoid $result] } private method sequence {tc} { set type [lindex $tc 1] set length [$buffer ulong] if {[llength $tc] == 3} { set max [lindex $tc 2] if {$max > 0 && $length > $max} { error "Combat::CDR::Decoder: sequence exceeds bound" } } if {$type == "octet"} { return [$buffer octets $length] } elseif {$type == "char"} { return [$buffer chars $length] } elseif {$type == "wchar"} { return [$buffer wchars $length] } set res [list] for {set i 0} {$i < $length} {incr i} { lappend res [Demarshal $type] } return $res } private method Array {tc} { set type [lindex $tc 1] set length [lindex $tc 2] if {$type == "octet"} { return [$buffer octets $length] } elseif {$type == "char"} { return [$buffer chars $length] } elseif {$type == "wchar"} { return [$buffer wchars $length] } set res [list] for {set i 0} {$i < $length} {incr i} { lappend res [Demarshal $type] } return $res } private method enum {tc} { set value [$buffer ulong] return [lindex [lindex $tc 1] $value] } private method Object {tc} { set ior [::Combat::IOP::DemarshalIOR $buffer] if {[llength [$ior cget -profiles]] == 0 && \ [$ior cget -type_id] == ""} { itcl::delete object $ior return 0 } # # Use the object references's own Repository Id (which might # be different from the one in $tc), unless we don't have # info about that type # set marshalid [lindex $tc 1] set repoid [$ior cget -type_id] if {$repoid == "" || \ (![::Combat::SimpleTypeRepository::HaveTypeInfoForId $repoid] && \ [::Combat::SimpleTypeRepository::HaveTypeInfoForId $marshalid])} { set repoid $marshalid } set obj [namespace current]::[::Combat::CORBA::Object \#auto] $obj configure -ior $ior $obj configure -type_id $repoid return [::Combat::CORBA::ORB::MakeObjProc $obj] } private method ValueType {tc} { set repoid [lindex $tc 1] $buffer align 4 set valuepos [$buffer tell] set valuetag [$buffer long] if {$valuetag == 0} { return 0 } if {[lindex $tc 4] == "custom"} { error "cannot demarshal custom valuetype" } if {$valuetag == -1} { set markerpos [$buffer tell] set offset [$buffer long] set origpos [expr {$markerpos + $offset}] if {![info exists valuerecursion($origpos)]} { error "illegal or recursive value type indirection" } return $valuerecursion($origpos) } if {[expr {$valuetag & 8}] == 8 || $chunking} { set chunked 1 } else { set chunked 0 } if {[expr {$valuetag & 1}] == 1} { set codebase [get_indirect_string] } switch [expr {$valuetag & 6}] { 0 { set repoids [list $repoid] } 2 { set repoids [list [get_indirect_string]] } 6 { set repoids [get_indirect_string_seq] } default { error "oops" } } set marshaltc "" foreach id $repoids { if {$id == $repoid} { set marshaltc $tc break } if {![catch {::corba::type of $id} testtc]} { set marshaltc $testtc break } } if {$marshaltc == ""} { error "oops" } set itc $marshaltc set tcs [list] while {$itc != 0} { set tcs [linsert $tcs 0 $itc] set itc [lindex $itc 3] } set repoid [lindex $marshaltc 1] set marshalrecursion($repoid) $marshaltc if {$chunked} { set chunking 1 incr nestinglevel $buffer begin_chunk } set result [list] foreach mtc $tcs { foreach {visi name type} [lindex $mtc 2] { set value [Demarshal $type] lappend result $name $value } } lappend result _tc_ $marshaltc if {$chunked} { $buffer end_chunk set level [expr {$nestinglevel + 1}] while {$level > $nestinglevel} { set pos [$buffer tell] set tag [$buffer long] if {$tag > 0 && $tag < 2147483392} { $buffer seek $pos $buffer begin_chunk $buffer end_chunk } elseif {$tag < 0} { set level [expr {-$tag}] } else { $buffer seek $pos ValueType [list valuetype \ IDL:omg.org/CORBA/ValueBase:1.0 \ [list] "" ""] } } if {$level < $nestinglevel} { $buffer seek $pos } if {[incr nestinglevel -1] == 0} { set chunking 0 } } set valuerecursion($valuepos) $result catch {unset marshalrecursion($repoid)} return $result } private method ValueBox {tc} { set vtc [list valuetype [lindex $tc 1] \ [list public foo [lindex $tc 2]] 0 ""] set vt [ValueType $vtc] if {$vt == "0"} { return $vt } foreach {name value} $vt { if {$name == "foo"} { set res $value break } } return $res } private method AbstractInterface {tc} { set disc [$buffer boolean] if {$disc} { return [Object [list Object IDL:omg.org/CORBA/Object:1.0]] } else { return [ValueType [list valuetype \ IDL:omg.org/CORBA/ValueBase:1.0 [list] "" ""]] } } private method recursive {tc} { set repoid [lindex $tc 1] if {![info exists marshalrecursion($repoid)]} { error "illegal marshalling recursion for $repoid" } set savetc $marshalrecursion($repoid) set res [Demarshal $marshalrecursion($repoid)] set marshalrecursion($repoid) $savetc return $res } public method Demarshal {tc} { # # handle primitive types # switch $tc { null { return } void { return } boolean { return [$buffer boolean] } short { return [$buffer short] } long { return [$buffer long] } {unsigned short} { return [$buffer ushort] } {unsigned long} { return [$buffer ulong] } {long long} { return [$buffer longlong] } {unsigned long long} { return [$buffer ulonglong] } float { return [$buffer float] } double { return [$buffer double] } {long double} { return [$buffer longdouble] } char { return [$buffer char] } octet { return [$buffer octet] } wchar { return [$buffer wchar] } string { return [$buffer string] } wstring { return [$buffer wstring] } any { return [any] } TypeCode { return [TypeCode] } } # # constructed types # set type [lindex $tc 0] switch $type { string { return [bstring $tc] } wstring { return [bwstring $tc] } struct { return [struct $tc] } union { return [union $tc] } exception { return [exception $tc] } sequence { return [sequence $tc] } array { return [Array $tc] } enum { return [enum $tc] } Object { return [Object $tc] } valuetype { return [ValueType $tc] } valuebox { return [ValueBox $tc] } abstractinterface { return [AbstractInterface $tc] } recursive { return [recursive $tc] } } error "unknown type: $tc" } } itcl::class Encoder { private variable buffer private variable tcrecursion private variable marshalrecursion private variable nestinglevel private variable chunking constructor {} { set buffer [namespace current]::[::Combat::CDR::WriteBuffer \#auto] set nestinglevel 0 set chunking 0 } destructor { itcl::delete object $buffer } public method get_data {} { return [$buffer get_data] } public method get_buffer {} { return $buffer } private method TypeCode {value} { set tckind [lindex $value 0] if {$value == "unsigned short" || \ $value == "unsigned long" || \ $value == "long long" || \ $value == "unsigned long long" || \ $value == "long double"} { set tckind $value } # # Handle recursion # if {$tckind == "recursive"} { set repoid [lindex $value 1] if {![info exists tcrecursion($repoid)]} { error "illegal recursion for $repoid" } $buffer long -1 set offset [expr {$tcrecursion($repoid) - [$buffer tell]}] $buffer long $offset return } set kind [lsearch {null void short long {unsigned short} \ {unsigned long} float double boolean char octet \ any TypeCode Principal Object struct union enum \ string sequence array alias exception {long long} \ {unsigned long long} {long double} wchar wstring \ fixed valuetype valuebox native abstractinterface} \ $tckind] if {$kind == -1} { error "unknown tckind $tckind" } # # done in case of "empty" tckinds # if {($kind >= 0 && $kind <= 13) || \ ($kind >= 23 && $kind <= 26)} { $buffer ulong $kind return } # # handle "simple" tckinds # switch -- $tckind { string - wstring { $buffer ulong $kind if {[llength $value] == 2} { set bound [lindex $value 1] $buffer ulong $bound } else { $buffer ulong 0 } return } fixed { $buffer ulong $kind $buffer ulong [lindex $value 1] $buffer ulong [lindex $value 2] return } } # # Complex types with encapsulation # $buffer align 4 set tckindpos [$buffer tell] $buffer ulong $kind $buffer begin_encaps switch -- $tckind { Object { $buffer string [lindex $value 1] $buffer string "" } struct - exception { set repoid [lindex $value 1] set tcrecursion($repoid) $tckindpos $buffer string $repoid $buffer string "" set members [lindex $value 2] $buffer ulong [expr {[llength $members] / 2}] foreach {member_name member_type} $members { $buffer string $member_name Marshal TypeCode $member_type } unset tcrecursion($repoid) } union { set repoid [lindex $value 1] set tcrecursion($repoid) $tckindpos set disctype [lindex $value 2] set members [lindex $value 3] set default -1 set count 0 foreach {member_label member_type} $members { if {$member_label == "(default)"} { set default $count break } incr count } $buffer string $repoid $buffer string "" Marshal TypeCode $disctype $buffer long $default $buffer ulong [expr {[llength $members] / 2}] set count 0 foreach {member_label member_type} $members { if {$count == $default} { switch -- $disctype { boolean { $buffer boolean 0 } short { $buffer short 0 } {unsigned short} { $buffer ushort 0 } long { $buffer long 0 } {unsigned long} { $buffer ulong 0 } default { # should be enum $buffer ulong 0 } } } else { Marshal $disctype $member_label } $buffer string "" Marshal TypeCode $member_type incr count } unset tcrecursion($repoid) } enum { $buffer string "" $buffer string "" $buffer ulong [llength [lindex $value 1]] foreach member [lindex $value 1] { $buffer string $member } } sequence { Marshal TypeCode [lindex $value 1] if {[llength $value] == 3} { $buffer ulong [lindex $value 2] } else { $buffer ulong 0 } } array { Marshal TypeCode [lindex $value 1] $buffer ulong [lindex $value 2] } valuetype { set repoid [lindex $value 1] set tcrecursion($repoid) $tckindpos $buffer string $repoid $buffer string "" switch -- [lindex $value 4] { "" { $buffer short 0 } custom { $buffer short 1 } abstract { $buffer short 2 } truncatable { $buffer short 3 } default { error "illegal modifier for valuetype tc" } } if {[lindex $value 3] == 0} { Marshal TypeCode null } else { Marshal TypeCode [lindex $value 3] } set members [lindex $value 2] $buffer ulong [expr {[llength $members] / 3}] foreach {visi member_name member_type} $members { $buffer string $member_name Marshal TypeCode $member_type switch -- $visi { private { $buffer short 0 } public { $buffer short 1 } default { error "illegal visibility $visi" } } } unset tcrecursion($repoid) } valuebox { $buffer string [lindex $value 1] $buffer string "" Marshal TypeCode [lindex $value 2] } native { $buffer string [lindex $value 1] $buffer string "" } abstractinterface { $buffer string [lindex $value 1] $buffer string "" } alias { error "oops, there are no such things as aliases" } default { error "unsupported type $tckind" } } $buffer end_encaps } private method any {value} { Marshal TypeCode [lindex $value 0] Marshal [lindex $value 0] [lindex $value 1] } private method bstring {tc value} { set length [lindex $tc 1] if {$length > 0 && [string length $value] > $length} { error "Combat::CDR::Encoder: string exceeds bound" } $buffer string $value } private method bwstring {tc value} { set length [lindex $tc 1] if {$length > 0 && [string length $value] > $length} { error "Combat::CDR::Encoder: wstring exceeds bound" } $buffer wstring $value } private method struct {tc value} { set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc set members [lindex $tc 2] if {[llength $value] != [llength $members]} { error "Combat::CDR::Encoder: wrong # of struct members for struct $repoid" } foreach {member_name member_value} $value { set map($member_name) $member_value } foreach {member_name member_type} $members { if {![info exists map($member_name)]} { error "Combat::CDR::Encoder: missing member $member_name in struct $repoid" } Marshal $member_type $map($member_name) } catch {unset marshalrecursion($repoid)} unset map } private method find_union_case {value cases} { foreach {dval type} $cases { if {$dval != "(default)" && $dval == $value} { return 1 } } return 0 } private method find_default_for_union {dtype cases} { switch -- $dtype { boolean { foreach val {0 1} { if {![find_union_case $val $cases]} { return $val } } } short - {unsigned short} - long - {unsigned long} { for {set val 0} {$val < 32767} {incr val} { if {![find_union_case $val $cases]} { return $val } if {![find_union_case [expr {-$val}] $cases]} { return [expr {-$val}] } } } } if {[lindex $dtype 0] == "enum"} { foreach val [lindex $dtype 1] { if {![find_union_case $val $cases]} { return $val } } } error "find_default_for_union" } private method union {tc value} { set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc set default "" set dtype [lindex $tc 2] set disc [lindex $value 0] if {$disc == "(default)"} { set disc [find_default_for_union $dtype [lindex $tc 3]] } Marshal $dtype $disc foreach {dval type} [lindex $tc 3] { if {$dval == "(default)"} { set default $type } elseif {$dval == $disc} { Marshal $type [lindex $value 1] catch {unset marshalrecursion($repoid)} return } elseif {$dtype == "boolean"} { set lv [expr {$dval ? 1 : 0}] set dv [expr {$disc ? 1 : 0}] if {$lv == $dv} { Marshal $type [lindex $value 1] catch {unset marshalrecursion($repoid)} return } } } if {$default != ""} { Marshal $default [lindex $value 1] } catch {unset marshalrecursion($repoid)} return } private method exception {tc value} { $buffer string [lindex $value 0] if {[llength $value] == 2} { foreach {member_name member_value} [lindex $value 1] { set map($member_name) $member_value } foreach {member_name member_type} [lindex $tc 2] { Marshal $member_type $map($member_name) } } catch {unset map} } private method sequence {tc value} { set type [lindex $tc 1] if {$type == "char" || $type == "octet" || $type == "wchar"} { set length [::string length $value] } else { set length [llength $value] } if {[llength $tc] == 3} { set max [lindex $tc 2] if {$max > 0 && $length > $max} { error "Combat::CDR::Encoder: sequence exceeds bound" } } $buffer ulong $length if {$type == "octet"} { $buffer octets $value } elseif {$type == "char"} { $buffer chars $value } elseif {$type == "wchar"} { $buffer wchars $value } else { foreach element $value { Marshal $type $element } } } private method Array {tc value} { set type [lindex $tc 1] if {$type == "char" || $type == "octet" || $type == "wchar"} { set length [::string length $value] } else { set length [llength $value] } if {$length != [lindex $tc 2]} { error "Combat::CDR::Encoder: array length does not match" } if {$type == "octet"} { $buffer octets $value } elseif {$type == "char"} { $buffer chars $value } elseif {$type == "wchar"} { $buffer wchars $value } else { foreach element $value { Marshal $type $element } } } private method enum {tc value} { set idx [lsearch -exact [lindex $tc 1] $value] if {$idx == -1} { error "Combat::CDR::Encoder: illegal enum value $value" } $buffer ulong $idx } private method Object {tc value} { if {$value == 0} { set ior [::Combat::IOP::IOR \#auto] $ior marshal $buffer itcl::delete object $ior return } set obj [::Combat::CORBA::ORB::GetObjFromRef $value] set ior [$obj get_ior] $ior marshal $buffer } private method ValueType {tc value} { if {$value == 0} { $buffer long 0 return } set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc foreach {member_name member_value} $value { set map($member_name) $member_value } if {[info exists map(_tc_)]} { set marshaltc $map(_tc_) } else { set marshaltc $tc } if {[lindex $marshaltc 4] == "custom"} { error "cannot marshal custom valuetype" } set value_tag 2147483392 ;# 0x7fffff00 set value_tag [expr {$value_tag | 6}] if {[lindex $marshaltc 4] == "truncatable" || $chunking} { set chunked 1 } else { set chunked 0 } if {$chunked} { set value_tag [expr {$value_tag | 8}] } set repoids [list] set itc $marshaltc while {[lindex $itc 4] == "truncatable"} { lappend repoids [lindex $itc 1] set itc [lindex $itc 3] } lappend repoids [lindex $itc 1] # # end previous chunk first # if {$nestinglevel > 0 && $chunked} { $buffer end_chunk $buffer long [expr {-$nestinglevel}] } if {$chunked} { set chunking 1 incr nestinglevel } $buffer long $value_tag $buffer ulong [llength $repoids] foreach id $repoids { $buffer string $id } set found 0 set itc $marshaltc set tcs [list] while {$itc != 0} { if {$repoid == [lindex $itc 1]} { set found 1 } set tcs [linsert $tcs 0 $itc] set itc [lindex $itc 3] } if {$repoid == "IDL:omg.org/CORBA/ValueBase:1.0"} { set found 1 } if {!$found} { error "Combat::CDR::Encoder: _tc_ not compatible with expected type $repoid" } if {$chunked} { $buffer begin_chunk } foreach mtc $tcs { foreach {visi member_name member_type} [lindex $mtc 2] { if {![info exists map($member_name)]} { error "Combat::CDR::Encoder: missing member $member_name in value $repoid" } Marshal $member_type $map($member_name) } } if {$chunked} { $buffer end_chunk $buffer long [expr {-$nestinglevel}] if {[incr nestinglevel -1] == 0} { set chunking 0 } } catch {unset map} catch {unset marshalrecursion($repoid)} } private method ValueBox {tc value} { set vtc [list valuetype [lindex $tc 1] \ [list public foo [lindex $tc 2]] 0 ""] if {$value == 0} { ValueType $vtc $value } else { ValueType $vtc [list foo $value] } } private method AbstractInterface {tc value} { if {$value == "0"} { $buffer boolean 0 $buffer long 0 return } if {[llength $value] == 1} { $buffer boolean 1 Object [list Object IDL:omg.org/CORBA/Object:1.0] $value } else { $buffer boolean 0 ValueType [list valuetype \ IDL:omg.org/CORBA/ValueBase:1.0 \ [list] "" ""] $value } } private method recursive {tc value} { set repoid [lindex $tc 1] if {![info exists marshalrecursion($repoid)]} { error "illegal marshalling recursion for $repoid" } set savetc $marshalrecursion($repoid) set res [Marshal $marshalrecursion($repoid) $value] set marshalrecursion($repoid) $savetc return $res } public method Marshal {tc value} { # # handle primitive types # switch $tc { null { return } void { return } boolean { $buffer boolean $value ; return } short { $buffer short $value ; return } long { $buffer long $value ; return } {unsigned short} { $buffer ushort $value ; return } {unsigned long} { $buffer ulong $value ; return } {long long} { $buffer longlong $value ; return } {unsigned long long} { $buffer ulonglong $value ; return } float { $buffer float $value ; return } double { $buffer double $value ; return } {long double} { $buffer longdouble $value ; return } char { $buffer char $value ; return } octet { $buffer octet $value ; return } wchar { $buffer wchar $value ; return } string { $buffer string $value ; return } wstring { $buffer wstring $value ; return } any { any $value ; return } TypeCode { TypeCode $value ; return } } # # constructed types # set type [lindex $tc 0] switch $type { string { bstring $tc $value ; return } wstring { bwstring $tc $value ; return } struct { struct $tc $value ; return } union { union $tc $value ; return } exception { exception $tc $value ; return } sequence { sequence $tc $value ; return } array { Array $tc $value ; return } enum { enum $tc $value ; return } Object { Object $tc $value ; return } valuetype { ValueType $tc $value ; return } valuebox { ValueBox $tc $value ; return } abstractinterface { AbstractInterface $tc $value ; return } recursive { recursive $tc $value ; return } } error "unknown type: $tc" } } } } combat-0.8.1/orb/codeset.tcl0000700000175000010010000003645211105354562013761 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: codeset.tcl,v 1.13 2008-11-08 18:24:50 Owner Exp $ # # ---------------------------------------------------------------------- # CONV_FRAME Module # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval CONV_FRAME { # # charset registry # # This array maps codesets to Tcl encodings, and determines the # codesets supported by Combat in GIOP codeset negotiation. To # add support for a new codeset, you have to add a new entry here. # The array index is the "Registered Value", in decimal, from the # "OSF Character and Code Set Registry", which is available from # # ftp://ftp.opengroup.org/pub/code_set_registry/cs_registry1.2h # # The array element is a list of length two. The first list element # is the Tcl encoding (one from [encoding names]) that matches this # codeset, the second element is a "human-readable" name for that # codeset; it is used for debugging messages. # variable codesets array set codesets { 65537 { iso8859-1 "ISO 8859-1:1987; Latin Alphabet No. 1" } 65551 { iso8859-15 "ISO/IEC 8859-15:1999; Latin Alphabet No. 9" } 65568 { ascii "ISO 646:1991 IRV (International Reference Version)" } 65792 { unicode "ISO/IEC 10646-1:1993; UCS-2, Level 1" } 65801 { unicode "ISO/IEC 10646-1:1993; UTF-16" } 83951617 { utf-8 "X/Open UTF-8; UCS Transformation Format 8 (UTF-8)" } 268567780 { cp1252 "IBM-1252 (CCSID 01252); MS Windows Latin-1" } } # # The native codeset that is to be used for strings (and advertised # as SNCS). This is an index into the above array. It is set upon # initialization from [encoding system] or -ORBNativeCodeSet. # variable native_codeset -1 # # CodeSetInfo Tagged Component for MultipleComponentProfile # itcl::class CodeSetInfo { inherit ::Combat::IOP::TaggedComponent public variable char_native_code_set public variable char_conversion_code_sets public variable wchar_native_code_set public variable wchar_conversion_code_sets constructor {} { set tag 1 ;# TAG_CODE_SETS set char_native_code_set 0 set char_conversion_code_sets [list] set wchar_native_code_set 0 set wchar_conversion_code_sets [list] } public method marshal {buffer} { $buffer ulong 1 ;# TAG_CODE_SETS $buffer begin_encaps $buffer ulong $char_native_code_set $buffer ulong [llength $char_conversion_code_sets] foreach cs $char_conversion_code_sets { $buffer ulong $cs } $buffer ulong $wchar_native_code_set $buffer ulong [llength $wchar_conversion_code_sets] foreach cs $wchar_conversion_code_sets { $buffer ulong $cs } $buffer end_encaps } } proc DemarshalCodeSetInfo {buffer} { $buffer begin_encaps set char_native_code_set [$buffer ulong] set char_conversion_code_sets [list] set count [$buffer ulong] for {set i 0} {$i < $count} {incr i} { lappend char_conversion_code_sets [$buffer ulong] } set wchar_native_code_set [$buffer ulong] set wchar_conversion_code_sets [list] set count [$buffer ulong] for {set i 0} {$i < $count} {incr i} { lappend wchar_conversion_code_sets [$buffer ulong] } $buffer end_encaps set res [namespace current]::[::Combat::CONV_FRAME::CodeSetInfo \#auto] $res configure -tag 1 \ -char_native_code_set $char_native_code_set \ -char_conversion_code_sets $char_conversion_code_sets \ -wchar_native_code_set $wchar_native_code_set \ -wchar_conversion_code_sets $wchar_conversion_code_sets return $res } itcl::class CodeSetContext { inherit ::Combat::IOP::ServiceContext public variable char_data public variable wchar_data public method marshal {buffer} { $buffer ulong 1 ;# CodeSets $buffer begin_encaps $buffer ulong $char_data $buffer ulong $wchar_data $buffer end_encaps } } proc DemarshalCodeSetContext {buffer} { $buffer begin_encaps set char_data [$buffer ulong] set wchar_data [$buffer ulong] $buffer end_encaps set res [namespace current]::[::Combat::CONV_FRAME::CodeSetContext \#auto] $res configure -context_id 1 \ -char_data $char_data -wchar_data $wchar_data return $res } # # Perform conversion between native and transmission code set. This # behaves differently for char and wchar values. As each instance # is concerned with a single tcs only, there are usually two Code- # SetConverters involved, one for tcs-c and one for tcs-w. # # tcs is a Charset Ids from the OSF Character and Code Set Registry, # see the codesets array above. # itcl::class CodeSetConverter { public variable tcs constructor {_tcs} { set tcs $_tcs } public method get_char {buffer} { error "pure virtual" } public method get_string {buffer} { error "pure virtual" } public method get_wchar {buffer} { error "pure virtual" } public method get_wstring {buffer} { error "pure virtual" } } # # Generic Converter for character sets supported by [encoding] # and registered with our codesets array. GIOP 1.2 version. # itcl::class GenericConverter12 { inherit ::Combat::CONV_FRAME::CodeSetConverter public variable encoding constructor {_tcs} { ::Combat::CONV_FRAME::CodeSetConverter::constructor $_tcs } { set encoding [lindex $::Combat::CONV_FRAME::codesets($_tcs) 0] } private method wordswap {data} { binary scan $data s* elements return [binary format S* $elements] } public method get_char {buffer} { return [::encoding convertfrom $encoding [$buffer octet]] } public method get_chars {buffer length} { return [::encoding convertfrom $encoding \ [$buffer octets $length]] } public method get_wchar {buffer} { set olen [$buffer octet] if {[binary scan $olen c length] != 1} { error "[$this info class]::get_wchar" } set data [$buffer octets $length] # # UTF-16 special BOM handling # if {$tcs == 65801} { global tcl_platform if {[binary scan $data S bom] == 1} { if {$bom == -257} { if {$tcl_platform(byteOrder) == "littleEndian"} { set data [wordswap [string range $data 2 end]] } else { set data [string range $data 2 end] } } elseif {$bom == -2} { if {$tcl_platform(byteOrder) == "littleEndian"} { set data [string range $data 2 end] } else { set data [wordswap [string range $data 2 end]] } } elseif {$tcl_platform(byteOrder) == "littleEndian"} { set data [wordswap $data] } } } return [::encoding convertfrom $encoding $data] } public method get_wchars {buffer length} { set res "" for {set i 0} {$i < $length} {incr i} { append res [get_wchar $buffer] } } public method get_string {buffer} { set length [$buffer ulong] incr length -1 ;# substract trailing NUL set data [$buffer octets $length] $buffer octet return [::encoding convertfrom $encoding $data] } # # wstrings aren't NUL-terminated in GIOP 1.2 # public method get_wstring {buffer} { set length [$buffer ulong] set data [$buffer octets $length] # # UTF-16 special BOM handling # if {$tcs == 65801} { global tcl_platform if {[binary scan $data S bom] == 1} { if {$bom == -257} { if {$tcl_platform(byteOrder) == "littleEndian"} { set data [wordswap [string range $data 2 end]] } else { set data [string range $data 2 end] } } elseif {$bom == -2} { if {$tcl_platform(byteOrder) == "littleEndian"} { set data [string range $data 2 end] } else { set data [wordswap [string range $data 2 end]] } } elseif {$tcl_platform(byteOrder) == "littleEndian"} { set data [wordswap $data] } } } return [::encoding convertfrom $encoding $data] } public method put_char {buffer val} { if {[::string length $val] != 1} { error "[$this info class]::put_char: length of $val != 1" } set data [::encoding convertto $encoding $val] $buffer octet [string range $data 0 0] } public method put_chars {buffer val} { $buffer octets [::encoding convertto $encoding $val] } public method put_wchar {buffer val} { if {[::string length $val] != 1} { error "[$this info class]::put_wchar: length of $val != 1" } set data [::encoding convertto $encoding $val] # # UTF-16 special BOM handling # global tcl_platform if {$tcs == 65801 && \ $tcl_platform(byteOrder) == "littleEndian"} { set olen [binary format c [expr {[string length $data] + 2}]] $buffer octet $olen $buffer octets "\xff\xfe" $buffer octets $data } else { set olen [binary format c [string length $data]] $buffer octet $olen $buffer octets $data } } public method put_wchars {buffer val} { set length [string length $val] for {set i 0} {$i < $length} {incr i} { put_wchar $buffer [string index $val $i] } } public method put_string {buffer val} { set data [::encoding convertto $encoding $val] set length [::string length $data] incr length ;# terminating null $buffer ulong $length $buffer octets $data $buffer octet \0 } # # wstrings aren't NUL-terminated in GIOP 1.2 # public method put_wstring {buffer val} { set data [::encoding convertto $encoding $val] # # UTF-16 special BOM handling # global tcl_platform if {$tcs == 65801 && \ $tcl_platform(byteOrder) == "littleEndian"} { $buffer ulong [expr {[::string length $data] + 2}] $buffer octets "\xff\xfe" $buffer octets $data } else { $buffer ulong [::string length $data] $buffer octets $data } } } # # The same for GIOP 1.1. wchar and wstring handling is too # complicated for us. # itcl::class GenericConverter11 { inherit ::Combat::CONV_FRAME::CodeSetConverter public variable encoding constructor {_tcs} { ::Combat::CONV_FRAME::CodeSetConverter::constructor $_tcs } { set encoding [lindex $::Combat::CONV_FRAME::codesets($_tcs) 0] } public method get_char {buffer} { return [::encoding convertfrom $encoding [$buffer octet]] } public method get_chars {buffer length} { return [::encoding convertfrom $encoding \ [$buffer octets $length]] } public method get_wchar {buffer} { error "don't wanna handle wchars in GIOP 1.1" } public method get_wchars {buffer} { error "don't wanna handle wchars in GIOP 1.1" } public method get_string {buffer} { set length [$buffer ulong] set data [$buffer octets $length] set res [::encoding convertfrom $encoding $data] # # data includes a trailing null # set sl [::string length $res] incr sl -2 return [::string range $res 0 $sl] } public method get_wstring {buffer} { set length [$buffer ulong] set data [$buffer octets [expr {2*$length}]] set res [::encoding convertfrom unicode $data] set sl [::string length $res] incr sl -2 return [::string range $res 0 $sl] } public method put_char {buffer val} { if {[::string length $val] != 1} { error "[$this info class]::put_char: length of $val != 1" } set data [::encoding convertto $encoding $val] $buffer octet [::string range $data 0 0] } public method put_chars {buffer val} { $buffer octets [::encoding convertto $encoding $val] } public method put_wchar {buffer val} { error "don't wanna handle wchars in GIOP 1.1" } public method put_wchars {buffer val} { error "don't wanna handle wchars in GIOP 1.1" } public method put_string {buffer val} { set data [::encoding convertto $encoding $val] set length [::string length $data] incr length ;# terminating null $buffer ulong $length $buffer octets $data $buffer octet \0 } public method put_wstring {buffer val} { set data [::encoding convertto unicode $val] set length [::string length $val] incr length $buffer ulong $length $buffer octets $data $buffer octets \0\0 } } # # find Transmission CodeSet according to algorithm # proc findTransCodeSet {what sncs sccs} { if {$sncs != 0} { # # if (CNCS==SNCS) TCS=CNCS # if {$sncs == $::Combat::CONV_FRAME::native_codeset} { return $sncs } # # if (elementOf(SNCS,CCCS)) TCS=SNCS # foreach ccs [array names ::Combat::CONV_FRAME::codesets] { if {$sncs != 0 && $sncs == $ccs} { return $sncs } } } if {$::Combat::CONV_FRAME::native_codeset != 0} { # # if (elementOf(CNCS,SCCS)) TCS=CNCS # foreach scs $sccs { if {$::Combat::CONV_FRAME::native_codeset == $scs} { return $scs } } } # # if (intersection(CCCS,SCCS)) TCS=oneOf(intersection(CCCS,SCCS)) # foreach ccs [array names ::Combat::CONV_FRAME::codesets] { if {[lsearch -exact $sccs $ccs] != -1} { return $ccs } } # # TCS=fallbackCS # if {$what == "char"} { return 83951617 ;# UTF-8 } return 65801 ;# UTF-16 } # # Get a converter # proc getConverter {giop_major giop_minor tcs} { if {$tcs == $::Combat::CONV_FRAME::native_codeset} { return "" ;# no converter needed } if {![info exists ::Combat::CONV_FRAME::codesets($tcs)]} { error [list IDL:omg.org/CORBA/DATA_CONVERSION:1.0 [list \ minor 0 completion_status COMPLETED_NO]] } if {$giop_major == 1 && $giop_minor == 1} { return [namespace current]::[::Combat::CONV_FRAME::GenericConverter11 \#auto $tcs] } elseif {$giop_major == 1 && $giop_minor == 2} { return [namespace current]::[::Combat::CONV_FRAME::GenericConverter12 \#auto $tcs] } error [list IDL:omg.org/CORBA/DATA_CONVERSION:1.0 [list \ minor 0 completion_status COMPLETED_NO]] } proc MakeCodeSetInfo {} { set csinfo [namespace current]::[::Combat::CONV_FRAME::CodeSetInfo \#auto] $csinfo configure \ -char_native_code_set $::Combat::CONV_FRAME::native_codeset \ -wchar_native_code_set 65801 return $csinfo } proc init {{native ""}} { if {$::Combat::CONV_FRAME::native_codeset != -1} { set native $::Combat::CONV_FRAME::native_codeset } elseif {$native == "" || $native == -1} { set native [encoding system] } # # Make sure that this encoding exists. # if {![info exists ::Combat::CONV_FRAME::codesets($native)]} { foreach index [array names ::Combat::CONV_FRAME::codesets] { if {[lindex $::Combat::CONV_FRAME::codesets($index) 0] == $native} { set native $index break } } } if {![info exists ::Combat::CONV_FRAME::codesets($native)]} { error "unknown native codeset: $native" } set ::Combat::CONV_FRAME::native_codeset $native if {$::Combat::debug(info)} { set csenc [lindex $::Combat::CONV_FRAME::codesets($native) 0] set csname [lindex $::Combat::CONV_FRAME::codesets($native) 1] puts stderr "INFO: Using $csname ($csenc) as native codeset" } } } } combat-0.8.1/orb/combat.tcl0000700000175000010010000000403411105354562013567 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: combat.tcl,v 1.8 2008-11-08 18:24:50 Owner Exp $ # # ---------------------------------------------------------------------- # Main # ---------------------------------------------------------------------- # # # Tcl 8.1 adds the internationalization features that are used for codeset # negotiation. Also, [string] had some bugs with binary strings in 8.0. # package require Tcl 8.1 # # Look for Itcl, or, failing that, tcl++ # if {[catch { package require Itcl }]} { # # If we can't have Itcl, can we load tcl++? # package require tcl++ # # When using tcl++, fool myself into thinking that Itcl is present. # The original tcl++ didn't want to be so bold. # namespace eval ::itcl { namespace import -force ::tcl++::class namespace import -force ::tcl++::delete namespace import -force ::tcl++::scope } package provide Itcl 3.0 } # # Load Combat # set _combat_mandatory_files { cdr giop iop iiop codeset str object orb corba } set _combat_optional_files { poa } foreach _combat_file $_combat_mandatory_files { set _combat_fullname [file join [file dirname [info script]] \ [set _combat_file].tcl] source $_combat_fullname } foreach _combat_file $_combat_optional_files { set _combat_fullname [file join [file dirname [info script]] \ [set _combat_file].tcl] if {[file exists $_combat_fullname]} { source $_combat_fullname } } # # combat Namespace # namespace eval combat { proc ir {cmd data} { if {$cmd != "add"} { error "illegal option for combat::ir, was expecting add" } ::Combat::SimpleTypeRepository::add $data } } package provide corba 0.8 package provide combat 0.8 combat-0.8.1/orb/corba.tcl0000700000175000010010000007322311107156502013412 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: corba.tcl,v 1.30 2008-11-14 02:06:58 Owner Exp $ # # ---------------------------------------------------------------------- # CORBA Module # ---------------------------------------------------------------------- # namespace eval Combat { variable initialized 0 variable debug array set debug { info 0 orb 0 giop 0 iiop 0 transport 0 poa 0 } proc Debug {args} { if {[string tolower $args] == "all"} { set args [array names ::Combat::debug] } foreach arg $args { set ::Combat::debug([string tolower $arg]) 1 } } namespace eval CORBA { variable VMCID 0 variable OMGVMCID 1330446336 ;# 0x4f4d0000 } proc DumpOctets {desc data} { set index 0 while {$index < [string length $data]} { if {$index == 0} { puts -nonewline stderr "[format %12s $desc] " } else { puts -nonewline stderr " " } set count [binary scan $data \ @[set index]H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2 \ c(0) c(1) c(2) c(3) c(4) c(5) c(6) c(7) c(8) \ c(9) c(10) c(11) c(12) c(13) c(14) c(15) c(16)] for {set i 0} {$i < $count} {incr i} { puts -nonewline stderr "$c($i) " } for {} {$i < 16} {incr i} { puts -nonewline stderr " " } binary scan $data \ @[set index]cccccccccccccccc \ c(0) c(1) c(2) c(3) c(4) c(5) c(6) c(7) c(8) \ c(9) c(10) c(11) c(12) c(13) c(14) c(15) c(16) for {set i 0} {$i < $count} {incr i} { # # Printable ISOLatin1 characters according to the # Red Book (Postscript RM) # if {($c($i) >= 0040 && $c($i) <= 0176) || \ ($c($i) >= 0220 && $c($i) != 0231 && $c($i) != 0234)} { puts -nonewline stderr "[string index $data [expr {$index + $i}]]" } else { puts -nonewline stderr "." } } puts "" incr index $count } } } # # ---------------------------------------------------------------------- # corba Namespace # ---------------------------------------------------------------------- # namespace eval corba { # # corba::init # proc init {args} { if {$::Combat::initialized} { return $args } set rest [list] set runserver 0 set ::Combat::CORBA::ORB::iiop_serverports [list] set ::Combat::CORBA::ORB::hostname [info hostname] set native_codeset -1 for {set idx 0} {$idx < [llength $args]} {incr idx} { switch -glob -- [lindex $args $idx] { -ORBInitRef { incr idx set initref [lindex $args $idx] set eql [string first = $initref] if {$eql == -1} { error "oops" } set name [string range $initref 0 [expr {$eql - 1}]] set value [string range $initref [expr {$eql + 1}] end] set ::Combat::CORBA::ORB::initial_references($name) \ $value } -ORBDefaultInitRef { incr idx set ::Combat::CORBA::ORB::default_init_ref \ [lindex $args $idx] } -ORBDebug { incr idx set what [lindex $args $idx] eval ::Combat::Debug [split $what ,] } -ORBServer { set runserver 1 } -ORBServerPort { incr idx lappend ::Combat::CORBA::ORB::iiop_serverports \ [lindex $args $idx] } -ORBGIOPMaxSize - -ORBGiopMaxSize { incr idx set arg [lindex $args $idx] switch -- [scan $arg "%d%s" value postfix] { 1 {} 2 { switch -- $postfix { k - K { set value [expr {$value * 1024}] } m - M { set value [expr {$value * 1024 * 1024}] } g - G { set value [expr {$value*1024*1024*1024}] } default { error "illegal value for -ORBGIOPMaxSize: $arg" } } } default { error "illegal value for -ORBGIOPMaxSize: $arg" } } set ::Combat::GIOP::ORBGIOPMaxSize $value } -ORBServerId - -ORBImplName - -ORBPOAImplName - -POAImplName { incr idx set ::Combat::PortableServer::POAImplName \ [lindex $args $idx] } -ORBNativeCodeSet { incr idx set native_codeset [lindex $args $idx] } -ORBHostName { incr idx set ::Combat::CORBA::ORB::hostname [lindex $args $idx] } -ORBConnectionIdleTimeout { incr idx set ::Combat::GIOP::idleTimeout [lindex $args $idx] } -ORBSendCancelRequestMessage { incr idx set ::Combat::GIOP::sendCancelRequest [lindex $args $idx] } -ORB* { error "illegal -ORB* option: [lindex $args $idx]" } default { lappend rest [lindex $args $idx] } } } # # Init Subsystems. Server side is initialized when -ORBServer is # present; otherwise, server-side initialization is delayed until # the RootPOA initial reference is resolved. # ::Combat::CONV_FRAME::init $native_codeset if {$runserver} { init_server_side } # # Done # set ::Combat::initialized 1 return $rest } proc init_server_side {} { if {[info exists ::Combat::CORBA::ORB::ior_template]} { return } # # Initialize TCP Server # set profiles [list] set ::Combat::CORBA::ORB::iiop_servers [list] if {[llength $::Combat::CORBA::ORB::iiop_serverports] == 0} { set prof [namespace current]::[::Combat::IIOP::TCPServer \#auto] $prof listen lappend profiles [$prof profile] lappend ::Combat::CORBA::ORB::iiop_servers $prof } else { foreach port $::Combat::CORBA::ORB::iiop_serverports { set prof [namespace current]::[::Combat::IIOP::TCPServer \#auto] $prof listen $port lappend profiles [$prof profile] lappend ::Combat::CORBA::ORB::iiop_servers $prof } } # # Setup code set profile, speaking ISO 8859-1 and ISO 10646-1 (UTF-16) # set csinfo [::Combat::CONV_FRAME::MakeCodeSetInfo] set mcp [namespace current]::[::Combat::IOP::MultipleComponentProfile \#auto] $mcp configure -components [list $csinfo] lappend profiles $mcp # # Init IOR Template # set ::Combat::CORBA::ORB::ior_template \ [namespace current]::[::Combat::IOP::IOR \#auto] $::Combat::CORBA::ORB::ior_template configure -profiles $profiles # # Init Portable Server module # ::Combat::PortableServer::init } # # corba::resolve_initial_references # proc resolve_initial_references {name} { ::corba::init if {$name == "RootPOA" || $name == "POACurrent"} { init_server_side } if {[info exists ::Combat::CORBA::ORB::initial_pseudo_references($name)]} { return $::Combat::CORBA::ORB::initial_pseudo_references($name) } if {[info exists ::Combat::CORBA::ORB::initial_references($name)]} { return [string_to_object \ $::Combat::CORBA::ORB::initial_references($name)] } if {$name == "CodecFactory"} { set ::Combat::CORBA::ORB::initial_pseudo_references(CodecFactory) \ [namespace current]::[::Combat::IOP::CodecFactory \#auto] return $::Combat::CORBA::ORB::initial_pseudo_references(CodecFactory) } if {$::Combat::CORBA::ORB::default_init_ref != ""} { set ref "[set ::Combat::CORBA::ORB::default_init_ref]/$name" if {![catch {set res [string_to_object $ref]}]} { return $res } } corba::throw [list IDL:omg.org/CORBA/ORB/InvalidName:1.0 \ [list no_such_initial_reference $name]] } # # corba::list_initial_services # proc list_initial_services {} { ::corba::init set refs [list] if {[info exists ::Combat::CORBA::ORB::initial_pseudo_references]} { set refs [concat $refs [array names ::Combat::CORBA::ORB::initial_references]] if {![info exists ::Combat::CORBA::ORB::initial_pseudo_references(CodecFactory)]} { lappend refs "CodecFactory" } } else { lappend refs "CodecFactory" } if {[info exists ::Combat::CORBA::ORB::initial_references]} { set refs [concat $refs [array names ::Combat::CORBA::ORB::initial_references]] } return $refs } # # corba::register_initial_reference # proc register_initial_reference {id obj} { ::corba::init set ::Combat::CORBA::ORB::initial_references($id) \ [object_to_string $obj] } # # corba::throw # proc throw {ex} { set l [llength $ex] if {$l == 1} { error [::Combat::SimpleTypeRepository::getRepoid [lindex $ex 0]] } elseif {$l == 2} { set rid [::Combat::SimpleTypeRepository::getRepoid [lindex $ex 0]] error [list $rid [lindex $ex 1]] } else { error $ex } } # # corba::try ?catch {exception ?var?} block? ... ?finally block? # proc try {block args} { set code [catch {uplevel 1 $block} res] if {$code == 1} { if {[catch {set exid [::Combat::SimpleTypeRepository::getRepoid [lindex $res 0]]}]} { set exid "..." } set hascatch 0 foreach {name exception cblock} $args { if {$name == "catch"} { set hascatch 1 set repoid [lindex $exception 0] if {$repoid == "..." || [::Combat::SimpleTypeRepository::getRepoid $repoid] == $exid} { set varname [lindex $exception 1] if {$varname != ""} { uplevel 1 "set $varname \{$res\}" } set code [catch {uplevel 1 $cblock} res] break } } } if {!$hascatch} { set code 0 } } foreach {name fblock dummy} $args { if {$name == "finally"} { catch {uplevel 1 $fblock} break } } return -code $code $res } # # helpers # proc url_decode {str} { set res "" set beg 0 set end [string first % $str] while {$end != -1} { append res [string range $str $beg [expr {$end - 1}]] append res [binary format H [string range $str \ [expr {$end + 1}] [expr {$end + 2}]]] set beg [expr {$end + 3}] set end [string first % $str $beg] } append res [string range $str $beg end] return $res } proc ior_to_object {str} { set ior [::Combat::IOP::DestringifyIOR $str] set obj [namespace current]::[::Combat::CORBA::Object \#auto] $obj configure -ior $ior return [::Combat::CORBA::ORB::MakeObjProc $obj] } proc corbaloc_to_object {str} { set pos [string first / $str] if {$pos == -1} { set obj_addr_list [split [string range $str 9 end] ,] set key_string "" } else { set obj_addr_list [split [string range $str \ 9 [expr {$pos - 1}]] ,] set key_string [url_decode [string range $str \ [expr {$pos + 1}] end]] } if {[string range [lindex $obj_addr_list 0] 0 3] == "rir:"} { if {[llength $obj_addr_list] > 1} { throw IDL:omg.org/CORBA/BAD_PARAM:1.0 } if {$key_string == ""} { set key_string "NameService" } return [resolve_initial_references $key_string] } if {[llength $obj_addr_list] == 0} { throw IDL:omg.org/CORBA/BAD_PARAM:1.0 } set profiles [list] foreach obj_addr $obj_addr_list { if {[string range $obj_addr 0 0] == ":"} { set iiop_addr [string range $obj_addr 1 end] } elseif {[string range $obj_addr 0 4] == "iiop:"} { set iiop_addr [string range $obj_addr 5 end] } else { throw IDL:omg.org/CORBA/BAD_PARAM:1.0 } set pos [string first @ $iiop_addr] if {$pos != -1} { set version [string range $iiop_addr 0 [expr {$pos - 1}]] set iiop_addr [string range $iiop_addr \ [expr {$pos + 1}] end] } else { set version "1.0" } set pos [string first : $iiop_addr] if {$pos != -1} { set port [string range $iiop_addr \ [expr {$pos + 1}] end] set iiop_addr [string range $iiop_addr \ 0 [expr {$pos - 1}]] } else { set port 2089 } set host $iiop_addr scan $version "%d.%d" major_version minor_version # # add IIOP Profile # set prof [namespace current]::[::Combat::IIOP::ProfileBody \#auto] $prof configure -major_version $major_version \ -minor_version $minor_version \ -host $host -port $port \ -object_key $key_string lappend profiles $prof } set ior [namespace current]::[::Combat::IOP::IOR \#auto] set obj [namespace current]::[::Combat::CORBA::Object \#auto] $ior configure -profiles $profiles $obj configure -ior $ior return [::Combat::CORBA::ORB::MakeObjProc $obj] } proc corbaname_to_object {str} { set pos [string first # $str] if {$pos == -1} { set corbaloc_obj "corbaloc:[string range $str 10 end]" set url_name "" } else { set corbaloc_obj "corbaloc:[string range $str 10 [expr {$pos - 1}]]" set url_name [string range $str [expr {$pos + 1}] end] } if {[string first / $corbaloc_obj] == -1} { append corbaloc_obj "/NameService" } set nsref [string_to_object $corbaloc_obj] if {$url_name == ""} { return $nsref } set string_name [url_decode $url_name] # # Ask Naming Service by DII # set nsobj [::Combat::CORBA::ORB::GetObjFromRef $nsref] set res [::Combat::CORBA::ORB::invoke_sync 1 $nsobj resolve_str \ Object 0 {{in string}} [list $string_name]] release $nsref return $res } proc file_to_object {str} { set idx [string first / $str 7] if {$idx == -1} { error "illegal URL: $str" } set host [url_decode [string range $str 7 [expr {$idx - 1}]]] set name [url_decode [string range $str $idx end]] # # accept file://:/path # if {[string length $host] == 2 && \ [string is alpha [string index $host 0]] && \ [string index $host 1] == ":"} { set name "$host$name" set host "" } if {$host != "" && $host != "localhost" && \ $host != [info hostname]} { set name "//$host$file" } # # accept file:///drive:/path # if {[string length $name] > 3 && \ [string index $name 0] == "/" && \ [string is alpha [string index $name 1]] && \ [string index $name 2] == ":" && \ [string index $name 3] == "/"} { set name [string range $name 1 end] } set file [open $name] set ior [read -nonewline $file] close $file return [string_to_object $ior] } proc http_to_object {str} { package require http set token [::http::geturl $str] if {[::http::status $token] != "ok"} { ::http::cleanup $token throw IDL:omg.org/CORBA/BAD_PARAM:1.0 } set ior [::http::data $token] ::http::cleanup $token return [string_to_object $ior] } # # corba::string_to_object # proc string_to_object {str} { ::corba::init set str [string trim $str] if {[string range $str 0 3] == "IOR:"} { return [ior_to_object $str] } elseif {[string range $str 0 8] == "corbaloc:"} { return [corbaloc_to_object $str] } elseif {[string range $str 0 9] == "corbaname:"} { return [corbaname_to_object $str] } elseif {[string range $str 0 6] == "file://"} { return [file_to_object $str] } elseif {[string range $str 0 6] == "http://"} { return [http_to_object $str] } else { throw IDL:omg.org/CORBA/BAD_PARAM:1.0 } } # # corba::object_to_string # proc object_to_string {ref} { ::corba::init set obj [::Combat::CORBA::ORB::GetObjFromRef $ref] set ior [$obj cget -ior] return [$ior stringify] } # # corba::dii ?-async? ref spec args # # spec: [list returntype opname params exceptions] # proc dii {args} { return [eval ::Combat::CORBA::ORB::dii_invoke $args] } # # corba::request # proc request {cmd args} { ::corba::init switch -- $cmd { get { if {[llength $args] != 1} { error "usage: corba::request get ref" } set aid [lindex $args 0] return [::Combat::CORBA::ORB::get_async_reply $aid 1] } cancel { foreach aid $args { ::Combat::CORBA::ORB::cancel_async_request $aid } return "" } poll { foreach aid $args { if {[::Combat::CORBA::ORB::poll_async_reply $aid]} { return $aid } } return "" } wait { if {[llength $args] == 0} { set args [array names ::Combat::CORBA::ORB::reqids_completed] if {[llength $args] == 0} { return "" } } while {42} { foreach aid $args { if {[::Combat::CORBA::ORB::poll_async_reply $aid]} { return $aid } } vwait ::Combat::CORBA::ORB_conn_cond } error "oops, I shouldn't be here." } default { error "usage: corba::request get, poll or wait" } } } # # corba::release ref Release the object reference # corba::release tc value Traverse the TypeCode and release all # object references within the value # proc release {args} { if {[llength $args] != 1 && [llength $args] != 2} { error "usage: corba::release or corba::release " } if {[llength $args] == 1} { if {[lindex $args 0] == 0} { return } ::Combat::CORBA::ORB::ReleaseRef [lindex $args 0] return } set tc [lindex $args 0] set value [lindex $args 1] switch -- $tc { void - boolean - short - long - {unsigned short} - {unsigned long} - {long long} - {unsigned long long} - float - double - {long double} - char - octet - wchar - string - wstring - TypeCode { } any { release [lindex $value 0] [lindex $value 1] } } set type [lindex $tc 0] switch -- $type { enum - string - wstring { return } struct { set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc set members [lindex $tc 2] foreach {member_name member_value} $value { set map($member_name) $member_value } foreach {member_name member_type} $members { release $member_type $map($member_name) } catch {unset map} catch {unset marshalrecursion($repoid)} } union { # groan } exception { foreach {member_name member_value} [lindex $value 1] { set map($member_name) $member_value } foreach {member_name member_type} [lindex $tc 2] { release $member_type $map($member_name) } catch {unset map} } sequence - array { set type [lindex $tc 1] if {$type == "char" || $type == "octet"} { return } foreach element $value { release $type $element } } Object { release $value } ValueType { if {$value == 0} { return } set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc foreach {member_name member_value} $value { set map($member_name) $member_value } if {[info exists map(_tc_)]} { set marshaltc $map(_tc_) } else { set marshaltc $tc } set itc $marshaltc set tcs [list] while {$itc != 0} { set tcs [linsert $tcs 0 $itc] set itc [lindex $itc 3] } foreach mtc $tcs { foreach {visi member_name member_type} [lindex $mtc 2] { release $member_type $map($member_name) } } catch {unset map} catch {unset marshalrecursion($repoid)} } ValueBox { if {$value == 0} { return } release [lindex $tc 2] $value } recursive { set repoid [lindex $tc 1] set savetc $marshalrecursion($repoid) release $marshalrecursion($repoid) $value set marshalrecursion($repoid) $savetc return $res } } } # # corba::duplicate ref Duplicate the object reference # corba::duplicate tc value Traverse the TypeCode and dup all # object references within the value # proc duplicate {args} { if {[llength $args] != 1 && [llength $args] != 2} { error "usage: corba::duplicate or corba::duplicate " } if {[llength $args] == 1} { if {[lindex $args 0] == 0} { return 0 } return [[lindex $args 0] _duplicate] } set tc [lindex $args 0] set value [lindex $args 1] switch -- $tc { void - boolean - short - long - {unsigned short} - {unsigned long} - {long long} - {unsigned long long} - float - double - {long double} - char - octet - wchar - string - wstring - TypeCode { return $value } any { return [list [lindex $value 0] \ [duplicate [lindex $value 0] [lindex $value 1]]] } } set type [lindex $tc 0] switch -- $type { enum - string - wstring { return } struct { set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc set members [lindex $tc 2] foreach {member_name member_value} $value { set map($member_name) $member_value } set result [list] foreach {member_name member_type} $members { lappend result $member_name \ [duplicate $member_type $map($member_name)] } catch {unset map} catch {unset marshalrecursion($repoid)} return $result } union { # groan } exception { foreach {member_name member_value} [lindex $value 1] { set map($member_name) $member_value } set result [list] foreach {member_name member_type} [lindex $tc 2] { lappend result $member_name \ [duplicate $member_type $map($member_name)] } catch {unset map} return $result } sequence - array { set type [lindex $tc 1] if {$type == "char" || $type == "octet"} { return $value } set result [list] foreach element $value { lappend result [duplicate $type $element] } return $result } Object { return [$value _duplicate] } ValueType { if {$value == 0} { return } set repoid [lindex $tc 1] set marshalrecursion($repoid) $tc foreach {member_name member_value} $value { set map($member_name) $member_value } if {[info exists map(_tc_)]} { set marshaltc $map(_tc_) } else { set marshaltc $tc } set itc $marshaltc set tcs [list] while {$itc != 0} { set tcs [linsert $tcs 0 $itc] set itc [lindex $itc 3] } set result [list] foreach mtc $tcs { foreach {visi member_name member_type} [lindex $mtc 2] { lappend result $member_name \ [duplicate $member_type $map($member_name)] } } if {[info exists map(_tc_)]} { lappend result _tc_ $map(_tc_) } catch {unset map} catch {unset marshalrecursion($repoid)} return $result } ValueBox { if {$value == 0} { return } return [duplicate [lindex $tc 2] $value] } recursive { set repoid [lindex $tc 1] set savetc $marshalrecursion($repoid) set res [duplicate $marshalrecursion($repoid) $value] set marshalrecursion($repoid) $savetc return $res } } } proc check_type_equivalence {value1 value2} { set tckind1 [lindex $value1 0] if {$value1 == "unsigned short" || \ $value1 == "unsigned long" || \ $value1 == "long long" || \ $value1 == "unsigned long long" || \ $value1 == "long double"} { set tckind1 $value1 } set tckind2 [lindex $value2 0] if {$value2 == "unsigned short" || \ $value2 == "unsigned long" || \ $value2 == "long long" || \ $value2 == "unsigned long long" || \ $value2 == "long double"} { set tckind2 $value1 } if {$tckind1 != $tckind2} { return 0 } switch -- $tckind1 { struct - union - exception - Object { set repoid1 [lindex $value1 1] set repoid2 [lindex $value2 1] if {$repoid1 != "" && $repoid2 != ""} { if {$repoid1 == $repoid2} { return 1 } else { return 0 } } } } switch -- $tckind1 { string - wstring { if {[lindex $value1 1] != [lindex $value2 1]} { return 0 } } fixed { if {[lindex $value1 1] != [lindex $value2 1] || \ [lindex $value1 2] != [lindex $value2 2]} { return 0 } } recursive { if {[lindex $value1 1] != [lindex $value2 1]} { return 0 } } struct - exception { set members1 [lindex $value1 2] set members2 [lindex $value2 2] if {[llength $members1] != [llength $members2]} { return 0 } for {set idx 1} {$idx < [llength $members1]} {incr idx 2} { set member_type1 [lindex $members1 $idx] set member_type2 [lindex $members2 $idx] if {![check_type_equivalence $member_type1 $member_type2]} { return 0 } } } union { set disctype1 [lindex $value1 2] set disctype2 [lindex $value2 2] set members1 [lindex $value1 3] set members2 [lindex $value2 3] if {$disctype1 != $disctype2} { return 0 } if {[llength $members1] != [llength $members2]} { return 0 } for {set idx 0} {$idx < [llength $members1]} {incr idx} { set member_label1 [lindex $members1 $idx] set member_label2 [lindex $members2 $idx] if {$member_label1 != $member_label2} { return 0 } incr idx set member_type1 [lindex $members1 $idx] set member_type2 [lindex $members2 $idx] if {![check_type_equivalence $member_type1 $member_type2]} { return 0 } } } enum { set members1 [lindex $value1 1] set members2 [lindex $value2 1] if {[llength $members1] != [llength $members2]} { return 0 } for {set idx 0} {$idx < [llength $members1]} {incr idx} { if {[lindex $members1 $idx] != [lindex $members2 $idx]} { return 0 } } } sequence - array { if {[llength $value1] == 3} { set bound1 [lindex $value1 2] } else { set bound1 0 } if {[llength $value2] == 3} { set bound2 [lindex $value2 2] } else { set bound2 0 } if {$bound1 != $bound2} { return 0 } if {![check_type_equivalence [lindex $value1 1] [lindex $value2 1]]} { return 0 } } default { error "oops: $tckind1" } } return 1 } # # corba::type # proc type {cmd args} { ::corba::init switch -- $cmd { of { if {[llength $args] != 1} { error "usage: corba::type of " } if {![catch { set type [::Combat::SimpleTypeRepository::getTypeOf $args] }]} { return $type } # # try to download type from IFR # set ifr [::corba::resolve_initial_references InterfaceRepository] set ifrobj [::Combat::CORBA::ORB::GetObjFromRef $ifr] if {[catch { set contained [::Combat::CORBA::ORB::invoke_sync 1 \ $ifrobj lookup_id Object 0 {{in string}} $args] } res]} { set contained 0 } if {$contained == 0} { if {[catch { set contained [::Combat::CORBA::ORB::invoke_sync 1 \ $ifrobj lookup Object 0 {{in string}} $args] } res]} { set contained 0 } } if {$contained == 0} { ::corba::release $ifr error "unable to find type $args in Interface Repository" } set cobj [::Combat::CORBA::ORB::GetObjFromRef $contained] if {[catch { set type [::Combat::CORBA::ORB::invoke_sync 1 \ $cobj _get_type TypeCode 0 {} {}] }]} { ::corba::release $contained ::corba::release $ifr error "not an IDL type: $args" } ::corba::release $contained ::corba::release $ifr return $type } match { if {[llength $args] != 2} { error "usage: corba::type match " } set enc [::Combat::CDR::Encoder \#auto] if {[catch { $enc Marshal [lindex $args 0] [lindex $args 1] } res]} { itcl::delete object $enc return 0 } itcl::delete object $enc return 1 } equivalent { if {[llength $args] != 2} { error "usage: corba::type equivalent " } return [check_type_equivalence \ [lindex $args 0] [lindex $args 1]] } default { error "usage: corba::type of, match or equivalent" } } } # # corba::const # proc const {rors} { ::corba::init if {![catch { set value [::Combat::SimpleTypeRepository::getConst $rors] }]} { return $value } # # try to download type from IFR # set ifr [::corba::resolve_initial_references InterfaceRepository] set ifrobj [::Combat::CORBA::ORB::GetObjFromRef $ifr] if {[catch { set contained [::Combat::CORBA::ORB::invoke_sync 1 \ $ifrobj lookup_id Object 0 {{in string}} [list $rors]] } res]} { set contained 0 } if {$contained == 0} { if {[catch { set contained [::Combat::CORBA::ORB::invoke_sync 1 $ifrobj \ lookup Object 0 {{in string}} [list $rors]] } res]} { set contained 0 } } if {$contained == 0} { ::corba::release $ifr error "unable to find constant $rors in Interface Repository" } set cobj [::Combat::CORBA::ORB::GetObjFromRef $contained] if {[catch { set value [::Combat::CORBA::ORB::invoke_sync 1 \ $cobj _get_value any 0 {} {}] }]} { ::corba::release $contained ::corba::release $ifr error "not a constant: $rors" } ::corba::release $contained ::corba::release $ifr return $value } variable features array set features { core 0.8 async 0.8 callback 0.8 type 0.8 poa 0.8 dii 0.8 combat::ir 0.8 } # # corba::feature # proc feature {cmd args} { variable features switch -- $cmd { names { return [list core async callback type combat::ir] } require { if {[lindex $args 0] == "-exact"} { set exact 1 set args [lrange $args 1 end] } else { set exact 0 } if {[llength $args] == 1} { set feature [lindex $args 0] set version "0.0" } elseif {[llength $args] == 2} { set feature [lindex $args 0] set version [lindex $args 1] } else { error "usage: corba::feature require ?-exact? feature ?version?" } if {![info exists features($feature)]} { error "corba::feature not available: $feature" } if {[llength $args] == 1} { return 1 } if {$exact} { if {$version != $features($feature)} { error "corba::feature version mismatch: $version requested, $features($feature) available" } return 1 } set comp [::package vcompare $version $features($feature)] if {$comp == 1} { error "corba::feature version mismatch: $version requested, $features($feature) available" } elseif {$comp == -1 && [string index $features($feature) 0] == "0"} { error "corba::feature version mismatch: $version requested, $features($feature) available" } return 1 } default { error "usage: corba::feature names or require" } } } } combat-0.8.1/orb/giop.tcl0000700000175000010010000012442111517354573013274 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: giop.tcl,v 1.29 2011-01-24 19:56:43 fp Exp $ # # ---------------------------------------------------------------------- # Manage GIOP Connections # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval GIOP { # # The maximum GIOP message size in bytes. We refuse messages # that are larger than this, avoiding denial of service issues # when a client sends huge messages that would consume all # local memory. No limit if the value is 0. # variable ORBGIOPMaxSize 0 # # Idle connection timeout. After this time (in milliseconds), # the connection is closed if no activity occurs. If 0, the # timeout is infinite. # variable idleTimeout 3600000 # # Timeout (in milliseconds) to keep the connection alive when # it is not in use. # variable keepAliveTimeout 1000 # # Whether to send CancelRequest messages to a server when a # request is canceled or times out. The default should be 1, # but some ORBs don't like them and close the connection # when seeing one. # variable sendCancelRequest 1 itcl::class Conn { protected variable keepalive_token protected variable timeout_token protected variable connected protected variable peer protected variable active_requests private variable refs private variable major_version private variable minor_version private variable isclient private variable id public variable broken # # global conn id # private common connids 0 public variable connid # # en/decoder for char and wchar codeset # private variable cndone ;# whether Codeset Negotiation private variable ccodec ;# has been done yet private variable wcodec # # info for the messages read, indexed by id # private variable callbacks private variable reply_status private variable reply_contexts private variable reply_decoder # # info for the data we're currently reading # private variable pending_minor private variable pending_major private variable pending_flags private variable pending_byteorder private variable pending_fragment private variable pending_type private variable pending_size private variable pending_header private variable pending_message # # received fragments # private variable pending_frag_size private variable pending_fragments # # Methods # constructor {major minor client} { set connected 0 set peer "" set active_requests 0 set major_version $major set minor_version $minor set isclient $client set pending_header "" set broken 0 set refs 1 set id 0 set cndone 0 set ccodec "" set wcodec "" set connid [incr connids] set pending_frag_size 0 if {$::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } else { set timeout_token "" } set keepalive_token "" } destructor { if {$ccodec != ""} { itcl::delete object $ccodec } if {$wcodec != ""} { itcl::delete object $wcodec } if {$timeout_token != ""} { after cancel $timeout_token } if {$keepalive_token != ""} { after cancel $keepalive_token } } public method close {} { error "pure virtual" } public method send {data} { error "pure virtual" } public method recv {length} { error "pure virtual" } public method size {} { error "pure virtual" } public method listen {cb} { error "pure virtual" } public method ref {} { incr refs if {$refs == 1 && $keepalive_token != ""} { after cancel $keepalive_token } } public method deref {} { incr refs -1 if {$refs == 0} { if {$::Combat::GIOP::keepAliveTimeout} { set keepalive_token [after $::Combat::GIOP::keepAliveTimeout "$this keepalive_timeout_callback"] } else { itcl::delete object $this } } } # # Send a GIOP request # public method send_request {response_expected object \ operation plevel params values {contexts {}} \ {callback {}}} { # # Bump up id, get buffer # set theid [incr id] set encoder [::Combat::CDR::Encoder \#auto] set buffer [$encoder get_buffer] # # Build message header, with a dummy message length at # first. We must do this here to get our alignment right. # set header [binary format a4ccccI \ GIOP \ $major_version $minor_version \ [$buffer cget -byteorder] 0 0] $buffer octets $header # # Do codeset negotiation upon first request # if {!$cndone} { set csi [$object cget -CodeSetInfo] if {$major_version == 1 && $minor_version == 0} { # # no codeset negotiation for GIOP 1.0 # } elseif {$csi == ""} { # # backwards compatibility using ISO 8859-1 # } else { set tcsc [::Combat::CONV_FRAME::findTransCodeSet char \ [$csi cget -char_native_code_set] \ [$csi cget -char_conversion_code_sets]] set tcsw [::Combat::CONV_FRAME::findTransCodeSet wchar\ [$csi cget -wchar_native_code_set] \ [$csi cget -wchar_conversion_code_sets]] if {$::Combat::debug(giop)} { puts stderr "GIOP: Codeset Negotiation with $peer:" if {$tcsc == 0} { puts stderr "GIOP: TCS-C: $tcsc (native)" } else { puts stderr "GIOP: TCS-C: $tcsc ([lindex $::Combat::CONV_FRAME::codesets($tcsc) 1])" } if {$tcsw == 0} { puts stderr "GIOP: TCS-W: $tcsw (native)" } else { puts stderr "GIOP: TCS-W: $tcsw ([lindex $::Combat::CONV_FRAME::codesets($tcsw) 1])" } } set ccodec [::Combat::CONV_FRAME::getConverter \ $major_version $minor_version $tcsc] set wcodec [::Combat::CONV_FRAME::getConverter \ $major_version $minor_version $tcsw] # # attach CodeSetContext # set csc [namespace current]::[::Combat::CONV_FRAME::CodeSetContext \#auto] $csc configure -char_data $tcsc -wchar_data $tcsw lappend contexts $csc } set cndone 1 } # # Build request header # if {$major_version == 1 && \ ($minor_version == 0 || $minor_version == 1)} { $buffer ulong [llength $contexts] ;# service contexts foreach context $contexts { $context marshal $buffer } $buffer ulong $theid ;# request_id $buffer boolean $response_expected $buffer octets "\0\0\0" ;# reserved set object_key [$object cget -object_key] $buffer ulong [string length $object_key] $buffer octets $object_key $buffer string $operation $buffer ulong 0 ;# principal } elseif {$major_version == 1 && $minor_version == 2} { $buffer ulong $theid ;# request_id if {$response_expected} { $buffer octet "\3" } else { $buffer octet "\0" } $buffer octets "\0\0\0" ;# reserved switch [$object cget -AddressingDisposition] { 0 { # KeyAddr $buffer short 0 set object_key [$object cget -object_key] $buffer ulong [string length $object_key] $buffer octets $object_key } 1 { # ProfileAddr $buffer short 1 set ior [$object get_fwd_ior] set profile [lindex \ [$ior cget -profiles] \ [$object cget -profile_index]] $profile marshal $buffer } 2 { # ReferenceAddr $buffer short 2 $buffer ulong [$object cget -profile_index] set ior [$object get_fwd_ior] $ior marshal $buffer } default { error "illegal addressing disposition \ [$object cget -AddressingDisposition]" } } $buffer string $operation $buffer ulong [llength $contexts] ;# service contexts foreach context $contexts { $context marshal $buffer } } else { error "unknown GIOP version $major.$minor" } # # GIOP 1.2 request body needs extra alignment # if {$major_version == 1 && $minor_version == 2} { $buffer align 8 } # # Switch buffer from ISO-8859-1 to the negotiated charset # $buffer configure -cencoder $ccodec -wencoder $wcodec # # Request body # incr plevel if {[catch { for {set idx 0} {$idx < [llength $params]} {incr idx} { set param [lindex $params $idx] set value [lindex $values $idx] if {[llength $param] == 8} { # # It's a ParameterDescription # set dir [lindex $param 7] set type [lindex $param 3] } else { # # It's a simple list with the direction and type # set dir [lindex $param 0] set type [lindex $param 1] } switch -- $dir { PARAM_IN - in { $encoder Marshal $type $value } PARAM_INOUT - inout { upvar $plevel $value pdata $encoder Marshal $type $pdata } PARAM_OUT - out { } default { error "unknown parameter direction: $dir" } } } } err]} { if {$::Combat::debug(giop)} { global errorInfo puts stderr "GIOP: marshalling error for $operation: $err" puts $errorInfo } itcl::delete object $encoder ::corba::throw [list IDL:omg.org/CORBA/MARSHAL:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } # # Get data and fiddle in the data length; we must substract # the length of the GIOP header (12 bytes). # set data [$buffer get_data] set data_length [expr {[string length $data] - 12}] if {[$buffer cget -byteorder] == 0} { set data [string replace $data 8 11 \ [binary format I $data_length]] } else { set data [string replace $data 8 11 \ [binary format i $data_length]] } # # Send request # if {$::Combat::debug(giop)} { puts stderr "GIOP: sending request to $peer, id is $theid" } if {$::Combat::debug(transport)} { ::Combat::DumpOctets Request $data } if {$response_expected} { incr active_requests set reply_status($theid) -1 } if {$timeout_token != ""} { after cancel $timeout_token set timeout_token "" } if {!$active_requests && $::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } catch { send $data } # # Delete encoder and CodeSetContext # itcl::delete object $encoder if {[info exists csc]} { itcl::delete object $csc set cndone 1 } # # arrange to call callback # if {$callback != "" && $response_expected} { if {$broken == 1} { after 0 "$callback 2" } elseif {$broken == -1} { after 0 "$callback 3" } else { set callbacks($id) $callback } } # # done return # return $theid } # # Decipher a reply # public method receive_reply {theid rtype plevel \ params values exceptions {contexts {}}} { # # Wait until reply is there or until conn is broken # if {[info exists reply_status($theid)] && \ $reply_status($theid) == -1 && !$broken} { vwait [itcl::scope reply_status($theid)] } if {![info exists reply_status($theid)]} { # # Most likely, we were canceled. # error "no such request: $theid" } # # One less request is active # incr active_requests -1 if {!$active_requests && $::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } # # Handle broken connection # if {$reply_status($theid) == -1} { unset reply_status($theid) if {$broken == 1} { # # CloseConnection received. Outstanding messages # were not processed and may be safely resent on # a new connection # return 3 ;# LOCATION_FORWARD } else { # # Connection closure without receiving CloseConn. # Assume an abortive disconnect, treat as error. # Report COMM_FAILURE for all pending requests # on the connection, with completion_status values # set to COMPLETED_MAYBE # return [list 2 [list \ IDL:omg.org/CORBA/COMM_FAILURE:1.0 \ [list minor_code_value 0 \ completion_status COMPLETED_MAYBE]]] } } # # Got a reply # set decoder $reply_decoder($theid) set thestatus $reply_status($theid) incr plevel if {$contexts != ""} { upvar $plevel $contexts cvar set cvar $reply_contexts($theid) } else { foreach context $reply_contexts($theid) { itcl::delete object $context } } unset reply_decoder($theid) unset reply_status($theid) unset reply_contexts($theid) set return_value "" if {[catch { switch -- $thestatus { 0 { # NO_EXCEPTION set res [$decoder Demarshal $rtype] for {set idx 0} {$idx < [llength $params]} {incr idx} { set param [lindex $params $idx] set value [lindex $values $idx] if {[llength $param] == 8} { # # It's a ParameterDescription # set dir [lindex $param 7] set type [lindex $param 3] } else { # # It's a simple list with the direction and type # set dir [lindex $param 0] set type [lindex $param 1] } switch -- $dir { PARAM_IN - in { } PARAM_INOUT - PARAM_OUT - inout - out { upvar $plevel $value pdata set pdata [$decoder Demarshal $type] } } } set return_value [list 0 $res] } 1 { # USER_EXCEPTION # # Peek for repoid # set buffer [$decoder get_buffer] set pos [$buffer tell] set repoid [$buffer string] $buffer seek $pos set data "" foreach exception $exceptions { if {[llength $exception] == 10} { # # It's an ExceptionDescription # set exrid [lindex $exception 3] set extype [lindex $exception 9] } else { # # It's an exception typecode # set exrid [lindex $exception 1] set extype $exception } if {$repoid == $exrid} { set data [$decoder Demarshal $extype] break } } if {$data == ""} { set data "IDL:omg.org/CORBA/UnknownUserException:1.0" } set return_value [list 1 $data] } 2 { # SYSTEM_EXCEPTION set buffer [$decoder get_buffer] set repoid [$buffer string] set minor_code_value [$buffer ulong] switch [$buffer ulong] { 0 { set completion_status COMPLETED_YES } 1 { set completion_status COMPLETED_NO } 2 { set completion_status COMPLETED_MAYBE } default { set completion_status oops } } set return_value [list 2 [list $repoid \ [list minor_code_value $minor_code_value \ completion_status $completion_status]]] } 3 - 4 { # LOCATION_FORWARD, LOCATION_FORWARD_PERM set buffer [$decoder get_buffer] set ior [::Combat::IOP::DemarshalIOR $buffer] set return_value [list $thestatus $ior] } default { error "unknown GIOP reply status $thestatus" } } } err]} { if {$::Combat::debug(giop)} { global errorInfo puts stderr "GIOP: error demarshalling reply: $err" puts $errorInfo } set return_value [list 2 \ [list IDL:omg.org/CORBA/MARSHAL:1.0 \ [list minor 0 completion_status COMPLETED_YES]]] } itcl::delete object $decoder return $return_value } # # Check for a request's completion # public method poll_reply {theid} { if {$broken == 1} { return 3 } elseif {$broken == -1} { return 2 } if {![info exists reply_status($theid)]} { error "no such request: $theid" } # # May be -1. # return $reply_status($theid) } # # Cancel a request # public method cancel_request {theid} { if {![info exists reply_status($theid)]} { error "no such request: $theid" } if {$::Combat::debug(giop)} { puts stderr "GIOP: canceling request $theid with $peer" } unset reply_status($theid) if {[info exists reply_decoder($theid)]} { itcl::delete object $reply_decoder($theid) unset reply_decoder($theid) } if {[info exists reply_contexts($theid)]} { foreach context $reply_contexts($theid) { itcl::delete object $context } unset reply_contexts($theid) } if {[info exists callbacks($theid)]} { unset callbacks($theid) } if {$::Combat::GIOP::sendCancelRequest} { # # Send CancelRequest message # if {$::tcl_platform(byteOrder) == "bigEndian"} { set data [binary format a4ccccII \ GIOP \ $major_version $minor_version \ 0 2 4 $theid] } else { set data [binary format a4ccccii \ GIOP \ $major_version $minor_version \ 1 2 4 $theid] } if {$::Combat::debug(giop)} { puts stderr "GIOP: sending CancelRequest message to $peer for id $theid" } if {$::Combat::debug(transport)} { ::Combat::DumpOctets Cancel $data } catch { send $data } } incr active_requests -1 if {!$active_requests && $::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } } # # Send a reply after finishing a request # public method send_reply {theid status rtype rvalue plevel \ params values {contexts {}}} { set encoder [::Combat::CDR::Encoder \#auto] set buffer [$encoder get_buffer] # # Build message header, with a dummy message length at # first. We must do this here to get our alignment right. # set header [binary format a4ccccI \ GIOP \ $major_version $minor_version \ [$buffer cget -byteorder] 1 0] $buffer octets $header # # Build reply header # if {$major_version == 1 && \ ($minor_version == 0 || $minor_version == 1)} { $buffer ulong [llength $contexts] foreach context $contexts { $context marshal $buffer } $buffer ulong $theid $buffer ulong $status } else { $buffer ulong $theid $buffer ulong $status $buffer ulong [llength $contexts] foreach context $contexts { $context marshal $buffer } } # # GIOP 1.2 request body needs extra alignment # if {$major_version == 1 && $minor_version == 2} { $buffer align 8 } # # Switch buffer from ISO-8859-1 to the negotiated charset # $buffer configure -cencoder $ccodec -wencoder $wcodec # # Reply body # incr plevel if {[catch { switch -- $status { 0 { # NO_EXCEPTION $encoder Marshal $rtype $rvalue for {set idx 0} {$idx < [llength $params]} {incr idx} { set param [lindex $params $idx] set value [lindex $values $idx] if {[llength $param] == 8} { # # It's a ParameterDescription # set dir [lindex $param 7] set type [lindex $param 3] } else { # # It's a simple list with the direction and type # set dir [lindex $param 0] set type [lindex $param 1] } switch -- $dir { PARAM_IN - in { } PARAM_INOUT - inout { upvar $plevel $value pdata $encoder Marshal $type $pdata } PARAM_OUT - out { upvar $plevel $value pdata $encoder Marshal $type $pdata } default { error "unknown parameter direction: $dir" } } } } 1 { # USER_EXCEPTION # # User exception's type and value must be given # instead of a reply # $encoder Marshal $rtype $rvalue } 2 { # SYSTEM_EXCEPTION # # Instead of a reply, we expect value to be the # exception, [list repo-id [list "minor" value # "completion_status" value]] # $buffer string [lindex $rvalue 0] $buffer ulong [lindex [lindex $rvalue 1] 1] switch -- [lindex [lindex $rvalue 1] 3] { COMPLETED_YES { $buffer ulong 0 } COMPLETED_NO { $buffer ulong 1 } COMPLETED_MAYBE { $buffer ulong 2 } default { # oops $buffer ulong 2 } } } 3 - 4 - 5 { # LOCATION_FORWARD # NEEDS_ADDRESSING_MODE # LOCATION_FORWARD_PERM error "reply status $status not supported" } } } err]} { if {$::Combat::debug(giop)} { global errorInfo puts stderr "GIOP: error marshalling reply: $err" puts $errorInfo } # # restart, send INTERNAL error # if {$status == 0} { set completion_status COMPLETED_YES } else { set completion_status COMPLETED_MAYBE } itcl::delete object $encoder send_reply $theid 2 dummy \ [list IDL:omg.org/CORBA/INTERNAL:1.0 \ [list minor 0 completion_status $completion_status]] \ 0 "" "" return } # # Get data and fiddle in the data length; we must substract # the length of the GIOP header (12 bytes). # set data [$buffer get_data] set data_length [expr {[string length $data] - 12}] if {[$buffer cget -byteorder] == 0} { set data [string replace $data 8 11 \ [binary format I $data_length]] } else { set data [string replace $data 8 11 \ [binary format i $data_length]] } # # Send reply # if {$::Combat::debug(giop)} { puts stderr "GIOP: sending reply for id $theid to $peer, status is $status" } if {$::Combat::debug(transport)} { ::Combat::DumpOctets Reply $data } incr active_requests -1 if {!$active_requests && $::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } catch { send $data } # # Delete encoder and CodeSetContext # itcl::delete object $encoder } # # Send a locate reply # public method send_locate_reply {theid status body} { set encoder [::Combat::CDR::Encoder \#auto] set buffer [$encoder get_buffer] # # Build message header, with a dummy message length at # first. We must do this here to get our alignment right. # set header [binary format a4ccccI \ GIOP \ $major_version $minor_version \ [$buffer cget -byteorder] 4 0] $buffer octets $header # # Build locate reply header # $buffer ulong $theid $buffer ulong $status # # GIOP 1.2 locate reply body does *not* need extra alignment # (issue 4314). # switch -- $status { 0 - 1 { # OBJCT_UNKNOWN # OBJECT_HERE # OK empty body } 4 { # LOC_SYSTEM_EXCEPTION $buffer string [lindex $body 0] $buffer ulong [lindex [lindex $body 1] 1] switch -- [lindex [lindex $body 1] 3] { COMPLETED_YES { $buffer ulong 0 } COMPLETED_NO { $buffer ulong 1 } COMPLETED_MAYBE { $buffer ulong 2 } default { # oops $buffer ulong 2 } } } default { error "oops" } } # # Get data and fiddle in the data length; we must substract # the length of the GIOP header (12 bytes). # set data [$buffer get_data] set data_length [expr {[string length $data] - 12}] if {[$buffer cget -byteorder] == 0} { set data [string replace $data 8 11 \ [binary format I $data_length]] } else { set data [string replace $data 8 11 \ [binary format i $data_length]] } # # Send reply # if {$::Combat::debug(giop)} { puts stderr "GIOP: sending locate reply for id $theid to $peer, status is $status" } if {$::Combat::debug(transport)} { ::Combat::DumpOctets LocReply $data } incr active_requests -1 if {!$active_requests && $::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } catch { send $data } # # Delete encoder and CodeSetContext # itcl::delete object $encoder } # # Find out the request id for which this is a reply, then file it # private method HandleIncomingReply {message} { binary scan $message @4ccc major minor flags set byteorder [expr {$flags & 1} ? 1 : 0] set decoder [::Combat::CDR::Decoder \#auto $message] set buffer [$decoder get_buffer] $buffer configure -byteorder $byteorder # # skip over 12 byte GIOP header # $buffer seek 12 # # Header depends on GIOP version # if {$major == 1 && ($minor == 0 || $minor == 1)} { set sccount [$buffer ulong] set contexts [list] for {set i 0} {$i < $sccount} {incr i} { lappend contexts [::Combat::IOP::DemarshalServiceContext $buffer] } set theid [$buffer ulong] set status [$buffer ulong] } elseif {$major == 1 && $minor == 2} { set theid [$buffer ulong] set status [$buffer ulong] set sccount [$buffer ulong] set contexts [list] for {set i 0} {$i < $sccount} {incr i} { lappend contexts [::Combat::IOP::DemarshalServiceContext $buffer] } $buffer align 8 } else { error "cannot decode GIOP $major $minor" } # # Switch buffer from ISO-8859-1 to the negotiated charset # $buffer configure -cdecoder $ccodec -wdecoder $wcodec # # File message # if {![info exists reply_status($theid)]} { if {$::Combat::debug(giop)} { puts stderr "GIOP: unexpected reply from $peer for id $theid" } foreach context $contexts { itcl::delete object $context } itcl::delete object $decoder } elseif {$reply_status($theid) == -1} { if {$::Combat::debug(giop)} { puts stderr "GIOP: reply from $peer for id $theid, status is $status" } set reply_status($theid) $status set reply_contexts($theid) $contexts set reply_decoder($theid) $decoder if {[info exists callbacks($theid)]} { set cb $callbacks($theid) unset callbacks($theid) uplevel #0 "$cb $status" } } else { if {$::Combat::debug(giop)} { puts stderr "GIOP: duplicate reply from $peer for id $theid" } foreach context $contexts { itcl::delete object $context } itcl::delete object $decoder } } private method HandleIncomingRequest {message} { binary scan $message @4ccc major minor flags set byteorder [expr {$flags & 1} ? 1 : 0] set decoder [namespace current]::[::Combat::CDR::Decoder \#auto $message] set buffer [$decoder get_buffer] $buffer configure -byteorder $byteorder # # skip over 12 byte GIOP header # $buffer seek 12 # # Header depends on GIOP version # if {$major == 1 && ($minor == 0 || $minor == 1)} { set sccount [$buffer ulong] set contexts [list] for {set i 0} {$i < $sccount} {incr i} { lappend contexts [::Combat::IOP::DemarshalServiceContext \ $buffer] } set request_id [$buffer ulong] if {[$buffer boolean]} { set response_flags 3 } else { set response_flags 0 } set olen [$buffer ulong] set object_key [$buffer octets $olen] set operation [$buffer string] set plength [$buffer ulong] set principal [$buffer octets $plength] } elseif {$major == 1 && $minor == 2} { set request_id [$buffer ulong] set response_flags_data [$buffer octet] binary scan $response_flags_data c response_flags set reserved [$buffer octets 3] set adressing_disposition [$buffer short] switch -- $adressing_disposition { 0 { # KeyAddr set klength [$buffer ulong] set object_key [$buffer octets $klength] } 1 { # ProfileAddr set profile [::Combat::IOP::DemarshalTaggedProfile $buffer] if {![$profile isa ::Combat::IIOP::ProfileBody]} { error "oops, expected IIOP Profile" } set object_key [$profile cget -object_key] itcl::delete object $profile } 2 { # ReferenceAddr set selected_profile_index [$buffer ulong] set ior [::Combat::IOP::DemarshalIOR $buffer] set profile [lindex [$ior cget -profiles] \ $selected_profile_index] set object_key [$profile cget -object_key] itcl::delete object $ior } } set operation [$buffer string] set sccount [$buffer ulong] set contexts [list] for {set i 0} {$i < $sccount} {incr i} { lappend contexts [::Combat::IOP::DemarshalServiceContext \ $buffer] } $buffer align 8 } else { error "cannot decode GIOP $major.$minor" } if {$::Combat::debug(giop)} { puts stderr "GIOP: incoming request from $peer as id $request_id" } # # If the client requests a GIOP version lower than the # one we're configured for, speak down to it # if {$major < $major_version || \ ($major == $major_version && $minor < $minor_version)} { set major_version $major set minor_version $minor } # # Do codeset negotiation upon first request # See if we've got a CodeSetContext # for {set i 0} {$i < [llength $contexts]} {incr i} { set context [lindex $contexts $i] if {[$context isa ::Combat::CONV_FRAME::CodeSetContext]} { break } } if {!$cndone} { if {$major_version == 1 && $minor_version == 0} { # # no codeset negotiation for GIOP 1.0 # } elseif {$i == [llength $contexts]} { # # didn't get a CodeSetContext # } else { set tcsc [$context cget -char_data] set tcsw [$context cget -wchar_data] if {$::Combat::debug(giop)} { puts stderr "GIOP: Codeset Negotiation with $peer:" if {$tcsc == 0} { puts stderr "GIOP: TCS-C: $tcsc (native)" } else { puts stderr "GIOP: TCS-C: $tcsc ([lindex $::Combat::CONV_FRAME::codesets($tcsc) 1])" } if {$tcsw == 0} { puts stderr "GIOP: TCS-W: $tcsw (native)" } else { puts stderr "GIOP: TCS-W: $tcsw ([lindex $::Combat::CONV_FRAME::codesets($tcsw) 1])" } } # # for ORBs that send a broken CodeSetContext, we # accept a zero TCS value. # if {$tcsc != 0} { set ccodec [::Combat::CONV_FRAME::getConverter \ $major_version $minor_version $tcsc] } if {$tcsw != 0} { set wcodec [::Combat::CONV_FRAME::getConverter \ $major_version $minor_version $tcsw] } } set cndone 1 } # # Count as an active request if a response is expected # if {$response_flags & 0x01} { incr active_requests 1 } if {$timeout_token != ""} { after cancel $timeout_token set timeout_token "" } if {!$active_requests && $::Combat::GIOP::idleTimeout} { set timeout_token [after $::Combat::GIOP::idleTimeout "$this idle_timeout_callback"] } # # GIOP 1.2 request body needs extra alignment # if {$major_version == 1 && $minor_version == 2} { $buffer align 8 } # # Switch buffer from ISO-8859-1 to the negotiated charset # $buffer configure -cdecoder $ccodec -wdecoder $wcodec # # Pass invocation to the ORB # ::Combat::CORBA::ORB::invoke $response_flags \ $this $request_id $object_key $operation \ $decoder $contexts } private method HandleIncomingLocateRequest {message} { binary scan $message @4ccc major minor flags set byteorder [expr {$flags & 1} ? 1 : 0] set decoder [namespace current]::[::Combat::CDR::Decoder \#auto $message] set buffer [$decoder get_buffer] $buffer configure -byteorder $byteorder # # skip over 12 byte GIOP header # $buffer seek 12 # # Header depends on GIOP version # if {$major == 1 && ($minor == 0 || $minor == 1)} { set request_id [$buffer ulong] set olen [$buffer ulong] set object_key [$buffer octets $olen] } elseif {$major == 1 && $minor == 2} { set request_id [$buffer ulong] set adressing_disposition [$buffer short] switch -- $adressing_disposition { 0 { # KeyAddr set klength [$buffer ulong] set object_key [$buffer octets $klength] } 1 { # ProfileAddr set profile [::Combat::IOP::DemarshalTaggedProfile $buffer] if {![$profile isa ::Combat::IIOP::ProfileBody]} { error "oops, expected IIOP Profile" } set object_key [$profile cget -object_key] itcl::delete object $profile } 2 { # ReferenceAddr set selected_profile_index [$buffer ulong] set ior [::Combat::IOP::DemarshalIOR $buffer] set profile [lindex [$ior cget -profiles] \ $selected_profile_index] set object_key [$profile cget -object_key] itcl::delete object $ior } } } else { error "cannot decode GIOP $major.$minor" } if {$::Combat::debug(giop)} { puts stderr "GIOP: incoming locate request from $peer as id $request_id" } # # If the client requests a GIOP version lower than the # one we're configured for, speak down to it # if {$major < $major_version || \ ($major == $major_version && $minor < $minor_version)} { set major_version $major set minor_version $minor } itcl::delete object $decoder # # Count as an active request # incr active_requests 1 if {$timeout_token != ""} { after cancel $timeout_token set timeout_token "" } # # Pass invocation to the ORB # ::Combat::CORBA::ORB::locate $this $request_id $object_key } # # Close connection, either upon CloseConnection or in case # of a broken connection. # # Failure before a connection was established is treated as # orderly shutdown # protected method CloseConnection {{orderly 0}} { if {!$orderly} { set broken -1 ;# no CloseConnection received set status 2 ;# guise as SYSTEM_EXCEPTION if {$::Combat::debug(giop)} { puts stderr "GIOP: connection with $peer is broken" } } elseif {$connected && $orderly} { set broken 1 ;# got a CloseConnection set status 3 ;# guise as LOCATION_FORWARD if {$::Combat::debug(giop)} { puts stderr "GIOP: got CloseConnection from $peer" } } else { set broken 1 ;# got a CloseConnection set status 3 ;# guise as LOCATION_FORWARD if {$::Combat::debug(giop)} { puts stderr "GIOP: connecting to $peer has failed" } } if {$timeout_token != ""} { after cancel $timeout_token set timeout_token "" } foreach theid [array names callbacks] { set cb $callbacks($theid) unset callbacks($theid) uplevel #0 "$cb $status" } foreach theid [array names reply_status] { unset reply_status($theid) if {[info exists reply_decoder($theid)]} { itcl::delete object $reply_decoder($theid) unset reply_decoder($theid) } if {[info exists reply_contexts($theid)]} { foreach context $reply_contexts($theid) { itcl::delete object $context } unset reply_contexts($theid) } incr active_requests -1 } close } # # callback for incoming data # public method callback {} { if {$pending_header == ""} { set inlength [size] if {$inlength < 12 && $inlength != -1} { # header incomplete, wait for next callback return } if {[catch {set pending_header [recv 12]}]} { # EOF CloseConnection return } set res [binary scan $pending_header a4cccc \ magic pending_major pending_minor \ pending_flags pending_type] if {$res != 5 || $magic != "GIOP"} { # # oops # if {$::Combat::debug(giop)} { puts stderr "GIOP: got invalid data from $peer" ::Combat::DumpOctets IllData $pending_header } CloseConnection return } if {$pending_major == 1 && $pending_minor == 0} { set pending_byteorder $pending_flags set pending_fragment 0 } elseif {$pending_major == 1 && \ ($pending_minor == 1 || $pending_minor == 2)} { set pending_byteorder [expr {$pending_flags & 1}] set pending_fragment [expr {($pending_flags & 2) >> 1}] } else { if {$::Combat::debug(giop)} { puts stderr "GIOP: $peer sends unsupported GIOP $pending_major.$pending_minor data" ::Combat::DumpOctets IllData $pending_header } CloseConnection return } if {$pending_byteorder == 0} { binary scan $pending_header @8I pending_size } else { binary scan $pending_header @8i pending_size } if {$::Combat::GIOP::ORBGIOPMaxSize != 0 && \ $pending_size > $::Combat::GIOP::ORBGIOPMaxSize} { if {$::Combat::debug(giop)} { puts stderr "GIOP: refusing to handle message of size $pending_size, threshold is $::Combat::GIOP::ORBGIOPMaxSize" } CloseConnection return } if {$pending_fragment || $pending_type == 7} { if {$::Combat::GIOP::ORBGIOPMaxSize != 0 && \ [expr {$pending_frag_size + $pending_size}] > \ $::Combat::GIOP::ORBGIOPMaxSize} { if {$::Combat::debug(giop)} { puts stderr "GIOP: incoming fragment of size $pending_size, already got $pending_frag_size" puts stderr "GIOP: exceeding threshold is $::Combat::GIOP::ORBGIOPMaxSize" } CloseConnection return } } } # # See if we can read the message body # set inlength [size] if {$inlength < $pending_size && $inlength != -1} { # message incomplete, wait for next callback return } if {[catch {set data [recv $pending_size]}]} { # EOF CloseConnection return } if {$::Combat::debug(transport)} { puts stderr "GIOP: Incoming data from $peer:" Combat::DumpOctets Data "$pending_header$data" } # # reset header information # set header $pending_header set pending_header "" # # If there is still incoming data available, arrange to # call me again, as the readable fileevent won't # if {[size] != 0} { after 0 "$this callback" } # # Handle fragments # if {$pending_type == 7} { if {$pending_major == 1 && $pending_minor == 2} { if {$pending_byteorder == 0} { binary scan $data I request_id } else { binary scan $data i request_id } if {![info exists pending_fragments($request_id)]} { error "oops, got GIOP fragment for request $request_id, which wasn't fragmented" } if {$::Combat::debug(giop)} { if {$pending_fragment} { set txt "(more follow)" } else { set txt "(complete)" } puts stderr "GIOP: got fragment for id $request_id $txt" } incr pending_frag_size $pending_size append pending_fragments($request_id) [string range $data 4 end] if {$pending_fragment} { return } set pending_message $pending_fragments($request_id) set pending_frag_size [expr {$pending_frag_size - \ [string length $pending_message]}] unset pending_fragments($request_id) } else { CloseConnection error "don't wanna handle GIOP $pending_major.$pending_minor fragments." } binary scan $pending_message @7c pending_type } elseif {$pending_fragment} { if {$pending_major == 1 && $pending_minor == 2} { if {$pending_byteorder == 0} { binary scan $data I request_id } else { binary scan $data i request_id } if {$::Combat::debug(giop)} { puts stderr "GIOP: got initial fragment for id $request_id" } set pending_fragments($request_id) $header append pending_fragments($request_id) $data return } else { CloseConnection error "don't wanna handle GIOP $pending_major.$pending_minor fragments." } } else { set pending_message $header append pending_message $data } switch -- $pending_type { 0 { # Request if {[catch { HandleIncomingRequest $pending_message } err]} { if {$::Combat::debug(giop)} { global errorInfo puts stderr "GIOP: error in Request handler for $peer: $err" puts stderr $errorInfo } } } 1 { # Reply if {[catch { HandleIncomingReply $pending_message } err]} { if {$::Combat::debug(giop)} { global errorInfo puts stderr "GIOP: error in Reply handler for $peer: $err" puts stderr $errorInfo } } } 2 { # CancelRequest # # Currently ignored. This is acceptable behavior. # # "When a client issues a cancel request message, it # serves in an advisory capacity only. The server is # not required to acknowledge the cancellation, and # may subsequently send the corresponding reply. The # client should have no expectation about whether a # reply (including an exceptional one) arrives." # } 3 { # LocateRequest if {[catch { HandleIncomingLocateRequest $pending_message } err]} { if {$::Combat::debug(giop)} { global errorInfo puts stderr "GIOP: error in LocateRequest handler for $peer: $err" puts stderr $errorInfo } } } 4 { # LocateReply CloseConnection error "not implemented" } 5 { # CloseConnection CloseConnection 1 } 6 { # MessageError CloseConnection error "not implemented" } 7 { # Fragment error "oops, shouldn't be here" } default { if {$::Combat::debug(giop)} { puts stderr "GIOP: unknown GIOP message type $pending_type from $peer" } CloseConnection } } } public method idle_timeout_callback {} { if {$::Combat::debug(giop)} { puts stderr "GIOP: connection to $peer idle timeout" } # # Send CloseConnection message # # CloseConnection messages are sent only by servers in GIOP # protocol versions 1.0 and 1.1. [...] In GIOP version 1.2 # and 1.3 both sides of the connection may send the # CloseConnection message. # if {!$isclient || \ ($major_version == 1 && $minor_version <= 1)} { if {$::tcl_platform(byteOrder) == "bigEndian"} { set byteorder 0 } else { set byteorder 1 } set header [binary format a4ccccI \ GIOP \ $major_version $minor_version \ $byteorder 5 0] if {$::Combat::debug(giop)} { puts stderr "GIOP: sending CloseConnection message to $peer" } if {$::Combat::debug(transport)} { ::Combat::DumpOctets Close $header } catch { send $header } } # # Close our end of the connection # CloseConnection 1 } public method keepalive_timeout_callback {} { if {!$refs} { itcl::delete object $this } } } } } combat-0.8.1/orb/iiop.tcl0000700000175000010010000002224611105354562013267 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: iiop.tcl,v 1.13 2008-11-08 18:24:50 Owner Exp $ # # ---------------------------------------------------------------------- # IIOP Module # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval IIOP { # # active_iiop_conns is an array host:port -> conn # variable active_iiop_conns # # Chunk size. Data is read and written in chunks of this size # variable chunk_size 10240 # # Trimming threshold. Buffers grow up to this size before being # trimmed. This is to avoid too much copying of the data. # variable trimming_threshold 65536 # -------------------------------------------------------------- # IIOP connection # -------------------------------------------------------------- itcl::class Conn { inherit ::Combat::GIOP::Conn private variable channel private variable send_pending private variable recv_pending private variable send_index private variable recv_index private variable send_broken private variable recv_broken constructor {ch hp major minor client} { ::Combat::GIOP::Conn::constructor $major $minor $client } { set channel $ch set send_pending "" set recv_pending "" set send_index 0 set recv_index 0 set send_broken 0 set recv_broken 0 set connected 0 set peer $hp fconfigure $channel -translation binary fconfigure $channel -blocking false fileevent $channel readable "$this readable_callback" } destructor { close } public method close {} { if {$channel != ""} { if {$::Combat::debug(iiop)} { puts stderr "IIOP: Closing connection to $peer" } unset ::Combat::IIOP::active_iiop_conns($peer) set send_broken 1 set recv_broken 1 ::close $channel set channel "" } } public method writable_callback {} { if {[string length $send_pending] - $send_index > \ $::Combat::IIOP::chunk_size} { set eod [expr {$send_index+$::Combat::IIOP::chunk_size-1}] set data [string range $send_pending $send_index $eod] set send_index $eod incr send_index if {$send_index > $::Combat::IIOP::trimming_threshold} { set send_pending [string range $send_pending $send_index end] set send_index 0 } } else { set data [string range $send_pending $send_index end] set send_pending "" set send_index 0 } if {[catch { puts -nonewline $channel $data flush $channel }]} { if {$::Combat::debug(iiop)} { if {!$connected} { puts stderr "IIOP: error connecting to $peer" } else { puts stderr "IIOP: send to $peer failed, broken pipe" } } fileevent $channel writable "" set send_broken 1 CloseConnection return } set connected 1 if {[string length $send_pending] == 0} { fileevent $channel writable "" } } public method readable_callback {} { if {[catch {set data [read $channel $::Combat::IIOP::chunk_size]}]} { if {$::Combat::debug(iiop)} { puts stderr "IIOP: read from $peer failed, broken pipe" } fileevent $channel readable "" set recv_broken 1 } elseif {[string length $data] == 0} { if {$::Combat::debug(iiop)} { puts stderr "IIOP: read from $peer returns end of file" } fileevent $channel readable "" set recv_broken 1 } else { append recv_pending $data set connected 1 } callback } public method send {data} { if {$send_broken} { error "error: broken pipe" } if {[string length $send_pending] == 0} { set send_pending $data fileevent $channel writable "$this writable_callback" } else { append send_pending $data } } public method recv {length} { if {$recv_broken && $length > [string length $recv_pending] - $recv_index} { error "error: read beyond end of file" } if {$length >= [string length $recv_pending] - $recv_index} { set data [string range $recv_pending $recv_index end] set recv_pending "" set recv_index 0 } else { set eod [expr {$recv_index + $length - 1}] set data [string range $recv_pending $recv_index $eod] set recv_index $eod incr recv_index if {$recv_index > $::Combat::IIOP::trimming_threshold} { set recv_pending [string range $recv_pending $recv_index end] set recv_index 0 } } return $data } public method size {} { if {$recv_broken} { return -1 } return [expr {[string length $recv_pending] - $recv_index}] } } itcl::class TCPServer { private variable port private variable sock private variable host constructor {} { set port -1 } destructor { if {$port != -1} { close $sock } } public method listen {{myport 0}} { if {[catch { set sock [socket -server Combat::IIOP::TCPServer::accept $myport] } err]} { if {$::Combat::debug(iiop)} { puts stderr "IIOP: cannot listen on port $myport: $err" } error $err } set name [fconfigure $sock -sockname] set host $::Combat::CORBA::ORB::hostname ;# [lindex $name 1] set port [lindex $name 2] if {$::Combat::debug(iiop)} { puts stderr "IIOP: Listening on port $port" } } public proc accept {channel host port} { if {$::Combat::debug(iiop)} { puts stderr "IIOP: incoming connection from $host:$port" } set conn [namespace current]::[::Combat::IIOP::Conn \#auto \ $channel $host:$port 1 2 0] set ::Combat::IIOP::active_iiop_conns($host:$port) $conn } public method profile {} { set prof [namespace current]::[::Combat::IIOP::ProfileBody \#auto] $prof configure -major_version 1 -minor_version 2 $prof configure -host $host -port $port return $prof } } # -------------------------------------------------------------- # IIOP Profile # -------------------------------------------------------------- itcl::class ProfileBody { inherit ::Combat::IOP::TaggedProfile public variable major_version public variable minor_version public variable host public variable port public variable object_key public variable components constructor {} { set tag 0 set major_version 1 set minor_version 2 set object_key "" set components [list] } destructor { foreach component $components { itcl::delete object $component } } public method marshal {buffer} { $buffer ulong 0 ;# TAG_INTERNET_IOP $buffer begin_encaps $buffer octet [binary format c1 $major_version] $buffer octet [binary format c1 $minor_version] $buffer string $host $buffer ushort $port $buffer ulong [string length $object_key] $buffer octets $object_key if {$minor_version >= 1} { $buffer ulong [llength $components] foreach component $components { $component marshal $buffer } } $buffer end_encaps } public method connect {} { if {[info exists ::Combat::IIOP::active_iiop_conns($host:$port)]} { set conn $::Combat::IIOP::active_iiop_conns($host:$port) if {[$conn cget -broken] == 0} { $conn ref return [list $conn $object_key] } } set major $major_version set minor $minor_version if {$major != 1} { error "unknown IIOP version $major.$minor" } if {$minor >= 3} { set minor 2 } if {$::Combat::debug(iiop)} { puts stderr "IIOP: Opening new IIOP $major.$minor connection to $host:$port" } if {[catch {set channel [socket $host $port]} err]} { if {$::Combat::debug(iiop)} { puts stderr "IIOP: couldn't connect to $host:$port: $err" } error $err } set conn [namespace current]::[::Combat::IIOP::Conn \#auto \ $channel $host:$port $major $minor 1] set ::Combat::IIOP::active_iiop_conns($host:$port) $conn # # Does this profile have some CodeSetInfo? # foreach component $components { if {[$component cget -tag] == 1} { return [list $conn $object_key $component] } } return [list $conn $object_key ""] } } proc DemarshalIIOPProfile {buffer} { $buffer begin_encaps set major [$buffer octet] set minor [$buffer octet] binary scan $major c1 major_version binary scan $minor c1 minor_version set host [$buffer string] set port [$buffer ushort] set klen [$buffer ulong] set object_key [$buffer octets $klen] set components [list] if {$minor_version >= 1} { set compcount [$buffer ulong] for {set i 0} {$i < $compcount} {incr i} { lappend components [::Combat::IOP::DemarshalTaggedComponent $buffer] } } $buffer end_encaps set res [namespace current]::[::Combat::IIOP::ProfileBody \#auto] $res configure -tag 0 -major_version $major_version \ -minor_version $minor_version -host $host -port $port \ -object_key $object_key -components $components return $res } } } combat-0.8.1/orb/iop.tcl0000700000175000010010000002074311105354562013116 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: iop.tcl,v 1.7 2008-11-08 18:24:50 Owner Exp $ # # ---------------------------------------------------------------------- # IOP Module # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval IOP { itcl::class TaggedComponent { public variable tag public variable component_data public method marshal {buffer} { $buffer ulong $tag $buffer ulong [string length $component_data] $buffer octets $component_data } } proc DemarshalTaggedComponent {buffer} { set tag [$buffer ulong] switch -- $tag { 1 { # TAG_CODE_SETS set res [::Combat::CONV_FRAME::DemarshalCodeSetInfo $buffer] } default { set length [$buffer ulong] set component_data [$buffer octets $length] set res [namespace current]::[TaggedComponent \#auto] $res configure -tag $tag -component_data $component_data } } return $res } itcl::class ServiceContext { public variable context_id public variable context_data public method marshal {buffer} { $buffer ulong $context_id $buffer ulong [string length $context_data] $buffer octets $context_data } } proc DemarshalServiceContext {buffer} { set context_id [$buffer ulong] switch -- $context_id { 1 { # CodeSets set res [::Combat::CONV_FRAME::DemarshalCodeSetContext $buffer] } default { set length [$buffer ulong] set context_data [$buffer octets $length] set res [namespace current]::[ServiceContext \#auto] $res configure -context_id $context_id \ -context_data $context_data } } return $res } itcl::class TaggedProfile { public variable tag public variable profile_data public method connect {} { error "not reachable" } public method marshal {buffer} { $buffer ulong $tag $buffer ulong [string length $profile_data] $buffer octets $profile_data } } itcl::class MultipleComponentProfile { inherit ::Combat::IOP::TaggedProfile public variable components constructor {} { set components [list] } destructor { foreach component $components { itcl::delete object $component } } public method marshal {buffer} { $buffer ulong 1 ;# TAG_MULTIPLE_COMPONENTS $buffer begin_encaps $buffer ulong [llength $components] foreach component $components { $component marshal $buffer } $buffer end_encaps } } proc DemarshalMultipleComponentProfile {buffer} { $buffer begin_encaps set components [list] set count [$buffer ulong] for {set i 0} {$i < $count} {incr i} { lappend components [::Combat::IOP::DemarshalTaggedComponent $buffer] } $buffer end_encaps set res [namespace current]::[::Combat::IOP::MultipleComponentProfile \#auto] $res configure -tag 1 -components $components return $res } proc DemarshalTaggedProfile {buffer} { set tag [$buffer ulong] switch -- $tag { 0 { # TAG_INTERNET_IOP set res [::Combat::IIOP::DemarshalIIOPProfile $buffer] } 1 { # TAG_MULTIPLE_COMPONENTS set res [::Combat::IOP::DemarshalMultipleComponentProfile $buffer] } default { set length [$buffer ulong] set profile_data [$buffer octets $length] set res [namespace current]::[TaggedProfile \#auto] $res configure -tag $tag -profile_data $profile_data } } return $res } itcl::class IOR { public variable type_id public variable profiles constructor {} { set type_id "" set profiles [list] } destructor { foreach profile $profiles { itcl::delete object $profile } } public method marshal {buffer} { $buffer string $type_id $buffer ulong [llength $profiles] foreach profile $profiles { $profile marshal $buffer } } public method stringify {} { set buffer [namespace current]::[::Combat::CDR::WriteBuffer \#auto] $buffer boolean [$buffer cget -byteorder] marshal $buffer set data [$buffer get_data] binary scan $data H* hex itcl::delete object $buffer return "IOR:$hex" } # # Find Codeset info in a MultipleComponents profile. # public method getCodesetInfo {} { foreach profile $profiles { # test for TAG_MULTIPLE_COMPONENTS if {[$profile cget -tag] == 1} { foreach component [$profile cget -components] { # test for TAG_CODE_SETS if {[$component cget -tag] == 1} { return $component } } } } return "" } } proc DemarshalIOR {buffer} { set type_id [$buffer string] set profiles [list] set numofprofiles [$buffer ulong] for {set i 0} {$i < $numofprofiles} {incr i} { lappend profiles [::Combat::IOP::DemarshalTaggedProfile $buffer] } set ior [namespace current]::[::Combat::IOP::IOR \#auto] $ior configure -type_id $type_id -profiles $profiles return $ior } proc DestringifyIOR {ior} { if {[string range $ior 0 3] != "IOR:"} { error "not a stringified IOR: $ior" } set hex [string range $ior 4 end] set data [binary format H* $hex] set buffer [namespace current]::[::Combat::CDR::ReadBuffer \#auto $data] set byteorder [$buffer boolean] $buffer configure -byteorder $byteorder set res [DemarshalIOR $buffer] itcl::delete object $buffer return $res } itcl::class CDRCodec { public variable major_version public variable minor_version public variable wcodec constructor {major minor} { set major_version $major set minor_version $minor if {$minor_version == 2} { set wcodec [::Combat::CONV_FRAME::getConverter $major $minor 65792] } else { set wcodec "" } } destructor { if {$wcodec != ""} { itcl::delete object $wcodec } } public method encode {data} { set encoder [::Combat::CDR::Encoder \#auto] set buffer [$encoder get_buffer] $buffer configure -wencoder $wcodec $buffer boolean [$buffer cget -byteorder] corba::try { $encoder Marshal any $data } catch {... ex} { itcl::delete object $encoder corba::throw $ex } set octets [$encoder get_data] itcl::delete object $encoder return $octets } public method encode_value {data} { set encoder [::Combat::CDR::Encoder \#auto] set buffer [$encoder get_buffer] $buffer configure -wencoder $wcodec $buffer boolean [$buffer cget -byteorder] corba::try { $encoder Marshal [lindex $data 0] [lindex $data 1] } catch {... ex} { itcl::delete object $encoder corba::throw $ex } set octets [$encoder get_data] itcl::delete object $encoder return $octets } public method decode {octets} { set decoder [::Combat::CDR::Decoder \#auto $octets] set buffer [$decoder get_buffer] $buffer configure -wdecoder $wcodec $buffer configure -byteorder [$buffer boolean] corba::try { set data [$decoder Demarshal any] } catch {... ex} { itcl::delete object $encoder corba::throw $ex } itcl::delete object $decoder return $data } public method decode_value {octets tc} { set decoder [::Combat::CDR::Decoder \#auto $octets] set buffer [$decoder get_buffer] $buffer configure -wdecoder $wcodec $buffer configure -byteorder [$buffer boolean] corba::try { set data [$decoder Demarshal $tc] } catch {... ex} { itcl::delete object $encoder corba::throw $ex } itcl::delete object $decoder return $data } } itcl::class CodecFactory { public method create_codec {enc} { array set encoding $enc if {![info exists encoding(format)] || \ ![info exists encoding(major_version)] || \ ![info exists encoding(minor_version)]} { array unset encoding corba::throw [list IDL:omg.org/CORBA/BAD_PARAM \ [list minor 1 completion_status COMPLETED_NO]] } set format $encoding(format) set major $encoding(major_version) set minor $encoding(minor_version) array unset encoding if {$format != 0 || $major != 1 || $minor < 0 || $minor > 2} { corba::throw IDL:omg.org/IOP/CodecFactory/UnknownEncoding:1.0 } set codec [namespace current]::[::Combat::IOP::CDRCodec \#auto $major $minor] return $codec } } } } combat-0.8.1/orb/object.tcl0000700000175000010010000001341711107156502013571 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: object.tcl,v 1.13 2008-11-14 02:06:58 Owner Exp $ # # ---------------------------------------------------------------------- # CORBA::Object class # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval CORBA { itcl::class Object { public variable ior public variable fwd_ior public variable conn public variable object_key public variable profile_index public variable orig_profile_index public variable AddressingDisposition public variable CodeSetInfo public variable type_id public variable reset_profile public variable timeout constructor {} { set fwd_ior "" set ior "" set conn "" set type_id "" set CodeSetInfo "" set profile_index 0 set orig_profile_index 0 set reset_profile 0 set timeout 0 } destructor { if {$conn != ""} { $conn deref } if {$fwd_ior != ""} { itcl::delete object $fwd_ior } itcl::delete object $ior } public method get_ior {} { return $ior } public method get_fwd_ior {} { if {$fwd_ior != ""} { return $fwd_ior } return $ior } public method forward {newior {permanent {}}} { if {$permanent != ""} { if {$fwd_ior != ""} { itcl::delete object $fwd_ior } itcl::delete object $ior set ior $newior set fwd_ior "" } else { if {$fwd_ior != ""} { itcl::delete object $fwd_ior } set fwd_ior $newior set orig_profile_index $profile_index } set profile_index 0 disconnect } public method unforward {} { if {$fwd_ior != ""} { itcl::delete object $fwd_ior set fwd_ior "" } set profile_index [expr {$orig_profile_index + 1}] set orig_profile_index 0 disconnect } # # switch to the next profile, unforwarding if none is left # public method next_profile {} { incr profile_index if {$fwd_ior != ""} { if {$profile >= [llength [$fwd_ior cget -profiles]]} { unforward } } disconnect } public method connect {} { if {$conn != ""} { if {[$conn cget -broken] == 0} { return $conn } disconnect } if {$reset_profile} { set profile_index 0 set orig_profile_index 0 set reset_profile 0 } set first_tested_index $profile_index set conn "" set theior [get_fwd_ior] set profiles [$theior cget -profiles] while {$profile_index < [llength $profiles]} { set profile [lindex $profiles $profile_index] if {![catch {set data [$profile connect]}]} { set conn [lindex $data 0] set object_key [lindex $data 1] set CodeSetInfo [lindex $data 2] set AddressingDisposition 0 # # find CodeSetInfo in "top level" MuCompProf # if {$CodeSetInfo == ""} { set CodeSetInfo [$theior getCodesetInfo] } return $conn } incr profile_index } # # if we were forwarded, and all profiles in fwd_ior have # failed, unforward to the original address and retry # if {$fwd_ior != ""} { unforward return [connect] } set reset_profile 1 # # If we have just tested all profiles, then this is a # hard failure. Otherwise, be a little more optimistic. # if {$first_tested_index == 0} { ::corba::throw [list IDL:omg.org/CORBA/COMM_FAILURE:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } ::corba::throw [list IDL:omg.org/CORBA/TRANSIENT:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } public method disconnect {} { if {$conn != ""} { $conn deref set conn "" } } public method _is_a {repoid} { set repoid [::Combat::SimpleTypeRepository::getRepoid $repoid] set res [::Combat::CORBA::ORB::invoke_sync 1 $this \ _is_a boolean 0 {{in string}} [list $repoid]] if {$res == 1 && $type_id == ""} { set type_id $repoid } elseif {$res == 1 && \ ![::Combat::SimpleTypeRepository::_is_a \ $type_id $repoid]} { set type_id $repoid } return $res } public method _get_interface {} { set res [::Combat::CORBA::ORB::invoke_sync 1 $this \ _interface Object 0 {} {}] return $res } public method _non_existent {} { set res [::Combat::CORBA::ORB::invoke_sync 1 $this \ _non_existent boolean 0 {} {}] return $res } public method _is_equivalent {other} { if {$other == "0"} { return 0 } if {$other == $this} { return 1 } # # test IIOP profiles for equality # set other_ior [$other get_ior] if {$ior != "" && $other_ior != ""} { set p1 "" set p2 "" foreach profile [$ior cget -profiles] { if {[$profile cget -tag] == 0} { set p1 $profile break } } foreach profile [$other_ior cget -profiles] { if {[$profile cget -tag] == 0} { set p2 $profile break } } if {$p1 != "" && $p2 != ""} { if {[$p1 cget -host] == [$p2 cget -host] && \ [$p1 cget -port] == [$p2 cget -port] && \ [string compare [$p1 cget -object_key] \ [$p2 cget -object_key]] == 0} { return 1 } } } ::corba::throw [list IDL:omg.org/CORBA/TRANSIENT:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } public method UpdateType {} { set theior [get_fwd_ior] if {$theior == ""} { return 0 } if {$type_id == ""} { set type_id [$theior cget -type_id] } if {$type_id == ""} { return 0 } return 1 } } } } combat-0.8.1/orb/orb.tcl0000700000175000010010000005150211107156502013102 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: orb.tcl,v 1.16 2008-11-14 02:06:58 Owner Exp $ # # ---------------------------------------------------------------------- # The ORB # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval CORBA { variable ORB_conn_cond itcl::class ORB { private common requests private common callbacks private common reqid 0 private common reqids_timer private common reqids_timedout private common reqids_completed private common fake_asyncs private common objprocid 0 public common refs_fwd public common refs_rev public common initial_pseudo_references public common initial_references public common default_init_ref "" public common iiop_serverports public common iiop_servers public common ior_template public common hostname # # send_request and receive_reply are low-level functions # that process a single GIOP request/response. # # They are encapsulated by the higher-level functions # invoke_sync, invoke_async, get_async_reply and # poll_async_reply, which transparently perform a retry # upon LOCATION_FORWARD etc. # private proc send_request {rid response object operation rtype \ plevel params values {exceptions {}}} { incr plevel set conn [$object connect] if {$response} { set id [$conn send_request $response $object \ $operation $plevel $params $values {} \ "::Combat::CORBA::ORB::callback $rid"] } else { set id [$conn send_request $response $object \ $operation $plevel $params $values] } if {$response} { $conn ref set requests($rid) [list $object $operation $conn $id \ $rtype $params $values $exceptions -1] } else { set requests($rid) [list $object {} {} $id {} \ {} {} {} 0] } # # trigger callback if !response_expected # if {!$response} { after 0 "::Combat::CORBA::ORB::callback $rid 0" } } private proc receive_reply {rid plevel} { if {![info exists requests($rid)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_PARAM:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } set data $requests($rid) set object [lindex $data 0] set operation [lindex $data 1] set conn [lindex $data 2] set connid [lindex $data 3] set rtype [lindex $data 4] set params [lindex $data 5] set values [lindex $data 6] set exceptions [lindex $data 7] set status [lindex $data 8] if {$status != -1} { # This invocation has already completed set res [lindex $data 9] unset requests($rid) return [list $status $res] } incr plevel if {[catch { set res [$conn receive_reply $connid $rtype $plevel \ $params $values $exceptions] } oops]} { # # This should only occur when the request was canceled. # set res [list -1] } $conn deref set status [lindex $res 0] switch -- $status { 0 - 1 - 2 { # After a successful method invocation, we set a # flag that allows the object to reuse its entire # set of profiles after disconnecting $object configure -reset_profile 1 } 3 { # LOCATION_FORWARD # # A LOCATION_FORWARD is also indicated, without a # new IOR, upon receiving a CloseConnection message. # if {[llength $res] == 2} { $object forward [lindex $res 1] } else { $object next_profile } } 4 { # LOCATION_FORWARD_PERM $object forward [lindex $res 1] 1 } 5 { # NEEDS_ADDRESSING_MODE $object configure -AddressingDisposition [lindex $res 1] } } # # Resend request # if {$status == 3 || $status == 4 || $status == 5} { unset requests($rid) if {[catch { send_request $rid 1 $object $operation $rtype \ $plevel $params $values $exceptions } res]} { # # Re-sending the request has failed, e.g., because we # have run out of forwarding addresses. Re-instate the # request data so that a future receive_reply will # return the appropriate exception. # set requests($rid) [list $object $operation $conn $connid \ $rtype $params $values $exceptions \ 2 $res] return 2 } return 0 } if {$status != -1} { unset requests($rid) } return $res } # # Synchronous invocation of requests # public proc invoke_sync {response object operation rtype \ plevel params values {exceptions {}} {timeout 0}} { incr plevel set rid [incr reqid] send_request $rid $response $object $operation $rtype \ $plevel $params $values $exceptions # # oneway ? # if {!$response} { unset requests($rid) return } # # Set up id mapping # set reqids_completed($rid) 0 # # Set up timeout # if {$timeout} { set reqids_timer($rid) [after $timeout "::Combat::CORBA::ORB::timeout $reqid"] } # # wait for reply # vwait [itcl::scope reqids_completed($rid)] if {![info exists reqids_completed($rid)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_INV_ORDER:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } # # Handle timeout # if {[info exists reqids_timedout($rid)]} { unset reqids_timedout($rid) unset reqids_completed($rid) ::corba::throw [list IDL:omg.org/CORBA/TIMEOUT:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } # # Get reply # set res [receive_reply $rid $plevel] # # Clean up # unset reqids_completed($rid) # # Evaluate response # set status [lindex $res 0] switch -- $status { 0 { # NO_EXCEPTION return [lindex $res 1] } 1 { # USER_EXCEPTION error [lindex $res 1] } 2 { # SYSTEM_EXCEPTION error [lindex $res 1] } default { ::corba::throw [list IDL:omg.org/CORBA/INTERNAL:1.0 \ [list minor 0 completion_status COMPLETED_NO \ debug "status is $status"]] } } ::corba::throw [list IDL:omg.org/CORBA/INTERNAL:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } # # Asynchronous invocation # public proc invoke_async {response object operation rtype \ plevel params values {exceptions {}} {callback {}} \ {timeout 0}} { incr plevel set rid [incr reqid] set reqids_completed($rid) 0 send_request $rid $response $object $operation $rtype \ $plevel $params $values $exceptions if {$callback != ""} { set callbacks($rid) $callback } if {$timeout} { set reqids_timer($rid) [after $timeout "::Combat::CORBA::ORB::timeout $reqid"] } return $reqid } public proc fake_async {status result {callback {}}} { incr reqid set fake_asyncs($reqid) [list $status $result $callback] if {$callback != ""} { set callbacks($reqid) $callback after 0 "::Combat::CORBA::ORB::callback $reqid $status" } return $reqid } public proc get_async_reply {rid plevel} { incr plevel # # See if the request has already timed out # if {[info exists reqids_timedout($rid)]} { unset reqids_timedout($rid) ::corba::throw [list IDL:omg.org/CORBA/TIMEOUT:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } if {[info exists fake_asyncs($rid)]} { set res $fake_asyncs($rid) unset fake_asyncs($rid) set status [lindex $res 0] switch -- $status { 0 { # NO_EXCEPTION return [lindex $res 1] } 1 { # USER_EXCEPTION error [lindex $res 1] } 2 { # SYSTEM_EXCEPTION error [lindex $res 1] } } error "oops" } if {![info exists reqids_completed($rid)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_PARAM:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } # # wait for reply # if {!$reqids_completed($rid)} { vwait [itcl::scope reqids_completed($rid)] } if {![info exists reqids_completed($rid)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_INV_ORDER:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } # # Handle timeout # if {[info exists reqids_timedout($rid)]} { unset reqids_timedout($rid) unset reqids_completed($rid) ::corba::throw [list IDL:omg.org/CORBA/TIMEOUT:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } # # Get reply # set res [receive_reply $rid $plevel] # # Clean up # unset reqids_completed($rid) # # Evaluate response # set status [lindex $res 0] switch -- $status { 0 { # NO_EXCEPTION return [lindex $res 1] } 1 { # USER_EXCEPTION error [lindex $res 1] } 2 { # SYSTEM_EXCEPTION error [lindex $res 1] } default { ::corba::throw [list IDL:omg.org/CORBA/INTERNAL:1.0 \ [list minor 0 completion_status COMPLETED_NO \ debug "status is $status"]] } } ::corba::throw [list IDL:omg.org/CORBA/INTERNAL:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } public proc poll_async_reply {rid} { # # reqids_completed($rid) exists for all outstanding remote # requests. # if {[info exists reqids_completed($rid)]} { return $reqids_completed($rid) } # # We should only get here for fake async requests, which # are always ready. # if {![info exists fake_async($rid)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_PARAM:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } return 1 } public proc cancel_async_request {rid} { if {[info exists reqids_timedout($rid)]} { unset reqids_timedout($rid) unset reqids_completed($rid) return } if {[info exists fake_asyncs($rid)]} { unset $fake_asyncs($rid) return } if {![info exists reqids_completed($rid)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_PARAM:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] } # # Cancel timeout # if {[info exists reqids_timer($rid)] && \ ![info exists reqids_timedout($rid)]} { after cancel $reqids_timer($rid) unset reqids_timer($rid) } # # Clean up # set data $requests($rid) unset requests($rid) if {[info exists reqids_completed($rid)]} { unset reqids_completed($rid) } if {[info exists callbacks($rid)]} { unset callbacks($rid) } # # Inform the connection that this request is canceled # set conn [lindex $data 2] set connid [lindex $data 3] $conn cancel_request $connid $conn deref } # # Incoming invocation from GIOP # public proc invoke {response_expected \ conn request_id object_key \ operation decoder contexts} { # # gotta hand this over to an object adapter # ::Combat::PortableServer::RootPOA::invoke $response_expected \ $conn $request_id $object_key \ $operation $decoder $contexts } public proc locate {conn request_id object_key} { # # gotta hand this over to an object adapter # ::Combat::PortableServer::RootPOA::locate \ $conn $request_id $object_key } # # Callback from GIOP connection # public proc callback {rid status} { # # Transparently try again in case of LOCATION_FORWARD, # LOCATION_FORWARD_PERM or NEEDS_ADDRESSING_MODE. This # retry is performed by receive_reply. # if {$status == 3 || $status == 4 || $status == 5} { if {[receive_reply $rid 0] == 0} { # # Ok, forwarded the request. # return } # # Forwarding the request has failed. Fall through and # act as if the request has completed. # } # # This request has completed # set reqids_completed($rid) 1 set ::Combat::CORBA::ORB_conn_cond 1 # # Cancel timeout # if {[info exists reqids_timer($rid)] && \ ![info exists reqids_timedout($rid)]} { after cancel $reqids_timer($rid) unset reqids_timer($rid) } # # Call user callback # if {[info exists callbacks($rid)]} { set callback $callbacks($rid) unset callbacks($rid) uplevel #0 "$callback $rid" } } # # Callback from "after" upon timeout # public proc timeout {rid} { # # Forget everything we ever knew about this request # set reqids_timedout($rid) 1 set reqids_completed($rid) 1 set data $requests($rid) unset requests($rid) unset reqids_timer($rid) # # Inform the connection that this request is canceled # set conn [lindex $data 2] set connid [lindex $data 3] $conn cancel_request $connid $conn deref # # Call this request's callback so that it learns about it # if {[info exists callbacks($rid)]} { set callback $callbacks($rid) unset callbacks($rid) uplevel #0 "$callback $rid" } set ::Combat::CORBA::ORB_conn_cond 1 } # # Object Reference Handling # public proc MakeObjProc {obj} { incr objprocid set ref "_combat_obj_$objprocid" uplevel #0 proc $ref {args} \{ \ eval ::Combat::CORBA::ORB::object_invoke $obj \$args \ \} set refs_fwd($ref) $obj set refs_rev($obj) $ref return $ref } public proc GetObjFromRef {ref} { if {$ref == "0"} { return 0 } if {![info exists refs_fwd($ref)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_PARAM:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } return $refs_fwd($ref) } public proc GetRefFromObj {obj} { if {$ref == "0"} { return 0 } if {![info exists refs_rev($obj)]} { ::corba::throw [list IDL:omg.org/CORBA/BAD_PARAM:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } return $refs_rev($obj) } public proc ReleaseRef {ref} { if {$ref == "0"} { return } set obj [GetObjFromRef $ref] unset refs_fwd($ref) unset refs_rev($obj) itcl::delete object $obj uplevel #0 rename $ref \"\" } # # Method invocation # public proc object_invoke {obj args} { set idx 0 set async 0 set callback "" set response 1 set timeout 0 while {$idx < [llength $args]} { if {[lindex $args $idx] == "-async"} { set async 1 incr idx } elseif {[lindex $args $idx] == "-callback"} { incr idx set async 1 set callback [lindex $args $idx] incr idx } elseif {[lindex $args $idx] == "-timeout"} { incr idx set timeout [lindex $args $idx] incr idx } else { break } } if {!$timeout} { set timeout [$obj cget -timeout] } set operation [lindex $args $idx] incr idx set values [lrange $args $idx end] if {$operation == ""} { error "usage: $refs_rev($obj) op ?parameters ...?" } if {$operation == "_is_a" || \ $operation == "_get_interface" || \ $operation == "_non_existent" || \ $operation == "_duplicate"} { switch -- $operation { _is_a { if {[llength $values] != 1} { error "usage: $refs_rev($obj) _is_a repoid" } if {!$async} { return [$obj _is_a [lindex $values 0]] } set theop "_is_a" set rtype "boolean" set params {{in string}} } _get_interface { if {[llength $values] != 0} { error "usage: $refs_rev($obj) _get_interface" } if {!$async} { return [$obj _get_interface] } set theop "_interface" set rtype "Object" set params [list] } _non_existent { if {[llength $values] != 0} { error "usage: $refs_rev($obj) _non_existent" } if {!$async} { return [$obj _non_existent] } set theop "_non_existent" set rtype "boolean" set params [list] } _duplicate { return [corba::string_to_object \ [corba::object_to_string \ $refs_rev($obj)]] } default { error "oops" } } if {$async} { return [invoke_async 1 $obj $theop $rtype 2 \ $params $values {} $callback $timeout] } return [invoke_sync 1 $obj $theop $rtype 2 \ $params $values {} $timeout] } if {$operation == "_is_equivalent"} { if {[llength $values] != 1} { error "usage: $refs_rev($obj) _is_equivalent ref" } set otherobj [GetObjFromRef [lindex $values 0]] if {[catch { set res [$obj _is_equivalent $otherobj] } err]} { set status 2 set res $err } else { set status 0 } if {$async} { return [fake_async $status $res $callback] } if {$status == 2} { error $res } return $res } if {![::Combat::SimpleTypeRepository::UpdateTypeInfoForObj $obj]} { ::corba::throw [list IDL:omg.org/CORBA/INTF_REPOS:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } set type [$obj cget -type_id] set opInfo [::Combat::SimpleTypeRepository::getOp \ $type $operation] if {$opInfo == ""} { set atInfo [::Combat::SimpleTypeRepository::getAttr \ $type $operation] } else { set atInfo "" } if {$opInfo == "" && $atInfo == ""} { if {![::Combat::SimpleTypeRepository::UpdateTypeInfoForObj $obj 1]} { ::corba::throw [list IDL:omg.org/CORBA/INTF_REPOS:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } set type [$obj cget -type_id] set opInfo [::Combat::SimpleTypeRepository::getOp \ $type $operation] set atInfo [::Combat::SimpleTypeRepository::getAttr \ $type $operation] if {$opInfo == "" && $atInfo == ""} { error "error: $operation is neither operation nor attribute for $type" } } if {$opInfo != ""} { set rtype [lindex $opInfo 9] set params [lindex $opInfo 15] set exceptions [lindex $opInfo 17] if {[llength $params] != [llength $values]} { error "error: operation $operation wants [llength $params] parameters, not [llength $values]" } if {[lindex $opInfo 11] == "OP_ONEWAY"} { set response 0 } if {$async} { return [invoke_async $response $obj $operation \ $rtype 2 $params $values $exceptions \ $callback $timeout] } return [invoke_sync $response $obj $operation \ $rtype 2 $params $values $exceptions \ $timeout] } if {$atInfo != ""} { set attype [lindex $atInfo 9] if {[llength $values] == 0} { if {[llength $atInfo] > 13} { set get_exceptions [lindex $atInfo 13] } else { set get_exceptions [list] } if {$async} { return [invoke_async 1 $obj _get_$operation \ $attype 0 {} {} $get_exceptions \ $callback $timeout] } return [invoke_sync 1 $obj _get_$operation \ $attype 0 {} {} {} $timeout] } elseif {[llength $values] == 1} { if {[lindex $atInfo 11] == "ATTR_READONLY"} { error "error: attribute $operation is readonly" } if {[llength $atInfo] > 15} { set set_exceptions [lindex $atInfo 15] } else { set set_exceptions [list] } if {$async} { return [invoke_async 1 $obj _set_$operation \ void 0 [list [list in $attype]] $values \ $set_exceptions $callback $timeout] } return [invoke_sync 1 $obj _set_$operation \ void 0 [list [list in $attype]] $values \ {} $timeout] } error "attribute get wants 0, attribute set 1 parameter" } error "oops, I should not be here." } # # corba::dii ?-async? ref spec args # # spec: [list returntype opname params exceptions] # public proc dii_invoke {args} { set idx 0 set async 0 set callback "" set response 1 set timeout 0 while {$idx < [llength $args]} { if {[lindex $args $idx] == "-async"} { set async 1 incr idx } elseif {[lindex $args $idx] == "-callback"} { incr idx set async 1 set callback [lindex $args $idx] incr idx } elseif {[lindex $args $idx] == "-timeout"} { incr idx set timeout [lindex $args $idx] incr idx } else { break } } set ref [lindex $args $idx] set obj [GetObjFromRef $ref] incr idx set spec [lindex $args $idx] incr idx if {$idx > [llength $args]} { error "too few arguments to dii_invoke" } if {[llength $spec] < 3} { error "illegal dii call specification" } set rtype [lindex $spec 0] set operation [lindex $spec 1] set params [lindex $spec 2] set exceptions [lindex $spec 3] set values [lrange $args $idx end] if {[llength $spec] == 4 && \ ([lindex $spec 3] == "OP_ONEWAY" || \ [lindex $spec 4] == "oneway")} { set response 0 } if {!$timeout} { set timeout [$obj cget -timeout] } if {$async} { return [invoke_async $response $obj $operation \ $rtype 2 $params $values $exceptions \ $callback $timeout] } return [invoke_sync $response $obj $operation \ $rtype 2 $params $values $exceptions \ $timeout] } } } } combat-0.8.1/orb/pkgIndex.tcl0000700000175000010010000000011011105354563014063 0ustar fpNone package ifneeded combat 0.8 [list source [file join $dir combat.tcl]] combat-0.8.1/orb/poa.tcl0000700000175000010010000011270311107156502013100 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: poa.tcl,v 1.14 2008-11-14 02:06:58 Owner Exp $ # # ---------------------------------------------------------------------- # The POA # ---------------------------------------------------------------------- # namespace eval Combat { namespace eval PortableServer { variable POAImplName "default" variable theRootPOA 0 variable theCurrent 0 variable initialized 0 # # helper # proc NormalizeName {servant} { if {[string range $servant 0 3] == "::::"} { return [string range $servant 2 end] } elseif {[string range $servant 0 1] != "::"} { return "::$servant" } return $servant } # # PortableServer::POAManager # itcl::class POAManager { private variable state private variable managed constructor {} { set state HOLDING set managed [list] } private method change_state {new_state \ {etherealize_objects 0} \ {wait_for_completion 0}} { if {$state == "INACTIVE"} { corba::throw IDL:omg.org/PortableServer/POAManager/AdapterInactive:1.0 } set state $new_state foreach poa $managed { $poa poa_manager_callback $state $etherealize_objects \ $wait_for_completion } } public method add_managed_poa {poa} { lappend managed $poa } public method del_managed_poa {poa} { for {set idx 0} {$idx < [llength $managed]} {incr idx} { if {[string equal [lindex $managed $idx] $poa]} { set managed [lreplace $managed $idx $idx] return } } } public method get_state {} { return $state } public method activate {} { change_state ACTIVE } public method hold_requests {wait_for_completion} { change_state HOLDING $wait_for_completion } public method discard_requests {wait_for_completion} { change_state DISCARDING $wait_for_completion } public method deactivate {wait_for_completion etherealize_objs} { change_state INACTIVE $wait_for_completion $etherealize_objs } } # # PortableServer::POACurrent # itcl::class POACurrent { private variable state constructor {} { set state [list] } public method set_state {poa id servant} { lappend state [list $poa $id $servant] } public method unset_state {} { set state [lreplace $state end end] } public method get_POA {} { if {[llength $state] == 0} { corba::throw IDL:omg.org/PortableServer/Current/NoContext:1.0 } return [lindex [lindex $state end] 0] } public method get_object_id {} { if {[llength $state] == 0} { corba::throw IDL:omg.org/PortableServer/Current/NoContext:1.0 } return [lindex [lindex $state end] 1] } public method get_reference {} { if {[llength $state] == 0} { corba::throw IDL:omg.org/PortableServer/Current/NoContext:1.0 } set poa [get_POA] set oid [get_object_id] return [$poa id_to_reference $oid] } public method get_servant {} { if {[llength $state] == 0} { corba::throw IDL:omg.org/PortableServer/Current/NoContext:1.0 } return [lindex [lindex $state end] 2] } } itcl::class POA { protected common unique_prefix protected common all_poas private variable thread_policy private variable lifespan_policy private variable id_uniqueness_policy private variable id_assignment_policy private variable implicit_activation_policy private variable servant_retention_policy private variable request_processing_policy private variable manager private variable default_servant private variable servant_manager private variable adapter_activator private variable next_oid private variable holding_invocations public variable name public variable fqn protected variable state protected variable parent protected variable children protected variable oaid # # map oid -> [list servant repository_id] # private variable active_object_map # # map servant -> [list of oids] # private variable active_servant_map # # methods # constructor {my_name my_manager my_policies my_parent} { set name $my_name set manager $my_manager set parent $my_parent if {$parent != 0} { set pfqn [$parent cget -fqn] if {$pfqn != "RootPOA"} { set fqn [format "%s/%s" $fqn $name] } else { set fqn $name } } else { set fqn "RootPOA" } if {$manager == 0} { set manager [namespace current]::[::Combat::PortableServer::POAManager \#auto] } set state [$manager get_state] set thread_policy ORB_CTRL_MODEL set lifespan_policy TRANSIENT set id_uniqueness_policy UNIQUE_ID set id_assignment_policy SYSTEM_ID set implicit_activation_policy NO_IMPLICIT_ACTIVATION set servant_retention_policy RETAIN set request_processing_policy USE_ACTIVE_OBJECT_MAP_ONLY set idx -1 foreach policy $my_policies { incr idx switch -- $policy { ORB_CTRL_MODEL - SINGLE_THREAD_MODEL - MAIN_THREAD_MODEL { set thread_policy $policy } TRANSIENT - PERSISTENT { set lifespan_policy $policy } UNIQUE_ID - MULTIPLE_ID { set id_uniqueness_policy $policy } USER_ID - SYSTEM_ID { set id_assignment_policy $policy } RETAIN - NON_RETAIN { set servant_retention_policy $policy } USE_ACTIVE_OBJECT_MAP_ONLY - USE_DEFAULT_SERVANT - USE_SERVANT_MANAGER { set request_processing_policy $policy } IMPLICIT_ACTIVATION - NO_IMPLICIT_ACTIVATION { set implicit_activation_policy $policy } default { corba::throw [list IDL:omg.org/PortableServer/POA/InvalidPolicy:1.0 [list index $idx]] } } } set default_servant 0 set servant_manager 0 set adapter_activator 0 if {$lifespan_policy == "TRANSIENT"} { if {$fqn != "RootPOA"} { set oaid [format "%s/%s" $unique_prefix $fqn] } } else { if {$fqn == $::Combat::PortableServer::POAImplName} { set oaid $fqn } else { set oaid [format "%s/%s" $::Combat::PortableServer::POAImplName $fqn] } } if {$fqn != "RootPOA"} { set all_poas($oaid) $this } if {$::Combat::debug(poa)} { puts stderr "POA: $fqn created, status is $state" } set next_oid 0 array set children [list] array set active_object_map [list] array set active_servant_map [list] set holding_invocations [list] $manager add_managed_poa $this } public method create_POA {adapter_name a_POAManager policies} { if {[info exists children($adapter_name)]} { corba::throw IDL:omg.org/PortableServer/POA/AdapterAlreadyExists:1.0 } set newoa [namespace current]::[Combat::PortableServer::POA \ \#auto $adapter_name $a_POAManager $policies $this] set children($adapter_name) $newoa return $newoa } public method find_POA {adapter_name activate_it} { if {[info exists children($adapter_name)]} { return $children($adapter_name) } if {!$activate_it || $adapter_activator == 0} { corba::throw IDL:omg.org/PortableServer/POA/AdapterNonExistent:1.0 } if {[catch { set newoa [$adapter_activator $this $adapter_name] }]} { corba::throw [list IDL:omg.org/CORBA/OBJ_ADAPTER \ [list minor 1 completion_status COMPLETED_MAYBE]] } return $newoa } public method destroy {etherealize_objects wait_for_completion} { error "not implemented yet" } public method the_name {} { return $name } public method the_parent {} { return $parent } public method the_children {} { set allpoas [list] foreach child [array names children] { lappend allpoas $children($child) } return $allpoas } public method the_POAManager {} { return $manager } public method get_servant_manager {} { if {$request_processing_policy != "USE_SERVANT_MANAGER"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } return $servant_manager } public method set_servant_manager {imgr} { if {$request_processing_policy != "USE_SERVANT_MANAGER"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } set servant_manager [::Combat::PortableServer::NormalizeName $imgr] } public method get_servant {} { if {$request_processing_policy != "USE_DEFAULT_SERVANT"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } return $default_servant } public method set_servant {p_servant} { if {$request_processing_policy != "USE_DEFAULT_SERVANT"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } set default_servant [::Combat::PortableServer::NormalizeName $p_servant] } public method activate_object {servant} { set servant [::Combat::PortableServer::NormalizeName $servant] if {$id_assignment_policy != "SYSTEM_ID" || \ $servant_retention_policy != "RETAIN"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } if {$id_uniqueness_policy != "MULTIPLE_ID"} { if {[info exists active_servant_map($servant)]} { corba::throw IDL:omg.org/PortableServer/POA/ServantAlreadyActive:1.0 } } incr next_oid if {$lifespan_policy == "PERSISTENT"} { set oid [format "%s.%d" $unique_prefix $next_oid] } else { set oid [format "%d" $next_oid] } if {[catch { set repoidorscopedname [$servant _Interface] }]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn cannot activate $servant: _Interface failed" } corba::throw [list IDL:omg.org/CORBA/BAD_PARAM \ [list minor 1 completion_status COMPLETED_NO]] } if {[catch { set type_id [::Combat::SimpleTypeRepository::getRepoid $repoidorscopedname] }]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn error: no type information for $repoidorscopedname" } corba::throw [list IDL:omg.org/CORBA/INTF_REPOS \ [list minor 1 completion_status COMPLETED_NO]] } if {![::Combat::SimpleTypeRepository::UpdateTypeInfoForId $type_id]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn error: no type information for $type_id" } corba::throw [list IDL:omg.org/CORBA/INTF_REPOS \ [list minor 1 completion_status COMPLETED_NO]] } set active_object_map($oid) [list $servant $type_id] if {$::Combat::debug(poa)} { puts stderr "POA: $fqn activating $oid, type $type_id" } if {[info exists active_servant_map($servant)]} { lappend active_servant_map($servant) $oid } else { set active_servant_map($servant) [list $oid] } return $oid } public method activate_object_with_id {oid servant} { set servant [::Combat::PortableServer::NormalizeName $servant] if {$servant_retention_policy != "RETAIN"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } if {[info exists active_object_map($oid)]} { corba::throw IDL:omg.org/PortableServer/POA/ObjectAlreadyActive:1.0 } if {$id_uniqueness_policy != "MULTIPLE_ID"} { if {[info exists active_servant_map($servant)]} { corba::throw IDL:omg.org/PortableServer/POA/ServantAlreadyActive:1.0 } } if {[catch { set repoidorscopedname [$servant _Interface] }]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn cannot activate $servant: _Interface failed" } corba::throw [list IDL:omg.org/CORBA/BAD_PARAM \ [list minor 1 completion_status COMPLETED_NO]] } if {[catch { set type_id [::Combat::SimpleTypeRepository::getRepoid $repoidorscopedname] }]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn error: no type information for $repoidorscopedname" } corba::throw [list IDL:omg.org/CORBA/INTF_REPOS \ [list minor 1 completion_status COMPLETED_NO]] } set active_object_map($oid) [list $servant $type_id] if {$::Combat::debug(poa)} { puts stderr "POA: $fqn activating $oid, type $type_id" } if {[info exists active_servant_map($servant)]} { lappend active_servant_map($servant) $oid } else { set active_servant_map($servant) [list $oid] } return } public method deactivate_object {oid} { if {$servant_retention_policy != "RETAIN"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } if {![info exists active_object_map($oid)]} { corba::throw IDL:omg.org/PortableServer/POA/ObjectNotActive:1.0 } set servant [lindex $active_object_map($oid) 0] unset active_object_map($oid) if {[llength $active_servant_map($servant)] == 1} { set remaining_activations 0 unset active_servant_map($servant) } else { set idx [lsearch -exact $active_servant_map($servant) $servant] set active_servant_map($servant) \ [lreplace $active_servant_map($servant) $idx $idx] set remaining_activations 1 } if {$::Combat::debug(poa)} { puts stderr "POA: $fqn deactivating $oid" } if {$request_processing_policy == "USE_SERVANT_MANAGER" && \ $servant_retention_policy == "RETAIN" && \ $servant_manager != 0} { catch { $servant_manager etherealize $oid $this $servant \ 0 $remaining_activations } } } public method create_reference {intf} { if {$id_assignment_policy != "SYSTEM_ID"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } incr next_oid if {$lifespan_policy == "PERSISTENT"} { set oid [format "%s.%d" $unique_prefix $next_oid] } else { set oid [format "%d" $next_oid] } return [create_reference_with_id $oid $intf] } public method create_reference_with_id {oid intf} { if {![::Combat::SimpleTypeRepository::UpdateTypeInfoForId $intf]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn error: no type information for $intf" } corba::throw [list IDL:omg.org/CORBA/INTF_REPOS \ [list minor 1 completion_status COMPLETED_NO]] } set str_template [$::Combat::CORBA::ORB::ior_template stringify] set template [::Combat::IOP::DestringifyIOR $str_template] $template configure -type_id $intf if {$oid == $oaid} { set object_key $oid } else { set object_key [format "%s*%s" $oaid $oid] } foreach profile [$template cget -profiles] { catch {$profile configure -object_key $object_key} } set obj [namespace current]::[::Combat::CORBA::Object \#auto] $obj configure -ior $template return [::Combat::CORBA::ORB::MakeObjProc $obj] } public method servant_to_id {servant} { set servant [::Combat::PortableServer::NormalizeName $servant] if {$servant_retention_policy == "RETAIN" && \ $id_uniqueness_policy == "UNIQUE_ID"} { if {[info exists active_servant_map($servant)]} { return [lindex $active_servant_map($servant) 0] } } if {$servant_retention_policy == "RETAIN" && \ $implicit_activation_policy == "IMPLICIT_ACTIVATION"} { if {![info exists active_servant_map($servant)] || \ $id_uniqueness_policy == "MULTIPLE_ID"} { return [activate_object $servant] } } if {$request_processing_policy == "USE_DEFAULT_SERVANT"} { catch { set cp [$::Combat::PortableServer::theCurrent get_POA] set cs [$::Combat::PortableServer::theCurrent get_servant] set ci [$::Combat::PortableServer::theCurrent get_object_id] if {$cp == $this && $cs == $servant && $cs == $default_servant} { return $ci } } } corba::throw IDL:omg.org/PortableServer/POA/ServantNotActive:1.0 } public method servant_to_reference {servant} { set servant [::Combat::PortableServer::NormalizeName $servant] if {$servant_retention_policy == "RETAIN" && \ $id_uniqueness_policy == "UNIQUE_ID"} { if {[info exists active_servant_map($servant)]} { return [id_to_reference [lindex $active_servant_map($servant) 0]] } } if {$servant_retention_policy == "RETAIN" && \ $implicit_activation_policy == "IMPLICIT_ACTIVATION"} { if {![info exists active_servant_map($servant)] || \ $id_uniqueness_policy == "MULTIPLE_ID"} { return [id_to_reference [activate_object $servant]] } } catch { set cp [$::Combat::PortableServer::theCurrent get_POA] set cs [$::Combat::PortableServer::theCurrent get_servant] set ci [$::Combat::PortableServer::theCurrent get_object_id] if {$cp == $this && $cs == $servant} { return [id_to_reference $ci] } } corba::throw IDL:omg.org/PortableServer/POA/ServantNotActive:1.0 } public method reference_to_servant {reference} { return [id_to_servant [reference_to_id $reference]] } public method reference_to_id {reference} { set obj [::Combat::CORBA::ORB::GetObjFromRef $reference] set ior [$obj get_fwd_ior] set key "" foreach profile [$ior cget -profiles] { if {![catch {set key [$profile cget -object_key]}]} { if {$key == $oaid} { break } else { set idx [string first * $key] if {$idx > 0} { incr idx -1 set theoaid [string range $key 0 $idx] if {$theoaid == $oaid} { break } } } } set key "" } if {$key == ""} { corba::throw IDL:omg.org/PortableServer/POA/WrongAdapter:1.0 } if {$key == $oaid} { return $oaid } return [string range $key [expr {[string length $oaid] + 1}] end] } public method id_to_servant {oid} { if {$servant_retention_policy != "RETAIN" && \ $request_processing_policy != "USE_DEFAULT_SERVANT"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } if {[info exists active_object_map($oid)]} { return [lindex $active_object_map($oid) 0] } if {$request_processing_policy == "USE_DEFAULT_SERVANT" && \ $default_servant != 0} { return $default_servant } corba::throw IDL:omg.org/PortableServer/POA/ObjectNotActive:1.0 } public method id_to_reference {oid} { if {$servant_retention_policy != "RETAIN"} { corba::throw IDL:omg.org/PortableServer/POA/WrongPolicy:1.0 } if {![info exists active_object_map($oid)]} { corba::throw IDL:omg.org/PortableServer/POA/ObjectNotActive:1.0 } set type_id [lindex $active_object_map($oid) 1] return [create_reference_with_id $oid $type_id] } public method poa_manager_callback {mystate etherealize_objects \ wait_for_completion} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn switching from $state to $mystate" } set state $mystate switch -- $state { ACTIVE - DISCARDING { foreach inv $holding_invocations { after 0 "$this $inv" } set holding_invocations [list] } INACTIVE { if {$etherealize_objects} { etherealize } } } } public method local_invoke {response_expected \ conn request_id object_key \ operation decoder contexts} { switch -- $state { HOLDING { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn HOLDING $operation on $object_key" } lappend holding_invocations [list local_invoke \ $response_expected \ $conn $request_id $object_key \ $operation $decoder $contexts] return } DISCARDING { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn DISCARDING $operation on $object_key" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/TRANSIENT:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } INACTIVE { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn INACTIVE $operation on $object_key" } if {$response_expected} { if {$lifespan_policy == "TRANSIENT"} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } else { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/TRANSIENT:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } } itcl::delete object $decoder return } ACTIVE { # ok } default { error "oops" } } # # determine object id for invocation # if {$object_key == $oaid} { set oid $object_key } else { set oid [string range $object_key [expr {[string length $oaid] + 1}] end] } # # Try to find a servant # set servant 0 set type_id "" # # check the active object map # if {$servant_retention_policy == "RETAIN"} { if {[info exists active_object_map($oid)]} { set servant [lindex $active_object_map($oid) 0] set type_id [lindex $active_object_map($oid) 1] } } # # if use_default_servant, use it # if {$servant == 0 && $request_processing_policy == "USE_DEFAULT_SERVANT"} { if {$default_servant == 0} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJ_ADAPTER:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } set servant $default_servant set repoidorscopedname [$servant _Interface] set type_id [::Combat::SimpleTypeRepository::getRepoid $repoidorscopedname] } # # if USE_SERVANT_MANAGER, ask the manager for a servant # if {$servant == 0 && $request_processing_policy == "USE_SERVANT_MANAGER"} { if {$servant_manager == 0} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJ_ADAPTER:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } if {$servant_retention_policy == "RETAIN"} { if {[catch { set servant [$servant_manager incarnate $oid $this] set repoidorscopedname [$servant _Interface] set type_id [::Combat::SimpleTypeRepository::getRepoid $repoidorscopedname] activate_object_with_id $oid $servant }]} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJ_ADAPTER:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } } else { if {[catch { set cookie 0 set servant [$servant_manager preinvoke $oid \ $this $operation cookie] set repoidorscopedname [$servant _Interface] set type_id [::Combat::SimpleTypeRepository::getRepoid $repoidorscopedname] }]} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJ_ADAPTER:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } } } # # still no servant? # if {$servant == 0} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJ_ADAPTER:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } # # perform invocation # if {$::Combat::debug(poa)} { puts stderr "POA: $fqn invoking $operation on object $oid" } if {![::Combat::SimpleTypeRepository::UpdateTypeInfoForId $type_id]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn error: no type information for $type_id" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/INTF_REPOS:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } if {$operation == "_is_a"} { if {[catch { set type [$decoder Demarshal string] } err]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn demarshalling error: $err" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/MARSHAL:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } if {$type == "IDL:omg.org/Reflection/IFRProvider:1.0"} { set res 1 } else { set res [Combat::SimpleTypeRepository::_is_a $type_id $type] } if {$response_expected} { $conn send_reply $request_id 0 boolean $res \ 0 "" "" } itcl::delete object $decoder return } elseif {$operation == "_non_existent"} { if {$response_expected} { $conn send_reply $request_id 0 boolean 0 \ 0 "" "" } itcl::delete object $decoder return } elseif {$operation == "_interface"} { corba::try { set ifr [corba::resolve_initial_references \ InterfaceRepository] } catch {...} { set ifr 0 } if {$ifr == 0} { set ifrdef 0 } else { corba::try { set ifrobj [::Combat::CORBA::ORB::GetObjFromRef $ifr] set ifrdef [::Combat::CORBA::ORB::invoke_sync \ 1 $ifrobj lookup_id Object 0 \ {{in string}} [list $type_id]] } catch {...} { set ifrdef 0 } } if {$response_expected} { if {$ifrdef == 0} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/INTF_REPOS:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } else { $conn send_reply $request_id 0 Object $ifrdef \ 0 "" "" } } if {$ifr != 0} { corba::release $ifr } if {$ifrdef != 0} { corba::release $ifrdef } itcl::delete object $decoder return } # # Handle Reflection::IFRProvider interface # if {$operation == "omg_get_ifr_metadata"} { set value [::Combat::SimpleTypeRepository::omgGetIfrMetadata $type_id] if {[catch { set value [::Combat::SimpleTypeRepository::omgGetIfrMetadata $type_id] }]} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/INTF_REPOS:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } if {$response_expected} { $conn send_reply $request_id 0 "any" $value 0 "" "" } corba::release "any" $value itcl::delete object $decoder return } elseif {$operation == "omg_get_xml_metadata"} { if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/Reflection/FormatNotSupported:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } $::Combat::PortableServer::theCurrent set_state \ $this $oid $servant # # Is it an attribute? # if {[string match _get_* $operation] || \ [string match _set_* $operation]} { set attribute [string range $operation 5 end] set atInfo [::Combat::SimpleTypeRepository::getAttr \ $type_id $attribute] if {$atInfo == ""} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn type $type_id: no such attribute: $attribute" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } $::Combat::PortableServer::theCurrent unset_state itcl::delete object $decoder return } set attype [lindex $atInfo 9] # # Handle "get" attribute # if {[string match _get_* $operation]} { set value [$servant cget -$attribute] if {$response_expected} { $conn send_reply $request_id 0 $attype $value \ 0 "" "" } corba::release $attype $value } else { # # Handle "set" attribute # if {[catch { set value [$decoder Demarshal $attype] } err]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn demarshalling error: $err" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/MARSHAL:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } $::Combat::PortableServer::theCurrent unset_state itcl::delete object $decoder return } $servant configure -$attribute $value if {$response_expected} { $conn send_reply $request_id 0 void "" \ 0 "" "" } corba::release $attype $value } } else { # # Handle operation # set opInfo [::Combat::SimpleTypeRepository::getOp \ $type_id $operation] if {$opInfo == ""} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn type $type_id: no such operation: $operation" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } $::Combat::PortableServer::theCurrent unset_state itcl::delete object $decoder return } set rtype [lindex $opInfo 9] set params [lindex $opInfo 15] set exceptions [lindex $opInfo 17] set values [list] if {[catch { for {set idx 0} {$idx < [llength $params]} {incr idx} { set param [lindex $params $idx] set pname [format "_param%03d" $idx] if {[llength $param] == 8} { # # It's a ParameterDescription # set dir [lindex $param 7] set type [lindex $param 3] } else { # # It's a simple list with the direction and type # set dir [lindex $param 0] set type [lindex $param 1] } switch -- $dir { PARAM_IN - in { lappend values [$decoder Demarshal $type] } PARAM_INOUT - inout { set $pname [$decoder Demarshal $type] lappend values $pname } PARAM_OUT - out { lappend values $pname } } } } err]} { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn demarshalling error: $err" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/MARSHAL:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } $::Combat::PortableServer::theCurrent unset_state itcl::delete object $decoder return } if {[catch { set result [eval $servant $operation $values] } error]} { if {[catch {set exid [lindex $error 0]}]} { set exid "(oops)" } set found "" foreach exception $exceptions { if {[llength $exception] == 10} { # # It's an ExceptionDescription # set exrid [lindex $exception 3] set extype [lindex $exception 9] } else { # # It's an exception typecode # set exrid [lindex $exception 1] set extype $exception } if {$exid == $exrid} { set found $extype } } if {$::Combat::debug(poa)} { if {$found != ""} { puts stderr "POA: $fqn operation $operation throws $exid" } else { global errorInfo puts stderr "POA: $fqn operation $operation: unexpected exception: $error" puts stderr "$errorInfo" } } if {$response_expected} { if {$found != ""} { $conn send_reply $request_id 1 $found $error \ 0 "" "" } else { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/UNKNOWN:1.0 \ [list minor 0 completion_status COMPLETED_MAYBE]] \ 0 "" "" } } } elseif {$response_expected} { $conn send_reply $request_id 0 $rtype $result \ 0 $params $values corba::release $rtype $result } for {set idx 0} {$idx < [llength $params]} {incr idx} { set param [lindex $params $idx] set value [lindex $values $idx] if {[llength $param] == 8} { # # It's a ParameterDescription # set dir [lindex $param 7] set type [lindex $param 3] } else { # # It's a simple list with the direction and type # set dir [lindex $param 0] set type [lindex $param 1] } switch -- $dir { PARAM_IN - in { corba::release $type $value } PARAM_INOUT - inout - PARAM_OUT - out { corba::release $type [set $value] unset $value } } } } $::Combat::PortableServer::theCurrent unset_state if {[info exists cookie]} { $servant_manager postinvoke $oid $this $operation \ $cookie $servant } itcl::delete object $decoder return } public method local_locate {conn request_id object_key} { switch -- $state { HOLDING { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn HOLDING locate request on $object_key" } lappend holding_invocations [list local_locate \ $conn $request_id $object_key] return } DISCARDING { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn DISCARDING locate request on $object_key" } $conn send_locate_reply $request_id 4 \ [list IDL:omg.org/CORBA/TRANSIENT:1.0 \ [list minor 0 completion_status COMPLETED_NO]] return } INACTIVE { if {$::Combat::debug(poa)} { puts stderr "POA: $fqn INACTIVE locate request on $object_key" } if {$lifespan_policy == "TRANSIENT"} { $conn send_locate_reply $request_id 4 \ [list IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } else { $conn send_locate_reply $request_id 4 \ [list IDL:omg.org/CORBA/TRANSIENT:1.0 \ [list minor 0 completion_status COMPLETED_NO]] } return } ACTIVE { # ok } default { error "oops" } } # # determine object id for invocation # if {$object_key == $oaid} { set oid $object_key } else { set oid [string range $object_key [expr {[string length $oaid] + 1}] end] } # # Try to find a servant # # # check the active object map # if {$servant_retention_policy == "RETAIN"} { if {[info exists active_object_map($oid)]} { $conn send_locate_reply $request_id 1 dummy return } } # # if use_default_servant or servant manager, that's fine # if {$request_processing_policy == "USE_DEFAULT_SERVANT" || \ $request_processing_policy == "USE_SERVANT_MANAGER"} { $conn send_locate_reply $request_id 1 dummy return } # # no servant # $conn send_locate_reply $request_id 0 dummy } } itcl::class RootPOA { inherit ::Combat::PortableServer::POA constructor {} { ::Combat::PortableServer::POA::constructor RootPOA 0 \ {IMPLICIT_ACTIVATION} 0 } { set unique_prefix "/[clock seconds]/[pid]" set oaid $unique_prefix set all_poas($oaid) $this set ::Combat::PortableServer::theRootPOA $this } public proc invoke {response_expected \ conn request_id object_key \ operation decoder contexts} { set idx [string first * $object_key] if {$idx == -1} { set theoaid $object_key } else { incr idx -1 set theoaid [string range $object_key 0 $idx] } if {![info exists all_poas($theoaid)]} { if {$::Combat::debug(poa)} { puts stderr "POA: no POA (oaid $theoaid) for object key $object_key (operation $operation)" } if {$response_expected} { $conn send_reply $request_id 2 dummy \ [list IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" } itcl::delete object $decoder return } set poa $all_poas($theoaid) return [$poa local_invoke \ $response_expected \ $conn $request_id \ $object_key $operation \ $decoder $contexts] } public proc locate {conn request_id object_key} { set idx [string first * $object_key] if {$idx == -1} { set theoaid $object_key } else { incr idx -1 set theoaid [string range $object_key 0 $idx] } if {![info exists all_poas($theoaid)]} { if {$::Combat::debug(poa)} { puts stderr "POA: no POA (oaid $theoaid) for object key $object_key (locate request)" } $conn send_locate_reply $request_id 4 \ [list IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0 \ [list minor 0 completion_status COMPLETED_NO]] \ 0 "" "" return } set poa $all_poas($theoaid) return [$poa local_locate $conn $request_id $object_key] } } proc init {} { if {$::Combat::PortableServer::initialized} { return } set ::Combat::PortableServer::initialized 1 set ::Combat::PortableServer::theRootPOA [namespace current]::[::Combat::PortableServer::RootPOA \#auto] set ::Combat::PortableServer::theCurrent [namespace current]::[::Combat::PortableServer::POACurrent \#auto] set ::Combat::CORBA::ORB::initial_pseudo_references(RootPOA) \ $::Combat::PortableServer::theRootPOA set ::Combat::CORBA::ORB::initial_pseudo_references(POACurrent) \ $::Combat::PortableServer::theCurrent } } } # # Base classes # namespace eval PortableServer { itcl::class AdapterActivator {} itcl::class ServantManager {} itcl::class ServantLocator { inherit ::PortableServer::ServantManager } itcl::class ServantActivator { inherit ::PortableServer::ServantManager } itcl::class ServantBase { public method _default_POA {} { return $::Combat::PortableServer::theRootPOA } public method _this {} { if {![catch { set current [corba::resolve_initial_references POACurrent] set poa [$current get_POA] set servant [$current get_servant] }]} { if {$servant == $this} { return [$current get_reference] } } return [[_default_POA] servant_to_reference $this] } } } combat-0.8.1/orb/str.tcl0000700000175000010010000010754411615564465013157 0ustar fpNone# # ====================================================================== # This file is part of Combat/Tcl, a Tcl CORBA Object Request Broker # # Please visit the Combat Web site at http://www.fpx.de/Combat/ for # more information. # # Copyright (c) Frank Pilhofer, combat@fpx.de # # ====================================================================== # # CVS Version Tag: $Id: str.tcl,v 1.17 2011-08-01 17:58:13 fp Exp $ # namespace eval Combat { namespace eval SimpleTypeRepository { variable absnames ;# array absnames -> id variable elements ;# array id -> irobject variable contained ;# array id -> list of id variable ifcollected ;# array id -> 1 variable attributes ;# array ifaceid,name -> attribute desc variable operations ;# array ifaceid,name -> op desc variable downloaded variable downattrs variable downops # # TypeCode for FullInterfaceDescription # set fid_tc {struct \ IDL:omg.org/CORBA/InterfaceDef/FullInterfaceDescription:1.0 \ {name string id string defined_in string version string \ operations {sequence {struct \ IDL:omg.org/CORBA/OperationDescription:1.0 \ {name string id string defined_in string version string \ result TypeCode mode {enum {OP_NORMAL OP_ONEWAY}} \ contexts {sequence string} parameters {sequence \ {struct IDL:omg.org/CORBA/ParameterDescription:1.0 \ {name string type TypeCode type_def {Object \ IDL:omg.org/CORBA/IDLType:1.0} mode {enum {PARAM_IN \ PARAM_OUT PARAM_INOUT}}}}} exceptions {sequence \ {struct IDL:omg.org/CORBA/ExceptionDescription:1.0 \ {name string id string defined_in string version \ string type TypeCode}}}}}} attributes {sequence \ {struct IDL:omg.org/CORBA/AttributeDescription:1.0 \ {name string id string defined_in string version string \ type TypeCode mode {enum {ATTR_NORMAL ATTR_READONLY}}}}} \ base_interfaces {sequence string} type TypeCode}} variable efid_tc {struct \ IDL:omg.org/CORBA/InterfaceAttrExtension/ExtFullInterfaceDescription:1.0 \ {name string id string defined_in string version string \ operations {sequence {struct \ IDL:omg.org/CORBA/OperationDescription:1.0 {name string \ id string defined_in string version string result TypeCode \ mode {enum {OP_NORMAL OP_ONEWAY}} contexts {sequence string} \ parameters {sequence {struct \ IDL:omg.org/CORBA/ParameterDescription:1.0 {name string \ type TypeCode type_def {Object IDL:omg.org/CORBA/IDLType:1.0} \ mode {enum {PARAM_IN PARAM_OUT PARAM_INOUT}}}}} exceptions \ {sequence {struct IDL:omg.org/CORBA/ExceptionDescription:1.0 \ {name string id string defined_in string version string type \ TypeCode}}}}}} attributes {sequence {struct \ IDL:omg.org/CORBA/ExtAttributeDescription:1.0 {name string \ id string defined_in string version string type TypeCode \ mode {enum {ATTR_NORMAL ATTR_READONLY}} get_exceptions \ {sequence {struct IDL:omg.org/CORBA/ExceptionDescription:1.0 \ {name string id string defined_in string version string \ type TypeCode}}} set_exceptions {sequence {struct \ IDL:omg.org/CORBA/ExceptionDescription:1.0 {name string \ id string defined_in string version string type \ TypeCode}}}}}} base_interfaces {sequence string} type \ TypeCode}} # # Some known absolute name to Repository Id mappings. This is # necessary so that CORBA system exceptions can be caught by name. # array set absnames { ::CORBA::Object IDL:omg.org/CORBA/Object:1.0 ::CORBA::UNKNOWN IDL:omg.org/CORBA/UNKNOWN:1.0 ::CORBA::BAD_PARAM IDL:omg.org/CORBA/BAD_PARAM:1.0 ::CORBA::NO_MEMORY IDL:omg.org/CORBA/NO_MEMORY:1.0 ::CORBA::IMP_LIMIT IDL:omg.org/CORBA/IMP_LIMIT:1.0 ::CORBA::COMM_FAILURE IDL:omg.org/CORBA/COMM_FAILURE:1.0 ::CORBA::INV_OBJREF IDL:omg.org/CORBA/INV_OBJREF:1.0 ::CORBA::NO_PERMISSION IDL:omg.org/CORBA/NO_PERMISSION:1.0 ::CORBA::INTERNAL IDL:omg.org/CORBA/INTERNAL:1.0 ::CORBA::MARSHAL IDL:omg.org/CORBA/MARSHAL:1.0 ::CORBA::INITIALIZE IDL:omg.org/CORBA/INITIALIZE:1.0 ::CORBA::NO_IMPLEMENT IDL:omg.org/CORBA/NO_IMPLEMENT:1.0 ::CORBA::BAD_TYPECODE IDL:omg.org/CORBA/BAD_TYPECODE:1.0 ::CORBA::BAD_OPERATION IDL:omg.org/CORBA/BAD_OPERATION:1.0 ::CORBA::NO_RESOURCES IDL:omg.org/CORBA/NO_RESOURCES:1.0 ::CORBA::NO_RESPONSE IDL:omg.org/CORBA/NO_RESPONSE:1.0 ::CORBA::PERSIST_STORE IDL:omg.org/CORBA/PERSIST_STORE:1.0 ::CORBA::BAD_INV_ORDER IDL:omg.org/CORBA/BAD_INV_ORDER:1.0 ::CORBA::TRANSIENT IDL:omg.org/CORBA/TRANSIENT:1.0 ::CORBA::FREE_MEM IDL:omg.org/CORBA/FREE_MEM:1.0 ::CORBA::INV_IDENT IDL:omg.org/CORBA/INV_IDENT:1.0 ::CORBA::INV_FLAG IDL:omg.org/CORBA/INV_FLAG:1.0 ::CORBA::INTF_REPOS IDL:omg.org/CORBA/INTF_REPOS:1.0 ::CORBA::BAD_CONTEXT IDL:omg.org/CORBA/BAD_CONTEXT:1.0 ::CORBA::OBJ_ADAPTER IDL:omg.org/CORBA/OBJ_ADAPTER:1.0 ::CORBA::DATA_CONVERSION IDL:omg.org/CORBA/DATA_CONVERSION:1.0 ::CORBA::OBJECT_NOT_EXIST IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0 ::CORBA::TRANSACTION_REQUIRED IDL:omg.org/CORBA/TRANSACTION_REQUIRED:1.0 ::CORBA::TRANSACTION_ROLLEDBACK IDL:omg.org/CORBA/TRANSACTION_ROLLEDBACK:1.0 ::CORBA::INVALID_TRANSACTION IDL:omg.org/CORBA/INVALID_TRANSACTION:1.0 ::CORBA::INV_POLICY IDL:omg.org/CORBA/INV_POLICY:1.0 ::CORBA::CODESET_INCOMPATIBLE IDL:omg.org/CORBA/CODESET_INCOMPATIBLE:1.0 ::CORBA::TIMEOUT IDL:omg.org/CORBA/TIMEOUT:1.0 } itcl::class IRObject { public variable id public variable name constructor {theid thename} { set id $theid set name $thename } } itcl::class PrimitiveDef { public variable kind public method type {} { if {$kind == "value base"} { return [list valuetype \ IDL:omg.org/CORBA/ValueBase:1.0 \ [list] "" ""] } return $kind } } itcl::class ConstantDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable type_def public variable value constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method type { return [$type_def type] } } itcl::class StructDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable members private variable visited constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } { set visited 0 } public method type {} { if {$visited} { return [list recursive $id] } set visited 1 set mtc [list] foreach member $members { set member_name [lindex $member 0] set member_type [[lindex $member 1] type] lappend mtc $member_name $member_type } set visited 0 return [list struct $id $mtc] } } itcl::class ExceptionDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable members private variable visited constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } { set visited 0 } public method type {} { if {$visited} { return [list recursive $id] } set visited 1 set mtc [list] foreach member $members { set member_name [lindex $member 0] set member_type [[lindex $member 1] type] lappend mtc $member_name $member_type } set visited 0 return [list exception $id $mtc] } public method describe {} { return [list \ name $name \ id $id \ defined_in dummy \ version dummy \ type [type]] } } itcl::class UnionDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable members public variable discriminator_type_def private variable visited constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } { set visited 0 } public method type {} { if {$visited} { return [list recursive $id] } set visited 1 set mtc [list] foreach member $members { set label [lindex $member 0] set mname [lindex $member 1] set mtype [[lindex $member 2] type] lappend mtc $label $mtype } set visited 0 return [list union $id [$discriminator_type_def type] $mtc] } } itcl::class EnumDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable members constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method type {} { return [list enum $members] } } itcl::class AliasDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable original_type_def constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method type {} { return [$original_type_def type] } } itcl::class StringDef { public variable bound public method type {} { if {$bound == 0} { return string } return [list string $bound] } } itcl::class WStringDef { public variable bound public method type {} { if {$bound == 0} { return wstring } return [list wstring $bound] } } itcl::class FixedDef { public variable digits public variable scale public method type {} { return [list fixed $digits $scale] } } itcl::class SequenceDef { public variable element_type_def public variable bound public method type {} { if {$bound != 0} { return [list sequence [$element_type_def type] $bound] } return [list sequence [$element_type_def type]] } } itcl::class ArrayDef { public variable element_type_def public variable length public method type {} { return [list array [$element_type_def type] $length] } } itcl::class AttributeDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable type_def public variable mode constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} # # Returns an ExtAttributeDescription # public method describe {} { return [list \ name $name \ id $id \ defined_in dummy \ version dummy \ type [$type_def type] \ mode $mode \ get_exceptions [list] \ set_exceptions [list]] } } itcl::class OperationDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable result_def public variable params public variable mode public variable exceptions constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method describe {} { set pardescs [list] foreach param $params { set par_mode [lindex $param 0] set par_name [lindex $param 1] set par_type [[lindex $param 2] type] lappend pardescs [list \ name $par_name \ type $par_type \ type_def 0 \ mode $par_mode] } set exdescs [list] foreach ex $exceptions { lappend exdescs [$ex describe] } return [list \ name $name \ id $id \ defined_in dummy \ version dummy \ result [$result_def type] \ mode $mode \ contexts [list] \ parameters $pardescs \ exceptions $exdescs] } } itcl::class InterfaceDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable base_interfaces constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } { set base_interfaces [list] } public method type {} { return [list Object $id] } public method _is_a {other_id} { if {$id == $other_id} { return 1 } elseif {$id == "IDL:omg.org/CORBA/Object:1.0"} { return 1 } foreach base $base_interfaces { if {[$base cget -id] == $other_id} { return 1 } if {[$base _is_a $other_id]} { return 1 } } return 0 } public method describe {} { set bases [list] foreach base $base_interfaces { lappend bases [$base cget -id] } return [list name $name id $id defined_in dummy \ version dummy base_interfaces $bases] } public method describe_ext_interface {} { set bases [list] foreach base $base_interfaces { lappend bases [$base cget -id] } set operations [list] set attributes [list] # # Collect the descriptions of attributes and operations # in the transitive closure of the inheritance graph. # set queue $this while {[llength $queue]} { set iface [lindex $queue 0] set queue [lrange $queue 1 end] set ifaceid [$iface cget -id] if {[info exists hadbase($ifaceid)]} { continue } set hadbase($ifaceid) 1 foreach base [$iface cget -base_interfaces] { lappend queue $base } foreach contained $::Combat::SimpleTypeRepository::contained($ifaceid) { set el $::Combat::SimpleTypeRepository::elements($contained) if {[catch {$el isa ::Combat::SimpleTypeRepository::AttributeDef} isattr]} { set isattr 0 } if {[catch {$el isa ::Combat::SimpleTypeRepository::OperationDef} isop]} { set isop 0 } if {$isattr} { lappend attributes [$el describe] } elseif {$isop} { lappend operations [$el describe] } } } array unset hadbase return [list \ name $name \ id $id \ defined_in dummy \ version dummy \ operations $operations \ attributes $attributes \ base_interfaces $bases \ type [list Object $id]] } } itcl::class AbstractInterfaceDef { inherit ::Combat::SimpleTypeRepository::InterfaceDef constructor {theid thename} { ::Combat::SimpleTypeRepository::InterfaceDef::constructor $theid $thename } {} public method type {} { return [list abstractinterface $id] } public method describe {} { set bases [list] foreach base $base_interfaces { lappend bases [$base cget -id] } return [list name $name id $id defined_in dummy \ version dummy base_interfaces $bases] } } itcl::class ValueMemberDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable type_def public variable access constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method type {} { return [$type_def type] } } itcl::class ValueDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable supported_interfaces public variable initializers public variable base_value public variable abstract_base_values public variable is_abstract public variable is_custom public variable is_truncatable private variable visited constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } { set visited 0 } public method type {} { if {$visited} { return [list recursive $id] } set visited 1 set members [list] foreach el $::Combat::SimpleTypeRepository::contained($id) { set member $::Combat::SimpleTypeRepository::elements($el) if {[catch {$member isa ::Combat::SimpleTypeRepository::ValueMemberDef} isvm]} { set isvm 0 } if {$isvm} { if {[$member cget -access] == "PRIVATE_MEMBER"} { set visi private } else { set visi public } lappend members $visi [$member cget -name] \ [[$member cget -type_def] type] } } if {$base_value == ""} { set base_type 0 } else { set base_type [$base_value type] } if {$is_custom} { set modifier "custom" } elseif {$is_abstract} { set modifier "abstract" } elseif {$is_truncatable} { set modifier "truncatable" } else { set modifier "" } set visited 0 return [list valuetype $id $members $base_type $modifier] } public method describe {} { return [list name $name id $id defined_in dummy \ version dummy base_interfaces $base_interfaces] } } itcl::class ValueboxDef { inherit ::Combat::SimpleTypeRepository::IRObject public variable original_type_def constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method type {} { return [list valuebox $id [$original_type_def type]] } } itcl::class NativeDef { inherit ::Combat::SimpleTypeRepository::IRObject constructor {theid thename} { ::Combat::SimpleTypeRepository::IRObject::constructor $theid $thename } {} public method type {} { return [list native $id] } } proc scanIDLTypeName {typename} { switch -- $typename { void - short - long - {unsigned short} - {unsigned long} - float - double - boolean - char - octet - any - TypeCode - string - Object - {long long} - {unsigned long long} - {long double} - wchar - wstring - {value base} { set o [namespace current]::[PrimitiveDef \#auto] $o configure -kind $typename return $o } } if {[llength $typename] == 1} { return $::Combat::SimpleTypeRepository::elements($typename) } switch -- [lindex $typename 0] { string { set o [namespace current]::[StringDef \#auto] $o configure -bound [lindex $typename 1] return $o } wstring { set o [namespace current]::[WStringDef \#auto] $o configure -bound [lindex $typename 1] return $o } fixed { set o [namespace current]::[FixedDef \#auto] $o configure -digits [lindex $typename 1] \ -scale [lindex $typename 2] return $o } sequence { set o [namespace current]::[SequenceDef \#auto] $o configure -element_type_def \ [scanIDLTypeName [lindex $typename 1]] if {[llength $typename] == 3} { $o configure -bound [lindex $typename 2] } else { $o configure -bound 0 } return $o } array { set o [namespace current]::[ArrayDef \#auto] $o configure -element_type_def \ [scanIDLTypeName [lindex $typename 1]] $o configure -length [lindex $typename 2] return $o } } error "error: internal error, I should not be here for type $typename" } proc addItem {item container scope} { set type [lindex $item 0] set repoid [lindex [lindex $item 1] 0] set name [lindex [lindex $item 1] 1] set version [lindex [lindex $item 1] 2] if {$scope != "::"} { set absolute_name "[set scope]::$name" } else { set absolute_name "::$name" } set ::Combat::SimpleTypeRepository::absnames($absolute_name) $repoid if {![info exists ::Combat::SimpleTypeRepository::contained($container)]} { set ::Combat::SimpleTypeRepository::contained($container) [list] } if {[info exists ::Combat::SimpleTypeRepository::elements($repoid)]} { set o $::Combat::SimpleTypeRepository::elements($repoid) } else { set o "" } switch -- $type { module { foreach contained [lindex $item 2] { addItem $contained $repoid $absolute_name } } const { set type [scanIDLTypeName [lindex $item 2]] set value [list [$type type] [lindex $item 3]] if {$o == ""} { set o [namespace current]::[ConstantDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -type_def $type -value $value } struct { if {$o == ""} { set o [namespace current]::[StructDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } if {[llength $item] > 2} { foreach contained [lindex $item 3] { addItem $contained $repoid $absolute_name } set members [list] foreach member [lindex $item 2] { set member_name [lindex $member 0] set member_type \ [scanIDLTypeName [lindex $member 1]] lappend members [list $member_name $member_type] } $o configure -members $members } } exception { if {$o == ""} { set o [namespace current]::[ExceptionDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } foreach contained [lindex $item 3] { addItem $contained $repoid $absolute_name } set members [list] foreach member [lindex $item 2] { set member_name [lindex $member 0] set member_type \ [scanIDLTypeName [lindex $member 1]] lappend members [list $member_name $member_type] } $o configure -members $members } union { if {$o == ""} { set o [namespace current]::[UnionDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } if {[llength $item] > 2} { foreach contained [lindex $item 4] { addItem $contained $repoid $absolute_name } $o configure -discriminator_type_def \ [scanIDLTypeName [lindex $item 2]] set members [list] foreach member [lindex $item 3] { set label [lindex $member 0] set mname [lindex $member 1] set mtype [scanIDLTypeName [lindex $member 2]] lappend members [list $label mname $mtype] } $o configure -members $members } } enum { if {$o == ""} { set o [namespace current]::[EnumDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -members [lindex $item 2] } typedef { if {$o == ""} { set o [namespace current]::[AliasDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -original_type_def \ [scanIDLTypeName [lindex $item 2]] } attribute { set mode "ATTR_NORMAL" if {[llength $item] == 4} { if {[lindex $item 3] == "readonly"} { set mode "ATTR_READONLY" } } if {$o == ""} { set o [namespace current]::[AttributeDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -type_def [scanIDLTypeName [lindex $item 2]] $o configure -mode $mode } operation { # # We're not entirely true here wrt the parameters # and exceptions entries. We don't use a ParDescription # Seq (ExcDescriptionSeq), but directly the information # that we need in ORB::send_request. # set params [list] foreach par [lindex $item 3] { switch -- [lindex $par 0] { in { set par_mode "PARAM_IN" } out { set par_mode "PARAM_OUT" } inout { set par_mode "PARAM_INOUT" } default { error "oops" } } set par_name [lindex $par 1] set par_type [scanIDLTypeName [lindex $par 2]] lappend params [list $par_mode $par_name $par_type] } set exceptions [list] foreach ex [lindex $item 4] { lappend exceptions [scanIDLTypeName $ex] } set mode "OP_NORMAL" if {[llength $item] == 6} { if {[lindex $item 5] == "oneway"} { set mode "OP_ONEWAY" } } if {$o == ""} { set o [namespace current]::[OperationDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -result_def [scanIDLTypeName [lindex $item 2]] $o configure -params $params $o configure -mode $mode $o configure -exceptions $exceptions } interface - abstractinterface { if {$o == ""} { if {$type == "interface"} { set o [namespace current]::[InterfaceDef \#auto $repoid $name] } else { set o [namespace current]::[AbstractInterfaceDef \#auto $repoid $name] } set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid set ::Combat::SimpleTypeRepository::contained($repoid) [list] } if {[llength $item] > 2} { set bases [list] foreach base [lindex $item 2] { lappend bases [scanIDLTypeName $base] } $o configure -base_interfaces $bases foreach contained [lindex $item 3] { addItem $contained $repoid $absolute_name } } } valuetype { if {$o == ""} { set o [namespace current]::[ValueDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid set ::Combat::SimpleTypeRepository::contained($repoid) [list] } if {[llength $item] > 2} { if {[lindex $item 2] == "0"} { set base_value "" } else { set base_value [scanIDLTypeName [lindex $item 2]] } $o configure -base_value $base_value set abs_base_values [list] foreach abase [lindex $item 3] { lappend abs_base_values [scanIDLTypeName $abase] } $o configure -abstract_base_values $abs_base_values set supported [list] foreach supp [lindex $item 4] { lappend supported [scanIDLTypeName $supp] } $o configure -supported_interfaces $supported # ignore initializers for the moment $o configure -initializers [list] $o configure -is_abstract 0 $o configure -is_custom 0 $o configure -is_truncatable 0 foreach modifier [lindex $item 6] { switch -- $modifier { custom { $o configure -is_custom 1 } abstract { $o configure -is_abstract 1 } truncatable { $o configure -is_truncatable 1 } } } foreach contained [lindex $item 7] { addItem $contained $repoid $absolute_name } } } valuebox { if {$o == ""} { set o [namespace current]::[ValueboxDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -original_type_def \ [scanIDLTypeName [lindex $item 2]] } valuemember { if {$o == ""} { set o [namespace current]::[ValueMemberDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } $o configure -type_def [scanIDLTypeName [lindex $item 2]] if {[lindex $item 3] == "private"} { $o configure -access PRIVATE_MEMBER } else { $o configure -access PUBLIC_MEMBER } } native { if {$o == ""} { set o [namespace current]::[NativeDef \#auto $repoid $name] set ::Combat::SimpleTypeRepository::elements($repoid) $o lappend ::Combat::SimpleTypeRepository::contained($container) $repoid } } localinterface - abstractinterface { # ignored } default { error "error: illegal type $type while adding item $item to type repository" } } # end of switch # end of proc addItem } # # collect all attribute and operation information for an interface # proc collectInterface {repoid {toplevel ""}} { if {$toplevel == ""} { if {[info exists ::Combat::SimpleTypeRepository::ifcollected($repoid)]} { return } set ::Combat::SimpleTypeRepository::ifcollected($repoid) 1 set toplevel $repoid } foreach contained $::Combat::SimpleTypeRepository::contained($repoid) { set el $::Combat::SimpleTypeRepository::elements($contained) if {[catch {$el isa ::Combat::SimpleTypeRepository::AttributeDef} isattr]} { set isattr 0 } if {[catch {$el isa ::Combat::SimpleTypeRepository::OperationDef} isop]} { set isop 0 } if {$isattr} { set name [$el cget -name] set desc [$el describe] set ::Combat::SimpleTypeRepository::attributes($toplevel,$name) $desc } elseif {$isop} { set name [$el cget -name] set desc [$el describe] set ::Combat::SimpleTypeRepository::operations($toplevel,$name) $desc } } set i $::Combat::SimpleTypeRepository::elements($repoid) foreach base [$i cget -base_interfaces] { collectInterface [$base cget -id] $toplevel } } # # Add data obtained from idl2tcl # proc add {data} { array set ::Combat::SimpleTypeRepository::ifcollected {} array set ::Combat::SimpleTypeRepository::attributes {} array set ::Combat::SimpleTypeRepository::operations {} foreach item $data { addItem $item "::" "::" } } # # Check if we have type information in our repository, but don't # download it yet. # proc HaveTypeInfoForId {repoid} { if {[info exists ::Combat::SimpleTypeRepository::elements($repoid)]} { if {![info exists ::Combat::SimpleTypeRepository::ifcollected($repoid)]} { collectInterface $repoid } return 1 } if {[info exists ::Combat::SimpleTypeRepository::downloaded($repoid)]} { return 1 } return 0 } # # Download a FullInterfaceDescription from the IFR # proc UpdateTypeInfoForObj {obj {force 0}} { # # Check if this object has a Repository Id # set repoid [$obj cget -type_id] if {$force || $repoid == ""} { catch {$obj UpdateType} set repoid [$obj cget -type_id] } # # Do we have a Repository Id? # if {$repoid != "" && !$force} { if {[HaveTypeInfoForId $repoid]} { return 1 } } # # Try to download info for this Repository Id from the # Interface Repository # if {$repoid != "" && !$force} { if {[UpdateTypeInfoForId $repoid]} { return 1 } } # # Either we don't have a Repository Id, we don't have # type information for that Repository Id, or we want to # force an update of our type information. Ask the object # about its interface. # # # Does the object support reflection? # if {![catch { set efidany [::Combat::CORBA::ORB::invoke_sync 1 $obj \ omg_get_ifr_metadata any 0 {} {}] }]} { set efid [lindex $efidany 1] set repoid [AddInterfaceInfoFromEfid $efid] $obj configure -type_id $repoid ::corba::release any $efidany return 1 } # # Does _get_interface work? # if {![catch { set iface [$obj _get_interface] }]} { set repoid [DownloadFromIFR $iface] ::corba::release $iface if {$repoid != 0} { $obj configure -type_id $repoid return 1 } } # # We are running out of options. See if we have any # type information available. # if {$repoid == ""} { return 0 } return [HaveTypeInfoForId $repoid] } proc UpdateTypeInfoForId {repoid} { # # (1) Is type data available in our own repository ? # if {[HaveTypeInfoForId $repoid]} { return 1 } # # (2) Contact Interface Repository and look for repoid # if {[catch { set ifr [::corba::resolve_initial_references InterfaceRepository] }]} { return 0 } set ifrobj [::Combat::CORBA::ORB::GetObjFromHandle $ifr] if {[catch { set iface [::Combat::CORBA::ORB::invoke_sync 1 $ifrobj \ lookup_id Object 0 {{in string}} [list $repoid]] }]} { ::corba::release $ifr return 0 } set result [DownloadFromIFR $iface] ::corba::release $iface ::corba::release $ifr return $result } proc DownloadFromIFR {iface} { # # Okay, download its FullInterfaceDescription # set ifaceobj [::Combat::CORBA::ORB::GetObjFromHandle $iface] if {![catch { set efid [::Combat::CORBA::ORB::invoke_sync 1 $ifaceobj \ describe_ext_interface $::Combat::SimpleTypeRepository::efid_tc 0 {} {}] } res]} { return [AddInterfaceInfoFromEfid $efid] } if {![catch { set fid [::Combat::CORBA::ORB::invoke_sync 1 $ifaceobj \ describe_interface $::Combat::SimpleTypeRepository::fid_tc 0 {} {}] } res]} { return [AddInterfaceInfoFromFid $fid] } return 0 } proc AddInterfaceInfoFromFid {fid} { # # The FullInterfaceDescription is the same as ExtFullInterface- # Description but for the attributes. An ExtAttrDescription has # two new members, get_exceptions and set_exceptions. We're taking # care of that difference elsewhere. # return [AddInterfaceInfoFromEfid $fid] } proc AddInterfaceInfoFromEfid {efid} { # # add operation and attribute info # set repoid [lindex $efid 3] foreach op [lindex $efid 9] { set opname [lindex $op 1] set ::Combat::SimpleTypeRepository::downops($repoid,$opname) $op } foreach at [lindex $efid 11] { set atname [lindex $at 1] set ::Combat::SimpleTypeRepository::downattrs($repoid,$atname) $at } # # fine. # set ::Combat::SimpleTypeRepository::downloaded($repoid) 1 return $repoid } # # get info # proc _is_a {repoid type} { if {[catch { set el $::Combat::SimpleTypeRepository::elements($repoid) set res [$el _is_a $type] }]} { return 0 } return $res } proc getTypeOf {repoidorscopedname} { if {[info exists ::Combat::SimpleTypeRepository::absnames($repoidorscopedname)]} { set repoid $::Combat::SimpleTypeRepository::absnames($repoidorscopedname) } elseif {[info exists ::Combat::SimpleTypeRepository::absnames(::$repoidorscopedname)]} { set repoid $::Combat::SimpleTypeRepository::absnames(::$repoidorscopedname) } else { set repoid $repoidorscopedname } if {[catch { set el $::Combat::SimpleTypeRepository::elements($repoid) set type [$el type] }]} { error "error: no such type in IFR: $repoidorscopedname" } return $type } proc getConst {repoidorscopedname} { if {[info exists ::Combat::SimpleTypeRepository::absnames($repoidorscopedname)]} { set repoid $::Combat::SimpleTypeRepository::absnames($repoidorscopedname) } elseif {[info exists ::Combat::SimpleTypeRepository::absnames(::$repoidorscopedname)]} { set repoid $::Combat::SimpleTypeRepository::absnames(::$repoidorscopedname) } else { set repoid $repoidorscopedname } if {[catch { set el $::Combat::SimpleTypeRepository::elements($repoid) $el isa ::Combat::SimpleTypeRepository::ConstantDef }]} { error "error: no such type in IFR: $repoidorscopedname" } return [$el cget -value] } proc getOp {iface opname} { if {[info exists ::Combat::SimpleTypeRepository::operations($iface,$opname)]} { return $::Combat::SimpleTypeRepository::operations($iface,$opname) } if {[info exists ::Combat::SimpleTypeRepository::downops($iface,$opname)]} { return $::Combat::SimpleTypeRepository::downops($iface,$opname) } return "" } proc getAttr {iface attrname} { if {[info exists ::Combat::SimpleTypeRepository::attributes($iface,$attrname)]} { return $::Combat::SimpleTypeRepository::attributes($iface,$attrname) } if {[info exists ::Combat::SimpleTypeRepository::downattrs($iface,$attrname)]} { return $::Combat::SimpleTypeRepository::downattrs($iface,$attrname) } return "" } # # Return an Any containing an ExtFullInterfaceDescription for a repoid # proc omgGetIfrMetadata {iface} { if {![info exists ::Combat::SimpleTypeRepository::elements($iface)]} { error "error: no such type in IFR: $iface" } set el $::Combat::SimpleTypeRepository::elements($iface) $el isa ::Combat::SimpleTypeRepository::InterfaceDef return [list $::Combat::SimpleTypeRepository::efid_tc \ [$el describe_ext_interface]] } # # Get the repository id from a type that can be specified as a # repository id or a scoped name. # proc getRepoid {repoidorscopedname} { if {[string range $repoidorscopedname 0 3] == "IDL:"} { return $repoidorscopedname } elseif {[string range $repoidorscopedname 0 1] == "::"} { return $::Combat::SimpleTypeRepository::absnames($repoidorscopedname) } elseif {[info exists ::Combat::SimpleTypeRepository::absnames(::$repoidorscopedname)]} { return $::Combat::SimpleTypeRepository::absnames(::$repoidorscopedname) } else { error "unknown type \"$repoidorscopedname\"" } } # # Check if two types match, when each type can be specified as # a scoped name or repoid. # proc matchTypes {t1 t2} { return [string equal [getRepoid $t1] [getRepoid $t2]] } } } combat-0.8.1/README.txt0000700000175000010010000001015411114313334012522 0ustar fpNone ---------------------------------------------------------------------- The Combat ORB ---------------------------------------------------------------------- Combat is a CORBA Object Request Broker (ORB) that allows the implementation of CORBA clients and servers in the Tcl programming language. On the client side, Combat is not only useful to easily test-drive existing CORBA servers, including rapid prototyping, the ability for rapid protodypting or to interactively interface with servers from a console, but makes Tcl an exciting language for distributed programming. Also, Tk allows to quickly develop attractive user interfaces accessing CORBA services. Server-side scripting using [incr Tcl] classes also offers a wide range of possibilities. Combat is compatible with the CORBA 3.0 specification including the IIOP protocol, and has been tested to interoperate with a wide range of open-source and commercial ORBs, including Mico, TAO and ORBexpress. Combat is written in purte Tcl, allowing it to run on all platforms supported by Tcl, which is a much wider range than supported by any other ORB. Combat has the following features: - IIOP / GIOP 1.0, 1.1 and 1.2 (unidirectional only). - All IDL data types, including Type Codes, Objects by Value and recursive data types. - Asynchronous invocations, callbacks and timeouts. - Codeset negotiation when using GIOP 1.2. Thanks to Tcl's encoding system, a wide range of character sets is supported. - IOR:, corbaloc:, corbaname:, file: and http: object URL formats. - Server-side scripting with full Portable Object Adapter (POA) support. - Downloading of Interface Repository information at runtime, if an Interface Repository is available or if the server supports the CORBA Reflection specification. - Fully event based. Installation ------------ Installation has to be performed manually: (1) Make sure that the "orb" subdirectory is picked up by "package require". This can be achieved by either: - copying the orb directory to your existing Tcl library location ([info library]), - adding the orb directory to your TCLLIBPATH environment variable, or - adding the orb directory to the auto_path variable at runtime. Correct installation can be verified by starting a Tcl or Wish console and typing: package require combat If this returns Combat's version number, installation was successful. (2) Install idl2tcl and iordump by: - Editing the top of both scripts so that they use your tclsh of choice. - Making sure that the executable bit is set for both files ("chmod +x"). - Adding Combat's "bin" subdirectory to your search path. Alternatively, you can copy both scripts into a directory in your search path. However, then you will also have to install the "tclkill" package into a location where it is picked up by "package require" (see above) -- idl2tcl requires this package and normally picks it up from "../tclkill". Installation is successful when you can run "idl2tcl" in your console (when started without command-line options, it will just print a brief usage message). Note that all "executable scripts" in this package assume the availability of Tcl 8.5 and require either "tclsh8.5" or "tclsh85" to be in your $PATH (i.e., they all do the equivalent of "#! tclsh8.5"). This applies to "idl2tcl", "iordump", the "server.tcl" and "client.tcl" scripts for each demo, and the "dotest" and "server.tcl" files for each test. If you want to run the demos or tests but use a different version of Tcl, then you might want to edit these files to use your preferred Tcl version instead. Or you can start the correct Tcl interptreter explicitly, e.g., "tclsh8.4 server.tcl". More Information ---------------- Documentation is available in the "doc" subdirectory. There are a few small demonstrations in the "demo" directory. Finally, there is the Combat homepage: http://www.fpx.de/Combat/ License ------- The Combat package is copyrighted by its author, Frank Pilhofer, and is released under BSD license, without any warranties. -------------- Frank Pilhofer fp@fpx.de combat-0.8.1/tclkill/0000755000175000010010000000000011615566705012512 5ustar fpNonecombat-0.8.1/tclkill/kill-linux-x86.so0000700000175000010010000001274211114313734015551 0ustar fpNoneELF”4 4 (< < < <<$P PPÈÈQåtd  \” ¬ È 8  <DLDLPñÿ/\‡PšTÊLñÿ5¬ ;ç"y¨Ô o.x ÃLñÿ©X 4ñÿÖ`ñÿ^\j:J _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassestclStubsPtrkillKill_InitTcl_InitStubstclIntPlatStubsPtrtclIntStubsPtrtclPlatStubsPtrlibc.so.6_edata__bss_start_endGLIBC_2.0GLIBC_2.1.3¹ii Ûsi åcÙ:chƒˆDH^‹ÒùZ~(ÃB  $,0@U‰åƒìè-è¨è ÉÃÿ³ÿ£ÿ£ héàÿÿÿU‰åSè[×R‹ƒüÿÿÿ…ÀtÿÐX[ÉÃU‰åSè[ÃsR€»u<‹ƒìÿÿÿ…Àtƒì ÿ³èšÿÿÿƒÄë ƒÀ‰ƒÿÒ‹ƒ‹…ÒuéÆƒ‹]üÉÃU‰åSè[ÃP‹‹ÿÿÿ…Ét‹“øÿÿÿ…Òtƒì ƒÿÿÿPÿ҃ċ]üÉÃU‰åSƒìƒ}t)¡hÈÿujÿu ‹€(ÿЃÄÇEðé ƒì‹EøP‹EƒÀÿ0ÿu ‹‚ ÿЃÄ‰Eôƒ}ôt‹Eô‰EðëlƒìjÿuøèüÿÿÿƒÄ…Àt&ƒì¡jhÌÿu ‹€ ÿЃÄÇEðë2ƒì‹ƒì¡‹€äÿЃÄPÿu ‹ƒ´ÿЃÄÇEð‹Eð‹]üÉÃU‰åƒìƒìjhéÿuèüÿÿÿƒÄ…Àu ÇEüëKƒì ¡jjhPhíÿu‹€ˆÿÐƒÄ ƒì¡hòhíÿu‹€LÿЃÄÇEü‹EüÉÃU‰åWVSƒì ‹M‹A è[Ãx…À‹»ôÿÿÿt 8Ϻ£ü‰ÂtƒÄîÿÿ‰ÇA1Ò1À…Ò‰tRƒì EðPÿuÿu ƒïÿÿPQÿR ƒÄ …À‰Æta‹‹A…Àt2‹‹ƒðÿÿÿ‰‹A‹P‹ƒèÿÿÿ‰‹A‹P‹ƒäÿÿÿ‰‰ðeô[^_ÉÉö‹ƒðÿÿÿÇ‹ƒèÿÿÿÇ‹ƒäÿÿÿÇëÎ1ÀÇëÆU‰åVSè[îƒ ÿÿÿpü‹@üëƒîÿЋƒøÿuô[^ÉÃU‰åSè[ÃPèöüÿÿY[ÉÃpidinvalid pid or access denied8.4kill1.0This interpreter does not support stubs-enabled extensions.Tclÿÿÿÿÿÿÿÿ¹ \ ¬´0p ñ 4TŒÈþÿÿo\ÿÿÿoðÿÿo"úÿÿo PŠDHGCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)GCC: (GNU) 3.4.3 20050227 (Red Hat 3.4.3-22.fc3)GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2)GCC: (GNU) 3.4.5 20051201 (Red Hat 3.4.5-2).symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment´´¼! ppÀ )00ñ1ÿÿÿo""8>þÿÿo\\0M ŒŒÈV TT _\\Ztt e””k¬¬qÈÈpy8 8 ƒ<< ŠDD ‘LL –PP ÈŸ ¤44 ­DD ³LL ¸L _ Á0à- Ò´p0"\ŒT\t ” ¬ È 8  <DLP4DL” ñÿ<*D8LEHILU¸ k ñÿw@„H‘8  ŸL«| ÁñÿÈPÞ ÐñÿÝDêPñÿó\ùP TLñÿ'¬ -ç"I¨Ô W.x aLñÿhXx4ñÿŽ`ñÿ“\Ÿ:¯ à call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxkill.ctclkilltclStubLib.c__dso_handle_DYNAMIC_inittclIntPlatStubsPtrtclIntStubsPtr__bss_start_fini__cxa_finalize@@GLIBC_2.1.3Tcl_InitStubsKill_Init_edatatclPlatStubsPtr_GLOBAL_OFFSET_TABLE__endtclStubsPtrkill@@GLIBC_2.0_Jv_RegisterClasses__gmon_start__combat-0.8.1/tclkill/kill-windows-x86.dll0000700000175000010010000003541611114313734016241 0ustar fpNoneMZÿÿ¸@€º´ Í!¸LÍ!This program cannot be run in DOS mode. $PEL(>ŠHqà# 8 ` i€v} P`Èp.text„  ``.data0 @À.rdatað0@@.bssð@€À.edataP@@.idataÈ`@À.relocp@BU‰åSƒì‹@i…Òt?‹@i‰ö¼'ƒë9Ór‹…ÀtóÿЋ@iƒë9Ósët&‰$è¸ 1Ò‰@iÇ$èœ X[]ÃU‰åVSƒì‹u ƒþtG‰t$‹E‰D$‹E‰$èZ‰Ãƒì ƒþ”Â1À…Û”À…ÂuG…öu ‹ @i…ÉuF1Û‰Øeø[^] Ç$€èM £@i…Àt+Ç£@ièÄèŸëèÿÿÿë²¶è ÿÿÿëµè Ç 1Àë¨v¼'U¸@i‰åƒì‰D$¸@i‰D$‹E‰$è½ɃøÀöU¸@i‰åƒì‰D$¸@i‰D$‹E‰$èÉÃU‰å]éU‰åƒì(ƒ}t7‹0@iÇD$ 0i‹E‰D$ÇD$‹E ‰$‹‚(ÿÐÇEðé‹0@iEü‰D$‹EƒÀ‹‰D$‹E ‰$‹‚ ÿЉEøƒ}øt ‹Eø‰EðéÖ‹Eü‰D$ÇD$Ç$è'ƒì ‰Eôƒ}ôu/¡0@iÇD$ÇD$0i‹U ‰$‹€ ÿÐÇEðé€ÇD$‹Eô‰$èуì…Àu,¡0@iÇD$ÇD$!0i‹U ‰$‹€ ÿÐÇEðë:‹Eô‰$苃ì¡0@i‹€äÿЋ0@i‰D$‹E ‰$‹‚´ÿÐÇEð‹EðÉÃU‰åƒìÇD$ÇD$90i‹E‰$èv…Àu ÇEüë_‹0@iÇD$ÇD$ ÇD$€iÇD$=0i‹E‰$‹‚ˆÿЋ0@iÇD$B0iÇD$=0i‹E‰$‹‚LÿÐÇEü‹EüÉÃU1ÀWVSƒì‹|$0‰D$‹l$4‹G …Àt 8Ϻ£ü‰ÂtÇP0i1ÒÇG‰0@i1É…Òt^‰l$D$‰D$1À‰D$ ¸Œ0i‰D$‰<$ÿR 1É…À‰Æt5‹D$8…Àu>‹D$‹P£0@i…Ò„™‹£,@i‹B£(@i‹B£$@i‰ñƒÄ‰È[^_]ô&¶]‰ê„Ût"ˆØt&¾ÀBƒè0ƒø —À¶ÀÁ¶„ÀuçItZ‰l$1À¾‰D$¡0@i»Œ0i‰t$ ‰\$‰<$ÿP 1É…À‰Æt”‹D$‹P£0@i…Ò…gÿÿÿ1É1Ò1À‰ ,@i‰(@iébÿÿÿ„Û‰ñ‰êt:t¶E1É„À„"ÿÿÿéJÿÿÿBA¶„À„ÿÿÿ:tïëÞ´&ƒì<1À‰D$(D$(‰D$1À‰D$ ‹D$D‰l$8‹l$@‰D$¸0i‰D$¡0@i‰\$,‰t$0‰|$4‰,$ÿP ‹\$(‰Æ1À…ötx…Û¿0itÿS¿¸0i;D$Htv‰,$¡0@i»Î0iÿl‰|$ 1À¹à0i‰D$$‹D$Dº0i‰t$¿õ0i‰|$‰D$¸ù0i‰D$¡0@i‰\$‰L$ ‰T$‰,$ÿ 1À‹\$,‹t$0‹|$4‹l$8ƒÄ<ÃÿS ¿1i;D$L…xÿÿÿ‰ @i‰ðëÏU¸‰å] U‰åƒì¡ iƒ8tÿ‹ iB‹R£ i…ÒuéÉô&U‰åSƒì¡piƒøÿt)…À‰Ãt‰ö¼'ÿpiKuöÇ$ðièºúÿÿY[]Ã1Àƒ=tië @‹…ti…Ûuôë¾¶¼'U¡@@i‰å…Àt]Ãf]¸£@@iëƒU¹ð1i‰åë¶‹Q‹ƒÁ‚iùð1irê]ÃU¡°@i‰å]‹Hÿá‰öUºB‰åS·Àƒìd‰T$U¨1Û‰T$‰$ÿ”`iº¹ƒì …Àuë=ÉJx€|*¨Auô ËÉJyòƒ;Tu‰Ø‹]üÉÃÇ$T1iº÷¸„1i‰T$‰D$èÃÇ$¸1i»ñ¹„1i‰\$‰L$襶¼'U‰åWVS켋=°@i…ÿteô[^_]ÃÇE˜AAAA¡01i}˜ÇEœAAAAÇE AAAA‰E¸¡41iÇE¤AAAAÇE¨AAAA‰E¼¡81iÇE¬AAAAÇE°AAAA‰EÀ¡<1iÇE´AAAA‰EÄ¡@1i‰EÈ¡D1i‰EÌ¡H1i‰EСL1i‰EÔ·P1if‰E؉<$ÿ`i·Àƒì…À…qÇ$TèÉ…À‰Ã„‰$1ɾT‰L$‰t$èÀÇC i¹ÇCÐi¡`@iÇT‹d@iÇC(‰C¡ i‰S‹ i‰C¡p@iÇC,ÿÿÿÿ‰S ‰C0¡ i‹ i‰C4¡€@i‰S8‹„@i‰C<¡@iÇCDÿÿÿÿ‰S@‰CH‹$ i¡ i‰SPº‰CL‰Ø!ȃøÀ$ ÉAˆ„*HÿÿÿJyç¡01i‰…hÿÿÿ¡41i‰…lÿÿÿ¡81i‰…pÿÿÿ¡<1i‰…tÿÿÿ¡@1i‰…xÿÿÿ¡D1i‰…|ÿÿÿ¡H1i‰E€¡L1i‰E„·P1if‰Eˆ…Hÿÿÿ‰$ÿˆ`i·ðƒì…öuB1Ò…Òu‰$èc‰<$ÿ`iƒì·Àè/ýÿÿ‰Ã‰°@iC£ @iC£À@ieô[^_]Éðèýÿÿ9؉òu±ë±è;ÿ%¨`iÿ%¸`iÿ%¼`iÿ%°`iÿ%À`iÿ%¬`iÿ%´`iÿ%Ä`iÿ%Œ`iÿ%œ`iÿ%˜`iÿ%”`iÿ%`iÿ%ˆ`iU‰å]é÷ÿÿÿÿÿÿ`iÿÿÿÿ€iÿÿÿÿÿÿÿÿÿÿÿÿpidinvalid pid or access deniedTerminateProcess failed8.4kill1.0This interpreter does not support stubs-enabled extensions.Tcltcl::tommathmissing stub table pointerepoch number mismatch, actual version (requested version ): error loading requires a later revision-LIBGCCW32-EH-3-SJLJ-GTHR-MINGW32w32_sharedptr->size == sizeof(W32_EH_SHARED)../../gcc-3.4.5/gcc/config/i386/w32-shared-ptr.cGetAtomNameA (atom, s, sizeof(s)) != 0(>ŠHxP(PHPhPÙàp$@(@,@0@ @P—P±P¿PÒPáPñPýPkill-windows-x86.dllKill_InitTclTomMathInitializeStubsTcl_InitStubstclIntPlatStubsPtrtclIntStubsPtrtclPlatStubsPtrtclStubsPtrtclTomMathStubsPtr@`Œaˆ```¼a¨`Ì`Ø`æ`ò`aa$a2a`Q\pit€ˆ™ «€ .textÐ3.data.bss`@.rdata0¯.textð .data0.bss .textð .data0.bss .idata$7œ.idata$5¨.idata$4`.idata$6$.textø .data0.bss .idata$7¬.idata$5¸.idata$4p.idata$6N.text .data0.bss .idata$7°.idata$5¼.idata$4t.idata$6X.text .data0.bss .idata$7¤.idata$5°.idata$4h.idata$6<.text .data0.bss .idata$7´.idata$5À.idata$4x.idata$6`.text .data0.bss .idata$7 .idata$5¬.idata$4d.idata$62.text .data0.bss .idata$7¨.idata$5´.idata$4l.idata$6F.text( .data0.bss .idata$7¸.idata$5Ä.idata$4|.idata$6j.file¿þÿgfakehname`fthunk¨.text0 .data0.bss .idata$2.idata$5¤.idata$4\.file÷þÿgfake.text0 .data0.bss .idata$4€.idata$5È.idata$7¼ .text0 .data0.bss .idata$7x.idata$5Œ.idata$4D.idata$6Ø.text8 .data0.bss .idata$7ˆ.idata$5œ.idata$4T.idata$6.text@ .data0.bss .idata$7„.idata$5˜.idata$4P.idata$6.textH .data0.bss .idata$7€.idata$5”.idata$4L.idata$6ò.textP .data0.bss .idata$7|.idata$5.idata$4H.idata$6æ.textX .data0.bss .idata$7t.idata$5ˆ.idata$4@.idata$6Ì.fileþÿgfakehname@fthunkˆ.text` .data0.bss .idata$2.idata$5„.idata$4<.fileþÿgfake.text` .data0.bss .idata$4X.idata$5 .idata$7Œ .file!þÿgcrtstuff.cÇ`  .text`  .data0.bss .ctorst ÙðøŒ | _free  + FU¼i__errno  |´‰ÿÿ¢ ÿÿ¼ÿÿØêX ö˜.<ð_ÿÿw$‹°™«__dll__ÿÿ»ÿÿÐãiÿÿòÿÿð_memset(  &03°Dp _fflushø  Rð^n€p ”¦(¶œÐ¨ãÿÿöÀÿÿ0  __end__(¬7ð  _malloc  D| R8  fÄtÿÿŸÿÿ­¸»@  _abort  Ë ßÀû,¼%ÿÿ=ÿÿNˆ`uÿÿ‘ÿÿ©0¶P __assert  ÃH ÔðöŒ ___dll_exit_first_atexit_next_atexit_DllMainCRTStartup@12___do_sjlj_init_Kill_Init_Tcl_InitStubs_TclTomMathInitializeStubs_DllMain@12_initialized___do_global_dtors___do_global_ctors__pei386_runtime_relocatorpseudo-reloc-list.c_w32_atom_suffix___w32_sharedptr_default_unexpected___w32_sharedptr_getdw2_object_mutex.0dw2_once.1sjl_fc_key.2sjl_once.3eh_globals_static.4eh_globals_key.5eh_globals_once.6___w32_sharedptr_initialize___sjlj_init_ctor___RUNTIME_PSEUDO_RELOC_LIST____imp__CloseHandle@4__data_start_____DTOR_LIST_____w32_sharedptr_terminate___tls_start____libmsvcrt_a_iname__imp__FindAtomA@4__imp__abort__size_of_stack_commit____size_of_stack_reserve____major_subsystem_version_____crt_xl_start___AddAtomA@4___crt_xi_start_____crt_xi_end____imp__OpenProcess@12__bss_start_____RUNTIME_PSEUDO_RELOC_LIST_END____size_of_heap_commit___tclIntPlatStubsPtr__imp___errno___crt_xp_start_____crt_xp_end____minor_os_version____head_libmsvcrt_a__image_base____section_alignment____RUNTIME_PSEUDO_RELOC_LIST____data_end_____w32_sharedptr__CTOR_LIST____bss_end_____crt_xc_end_____crt_xc_start_____CTOR_LIST____imp__GetAtomNameA@12_tclIntStubsPtr__imp__TerminateProcess@8__imp____dllonexit__file_alignment____imp__malloc__major_os_version___CloseHandle@4__imp___assert___dllonexit__DTOR_LIST___TerminateProcess@8__imp__memset__size_of_heap_reserve_____crt_xt_start____subsystem____imp__fflush_OpenProcess@12_tclTomMathStubsPtr___w32_sharedptr_unexpected___tls_end___tclPlatStubsPtr__imp__free__major_image_version____loader_flags____imp__AddAtomA@4__head_libkernel32_a__minor_subsystem_version____minor_image_version___tclStubsPtr_FindAtomA@4_GetAtomNameA@12__RUNTIME_PSEUDO_RELOC_LIST_END____libkernel32_a_iname___crt_xt_end__combat-0.8.1/tclkill/kill.c0000700000175000010010000000350011114313735013563 0ustar fpNone/* * ---------------------------------------------------------------------- * A "kill" command. * ---------------------------------------------------------------------- */ #include #if defined (__WIN32) #include static int tclkill (ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { int pid, res; HANDLE h; if (objc != 2) { Tcl_WrongNumArgs (interp, 1, objv, "pid"); return TCL_ERROR; } if ((res = Tcl_GetIntFromObj (interp, objv[1], &pid)) != TCL_OK) { return res; } if (!(h = OpenProcess (PROCESS_TERMINATE, 0, pid))) { Tcl_AppendResult (interp, "invalid pid or access denied", NULL); return TCL_ERROR; } if (TerminateProcess (h, 1) == 0) { Tcl_AppendResult (interp, "TerminateProcess failed", NULL); return TCL_ERROR; } CloseHandle (h); Tcl_SetObjResult (interp, Tcl_NewObj()); return TCL_OK; } #else #include #include static int tclkill (ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { int pid, res; if (objc != 2) { Tcl_WrongNumArgs (interp, 1, objv, "pid"); return TCL_ERROR; } if ((res = Tcl_GetIntFromObj (interp, objv[1], &pid)) != TCL_OK) { return res; } if (kill ((pid_t) pid, SIGTERM) != 0) { Tcl_AppendResult (interp, "invalid pid or access denied", NULL); return TCL_ERROR; } Tcl_SetObjResult (interp, Tcl_NewObj()); return TCL_OK; } #endif int Kill_Init (Tcl_Interp * interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs (interp, TCL_VERSION, 0) == NULL) { return TCL_ERROR; } #else if (Tcl_PkgRequire (interp, "Tcl", TCL_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_CreateObjCommand (interp, "kill", tclkill, NULL, NULL); Tcl_PkgProvide (interp, "kill", "1.0"); return TCL_OK; } combat-0.8.1/tclkill/Makefile0000700000175000010010000000115311114313734014125 0ustar fpNoneifeq ($(findstring Cygwin,$(shell uname -a)),Cygwin) all: kill-windows-x86.dll else ifeq ($(findstring Linux,$(shell uname -a)),Linux) all: kill-linux-x86.so else all: endif endif kill-windows-x86.dll: kill-windows-x86.o gcc -shared -o $@ $^ -L. -ltclstub84 kill-windows-x86.o: kill.c gcc -c -o $@ -Ic:/Software/Tcl/include -DUSE_TCL_STUBS $< kill-linux-x86.so: kill-linux-x86.o gcc -shared -o $@ $^ -L. -ltclstub8.4 kill-linux-x86.o: kill.c gcc -c -o $@ -I/h/fpilhofe/soft/build-linux/include -DUSE_TCL_STUBS $< clean: rm -f *~ *.o core core.* distclean: clean rm -f kill-windows-x86.dll kill-linux-x86.so combat-0.8.1/tclkill/pkgIndex.tcl0000700000175000010010000000103111200422265014731 0ustar fpNonepackage ifneeded kill 1.0 " set killplat [lindex $::tcl_platform(os) 0] set killmach $::tcl_platform(machine) switch -glob -- \$killmach { intel - i*86* { set killmach x86 } x*86* { set killmach x86 } \"Power Macintosh\" { set killmach ppc } } set killfile \[file join \"$dir\" \"kill-\[string tolower \$killplat-\$killmach\][info sharedlibextension]\"\] if {\[file exists \$killfile\]} { load \$killfile } else { source \[file join \"$dir\" unixkill.tcl\] } " combat-0.8.1/tclkill/README.txt0000700000175000010010000000473411114313734014173 0ustar fpNone---------------------------------------------------------------------- The "kill" extension for Tcl ---------------------------------------------------------------------- Tcl provides the "exec" command to start processes in the background. In that case, the command returns a (list of) process identifier(s) (PIDs). However, Tcl does not have any other built-in functions to make use of PIDs. Sometimes, a Tcl application may want to terminate the processes that it started. On Unix, one can always use "exec" to execute the system's "kill" command. But that fails on Windows. The "kill" extension provides a "kill" command that can be used both on Windows and Unix. (And presumably MacOSX, although I haven't tested that.) A compiled extension that implements the "kill" command is provided for Windows and Linux/x86. On other platforms, "kill" is implemented as a function that calls "exec kill $pid". Installation: Place the "tclkill" directory in your Tcl library directory. Alternatively, lappend the tclkill directory to the ::auto_path variable. Usage: package require kill ?1.0? kill ?pid? This should work with any PID returned from the "exec" command when it is used to start a process in the background. Windows implementation notes ---------------------------- This "kill" command should only be used with console applications. This extension does not implement the recommended procedure to close Windows (GUI) applications (which is to post the WM_CLOSE message to the application's open windows). See Microsoft KB 178893, http://support.microsoft.com/kb/178893 Unix implementation notes ------------------------- The "kill" command sends a SIGTERM signal to the process. This is different from typing CTRL-C on the console, which usually sends a SIGINT instead. SIGTERM is considered more explicit; however, it opens the possibility that an application will behave differently when receiving a SIGTERM vs. SIGINT signal. Build notes ----------- This package includes a Makefile. It is specific to the author's directory set-up. Hopefully there will be no need for you to recompile, but if there is, you will have to edit the Makefile. License notes ------------- Written 2008 by Frank Pilhofer. This extension is so trivial that I can not assert any copyright. Consider this package to be in the public domain. Contact me at fp@fpx.de (unfortunately, this mailbox is frequently flooded with spam). combat-0.8.1/tclkill/unixkill.tcl0000700000175000010010000000010111114313735015021 0ustar fpNonepackage provide kill 1.0 proc kill {pid} { exec kill $pid } combat-0.8.1/test/0000755000175000010010000000000011615566706012034 5ustar fpNonecombat-0.8.1/test/1/0000755000175000010010000000000011615566706012174 5ustar fpNonecombat-0.8.1/test/1/dotest0000711000175000010010000001374211107157046013410 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test ptypes-1.1 {short attribute} { $obj s 0 $obj s } {0} test ptypes-1.2 {short limits} { $obj s -32768 set res [$obj s] $obj s 32767 lappend res [$obj s] } {-32768 32767} test ptypes-1.3 {short rangecheck} {knownBug} { $obj s 0 set res [catch {$obj s -32769}] lappend res [catch {$obj s 32768}] lappend res [$obj s] } {1 1 0} test ptypes-2.1 {unsigned short attribute} { $obj us 0 $obj us } {0} test ptypes-2.2 {unsigned short limits} { $obj us 65535 $obj us } {65535} test ptypes-2.3 {unsigned short rangecheck} {knownBug} { $obj us 0 set res [catch {$obj us -1}] lappend res [catch {$obj us 65536}] lappend res [$obj us] } {1 1 0} test ptypes-3.1 {long attribute} { $obj l 0 $obj l } {0} test ptypes-3.2 {long limits} { $obj l -2147483648 set res [$obj l] $obj l 2147483647 lappend res [$obj l] } {-2147483648 2147483647} test ptypes-3.3 {long rangecheck} {knownBug} { $obj l 0 set res [catch {$obj l -2147483649}] lappend res [catch {$obj l 2147483648}] lappend res [$obj l] } {1 1 0} test ptypes-4.1 {unsigned long attribute} { $obj ul 0 $obj ul } {0} test ptypes-4.2 {unsigned long limits} { $obj ul 4294967295 $obj ul } {4294967295} test ptypes-4.3 {unsigned long rangecheck} {knownBug} { $obj ul 0 set res [catch {$obj ul -1}] lappend res [catch {$obj ul 4294967296}] lappend res [$obj ul] } {1 1 0} test ptypes-5.1 {char attribute} { $obj c Q $obj c } {Q} test ptypes-5.2 {ascii alphabet} { set string "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" set ostr "" for {set i 0} {$i < [string length $string]} {incr i} { $obj c [string index $string $i] append ostr [$obj c] } set ostr string compare $string $ostr } {0} test ptypes-5.3 {standard graphic characters} { set string "!\"\#$%&'()*+,-./:;<=>?@\[\\\]^_`\{|\}~" set ostr "" for {set i 0} {$i < [string length $string]} {incr i} { $obj c [string index $string $i] append ostr [$obj c] } set ostr string compare $string $ostr } {0} test ptypes-6.1 {octet attribute} { $obj o Q $obj o } {Q} test ptypes-6.2 {all octets} { for {set i -128} {$i < 128} {incr i} { $obj o [binary format c $i] binary scan [$obj o] c res if {$res != $i} { break } } set i } {128} test ptypes-7.1 {boolean attribute} { $obj b 0 $obj b } {0} test ptypes-7.2 {boolean true} { set res "" foreach true {1 2 42 yes true on -1.18} { $obj b $true lappend res [$obj b] } set res } {1 1 1 1 1 1 1} test ptypes-7.3 {boolean false} { set res "" foreach false {0 no false off 0.0} { $obj b $false lappend res [$obj b] } set res } {0 0 0 0 0} test ptypes-8.1 {float attribute} { $obj f 0 $obj f } {0.0} test ptypes-8.2 {some floats} { set ok 0 foreach float {-0.1 42 1e3 1e31 1e-23} { $obj f $float set res [$obj f] if {abs(($res-$float)/$float) > 1e-6} { set ok $res break } } set ok } {0} test ptypes-9.1 {double attribute} { $obj d 0 $obj d } {0.0} test ptypes-9.2 {some doubles} { set ok 0 foreach double {-0.1 42 1e3 1e222 1e-123} { $obj d $double set res [$obj d] if {abs(($res-$double)/$double) > 1e-12} { set ok $res break } } set ok } {0} test ptypes-10.1 {string attribute} { $obj q {} $obj q } {} test ptypes-10.2 {strings} { $obj q "Hello World" $obj q } {Hello World} test ptypes-10.3 {uninterpreted strings} { $obj q "\}\[blubb\]\\" $obj q } "\}\[blubb\]\\" test ptypes-11.1 {set readonly value} { catch {$obj ro 0} } {1} test ptypes-11.2 {read readonly value} { $obj ro } {4242} test ptypes-12.1 {integer constant} { corba::const IDL:cl:1.0 } {long 42} test ptypes-12.2 {string constant} { corba::const cs } {string {Hello World}} if {[info tclversion] != 8.0} { test ptypes-13.1 {wchar attribute} { $obj wc Q $obj wc } {Q} test ptypes-13.2 {some wide characters} { set string "abc\u4e4e\u25a\xff\u543äöüß" set ostr "" for {set i 0} {$i < [string length $string]} {incr i} { $obj wc [string index $string $i] append ostr [$obj wc] } string compare $string $ostr } {0} test ptypes-14.1 {wide string attribute} { $obj ws "Hello World" $obj ws } {Hello World} test ptypes-14.2 {wide string value} { set string "abc\u4e4e\u25a\xff\u543äöüß" $obj ws $string set ostr [$obj ws] string compare $string $ostr } {0} } } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/1/server.tcl0000711000175000010010000000260311107157046014167 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:ptypes:1.0" } public variable s public variable us public variable l public variable ul public variable c public variable o public variable b public variable f public variable d public variable q public variable wc public variable ws public variable ro 4242 } eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/1/test.idl0000700000175000010010000000061011107157046013620 0ustar fpNoneinterface ptypes { attribute short s; attribute unsigned short us; attribute long l; attribute unsigned long ul; attribute char c; attribute octet o; attribute boolean b; attribute float f; attribute double d; attribute string q; attribute wchar wc; attribute wstring ws; readonly attribute unsigned long ro; }; const long cl = 42; const string cs = "Hello World"; combat-0.8.1/test/1/test.tcl0000700000175000010010000000160711107157047013642 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{interface {IDL:ptypes:1.0 ptypes 1.0} {} {{attribute {IDL:ptypes/s:1.0 s\ 1.0} short} {attribute {IDL:ptypes/us:1.0 us 1.0} {unsigned short}}\ {attribute {IDL:ptypes/l:1.0 l 1.0} long} {attribute {IDL:ptypes/ul:1.0 ul\ 1.0} {unsigned long}} {attribute {IDL:ptypes/c:1.0 c 1.0} char} {attribute\ {IDL:ptypes/o:1.0 o 1.0} octet} {attribute {IDL:ptypes/b:1.0 b 1.0} boolean}\ {attribute {IDL:ptypes/f:1.0 f 1.0} float} {attribute {IDL:ptypes/d:1.0 d\ 1.0} double} {attribute {IDL:ptypes/q:1.0 q 1.0} string} {attribute\ {IDL:ptypes/wc:1.0 wc 1.0} wchar} {attribute {IDL:ptypes/ws:1.0 ws 1.0}\ wstring} {attribute {IDL:ptypes/ro:1.0 ro 1.0} {unsigned long} readonly}}}\ {const {IDL:cl:1.0 cl 1.0} long 42} {const {IDL:cs:1.0 cs 1.0} string {Hello\ World}}} combat-0.8.1/test/10/0000755000175000010010000000000011615566706012254 5ustar fpNonecombat-0.8.1/test/10/dotest0000711000175000010010000001407511107157053013466 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test valuetype-1.1 {EmptyValue typecode} { set _tc_EmptyValue [corba::type of IDL:EmptyValue:1.0] } {valuetype IDL:EmptyValue:1.0 {} 0 {}} test valuetype-1.2 {Date typecode} { set _tc_Date [corba::type of IDL:Date:1.0] } {valuetype IDL:Date:1.0 {public day {unsigned short} public month {unsigned short} public year {unsigned short}} 0 {}} test valuetype-1.3 {BaseType typecode} { set _tc_BaseType [corba::type of IDL:BaseType:1.0] } {valuetype IDL:BaseType:1.0 {public name string} 0 {}} test valuetype-1.4 {DerivedType typecode} { set _tc_DerivedType [corba::type of IDL:DerivedType:1.0] } {valuetype IDL:DerivedType:1.0 {public value {unsigned long} public anothername string} {valuetype IDL:BaseType:1.0 {public name string} 0 {}} {}} test valuetype-1.5 {TreeNode typecode} { set _tc_TreeNode [corba::type of IDL:TreeNode:1.0] } {valuetype IDL:TreeNode:1.0 {public nv {valuetype IDL:BaseType:1.0 {public name string} 0 {}} public left {recursive IDL:TreeNode:1.0} public right {recursive IDL:TreeNode:1.0}} 0 {}} test valuetype-1.6 {hypothetical MoreDerived typecode} { set _tc_MoreDerived [list valuetype IDL:EvenMoreDerived:1.0 [list public more string] $_tc_DerivedType truncatable] expr 1 ;# nothing to test here, really } {1} test valuetype-2.1 {empty value} { $obj ev {} $obj ev } [list _tc_ $_tc_EmptyValue] test valuetype-2.2 {null empty value} { $obj ev 0 $obj ev } {0} test valuetype-3.1 {simple date value} { $obj d {day 5 month 10 year 2001} $obj d } [list day 5 month 10 year 2001 _tc_ $_tc_Date] test valuetype-3.2 {ordering of simple date value} { $obj d {year 1974 month 2 day 6} $obj d } [list day 6 month 2 year 1974 _tc_ $_tc_Date] test valuetype-4.1 {base type with string member} { $obj bt {name {Hello World}} $obj bt } [list name {Hello World} _tc_ $_tc_BaseType] test valuetype-5.1 {derived type} { $obj dt {name {Hello World} value 42 anothername Frank} $obj dt } [list name {Hello World} value 42 anothername Frank _tc_ $_tc_DerivedType] test valuetype-5.2 {ordering of derived type} { $obj dt {value 18 anothername Knarf name FooBar} $obj dt } [list name FooBar value 18 anothername Knarf _tc_ $_tc_DerivedType] test valuetype-6.1 {sending derived type as base w/o type info} { $obj bt {value 17 name ValueWillGetLost anothername Foo} $obj bt } [list name ValueWillGetLost _tc_ $_tc_BaseType] test valuetype-6.2 {sending derived type as base with type info} { $obj bt [list value 19 name ShouldBeOK anothername KeepMe _tc_ $_tc_DerivedType] $obj bt } [list name ShouldBeOK value 19 anothername KeepMe _tc_ $_tc_DerivedType] test valuetype-6.3 {testing truncation} { $obj bt [list value 20 name MoreGetsTruncated anothername AnotherIsKept more TruncateMe _tc_ $_tc_MoreDerived] $obj bt } [list name MoreGetsTruncated value 20 anothername AnotherIsKept _tc_ $_tc_DerivedType] test valuetype-7.1 {sending tree node with base value only} { $obj tn {nv {name Rob} left 0 right 0} $obj tn } [list nv [list name Rob _tc_ $_tc_BaseType] left 0 right 0 _tc_ $_tc_TreeNode] test valuetype-7.2 {sending complex tree with some derived values} { $obj tn [list nv [list _tc_ $_tc_DerivedType name Reiner value 25 anothername Astrid] left [list nv [list name Marc] left 0 right [list nv [list name Phil value 18 anothername Douglas _tc_ $_tc_DerivedType] left 0 right 0]] right 0] $obj tn } [list nv [list name Reiner value 25 anothername Astrid _tc_ $_tc_DerivedType] left [list nv [list name Marc _tc_ $_tc_BaseType] left 0 right [list nv [list name Phil value 18 anothername Douglas _tc_ $_tc_DerivedType] left 0 right 0 _tc_ $_tc_TreeNode] _tc_ $_tc_TreeNode] right 0 _tc_ $_tc_TreeNode] test valuetype-7.3 {complex tree with truncation} { $obj tn [list nv [list _tc_ $_tc_MoreDerived name Reiner value 24 anothername Astrid more ThereIsMore] left [list nv [list name Marc] left 0 right [list nv [list name Phil value 18 anothername Douglas _tc_ $_tc_DerivedType] left 0 right 0]] right 0] $obj tn } [list nv [list name Reiner value 24 anothername Astrid _tc_ $_tc_DerivedType] left [list nv [list name Marc _tc_ $_tc_BaseType] left 0 right [list nv [list name Phil value 18 anothername Douglas _tc_ $_tc_DerivedType] left 0 right 0 _tc_ $_tc_TreeNode] _tc_ $_tc_TreeNode] right 0 _tc_ $_tc_TreeNode] test valuetype-8.1 {empty value as value base} { $obj vb [list _tc_ $_tc_EmptyValue] $obj vb } [list _tc_ $_tc_EmptyValue] test valuetype-8.2 {date value as value base} { $obj vb [list _tc_ $_tc_Date month 9 day 11 year 2001] $obj vb } [list day 11 month 9 year 2001 _tc_ $_tc_Date] } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/10/Makefile0000700000175000010010000000017611107157053013674 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/10/server.tcl0000711000175000010010000000234711107157053014252 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:ValueTest:1.0" } public variable ev public variable d public variable bt public variable dt public variable tn public variable vb } eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/10/test.idl0000700000175000010010000000103211107157053013675 0ustar fpNone valuetype EmptyValue {}; valuetype Date { public unsigned short day; public unsigned short month; public unsigned short year; }; valuetype BaseType { public string name; }; valuetype DerivedType : BaseType { public unsigned long value; public string anothername; }; valuetype TreeNode { public BaseType nv; public TreeNode left, right; }; interface ValueTest { attribute EmptyValue ev; attribute Date d; attribute BaseType bt; attribute DerivedType dt; attribute TreeNode tn; attribute ValueBase vb; }; combat-0.8.1/test/10/test.tcl0000700000175000010010000000276011107157053013720 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{valuetype {IDL:EmptyValue:1.0 EmptyValue 1.0} 0 {} {} {} {} {}} {valuetype\ {IDL:Date:1.0 Date 1.0} 0 {} {} {} {} {{valuemember {IDL:Date/day:1.0 day\ 1.0} {unsigned short} public} {valuemember {IDL:Date/month:1.0 month 1.0}\ {unsigned short} public} {valuemember {IDL:Date/year:1.0 year 1.0} {unsigned\ short} public}}} {valuetype {IDL:BaseType:1.0 BaseType 1.0} 0 {} {} {} {}\ {{valuemember {IDL:BaseType/name:1.0 name 1.0} string public}}} {valuetype\ {IDL:DerivedType:1.0 DerivedType 1.0} IDL:BaseType:1.0 {} {} {} {}\ {{valuemember {IDL:DerivedType/value:1.0 value 1.0} {unsigned long} public}\ {valuemember {IDL:DerivedType/anothername:1.0 anothername 1.0} string\ public}}} {valuetype {IDL:TreeNode:1.0 TreeNode 1.0} 0 {} {} {} {}\ {{valuemember {IDL:TreeNode/nv:1.0 nv 1.0} IDL:BaseType:1.0 public}\ {valuemember {IDL:TreeNode/left:1.0 left 1.0} IDL:TreeNode:1.0 public}\ {valuemember {IDL:TreeNode/right:1.0 right 1.0} IDL:TreeNode:1.0 public}}}\ {interface {IDL:ValueTest:1.0 ValueTest 1.0} {} {{attribute\ {IDL:ValueTest/ev:1.0 ev 1.0} IDL:EmptyValue:1.0} {attribute\ {IDL:ValueTest/d:1.0 d 1.0} IDL:Date:1.0} {attribute {IDL:ValueTest/bt:1.0 bt\ 1.0} IDL:BaseType:1.0} {attribute {IDL:ValueTest/dt:1.0 dt 1.0}\ IDL:DerivedType:1.0} {attribute {IDL:ValueTest/tn:1.0 tn 1.0}\ IDL:TreeNode:1.0} {attribute {IDL:ValueTest/vb:1.0 vb 1.0} {value base}}}}} combat-0.8.1/test/11/0000755000175000010010000000000011615566706012255 5ustar fpNonecombat-0.8.1/test/11/dotest0000711000175000010010000001140411107157057013464 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test dii-1.1 {simple square op} { corba::dii $obj {{unsigned long} square {{in short}}} 42 } {1764} test dii-1.2 {short attribute} { corba::dii $obj {void _set_s {{in short}}} 42 corba::dii $obj {short _get_s {}} } {42} test dii-1.3 {readonly string attribute} { corba::dii $obj {string _get_ra {}} } {Hello World} test dii-2.1 {in and out strings} { set out Blubber set res [corba::dii $obj {long copy {{in string} {out string}}} "Hello World" out] list $res $out } {11 {Hello World}} test dii-2.2 {inout string} { set str "Hello World" set res [corba::dii $obj {void reverse {{inout string}}} str] list $res $str } {{} {dlroW olleH}} test dii-2.3 {sequence passing} { set res [corba::dii $obj {{unsigned short} length {{in {sequence {struct {} {member long}}}} {out {enum {ODD EVEN}}}}} {{member 1} {member 2} {member 3} {member 4} {member 5} {member 6} {member 7} {member 8} {member 9}} e] list $res $e } {9 ODD} test dii-2.4 {complex return value} { corba::dii $obj {{sequence {struct {} {member long}}} squares {{in {unsigned short}}}} 5 } {{member 0} {member 1} {member 4} {member 9} {member 16}} test dii-3.1 {object reference return value} { set newobj [corba::dii $obj {Object dup {}}] corba::dii $newobj {{unsigned long} square {{in short}}} 42 } {1764} test dii-3.2 {object reference parameter} { corba::dii $obj {boolean isme {{in Object}}} $obj } {1} test dii-3.3 {nil object reference parameter} { corba::dii $obj {boolean isme {{in Object}}} 0 } {0} test dii-3.4 {object reference out parameter} { unset newobj corba::dii $obj {void dup2 {{in Object} {out Object}}} $obj newobj corba::dii $newobj {boolean isme {{in Object}}} $obj } {1} test dii-4.1 {catching user exception} { catch { corba::dii $obj {void DontCallMe {} {{exception IDL:Oops:1.0 {what string}}}} } res set res } {IDL:Oops:1.0 {what {I said, don't call me!}}} test dii-4.2 {oneway op} { corba::dii $obj {void nop {} {} oneway} } {} test dii-5.1 {async square} { set handle [corba::dii -async $obj {{unsigned long} square {{in short}}} 42] corba::request get $handle } {1764} test dii-5.2 {multiple squares} { set h1 [corba::dii -async $obj {{unsigned long} square {{in short}}} 2] set h2 [corba::dii -async $obj {{unsigned long} square {{in short}}} 3] set h3 [corba::dii -async $obj {{unsigned long} square {{in short}}} 4] set res [corba::request get $h3] lappend res [corba::request get $h2] lappend res [corba::request get $h1] } {16 9 4} test dii-5.3 {async invocation with out parameter} { set h1 [corba::dii -async $obj {long copy {{in string} {out string}}} "Hello World" out1] set h2 [corba::dii -async $obj {long copy {{in string} {out string}}} "" out2] set h3 [corba::dii -async $obj {long copy {{in string} {out string}}} "42" out3] catch {unset res} lappend res [corba::request get $h1] lappend res [corba::request get $h2] lappend res [corba::request get $h3] lappend res $out1 lappend res $out2 lappend res $out3 } {11 0 2 {Hello World} {} 42} test dii-6.1 {callback handler} { global result proc callback {handle} { global result set result [corba::request get $handle] } set handle [corba::dii -callback callback $obj {{unsigned long} square {{in short}}} 42] vwait result set result } {1764} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/11/Makefile0000700000175000010010000000017611107157056013700 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/11/server.tcl0000711000175000010010000000745511107157057014264 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class DiamondA_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:diamonda:1.0" } public method opa {} { return "opa" } } itcl::class DiamondB_impl { inherit DiamondA_impl public method _Interface {} { return "IDL:diamondb:1.0" } public method opb {} { return "opb" } } itcl::class DiamondC_impl { inherit DiamondA_impl public method _Interface {} { return "IDL:diamondc:1.0" } public method opc {} { return "opc" } } # # must avoid diamond inheritance in [incr Tcl]. We can use delegation, or # just re-implement everything. Here, we inherit diamondb and have to add # the implementation for diamondc on our own. # itcl::class DiamondD_impl { inherit DiamondB_impl public method _Interface {} { return "IDL:diamondd:1.0" } public method opc {} { return "opc" } public method opd {} { return "opd" } } itcl::class Server_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:operations:1.0" } public variable s 42 public variable ra "Hello World" public method square { x } { return [expr {$x * $x}] } public method copy { sin sout_name } { upvar $sout_name sout set sout $sin return [string length $sin] } public method length { queue oe_name } { upvar $oe_name oe set res [llength $queue] if {[expr $res % 2] == 0} { set oe EVEN } else { set oe ODD } return $res } public method squares { howmany } { set res "" for {set i 0} {$i < $howmany} {incr i} { lappend res [list member [expr $i * $i]] } return $res } public method reverse { str_name } { upvar $str_name str set res "" foreach c [split $str {}] { set res $c$res } set str $res } public method nop {} { } public method dup {} { return [_this] } public method dup2 {o1 o2_name} { upvar $o2_name o2 set o2 $o1 } public method isme {obj} { return [[_this] _is_equivalent $obj] } public method getdiamond {} { set da [namespace current]::[DiamondA_impl #auto] set db [namespace current]::[DiamondB_impl #auto] set dc [namespace current]::[DiamondC_impl #auto] set dd [namespace current]::[DiamondD_impl #auto] # # According to the CORBA 2.3 specs, implicit activation doesn't # work for DSI servants. This is probably a bug in the specs and # has been reported as an issue. # set res(a) [$::poa servant_to_reference $da] set res(b) [$::poa servant_to_reference $db] set res(c) [$::poa servant_to_reference $dc] set res(d) [$::poa servant_to_reference $dd] set res(abcd) [list $res(a) $res(b) $res(c) $res(d)] return [array get res] } public method DontCallMe {} { corba::throw {IDL:Oops:1.0 {what {I said, don't call me!}}} } } # # Initialize ORB # eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/11/test.idl0000700000175000010010000000172511107157057013713 0ustar fpNone enum E { ODD, EVEN }; struct S { long member; }; typedef sequence Q; exception Oops { string what; }; interface diamonda { string opa (); }; interface diamondb : diamonda { string opb (); }; interface diamondc : diamonda { string opc (); }; interface diamondd : diamondb, diamondc { string opd (); }; struct diamond { diamonda a; diamondb b; diamondc c; diamondd d; sequence abcd; }; interface operations { attribute short s; readonly attribute string ra; unsigned long square (in short x); long copy (in string sin, out string sout); unsigned short length (in Q queue, out E oe); Q squares (in unsigned short howmany); void reverse (inout string str); oneway void nop (); operations dup (); void dup2 (in Object o1, out Object o2); boolean isme (in Object obj); diamond getdiamond (); void DontCallMe () raises (Oops); }; combat-0.8.1/test/11/test.tcl0000700000175000010010000000406011107157057013720 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:E:1.0 E 1.0} {ODD EVEN}} {struct {IDL:S:1.0 S 1.0} {{member\ long}} {}} {typedef {IDL:Q:1.0 Q 1.0} {sequence IDL:S:1.0}} {exception\ {IDL:Oops:1.0 Oops 1.0} {{what string}} {}} {interface {IDL:diamonda:1.0\ diamonda 1.0} {} {{operation {IDL:diamonda/opa:1.0 opa 1.0} string {} {}}}}\ {interface {IDL:diamondb:1.0 diamondb 1.0} IDL:diamonda:1.0 {{operation\ {IDL:diamondb/opb:1.0 opb 1.0} string {} {}}}} {interface {IDL:diamondc:1.0\ diamondc 1.0} IDL:diamonda:1.0 {{operation {IDL:diamondc/opc:1.0 opc 1.0}\ string {} {}}}} {interface {IDL:diamondd:1.0 diamondd 1.0} {IDL:diamondb:1.0\ IDL:diamondc:1.0} {{operation {IDL:diamondd/opd:1.0 opd 1.0} string {} {}}}}\ {struct {IDL:diamond:1.0 diamond 1.0} {{a IDL:diamonda:1.0} {b\ IDL:diamondb:1.0} {c IDL:diamondc:1.0} {d IDL:diamondd:1.0} {abcd {sequence\ Object}}} {}} {interface {IDL:operations:1.0 operations 1.0} {} {{attribute\ {IDL:operations/s:1.0 s 1.0} short} {attribute {IDL:operations/ra:1.0 ra 1.0}\ string readonly} {operation {IDL:operations/square:1.0 square 1.0} {unsigned\ long} {{in x short}} {}} {operation {IDL:operations/copy:1.0 copy 1.0} long\ {{in sin string} {out sout string}} {}} {operation {IDL:operations/length:1.0\ length 1.0} {unsigned short} {{in queue IDL:Q:1.0} {out oe IDL:E:1.0}} {}}\ {operation {IDL:operations/squares:1.0 squares 1.0} IDL:Q:1.0 {{in howmany\ {unsigned short}}} {}} {operation {IDL:operations/reverse:1.0 reverse 1.0}\ void {{inout str string}} {}} {operation {IDL:operations/nop:1.0 nop 1.0}\ void {} {} oneway} {operation {IDL:operations/dup:1.0 dup 1.0}\ IDL:operations:1.0 {} {}} {operation {IDL:operations/dup2:1.0 dup2 1.0} void\ {{in o1 Object} {out o2 Object}} {}} {operation {IDL:operations/isme:1.0 isme\ 1.0} boolean {{in obj Object}} {}} {operation {IDL:operations/getdiamond:1.0\ getdiamond 1.0} IDL:diamond:1.0 {} {}} {operation\ {IDL:operations/DontCallMe:1.0 DontCallMe 1.0} void {} IDL:Oops:1.0}}}} combat-0.8.1/test/2/0000755000175000010010000000000011615566706012175 5ustar fpNonecombat-0.8.1/test/2/dotest0000711000175000010010000001410011107157061013373 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test composed-1.1 {enum attribute} { set res {} $obj e1 A lappend res [$obj e1] $obj e2 Z lappend res [$obj e2] } {A Z} test composed-1.2 {enum values} { set res {} foreach val {A B C D E} { $obj e1 $val lappend res [$obj e1] } foreach val {Z Y X W V} { $obj e2 $val lappend res [$obj e2] } set res } {A B C D E Z Y X W V} test composed-1.3 {illegal enum values} { set res [catch {$obj e1 ARGH}] lappend res [catch {$obj e1 Z}] lappend res [catch {$obj e1 ""}] lappend res [catch {$obj e2 ZYX}] lappend res [catch {$obj e2 A}] lappend res [catch {$obj e2 ""}] } {1 1 1 1 1 1} test composed-2.1 {typedef'd value} { $obj d 42 $obj d } {42} test composed-3.1 {flat struct} { $obj s1 {s 42 e1 A q {Hello World}} $obj s1 } {s 42 e1 A q {Hello World}} test composed-3.2 {more complex struct} { $obj s2 {b true s1 {s -32768 e1 E q blubber} e2 X ul 123456} $obj s2 } {b 1 s1 {s -32768 e1 E q blubber} e2 X ul 123456} test composed-3.3 {deep struct} { $obj s3 {s1 {s -1 e1 B q argh} s2 {b false s1 {s 31598 e1 C q quark} e2 Y ul 654321}} $obj s3 } {s1 {s -1 e1 B q argh} s2 {b 0 s1 {s 31598 e1 C q quark} e2 Y ul 654321}} test composed-3.4 {ordering of struct members} { $obj s1 {q {Hello World} e1 A s 42} $obj s1 } {s 42 e1 A q {Hello World}} test composed-3.5 {struct with recursive sequence} { $obj s4 {name root left {{name left-node left {} right {}}} right {{name right-node left {} right {}}}} $obj s4 } {name root left {{name left-node left {} right {}}} right {{name right-node left {} right {}}}} test composed-4.1 {sequence} { $obj q1 {{s 43 e1 B q {Hello World}}} $obj q1 } {{s 43 e1 B q {Hello World}}} test composed-4.2 {empty sequence} { $obj q1 {} $obj q1 } {} test composed-4.3 {really long sequence} { catch {unset data} for {set i 0} {$i < 1025} {incr i} { lappend data [list s $i e1 D q $i] } $obj q1 $data set res [$obj q1] set ok 0 if {[llength $res] == 1025 && $data == $res} { set ok 1 } set ok } {1} test composed-4.4 {bounded sequence} { $obj q2 {{b true s1 {s 0 e1 A q quark} e2 Z ul 1} {b false s1 {s -1 e1 B q blubb} e2 Y ul 2}} $obj q2 } {{b 1 s1 {s 0 e1 A q quark} e2 Z ul 1} {b 0 s1 {s -1 e1 B q blubb} e2 Y ul 2}} test composed-4.5 {empty bounded sequence} { $obj q2 {} $obj q2 } {} test composed-4.6 {overflow bounded sequence} { set val {b true s1 {s 0 e1 A q quark} e2 Z ul 1} $obj q2 [list $val] set res [catch {$obj q2 [list $val $val $val]}] lappend res [$obj q2] } {1 {{b 1 s1 {s 0 e1 A q quark} e2 Z ul 1}}} test composed-4.7 {char sequence} { $obj q3 {Hello World} $obj q3 } {Hello World} test composed-4.8 {max char sequence} { $obj q3 1234567890123456 $obj q3 } {1234567890123456} test composed-4.9 {overflow char sequence} { catch {$obj q3 12345678901234567} } {1} test composed-4.10 {octet sequence} { $obj q4 Blubber $obj q4 } {Blubber} test composed-4.11 {binary octet sequence} { $obj q4 [binary format c* {3 2 1 0 -128 -127 -126 127}] set res [$obj q4] if {[binary scan $res c* data] != 1} { error "oops -- cannot binary scan value" } set data } {3 2 1 0 -128 -127 -126 127} test composed-4.12 {unbounded octet sequence} { $obj os "Hello World. This is a long octet sequence to test efficient marshalling of long octet sequences." $obj os } {Hello World. This is a long octet sequence to test efficient marshalling of long octet sequences.} test composed-5.1 {one-dimensional array} { $obj a1 {A B C} $obj a1 } {A B C} test composed-5.2 {illegal number of array elements} { set res [catch {$obj a1 {}}] lappend res [catch {$obj a1 {A}}] lappend res [catch {$obj a1 {A B}}] lappend res [catch {$obj a1 {A B C}}] lappend res [catch {$obj a1 {A B C D}}] lappend res [catch {$obj a1 {A B C D E}}] } {1 1 1 0 1 1} test composed-5.3 {two-dimensional array} { $obj a2 {{Z Y X} {W V Z}} $obj a2 } {{Z Y X} {W V Z}} test composed-5.4 {character array} { $obj a3 1234567890123456 $obj a3 } {1234567890123456} test composed-5.5 {illegal number of array elements} { set res [catch {$obj a3 {}}] lappend res [catch {$obj a3 123456789012345}] lappend res [catch {$obj a3 12345678901234567}] } {1 1 1} test composed-5.6 {octet array} { $obj a4 12345678 $obj a4 } {12345678} test composed-5.7 {binary octet array} { $obj a4 [binary format c* {3 2 1 0 -128 -127 -126 127}] set res [$obj a4] if {[binary scan $res c* data] != 1} { error "oops -- cannot binary scan value" } set data } {3 2 1 0 -128 -127 -126 127} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/2/Makefile0000700000175000010010000000017611107157061013614 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/2/server.tcl0000711000175000010010000000271411107157061014170 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:composed:1.0" } public variable e1 public variable e2 public variable d public variable s1 public variable s2 public variable s3 public variable s4 public variable q1 public variable q2 public variable q3 public variable q4 public variable a1 public variable a2 public variable a3 public variable a4 public variable os } eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/2/test.idl0000700000175000010010000000177311107157061013631 0ustar fpNone enum Enum1 {A, B, C, D, E}; enum Enum2 {Z, Y, X, W, V}; typedef unsigned long datum; struct Struct1 { short s; Enum1 e1; string q; }; struct Struct2 { boolean b; Struct1 s1; Enum2 e2; unsigned long ul; }; typedef struct Struct3_ { Struct1 s1; Struct2 s2; } Struct3; struct Struct4 { string name; sequence left; sequence right; }; typedef sequence Seq1; typedef sequence Seq2; typedef sequence Seq3; typedef sequence Seq4; typedef Enum1 Arr1[3]; typedef Enum2 Arr2[2][3]; typedef char Arr3[16]; typedef octet Arr4[8]; typedef sequence OctSeq; interface composed { attribute Enum1 e1; attribute Enum2 e2; attribute datum d; attribute Struct1 s1; attribute Struct2 s2; attribute Struct3 s3; attribute Struct4 s4; attribute Seq1 q1; attribute Seq2 q2; attribute Seq3 q3; attribute Seq4 q4; attribute Arr1 a1; attribute Arr2 a2; attribute Arr3 a3; attribute Arr4 a4; attribute OctSeq os; }; combat-0.8.1/test/2/test.tcl0000700000175000010010000000436511107157061013643 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:Enum1:1.0 Enum1 1.0} {A B C D E}} {enum {IDL:Enum2:1.0 Enum2 1.0}\ {Z Y X W V}} {typedef {IDL:datum:1.0 datum 1.0} {unsigned long}} {struct\ {IDL:Struct1:1.0 Struct1 1.0} {{s short} {e1 IDL:Enum1:1.0} {q string}} {}}\ {struct {IDL:Struct2:1.0 Struct2 1.0} {{b boolean} {s1 IDL:Struct1:1.0} {e2\ IDL:Enum2:1.0} {ul {unsigned long}}} {}} {struct {IDL:Struct3_:1.0 Struct3_\ 1.0} {{s1 IDL:Struct1:1.0} {s2 IDL:Struct2:1.0}} {}} {typedef\ {IDL:Struct3:1.0 Struct3 1.0} IDL:Struct3_:1.0} {struct {IDL:Struct4:1.0\ Struct4 1.0}} {struct {IDL:Struct4:1.0 Struct4 1.0} {{name string} {left\ {sequence IDL:Struct4:1.0 1}} {right {sequence IDL:Struct4:1.0 1}}} {}}\ {typedef {IDL:Seq1:1.0 Seq1 1.0} {sequence IDL:Struct1:1.0}} {typedef\ {IDL:Seq2:1.0 Seq2 1.0} {sequence IDL:Struct2:1.0 2}} {typedef {IDL:Seq3:1.0\ Seq3 1.0} {sequence char 16}} {typedef {IDL:Seq4:1.0 Seq4 1.0} {sequence\ octet 8}} {typedef {IDL:Arr1:1.0 Arr1 1.0} {array IDL:Enum1:1.0 3}} {typedef\ {IDL:Arr2:1.0 Arr2 1.0} {array {array IDL:Enum2:1.0 3} 2}} {typedef\ {IDL:Arr3:1.0 Arr3 1.0} {array char 16}} {typedef {IDL:Arr4:1.0 Arr4 1.0}\ {array octet 8}} {typedef {IDL:OctSeq:1.0 OctSeq 1.0} {sequence octet}}\ {interface {IDL:composed:1.0 composed 1.0} {} {{attribute\ {IDL:composed/e1:1.0 e1 1.0} IDL:Enum1:1.0} {attribute {IDL:composed/e2:1.0\ e2 1.0} IDL:Enum2:1.0} {attribute {IDL:composed/d:1.0 d 1.0} IDL:datum:1.0}\ {attribute {IDL:composed/s1:1.0 s1 1.0} IDL:Struct1:1.0} {attribute\ {IDL:composed/s2:1.0 s2 1.0} IDL:Struct2:1.0} {attribute {IDL:composed/s3:1.0\ s3 1.0} IDL:Struct3:1.0} {attribute {IDL:composed/s4:1.0 s4 1.0}\ IDL:Struct4:1.0} {attribute {IDL:composed/q1:1.0 q1 1.0} IDL:Seq1:1.0}\ {attribute {IDL:composed/q2:1.0 q2 1.0} IDL:Seq2:1.0} {attribute\ {IDL:composed/q3:1.0 q3 1.0} IDL:Seq3:1.0} {attribute {IDL:composed/q4:1.0 q4\ 1.0} IDL:Seq4:1.0} {attribute {IDL:composed/a1:1.0 a1 1.0} IDL:Arr1:1.0}\ {attribute {IDL:composed/a2:1.0 a2 1.0} IDL:Arr2:1.0} {attribute\ {IDL:composed/a3:1.0 a3 1.0} IDL:Arr3:1.0} {attribute {IDL:composed/a4:1.0 a4\ 1.0} IDL:Arr4:1.0} {attribute {IDL:composed/os:1.0 os 1.0} IDL:OctSeq:1.0}}}} combat-0.8.1/test/3/0000755000175000010010000000000011615566706012176 5ustar fpNonecombat-0.8.1/test/3/dotest0000711000175000010010000001133711107157064013410 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test unions-1.1 {union} { $obj u1 {0 42} $obj u1 } {0 42} test unions-1.2 {union short discriminators} { set res {} $obj u1 {-1 {Blubb}} lappend res [$obj u1] $obj u1 {1 {Hello World}} lappend res [$obj u1] $obj u1 {-2 A} lappend res [$obj u1] $obj u1 {2 D} lappend res [$obj u1] } {{-1 Blubb} {1 {Hello World}} {-2 A} {2 D}} test unions-1.3 {empty union} { set res {} $obj u1 {3 {}} lappend res [$obj u1] $obj u1 {-3 {}} lappend res [$obj u1] $obj u1 {-32768 {}} lappend res [$obj u1] $obj u1 {32767 {}} lappend res [$obj u1] set out {} foreach val $res { set disc [lindex $val 0] if {$disc == 0 || $disc == -1 || $disc == 1 || \ $disc == -2 || $disc == 2 || [lindex $val 1] != ""} { lappend out 1 } else { lappend out 0 } } set out } {0 0 0 0} test unions-1.4 {illegal union values} {knownBug} { set res {} lappend res [catch {$obj u1 {-32769 blubb}}] lappend res [catch {$obj u1 {0 blubb}}] lappend res [catch {$obj u1 {-2 E}}] lappend res [catch {$obj u1 {42}}] } {1 1 1 1} test unions-2.1 {enum-discriminated union} { $obj u2 {A 42} $obj u2 } {A 42} test unions-2.2 {enum-discriminated union values} { set res {} $obj u2 {B {Hello World}} lappend res [$obj u2] $obj u2 {C 32768} lappend res [$obj u2] $obj u2 {D D} lappend res [$obj u2] } {{B {Hello World}} {C 32768} {D D}} test unions-3.1 {boolean-discriminated union} { set res {} $obj u3 {true 42} lappend res [$obj u3] $obj u3 {false -42} lappend res [$obj u3] $obj u3 {1 65535} lappend res [$obj u3] $obj u3 {0 65536} lappend res [$obj u3] } {{1 42} {0 -42} {1 65535} {0 65536}} test unions-4.1 {union with default} { set res {} $obj u4 {true 42} lappend res [$obj u4] $obj u4 {false -1} lappend res [$obj u4] $obj u4 {(default) -2} lappend res [$obj u4] } {{1 42} {0 -1} {0 -2}} test unions-5.1 {union with explicit default, members} { set res {} $obj u5 {1 42} lappend res [$obj u5] $obj u5 {2 {Hello World}} lappend res [$obj u5] $obj u5 {3 Blubber} lappend res [$obj u5] } {{1 42} {2 {Hello World}} {3 Blubber}} test unions-5.2 {union with explicit default, defaults} { set res {} $obj u5 {0 A} set val [$obj u5] if {[lindex $val 0] == 1 || [lindex $val 0] == 2 || \ [lindex $val 0] == 3 || [lindex $val 1] != "A"} { lappend res 0 } else { lappend res 1 } $obj u5 {4 B} set val [$obj u5] if {[lindex $val 0] == 1 || [lindex $val 0] == 2 || \ [lindex $val 0] == 3 || [lindex $val 1] != "B"} { lappend res 0 } else { lappend res 1 } $obj u5 {-32768 C} set val [$obj u5] if {[lindex $val 0] == 1 || [lindex $val 0] == 2 || \ [lindex $val 0] == 3 || [lindex $val 1] != "C"} { lappend res 0 } else { lappend res 1 } $obj u5 {(default) D} set val [$obj u5] if {[lindex $val 0] == 1 || [lindex $val 0] == 2 || \ [lindex $val 0] == 3 || [lindex $val 1] != "D"} { lappend res 0 } else { lappend res 1 } } {1 1 1 1} test unions-6.1 {union with recursive sequence} { $obj u6 {true {{false 1} {true {{false 2}}}}} set res [$obj u6] } {1 {{0 1} {1 {{0 2}}}}} test unions-7.1 {union with nested types} { set res {} $obj u7 {1 {true 0}} lappend res [$obj u7] $obj u7 {0 {l 42}} lappend res [$obj u7] } {{1 {1 0}} {0 {l 42}}} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/3/Makefile0000700000175000010010000000017611107157064013620 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/3/server.tcl0000711000175000010010000000237411107157064014176 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:unions:1.0" } public variable u1 public variable u2 public variable u3 public variable u4 public variable u5 public variable u6 public variable u7 } eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/3/test.idl0000700000175000010010000000164511107157064013633 0ustar fpNone typedef enum E_ { A, B, C, D } E; union Union1 switch (short) { case 0: short a; case -1: case 1: string b; case -2: case 2: E c; }; union Union2 switch (E) { case A: short av; case B: string bv; case C: unsigned long cv; case D: E dv; }; union Union3 switch (boolean) { case TRUE: unsigned short a; case FALSE: long b; }; union Union4 switch (boolean) { case TRUE: unsigned short a; default: long b; }; union Union5 switch (short) { case 1: unsigned short a; case 2: case 3: string b; default: E c; }; union Union6 switch (boolean) { case TRUE: sequence s; case FALSE: long l; }; union Union7 switch (short) { case 1: union subu switch (boolean) { case TRUE: long l; } u; default: struct subs { string l; } d; }; interface unions { attribute Union1 u1; attribute Union2 u2; attribute Union3 u3; attribute Union4 u4; attribute Union5 u5; attribute Union6 u6; attribute Union7 u7; }; combat-0.8.1/test/3/test.tcl0000700000175000010010000000302711107157064013641 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:E_:1.0 E_ 1.0} {A B C D}} {typedef {IDL:E:1.0 E 1.0} IDL:E_:1.0}\ {union {IDL:Union1:1.0 Union1 1.0} short {{0 a short} {-1 b string} {1 b\ string} {-2 c IDL:E:1.0} {2 c IDL:E:1.0}} {}} {union {IDL:Union2:1.0 Union2\ 1.0} IDL:E:1.0 {{A av short} {B bv string} {C cv {unsigned long}} {D dv\ IDL:E:1.0}} {}} {union {IDL:Union3:1.0 Union3 1.0} boolean {{1 a {unsigned\ short}} {0 b long}} {}} {union {IDL:Union4:1.0 Union4 1.0} boolean {{1 a\ {unsigned short}} {(default) b long}} {}} {union {IDL:Union5:1.0 Union5 1.0}\ short {{1 a {unsigned short}} {2 b string} {3 b string} {(default) c\ IDL:E:1.0}} {}} {union {IDL:Union6:1.0 Union6 1.0}} {union {IDL:Union6:1.0\ Union6 1.0} boolean {{1 s {sequence IDL:Union6:1.0}} {0 l long}} {}} {union\ {IDL:Union7:1.0 Union7 1.0} short {{1 u IDL:Union7/subu:1.0} {(default) d\ IDL:Union7/subs:1.0}} {{union {IDL:Union7/subu:1.0 subu 1.0} boolean {{1 l\ long}} {}} {struct {IDL:Union7/subs:1.0 subs 1.0} {{l string}} {}}}}\ {interface {IDL:unions:1.0 unions 1.0} {} {{attribute {IDL:unions/u1:1.0 u1\ 1.0} IDL:Union1:1.0} {attribute {IDL:unions/u2:1.0 u2 1.0} IDL:Union2:1.0}\ {attribute {IDL:unions/u3:1.0 u3 1.0} IDL:Union3:1.0} {attribute\ {IDL:unions/u4:1.0 u4 1.0} IDL:Union4:1.0} {attribute {IDL:unions/u5:1.0 u5\ 1.0} IDL:Union5:1.0} {attribute {IDL:unions/u6:1.0 u6 1.0} IDL:Union6:1.0}\ {attribute {IDL:unions/u7:1.0 u7 1.0} IDL:Union7:1.0}}}} combat-0.8.1/test/4/0000755000175000010010000000000011615566706012177 5ustar fpNonecombat-0.8.1/test/4/dotest0000711000175000010010000001356111107157067013415 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test operations-1.1 {short attribute} { $obj s 42 $obj s } {42} test operations-1.2 {readonly string attribute} { $obj ra } {Hello World} test operations-1.3 {simple square op} { $obj square 42 } {1764} test operations-1.4 {repeated op} { set sum 0 for {set i 0} {$i < 100} {incr i} { set sum [expr $i*$i-[$obj square $i]] } set sum } {0} test operations-2.1 {in and out strings} { set out Blubber set res [$obj copy "Hello World" out] list $res $out } {11 {Hello World}} test operations-2.2 {passing very long strings} { set str "" unset out for {set i 0} {$i < 1024} {incr i} { append str "Hello World" } $obj copy $str out string compare $str $out } {0} test operations-3.1 {sequence passing} { set res [$obj length {{member 1} {member 2} {member 3} {member 4} {member 5} {member 6} {member 7} {member 8} {member 9}} e] list $res $e } {9 ODD} test operations-3.2 {empty sequence passing} { set res [$obj length {} e] list $res $e } {0 EVEN} test operations-4.1 {complex return value} { $obj squares 5 } {{member 0} {member 1} {member 4} {member 9} {member 16}} test operations-5.1 {inout string, void return} { set str "Hello World" set res [$obj reverse str] list $res $str } {{} {dlroW olleH}} test operations-6.1 {oneway op} { $obj nop } {} test operations-7.1 {object reference return value} { set newobj [$obj dup] $newobj square 42 } {1764} test operations-7.2 {object reference parameter} { $obj isme $obj } {1} test operations-7.3 {nil object reference parameter} { $obj isme 0 } {0} test operations-7.4 {object reference out parameter} { unset newobj $obj dup2 $obj newobj $newobj isme $obj } {1} test operations-8.1 {_is_a builtin} { unset res lappend res [$obj _is_a IDL:operations:1.0] lappend res [$obj _is_a IDL:foobar:1.0] set res } {1 0} test operations-8.2 {_non_existent builtin} { $obj _non_existent } {0} test operations-8.3 {_is_equivalent builtin} { unset res lappend res [$obj _is_equivalent $obj] lappend res [$obj _is_equivalent 0] } {1 0} test operations-9.1 {catching user exception} { catch { $obj DontCallMe } res set res } {IDL:Oops:1.0 {what {I said, don't call me!}}} test operations-10.1 {get diamond structure} { global diamond array set diamond [$obj getdiamond] expr 1 } {1} test operations-10.2 {diamond object identities} { global diamond unset res lappend res [$diamond(a) _is_a IDL:diamonda:1.0] lappend res [$diamond(a) _is_a IDL:diamondb:1.0] lappend res [$diamond(a) _is_a IDL:diamondc:1.0] lappend res [$diamond(a) _is_a IDL:diamondd:1.0] lappend res [$diamond(b) _is_a IDL:diamonda:1.0] lappend res [$diamond(b) _is_a IDL:diamondb:1.0] lappend res [$diamond(b) _is_a IDL:diamondc:1.0] lappend res [$diamond(b) _is_a IDL:diamondd:1.0] lappend res [$diamond(c) _is_a IDL:diamonda:1.0] lappend res [$diamond(c) _is_a IDL:diamondb:1.0] lappend res [$diamond(c) _is_a IDL:diamondc:1.0] lappend res [$diamond(c) _is_a IDL:diamondd:1.0] lappend res [$diamond(d) _is_a IDL:diamonda:1.0] lappend res [$diamond(d) _is_a IDL:diamondb:1.0] lappend res [$diamond(d) _is_a IDL:diamondc:1.0] lappend res [$diamond(d) _is_a IDL:diamondd:1.0] } {1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1} test operations-10.3 {diamond operations} { global diamond unset res lappend res [$diamond(a) opa] lappend res [$diamond(b) opa] lappend res [$diamond(b) opb] lappend res [$diamond(c) opa] lappend res [$diamond(c) opc] lappend res [$diamond(d) opa] lappend res [$diamond(d) opb] lappend res [$diamond(d) opc] lappend res [$diamond(d) opd] } {opa opa opb opa opc opa opb opc opd} test operations-10.4 {object references within structure} { global diamond unset res lappend res [[lindex $diamond(abcd) 0] opa] lappend res [[lindex $diamond(abcd) 1] opb] lappend res [[lindex $diamond(abcd) 2] opc] lappend res [[lindex $diamond(abcd) 3] opd] } {opa opb opc opd} test operations-10.5 {squeezing diamond through object} { global diamond unset res $obj dup2 $diamond(a) o1 $obj dup2 $diamond(b) o2 $obj dup2 $diamond(c) o3 $obj dup2 $diamond(d) o4 lappend res [$o1 opa] lappend res [$o2 opa] lappend res [$o2 opb] lappend res [$o3 opa] lappend res [$o3 opc] lappend res [$o4 opa] lappend res [$o4 opb] lappend res [$o4 opc] lappend res [$o4 opd] } {opa opa opb opa opc opa opb opc opd} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/4/Makefile0000700000175000010010000000017611107157067013624 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/4/server.tcl0000711000175000010010000000745511107157067014207 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class DiamondA_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:diamonda:1.0" } public method opa {} { return "opa" } } itcl::class DiamondB_impl { inherit DiamondA_impl public method _Interface {} { return "IDL:diamondb:1.0" } public method opb {} { return "opb" } } itcl::class DiamondC_impl { inherit DiamondA_impl public method _Interface {} { return "IDL:diamondc:1.0" } public method opc {} { return "opc" } } # # must avoid diamond inheritance in [incr Tcl]. We can use delegation, or # just re-implement everything. Here, we inherit diamondb and have to add # the implementation for diamondc on our own. # itcl::class DiamondD_impl { inherit DiamondB_impl public method _Interface {} { return "IDL:diamondd:1.0" } public method opc {} { return "opc" } public method opd {} { return "opd" } } itcl::class Server_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:operations:1.0" } public variable s 42 public variable ra "Hello World" public method square { x } { return [expr {$x * $x}] } public method copy { sin sout_name } { upvar $sout_name sout set sout $sin return [string length $sin] } public method length { queue oe_name } { upvar $oe_name oe set res [llength $queue] if {[expr $res % 2] == 0} { set oe EVEN } else { set oe ODD } return $res } public method squares { howmany } { set res "" for {set i 0} {$i < $howmany} {incr i} { lappend res [list member [expr $i * $i]] } return $res } public method reverse { str_name } { upvar $str_name str set res "" foreach c [split $str {}] { set res $c$res } set str $res } public method nop {} { } public method dup {} { return [_this] } public method dup2 {o1 o2_name} { upvar $o2_name o2 set o2 $o1 } public method isme {obj} { return [[_this] _is_equivalent $obj] } public method getdiamond {} { set da [namespace current]::[DiamondA_impl #auto] set db [namespace current]::[DiamondB_impl #auto] set dc [namespace current]::[DiamondC_impl #auto] set dd [namespace current]::[DiamondD_impl #auto] # # According to the CORBA 2.3 specs, implicit activation doesn't # work for DSI servants. This is probably a bug in the specs and # has been reported as an issue. # set res(a) [$::poa servant_to_reference $da] set res(b) [$::poa servant_to_reference $db] set res(c) [$::poa servant_to_reference $dc] set res(d) [$::poa servant_to_reference $dd] set res(abcd) [list $res(a) $res(b) $res(c) $res(d)] return [array get res] } public method DontCallMe {} { corba::throw {IDL:Oops:1.0 {what {I said, don't call me!}}} } } # # Initialize ORB # eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/4/test.idl0000700000175000010010000000172511107157067013636 0ustar fpNone enum E { ODD, EVEN }; struct S { long member; }; typedef sequence Q; exception Oops { string what; }; interface diamonda { string opa (); }; interface diamondb : diamonda { string opb (); }; interface diamondc : diamonda { string opc (); }; interface diamondd : diamondb, diamondc { string opd (); }; struct diamond { diamonda a; diamondb b; diamondc c; diamondd d; sequence abcd; }; interface operations { attribute short s; readonly attribute string ra; unsigned long square (in short x); long copy (in string sin, out string sout); unsigned short length (in Q queue, out E oe); Q squares (in unsigned short howmany); void reverse (inout string str); oneway void nop (); operations dup (); void dup2 (in Object o1, out Object o2); boolean isme (in Object obj); diamond getdiamond (); void DontCallMe () raises (Oops); }; combat-0.8.1/test/4/test.tcl0000700000175000010010000000406011107157067013643 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:E:1.0 E 1.0} {ODD EVEN}} {struct {IDL:S:1.0 S 1.0} {{member\ long}} {}} {typedef {IDL:Q:1.0 Q 1.0} {sequence IDL:S:1.0}} {exception\ {IDL:Oops:1.0 Oops 1.0} {{what string}} {}} {interface {IDL:diamonda:1.0\ diamonda 1.0} {} {{operation {IDL:diamonda/opa:1.0 opa 1.0} string {} {}}}}\ {interface {IDL:diamondb:1.0 diamondb 1.0} IDL:diamonda:1.0 {{operation\ {IDL:diamondb/opb:1.0 opb 1.0} string {} {}}}} {interface {IDL:diamondc:1.0\ diamondc 1.0} IDL:diamonda:1.0 {{operation {IDL:diamondc/opc:1.0 opc 1.0}\ string {} {}}}} {interface {IDL:diamondd:1.0 diamondd 1.0} {IDL:diamondb:1.0\ IDL:diamondc:1.0} {{operation {IDL:diamondd/opd:1.0 opd 1.0} string {} {}}}}\ {struct {IDL:diamond:1.0 diamond 1.0} {{a IDL:diamonda:1.0} {b\ IDL:diamondb:1.0} {c IDL:diamondc:1.0} {d IDL:diamondd:1.0} {abcd {sequence\ Object}}} {}} {interface {IDL:operations:1.0 operations 1.0} {} {{attribute\ {IDL:operations/s:1.0 s 1.0} short} {attribute {IDL:operations/ra:1.0 ra 1.0}\ string readonly} {operation {IDL:operations/square:1.0 square 1.0} {unsigned\ long} {{in x short}} {}} {operation {IDL:operations/copy:1.0 copy 1.0} long\ {{in sin string} {out sout string}} {}} {operation {IDL:operations/length:1.0\ length 1.0} {unsigned short} {{in queue IDL:Q:1.0} {out oe IDL:E:1.0}} {}}\ {operation {IDL:operations/squares:1.0 squares 1.0} IDL:Q:1.0 {{in howmany\ {unsigned short}}} {}} {operation {IDL:operations/reverse:1.0 reverse 1.0}\ void {{inout str string}} {}} {operation {IDL:operations/nop:1.0 nop 1.0}\ void {} {} oneway} {operation {IDL:operations/dup:1.0 dup 1.0}\ IDL:operations:1.0 {} {}} {operation {IDL:operations/dup2:1.0 dup2 1.0} void\ {{in o1 Object} {out o2 Object}} {}} {operation {IDL:operations/isme:1.0 isme\ 1.0} boolean {{in obj Object}} {}} {operation {IDL:operations/getdiamond:1.0\ getdiamond 1.0} IDL:diamond:1.0 {} {}} {operation\ {IDL:operations/DontCallMe:1.0 DontCallMe 1.0} void {} IDL:Oops:1.0}}}} combat-0.8.1/test/5/0000755000175000010010000000000011615566706012200 5ustar fpNonecombat-0.8.1/test/5/dotest0000711000175000010010000001333111107157071013404 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test any-1.1 {enum typecode} { set _tc_MyEnum [corba::type of IDL:MyEnum:1.0] } {enum {A B C D}} test any-1.2 {struct typecode} { set _tc_MyStruct [corba::type of IDL:MyStruct:1.0] } {struct IDL:MyStruct:1.0 {s short e {enum {A B C D}} q string}} test any-1.3 {sequence typecode} { set _tc_MySequence [corba::type of IDL:MySequence:1.0] } {sequence {struct IDL:MyStruct:1.0 {s short e {enum {A B C D}} q string}}} test any-1.4 {array typecode} { set _tc_MyArray [corba::type of IDL:MyArray:1.0] } {array {enum {A B C D}} 3} test any-1.5 {union (no default) typecode} { set _tc_NoDefault [corba::type of IDL:NoDefault:1.0] } {union IDL:NoDefault:1.0 boolean {1 {enum {A B C D}} 0 {struct IDL:MyStruct:1.0 {s short e {enum {A B C D}} q string}}}} test any-1.6 {union (explicit default) typecode} { set _tc_ExplicitDefault [corba::type of IDL:ExplicitDefault:1.0] } {union IDL:ExplicitDefault:1.0 {unsigned short} {0 {enum {A B C D}} 1 {enum {A B C D}} (default) string}} test any-1.7 {union (without default) typecode} { set _tc_WithoutDefault [corba::type of IDL:WithoutDefault:1.0] } {union IDL:WithoutDefault:1.0 boolean {1 {enum {A B C D}}}} test any-2.1 {any test} { $obj value {boolean 1} $obj value } {boolean 1} test any-2.2 {integer types} { set res "" $obj value {short -1} lappend res [$obj value] $obj value {long 42} lappend res [$obj value] $obj value {{unsigned short} 6274} lappend res [$obj value] $obj value {{unsigned long} 18} lappend res [$obj value] } {{short -1} {long 42} {{unsigned short} 6274} {{unsigned long} 18}} test any-2.3 {float types} { set res "" $obj value {float 3.5} lappend res [$obj value] $obj value {double 1.25} lappend res [$obj value] } {{float 3.5} {double 1.25}} test any-2.4 {string type} { set res "" $obj value {string {Hello World}} lappend res [$obj value] $obj value {string ""} lappend res [$obj value] } {{string {Hello World}} {string {}}} test any-3.1 {enum type} { $obj value [list $_tc_MyEnum A] $obj value } [list $_tc_MyEnum A] test any-3.2 {struct type} { $obj value [list $_tc_MyStruct {s 42 e C q {Hello World}}] $obj value } [list $_tc_MyStruct {s 42 e C q {Hello World}}] test any-3.3 {sequence of structs} { $obj value [list $_tc_MySequence {{s 42 e C q {Hello World}} {s -1 e A q {}}}] $obj value } [list $_tc_MySequence {{s 42 e C q {Hello World}} {s -1 e A q {}}}] test any-3.4 {array type} { $obj value [list $_tc_MyArray {A B C}] $obj value } [list $_tc_MyArray {A B C}] test any-4.1 {union (no default) type} { $obj value [list $_tc_NoDefault {1 D}] $obj value } [list $_tc_NoDefault {1 D}] test any-4.2 {union (explicit default) type} { $obj value [list $_tc_ExplicitDefault {2 {Hello World}}] $obj value } [list $_tc_ExplicitDefault {2 {Hello World}}] test any-4.3 {union (without default) type} { $obj value [list $_tc_WithoutDefault {1 D}] $obj value } [list $_tc_WithoutDefault {1 D}] test any-5.1 {enum typecheck} { set res "" lappend res [corba::type equivalent $_tc_MyEnum $_tc_MyEnum] lappend res [corba::type equivalent $_tc_MyEnum $_tc_MyStruct] lappend res [corba::type equivalent $_tc_MyEnum $_tc_MySequence] lappend res [corba::type equivalent $_tc_MyEnum $_tc_MyArray] } {1 0 0 0} test any-5.2 {struct typecheck} { set res "" lappend res [corba::type equivalent $_tc_MyStruct $_tc_MyEnum] lappend res [corba::type equivalent $_tc_MyStruct $_tc_MyStruct] lappend res [corba::type equivalent $_tc_MyStruct $_tc_MySequence] lappend res [corba::type equivalent $_tc_MyStruct $_tc_MyArray] } {0 1 0 0} test any-5.3 {sequence typecheck} { set res "" lappend res [corba::type equivalent $_tc_MySequence $_tc_MyEnum] lappend res [corba::type equivalent $_tc_MySequence $_tc_MyStruct] lappend res [corba::type equivalent $_tc_MySequence $_tc_MySequence] lappend res [corba::type equivalent $_tc_MySequence $_tc_MyArray] } {0 0 1 0} test any-5.3 {array typecheck} { set res "" lappend res [corba::type equivalent $_tc_MyArray $_tc_MyEnum] lappend res [corba::type equivalent $_tc_MyArray $_tc_MyStruct] lappend res [corba::type equivalent $_tc_MyArray $_tc_MySequence] lappend res [corba::type equivalent $_tc_MyArray $_tc_MyArray] } {0 0 0 1} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/5/Makefile0000700000175000010010000000017611107157071013620 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/5/server.tcl0000711000175000010010000000216611107157071014175 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:AnyTest:1.0" } public variable value } eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/5/test.idl0000700000175000010010000000067411107157072013635 0ustar fpNone enum MyEnum {A, B, C, D}; struct MyStruct { short s; MyEnum e; string q; }; typedef sequence MySequence; typedef MyEnum MyArray[3]; union NoDefault switch (boolean) { case TRUE: MyEnum e; case FALSE: MyStruct s; }; union ExplicitDefault switch (unsigned short) { case 0: case 1: MyEnum e; default: string q; }; union WithoutDefault switch (boolean) { case TRUE: MyEnum e; }; interface AnyTest { attribute any value; }; combat-0.8.1/test/5/test.tcl0000700000175000010010000000152111107157072013637 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:MyEnum:1.0 MyEnum 1.0} {A B C D}} {struct {IDL:MyStruct:1.0\ MyStruct 1.0} {{s short} {e IDL:MyEnum:1.0} {q string}} {}} {typedef\ {IDL:MySequence:1.0 MySequence 1.0} {sequence IDL:MyStruct:1.0}} {typedef\ {IDL:MyArray:1.0 MyArray 1.0} {array IDL:MyEnum:1.0 3}} {union\ {IDL:NoDefault:1.0 NoDefault 1.0} boolean {{1 e IDL:MyEnum:1.0} {0 s\ IDL:MyStruct:1.0}} {}} {union {IDL:ExplicitDefault:1.0 ExplicitDefault 1.0}\ {unsigned short} {{0 e IDL:MyEnum:1.0} {1 e IDL:MyEnum:1.0} {(default) q\ string}} {}} {union {IDL:WithoutDefault:1.0 WithoutDefault 1.0} boolean {{1 e\ IDL:MyEnum:1.0}} {}} {interface {IDL:AnyTest:1.0 AnyTest 1.0} {} {{attribute\ {IDL:AnyTest/value:1.0 value 1.0} any}}}} combat-0.8.1/test/6/0000755000175000010010000000000011615566706012201 5ustar fpNonecombat-0.8.1/test/6/dotest0000711000175000010010000001172211107157073013411 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server_1.ior} catch {file delete server_2.ior} catch {file delete server_3.ior} set server1 [eval exec [info nameofexecutable] ./server.tcl 1 $argv &] set server2 [eval exec [info nameofexecutable] ./server.tcl 2 $argv &] set server3 [eval exec [info nameofexecutable] ./server.tcl 3 $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the servers to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server_1.ior] && \ [file exists server_2.ior] && \ [file exists server_3.ior]} { after 500 break } after 500 } if {![file exists server_1.ior] || \ ![file exists server_2.ior] || \ ![file exists server_3.ior]} { puts "oops, servers did not start up" catch {kill $server1} catch {kill $server2} catch {kill $server3} exit 1 } set reffile [open server_1.ior] set ior [read -nonewline $reffile] set o1 [corba::string_to_object $ior] close $reffile set reffile [open server_2.ior] set ior [read -nonewline $reffile] set o2 [corba::string_to_object $ior] close $reffile set reffile [open server_3.ior] set ior [read -nonewline $reffile] set o3 [corba::string_to_object $ior] close $reffile # # beginning of tests # test async-1.1 {async sleep} { set handle [$o1 -async sleep 1] corba::request get $handle } {1} test async-1.2 {parallel sleep} { set h1 [$o1 -async sleep 2] set h2 [$o2 -async sleep 1] set h3 [$o3 -async sleep 0] set res "" set ready 0 while {$ready < 3} { set finished [corba::request wait] lappend res [corba::request get $finished] incr ready } set res [lsort $res] lappend res [corba::request wait] } {0 1 2 {}} test async-1.3 {out of order request retrieval} { set h1 [$o1 -async sleep 1] set h2 [$o2 -async sleep 0] set h3 [$o3 -async sleep 1] set res [corba::request get $h3] lappend res [corba::request get $h2] lappend res [corba::request get $h1] } {1 0 1} test async-2.1 {async invocation with out parameter} { set h1 [$o1 -async strcpy out1 {Hello World}] set h2 [$o2 -async strcpy out2 {}] set h3 [$o3 -async strcpy out3 42] catch {unset res} lappend res [corba::request get $h1] lappend res [corba::request get $h2] lappend res [corba::request get $h3] lappend res $out1 lappend res $out2 lappend res $out3 } {11 0 2 {Hello World} {} 42} test async-3.1 {transparence of async oneway ops} { corba::try { set h1 [$o1 -async nop] set h2 [$o2 -async nop] set h3 [$o3 -async nop] catch {unset res} lappend res [corba::request get $h1] lappend res [corba::request get $h2] lappend res [corba::request get $h3] } catch {...} { puts $::errorInfo } } {{} {} {}} test async-4.1 {callback handler} { global result proc callback {handle} { global result set result [corba::request get $handle] } set handle [$o1 -callback callback sleep 1] vwait result set result } {1} test async-4.2 {multiple callbacks} { global result count proc callback {handle} { global result count incr count lappend result [corba::request get $handle] } $o1 -callback callback sleep 1 $o2 -callback callback sleep 0 $o3 -callback callback sleep 1 set result "" set count 0 while {$count < 3} { vwait count } lsort $result } {0 1 1} test async-4.3 {callback for oneway op} { global result count proc callback {handle} { global result count incr count lappend result [corba::request get $handle] } $o1 -callback callback nop $o2 -callback callback nop $o3 -callback callback nop set result "" set count 0 while {$count < 3} { vwait count } lsort $result } {{} {} {}} test async-4.4 {callback with parameters} { global r1 r2 r3 count proc callback {handle} { global r1 r2 r3 count incr count corba::request get $handle } $o1 -callback callback strcpy r1 {Hello World} $o2 -callback callback strcpy r2 {} $o3 -callback callback strcpy r3 42 set count 0 while {$count < 3} { vwait count } list $r1 $r2 $r3 } {{Hello World} {} 42} } out if {[string first noexec $argv] == -1} { kill $server3 kill $server2 kill $server1 } if {$out != ""} { puts $out } combat-0.8.1/test/6/Makefile0000700000175000010010000000017611107157073013623 0ustar fpNone MAINPATH = ../.. all: server test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/6/server.tcl0000711000175000010010000000255411107157073014201 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:Async:1.0" } public method sleep {seconds} { after [expr $seconds*1000] return $seconds } public method strcpy {the_dest src} { upvar $the_dest dest set dest $src return [string length $src] } public method nop {} { } } set argv [eval corba::init $argv] source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open [format "server_%d.ior" [lindex $argv 0]] w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/6/test.idl0000700000175000010010000000023211107157073013625 0ustar fpNone interface Async { unsigned short sleep (in unsigned short seconds); unsigned long strcpy (out string dest, in string src); oneway void nop (); }; combat-0.8.1/test/6/test.tcl0000700000175000010010000000067411107157073013651 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{interface {IDL:Async:1.0 Async 1.0} {} {{operation {IDL:Async/sleep:1.0\ sleep 1.0} {unsigned short} {{in seconds {unsigned short}}} {}} {operation\ {IDL:Async/strcpy:1.0 strcpy 1.0} {unsigned long} {{out dest string} {in src\ string}} {}} {operation {IDL:Async/nop:1.0 nop 1.0} void {} {} oneway}}}} combat-0.8.1/test/7/0000755000175000010010000000000011615566706012202 5ustar fpNonecombat-0.8.1/test/7/dotest0000711000175000010010000001356111107157075013417 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test operations-1.1 {short attribute} { $obj s 42 $obj s } {42} test operations-1.2 {readonly string attribute} { $obj ra } {Hello World} test operations-1.3 {simple square op} { $obj square 42 } {1764} test operations-1.4 {repeated op} { set sum 0 for {set i 0} {$i < 100} {incr i} { set sum [expr $i*$i-[$obj square $i]] } set sum } {0} test operations-2.1 {in and out strings} { set out Blubber set res [$obj copy "Hello World" out] list $res $out } {11 {Hello World}} test operations-2.2 {passing very long strings} { set str "" unset out for {set i 0} {$i < 1024} {incr i} { append str "Hello World" } $obj copy $str out string compare $str $out } {0} test operations-3.1 {sequence passing} { set res [$obj length {{member 1} {member 2} {member 3} {member 4} {member 5} {member 6} {member 7} {member 8} {member 9}} e] list $res $e } {9 ODD} test operations-3.2 {empty sequence passing} { set res [$obj length {} e] list $res $e } {0 EVEN} test operations-4.1 {complex return value} { $obj squares 5 } {{member 0} {member 1} {member 4} {member 9} {member 16}} test operations-5.1 {inout string, void return} { set str "Hello World" set res [$obj reverse str] list $res $str } {{} {dlroW olleH}} test operations-6.1 {oneway op} { $obj nop } {} test operations-7.1 {object reference return value} { set newobj [$obj dup] $newobj square 42 } {1764} test operations-7.2 {object reference parameter} { $obj isme $obj } {1} test operations-7.3 {nil object reference parameter} { $obj isme 0 } {0} test operations-7.4 {object reference out parameter} { unset newobj $obj dup2 $obj newobj $newobj isme $obj } {1} test operations-8.1 {_is_a builtin} { unset res lappend res [$obj _is_a IDL:operations:1.0] lappend res [$obj _is_a IDL:foobar:1.0] set res } {1 0} test operations-8.2 {_non_existent builtin} { $obj _non_existent } {0} test operations-8.3 {_is_equivalent builtin} { unset res lappend res [$obj _is_equivalent $obj] lappend res [$obj _is_equivalent 0] } {1 0} test operations-9.1 {catching user exception} { catch { $obj DontCallMe } res set res } {IDL:Oops:1.0 {what {I said, don't call me!}}} test operations-10.1 {get diamond structure} { global diamond array set diamond [$obj getdiamond] expr 1 } {1} test operations-10.2 {diamond object identities} { global diamond unset res lappend res [$diamond(a) _is_a IDL:diamonda:1.0] lappend res [$diamond(a) _is_a IDL:diamondb:1.0] lappend res [$diamond(a) _is_a IDL:diamondc:1.0] lappend res [$diamond(a) _is_a IDL:diamondd:1.0] lappend res [$diamond(b) _is_a IDL:diamonda:1.0] lappend res [$diamond(b) _is_a IDL:diamondb:1.0] lappend res [$diamond(b) _is_a IDL:diamondc:1.0] lappend res [$diamond(b) _is_a IDL:diamondd:1.0] lappend res [$diamond(c) _is_a IDL:diamonda:1.0] lappend res [$diamond(c) _is_a IDL:diamondb:1.0] lappend res [$diamond(c) _is_a IDL:diamondc:1.0] lappend res [$diamond(c) _is_a IDL:diamondd:1.0] lappend res [$diamond(d) _is_a IDL:diamonda:1.0] lappend res [$diamond(d) _is_a IDL:diamondb:1.0] lappend res [$diamond(d) _is_a IDL:diamondc:1.0] lappend res [$diamond(d) _is_a IDL:diamondd:1.0] } {1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1} test operations-10.3 {diamond operations} { global diamond unset res lappend res [$diamond(a) opa] lappend res [$diamond(b) opa] lappend res [$diamond(b) opb] lappend res [$diamond(c) opa] lappend res [$diamond(c) opc] lappend res [$diamond(d) opa] lappend res [$diamond(d) opb] lappend res [$diamond(d) opc] lappend res [$diamond(d) opd] } {opa opa opb opa opc opa opb opc opd} test operations-10.4 {object references within structure} { global diamond unset res lappend res [[lindex $diamond(abcd) 0] opa] lappend res [[lindex $diamond(abcd) 1] opb] lappend res [[lindex $diamond(abcd) 2] opc] lappend res [[lindex $diamond(abcd) 3] opd] } {opa opb opc opd} test operations-10.5 {squeezing diamond through object} { global diamond unset res $obj dup2 $diamond(a) o1 $obj dup2 $diamond(b) o2 $obj dup2 $diamond(c) o3 $obj dup2 $diamond(d) o4 lappend res [$o1 opa] lappend res [$o2 opa] lappend res [$o2 opb] lappend res [$o3 opa] lappend res [$o3 opc] lappend res [$o4 opa] lappend res [$o4 opb] lappend res [$o4 opc] lappend res [$o4 opd] } {opa opa opb opa opc opa opb opc opd} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/7/Makefile0000700000175000010010000000020311107157075013615 0ustar fpNone MAINPATH = ../.. all: server.tcl test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/7/server.tcl0000711000175000010010000000745511107157075014211 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class DiamondA_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:diamonda:1.0" } public method opa {} { return "opa" } } itcl::class DiamondB_impl { inherit DiamondA_impl public method _Interface {} { return "IDL:diamondb:1.0" } public method opb {} { return "opb" } } itcl::class DiamondC_impl { inherit DiamondA_impl public method _Interface {} { return "IDL:diamondc:1.0" } public method opc {} { return "opc" } } # # must avoid diamond inheritance in [incr Tcl]. We can use delegation, or # just re-implement everything. Here, we inherit diamondb and have to add # the implementation for diamondc on our own. # itcl::class DiamondD_impl { inherit DiamondB_impl public method _Interface {} { return "IDL:diamondd:1.0" } public method opc {} { return "opc" } public method opd {} { return "opd" } } itcl::class Server_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:operations:1.0" } public variable s 42 public variable ra "Hello World" public method square { x } { return [expr {$x * $x}] } public method copy { sin sout_name } { upvar $sout_name sout set sout $sin return [string length $sin] } public method length { queue oe_name } { upvar $oe_name oe set res [llength $queue] if {[expr $res % 2] == 0} { set oe EVEN } else { set oe ODD } return $res } public method squares { howmany } { set res "" for {set i 0} {$i < $howmany} {incr i} { lappend res [list member [expr $i * $i]] } return $res } public method reverse { str_name } { upvar $str_name str set res "" foreach c [split $str {}] { set res $c$res } set str $res } public method nop {} { } public method dup {} { return [_this] } public method dup2 {o1 o2_name} { upvar $o2_name o2 set o2 $o1 } public method isme {obj} { return [[_this] _is_equivalent $obj] } public method getdiamond {} { set da [namespace current]::[DiamondA_impl #auto] set db [namespace current]::[DiamondB_impl #auto] set dc [namespace current]::[DiamondC_impl #auto] set dd [namespace current]::[DiamondD_impl #auto] # # According to the CORBA 2.3 specs, implicit activation doesn't # work for DSI servants. This is probably a bug in the specs and # has been reported as an issue. # set res(a) [$::poa servant_to_reference $da] set res(b) [$::poa servant_to_reference $db] set res(c) [$::poa servant_to_reference $dc] set res(d) [$::poa servant_to_reference $dd] set res(abcd) [list $res(a) $res(b) $res(c) $res(d)] return [array get res] } public method DontCallMe {} { corba::throw {IDL:Oops:1.0 {what {I said, don't call me!}}} } } # # Initialize ORB # eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/7/test.idl0000700000175000010010000000172511107157075013640 0ustar fpNone enum E { ODD, EVEN }; struct S { long member; }; typedef sequence Q; exception Oops { string what; }; interface diamonda { string opa (); }; interface diamondb : diamonda { string opb (); }; interface diamondc : diamonda { string opc (); }; interface diamondd : diamondb, diamondc { string opd (); }; struct diamond { diamonda a; diamondb b; diamondc c; diamondd d; sequence abcd; }; interface operations { attribute short s; readonly attribute string ra; unsigned long square (in short x); long copy (in string sin, out string sout); unsigned short length (in Q queue, out E oe); Q squares (in unsigned short howmany); void reverse (inout string str); oneway void nop (); operations dup (); void dup2 (in Object o1, out Object o2); boolean isme (in Object obj); diamond getdiamond (); void DontCallMe () raises (Oops); }; combat-0.8.1/test/7/test.tcl0000700000175000010010000000406011107157075013645 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:E:1.0 E 1.0} {ODD EVEN}} {struct {IDL:S:1.0 S 1.0} {{member\ long}} {}} {typedef {IDL:Q:1.0 Q 1.0} {sequence IDL:S:1.0}} {exception\ {IDL:Oops:1.0 Oops 1.0} {{what string}} {}} {interface {IDL:diamonda:1.0\ diamonda 1.0} {} {{operation {IDL:diamonda/opa:1.0 opa 1.0} string {} {}}}}\ {interface {IDL:diamondb:1.0 diamondb 1.0} IDL:diamonda:1.0 {{operation\ {IDL:diamondb/opb:1.0 opb 1.0} string {} {}}}} {interface {IDL:diamondc:1.0\ diamondc 1.0} IDL:diamonda:1.0 {{operation {IDL:diamondc/opc:1.0 opc 1.0}\ string {} {}}}} {interface {IDL:diamondd:1.0 diamondd 1.0} {IDL:diamondb:1.0\ IDL:diamondc:1.0} {{operation {IDL:diamondd/opd:1.0 opd 1.0} string {} {}}}}\ {struct {IDL:diamond:1.0 diamond 1.0} {{a IDL:diamonda:1.0} {b\ IDL:diamondb:1.0} {c IDL:diamondc:1.0} {d IDL:diamondd:1.0} {abcd {sequence\ Object}}} {}} {interface {IDL:operations:1.0 operations 1.0} {} {{attribute\ {IDL:operations/s:1.0 s 1.0} short} {attribute {IDL:operations/ra:1.0 ra 1.0}\ string readonly} {operation {IDL:operations/square:1.0 square 1.0} {unsigned\ long} {{in x short}} {}} {operation {IDL:operations/copy:1.0 copy 1.0} long\ {{in sin string} {out sout string}} {}} {operation {IDL:operations/length:1.0\ length 1.0} {unsigned short} {{in queue IDL:Q:1.0} {out oe IDL:E:1.0}} {}}\ {operation {IDL:operations/squares:1.0 squares 1.0} IDL:Q:1.0 {{in howmany\ {unsigned short}}} {}} {operation {IDL:operations/reverse:1.0 reverse 1.0}\ void {{inout str string}} {}} {operation {IDL:operations/nop:1.0 nop 1.0}\ void {} {} oneway} {operation {IDL:operations/dup:1.0 dup 1.0}\ IDL:operations:1.0 {} {}} {operation {IDL:operations/dup2:1.0 dup2 1.0} void\ {{in o1 Object} {out o2 Object}} {}} {operation {IDL:operations/isme:1.0 isme\ 1.0} boolean {{in obj Object}} {}} {operation {IDL:operations/getdiamond:1.0\ getdiamond 1.0} IDL:diamond:1.0 {} {}} {operation\ {IDL:operations/DontCallMe:1.0 DontCallMe 1.0} void {} IDL:Oops:1.0}}}} combat-0.8.1/test/8/0000755000175000010010000000000011615566706012203 5ustar fpNonecombat-0.8.1/test/8/dotest0000711000175000010010000001356111107157077013422 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test operations-1.1 {short attribute} { $obj s 42 $obj s } {42} test operations-1.2 {readonly string attribute} { $obj ra } {Hello World} test operations-1.3 {simple square op} { $obj square 42 } {1764} test operations-1.4 {repeated op} { set sum 0 for {set i 0} {$i < 100} {incr i} { set sum [expr $i*$i-[$obj square $i]] } set sum } {0} test operations-2.1 {in and out strings} { set out Blubber set res [$obj copy "Hello World" out] list $res $out } {11 {Hello World}} test operations-2.2 {passing very long strings} { set str "" unset out for {set i 0} {$i < 1024} {incr i} { append str "Hello World" } $obj copy $str out string compare $str $out } {0} test operations-3.1 {sequence passing} { set res [$obj length {{member 1} {member 2} {member 3} {member 4} {member 5} {member 6} {member 7} {member 8} {member 9}} e] list $res $e } {9 ODD} test operations-3.2 {empty sequence passing} { set res [$obj length {} e] list $res $e } {0 EVEN} test operations-4.1 {complex return value} { $obj squares 5 } {{member 0} {member 1} {member 4} {member 9} {member 16}} test operations-5.1 {inout string, void return} { set str "Hello World" set res [$obj reverse str] list $res $str } {{} {dlroW olleH}} test operations-6.1 {oneway op} { $obj nop } {} test operations-7.1 {object reference return value} { set newobj [$obj dup] $newobj square 42 } {1764} test operations-7.2 {object reference parameter} { $obj isme $obj } {1} test operations-7.3 {nil object reference parameter} { $obj isme 0 } {0} test operations-7.4 {object reference out parameter} { unset newobj $obj dup2 $obj newobj $newobj isme $obj } {1} test operations-8.1 {_is_a builtin} { unset res lappend res [$obj _is_a IDL:operations:1.0] lappend res [$obj _is_a IDL:foobar:1.0] set res } {1 0} test operations-8.2 {_non_existent builtin} { $obj _non_existent } {0} test operations-8.3 {_is_equivalent builtin} { unset res lappend res [$obj _is_equivalent $obj] lappend res [$obj _is_equivalent 0] } {1 0} test operations-9.1 {catching user exception} { catch { $obj DontCallMe } res set res } {IDL:Oops:1.0 {what {I said, don't call me!}}} test operations-10.1 {get diamond structure} { global diamond array set diamond [$obj getdiamond] expr 1 } {1} test operations-10.2 {diamond object identities} { global diamond unset res lappend res [$diamond(a) _is_a IDL:diamonda:1.0] lappend res [$diamond(a) _is_a IDL:diamondb:1.0] lappend res [$diamond(a) _is_a IDL:diamondc:1.0] lappend res [$diamond(a) _is_a IDL:diamondd:1.0] lappend res [$diamond(b) _is_a IDL:diamonda:1.0] lappend res [$diamond(b) _is_a IDL:diamondb:1.0] lappend res [$diamond(b) _is_a IDL:diamondc:1.0] lappend res [$diamond(b) _is_a IDL:diamondd:1.0] lappend res [$diamond(c) _is_a IDL:diamonda:1.0] lappend res [$diamond(c) _is_a IDL:diamondb:1.0] lappend res [$diamond(c) _is_a IDL:diamondc:1.0] lappend res [$diamond(c) _is_a IDL:diamondd:1.0] lappend res [$diamond(d) _is_a IDL:diamonda:1.0] lappend res [$diamond(d) _is_a IDL:diamondb:1.0] lappend res [$diamond(d) _is_a IDL:diamondc:1.0] lappend res [$diamond(d) _is_a IDL:diamondd:1.0] } {1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1} test operations-10.3 {diamond operations} { global diamond unset res lappend res [$diamond(a) opa] lappend res [$diamond(b) opa] lappend res [$diamond(b) opb] lappend res [$diamond(c) opa] lappend res [$diamond(c) opc] lappend res [$diamond(d) opa] lappend res [$diamond(d) opb] lappend res [$diamond(d) opc] lappend res [$diamond(d) opd] } {opa opa opb opa opc opa opb opc opd} test operations-10.4 {object references within structure} { global diamond unset res lappend res [[lindex $diamond(abcd) 0] opa] lappend res [[lindex $diamond(abcd) 1] opb] lappend res [[lindex $diamond(abcd) 2] opc] lappend res [[lindex $diamond(abcd) 3] opd] } {opa opb opc opd} test operations-10.5 {squeezing diamond through object} { global diamond unset res $obj dup2 $diamond(a) o1 $obj dup2 $diamond(b) o2 $obj dup2 $diamond(c) o3 $obj dup2 $diamond(d) o4 lappend res [$o1 opa] lappend res [$o2 opa] lappend res [$o2 opb] lappend res [$o3 opa] lappend res [$o3 opc] lappend res [$o4 opa] lappend res [$o4 opb] lappend res [$o4 opc] lappend res [$o4 opd] } {opa opa opb opa opc opa opb opc opd} } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/8/Makefile0000700000175000010010000000020311107157077013620 0ustar fpNone MAINPATH = ../.. all: server.tcl test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/8/server.tcl0000711000175000010010000002072611107157077014210 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class DiamondA_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:omg.org/PortableServer/DynamicImplementation:1.0" } public method _primary_interface {oid poa} { return "IDL:diamonda:1.0" } public method _is_a {repoid} { switch $repoid { IDL:diamonda:1.0 { return true } } return false } public method invoke {request} { switch [$request operation] { opa { $request arguments {} $request set_result [list string opa] } default { throw {IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ {minor 0 completed COMPLETED_NO}} } } } } itcl::class DiamondB_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:omg.org/PortableServer/DynamicImplementation:1.0" } public method _primary_interface {oid poa} { return "IDL:diamondb:1.0" } public method _is_a {repoid} { switch $repoid { IDL:diamonda:1.0 - IDL:diamondb:1.0 { return true } } return false } public method invoke {request} { switch [$request operation] { opa { $request arguments {} $request set_result [list string opa] } opb { $request arguments {} $request set_result [list string opb] } default { throw {IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ {minor 0 completed COMPLETED_NO}} } } } } itcl::class DiamondC_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:omg.org/PortableServer/DynamicImplementation:1.0" } public method _primary_interface {oid poa} { return "IDL:diamondc:1.0" } public method _is_a {repoid} { switch $repoid { IDL:diamonda:1.0 - IDL:diamondc:1.0 { return true } } return false } public method invoke {request} { switch [$request operation] { opa { $request arguments {} $request set_result [list string opa] } opc { $request arguments {} $request set_result [list string opc] } default { throw {IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ {minor 0 completed COMPLETED_NO}} } } } } itcl::class DiamondD_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:omg.org/PortableServer/DynamicImplementation:1.0" } public method _primary_interface {oid poa} { return "IDL:diamondd:1.0" } public method _is_a {repoid} { switch $repoid { IDL:diamonda:1.0 - IDL:diamondb:1.0 - IDL:diamondc:1.0 - IDL:diamondd:1.0 { return true } } return false } public method invoke {request} { switch [$request operation] { opa { $request arguments {} $request set_result [list string opa] } opb { $request arguments {} $request set_result [list string opb] } opc { $request arguments {} $request set_result [list string opc] } opd { $request arguments {} $request set_result [list string opd] } default { throw {IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ {minor 0 completed COMPLETED_NO}} } } } } itcl::class Server_impl { inherit PortableServer::ServantBase public method _Interface {} { return "IDL:omg.org/PortableServer/DynamicImplementation:1.0" } public method _primary_interface {oid poa} { return "IDL:operations:1.0" } public method _is_a {repoid} { switch $repoid { IDL:operations:1.0 { return true } } return false } public variable s 42 public variable ra "Hello World" public method square { x } { return [expr {$x * $x}] } public method copy { sin sout_name } { upvar $sout_name sout set sout $sin return [string length $sin] } public method length { queue oe_name } { upvar $oe_name oe set res [llength $queue] if {[expr $res % 2] == 0} { set oe EVEN } else { set oe ODD } return $res } public method squares { howmany } { set res "" for {set i 0} {$i < $howmany} {incr i} { lappend res [list member [expr $i * $i]] } return $res } public method reverse { str_name } { upvar $str_name str set res "" foreach c [split $str {}] { set res $c$res } set str $res } public method nop {} { } public method dup {} { return [_this] } public method dup2 {o1 o2_name} { upvar $o2_name o2 set o2 $o1 } public method isme {obj} { return [[_this] _is_equivalent $obj] } public method getdiamond {} { set da [DiamondA_impl #auto] set db [DiamondB_impl #auto] set dc [DiamondC_impl #auto] set dd [DiamondD_impl #auto] # # According to the CORBA 2.3 specs, implicit activation doesn't # work for DSI servants. This is probably a bug in the specs and # has been reported as an issue. # set res(a) [$::poa servant_to_reference $da] set res(b) [$::poa servant_to_reference $db] set res(c) [$::poa servant_to_reference $dc] set res(d) [$::poa servant_to_reference $dd] set res(abcd) [list $res(a) $res(b) $res(c) $res(d)] return [array get res] } public method DontCallMe {} { corba::throw {IDL:Oops:1.0 {what {I said, don't call me!}}} } public method invoke { request } { switch [$request operation] { _get_s { $request arguments {} $request set_result [list short $s] } _set_s { set s [$request arguments {{in {unsigned short}}}] $request set_result {void {}} } _get_ra { $request arguments {} $request set_result [list string $ra] } square { set x [$request arguments {{in short}}] set res [square $x] $request set_result [list {unsigned long} $res] } copy { set args [$request arguments {{in string} {out string}}] set sin [lindex $args 0] set sout [lindex $args 1] set res [copy $sin $sout] $request set_result [list long $res] } length { set args [$request arguments {{in {sequence {struct IDL:S:1.0 {member long}}}} {out {enum {ODD EVEN}}}}] set queue [lindex $args 0] set oe [lindex $args 1] set res [length $queue $oe] $request set_result [list {unsigned short} $res] } squares { set howmany [$request arguments {{in {unsigned short}}}] set res [squares $howmany] $request set_result [list {sequence {struct IDL:S:1.0 {member long}}} $res] } reverse { set str [$request arguments {{inout string}}] reverse $str $request set_result {void {}} } nop { $request arguments {} $request set_result {void {}} } dup { $request arguments {} set res [dup] $request set_result [list {Object IDL:operations:1.0} $res] } dup2 { set args [$request arguments {{in {Object IDL:omg.org/CORBA/Object:1.0}} {out {Object IDL:omg.org/CORBA/Object:1.0}}}] set o1 [lindex $args 0] set o2 [lindex $args 1] dup2 $o1 $o2 $request set_result {void {}} } isme { set obj [$request arguments {{in {Object IDL:omg.org/CORBA/Object:1.0}}}] set res [isme $obj] $request set_result [list boolean $res] } getdiamond { $request arguments {} set res [getdiamond] $request set_result [list {struct IDL:diamond:1.0 {a {Object IDL:diamonda:1.0} b {Object IDL:diamondb:1.0} c {Object IDL:diamondc:1.0} d {Object IDL:diamondd:1.0} abcd {sequence {Object IDL:omg.org/CORBA/Object:1.0}}}} $res] } DontCallMe { $request arguments {} corba::try { DontCallMe $request set_result {void {}} } catch {IDL:Oops:1.0 ex} { $request set_exception [list {exception IDL:Oops:1.0 {what string}} $ex] } } default { corba::throw {IDL:omg.org/CORBA/BAD_OPERATION:1.0 \ {minor 0 completed COMPLETED_NO}} } } } } # # Initialize ORB # eval corba::init $argv # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/8/test.idl0000700000175000010010000000172511107157077013643 0ustar fpNone enum E { ODD, EVEN }; struct S { long member; }; typedef sequence Q; exception Oops { string what; }; interface diamonda { string opa (); }; interface diamondb : diamonda { string opb (); }; interface diamondc : diamonda { string opc (); }; interface diamondd : diamondb, diamondc { string opd (); }; struct diamond { diamonda a; diamondb b; diamondc c; diamondd d; sequence abcd; }; interface operations { attribute short s; readonly attribute string ra; unsigned long square (in short x); long copy (in string sin, out string sout); unsigned short length (in Q queue, out E oe); Q squares (in unsigned short howmany); void reverse (inout string str); oneway void nop (); operations dup (); void dup2 (in Object o1, out Object o2); boolean isme (in Object obj); diamond getdiamond (); void DontCallMe () raises (Oops); }; combat-0.8.1/test/8/test.tcl0000700000175000010010000000406011107157100013633 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{enum {IDL:E:1.0 E 1.0} {ODD EVEN}} {struct {IDL:S:1.0 S 1.0} {{member\ long}} {}} {typedef {IDL:Q:1.0 Q 1.0} {sequence IDL:S:1.0}} {exception\ {IDL:Oops:1.0 Oops 1.0} {{what string}} {}} {interface {IDL:diamonda:1.0\ diamonda 1.0} {} {{operation {IDL:diamonda/opa:1.0 opa 1.0} string {} {}}}}\ {interface {IDL:diamondb:1.0 diamondb 1.0} IDL:diamonda:1.0 {{operation\ {IDL:diamondb/opb:1.0 opb 1.0} string {} {}}}} {interface {IDL:diamondc:1.0\ diamondc 1.0} IDL:diamonda:1.0 {{operation {IDL:diamondc/opc:1.0 opc 1.0}\ string {} {}}}} {interface {IDL:diamondd:1.0 diamondd 1.0} {IDL:diamondb:1.0\ IDL:diamondc:1.0} {{operation {IDL:diamondd/opd:1.0 opd 1.0} string {} {}}}}\ {struct {IDL:diamond:1.0 diamond 1.0} {{a IDL:diamonda:1.0} {b\ IDL:diamondb:1.0} {c IDL:diamondc:1.0} {d IDL:diamondd:1.0} {abcd {sequence\ Object}}} {}} {interface {IDL:operations:1.0 operations 1.0} {} {{attribute\ {IDL:operations/s:1.0 s 1.0} short} {attribute {IDL:operations/ra:1.0 ra 1.0}\ string readonly} {operation {IDL:operations/square:1.0 square 1.0} {unsigned\ long} {{in x short}} {}} {operation {IDL:operations/copy:1.0 copy 1.0} long\ {{in sin string} {out sout string}} {}} {operation {IDL:operations/length:1.0\ length 1.0} {unsigned short} {{in queue IDL:Q:1.0} {out oe IDL:E:1.0}} {}}\ {operation {IDL:operations/squares:1.0 squares 1.0} IDL:Q:1.0 {{in howmany\ {unsigned short}}} {}} {operation {IDL:operations/reverse:1.0 reverse 1.0}\ void {{inout str string}} {}} {operation {IDL:operations/nop:1.0 nop 1.0}\ void {} {} oneway} {operation {IDL:operations/dup:1.0 dup 1.0}\ IDL:operations:1.0 {} {}} {operation {IDL:operations/dup2:1.0 dup2 1.0} void\ {{in o1 Object} {out o2 Object}} {}} {operation {IDL:operations/isme:1.0 isme\ 1.0} boolean {{in obj Object}} {}} {operation {IDL:operations/getdiamond:1.0\ getdiamond 1.0} IDL:diamond:1.0 {} {}} {operation\ {IDL:operations/DontCallMe:1.0 DontCallMe 1.0} void {} IDL:Oops:1.0}}}} combat-0.8.1/test/9/0000755000175000010010000000000011615566706012204 5ustar fpNonecombat-0.8.1/test/9/CosNaming.idl0000700000175000010010000000457111107157101014531 0ustar fpNone/* * COSS Naming */ #pragma prefix "omg.org" module CosNaming { typedef string Istring; struct NameComponent { Istring id; Istring kind; }; typedef sequence Name; enum BindingType {nobject, ncontext}; struct Binding { Name binding_name; BindingType binding_type; }; typedef sequence BindingList; interface BindingIterator; interface NamingContext { enum NotFoundReason { missing_node, not_context, not_object}; exception NotFound { NotFoundReason why; Name rest_of_name; }; exception CannotProceed { NamingContext cxt; Name rest_of_name; }; exception InvalidName{}; exception AlreadyBound {}; exception NotEmpty{}; void bind(in Name n, in Object obj) raises(NotFound, CannotProceed, InvalidName, AlreadyBound); void rebind(in Name n, in Object obj) raises(NotFound, CannotProceed, InvalidName); void bind_context(in Name n, in NamingContext nc) raises(NotFound, CannotProceed, InvalidName, AlreadyBound); void rebind_context(in Name n, in NamingContext nc) raises(NotFound, CannotProceed, InvalidName); Object resolve (in Name n) raises(NotFound, CannotProceed, InvalidName); void unbind(in Name n) raises(NotFound, CannotProceed, InvalidName); NamingContext new_context(); NamingContext bind_new_context(in Name n) raises(NotFound, AlreadyBound, CannotProceed, InvalidName); void destroy( ) raises(NotEmpty); void list (in unsigned long how_many, out BindingList bl, out BindingIterator bi); }; interface BindingIterator { boolean next_one(out Binding b); boolean next_n(in unsigned long how_many, out BindingList bl); void destroy(); }; interface NamingContextExt : NamingContext { typedef string StringName; typedef string Address; typedef string URLString; StringName to_string (in Name n) raises(InvalidName); Name to_name (in StringName sn) raises(InvalidName); exception InvalidAddress {}; URLString to_url (in Address addr, in StringName sn) raises (InvalidAddress, InvalidName); Object resolve_str (in StringName n) raises (NotFound, CannotProceed, InvalidName, AlreadyBound); }; }; combat-0.8.1/test/9/CosNaming.tcl0000700000175000010010000001520111107157101014533 0ustar fpNone# # This file was automatically generated from CosNaming.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{module {IDL:omg.org/CosNaming:1.0 CosNaming 1.0} {{typedef\ {IDL:omg.org/CosNaming/Istring:1.0 Istring 1.0} string} {struct\ {IDL:omg.org/CosNaming/NameComponent:1.0 NameComponent 1.0} {{id\ IDL:omg.org/CosNaming/Istring:1.0} {kind IDL:omg.org/CosNaming/Istring:1.0}}\ {}} {typedef {IDL:omg.org/CosNaming/Name:1.0 Name 1.0} {sequence\ IDL:omg.org/CosNaming/NameComponent:1.0}} {enum\ {IDL:omg.org/CosNaming/BindingType:1.0 BindingType 1.0} {nobject ncontext}}\ {struct {IDL:omg.org/CosNaming/Binding:1.0 Binding 1.0} {{binding_name\ IDL:omg.org/CosNaming/Name:1.0} {binding_type\ IDL:omg.org/CosNaming/BindingType:1.0}} {}} {typedef\ {IDL:omg.org/CosNaming/BindingList:1.0 BindingList 1.0} {sequence\ IDL:omg.org/CosNaming/Binding:1.0}} {interface\ {IDL:omg.org/CosNaming/BindingIterator:1.0 BindingIterator 1.0} {}\ {{operation {IDL:omg.org/CosNaming/BindingIterator/next_one:1.0 next_one 1.0}\ boolean {{out b IDL:omg.org/CosNaming/Binding:1.0}} {}} {operation\ {IDL:omg.org/CosNaming/BindingIterator/next_n:1.0 next_n 1.0} boolean {{in\ how_many {unsigned long}} {out bl IDL:omg.org/CosNaming/BindingList:1.0}} {}}\ {operation {IDL:omg.org/CosNaming/BindingIterator/destroy:1.0 destroy 1.0}\ void {} {}}}} {interface {IDL:omg.org/CosNaming/NamingContext:1.0\ NamingContext 1.0} {} {{enum\ {IDL:omg.org/CosNaming/NamingContext/NotFoundReason:1.0 NotFoundReason 1.0}\ {missing_node not_context not_object}} {exception\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0 NotFound 1.0} {{why\ IDL:omg.org/CosNaming/NamingContext/NotFoundReason:1.0} {rest_of_name\ IDL:omg.org/CosNaming/Name:1.0}} {}} {exception\ {IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0 CannotProceed 1.0}\ {{cxt IDL:omg.org/CosNaming/NamingContext:1.0} {rest_of_name\ IDL:omg.org/CosNaming/Name:1.0}} {}} {exception\ {IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0 InvalidName 1.0} {} {}}\ {exception {IDL:omg.org/CosNaming/NamingContext/AlreadyBound:1.0 AlreadyBound\ 1.0} {} {}} {exception {IDL:omg.org/CosNaming/NamingContext/NotEmpty:1.0\ NotEmpty 1.0} {} {}} {operation {IDL:omg.org/CosNaming/NamingContext/bind:1.0\ bind 1.0} void {{in n IDL:omg.org/CosNaming/Name:1.0} {in obj Object}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0\ IDL:omg.org/CosNaming/NamingContext/AlreadyBound:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/rebind:1.0 rebind 1.0} void {{in n\ IDL:omg.org/CosNaming/Name:1.0} {in obj Object}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/bind_context:1.0 bind_context 1.0} void\ {{in n IDL:omg.org/CosNaming/Name:1.0} {in nc\ IDL:omg.org/CosNaming/NamingContext:1.0}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0\ IDL:omg.org/CosNaming/NamingContext/AlreadyBound:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/rebind_context:1.0 rebind_context 1.0}\ void {{in n IDL:omg.org/CosNaming/Name:1.0} {in nc\ IDL:omg.org/CosNaming/NamingContext:1.0}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/resolve:1.0 resolve 1.0} Object {{in n\ IDL:omg.org/CosNaming/Name:1.0}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/unbind:1.0 unbind 1.0} void {{in n\ IDL:omg.org/CosNaming/Name:1.0}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/new_context:1.0 new_context 1.0}\ IDL:omg.org/CosNaming/NamingContext:1.0 {} {}} {operation\ {IDL:omg.org/CosNaming/NamingContext/bind_new_context:1.0 bind_new_context\ 1.0} IDL:omg.org/CosNaming/NamingContext:1.0 {{in n\ IDL:omg.org/CosNaming/Name:1.0}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/AlreadyBound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContext/destroy:1.0 destroy 1.0} void {}\ IDL:omg.org/CosNaming/NamingContext/NotEmpty:1.0} {operation\ {IDL:omg.org/CosNaming/NamingContext/list:1.0 list 1.0} void {{in how_many\ {unsigned long}} {out bl IDL:omg.org/CosNaming/BindingList:1.0} {out bi\ IDL:omg.org/CosNaming/BindingIterator:1.0}} {}}}} {interface\ {IDL:omg.org/CosNaming/NamingContextExt:1.0 NamingContextExt 1.0}\ IDL:omg.org/CosNaming/NamingContext:1.0 {{typedef\ {IDL:omg.org/CosNaming/NamingContextExt/StringName:1.0 StringName 1.0}\ string} {typedef {IDL:omg.org/CosNaming/NamingContextExt/Address:1.0 Address\ 1.0} string} {typedef {IDL:omg.org/CosNaming/NamingContextExt/URLString:1.0\ URLString 1.0} string} {operation\ {IDL:omg.org/CosNaming/NamingContextExt/to_string:1.0 to_string 1.0}\ IDL:omg.org/CosNaming/NamingContextExt/StringName:1.0 {{in n\ IDL:omg.org/CosNaming/Name:1.0}}\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0} {operation\ {IDL:omg.org/CosNaming/NamingContextExt/to_name:1.0 to_name 1.0}\ IDL:omg.org/CosNaming/Name:1.0 {{in sn\ IDL:omg.org/CosNaming/NamingContextExt/StringName:1.0}}\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0} {exception\ {IDL:omg.org/CosNaming/NamingContextExt/InvalidAddress:1.0 InvalidAddress\ 1.0} {} {}} {operation {IDL:omg.org/CosNaming/NamingContextExt/to_url:1.0\ to_url 1.0} IDL:omg.org/CosNaming/NamingContextExt/URLString:1.0 {{in addr\ IDL:omg.org/CosNaming/NamingContextExt/Address:1.0} {in sn\ IDL:omg.org/CosNaming/NamingContextExt/StringName:1.0}}\ {IDL:omg.org/CosNaming/NamingContextExt/InvalidAddress:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0}} {operation\ {IDL:omg.org/CosNaming/NamingContextExt/resolve_str:1.0 resolve_str 1.0}\ Object {{in n IDL:omg.org/CosNaming/NamingContextExt/StringName:1.0}}\ {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0\ IDL:omg.org/CosNaming/NamingContext/CannotProceed:1.0\ IDL:omg.org/CosNaming/NamingContext/InvalidName:1.0\ IDL:omg.org/CosNaming/NamingContext/AlreadyBound:1.0}}}}}}} combat-0.8.1/test/9/dotest0000711000175000010010000000771411107157101013412 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb ../../tclkill package require tcltest package require combat package require kill namespace import tcltest::test tcltest::configure -verbose {body error pass} if {[string first noexec $argv] == -1} { catch {file delete server.ior} set server [eval exec [info nameofexecutable] ./server.tcl $argv &] } catch { set argv [eval corba::init $argv] eval tcltest::configure $argv source test.tcl source CosNaming.tcl # # might need to wait for the server to start up # for {set i 0} {$i < 10} {incr i} { if {[file exists server.ior]} { after 500 break } after 500 } if {![file exists server.ior]} { catch {kill $server} puts "oops, server did not start up" exit 1 } eval corba::init $argv set nso [corba::resolve_initial_references NameService] $nso _is_a IDL:omg.org/CosNaming/NamingContextExt:1.0 set reffile [open server.ior] set ior [read -nonewline $reffile] set obj [corba::string_to_object $ior] close $reffile # # beginning of tests # test naming-1.1 {register with root nc} { $nso bind {{id foo kind bar}} $obj } {} test naming-1.2 {resolve from root nc} { set res [$nso resolve {{id foo kind bar}}] $obj _is_equivalent $res } {1} test naming-2.1 {create context nodes} { set nc1 [$nso bind_new_context {{id c1 kind {}}}] set nc2 [$nc1 bind_new_context {{id {} kind c2}}] set nc3 [$nso new_context] $nc2 rebind_context {{id c3 kind c3}} $nc3 } {} test naming-2.2 {register with context nodes} { $nso bind {{id c1 kind {}} {id obj kind {}}} $obj $nso bind {{id c1 kind {}} {id {} kind c2} {id foo kind bar}} 0 } {} test naming-2.3 {resolve from context nodes} { unset res set o2 [$nso resolve {{id c1 kind {}} {id obj kind {}}}] lappend res [$obj _is_equivalent $o2] lappend res [$nso resolve {{id c1 kind {}} {id {} kind c2} {id foo kind bar}}] set res } {1 0} test naming-3.1 {populate naming context} { for {set i 0} {$i < 42} {incr i} { $nso bind [list [list id obj-$i kind {}]] $obj } } {} test naming-3.2 {use binding iterator} { $nso list 0 bl bi set objects 0 set contexts 0 while {[$bi next_n 10 bl]} { foreach binding $bl { array set tb $binding if {$tb(binding_type) == "nobject"} { incr objects set to [$nso resolve $tb(binding_name)] $to hello } elseif {$tb(binding_type) == "ncontext"} { incr contexts } } } $bi destroy list $objects $contexts } {43 1} test naming-4.1 {bind existing node} { set res [catch {$nso bind {{id foo kind bar}} 0} ex] list $res $ex } {1 {IDL:omg.org/CosNaming/NamingContext/AlreadyBound:1.0 {}}} test naming-4.2 {resolve nonexisting node} { set res [catch {$nso resolve {{id bar kind foo}}} ex] list $res $ex } {1 {IDL:omg.org/CosNaming/NamingContext/NotFound:1.0 {why missing_node rest_of_name {{id bar kind foo}}}}} if {[$nso _is_a IDL:omg.org/CosNaming/NamingContextExt:1.0]} { test naming-5.1 {test URL locator} { $nso to_string {{id c1 kind {}} {id obj kind {}}} } {c1/obj} test naming-5.2 {test URL locator} { $nso to_string {{id c1 kind {}} {id {} kind c2} {id foo kind bar}} } {c1/.c2/foo.bar} test naming-5.3 {using resolve_str} { unset res set o2 [$nso resolve_str c1/obj] lappend res [$obj _is_equivalent $o2] lappend res [$nso resolve_str c1/.c2/foo.bar] } {1 0} } } out if {[string first noexec $argv] == -1} { kill $server } if {$out != ""} { puts $out } combat-0.8.1/test/9/Makefile0000700000175000010010000000021511107157101013610 0ustar fpNone MAINPATH = ../.. all: server CosNaming.tcl test.tcl test: all ./dotest include $(MAINPATH)/MakeVars include $(MAINPATH)/test-MakeRules combat-0.8.1/test/9/server.tcl0000711000175000010010000000222511107157102014170 0ustar fpNone#! /bin/sh # the next line restarts using tclsh8.5 on unix \ if type tclsh8.5 > /dev/null 2>&1 ; then exec tclsh8.5 "$0" ${1+"$@"} ; fi # the next line restarts using tclsh85 on Windows using Cygwin \ if type tclsh85 > /dev/null 2>&1 ; then exec tclsh85 "`cygpath --windows $0`" ${1+"$@"} ; fi # the next line complains about a missing tclsh \ echo "This software requires Tcl 8.5 to run." ; \ echo "Make sure that \"tclsh8.5\" or \"tclsh85\" is in your \$PATH" ; \ exit 1 lappend auto_path ../../orb package require combat itcl::class Server_impl { public method _Interface {} { return "IDL:Simple:1.0" } public method hello {} { # puts "Hello World!" } } eval corba::init $argv source test.tcl # # Create a Server server and activate it # set poa [corba::resolve_initial_references RootPOA] set mgr [$poa the_POAManager] set srv [Server_impl #auto] set oid [$poa activate_object $srv] set reffile [open "server.ior" w] set ref [$poa id_to_reference $oid] set str [corba::object_to_string $ref] puts -nonewline $reffile $str close $reffile # # Activate the POA # $mgr activate # # .. and start serving requests ... # vwait forever puts "oops" combat-0.8.1/test/9/test.idl0000700000175000010010000000005011107157102013617 0ustar fpNone interface Simple { void hello (); }; combat-0.8.1/test/9/test.tcl0000700000175000010010000000036311107157102013640 0ustar fpNone# # This file was automatically generated from test.idl # by idl2tcl. Do not edit. # package require combat combat::ir add \ {{interface {IDL:Simple:1.0 Simple 1.0} {} {{operation {IDL:Simple/hello:1.0\ hello 1.0} void {} {}}}}} combat-0.8.1/test/Makefile0000700000175000010010000000031011107156567013453 0ustar fpNoneall: test TESTDIRS = 1 2 3 4 5 6 7 10 11 .PHONY: test clean test: for dir in $(TESTDIRS) ; do \ (cd $$dir ; ./dotest) || exit 1 ; \ done clean: find . -name '*~' -exec rm {} \; rm -f */.ior combat-0.8.1/test/README.txt0000700000175000010010000000214011107156567013514 0ustar fpNoneVarious tests for Combat. Say "make test" to run all tests, or run "dotest" in each subdirectory. The following tests are known to fail: - 1/ - ptypes-1.3, ptypes-2.3, ptypes-3.3, ptypes-4.3: These tests check that values which exceed a type's range are rejected, e.g., attempting to pass the value 32768 as an "unsigned short". However, Combat doesn't check a type's range yet, and therefore the test fails. - 3/ - unions-1.4 Fails for the same reason as above. - 8/ - All these tests fail because Combat does not implement the Dynamic Skeleton Interface (DSI). - 9/ - This test requires access to an empty CORBA Naming Service. The test can be run manually by providing an initial reference to a running CORBA Naming Service with the "-ORBInitRef NameService=..." command- line option. Because the test does not clean up after itself (it leaves some bindings in the Naming Service when it exits), the Naming Service must be restarted before the test can run again. Some tests will fail if the test is re-run without restarting the Naming Service.