ELF4d &4 ( 444ccc""k#^(^( /lib/ld-linux.so.2GNU"[S`rvl1;\ Y50 LJm)@8. T9iq-g!u :eBjM xO ~c ZQ=} *6?!2 <3 7>]DhkG#+oCAFR %VUzX(K$Hbs"p{n4^E_dyP'/&tNIfW ,|awy^(,bđ ~ @" > (Bh 8& H) X\~%!~6" h xG  RT$ >o\I d%  g+  ȶcX$*`~%![$xxDN ض X,{O" } 2^(h t V TT$ $I@( @ (.K 8@ H& X,$h: x}SE  -\a ] 2%4V$\ ȷ  ط: c .  R% (:, 8>Den HPXN hL=D(" x1}XO hF   BH(4HV$I ȸx ظ{  S B,g  (1~%@!u 8= Hg[ X>U ! xCp > е O0(A CV ȹ= ع r  -g (J" d~%!a 8:J i H: Xx;hC" @4(5 xA^ nlB$ȥJ \ = _(%_( ȺLG0 غ"w / =P =(%K8 H X/ hDN x}7" J r"  ;SdI$c5 p} GP$ : ȻJ o ػw,X$U$f /$> o :c ( 8Mu H X(x0V$( hx/4`I 7X +He L^(II I @ X~%!CȼJ ؼ Q >N >l (A 8< H2DP$J X+_h x2 =L> @ D 'I Ƚ<!7 ؽ(&= U$ :hT$DI$ ~{ (> 8> H" XB h1 x@  6 VK.tC$ ȾB ؾq% P$i,V$ .(b -zp" E^(| (h08(Y(8X@(P H=X/ h> x@k 2$<( } C_( 9D ȿq ؿ=_L%  >Z |?$ I@~%! Xl  (8,\B$ tV$$) H X hLO x \$( pV$ =LLH f`I$/ -0d q &@$ = ,|C$o((|,(u hE \V$% " (u 8@@X$2 Ht X S h+YxE 0__gmon_start__tclStubsTclInvokeObjectCommandTclInvokeStringCommandbuiltinFuncTableTclPrecTraceProctclFreeObjListtclEmptyStringReptclListTypetclByteCodeTypetclIntTypetclDoubleTypetclByteArrayType__ctype_bstdoutTclStattclPlatformTclpLstatTcl_UniCharIsAlnumTcl_UniCharIsAlphatclBooleanTypeTcl_UniCharIsControlTcl_UniCharIsDigitTcl_UniCharIsGraphTcl_UniCharIsLowerTcl_UniCharIsPrintTcl_UniCharIsPunctTcl_UniCharIsSpaceTcl_UniCharIsUpperTcl_UniCharIsWordCharTcl_UtfNcasecmpmemcmptclForeachInfoTypeoperatorTabletclTraceCompileinstructionTableTclDatelvalTclDatepvTclDatevTclDatepsTclDatesTclDatestateTclDatetmpTclDatenerrsTclDateerrflagTclDatecharTclDatevaltclDefaultEncodingDirstrlentclExecutableNameenvirontclNativeExecutableNametclCmdNameTypetclTraceExecstderrtclpFileAttrStringstclpFileAttrProcstclIndexTypeTcl_InterpObjCmdTclChannelEventScriptInvokertclNsNameTypetclStringTypetclProcBodyTypepanicProctypeTablefreeTclProcDeleteProcTclProcInterpProcTclObjInterpProctclRegexpTypestrtolstrtoultclStubsPtrtclPlatStubsPtrtclIntStubsPtrtclIntPlatStubsPtrTcl_AfterObjCmdtotalBytesTcl_NotifyChannelTcl_SetTimerTcl_CreateFileHandlerTcl_DeleteFileHandlerTcl_WaitForEventlibXext.so.6_DYNAMIC_init_fini_GLOBAL_OFFSET_TABLE_libX11.so.6libnsl.so.1_IO_stdin_usedlibdl.so.2dlerrordlclosedlsymdlopenlibstdc++-libc6.2-2.so.3cerr__ls__7ostreamUl_S_freelist_index__t24__default_alloc_template2b1i0Ui_t24__default_alloc_template2b1i0._S_start_free_S_chunk_alloc__t24__default_alloc_template2b1i0UiRi_t24__default_alloc_template2b1i0._S_end_free_S_oom_malloc__t23__malloc_alloc_template1i0Uiendl__FR7ostream__uncatch_exception__rtti_user_t24__default_alloc_template2b1i0._S_free_list__rtti_si__rs__7istreamRi__rethrow_t24__default_alloc_template2b1i0._S_heap_size__throw__Q2t24__default_alloc_template2b1i05_Lock__ls__7ostreamPCc__deregister_frame_infoterminate__Fvdec__FR3ios_._Q2t24__default_alloc_template2b1i05_Lock__start_cp_handler__cp_pop_exception_t23__malloc_alloc_template1i0.__malloc_alloc_oom_handler__ls__7ostreami__ls__7ostreamUi__builtin_vec_new__builtin_vec_delete_S_refill__t24__default_alloc_template2b1i0Ui__rtti_class_t24__default_alloc_template2b1i0._S_node_allocator_lock__builtin_delete__builtin_newhex__FR3ios__register_frame_infolibm.so.6logsqrtcoshceilfloorrintfmodcostanhsinatan2powsinhlog10matherrexptanatanasinacoshypot__terminatelibc.so.6strcpywaitpidchownprintf__strtod_internalvsprintfrandomutimecfgetospeedrecvconnectstrerrorfdopengeteuidmemmovesnprintf__writegetgrgidgetenv__strtol_internalbsearchgetpidqsortfscanffgets__strtoll_internalmemcpyperrorreadlink__cxa_finalizedup2feofmallocisattyendpwentgethostbyaddrrmdirsocketselectreaddir__strtoul_internalfflushrealpathlseekstrncasecmpsendabortchmodpipe__lxstatunameacceptcfsetispeedrenamestrrchrcallocwritefprintfstrcatbindinet_addrmkfifochdirendgrentsetsockoptfseekcfsetospeedmemchrumaskstrstrsignalreadstrncmpstrncpyunlinkgetrusagestrcasecmpreallocbcopystrtoklistenforksscanffreadsbrkstrdupsymlinkgettimeofdaylocaltimememsetftellinet_ntoatcgetattrtimeopendirtmpnam__xmknodstrcmppthread_mutex_unlockgetpwuidgetcwdgethostbynamegetpwnamgetservbynamefgetcsprintffclosestrcspnsetlocalegetpeernamegetsockoptstrftimeaccess__xstatrewindpthread_mutex_lock__errno_locationexitgetgrnamfopen_exitgmtime__libc_start_mainopenstrchrexecvpclosedirfcntltcsetattrmkdirclosevfprintfstrpbrkgetsockname__environ_environ_edata__bss_start_endGLIBC_2.1GLIBC_2.0GLIBC_2.1.380ii ]ii g;  ii g si qii ]ii g\(\(\(\(\(\(\(\( \("\($\(%\(+\(1\(3\(<\(@\(B\(F](H](M](O ]([](g](l](q](r ](t$](u(](w,](0](4](8](<](@](D](H](L](P](T](X](\](`](d](h](l](p](t](x](|](](](](](](](](](](](](](](](](](](](](](](](](]( ]( ]( ](](](](](](^(^( _(t_(u_(Y(Y(Y(Y(Y(Y( Y( Y( Y(Y(Y(Y(Z(Z(Z( Z(Z(!Z(#Z(&Z(' Z(($Z()(Z(*,Z(,0Z(-4Z(.8Z(/lZ(?pZ(AtZ(CxZ(D|Z(EZ(GZ(IZ(JZ(KZ(LZ(NZ(PZ(QZ(SZ(TZ(UZ(VZ(WZ(XZ(YZ(\Z(]Z(^Z(_Z(`Z(aZ(bZ(cZ(dZ(fZ(hZ(iZ(jZ(mZ(nZ(oZ(p[(s[(v[(x [(y[(z[({[(|[(} [(~$[(([(,[(0[(4[(8[(<[(@[(D[(H[(L[(P[(T[(X[(\[(`[(d[(h[(l[(p[(t[(x[(|[([([([([([([([([([([([([([([([([([([([([([([([([([([([([([([([([(\(\(\( \(\(\(\(\( \($\((\(,\(0\(4\(8\(<\(@\(D\(H\(L\(P\(T\(X\(\\(`\(d\(h\(l\(p\(t\(x\(|\( \( \(\(\(\(\(\(\(\(\(\(\(\( \(!U  p5Y(%Y(%Y(h%Y(h%Y(h%Y(h%Y(h %Y(h(%Y(h0%Y(h8p%Y(h@`%Y(hHP%Y(hP@%Y(hX0%Z(h` %Z(hh%Z(hp% Z(hx%Z(h%Z(h%Z(h%Z(h% Z(h%$Z(h%(Z(h%,Z(hp%0Z(h`%4Z(hP%8Z(h@%jhhVZYhVU+ $(e6 $(Y6 1e[^]ÍvUhh(+ $vUhhvUS]‰ H )ЍB)Љ$ÍvUuP` $XÐUWVSlE]EE@u }uu}E"] S$}}zmmE؃ SI$}8mɃtʃ$}}}} hmmmu}ME8_("8_(u}ME"e[^_]ÉUWVS,E] EEE@EЉƺp׉8u4jj jEpËE$1҃ Rhx{ ׉u8u6WjjEpE]$[^MU$hNjuй8jj jEp;ƒt2B=vhh(I QRjrvReEԋ@EЉƺ ׉8uE P Ph׉u8uPEphNjuй8E"1Eԋ@EЉƺ׉8jj jEp ËEԋ@EЉƸ8uWSjHuп8uVSj%uп 8BSjju -׉u8uBQjjEp ]؋U؋Mjj΋Mq R$VSufNjuй 8udPjjEpD ]؋U؋Mjj΋Mq %W$VSu;$|ZY$hh(,G Ov}ԋE}] Ee[^_]) e[^_]UWVS u }]t-t kt7bC=vW j+ H?v j+ ".jEP"@]"3]1Áyۃ_uw VKye[^_]ÐUVS,]SC' E䠣$jjESu' VoKy=Y4>t!u=B VKKy=t&jS& $'vEjPE䠣$& e[^]ÐUWVS8}Wu ]& EԠ$SVEW[E~%u؋]v VY_PhKu hXZEjEԠ$P?& e[^_]ÃjW)& $<'%vUVS hujjjV31ۃ Sh!vjSjVC ?~ރ h@U1ۃShBjSjVC ?~ލe[^]ÍvUVS] uu$uhh@_(F) L_($u ujh@_(L_($X) e[^]ÉUhjÐUhjnÐUS]S$ "CC @$]ÐUWVS EEE E]uCNjs8u'U B RP ZY$hh(>C 1v}uRNjs8u6s(V! UBuPshVB }E]} Ee[^_]$ e[^_]UWVSu V(]W)! CuSVhWB v1e[^_]ÉUS]SC $ CPhSk1 CPhSY1 (C @$jSV# $'RKv]ÍvUWVS]u }E]S&C $s{E[e[^_]U4E@@]@}PyMmUS]SC $ CPhS0 *C @$jS" $'v]ÍvUWVS]u }S`C $s{e[^_]UE@]@P$AMUUS]SC $ CPhS/ CPhS/ (C @$jS! $'v]ÍvUWVS]u }E]SC $s{E[e[^_]UVS,EXp u]EH@P}]uE\$$me[^]US]SC @$ CPhS. CPhS. (C @$jS $'v]ÍvUWVS]u }E]S~C @$s{E[e[^_]UVS,1ۋE?@]uEUH]@P]uEu\$$ ]uEMUe[^]ÉUS]SC $ CPhS- CPhS- (C @$jS $'v]ÍvUEp ppppÐUS]SPC $ CPhS- CPhS- (C @$jS $8'v]ÍvUEp pppp$ÍvUS]SC $ CPhSw, *C @$jSr $X'ngv]ÍvUWVS]u }SHC $s{e[^_]UE@]ÐUS]SC @$ CPhS+ CPhS+ C$ffffC(ff?*C @$jS $x'v]ÍvUWVS]u }E]SC @$C$ffffC(ff?s{E[e[^_]ÉUWVS"(]P]C$CEEu1K" kP]$M2UK" CP]K$Me[^_]ÍvUS]SC $ CCCCC ?C, C0PhS)* CPhS* C$PhSm+ C,Ph%S[+ *C @$jS $'v]ÍvUWVS EEE E]uSs/8u9suOu sE0h7h(9: "1EE E]Ee[^_]ye[^_]UWVS$hSu [u 1vEx0u@, P{UB0MA(vUB(R,9|^M A,R2ËEP(Jx!vƋMq0<Jy Ep0UZ0B(ËMY0SCPhUyE@(VhJUB(e[^_]UVS ]C( vCUk]C PqM^E$}SƒmtZK$tSs0ـEu?PS t tt4C0ppC0pp$SR$v؋s0De[^]ÐUEEE E,Em$x$u*}fE% fEfEmm]EÉUVSUr0E ـÈ@rJ(I5v14EuZ9|؉[^]ÉUVS] uu$uhahP_(. \_($u$uhxh`_( l_(`$u$uhhp_( |_(@$u$uhh_( _( $u$uhh_(~ _($u$uhh_(R _($u$uhh_(& _($u$uh h_( _($u$uh@h_( _($u ujh_(_($ u ujh_(_($ u ujh_(_($ u ujh_(_($h u ujh_(_($@ u ujh_(_( $ u ujhp_(|_(@$ u ujh`_(l_(`$ u ujhP_(\_($ e[^]ÉUhjÐUhjÐUWVS,} }uRjjjwjjjÉwoVSh]S Shh(3 1h5(1 e[^_]ÐUSSE u7" P Ph5(Z((bu]jj jEpÃuQjj5" "XRSj5"PShh(2 1]ÍvUSj~XZhSc C$$\ZYhSA CЧ$$:YXhS C$$XZh S C$]Ét S hT'Yt S hd'9t Sy ht't SY h'USR]{tPSh 5_(v(SH RPQ$C]ÉUSS]KɋE Uth 5_(Dsv RPCPS5( C]UWVS }] uu(WH RPQ$ VSGPW5( Ge[^_]ÍvUSP]{tCu SP {uC]US]S C $CCC]UVSu] F $(jVa tue[^]ve[^]ÐUWVS }Wҋ]uGx%v h!$ ]uEEu!EppVSh@!5_( $"ҡ "y-h!5_(m$U  "$"GWE UGB]u "E$"_B WRP(e[^_]ÍvUSR]( PSCu C SP0uۋ]ÉUWVS E]u@]uEE} u!VSEpph!5_( _EWXpG_WwPe[^_]ÐUE p pPulÍvUS ] sh( tCt PF S]ÉUE@@]ÉUWVS(ҋ]uE(} C$Ƹ"8u] C SP"h`"5 _(@HPj-HLV FPTVF$FU $"8u%P]{1Ph"5(2$"8}wu-h"5_((" u} zC$Ƹ"8t$"8u`jjjs ]K RPSQ,Ã1}G SWP$Ct P] S$"8 sj<@@ <@@@1щ $UC`1[^_]ÐUS]S CC $C C(C,Ph#Sz )C `$jS$'rkv]ÍvUSjE]P#MEc(]ÍvUS]CCS[(]ÍvUWVS Ex(2 uUU׋UBEB ʉڃEu:$WVr$r $h$5_(U0Su؃ UB RP0ÃtCu}EÈ@rtaVs suy#hK$5_(ܿ$ CuEppSP+UB SRP( UB RP4$EXe[^_]ÉUSE ]] C SP4$ڷHu SEẼ@s1]UVS] uuuD`(H`(f$uuL`(P`(h$uu T`($u$uhj$hX`( d`($u$uhy$hh`( t`(`$u$uh$hx`(Y `(@$u$uh$h`(- `( $u ujh`(`( $? u ujhx`(`(@$ u ujhh`(t`(`$ u ujhX`(d`($ e[^]ÐUhj2ÐUhjÐUVSu] F $F$jV@ tue[^]e[^]ÐUS]S C $C$C]ÍvUh%u UWVSE ]uE}CVPh%WuS  t e[^1_]ÍvEu}E ]e[^_] U]ÍvUWVS EEE E]u3s%8uU B RP0e[^1_]ËME]M Ee[^_] U EP ju PR ÉUS(R] yK{ tTB(uIStBjRPCKP58"jQZ(C$(C vHB(]ÍvUE@tQEPu 5 _(葾UE =Uuu`(`(%=uJu`(`(%]ÍvUhjÐUVS]u uS C $sCe[^]ÉU1]ÐUS]S ssh%h( C $PXZh%Sn ]ÉU]ÍvUuu Eph%h( ÉUWVS EEE EEEE]uLs%8urUrtjj js1qSEph&3u;s%8u!UBtQ0h#&h(E 1!EEUEU Ee[^_]R e[^_]UVS] uuu`(`(&&uu`(`((& (*&$(.&((2&,(6&0(<&4(B&8(F&<(L&@(Q&D(W&H(]&L(f&P(k&T(r&X(z&\(&`(&d(&h(&l(&p(&t(&x(&|(&(&(&(&(&(&(&(&('('('('('('( '($'()'(.'(7'(?'(I'(V'(['(e'(o'(s'(w'(z'('u.u)RjTh'h`(`($`((u.u)Pjh'h`(`(`$`((u$uh'h`(; a(@$u ujh`(a(@$M u ujh`(`($% u ujh`(`($ e[^]ÍvUhjjÐUhjRÐUVS] uuua(a(`(uu a(a(b(u.u)Pjhd(ha(L a( $(a( (u ujha( a($ e[^]ÉUhj:ÐUhj"ÐUSP]Ct P褻Ct P葻CCC]UWVS} EX޿(8uUrt u 1Jv޿( 8uMY tӃ uƉ޿( 8u u렉޿(8u uuv޿(8 uEv} zu^޿(8uqjj juvpjj jpEp YX} uQjjUr}$SVu ޿(8u9jj juvUB4i()޿3)8u9jj juv萶@UBt jj jVo@U v>ue[^_]ÍvUWVS E M]E9ًE}EUu ,AEFHEMHEE :+Me[^_]錩G89}/WUB M;=?u h+ Ph+BC9 h+)E9u h+ E]K8Uu;[sh(" UBSPshr,h(v vME]M Ee[^_]e[^_]U EPR uu pR USSUB] tQ@ jSrP p(y&K{ tTB(uIStBjRPCKP58"jQ讗(C$(C vHB(]ÍvUSSUB] tQ@ uSrP$sv(y膛K{ tTB(uIStBjRPCKP58"jQ(C$(C vHB(]ÍvUVS] uuuLa(Pa(,uuTa(Xa(,u$uh,h\a( ha($u ujh\a(ha($ e[^]UhjFÐUhj.ÐUWVS E] EEEuCp,8u'jj jEpFUB e[^1_]ÍvMEM] Ee[^_]UVS] uuula(pa(,uuta(xa(,u$uh,h|a(D a( $u$uh,ha( a($u ujha(a($* u ujh|a(a( $ e[^]UhjÐUhjÐUVSu ] V8F $ F F$F(F0^4Ph-V F$Ph-V F(Ph-V F,Ph-Vy $ 衔É$WG ^0Ovt SM h 'F $F`$jVh$'ȍÎve[^]ÐUVSu] F $F`$jV(tue[^]Γe[^]ÐUWVS } EX޿-8uUB0@@1v޿-8kMA0PҋXt RF t S6 뫐} 2EX޿- 8u+UB0HpMqR?Yv޿-8u/EXREPS5(輨 MQ0BPF޿. 8uCEXWEPS5(t MQ0BVSh-h( S޿ .8u+UB0HMB qRP@pPuu uee[^_]ÐUS]C0u h.p7C0P $R$]ÍvUVS(@.Ƀ.]u }fE% fEfEmm] C0EV$h .p跑C0P PR $ (PK0@VRPRPh`.qC0P PR$e[^]UWVS( ytEH (y\< (yJ4 l(y6 (y"ыttt tuF:B؃w,ttt tuGv*u [^_]UWVS(Ly襓MQEԡ (y芓(ywvEС(y`‰UEȹ.Uԋ3E  (EċuĿ.8t2uĿ.8tuĿ.8uM̋~ T"EȋMąu j  u*EuغEސ-HJyF(y苒vUB8Cu-U؀xPu-VF-xAu-VxEu-VxFu-VxNu-V35(݃XZs5(DžZYEs5(踃YEXs 5(衅EMQ,(@//}fE% fEfEmm ]UԋA0ruuuuWsVruuuE$u h.p1P(@//}fE% fEfEmm ]UЋMA0r8r@rDr2h e[^]UhjFÐUhj.ÐUVS] uuuc(c(;uuc(c(;u.u)PjLh;hc(萈c($c($(u ujhc(c($\ e[^]ÉUhj:ÐUhj"ÐUVS] uuuc(c(;uuc(d(;u.u)Pjh;hd(謇d(@$d(4(u ujhd(d($x e[^]ÉUhj:ÐUhj"ÐUS]S{ CC $CC]UWVS } EX޿ <8PE0h@<h(0 _5( Ph_<SGJhd<S9E1҅‹MQhk<SE1҅‹EP‹B $P81:v޿t<8uU B RP<1޿y<8MAV0h<h(苙 1} EX޿< 8uWUrh(w MAuSEph<h(% e@ UurPd1M޿<8u#jj jMqVDZYMQ PQR,1Puu u蕆e[^_]ÐU]ÍvU]ÍvU EPR ju pRLÐUEPtu 0h<h(0 ÍvUEPtQ0h<h( ÐUVS] uuud( d(<uu$d((d(<u$uh<h,d(| 8d($u ujh,d(8d($| e[^]UhjFÐUhj.ÐUS]SdC $C4@@ @@ S,C C(C,`$BZ Ph=S (C S%jSx $`( @Av]ÍvUS]C(SQX,$S(e]UE@(]ÐUVSuF(t6SFX jQFP PRhYZ0vSL4$ZF,$P"ee[^]UVS] uuuG$[^h=w=A|uwh=[v1G 9Ƌ_$}[|jjS4;Hu.ffCffCFG 9| h>#>IG P$X" P۽hEۭh >}UE mU]mEe[^_]ÍvUEu US]SC $CT]ÉUSS]CTt PPC`]ÐUWVS EEE E]uWs(>8u=sh(n UBTuVsh9>h(5 "1EU]E Ue[^_]ae[^_]USQ]S,t2PC@ js(sPLZYC(S PSR@S XC0$P^]ÉUVS]PCXPC`PsTu C\1ҋCXRP,$XZe[5P>^]ÉUVS] uuuld(pd(X>uutd(xd(Z>u$uh\>h|d(,t d($u$uhf>hd(t d($u ujhd(d($t u ujh|d(d($s e[^]UhjÐUhjÐUWVS EEE E]u[s>8uAsh(l UuPsh>h( #v1EU]E Ue[^_]e[^_]US]SC $ CTǃPh>S} C\Ph>S} CdPh>S| C|Ph>So| C(Ph>S} (C S%jSZn $(V6O7v]ÍvUUB(BdPB|<$X%?RlzTRtݚB\ɋBǂǂݚt@4]ÐUWVS\}Gl]؋LJut݇]С" _|P@]uE\$$}e4mM?}UE mU]mE]mv݇]ȃ _|P?]uE\$$}3mM?}UE mU]mE]ȃu LJu[݇]" _|P?]uE\$$}`3mMEɃ]T݇] _|P>]uE\$$} 3mMEɃ]]LJHW(E E؍e[^_]UVS] uuud(d(?uud(d(?u$uh?hd(8o d($u ujhd(d($Jo e[^]UhjFÐUhj.ÐUWVS EEE E]uK`?Njs8u/sExPFXZsEPFe[^1_]Ë}E]E }e[^_]UVS ]SC $ jjCxPG jjP@$G CTPhh?Sx Pht?Sx CdPh?SOx C(Ph?S-y h@$p jPi $(1Cxp jPi $(1C S%jSi $$(|1w2ve[^]ÐUEP(@dR<$ZPlxTݘ@t@t@4]ÐUS]Cl]CtuW CxPF?}UE mU]mECtuCt PFE]CtHCtS(E E]ÉUWVS ]{,C ClـE@u?E@uVC@ h? QC@ js(sPLC(S PSR@كES u C0$PU؍e[^_]ÉUVS] uuud(d(?uud(d(?u$uh?hd(tk d($u ujhd(d($k e[^]UhjFÐUhj.ÐUS]SC $ CTClPh @SXu CdPh&@St C(Ph.@S$v CpPh:@Sv )C S%jSf $`(./v]ÍvUUB(BTP<$XBZ\t@4]ÐUS]C SPDC,C $PP]ÍvUS]C(CTP<$XS\]CdE@t/" H@P]8E]C\ME]C(U Cl@;CpCl}E vP@]ÐUVS] uuud(d(X@uud(d(Z@u$uh\@hd($i d($u ujhd(d($6i e[^]UhjFÐUhj.ÐUVSu VoF $FLVDF F$BF$@@ @@FD$r Fh$ 2É$3d C %CCC^@F(Ph@Vr F0Ph@Vhs F4Ph@VVs Mt SE2 h(+F $F`$jV`l$(+,ve[^]ÐUWVSuF $F$F@} P PR  FDPzPV@Zt{(yJ5S{ tTA(uICt@jsPCSP58"jR0(C$(C HA([$uV@tB jRPF $F`$jVRktue[^_]0ve[^_]UWVS ]Ch} tC0[ (P@C8SR ǃE1C $C`$jSWK$( v v]ÍvUWVS(\yM A  (yhU<(ySvE][E4$E} G @ vv6uw P4E 9tx](ۋPE@WuEQMRP]hESډ1уD QSEJ4 MU]!^  u^u_Ë}FD(@Epu[ÃN uAUB @ vv6ur P8uMHPQR }D(AUB @ vv6ur P<]MHPQR RuF@ uu vP e[^_]ÉUWVS} EX޿F 8u3Urh(l= MA PEphFO޿#F8uKUZWPS5(5$ MVSh@Fh(l^ } EpkF 8UtsB pHhuFS1уD QSU1 _XUMjRP 1Vuu ure[^_]ÐUUM 1(9 t@=~]ÉUU1(:t'@=~ hF $c vÉUWVSE ޿E8uMPShF5_(ME ptpA Q1VSMpH(rrhFS 1,D QSMT0 0e[^_]ÐUVS] uuue(e(Guue(f(Gu$uhGhf(@ f(@$u ujhf(f(@$A e[^]UhjFÐUhj.ÐUS]S C `$ CdC$C`ClCpPh@GSKJ $CGCHGGP2C @$C$jSD$(vv]ÍvUWVS  f($u ujhf( f($> e[^]ÉUhjÐUhjnÐUS]SC $ CdC`$C`ClCpPhxGSG $kfGCHfGP0C @$C$jSKB$ (vv]ÍvUWVS,]U D@8KXE}t C`<s7U@]sd$}XClɃ GEC@È@ms%ȋ7 ɋP [l$PR4vC`1e[^_]ÍvUUE D@8E}jlZl]UUE MDB`@8QE<$jlYZl]UVS] uu$uhGh$f(*< 0f($u ujh$f(0f($<< e[^]ÉUhjÐUhjnÐUS]݃CSH s8JB$RP X5 _(C@ ]ÍvUVS] uu$uhGh4f(>; @f( $u ujh4f(@f( $P; e[^]ÉUhjÐUhjnÐUVS ]SgC @$C$sh4$U C`FFF@%ǃǃPhGSsD $GCHGP^ChG0C @$C$jS>$(;v3ve[^]ÐUEh@eP$PR ÍvUEh@eP$PR ÍvUEPh@`BEH@ـÈ@s B$RP 1ÉUWVSE ޿G8uuƄvRShH5_( U BݕE@Ltf v6$USrTrPrHrP(pph HS1 YXhlISZ> XZhxISM> ZYhIS@> YXhIS3> XZhIS&> ZYhIS> YXhIS > XZhIS= ]]3UWVSE ]uE}C VPh`IWuS@ VC$PhlIWuSv@ VC(PhxIWuST@ VC,PhIWuS2@ VC8EPhIWuS @ uwVC(F$5(F vHB(e[^]ÐUWVS E] EEEpLǹ8 uá(yS4E@E1I@|}(L(y€{ tTB(uICt@jsPCV58"js=(C$(C HB(EuVUB P jSPR 1}E}] Ee[^_]1e[^_]UVS] uuuf(f(Luuf(f(Lu.u)Pj@hLhf(#f(@$f((u$uhLhf(F g( $u ujhf(g( $X u ujhf(f($0 e[^]ÉUhjÐUhjÐUS j]S"C $ C0C$CXPh@MS& "jS) h(|wv]ÍvUS u ]SC $ C0C$Ph@MS&  jS h(v]ÍvUWVS,EH0t E E hLMo} u hMY(@EM؅]v uEܡ(y}U܋Mr0AX@AXC (fCyQE M}}E m}}m1REP,$XZ\1ut uM 8ufKQUB@ jurP E؃M؅8E My0Ӆ QEܡ(yv}܋O\(yUBX@BXC5(fCycvE M}}E m}}m1REP,$XZ\Ut uM 8ufKPUB@ jurP  MA QPpe[^_]ÉUVS] uuu g(g(Muug(g(Mu$uhMhg(T (g( $u ujhg((g( $f e[^]UhjFÐUhj.ÐUS]SC @$C$CCC ]ÐUVS]Sҋu C @$C$t"B҉CtB jRPC…uދStB jRPjSt]e[^]ve[^]ÐUE@@]ÉUWVS EEUB@1;B tB EEPt9EB;Bt B0RtEB;BtG0B~E t uT uQƃuWuU2(hNS1 VE0hNS0 e[^_]ÍvU]ÉU]ÉUWVS( } yGE0Vuhƒu0VE0h*N(S0 X5( wY^PS( BMAB (yO tTB(uIWtBjRPGOR58"jQ:(G$=(G vHB(e[^_]US(Q] y2CpE0hNh(/ (yK{ tTB(uIStBjRPCKR58"jQ(C$(C vHB(]ÍvUE@U t 9Pt @u1]UMU ABQ]UWVS EEE E]uwCEƿ;N8ush(t _ZPu4uAN 8u&sh(B [^UBPR_1vEU]E Ue[^_] e[^_]US]S C $ CCCCC PhJNS E C jSY h(TOv]ÍvUVS] uuu,g(0g(QNuu4g(8g(SNu$uhUNh VG(҉yvQFdBRF@ jQvP ؃KE ~0Ӆ~< V(҉yvFdQBPF@ jQvP  F VPp F Ve[^]ÐUS]Khtt C SPtSXts0sXCt]Clt/" NP]E]CtME]QuuC|P]ÉU E@h0hNh() ÉUUBpE 9BdBp}Bhu B RP|ÍvUSSUBX] tQ@ jSrXP p(yrK{ tTB(uIStBjRPCKR58"jQ(C$(C vHB(]ÍvUWVS E E}E]E@EƸ O8u SL1=u O8u C SP|1vuO8 C S1}E@EƸO8u"Eph(g CX1uO8ujj jEpZ+CdY-u'O 8ujj jMq^_PS1EMEM ]e[^_]e[^_]UVS]s|~u (H RPQ$F(C\Ct@Eu $Vv؃ C SPt sxstC|Pe[^]ÉUVS ]SX(ZP@C\S`C VSPx C@ jVsP e[^]ÉU(ҋMyE PAdBAXAdt @@1ÉUEP R jp R<UVS] uuu\g(`g(1Ouudg(hg(3Ou.u)Qj h5Ohlg(xg( $g((u$uhFOhg( g($u ujhg(g($ u ujhlg(xg($t e[^]ÉUhjÐUhjÐUS j]SfC `$Cx@@ @@ SpCdBC$ClCp$Z C0PhOSy C\PhOS C`PhOS CX!jS h(\Wv]ÍvU E@XphpdpPUS]CpPCX]ÉUEPlR u plR4ÍvUS]S(yQ‹C`BClC`@@PC@ jQsP ]ÍvUS]CXjsl.C0${Cd]K\t/" OP]E]CdME]RuuCpP Cl0hOh(" ]ÐUWVS E E}E]E@EƸO8u SX1uO8u S7uO8ufjslC0$b$1^}u:EpO8uMqh(N Cl1EMEM ]e[^_]e[^_]UEP R jp R<UVS] uuug(g(Ouug(g(Ou$uhOhg(( g( $u ujhg(g( $: e[^]UhjFÐUhj.ÐUS j ]S.C $ CXC`$CXC\C`CdChClCpCtPh PS C\Ph#PS C`Ph&PS CdPh-PS ChPh7PSz ClPhAPSh CpPhFPS !jS h(v]ÍvU]ÍvUVS(Āu yvFPE0hNPxSnZYSh( (ytN~ tTB(uIVtBjRPFNP58"jQ(F$5(F vHB(e[^]ÐUVS ]Sơ(yN(P@CXAC\A C`A CdA ChA fClQfACpStAQPC@ jVsP e[^]ÍvUS j ]SC @$ C$CXC\C`CdChClCpCtCxC|ǃǃǃǃǃǃPh]PS% PhAPS CXPh&PS C0PhfPS #vjS- h({v]ÍvUWVSU Bt@jrPM AP58"jE pFpE P P^p]؋FXEsssEe$VFXEݞ { t!uUB PuuVEܦCE~X;}(yU JE x BB(3U Bt!@jrPM E AHV58"jQ-U (B$(B ~XEf{H tS191҅tMQt utOuRuuVEݞ(yvU JE x tZB(uOE PtBjRPU BJS58"jQNM (A$ (A HB(e[^_]Uuuu E0hPh( Uuuu E0hQh( UWVS E] EEEpQǹ8 uá(yS4E@E1I@|}(!Q(yp€{ tTB(uICt@jsPCR58"js(C$(C HB(AuVUB P jSPR 1}E}] Ee[^_]e[^_]UVS] uuug(g(1Quug(g(3Qu.u)Qjh5Qhg(|g($g((u$uhFQhg( g($u$uhWQhg( g($u ujhg(g($ u ujhg(g($ u ujhg(g($ e[^]ÉUhjÐUhjzÐUWVSj]SC $C$sX4$7 X%~Fsp4$ ~F4$ ~Fǃǃ@ǃǃǃǃ4$ F~ǃǃǃ4${ ~F$c ǃ0$E XǃHǃL@@@ @|@@ @@@@ @@@ǃDǃTǃP $pǃxǃt$ǃǃ$ǃǃ?ǃǃǃǃǃǃǃǃ$ ǃ$ ǃ$ ǃ$ ǃ@%ǃǃ0$u @ǃDǃHǃLǃPǃTǃXǃ\ǃ`d$ tǃxǃǃǃǃǃǃ$ $ $ ${ ǃ $] ($I 8ǃHL$+ \ǃl"jS h8(ܹ׺ve[^_]US hQ]S XZhQS ZYhQS YXhRS XZh RS ZYhRS YXh)RS XZh7RS ZYhERS YXhORSr XZhXRSe ZYh]RSX YXhfRSK XZhkRS> ZYh}RS1 YXhRS$ XZhRS ZYhRS  YXhRS XZhRS ZYhRS YXhRS XZhRS ZYhRS YXhRS XZhSS ZYhSS YXhSS XZh*SS{ ZYh6SSn YXhDSSa XZhPSST ZYhVSSG YXhdSS: XZhrSS- ZYhSS  YXhSS XZhSS ZYhSS YXhSS XZhSS ZYhSS YXhSS XZhSS ZYhSS YXhSS XZhTS ZYhTS YXh%TSw XZh.TSj ZYh8TS] YXhATSP XZhFTSC ZYhLTS6 YXhTTS) XZh]TS ZYhfTS YXhmTS XZhrTS ZYhxTS YXhTS XZhTS ZYhTS YXhTS XZhTS ZYhTS YXhTS XZhTS $C $P0]ÍvUWVSE ]uE}VPhQWuS  VPhQWuS q VPhQWuS L VPPhRWuS ' VPh RWuSu  VPhRWuS4 VPh)RWuS VTPh7RWuSn VPhERWuS nVPhORWuS IV|PhXRWuS $VPh]RWuS VPhfRWuSM VPhkRWuS( VC0Ph}RWuS VXPhRWuS nV\PhRWuS$ IVPhRWuS $VPhRWuS V`PhRWuS VdPhRWuS( VhPhRWuS VlPhRWuS kVpPhRWuS FVxPhRWuSx !VPhSWuSo VPhSWuSJ V(PhSWuS VPh*SWuS VPh6SWuS hVPhDSWuS CV(PhPSWuSu VPhVSWuSP VPhdSWuS+ VPhSWuS V PhSWuS V(PhSWuS eV,PhSWuS @V4PhSWuSr V<PhrSWuSM VDPhSWuS( V@PhSWuS VDPhSWuSb VpPhSWuS bVtPhSWuS =VPhSWuS VhPh%TWuS VPh.TWuS VCXPh8TWuS; VCpPhATWuS VPhFTWuS eVPhLTWuS @V0PhTTWuS VPh]TWuS VPhfTWuS` VPhmTWuS; VPhrTWuS V0PhxTWuS bVdPhTWuS =VPhTWuS VPhTWuS VPhTWuS] VPhTWuS8 VPhTWuS V(PhTWuS ucVLPhTWuS uBVdPhTWuS u!VLPhTWuS t1Eu}E ]e[^_]酹e[^_]UWVS( ]tpx11݃ڋP $XڋD U\$\$$Dslxs,s(s$s WVhTVT1эy7 1SH`tPQVsH 7e[^_]ÐUWVS( t@E ޿rT8t޿R8u0QU rrSEp,p(p$p $hUz޿R8u3RU rrSEp,p(p$p $hU1v޿AT8u;U݂E H $Sr,r(r$r $hUv޿FT8uCU BU݂P $X $Sr,r(r$r $hU޿LT8u;E݀U J (V$Sp,p(p$p $hU*E pSUr,r(r$r $hVP01эq UBHtWQSrH e[^_]ÉUUDM t餽@t UB QRÐUVSuPt"TtQh?jR V_"Z$SP e[^]ÐUE(݀z0V}ME mM]mUǀǀǀǀǀǀǀÍvUWVS(}G WLJXY[jRP XZjRP G <$[^GXPjPR ZYtdSRP ^XSRP ݇}UE mU]mY[E荏0@PQR ݇ 8V"LJLJ?ݟ(LJLJLJ$G]uE]XZ]u䉷LJHjRP Y[jRP XZjRP [^8(jRP ZYjRP ^X jRP t ptY(݇x8V}UE mU]m싗tE҉|LJt W8LJLJ?e[^_]ÐUVS]CpPjPR ݃ڻ}UE mU]m^XEVPVR ݃ڻZ}UE mU]mYEPVR ^X,( $@0jRP e[^]ÉUU݂ ڊD݂pEu݂xEu݂ڀEu@ڀEu&؃$h@V5_(ޡ$UWVS(@E`E t;ًUܲ`V}ME mM]mpUHRPQ Z]܃݃]Eܳ}UE mU]mكpEQPQR }pwGjWP w]SEf)ƃSPSR {CjSP fyދMЋf)ƒ]MRSP EZjSP =ECVSP ZUYGI]PSR M]+݃R $Zݛ e[^_]ÐUVSu݆} hV}UE mU]m􍞈ESPSR ݆4݆K-pV܎YXݖhV}UE mU]m􍎸EQPQR ݆KكEuB݆ـEuݞڎ݆Euݖ݆݆xVܾ,ݞe[^]ÍvUWVS }D?0@PQR D~9CPVR ZYCjSP e[^_]UWVS]SE;ǡ(yW (y4E A(P@QHLAEAQ |tFtFǃM u7Pt(y腩WXB|tF(yYGpx9uEC WSZY@PQR YXPQR C@ jWsP E ;ux9E ~ C SPpx9E d~Qtu RP TukE ;XǃT~VX(P@\`7$@ PQR _X<8(VRP Tuut C Se[^_]ÐUWVS } uu&@h@R.E ~018RQP F djjVe[^_]ÉUVS] u؃PQR ~ džF djjVe[^]ÉUWVS EEE E}EEX؉ƿV8uQjj jEpux9~+F QVE+@ RuPxi؉ƿV 8u%jj jEp訞_ZMQ PQRx1P؉ƿV 8u!Eph(r U艂l؉ƿV8Eph(2 ËM URP Y^,u苃(,(0@DRP XZpPPR Y_PPR XZRP Y_@0DRP 1!EUMEU Me[^_]"e[^_]UE݀݀Eu}UE mU]mEÍvUE݀UMEEuUWVS8EEE]E} C SC $P|Eu x,sXVu(P@ ݃ EF9;݃ـE@tt^PC sXuvSpt SVBFRVP hzt?h{GtPBxtt." P}m] ue[^_]鷾ؐ C SP|" P}|mY$V}݃ـE@ttHRC sXuvSE܋pt SF@VPVR xta؃ C SP|ut E9Et!؋Cl9;L؃C uSe[^_]ÐUSRE]t C S C SM uCXBHRPQ ǃT]ÍvUS]C SYP$S ]U(ҋMyLE PB9Al;x|݁Eu A Q A QÉUVSPu݆ۆDـEdždžMbP?u V $W؋H@HP$݆X VdžH݆ $PR v݆P $܎܆LXE݆ VdžLdžP݆(܎܆LE݆ VdžLdžP݆(܎܆LEuc݆ VdžLdžPpv݆P $܎܆LXEt ݞLk݆ VdžLdžP@<$術݆ܾZ$SP ݆<VـE@݆݆VVEʀu V 5V ɍ}$RP ݆<mVـE@ܦhUU?hUUUUȃ$}}}Smm WhUU?m VhUUUUܶ$}m݆VmE˃ u' V ܆&5W ܆ɍ}$RP ݆<mE@݆ V ܆݆݆ VVء(@ݖ݆ܦÈ@sP#݆݆ $RP !؃hV#$; ؋htG݆}UE mU]mEh9Ѝ~R$Z $QP e[^]ÉUWVS<}E݇ۇDELJuEh|t.u%ǃjS jjS@u;hWS ZYxǃjSN jjSi]UWVS( u} y7vGE@PQR MQH(LyG8t|tEpV+F WVMQ9~OF WVT VaX$SP 9(yBGxtt} ue[^_]v@PQR l9udu F V9}`t F VptttEpV (y~O tTB(uIWtBjRPGOP58"jQ(G$=(G vHB(F djjVe[^_]ÐU} UuB djjRUSSU ҋ]5hWS݃Eu $RP ؋x9u@uu ǃ;xu uv;}uj) @PQR XZǃjSx9utRjvPjjSǃC djjS C RSPt]ÐUWVS( ]u y[vFx@PQR 9u.;~&PC jBRS@C djjS(yӉvN~ tTB(uIVtBjRPFNW58"jQZ(F$5(F vHB(e[^_]U E0hWh( ÐUEP R jp R<UEP R jp R<UEP R jp R<UU9|%xǂu RÉUVS=/$u] uhW5_(V|$0Xv F VP|YZ@0PSR D@jSP ݆}ME mM]mEP$X $RP O F VP|݆P $X $SP X݆Z}UE mU]mE@0PSR D@jSP SRP ݆}ME mM]mEP$X $RP j F VP|ZY@0PSR D@jSP Qh?jRP jb džLdžPdžHe[^]ÉUWVSu(݆xHX}EE mE]m݆ܾ }EE mE]mt}E+|9|WhVE+|1hVE+|C9E艆džE艆|FX EXF VP|9uE艆džnEPH9u[);~E+9|<hVY[hVE艆dž V e[^_]UWVSu(݆xPX}EE mE]mM+|?9|eș+dž~ChVO~.hV:KdžE艆|E+?9|N; u dž)džU艖dž ~X_F VP|9u#dždžjWH9u[);~+H~:hV3Y[hV&džuFldže[^_]ÉUUu1E ;|ǂl9u]ÉUWVS]l} PҋKlptc(@XX}fE% fEfEmm Q]s8Ws(s E$hXXR0te(@XX}fE% fEfEmm] s,s(s$s WE$hXV~0 lP PR(e[^_]ÍvUVS] uuug(h(Xuuh(h(Xu.u)PjHhXh h(Xh(`$ h((u$uhXh$h( 0h(@$u ujh$h(0h(@$ u ujh h(h($в e[^]ÉUhjÐUhjÐUW}LJ`$GGLJ LJ1 <$ÐUW}G 1<$ÉUUE݂ uE ;ݚ ]ÐUWVS Uuҋ] Edž h@Y/y)1=~ 1F9~IP9}N vB%9|؍V %M^ F@%E9} dž9|L;^G%V t}u džV EA<%ue[^_]ÉUVSuj] VF `$^XF$^`$ CX%FxShfYV襽  jV ht(\tWuve[^]ÐUS ]huYSg XZhYSZ ZYhYSM YXhYS@ ]]鵀UWVSE ]uE}C0VPhuYWuS u]VC\PhYWuS" u?VC|PhYWuS u!VPhYWuS t1Eu}E ]e[^_]鑀e[^_]U]ÍvUUE B]ÉUWVS EEE E]u3sY8uU B RP0e[^1_]ËME]M Ee[^_]US]sXCx]ÍvUWVS(uV} 藌E(@(ya|EWUMAEVXHMAF\t Q AMQMAQ  (y|EOXD D(y{VxÅҍ<tBEt MyutjvX~VxtExtxu ttjvXLVxt UzuGt FX@Gu?u~xtMyu9t(y+{vEPMFXquRvXP Y[F uVPt F@ juvP e[^_]ÉU]ÍvUWVS( }u yzvVDE(yzs3swX uswXƒtG RWPlVW(yFzN~ tTB(uIVtBjRPFNR58"jQu(F$5(F vHB(e[^_]US u ]S C $@@ @@ C $Bǃ0$Z PhYSJ 1C `$C$jS}$(KovCpv]ÍvUSQ]xu P#]]HUWVS( u} yxvWDE(yxs3svX usvXƒtF RVPlExtFNXHS9u9t;Q|*~xE EUEe[^_]vxu P7WV^xtw(ywS{ tTA(uICt@jsPCSP58"jRs(C$(C HA(Fx(ywvO tTB(uIWtBjRPGOS58"jQs(G$=(G vHB(e[^_]UVSu^xSVk(FxyvvS{ tTA(uICt@jsPCSV58"jRlr(C$(C HA(e[^]ÐUEP R jp R<UVSu] PoۉF~ڍv@JuFe[^]ÍvUVS u] vVrtue[^]@re[^]ÐUWVS E }EuE Y_(Ee[^_]wivu`F~!Pjh Z5_(SiY[FjVP  j qXZvS4FF,E|0e[^_]Ívt S}q h(kUWVS ] s}~$VjhZ5_(h^XCjSP s4tj4 j :qXZVSC4,e[^_]ðt Sp h(yjUSR]41;Q}A@B;Q|A]]vUVS]4u ǃ$ǃ( $tjPjP ǃ`$t]e[^]pe[^]ÐUWVSE}JUEEyuhZEH9M|=4Bt019E}B@A;J|B9M|UiM,X0t,t"EMEBE@BEU,9u| h [clvEEMX98ȋU% uʉUA9ȋU% X$SP 9(ylUBxttU ]e[^_]|@PQR l9u B RlG+9~G9}`t B R(ypkUZEx tZB(uOEPtBjRPUBZR58"jSfU(B$(B HB(t lH9~B djjRe[^_]ÉU1} ]ÉUVSu19ÃVum\u |tWuS|t?u6ǂPjj6X P j@P6h\u\h@\6[ZYxǀj6 jj6 P j@P6e[^]ÍvUSRM ɋ]uQCjRP \t xE E]vP QPRt]ÍvUVS] uuuh(h(O\uuh(h(Q\u$uhS\hh(輚 h($u ujhh(h($Κ e[^]UhjFÐUhj.ÐUVu S]tC8t C8PtjP,@ $@$CCC C,C0C4PCPh\0& CPh\0 C4Ph\0 C0Ph\0 ^t@ $@$ h(q]t @ $@$jPk h(@];^ve[^]ÐUE@ EEUWVS( ҋ}yfE PU_0tw]K19~)QPjh\N`B9v )@B9 )1RP,$XZ ܩ$SP @MQRQP HXC9Y}ASQP  Tt0X]9C|"ǁT@0jRP e[^_]ÍvUVS]Sҋu tC,uP C,V0VS P j@P0e[^]ÉU1]ÐUVSu19ÃVu}\u |tguc|tGu>ǂRjj0 P j@P0|\unh]1Yx[ǀj0\ jj0t P j@P0e[^]ÍvUWVS( }ydU rƋG @G u ݀ (i_$vu(P@GWmuh(@@0WgO$}EE mE]mGUW~#;D0}@RSP @PQR VH(LycU B8t|tv0XP u 0v9Ή;}9HtD_4t=x)XD9}Q$YS$[ $PR @P G,u 00~Tp VX$SP KO0u CP u 0!9 (yau NyttV0@PQR l9u" A QlBv9~fh)]0g@w~f)JuNQXZCJPRQ  P jS0v9}`t A Q(y`U u J~ tVB(uKVtBjRPFNR58"jQ\U (B$(B HB(uB djjRlH9~GuB jjj3e[^_]ÉUVS] uuuh(h(?]uuh(h(A]u$uhC]hh(\ h( $u ujhh(h( $n e[^]UhjFÐUhj.ÐUSPU ҋ]tt P視@ @$@ $C`Cd]UVS]@ @$@ $C`u t PYCdt PYt@ $@$jPct]e[^]Ze[^]ÐUS h]]3Z XZh]3L ZYh]3> YXh]30 Z3,P $R0]ÐUWVSE ]uE}CVPh]Wu3軡 u]VCPh]Wu3蜡 u>VCPh]Wu3} uVC0Ph]Wu3B t1#vEE u}Ee[^_]ve[^_]UE@@@ @@ @8@<@@@D@(@,@@@$@\@T@X@H@L@P@t@xeA@|ǀǀE镪US u ]3H9| u ǂR]ÍvUWVSt @ $@$jPL h4 (4>/?ve[^]ÐUWVS E EE}EtQ (GyGEH9q~&x)P$X $RP EEEE Ee[^_]USR] ۋMu!x9uA]Ív] E]vUWVS|} WE݀O^GG }UE mU]mEP$]E^XÈ@s]؋U EPÓ ]uEEE@%M]uAEE EEċMȉẺU EPP EE@%]QUBuuRP /$E@u9/$/$?~^H/$ P PR|/$ڊ܊P4$X _W%vuuu 0e[^_]ÍvUVSu^uW VXtGXZCJPRQ  P jS0 F vvFP`e[^]ÍvUWVS uZl1;} B RP|9e[^_]ÐUVS] uuuh(h(^uuh(h(^u$uh^hh(v i($u$uh^hi(u i($u ujhi(i($u u ujhh(i($u e[^]UhjÐUhjÐUS]S({C @$ǃǃC@$ǃǃǃǃǃXZ@@ @@Hǃǃ $,ǃ4ǃ8ǃ<ǃ@ǃDPLP%(ǃl2C $C$jS G$ (_8vW9v]ÍvUS h@_]Sg ZYhL_SZ YXhU_SM XZhe_S@ ZYhj_S3 YXhs_S& XZh_S ZYh_S YXh_S XZh_S ZYh_S YXh_S؂ XZh_S˂ ZYh_S辂 YXh_S豂 $}C $P0]UWVSE ]uE}VPh@_WuS= V0PhL_WuS VPhU_WuS VPhe_WuS΄ VPhj_WuS bVPhs_WuS =VPh_WuSDž VPh_WuS袅 VPh_WuS} VPh_WuS< VPh_WuS˃ VPh_WuS ucVPh_WuS uBVPh_WuS̄ u!VPh_WuS諄 t1Eu}E ]e[^_]~e[^_]UVSu F V4$L$$F 4$džldžHdždž4Y[FXPPR XZtdSRP `dždžt,džxdž|džpdžt!1𿉆x|ptdže[^]U(ҋMy=E PR<1;| ;}ÉUSQ]t>t4݃ۃDEu $RP ؃ǃjRP ]ÐU|UVSuXS6h`5_(0`te[^]ÍvUWVS}u G @$G@$WUL$"XZLJX`$jSj ZYG $G$jWCAt}e[^_]8e[^_]USQE =]~0 v0]E ]UWVS ]8u ~&(R3pph@`5_(/u8 C SP0_XVRP ]e[^_]{vua9ǃ}RWP PWR C djjSe[^_]ÉUWVS uEE] t&`8u Eǀu$MǁE Me[^_]Sue[^_]ÐUE8B1ɃvBwtu]ÐUEE @]UVS]`1ҋM t-(P@QptQ Av1AQ Q[^]UWVSuV}7JE(y :vUZËE CMK@0jRP ݃\(YhǃTC $Se[^_]UWVS(ҋ]y0E H(4 y0EM8EFDEE苓4 E`tyu݃puEH19FNjx19Cl|1tE8u]1t#]ttUtt t t[^_]UVSUxZXsM ǂPB jQRXZCVSP e[^]ÍvUE4t "H0+l19]ÉUU݂ـEu1|(`@uM܂݂z]Eܲ}ME mM]mE݂P $X݂ 1ɀEÍvUVSuTtQR V苞X$SP e[^]ÐUWVS(,uyb.U JE(yF.(y3.vMEE8DMI@C)ȉE؋E@|9j t+jVvjV F 4$}u 4tF djj(v9} tF djjVu#8ux9u V(yz U JE x tbB(uWU Bt!@jrPM E AHR58"jQU (B$(B vHB(8W6h`h(l 4F djjV<tjjjjuE؋MAtHjjjPjVO (yrU JE x tZB(uOE PtBjRPU BJV58"jQM (A$ (A HB(e[^_]USR]9f\u |tRtG|t9u4jS蕃C $ǃTXZScvu\jS]C $ǃTZYSMDP$X $RP ]ÍvUSR]xujS܂vjSɂǃjSIƒҍKXyARQP YXǃjRP ]US]C SC $ǃT]ÉUS j]S C jS]US j]S C4]ÍvUS ]xJRPQ 8 ǃ$`cv C SYXjS} jSi 4C djjSjS5 4C djjSnjS 4C djjSB83(pphbvR3(pph c5_( ]ÍvUWVSE E}E]Eu^@Eƿc8u C SP`1u迏c8u SM1}E@EƸc8ujj jEpMZY0 u保c8u jj jEp^_S PSRx1Uu俧c8ujj jMqZYPSL1EMEM ]e[^_]Qse[^_]UVS ]u S0H C `$CCCse[^]ÍvUSS]St CRbCƒCCC]UWVSeUBu1:ACEu]u} ؋BR S҉Ct A 9BхUuN)1ɉt|9}xvQt A9B uыQtA9B AU F DIFVTGɉt';}vًQ҉t A9B хee[^_]ÉUVSuNɋ] t6At Q 9PutQ 9PQ C1 vF[^]ÉUVSu^u? hc-v;^uRs shc Ps shcEce[^]xUUBB]ÉU(VSyE (pۍ 2yAT3+Q@qDRPue[^]UWVS(@ ]EPuF jUBB@BM UHMHP EX_MAM 9H ~3֋U;V~6t M;Nt^tK 9M ~e j[NjUE MGW OE_uUBGBxzCtx;M_;Yu)y$E S9~ЉCE9}ȉC E CߋUrtG;F ~6t ;F 9tkF9G~GSҋ6tMAt CB jG E;Xu@ S+9UJEP9A~ 1˅E S~MQC CS E҉t UBt CB CMAE;Xu@t B9C  VoEe[^_]ÐUSP]8M w*RQ3(pphd5_(vu@ @PQR C $C djjSuC djjSvuK4t4C jjjSQ P/%Q3(pph,d5_( ]ÍvUS (Rɋ]yE P( y‹`txyurEu( 3(pph`d5_(4 ;vBDt2Rtp(P@4x|]ÍvUUE 8]ÍvUEP R jp R<USR]9v\u |tbtW|tIuDǃjSwC $ǃTZYCXPPR bu\xǃjS+wC $ǃTYXCXPPR C jjjS]ÍvUS]SC $ C $ǃPhdSO "jS h (v]ÍvUS ]SzXۃD$PR ydd]ÉUEҋM xdǀM EUS]SC $C$ǃZYPPc PhdS N PhdSM PhdSM Kvǃ`$jPi> $ (ejSZ h (MGv]ÍvUWVS}u G $G$SZYLJ`$jS= [XjWt}e[^_]. e[^_]US]Pǃǃǃǃǃ]]mUWVS E EEE(}yJUB8PD>GtUD2EGGEt C;] .E1ҋM;Q8Y vGEUMыCEUs y)Ѝ@W 9~}X9}vщۉy)Ѝ@D8D8D8DG@=G~ h@k$CG9|ȅy)эIG 9}Yvۉy)Ѝ@T8 ;U|,9}(W u GW t EC9|EME;H8Ee[^_]ÐUWVS EEE H89MEU:Uy)Ѝ@E 9}Yۉy)Ѝ@u0t#UH 9<}0EC9|E H8EE9MiE [^_]ÉUE@]ÐUWVSS}GEɉy)Ѝ@W ‰QSRP`t"~@PQR F djjV(ylU JE x tZB(uOE PtBjRPU BJP58"jQU (B$(B HB(e[^_]US]9\u||tnueǃQjjS:XZx)+lBƃRP S j@PSvhkS~Yhxɉǃt#݃}UE mU]mE++ljS@ jjS9ƃXZ@PP S j@PS]ÐUVSu ]uXjRP ;ƃƃ~x Pu ]e[^]ÐUhj&ÐUS u ]SiKC @$ C$ǃǃǃǃǃǃǃPh@nS4 3vC `$C$jSg$ (軺v賻v]ÍvU(yvE PEÐUWVS,EE(Džy.M Q(yv(y4(@(ݝy\p0pUrXC Sq}wXC݇@EuًUݒ9tA݂u;؋9~‹}݅ݟ[؋E݀U݂u9݂u*H}U݅ݚ؋UBXHQ9u<V+VF 9~Љ}9~ЋUMǁ};}EPH;u;tsv}w,w(w$w h`nSž1у,q QSEpH U@;xt&M JxWP'vEXx(yTSE(y){ tSA(uHCt@jsPCSV58"jR購(C$(C HA(M UJxFEx P(}_xyS{ tTA(uICt@jsPCSQ58"jR(C$(C HA(E@x(yU B@RufC(Mǁyܿ} O tUB(uJWtBjRPGOP58"jQcU (B$(B HB(e[^_]UVS]sxǃVSB(Cxy9V~ tTA(uIFt@jvPFVQ58"jR(F$5(F HA(e[^]ÐUVS] uuuj(j(nuuj(j(nu$uhnhj(Lj($u ujhj(j($^e[^]UhjFÐUhj.ÐUEP R jp R<UWVS(,]} y追vGEC(h]؋݂P $]Xx9d}tQVP EEE9x݂EۂDـEu8 o}uE mu]mEP$X $QP ݂ ዒ$PR  CB RP|@C C$ء(ygvG@EP;S|-;S }(C$t!;x~(y.G@e[^_]ÐU塠(MP@AQ]ÍvUVSu XlP PR|999Bl}. B RP| FM P4$X$PXe[^]ÉU]ÍvUWVS(uM ysvQ‹~4(B@tZ+Q6}y&x9ʍdm}ʃtRW}P FE@mtGEuۀE@t-(o^F V 0o^ ~ 6Ku^$tF H9| F$H9| u ǂR0e[^_]ÍvUVS]u s`Sx9ʍd}ʃtRVP K$tS,t@ j3PtPP j@P3e[^]UVSuTPu R^8{u SyF$t#V,tN0tF 8o F$S?t V,t P PXF8$ P P[$PPe[^]ÉUVSuTPu (H RPQ$ǃT^8{u(V@H RPQ$Ce[^]ÉUVSuTPu (H RPQ$ǃT^8{u(V@H RPQ$Cu"(H RPQ$ǃxtu (H RPQ$ǃxe[^]UE VS]C$jRP ;xduSJ9}+tRVP Y^x@ j3P)(y1FxC VSXZ@PQR ZYPQR C@ jVsP E ;ux9E ~ C SPpx9E d~tu 0$@ PQR ^X<8(WRP u xe[^_]ÍvUWVS]ɋu }u S{u xts݃ـE@t8u4" P}wm؍t] Ee[^_]g؋}u] Ee[^_]#ve[^_]UWVS }G(EG,EG$E苗u W_XsFSPSR G jVW^XS@dWuuuu JRw0P 0e[^_]U EPp0ÍvU EPu ÍvUWVS]}u jj C VWSYC(^C,C$@dSuWs0P e[^_]ÍvUWVS(@( 1$]} 1$ywƅt?݃È@s'qɐtÈ@rك ݓt F;x~(y\G@e[^_]ÐUUJl19]ÉUVS] uuuk( k(quu$k((k(qu-u(,k(0k(4k(8k(u$uhqh>EC4uK(C<C0tC0C<VC ;t džC ;1t(tC<9Ct]C<uQ su E>E9Udže[^1_]UWVS4uEE䍆Pu(1EEEEy裝vE PUB݆EݞEK<9Mt5UBC Eu! uC,S E9}ЉE&9M'UЋJS9sV6 WSPECE܋U9U|E19H!;u dž S Ett }vUBEE~EB9u>E;3u*C4ES E9}ЋU9U܉E|3*vEu1f{8u*B9u#C(S E9}ЉEEdžC,C(U;l|C0uC0C<MuCHU9BuEU̅uIC<@9Cu:C,C(U;l}C4t"BM̅u؃ u&Ãt#UE@C EE؅t,~0t%^,tF@ jvP<džEԍe[^_]UWVS E EE]EC|=u}vE Ere[^_]F@҉C|uwS݂E@u,S݂ s$PR ǃǃ?E쉃UKh]°1H!RQLe[^_]ÐUSQ]݃XsـÈ@s$ $h sO ؋C݃݀`s1ɀȋ]ÉUE =UuuLk(Pk(hs=uJuTk(Xk(js]ÍvUhjÐUVu S]t Ct PjSCCd$@ @$@ $t @@ @@ @@ @@ ǃp ǃl `$ ǃ ǃ 0$ ǃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ Phss Phss Phss Phss Phss PhssXZSh,k(wvCCd$ @ $@$Cd$@ $@$h(2tC@ $@$jP貛 h(ve[^]ÐUWVS } ]urss8uXEhPuVe ǀ Va1҅PJ!u֋F@U 1vQSu Ep4e[^_]UUB @H jB pQ<ÉUUB @H jB pQ<ÉUUB @H jB pQ<ÉUSRE]t CP PC P PCǀT]ÐUVS]p l u P舰s@~u VsS0t!C,tC@ s @$VC P PYl $PȰe[^]ÉUVS]p l u (H RPQ$ǃp s@~u(SHH RPQ$Fe[^]UVS]p l u (H RPQ$ǃp s@~u(SHH RPQ$F  u (H RPQ$ǃ [xtu (H RPQ$ǃxe[^]ÍvUMQ01tQ,t J;Q$| ;Q(}]ÉUUB E@E t:EuE@tZ B R sZ]ÉUWVS($Xp}EE䍇Pu(yE H( Uy|O`t@]؉uE؋E` A $w]؉uE؋EY`$WOTtlub0@jRP W`ǂTu1PB ]؉uEܢ\]؋uV]SwOыUBX~ A Q A Qe[^_]UWVS,E uujjjV@vsEE̍Pu[ZYFhP}WLF,E@uVV HǂQPjjPR PjjPR IvtdRP XZKX@QPQR xǃ W1҅PJ!u@ uvu狞P t!FdžP @ jvP<jvK jjVzjjjV hE؃EȍPuZYFhP}WM܋AuV4V HǂIutjv jjv jjVF @PQR PjjPR PjjPR .KX@QPQR xǃ W 1҅PJ!u@ u ujjjVOPhs^e[^_]ÍvUWVS }p ]$u(u u GP Pu,VSu uuuuu W e[^_]ÉUVS]u Ru uuuuVSB ]e[^]UEPhu ݂$݂Q$ـEYtQ$Y}UE mU]mEÍvUUS M ]+  $UVSuFhP]S$ v S 1҅PJ!u֋ e[^]ÍvUWVS E }EHt`R u WQWx+ SotWxBM;H Re 11҃PJ!uF_xC1HP!1H!‰ S 1҅PJ!Et~H C S1҅J!Ӊ\ t* GP PR|‹ Й Ãt0 B9ډ } QHt LJ jWO t ɉ" P1ҋG|RP,$t}ME mM]m_xXCZ1HP!1uH!…~ wxN  wx 1҅PJ! SVC1e[^_]ÉUWVS$}PU]RE Kt E@2݇  tـE@(Wh݂ ttjtjww0݁ہDـEu7 (t}]E m]]mEP$X $RP %݁ %0t$PR  @G$ GP PR| G(G,؋Wv Wƃ_0tO,tG$9 uP Fl;x}&RPVWYXSWZXZSVW< VWTu ǂTE܋dtP9EuKr0WCtO GP PR| WG ڊdP4$X $P赣r0W]܅~(P@ e[^_]ÍvUWVS EEEE(u} y蓇vMQ(yy<tF|tsWjVFu Wup0VbE ~L9C} t8u.N<ɋ]uvRWFp0V؃KdžE~/^0tN,t9P u džP uVc(y薆UJEx tZB(uOEPtBjRPUBJR58"jQM(A$ (A HB(EEE ue[^_]U(yvE PE@|tBUWVSEPuV} rE ;xR0hvh(~1"}EUEU }e[^_]Je[^_]UVS] uuuk(k(xuuk(k(xu$uhxhk(k($u$uhxhk(Сk($u$uhxhk(褡k($u$uhxhk(xk(`$u$uhxhk(Lk(@$u$uhxhk( l( $u$uhxh l(l($u$uhxhl(Ƞ(l($u ujhl((l($ڠu ujh l(l($負u ujhk(l( $芠u ujhk(k(@$bu ujhk(k(`$:u ujhk(k($u ujhk(k($u ujhk(k($Ÿe[^]UhjÐUhjÐUVS(PH( ]u y5m݃݃F@UMEܣ݃È@ݛܫܳzـEuptAR$EZuEzEu%R $EZu" P}lmEu ؉1u2(ylF@݃zݛv݃zݛǃe[^]ÐUWVS} ]WSf^X@ WP4Ãtc (yvk (wɍ0y_kvBB1C WSP0ZYC WSP e[^_]ÐUWVS ux 19= vx;X} @v1tRPVXC9~ȍe[^_]UWVS }@ E1Ƈ;utx;p} @1tBAt9r A9r2hz5_(^Y[h{5_(]$eF;u~9tAe[^_]US E pHpDUrHrDr0r,r(r$p0p,(p(p$QjQssh@{˜RVfp]ÉUWVSu]S_E t;1э Ƅ WQRu e[^_]ÉUWVS } EX ޿|{8u,Ut S0h{ h{h(~`޿{8u un1v޿{8 u(v} EX޿|{ 8u+Urh(`ƒ1M҉p޿{8uGEXQEPS5(4z U&S2h{h(jvRuu uAe[^_]ÐUS]SH C $C\?CCCCCC C$C(C,C0C4C8C<C@CDCHCLCPCTCXS`CdChC|Ph{S C Ph{S C$Ph{S1 C,Ph{S C4Ph{S  Ctv@ WP4ƒtW (yb(wۍ 0ywbvAA3B WRP(e[^_]ÍvUWVS( ]} ybvG@WSttx@ WP4ƒtY (ya(wۍ 0yavAA3B WRP,e[^_]ÍvU(VSu ]ySavF@VS@ VP4td (y`V(y`‹CCBVQe[^]ÐUWVS ux 19= vx;X} @v1tRPVXC9~ȍe[^_]UWVS }@ E1Ƈ;utx;p} @1tBAt9r A9r2h|5_(SY[h}5_(qS$ZF;u~9tAe[^_]US E pHpDUrHrDr0r,r(r$p0p,(p(p$QjQssh@}¬R[p]ÉUWVSu]S_E t;1э  Ƅ WQRu e e[^_]ÉUWVS } EX ޿|{8u,Ut S0h{ h{h(`޿{8u un1v޿{8 u(v} EX޿|{ 8u+Urh(ƒ1M҉p޿{8uGEXQEPS5(o U&S2h}h(vRuu ue[^_]ÐUVS] uuu,l(0l(}uu4l(8l(}u$uh}h@$uۃh5_(DKE]% B RP(]ÉUU SM]t89Qu"t/B$;QAu!AAvB$C$9QuYI$ÉUE@EvUS]S舸C % C C%C$C(C,%[0C4PhS C$PhSϔ C(PhS轔0C $C`$jS$,(WLvOMv]ÍvUS ]C u SPC(ǃtP@ǃǃȋ]ÐUEE EE E(E0E8E@tu ʍvEuÍvUS ]E EM Et ؙP$XU$t=Eu EvEt$Eu tEuQM(4$YEuً]ÉUWVS( }yJU rHD@<840,WL4$SP [vPLWr"$ݟ$PI݇$Ẽ@sRLJLLJPG u WPD¡(yHBt@ 1e[^_]ÉUE ]UVSut" F@P PR P~QJvt* F@P PR á"$H1҃ F@P PR PF@@t vJx @$u1e[^]ÐUWVS,]1ɋu t7(@ܣ܋ǃ}UE mU]mERw@wPCHtCDvQC@P PR YZPSG$WP (y~GFELUB݃P]ESHt{D C@P PR NjSHC ҉Et EЃClPWPR ݃Eكu݃t؅tR݃Eu>C VSPD¡(yFBt@sEivTu"ǃLUBPǃT:VSt)E ǃ$ǃ(ǃT;}|E}C VSPDǃ9tJC@@ Vs@P$UBY^CDC@@ Ws@P,(yECDW+BCDSLt?CPt@ VsPP(C VSPL CL@ jVsLP vC VSPL_XC VSP4vC@@ Vs@P$UBCD}up C SPHZYƋC@@ Vs@P,(yDVCD+BCDC VSPL_XC VSP4uǃLǃPe[^_]ÉUWVS } 9EX޿8uU B RP01A޿8u#UBLtV0h(h(뽉޿+ 8usUBPt5S0h(h(賐EHu h@a=/vURt hE=hh(d/޿ 8KPETPh(h((v} "EX޿8u7UZEWPS5(U UBhVSh$v޿8uKEph(nuSUrhU`ڊx B8ݚ/޿8u+Eph(muQ|UBL޿+ 8EPt h;Urh(VmËE@t h ~;u#WUrh h(蕎vEpXPJs4h.3;2v޿G8uOUB@t@ jr@PEph(lUB@uUB4Suu ue[^_]ÐUWVS] ;hhW8ƒҋuuHhlW8ƒu1hqW8ƒuSWhv5_(p4vNhty(:c@u s$hvPss$PhP&= 1D WQRvh` e[^_]US ]h9hz9hU9h$9 s h 9E8]8UE840,hC8 UWVS EH]݃ ~݃H v݃M P$PR  e[^_]ÐUVS] uuul(m(Uuum(m(Wu$uhYh m($pm( %u ujh m(m( %6pe[^]UhjFÐUhj.ÐUWVS } EX޿8uNUB8t@ jr8PEph(hUB8usUB41i޿8u?EXQEPS5(O UBHuRShh(҉vPuu u͞e[^_]ÐUVS]C8u @ Vs8P$(y<FK@H;KD~nC(y2F8uK vK$VStK,vK0e[^]UVSu V]St?(yv2F8uK vK$VSwtK,vK0e[^]ÉUVS] uuuWjjuvـEt $S1uЎ8uNVjjuv>ـEt [@1>Suvhh(АO" s8P}mRɍCX$Pu5( t> w C$t(yU B@CtW@ ju sP CtV@ uu sP e[^_]ÉUSPMY ۋU u 1vA,t t ]t'URQ RQ2ƒ1F(yFZRQƒ1҉SRQƒ1]ÐUSR]K,uJ(yE PBu P$X%vuPؐ $XPؐ $s8X]ÐUWVS$jUBDPEEPD1ۍB9U UvS$[$Ep4p0[]؋E؉ƋE )P$XU\$Ub0$-1҃ 9}E)ЍJP9 $X|u؉}EɋE؋EPDCB9q19}vED\C9|EPDEDD ?Ee[^_]ÐUWVS ]S@t B RP " P ]u}C0UME€E1ۀÍe[^_]UWVS$u }1۾?W ]uE\$g0$]um]W@t B RP " PkE€E1ɀe[^_]UVS]S(t.CDt'sLSCPY^sHSCTC(S@t B RP " P(y /vE PCH9B|STSPKD19} F9} Eu؍e[^]Uh5_(1ÉUS]SC %C%CtCxǃC|]ÍvUWVS E EEEpǹ8‹]u|jj jEpvP3hh(?f}uD|Q0hŐh(?1D}w h(4p 71}EE} ]e[^_]e[^_]UVS]S(t! C|C(CpP PR [tCp1tCtEuu SNktـẼ@[tsASpЃ CpD|P PR CtCpɉـE փ@[trče[^]ÍvUS]SC % CpC`%ǃPh/S / CtPh7S. CxPhAS~-1C $C`$jS($(ovgv]ÍvUWVS EEE E}EEX޿L 8u'Urh(TU1޿X8Ep`18UBp1v}ujEX޿X8uSUBp42$(v޿L 8uUQ0hŐh(=1 EEUEU Ee[^_]e[^_]UVS]Kp5(Fu%2$Cxu CtR3h_h(_<t@ u P< 5(辂 jj jPC(tFVC(2$2$Cte[^]ÍvUS]S@C % CxC %CpCtCxTC|4oAPhjS* CpPhpS*1C $C`$jSg%$((vv]ÍvUS ]C u SP@CxـÈ@sTCpÈ@s?P3hvh(:CxـEuCxTC|4oACx%[xEu1$Cp%[p1ɀEȋ]ÐU]ÉUS]SC % CtC` %CpǃǃǃǃPhS]) C|PhSK) PhS6)1C $C`$jS#$H('vv]ÍvU(SҋMyvE X(@A,Ӆ݁Eu+A|&ݑݙ݁AtEu ݙӉ݁E؃Qpt CvB݁Ap}UE mU]mEyCA|}UE mU]mE9Ap|s1?$At}UE mU]mEQp9| ApR$݁EZ1]UWVS uEF,u h~tt^xuh5_(1u'F|9}Vp9u@EF|vVpBMHuM(yE PBEN|9}Vp;|AEF|vVpMFpEe[^_]ÐUWVS EEEEp )8‹] uu ujhn(n(%u ujhn(n(%u ujhn(n(%u ujhn(n( %u ujhn(n(@%vu ujhn(n(`%Nu ujhn(n(%&u ujh|n(n(%e[^]UhjRÐUhj:ÐUS]SWC %C %C$C(]UWVS EEE E]u7Njs 8uWjj jsiUB(1X}u6Njs 8uPEp(hh(*1}U]U }e[^_]Ve[^_]UWVS( }u yv^z$u$VW G@ uVwP BO(9~b~ B(uIFt@jvPF^R58"jS(F$5(F [HB(Tt.9*BB 52$h2$aVW G@ uVwP e[^_]ÉUVS(]u y|F@P$X$YXh@]j{}}UE mU]mEC(ƒC,yPѡ(K,y VL (yC,De[^]ÉU(yvE @ЋHUJ,)HÉUVS] uuuo( o(uu$o((o(u$uhh,o(, 8o(@%u ujh,o(8o(@%> e[^]UhjFÐUhj.ÐUS]SxhF0Pu5( e[^_]ÉUWVS( u} yv_Ã{$uVFWPRAuWVTu WVI FC$@ WvP@e[^_]UWVS( u] yCvK(EA tF@ SvP4uSVu SVvOu, Fp,p(SN1QH!Ru q(yK{ tTB(uIStBjRPCKV58"jQ6(C$(C vHB(e[^_]UWVS(]=(y$U BpEfC0 tu C SP0fC0 fC0tHu;s4s4C@l @4P PR SRlR J9}u SESdt}uG RWP$Cd1҅fCh1f9C`u C0uupChDlCdCuCL xCD݃4v݀ x܀݀Euك$sds$W e[^_]ÍvUWVS(,}yU B@EE;G81G0 h(Wh\lyhK{ 4tXF(uMCt@jsPCKV58"jQ(C$(C WhHF(BDl0fWhfO0M;O4Wh_ U]\`u _`,v (yC];} u 0HvBfGhw`9uEEMԉUD`UԅyUMH;E;Euu 0vEHMUD`9ډEt,w u 0IvJD`D`B09uׅu 0JSӋEU܉T`Ghu0HfGhw`C0;]39uC0fW`Suu WfGhf9G`ufO0M;O4}bWh9u# (LlyHA@@WQ҉yA)‰v H9u 8@e[^_]UWVS( y%U BUx9u?WRt%(v)D0BG|U9E Ev9|čS҉yC);]t8ErL9BEE붉9}U; u E‹ 9t*WR*t(y U B@e[^_]ÉUU 9tE @9~ 1]UWVS(,uE]Vdt@ RuP$FdfFh1f9F`u F0u~h (\lyRKEԡ(y9U 9TE@ (]y{ tSB(uHCt@jsPCKP58"jQ蟾(C$(C HB(G0DlF`ff09/Fh9u fV`fFhf9tff0f~hfV`1f9u F0uFhDlFdFuFL FD݆4݀ ܀݀Eu]؋M؋]܉ȉڃ RPvdv$uFhTl ( yvBP@ FTVXEe[^_]ÉU(U@BE t ؉EvEu^݂<-JDRDـEuBLـE@t݂<-ZLÍvU(@e EUuj݂-܊ݒـEu݂ـE@t݂-ݚ]ÉU]ÉUWVS] (ۉE (y:U ZÃ{  u(yM AM@$QA=(CC Su t,G$(GGGG v jT*YX(1ҹ@@ @@@@@$CCSKS K$58"ǸGtu(R58"jw(yW@$@4@o(%u ujho(o(%Pu ujho(o(%(u ujhlo(xo($e[^]ÉUhjÐUhjzÐUWVS4j0]u SC %ClSdCXC\?C`@@ B@@Z @@ B@@Z @@ BC@%Cd%ǃh%@@ǃP%Z ǃǃǃǃEEEEEǃE4$?lj<$1OGXUG`UUGhWl \$$E؉U5(q y4 h苳"jS艾 h(ܯװve[^_]USP(RU] y觹vKDuet SR(yuK{ B(Ct@jsPCKRA(y&{ tSB(uHStBjRPCKP58"jQ豴(C$(C HB(]ÍvUWVSLE @1ɅtHEEEEEEQ Q Q ЉEAQ Q Q ЉEAQ  Q Q ЉEA Q  Q Q ЉEAQ Q Q ЉE؋E VLFXUN`^d]MVlFh$Q$U5(E4, Sw}EE mE]mU<~ R$(@Z}UE mU]mE $PXZjS$o"$]讴YECd$]Pv S7"$]vZECd$]Ps>Hu7 S6ǃv S h̘]ÍvUWVS8}VEEEEEE*HFXUN`^d]MVlFh$QU$E5(jW<$4"$]sYMЃd$]Wpe[^_]ÐUWVS EEE E]uCs 8u)" P [$EdP 1}urCEƿ8ujj jsiU3u8ujj js4U1EU]E Ue[^_]e[^_]UWVS8}WEԡP(EEEEEEydMԋQ‹@ BV/FFXUN`^d]MVlFh$Q$U܉E5(huW" G@ juwP e[^_]ÍvUWVS (uy趰M Q(y蝰<G4G8(P$@ CC jC0$C $̩CU Zu+vG(CCCCCCCCCCCCu+(@ڮ}ME mM}mE. V?}ME mM}mEƒuuo(o(@u.u)PjhBho(o(%o(P(u$uhSho(^o(%u$uh]ho(2o(%u ujho(o(%Du ujho(o(%u ujho(o($e[^]ÉUhjÐUhjzÐUWVS EEE E]u?s8u%E@$u ( [^1_]ËEE E]E [^_] UUB$M tPB@ uQrP B QRP4UVS] uu$uhho(o(%u ujho(o(%e[^]ÉUhjÐUhjnÐUWVS EpE 8unjj jEpYjj EjEp Bjj jEEp+jj jËEp$Suuu1vPuu uɭe[^_]ÐUS]UME C(S,K0S莸(҉ybQERC@ jQsP ]US(R] y*S  (y 14E0hQh(( yvK{ tTB(uIStBjRPCKP58"jQn(C$(C vHB(]ÍvUVS] uuuo(p(fuup(p(hu.u)Qjhjh p(4p(`% p((u$uhh$p(0p(@%u ujh$p(0p(@%u ujh p(p($e[^]ÉUhjÐUhjÐUWVS EEE EH]~as8uE}uPEp hƚh(1A}ujj js$UB 1vME]M Ee[^_]e[^_]US(QM] y若vS‹A B B$RA@ uSqP ]ÐUVS] uuu4p(8p(ɚuutue[^]؛e[^]ÐUWVS EX޿ 84UZ޿%8uM A Q1v޿-8uOjj jEp 2jj Ujrjj jMqY_MQ jPSVjg޿58u[jj jEp ʖjj Ujr贖jj jMq螖_ZMQ q`PSVjQSE0h<h(} ޿X 8ua(UcBdXÅv 5(0 ZYsssPhdh(o uw޿m8uM A QPtK}  ޿s 8jj jEpx MÍEQhPSqhER0}E @ljH{?1҉HMPQdQdX@@ @@,@4@8@<@@@D@@ @$F F pph}h((9vQuu uie[^_]ÐUWVS ( u} yvWE(yEEUzuOF CFX@FXCF WVP|F(UBF,U BF@ uWvP 1F WV Htvt+tFG1҅tPF RssVd F sss U2V FG1҅tP F Rsss V G1҅tPF RsWV(y̚O tTB(uIWtBjRPGOP58"jQV(G$=(G vHB(e[^_]UWVS U ]uEe[^_]ٓC4t CxC4 S0S6ǡ (y vW4(y (yvE(y̙‹CxC0BCtFCp@CpUBC ACX@CXAC WSP|C(FC,F CP jWPR e[^_]UVS uVká(y@S‹E EBEBEB F SVP|(yvESBRF@ jSvP e[^]ÉUWVS ]EShPu shER0} CljH(U P1҉PSd?Sd@@ @H@,@4@8@<@@@D@@ @$F ~ M;O<VHS PWSEE_D9O@u- hb G@GDhjP舓_D;]V];u~ V( SEw@Ph SEEjPFG@t PsUW@wDE_@yE)EMEG< v uu 3h̝h( e[^_]ÍvUWVSuEVhPuvhE}R0Mɉ FljHEUP1҉PVd?Vd@@ @H@,@4@8@<@@@D@@ @$C [ ;{<~RF WSV{< PWuuu 6hߝh( e[^_]ÐUWVS ]EShPushER0U҉ CljH@UP1҉PSd?Sd@@ @H@,@4@8@<@@@D@@ @$F ~ M;O<PHS PWSEE_D9w@u- hz G@GDhjP蠐_D;]V];u~ V@ SEw@P耎 SEEjP^G@t P苏UW@wDE_@yE)EMEG<#vuuu 3hh( e[^_]UWVS]ClxWS$ơ(yVC BC\@C\BC VSP|F1҅tPClKd vAA<AA  uڋF1҅tP(@ }ME mM]mEB(y9VGBQC@ jVsP e[^_]UWVS}}_׉8Eph(_ZUr h(Y^Su_ƃu> jƃ F FFVhh(v( j賀XZWuFC^^Ÿ׉8Eph(,^_Vujj jUr {ۉu< j*à 3C CCShh(B (CG {vӟlj޹ 8jj jEpl{Y[Phޟ|b}Urǹ8 j,a jjËEp]u jjUr Iu[CCjj jMqzCjj j}wz^ZC wh(跭C$UB$C(Z$B,}MEM} Ee[^_] e[^_]UVS] uuu4q(8q(uuEE@EW5q(Etf j$JPUCC CCBM܉KCEC q(P WMqPR, $Suuj vbMtjuEEe[^_]IUWVS E EX uxt tty;~t WV~(RpphpFY[vhFZ5 _(?A jWV+E@ PPjWVA(WpphpnF Svh]F _(Ee[^_]@EE ue[^_]vUWVS5(} j$IZY{CC CCCC Su-_XMq(P qPR(Q$SuVh e[^_]UVS u] jH@V PF e[^]ÍvUWVS }G tM1U 9Pu7u CG CFދEu SxjSN[ue[^_]UM UABA B ABBB BB]ÍvUE t GvÉUEt(P QPR$UVS u] joG@Pe[^]ÐUWVS u} tv XPG؃utue[^_]Fve[^_]UWVS] }uj$F_@@ @@p@@ E ]e[^_]SvUWVS}] uj$FX_@@ @@p@ E ]e[^_]vUWVSj}1F1ۡq(;X}#;] t9tSVq(C;X|ߍe[^_]ÐUWVS@q(P ju P}R,"$]Iq(@LẼ@s."oP P]IM3$Cv_Xw\uĉ]E" P}WImȉ]uEG ƍEPh]Ep> ƍEPh]Ep> ƍEPhaEpi>ƃtSE0hh(ޏ~vuuuuuuR1]uؿ8u2 uGHu )EPZ1Quu uGe[^_]ÐU (VSu] yfB(K yPBRx,~'u"C1҅tPHPRA(PV(yBvK{ tTB(uIStBjRPCKP58"jQ=(C$(C vHB(e[^]ÐUWVSu]uQǡ(ynAOE BEBEB(Z r$y:AD4QUB@ jWrP e[^_]ÉUWVS} ww7E0hh(茍MQxG@‹ 9vЉ)pʋ]E9s4ˋE19s?vEt! GBCE9rv19s]tABE9rEe[^_]ÍvUWVSUE Ӊǂür|S^_ESP0EMU쉁 t P:Ut P:M P59NjEރ VhWP;؃t)>U P8Mރ VjW:كt >Eǀǀǀǀe[^_]UWVSXMUE苁ˉìSl"Ƌ}wt1}+9s; S6"Ë_t1vE P "MUM}M} u!RPj]SEYXSuVE؃EȍEP}UWU}EEE$UEUPE# U9ÉMكuY}E؋wtƋWl9sr9t Gh)9v 9MC>9zjuXZEPuEe[^_]ÐUWVSHuL(y<B MQuE9ӉމsiMك8tHVu;s(у8uҋEӋ MӋ9PuMAp19Ӎ}sA@R)PjpSOYXSxVdxhh|$WlqEUEuXUƬZVEP&`UE$\SXY_SXP&oU9r R;UAARMQPVP]PTQA U$RHVPYHL@@DPj^_SM1hХh(( yY:MAtV4BSA@ jVqP uѻ 2U㋒M@Ëu9tPE8PRG8<00P4X-( EP-M(,΋Ap11 9sA@)QPjS0XZS>^HZYEWP $ UǂǂǂPVjW3كt >MA|H9s9QVhWr3؃t)>uVxH1҃ P6hh(( (1e[^_]ÍvUVS] uuuq(q(uuq(r( u$uh hr(hr(!%u.u)Qj4hhr(o r(`!%(r((u ujhr( r($hu ujhr(r(!%\he[^]ÉUhjÐUhjÐUS]SC !%C@"%ǃǃXZjP" ǃǃǃPhSr PhSr1C %C %jS9$(K+vC,v]ÍvUWVS EX޿8udEp8VEPhEp 0 EPhEp/ uuu1^v޿8u3E@`tS0hh(< u1Quu um9e[^_]ÐUVS (ҋu] y"4(K y 4Rҍu"EE _(Ee[^]'vt$u PVPVs(y3K{ tTB(uIStBjRPCKP58"jQ*/(C$(C vHB(e[^]ÐUVS]u C !%C@"%t P.C %C %jS7t]e[^]6/e[^]ÐUWVSEEPCEXp$4,ǃKt#v VF$KuEEe[^_]t W]- h(M(UE pp pp0U2h@h(~ UWVSEEE EEEMQx@ЉU䋁9vEE)XESuBE܋@1҅tPPSj։Vd-ك;]s4SuuEu FC;]r̋u (y71vU܋J4(y1(ۍy 1}FF D 4EB(MJ,}z0SUBP juPR {v(y0M܋}܋Q tVA(uKGt@jwPGWQ58"jR*,Uܡ(B$(B HA(MME E(e[^_]|UWVSEP] uX E؉$ E$ UBp19Uds@d1;d]؉uEȉPUMET`\UERjUPE ZYEPTP  T Pj]S ^XS\YE[EEPuVU`U] UE$USE< XZSX tTVXG;d j]S ZYS]SV / S Pj]S _XSuVK1EU ;dEЉUpxLhjS} ZxYSUEPXLy ptVhl t(EPMEP8G;d`UEEMU؋M܉L1e[^_]ÉUWVS ]Cl9E} uu>;tE1stE1ыE);Es;Cpr>E P u;Cpr>;Eu1e[^_]ÐUEWHp1<$UWVS}Gp19U Es@E1ۍuC;]s0jVXZVE Pu1;]e[^_]ÉUVSPU uBBR PV{@1҃ PV^ ]Q ASPYXS6hch(wFp^tH˃ 9t9t Fh؉@;FpXSP XZS6h}h(AwlvSP^ ZYS6hÉSP. YXS6hh(v 1e[^]ÉUVS] uuu,r(0r(ҧuu4r(8r(ԧu$uh֧h1uكڸM CN9r[^_]ÐUEU @]UEU @]UEU @]UVSu] 11Ґ9t1 Av[^]ÐUu u1҄ˆÐUS] UC9Bu1ɋ1;$ÍvUS] UC9Bu1ɋ1;$ÍvUu u1҄ˆÐUu uw1҄ˆÐUWVS$j]S1E1E M489؉%щ؉1‰1ىL=E}vEUMQEe[^_]vUWVSDj]E}uSE0 SEVPCYE^EȍEP]u USU!E؃EEPUuUEUWe[^_]vUWVS]Su}@11Ґ] #ADvEUVe[^_]vUWVS]Su}11Ґ] ADvEUVe[^_]vUWVS]Su}11Ґ] 3ADvEUVe[^_]vUWVS]Su} P11ҐAvEUVe[^_]UU1 t1 @v]ÉUWVS$j]EPEZߍ4w}u)U܍<2u aEmEM #ZM܃w:E )U )}4U#FM ‰TCvEUMQEe[^_]UWVS4]jEPE؉u)ыE 4}g )E1)m9s5U M܉EUԉMԋEM#AM ‰TCE;]rًU U؉EUMQEe[^_]vUSE0Uu R]AEUS؋]USE0Uu R]EUS؋]USu ]ESPEUS؋]ÍvUSu ]ESPEUS؋]ÍvUSu ]ESP5EUS؋]ÍvUSu ]ESPYEUS؋]ÍvUSu ]ESP}EUS؋]ÍvUWVSu^ۺ?xvJуtׅx'] vу1(ȈCJyߋE D[^_]ÉUWVS 1}1ۃ 4ECƃve[^_]USPM11ۋt PvB v1]UUUVS] uuu `r(KNDhhr(XZhhr([^hhr(ZYh"hr(^Xh'hr(Y[h-hr(XZh4hr([^h<hr(ZYhEhr(}^XhOhr(lY[hZhr([XZhfhr(J[^hshr(9ZYhhr((^Xhhr(Y[hhr(XZhhs([^héhs(ZYh֩hs(^Xhhs(Y[hh s(XZhh(s([^h,h0s(ZYhDh8s(~^Xh]h@s(mY[hwhHs(\XZhhPs(K[^hhXs(:ZYh˪h`s()^Xhhhs(Y[h hps(XZh@hxs([^hahs(ZYhahs(^Xhahs(Y[hahs(XZhahs([^hahs(ZYhahs(^Xhahs(nY[hahs(]XZhahs(L[^hahs(;ZYhahs(*^Xhahs(Y[hahs(XZhahs([^hahs(ZYhaht(^Xhaht(Y[haht(XZhaht([^hah t(ZYhah(t(^Xhah0t(oY[hah8t(^XZhah@t(M[^hahHt(e[^_]ÍvUWVSE] 03P}ECƒ9sv9r]C9s9r7EGe[^_]UWVS EEu9E~E] S'ENjF]ËU;]rs63U ;]rUEUPEe[^_]UWVS E@49} Ms3Q׃9re[^_]ÉUWVSU P}vU Ƌt#L9Ήs9rU we[^_]UUStJ\9s9r$ÐUMS19Ћ] }Iv;t @9|$UWVSUPEMƋA<Ã9s 3U 9rEMEAEe[^_]UVSEU ; t1*v@49Zs9u9r[^]ÐUWVS Eu}\0yK9v WG9wM 9ve[^_]UWVS u}yU )Xv\>9v u ) PEU B9w9vE0UPEe[^_]UWVS(] EЉEP3EƋCUMNjAUÃ;}r;]sb;]rOv;]r;}sB;}r/v37U룍v딋EUMHEe[^_]U u E0pÐUWVS,} }E D9Љ~)73Uy30Uy'73Uywv16Ux30Ux9s9t<9v)4)LB:Vs)~69~:Z 1A;MU θT9ӉvӍ~9wv67Uy9v;ut M}U67Ux9t5vS9rvэQ9s9sЃ;ve[^_]ÉUWVS }7E u9}ÃSWpG9s 9re[^_]ÍvUS]S. CC $%CC PhS!>$4ICXZjs> )C S%jS.$8(v]ÍvUVS]Cu C $%t P YsC S%jS<.t]e[^]~e[^]ÐUSMEQ] PsqER0ƒҸt]tEB 1]ÉUS EU HrpQ,t" X P tC jSP]ÐUEU HrpQ,u1@ ÍvUWVSL} EX޿8uWUrhh(K? ޿ 8+ MA t% P Phh(K(} "EX ޿8u9VPEpUrTS@ h ޿$8u%EpUrM 1҅Rt ޿/8u1SPEpUr`S@Q)޿88u9RPEpUr@S@@h޿@8u9PPEpUrR@h ޿N8u1WSEpUrM@VSh:޿W8uQEph('Y[Pu u(R0hh(:I ޿_8u-Eph('ƒ1M҉Qv ޿l8uEEph(B'^_PuWu(y({ ޿}8uAEpUrUKuMqEph`@(SPv޿ 8u9QPEp5( UB uLMqrh ޿8u%Eph(2&_ZPu1L ޿˯8EpUraJÃuMqEphدj CSPt+Ht8 CSP Ph5_((Y(I޿ 87UrMqIÃuEpUrh CSPHtMqEph@V(hh(ZF} UZ޿a8uiEph($Y[Ur h($ VSu t MqE0hih(EUV" ޿8u)RjjEp a_X$UrMq_M:޿8(ppEpUrMƒ1BvMY޿8Eph(#ÃuUrM1hh(Djj jEp ;Y^SuV Ur$=ÃMA CC`%%t>u C1щKC~ P_ZC VP C SQA SRQP@4$Tv ޿8u)RUB@ uu rP ƒ1b޿ư8MA (@ٽf% ff٭٭ݝ q݅$hΰS1у ;u \ }2U4SM<1э\  FC;u | CW)SPUr  Vuu u$7vCH$ hX(t S hh(e[^_]UWVS(uF (@ٽf% ff٭٭ݝ v݅$hΰS1EPэL u Q|1у IQSv n e[^_]ÍvUUt< ur h(  RPh5_(*$&ÐUS]S< C @$%CHC$C(C,Ph$S/ CEp(S^uVUrhSjMA$1vNju8lSjjEp HZY$Urum1^E躢Ɖ׹8u^EpUr*BƒuMquvhv3$}O4_@B,9؉B,~{Z,vޱNju 8EpUrAƒuMquvh93$}_0ODuB,)9ȉB,}J,3$tB,r,Ephͱu1>Nju 8EpUrAÃuMquvhS(tF}졠(C0GHh Eu S(Pwh,5_(My<1҅t53$tC,uF89C,}C)tSRhh(W=1LEEƉ׹8tSNju8EpUr?(P@A0I(Q41vEaƉ׹8u uG1iNju 8udEpUrl?u%Mquvhh(N<Cv`(Q}wht5_("1EUE] Ue[^_]e[^_]UWVSu uEV]ƒtABEEu-JtBJtBABjRP1N, j AC%%} 1щ $!_Zu P4E[CC CCN(V(҉StCBK^(F, t S h(5e[^_]UVSEX(ۋu t%3Vmu[1e[^]UWVSj\EUBMR,AA@%%҉Q ~ R'UB MAEp(EE U]Z6SFVSCF CFHFu9WҋvtWtGBtGjWPMI,vvuEe[^_]ÉE@H$ h(t u h(U EP$R uu p$R@UVSu^$t" V ^ PQPPRYZPVS,e[^]UWVS3$ u-UB@ PMQ3$ Ѓ3$rMA93$}^ PËEH 53$󥡸3$t PUB3$3$ vM e[^_]ÉUVS ]S C #%C,@@ s$@@1ҹN@FC$-%^ V$N(CPCTCXC\C`ǃǃǃǃPh$S& Ph1S'( Ph=S( PhAS' PhES' PhRS' PhcS'ZYV(F$jCdP ^XjP *C $%jS$(ve[^]ÐUVS]KTɋu C #%~CPt P CdPh $Z XZC $%jS1t]e[^]ve[^]ÐUWVSEEE E}EEe[^_]vu^a' $0؉ƿ8t؉ƿ8u'Eph(LZYP uPRd1Q ؉ƿs8Ep(SEuPUrhSW MQT;QXuL PuNXvPUBPt PUMAXYPQTuFPM BFT:؉ƿ 8u u ޿8Ep(SEuWUrhSmvM;u^ PuUt PZMuM B0؉ƿ8EpUr6ƒuMquvhE3$uB,9؉B,~Z,3$tB,r,Urh*u޿; 87jj jMqjj juv x PS޿H 8EpUr5uMquvhR@(VPhh(2޿k8{jj jEpY[Ur (VÃuRMq hpVsuFuSu_PsW؉ƿ 8uejj jEpD[^Puu(@pu 0hh({1޿8kUrMq?4uuvEpvPut_v؉ƿ 8 jƋUBFF@%%F $ |ZYFMqP ^jjEp f_X[Vu Phh(y0FjVP؉ƿ 8 jE܋UM܋BAA %%A A$(ZuYFUrPEM9Mvu؋E޿8u&U܋ZPjjM؋ut`[޿8u/E܋Xjj jU؋MtC$u܋F@$F9޿8u E܋XWjjU؋Mt[Eu9u'uuu Phh(.u܃U܋BjRP޿ų8jj jMqjj juv SPu ؉ƿճ8u)E$XxQp(p$Pcv؉ƿ 8u!jj jEph_ZPu!$؉ƿ8u%Eph(6 U؉ƿ 8uMEp(S uVUrhpS|-Puv؉ƿ 8u)EpUr0H(9؉ƿ 8u)EpUr/`(؉ƿ8u=EpUry/tT(P@A0I(Q4v޿i 8uOEpUr#/u(Mquvhh(,v`(4EUMEU Me[^_] FH$h(t V5 h(u܃ FH$h(t u h(e[^_]UWVS E9E }u E ;Gu W0^XuWOۉufu2Suu w(pph5_(j j pPu WZYu VuPmvtgE;GtDu1uw(pph5_(pjZu VOS7hh(*e[^_]ÍvU EPU MRAdPEƒt MtEB ÉUUu BdPu1v@ ÍvUUu Pu1@ ÍvUWVSEPuE pPEE] j0݆E P C@@ @[(@s S$(C-%px$U px@ @@XUB e[^_]ÍvUVS(@] u]SVu!;^tY3$E ue[^]vP t@ P6hh(,(EX@Vp,p(P"e[^]UVS] uSV#uF] Ee[^]1e[^]ÐUWVS}] 7h(h('^XSWƃuS7h@5_(F WVL$KÃGVCC%%҉S ~ PCCSVL] }e[^_] CH$h((Tt S h8(5UWVS E X u) (ppU2h5_(] jnƃMAM Q FF%%҉V ~ P6F FE puEE1ɋU 1;J }vU B4u,tTuNM;HuF]E EHF4Ur. M1h(h(%GE ;x U~VuUtFFjVP5FH$ hH(t V hX(e[^_]UVSQ]E s PRPPRZYPSV0e[^]ÍvUE Utt$ U;vP2h5_(UVS]ۋuU tnt3 t Gvt/=sVXZSV6SV&%SV]U ue[^]e[^]ÐUWVSu uEV]ƒtABEEu-JtBJtBABjRP1N` j C%%} 1щ $Y_u PE[CC CCN\V\҉StCBK^\F` t S hh(e[^_]UVSEX\ۋu t%3Vu[1e[^]UWVSjEUBMR`AA@%%҉Q ~ RUB MAEp\EE U]Z6SpFVSCF CFHFu9WҋvtWtGBtGjWPMI`vvEe[^_]ÉE@H$ hx(Et u h($UWVS u F }u10EPV_E_`G vuv WP41;_`e[^_]ÉUWVS },7Epl$ÃC QupuXZC puEƃu,h5hǵh5_($vFU9Pu[GCEuL3$UuC,)9ЉC,}S,3$tC,s,7h*ucVUB WSRP8u4JɋtJtBABjRGCt c([؃7uƒtDBGEu0JtBJtBABjRPE1H`KɋtKtCAuWEP\M\҉StCBKUZ\B`Q2hh(dZss3hu6 CjSPe[^_]UWVS }t#U X BRP Pu S@1;wT}3GP UX BRP Pu GP4SDF;wTe[^_]ÐUWVS }OTu t7 W Ƌ_ VPFVPZYPWS0tFjVPe[^_]UWVS }  ut#Rvh@5_(G$/wv*!ÃtpWCBArrRV3$uC,)9ЉC,}S,3$tC,s,wh*VtW F@ r r (qqrrr$RvP(Ã$K(GwpphlV#6hh('S(tF(C0݆h Eu S(w6hh(t=3$tC,9C,}C)t1e[^_]ÉUWVSj]} fƋCFF %%F F$(7Y[É^SW GWSCGWCC$FFS e[^_]ÍvFH$ h(`t V h(AUWVS 1};}> UX BRP Pu 4SDF;e[^_]UVSut<t2u V ËF SsVP<tCjSPe[^]ÍvUVu S]tCt CP@ @#%QCPh3 *tj3( h($ve[^]ÐUWVS EEE E]CEƿȶ8umsUpu'sUphh(mv@(1ҩutWRhh(91auض8u&VEB@ SurP$ƒ1"UU U]Ee[^_]ve[^_]UVS] uuuv(v(uuv(v(u$uhhv(xv(&%u$uhhv(Lv(&%u$uhhv( v(`&%u$uhhv(v(@&%u$uhhv(v( &%u$uh0hw( w(&%u$uh;hw(pw(%%u$uhLh w(D,w(%%u$uhch0w(7ve[^_]UVS]C(u C )%t P螡 Zs(QC,t P股 Xs,5C *%jSt]e[^] e[^]ÐUVS(EPuv,詡 Fv@ 1;H}-F}UE mU]m]P v)A;H| EP虡 uFnVFF}UE mU]mEF$e[^]UWVS u hh`w(襸u 1vh h`w(bEXZh jQ$3jj jSEUJQ]SU Bx*%JB BRuS@t%}hMAjQP Qv jE諹E}~1u޿8uEpph(޿ 8WUr$h} zMY޿ 8u(@1޿ 8uSEP(u V0hBG B RP }UE mU]mEuSPhO޿] 8uMqh(UB(m޿i 8uMqh(`UB,9޿8u+QjjMqsE@XX1޿!8(pphsUr2 8ucMQ,uP1hth(KOWjjEp ت]UB,P $R [^E$h]h(1Quu u9e[^_]ÐUS]SACS1 CCS C `)%CPhS C0PhS C4PhS*C *%jSn$0(jcv]ÍvUWVS<} EX ޿8u(>1޿8uEpph޿ 8VUr$hf} MY ޿8> ޿8u:jj jEp蕮u SUr0QMq4hh([ ޿8uREp4h޿8umEPEpEEuFU;r E5(H 4$SPhʼh(FLM ;q|_޿Ӽ8u!Eph(UB(qv޿8u!Eph(ZUB,5v޿8u)PjjEpeUBɃZZ޿!8u(pph@ ޿8uAEPEpEEe}(@v ޿8u5EPEpEE E0h v޿ 8VUBHPhdMY޿2 8jj jEp輫uQUZ(u Q2vPjjMq ]ЋUB(P $R ^_E$hh(]TvMY,uRwvjj jEp CP$]XUB, P PR _XE$hh(]޿8uoMq,uS1hth({[jj jEp 跪P$]XUB, P PR ZYE$h]h($Puu u]e[^_]ÐUS]SACS1CCS C )%$4]C(XZjs(R )C *%jS$P(誧裨v]ÍvUVS]C(u C )%t P Ys(轭C *%jSPt]e[^]钭e[^]ÐUWVS,} ]s, 8UB PoZYǍEPMq( ƒ҉tO]ЉMA(x(uBvB@CP2h7VUlƍE؉$א ƒPWh?h(5t Wa1VSu u{e[^_]ÍvUSEPU ]REE/EEEEXYUC(Rs(P,u1@ ]Uu uƒҸtBuRP1UWVS,EE 9EU]]EUЋE޿B8u"SjjUЋEtޡ]v޿J8ujj jUЋEtREX޿O8uQjjUЋEtk]!v޿S8u]؃EE 9EUԅy#UrE0h`5_(@1( Xpj8XuuVSuuuԋUrW?(WusyGjWP 뗍vEE@tO(#vt W9 hp(٣e[^_]UWVS(E]E]]$u(j8.lj4$Suuuuuu W(WuytGjWP 1& t W衩 h(Ae[^_]U EP uu PR ƒt B(B(ÐUEP u(u$u uuuuu PR(ƒ0t B(B(ÍvUWVSLu }]SVZYEPSEEEEEă EEW(MPQw(ER0Ã۸teEt s GT3$K tF,tA,A,F,A)tA0Q4N(F0V4ɉs tAjQP 1e[^_]ÍvUVSEPU uREEEE[EUEXF(Rv(P,u( X P訊 tCjSP N1e[^]ÉUVSu u]uu Xp1e[^]ÐUu uuPM@Q1ÉUVSu u]uu X p$1e[^]ÐUu uguP$M@ Q1ÉUu u3u E1ÐUu uuPM@Q1ÉUSEPUr(]  $P B 9Xu B(B( EP- ]ÐUS]SACS1CCS C (%C(C,C0C4C8C<CD]UVS]C4u C (%t P>C8t PCu ujh((@+%u ujhp(|(`+%e[^]UhjNÐUhj6ÐUS j]SC +% CXC`,%Ph S!jS h (D?v]ÍvU (VSM] yvs0A 9u A$9BATL(yٙ@ s42qTP (y赙K{ tTB(uIStBjRPCKP58"jQ>(C$(C vHB(e[^]ÐUWVSUBR} P ZYPuWơL(y ^UËBRP Ft@jvPEF(y՘UFzXxPB@ jVrP e[^_]ÐU EPR uu pR UWVS EEEEp08‹] u(Eph(UBe[^1_]ÉMEM] Ee[^_]]UVS] uuu((8uu((:u.u)Pjh<h((,%(L(u$uhSh(Z(,%u$uhch(.$(,%u ujh($(,%@u ujh((,%u ujh(($e[^]ÉUhjÐUhjzÐUVSu] E FCSP 1҅J!ӉFF e[^]ÐUWVS uۋ} t9v^C ۉt"t@j3P SeÅuʃtue[^_]Fe[^_]UMAU uQP Q]UMu1B uA]UVSu ] VxGF -%XZF$F(F,F0^C VvPdEjF$P hX (AF S%jV'$h (#vve[^]ÐUVSuFF -%P ] jPRdZYjF$PYXF S%jVtue[^] ve[^]ÐUWVSEE} ]jƃ WSV[XVE$PE} Ee[^_]Ht V衐 h (AUVSuV,uF $PVF,…u& 6(pph5_(趇E F0F0J9uLSF 2rVP ^,t"t@j3P SF,F09V,QF 2rVP ^,F0+CۉF0t"t@j3P S虏F $PkF,uHV0~R 6(pph 5_(Ɔh@h(̾$F,‹F0;BLe[^]ÐU]ÍvUWVSEEEE@EƸa8‹] uOEph(ĽUB uV2hih(;vMH 1+vu俇8jj jEpKEu SUB j~ jjC  C-%CMq t>uC C,v1у KQZYC VP"WUB SuRP@1Uu俌8uMA V0hh(1EUE] Ue[^_]-Ce[^_]UUҋMt0AtPA Ru QP(v: ur h(;ÉUVS] uuu((,(uu0(4(u$uhh8(8D(-%u ujh8(D(-%Je[^]UhjFÐUhj.ÐUEP R jp R,UEP R jp R,UEP$@ U EmUWVSE UE1;B Eu؋U rj ًF]FE߉C%%1щ $讈ZYVPÌE[CE߃C CCE ҉StCBU SEE UE;P c!t S  h (譄e[^_]UWVSu} v蕩[vԊ^v ؋[P辊utue[^_]飊ve[^_]UE@U t9u@ v@u1]ÐUE@U t9u@@u]UE@U t9u@@u]UVSEXۋu t3VI[ue[^]UESP1ɅtE XRAu$ÉUVS ]u j @0@SPCCe[^]ÐUE =UuuH(L(=uJuP(T(]ÍvUhjÐUWVSu(u$u uuuu]u },SC@/%0C8 /%J@H@ u19(ǃ,ǃ0}xE1v jˆfp;@@h/%X @EDEF;(|vC`*% h (e[^_]UWVS uE EF@/%1E;(}4^8 7C$PEE;(|F`*%Etue[^_]髇ve[^_]UWVS] uSV1 (э\ h`Se[^_]ÐUWVSCFE@u(fVf9S}[tCE@uf9S|؅u2u EpsEXCVSPE;XuWpRv9u4CFEt fFf9C~GVWP E;8CVSP E;u0e[^_]ÐUWVS,E1tO}ȐWs tCC$PWh5_(F z u h[uth5_(ye[^_]ÉUS]SC /%C4C4@X/%@ C,C0C@PhSC0!jS h!({|v]ÍvUWVS EEE E]s8uuCEƿ 8uE@@Gvu迿8uE@@Rs h5_(x!1EE E]Ee[^_]}e[^_]UWVSu uXux9]yDCv(P<$]EBKXZu׋]x$}]4C6WKuE 4Pe[^_]ÉUWVSu uǃE;(|1UB;B h5_(yw$aEXp ًE)@0EU;B,~SB QWRP8EXp E@0E)E؋UB0EL8DuEЃ4PPuuW1e[^_]ÉUVSuu VËF0+0F0,$ V0;F,~PF QSVP8V0 F0,e[^]ÐUWVS,EU `ɸ9UU]]EEEcvEȋU޿ 8u"RjjEȋUtt]v޿8u#jj jEȋUt:zEv޿8uPjjEȋUtOt]޿8u]x޿8u+EȋUt&8u?E6޿,8ujj jEȋUtbyẼEE 9E}ԅxuЅt*]̅#UrE0h@5_(t1MС(ɋpxt6 h45}XZuuuWVuuuԋUrS-v j8}YuuWVuuuԋEpS^ރ0VuyfFjVP REE@tN(UЅt,At SE| h !(ut S%| h0!(ue[^_]USQUB@] Mt/Ht@hh5_(Qs$9]É] MU]R] MU]UWVS t jƧ14UB$v,r$P,@ 0FF PMq,F$V(U؉EEF ,]SD8UPR/%EE}**U ;U~E;E|wEDžhDžlpDžtDžxDž|t Dž|tExE|EE}EEEE}UEE+Eu7E jH4qXZjj4v PU2S413M  jHqY_uu4v PE0S0߃ Et/W@ЃG@,,uE;Eu F u W@F 09B}BM ~9F 0TlF 4@URˍPY.+Ex(V RM(qZ,yV$F Dž8Dž<Dž@/%DV(HR8S$D8PXWDžL*d  W. ËF,Sv (0M1hh( t Sm Wc_XUB$v,r$DždP,P F 9BBPM1h 5_(>f$&^t Sn h`!(Mht Sn hp!(-he[^_]UWVS\E8 ƒ Ep4UMy]PS!SVuW@u'uE0h`5_(e$jUr@tcMA$rDq$P,tDx EX4uPVN!XZV;P!MAE@1Pt;Ett;lVSh uFvE ;st0 GWPN S(h uJ [^UrMqw,Quu u1le[^_]ÐUWVS6MAA/%A AAv1y DžtxDD9~x+t~E(Dы]K 9tS ыUB(+B$PR_Mt|A xA|AA/%AEe[^_]UWVS EX޿D 8uQSUB@ uu rP Ã۸ CSPHu S,a޿O8;Mqh(蠉jj j}Ep EtV MEEQ$]PSq$R0ƃuha5_(QEph(-Mɉt5 jKZ@ -%@@^ ($^ tvB9x1 jYƉ~$V¹ /%IBzB  jYKɉru S S1Ct R-Yp>jj jUrU8T$R;u }MȉMߐjj jE4Tjj jUtTYZuWEEEА/%]ԉEEh ;u  vRuu u\e[^_]ÐUVS] uuuX(\(wuu`(d(yu$uh{hh(脍t(@0%u$uhhx(X( 0%u$uhh(,(0%u$uhh((/%u$uhh(Ԍ(/%u ujh((/%u ujh((/%辌u ujh((0%薌u ujhx(( 0%nu ujhh(t(@0%Fe[^]UhjÐUhjÐUVS]S@C<9‹u 0%tPRh@5_(MYCth`5_(^MYC tQ0hh(C$tR0hh(C(tQ0hh(ߥC,tR0hh(åt]e[^]eUe[^]ÐUVS]C0HPɋu t! (ppv sDhiR tjVPC@@;C8C@|Bs0VPҋ[DtSh-RV,tj4PV,e[^]ÍvUWVSX1ۋE1x0]uE"o0P}Xm]uE}fE% fEfEmm]E}ԋEE mԉE]mԋG4UЋ Ej4VTË53$FU3$B$P $R }fE% fEfEmm]E}ԋUE mԉU]mԋEЍ{UCGG GG`0%s S$C(C,ẺC0B0pPt3$r1ۋH(9}%tj4PMQ,I(C9|ۅt RfMjj jEpJUB($KMljȉy,H(1u8uLjj jEp3JUB0B4t PLMA0 PEKUB41Pu8jj jMqIUB8B<t PpLMA8 PJUB<1_E@EƸ 8uwEp Vh(W|ÃuRVhZ5_(D۸xjj jUrI‹M;Q0|PRhMA4 u/8u|Ep Vh({ÃuWVhZ5_(D۸jj jUr|H‹M;Q8|QRh:YvMA<1uQ8ZEXS(W){ƃuRShZ5_(CUZ SWzǃuPShZ5_(TCMA@AD ]j KAUBHH1AAt ЋPHABUJHY j KAUBLL9AAt ЋPLABUJLY1~ CMqY8"jj jEpFExU;B(} B,M̋,Ue[^_]ÍvUVS ]݃Uܫ]苃 P GM^E$}Sƒmtet[ـEuGPS t tt4pppp$SR\؋De[^]ÉUEEE E,Em$u+}fE% fEfEmm]EÉUVSUE ـÈ@rI314EuZ9|؉[^]ÉUVS] uuu؈(܈(uu((u$uhh(v(1%u ujh((1%ve[^]UhjFÐUhj.ÐUWVS uF] t@ SvP8Ht~u (yCCp5(5~@te]SWF PvЊZYu5(`5 Vh h(3X5( ShLP>t% Vp>FP EPWF PvR t WG>Ee[^_]ÐUWVS EEE E}EEX޿O8uUrE P@1v޿W8uWEX޿_8u UB@붉޿d8u E@@딉޿i8uUrh(mUB2޿p 8u#Eph(TmUBEEUEU Ee[^_]^ye[^_]UVS] uuu(({uu((}u$uhh(@s(2%u ujh((2%Rse[^]UhjFÐUhj.ÐUS]S茢C 3%C3%C ]ÍvU]ÉUWVSUB u RP< t t6utUu RPUB u RP4EX =(u t)G$(GGGG jTz (F$5(F vHB(e[^]ÐUVS] u t=tvǃ  1u/$1u#(@݃Eu1vu&ɍtu P(yvF@C,P<$XـEuQC hVSP8$e ݃8(܃@`E R hS(y vF@C,P<$XـEuRC hVSP8$ $P PhVSe[^]ÐUSQ]0tPD@P|v,t&uhPTPPJt&u8PTPPSPtCPjRP 1ǃ$u#(@݃Eu1vt,ɍtRTPP8 1u.$1u"(@݃Eu1u&ҍtu PL]USS]$1ǃ u#(@݃Eu1vt&ҍtQTPPd 1u.$1u"(@݃Eu1u&ҍtu Px]USR]0u St S% ]ÐUS]St SHt S ]UU 1u,$1u (@݂Eu1t&ɍtQTPP$ÍvUL#UUEǀ(]ÉUVSu$=t7="==t%= VSv(0y S{ A(Ct@jsPCSQ^ Vv(0yl S{ tTA(uICt@jsPCSP58"jR(C$(C HA(dž0ue[^]XUWVSE0ɸE$tu (yYÊ t* h5_(>$bM 1u*1u$(@E݀Eu1u'WhU0RMǁ0@Eǀ$ 1t6MEt!WTPPeM 1u4U$1u%(M@݁Eu1u+UEtu PkCP $]EB(R,Ѝp1҉$P,$XZUr,E1Mǁ$ t2ȋt!VTPPiM 1u4U$1u%(M@݁Eu1u+UEtu PoMB(R,1RpP,$q,XZ]E ǀ(t2(y(MyB@ =(E0t+G$(GGGG jTYX(1ҹ@@ @@@@@$CCSKS K$58"GtuR58"jw(yW@4@<@$G G$P58"vRVt BRPGW(U^(St B RP(v1UCK Cr[$BZJ Z$MVAP ȃPWqR uEPuP6E0(yB@MA,P<$XـEuSA hRQP8$E $P1e[^_]ÉUWVSE,Ҹ(yvB< U 1u2M$1u#(@E݀Eu1U4Dщ4R9v4U 1u5M$1u&(@E݀Eu1vRUP4P31Mǁ$ t2ȋt!VTPP M 1u4U$1u%(M@݁Eu1u+UEtu PMH(@,1RP,$pXE@,1҉ȉ$P],$EX]ZU݂@E] h 5_(E$iM ǁ(t3(yFE(y-B@ =(U,t+G$(GGGG jTfYX(1ҹ@@ @@@@@$CCSKS K$58"GtudR58"jw(yBW@4@<@$G G$P58"vRVt BRPGO(M^(St B RP(v1UCK Cr[$BZJ Z$MVAP ȃPWqR uEPuPE,(ydB@MA,P<$XـEuSA hRQP8$E $P1e[^_]ÉUWVSUu :(yH( ytM 1u5U$1u&(M@݁Eu1vSC C C RuU4Dщ4R9v4U 1u3M$1u$(@E݀Eu1RUP4P?1Mǁ$ t2ȋt!RTPPM 1u4U$1u%(M@݁Eu1u+UEtu PSC C C BtRMA,P<$]苑B(R,Ѝp1҉$P,$E܁@X܁PZ]|E(ymB@MA,P<$XـEuSA hRQP8$&h`5_($Uǂ( t3(yv(MyB@ =(Et+G$(GGGG jTX(1ҹ_@@ @@@@@$CCSKS K$58"GtuS58"jw(yW@4@J t ]C9uWh|u uDdMAB 94$@ 4$)RWVh?=4$ u h&] CPUVB@ jSrP e[^_]ÉUWVS( uyFNjU z$tShxRV,S{ tVA(uKCt@jsPCSQ58"jR(C$(C vHA( PdžP9Gwdž8 vdž< 41u-$1u!(@݆Eu1SP4P4$s |@ ju |P e[^_]ÉUVS] uuup(t(uux(|(u$uhh(d (9%u ujh((9%v e[^]UhjFÐUhj.ÐUWVS uF$FF(_(t{(yvS{ tTA(uICt@jsPCSP58"jR`(C$(C HA(G(F{$t SP F@@@@ =`C,C($FP5 e[^_]ÉUVSu ] uuC PS5( C$s(e[^]ÍvUS ]C$s(s C(]UVSu ] uuC PS5(T C$s(e[^]ÍvUWVS E u]=(N,\ ~ " Pv1F@@@@R=h $ZF E$PVWF$v1e[^_]ÉUE@$P@,R p(pRhUS]SܰC 9%@@ @@BZ@@ B$@@B(BZ@X ǃǃǃB$@@ C@:%ǃ:%ǃh:%B(B,ǃǃƃ ǃP:%ǃ@@ƃ4ǃ:%ǃ8PhpS3vC B%CB%jS $`$(Gv?v]ÍvUVSu ]C|tS tD (AjxEtwA RQP$C ƃ $PdC|u?(C|S@yvFHr@$VP VSve[^]UWVS u} (yOv_PP(y/v@ ~*=4$uEQRh5_(4$'v?@)щH (yvLEFPF WVPhe[^_]ÉUWVS u ME8Vp(h5_(:U Ph5_(]  Ph5_( Ph5_( 4Ph5_($E X|(yvF]S@Hr@@$$VQ=(ut+G$(GGGG jTYX(1ҹ@@ @@@@@$CCSKS K$58"GtuR58"jw(yW@4@<@$G G$P58"vRbVt BRPGG(](ESt B RP(1CK CU[$Z$BrZJ S]C@ jWsP C|e[^_]ÍvUWVS ] uE t&U(H RPQ$UƂ UB@@@=HU$PV5(QEƀ B| =tB SRP4q(y>S{ tTA(uICt@jsPCSV58"jR(C$(C HA(UE4t*( H RPQ$UƂ4ǂ8uƸ~$SuuV(^(ya ({ɍ8yKvB+D9 BQrh 5_(Z5_(G_XUB SRP4~$t UVP F,(yS{ tTA(uICt@jsPCSQ58"jR\(C$(C HA(uƌ~$U(˜H RPQ$(F$^(y0S{ tTA(uICt@jsPCSP58"jR(C$(C HA(F(e[^_]ÐUWVS }] (yvS (y4Ft);G(t${ A(CdA+F AA h`5_(^5_(N(yS{ tkA(uICt@jsPCSQ58"jR(C$(C HA(PG@ jSwP G@@@=$PR5(2 Ƈ e[^_]UMA|P(tx$u/A RQPhQPtx$uAPjRPUVS] uuu((uu((u$uhh((:%u ujh((:%e[^]UhjFÐUhj.ÐUWVS=(GWM]uq4Y0AA A(Q,VSu QW e[^_]ÐUVSuN ɋ] (uB SRP$(yK{ tTB(uIStBjRPCKP58"jQ6(C$(C vHB(FF F(F,F0F4e[^]ÍvUE@@ @(@,@0@4@E) UE@@ @(@,@0@4@E UE@@ @(@,@0@4@E- UWVSu] V_F :%@@ @@G0G4G(G,G8G<@@ @@$dždž B(B,wG Gdž džr@@ @F`;%dž;%B Bdž;%@dž dždžDdžHdž<dž@džLdžPdž;%Ph V  Ph1VF,P<$X5$5$$5$5$$5$5$@;5$~ h@$#vdžTdžXdž`dž\ V'h5$džljjFdPW 3vF B%FB%jVG$$(觾v蟿ve[^_]UWVS E] EEEuOp |8u3Eph(ƒM1҉de[^_]ÍvEME] Me[^_]5U(VSyE H( y4Z1҃3 ( 3REp(Q A  A  A RQA A A RFPPh5_(#0e[^]ÐUS (p]ps(u h5_(SL $TXh5_(źsPh@5_(裺 ]ÍvU塠(SP@ 5$p5$]5$Bh 5$p5$C($ÐU(UM ynAx$u7\u(ppr(hgݿ.vB QRPHvEBPB|B QRPDÍvUWVS( ]} yvwXƅt!F us(hbF Tuv(ǃTyG@C,P<$XـEuRC hWSP8$Q$WPvs(hȾe[^_]ÐU(VSu ]yvNP(@,‹A)ЃAALQC@ jVsP e[^]ÍvUWVS( }u yvV(y B(R,CCQA A A B At fA vfA [^_]UWVSEu"(ppUr(h 菽MT1uMX1u!(ppEp(h@J<(y5(By@MA,P<$]EXEuSA hRQP8$?vEǀXjP=(Ut*G$(GGGG jTjZX(1ҹ@@ @@@@@$CCSKS K$58"GtuhP58"jw#(yFW@4@%CpCXC\?@@@ @ ShC0C>%C`CdBCh>%Z ǃǃPhS PhSC00ǃ jS豻 h$%(v]ÍvUWVS|( yѶM QE (y趶4(y衶<Ep 5(٩MQ  tY{JEp 5(蔩MQ9uc;Qu1E0hh()vPUrrr2M1h%h( FFC E@  vVF UB B$FGLSB@ ju r M1PE0h>h('5(H ZYSh(E1uPPUrrS2M1hTh(FF FUFF } u E@dEVUB ju RP P M1PE0h>h(k5(G Y[Ph( PU2u[(y芴U JE x B(U Bt!@jrPM E AHR58"jQU (B$(B v(yU JE x tZB(uOE PtBjRPU BJP58"jQ~M (A$ (A HB(e[^_]USj]jS8 s\sXhS]ÉUWVS%CpCtCx>%Bǃ>%Z ǃǃǃǃǃPhS C0PhS C`PhS PhSC04ǃ!jS衳 hD%(v]ÍvUWVS|( ]} y軮vwƋF t tBF;C\P3hh(&Cxx P}KtɍSttF9tP@t9ut:ACh(@YFVA CtAF9C\QKtuy ev j肪FCh(@YFVA CtAQVKtS\tFV S(y聭O tTB(uIWtBjRPGOV58"jQ (G$=(G vHB(e[^_]UWVS E ]t Ht]e[^_](@]Ct1sttLvBEEu(BC\9u C\ Rr…uPslshP*t Se[^_]ÐUWVS,EEԋE E]7CEЉƺm׉8utVjjs蟞YE[XhUԋB jRP< MqlqhP}ԡ"oh$}_mɉZx$PW1{ ׉u8ush(UԉBpvNjuй8uHsh(Uԅu sshh5_(Ҟv}ԋM]M }e[^_] e[^_]UWVS]sds`CxPqStu]e[^_],K\yC\B R S蕺ǡ (yjOC\BB |(yGvs 5(4耝CXFC\݃݃ɉFEF t؋F ^s\63h>h(z5(< ^ZPh(t 5(< ZYPh( PCP jWPR e[^_]ÍvUWVS}W~ơ|(ySv^ÃCw 5(胜GXCCC SC[XVWGptQ@ jVwpGtR@ jVwP sv(y辨V~ tTA(uIFt@jvPFVS58"jRD(F$5(F HA(e[^_]U (y?vE H( y%@4@8BB ÍvUVS] uuu((uu ($(u.u)Rjhh((4(@?%<(|(u$uhh@(FL( ?%u$uhhP(\(?%u ujhP(\(?%,u ujh@(L( ?%u ujh((4($e[^]ÉUhjÐUhjzÐUEE mm]ÐUE?%]ÉUWVS E Epx(tM 6Ơt B RP ËG <$P 9u֋uvLJEpttť>EEe[^_]UVSu VwF ?%FFFF$É$ ^ "jVM h%(HCve[^]ÐUWVS ]1K9΋} C ?%%St PKSF9~St RjSt]e[^_]ve[^_]UWVS } ]u.s8u u 1} s8sh(GX}UE mU]mEM;APtGX}]E m]]mUG`}ME mM]mE];CHtG`}EE mE]mM]CC<1} s 8 (uE(jjjs舛UBjjjs qMQ҉A~!~ P荜]C1E(OUB PZMNjA<ȋH1CU;Z|1vRSu uoe[^_]ÍvUWVS|E @X]@`]@p@xU݀ʡ(ʉE]U ݂E݂]}UE mU]mMYKE9É]~EE}uE mu]mEp;u_ؐVE,$uEE^ }EE mEUm]j,}}$E@@ UBBBBB B$S$mE@[muHtDE@9ÉEt@EEu CE+EE]uCE E@E]UNEz;HTuTE TE9EtEEM;pQuNUJ E;XuS]S$]CM UBJ($Rs uF' ;uEE}EE mE]mE}UE mU]mu;u؉E;pfVE,$uEE^ }UE mUUm]j,}}@ǃGG GGGGG G$S$mE@[muDt@E@9ÉEt@EEu CE/EE]uCEًE@Eى]MEQ;pLt E TE9EtEFWU;JuNO E;XuS]CGE W$G($Ws uQ N;uEEE}UE mU]mUJIE9M~EE}]E m]]mEX;]SE,$uEE[ }EE mEUmuj,}}`ǃGG GGGGG G$V$mE@^mu*t&E@9ƉEt"EE@ E@EMQ;uLt DESE;PuLMEU;pWuNO u;^uSuFGE W$G($Wv u蕹 C;]vEEE}EE mE]mE}EE mE]m];][vE;XBSE,$uEE[ }UE mUUmuj,}}記ǃGG GGGGG G$V$mE@^mu(t$E@9ƉEt$EـE@ًE@EًMQ;uLt M;YDtGE;puNCO ‹u;VuSuFGE W$G($Wv u K;]e[^_]UWVSXu E/E @XU@`}UE mU]m]Eu;FuH} GX}UE mU]mEu F`}}E m}]mËUE;BHtu F`}}E m}]mME ݀]}fE% fEfEmm]E}EE mE]mu~UO9lj}~E̋u~O 9lj}~E)щH)ӉM!EĉH]!EЋE9E};}UuЋB4tt U B RP ËF 4$P 9tJ VX.uuvdv`uuv\vXEE u EԋU4@EԋuG;}oEЋu9uTEԍe[^_]ÐUWVS E}G9EW19}mGMtSSVQhCGU C SP ZYPhu܃ hWF9|GE9E|Ee[^_]ڑUVS] uuu`(d(!uuh(l(#u$uh%hp(|(?%u ujhp(|(?%e[^]UhjFÐUhj.ÐUWVS } EE]uZsh(ƃussh5_(<hsБu Ep1vE]} Ee[^_]e[^_]U Eph5_(耊$hU Eph5_(T$<UE4E @}$MMu,]ÐUWVSE݀]݀]؋E XS+CX]C`]Ch]EX$*C`sX{\]Ch]UBP $R0PT]݅PE]UBP $R4]EE]UBP $R8]EE]U BP $R0]EE]U BP $R4]EE]U BP $R8E]Ee]EeݝxEeݝpE݅x݅pU B P uutp|xuu۽XPR ݝPTP֋U$ËBP uutp|xuuPR$ۭX$uuuu؃$VSE ppue[^_]UVS] uuu((Huu((Ju$uhLh((@%u ujh((@%e[^]UhjFÐUhj.ÐUS]S@CCC @%C C$CCC(C,]ÐUE,E MM$E@CHCLt5$ǃ5$C0CXQPh5$S@ C`PhS. ChPhS CpPh S !jSY h@'(mnv]ÍvUWVS,] E@EԉƸ8u ul1 uԿ8u uq Yu1 uԿ#8uju1 uԿ.8uUB@)uԿ:8u$UB@@h@P Pc1)uԿK8u$UB@pphRh(m1 uԿU8u8RUB h33?h ARP4MA@@L@H@D)vuԿb8uDUB@@pP2heh(_5(0 Phvh(^vuԿ8UB@@pS2heh(HY5( Phh() M1hh(Z5( Phh(X5('1 uԿ8uUB@@p1dvuԿ86MA@@p12E@EԉƸ8 uԿ8uGUB@XlWjjMqfUB@ [ XljjMqe[$1v uԿ8u$EX@VjjUre[1^ uԿ8u$EX@QjjUrre[X1uԿ8uEX@jj jUrjC\vuԿ8u$RjjEpeUݚ1uԿ8u$jj jEpojU1euԿ8u`Eph(9ɸ$UB0]0A8t ЋP0A8BE9E[^_]UWVS,EuF@9E}Pv19ى}7FDE1EȋUt8A9ى|ԋF@E9E|E9E}Qv19ى}8FHE1EȋU~D8A9ى|ӋF@E9E|E9EE9MEvEMEVDE‹M 4Vuh5 _(I]F 9Ή|E9M|h5 _(eIE1wVuh@5 _(DIM14vES‹]KD 1҅RhF5 _(F I9|ȃhK5 _(HEUE;P@|h5 _(HEMA@9E19E‹]SDEt}Vuh5 _(1jHV1ۉ9}/P؋U4hF5 _(:HMC9|уhK5 _(H]G9ω|F9`UB@E9EBh5 _(1GEM;Y@}~vSuh@5 _(GE1/vEQ‹MQH4hF5 _(vG]F9|̓hK5 _(RGEUE;P@|e[^_]ÐUVSMu ]t)؋QH<t]u [^]8[^]UWVS E ]EutnSDEuVɍ PkLNjESDɉ<EEuE ]e[^_] ve[^_]UWVS }ًE EWD19ΉE}jE WHtQ]/PVSW ‹EVSWsÃ9tQVSWa=uF9|e[^_]ÉUWVS EukE EVD6jj jw +6jj jw6Eu/(U@B8E R%U؋ } EUMEU Me[^_]醶e[^_]UVS] uuu((uu((u$uhh(nČ(E%u ujh(Č(E%ne[^]UhjFÐUhj.ÐUS h]38ƒ1HS]ÍvUS]STjj j`SS4]ÍvUS]S$ jj`Su.]E]ÍvUWVS ]`1 s.u s .Љơ_(DP uωa`G sL.t!Pjh5_(/$66 s-uS}츎w8jj jEp c)jj j}wM)jduwEpǹ8uXjj jEp)jj j}w (jj jw(VSPuLƒ1}EE] }e[^_]=_e[^_]UVS] uu$uhhȌ(bԌ(F%u ujhȌ(Ԍ(F%(be[^]ÉUhjÐUhjnÐUE@ F%]ÍvUEU @ F%]U,EPuu PR ـE@t]"  P}/}UE mU]mEљR$mEZu ؉1U]ÐU]ÐUVSu VF `%F%$ U+É$\ C %CCC^8^4F3vC B%CB%jSY$((vve[^]ÐUWVS,E E}E]Ehpu? C SPT@@(@C|E[|vh}w= C SPTx@(@C|Euy] C SPT@@^P shsduuPR((P@ C|>}bh}wu Qjjwc[T1DhEpmuRjj}w&[\ljh%Ep9uPjj}w[d듉Eph(LEu#}wwh@5_(Eԋ@E܉Ƹeǹ 8uE艃hquu}艻vhyulu EC(}ԋE}E ]e[^_]e[^_]UWVShUB RPT@@ MA QPT@@xpu ]C SPT@@x@t\(y M ] Q{ A(Ct@jsPCSV0v MA QPTX@E ]C SPT@@@E(y fU BHEp@(E]UBt@ɉEu]ɋUMӉUEUÉ։]uEGEEu]Љ]uEEɋE]]@|EuV؋U B RPT@@YMP qhqd]uEa|$PR(EX|(EU BtM]AClEt؋UBEtUBEEtE]uh5_(}mEEu8Eu, @ uPTRMA\@@iTP $uuPR ]C SPT@@_MP qXqTuuPR ]CtE Eu ǃ(@EEXlEЃ PtX|B RPT@@@Ẽ@U B RPT[^@@@@MjA QPT$聮ء(y] S{ A(uNCt@jsPCSQ58"jRIU (B$(B xvHA(o MA Q} PTE]P $R((GEPLHPEGE WO_ w$Pu UrHe[^_]ÍvUWVS1}EEЉEEG EWUԉUPTX@t5 G WPT@@H@U G WPT@@xp; G WPTP@t) G WPT@@@Ẽ@ G WPTE̋UȍuP WE V(PEEM؉]R$]݇EEu Eu݇EEu(yyU B@ t2(ySvM YVËBuuPC EU B8 P PR,EM Y(Q4A0] G WPTH@(yU (BAGtHʀEw@u ] vUEUÉ։]uEAEuv]]uEE]]G|Eu9 G WPT@@ZP whwd]uEg|$PR( _| G WPT@@[P w`w\uuPR$GtE Eu LJE Wt_|G WPT@@@Ẽ@s1 G WPTZY@@@@jG WPT$Ee[^_]ÐUS]C SPT@@t(@C|Eu[|؋]ÐUS ]C SPTH@tY(@C|Eu?] C SPTZ@@P shsduuPR((P@ C|؋]ÍvUS]S @ jjjjjjP$$\$@ jjjjjjP $sPsLh5 _( @sDs@h5 _( [Xh5 _( ]ÍvUS ]C SPT@@(@C|Eu\ C SPT@@xptFC|(h] C SPT@@YP shsduuPR((P@ C| C SPT@@@Eujjs(蓧Rh$@jP1]UVS] uuu((,(4uu0(4(6u$uh8h8(PGD(I%u ujh8(D(I%bGe[^]UhjFÐUhj.ÐUWVS=(GWM] uq4A(Y0AA Q,VSAPQW{1 e[^_]USR]C (uCQ PQR$CC C(C,C0C4]ÍvUWVS=(GWM] uq4A(Y0AA Q,VSAPQW0 e[^_]UE@@ @(@,@0@4@EUE@@ @(@,@0@4@EUE@@ @(@,@0@4@EUE@@ @(@,@0@4@EUE@@ @(@,@0@4@EiUE@@ @(@,@0@4@@@D@E'vUWVS5(F}VG("] W,GG PsG@MR $ZW0G@GDu G G$PWV. e[^_]USUB(B@B(kp}EE mE]mMH!B@B Q $j0YZ0B@BDC RSP$]US(MCE A0SɉA(AA Q,Y@$PQS- ]ÉUE =UuuH(L(=uJuP(T(]ÍvUhjÐUWVSEP] uw E@ J%@`J%@8jSÃ8S 8t޿8uEǀ<@v޿8uEǀ<@p޿8uEǀ<@H޿8uEǀ<@ h5_(a$ EǀD@8@JyEǀ@@e[^_]ÍvUWVS (Lɋ}y1E P ( MЉMyvE̡(y‰UȊG4 Ew EEEEEEj]t C@t@]E05(<@u4su 9G tEfD@@@ SHCXUC`UKh[l}DM؉]uEdG0@uEG8PuuSQ\$$w Mq4w (rrEPh@u G0P1FL VH PV F  F  F RVF F F RUBPhQ< vMԃMUЋ3E  (EG0@EPFV PV F  F  F RVF F F RUBPE0uUruG8P (w qqEPhuz G0p1I@ۉMtS@trrh1P@ e[^_]ÐUWVS(ҋ}y= E H (4 y% 35(aYEXs5(NEED@tOFEV13K4 (E@0xPs21U2Vs usuh W}02UB0V4xH!Rss usuhXWI e[^_]ÉUSR(ҋM]yF E PD@t0A0HPrrrrfzut}Ph.A0HSrrrrfzut}PhQ ]ÉUWVSL( ҋ}y E pE֋D@ts$0(E@0xPrrr$ tqvhWtv$0(E@0xPrrr$ tqvh`W@e[^_]ÍvU]ÍvU(VSu]y E H( ym D@tF0XrPrLqF0p<}t<tSq qqBPPhWuSQuh hSYF FF FFF  F F PRSQPh4hPOF uEtVPhBue[^_]ÐUhEu$EUWVS(8E@]}Guԉ]E`]pd]Ћu! Gpd!tU 9Pu]ЉuEEEu-e$u Gp`uVSw؃EPwEEI}EP GuR$GE؋1ۅҾ?t&" Pu]ЉuEЃɋGU݂h$Gp\uQG t:hXvGt h[ppuuuPY Gһ{Gz?t'" P]ЉuEЃɋGv$u܋H1HQ!RuGEݘ Gpd#Pt;U u @u  Gpduʍe[^_]ÉUWVSE }]wd5(E;F;F u Eƅ EƅRURVuc9s(F 9EPMQVEuE<ƅY9v0}uL~tCE^FuuVuu%vWhh5_(*$t%uEpdvvVu U؅tg}t^vVMA jRQP U؃ B RP(ƒuًU؅tB jRP]SEpdEM]U25(ZYPMqd,ƃtgV@]UVS(ҋ]u yJ(@C,VC09C(F$ZuU SO(҉y vQ(@BEu PC h RC hQSP8C us$s C$p$s$C(]e[^]UVS ]S$Ɖ$e[^]UVSuV] EPEPSVE u1Kv;F u VjE&;F$uE@$N(F$ U@$B$N( VEe[^]ÐUEPEPu uU1UUJ ;J$uB$B A$B tJ(]ÍvUSR]PC hQSP8K t*(yiQ(@BEt]ÐUVSM]E@ u t' (yB9pt@$uۋ u[^]ÍvUE@ t v@$u]ÍvUE =Uuuȍ(̍(=uJuЍ(ԍ(]ÍvUhjÐUUBB BBBfBBBB B$B(B,B0B4BPBH@IyBXBT]ÐUVS]KTɋu t&tABA QKTu܃t]e[^]e[^]ÐUVS u] j‹FTZB BtFTPFTVTBe[^]ÉUE@TU t9Pu]ÍvUEU t9Pu]ÍvUu ut"tABAE MÉUWVSj\}] .Ɖ4$0^tp7~e[^_]ÉUEU UE @)UWVSj$}u WG @L%@@ @@LJLJLJLJ@@ @@D@M%@@ @@Bz B$GL%LJ LJLJ48LJ<@LJ\`LJdh$ %LJLJLJ$LJLJLJ$LJLJLJ$0+ VWP LJlLJtLJpLJ|LJxLJX1LJ %jP$)(LJ %jP$)(LJ %jP$)(jW@ h)(vve[^_]UWVS EEE E}EEuoXlj޹8uPh?jEP+1Xlj޹8 ub1'v}EXlj޹ 8u!Eph(Uplj޹ 8u!Eph(Utvvlj޹8u!Eph(Ux:vlj޹ 8u%Eph(JU|1"}EU}E Ue[^_]e[^_]UEU t 9Ptu1]ÐUWVS E }EFVW+t3U8u,@u"h5_($1t[p u1e[^_]UWVS$u u,+[^u uEt+ǡ(yU BEMq19؉M]}M9 t@9} ;Muv ;ME<Eu Pw((ybM ] Q{ tVA(uKCt@jsPCSQ58"jRU (B$(B HA(MSx9t @]sH ‹EP(yvU MBifhe[^_]ÉUWVSEEuu)EXZuu)ơ(yCvUBEMy1ۉ9ÉME}M 9tC9} ;M u v ;M E<u7EuP& UB huRP8MRp9t @ExH ‹MQ(ysvUMBifhUEtE@EB E}e[^_]ÉUE Ut#Ht=tt&0U7vUvUvUv jÐUWVSuV u ~t P& Vu V%2 ÅtC tsV3uu ۍt P&Qh?jP%e[^_]ÉUWVS }(t*C$(CCCC jT6ZX(1ҹ@@ CCSKS K$@@@@@$58"ӾۉCtu4P58"js(yS  (A4A1ۃɉty u AC ue[^_]ÍvUE =Uuu0(4($=uJu8(<(&]ÍvUhjÐUE tHt !t  j1ÍvU(VSuy赣E XӃSV PuS聘tHt tFl vFpvFtv je[^]UWVS( ҋu}y.E H( yGB$PWSutHt !tFx vF|v jze[^_]ÍvUE =Uuu@(D(@=uJuH(L(B]ÍvUhjÐUE]ÉUWVS(E ]}uj}襞Y m؃qtـEub؅ۉYtAByPv؋BABQAB5؍BAAJ!ـEt‹BtӉ…u؍e[^_]ÍvUWVSEɋ] u}uCQA AS[^_]ÍvUEtQtABAM^ÉUEҋM t-;J uJtBAB R$ RuÍvUE =UuuP(T(D=uJuX(\(F]ÍvUhjÐUE@P$@ U EUMUAE RPAPQ5(̼ ÍvUE@(J PRQ$ÉUE(@ b]UE =Uuu`(d(H=uJuh(l(J]ÍvUhjÐU(yKvE @u1vÍvU塴(M yAu1#tQuDvÍvU(yÞvE @Њu1$vPt@TtTÐU塴(ylu ut@u1!H@t‰JLuÉUWVS(ҋ}y E H( Uy4FVEU苇E5UBfFƒ% ЉFME1ۅt-B$;uLJLJӃSWPM@AE@fFU(MyvS{ tTA(uICt@jsPCSQ58"jR蠘(C$(C HA(EM9M}F=e[^_]ÍvUWVS(yxE H( Uy^<EEEWB=:UUUBfGM9MEE1t3MB$;uǁǁEփVuZYsuƒt?(@B ـE@t"MCMZ EE@fGء(yMV~ tTA(uIFt@jvPFVP58"jRԖ(F$5(F HA(E܋U9U}G=]uMifo%EUƒ% Љe[^_]ÐUWVS(RWsvX(pphV1sV (P@C0S4ue[^_]ÍvUWVS }_`t)u SHtsWq u1^$u bPƃuޅt"v^$VWXZVWLue[^_]ÐUE遭UVS(u] y{vS  (y{‹tttt tuzuQF hSVP8e[^]É] ue[^]vUE =UuuȐ(̐(=uJuА(Ԑ(]ÍvUhjÐUWVMSu Y }1CC CsA QqA$A(A,A8A<A0A4A@ALAHADyP[^_]ÐUVSu VXZv,v(v$vh5 _(m v vvvvv h@5 _(m۸tCPvLvHvDh5 _(m^@ tv Sue[^]ÍvUWVSj4}] vƃ wPSVcG@tG@pG@FGDG9Fw@u0F @@ @F FF$GHe[^_]Ívt Viu h*( oUSR]S@ҋE 9BB$KDuKHHuKL tBAB R uCHuYKL~Rsjjs(ppQsjjjhjS SsP vf1]ÍvUE@@U t 9Ptu1]ÐUWVSVEx@EG E1Ҁ@O uyuy u yu$]E@ ɋu E_ u zvEu aKV9ѸP9ʸGK V 9Ѹ89ʸ/KV9Ѹ 9ʸKV9Ѹ19Hy ؉}؋?؋EY[^_]ÐUWVSRUr@EE 9FEEF @ ɋ} E^ uxEu aKW9ѸP9ʸGK W 9Ѹ89ʸ/KW9Ѹ 9ʸKW9Ѹ19Hyu6tM(݄>hEuuVDŽ>fjSV `E``Mye[^_]ÐUS]S< PP6$ $X6$XEE uC@Eu 1vBC<[@$ÍvUWVS4EP%j%PfUO%B P%BP%[`^@@@ @@@@@ @@h(PoMǁϻ?M1EЉUԋuEЁFVFFFVFFF G$ u GLPE P4L Pus`V!L$uuhuO+M U 4B409A|Oh5_(,B_Xh@u+ ]SE hjp0؃PR8U B0=q6$t(] R (VppQR$ E P0(yMvJGt  t $ƒ )Qjjfju u e[^_]ÐUWVS E P0L(ycMvzu uQtZE X0(y2MS{ A(Ct@jsPCSVE PPEPZt =w6$tu u$] M C449([0yvLS{ tTA(uICt@jsPCSQ58"jRG(C$(C HA(E @0(XpPE QP`I_ZPE`PQI$VShu(E X0( yKS{ tTA(uICt@jsPCSQ58"jR,G(C$(C HA(] C03<@uy` E @4jjfjPue[^_]ÐUWVSL( } uW0yJZÍGPPW;}PFxPF`PG4PsQt 14e[^_]ÍvUWVSE$P1IZYE 4P]SK U$P |$L$D$ u M$R,0tjSL_Xj$sL|U B4E~jSWL[^j$HLQ$S!M$RE xPE`PSjPu'jSLZYj$K1vM q0 (y[IvL(VyDI‰ ;%u0u& $(׋u u @M A0Xȃ4P\S:JXZE @0 EǂPSC[ZPE`P/C$WVhua"$jjfju u jGZYjEPGj\PG$+(G;jEPG h+(,; h+(;v h+(;v h+(:v h+(:jEPMG h ,(: h ,(:v h ,(:v h ,(:v h ,(:v;ve[^_]UWVSlEE ]P0L(yUDREE(y:D@uUȉUEEEEE|$`|$u M $@tgUEuEEEEE}Űu;Vdu F`9Eut} }u ŰE1;Pdu @`9Eut'RMQu jv0PR F0v}t E @8E 4uPFDUBMt u t $SC$EtC@C4C8*UC@ SDMuADC4ADC8AU @4P PR ~FM @4P PR _Z(ZrPE`P?$VShu ut9" 8P]BMSE$]E p0U uuM q0u1QH!R5(S^ E @0e[^_]ÉUWVSEuV](P} NE(@ݝxuWuG0Et1EE EEUEEEUEEEP]?tu`ߋE$PL(҉Ey@@ (ys@v4(y^@<Rhu5(3 FF Ehp`5(3FUB4GGL %CCǃǃǃǃ ǃ$|xutH=x6$t}GHPj E@HWjtu=݅xUZ4EpHu>݅x`4H6$Eu$UBHSjtu(]y>vS{ tTA(uICt@jsPCSQ58"jR:(C$(C HA(EjEP@JjEP@5jEP@$<,(Z4 h<,(K4vC5ve[^_]UWVS E P0L(y>vZǃUE u4U B4@z4<u`xB4=s6$t~utr (݆ih6$EuU$(ǃ BB B$}~Ɔ (A ]u :$E Py: PEu`Pf:$uuhu$jjfju u< e[^_]ÐUWVSL( u ]V0yZYPVEx3 PQEP3^ZuP`V{3$tphu$|;MR (4$pp|R(SE|6Cɍt  t $¡"W {Gz?P5`d݅`WɋE$uP5(Qj|x7'vjEPb7$|,(*+ve[^_]UWVSE P0L(y4ZRUPRt3u%h u5Y^h@ 5_('(EH@Uƒ P1Zpu1lX(pxt>< Ppl] Su1 PEj`Pc1$WVh uM$R (SpptR(EH@UPEP@@@@D@<U1UEx]ݝ`EEEXDžTPøDžLDž\?ML|0@|$`|$U$@tfMx1Dž|EUEE}XMAd19Eu A`9Eut }U0PP |$L$D$ uM$R,0tD d`fjSui݅`H6$ETݝ` DT`P``L`\jEP4e[^_]ÉjEP3 h,(m'g(vUWVSE P0L(y81B ۉS1$9UȍMp!1ې(PH4Eȋ0EE @ QRUUU۽xEEEEEEP F$ 9ۭxa8E1]E1{dMUEEu;K`uuuF|19Eu Fx9Eu#Eƀ$(Dh}DžpDžt𿉅hDžlDžxDž|޹󥋍$DH}DžPDžT𿉅HDžLDžXDž\󥡠(PM@$E u 󥉅ƹU B0Ѓ4PP+0M =(Y0t,G$(GGGG v jT*P(Y@@ @@@@@$BBBBB B$58"v'Gtu-vR58"jw)(y-W@4@<@$G G$P58"sRV'St BRPGw((St B RP(1SCKC SL(҉sCK[ y- (O y,$H$1EDžDžDž`󥍽Vh5( CC h5( CCfjPuOY[jPs.*jP[.$,(!v"ve[^_]UWVSL(,u y+vV (y+(ym+€=v6$?80@‹H XM1}E1;Od]ȉUEEu;_`uMA|19Eu Ax9EuE}uDžlDžpDžtDžxDž|EEEEEP*Yh^Hp5(_HDžLDžPDžTDžXDž\Z󥋕2(5(;(Dž,Dž0Dž4Dž8Dž<MAd19Eu A`9EutjEP+Y thPutXRPVl(MH E$(rrV}Q$jV^+tjEP=+=q6$t5MH E `P(rrEPuQ$ ?%ujEP*EUR} NjE@d19Au E@`9uR ƋuF|19Au Fx9uurr]9}h}vNjE@d19Bu E@`9uu vNj}G|19Bu Gx9utVuhPu]F9|jEP*pjP) h,(vjEP)$-(\ h-(Ov h-(?v h-(/v've[^_]UWVS1 ;} U}-ZփSu)tG,,;} 1e[^_]ÉUWVS|=t6$n] R4SEj  PuUSUPMR)]@ љB (#(j`6$EB]RQu ߹u }U B04MREUMQW'E$5EXEpu}`}Eč<u<`up+ uju<) (UyT%rWhu5( FF hu5( FFuuu(L(Uy$rFFdždždždž dž$U 1B49},]SBA] GC49dždžM (4Uy0$B%@E X4 (pxQ1,$SU|Rw! PSEPi!ZYPE`PZ!$WVh`"uMH E $P(rr]SEQ(jjfj|ujS%'vjEP%$<-(VOve[^_]UUWVSL(y#M Qt (y"vpE tuEElEEEEEEEEEEP"Y]^hpr5(_hDžlDžpDžtDžxDž|Z󥋍p1H5(XHDžLDžPDžTDžXDž\l]=(] t+G$(GGGG jTP(Y@@ @@@@@$BBBBB B$58"Gtu vR58"jw(y W@$@4@ h|-(/jEP$-( h-(vve[^_]UWVSL(yM Q $ (y(y‰ SCJH9‰Sh#u'_Xh#5_( (y<u V~ =A(Ft@jvPFVV58"jRU (B$(B  t|h $uxZYh`$5_(j (y] S{ A(FCt@jsPCSP XD ]ȋ EME̋EMDM (EEEEEEE@ rru}EEEEEEVWP =( ] t+G$(GGGG jTP(_@@ @@@@@$BBBBB B$58"jGtuvV58"jw(yWG @$@4@}]1VG,19Bu G(9uuZG19Bu G9uuC V PQS7^ZPG(P+$uuh)5_(Z1vVu,} EE0~NPC1EBE19Bu9utEMAMHENXue[^_]ÉUWVS,E]EE 8u=6$19}OF,VE܉U؋M Q}E19Bu F(9uu#E؋@19Bu F9uu C;]|ƍG99=6$U ZtxMA(yU@M YK;}A<[M9U <ryMBCM ;}~E1PSu uEۿ~MPE@1EBE19Bu E9utMAxEKXu}u UB@e[^_]ÐUVS] uuup(t()uux(|()u$uh)h((Q%u ujh((Q%e[^]UhjFÐUhj.ÐUU(yHÉUUE =Uuu((+=uJu((+]ÍvUhjÐUS]s $@CjPS5(q ]ÐUS]s "$& +P(+C$PS5(& ]ÉUS]s$?CjPS5( ]ÐUS]s $?CjPS5( ]ÐU (VSu] yvCpFPtxtPv (yvK{ tTB(uIStBjRPCKR58"jQ(C$(C vHB(e[^]ÐUS j&]SC Q%Cx@@ @@@@ @@@@ @@@@ @@C`R%CdCpR%[tǃR%ǃR%ǃR%ǃpR%ǃǃǃǃ ǃ$>E CXC\C`ChClǃLǃP#vjSU h`/(v]ÍvUWVS EEE E]uRjh0+sKu PUrXh3+h(31vWjh6+sujEpP4[^jEP1gv}>CEƸ<+ǹ8u!jj jsUBX1vB+Nju 8tM+Nju 8u-sh(‹EL1vY+Nju 8u8EQSjPFuE]E Ee[^_]vue+ 8u*sh(ƒ1}҉PvEU]E Ue[^_]e[^_]UVS u] j¡(@Fhp+ZZ tFhPFhVhBF\e[^]UE@hU t9Pu]ÍvUWVSu} ^hWVF\vt"9{utCBC S't9{u SV)ue[^_]UVSuVh(@]t0vB EÈ@srVDڅuӍe[^]UWVSj}] u¡(@Glx+Zr ZtGlPGlWlBe[^_]ÍvUE@lM Ut9Hu9P u  vu1]ÉUSEPl(@]t;BEE̋@stBCB Rڅuŋ]UEU UE UWVS( ҋuy-E H ( UyU<tttt tuuR)u Vx[XwPÃuQF h+u VP8OEp4V5C XZSV 9FXuu P vQF h+u VP8e[^_]ÐUWVSuEVP E @ZYpu5=(ut)G$(GGGG jTjX(1ҹ_@@ @@@@@$CCSKS K$58"GtuhS58"jw#(yFW@4@ƃu#Psh,5_(蕸$}Mq1EU]E Ue[^_]qe[^_]UVS] uu$uh,hؗ(J(`S%u ujhؗ((`S%\e[^]ÉUhjÐUhjnÐUTEPEPEPuuuuu u$EPEPEPu4u0u,u(u$u eEEmmEm0,,}fE% fEfEmm]EÍvUWVS4uE]V]E} S]YXMuu}dmXZVSY_Muu}ѿmȋE$XZVS.ME(e[^_]ÍvUWVP|$u u5,-Ƀ@-}fE% fEfEmm]Ee^_]ÍvU-m]ÉU-e]ÉU(@ - 7$z]E (-m0-z]E8-ـEu(-Eu-0-@-EuUWVpEE8U]|$u u}W]m؋EЋUƉ׃@%H-EـEu]H-E P-$赼$ݽuЉ}EM$蕼EكEt e^_]ÍvUWVp}؍uE]Ѝ|$u u X-E`-Ƀ@u1e^_]ÍvUVS] uuu((h-uu((j-u$uhl-h((S%u ujh((S%e[^]UhjFÐUhj.ÐUE@ P PR UE@ P PR US]SC `T% h6$h-SN!jS h/(v]ÍvUWVS EEE E]tKuFs-8u*sh(‹EP1e[^_]ËME]M Ee[^_]1USPE X4t<{(u. C8P PRXu C

݅݅EuDž vDžuZYu_XFTP PSR }u݅ Eu Dž@|$uȹu@1҅ B4t#tB4@4+vu.u$B4@4Dž@,t 5('256$tn6$R$Z‰P$$,$Z hX(۽x۽hݝ$ۭxۭhE[܅$ݝE 6$$Pe[^_]ÍvUVS] uuu( (0uu((0u$uh0h($( U%u$uh+0h((|4(U%u$uh>0h8(PD(T%u)u$ hH(!T($X(u ujhH(T($ u ujh8(D(T% u ujh((4(U%u ujh($( U%e[^]ÍvUhjBÐUhj*ÐUS]S,C @U%CU%C4C8C<C@CDCHCL]ÐUWVS EEE E]CEƸ 18U[޿ 18uE@(1v޿ 18uE@(1޿18uE@(1X ޿18uE@(1, ޿$18uE@(1 ޿/18uE@(1 ޿:18uE@(1ShD1$Ru[18u sh(‹EPD ua18u sh(D‹EP8 uj18u sh(‹EPL3Dž(  (((>8t8(>8t(>8u<~ 07$8(u j苦ttt tu @@+ttttDž$uD@$PV-HJyA(y=tUB8Cu-PxPu-QA-xAu-QxEu-QxFu-QxNu-PH25(je_H Xq5(Jg[^Hp5(2eZYHr 5(g?5$ۉݕݝݕݝL@<4L@4Uȉ0MEh C SP 94,CTP PR 狵Z? ?ݝCTP PR )? ?ݝ݅?E @,90CTP PR 狵襯? ?ݝCTP PR t? ?ݝ݅?E @u [E@,(@(?0?ٽfff% fdfd٭d٭f ݝXUB0 Lq$ H݅Xrq(04$u h >p9mp (@(?0?ٽdfd% ffff٭f٭d ݝXMA0 Dr8r@rDrp+l쀋MQ0ztyV8$ HqLqHqLq(uu(ppu h>rkP t it it it iie[^_]ÉUS]C u s$s s4SP<C0P PR ]ÉUWVS8UB u r$r r4RPU3E  (E؋uؿ>8t2uؿ>8tuؿ>8uM~ 07$E܃35(^ZYs5(`YXs5(^EXZs 5(n`EЃME-HJyA(ylvU B8Cu-UxPu-QA-xAu-QxEu-QxFu-QxNu-QEP0uQjuuWVsMqsqup$p (ppjhh>rhUDB0P PR$t Vft Wf}ԅt ufuЅt ufMA(yokvM Q E x txA(uSM At@jqPE @PS58"jRfU (B$(B HA(Q@ uu MqP e[^_]ÉUVS] uuu|((8?uu((:?u$uh;CxuCvM tFU  VcKe[^_]ÍvUS]St ?@]ÉUVSPu] SuVt1vSVe[^]ÉUWVSuu }Wdu1N1ۋ76tvu Ut;7u v;wu_^ VbO؍e[^_]ÍvUWVS Eۋ} utsWփtC vu1e[^_]UWVS }E7tWvu Ut<;7u U;wuEG F6PU$0bO뭉u6릐e[^_]UE =Uuu((?=uJu((?]ÍvUhjÐUEP R jp R<UEP R jp R<UE M19]UWVS$j(uVdgF ^%F`VXB@@ @@r V|@@ @@F^%FX^%BF|^%r $E$莱EX%x@E$kEx@$P{C<$8@%dždž @ E$0dž4dž8@E$ݰ F0dždž@dždždždždždždžPh?V藠 uh?Vf uh?VU Wh?Vʢ Ph?V Ph?VԞ uh?V菢 <Ph?V讞 DPh@V虞 LPh@V脞 TPh@Vo uh@V* \Ph @VI dPh*@V蜟 Ph8@V xPh?@V  PhF@V] PhS@VH Phf@V348pthlBjP+ h2(WjV3f h2(WXve[^_]UVSu ] F ^%F^%VYXjPXZjVetue[^]r]e[^]ÐUWVST7$,]u }tXQ0W VRP 48pthlǃ<ǃ@T7$݃4uЉ}E݃DɃ  0}$RP mـEu @݃<܋D݃L݃T܋4ʃ ݛ<$RP dtE݃܋huЉ}Eݛh݃x܋pݛp 84hp@O e[^_]ÐUSQ]t&(PJC PMO ǃ( pph@BO(P@SW]]USR]t"(PJC PN]ÍvUS(pp]h@NCX xu PxyC|xu Pcy(@ݓܣ$h@BN ]ÍvUWVS E E}E]E@EƸ@8u S<1u@8u S1u@8uR C SP`1`}u>Ep@ 8u!jj jMqtUY^PSk 1vEMEM ]e[^_]%be[^_]UWVS uE@4(tU BRP Y[Pum ulǃl(y\]ìwƋC@SPSR CFUFFF t4 UBRP FGt@jwPEG UB0F(y \WE BPUB@ jWrP $pX]ìS(J RPH @h^ PEPzsh@EKe[^_]UWVS(pph Au} xKl( y;[v_ËCttjt3VXZ3VWt BRP 1~VFTtO_t CSP ƒFT1Q@ SRvTP !SVs6h@A5_(gN(yZO tTB(uIWtBjRPGOP58"jQV(G$=(G vHB(e[^_]UWVS} Eء(P@7uhuAEUEJ h^ ]SPÃt2RhAICXm$V$Uu)S84RP QWjVit Vmt;| Ve[^_]ÍvUE UuHu UPÉUS0(pp]hAHjjSt SZvu+CTt QP jEPsTR$t0RPuQ9}Rjs0SR݃ـE@t $RP ؋dt݃p݃h܋݃u9"݃\Ƀ P}]^XMmYCX$PYs؋]ÐUS(pp]hAG݃ ݃4P $ۃXu_݃ـE@tك $RP Y݃ ɋ$PR ,؃ (pphAF ݃\ @B܃ ǃ($pph BF84C|Pq]ÉUE MP19Q]ÉUSS](3hHB/F]]PRUSP](C܂(È@sTPBHRPQ {t/ (3h`B(E C]ÉUVS(uP 9ӋH@f9[9tW)ڃ~W(PBHRPQ ~t. (ShB( E Fe[^]ÍvUVS(] Pu@MEEEU(( (5((tKt%hm  hpn P5(hBqDshBODhm Ehm PS shBD(1e[^]UE@]ÐUS]݃ܳǃǃ$RP ݃\ HCY܃$(pphCChp P h CWC 84|Sn]ÍvUWVS]C4)} Scơl(yRN:BB BB(yRvD PC@ jVsP WhPCB e[^_]ÍvUS]U A9~B`9uR9}9~D9u.@9uǃǃB9} 9}$ÐUS ]M PQPR ]]vUS]S 3hjCh(]UVS] uuu(ę(rCuuș(̙(tCu.u)RjhvChЙ( ܙ(_%(l(u$uhCh(蚂(^%u ujh((^%謂u ujhЙ(ܙ($脂e[^]ÉUhjÐUhjÐUUM BA8B AC+C EGsu htE>uuhvE=e[^_]ÉUE1ɅtB+B Ru]ÐUWVS]h=ƃEv ss hEuW]>)E }1Y1у Q4=XZVWIAt V>1э|EvNj[we[^_]ÐUWVS]EUMuC4S8K< CC8`%C@C V} P@Y^W S@e[^_]US]SC _%C8 /%J@H@ @@u҃ǃ(ǃ,ǃ0C$u P@ vJyPC PhES+vC S%jS.p$3(*8#9v]ÍvUhE5_(5EsUE@E+vUVS0Mɋ]u E E `%EC$PEP:?,~)0B0U苃0,0 ECDEC MȉECRP QV]PR$EH$CRP QVPR$Q<+A8tAjQP1;vA4@TDA4@D8P S Pv EH$h83(6e[^]ÐUWVSEX޿E8uOPPEp5(RU(;Mq2hEh( 0޿F8E((pphFS<1у;u \ }3U4Sa=M<1э\  FC;u | CV)SPU(:`V޿F 8uCjj jMq7 ~h F5_(2U,1vSuu u%e[^_]ÐUWVSUBp 5(0É$(pphGFV; t S91WEPu LQ@1U(t Q1IQV(_e[^_]US]s ,C @84SY]ÍvUS u ]S C @_% /%vJ@H@ u j$F:P@_%X  tBB BBPhSFSz xPh\FSz |PhmFS6y PhyFSz PhFStz hPhFS_z lPhFSx1 DŽCHDŽCLDŽ`DŽ8DŽCDŽCDŽCDŽCDŽ@Jyǃǃ8ǃ<ǃ@ǃDǃ{Gǃz?ǃǃ+vC S%jSj$H3(23v]ÍvUVS]u C @_%t$Pt PV 8C S%jSit]e[^]7e[^]ÐUWVS ]hCp 5( -ZYNjCp 5(.^XSW(pphFV7 t S6t W61SEPэLu Q- VhF5_(.e[^_]ÉUWVS]Cp 5(P,Y^NjCp 5(7.XZSW(pphFV97 t SY5t WI51WEPэLu Q, VhF5_(-e[^_]ÍvUS]sBPt PT]ÐU UWVS\}G Wݕܲݝ݂4ݝ(@ݝuLJ`SܵݝDžݝDž1ۉ`Ht/&du@Ph@GW< ~F89`uhcGWRju W^XhGW t݅R HK,$È@Zs݅P݅ $ PKXEt݇HusLJ8LJ`LJLJ݅ݗ@ݟ8$hGW<HuRPR؉'vtP$݅XE>P݅ܥ $XɀÈ@ڍr݅HD@KSVQW $ShGWDDŽ`t0P݅ $݅$,$XʀÈ@ڍr݅ݝPVW)݅EuSHSW ݅كEu.u%\$SjW ZY$h@HWM ؋uDLJ`LJ8pt PPhHW tP$݅Xt݇H1Dž< Dž݅9`7$P(tP݅ $1X݄HEu=G ݄@È@s~ J>29|DžDžݕݝ1 DDDŽHDŽLKyy1;ݝ}_uSWAt P݅ $XC܅;ݝ|PHPW ݅Ẽ@;H}1;ݝ}cHSWt P݅ $XC܅;ݝ|VHPW ݅Ẽ@s9H9|hHW9~9r;,u(tWP$ XݚSHP tP݅ $ڇXw ٽFfF% fDfD٭D٭Fݝ8݅8ٽ44ƅ5 ٭44۝0٭4I0W X89S  S W S@,9C Ɓ`>Qu Wa >݇lڏtC w HKٽDfD% fFfF٭F٭Dݝ8݅8ٽ44ƅ5 ٭44۝0٭4݇lG ڏtCP4$0XٽDfD% fFfF٭F٭Dݝ8݅8ٽ44ƅ5 ٭44۝0٭40W ;@~X@RPWDžDž Dž/%DžaHDž 9tP݅ $XEuVu Wht@ DŽϘDŽϜh IW ݅݅È@s4SHPW݅EuDž Džui1;\1Ґ݄HDt,G ݄@È@ۍSC;|1ۋ9Dž1Dž@PHPW݅uo݄.HD.EtD:Eu/݄7HG ݄7@È@sۍSQRC;}&uJPh`IWu:VSHPWZY$hIW? ue1;}[1ҍv݄H݄HـEu*G ݄@È@s ۍSC;|VHPWV[$hJW0݄HEu ؋9 P݅ $XEuQR݅u  (Ah7$ـEtPP(yF݅t9`7$݅Et!Ph(W݅t܅݅Ph7$,$ݝ݅XـÈ@s$hnJWA؃h(h@(W0 (@K~Y݅ڏtXK1ҋܢ@(ݒ(Euǂ(ǂ(K݅È@p7$r2Sh@(WuQh(WttRhJW1, ;}=1v((SD(@(ShJWC ;݅;P(`7$Dž(5p7$݂(EudO ݄HQ$݄@È@YsVQ$$ـEYudž(dž(PR/vFAp7$u ;YQju Wh KW1e[^_]UUS19ӋM }'E@t 1vC9ظ$ÍvUU 19ЋM}v@9]ÉUWVSEu ~&E@MD,;DDEWHPVQ]E E `%EE$PEP9%E‹ME؍RDDEA EAP SVMPR$PH<ȋP+C8C@t/ EpUB20h`Kh(szuuU]C MVEQUEPp4EEE/%SMU)Ѓ~#PC4@]TDPB4@LHPPAjQ]C EPxRMEPp4DžxDž|E/%SIMU)Ѓ~(PC4@]TDPB4@LHQRhK5_(DžTM9T}@]8 ss ThK5_(iTE 9TPtPBjRPEH$1qPC8SE(E ƀ@(.@Pu$Eu EPEu@PEEPu EpH66h@(E(h(EPu$Eu EPuEuEPu ^0UJHEM!9MUaE(@E}~ UƂ>(sM]uƁ?(dM(M<3°.(ЋU ҈@(tDh@(h(uE u$UM@PDPuUuDPu 0v APu$EjEP31EP1JEPEEPu Mt HE+E0~o]C;]fEDUM(E|4E@9~Ɔ?(sh@(h(VE u$PWuuuƆ@(du C0EGF;]~EEE9Ee[^_]US]SXZjS]ÉUVS ]u S$jjjjjjVS _(E0e[^]4UVSu V7F a%F5($cǀF1һ@FNAB~ hÃǃ1ɺDHDJyFXHF @hÃǃ1ɺDHDJyF@HXPF@H @ hqÃǃ1ɺvDHDJyF@HXHF@H @hÃǃ1ɺvDHDJyF@H@HXPF@H@H @ hÃǃ1ɺDHDJyF@H@HXTF@H@H @h_Ãǃ1ɺDHDJyF@H@HXXF@H@H @hÃǃ1ɺDHDJyF@H@HXHF@H@H @hÃǃ1ɺDHDJyF@H@H@HXPF@H@H@H @ hEÃǃ1ɺvDHDJyF@H@H@HXTF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXXF@H@H@H @h}Ãǃ1ɺvDHDJyF@H@H@HX\F@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HX`F@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXdF@H@H@H @ hQÃǃ1ɺvDHDJyF@H@H@HXhF@H@H@H @$hÃǃ1ɺvDHDJyF@H@H@HXHF@H@H@H @hÃǃ1ɺvDHDJyDF@H@H@H@HJyF@H@H@H@HB ~F@H@H@H@HB~ hÃǃ1ɺDHDJyFXLF@@HXLF@H@@PXHFPHBP@BHXLF@H@H@@PXHF@H@H@P@ h/Ãǃ1ɺDHDJyF@LXHF@L @hÃǃ1ɺvDHDJyF@L@HXHF@L@H @h{Ãǃ1ɺDHDJyF@L@H@HXHF@L@H@H @hÃǃ1ɺvDHDJyF@L@H@H@HXHF@L@H@H@H @hÃǃ1ɺDHDJyF@L@H@H@H@HXHF@L@H@H@H@H @hAÃǃ1ɺvDHDJyF@L@H@H@H@H@HXHF@L@H@H@H@H@H @hÃǃ1ɺDHDJyF@L@H@H@H@H@H@HXHF@L@H@H@H@H@H@H @hQÃǃ1ɺvDHDJyF@L@H@H@H@H@H@H@HXHF@L@H@H@H@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@TXHF@HPHBT@BXXHF@H@H@X@ hTÃǃ1ɺDHDJyF@H@H@T@HXHF@H@H@T@H @hÃǃ1ɺDHDJyF@H@H@T@H@HXHF@H@H@T@H@H @h}Ãǃ1ɺvDHDJyF@H@H@T@H@H@HXHF@H@H@T@H@H@H @hÃǃ1ɺDHDJyF@H@H@T@H@H@H@HXHF@H@H@T@H@H@H@H @hÃǃ1ɺvDHDJyF@H@H@T@H@H@H@H@HXHF@H@H@T@H@H@H@H@H @h Ãǃ1ɺDHDJyF@H@H@T@H@H@H@H@H@HXHF@H@H@T@H@H@H@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXLF@H@H@H@@PXHF@H@H@H@P@ hÃǃ1ɺvDHDJyF@H@H@H@LXHF@H@H@H@L @hÃǃ1ɺDHDJyF@H@H@H@L@HXHF@H@H@H@L@H @h-Ãǃ1ɺvDHDJyF@H@H@H@L@H@HXHF@H@H@H@L@H@H @hÃǃ1ɺDHDJyF@H@H@H@L@H@H@HXHF@H@H@H@L@H@H@H @h=Ãǃ1ɺvDHDJyF@H@H@H@L@H@H@H@HXHF@H@H@H@L@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@TXHF@H@HPHBT@BXXHF@H@H@H@X@ h7Ãǃ1ɺDHDJyF@H@H@H@T@HXHF@H@H@H@T@H @hÃǃ1ɺvDHDJyF@H@H@H@T@H@HXHF@H@H@H@T@H@H @hSÃǃ1ɺDHDJyF@H@H@H@T@H@H@HXHF@H@H@H@T@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@T@H@H@H@HXHF@H@H@H@T@H@H@H@H @hWÃǃ1ɺDHDJyF@H@H@H@\XHF@H@HPHB\@B`XHF@H@H@H@`@ hÃǃ1ɺDHDJyF@H@H@H@\@HXHF@H@H@H@\@H @heÃǃ1ɺvDHDJyF@H@H@H@\@H@HXHF@H@H@H@\@H@H @hÃǃ1ɺDHDJyF@H@H@H@\@H@H@HXHF@H@H@H@\@H@H@H @huÃǃ1ɺvDHDJyF@H@H@H@dXHF@H@HPHBd@BhXHF@H@H@H@h@ hÃǃ1ɺDHDJyF@H@H@H@d@HXHF@H@H@H@d@H @hÃǃ1ɺvDHDJyF@H@H@H@d@H@HXHF@H@H@H@d@H@H@*F a%jVz!$3(vove[^]ÐUVSu V'!F @a%F5($ǀF1һ@FNAB~ hfÃǃ1ɺDHDJyFXHF @hÃǃ1ɺDHDJyF@HXPF@H @ hÃǃ1ɺvDHDJyF@HXHF@H @hiÃǃ1ɺvDHDJyF@H@HXPF@H@H @ h Ãǃ1ɺDHDJyF@H@HXTF@H@H @hÃǃ1ɺDHDJyF@H@HXXF@H@H @hSÃǃ1ɺDHDJyF@H@HXHF@H@H @hÃǃ1ɺDHDJyF@H@H@HXTF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXXF@H@H@H @h1Ãǃ1ɺvDHDJyF@H@H@HX\F@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HX`F@H@H@H @hiÃǃ1ɺvDHDJyF@H@H@H@`XHF@H@H@H@` @hÃǃ1ɺDHDJyF@H@H@HXdF@H@H@H @ hÃǃ1ɺvDHDJyF@H@H@HXhF@H@H@H @$h9Ãǃ1ɺvDHDJyF@H@H@HXHF@H@H@H @hÃǃ1ɺvDHDJyDF@H@H@H@HJyF@H@H@H@HB ~F@H@H@H@HB~ h"Ãǃ1ɺDHDJyFXLF@@HXLF@H@@PXHF@H@P@ hÃǃ1ɺDHDJyF@LXHVBL@BH@HXLF@H@H@@PXHF@H@H@P@ h#Ãǃ1ɺDHDJyF@L@HXHF@L@H @hÃǃ1ɺDHDJyF@L@H@HXHF@L@H@H @heÃǃ1ɺvDHDJyF@L@H@H@HXHF@L@H@H@H @hÃǃ1ɺDHDJyF@L@H@H@H@HXHF@L@H@H@H@H @hÃǃ1ɺvDHDJyF@L@H@H@H@H@HXHF@L@H@H@H@H@H @hÃǃ1ɺDHDJyF@L@H@H@H@H@H@HXHF@L@H@H@H@H@H@H @hÃǃ1ɺvDHDJyF@L@H@H@H@H@H@H@HXHF@L@H@H@H@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@TXHF@HPHBT@BXXHF@H@H@X@ hÃǃ1ɺDHDJyF@H@H@T@HXHF@H@H@T@H @h7Ãǃ1ɺDHDJyF@H@H@T@H@HXHF@H@H@T@H@H @hÃǃ1ɺvDHDJyF@H@H@T@H@H@HXHF@H@H@T@H@H@H @hSÃǃ1ɺDHDJyF@H@H@T@H@H@H@HXHF@H@H@T@H@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXLF@H@H@HXP@F@H@H@H@  h_Ãǃ1ɺDHDJyF@H@H@H@LXHF@H@H@H@L @hÃǃ1ɺDHDJyF@H@H@H@L@HXHF@H@H@H@L@H @hÃǃ1ɺvDHDJyF@H@H@H@L@H@HXHF@H@H@H@L@H@H @hÃǃ1ɺDHDJyF@H@H@H@TXHF@H@HPHBT@BXXHF@H@H@H@X@ hÃǃ1ɺDHDJyF@H@H@H@T@HXHF@H@H@H@T@H @h!Ãǃ1ɺvDHDJyF@H@H@H@T@H@HXHF@H@H@H@T@H@H @hÃǃ1ɺDHDJyF@H@H@H@T@H@H@HXHF@H@H@H@T@H@H@H @h1Ãǃ1ɺvDHDJyF@H@H@H@\XHF@H@H@H@\ @hÃǃ1ɺDHDJyF@H@H@H@\@HXHF@H@HPHB\@H@B`@HXHF@H@H@H@`@H@ h7Ãǃ1ɺDHDJyF@H@H@H@\@H@HXHF@H@H@H@\@H@H @hÃǃ1ɺDHDJyF@H@H@H@dXHF@H@HPHBd@BhXHF@H@H@H@h@*F a%jV$3(ve[^]ÐUVSu V[F a%F5($ǀF1һ@FNAB~ hÃǃ1ɺDHDJyFXHF @hKÃǃ1ɺDHDJyF@HXPF@H @ hÃǃ1ɺvDHDJyF@HXHF@H @hÃǃ1ɺvDHDJyF@H@HXPF@H@H @ h?Ãǃ1ɺDHDJyF@H@HXTF@H@H @hÃǃ1ɺDHDJyF@H@HXHF@H@H @hÃǃ1ɺDHDJyF@H@H@HXPF@H@H@H @ h%Ãǃ1ɺvDHDJyF@H@H@HXTF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXXF@H@H@H @h]Ãǃ1ɺvDHDJyF@H@H@HX\F@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXHF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@HXPF@H@H@H@H @ h+Ãǃ1ɺDHDJyF@H@H@H@HXTF@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@HXXF@H@H@H@H @h[Ãǃ1ɺDHDJyF@H@H@H@HX\F@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@HX`F@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@HXdF@H@H@H@H @ h#Ãǃ1ɺDHDJyF@H@H@H@HXhF@H@H@H@H @$hÃǃ1ɺDHDJyF@H@H@H@HXHF@H@H@H@H @hSÃǃ1ɺDHDJyD F@H@H@H@H@HJyF@H@H@H@H@HB ~F@H@H@H@H@H B ~ hÃǃ1ɺDHDJyFXLF@@HXLF@H@@PXHFPHBP@BHXLF@H@H@@PXHF@HPHBP@BTXHF@HPHBT@BHXLF@H@H@H@ hÃǃ1ɺvDHDJyF@LXHF@L @hiÃǃ1ɺvDHDJyF@L@HXHF@L@H @h Ãǃ1ɺDHDJyF@L@H@HXHF@L@H@H @hÃǃ1ɺvDHDJyF@L@H@H@HXHF@L@H@H@H @h?Ãǃ1ɺDHDJyF@L@H@H@H@HXHF@L@H@H@H@H @hÃǃ1ɺvDHDJyF@L@H@H@H@H@HXHF@L@H@H@H@H@H @h[Ãǃ1ɺDHDJyF@L@H@H@H@H@H@HXHF@L@H@H@H@H@H@H @hÃǃ1ɺvDHDJyF@L@H@H@H@H@H@H@HXHF@L@H@H@H@H@H@H@H @h_Ãǃ1ɺDHDJyF@L@H@H@H@H@H@H@H@HXHF@L@H@H@H@H@H@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@PXHF@H@HPHBP@BTXHF@H@HPHBT@BXXHF@H@HPHBX@B\XHF@H@H@H@\ @hÃǃ1ɺDHDJyF@H@H@H@T@HXHF@H@H@H@T@H @hÃǃ1ɺvDHDJyF@H@H@H@T@H@HXHF@H@H@H@T@H@H @h7Ãǃ1ɺDHDJyF@H@H@H@T@H@H@HXHF@H@H@H@T@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@T@H@H@H@HXHF@H@H@H@T@H@H@H@H @h;Ãǃ1ɺDHDJyF@H@H@H@T@H@H@H@H@HXHF@H@H@H@T@H@H@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@T@H@H@H@H@H@HXHF@H@H@H@T@H@H@H@H@H@H @h'Ãǃ1ɺDHDJyF@H@H@H@HXLF@H@H@H@H@@PXHF@H@H@HPHBP@BTXHF@H@H@H@H@T@ hÃǃ1ɺvDHDJyF@H@H@H@H@LXHF@H@H@H@H@L @hÃǃ1ɺvDHDJyF@H@H@H@H@L@HXHF@H@H@H@H@L@H @hÃǃ1ɺDHDJyF@H@H@H@H@L@H@HXHF@H@H@H@H@L@H@H @h!Ãǃ1ɺvDHDJyF@H@H@H@H@L@H@H@HXHF@H@H@H@H@L@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@H@XXHF@H@H@HPHBX@B\XHF@H@H@HPHB\@B`XHF@H@H@HPHB`@BdXHF@H@H@H@H@d@ hÃǃ1ɺDHDJyF@H@H@H@H@X@HXHF@H@H@H@H@X@H @h_Ãǃ1ɺDHDJyF@H@H@H@H@X@H@HXHF@H@H@H@H@X@H@H @hÃǃ1ɺvDHDJyF@H@H@H@H@X@H@H@HXHF@H@H@H@H@X@H@H@H @hcÃǃ1ɺDHDJyF@H@H@H@H@hXHF@H@H@H@H@h @hÃǃ1ɺvDHDJyF@H@H@H@H@h@HXHF@H@H@H@H@h@H@*F a%jV$3(ve[^]ÐUVSu VF `%F5($'ǀF1һ@FNAB~ hÃǃ1ɺDHDJyFXHF @hÃǃ1ɺDHDJyF@HXPF@H @ h5Ãǃ1ɺvDHDJyF@HXHF@H @hÃǃ1ɺvDHDJyF@H@HXPF@H@H @ hÃǃ1ɺDHDJyF@H@HXTF@H@H @h#Ãǃ1ɺDHDJyF@H@HXHF@H@H @hÃǃ1ɺDHDJyF@H@H@HXPF@H@H@H @ heÃǃ1ɺvDHDJyF@H@H@HXTF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HXXF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@HX\F@H@H@H @h9Ãǃ1ɺvDHDJyF@H@H@H@PXHF@H@HPHBP@BXXHF@H@H@H@X@ hÃǃ1ɺDHDJyF@H@H@H@TXHF@H@HPHBT@B\XHF@H@H@H@\@ h/Ãǃ1ɺDHDJyF@H@H@HXHF@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@HXPF@H@H@H@H @ hcÃǃ1ɺDHDJyF@H@H@H@HXTF@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@H@PXHF@H@H@HPHBP@BTXHF@H@H@H@H@T@ hnÃǃ1ɺDHDJyF@H@H@H@HXXF@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@H@HX\F@H@H@H@H @h蟾Ãǃ1ɺDHDJyF@H@H@H@HX`F@H@H@H@H @h7Ãǃ1ɺDHDJyF@H@H@H@HXdF@H@H@H@H @ hϽÃǃ1ɺDHDJyF@H@H@H@HXhF@H@H@H@H @$hgÃǃ1ɺDHDJyF@H@H@H@HXHF@H@H@H@H @hÃǃ1ɺDHDJyD F@H@H@H@H@HJyF@H@H@H@H@HB ~F@H@H@H@H@H B ~ hFÃǃ1ɺDHDJyFXLF@@HXLF@H@@PXHFPHBP@BHXLF@H@H@@PXHF@H@H@P@ h蟻Ãǃ1ɺDHDJyF@LXHF@L @hIÃǃ1ɺvDHDJyF@L@HXHF@L@H @hÃǃ1ɺDHDJyF@L@H@HXHF@L@H@H @h艺Ãǃ1ɺvDHDJyF@L@H@H@HXHF@L@H@H@H @hÃǃ1ɺDHDJyF@L@H@H@H@HXHF@L@H@H@H@H @h豹Ãǃ1ɺvDHDJyF@L@H@H@H@H@HXHF@L@H@H@H@H@H @h;Ãǃ1ɺDHDJyF@L@H@H@H@H@H@HXHF@L@H@H@H@H@H@H @hÃǃ1ɺvDHDJyF@L@H@H@H@H@H@H@HXHF@L@H@H@H@H@H@H@H @h?Ãǃ1ɺDHDJyF@L@H@H@H@H@H@H@H@HXHF@L@H@H@H@H@H@H@H@H @h蹷Ãǃ1ɺvDHDJyF@H@H@TXHF@HPHBT@BHXLF@H@H@H@ h<Ãǃ1ɺDHDJyF@H@H@T@HXHF@H@H@T@H @hӶÃǃ1ɺDHDJyF@H@H@T@H@HXHF@H@H@T@H@H @heÃǃ1ɺvDHDJyF@H@H@T@H@H@HXHF@H@H@T@H@H@H @hÃǃ1ɺDHDJyF@H@H@T@H@H@H@HXHF@H@H@T@H@H@H@H @huÃǃ1ɺvDHDJyF@H@H@T@H@H@H@H@HXHF@H@H@T@H@H@H@H@H @hÃǃ1ɺDHDJyF@H@H@T@H@H@H@H@H@HXHF@H@H@T@H@H@H@H@H@H @hmÃǃ1ɺvDHDJyF@H@H@H@P@HXHF@H@HPHBP@H@BT@HXHF@H@H@H@T@H@ h۳Ãǃ1ɺDHDJyF@H@H@H@P@H@HXHF@H@H@H@P@H@H @hgÃǃ1ɺDHDJyF@H@H@H@P@H@H@HXHF@H@H@H@P@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@P@H@H@H@HXHF@H@H@H@P@H@H@H@H @hkÃǃ1ɺDHDJyF@H@H@H@P@H@H@H@H@HXHF@H@H@H@P@H@H@H@H@H @hÃǃ1ɺvDHDJyF@H@H@H@HXLF@H@H@H@H @h{Ãǃ1ɺDHDJyF@H@H@H@H@LXHF@H@H@HPHBL@BP@HXHF@H@H@H@H@P@H@ hÃǃ1ɺDHDJyF@H@H@H@H@L@HXHF@H@H@H@H@L@H @hsÃǃ1ɺDHDJyF@H@H@H@H@XXHF@H@H@HPHBX@B\XHF@H@H@HPHB\@B`XHF@H@H@HPHB`@BdXHF@H@H@H@H@d@ h訯Ãǃ1ɺDHDJyF@H@H@H@H@X@HXHF@H@H@H@H@X@H @h3Ãǃ1ɺDHDJyF@H@H@H@H@X@H@HXHF@H@H@H@H@X@H@H @h蹮Ãǃ1ɺvDHDJyF@H@H@H@H@hXHF@H@H@H@H@h@(F a%jV$4(趧诨ve[^]ÐUVS] uu$uhPh(VȜ(`b%u$uh+Ph̜(*؜(@b%u$uh7Phܜ(( b%u$uhGPh((b%u ujh((b%u ujhܜ(( b%u ujh̜(؜(@b%u ujh(Ȝ(`b%le[^]ÉUhjÐUhjrÐUS j]S^CxSpCXC\CdChCl@B@ @@C f%C@g%C`CpPg%Z ǃC0]ÉUSR]u6C`PKd@9t%CX Cp$PǃIC`ǃShSdDHu hQ薨$ C`SD]UUE BlvUUE BlvUUWVS ]Cd1K`;9sh}1SlB9}*vFVSeGK`;9}SlB9|SlB9u]e[^_]v9CdTHus8h@Q覧$DuS`\uQs\sXCpvuCX QCp$PoB hQCEe[^_]鍨RhQ$re[^_]UUJdɋE t hR$<+BhBdBlÐUSSUZp{u(xH RPQ$C]ÐUS]S(҉yܬQE BPC@ jQsP ]ÍvUS(Q] y袬K{ tTB(uIStBjRPCKR58"jQ*(C$(C vHB(]ÍvUWVS EEE E]CEƸ5Rǹ8uQjjs腞EXX1 9RNju8ujj js_Z.ARNju 8u jj jsʣ[^Pu1uKR 8ufjj js萣vePEp`٠1Q}u.sWR8u }w`肠1}E]E }e[^_]e[^_]UE@ EGvUS]SC f%Cf%C0X(Z@C`S5(1C f%C@g%jS$4(SvKv]ÍvUS]S C e%Cf%C0YX(@C`S5(1C f%C@g%jS胮$4(ןvϠv]ÍvUS]SC d%C`e%C0Z(Y@C`S5(1C f%C@g%jS$4([vSv]ÍvUS]S(C @d%Cd%C0X(Z@C`S5(1C f%C@g%jS苭$4(ߞvןv]ÍvUS j]SC c%C d%C0(]ÐUVS ]Su 蔸 SR jPsR (yYN~ tTB(uIVtBjRPFNS58"jQ(F$5(F vHB(e[^]ÐUS]S ClSd@@ B@@C b%C`c%Cdpc%Z C0(C\C`?]ÉUVS]Cdxu tRs`s\P$ Pg$c SR jPsR (y(N~ tTB(uIVtBjRPFNP58"jQ貢(F$5(F vHB(e[^]ÐUS]Sȶ SR jPsR ]ÉUE@ EvUS]SC b%Cb%C (]ÐUWVS EX (u y(VE (yۍ<t%G9B8uEp3[uܡ(y֥N~ tTB(uIVtBjRPFNS58"jQ^(F$5(F vHB(e[^_]UVSu ] jV PF e[^]ÉUVS] uuu((]Ruu( (_Ru$uhaRh((@h%u$uhwRh (,( h%u$uhRh0(d<(h%u$uhRh@(8L(g%u$uhRhP( \(g%u$uhRh`(l(g%u$uhRhp(|(g%u ujhp(|(g%u ujh`(l(g%u ujhP(\(g%vu ujh@(L(g%Nu ujh0(<(h%&u ujh (,( h%u ujh((@h%e[^]UhjNÐUhj6ÐUVSu] v  TS $ T[$Ve[^]ÍvUVSu] v  TS $ T[$V葽e[^]ÍvUWVST(y蹡U B@MDxE"U쐡(Et,U@$(BBBB jTڝX(1ҹ^@@ @KK$@@@@$CCSS 58"EvMɉAtuԠS58"j]s茜(y诠v}W@4@jj4WweM(pP@9E T9D9D9 e[^_]ÉUWVS puE?T> (y*BEp4H1tjjt> V^<~t> VrD> !@Ep4v H1Mde[^_]UWVS]UE1҃ ȋu| +DEuىUB ?~؋U܍R< uT( 7y#vZ (ҍy v t @t]TdRtdMQXUEUEEtjj47S(7y蟒vS{ ttA(uiCt@jsPCSW58"jR$(C$(C %ء(Pu@D1E T1/HA(U܍R( J]Ru TLt e[^_]ÐUWVSEuEؿ E?T> $T(y讑(Jۍy藑v (y腑 @t t T0dRt0du؊UUUE҉Etjjt> V(D>hUEu{(\> yS{ tTA(uICt@jsPCSP58"jR舌(C$(C HA(D> Me[^_]USS]<t(R0EQPu r<@0P $R ]ÐUWVS}P言_X Ss0Ny W}e[^_]vUWVS p}E?\7 7D7D>tq(y諏vS{ tTA(uICt@jsPCSP58"jR0(C$(C HA(D7 M\e[^_]UWVS ?E\0 D0D0tq(yvS{ tTA(uICt@jsPCSQ58"jRt(C$(C HA(ED0 O_e[^_]ÍvUVS] uuu((Uuu((Uu1u,PhhUh(!(@i%(T(u$uh Vh(诿( i%u ujh(( i%u ujh(($虿e[^]ÍvUhjÐUhjÐUE@ E vUE@ EC vUS]S`C i%Cj%XZ jPbkƃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ ǃ2C `h%Ch%jSߐ$5(3v+v]ÍvUWVS E ET(uyUZÉpp pW|tEE ue[^_]uSW| uG;uBW SO}tUU ue[^_]'vWS:}EE ue[^_]UWVST( }] y'vKM5(y E싂Et1Ht] }e[^_]JEx4u du#PURD8XP(y{vK{ B(StBjRPCKWUEx4uskvyvU{ tQB(uFStBjRPCKV58"jQ装(C$(C HB(e[^_]UWVST(}u y藉vNMEE(yvE싀EEEH $Vvu }e[^_] hV趂(y N~ tTB(uIVtBjRPFNR58"jQ蒄(F$5(F vHB( j蚃u }e[^_]{4u (PUMID8XP} hVԁ(y'vN~ tTB(uIVtBjRPFNS58"jQ讃(F$5(F vHB( j趂u }e[^_] j&@@@ 0n%MQMQ PURщU`_P Mqu5(4ELPuT8xtM jUr ruWT( yAǀPDP jQPR (yɆN~ \B(MVtBjRPFNWv{4u VWM싁u9SURD8XP3{u }e[^_]dMI8RUD8XP{[XVW uMM }e[^_]ry軅vU~ tSB(uHVtBjRPFNR58"jQE(F$5(F HB(e[^_]UWVS ] U u[4RFpE{<8RS\XM9${]e[^_] |vHuY4RFpED`{M99|;u2RS8\XE8${]e[^_]{e[^_]UWVST(SD~0EC@ 8WÈ@ss3VW{C,[ue[^_]ÉUWVSjEu}uE ]PSfjjWVS] jjVS? e[^_]UWSjUREP]u USEfjjuWS jjWSe[_]ÉUWVST(u ysF ]TdRtdMQmUUUE҉EuS(y}sN~ B(uFt@jvPFNW%BE@uU(ysvN~ B( Ft@jvPFNSB?U TXRUPfuQpELuCRjWPUu*WRED[uliYui(yJrN~ tTB(uIVtBjRPFNR58"jQm(F$5(F vHB(e[^_]UWVST(vW (y> F\CF F\V CBC F`F BǃǃF CF BAF AA PF@ jWvP ~YuWh@jPYe[^_]ÐUWVSuVǡT(y=vW (y= F\CF F\V CBC F`F BǃF CF BAF AA RF@ jWvP e[^_]U]ÍvUWVS E E}E]E@EƸ`_8u CX1uq_8uCXՉu迃_8uCZ뱉 u迓_8u S;눐 u违_8u$ S{ h?jPWGu迦_8uC0( B$Su迬_8u C SPt u迱_8u Su迻_8uF S~(H RPQ$ǃY}u:Ep_ 8ujj jMqP3C`EMEM ]e[^_]@e[^_]UWVST( ]} y:vwƋC`;t\RPh_.4(y:O B(G@jwyt tf. t;#{Zu  Sv S!{XPEPEr+tS(y9O B(Gt@jwPGOVuu+݆(hCp [pCdCl5((P@CxS|(y8O tTB(uIWtBjRPGOS58"jQ~4(G$=(G vHB(e[^_]U]ÍvUE EUEMUA EA$ÐUE@\]ÐUE@\]ÐUVS uPHu1Jv(y8qD0$T(y7(P@33ȍe[^]ÉUVS] uuu((&`uu(((`u$uh*`h(Ti(`l%u ujh((`l%fie[^]UhjFÐUhj.ÐUS j-]SZ9C l%Cm%CXJ@uLjP=ǃHCǃǃ#vjS!; hL6(t,o-v]ÍvUWVS EET(u y86^ss s}LW&tt(y6N~ t|B(uIVtBjRPFNP58"jQ1(F$5(F /vHB(&SW&Eu Ee[^_] e[^_]UWVST(,} yZ5O4EC Htv3fvv EvLP%UB ;FE܃ Mv L\PvEԋE QM؉EЋMԍU4R7.UEUEEua j'1@@ 0n%@ËFF CSu؋EЋU4z- Mq u5((y64O B(Gt@jwPGOSy jr0@@@ 0n%ËFF CE܋U P Cvu5(i$v vuuY¡T( yf3BǀdQM@ jRP (y-3O B(G@jwpWu^XWu"$u3Y[ `$Wu%ov(y2€ tTB(uIWtBjRPGOR58"jQ6.(G$=(G vHB(e[^_]UVS] LP"X SNye[^]ÍvU]ÍvUWVS 1uEPvE\0t4 j s3WVR jPR [uGE~e[^_]ÍvUVS uAu1Jv(yb1qD0$T(yF1(P@33ȍe[^]ÉUWVS(}EUWEUrET(y0MQ4 (y0EHFG HO FAF E G A(P@džEFG ACECEC Ee[^_]ÉUWVST( ҋ}y-0E @4(y0 (y0G O AC4C8G ABBB C@C$džF [^_]ÉUS(R] Ey}/S T(y f/€:u(@$TQ A$ES1QH!R5(K ]ÍvUWVST(y.U BMD\E$Uv(Et,U@$(BBBB jT+X(1ҹ_@@ @KK$@@@@$CCSS 58"E'MɉAtu.V58"j]s)(y-v}W@4@ jjuW Eu;uEt u(y"} O tUB(uJWtBjRPGOW58"jQ/U (B$(B HB(e[^_]UWVS(}EUWEUET(y "MQ4 (y!EHFG HO FAF E G A(P@džEFG ACECEC Ee[^_]ÉUS j-]S#C @m%Cm%CXJ@uLjP@@ @@ǃǃm%?vJ@@@ u܍@@ @@ǃǃm%?J@@ uǃHCǃǃ jS$ h6(v]ÍvUWVS EET(u y^ss s}LW{tt(yN~ t|B(uIVtBjRPFNP58"jQ"(F$5(F /vHB(&SW.Eu Ee[^_] e[^_]UWVST(,} yO4EC HtR'Bvv EvLPeUB ;FE܃ Mv L\PvEԋE QM؉EЋM4URUUMEɉEua j@@ 0n%@ËFF CSu؋EЋU4 Mq u5(o(yO B(Gq@jwQ j@@@ 0n%ËFF CE܋U P Cvu5( $v vuu¡T( yBǀdPM@ jRP (yO B(Gt@jwPGOV\Wu@Y[Wuov(yb€ tTB(uIWtBjRPGOR58"jQ(G$=(G vHB(e[^_]U]ÍvU"S]P aZa$P 7"$T aXaø$S6]UWVS 1uEPvE\0t4 j s3WVR jPR [uGE~e[^_]ÍvUVS u(+u1Jv(yqD0$T(y(P@33ȍe[^]ÉUWVST( ҋuyE @(y| (ɍyj E@ } G}u(u#r4B8B@r$UB G<}tEB@ BD vB@r4B$EB8UB B$AqA ǃs [^_]US(Q] EyS T(y €:u(@$TQ A$ES1QH!R5(5 ]ÍvUEU UE U]ÍvUWVS }aE1ҍ_ȋttrDEuىUB?~؋E(_yBp4,u94W]8vء(P@D9E T9 D9Bvjj4WseM(P@D9E T9 D9D9e[^_]ÐUWVS uE?T>(yBEp4Ytjjt>V^<~t>VnD>!Ep4v "Mde[^_]UWVS au11(vDu؋CSD E TDavD EuىG ?~؍R~;tjjPV(P@D3 E T3;e[^_]ÉUWVS }?DtjjPWD Ny܍e[^_]USS]t(R0EQPu r@0P $R ]ÐUWVS } u]hasu F VP013hasu]E ue[^_]hasPu V1has(u 1hasu V01hasI Vt1g/h bsu sh( @1)vhbstu!sh(?hHbs<uQsh(?u* sshTbhlb5_(1vhbsuAsh(I?usv h b5_(;10]} ue[^_]vPx1҉e[^_]ÉUWVS}LP_X SNy W}e[^_]vUWVS }E?\7D7D7 D>tp(yS{ tTA(uICt@jsPCSP58"jRt(C$(C HA(D7M\e[^_]UWVS ?E\0D0 D0tq(y3vS{ tTA(uICt@jsPCSQ58"jR (C$(C HA(ED0 O_e[^_]ÍvUS ]3S"XZsSC]ÉUSQE t XP ؃u]ÉUVS] uuu8(<(buu@(D(bu$uhbhH(BT(n%u ujhH(T(n%Be[^]UhjFÐUhj.ÐUWVSE }EwWw^(k%tn(y8S{ tTA(uICt@jsPCSP58"jR (C$(C HA( V+ Et}e[^_] e[^_]USRE t XP ؃u]ÉUSEPu,vC tjP SE$Ãu΋]ÐUSE EEP]UMSUMS,u1@ ]UVS$] CEC ECEEPEPURR0MɉtK jF @@ @ P@@@F e[^]ÉUS]Suyv P$u]ÍvUu EPP,ÉU EPu URR0ÍvUE =UuuX(\(c=uJu`(d(c]ÍvUhjÐUS ]CCs SYXsSvXZsSZYsSYXsSXZs SC CCCCC C$C($C,]ÍvUSRE t XP@ ؃u]ÉUSQE t XP ؃u]ÉUSSE t XP؃u]ÉUEP1ɅtB@9}Ru]UEP t(cBE@u ذvRu1]ÍvUWVS(}u] VSGPUwRzUEUEEt@ =v VSGPUwRGU܉UUE؃҉EuPVSW0@ e[^_]ÉUWVS(uV}] SGPUwRUEUEEt@0QVSW@0e[^_]ÐU$uUu B Pr MQUEUEEt@8ÉUWVS(uV}] SGPUwR`UUMEɉEt(P@AHA ,PhcS= VhcS+A <PhcS6? @PhcS!? DPhcS= PhcS> 4PhcS> 8PhcS> LPhcS> lPhdS;= `Ph dS&= hPhdSy> PhdSd> PhdS?? Ph+dS*? Ph9dS? Ph>dS> PhNdS=ǃǃ"jS) h6(|wve[^]ÐUUE u R.ÐUWVSE E}E]Euf@EƿXd8uu S1u^d8u S1}uzuqE@Eƿcd8ujj jEp^_/ukd 8ujj jEpZYPS1EEEE ]e[^_]9e[^_]US]ۃLtݓݛǃǃǃǃǃǃǃǃǃ ?ǃǃ?ǃǃǃXǃ\ǃǃǃǃjRP ݃,ڻ<ǃǃǃ}UE mU]mE4݃,ڻ@}UE mU]mE8HD$(ǃǃǃ$v ݃Z{0CX$PC0 ݃P<$X|$S]ÉUSQUǂZX{u(`H RPQ$C]ÍvUS4]t9~ Su9݃xd݃Eu#܃ݓ/vxd݃ɋt܋݃Euf"݃l{0Ƀ P}}}mܣldmmكEu CX$P؋]UVSEe uܶ,d}UE mU]mEu džtf4ff)Í džfyۋЋ8f)…҉4dž(v48I≆4+8 ݆,P $݆Xݖ$ݞEu/݆Pݞ܎vݖݞݞ[^]ÐUWVS(@(<]]yvU B@]@$ɋP4px EǃuuC0ɅݓtN؅~4؋Kt $Ruuhd}9 mK0ݛJ eݛ8ݛ*ǃǃǃǃ uuuuSi hs0WVC0ݛ݃݃P<$XE uك C|$Pru ǃ"uWu}EEt S>$]ǃ0݃݃Eu PWVS S[tG uuhd݃܋ s0$uuhd^ (yU JE x tZB(uOE PtBjRPU BJS58"jQ.U (B$(B HB(e[^_]UU݂B0݂ʡ(e@Eu!ݒݚA݂E݂`Eu3ܢXEu"ݒܢr0݂EtEudEtݒ܊݂ eǂǂݒݚcܢXEuVݒܢr0-݂`ݒ܊ܢr0ݚݚX]ÍvUVS(@MܡX݁eEuy0܁ݙ݁Et ݁y0݁Eu݁Eu]]u؉򉁰ǁݙXǁ[^]UVSM(@݁Q0R<$݁EZt R<$Z݁Eu  ǁ9~1݁Eu]]u؉򉁰ǁݙX[^]ÉUVS] Sơ(yV (yt@(P@AQ QA QAAC0A$A(A,@QtPQR C@ jVsP e[^]ÍvUSS]݃C0 eǃݓǃ݃P<$XEuك C|$P-]]UE@ E{vUE@ EWvUVS] uuux(|((euu((*eu.u)Rj0h,eh(*(`o%((u.u)Pj8h>eh(*( o%((u$uhTeh(H#Ğ(o%u ujh(Ğ(o%Z#u ujh(($2#u ujh(($ #e[^]UhjÐUhjrÐUEEEEU$tۀEuevP $eXP $ eXEu efـEu e } eEuUWVSLEE]u}1ffu$u WVuu$}}}m fڃ Emmu f܀Et+EuC fvٍe[^_]ÉUS j+]SZC o%C`@@ @@ SXC0C p%BCX0p%Z Ph(fS+ Ph4fS+ PhEfSa* PhRfS+ PhhfS+ PhsfS+ PhyfSu+ $PhfS`+ PhfSK+ (PhfS) DPhfS!+ǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃ ǃǃǃǃǃǃǃ?ǃǃ0ǃ4ǃ8ǃ<ǃ@"jS h7(XSv]ÍvUWVS(<}y"M QE(y‰U衠(@]f]E"UH P$$M1;}=D𿋇DC;|1ۋ9avE؋ىTC9~" hf_$wE9ЉEUB(B,MA QMAQA$G|MAQ@<EݗMAQ EЙыȋˋTAE̋EЋȉә؋E)P4$U9UX ɋE̙Eɋܧ݇Eu69~(LJݗE̙EU9Ua؋MyyE̙݇,݇EuI9~;EELJݟ؋EЙ؋M uLuB)HEԅt4LJLJtSEp pWq ]؃݇fEu(EܧܷuLJ؋tLJRuuWK(yU JE x tZB(uOE PtBjRPU BJP58"jQM (A$ (A HB(e[^_]UVSU 11t.Htlt7tJ` R]EUÉa R ]EUÉI R]EUÉ1 R]EUÉ hg $#]uEe[^]UWVS u(݆@Eu<ܦu/EP<$XؐEȋE1~Oș<2uEu1vI~$ș<2ușEEuG؅~ W<$_؃ [^_]ÉUSu]u SN݃Eu-݃Eu g CX$P؋]ÉUWVSE ]衠(@u]݆݆ Vǃu h g)$A(yp_ËCSEܦ[ E[S0C,EEu V[ vE[ VC4[$ FEݞdždž@ jWvP e[^_]ÍvUWVS E] EEEp9g8jUz1QqEu hAg$UruXZhUgujj jPLU$U$U$U_5 _(E1URjjPGU9}AD?hUgjuU9}"EphWg$UDD? ue[^1_]à hg$7EUE] Ue[^_]U hEjp ÍvUWVS(0puX$VS} }hgm$WVShg e[^_]ÐUE pp pp0(rrh hW ÉUWVS]u S v<t<urj@PS:X@PSmh?j@PS ǃǃ?F9]@ @9‰EUuucJ~z$tp~dPh?jujS40ـE PhuEݛu ݛujS ]uEUjSu}Eك Eu]EUƉ؉u}EEu?~!WV0S=YXSu}E=Xh v`he[^_]ÉUWVS ]uUM} E C9u19}-vu ]OUME] L@9|֋E 9vu]O]$ UME] L]$ @9|mE 9}*u ]vUME] @9|׋E 9}5u]]$ UME] Nj]$ @9|؃ [^_]ÐUUM x DJyE]ÍvUMSE] xˋTDT Iy$ÍvUUJ9ЋM E@9~]ÍvUWVSuE x&vӋ <t<u Oy݋ݞjv|SVN|$@U=hh}UE mU]mE苖B t RVdžEe[^_]UWVS uydžu A Ps$X$=1ҍA9}vBA9|냾uv19} D?B9|싎9ER$Z)P<$XEB9~j19}"D?B9|싎92苞R$ZP<$XB@9~؋1ҍA9}vD?B9|dže[^_]ÉUWVS] 9EE苻8F8<t<uE݃0Eu V$^݃(ڋ8ݛ0ǃ8A;M~؋E@݃0ɉ EuUɋEUƉv]u}䋋8u}Et-1?݃(EUEQ $Yىu}EـEu]EUƉ؋~Tu}EEu=ph$vh>hh8SS:؉u}Ee[^_]ÉUWVShhjuEPEe[^_]ÍvUWVS,EQ$YR$11EZuًED9ljE}VV$E^uEUԋEU؉EUvș}ԋ]F<t<uGI;}}V$E^t؅u ]V$<$<$]_E~OEEu=h$vh>hhjujEPEe[^_]ÍvUVS] uuuȞ(̞(huuО(Ԟ(hu$uhhh؞((`p%u ujh؞((`p% e[^]UhjFÐUhj.ÐUUEM BÈ@sBBZBÈ@s 5(؆ÍvUUEM BÈ@sBBZBÈ@s 5(tÍvUUEM BÈ@sBBZBÈ@s 5(ÍvUSj ]PBB BBXC<p%$p%$,PXClp%BB BB$q%(@C`[d]ÐUSQU ҋ]t1(@C0S@P,[TtmS0hhh(CVC0H,C@tR0hhh(CTـE@t(hCD[DCT؋]ÍvUMA`U xA~t5(@Q`Yd@u A`2u+(@Yd hiw$ÉUVS]S8ҋu Rt 92uC\Bu# j !‰2C\BC8BC4S8e[^]ÐUVSu^4~[N8Q҉t/BHBB CRN4ӋRuՋN8AHAA F8QlN4e[^]ÍvUh?UjBPR5( ÍvUVS ]s5(K$?CjPSVo e[^]ÐUWVS4]CC @C$@C( A@ js11P8uЉ}EС"k($}uЉ}mEPC$PS5( e[^_]ÍvUVS]SB`5(ttKB@tB jsP8$PQB jsP8$PRC BdnBXEtuB jsP<$PYXC@ jsP8RC OBdn8iEt.B jsP<$PYXC@ jsP8RC C(C$PSV vh$i5_(e[^]ÐUWVS<}GPhtW@4u1۾?G$]u]EP,$X" P}+]umEMU؃_ e[^_]ÍvUVS] uuu((@iuu((Biu$uhDih(( q%u ujh(( q%e[^]UhjFÐUhj.ÐUS j,]SC @q% C0Cq%PhiS !jS hX7(D?v]ÍvUWVS E E}E]Eu6pi8u Sơ\(y!EEEE ]e[^_]N(P@AQPCP jVPR e[^1_]UWVS (}u ydN\(yP:(Bݝpy-~ tSB(uHFt@jvPFNS58"jQ(F$5(F HB( W¡\(yB݅pXQG@ jRwP B(h(PJ i$P7hixS.Sh((y3vN~ tTB(uIVtBjRPFNR58"jQ(F$5(F vHB(e[^_]UVS] uuu( (iuu((iu.u)Pj hih($(r%,(\(u$uhjh0(<(q%u ujh0(<(q% u ujh($($e[^]ÉUhjÐUhjÐUSPU ҋ]tC,t C,P4C(@r%@ `r%@@s%]ÐUS hPj]3r YXhbj3d XZhuj3V ZYhj3H YXhj3: XZhj3, ZYhj3 YXhj3 Z3 P $R0]ÐUWVSE ]uE}CVPhPjWu3  VCPhbjWu3  VC PhujWu3  VCEPhjWu3  VuhjWu3u  u|VCPhjWu3V  u]VCPhjWu37  u>VCPhjWu3  uVC PhjWu3u t1"EE u}Ee[^_]/ve[^_]UUܸ݀(Z EaUWVS(@E`E t9ܲj}ME mM]mBpUHRPQ W܂݂z]UEܰ}UE mU]mHpEQPQR EQpZBjRP U ^؋f)ǃVPVR FMPjPR fyߋEf)ǃRVP ]UjR>VPVR YMI[⍘RSP EPt++vMIP$XEX UB ܈ݘ e[^_]ÐUVSuNtmD?0@PQR D~VPSR XZPjPR 0@jRP e[^]ÍvUWVS EE(} y$UwƋ@PQR EVH(LyG8t|tvQ0UP WPEF9~WC WSU2T VD2Z$SP v9(y"Gxtt} ]e[^_]7v@PQR El9uEp t B R(yvO tTB(uIWtBjRPGOS58"jQ&(G$=(G vHB(UP djjPe[^_]UVSu^u2Vu.Nu'RQR .V݃ۃDEuFttVt*݃ۃDEu ݃ j$PR Nt-݃ۃDEu d؍va$jH@HP$݃X: jǃHv݃ ݃P $܋܃L݃XEuv|݃(܋܃L݃Չ݃(܋܃L݃뷋݃P $܋܃L݃XEtݛLM݃ jǃLǃP$RP jf؋htI݀}UE mU]mEh9~Q$Y $PR e[^]ÍvUWVS}E7>E(yMQ(y4E C(P@SHLCEC|S tFtFǀM u<Pt(yyMQXB|tF(yJUBpx9uEB u7Y[@PQR XZPQR  B@ jurP M ;u;x~ C SPpE ;xd~\tu RP TU ;XǃT(XP@\`oOu,(M P@ǃTX\`$@ PQR XZ<(8VRP Tuut C Se[^_]ÉUVSu ]VS7t,(yjF8ttt C(SPt{(y%F8u ǂu"(yF8t ǂ*t"(y̺F8u ǂu((y蠺F8txu ǂH9| u ǂR0e[^]UWVS(Xp(}y+vU BE@ R7XZjRP ZYMQRQP QXA9J}BQRP (y觹vU Bx`t%]uEE` A $7TXU9Bt$t(y!U B8u&@0jRP ǀ`ǁTu)RA ]uEܡ\]uV]S7݁܉(܉ݙ(e[^_]UVS] uuu@(D(juuH(L(ju$uhjhP(\(`s%u ujhP(\(`s%e[^]UhjFÐUhj.ÐUWVS u ]tM th@kPjf{TCTCXCGG GGG G$G(G,G0G4CǃǃCH@ s%@s%GHGLGPFF FFF F$F(F,F0F4CFHFLFPRPhEk3P CPhPk3= C0Ph^k3* C8Phjk3 C$Phyk3 CPhk3I C,Phk36 Whk3 Vhk3 C\Phk3 Phk3 C Phk3=E t@ $@`$jP  h7(f_ve[^_]UUHHt&ۀBZBZB0Z0B8Z8tBB,Bt*B$=krݚݚJ,t-ܰr8ݚkܰݚBBZ|ݚB0B8ɡ(ɅBTBXBdBhǂǂǂǂǂǂǂǂǂǂǂǂݚݚBHuBLBPEevUVS ]3gtA(ycvq|0t-(CHy@C+D2CKCHe[^]UWVS( u} yv_v(v$v|vv vvXvT6Vg4^\sv`v\Pg"$^tP FtẼ@ssdždž@ W6PD¡(yR‹t#ztFTFEu B v1e[^_]ÉUWVS( u} y賱v_Ëv,vE9t hm$kvQ҉y%M)‹AHAy hmՎ$)EDD tUD EMEA MQt!C;] ]SEPMQE1ۋE;X8 vMQE]4؋FE~;}~}M1 2҉y%))ЋUD9X9Eu U܃EԐۉy)Ѝ)M܍B0MMD E2M UB@=B~ hmI$蝎C9gM1y)։)ЋU\9}r֐ۉy%))H1;U|>9}:U <uU<tD UEEP C9|EM];K83EPtwUy)Љ)ЋM\;]}G΃ ۉy%))UH<u 1uD C;]|uuEEe[^_]ÉUWVS}Ewy)Љ)ЋL;M }qGEɉy%))WpUt2_ ]U 9}!]U]EA;M |E[^_]UE@]ÐUWVSP}GEۉy%))ЋLQɉy%))ЍCW<u|8 uD8uG9D |1Ay)Ѝ)‹ED9|_[^_]ÉUE SM]y)Ѝ)D E D \ Y$ÐUS]KɋE t&y)Ѝ)LA$UWVS}E7y%))Ћ\GEAۉy%))PO< uT: u | uECy)Ѝ)‹ED9|E[^_]ÐUWVS}GE! ҉y%))ЍWD9E H;M UW wU܍vɉy)Ѝ)]B 0]D8E 2G@=G~ hm$nA;M nEۉy%))ЋL[ɉy%))Pw<2u,|: u%D: UW0GEAۉy)Ѝw)‰uTu9oхɉy%))EÍGEuJw 3t@U4hn3D;E MW]e[^_]ÐUEP 1;U ]ÐUE =Uuu(ğ(n=uJuȟ(̟(n]ÍvUhjÐUS]S1C v% CtCv%CtPh nS CxPh)nSO Ph9nS ChPhAnS3vC $C`%jSÐ$D8(vv]ÍvUWVS( P]@Cx (} S|yʋWD(y譋 (qshy蕋DCdACtC`C\x$)Ɖ~CXQ3hHn(V(R3hTnV(P@ClCh@C`(SpyO tTB(uIWtBjRPGOP58"jQ覆(G$=(G vHB(e[^_]UVS] uuuП(ԟ(^nuu؟(ܟ(`nu$uhbnh(0(v%u ujh((v%Be[^]UhjFÐUhj.ÐUS]SAC v% CTClPhnS CdPhnS C(PhnS CpPhnS CxPhnS+vC S%jSN$8(JCv]ÍvUUB(P$JxXBrTZ\Btt@4]ÍvUS]C SPDC,C $PP]ÍvUS$]KxASt9|!C(P$ $ $sTY[\CtBC\0C`.++CtC\]CdـE@u4ء" nP]E]C\ME]CdnE@u;n" ]nP]螈ME]C\ME]C(U Cl@;CpCl}En]ÐUWVS ]s,tcKtuRC@ hn PC@ js(sPLC(S PSR@كES u C0$P؍e[^_]ÉUVS] uuu((nuu((nu$uhnh(踸 ( w%u ujh( ( w%ʸe[^]UhjFÐUhj.ÐUVS] uuu((@ouu((Bou.u)PjhDoh (,(@w%4(8(u ujh (,($e[^]ÉUhj:ÐUhj"ÐUS]SZYhoSoYXhoSbXZhoSUZYhoSHYXhoS;XZhoS.]ÉUWVS EEE EEE}X޿o8uPhd޿o 8uWjF޿o8u V58$"޿o 8uS58$hoh()1q޿o8u8$1I޿o8u8$1!EEEE EEe[^_]e[^_]US]SLC w%Cx%CLCPǃhǃǃ$C8 ]ÍvUS ]hoSYXhoSXZhoSZYhoSYXhpSsXZhpSfZYh$pSY]]"UWVSE ]uE}C8VPhoWuS VCHPhoWuS VCe[^]ÉUWVS ]E0u zu1RSO0WuuhpVs4hzpS0E~ WPuhpVs4hzpS RS0jjjhpExdUUUU} uuWPuSu0Sf0s8uuhpVs4hzpS;E0yEy>S4~0S0jjjhpVs4hzpSe[^_]USEPEPEP], S, uuuuSVAKLt 3h|ph(.jjjhqjs4hpSh]ÉUVS]00PS0C4teEPEPEPVjS u uuuVS60S0jjjhpVs4hzpSe[^]ÐUVS] (u P,P PVSVSS4҉0u]e[^] Su#VS0]e[^]Ve[^]ÐUWVS ] CHuC;u)SVjjjh qWv4hzpV0e[^_]ÐU (ҋMy{E PBB AEEÐUSRH(ҋ]y{E HщC4u-Bu&BuBBRR vA9tK4‹B9uK4Ћ]ÉUSQE x]tvPSNxu]UWVSj]} up0@S8P@x C4Ge[^_]ÍvUVS] [ u su[n4e[^]ÍvUWVS ] ۋu}xR;^}MFtC70mt(ppS6hq.(ppS6h.q(ppS6hKqh( }] ue[^_],UWVSL} EX޿cq8u VUrP!޿sq 8uSMqLhoh(U1} ޿q8uuFPFLˉ޿q8# E@P@L뛃} UZ޿q8uMqu\޿q8uuvuZ,޿q8uEpu޿q8S jj jUrpURQPuMx&Q@Mphoh((qw} Epq 8uajj Ujr pjj jMqoURSPu @~(qv(qjj juvEojj jv oyURPSuU1 vMQSPuMou^޿q 8uIU~1EPEPRu4 uhoh(>v(q+޿q 8uGU~/EPEPRu uhoh(9(q޿q 8uOU~7 uEPEPRu|uhoh(vv(qc޿r 8uOU~7 uEPEPRuuhoh(kv(q޿r8S jj jEpm_ZUr h(薠 MQ PSQRD} Epr 8jj Ujr8mjj Mjq "mjj jËEp m$jSVu u(q(q} UZ޿%r8jj ujvljj jv ljj jƋEpkljj jUrUl$SVWu{ u(q_(qO޿3r8jj ujvkjj jv kjj jƋEpkjj jUrk$SVWu u(q(q޿Cr 8jj MjqNkjj juv 8kjj jƋEp"kjj jUr k$SVWu u(qv(q} njj jMqjjj jEЋuv jE@uEPuuu;EEPuuuv EăEX޿Pr 8Iu̅]ȅ^jj Ujrjjj Mjqjjj jƋEpijj jUriZYWVSPuu uu ]ąjj Mjqijj juvvijj jƋEp`ijj jUrJiZYWVSPuu uuw OuuZYuuM,޿[r 8}Eȅjj Mjqhjj juvhjj jƋEphjj jUrwh<$VSPuu Puuu xEԃjj Mjq+hjj juvhjj jƋEpgjj jUrg<$VSPu kWPuuZMy@uI˃ tPx9yDu3jj juvg@~EԃtPuujjj jEpYgjj UjrCgjj Mjq-gjj jËEpgZYWVSPuu0jj Ujrfjj Mjqfjj jEpfjj jUrf<$VSPuUM 41E ;$\Mjj jEp_fU9uQM1ۋh9}BE E Eu9DuU:DhC9EEuM;${uąjj jEpejj Ujrejj Mjqejj jËEpe<$VSPu Puuu]ԅxmjj Ujr@ejj Mjq*ejj jƋEpejj jUrdZYWVSPuu jj Mjqdjj juvdjj jƋEpdjj jUrd<$VSPu ~VPuuZSuu uIe[^_]ÐUVSUhM ]u(h,h0hDŽ4h[^]ÐUE U DD D]ÐUVSM1ۋh9Ӌu }5 9tuDD DhC9[^]UE UM ]ÐUWVu ES}MyBDM8v1ҋh9}$ø 9tu 9| B9[^_]ÉUWVS u }E]MyL WuutQ;1ҋh9}(E 9tu ]9\ B;Ue[^_]ÍvUWVSu] 5 _(^_XShr}c$rqc$sec1h9}b D3tGPh1s9cZYt3 h1s)cYXt3h1scXZt3h=s chG9EFse[^_]bUVSUM @]ul@p@t[^]ÐUE @U`DD D]ÍvUE UM@`]ÐUWV}Su ]1ҋ9}#`9t u DB 9[^_]ÉUWVSu] 5 _(n\Y_Sh`sa$ra$sa19}R`D3t7Ph1saXZt3 h1s}aZYt3h=smaG 9EFse[^_]EaUWVS}$cu ]Mu hs5_(A[vWUDP$EUGEDP$EUG EDP$EUGEDPH ƉH ÉH EH E$UtP$u\P$ULP$]M\P$uD`$P$e[^_]UVu S]PPK< uS|uL| uETuDÐUEP$ҋM t9H`t Ru1]ÉUWVSEEE E]gCEƸ`yǹ8uWUB@BPwvyNju8uVUB HB PIvyNju8uHEp$ 5(*SPhyh(貓vuvyNju 8u EP$trR@\u^yNju 88U BP PR$Y[Phy?MY$v 3[u1}CEƺy ׉8uksh(KqƃuR j fBA1AUB$At }W$ABE$UJ$A`y ׉u8uJsh(puPshy5_(9%Puvy׉u8u:jj jsP=^_Pu 1҅Rhsyh(译z׉u8uNjj jsEph(^ơ8$1ҋ@ 9}MY4B9ʉp0|랍v}Nju8jj jEp+1MQ4@ V4P^l(}%(((8$`(u ujh`(l(}%(^e[^]ÉUhj^ÐUhjFÐUVS] uuu((uu((u.u)Pjhh(xd( }%ġ((u ujh(($D]e[^]ÉUhj:ÐUhj"ÐUWVS ]C4u h@Y P  (҉y*vE HD ;uC8](yz*0u3h#10RPPGWPY[PV- ËGVSWP XZSWe[^_]UWVS E] EEEu?pKǹ 8u#jj jEp&"UB41ug}Ww8uHjj jEp!YUr4 t;u}w h(TUB8닋}E}] Ee[^_]鉧e[^_]UVS] uuuȡ(̡(uuС(ԡ(u$uhhء(Z(}%u ujhء((}%Ze[^]UhjFÐUhj.ÐUWVSH}W G~%GG@@GG@@G (;(G$}čMĉtt:(PQRh( vwG)tT=v V#e[^_]ÍvUWVS] }SW^XZSW!e[^_]UWVSu Vu/ZYVu^YXVu#e[^_]ÉUVS]u SS ֋E 1{CtCe[^]UVSuNu IVF )e[^]UWVSu ]VS"K 1f)eC[^_]ÐU]ÍvUUB v ]ÍvUVSu F Pvv6h F uvh# %19sPF4Sh1C ;^re[^]ÉUM uHu1]ÍvUE E v]ÐUWVS}7 hAu N P[^w hAu 0 PwZYw hAu  PY^XhAu Y[W RP= Gu2hAu Z3^XwS Y0E A19s;hAu Z3~YXG4SZ0F ;wrǍe[^_]ÍvUWVS0E 0XjSVU z))߉z]KM)U}E E] C+E;EU}E)Eu}E܉}]v# S&u SJ cvs h@~% ~%u V $@~%~% ~%h@~% 1US)UuuW}M 1A)tS=v V ;X h@~%~%~%$@~%~%~ ] ;MUC]U B]K)19sOuU B;BEttM AQVPu % EH)C9r)1!;]tU EH)C9ÉrEU B)19þs"щǐtEԃt;vC9rU1H M] EEU }t~EH)19si;]t9M9tM9u EM9tUE JEH)C9r h@~% $;(ove[^_]UE@%]ÉUE U@%t vÉUE EE {vUEUS]S%]ÉUVSu] %jVptue[^] e[^]ÐU]ÍvU1]ÐU]ÉU1]ÐUSU] RP ZYE hSE]^US]S%C]ÍvUVSu] %jVtue[^]B e[^]ÐUUEB]ÉU]ÉUE@]ÐU]ÉU]ÉUVS] u SP YZP hVCPXZCE hV'Ee[^]fUS ]SCC%@@CCC C]ÉUWVS }_%t%{vCt P S wG)tR=v V:X h@~%&~%~%$@~%~%jWE t We[^_]U]ÉUWVS}UE_Pʉ)1Dt6MQ;Qu]tt2A PSRQG _ʉ)F9rE +E@ Ej)ËuFU+B$ PuSEXEU9Us]}uvuEVH)19su 0Љ92tC9rQSuEp$EU9UruEU FV e[^_]ðt S5 h <(USS]E S9r;C vC)Ku )Ps"C]ÉUS]sS+SD]ÐUUB +BH]ÐUVSE P)119֋] sv8tFA9r +]V*ZYPCS@e[D^]ÐUWVSE }EWP [^P huPZYw huwP^Xw huYPY[w hu;PwXF+GZP huPj_"3 huP6;^u׋EE GEe[^_]WvUWVS8]S@%s}CEC$@~%d~%u j聿 $@~% ~%h@~%~%FFC@@ B h@~%$<(C h,<(6jS h<<(e[^_]UVuS^K@%t/FpS1 F@F@F@ C ^h@~%]~%~%$@~%~%XZjVAE t Ve[^]ÉU]ÉUWVS,UEPE pʉ)19sNEE̍E؍}ЉEȐ;Ut#Bt ]ЋVGWuu U r ʉ)C9rōe[^_]ÐUS8]E PKUQRe U؉UC 9‰EuCB]UE@]ÍvUE@]ÉUUB++E]ÉUWVSh}WP ^ZP hu PJY[w hu P,GPU؋G9‰Uȍu؉EЉp hXu PYZhPYZsPE؉E@ tE؋Pt/@@uB;P u‹@;P t9B tEWEE9Ѝu؉Uce[^_]ÍvUS ]SCC%@@]ÉUWVS }wG )%tR=v V6:X h@~%j~%~%$@~%~% jWHE t We[^_]U]ÉUWVS } G)19sC] S;SttЃC PQRS G)F9rōe[^_]ÐUWVS$EP} W1;u}`EEEEuWUMH ЋQ;QEttCAvSuRQ F;u|e[^_]UUBR)ЋM 9r]ÍvUUB+B]ÍvUUB+B]ÍvUWVS}WP ZYP hu P^_XC+GP hu Pw;stSvu!P hu qPP hu PP;wue[^_]UUB+]UWVSu ]}Vh WVS@Ee[^_]UVS[^]vUVS uhv3h y;^uEe[^]\UWVS}WhE` BRP PWha'U ؋P$R^ZPuƃtfE PVPRǃWh&Y5 _(VU ؋kWh@ hZuE 0@)=v VvPVWh뤉X h@~%:~%~%$@~%~%qU 2B)tR=v V:X h@~%~%~%$@~%~%v h<(e[^_]USPM] 9ًUuE ]j8uE]JR0QYXSh /]ÍvUWVS U} 9utt؃8td uuV0RUPWMPQRUЃ @Mu h$SQRue[^_]ÉUWVS]Cu FCS6 vJ S%$?lj;6$ tftve[^_]UVS ]u S vt PUt]e[^]ve[^]ÐUWVSUE ҋ}EUeUW WUZ9E WEp $Z<$E' u M%1 UC W9rM DW tt PiE WW9u)+uE 4y WW)ЋM)u 4 )uG t:v WC+O+Mu<$. u 7 G 4E;GGvGe[^_]ÍvU EPRu PUWVSEEmEEu)ƋE]EE ;Cv U 2 w9 S uMM I}m+u #]N Z SS u ;E U)uEHE }+EmEM#])‹MD ËE EMU ؍e[^_]ÍvUVSuvvSVZYPh`4$ u6hF0hP4ShC Vf9r؍e[^]ÐUE@]ÐUUSu~tA vI$ÐUE@u H ]ÍvUVS] uuu( (uu((u$uhh(+$(%u ujh($(% ,e[^]UhjFÐUhj.ÐUWVSuV誢F %F@%^8 SG5OPudždž<PLPh V6 8Ph+Vl7džPdž@Dd@Iydždž4 V?2F $F`$jVC/$<(vve[^_]UVS]ǃH1DŽCDŽCDŽCDŽCDŽ$DŽDDŽdBIyǃǃǃ1'DŽhDŽDŽIyٍS<C PIy<t/1<Rp$p D8PR;F~Չ]e[^]ǡvUUM t@ jQP B QRP4UWVS ( ɋ}y HE D>H(XAHM]Ed:0\> L:\:[^_]ÉUWVS (}yU BXEPEPSWE(ydU BE䋗8t xtE4_3Euuu D:8PN5ta tVvt'tBG3PG u WP4(3u WS E@e[^_]ÐUVS]SHD8$7ƃ (yUHD@u*H݄dE@t VSEPEPVS5ZYPSYXuHD8PR3e[^]ÉU (yvE PBÐUWVS ]@1udH@LHH@LHF;LH D8P7붉H<`K$BLH@H`H{;vHDŽ`H@LH@H`F;L$H D8P@7듍v H@LH5HS<uH@LHF;L}8H D8P6tHu vHS`uƄH`L9$19ǃ1ҋDdFA;L|ǃH!v݄dE@tZFHL9}OH D8P5t̋H݄݄dEtL9uQ1ǃHvH@LHF;L}#H D8P?5te[^_]UWVS EEEuE1ɋ49} }#E荖TPv9:t"A ;MX |} E@ [^_]D3UD3 U [^_]ÉUVSU4(M ]uuE[^]e@T4@X4@\DŽ4[^]ÐUWVS } ]CEƸ8uEۀvu𿭉8uEۀu𿴉8uUۂ} CEƸ8ujj js Uۄhzu𿭉8u jj js UۄAvu𿴉8ujj js Mۄe[^_]ÉUSRE ]~E E]PS8PPIy]ÉUWVS EE] EE޿.18tm޿48¾tP޿:8¾t3޿?8¾t] E`e[^_]MuE1҃@B0P~"jj juNEt@e[^_]ÍvUWVS]hj1;4}4C PEE4tth8G ;4|Eڊe[^_]UWVSh܊u$$@$[++Ph1 PXt+t+D+PRWh‹m G'~e[^_]ÐUWVS 1u;L}41ۃ DD$WhۋG ;L|΍e[^_]ÉUWVS ] ޿8uEǀ@޿8uEǀ@a޿8uEǀ@9޿8uEǀ@ShFe[^_]ÍvUM UEDv h@ ÉUU hMEݜd h@ÉUWVS EEEE@Eƺp׉8‹] uMjj jEp 0jj jUr MuD 8SP'1x ׉u8uRjj jEpjj jUr jj jMqVSPuK1  ׉u8u>]8vjj jEpGY_PS.PNy1v ׉u8u&jj jEp_ZPu1v ׉u8u.jj jEpMD 8$,v׉u8uVuSuY[P ׉u8uJjj jEp9MD 8$,P$X$hh(51 ׉u8u u1lnj׉u8u u1<Ռ׉u8u uG1 ׉u8u:Ep(SJuRUrhVM<1׉u8uJEp(SuPUrhSQ4_vM1L#׉u8uEpu14 ׉u8u.u WjEp VUr ru1@׉u8u:jj jEp jj jUr SPu1rPNju 8u8jj jEp jj jUr SPu1}MM] }e[^_]Ge[^_]UVS] uuu((,(]uu0(4(_u$uhah8(D(`%u ujh8(D(`%e[^]UhjFÐUhj.ÐUS]SC %C%$3vC $C`$jS$<(vv]ÍvUVSu] SPY] ue[^]UWVS EEE EEEX޿8uSuuEP@1޿8uQuuEP 1v޿ 8u/uEPXZ$hʍh(01޿͍8uE PJ1R޿ލ8uE P^1"EEEE EEe[^_]e[^_]UVS] uuuH(L(uuP(T(u$uhhX(d(%u ujhX(d(%e[^]UhjFÐUhj.ÐUS]SC `%C%]ÉUUVS] uuuh(l(.uup(t(0u$uh2hx((%u ujhx((%e[^]UhjFÐUhj.ÐUS]S,C %ǃ ǃD C\Jy]ÍvUWVS EEE EEEU苂 uE`e[^_]pjj jM)q`}; jj j)ËEp `3 jj j)ËUrp3 )DŽDŽDŽDŽ?MY׉8uuEpu$ jeÉ$ C %UZM苑 )Dh )DlDpv׉8EXu$ jÉ$ C @%UZM苑 )Dh )spD lQjj}wm E\}5U苂 Rjj)w/M\ ׉8E@u$ jÉ$ C %UZM苑 )Dh )spD lWjj}wq E\ U苂 jj)wAà M  ׉8EHu$ jÉ$) C %UZM苑 )Dh )spD lRjj}w} E\U苂 jj)wv׉8E@ u$ jÉ$E C %UZ M苑 )Dh )spD lWjj}w E\U苂 j)jw_SM苁 jj)w /S׉8;EH$u$ jÉ$% C @%UZ$M苑 )Dh )spD lRjj}wy E\U苂 j)jw?SM jj)w } à  ;jj)ËEp$\>lj޹8E@(u jÉ$'UZ(M苑 )Dh )D lp jj j}wP$XE\ h $_vt S hT=(Mt S hd=(-t Sm ht=( t SM h=(t S- h=(t S  h=(t S h=(U e[^_]ÍvUWVS u1ۋ 9.ǹ`F`;U tBu T;Ut)Bt&Cpp9~Wuu h4$1e[^_]ÍvUWVS ED (Eu h`uUZ׉8uaE@u- j%É$oUC %ZD EUUDŽ DŽ0 ׉8ucExu- jÉ$UC @%ZD EUUDŽ DŽ0 ׉8ucEpu- j'É$qUC %ZD EUUDŽ DŽ0  ׉8ucEXu- jÉ$UC %ZD EUUDŽ DŽ0 ׉8ucEH u- j'É$qUC %Z D EUUDŽ DŽ0 ׉8ucEP$u- jÉ$UC @%Z$D EUUDŽ DŽ0 ׉8uWE@(u& j'É$ UZ(D EUUDŽ DŽ0  h$;vMD jj j} w _3ED jj jw=  } 3u,UD jj j֍w 3MD e[^_]Ét S h=(t S h=(it S h=(It S h=()t Si h>( t SI h>(t S) h$>(UWVS ]1ɋD 9}}.E1ҍ$ u 94 u 9( tA;M|߃Wh1e[^_]ÍvUWVS ( yAU zSw7u Ƌ^vSuZEUt3Q@ u V4P U@ u uV4P$G e[^_]Ð h [$vUWVS jj }juw jj jw SPV Ãu8jj jw jj jw SPh`vVjjw[he[^_]ÐUWVS jj } juw Gjj jw4 SPVqƒu0jj jw jj jw SPh>vB wB(6jj jw jj jw SPh e[^_]ÉUWVSE hE1U; E+EUDl$@]+]uRC`40U4hk_Xtphwv]+]uQC`40U4hp,ED 0$43h@ (]+]uRC`40U4hE݄0$pD$43hZv]+]uPC`40U4hY_EpD 0$43h@L h]+]uRC`40U4hEpD 0$43h0]+]UP֍C`440hE0Ƀ$pD$43h@`,Et thwgv]+]uWC`40U4hpED}UE mU]m EP43h hEUE;  h.e[^_]ÍvUWVSuh\1;D $ 1ۃws$ hlj hr^ hzGPv h> h'0v hv h ht0 t3h t3t3 h@vQ t0 t0hG;D  E.e[^_]|U塠(M P@AXQ\]ÍvUE@]ÐU(ҋM yA`AhEPɡ(BP@EUEaXY`AXQ\ÍvUWVS } G`GEuG" 11P]uEG`Ẽ@s UBUBe[^_]ÉU(ҋM yA`AhEPɡ(BP@EUEaXY`AXQ\ÍvUWVS"(1۾?} P]]uEEO`G@كEu ؋UB GEu UBUBe[^_]ÉU(@U bXJB(B È@sZ(ZX]ÉU(SSҋM ]yEPA(bu Y(C؋C]ÉU(@U bXB(JB È@sZ(4vZ(B8B0È@svZ8ZX]ÉUS(PҋM ]yEPBA(u Y(C"A8uY8C؋C ]ÉU(@U bXJB(B È@sZ(bXJ@BPBHÈ@sZPZX]ÉUSR(ҋM ]y6EPAPBEu ؋C =A(ـEuYPCvAPY(YPC]ÍvUS]SC %CC]ÍvUWVS uFÅۋ} F %t$3hܖ؋X$u݃FFF %jV5tue[^_]ve[^_]UWVS((@ҋu]yEH ( UyVҋ|v9:BEEuf;VuA;Vu FFR11҃AB FRVӃ(vBC;Vu^ RSӋRkuU j‰:EZMABB FBtPEZMAB vVVe[^_]ÉUWVS ( ҋ}uyCE_PtzB9ulE C @Eu~F tIHu:" PE @s  -(Eu:Ct@CF,v[uurh蕾<$Fe[^_]ÍvUS]h0h[t$ sss 3h@D[ uE.]*UE =Uuu((m=uJu((o]ÍvUhjÐUWVS u]h F(UWVS }U u#jj jEpP$X_$RM9jj jEpP$s \>$j Mjq轺P$X\> PjjEp D;Ls0=P\>D> D>Mb`?jjPR (MD9 tP@D9T9ED8D8e[^_]ÐUWVS}~B5(ÅD tFVTDvDDKu[^_]ÉUWVSu (@v]JҿCuZ9}19H!ǁJutdR 9}Q<uJD TB9}74uvD \uƃݛ[^_]ÐUWVSH}EG P PR WJ9~1(@Gu<؃ G P PR P$G$XtËG @ u w P$hu;7vE؉E| t(D; d;ULD}EE mE]mER@PVW}F%E;7m|HuIE@|8 t%d8LDD8 }UE mU]mPE@Pu<t(ܧODƇ}EE mE]m؋EV@PjW{؋]t%G @ u w P$URE@S D;`D:ED: È@t4ʍG Aݔ Q $Y" 11P}]uEmẼ@s@M1j؋URUDŽ81@@؍vE@EDŽ;uG @ u w P$e[^_]ÍvUE@ P PR(ÍvUWVS$蒵VP0 ( \PhrS `PhxS PhS dPhS lPhSh pPhS xPhS1C $C`$jSg$\>(ǯv述ve[^_]UkUWVS,]]苓ҋ} u" h $%@ WP4ƃu h̲$tFdVh`t!݆EـÈ@݃d݆EـÈ@݆rEu v-@]苆t E܋p]EE@(P @jjjjjuuS6m]"$P貸]E݃xHE@tEEÈ@sEKHtɋKD"؃ C@P PR ݃xHE@uTEEÈ@s>u݃݃utI uEE܅tB WRP(WU(yO tTB(uIWtBjRPGOS58"jQ~(G$=(G vHB(dž݃xHـE@UС(y KvGҋ@tEP $ڳX]ЋCt $h&謯ء" P蜶EẼ@sC WSP4؍v} ]e[^_]me[^_]UWVS EEE E}EEXPlj޹8u1Ut R0h` hch(elj޹8PEPh`h(1}JEXtlj޹8uuEph(Uu"z h6}wt0hUBL[vlj޹8u-Eph( 0hƙ蹭Plj޹8uqEph(BUu"Z hݙ^}O0h1lj޹8Eph(tRh WǀǀǀǀǀǀǀǀUlHlhJvglj޹8uyEph(tWhvt!(P@ǁ4AX(lj޹8Eph(Vt"Shh(ǀǀǀ}u^Urǹ 8QjjEp -`$Ur}7hh(Cv}Epǹ 8Eph(`Ur 3h3h(}w3hGh(vt*ǃEl(P@U\CXCdShe}EU}E Ue[^_]ke[^_]UVS] uuu((huu((ju$uhlh(Ģ(%u$uhyhȢ(Ԣ(%u ujhȢ(Ԣ(%u ujh(Ģ(%~e[^]UhjÐUhjÐUWVS U1ۿtAvPuu Su}Eكu]EUƉ؋[Lu¡" PQu}EẼ@s 1e[^_]ÉUWVS u} t&wsRt1"v[Lu݋GLFG>FFe[^_]ÐUWVS Eۋ} ut#9suWs#t [Lu1e[^_]ÍvUVSEۋu t&vVst  [Lu1e[^]UWVS EE@EUBLvU E9P_9WE0 SP,usU[B9~ÃjEpu jVu   h }$ѧRSjPRtu jVu)L?UBLEe[^_]ÉUWVS E EEUE1ۋ}tBE9Cu2QWustS$uuPWSVkƃ[Luu h1貥$EE F}Ee[^_]mUWVS U1ۋ}t$9{uPuu sTtF[Luݍe[^_]ÍvUE1҅M tv9Hux$uB@Lu]ÐUEU t 9Pt @Lu1]UEU t 9Pt @Lu1]UVS]u u h`趤$ 9u FLKE ue[^]/vQLt0v9u BLK҉ALt?jR/vыRLuӃ h>Ee[^]鉥e[^]ÐUWVS EE]1ۋ} t*v9{u SVEEuF[Luٍe[^_]ÍvUWVS(E]}E$E]u ](G(@E,U4M8ɋE_W4_<_DWO G$GLwGG G,G0G(j0/uuu vvGp uuS_P$j(XZuu VTPu@uuRKSWuD$谖M8@@X Pe[^_]ÉUWVS8E Ej]]E1ÃUtEFC j9~u1] h诏ǃ1vD JyEܙQ$Y j]aÃ49vEE0 u jU42SWR C j 9~1?tPVWuF\ ;uSNVWuE5ȟE1ۃJEEt892UE2[LKQ4$]ȃx YP u؃ j8MEȋXX Pe[^_]UWVSu] }y)E119u9{u EC&vʃ<tDFJ 9 u9| uED EUu3 hV$誒 E| D Eǐe[^_]UWVSURu t4oǃ?CE.U T9~։9~ }Ő WsuvU <$u DUDe[^_]UWVS1 ;}OE_;]5EEU [tMU 9D }SWRuC ;]~GE ;}~e[^_]ÐUWVSE@EM U4|RDEE\\\\4|ED[^_]ÉU]ÉU+M 1U]UQM E)MUMDÉUPM E)MUMDÉUS]S4ˆѸH))؋]ÉU+M E]UHE$}ZYh@}jlmȃ}fE% fEfEmm]E}UE mU]mEÉUMH]UMA]ÐUVS j|uJÉ$x$|2É$`^$C$4ZYj3r^F Fe[^]ðt S蝐 h?(=UEEUEE U (yvE H(T yؓtRE0ÐUVSuE[^]vUEEDUUB ـE@E  u 'EuEtZ ]ÉUE =Uuu(((=uJu((*]ÍvUhjÐUESU ]MHX@ @@$ÉUU MBABAB A BRQA]ÍvUS (Qҋ]yYE PBtPS;Cu1]ÐUEPѸH)#E ]ÍvUU SM19uB9Au B9Au؋$ÉUWVS u} V9W|9t1*vRv(XZvwƒ19e[^_]ÐUEU MHP]UEɋUt9P}1Rpƒ19U ÐUVS uj讍XZVSwe[^]ÉU]ÉUWVS EE} MGQ9~Љƅx'VEpMYXVw@9t)Nyڃ h@AEe[^_]鋋ve[^_]ÉU]ÍvUE =Uuu( (c=uJu((e]ÍvUhjÐUWVSEU @B R]uP$MA$,eǃ VSWEx (MP@AEA$E pQAAA >UPB$@ uWr$P$M ËA $P$9u& j,ۋà E0WS&UBvuBt Wu h?(t SU h?(e[^_]UVSu ]Vs M (y跎vNRC$P 1sPR$;Ct%PStu Ee[^]ve[^]ÐUMtDzu2BEu؃ hȇ$1BR(u؉AYÉUEt@@(u]UVS]uu u7u hW$諈v] uEe[^]TUEU t 9t @(u1]ÐUWVS u} tvX(tjP؅u v 薉tue[^_]ve[^_]UVSuE  j,草É$^EF(FF FFFFF F$e[^]ðt S h?(虂UVSE]uU M@P HXp[^]ÐUME UA$A Q]ÐUUB EE BtBu ZB B @B H~B Z]UE@ESvUVS u] vtue[^]e[^]ÐUE =Uuu((=uJu ($( ]ÍvUhjÐUMSA?AA AA(CSQ ACSAA$Q($ÉUWVMSu }(A?AACSQ ACSAA$Q(qy [^_]ÉUWVS(<ҋ}yaE PBGP$X_E䡠(HX]܉MEg]EE@u EGgWUO_ GE7$}]EUm7É$؂]uE- MuO_e[^_]ÉU塠(MP@A$Q(AA]ÐUE =Uuu((,((=uJu0(4(*]ÍvUhjÐUVSuh@] V7F `%F%džldžpdžtdž|džXZSh(\u h`0$脃QlPhV xPhV\@\`$$фP @BB BB0%p h@j诣$,{É$h$ _@@`dth\pXh2Mt S݃ h@(}}F $F`$jV$(@(X}S~ve[^]ÐUSQ]Stxtph譀xtQu l\ ]ÍvUWVS EEE E]uONjs 8U苂t R0h hh(N}CEƸǹ 8u1sh(蕱U|hNju 8sh(DUu z h9`}wtz0hP?f}u~lNjs 8ubjj js}U艂pjj js }}苟pۉtxx18hh(vEU]E Ue[^_]a@e[^_]UWVS(u|P,)ډUxH)ߋX@ju \ P PR$PWVjWVuS8SUMd$r_Z(B@X @@PEBEEE MU;J njEppU Mhut[ E0p[uq@t uq h@(Qkt Sq h@(1ke[^_]UWVS} uWh^hSq jSVY[WVu hqn$ohEe[^_]UWVS u F}t) H vt t/vRh7_hS5q jSWFt.Htlt7tJ`F E }e[^_]GvFE }e[^_]vF E }e[^_]vF E }e[^_]/vPv_hhNSp jSWVe[^_]ÍvUWVS,EEu V(u/hhSPp jSu$Vn UFd]4$]؉4$-]EEE-U[_uuv vFPp0$uuuuh}hWoaà \hjh>@jF @Pvv uvvvuSs8SMUdߵCTHtz`tp j`(B@X @@E Ee[^_]v t SA` hA(Ye[^_]UWVS$EEu ^ SP u1Wvh ]hSp` jSu. $v^vU싄ddEu/SvhL]hS` jSu$ ^F@M;A,~'A,QPhc]hS_ jSuvvv]sTvvh|]hS_jSu`u싆\P $R$U9B rT HMAT@ ]j ^Nj\P $R$^ZE܋EPH Xp,E܉GWO _E_wWuY[uEQ UBTEe[^_]t WA^ h$A(We[^_]UWVSEu EvPY_vvSvh}hWn^jWu,XZvUddÃu)QvhLW.^ jWu$4\vSZv] vvStSu j~]حK0(-B@X @@UE Ee[^_]"UWVSE E}pWSEphwhVJ]jVW ZYEpddu-PEphLV ] jVW$[vE }e[^_]UWVSXU BPUBT@Eu]REԸ]U ׋EWVuuuԋ]h@hS\jSuBu}EEEEuEMU BT8EvGEـÈ@]W$ E pE EEEun j x[ƳU\P $R$E] K[EF^VN U VFFחAhחAjW-EЅue j [ƳU\P $R$E] K[EF^VN UVE ^uuWiv j ZƳU\P $R$E] K[EF^VN UVE؃ ^uuW\E]SucEeEM](>U BTuԅ]̅8O$ ] sE$ YƳU\P $R$E] K[EFVN ^UVE؃ ^uuWXZVuEeM](_U BT vEu]؋]ԅDU BT@$@(t VX h4A(gRvt VX hDA(GRvt VX hTA('Rvt VgX hdA(Rve[^_]UWVS u1FX9F`}WE`UD2R0u \P PR$$SShh(@ ~`tEGFX9FX9u)ḫ^hSDX jSV$LVe[^_]ÉUWVS] CuF(PRRhh(迧F` uv(6h@5_(N F,Vkǡ(yZGt( Htt/ v,v(Rhm^hS_WjSV F@ jWvP e[^_]ÉUUBd9E}GB\t/ u (ppQ\P PR$YZPhS 5 _(/NÉUU xE;PX|1]ÐU1]ÐUVS]s u hTS$TF C SZYVs$ue[^]UUVSu F]t) H vt t/PRhɯC$hPV jS$BhPRK us ]e[^]vـEu؉Ns ]e[^]ʋJtÈ@؉Nr]e[^] UVS]C u tj9p u0 SsS BC $T$KC t1ËSt(9r uB CRTӋRe[^]ÐUSR]S u-hׯC$hPT jC$hPs$v( `$Szs]ÉUVS]C u u2hC$hPrT jS$BhPR,$tRxu29p u- SxrS BC $S]e[^]*Qtvzu9r tIыRh C$hPS jS$BhPREe[^]QB AR-Se[^]ÉUE@ U txu9Pu @1]ÐUSQ]S t\BtUEu5h*C$hP5S jC$hPs$$5QʋB]UVS] uuuX(\(?uu`(d(Au.u)PjhChh(܎t(%|((u$uhYh(j(%u ujh((%|u ujhh(t($Te[^]ÉUhjÐUhjÐUWVS EEE E]usCEƿ8us5(HUB1UuŰ8ujj jsLUB1vEU]E Ue[^_]e[^_]UWVS EEE E]usCEƿ8us5(GUB1UuŰ8us5(GUB1vEU]E Ue[^_]ie[^_]UWVS EEE E]CEƸ8us5(5GUB1uŰ8us5(FUBčvṵ8u:sh(~MAuPshްh(蚟vEU]E Ue[^_]Ye[^_]U EPR uu pR@U EPR uu pR@UVS] uuu((uu((u$uhh(调( %u$uhh(脃(%u$uh h(X̣(%u ujh(̣(%ju ujh((%Bu ujh(( %e[^]UhjÐUhjÐUS]S~C %CC$JC$JC jSe~ hA(`F[Gv]ÍvUVSu ] F %vLYvzLXZjV~tue[^]ZLe[^]ÐUWS]S1эy~*Ct# CDPQss|pCe[_]ÍvUWS]S1t{1эy~-t)C CDRGPsspCe[_]ÐUWVS } EX޿8uUBB1 ޿8UBt P,UBt P묐} EX޿8u+UZREPS5(`UBZPB޿ 8uCEXWEPS5(`UBVShh(֚vQuu u|e[^_]ÐUS]C SP C $P$]ÉUVS] uuuУ(ԣ(uuأ(ܣ(u$uhh(<(%u$uhh((%u ujh((%"u ujh((%~e[^]UhjÐUhjÐUWVSEEE E]CEƸ`8u&jj jsD}G<$1vuz8u jj jsND}G<$h뼉u返8u2sh(wUBuWshh( }.CEƸǹ 8u%s(WvƃVزNju 8u$s(WvƃQtvNju8u s(W?vƃuRR8vu8uRs(WvƃuPshòW荗>jj js B PVu)6EU]E Ue[^_]-ye[^_]UVS]Cuu hCCVSUSE e[^]ÉUVSu ] sPrC1҃9C}B9|e[^]ÐUWVS }U _9|Iۋwu 9~PW1҃9}OB9|t VtDe[^_]ÐUWVSEP1@9 MQu Fv19}yUU9tjQMA@ WVqP$xKRPUB4R. WhuEMA P SuA4R(UBMAG9|F9`e[^_]UWVS|E}O9MG]u C] B RP ZYV5(9E(B$9ÉE! (PSVRc:DC;]~EU9U/MȉMDž|vVuuw}EE~SuuWqE1;u|E]EUM;4}E~ Vuh QVhu-DEP]SuwWEt?PWx.RPGU4WZWM R PSG4R(F;u_Et uAE]|9]ut uAOE9M,e[^_]UWVS 1ۋu;^} }4F P PR 9uF P PR$vC;^|θe[^_]ÐUWVS؃t EPSPX]u h@~%9~%u j$@~% ~%h@~%~%A>[}E lh h@~%X9~%u ju$@~% ~%h@~%~%=36vHfjPR8Q8S/ hP(uSQ0 ,tSxPuj xuPe jhPe Ux9‰B uh@~%U8~%u jr$@~%v ~%h@~%~%<؃t 󥋕BCxBZE P. ]$@~%7~%~%$@~%~%c< hKE P- ]$@~%p7~%~%$@~%~%<1h h@~%;$DB(5v h@~%;$TB(s5 hdB(f5 h@~%;$tB(K5 hB(>5 S- $@~%6~%~%~%$@~%g;$B(4vjhPc $B(4v hB(4v h@~%;$B(4E P, ]$@~%46~%~%~%$@~%:$B(j4 hB([4v hB(K4vC5ve[^_]UWVS0E PUuR+ UU؃ 9Eȃ1H!‰M ]M h@~%n5~%u j$@~% ~%h@~%~%936vuUfjPRxQxS+ EPhuSl, ltSEPf EuPa jEPt GP _$@~%%~%~%$@~%~%E*$7Q É4$Q XZ~%~%j~%VQ Y[M I8QP u}Ee[^_]UWVS\] }M؉KA9C EȉMt~‰ΐJ9K ~B9t SK UȉUB MtEȋPt8@@#B;P u‹@;P 9B tEEEȉ9uuC\[^_]UWVS]Ku S EHw)C PLu7L*SPCLCu LCCP9BPHXP ]؉]ȉD@ߋGtW ҉tNjGw 9tlCxCG;{ t#OtNGpC G C xvD9u8C9Xuxvx CGOtND9:u2G9xupvp H9u8S uCH$vFtv‹BH@9u2Cu C$vF tv‹B @?]Y9)Q :uIBA BtHABD;uvA;HuPvP JQQ Zt;uB )8u vB t8uPtZC BC tPBCD;uvB;P uX vXS ZQ B tQ BA BtHABD;uA;HuPvP JQEڀ:uIB AB tHABD;uvA;H uP vPK QYZ t;uBt8uNvBt8uPtZ CB CtPBCD;uvB;PuXvX SZQBtQB AB tHABD;uA;H uP vPJ QD;2t>tG<uTptM V $@~%~%~%$@~%~%K$4$3$<B WSK ^X~%j=~%~%SK PHLUEEuE Dž8UEExLx|󥍅hQRPP, lthPE|uNutG V $@~%~%~%$@~%~%8#4$ #E}uNutG V $@~%B~%~%$@~%~%"4$"EPU9‰Xu h v88e[^_]Ð|uNutG V $@~%~%~%$@~%~%K"4$3"E hD( hD(}uNutG V $@~%;~%~%$@~%~%!4$!E hD(^WvUWVSp]CEE PUuR C]؃ 9ÉEu 1RvPUP ]]UEߋGtW ҉tNjGw 9tlCxCG;{ t#OtNGpC G C xvE9u8vC9Xuxvx CGOtNU9:u2vG9xupvp E9u0S u CUFtv‹BEU9u-CuCF tv‹B E?pLY9!Q :uEBA BtHABE;uA;HuPvP JQQ Zt;uB !8u vB t8uLtZC BC tPBCE;uB;P uX vXS ZQ B tQ BA BtHABE;uvA;HuPvP JQ:ڀ:uEB AB tHABE;uA;H uP vPK QYZ t;uBt8uNvBt8uLtZ CB CtPBCE;uB;PuXvX SZQBtQB AB tHABE;uvA;H uP vPJ QU;2t>tGEuQptJ V% $@~%~%~%$@~%~%q4$YUB ]SD ^X~%j=~%~%SD EHe[^_]ÐUE@,]ÐUVST] C PuUVR M 9Et!QC9r)@w1t h@~% ~%= ~%$@~% ~%' hJlC0 lB0ups8u؃ P*1e[^_]ÍvUWVS`E EEPUuR= UU؃ 9E1Hr!Ɖu h`O0tUB 5$(Qu 0RG4P9]UEэvEP 5 (qu 2PE@ t EHt9@P#B;P u‹@;P 9B tEV49э]UPv6GP)e[^1_]ÉUWVS|U u1 ERPUBUB U$RUB$RǃEx ‹BủEȃ h@~%k~%u j$@~% ~%h@~%~% []fjPRMQ]VEP]uSt }tSEP6 EuP1 jEPH1 U PRtPE@P h@~%7 $F( h$F( V$@~%E~%~%~%$@~%$4F({vjEP0 $TF(^ hTF(OvGve[^_]UWVS}w u hyGSPOUQRGU؃ 9Eȃ1H!‰u h%u h@~%R~%u jo$@~% ~%h@~%~%[]fjPRMQ]Vw wGPwtjFt+pVx @@@ F h@~% ~% ~%$@~% ~%&4$ WGfjWExW hxh@9Bt h hr urG@P hZ t$xxtrWh 8Hxxh(G 9XK EP$@~%]P~%~%$@~%~%e[^_]Ív h@~%$tF(k hF(^ V;$@~%~%~%~%$@~%$F(vE P]$@~%~%~%~%$@~%?$F(vvUSDEH ɋ] uA1z6UvE9XPEUEȋ9‰E1]ÉUWVS\} utot-SEPUh,(Ru,(U؃ 9E+QEPUh8(Ru8(U 9E1H!…u1WH1ۃwI$PvVRWu-SRWu1QREW@P_XVh (8؍e[^_]ÍvUWVS\u}F EF uPju WE#E ;GVG(P{OtvtpU؋9‰Et`vU؋Z;]t7;] t2SWtQVSG@P;jduS7P U؋UUE؋W9ЉUFu1RPv GPNEwtjFt+pV @@@ F h@~% ~% ~%$@~% ~%r4$Z WR GEe[^_]ÐUWVSE0UBq9gUBSMPUQR#MAU؃ 9Eȃ1H!9PjEph (@JUvEEUEH9‰E jt$@~%~%u j裻$@~% ~%h@~%~% [hfjPRXQXV u' hƿ^_h (1!qEPH98AvHpuD} uCMjdHr1P HpE@P(H@U BPh@~%$~%u j;$@~% ~%h@~%~%t VS CPSP(XHMHA9‰8v h@~%+$F( hF( V$@~%9~%~%~%$@~%$F(ot V hF(P h@~%$G(7v/ve[^_]USu]sh (Ru1!EA EAQjRu 3P]ÍvUWVSƅ?Epu ju uEu4Pt UBu1@@MQ; JAU;BVщDDPUQRMAU؃ 9Eȃ1H1!tA9t9U@C@ 9Br&MCA+B =@v@.ƅ?U8C{uE h@~%'~%u jD$@~% ~%h@~%~%[hfjPRXQXV^EPH8S! LtSEPH) vE8Pb$ jEP# vCPV @BPru u@B @t&@‹Zt@v@@#B;P u‹@;P 9B t@MA;?Eptj~t+pVW@@@ F h@~%c ~% ~%$@~% ~%4$ uUB?v h@~%$$G(_ h4G(R V/$@~%~%~%~%$@~%{$DG(vjEP." $dG( hdG(vve[^_]UWVSU9u h j!$@~%3~%u jP$@~% ~%h@~%~%[]ȋMfjPRMQ]Vp u hxvWjuh (HUNj@ GEPMO M9EvUB;E;E PuE@U PBPTxh@~%P~%u j%$@~% ~%h@~%~%t VS CxPSP]XUMXhEQ9ЉU h@~%#$G( hG( V$@~%1~%~%~%$@~%$G(gt V hG(H h@~%$G(/v've[^_]UWVS@j]sh (u FSPEċCPuE$@~%}~%u j蚱$@~%v ~%h@~%~%t WS CEȉPSP]؉Xe[^_]à h@~%$G(SvUWVS|}GPU؋GPKvREp pG@P]؋K 4(qs7PE؋EU؉EGP9‰EGPExGPMR_PQuSVx e[^_]ÐUWVSjƅ$@~% ~%u j 5$@~% ~%h@~% ~%GGC@@ G EWP| EȉEGj ptƅ$@~%k ~%u j 舯$@~% ~%h@~% ~%tBBC@@ Mqx|uEupDžxl h@~%~%u j׮$@~% ~%h@~%~%=l[PpP@ xHLP|h$@~%$~%u jA$@~% ~%h@~%~%[(hfjPRPV\HPtR ttXP PP$@~%Q~%~%$@~%~%v h@~%$H(o hH(b VG$@~%~%~%~%$@~%$H(vP PP$@~%~%~%~%$@~%=$H( hH(vvXPEP [^jxP% E@dMPQRUB 91H!‰`u txX h@~%~%u jЫ$@~% ~%h@~%~%5X[TdM;AttQPtRt 9‰Ju1 ƅ_1QH!‰Tu h蚯`jx X;@|dVPxtRrtx 9h1H!uCP|QPXtRtX 9H1H!u;Pb8 h@~%~%u j$@~% ~%h@~%~%I[dE;P 8h@~%T|~%u jk$@~% ~%h@~%~%tCPSP8XT TP|WP.8P8$@~%~%~%$@~%~%;`9‰ƅ_WuLxWPx 1tttu h 萬 tL臶SdxVPpUB 91H!‰`IG* X$@~%&~%~%$@~%~%_8Ot+pW@@@ G h@~% ~% ~%$@~% ~%Q<$9 h@~%3$G( hH(jW $H(t W h$H( h@~%$4H(g hDH(Zt t hTH(6 h@~%$dH( htH(pjP $H(jxPk $I(v hI(v h@~%$I( h$I( h@~%$4I({ hDI(n h@~%$TI(S8 P48$@~%~%~%~%$@~%t$dI( P$@~%~%~%~%$@~%)$tI(ve[^_]UWVS,} }E׾,( ($(((EE,( h@~%~%u j($@~% ~%h@~%~%iFUЊFC@@ h8(| u.}u( (d$(((,(OED=<(t>8(ph8() 8(@8(@8(@ <( h@~%8(~%~%$@~%~%k50(t>,(ph,( ,(@,(@,(@ 0( h@~%,(M~%~%$@~%~%J h@~%$DM(o hTM(bjV $dM(ICve[^_]UhjzÐUhjbÐUWVS\E@EƸ `8‹] upjj jEpjj UjEr jj MjqEjj jËEp$Suuu1ul8u$ujj jEpvY[Pu븐 us8u uE뎍v u~8uhucjj jEp jjUr F MUȃxREQP]]] }tE vMAxE u8u,jj jEp((u8}DŽwtjVt+pVS@@@ F h@~%_ ~% ~%$@~% ~%4$ WG u8u u u8uE P/uƶ 8u EfjPPuSue[^_]ÍvUS E EU]EUUC(EC,S0S8(҉yQEPC@ jQsP ]UWVS8( u] yKvS< (y4‹Flu =u"Qr2V VXwPFXPR  P26hҶh(3 (yK{ tTB(uIStBjRPCKR58"jQb(C$(C vHB(e[^_]UWVS\E UEUMI\A9ȉE؉M}ΐE19BJu G9AutB_UB MtE؋Xt0@PuB;P u‹@;P t9B tEEE؉9uu\[^_]ÉUWVS`E0(hS32^5(xjj jW UBh2hS2Y5(xǍ]$@~%~%u j$@~% ~%h@~%~%m36vhWtZjj jP_ZVES# ZYMQPQAPEP" _Xhj+uE9}\vC3C 0F]h@~%x~%~%$@~%~%E؋CCu30Fh$@~%H~%~%$@~%~%:E؋CBXC30F8$@~%A~%~%$@~%~% QWP( t UB\UBt h@~%~%u j辙$@~%v ~%h@~%~%!tCPSPXE9 EPq$@~%]~%~%$@~%~% E0hh(.[5(YuǍ$@~%~%u jژ$@~%v ~%h@~%~%=36vhWUtkjj jPZY3P _XVS ZYQPQAPP _Xhju9C3C 0Fxh@~%X~%~%$@~%~%XCCh30FH$@~%(_~%~%$@~%~%CC830F$@~%~%~%$@~%~%UBp$@~%~%u jŖ$@~% ~%h@~%~%)߃t󥋅PSPX9C Ph$@~%~%~%$@~%~% E0hh(+YE[X}PDŽWwtjVt+pVb@@@ F h@~%n ~% ~%$@~% ~%4$ W UG2h2h(+X5(q^_hPuE@lvjj jPUBl h@~%$0N( h@N( S$@~%~%~%~%$@~%7$PN(v h@~%$`N(E؃ P]$@~%4~%~%~%$@~%$pN(j h@~%$N(O hN(B S'$@~%~%~%~%$@~%k$N(v h@~%O$N( P$@~%b~%~%~%$@~%$N(ve[^_]UWVSpE0hh()[5(oUNjBpEȍUE@p]RMQpSuVE]lh@~%~%u jے$@~% ~%h@~%~%A36vhWYthjj jPZY3xP _XVS ZYxQPQAPEP _XhjuE9vC3C 0Fhh@~%H~%~%$@~%~%`ECCX30F8$@~%j~%~%$@~%~% ECC(30F$@~%~%~%$@~%~%UBp$@~%~%u jӐ$@~% ~%h@~%~%9߃t󥋅PSPXE9N EP~$@~%]~%~%$@~%~%E$e[^_]É h@~%$N(+ hN( S$@~%~%~%~%$@~%G$O(v h@~%+$O(E P]$@~%D~%~%~%$@~%$ O(zsvUVSEXt:E QDDPUSRU 9E1ZH!1ۅuPhBhCh($V3hFEPCxC9‰htOuQxphIVXZVEP xHxXC9‰huVEPhCh(1$e[^]ÍvUSu]u PtP3hMh(#]ÍvUS8E ]EԍEPK\UQR C\U 9E؃1H!u1VvC(BC,E C0S8(yvQ‹EBRC@ jQsP ]UVS] uuu`(d(^uuh(l(`u$uhbhp(|(`%u ujhp(|(`%e[^]UhjFÐUhj.ÐU} u}u (]ÉUhjÐU} u}u (!]ÉUhjÐUS ]CC jP萳CC]ÉUuPe$UEU ((h( *UUu P<t@ v1USE] PU3P@X ]ÐUUE 0P<u)ESvUWVS E Eu1^)9s$FuSZYSVI^9A PH_XuS[ZYSVt]e[^_]e[^_]UWVSu ]V3蝕{ 1ʉу D NPVs h !WW3Mt"Vs h1!5_($t}e[^_]e[^_]UWVS u^1ٍ9Nr hO!5_(i$SV^e[^_]UWSU 1I ]v! 0Rs h!5_( Ee[_]UE@ %@@]ÐUVS]u C %t Pt]e[^]!e[^]ÐUEPEPUÍvUMU AQ]ÐUEU HJ BP]ÐUWVS ]u t Pb1 Qu Ee[^_]UWVS EEE E]~Ss!8u9}E~s h(,ECE EEe[^_] e[^_]ÍvUSu h!SbXZS5(]USj] S5(t15Shȱ!hS@uS5(E]UVSu^t#KtQtB QRPuދ^tvStB SRP[ ue[1^]ÍvUWVS U}B u WVVRPEXtEvVsu)SSVhѱ!h(vuUZtV3[ uE05(NZYjVVh!5(P=? Eu0 j]YXVSXZSu/Y^G {SWPE>t S hLQ(G {S G zRWP1e[^_]U E0h!5_(UUtQE PR5 _(nUUE B(B %Bt Ru ((ÐUVSM(9ʋu A %(t1tАË9tutt M[^][^]US(Rt C SPu]U EU J PEPRQ UWVSu}F WuVP Ã7SXZSh(} GS PEPSRHuSh(^_C jSPw (jShh3! 7u LP!NjShh7! 7u lLPMC SP1Qvh@!h(e[^_]UWVS$E0u L^_EU2h(jEEEEu E8Ovu E8p= u Me EU4h!u b[u'M܅tj(VRtUB jVWRPÃtjVWh!u u;à u辩EE9E}RUE4m! 8u E̍vEPEPUE4u gÃe[^_]USQ}t(!F$(EYXWS C %ssWSEu3e[^_]À}t S豼 hQ(QUWVS} WuuE>F$褼EZYWS C %ssWSEue[^_]À}t S- hQ(͵UWVS] S}W$*ZYSV[XEF %FVWe[^_]Ét V轻 hQ(]UWVSu Vu$軻ÿXZVS EC %CVS1ue[^_]Ét SE hQ(U]ÉU]ÍvUSu h!hS-@u jQS5(t j.]ÉU u h`!5_(EvUS EU]M XPJ PRQ]ÐUWVS]Su cu}t 1vEtSVkEWVNt jm j,Y^WSEC X%C!t S͹ h R(me[^_]UWVS]Su 诰u}t 1vEtSVEWVt j jxZYWS]ECC @%!t S hR(蹲e[^_]UWVS]Su u}t 1vEtSVEWVt j jĸZYWSECC (%!t Se h,R(e[^_]UWVS]Su Gu}t 1vEtSVOEWV2t jQ jZYWSEC %C!t S豷 hiE~ V) u A$wh "7u x?e[^_]ÍvUĆUWVSuvu %(NjF8tPu P(1ۅE&"tFEuu EE t* jh)"v h+"uh3"vh<"vt jEPEPv CTPGt jEPEPv w UttEuVuu P> u @$h)"v h+"uh3"vh`"u )>e[^_]UWS]} C CW1Q$yƒ1҉Se[_]ÍvUWVSEPM UQREu}R0$ 衃UPUxPp C e[^_]UVSu EPP,ƃt-^ Ct sЃ S諄4$W1e[^]ÍvUuh"h"h(Ϣ(USR]jjPsZYP3stP3L]],UWVS(uFEFEǹ1уQ蝂E衬9$@$E9$P EFjh"u$F8tPu蝞UVE P9NjE1ۃ9E}j4YC;]|Wuu j;uRSuuu %Jt<9$U9B u/ jˁ9$PU UBBE1;]}!vH RӖC;]| WՂYûEFUVEe[^_]ÐUWVS} utEPW01ۃ u=B(u[tVSCtSu ; EPÃue[^_]UWVSE u}tEPu 裃1ۃ V<VvE x(uCC0V&ItWS裗t SVn: EPsÃue[^_]ÉUWVSU ҋ}tEPu v1ۃ uW<XE x(susC X tWVtt;9$uVu9 EPςÃue[^_]ÉUEtu PP,1tP 9$9B uB1UVS]uSu tNX1t @t~ Vw;tC tCPV9ue[1^]Ív]E "ue[^]UWVSEEEu}Euu XCPWϔuhSt5jBu R PuV貯Sjh" jh"uV茯taQjh"VC31|z Ve: jh"Wh"uh "DvEEE "ue[^_] j V:$h"uh"V7e[^_]UWVS]}Su ƃt3 W9 jV Bu QRؓ^ZPW?7e[^1_]Ð]E "}e[^_]vUVSu ]EsPS4$ C CXZjs4W~FC,C8C<C$C(CCCC $ |C00@@@ @@@@e[^]US]S]]}UWVS\u~FPWE"E"D URPWE#D]t SjWVOB @t]؃ S~ƒtIB @ut$F4x(uBvBhPWV "EPv4f~ƒu]Sv4N~B @ Sq~ƒu v4}VtEPR~-1,X Ct sЃ SN|Eȉ$~uЋFt PL}_v#|vV`[v0 |Yv4|e[^_]ÉUWVSj@}u z$4tzۉC4t8t&uVWS;$$ShVW:  S{1ۃe[^_]UVSu ]VDC C@CD4$ZYPS4$CPCHCLY^CTjP<{XZjP,{ǃe[^]ÍvUWVSLuuFEFtLPuE"E"B URPuEA]tSjuVKE]SP|tU W3|=XuX9t3sAYZPsQBXZWEP{uEPETP{)X Ct sЃ SyE؉${uЋE TPzt" Pz[ydž VAv0VF@uFDtV0FDuE FVE$Xz4$0ye[^_]UWVSh}u w$4wۉC4tEt3uVWShuVWSUhT'ShVW7  Sx1ۃe[^_]UWVSEu E}uVuE "E ue[^_]H}E&"E ue[^_]vQPwVAuEE 9"ue[^_]5 V3 4V0C;]|e[^1_]ÐUWVS$uu }uPhM"7u }VhT"7u EtGSjh`"u jh|"uhv"uhv"uhz"u /X;]}?E؋E܀8-u@E܋DEEPju uƃu;]|à u 11e[^_]ÉUWVS$uu ]ǃuWhM"3u v}tkVh"3u C @tu؃ VOxÃtXC @ut*G4x(uCvChPu WruEPw4wÃu۸uC_ۋt'Pu S=ZYPu >ƒ1 u 01e[^_]ÍvUWVSE} EuuWÃuEM"E }e[^_]j}tE"E }e[^_]vvWEuFEE "}e[^_]sSpXZuS9e[^1_]ÍvUWVS$E EEE]uuEuEM"UE Ue[^_]}E"}E }e[^_]CEƸ"ǹ8uw}~!E"E EEe[^_]v}u&SjUB0u;ZYPu'C"Suu}wG USf"Nju 8u<}~E"E EEe[^_]W1}uCPUr"Nju8uH}~E"E EEe[^_]V1}uCPUru"Nju8uH}tE "E EEe[^_]DCUE}BE }e[^_]7v"Nju8uD}tE@"E EEe[^_] sssUru^`"Nju8uH}tEe"E EEe[^_]CUE}BE }e[^_]3vv"Nju8uD}~E{"E EEe[^_]Q1}uCPUr4u }E}E "Ee[^_]91e[^_]ÉUWVSDuu ÃuRhM"E0u Dv}tPh"U2u E@Eĸ"Ƌ}Ĺ8uEpEP5vUĀ:uuF8tE PEPu EPƃ{u j4XoCZYjPpWSEpsu uuuuԋUrs? 1e[^_]ÐUWVSE] EuuSZ Ejh"S[ jh"SIMuEM"E ]e[^_]}E"E ]e[^_]vtu EE "]e[^_]v~F EEEu] Ee[^_]lUWVSu }]uVƒuEM"E ue[^_])GvE"E ue[^_]au hssVRà vhsVRÃt WjSV"1e[^_]UWVSEEE} EuWƃu!EM"UE }e[^_]_v}E"UE }e[^_]C;]}hE4WVhte[^_]ÐUWVS } EW`ҋMt?AZBA,r W`@BuuuuWEG`XG`p Pjh"W!Ee[^_]UWVSu} WEuQhM"E0W[}Rh"E0WuEu jE0u#jEp0h"Wuà & W( E4h "W% ulu'F;u}!EPEPE4WwÃf؍e[^_]UWVSEu E}uV uE "E ue[^_]L}EQ"E ue[^_]vSPwVuEE c"ue[^_]9 V' 4V$C;]e[^1_]ÐUWVS4u} Wu EEEuRh "6WR}Phv"6W8v uÃ[t,P jEPEPh"R` tͅu Vjh"1ҍM؍vB0W[2FEԃF"F "uVuWPEUЉ1҃]؉BɉukvW& ÃuSjh"WFsSZYuS$7h"vWM uPjvW1e[^_]ÍvUWVS$uu x EEEEEuVh "E0u }tSh"U2u EPEPMqu tt E P9hU19UEE4u / UEE<1у Qg j h"S臄ZYE4S _XSu ¡u$E4u U1҅‰U؃ Sh]؃FU9@19}oM܅uhv^1vtM9t@t9tECU9} E4U܃UF9}}܅tu܅t( u=h[u4h Urh"/MA@t@ ujfEEpZUYB@0RNMA@U19}E4uF;u ugXug_uI^uUB@t!v0uMA@]tv3u[ u Eph"$ u g[ug Urh"u  uYu !1e[^_]ÉUWVS$EEE EEEEEuuEu"E "U܋ME Me[^_]Q}"E"u܋}E }e[^_]E܋@ "E؉Ɖ8*}~$E)"U܋ME Me[^_]3v}ufu ~@u 19G9tvËC90u,ZYPu]ރ9v}wu3ǃu"U܋BMEE "Me[^_] uYÃ[t9;Vjh"uSjh"uEغ A"Ɖ80}~"EJ"U܋ME Me[^_]}uN u^Du0u+ZYPu*[Wv}wuǃu"U܋BMEE "Me[^_]E pL@LPnÃv[t9;Wjh"uuSjh"u UrLMqLvEغ `"Ɖ8 u}Eu E܋@E}~$Ei"U܋ME Me[^_]kvt[ uv0uQ*MɉtuVxtVu[vEغ }"Ɖ8uT}~"E"U܋ME Me[^_]R1}uu܋FPEPu'KvEغ "Ɖ8uP}~"E"U܋ME Me[^_]=P1}uu܋FPETPu-Eغ "Ɖ8uP}~"E"U܋ME Me[^_]W1}uu܋FPETPuiEغ "Ɖ8uL}t"E"U܋ME Me[^_]]u܋FEE}TE }e[^_]LEغ "Ɖ8uL}t"E "U܋ME Me[^_] uvvvETPujEغH"Ɖ׹ 8uN}t$EQ"U܋ME Me[^_]vu܋FEE}TE }e[^_]4uE܋UMEUM ue[^_]1e[^_]ÉUWVSDuu (EuWh "E0u }tVhj"U2u EX"߹8uUrEP0;uUB8tE PEPu EP ǃSuċE]pTS:uuuuuԋUrS 1e[^_]ÐUSu] ZYPS1҅J!Ӊ؋]ÐUSu] vZYPS1҅J!Ӊ؋]ÐUVS$EPu uVL%1ۃt}uuVjÃe[^]UVS$EPu uV%1ۃt}uuVVÃe[^]UWVS$]3uV} :%E؍EPjVSE܂"} t1 WV.e[^_]ÉUWVS$]3uV} $E؍EPjVSE܂"}0 t1 WVe[^_]ÉUVSu 6]S$EEPjSVE"e[^]UVSu 6]Sb$EEPjSVE"e[^]UWVS ]C} utQSWs j4^[CXZjs\VuVuWsde[^_]UWVS]Su Tu}SZYVWVuu S,e[^_]UEHtRPu pW1U EPu TP:UWVS }wEEE1ۀ>t)Vu ÃuWVh"u e Epƒv19HR!Åt jEPEPw R] t3UuU0u U"GWuu uUE wEe[^_]ÐUWVS E] U{`MC`RuQVS {`e[^_]ÍvUEVS] s`C`PURMQS s`e[^]ÍvUEVS] s`C`PURMQS葖s`e[^]ÍvUSQ] u( j4$YXZjZQEPuR0UP ]ÉUSSU ]u1-vuP,ۉt 1tB 1]ÐUSPU u1-uP,Ãt SwZ1]UWVS=9$lDžDž.DžDž"Dž"Dž"Dž"1vj5C/>KPjujuKVPut"u9$ Dž Dž1ۍH RlCt Sjh"v 9$u4 j4V9$uRjh"vjP-X9$u3 j4V9$uWjh"tjPWVPu9$RR0ۉtQjhM"uRPu9$RR0ËtWjh "uEuuPjh"S vt u@t t Wjh"rF P @PS BPR RP[^ZYbjjh"u0 uPjh"u jjh)h"`jjhx*h"jjhx+h"jjh,h"ljjhP-h"Pjjh0h"4jjh1h "jjh2h"jjh3h"jjh4h"jjh5h"Hjjhx6h"jjh8h"pjjh;h"TjjhhBh""@"3 h"Po^_h"RyoY[h"PfoXZRu\@" h"S o^_h"SoZYh"So_Xh@"SnY^h"SnXZSu襌" h"Sn^_h"SnZYh@"Sn_Xh"SnY^h"SxnXZh"Skn^_h@"S^nZYh"SQn_Xh"SDnY^h"S7nXZh@"S*n^_Su&" h"PmY[h "RmXZh@ "Pm^_h "RmY[h "PmXZh!"Rm^_h"PzmY[h@!"RgmXZh!"PTm^_h"RAmY[h!"P.mXZh""Rm^_h"PmY[h@""RlXZh""Pl^_h""RlY[h#"PlXZh@#"Rl^_h#"PlY[h#"RlXZh$"Ppl^_h@$"R]lY[h$"PJlXZh$"R7l^_h%"P$lY[h@%"RlXZh%"Pk^_h%"RkY[h&"PkXZh@&"Rk^_h&"PkY[h&"RkXZh'"Pk^_h@'"RykY[h'"PfkXZh'"RSk^_h("P@kY[h@("R-kXZh("Pk^_h("RkY[h)"PjXZh@)"Rj^_h'"PjY[h@'"RjXZh'"Pj^_h'"RjY[h("PjXZh@("Roj^_h)"P\jY[h)"RIjXZh)"P6j^_h*"R#jY[h@*"PjXZh*"Ri^_h*"PiY[h+"RiXZh("Pi^_h@+"RiY[h%"PiXZh+"Ri^_h"PxiY[h+"ReiXZh,"PRi^_h@,"R?iY[h,"P,iXZh,"Ri^_h"PiY[Ru蹆t vRjh"u1e[^_]ÉUWVS[6 j虱$QLlj}썇GG`<$GGGGjG PkMGTGXG\G`GdGhGlGpGtGxG|jP MLJLJLJ$ LJLJLJLJLJLJLJLJLJ_ ƇGjjNPW&G u \Pp WδU쉂B ~u~u~ u PKpMAUR6Q\RE} j4BJ‹EMABBB F B~uBR vFBB ~u BRvFBBB$B(B,B0EP > E|>tcvjjFPv6u6E PURLu6Po@ MAM$>uE새 WV<$$]PtP~PWz jPPW6zjVPW zjjqjPW萈W[VPWGjVW2e[^_]ÐUWVS [.}t2t~u66W>ue[^_]ÐUWVS\[u jGǃ PEPgu j4GjPIEPEPRR0U UWx e[^_]UWVS[:U}tHEPRJJ0F U 9u9xu PH4$@I EPPJƃuǍe[^_]ÍvUVS[uu j4FjP=HEPu RR0ƃ}uV  jFƒEEBV e[^]UWVS [:EtHu UP,ǃt'w >tuv VG<$+He[^_]ÍvUVuEtu PP,uP tBuÐUE]ÍvUS[lUuPRt]ÍvUWVS,[&EEЉEԃxT~ P kUu Pj EpUr$EЋxtHEPWGt u؃p u4$Gu W2G<$ FEPEЃ PGtu؉ p E4$Gu EЃ PFUЃt~E؉ẺUЋǂ.p P8F>tuv VeEuWFuƒ WiF<$AEEЃu Ur"uEUЋ8 XEǀxlt plDUBlEЃxpt ppDUBpEЃxtt ptDUBt u4EЃt&UЋp PODEЉuۋUЃt 9UЋ 8 WEǀ t w 7C<$CuEPuuCe[^_]ÍvUWVS [EEurVPu\tjYP|7hju u2t-NjGU;Bt*jPPu$N%Epu j4AƃjVBUrEPuVV0ƃ}u) jPuPu$$닐?t 79CG 7~ t Ee[^_]UWVS [òu EEt vVPun[tjt 6A>w ~t Ee[^_]ÍvUWVS[Z} uEuFVPW!Zt:EPEPEPEPhjWu+ }t}u FE}EURuƒ\Rǃ}uNw F0EF0Vu EURuƒ\Rǃ}u w @ j4>Ɖw >EFFF F FvEFUV EF$V(F,F0}tE܉F0vU܋@0BE܅uVu02e[^_]ÉUWVS[} uEuFVPWXt:EPEPEPEPhjWu&* }t}u3FE}EURuƒ\Rǃ}uvw 9FuEFUVEF$V(vF0EF0Vu EURuƒ\Rǃ}u w T> j4<Ɖw >EFFF FUVEFFv UV$EF(F,F0}tU܉V0U܋@0BE܅uVux0e[^_]ÉUWVSl[EE}E@~ UP<ǃ;u}v E4RF;u|UWRu Ep RƍE9t W#=e[^_]ÉUWVSl[nEEUUE@~ MPw;EEE9EEUM<эyU:uPM1FFFF u F2v GP:F WUM4PWF~EU4@EM9[EURPu MqQǃ ju xtu @u $PPu mE UM4> VkOEE9E|ٍE9Et u^;e[^_]ÐUWVS,[ê}EEjju Py*Ɖu:jPu Pt ?u#P*vFE؅t?uRu)EPEPEPEPhjWu% }t}u j1'Euƒ\Rt0 jWPWEPu0$EԃUEPuЃ\Pp EFVu, VuuTǃt 6:EԉE؉F' uy:F ~t Ee[^_]ÍvUVS[ujju u(u Dv‹F BFB ~u BRFBFBFB$FB(e[^]UVS[Âujju uU(t= 9QAFAFAF A FA$FA(FAFe[^]ÍvUS[ U t:uN Ax(uA$ÉUWVS [}u te~t4jFpW6VE;PtjVPW>t&Bx(uBjPWe[^_]UVS[>ujju V'u PV e[^]ÍvUWVS [E} ,t 7%8ltG,$t w(W$G G0tp0uu?t 77G W e[^_]US[LEHx P6]UWVS [u}EPu G PWPE}t j$5UB EH }u9y;qt~q9}y}v}}B9|EAEA e[^_]ÍvUWVS[fuEE싀EU Mut|Eu0U 9B u"zuBVppureǃ$vEPu JVuPuDjǃ M 9O QDI>E@`Et UB` u.MAT@AT;AX u+j|Pu$qEtT u jVu$$VPPu Uz`tB`MQM 9A ujqM9uF;u9Vu F ;tCFt+U9t PXM싁F u PU 9B t$MARuPǃtWQE pU9u F;t6 u VMAu uVǃtE_U rE싀EUǂF(EFt-FVu*N~ VGEM;u$tWuǃUzTu5u RǃvEuWuu Muuu uEU쉂M 9MytQ;t RO2E x t@ xt u PM A UEP`HTe[^_]UWVSL[b}u Wuje[^_]ÉUWVSl[EEE @~ U P)E;u }4E<IQU4NUF;u |͋E UuRPuǃ juxtu@u$>Pu;u }U8 P=F;u |E9Et u)e[^_]ÐUWVS [uM UE~`F`PRQV~`e[^_]ÐUWVS [ÒuM UE~`F`PRQV ~`e[^_]ÐUWVS [OEDžu mv} ~}u(jtPu$8 U2=EtUMQtRR,u* u?$Px jjuQtDžEjjPu tDžtoE @ PI&jP;u }vMDF;u |ꋍM Eu@ uE$PPu$Z  uuu uwW FE9& Vu@u;jPV?jdVA jPVQ@jPP0@;u }bPU4; PW?E H9}jPW? dSF;u |jPV? ju4$At-8 2X9 [%e[^_]ÉUWVS<[â} эqE8u88WGGG u G,v FP\#G Vu P@GwEPWu-EUċ49B u!rPuVB jVKvUċ<9B uuVppjB jVvjUċBu R49PuE8] u7Mjuxtu@u$8Pua?" Wr7jPu8Ee[^_]ÉUWVS[÷E@h<Dž8DPu 8ǃDu?0t.?1uG j'Du7?!u20u j 1u jDUvU 9B B8@9u8B@;t^8@t6@9t PF@8B u PE @ U 9B yDWHVuVDWu(4< <9t 2!4tz;} vvu G;|㋵;} xt vPG;| HPiU;+jjPHV=Y;v V"jjPHPN;v HP|"jjWHVjjWV jjWVjjWV @P;u HP!HVu 4$E @8 uju{8BRuV48Hx PiU B B4u.@U@Vu> V24e[^_]ÐUWVS [.u} jB8UPUPP e[^_]ÐUVS[uM 9u A R t9J uA B Q-uߍe[^]ÍvUS[lju u]UWVS [B}um8u jjLPWN j7jLPWM u jVPj[PWM }t?uu P$VjLPW)N > V0e[^_]ÍvUWVS[[u P6t"jPW6uuIUƍ$8e[^_]ÍvUS[E PuV]ÐUWVS [îuE ~`F`PVT~`e[^_]ÉUMU AX~QX]ÍvUE]ÐUVEU Mutttt4$ÍvUVS[8u/2FFFF u uV4e[^]ÍvUS[äu uw]ÉUWVS [z}?~ Pd?G txt WP W0E$cƋEFF uu P6G we[^_]ÍvUWVu} VjVtBe^_]ÉUWVS [úE8~ P>U9B tRjE@EU ;P~_ ЃPEU EPǃuUtftuEEUB un/U EEe[^_]UWVS[E @ E;EPu .ƋE0U$Eǃ;us%EE܍vuVƊEG;ur+EUEB}tExt u PU B EBe[^_]ÍvUS[ E p]ÉUWVS [UBEE PUPxuUtftU BB e[^_]ÍvUWVS [jUBPUEE9}UH<~vEF;u| E@P[NjExUPE9uPuW2U:-;u}WUPǃF;u|e[^_]ÐUWVS[ëE}Puju "EPj(PPEpu  Et v}/Puju ."U Ur+EEEE@8+82v|ؽؽؽؽؽDؽؽؽؽؽؽؽؽؽPؽؽؽؽؽؽؽؽؽؽؽؽ\8ؽDؽDؽؽؽؽؽؽؽؽؽPؽؽؽؽE9E}uEPUM4 }uEE}a}A}bt}BuUЃyBE@E"vEvE vEE9E}uEEGvEPEPUM4BUu [(}u EEE;EEEf}}uE}I}uE9}}u};}~}+}!;}~}؃}u}}}E܀8t!ƃEPEPEPJ;}~}ظ}` u uPtevEEEMA}1(ˆЋUF;u hujME4u z:E u U :b RQUЃyB)M9M}uE)E}uEE)9EuaEuPuWx}huX;UEt} MFEM x@xB;UU;U}IMte EFEM x@xB;U hujUM4u 8E u!E8 P"E@E"vEvE vEU9U}u/E);EqEPEPE}}v}u E)}EE)UU9*EMM;u}1EPudUU PujF;uEEǃ hujME4u 7E U : Rv}uE}tQE)9EG}Z}uE}t9}~9+}3v}}tE;E~}v} vuE܀8l u UEPu #$( u ! jPVPu!Pu ۻ$3 V8e[^_]ÍvUWVS[Óu}PWj $PjPhPwu   u 豤$ +YT4(̢8ġxp@؟T(tFv y EPwu 7  EPw u  EEȉF wVP t7ju 2$PPe vEPwu B u"WVu g) Fv  tw-Pu uWVF!ǃ WVu WV&!ǃ WVu ۰PPwu u~J V7 VHP 4$&Xt 0/uj8tR j0x vjjos w$HjP?HPwjkX@BPwj'v GP~W4$l VW 4$bt 6P wu ` w F Fv yHPwu Pw u F wVPt7ju $PP5vHPwu Pv WVRǃ WVu 蟪 wƒ hPRu 3ƒlR,h$rkKPwjwu+; ƃV w0$t r t&oj'vj0vj9POvjw{ wƒ (PRu ƒ`HPR=ƍ($=u:ju ͐$PwD PHPu 衟HPu 2sWVFǃ WVu Ɖ<$PwƉ4$guwu 覛'I)PV/Pwu _|v w  RRP ;}5j4ͻ Pj\F; t]PWjfPwu K w r RPu - PPwu ~D 0u#jt] )vu(P wu urj8PPvtj2v u 9x2vujwu oPWju e[^_]ÐUWVS[S} u ƃ WuVE8uN>~uI 7 PVuƃt#WuV諷$ie[^_]ÐUWVS[÷} u bƒ PRWƒt&uREƍ$VW͘$e[^_]UWVS[+} u ƒ PRWƒthuUƍ$fy=t4jW$Pu f PtPWŚ e[^_]ÐUWVS,[v}7uV$VPu u w uV$VPu u GPuV$VPu u gwuVt$VPu uj 3wuV@$VPu u6 wuV $VPu u w,PuV$VPu u w8uV$VsPu u t`w@uVm$V Pu uc t0wHuV=$VPu u3 u; h GP/PPu uƒ e[^_]ÉUS[U%=u %=@uv%= u h%=`u P%=u 8%=u %=u $ÐUWVS\[Bu}tPVju 4jvu 萨ǃPu dvjvu Pǃt;t6E p%PuVVu kvjv u ǃtNtuc?Pu ӿL u ٘ EPvu _ǃu*}DH!u u 虘e[^_]UWVS [ߔuDž$E UMExh}~ EtX|PVju gjPu ̒$Dž$Dž$} ~ EPK ;}} G;}M~O V4$4$4$4$;}NG;Dž9PR tu G$]<ZPR tu $ ȋ< t@ 9 ~ G;/E DDž 9 ;v T9B t=PRtu $tWP T9B tCPR tu ̎tW V- u 7$P43 PPu ܎$4Dž$ ; G;(ju 蕢$t\uDž$Kv$$uJE pP(V jVu Xv 9 $u u ~I E9 t $e[^_]ÐUWVS[Dž hDž@DžDžDž}Puju n v4PUrs4Dž9i vuDžDžDž(Dž,DžDžDž8%tK v8%t9+ Dž`x%u( Dž Dž.%FDBtb0jj P|0:$u>BDžd @d U9Y vDž- 8-t8#t80t 8 t8+uk:-u Dž80u DžFB:-:#:0: :+DBt/0jj Pa,0n:*uaE9R,PE4u HX,y,-DžF,~ Dž,,y Dž,,t",V>t F>:.u.FBDžDBt.0jj P8(0P:*uDE9*(PE4u 0t"(V >t F>:lu B"8huDžhF@FE9wx+,vl\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Fd$PU4u jz(( z PU4  Pt9(} ( + 9,,) $PU4u , PU4u NDž @( ~O@( <jP P8V0 jV,; ~ t v9 ~Dh9t ^ @P +xz`4tdvt$PHv$70u uF,,V$ƃF,,ƅ0uƅ 9,~ ,)u~GN + t%P W  GN EPjo9u ih9t *|j<&vtj| jPu h9t  : Re[^_]UWVS [ UPǾ;u} E 4~F;ue[^_]ÐUWVS[ÎEEE9E}u#EPU}4u 肟EE9E|4 U}tE$Pu䍃\[v EU4E}9}}ƍ8uEE9E}}t UUEE}9}|}  EU4;E8eu$ƍ8uEu䍻8uEE9E|jEH9E}jPu +}tfjU}4L EUtE$Pu䍃Pu Ӂ.j}E4u jU}4u e[^_]ÉUWVS [V} UuBvPVjWBvvu E2EPvWlt.PWu5 hujvW uPWn}e[^_]ÐUWVS [Ú}uPVju TEPj PPvu  'U+؀~~~~x~`~H~0~~~}}}}}x}d}P}<}(}VWu uvVWu uvVWu u/{vVWu uocvVWu uKvVWu u3vVWu uvVWu uvVWu uvVWu uS vVWu ug vVWu u vVWu u' vVWu u vVWu u' bVWu u NVWu u/:VWu u&VWu uVWu ue[^_]UWVS [}Uu }tPRjV rǃWVaƃu, jPW-Pu {$lTjj(xNjvt*F tjFP PWu z6uփWu ye[^_]ÐUWVS [|U} }tPRjW~ rƃVW%`u. jPV-Pu 6z$莦5vP 9B urr4ƒRu 3ye[^_]ÉUS[`{U Ѓ}tjujRURy$U]ÍvUWVS<[{u} u bEău 8Eu EEuuS wtƍEPEPEPEPjjVu E0}t<VuEE/PWju nrjjuE}CEPEȃ\PU}vEȍ~u~}tuWttC}tv ǃWVu jWmǃWuu w EPƃyE9E}EPEă\PpEč~u~}tuWt7EWƒ\RujW Puu Qw EPfƃuuu ve[^_]ÉUVS[xu U}t9PRjV7 rt jvjVv$e[^]ÉUWVS [Rxu }tAPujVDkv EpEEp ǃuVC\u jPu- pF FPW9~tP jvjEpu  u) Ep7$-RP\jBƃ jVjEpu w u> V떍vju u$7>6"j-PWPuPu Du$蜡e[^_]ÍvUVS[ævu U}tPRjVG r1PV!t@u jvjVt$qe[^]ÉUWVS,[vu} u zEЃEt4u wEԃ/PWju jj`qǃEPEPѿ^vB @uFEЍrur}tuVtjV PWu s EP詿ƒuWu re[^_]ÍvUVS[uu }tjujVAv'otjPVSs$ jPV2s$e[^]ÉUWVS [Òt} Uu2`uj F`pWr$EPEpW}G~`u5 j-PEp PPWjr$žbV`EBEV`tB;EtERt9Butr rRoPWTqPujWe[^_]ÐUVS[jsu }tjujVaQvjPVtjPVq$WjPV~q$6e[^]ÉUVS[ru UMBvBPQjV%vt q[PV袋e[^]ÍvUWVS [vr} EUEt0u rE/PRjWD9~`t-F`xt$jjmjuVWVWoe[^_]UWVS,[qEH`QBEԋA$E̋y(A EEVE@ u?Gu9w}tuVtjV Pu uo EԋEEЋU9U|}EPuipvx WuS}uuEUȍpz(up}tuVotjV艏 Pu uo EP/ue[^_]UVS[êpu }tjujV'tjPVn$裒e[^]UVS[Npu }tjujVE;vhKPVtjPVn$8e[^]UWVS<[ou} u EuEEwvuS wTƍEPEPEPEPjjVu %0}t<VuEE/PWju NjjjEă}EPEȃ\P5Eȍ~u~}tuWTttv }tsEPVu ~jWME Vflj4$0Sut$ WStuuu l EP轸ƃHuu ke[^_]ÐUS[nU Ѓ}tjujR,tjRVl$]ÐUS[ømU }tjujRjZPRk$趏]UVS[fmu }tjujV];vh^PVtjPVk$Pe[^]UWVS<[lu}E Eă PJEu Eu EEuuS w\ƍEPEPEPEPjjVu -0}t<VuEE/PWju V}jjgEUăz`tB`xt }wEPEPz G%tjEȍrur}tuV(t?}tJƃVWu WjV%ƃVuu i EPƵƒmE9E}EPEPVƒz G%teErur}tuV\t:EVRujVY Puu h EPƒrU B`xtjuuRuu he[^_]UWVS[>j} EuujEE;vuEPv ElPVjWEPEPvW3guh W7hEܿ;}}JvEPE4ƃ~uuuuVuG;}|e[^_]UWVS [Fi}}t~PWju 8wEPEPVu lfueEPEHPwu }uJ}x?E;E}79F tEPEPVu fuUE4u Ufe[^_]UWVS[Âh}!Puju uvEPEpu gEyEPuEpu EVEx? u ku `fƋG Eu F\G;tMGEuFF5v E@PˮF uwPuVEEF}t.ExuGWFVEF vVWEP}u%}uEp Wu ZeE-}~%E PEPjuWu fE }tEuWu xde[^_]US[äfU~!EPBPu d$ c]ÉUVS[[fu U}tPRjVL1EPrVeuuVd$9e[^]ÐUWVS[e}}tPWju ܹwEPEPVu cEPEHPwu }yEEPEHPw u ucE;E|EHEE;EG9F tEPEPVu bu)MU)BE QRu |c$ae[^_]ÍvUWVS[d}!Puju ͸vExE?~ W]EEPWu )dƃt }t? W>EPEHPEpu ƃEPEp"E܍EPEHPEp u ƃ u}yEE;E|Z}~TuPugt8jEpl PPu b$mE;E|EHEU;U E)ЉBv}~EPEP jjRuWu ,cƃ Wu `e[^_]ÉUWVS,[bu}Eu5EPj9P4Pwu S t0etEPWju 襶BvEPEPtu _tE؉EDEЃEPuNEEE;UEtSr tmEPEU4U;UumƋ}܉98‰Ku܋EU4l$ ƃ&uЋEU4u Tƃx2 E؋E;E@uu _$~e[^_]ÐUWVSL[.a u _E} Puju HEEEE EEEEPj PDPU4u + Eă+vH`<`$`` ``___EE9BESErvEfvEZvE9EPjUtu qE|FEvE vEFEH9}uq WY6 WVu ]t.> VU W̻D PVu s]uЃEPEPUEtu s\E܃+}7CjvjPu`v E@PǾ;u},vvEDD: DF;uE@DEPWƃ}uo u au \E}tEtIv~u6uu V\v 6uu 4\v Wm}uE8 u;EE܍e[^_]ÉUWVDžtxtBt}UBEBDžtxxtJvu Rt4>>ttt<t~ Džtxt}aDžtxu Rt4ƒtte^_]UWVuu E } uE 06~ } GE uFw}>vuE 06R~E GNj@E vuFwwt } twE GEe^_]UWVSl[æ[}E= EPuw[ } UJvW EPRuwZ}uPEEw uV j-Puø$+PVCPweY$轅|EEEPu wxZY }UJW EPRu wY.}uE WEE u0 u )uVPַEvu* u Pu$EuZEPuwdEPu wGtE;EiE;ElE`u~EPuw1EPu wEEEuEvEEEEvEEuE FEPwwXVjjEPwwX EPEPwwGVjuuw?G tLPw;EeEPwWPw*t3 w\ j|PwV$|GE ?u]Ee[^_]ÐUWVS[2X}EEU MDBDBu >0u+FDBt E IE 80uPuDP?0u#Wu GA?0uWDP}uMu M )E GU DBu$DBt ( vDP?M 9EPWǃEPu E E$股E$t)} EP茥t! EP(t Ee EPWL EP4E(u )uMȍe[^_]ÉUVS[Vu }tjujV 5PV|u PV蘺e[^]UWVS\[æUEEEEEE;}, E48-EPjPlPU4u 蹦 Eԃ +TTTTTTTTTxTDTEE{vEovgvE[v SvH@Cv΀8G;}}<EPE4u uE}yEvG G;}U)+E9}!Puju %v)}UU}t"}tj[P|Pu UVE0u ;GEtE@E}tuu Gi}~MmE u QEE}uUUuEE usEvuuuuuu E u3}}tjjuOvjEPu-F}tUBU;}5v}tN;}U܋EЉ t9| N QEȉ4$UȉBRjN%;}'E܋UTJRURusƃ ׭ƃ}t7Vuu XP> Vu jVjE4u  uG> V? jPU4^ PPu RuG;}}t'E܃xuEЋU܋EBEEE9E}u}tEHPu`e[^_]UWVS\[QEE;u E4薮8-EPjPPU4u = Eԃ+`PTPLPDP}yEvF F;uE)t Puju UUW2u %CEtECEE@E PoEupEUrEE@ EE}Pj uuuu A }u}~uuu!tEEPu8BU܋BE 2EЋUBPusU֊Eσv}&t]}\FEσ0< w Eύx=}\t }&)PRur jEPurVFV9t)PRur;}/E܋Dx!x)PEЋUBPu#s>\uFVFEτ59t)PRuXr}ujEЋUBPurEЃEEЃ}t U9UB}u uuE9E}+EPEЋUBPur jujuu w uD jPu٪ PPu 6NE 'Evuu ZK$ E8 PDEȍe[^_]ÉUWVS [âL}}tPWju 蔠& w-ƃw  PVu Ye[^_]ÍvUWVS[:LE Exlt pl贔UBlExpt pp蓔UBpEEM}|EPE0ϩEEPUr躩E܋u8eEE؃ou'u܍8u E}eu*u܍8uEv}ru*u܍8uEv}bu*u܍8uE[v}cu*u܍ 8uE+vEPUrjƃ u NjP>>=H>==H><<<<;;H>;;;X\Avh\-v`9tt9vtG`9tt8v(9F u)}u ~}~EPtjx}u }h}h}^Ov\Ev\1v<9F 49F utt:yEjjPt讣`9Uu >",?EjPtÙ؃>"uDžXt9MuDžX_E+tt$\5v49F #EPtjEDžX{EjjPt谢>"t9UERv\v\v\t\d\TL\DtG`9ts%t>wDPDžX\tT vEtG`9ts7EPtB|EE$\DžXXu9Pt0 h WơPjPu  KXxEv PujDžLEHEPuvztEPv ep}uP|HEPHHPvu 豥 }"H9E}A9EupUM)B$iE@Ppi~+Eȉ$GvpuЋE)Ɖ$.$+pLpMЋu)$}tp9$t<$t:t*$p9$t$t:t$M9ɉ8Z$p9$zLt.}t H9UtLp<{LLl }t=Puj }uEPMq|u0 uV9B uEPvLfu EpXP DžDEvDPuj: }uREPUrp}uPpYDžDwEPEPMutu 4}uEUtu 5+vEtjpPxtYvEPMut&t} Eȋt‰@DtPtbyEȋ@9t EPtwE;E}mEPUԋE4臔pDtuPxEЅ~;EPtp׃t?EE;EE;EuVtxZDtBM@uЃEPUԋEtp uPx[Zv)ut@9tq EvPuj v}unEPEphp}~$uPpٗt) j]PpPx_xRUM4v訒Pv蜒$Px }tPujuV9B EPvbtEPEHPv u  EPEHPEpu ܟ}yEEH9E|EE;E+E@PtEP`Pu 1EPUrMqLTHEЍEPuЋuv u K $EPuЋEpu +}yEE;E|EЉEE;E>PuUrTPu 0}tPujiEPMq u 诚EPuvt}E;EutxMWEԋE;EwEvPujEPEpztuPtHEȍEPuȋUr u ם EPuȋMqu 距E;E|E;E}yuvu /}yEutjvƃE;E~E+E@PVOvǃ +tPtxS}uEpxWE;EAjWxU(EvPujtEPUr.t}uPx9S} u x覎$x6}u x舎$w xn$xEȃuxS`utrHEȍEPuȋMq u  }yEEE}u EPuȋuvu 蹛E;E|EȉEE;E}Epu -utwtƃE+E@PVdt)E@$vp uVP虓EЋp} u R:w&}u pv pwEЃ+tPtxwQ upxS jWxSpwDž|}uEPMq p>}u"pIMPujvEPUr芌tpMЉ8tuȉ<9snEPWKo4p;8r<[<[ <$tpgv<\\O9t)PVWVP)n PVW‹Z9t)PVW茋Pu ѭjPWZ9t)PVW$ǂ@Pu 辩nƃj2WȊu +8g9t)PVP肊Pu 轌e[^_]UWVS['DžXDž\dX\\;U}[ }4=8-uEdPjPtP\4u x u5d\E+\Puju "{O\UD\)}MTUDžP}uf`PEP2u "$t7 jPHPu %$_Qp`EDžPDžLDž\;UvEH9\uh u ) jPu $$JPLj\Pu \$$pJ \E4|HPt8#u DžLDžTE9\u7H:du,֍8uDžTvXt_XXtXtg D΂HP胂DžTTYvHD萂$DT/\E4Du TT\B4 44;} E4 ƍ8j4U4u 6ǃu0E pHPhVۊ jVu N\\;Uve[^_]ÐUWVS[Û#Euu DžtEu#tPvu t#PVju Vw~t hPvjWu 5N `P`+hd+lP$Xt~ڵt݃\d$$uvv٤u O w jjvvaE EWBWG9}ЉGWjfEGP;GTv WbdGPEWPBGPEBWPBGPEBWPBGPEBWPBGPEBGP@GP+wLWlE+EtWUr ЃPu7[Et9WEpPuV# jVuC(GEOlU+UGP+GL)D }}GP;GTv W[cGPSGP;GTv WatuWlE+EDWlDWl|+|DGLULx~&#؉QQA؈A "؈AGltM+M|+|GP+GLtDDjjPW=BGP;GTv WZGPGPjjPWEWPGPGP;GTv WZGPGPjjpPWWPGPjjpWWPGP jjpWWPGPjjpWWPGP }uEUWOe[^_]ÐUWVS [CE@ TxXuFu  Dž@E @4~t2 uo jPu; $O3O 40~% VU4$UDž(09(}3(F(09|ϋMQBQA9}ЋuFDž(Dž$E @H4H9(v$$$)‰ЃH9qA0#0(PRVu`NjHA#0^(,9}A(IQR著VF;,|($HB DH4H9$DžLDž(09(}@ TjjjjNTƃ (uL(09(|ƒ TjjjjTƃ0P\SP8LPPpDž(9((, PS,9}L(I TjjQROSD F;,|P (4A(09HuPX<ujW8Dž(Dž$E @H4H9(U$$uHr ЃPuBǃ@M;q} A@L(%UBP;BTv RTMAPVUBP;BTv RTMAPQPBAPBQPBAPBQPBAPBQPBAPBAPUBP;BTu RITMAPAP($HF D0H4H9$H}GP;GTv WSUBPCMQPBAP<BQPBAP<BQPBAP<BQPBAPuD~~u;jPWdu"F t0 9 uv FPuCt ^EpjvU;J} B;| POPju$PUBP+JL8+L8jxQ8PRP t D8F t0 9 } >9 >~~uUjPWbu*E;P} @ 9  u jjjPuI=MAP;ATv QIUBPBPjjPRMQPAP(WPVeuF jVEw|PV{eu jV u jPu$"DžrvUBP;BTv RHMAPAPjjVQ%MQPAPjjVQ MQPAP jjVQMQPAPjjVQMQPAP } DžGUBP+BL+L2jQ2RunMtu8MALL2<&uAW<'u@QA A A ƒAAAQ PiOE 8PK$KEPe[^_]ÉUWVSl[}DžDžGU Bv4 u jPu$ vDžDžDžDžDžM QB T:B8{Br9}>:(u/ыPx)u&+A)ʉ v@B9 t8 w jjVC H jVW,=BGP;GTv WrEGPGPjVWWPGPvGP;GTv W0EGPGPjVWWPGPjVWWPGP jVWzWPGPjVW`WPGP DžHB"" hRjʃRPug@()Dž u x~Gd~dP\PVy` jVu'$Džxu7W|p Pu1OjjPW7=AGP;GTv W}CGPGPjjPWWPGPGP;GTv WGPWPBGPJt3GP;GTv W>GP WPBGPBtGP;GTu W{>GPVt3GP;GTv WS>GP!WPBGPJGP;GTu W#>GPGPt hPgGe[^_]ÐUWVSl[KM }DžDžDžGQBv2 u jPuk$ DžDžDžDžDžDžDžQB T:B8{DžBB|)u`9}U:(uBDž4vFA;}'9(A);-9"vFA;9"@ z< D D x)DžJ;BvFA;r}9(Džtt@)‰qD)ȋTЃ9 FA;}9"Dž;}?9:u "FA;}'9:F;y: t;u7 w @P7 Dž jW=EGP;GTv W1:GPGPjWWPGPGP;GTv W9GPGPjWhWPGPjWIWPGP jW'WPGPjWWPGP DžHB"" hRjʃRPu[F(0)Dž u x~Kd~dP\PVU jVuDžxu7W|p PuM&WjjPW=AGP;GTv W!8GPGPjjPWWPGPGP;GTv W7GPGPjjVW_WPGPjjVWIWPGP jjVW0WPGPjjVWWPGP 5vWq ȃPu,%jw+B t>jvvW=@GP;GTv W6GPGPjvvWfWPGPGP;GTv W6GPGPjvvW&WPGPjvvW WPGP jvvWWPGPjvvWWPGP +Wv FPu#2O;GP;GTv W5WPBGPt  GP;GTv W|5WPBGPt v GP;GTu WC5WPBGPt Q GGGP;GTv W4WPBGPt GPGPGP;GTv W4WPBGPtWPWPBGPBWPBGPBWPBGPJGPeGP;GTu W'4WPBGPt82vGP;GTu W3WPBGPtt hPY]we[^_]ÍvUWVS|[ E }GExt1 uz jPuF$Z PB t>qWBWG9}ЉGWj#5EOl)GP+GLDGP+GLEGlMLWjVu*E tj$OPAGP} )(ˆЈGP+wL+ujVEPW)EUEGEe[^_]ÍvUWVS<[VuE} Vu WE1FEG |8EPjVu(E @ VPWEE;F}FEG |8E xuFP;FTu V8#FP@FPEPjV(FP+FLEċE @ VPW/EuzE;F}FEG |8E xuFP;FTu V"FP@FPFP+FL+EjPEPV9(tEE+EjPEPV(E8EFEe[^_]ÉUWVS[u }EEEEV PURLu6 jPVPu$RE >v@ E8jjVWn=8GP;GTv W!GPGPjjVW9WPGP{GP;GTv W|!GPGPjjVWWPGPjjVWWPGP jjVWWPGPjjVWWPGP Eu MA DEEx~wE;P}I;uMAWQVEF t0EE܋U܋E;P|;ut8 u jWPBGPMdv u) jPu$ Et6uG;}|UrT;}}xt vPG;}| E0蚫ue[^_]ÍvUVS[>Mu EUFVF FFFF F PfFDFHFLFPFTFXF\F`Fd<FhdFlFpFtFxF|dž(džpdždždže[^]ÍvUVS[2u~Xt vL~ht v\~xt vlt v|pt Ve[^]UWVS[ãEDžDžx|E@Pt P1}y} IM uU pMhDžd& hPuhpu< DždxuIuFP;FTu V1UBPBP@BP}uJ||u+FL+xDtX~ pHXpE E9u t }t ]uX8~a}u[Uz uRP\0+ X7~7Pp\6Q(P6+MQBA\}u|uFP+FLxPp+FP\VDž`|l;x6vl9`u~ t F @xjV1 lppV}/jWuƃ t\~tV uGuhPuVǃu"M;q3A%jlrruǃt7VMQ\tujlvvuRǃ%UBP;BTv RMAPVUBP;BTv RmMAPQPBAPBQPBAPBQPBAPBQPBAPBAP`@3ulr ЃPuǃ`MA9}`lF D0l`;x``(UBP;BTv RuMAPevUBP;BTv RMMAPQPBAP`BQPBAP`BQPBAP`BQPBAP`BAPUBP+BL+xPX\Rwpt+p)hp hP0>Džd}t py]t htu9FPjjPV=GFP;FTv V'UBPBPjjPRMQPAPuFP;FTv VUBPBPjjVRYMQPAPjjVQ@MQPAP jjVQ$MQPAPjjVQ uVPFP Dž}t-E 9pv"pz]u+E Hp+E EP P,MItX~ pHXpE E9u t }t ]uXXpu udt hP;p+E Mq P7,e[^_]ÐUWVS[Ë}GP P)DžDž}U c+8d4E ppP$)vVjU ra  PVP(v j Wgƃ"GP;GTv WGPSvGP;GTv WGPWPBGPBWPBGPBWPBGPBWPBGPBGP9} P* WjU BPB@Pu  G9}uv j W7ƃ"GP;GTv WzGPSvGP;GTv WXGPWPBGPBWPBGPBWPBGPBWPBGPBGP9} P(E @U rDž9}68:uF9}Ѐx:AB9}::uF9}z:uDžDž t t Dž( w jjV jVW=@GP;GTv WGPGPjVWWPGPGP;GTv W GPGPjVWIWPGPjVW/WPGP jVWWPGPjVWWPGP DžU z u~y!GP;GTu W$ GP $GP;GTv W GP BGP;GTv W GP WU B HPЃ PutEFFF FFFUB F EEe^_]UWVS [j}GLWP)‰UWT)U Rzƃ uwLV%Xt wLwLU2GPU2GTGXe[^_]ÉUWVS [} x U E;P|u |P!U E;U PEEp|}ЃtfЃtUt r|UEP|Uǀ} ~&E UB|U;P} P!E UB|UUP@ @e[^_]ÐUWVS [þ}u x;w|VP ;~V<P G|UP UPe[^_]ÉUWVS[NE @pEU ;BtM)ȉBtE+E PCEE pl}ЃtfЃtU zxt rlaEM AlUQtAxM ApE+EQlUQP@@ @@@Ee[^_]ÉUWVS [REEU;E PLEMЃtfЃtEt bMUE쉂ǂUMȋEBE Ee[^_]ÐUEP@@ @ ]ÉUWVS [JUBBDE PZEE0}ЃtfЃtUz t 2zUEUP@ e[^_]ÉUS[ôEx t 02]ÉUVS[ÆuM U FP+FLBFBFpB tt"@FP;FTv VFP">FP;FTv VFP$FP;FTv VFP&VPBFPBFPe[^]UWVS [ү};}GUBLƋM qtt"F$V &NhUBP;BTv RMALƋU rAP)T1tBJIMAPU tt'I#FFFNF%FFFF"'FFFVM AUJI9}ƐEP|F9UzpOM q 9Xv)MQl@tt@xt"@@0|P+F9~e[^_]ÉUS[($ÐUVS[ucuc6PP,t PcEP6RR0}tp e[^]ÍvUVS[vcu$cuPP,tp e[^]ÐUS[,ǃcjcP ]ÍvUS[ct cPǃc]ÍvUWVS[æEp|@EEEEEEE9+Ey PHvEEE܋Dy PEED+E؃=wEEDE؋D y <PEEG;}2EEEEe[^_]ÉUWVS [jUB|EBEuM qX9}gM)Љy |P$0vF#FFFVMG;}|E p\;}}]MTy P-F#FFFVG;}E p`;}}WMD)ЉB=wF"FFFVMTG;}E pd;}}\MT y P-F#FFFVG;}e[^_]ÍvUWVS,[vE@EU U(EE M+AHEU2PP\0 EE U+Wب04E U|u%}"t }$t}&uEPW(W5M E|D NjUD  D  Džu$}#t }%t}'uEPW(.W5M E|uA}u;W8P\E0 j(UBL4M1 v}} t} t}t }UBr9|PW\PMA9}v6B9F tWWTWP\70 j(FP73vE U|D NjM D  D  ǀ}u:W8P\E0 j(UBL4M1}} t}t}t }EH@E9|QW\P9}vEԋEB9UB t WW:WP\7 j(EԃP7vWP\0EME;HP\0UBe[^_]ÉUVS[ûuEPu  ;U~URPue[^]UWVS [v}u EuPW2!PW +Z|pddddddddddddddddddddJ>2&PPW4FE>t E9EPW e[^_]U]ÍvUWVM}E} ;;tOruuwpIU !A wTȾ эIM @6A w(Ⱦ эIM @^_]UWVS[N}uEu$duuUBG ZmNB} 8NjM ;&E HE9}vEA9|~U9Eu#ȿduȿuEEEmEA9|[PEEܿu!ȾduȾuE)-mEA~}܉}EEEE+EEd@Eu uuuy:E}$t}$ujEP菝x tmUE(e[^_]ÉUWVS [BjUPC@@׃jE P'@@E +E)э)Ѝe[^_]ÍvUWVS [Ҡu }EEjEPɜ+xHȉי)EV)E~-: EPue[^_]UWVS [Bu }EEjEP9‰JJG9B}AB EPjjjjjBlPjW0y uuve[^_]ÉUWVS [î} uEvjUP蘛ƋF@V}u*Uz.u!B0VFtT0Evt(j6uu&FUF6ut >ut!6u\ >ut!6u_, >u}уU<su5t"6u >uXXt!6u >uExuG8xBDBt0t!6u\ >uUր>t:.tFAB:ut2t#v6u3 >ue[^_]ÍvUWVSL[~cvʍBcRDP u拃cEDA0cUfQ@cftK0EvUǍDBЉFcEȋEf HBcfuc }ENjDAtyuȋcUfQ@cf2E9sELjFcEȋfH%Bcfu΀}.tc EPcU}(tcBc<vcU@ct}(uF})uN8e[^_]UWVS [ÒUucE EjEP胕NjGl dG@dG ddyiy<<u M9Jt:u9r8:x ;r& +lX>>Ȓ TP)U;;h MȍTEUUȋ4w<mmEu;s88800UU<uqu)։uF )U苄 }@E=TE؋U9" T v)U}G )U苄 U@E=TE؋U9t TE䋃,Mu0}804P+nbtHhT)< dԎtT8`< Čh40D),Ԉ`@|dddXcLc@dc.vdccMAdǃdǃd$dvuFdFdǃd$d}GdGdǃ$dǃc7dѺQ)UB쉃dBdBd$dt 63 uc^tlWjPju(Vjj,@Pv(P<$4$ u9e[^_]ÐUWVS[{+(…DžPPRj!yDžF;})u 4G$t΃YPPj6. WW 0<$#tϿD+vzdzNzNzNzNzNzNzNz|zNzNzNzNzNzzju uEDvju u-,vju uvu ǃu'}t! jPu PuV{ jO/v}t! jPu Pu{ e[^_]UWVS[yEU E؍E܉U V VEPj葜 jPVjRPjlǃVe[^_]ÐUWVS<[CyD0 WWu jjVPVjj V=jj V$<$ByDž~ Dž@ h 蘿Clj󫋍 4$atftЪ}u sv u-vǃDž9jhWuL<$,0A04DžuA0 A0A0A0t0f~9}u? Wv u z}u hjP31<tF~ჽtƅDž<tF~닅  VЃtfЃt𪋕v<u|dDžfHtB u ffQ~FJ}u&8tfu fǀ\tXuDžfu.EEEEEԃuu@EȃEċEȋEEU9U M9M vE+E Pu sEPu 謧EfUҋ}jV/ jVu> V@‹8toj4jhƃj=V t,@@ jPV<PusG@<ujPPhqj<Pue[^_]ÍvUWVS[ÓaPuhB;d P{@0ЃtfЃtdt @0聩@d@DDž}эq|Vj@4j@Pu ؽ u V v P@ } )P+uP=u DPQjjƃװQnVP>@4t94uVce[^_]UVS[_UtJPjRj@ƃj=Vϻ t 9t@PV.$Te[^]US[ì^EPueƒt,@ TvB:ujQ]ÍvUWVS[G^} Pue¾t_Pj@4jI>=uF WO jVWc7 PPe[^_]ÍvUWVS[ß]u}t u  tjV<Pu =PVtDPVu @> jPVuu P@t V/e[^_]ÍvUWVS [\U;\})`9t8tF;\}`9t<u;\}f`<t 4} t `U `TF\H9|狓\`D\4 V:EljЃtfЃt`tD\`}ЃtfЃt `U`\M \`D\e[^_]ÍvUS[<[`t/ `趣ǃ`ǃ\ǃd]UWVS [Z\PuYEPu>Y$Ƹ$EUE@$СUBUB RVPw j]Pu3ƃuEp Q聡UBVr jgPuƃu\ Q5UB Vr E@ jqWuZƃu- jFVԩPWuY >uUVP FUPEF u\e[^_]ÉUWVS,[CYE PZ0:;jq]Pqjp gPR|@G(/jWjw  t=VpRjWjLwVS\ j@P`V$ƍ?8ujpjPA j(P* jp j j=P j e+u&0tv9uvu鋽?t9 p9p,p p$7t .8@B R.e[^_]ÉUWVS [V}?t;v7F v蒞v臞v |4$t?uȃWP踌jW.e[^_]ÐUWVS [âUu} j Ü0xhPhe[^_]ÍvUVS[bUuE hыRt-92u9BuuBh vBA R譝e[^]ÍvUWVS [T}j |fP#$ 8U PPe[^_]ÉUWVS [êT} j |fPӂƹt8vE9u%9zu uBBA R vыRuˍe[^_]ÍvUVS[2TuG V.UWVS [ T}j |fP3ƃt~tF8 vM~e[^_]ÍvUS[ìSj |fP؁@]UVS[ÂSlt \Pk |fPƃpuB\pu/ǃpP葬6t\uj |fP0ӣe[^]ÐUWVS [Rr\j |fPǃpǃpǃlFh v4$huǃhtG8 wGI>t 6袚 >t 6脚>t 6f j˽jl贚ǃlR[e[^_]ÉUWVS [ÂQ |fPǃt8GF v4$ۙ7uh胁e[^_]ÍvUS[Qj |fP@@]UWVS [PU}tPRju ؤ rmǍE$ PjaWu  t E}u j֦ƃ}uu EP PjaWu u Su$ jPWPu uSǃ|e[^]ÐUVS[JNu 6Ζ4$Ɩe[^]ÍvUS[Nǃ|]ÐUWVS [MUB@U<? PEE0}ЃtfЃtU2(UEEHUBe[^_]ÉUWVS,[cME`\X\@TE @HPTHDžDDž@8@M؉<Dž8E x@~7 @@P< \\XTU BD\;Aʉ@tAT`pT@P\6@Pu Ǣ6腪PH:+vJ JJI@I IFF|BA@ @t=8?p?`>t=t<<;:;9876546 321120///..$-$-%%%******%%####%d,d` TXEJTPuHEŨ:NztR;t R?Ẽx tP zt PRẺPẺH9T: PTPU +BHP\P`0P1:TPQM AL PP@ ‹PA A ‹M ALET0 TXEJTŨ:7ztR;t RẼx tP zt PRẺPẺv7TXẼ P~7PxDž4T)E+vEPEX4t E4ET9U~ʋ8uڤ2FFFF 4 4@P襏0F4NT)EET9E,vEXẼEPutuP0M0EŨ:TztR;t RXŨz tB xt RP,ỦBE̋,ET9EJ0EvT)E'vEX8 E4軣ET9M~)TTTX4PuPyA A A DžLvPxDžL(`tC u0J jVuD$k$VHPP:5T+(X|7u)K$jjUPu~$uD uI$]P7襣 P_PuND$p4T(HExUDM}y(jUP.d`tzF `BT;ZEPu P7t>T\JW(uP$Vu6\@T u u{H8~: 7臢$PU +BHP`qTvP\0~ `T\QW(u$pRDtDuD\X\@T`8t uBE(9M}~TXEŨ:HztR;t RHẼx tP zt PRỦBẺTE(9E|DU2؋D+ 2 V1t t5OvDuGVGDžD1>0 Vܝ07PG> V谝U JHPTX4HT uDT\H EPVufD\X\@TDqTE̋TX|T\BPyjWu E̋\X\@T}-TE̋TXPx@ NjPB B NjT\HjWuxE̋\X\@T}-TE̋TXPPx@ NjPB B DžLPyDžLTX4H\AjVWuoE̋\X\@T} TE̋TX>~tV;t R)~ tF xt VPF2vTX V?p+ W_+TE̋TX>~tV;t R;~ tF xt VPF2TX4H\AhjVu臱E̋\X\@T} TE̋TX>-+~tV;t Ru~ tF xt VPF2*vPx@ NjPB B DžLPyDžLTXEJ\PjuWuNj\X\@Tw)TTX< TXEJ4J\P hujVuNj\X\@T u>( VTTX<>E~tV;t Rރ~ tF xt VPF2E vPx@ NjPB B DžLPyDžLTXEJ4J\P huVWuNj\X\@T u>' VTTX<>8 ~tV;t R讂~ tF xt VPF2 TXEJJ4J\Q huPVuNj\X\@T u> VTTX<>E~tV;t R~ tF xt VPF2 :\ztQ;t Rjx t@ xt PA E TXEJ4J\P hujVu薱Nj\X\@T u>% VTTX<>E~tV;t Rz~ tF xt VPF2EAvPxTXEJT49P tPuRDV vE̋@ET\BuWuNj\X\@Tz$TTX<E8ŨztR;t RcẼx tP zt PRM̋AẺTXEJ4JT49P t4PuRDt>= VŒ,E̋@ET\B hujVuNj\X\@T u>D# V<TTX<>m V\PxTXEJ4JT49P t6PuRDt>C Vˑ2vE̋@ET\BuVWu跸Nj\X\@Tu>Q" VITTX<> V9E8 u|TXEJJ4JTE̋49P tOPuRDt8> V : R裐 vE̋@ET\H huVuҵNj\X\@T u8> V0 :! R vTTX<> V : RȏE8g! u謏T!PyAET\BuWu轵Nj\X\@TJ TTX<PTX4HTPAET\B hujVuLNj\X\@T uDžD>! VYTTX<>~tV;t Rrz~ tF xt VPF2Px@ETX4J\PuVWuNj\X\@Tu> VvTTX<>f V葍UPBETXTT4I\H huVu蟲Nj\X\@T u-> V : RTTX<> V蹌 : R蜌PAPqPx@ NjPB B P8PyA A A DžLvPxDžLTXEJT‹49B uEzEUŰ<9B u"EB݃E@E$EPuu誎D}QPzB B B DžLvPyDžLTXEJT‹49B uEzE]Ű<9B u"EB݃E@E,EPuuƍDt E5v}tnE8QŨztR;t RivẼx tP zt PRM̋AẺLPE8QŨztR;t RuẼx tP zt PRM̋AẺPTX RvEEUEUDžTXw E̋@EẼ8 EP TTXE8ŨztR;t RbẼx tP zt PRM̋AẺCvEPuT!PxjfPHƃvWP迆|T\Hr PuRD\X\@TsPzjfPGƋT)XDT\QPWQuD\X\@T DvTXE̋p ;4;<uxt|;(uŨzu 4B ZEPuvuPtEPujvhPuj|DžDE̋p ;4t ;<MẼ8x;4u@E Ph!E̋P@hlRP5{ƃE8QŨztR;t R1`Ẽx tP zt PRM̋AẺủTXE̋p v uu;<bE̋P@hl݅hE@u-݃Et݃E؃lhuDžDv u= u jP ǃuDžDt tvDžD$DžD7P?U BHGP u u jP> ǃuDžD@t t+vDžD&DžD7P观M AHGPPx@ NjPB B NjM ATD@`Q`r(Ƌu j jPFFPzPx@ NjPB B NjM ATD`B`@(AE̋@@Pu}Dž@E9UvU dP4 uD9d~ DžE9E}}@E9UXvU @@dDž9Dž;d|Džn BE̋DT\JjuPu脐Nj\X\@Tu2tE8 uoDžD`F9/E9M |TTXPv8T8<PU8DžDP9 u1v D|TTXPPP\Pk~ u jVu$5$VPPuDžD DuM`u>EPu PYt"uPE puP`u jPǃT8<;vTXEIT8KŨztR;t RXẼx tP zt PRE̋PẺT8<;zM AHGPRTXEJT8 u1lH9TE9u%FF F F ƒFU9u$AA A A ƒAE9E.E9EE+E;E E؋EEԉUE܋U9U}t}tUЋEEԋU B,^_]ÉUWV MUB4E+JHMtcBPEz@xV;u}D)M9zu$BJ ;E9M}} t:uvF;uO ^_]ÍvUWVS[& u 49F t <9F u EPVhǃuWutEPVj3vEPVj%oƃtO}tI u;WjHwt j< j|Pu$.e[^_]ÍvUWVS,[F EEEE EE @Uu5E@u)݃Et݃ـEu $u E$lEUM? WeEU BE܍e[^_]ÐUWVS<[ EEEE EE @EUEMMu5E@u)݃Et݃ـEu $ud Ev$akEUM? WXdE8 PBdUM QE̍e[^_]ÍvUWVS [ÖEE 0xEOPu9tE4U9B unBy[؅yU u  jVu$+$VPPu E P[qxE@݃ ـEuE@u)݃Et݃ـEu $u E$iGU : RbE xEe[^_]ÐUWVS [&EE EU z4OVut E,49F uFF$6iGU> V2bE xEe[^_]ÉUWVS[ÊE EE @U V]UE P@v@> V\UE PuPuLe[^_]ÍvUWVS[jfPG.duE |E @xU2]ƃVE PMQLu8 j]PVPu$l*Džh @ tEHt9Bt$urPWlDžhzDžpDžlM9p*t`U\MXpU4Vu49F uZ~l`<u!\W$_\l\X<ivFl`<u7\ }ME mM]mEX l\\plM9pdEPEPutr Rhd hx+}v|4> VZG;xU)x}u( ugxx|vEE@u)݃DEt݃LـEu( $uZDžh0Džh%$I`xx|xU Bhe[^_]ÐUWVS|[Ú}E ] W[8!tEE@t-\jVW$ $VG[8"t,݃TEEt݃\Eur݃dEE@u-jVWW$k $VnvjVW*$> $VAZ 0PuVkb jVW$$VEPPW e[^_]US[0jfP\)]ÐUWVS [} u9G tWVPueO~`t F`vVt+9Qu&A;BHuA ;u1V ;QH!ƅu*WuPt vOt1e[^_]ÐUWVS [JUE @ E;tz`t B`8zUB jEAƋE~GHFF UB FF}tExt u PU rBB e[^_]UVS[ÞEptN~u 6" 4$ Be[^]US[_EU @BBt@B $UWVS ["}U Bu RVjjPW0EtJ~`tF`0vE@ j?NjUwFHGG B GGE x t@ xt u PU zBB e[^_]ÍvUjuu uUjuu uUWVS<[PEPE Pu ƃ1E )8j|PEpPU2PuPM EtuƒDžEPRuE%=@E )~cBV uQ jPU MtP}uPPuDž& uEt4u DžE H9E4u ƒtE MDP WX WjuPU4u:vZ<$nZt FE H9] PFZe[^_]UWVSL[×DžDž PW($WDžDžE 9oPE4u6ƒuDž8PPRu%SUv;(vGPƃPVu'%=@t/dSxOS8u Vu܃ XG;p <Dž$rXU 9t9ju$PPuDž P X($Wt ;e[^_]UWVS<[/PEPE Puǃ1E )}jPEpPE0PuDž j0PE4GPuuDžDž (PT$T;} vEjVV VE4uƃ@PVtP8Dž%=@uf(PV|tUuP8(PVNu!E Vt G;} t/juA$PGPu (PlU$^Ue[^_]UWVS|[ïPu uƃ+(Puuu PTDž HPRPVt } vPtN8&}uN}vtGt>;u033 uDžhv%=@uJ%=@t8WNjXPu ZPumPuE%=@tJ%=@u8MjXPu PuPu}ulVoM8u4jPPuPu PuIv_M8{%=@uXHPV~tTHVWKu} 8WeKu!Vͺt}}%=@u8HPjVbt2HVWJu V菽t} t/ju]$PWPu? t|ju $}uPu;} t1juPu;}tjW4Puju PPu HPQ$P($Pe[^_]ÉUWVS [>EEE 9EU8-vME498u EVUM4@8uEK jCPEU4]Pu)EM 9M}UM8-cEUEe[^_]UWVS[Ku }PPVu WzMu`>~u[ 3 PVuƃPPVx$6O WM~? 0)ujtWL 2e[^_]ÍvUWVS [#}  |Puju> EpG Puu CE Džjj9Dž ƒ<$j4 PVuPu׃ t> VEyVu2 <gVoPjP U2u-: $PRuуu jPE4E PPuG v9}v$PjP E4ue9 uCF9wUtPuƒu9|Dž PLe[^_]ÉUVS[ZjfPƃ>u.jPFjPe[^]ÍvUVS[jfP"ƋF8 vHCe[^]UWVS [æu3E8/t 8\Uz/t9z\t3Vu oJE jHPu HE@}Uz/t z\uvG?/t?\tE?t%?/t ?\tvEE<8t <8/t<8\uU<:t|:uEjHPVu IU4:F>/t>\tE>t%>/t >\tvEE<0t <0/t<0\ujJPu G uWu G jHPu G uVu GU2v@8/t8\tUvEx:Vu HUz/t'z\t!EjRu FGEbuUz/t z\uvF>/t>\tEjuu G jHPu F UEe[^_]UWVS[;}Džt&rv?/?~j?:te?~jfPj jvj;WWVj t"PPjVnt>Dž2?~t+ VEPjVWVGe[^_]ÉUWVS[+} PzEt5rt>PW&PWtPW,ƃ E 9}v<2uM B9| U DP)MM t WVLFM4FuBE ;|M PFe[^_]ÉUWVS [E8/ujHPu gDuFuF>t>/u)U~G?~u;}tjMPu DuWu D jPPu CFuU e[^_]ÍvUWVS [JEEPju uwƃ;utjPPu CF>t >/t>\u)E~G?~u;}tjMPu SCuWu AC jPPu -CFuU e[^_]ÉUWVS[~EjfP jvjuuVj 8EPEPjV}t?jQPu BEPEPjVE+E@Puu ]BEPEPjV}tEvEPEPjVp}tENEPEPj VH}tE &EPEPj V }t E EPEPWVE+} Wuu A jQPu Au!j:u;EEu}uF+}u*>:uuSvjWu AuF>:tPEx~t@Ej/PT;uUUOWuu @ jPPu @uFj:V;ƅdExu U9Ex~txtFj/V:uujuu ]@ jPPu I@uvF>t>/u+}uU:.ujQ[uE8.ux.u jS9U:~ujQPu ?Wuu ? jPPu ?FTU e[^_]ÍvUWVS[Dž P3?E@r}DžU9|vE 4>/u7u^@ jHPu>>/uHF>/t>>~uu"@#U9zt>.u~/u ~~u>E@9t&}x/tjHPWB>װыLQu?}>t+>/u~/uF~/t~t /BF>uՋE+RPB?U9Dž}9vPuU 4/ƋE@} ;4uM9t>.u~/t~\u ~~u'>~u u>>9t1U@}>t1>/t>\uF~/t~\t~t /BF>uыE+RP=U9DžDžavjVc=VU 4ƃ>:>j:V 6u=I QVur;Džt2>:u#~u}9GtF`DžTV>:uu%F"tjQPu:Dž:IQVu:t2>L}9 P<Ue[^_]ÍvUWVS[uE 8~PPu h8uD W9 W@Pu8u W;~ V9 V$;~ VC9 VE Pj8u8tv8/u\@8ue[^_]UWVS [ÎtrtKj/u:2j:u/3uj/uk:j:u[:6u>t)VEPu2tF>uj.u:ƅtt 9H!Ɖe[^_]ÐUWVS[ç}u >uuPZP'wu* Wj_P|PW{euPj8$9IuVu5t( W$PVPW Ue[^_]ÍvUWVS [÷DžDž(Dž$Dž DžDž u  Dž,c<M++L(EH9,  Dž (DP,Et1F,Dž$EH9,` c Dž DP,uti1,XEH9,, ,UD@Pu , ,{,u9,}jvj< .vje vj vj P Dž Vq-{vPDž,E9,}? ,E4l&jPVu ! ,U9,j!Pu Dž$u u- P, u (P,t_~tF8 v|$x t@ 8 r R$ Ue[^_]UWVS[ÛDžt%rtYHJV:}u.j:u )$HtQ Q Pq)}u} ?~vF>t7>\uFP#P#PGPuuE;tjPP(}t9jVP(u u }tjuP(}tIEt@ @P"ujPH( uVVuǃV&*tEt ue[^_]ÉUWVE:tOvt7uu :uE1v:{uA:}uI :\uB:u^_]ÉUWVS[}DžƅE@~U@FG?t??\u GPu `!t GvPu A!tM 9/u8ut:jQ}u,w:jjQN:uNNCQvju &N::u%jQPu%?~Pu tjHQum%uu~pjXv:v?tG~Pu st u~jHPu$DžDž}Pu 8{u=!PP$j!8}8t?t 8\Y@Pu h  V# )PWV# E@9?"PPu$W$ )PVWC# j@PW0#uuu u u9_} P$8t1A"PW ‹A"PW …t#uWuu uXv)PWuG"8t uPuu uRvt&j:E0EujQPu!EjPMzFj:VjVMyuK8\u x/tx\t :/u j! jG"Pu(!6vM8t#8/u\8EjPo‹Ȁ8t&v8\u/8Exu^:\uz/t 9/u+jH)j"PuhjG"Pu EjP蟧u.j PuջPu蕻e[^_]ÐUWVS [.6u DP tvFDB u>-uFEjjPVA#ǃ>+uFEjjPV$#ǃ9uu>} j\"Pu ^"Pu辽u u4)Vv8"uR}tCj|"Pu贸$ u莹P"P"Pu QE8t/ƋDP tAE9t DP uE8!E8e[^_]ÐUWVS [öu DP tvFDB u>-uFEjjPV!ǃ>+uFEjjPV!ǃ9uu>} j\"Pu ^"PuFu u'Vv8"uR}tCj|"Pu<$ uP"P"PuH QE8t/ƋDP tAE9t DP uE8!E8e[^_]ÐUWVS[>FEjPu ]EUƉ׃U 9Uu/} j\"Pu "Pu  m8tj݃"u}EـE@t,݃"ـE@t݃"E@u#؃}tWVuļOE8t*EAE9tEDP uE8E0xe[^_]ÍvUWVS[E 0t(M؍vF<w  B E 4uލEэyu؉<0u }<1u }uGH We[^_]ÐUWVS [:!Ut0 PuGE;x|׋EU9t 2PUB,HPB0e[^_]US[EU BB R]ÐUVMyu'1A;F|QAAt܋AQ4$ÍvUWVS|[BuEEUBU ~E݃$]E;F}bEUUM}t Bu EER$Z܃$v܋$E]EU;V| hEvv#Pue}ыUt E EM4Q#PV-эtE} ~uj <$PVэtuu|$PVEe[^_]ÐUUvBu]ÍvUWVu} W#F$4t"N:Fu:tBA:t6u߸e^_]ÍvUWVS [R u hU#B$E}4t2U N:Fuv:uEBA:t6u΋U } уQ ƋUV}FF u FPiF0UB@B;B| Re[^_]UVUu imNAJ #B$t 9pt u4$ÍvUWVS [.U} imNAEH #x$4tvM 9NuZ6u jƋEFUVF M N2UB@B;B| Re[^_]UWVE EEP(M~ 1JimNAUJ #r$t4E߉UE:u :tBA:t:uE}uG>uEuV}uPU z tB xt RPUE PEEU BB UE } u?jE0B%Pu䍃N%PuQ%}\%PWiuuE0>tCU<2uj6a%}g% vj6l%PWuE>ue[^_]US[j|%Pu}$]ÍvUWVS [ޫ uHǃ j%PWP;u }nvE9B uBjMR4jE4- PW?E H9}j%PW"F;u |}tju%PWj%PWe[^_]UWVS [u hlj~jW{jG4PmGhGh@p@ jGxPD$j%PV訳jUPV莩e[^_]ÐUWVS,[RE @Eԉǃxt %P3 WEPG4PCt#uؐ@ 0p4$Xu G4Puԃh~ tFv Eph论~(t <&P FPCue[^_]UWVS[g}}&PWjEPj&PPwu E+Wܧdhh\DL}&vwu 6ƃ1}uw Vu /}u w8t?}~wu E w8u}^w Vu -GPEPww uVu @ vWuu }lPu V u EEE;u}yv}uZ 438-uGEPj&P$P4u }u EvFE}vEF;u|E}uH}VM'PW EPWu OtFՐjEPjEuuu u,}DU :6 R%vuu ";u4u ;E @ptphF;u|v}'avwu ƒG PEPRu xhvWuu \u"}; u 'Vu $  Ev 'wu ƒG PEPRu pvEv '`wu ƒG PEPRu hvWuu aPPu >:Wuu 5$ PPDž|HvEPj&P0P4u }u Dž|FF;u} 48-tE)'Evwu jƒe PE)P|Ru Dv}t'vwu Pu 7Wuu p u 谡ǃEPVY4v~(u@jP PWjBE$[uv}t(1vwu V ƃQjw \PVxuu jVvwu xPtv}t(vwu ƃ w tVPBxPu/j((Pw$4(Pt@(Tv@ pu < u - jH(Pw=$4(Pt|(Pu ڟ$2}t(vwu pjw Ppƃt5wu { tVPVpwt\u jp襦N9'PWju 7 u  j\'Pu $A e[^_]ÍvUS[DUE Mu,vuqR (PQjR]ÉUWVS [} EP E;u}#j4[UF;uju 9Eju' uuWuuuuE ;u}%U8 4F;u u? WE8 P{Ee[^_]ÐUWVS [ڞuju kjV\ uuVWuuuE ? W> VEe[^_]UWVS [Ru }EPVBxPu. j((PV@(Pu芜$p EPEPvjO}tFU}t E0U}t EHUtE EP;u}# E46TF;ue[^_]ÉUWVS [F}u WVBxPu) j((PV@(PW胛$fp EPEPvjK}tFU}t E0U}t EHU}t EUe[^_]ÉUWVS [z}g9GtIv j(PE0 P(Pu訚$qwuEPEPvjjjvi PE0Pv h9kg9BOre[^_]UWVS [Öu jNjEUWEPjGVujjPjOGhPWgPuPu IG Pu uth8 7yG8 waG @ @$@(w u 谫<$DE phv uI URPFPV@}u@ p u \Gx jEG UE BUrEEuF4PVd}UP Guu裗e[^_]ÉUWVS [ΙE p~h usPxVW<u9 j((PuJ P@(Pu$K@ p u Se[^_]ÉUWVS [:E p~h uPxVW<t@ pu贖e[^_]ÍvUWVS[ޘE p uBǃEPxVt(u؉@ 0Wj4$e[^_]UWVSl[juEx WoGT<$<$EPEPEpj葕uuǓEVEHPjuuj EPEPujPjuuWzƋE 8 PFOTTuu Wƃvg W1uj(P1vuj)PVA)PuVHjVPWu VW&<$oe[^_]UVS[u8 6uF8 v] vFp Uv4$Be[^]ÍvUWVS [Òuju #ǃ VWu? We[^_]ÉUWVS [:uju ˴ǃWV? We[^_]ÐUEu v@@h]UWVS [ʕ}E 9tBtpvhWt&~(u Fl@ vFlPWϖe[^_]ÉUWVS [ZEPEPu u訒tvEuG;}}2v E4PVV,@ pu5 j_)Pu Pa)Pu.$膿 e[^_]ÐUWVS[Îu EPEPVuۑ}EE VUuEHPƃVuE> V}F UEtE؃}u uEEPEPuRR0E܃}u+ j)Pu؍)Pu$uKEp~hUVhE܉GUW dpPR@mPuuG jxVE܉x j)P)Pu UBXUBX }t Rfu utE ujuԘuUe[^_]UWVS[ò}EEu )P}&PWju vEPj&P VWuWu 轔u ge[^_]UWVS [Þ}u Wt!j*PW$CQ }tF0 P6Pu qtWju e[^_]ÍvUWVS [}u Wt!j*PWC$蛸Q }tF0c P6UPu 聒tWju pe[^_]ÍvUWVS[Nu u赋NjvtLEPVT2j~(u@P諫 PWj?E؉$Xe[^_]UWVS [ƌ} u ut#j<+Pu$ǮP Wc<$ }tjVuW辫 jVuWƃuVW:<$de[^_]UWVS [}u W@t!j|+PWk$öe[^_]ÐUEu v]ÉUWVS [Ö} WG j+PWj+P+VW j+PVWj+PVW j+PVW j+PW j+PWs j+PWa$t PW| jt PW^ jt PW@e[^_]US[pj fP蜸]ÍvUWVS [Bj fPnExwlGtE썃,P,PVj<E;pt ;pt;puO00Vj Hv V;.FxtjvPFjjvP(FO }`e[^_]UWVS [b}u j fP舷t t *t#@ x@x @xe[^_]ÉUWVS [}Ej fPƃtR tvto~ u) jMFF tPjFf~u) jLFFtPjlF2~u) jLFFtPj8FEEe[^_]UWVS [U} 2 j 8UPV4PF4e[^_]UWVS [îE} uQ4ЋRt9:u9ruuBA4 Re[^_]UWVS [R}j),EPW_ƃ j4TƃjVVxyPuW.W-uZ jt PW jt PW jt PWe[^_]ÉUWVS<[zEEEЋ@ E̋Eȋp\Eti~E 9FuU}u Eȉx\ vEĉxVxuEF8 v Vvuĉu u$EH0x0xxuu EPuEЃ- uBue[^_]ÍvUWVS [f}7j fP荳;xux t~0TF0@D;xuxt~02F0@"v;xuxt~0F0@e[^_]ÐUWVS [ʄ}U @pE0>u <,PtA W/ UR6PP0ǃ}uE ;G t |,PhUW F0e[^_]UWVS [>U xp7}tLj),Pu?6PP,tt9x uo P6Wu?N0 u Y~0@~<tV<;B~N@N~xu u t ve[^_]ÍvUWVS [fE E8sxtEƍ,8u jFu ,8u j"u ,8u jE}t UE uPuPP,u' j,Pu ,Pu豃&@ E@pE}t @}Ee[^_]UWVS[>uj fPgE$LE$x=EUr}z} t/ U װQ Uu 2 ,PE}GG jEƍ-8tujUB}G GGGGG G$G(G,G0G4G<G@GDGHGLGPGTGXG\G`GdGhG8tGt hG8UEPlPpB BBB}GUBtWu  uj,}uu jExu#xujuuj+Ee[^_]ÐUWVS [j fPpUxl9~lt vvt9~luu$ j,Pu P-~E#Fu# j,Pu P\-MEt]FhEFh W#t:UVh j,Pum P-Pu2wvEFhEt/~Lt)FPWP FLGuFPGFLFP j0UPU Px @@@GFle[^_]UWVS [n~E 0~l 9G EFt[FhEFh W"t8EFh j,PWi P-Pu.EFhFtZ~LutN~LttFPWP GFPFLt GFLGFPGGjVm"EFl@GxtuwPGjuwP(ƃGjWxVu;t2 V9o'~0PuFte[^_]ÍvUE@ ]ÐUE@l]ÍvUE@]ÐUE@]ÐUE@]UE]UVEuPpJEPu rQ$ƒtEЋuÐUVS[Z|uF0 P|@p@ e[^]ÍvUS[|EU }u5@txLu PLPP-xHuPH!@tx<uP<v R[BB ]ÍvUVu~@tV@B F@jRV_~@uF@FDuÍvUVS[V{uE @ t/ jMmtj-PVP|e[^]UWVS [zE 8EEWutt v<t W<;Bt G@t8@u2gG<@ @uGr UBGtzwlFE @jP,PVu$U BjRPEe[^_]UWVS [övu j fPߤE] V >GlE0~ |.PgMtv:tM9uRuGTtp P踾uGT whYEGXw\t1FEF8 v] VeuuG\4t$w4FG4 v4$34uރ<tW<;B~O@UBxujurP(ƃOjuu8u te[^_]ÍvUWVU}pljPt &vy} эyWu VAe^_]ÉUWVS [út}uh6Nt@y} эyVEPWu vRƃy uife[^_]UWVS [:tU2FlEjVt }}y} IM~uMuu 臒ǃEPWءE uPu? W-uu ue[^_]ÍvUWVS [vsU2~ljV t B~uEPu ? uPW&EPu % uPWe[^_]UWV EEEEE}Ep}4+v֋E0v9 u;usF BEAB9r+EM+EuE^_]ÉUWV}u J@u,;FuBt}B t@BB@tjWjut ve^_]UWVS [RnuǃWVGƃ~EPW- uPu ? We[^_]ÉUWVS|[mEE@lEjupt9BvEHOE;vOUJ(EpL@EEPu qE@EE@ EEtFE}u.PjEU UEEEEuċUUEEEEU BEEEEE@$EE9Er#EPu]EEЉE}t}G;}s;Eu}}}UB+k0lPll};}? G;}rw};}k? oG;}rW};}K? uWG;}rHE +pEEEPuEEЉEU zE9Y? G;}rEUBts%B? ufuăjjEPjEPEPrủFPujFEFE+EEMMԃ,E+EPE@PuM};}sT? uCG;}u2E +p}EPEPuU z;}?? uEOl? tgG;}r}tEEUJJE@t2E}U ;zu,jR荍uuEEuċEȋUB EPjEP+EUDPuE PEpủFPujtFẺF(U +BPRuuE`E؉u+u\UrLEF Fv uuDEUB EBuu 蓌UJ@ uF'e[^_]UWVS[JiEEE EE @ Et@U BMA;|A EU B BB }tM9uvUBt,tM AAE` utU BBYE@PEU B E@UHM)‰UU B8M+q;E~E@BMA)9~0<69}<2Wu0)ExU B8UB U BЃPPPQWE PMquurj10uEx U;B}!M yfUBMAQvu Ep`NjUz MyPU Bu)Ɖ) EVPRA)wM)1UE P e[^_]UWVS [g}Ew E~ u?FG9u3;V|fAu( EpV9EtHju+7Wu\u GGU }t9ju6'FGFGG GG GGe[^_]ÐUWVS [JfEEpLjVuutF EF;EpLu?@P@F)ׅ~&E)T2 WPR>E@uF EuExu u xe[^_]ÐUV upljP1t vuu V-uUWVS [NeEE8hWt ;uE)PE Pu91Gt%GUBURU)URU RUrP ~;E}POGvuOO3vy,} u5OE ueV0v;u%e[^_]ÍvUWVS[dE8GlEjW EGEE}u0uju ju ˆE-v}uEPu 蛑EPu E}ELtg}uEPuu WE EPEPuu WE WLB;u r jRWwLuGP}yGGuMtu?%G uF tEDvEE)E'g}uuu 蹐vuu 肅 uD Ee[^_]ÐUWVS[FbE8E@LEPLM܋)ЉEu9vƃEPu ‰E9~$?E9}D>Euu ƒEfxy/`}tM܀9 t EV BEMNMMu EPEPuRuE t }tUBEBMEEe[^_]ÉUWVS,[6aEEE܋E@LEԋPtuЋ)ЉE؋EEU9vUuy M A+}܃9~&E9u}E+}܃Pu E9Eu}܋U zE@ E̋UfzykbEPEPEPjWЃ Pruurj0}~? uMԋAEA ufEvEPEPEPFPWE PUruurjO0}ujMԋq uuN@F+E؉FD0uuP juutEpLuuuu P56EE EPEPWWu% t`}M̋UJ EPEPEPEPWЃ Pruurjr$EPEPWWu E+E)Eu9uvkVWsM̋UJ URURUR)PWE PuvuuvjEE$EPEPWWVNE+E)E E`UԋBEBE@9E~E }MuEEe[^_]ÉUWVS [&^E0EUJ$t.}E8UB9s9U+U9}֋EUBm+Dv]]]T]E9E tIVPu 7U9U tVRu oU E 9s8 u @9M U։׋E89: u(B9rEH: u  vBAM U։׋E8E@tF9sBЀ8 uBE`.: u#B9rEH : u9sFB BA9+U+u E0}t'E;ErUJJbo Ee[^_]ÉUWVE0FlE~jVtEv~uv%F u;U}} :DB;UE~LuA NLNP#}tA FPH NP FLA NL utEe^_]ÉUWV}7~ljVt 0~<t F<8~N@jWj5ƒe^_]ÍvUWVS [[}GLGLGPt vp u PW} tHt wHXGHe[^_]ÉUWVS [ÞZE8Wj't #UztCLtjwLW7GLUBGLBGPBBvwPt;V} F)ЉEAwHGHu w`ƃF G`EPuwLGPp wPGuqEPEPuPEpR ~;E}EOlu,_/WPVGuU܋B߃BiM9nu,d/WPQuu܋F F5}+j/P0PubLvWExbuNn/WPu諭u4jj juVU܉B` =B`vMyez/WPQIu>t-8u #vuuǃ6 EpU܉zB BBBbu>Mye/WPQ聬EPEPuuS}uuF$F(v}u.E@tEU܉B(MAt^EA$Q}t}/j:0P\0-uFt EF$E@tE@U܉B(} u蓑Myt/WPQqEPEPuuCq}u1uFt EE EE@tDEEr}u>UBt EE vEMAt E@E9E/v}j0P0Pu6I}Mu؀>uU܋BEE؍/Ɖ8u EE؍-Ɖ8u1EE@$ pIUBvE؍/Ɖ8trE؍/Ɖ8u EQE؍/Ɖ8u E(E؍0 8EEU;BtBb u}M9ȍ/8u7UBd1¸8U܉B .E-8u/E@(@  pUBE/8txE/8uE@ vE/8uE@ kvE0 8uE@ ?v}t% j0P1PG1PuTF u讍 u蝍UBxtuuurPjuuvM܃yHtjqHQuFHE܃xLt5PLz u,;Bu%jUrLRZMALAPu܃~8t v8F8E܃xt @t ‹B`P`M܉A8e[^_]ÉUWVS [DE Ep\Etn~E9FuU}u Ex\ vExVxu <F8 v V$vue[^_]ÍvUWVS[^C}Ej fPqE} t[tU~w V}u* Vt Vu wЉE } t ~}  WUzyE tjWje EUMBEPTt1E #BtBEu r RUR~t V WEUe[^_]ÐUWVS [BE0~X~yt9F@u3~Lt-VLB;}#~duudPjtFdUBWrP e[^_]ÐUWVS [ÎA}7F@u8FXt2~Lt,VLB;}"WdPj\tFdjWFd We[^_]ÐUWVS [Au>WTRt 92E9BE9B u- j BEBEB 2GTBWTE BGXWTtGX BGXR wlae[^_]ÐUWVS [f@uj fPnE1VTv׋Rt 9 E9B E 9BtjEt9uBIuBFTBG ReFXVTtFX BFXR vle[^_]ÐUWVS [Æ?}EM r\ti9~uW9F uR;r\u FB\FAVxu F8 v褛 V謇vve[^_]ÍvUWVS [>E 8w\vt7E9FE9F F8 v$Fu* jVxuu LG\Fw\ E EFEF EFe[^_]ÍvUWVS [6>uEF E~ WE hvWPt%ExtuPWS W W/e[^_]ÍvUWVS [ö=Ev z1Puju 褑EPj1PpPEpu E| Ur jPu 躹Ƌ#Bu*jq1th1P1Pu #>^}u6B\@taU 9P9x pRp:;v Ep b8uWVu vUr WVu e[^_]ÍvUWVS[Z<U} U}EEMyht j1PWExht; j1PRJ P1Pu[:$fE@EE@EE9t(PWuq t ;}tOE9tEPuj9 t&E9tEPWj ~UB B MA`(PK‹MA`B :EBMJEB EBBMJ}tEMJEPhMQhjR e[^_]ÉUWVS,[Þ:uEEEFEEE܋E8FEFE~@EԍvE܃x,t p,L,E@,R,t w,+,G,~tF;F ~F FPF$PEpljy;肕Eju+$1Pu P1uL uE E tVuuVujuPF$Pwl8yEEjuT+$1Puc P1Puc mvy&E uFE t,VuuU~t)FF}t"} uVujuv~:~} u:E4$u<$" Puu6}tuuum6huuJt uEE8 Pd u2K V}tuuh5E"v u5;Wu 6$蹞E؍e[^_]ÍvUWVE0Fu%FfEdE+EPE EPVuǃu@FuLtu>%F uMt tE}E9Ef uEe^_]ÐUWVS[ê6} uExLu E@LE‹M+QEMA+46@65j9}֋E@VPW Epuv29}֋E@VPWՙUru>9|? u G9du,MA%= a9}֋E@VPWZEp4>u;}s^U؃ u E` E@Et%UB A} uEH vU؈AF;u)M9}֋E@VPW豘Mq4>u9s? uuN @ u uFu@UbA;M)E 1PYMy$tH;U}>:A$uIIE#B;U}:u:F$NNUUB;u'B MALuAPjuu请Ee[^_]ÐUWVS [ò3}Exu Ur+Fu'jV2ZE@@U9}ljFWPu 9FF;u'F UBuBjVE0e[^_]ÐUWVS[2EEEEE}Uz<u r`PMA<vE@ Vʅ u ,ju _$]3Pu荃3Pu ?*}uI hVjEpu $ u> VMWue[^_]ÍvUWVS,[Ö(Ev@3Puju |$3PE0 P3GEE Urƍ2 8uEE}9}m E܋U4蠅E؃ EPuu WEEu j3Pu؍Q3EE}9} E܋U41EDBt!EP}܋E4u ݎtNBuԍ2 E8t( j3Puԍ3Pu &(藂juVuyN u _*ju $]3Pu؍3Pu ' > V 댉~0}t*EPVuU| uBPVcIVu #> V豂e[^_]ÐUWVS[&} uEv4PVjWy v葃E jPWNEt҃EPvWDu}u1EPj,4PPv Ww uE싄Puuu*jWw$]3Pu䍃34PWY&>e[^_]ÍvUVS[ %u U}tq3PRjVxH r蕂 jPVUu #v PGPV!#$ыe[^]ÐUVS[Ã$u U}tq3PRjVtxr r jPV͠tڃPVt= V"ƃEPVƒ}~E| uHPVG댸e[^]UWVS[#}~EEU)‰Ѓu&}t \4Puju w Ep6 jPu t˃}uE V讅Vju a t VXPu }uF WcUr譀WVu  t W[6;}}D EtiƃU4YPVu u ;}|e[^_]ÐUVS[["u U}tq3PRjVLvI r URPV裞u! P_PVq $)e[^]ÐUWVS|[!uEEKEPj4PPEU4u (s uS}u E E$vE9u} EU48-t;u4Puju JuE Et~8&uxuNEUU+}Gv PhE9}$ U2U4x~UF9|ދEEH PuWu ǍE9Et ui#}t,Wu hWu |ƒ{ƃjjW|u]jjVW޻yK u #ju  P4Pu ! > VA|Wu ǃEPu $} uPVD}u0EPVx}}~U| uBPV`BVu e[^_]ÍvUWVS ["} U}tq3PRjWs r|ƃ EPVWeu WvEu+ j3PVQ3PW!$yI" P7PW$}e[^_]UWVS[^uFv 5Puju Lr^E<5t4 Ep{ǃuEPEp u 艅u Ep{ƒ:|uuuWRu EPEPBPu ,qUEPWu t^tt t%vvv \5P1Vuuu oƃ uet+Vu  jV9Pu e[^_]UWVS[úuEPVft}ؐ@ @ Wfu V-f4$ee[^_]ÐUWVS [Vj|5Wugƃu+ j4`cƃjVdV8PWu: EPu VV0ƃ}u 5PE F e[^_]ÉUS[j|5Putu PP,t Pd]ÍvUWVS<[nUzEċz Py<$quuVu WNu jA$V5VuV u SPVuW G0t Wu W腖u ju<$u u jۣe[^_]UVS[Êu~tVvj64$be[^]UWVS,[B}EEEEE u EPj5PP4u jk E+Th,}NEF;uF 4/wEyF;u: 4wUR6RPu # tJq}EF;u  4vE 6PF;u} 4v8-}tE؉E}toj<7v;u} 4\vEFCvj|7P7=v$7P7)v P7Pu EH9uEP6P4uPu } j?_EЋ}щ $%_ǃuWUЉ:E B$Puuu ƃ u WB`u7`buu & uЍlPV{vuuuuuu ƃ ua j5>vj<6.vj|6vj5vj6Pu vVu  jV&Pu e[^_]ÐUWVS[æ}Ew }t}u<8PWju jC wtƒ EPRu גEtEu j3>v wsƒ EPRu 藒EtEu8 j53Pws PQ3Pu J$@NEE;u}kEPj4PP4u g Ett#(EPtu |t DE܃;u| uuuuu e[^_]ÉUWVS[ uu jWtEVju juP"slj4$TytfGfUKvuu u[Wt.E8~j|8Pue[^_]ÍvUVS[CuE EPEPjjVu E 9E}E uE PjjV;u E EPEPjjVt E;E }E uE PjjVt e[^]ÍvUWVS[Òu EEDBjEPV PvW舀4$PjqvWˎ Ft F Ht+`v|\F;F'FFE@tjEPV4 PvW]vFt*jEPV PvW:vjvWzEău : WKE<$^ EF Ho+d<|FPuW@IuWjEPVF PvW~:FPuWKt9uWjEPV PvW~;U NFVQFPuWLt9uWmjEPV PvW-~<;E WvVFJv>t 6N }QLuPm\:U : RaEe[^_]ÍvUVS[Mu A H+$vxAAPVnnXAPAQVqqjk6AAt];"_;Aua; vf;e[^]ÍvUWVS [F8uS`2FFFF }~^ V`bE$KǺ;U}vM B;U| j JUPxFF e[^_]ÐUS[Èu u]ÉUWVS [^} Ep 8~ ;PBpt~t uVUB Rza~W P/Jƺ9}MB9| j J8xpUBB MAe[^_]ÉUVS[Îu 9F tVuuNQEQEe[^]ÍvUWVS [6u >~ ;P o9F tVu.u5FxEPEPuuFuuujWVue[^_]ÉUWVS[êE 8~ B~tV;t RG~ tF xt VPMԋF1EGu9u|UUM)ыE+E~KtGy }4vI&vu}T4~vIE}E9E}#vU؋MuBUGE9|MUJduu܃ PbEE}~,}NjuЃtfЃtE}E9E}gEЍvU4>B~tV;t RCF~ tF xt VPMЋF1EGu9u|UUM)х~6EEu;u}M̋ : RvWF;u| uvCvE9EU9U~ t?~PV,f~w~DBuÀ~_t9u* 3j`=Pu u)PWPM3 X3PPO jHVmM j=PV[M jhVDM j =PV2M xPtPpPhH`u d  pu6jH=Pu wxDžd jV1D`װщ $41D`2Q @$ 1DGwQxGpG tGG l]tEDxt lR;j=PDw=P> lDR ddje=Wl!$0DpP0PWl ivj*=PDw<=P`^=Pu Džd &Dždu dlY PLH$Lh$L$L($Lde[^_]ÐUWVS [u 0}U9z uE9BuVrIEE@EuɃ j.E$.Uװщ $.UBVr&O}GEG UWG}t>je=WuL$J.UpP0PWu) e[^_]ÉUWVS [E uhF>jPu6uvu jH>PuJ>vuPuPƒtvje=PRhǍF>tP7jPuL6ugvuY jH>PuJ>ue[^_]UVS[Etp PD.ue[^]UVS[Òt:F 6-v-4$-uȍe[^]ÐUS[7E $ÉUS[ $ÐUWVS [DžDž E 0g u }~U B8-t MU E PEHP >ƍWjVjc j\>P\<$H4$, uWjE 0jmcvPj jRc EHPVMjVa>Pl\ jf>PO\$sIj ul>un>Pp>P \UtR j]Zǃt?j>PWnPWo j>PWn  ƃ jYǃtJ>PC jj>P9WPWo j>PWAnDžOv PF>$BY$0YDž >jj> u>PnVu; j>PZmjP$}X$kX$YXǃtPt, PWm jWl>P ,vt aru" t bj jDž EDž jќ$'W$W$WNj8 Ph<;t0 6PW,l jWl ƃPV=WJVk jjt : R; ?PVEV#`e[^_]ÍvUS[ #9]ÉUEx`t@`@]ÍvUE@]ÐUWVS [rUEEu u PGPt \?P=KGT>EFFF UB\FB`Fz`t B`@@FFFF F$F(Ep\p`e[^_]ÍvUWVS [îu~\GF\GF`E t!w Vw &G $~ WV2E HT@PtxTu Pe[^_]ÍvUWVS[E@u$Ex`uDž?$E 8u(j?Pu,$$P PPPh ju u$ 8u $ƒRP@t1 j?Pu ?Pu$P h/#Ƌ$щ $#$PCFEFEF FjFPH$@FHEFLFPFTFXjF\P$jP#dždždždždždždždžt%P$ЃPRDp  P.=($ = (v;t,j @P < j7 <j( <j:> j<j >r(E Q!Fu PA$U>($G>e[^_]ÐUWVS [ÞuFLE Pǃ~T~6NP~t"V6BPR@t P"Fa V_9u EtDPvL}F$"F\$"~Xu VNPe[^_]UWVS,[E@LEԃ P)9Ej@PuYLƃt, QEЃVP,@ vEj@Pu Lƃt( Q]ǃVW?uƐVuv|jV }t"juЍ@PufPu_ t?jW@PuBP<$> uƐVu |jV, Uzt(RM1APR@t P E@EPEPg!t&uؐ p qVEPA!uރp uEPE\P!u؃ u\V jVfUtg;}% M4$FE;|݃ UMǁǁǁEx t pP UB BBHe[^_]ÍvUVS[u 6v4$we[^]UWVS,[u u EЅtuЃ}toEЃtc;}$ UЋ4 FM;|݃ }LJLJLJEPEPPEPhuuu E9Euuu~2t3 j<@Pua@PuQ$mvUЃt>;}1vMЋ4u2'F};|ҋUЋ@u/ jMЉǁǁv};EE܋E P7E؋U܉}ԉЃtf}ԉЃt}ԤERM؋UЉ}Uװу QEuP=;EЋM }e[^_]ÉUWVS [>U u u}ǃ׾;}3j4 Puu2uF;|θe[^_]ÐUWVS,[ûu E Ptjjz@Wu_ ƃjWjuBRjurRƋ 8 .B8 rm. uj}u)j@Pu!$9vPPPPhuu u j@Pu@9M;u j@PQ@&j'AP0FW0t8v9u(uBG0BA R4$ vыRu˃ BP`9e[^_]UWVS<[?u UEBEt RfDž>t+v>:u~:u>:uF>:t F>u؀>uO)~ ~:u~:t:Eu_EEE$8 j. W,PR@t @ wEtcjPujjuu!u'|BP6 vDžt6PR@Džt @ u t)>.Eu 9v1~:t+E$%UEU$JvE$0Et#U :u9H!EE PJ-e[^_]ÐUWVS[Þu}EPEPEPEP Puu V }tEBvt2 V$@Pu BPV$ e[^_]ÐUWVS,[}uEt V[t}v u%EE䃸u tE䃸t$ EPuuu uE -v#~t EPuuu uV vuuՅu EEPEPEPEPuWu uE u؉<0t)}t#0u0\Pt@ EG}t}tEGvEt6 u8$@Pu BPu$P e[^_]UWVS,[V}uEt Vt}v uuEE䃸u tE䃸t$ EPuuu uE -v#~t EPuuu uV vuuՅu EEPEPEPEPuWu uE u؉<0t+}t%0u0Pt@ EG}t}tEEEt6 u$@Pu BPuH$ e[^_]UWVS\[æu uEEȉEEEBx(uBEUċFE}uNx&M0GPW@tx ݐE}t učG\Pt EEU9UuhuMM P ENjuЃtfЃtEȃ9Et u' EEUUUMEBEt U9 E9Et u e[^_]ÐUWVS [2} uuE9G tWuPuJGt#U9Pu@;BHuָFPH!ƅu8WuPt $Gt0FPH!ƋE0e[^_]ÉUWVS [n}u8CPVju ^EPjMCP(Pvu  U s+>|dL4VWu u+vVWu u_vVWu uvVWu u7vVWu uvVWu uWvVWu ukvVWu uvVWu u bVWu u NVWu uC :VWu u &VWu u VWu u7e[^_]UWVS [{u} u Džu u FPwu t u? j\CPw PBPu E$mv|CPWju > P! w "ƃ>:u ~:tajpW!9tj @PW!jVP!jj苺ǃPPRp tvtjv7 PWu ʼ PuWu $"e[^_]ÉUWVS [2}t!CPuju %CvEPEpƃ>nul}~fCj PVt uMN ~ u A9 9iu5QE9w)BjPQ7 uEpjjǃjCP PWu 蘻jBP PWu zu ƃu 9uj @P jvPWu / EpWu Wu 聺e[^_]UWVS [î} }tjujWH WƉ<$9uj @PjvWκ$e[^_]ÉUWVS [*}[CPuju  jCPE4 PBPu K$|9}.v E4fjjPu tF99}7 E42jjPu t PF9e[^_]UWVSl[+u}CPVju  vPvu ǃu9PvjjPu u vjEPu ǃ}u jv F PEPm hPu ǃu3E ppCPV! jVu  u 8e[^_]ÉUWVS [ڹ u EE}! DPuju vEE9E}9 Ep7ƍ+D8uEEE9Eu8vjjߴƃ Vuu uWVu ǶDu;u}; E4;uJ#URPuu  uF;ue[^_]UWVS [î}2DPuju =9}/v E4* Pju uF9e[^_]ÍvUWVS [.E}GDPuju  EE9E}> Ep8-u(ƍeD8uEEu;u}0v E4VuPju uF;ue[^_]ÉUWVS|[W}CPuju J PEpu uB j|DPUr PBPu I$KvjEPu $#}u!jEp u vjj Ǿ;u}GU4Wu 膴t? WF;uUB xPj  hPu e? WDu3E ppDPV jVu 4 u e[^_]UWVS [Z}}tDPWju L wu ƃu9 j@Pw PDPu g$D Vǃu u ; PV u ) PWu e[^_]UWVS [Â} Euu WExu[EPvW}uR jDPv PBPW芲$Ev EPVjW+Extj@pWF$e[^_]ÉUVS[æu U}tEPRjV{ r1ƒ:t;v@8,8:u'9v#x:u9r8:uH9r8: H99r)@PRV荱$e[^]ÉUVS[u U}tEPRjV] ryƒ8tv@8H9v8:x:@9rjPV$e[^]UWVS [R}!EPuju EvE Epƃ>-uB4EjPVt$=Ej PVyEG9Em}t}t>}E4u 胶ƃtc u PVu Av E4jjVu ƃ t u 賯 PVu Me[^_]ÉUVS[Ept2N ~ u)HXxXu@Pt P Vfe[^]US[ûEU @Bt@ B $ÍvUWVS[ÂuE @ EE Pu PƒEPEPEPEPhjRV }t< VƋE@X$KNjEE@HGwG }tUzt u RE xU B e[^_]ÐUWVS [æUB?t@;BHuBPH!tpщOuUB, GPxUB WVP#UBExe[^_]UVS[ j4fP6菸F(迸F,fF0fe[^]ÉUVS[þj4fPƃv,衸fft)9fu F0fB0z0t 9r0uF0B0e[^]ÍvUS[KUBA,B A0A4BA<$ÍvUWVS [}j4fP7$8U PUPV$P F$e[^_]ÉUWVS [ö}j4fPƋV$t?E9u-E 9Bu%9zu uB F$B A R vыR uÍe[^_]ÍvUWVS [2}u j4fPX VWPQe[^_]ÐUS[Uf@0t9P(utuu P ]ÐUUM EuA:u LBHDuA:uJ 1u*zu A B@ABHJyuJ]ÍvUWVS [6j4fPbE7t\u VUuB97u"F~uEG9wuUW vFUBv PU먍vuv렍e[^_]UWVS [Új4fPE6gtjj+fEuME0>uV׃U92u%F~uBE9puH@?ERt9rut FB~uEPE9pu PD V:3>vKe[^_]ÉUS[pj4fP@]UWVS [B}j4fPkpx<$ie[^_]ÍvUVS[uj4fP+yt;A| ;AuF;A}VAQAy uyt AP j讳e[^]UWVS [~}Ej4fPEet%jjdRvE7uE@EUBtE@@@ UBE@ p$t>t Wvv uUB u ztE PE>Ep$t~t WvVv u WuF t u5u4}u. u "Љ W[EEUBEe[^_]ÐUWVS [ΧEj4fPǃGKctjjCbG Gw$tv>t jvv uw$t'~tjvVv u vE jkuotEu j v GPG GEe[^_]US[øUf@0t9P(u p,蝰]ÐUS[xǃdjfP(<4vhZ]ÐUS[ԥdt fPmǃdnW]ÐUVS[uf6PP,t PfEP6RR0}tp e[^]ÐUWVS[}u EPfP28@ j0 PVW*u v EP0ue[^_]US[äfuPP,t@ ]ÉUE U9P u PuRUS[D8uQPP@@ ]US[]ÍvUWVS<[Σ` Vǃ VjW PBAc~e[^_]ÉUVS[ruF txt VP VF2e[^]UWVS [&E@ E8u*2FFFF Uzu FFMA;t6y GPF~WUrPF~}t0MyuMAQFVEF VuURe[^_]ÉUVS[6u~u'F x u0|EP F VP Fe[^]ÐUWVS [u} ~u*F x u0|EP F VP tFFe[^_]ÐUVS[Êu~t V;t RFe[^]ÍvUS[D8uQP@@ @}‰P(P ]US[ܠ uz]ÐUWVS [ö}w ?~ EP t~t WV} G(G We[^_]ÐUV u VuuVEȋuÐUWVS[E @ \dPu X;d}TXW Vt VQWWD/G;d|D/U؈W0u}W1u}Wyu)U؍EdPRWnu)U؍EdPRWtu)U؍EdPRlMWfu)U؍EdPR:Wouad~XU؍EdPRU؍EdPR`jPXX9`d9`sE`NjDP t)XdA`9sDP u勅Xd9`uU݃DFE@‰փ\t\xt u PU r(B O؉}t@XFPhVu蟠 jVuq$e[^_]ÐUVS[Ҝu j~±1(шʈ@FFe[^]ÍvUWVS [Æu} 8uP@@ @px<P [^_]ÉUS[u us]ÉUWVS [}E ]w ?~ \FPt~t WVE_<G We[^_]UWVS [Æu }<9F uFVW"Vu u FVWȍe[^_]ÉUWVS[E @ ltPu p jPWݝ`9puB}tfWFPxVu> jVu$$)8t*}td`u蹝t9psWp\DP t7tTApT9s\DP uىt9pltlxt u P݅`U Z<B e[^_]ÉUWVS<[ÆEȉEPUrrj}эq $UBurEpe[^_]US[ 8u-P@@ @UP4P ]ÐUWVS [þ}w ?~ FPt~t WVE G4G We[^_]ÉUVS[Zu 49F tVuu VEe[^]ÉUWVS[ E @ ltPu hhDP tFDB u>-uFpjjPVǃ>+uFpjjPVǃ9pu`}h\GPxV.u˚ jVu蝕$豻hu[v8"uZ}tHG u{ jVuM$a$VGPGPuC ht9ps[pdDP t;htTApT9sdDP uًht9pltlxt u PU z4B e[^_]UWVS,[ʕEp}WeƍF$UBWrVEpe[^_]US[x8uP@@ @UP4P ]ÐUS[ u]ÐUWVS [}w ?~ GPt~t WVE G4G We[^_]ÉUWVS [Êu }49F uFVu<ƒuFЍe[^_]UE]ÉUS[(E8 P]ÉUU:]ÐUS[U$UWVS[“U E EU E EU E EU E :U E 2U E  U E @EE8t$ uRQVWuuuu0e[^_]ÐuRQVWuuuu`6(HP66BUS[E Pu]ÐUWVS<[’}y<} t/} IM!Ur0FMq0FEE@@@ @E8UBBBM J$EB(B0MJ,B4B E}EMȃeE"Uątu F耀<t> t>\u/~ u)FM;A(uA4ljFU+B븍v>#usM9uE1Av>\u3~ uFU;B(uB4EPEPV>uԃ> tFM;q(u}tEA4U+B@vMqUB;Bu RhE@ENjUzvuF>\u3~ u-FM;A(uA4EPEPVuԃ벉EE;p(w@@>"u!EPjuUB()PVu$>{u/EPjuMA()PVu Ju%uEȃPVy&Ep0ENjUz+GGEBG u uu Fv>\u7~ u1FM;A(uA4EPEPVbuԃWvEE;p(t_~"u)}tj$uCEx jP‹B()PVr, t EPt>[F XPjUB()PVr, t+xUB B0B4v`d9lt l8]u tSE;p(cx,tjHPUr,zE@ GUB0B4v+GGE@v>\uG~ uFU;B(uB4E EPGPVwE@w/>uU;r(tmGBF HPaUB;Bu RUBzwG E TE9PuG@Ep0e[^_]ÐUWVS [΋u~89~t vI~e[^_]ÍvUWVS [ÒUBU PEUBr}ЃtfЃtE8U9Bt rUEPUPe[^_]UWVS[EE P脎} >UtFjHVu2$F$V(IP0IPu(UBT;BX}E@TuUJT jwIPE0 PyIPu.$膴EjuuWE @Pu{E 8 7 WEUU؋E싀E@ EUBTU;} U PAEܾ;u } E4U܉F;u |E U}y}IMDv}I9Ms, E@PE؃ uuPU؋Euu Ur ru؋EpTuUrR EE}t uU9Ut uEp`Et@`uu uUrREEp`CtuuBEU8t u EHTEe[^_]UWVS[uIDžteFT;}U P;u }*v E4PWdF;u |ߋ R ut t3?uWQuu u uubvWQQu)t Pe[^_]ÉUWVS[gUIuFE ;Et8 uF@;Euy}эQ~Iu uRI uRIPP jPuMe[^_]ÉUWVS\[~} EE}E+zĄ|||||||||||||||||||||||||`GEGEIvuVjwEu'jGPG@Pu uEE t"G HPG PuEmu~ G@PSƃwwV;G0}tUBu RvhPVu\EE9t VJ}tE8 P}G )E IPu}u(UUuuuEEcvU:~) RƋE8 Pu}tEPuEuuuwM}pE$v}tU : R/e[^_]ÍvUWVS[ÇEDžDž}y} IM uۅ@`Et B`E UDžǀv hPu Džx x~ xPǃDž|;x}Bvv FPuBF t0;x|jWu 9}"8 47F;|Dž9t W"pt+) hPzDžtE 9vz]D+E Dž  u=u.tpE E9tNVpu uC;}(v8 4F;pt hPytIE 9v>z]u2+E H3+E HB`B+E 9t WpP` e[^_]UWVS [ê~ujju Vǃ jV|xtV|@V|$PVze[^_]ÍvUS[4~ju u詐]US[ ~hu u~]ÐUWVS[}U Mx эL M}u=MAȃ8AAAQ$EA(EA,A A4֋UB;B~ RMAy wAE@AF;uwG >{uuFwG F;uu:}tj}u+GG+GGMAwG ;utcEPV肽EMыPu_u vuǍv:u'F;Et~:uF;ut>:뛍v;ut >(u+GGuE@tmPjFPOMU9J0tB08)t9Ex,tjbJPUr,xMA q0A4\Ep0FENjUz+GGEBG =ENjMyGG v uIe[^_]UWVS[{u } jhPjVu t t |plJ|u ƃt_>E~tV;t R~ tF xt VPF2Fu Ve[^_]UWVS,[zUy} u U U} ыU L MЃ}u=E@E8UBBBE B$EЉB(EB,B u FE@E̋U;Bu RENjUzwG EF耀<>}uM{>{u Ev>\EPEPV޽~ F;Eu E@4+GGtUBUB@;B| RUBzwEԉGG BuԃwG vu;u }tjnJPut;u vi<#t<#< tN<{uJC;u5FDB t"}tjJPuytN;u wE@ U P0@46;wu ŰE9Pu+GGE@}tFU ue[^_]UWVS [VwUuy} uU } ыE T}u1FF8FFFE F$V(UV,F VjE @PGuTF08"t4}tjJPv,sF E F0F4}t F0@U Ve[^_]ÉUWVS[WvuE dh WS Wjd)PVjE upt>ƃ hPe[^_]ÍvUW UIQR@}ÍvUS[ÔuEPuuP ]ÐUVS[buEu N9wG退<t<u8(u>)8:u9tx:u @9[^]ÉUWVS<[tu}y%} t} IM vEFFF FF8FFFU V$U UV(EF,M N0F4EuE EEM؉M܉MU }Wq u: Wau*} t WUNjM E(UNjM EF89Ft vae[^_]ÐUWVS [êsE8@EGE uMyG@;G| WuwV G+EPVRG@EFVFMABBB $I uw u7ueExt PLv u u7 uu%EGMQ+UPUWP e[^_]ÍvUWVuFEBEVauP~uE~ V u7 V8u'VuF+EPujW| ~te^_]ÍvUWVuFEBEVauP~uE~ V u7 V8u'VuF+EPujW ~te^_]ÍvUWVuFEBEVauP~uE~ V u7 V8u'VuF+EPujW| ~te^_]ÍvUWVuFEBEVauP~uE~ V u7 V8u'VuF+EPujW ~te^_]ÍvUWVuFEBEVauP~uE~ V u7 V8u'VuF+EPujW| ~te^_]ÍvUWVuFEBEVauQ?~ V u< V<u,VuF+EPujW Fve^_]ÉUWV}GEBEWuufWTGEBփ Wxu= W<u-WuG+EPuVukW Bve^_]ÐUWVuFEBEVauQ?~ Vu< V<u,VuF+EPujW Fve^_]ÉUWVuFEBEVauQ?~ Vxu< V<u,VuF+EPujWl Fve^_]ÉUWVuFEBEVauQ?~ Vu< V<u,VuF+EPujW F ve^_]ÉUWVu~@EVBv tuEFE VruD Vu4VuF)PWjug  Vue^_]UWVS[lE`@,\Uru] Rƒ uƒMy QƒH!`B;Bu R`@X‹`Q@MAB`B@Bǃ+(vk$hHjiffLkj`A;Au Q`FƋ`rMAFA FF BX‹`VA +EpN j`‹B)PV\:ƒ Y`AtuFX`F‹DBFD @vdPj`UB+BPr\Fƒ dMAX‹`Vd+BBF)B >F;F Vv`F;Fu V`BrMAFF By hPj`B()PW\ pt9|t |?]u tM`;y(uy,tjJP\eF`F0F F4v+FFExX‹`Q+FBB dPj`uF+FPv\ƒ dUBX‹`Qdu+FBA)B wA;A| QƋ`rB)PVFP`AXQB BFBFB HF `F;Fu Vm`BrMAFA FF B Qƒu~ VƒExtN uƒUzu RƒtMyu~uX‹`QuF+BBA)B u_ƒuNUB`A08`F0F F4 ue[^_]UWVS[êfEE@,EUBBNJE틃 vGEEDB u}\u}\u uًUz0E;xr@ xv}+}-U틃fP%LjW6EjjPW/>"uc}tHJ uHi jVud$.$V!KP+KPuk UB 9}CEDPtn}EEDPu uhE)>E>$1KPWNKPufU> UBzE)B EBEau}.t}nt }NEjPW.9}t[>t1}t $ug؋E@ ؋UBzE)B EBEؐEx@ GUBUB0!]+$`b4`$ba`4`Db4baaba4`a4`4`4`4`4`4`4`4`4`4`a4`a`8aa4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`db4`4``4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`4`Tb`4`D`E@UBE@UBE@sUBcE@SUB CE@ 3UB #E@UBE@UBG<u!E@E@E@=uE@댉E@ =uE@evE@^&uE@AvE@:E@|uUBB GB E@UBUB0E@ EPW/ƊUUҋDPt^E@%EPWƊUUҋP}_U+BB zEx0 UB e[^_]ÐUWVS [Æ_E8G@;G| WuwV G+EPVRٿG@EFEFEGF VFEBE BB e[^_]ÍvUWVS|[^}GWP)‰Ѓ<~<P\KPxV jVp,']$@ GB0e[^_]ÉUWVS[w^u M}U }>@F>u΅TjVuƃQDPV>Jǃu=jKuKPKPV PKvE( V >u΅PVu|tWPIǃ PuAjuTO PKPVKPKuKPK(vE$&v jKPuLPu]e[^_]ÐUWVS [â\}9},v j躣M 0P0F9|׍e[^_]ÍvUWVS [J\0Et^jEP6Utu%8 tuv΋~}u 0 vFUB Vv롍ve[^_]UWVS\[þ[EEEE 9EjEPUE4qTƒu?E} uMd8 uLjV\LeEu ą\ER}WEu>}t+PuV$VWLPuh` EE<t tt\} EP/ƃjV EP-PEPLPu_jLPVLXE<ua}tx P3/ƃjV EPB-PEPLPu_jLPVLPu[ }tjLPuZEU 9U }}jjuD7jjVuP yME> V޵ u\jusK PMPu\Z 6v~VuVE> Vxuj }t!u}tj\MPuYEe[^_]ÍvUWVS\[ÛXDžDžDžDžDžDžDžDžDžDžDž}t E}t U} t M  PRDžDžDžDžDžDžDžu 9DžE4F<L<|^>&uF>u9@9t E H9uj|MPuvS$tDž _Et Dž>>uFDžA>&u/tDž DDDžFt6Dž;u Dž Ct"Dž;u Dž PPPW}t4Vu0 tDž UCt Dž>>FDžA>>uFDžAtDž Bt Dž PPPWMt4Vu{0t;;M })}A;M |틅)E U 9 t7 @uXjuE PM'}tBuPPAujuTE PMDž3 jt"jP0?t Džu{}tBPu@ujuD Pt Džu} tF jH?ujuND P|NvM 16v jt"jP$>t Džh PDžU 9Pu4u~ymE 9}9U G;} }*M8|xtx&xuվE;} u$vPP>tMPRP)Pu6?U q PܴFt;t Q>Džt;t P`>DžGU 95E P+t >t =t =e[^_]jucA PNPuLP-v jKP}4LPuP t _=t;t P<=t;t P=}tU:t 2<M}tu>t 6<} t} ?t 7<tcDž9}:v}t}ujNPNHt}ujNPO( uVuuuA uvju* }QuP|ju6Yu}tEF-vju|OP6OPWOPuLe[^_]ÉUS[HK juuu u]ÉUWVS[K8u!jOPOPu -PDžrtTtj76R~2}t*Pu61t}u tvutvw V~!Vuvlj4$"t%1\PPut uMu u %E jV/u j}PP jEuPPV}tjPPVͫuuuǃ豭t&PPusv uLu u 8:u=ju PPuI}ju}PPuI}t0Pu0 t}tu}tBU2juPP0PPu PPu'Ie[^_]ÉUS[G juuu u]ÉUWVS [êG}U8u*jOPOPu -PPRHu Ptjp >tbt"EPW6 }t}tu}tFUljWPP6PPu PPuH>tjQPW}Pv jQPu +QPuG e[^_]ÉUWVS\[ÊFE Eă}QPujEPjQP4PUru ח mEԃ +vEEE9E Uu4苣PEăPUp P>t3 6$~GF 7jw<$~uσ VEu9uhvEv QN Ep ֢Pu *8 Ur豢E}u%PEăPup uu ƃEPEp 觢E~E}t0ju7#u}jw}"uG j iNjE@$[uP٫}u FG~ UBGzEPuvƋE@$ GVP苫}t jv}ăEPWэpp >u~t(u@Pu D EPōu+}Qcv EpE8-uQ8tEG9Eu0 Et 蝠EPu t}ldt& Ur XEWuPu E Wuuu E}?juu >"vEv QV uvޟE}uBPEăPUp >j6u 8>v uv 肟EPu uuu cu}Qv Ep.E8-uQ8tEG9Eu, Et EPu 2t?}pht& Ur 蠞EWuPu |E Wuuu eE}juu <jv}u*uăTju <9}uvEăt ԈEPUr3E8uudž E@P3UĉuP誧Q} uv |EvnEPu uu juuPu =$苦-}t Rj EpPEăPUp ~7u O@}tQPuju ޒ uv vEvhEPu uu EPuuuu <$聥&vjwu : RP-e[^_]ÐUVS[>EURu Rƃ}t' j @@F F e[^]ÉUWVS[Ú=EPEP贇[x ?t3 7$wFG 6jv4$܅ WƅE؉$菇 EPEt 脅e[^_]ÐUWVS [<} DBt@Wt+0vDFu :.u.t B:.u! jNRPW\RPu=e[^_]ÐUWVuM EvE |PF>t>.EDPЉEA9t 9.;}u >tF9t9tAE}t;}t ;}~ }uU;} ;}H^_]ÉUS[t;|Hy+v85L6477D5d9@68896X98588P4X657767\5p475446 5884P864655 7@4678x7l7`77`4p6798H4688@485d645654(6494856,88@4P584T7H7$707<7@4@4@4X4t5D864554h5,5(9L9@9666t8\8|6754x44h877974h456@44 8RRRRRRRRRRRRRS SwSkS_"SS)SG0S;6S/CS#PS[S cSpSuS}SSSSSSSSS{SoScSWSKS?S3S'SSTTT T(T/T5TV6V.%V&-V5VbFbNbUb\bcbjbpbxbbbb~bvbnbfb^bVbNbFb>b6b.b&bbccc$ÐUS[*EH+0 *))*)T*<**)\))T))H*),)0*$*)|)t)l)d)<)4)L))D))))'b#c+c 5cJc^cwc~cccccccd~dv*dn/dfKd^gdVrdNdFd>d6d.d&dee+ec$ÐUS[)`t/ fqǃfǃdǃ`]UWVS [(f;d}M9tYB;d|틃d;``u:jP$ ofǃ`nv@ `PfoE`f}ЃtfЃtfpEfѣ`dfU@@@ de[^_]ÍvUWVS [Ò'f;dE9uyN~F EFEdId9}f}tO}t M;u uo. uU#B;dpu\ePړe[^_]ÉUWVS [ú&U} f;d}:9u(~tReP膓F~ 0v@;d|ȃt;u Rn R׃e[^_]ÍvUVS[*&u jNm0@e[^]ÉUS[%Exu Pqn]ÐUE@]ÐUS[ø%EHxu8u P/n]ÍvUWVS [{%}E }tePWju dyGpu PƍPPPPjjVu X u jePVOu j"fPV7;BtGt>8:u3 jF vF0FP- g;QE g.j gP0;gPufPug$ImgE Zg$fP4fPu$jI tHlvU :B Rz4vrBFt8 Pz Vfxu ft fe[^_]UWVS [}E`t G`pvE 8#uKEPE @PuW`u$}yo jfPu gPuU DBt#EPu u_uƉ+EE FEE}t(W`tB;EtERt9Bu^EEe[^_]UWVS\[uE E!gPuju pvUBPu P:zƒEPRu ǃ)NtEDEE@`EEUB`uhE0uV0x hPu .ǃu*U rhPuVЂ jVu ~FUEP`e[^_]UVS[îjju uStƃ VVNtƋ9Ft vF e[^]ÉUVS[Ru VNtƋ9FuF e[^]UWVSl[ u EEE@~ UPbE;}}#jE4d9UG;}|ߋEURPVuE jVxtV@V$xPV;}}aEvU4>B~tV;t Rb~ tF xt VPUF2G;}|E9Et udbEe[^_]ÉUWVS[ëE 0E,@@(}8 4PM1ow P-hP(,p Pu ƃ l,@~ PE` j(Wu s:ƃtB$MPugDžEGUW ,OG$ W((Wu ga,@G(,@$DžUJ9v$G HG V9u)au#h8~Mgb$xt@bA u  jfPM1#u$hP$Phbv $$9~| jiPM1t P5iPu X$A v$PiP\6Et6t0Gh,@jp u (Ƌ,Jz RtV4 u ƃ u )889 t ^^e[^_]ÐUWVS[çE4Ur9B M9uF;uE9FtfFtD49t j\iPup4FEF uPUB M9A 68~J}эAi2~ 2iRuPuiP\0r 4M juEPu50u&uuP0u6400u]}эAi2~ 2iMqRuPuiP8VzjVut>0YF U;tEM qt;f ~t(Fxt PP v \F6uŸe[^_]UWVS[G}Mu QuGiE<~ <iqRu PiPhVyjVu=Qu ud jjvu/ uD j\jPu$$7e[^_]ÉUS[lEHx P]UWVS [:UB t8 PnEptR>Ftxt PP PZ~tF8 PSn V[Zu uGZe[^_]ÍvUWVS [Öu~hFhuS jFpujPjjPV ~lt! jvljjPV e[^_]US[$ÐUS[$ÐUVS[ut+jiPb/ƒtB rFЍe[^]ÐUS[ÏEM @Q A@$ÍvUS[\E@Hx P]ÐUS[( jP}]US[ jP|]ÐUWU jIQRu}ÉUWVS[ãuDž;uE p @$ Wq WjVQ jRPu uƃWse[^_]UWVS [uE ;FvUEmF(U <yEUM~$t v$lǃ~ F(U 4WCSUF(U tW+SUe[^_]ÍvUVS[ruMU B@x9sȃur(PB,PuuBPg t,u%tPjPV e[^]UWVM u}UBtu B,B0%;JvB(ȉB(D^_]ÍvUWVS [Ö }u uWu vVVPWe[^_]ÍvUWVS [J }E @ UP$ R.ƃu-9~Ǎ4~)uuPVu uze[^_]ÉUVS[ ujuVFujjju PVQe[^]ÉUUM BB(AB,A]UWVS [v E x p;8uU9tWEPu TjuuPueƃ t-F4tt u WE p8U B e[^_]ÉUWVS<[ } um wkPuVrVu EtW v#tEă>u}tjkPu t#G #tvu >uރ}tjkPuD e[^_]UWVS[ u uzjdxPjV5 kdw&k jRxWu u VkPV~qjdVjjfjWVkPue[^_]UE@H4x4 PÐUS[3 UM B@4BA8A $US[ ju ueƒ]ÐUWVS [ hlfP78ujP{DžzU;T|Ƌ1U947u ft~70Nx< v DDpDtNyًJ}z|v< j8vO@$G G,G04$pj Vuu I MQRPPǃVclt8 VP}tWkPu GPNG(G4xxt/hH4x4 P rxODž v DDpDty҃ E@PNAu qnEG|e[^_]UVS[Òu FP̾~(t v(O VNe[^]ÐUWVS [FhlfPo4EUzt>H4x4 P_ u4NG<ue[^_]ÉUWVS [þ} uGSaFG9uG67>mG A;Ftu-G FxGF|GG FtFxF| G ƆFe[^_]ÍvUWVS [} u VGFG9u7Pl4;G u)~tt vt@MG FtWVxWV|8 `Ge[^_]ÐUVS[RuF8QVztR;t RLFx tP zt PRNAF;F u PuL/v~t)~t 9Fu 6OL 6Ve[^]ÉUWVS [ÒUuFEE} uƆFduW} ҍB=~ RkJFFu 6j vE V}t*}t E;u unK uU Ve[^_]ÍvUVS[êu8uGjVxtV@V$`PVe[^]ÐUWVS [:E }>E~tV;t RJ~ tF xt VPF2t/t 9Gu 7JJ 7WGƇe[^_]ÍvUWVS [vu8 VhE>уOuUBB0 GPLHUB W6PdUBz~t2~t 9Fu 6iI v 6VFƆe[^_]ÐUWVSl[ÎEEUUE8uOjuxtu@u$]PuEEvM9M|\ME9Eu6 PGE;u}0UMF;u|vEPuGE}ыUT UUMEAME E E_M;QtuA|<uE;Ax|uuz;u}BEEPUBtB|Pf}ыUB|LJ|F;u|E9Et utGe[^_]ÐUS[E Pu]ÐUWVS [Ú}8uIjVxtV@vW$ \PWEPu _SH;VtuF|<u;Fx|F|PV>Ft~|WPgtF| GuWu XTF|e[^_]ÐUWVS [öU;Btt1zx~ rt)FMAtAxE8MA|<tIUJ|E ƋMq|;qx|Mc VaDǃE0WdUztt rtEMytqxU;BttPrtd uMAte[^_]UVS[öu~t0~t 9Fu 6#E 6VF V}e[^]ÉUVS[Zu VW~t0~t 9Fu 6D 6VFƆe[^]ÐUWVS [}>>E~tV;t R>D~ tF xt VPF28uW2FFFF Tv~tV;t RCFF~ tF xt VPF e[^_]ÍvUWVS [u }E t/t^_]ÍvUVS[Þu v!?~t v ?e[^]ÍvUWVS|[Z}E}~ EPl=NjEE;U}vB;U|EEEEEPu 6E Ef}%EPu 6E f}%f}*u"EEPu 6E f}EDBtzU JEjj PR[ƃE8$u[@E EPu 46E E}uBJU}t E9p}u2;u}EE#vE}tj\lzvf}w>EDBt+U JE jj PRZMEPu 5E f}ltf}Ltf}huEPu c5E Eu}t U9UE[R+ Ejl:vE 8EPu q4E f}^uE 8tlEPu M4E f}]uE 8tHEPu )4E f}]E 8t EPu 4E f}]uZjlEPEP2U$lPRlPu$v QEE9E|tƃ}t UUvEE9u- EP9ǺMB~EPW:ǃ;U} B;U|E@EE 8}uUUuEE}tEU;U}v<B}u<tFB;U|E9t W0:e}t.jm,jmvj\mvjmPuE9t W9e[^_]ÐUWVS[uDžƅDžDžDžDž|Džx!nPuju D<vjEpNPVu u ~A Pq7|;}v|F;|jMqNDžDžd P0Džt$>tUv8" Pl0ƃ P=u vf%tB:" PR0ff; P/f%tf*u&tP/sfwjDBtTJjj PRTƃ8$u,@P@/NfwRDBtP(+ƃPPt Ou P@;ttu9)PQ]xx| @ Po*t PPG=vtpN+M7+,,xxxxxxx``DDDDDDDDDDDDuDžtt@tLtvu4Dž (vu Dž  ~{tOFvtt`t.vtyK9u=DžtA9tOt xxtxXu tjWƃtt$y V@nPW/MjW VLxx|AvG=vt0v+:+`,,,,,,,,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xtVvttpt>vttXt#t% =u:tt0A9tOht tUtt 8Dž8et8Et HtuKjjPW@$Gxx|B8Dž;"|<G j4jEt u B\ uC jlPUt @ PCnPu I$ Dž |8 4!?F;a}3>x;}e|<t44xj|8* 4>= Pxj_F;| |*tLuCt j@vxtjjxA+vS=xvt WZHxxu $e[^_]ÍvUWVS [J} y!}t}эy8u/=0VFFF uF) GP(F WuPDF~e[^_]ÐUS[Ôu u']ÉUWVS [j} y)E }tEf8tvE U Mf<E@UBBB RK>MA UD$&ƋM EFF~ PuWCU fWMqEe[^_]ÉUWVS [v}Wj w>u1ww!;Gu F W/ we[^_]ÍvUWVS [ u} Vj F8u VZFxuEPFPv fxfEEe[^_]ÐUV uVj F8txu Vx F uÉUWVS [V}uWj W:u WW;Gu1 W;+u FVE PǃWj W2v+E @PM DJ P]ǃe[^_]ÉUWVS [ö}Ep 8~ |nPJt~t uVUB R;y } t} эyuUBB/ GPP$UB Wu P@UBze[^_]ÐUWVS [u>~ nPIVjB ~GE ;G~< @P#E~tvvPf@4$:EFE GE F~tV;tE e[^_]ÍvUWVS ["}y)E} tE f8tvEUE f~ nPAHVjy!} t} эyt+FxtWu VvWu Vwe[^_]UWVS [þu}>~ t~u u M q6F PuEPu 7ƒ uRujvEPu 7E>x&M 9A uq>x;Eu EuRu}tEp>e[^_]ÐUWVS [6}y} tE f8t GU fuB;U} }4utEUBE9Et ue[^_]ÍvUS[E PuF]ÐUWVS [Ex@E8uUrWKUU4;rv!ztD6Pu~EpEPUu 9sVWzǃ;}rfUEPe[^_]ÍvUWVS [>UBExu jVE@b UBHDP4EUBUBU} փ tftEE fPUUUBUBU BUBE PU B e[^_]ÐUVS[fu 9F ts~ t&~u F VP F xt VPF jJA~tFAVFFNe[^]ÉUWVS,[E@E̋Uzt xẼ8UBBẼ EEU;:}#uؐVUzPGEԃGE;8| E@PhƋUrEԉBỦB;:}VUzPƃGE;8|e[^_]ÍvUS[E p[]ÉUWVS [î}?u( u ƃ u jVh77<$N7e[^_]ÍvUE]ÉUUE ]ÍvUWVS [>u ;F|]FF PPE;>}F<t MGB;|~t vsEF>VEe[^_]ÍvUVuM ;}A;4u vB;|4$ÉUS[xfPu]ÉUS[LfPu{]ÉUS[ fPu]ÉUS[fPu]ÉUS[fPu]ÉUWVS [ÚN"v@4>t 6Gf;f|Ӎe[^_]ÍvUVS[Bf~t vFf@ǃfe[^]US[T}]ÍvU]ÍvU]ÍvU]ÍvU]ÍvUS[óUz t B 8ϺtoB$ÍvUWVS [n>u uu URuu oRuP ƃ u byt.APA@HA@'vPHe[^_]ÉUWVS [Ê gW ƃu9jWƃ j 5Pd4P*j2P-xe[^_]US[j 5Pd4P9]UWVS[uCE jǍE$Mb)‰M)֍444EG=?B~ -@BGAE GEG UB@BGEvыQt; ;uB;G~Wu U:vyjjqGe[^_]ÉUWVS [}KƋt/9zuuBBA RM vыRuӍe[^_]ÍvUWVS [Î} t~ uVt~uHtZ>tU EP$+EEU@+BBy MB@B}yEE EP e[^_]ÍvUWVS [u ?? EP+EEU@+BBy MB@B}yEE}u3}u-u'G j5jPe[^_]ÉUWVS[&u u uGGE EP}vFU v V4$_7t;E;EuF;EE;Fyƒjje[^_]ÐUWVS [zuǃ j‰2E BGBB uW GP WEE@ P e[^_]ÐUWVS [ZEAp Ptu UB vG u ExU9uU 9PtNj@ ue[^_]UWVS[ÊǸ thGE@G%F G uG v4$w tE;Fy̓ tEE@ Pe[^_]ÐUWVS[} uEE?x} pPVj}ut jE8UBRD?P"pPWEEE̋EEEEEPEP6[%PW=V49B uBEPEPv)%|DPEPvW.t t}yE}u u貐K j EU}u FUBFPEP"UBUBxBUBx@R >PuIUB UBUBEP r+pPuV- jVW7EPj4pPPvjw t j\pP|pvELr }pWv}uFtvFPEP}!tEPtN#pE@E E@E}t6EPUr#U;Uuԋplj98u}utupE}tt8 P2!}3Uz t r vu >Pj uHv}pv jz EU}u FUBFPEP1 UBUBxBUBx@B UBUBEPR >P7 Ur+pPuV* jVW$}uRE@EuU9:u#Ep+pPVO*VWE@Eu}tpPVjW:vuEu0 jpPv PpPW l WGƃ UrVWjpUz tpPA PVWVW< pPy/e[^_]ÐUVS[S u  ƍqjPV$ u:Ejj PVy(ƒ9utE8uE@t 9Pt @ue[^]UWVS [u9qu FAQ9rtR9ruFB9 WǘEPvhuPW> tqPW<$bf W讙F8 v V e[^_]ÉUVS[u9ru FBR9rtR9ruFBF8 vU V] e[^]ÉUWVS [î}t[wFG~ t v V >PdF8 v Vu We[^_]ÉUUB~w v]ÐUUM B~w bЃȀ࿈A<,ЃȀ࿈AȀ࿈A  ͐]ÉUWVS [vu E@E@PuS#EUENjU4ruWP#ǃ;ur+EEPu #Ee[^_]ÍvUVMu /A%=ukЃQ?f fUDA%=u4A%=u$ A?f ŠA?f ff4$ÍvUWVS [>u y}эqE@EDPu"EUEuuuvWVƃ;urf+EEPu!Ee[^_]ÐUS[ãEl9U $UWVS [n}u EEEy:EuWEǃf}uvuW()EEe[^_]ÍvUWVS [u} EPVE9u>t҉e[^_]UWVS [âuEEvփuVE;E u>u݉e[^_]ÍvUVS[KuEPV<0e[^]ÉUWVS[} uNElE9IE}-9s 9s%!~~؋EE@9tʼn[^_]ÍvUWVS [â}u xEEvNuWǃyEe[^_]ÉUWVS [V}u ~EEvNuW7ǃe[^_]UWVS,[}O}uE؉EE }}?thEPu%EE$Ɖ$9E}uuW}WPǃEEE8u+Ee[^_]UWVS [æ}}?EPWEE$Ɖ$79E}cuuuB}}YEPu=EE$Ɖ$9E}uuW}WPǃEEE8u+Ee[^_]UWVS [þ} u?vEPuEEPWǃfEf;EtU)vNue[^_]UWVS [N} ukvEPu5EEPW%ǃfEf;Et: PfEE$fEfEf;Et U)Nue[^_]US[÷Mʃ ,(t~ f)v$US[OMʃ ,(@t~ $US[Mʃ ,(tt A2vA'u~ f)v$UUf:t v@f:u]UVUM uNtff;t )vf:uڸ4$US[U ,(>$ÉUS[çU ,(>$ÉUS[[U ,($ÍvUS[U ,( $ÍvUS[òEU ,(?t } tЋ$ÍvUS[_U ,($ÍvUS[U ,(?$ÉUS[DZU ,($ÉUS[{UҋfP% 5v ,(p$ÐUS[U ,($ÍvUS[ðU ,(>$ÉUWVS[ou DžlDžhDžd}9s'DP tF9s DP up9>{u Džl>"u DžhFp} t lE 9&xX<"Z<"< < &< <{t <{<\v<}t vlll~ ll+pdF9`DP }F\9s"vA9s`DP u;\rV)P{t >"M<;tN<;< tF<  < x< |t8<$t4l<\t4<\<[t$\<{t<}t PEIvMyAM;M4F9t~ u EjEPVuNMF9i}tEEU+EDe[^_]ÍvUS[luu ju]UWVS[EuM UtuItu{B}B 1Eu{FB9u}Bk>{Y\B{FMEv t-+dW||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||Ȧ|ȦEtC\B=\Bf7v\Bn+v\Brv\Btv\BvvBF9+E[^_]ÐUWVSl[R} EE EPeEE;}}*UPE 4/UDEG;}|؃ uEƿ;}}'vE4VU 4? FG;}|;uu EvFE9Et uEe[^_]ÍvUVS [cuVu u.EPVEEe[^]ÉUWVS["EE9E}&vUM <э4BUM9|݃ VE}}}EE9EEEU EMDP tvE}DB }эqN~ MQ}DP t ~y\uۅtVuuuE @EEU9UaM9Mt }GEEe[^_]ÍvUWVS,[ңEE9E}-U 2E܋E9E}U܋E 49F u~tۋU9Uukjj'EE9EvEPEPU܋E 4j谠uujhVj0 E܋U9U|EE9}8EPU܋E 4ƃt}~ExE܋U9U|Ʌu WEE}u}EE9EEԐEPU܋E 4{ƃ}~'M FM}~DP M}~)MQEԋDP t}y\}t uVW} GUUEE܋E9EU;}t GMv8u2FF U؉VEFe[^_]ÐUWVS [v}u uu[vu *<*uBF>7vVWt ? G?uFEPWǃsv[FEPWǃ>]>EPVƃ>-uKF>EPV{ƃfEf;Ew Ef;Ev$Ef;EwEf;Ev돍vfEf;EuF>]t>uVƃF\uFt9tFGe[^_]UWVS [ڟ} }Muu **uFG?vuWut E8E?uGEPuKEl[GEPu'E}t EPfEv?]M?DEPWǃ}t EPmfE?-umG? EPWǃ}t EP-fEEf;Ew fEf;Ev0fEf;EafEf;EvREf;ECG?]t?uWǃGJ\u G?tcEPuEEPWǃ}t& EPuE$gf9 vfEf;Ee[^_]ÐUEP @@@ ]ÐUWVS [j}yU װIMEUB;B|JMQȃ 9u RWƃ }w7V7Ep0UMQM M9M svu Fu B9E}Ge[^_]ÉUWVS [Þ}EPu G@;G|?WG 9u Rƃ w7VG7vw7#wVPYt FGuVu Ge[^_]ÍvUWVS [}E H!E E ;G|LG9E |E @GG 9u" wƃ w7V7vw7oU We[^_]ÉUVS[fuF 9t 6F FFF e[^]ÉUWVS [}u W蠞F 9tG1~67j6WF FFF e[^_]ÐUWVS [Î}u }F 9t 6U8uFjWΘxtW輘@W諘$PW}E8INUztdzt 9BuUF@F/v F@PE06~U2RF@FE@D~F F F@PF@FU26EUƂe[^_]ÐUVS[.uFP6Dt j=s j@sPVve[^]US[ؘjBsPuE]UVS[ëuuu )PV>t6EPVƊE<.t&DBu>.F0Fe[^]ÉUWVS [.E@t:E%=.ujquuu  vEt' EP)Puuu v u t* EP)Puuu G\sEPuuu O ƃu}sE} u0GE 9E u*u sPWэAvU UyىMvFE M >gfffmE)‰U} yF>-u9}>9>9AN9Ee[^_]ÍvUWVS[IUE ytэA<9s+ƋDP tA9sDP 9tl9+t9-uA9tXDBtFA9s)ƋDPtA9sDP9t9.t 9et9Eu[^_]ÐUWVS [^} 49G u GEPW?ƃ>eu%U~sRPVtEPWjuNE?} UE|~-u2EPFPutZEEUGv} jsPVtPu$NVue[^_]ÍvUWVS [>}M DP tADB 9+t9-uA90ui@atADBDP tADB 9u tjtPWΓe[^_]ÍvUS[{$ÍvUS[Xu uG}]ÉUS[0 u|]ÐUS[ u uDŽ]ÉUS[u uW]ÉUWVS<[úUB`EEM$EEE}}ЋE 8tav8(uSE@8uH8)u8}t"EE *EȋE@EE v@8uEuz`uzB`8u t}t EPuWu u *!~t EPuWu uV vuuׅu Ebvt &Eu,}t&U؃ztuPu 6E%Pju uEtEԃ}}EPEPEPEPuju u }uEt *}uES $*avUEPuPr2EԉF Uԉr EBBMM{}؋OAEqG(EU װIMEE9E}BvF u(MQ} :uE;FuRWutE 6EċU9U|}M؋y }tWu j4ǃjWPE؉x EPu WW0ƃ}tf}1EԉF Uԉr BRtu WW,ƃu0E *uuu u8 F Eԃ}t U(EMAtEԋE@u}UԋBHuz}uE^ *<MAt#y uE3 *}ԋGG j4j7 $E@uE *MԋU$ }t}} tnEԋEPuЋM1R0ƃ}t})}Eԃxt P1/EԉF Uԉr EBB@BVMԋu1P,ƃ}t})u/Et *uuu u7 EF Eԃ}tU(Eԍe[^_]ÍvUS[0uju u]US[uuu uu xt@ P]ÉUWVS [ö} u aƃt WOuPVu e[^_]ÉUWVS [^}EEEPjjuPWuu uhƃ ~u}t:Ext1Puu Vuu+ t tnPF uutRFt}tE@u *vFt ** PuPuu u5 FtuVd4e[^_]UWVS [>u MQ`r(Ƌ~Ft v6Fu~t"jjWVjQ+ t }tG,VЃ t?}t0t ** PuPjWuT4 e[^_]ÉUWVS[ÂUEE@`Ep(EBE܃zu R E܋E ƋFEFt v6FuF t} *EPu6R0ǃ}t<~t V-+EG Uz UUBB@BG EUzu t-~t'juuuVu) t }tQ3UB u^}t4E@t ** PuPuuu2 }tUBtjR 2e[^_]UVS[u EUuhjrVu$Du/ hrjrV t"PVHuPRjVe[^]US[` uuju u]ÉUWVS [.uju迥4$Wuu u ? Wpt~tF Ve[^_]ÍvUWVS [òu u ]ǃt VK uuPWue[^_]UWVS[V}EEEEPjjuPuuu uWE }UBtPz uJE]@t * v *uPuu uj0 "UB u6E *uPuu u'0 vE0E@t%t!> VUEuF8u62FFFF E01v>~+ VU> V:E0WVuAEPWE؃uuP UM>~d VU>E~tV;t R~ tF xt VPF2E0WV艩Etkt> V?EPWE؃EPuBƍG$F uPuFU2[9tWE8tL>E~tV;t R~ tF xt VPF2UBB}tE`Exu}tZExtQE Puu uuu# t)Et@ PuPuu u7- "UB u)E䋀 E܋UBtuRW,E܍e[^_]ÐUWVS [2u MEEP`Ez(NjGEGt v?GuGt* u$}tO@t *& *G u1}t *uPjuu>, 79tTtL>E~tV;t R~ tF xt VPF2GGt@j juWju " t$}t6 PuPjuu+ G u sEGtjW*Ee[^_]ÐUWVS[ÒUEE@`Ep(EEBEzu REE <0GEGtv?GGt6 u0}@t * *~WЃHu+ЃG j4jPeg Gu}l *&EPu7R0ƃ}t:t W#]"E܉F U܉r UU܉BB@BF E@t} *U܋29utWEtL>E~tV;t Rx~ tF xt VPF2U܋BBzu tJtDj uuuWu t&}t< PuPuuu) U܋B u*E؃}tE@tjP&(E؍e[^_]UWVS [~}uuu W%ƃujuPW~E>~ V{EEPVWt}t> V륍vEEPV`uVuu W J!Ѝe[^_]ÐUWVS [&}}ju WƃujuPW裧E>~E VƃEPVW!t}t> V 뤍vEEPVjVu W8 J!Ѝe[^_]UWVS [R|}juu WƃujuPWϦE>~E VƃEPVWMt}t> VL뤍vEEPV$Vuu W J!Ѝe[^_]US[x{uju u]UWVS<[N{EEEPjj vPuuu uYE u UBE}tEăxt P}uUB BBB}u}EăxE@e߃E@Puu EPuup }t"vU܋B E܃ R}UBdtvU9u@@EH}ȋG u%UBE@PWu ug"EHGtY?tT7>E~tV;t RF~ tF xt VPF2Uzy bJ}t9Et0 }u**P vPuu u# uu'#Ee[^_]US[yuuuju u]ÍvUWVS [x}EPjjvP Puu uƃ t. jÿUUPpPVP Fe[^_]ÍvUS[Pxuuuju u]ÍvUWVS [xuEEEPjjjPuu u$ǃ pWEUR twM9 9rE9BEHdt9QuB AI}uB G B MA RGtjWV!e[^_]ÍvUS[4wuuuju u]ÍvUWVS [v}uEPjjjEPuu u tB@t3 @7v@ t 9p98 98@ e[^_]UWVS [nv}vPuju _N9}@vEBu RhjPu F9e[^_]ÉUWVS [u},vPuju wvu#hjEpu uB9}2v hE4jpu F9Pu re[^_]UWVS,["u}!,vPuju v}ujhjEpu nyƃ hVjUru C> VvEEjjuvu EurEPvWu;u}>8(uEx)u0E'B@;U}8(Uz)H!EEE E8~ PEEU9B t8Ru Pƃt%}tE8 P7E@E@EE@EUTU܋u;~eUЃ P耺EE}̋uЃtfЃtuЋU2ẺBu藻ỦUM;U} uuuBA;UU܋EP u!$ujuvu u4}}E8q P`Pu pe[^_]ÍvUWVS[3r} Wpx}vPuju EPjvP,*PEpu k \UJAtyu QjtEPjjjjjtu | t ‹B t|tP|ytDh jtQuW: t# PvPjtu vE +vppxoHomllkTkxj}tvPuju 9  Mq NPt|u ƃ v~t F@ @t6 FP貺Fjx\j}tvPuju X Ep Pt|u  L|9Jt|PR9JAB QQ}tvPuju rPDžpEvvPuju 3}u'UJ Apyu QpEP|2ƒB @|rx(ur}upVtjjVƃ Vxu lǃ<hVEpu {Pxu jlǃ EPuƒ@vDžlEvvPuju ZP}u Ur clEP|1躷ƒQB @us|rx(ur}ulVtCjV܋ƃ Vxu hkǃt> V EP\ƒk}tvPuju Q$ Ep fPt|u ƃ vVu FPնƒu3vFB @j|x(uBBPxY}tvPuju Ep pu tv}tvPuju ҿMuCEP|2ϵƒt&uvB @uG VƒWx-}tvPuju N jZǃ|yu%jtvPx͕C|B@PuVjtvPVvPx舕 |OGP1ƴG|BGzPEvvPuju m}u%jjtu v Mq ǃEP|0,TB @u=|rx(urWVItjVtu YuB EPƒh jvPtwPxHe[^_]ÍvUWVS[Ni}E @EU zu REE8t9v8(u'v@8x)u *u@8EPjjjjjuuƃ EPEPWufǃ!Et1 u&l jwPuf$}~Fv;u}- hEt4u uo t@F FHtU *FwPjuuYEPjjuPhjuuƃ t(FF j4ǮjP*e[^_]ÐUWVS<[fguuEx`E UB`EPjjPwP PuuuSE؃ uMy`}E@`EE u't#xtuPuEPEPEPEPu juuO }uEE}u jWwPulw}t ExU؃zu jwPulwEURuRƃ} lj~ w EG}EEԋHAEЋqEԋ@(E̋}IMȿEU9}IF u,M̋QM:uE;FuRQ~E 6EċU9Uu`Mԋq u j4聬ƃjVEԉp EPuVV0ƃ}tlj~ w UԋGv~ };}ujwPu:aGt";EtoH@tRjPBGu j xt& jtN>(u?F>N>)u6uujGPuuuU()&F>uujjuuu'e[^_]ÍvUVS[ÃcuEPu VEu uujuuuVe[^]ÍvUWVS [&c}u t~F@ux~t4jFpW萇VE;PtjuPWp~t jv%~ t'V Bx(uBF jPW2e[^_]ÍvUWVS [~b} }vPujWp`G`xt{;u}qvEBu Rڿ€8t B:J9v::z:::uBjRjjPjW_ uF;ue[^_]ÐUWVS [æaE E;}vUpu P2ƍEPjj^xEPhjVu }t" (*ujVu xx H@G;E}' hUtj4u $ Ex`tQ@`xtH>t#B<:u::u Bр9::jQjjVju u;}e[^_]ÉUWVS [V`u u}|xPujVE'vUBPu PνƒEPRVB)EMEUTU}EHAEyu QmEUPu PR‰ր:tL>(u;F>N>)u2jujGPRuu()"F>jujjRuu mE}=e[^_]UWVS [^}E@ t UJ BDž}u>>(ukF>N>)u^ +EPu+E@E@EDž F>UBdE܍E؉Bd} tRE @E؋PtBB E#Bt( Wuuurƃ t @tpU@tπUU؉ЋPtCB E#Bt( Wuuurƃ t @tU} tU Jt PE`HE܋UBde[^_]ÉUS[\ j @@@ @@@@]ÍvUWVS [Ú\}?su-t jwPWxwEjj PVE9uE8-@uP跹t jwPuxPWx.E vU9t,@ jwPWxPu]e[^_]ÐUVS[þ[u~t!VBF R2~e[^]ÉUWVS,[v[EEԃ P|E@MA9E u EAv9E uMEPu NEЋx GtO7N~uDFt:~u4t-~ u VF U 9Pt P4$TZVWueuj VHPWju > VWB G RMAdtv98u@@Gt0uWE x(u UЋB vEЃPuuGtY?tT7>E~tV;t RT~ tF xt VPF2G GG Gy %GOu W EP谣EЃ" u e[^_]ÍvUWVS [YU B$Ez(E9EdvGtD7N~u9Ft/~u)t"~ u V v 4$=tbj@jwWju t!WB G RUBdtv98u@@Gt?tj@WwuGta?t\8MztR;t R脠x tP zt PRAG GG G EE9Ee[^_]ÍvUWVS,[rW uEPE0胡"Uԋz GtY?tT7>E~tV;t R誟~ tF xt VPF2G g߃uUx(u UԋBEԃPu Wju t!WB G RUBdtv98u@@G Gu WϞ EP蔠Eԃ E0şU2蘞e[^_]UWVS [Uu} Ft3~u-~u't ~ t v  V;t=Gt3u-u't  t w 躞 We[^_]ÍvUWVS [FUu } uXjV yPWyPuAV }t! jyPuyPuV juyPuVe[^_]ÍvUWVS [úT} EPjjPwPjjWuƃ tTtN~u}tBExt9jjWVuua tFtuVHe[^_]ÉUS[TXt)EHw ! "]ÍvUWVS [Su }jw萷u % Pjwmy 葲jwOe[^_]ÉUVS[RSMU EuPRq蠺3e[^]ÍvUVS[SMU EuPRq0e[^]ÍvUWVS [îRuEj gPЀǃv]Zt~v vy jE9t$91u F vJ z t 9r uF B V赚Ee[^_]ÉUVS[REuu p迵ƃu Ee[^]ÐUS[øQUB#E t24Pr[v r]]ÐUUBE tREv]ÐUWVS [FQu} FPjvWVbe[^_]ÉUWVS,[QuEEԉэQv`IyRPVsuHU؍EPEPEPRuu z t/EPEpvOyPVu %e[^_]ÐUWVS[SPuEtuIyPu~эQtvjIyRPV虲uRxPtp&uu|xTyPuV襶VuOyPVu Ae[^_]ÐUWVS[rOuE@B+x*+EM)y;E}׉EB+yߍ+[^_]ÍvUWVS[Ou+x+++94u8vB+y[^_]ÍvUWVSL[âN} uVu4$蕮$mƹnE%=t =t veoE0tt ƒE@@7OWG e[^_]UWVSL[M} uVu57GPVA73PV GntmtouGttu 0v u@E% ЉEEPjue[^_]ÉUWVS ["Mu} EPuuEPutyPWH u E<8ttjyeEyPR褩utUjy;vEUUvt.jyE8v$tjzP+VMe[^_]ÍvUWVS\[:L jLaEƃVuy}EEEMEE EPju虪Ee[^_]ÉUWVS[÷Kuj gPy PVu7ǃ*t" t /vt%Dž4Dž(Dž zWPu觧 PEPp0u zPuux uvPu jjEP ƒtPj2j u)Pu蝧fEfPuVVuv u(/vt(} oju 6 PzGt4KExs>zWPuO PEPp訧u zPu跦u  uPu蒦 jjEP貢ƒtPj2j[ uѢPuEfEfPuV芬Vuu_ uԩ3v} t#ju 4 PzPu C!t{Puu e[^_]ÍvUS[HBU Ex u't04RpxL pM]ÐUEU@]ÍvUWVS<[A}u uEPUu}tuWEP0jjj藨ƃjjVMhV -EE}tLE jEPjjVnjEPVߤEăhVu}t7E jEPjjVjEPV艤Eă} t)jV芤 E PjVvEă E}~^jEPV耦Eăyq8su;EE+} t%jV%E PjVEă}y;}t#ju82 P"{Pu!Ato V脝a j @}t@pAt VJ}t#ju1 P"{Pu@e[^_]ÐUWVS[[?u }UfEffBuDžtPjVjǃ W贡uV W譣tAq 0R譢(Ýqt P&'t P UBe[^_]ÐUWVS<[N>uuujuu u;ǃ toG Gw9{PuVjWV*P蝻 zPzP7uu7je[^_]ÉUWVS<[Ö=u j躄ljwG G V9{PuVOjWV*P zPzP7ju7jWe[^_]ÉUWVS<[<jjjjuu uǃ tFEG EGWPjwG w9{PuV茣jWV*P<e[^_]ÉUWVS\[n<EEEEPEPEp踛ƃjjV$VGwG G V9{PuVjWV*P蔹 zPzP7jEx t)fEfPuu P7EpP e[^_]ÍvUWVS [v;EEtV tvtsjjju 18 tlE@{jjjƞu 8 t4E@{Njjj蒞uř8 uiEE{ \{P艧Vu6ƃt({PzPVj:W{PVj*e[^_]UWVS [&:EPu u虶E}tEu j{}uEu j{ uƒ\*9t.*9t$*9t2{8utEP}DPu輼uMU{}u{PR&ƒu j{Pu {#E# j{Pu {Pu:e[^_]ÐUWVS[8DžD} `Py4MbEE)‹`щPE)Ѝd‰T?B~T@BPXL2}u"XLDžXB vDžL}~u<|Ph`uMH`@/;F>u }P{ƃu } >u}DP t FDB u?:t?t F>:t>ujP:9t7)PW~/tj}PjuPlǃjW|u%EPWj}uE%=t#>~u } F?/u?VjWj躛@$c P4$?.u /uQjWjg4$血Vj $'c P蜃/@Px6 P$ e[^_]UWVS[s}E@ƅ?Dž0E@,}DMyt EDPDu%=@t YvU:.t :\uz.u Dž4 Dž4VjDjě$484$"8 u,~,MP?/u@juu $}PM1}PuS ,~,U?Hg Py~-E8\u@EUBM9H!‰U@?@ u( 8覀ƒtGt z .tӍv4uz .tPjB Pj腘ƃuVwZ,u} jVu{M1}Dž$HPVt ~P蹅Gt XuHGtjVu0GtjVuGtjV{t Dž$$?Dž$HPVtX%=`tX%= tstX%=@t\tX%=tEtX%=t. tX%=t@tX%=u Dž$$EpV5 P(uzcPVuK%=@u9j}Puwy<$uuu uQ0  PK{"?@ 8z0e[^_]ÉUS[|juuuu u]ÍvUWVS[CVjujE$%{lj4$zu zu jwj=zU e[^_]ÍvUWVS[u WjujΖVPluƉ<$.ze[^_]UWVS[ÃVjuj腖$Ewlj4$ye[^_]ÐUWVS[;u Wjuj: VPj6wƉ<$ye[^_]ÉUVS[uhPzu+tjV P<~PVu jPjѓe[^]ÉUWVS[oVjujq hRPplj4$xxu WPj`U e[^_]ÍvUWVS[u Wjuj VPjuƉ<$Txe[^_]ÉUS[ìEPu uuE@]ÉUWVS[gVjuji hu Pwlj4$wt.jjWwE tjjWvGe[^_]ÍvUWVS[} EP su hhBEPRwƃjjVbvEȉ$pt{PjWjqƒ IQRVou! Vov%v Pv jjVuFe[^_]ÉUVS[ EP8rt :jjuu jjuvwuUBEVBE e[^]ÐUVS[juNv V4$ne[^]ÐUWVS [+} DžDžDžPP uju  P~P PW$W9}4vPjE4j~F9|;E9E‰.n4HjuvtYjubtEujuJt-twjj#stjjjstNn 0~PVv IQVl$[uv2qE0 Pn 0~PVvIQVYl$t9}&v vPasF9|݃ SWEWuju P~Pvv DžH hWPu~E8Tmƍjj PWpjuO Pu9 E \tjPt 6t e[^_]US[t jjkjjykjjmkjjakjjUkjjIkjj =kjj1kjj %kjjkjj kjj kjjjjjjjjjjjjjjj]UWVS [Î uE Et$t 0t)EE vEu P+tWP^ƃtIF;Et1uPMou 9jjuovjjPo u]ie[^_]ÐUWVSL[Ú u jRNjEGE GEG wEGGE}tE} tM}tEH } tE HUJ}H!ЃPPuVquWV,P褈e[^_]ÉUWVS<[ u V,9ur Vݍƿ;~}?EȉEăF4u;tuu FPj踭G;~|ǃ~~ vRFe[^_]UWVS [. }t:wNjVm} u %v PjVmx@tFwNjVm} u %v PjVmy hv} Ge[^_]UWVS [n Eu~t vyOh8~t vy u,h8~u t+vvI蜬~ tE v l5~ tjF HP苿Pvvu E~t v-Q V!QuEe[^_]ÐUVS[jMU EuPRAHPoIge[^]ÐUVS[MU EuPRAHPFefe[^]ÐUWVS [} u~t/ t64WFHP FHP~t. t64WFHP FHPe[^_]UU MEu xt@uxt @H]ÐUWVS [}uu Wyhƃu e8t݉e[^_]ÍvUWVS [öEU~PRju Zu'cPu $gqvjr dPu ̂ƃth Ve,9uM VCǃu E;w}' G4bp Puj F;w|۸e[^_]ÉUWVS[ïg\,Xaf XPg~ P,jt0u ƃg(jjjhgPjjjVjj0ǃ\,ge[^_]U]ÉUS[ jwf]ÉUS[EPEPiEE]ÐUWVS[zEE EPaNjw$EUE0)։ t<Ѝe[^_]ÍvUVS[uEPEPqhEEFe[^]ÍvUS[E} t Pi Pa]ÉUWVS [âEu8%xQ F@V 98)RFEENlu'dȉיuȉיuEUmEיQF.PPui}эAVPu uce[^_]ÍvUS[çU(0(0$US[Àjj `]UWVS[K (Pd] 8Vt>.uF>to W^ jVW _$$Djtzu W`C P`Džu }jzPjZPjZ)ƒDžPPRjDž;}uP4YVPjz 44$_;|}Pjue[^_]UWVS[j<0PPupsj<1PPuXsjPPpPu`sDžtXW\DžtxVjWjy$PÀPpusV^j.P W uDBu jPƀPPG jPƀWVurjЀPWVuxrjPWVubr j\PҀPPu=r tuQ jWÀPVurjWƀPVuqjWҀPVuq xVu[VڀP襚uV߀P莚u jPPPuqxP>]e[^_]ÉUWVS [ÓDž PZ@tavVjPjw‹MvBA:t:=u9u+EU ! V\G@uE 8 Px\e[^_]ÉUVS[u(0t(0Vxu4ߣu>S jPjPVq|,PVxe[^]ÉUWVS[OjPujǃ VY VWu'ƃtsjPVj t[PjVut= jmƃt* u*PV j PVJ P[e[^_]ÐU]ÉU]ÉU]ÉU]ÍvU]ÍvU]ÍvU]ÍvU]ÉUS[ht 6+F89F0t v00~`t v`sY~ptvpV&~tt V (t &rt rt qt*F e~uE FFe[^]ÉUWVE EpvvtfFU f;B$tf;B&ttPuujjpEpdu VuuU B$PjpRZuuU B&PjpRZ Ept=vF Ex tU9WuvtE9GttUJыvuƉMtuv u aXE Puu ]Ep t1~U9VtuvVu \Vu [uыE@UBEue^_]ÍvUWVuujj|u$E Ext }E}u& uujj|u#G UzuE Mq`oWEEp`^WƃUzu uujjnr`KYuVjjnMq`5Y ExNjVuuu PG Uz&w Hȃ!ƒ OыMAЅt9tF GFv9uEx |u P.M U9J tB ezuB;}uEp @ Pu2#u=UBu6r u#MA qu"E@=Ee^_]ÍvUWVu}EuWjj=V"E ~t[v}t( v`Uǃ~u׃Wuv`mZEuuWuu VQ ~ |tE 9F t~ eu}u'}u H uujjnv`@W Ee^_]ÍvUWVS,[:}EEG Eԃ$W\+v\|d0fD uujj^w`sU y uuGhPjrw`RU v uujj$w`/U y uuGhPjaw`U S uujj^w`Tuujj^" uujj$w`Tuujj$w`TW* WOw`RE PujrW uujaWB W w`@RE PujrW v Ww`REo PujrWl uujaW w`QE: PujrW f Wkw`QE PujrWl uujaW^ w`kQE PujrW uujaW O$M܃ W()w`!QEw`QEz PujLj)WƃVW<$(uuuW E 6 uuPjLMG e G  vG e G vGtG e G H uuG$PWwdw`gK f$uuuW uuW  uuG@tGhPjpwdw`L}Ltw$t!G,@G,E;G4rPW0 vEp W`'w`YOEw`KOE uujjnw`6Quujjnw`!Q { uujpj)WEW&OG0MU؉ uuAPj(Wƃ E؉FUV u}LuG euGG$;G4rG euGW$G0<uG euG uujjbWKEO$M؉Huujjnw`OW%G +tI+ *t?t?{tNEEEf$EEEEE Wc%<$gE ,uK WF%t; du W<EEE9E(Ef$EE UUE }tG e[G O W$EEE}uY}uS}tuW}}(u G0Muuw`rRuujjnw`iNUB EЉẼ}t MA Ẽ}(ta}bt[EU!ЃŨ uA}u}t uuuuWl }tuWEA}u# uujj=WE  w`KEw`KEuuw`P uuw`8PEMAUQ w`5KEw`'KE uujjnw`Muujjnw`L W uuMAM EЍ!ƒ ыEЃu UB Pj.WƋMN F EȃuUrBPj=WMA .q }buJEppw`JPUrrG0M؋pG0pw`P } Epujjnw`KUBM EЍ!ƒ у EЃu UB M̃ Mquuj|Wƃ EF puẼPj|WF  Urujj=WVB Mȉ1 uE}b Epujjnw`KuuUrrWcEMfAUfQ Au ƃU  !у Ή‹EЃt ЋMA'MA ЈA}u&}u Epujjnw`lJ Ururrw`N}M)PEHPEpuWUBM EЍ!ƒ у EЃu UB M̃ Mquuj.Wƃ  EpuẼPj=WF UVMȉ1Ep |t*U 9W t" etjuMquRWH0 uEpjjnw`4IuUrjj=WJF FN PЃ!ƒ шȃu F@ ЈFUJ ˆЃ!ƒ шȃuF ЋUBe[^_]ÐUWV}} aNƃ^ uujVw`]HuujVw`IHuuwlu wdw`Ce^_]UEu uuplp`KÐUWV} du)G$4P W du  dt~G euG ve^_]ÍvUWVS [Þ}}tU~ }tE~v +, TTuu w`Juu  uu t ujuu W ' uu C w`yDƃVu w`I Vuw`(I4$u jjnw`JFuV w`!DƃVu w`SI4$u uVw`J x EHPjVu WL W Vu x w`Cƃw`CE$Vu w`H uuw`LH4$u jjnw`nEuujjnw`YEVujjnw`FE w`!CƃVu w`SH4$u uVw`I u| EHPH w`BƃuZVu w`H4$u uVw`YI u0 uEHPVu W G euGe[^_]UWVu} VLWu Vg~ ]t ~ evdv`f=e^_]ÍvUWV,Ep`BEUr`AEu~PuVlF@t uuFhPjpv`C Exuu ujppdp`? Uzu%ur`[Buuv`BiUHAEEvuf΋uFdfPfEVjpu mEǃ Vjpu]EEuWEp`xD Ur`@ǃu~ Wu uVjpEp`B UzVjpDƃ}uh jpuWv Ep` FuWjj$Ur`?BuWjj$Ep`)BuWv jaUrdr`= vjj$Ep bDuI uWjj$Ur`AuWjj$Ep`AuWv jaUrdr`-= F ptCFPjpEp Cu uWFPjpUr`cA vuWuv`,@ExuDEM}uuUr`Euuv`B@uv`4@e^_]ÐUWVS [uF C-E+43\fF$fE V~ Rt:tEP&Uuuu EPV9UPEP9~ V$ƒ9rF e~uF~RWVUE~~ Vƒ9rF e~uF~RWVUE~FPuVWC~ Vlƒ9rF e~uF~=FPRWVBX~!uu PV$vF e~Fv~ R V5F RtR It,rpukfF$fE V UPEP7v~ Vƒ9rF e~uF~uiRWVrTƒ~tQF e~uCF :U9Ut HFPRuV&U~u uu PVe[^_]UWVu VC~~ V0~ p Ve^_]ÐUWVEp`;Ur`:My)EU ;BvEU D$Ef0WRRu\Wu HQMq`~:Ɖ4$EWpdt1 PjpUr`b<Mqdq`56vԋMAdBPjpE>p  UVMAPrd0 PjpEp`;Urdr` 5EME ;He^_]ÍvUVuM UEFu# PRQvd0 Pjpv`{;PRQVk\PVuUWVS[j uQEEtM;}Yut ,Upj0NMy Ev u OEE @EE EUf2MtPOu1 uuPuvd>/ Pjpv`/: 'VuyOuVuNEM}nE @EE @ EUf:fBfEE9} uuFPRu/ VuNuVu5N~f;}w"EPPuƃf;}w uuEPPu#/ EM}O}tU:u M y[uHE@EEEvMf΋uFdf4PPjpu%;tx F Ep`6ǃUz WuPjpr`s8 MyPjpu:p uWjj$Ep`38uWjj$Ur`8uWVjaMqdq`3 u~DEM}EvEU D$EPMqda2u"uF e~FEf0EՋMAdf4BPjpu9tx @v Ep`"5ǃUzus WuPjpr`7 MyuREf0ՋMAd uWBPjpuv`6 ~uEEU ;Be[^_]ÐUWVUt:p~)f9E ;E t9}J^_]ÉUWVu~lt V" Y v`4Ev` 4ǃ~u5 V 4$ WuV~4$ ~uEFle^_]UVS[uVxt B Fx: jDƒuF e~uF RFtB@VtE EBfBBfB fBB BEBEBBЍe[^]ÐUWV}u t4~ tv W~tvWVW e^_]ÉUWVS [}u t5~t FPWHFt GxF wx V; e[^_]UWV}u t*~ tv W~tvWe^_]UVuE fF@~ tPv ~tPvuÉUVuN@~ t v ~t vuUWVS [ҿ}Gtt p@@@u PFGtGxe[^_]ÍvUWVu }~ tWv u~tWvuWVue^_]ÐUWVS\[*}E}t'j2EPu  P܁Puw`wdW.ƃua vvE ppVA7 u V;8uV8EuE PVgC V/Ee[^_]UVS[Zuu' hrdž;vЍDPAuF e~uF ,ȋU PUPUP@ȍe[^]ÉUWVS [~uD} ~t FPDDO ue[^_]UVS[.E8p@@ FuHHvHF(F {FVF;FJf8?@HFPVPFЃ!+@Rج@ججججججججججججججججججججججLججF (ZF;Fs!f8)tVBF;Fs fz)F;FFHF L!HF LF e~gF [vFtF (F (~(u HF )VF)~ef:[u_fz:uXfzuJFfx:u@fx]u9fx ]u2fx FHf<D\vF pfF$ BF pfF$ *HF CfF$s HF CfF$SF pfF$ jjjVǃ~F ejjjVǃ~aF etF pfF$ jHF CfF$wIHF CfF$W)HhjjVǃ~F eHF wHF W F ZfF$FEFhjj Vǃ~t F exF+Et;F,HF buFFfx:u)tI>t_> GHF bGfF$/ PtHHF pf~$e[^_]ÉUWVS [Fu~vFF;Fs PF;Fs5f8#u/;FVBF;Ffz 9~t He[^_]ÉU ]ÉUWV}U MwGQRW(‹GwujRRW(8uE@e^_]ÍvUWVEu vFF FFF fFEf@@@ vHOfAHEH^_]ÉUWVS [â}jPW\;w w1vWD uDt PF;w G9Gt we[^_]UWVS [E UEvM 4;ut;}yE@PVu4$MQ;tt VIOe[^_]ÍvUWVS[ÎE EUBx}uEEEM%Eu4E U}DžtE؋BE܋U؍U܋D9t9ug H%Pu&MA@ eAxu@ HtƋEU4Em}*Mf2Mf 2e[^_]ÉUUBxt B ]ÉUWVS [.UBxt XMfytAQfBfAUBH9B sB @B MUB Mփ9ruN PEtSUB}ЃtfЃt$!vMPEp4E}u(UB@ eBx@ EMAUQA @A QfBBB BM+QBЉe[^_]ÐUWVS [âuE F<} G t wGM ;N ~ t*VD tF HF tVD F;F vNfDfF;V f~f~NjVfLf~k;F vVfLǍfLVfLf.fFfG+VBЉfFe[^_]ÍvUVuV‹Fxt !v‹NND uÐUWV}E ԍE f4BPWTGxt 6vf9u)ƋW WVu We^_]ÉUWV}u WfLfu?<u7 W'ftWfLWfLe^_]UWVu )/ uuVEpd PjpEp` OF;u;ujuuVuaE)=;u:v uuVEpdt PjpEp`b F;ue^_]ÉUWVS,[VE EE@dEEEEEM%E}܉}ԋE܋E U썄E9EuN}~H hE܃uMA@ eA}܋uU܋}EԉEm}mEffEEҋMQD}9}t 9EEPuNjMQDE܃ul hhE܃u&}G@ eGx"@ vEfV&EF04$>F4$3Fu~v6jjpv Vv6jj^Vv6jj^Vv vjjpv Vv vjj$Vv vjj$V t Ve[^_]ÉUVS[êuBBRVVB FRVVFFF Ve[^]ÍvUVS[u~tVB FSv hH+ƒu"F,@ eF,xu@ oB(BǂDFFB~uVBB BBBB ~tFP FB$VЍe[^]ÍvUuƒtE BÍvUWV}u vPWF PWFVW e^_]ÍvUVuM Ay tQ A$B$ vA$Fy$t Q$A B A FA$FA N4$ÐUWVS [j} G(t0 PG GG We[^_]ÉUWVu}Vt"9z uB;EuE 9tyRVul‹MA,xuQE MfJz rG BW FBVFG:pt :at:ruEx0uRp e^_]ÍvUWVS [^}E xu+D "D)Ћu L,BDE x h>ƃu!G,@ eG,xu@ ]U B(r(~)8T0 TA džFu FE HAU Bȍe[^_]ÍvUWVUu ~F E>pt >at>ruz0uVr W9u FGRt 9rFBOEP 9uFUB Rt 9rFBEHFF FFGFwe^_]ÉUVEu MPt92u B9uR4$ÍvUU uuBP2u6UWV}uvVWVWE p e^_]ÐUWVE }p tWvVuve^_]ÉUWV}v uVWSVWAE pe^_]ÐUWVE }ptv WVuve^_]ÉUWVU }rt' uuFPWu! ve^_]UWVE} uvWWPFGe^_]ÍvUWVExtfxu`@ptL~ Wu uVu>uuWuUrE@e^_]ÐUWV} uUE9u PRjjnu6#FRWuFWu}e^_]ÉUWV}E xu[Eu WU Bt>r(jv WF pE pVW_ vt G,xe^_]ÐUWV}E xt)@ptv Wve^_]ÍvUVu~0uD v fF$v fF&v fF(v fF*/vF0f@$fF$F0f@&fF&F0f@(fF(F0f@*fF*uÍvUWVS [҅u DžtPV u tVuQ tPVRVu?tPV,VuEVutPV uu e[^_]ÐUWVEEPts@,xuhB ErtDyu>~>^t>ruVutEtUB,xUtEH,y}t} tu u }tUB,xIMA,xuHpt?~>^u- v vFUDB$PjpRVuze^_]ÉUWVE @EE @ E9Euu u7jUz[Exuu u:Uz~_ u8NjUB,xt Wuu%uWu uu u}GE Ur FEVu zt| t ptgVuUv uNjUB,xQuWVR)Wvu uUB, x$VRu_uuuuue^_]UWVEEPts@,xuhB Er tDyu>~>$t>auVutEtUB,xUtEH,y}t} tu uV }tUB,xIMA,xuLA p tBv~>$u- v vFUDB(PjpRVue^_]ÉUWVE @EE @ EU9uu um`ExuDUzuu uH;vEx~_ uxNjUB,xt WuuWuu uu u}G E UrFEVu t| t ptgVuUv uNjUB,xQv Wu RgWuVuZUB, x$VR5u_uuuuuPe^_]UUM  =r^-=r^=r$=r$4=^$=^$=$$=L$v=^^=^^=$^=L^v=a^=ra=ra.=^at{=^a=$atu=Latfl=aatH=patA\=^rtU=^r=$rt?=Lrt8>=prt=pr =art%=rrufRf;Q@]ÐUWV}EWtiG,xu^vB ERt:yu4r:nuRWjtEt G,xUt O,y}t} tu WQ}t G,x[e^_]UWVM yq 9uQuEG;F~ EG;FuW;VH!EQu}t1uVWuWuAVWu2~uWVuVuvWVue^_]UWVu6j6Vtv 6v VV t(z B;F tzu RV6V}Vt@R Fe^_]UWVU }E9Bu*zrt vWuv uve^_]UWVU }E9Bu*zr t vWuvuve^_]UVuxuI@Ht1vA PtB ;F RI4$UWVS [{EExtEGp  EPU B$M A ytuWu ~t vE x t p UB,@ eB,xJ@ >vuM 1UA B AfB$fAfB&fAfB(fAfB*fA r @M AAq ExM A4fuOtKvLtpu1fAfA FU fBfAfA FJIFPuefF lMHtA u FfIUM Afe[^_]ÐUWVUE )~rUE 9whMU 9wLuff; f;u.F;A~&UREUQuVEUQ;M EU 9U^_]ÍvUVS[bxu vv e[^]ÐU]ÍvU]ÍvUWVS [x}?4U 4VuD$ P&t(qD$AyUPQE A Qe[^_]UE@@ @ ;P}HD B;P]UVEu Pf4J4$ÉUWVUu }J Bf4J Bf|B ^_]ÉUWVM EutS)UB+B )RTBuFT$FΉ~ffIfUB @B ^_]ÉUWVu} N~9t(JNV ~'v9A9 J^_]ÍvUWVu}t(U ;PU;P;x PlRt AWuu uF e~uF e^_]ÐUS[ôu u:]ÐU]ÉU]ÉUu UWVS[cu} E)u vUH V VW荵3>t<>I;6k P=>t FvUB ezuBe[^_]UWVS [jt}u ;ut4uV,u!G euG v}u6jjjWEuVuE)DjjPWE;}Wu<4$EE4$ϽE4$葾;}tuu;}tuu9t;utVuG;}yEe[^_]ÉUU 9U]ÐUWVU} BtOxuJjjjRƃjxVqjyVf}tLjXVRjYVG1}tWRjjjR8ƃPVe^_]UWVS [cr} UDž) V VW蟲}tQuHօjPtąjPzu DžH F8tH8I;2 Pu"E@ exu@ ؋+poXo,onnklpdnmdlmjhjluSJ 9vwP Fk6T8R8PF9T8R8PFjhjlu~6vT8R8PLF 9wPFkvjjjujjPjjjuj Pj jjju jjP hj1jjjubY9T8R8P(Fjjj7u8:T8R8PF:wPF6vjjjuvmj9j0P\ jfjaJ jFjA84jjju:T8R8PF;wPFvjj hSu ;vT8R8PTF;wP FRjj"hOu2>vT8R8PF!>wP}FNjhujwuotjXAvT8R8P8Ft,GwPFvuE@ exu@ e[^_]ÉUWVS [k u V袵fE4$.fE4$ǃf;}tjjjuuƃPVNjjjuVƃEPV+Ef9EtPVe[^_]ÐUWVEu} 9(ˆ^_]UWVS [:jEEE E}tC UPU賴ƋU$U蝴f9t Oe[^_]UWVSE[ÿiUuTt} t:t z TBA@t}TG@ t ~TPDž`B`E TABH!Ɖq `tcB @wA%v TG@ PGTxu TB@ @B }TyUTPM HEATGG `tkG@8(w hG$ PlTB$Ty$u=}9y^9AO q莰(uVGVGD~ tv W~tvWe^_]ÉUVuE H;N sVE+FʋVE+FD4$UWV} u<=t<= <(t;<.t'UEu} ;wSE}t EPUE}EEu ;NU} GMUBMpfx>E;xENE @ufWuuutPN} G} EFU;BuEVMAf:H!Ef>XEu} ;w }#E xu@U rr7EE @EE @EE M}~8MU9Ju ~t Fv:98}ucuuu uLE}E ;x}$vUM QuFu;qE}GEG}tG}u/UBuM4J}G WuTEG fwEe^_]ÍvUWV "}E U+POЋ PGH >xuv֤u6vjj ju莩HHx9Ht >x9u>xVWP:HHx9Ht >x9u>xVR\HPuV蜭փ}t49uvRu@EHPRu蛬UEDe[^_]ÍvUS[@F ub]ÐUS[F u~]ÐUS[Eu uW]ÉUWVS [Eu} jBrz @hu @h DhPDhЍe[^_]ÍvUS[gEEIu ǃ|I$ÍvUVS[2EuU Ѓ|It^ǃ|IǃIH!@h@t8ttRVp PƒǃIЍe[^]ÐUS[èDM9@huA@hu5ǃDh)@h9Jt R9JuAB9DhuDh Q]ÉUS[;D|I$ÐUWVS [DuU эA~xPRb uWV}E jVHBxtV6B@V#B$_PV?? W VGEEe[^_]ÉUWVS[RC}jPaE؃j$PaE܋E EEPj> hVuU> Vhu%Pu uJUe[^_]ÍvUWVS[ßB} E AlE I j0蠉Ǎ4$V2Pu uqGG 80uG P裦U G GGGUWEG G$$[ u WIPu uf jPuBG  8 w  G$P <$vGt&jjjjYPjWt tDGtRjjjjfPjWH t1jjjjrPjW'u uUe[^_]ÍvUWVS [ç@} w ^ƃ} tPw:Džju^DžPVww>uulDžPVw6>}hVwXR> V7t3} t-E 9Gt%} u w>Pu 4=Iv}؋U+>H? ?>> w=ƒPR3m P7.$J w}=ƒPRl P7Q wM=ƒPRl PG$P w=ƒ GPRw' wB} tFPwV9/} tPw<9t> V赚e[^_]UE} uH`]ÐUWVS [=} u~t vqFFtjjjjPWV Ft)~u#FjjjjPWV FtjjjjrPWV FtjjjjPWV F$PiF 8 v 蕙 V蝅e[^_]UWVS [<}uu5vvE `ULE 6觿E)Wu F$P!E E)jjjjPjV ~x 9~}~Wu uy* . u }-Uud uAu}uxFl~ufFjjjjPjVF$P5,jjPu PjV Ee[^_]ÐUVS[F;uUt6jjVu PjR^ tEve[^]ÍvUWVS [:u 6lj<$$ E} u}uujjWͽ$UoFtjjjjPjV Ft0jjjjPjVF$PFuuu W\$Ue[^_]ÉUWVS [:E 0lj<$,$ ƃtuuu W$e[^_]ÍvUWVS [ê9U 2誼lj<$ȼ$d ƃtuuu W蜼$ }e[^_]UWVS [B9EEU P 09Ɖ4$Wu V=$W Ext7E t $Pu UrlE@Uzu;E t2 Ѓ$PD~uPjkUBe[^_]US[l8Euu 0f$讻]ÐUVS[:8u~t vlFE e[^]ÍvUVS[7uFF t F$P{t j6\e[^]ÐUVS[ö7uF~t 6-Fe[^]ÉUE@@]UE@]ÐUWVS [F7}E uu[9wuV7P >9w~'V7P G)PP7肗)ww7PΚwGe[^_]ÉUWVS [ö6u}F;F~8~uF P}FFP6P~FWu PI~e[^_]ÉUWVS [:6EE}t}t UrMt8M :u%RQkuEFUVMN \vuɃ j|Ƌ} щ $|u PXUVMNEF UFe[^_]UWVS [Z5U} t>v:u,RW貒uFUFBF B vuŸe[^_]UWVS [4}E vVUvtM :uRQ.u׸t?~ t~t w-FU 6}4$|e[^_]ÍvUVS[C4EURPW~tu萃 p 4$q~ue[^]ÍvUVEU Mu4$ÐUMU BBuut]É$USd3ƉjPjݙt&UV(SV(tv'ЋuX[]U]ÍUVSu] F $jVtue[^]Ee[^]ÐU (uRh(hh (R (US]S|C $C]ÉUWVS}u ]WLG $ GSVW#"jWE h\'@;ve[^_]UE@]ÐU"]ÉUE8UE鐜UEPÐUEPfÐUSE] P1Ћ]UEE ]P$MUÐU4E EEɃ}]PMmÐUEP֛$VÍvUEE P]講$,MUÍvUVS<(USj,É$x؃!t SŌ h'e]ÍvUVSu] F $jV_tue[^]ye[^]ÐU(uKPh(hh(膅(USj,^É$̜؃!t S  h'譅]ÍvUVSu] F $jVtue[^]e[^]ÐU(uQh(hh(τ(ÐUSj$見É$0؃!t SU h']ÍvUVSu] F $jVtue[^] e[^]ÐU (uRh(hh((USj$É$؃!t S蝊 h'=]ÍvUVSu] F $jV7tue[^]Qe[^]ÐU(u#Ph(hh(^(USj6É$؃!t S h'腃]ÍvUVSu] F $jVtue[^]陉e[^]ÐU0(ulQh(h@h0(观0(ÐUSj,~É$Ԝ؃!t S- h('͂]ÍvUVSu] F $jVǾtue[^]e[^]ÐU $(uRh(hh$($(USj4ƈÉ$褝؃!t Su h8']ÍvUVSu] F$jVtue[^])e[^]ÐU (u0Qh(h h (7 (ÐUS h ]SC$]UVSu] FЧ$jVtue[^]镇e[^]ÐU ,(uRh(h h,(袀,(US h]SgCЧ$]UVSu] F$jVktue[^]e[^]ÐU(uPh(h. h((á(U9$1]ÉUVSu] F$jVtue[^]}e[^]ÐU(uQh(h? h((ÐUS$} EX_(DPMuet+t-t .u/C_(ADPuÉ$褭؃!t S~ h0'x]ÍvUVSu] F $jV致tue[^]~e[^]ÐU (usRh(hX%h(w(USj0~É$(؃!t S5~ h@'w]ÍvD$鲹U(u#vjh("h%h(}(ÉU]ÍvUE@]ÐUVSu] F $jVstue[^]}e[^]ÐU(u`Qh(h'h(v(ÐUUE B]ÉUUE B]ÉUVSu] F $jVStue[^]|e[^]ÐU (u[Rh(h'h( v(USj]h(S jh%(S jh+(Sݹ j h0(S͹]ÐUVSu] F `$jVtue[^]=|e[^]ÐU(uPh(h'h(Ju(UVSu] F @$jV賱tue[^]{e[^]ÐU(uQh(h(h(t(ÐUSj{É$ C $h8"h7(SZCvjS$\'tt S.{ hl'tuv]ÍvUVSu] F $jV藬tue[^]ze[^]ÐU (u;Rh(h?(h(s(UVSu] F $jVOtue[^]ize[^]ÐU (uRh(ht(h(vs(USj]h(Si jh(SY jh(SI jh(S9 jh(S)]ÐU(u7Ph(h+h(r(UE@ue[^]ÐUh(ujhD"h,hh(th(US]SDC $C$]ÉU (VSu ]ycxvV‹B+C  h,qYXC VSP4BRC@ uVsP e[^]ÉUVSu] F $jV'tue[^]Ate[^]ÐU (uRh(h -h(Nm(USj(&tÉ$@C @$C$C C$!t Ss h'Ym]ÍvUVSu] F $jVStue[^]mse[^]ÐU(u?Ph(h-h(zl(USj$RsÉ$؃!t Ss h'l]ÍvUVSu] F $F`$jVtue[^]re[^]ÐU x(ujhL"h4-hx(Irx(ÍvUWVS EEE E]CEƿA-8u$jj jsn1҅‹EP 1zu,8uBjj jsm~ UB$1?vPE0h`-h(+UE]U Ee[^_]e[^_]U (VSu ]yuvV‹B+C$%S u h,nC VSP4BPC@ uVsP e[^]ÉU(utjhh"h0h(p(U(ujhp"h0h(p(ÍvUS u ]SC $C$]ÍvUVSu] F $jV3tue[^]Mpe[^]ÐU塼(u Qh(h#0h([i(ÐUSS} ~% j8+pZE@YPS؃$1 t So h<'mi]ÍvUVSu] F $jVgtue[^]oe[^]ÐU(uSPh(h00h(h(USR} ~% j8_oYXE@PSo؃$1 t So hL'h]ÍvUVSu] F `$F$jVtue[^]ne[^]ÐU (uwjhx"hx0h(In(ÍvUS u ]SaC `$ C8C$Ph0S5 C@jS$'qUt S[ h'RUKVv]ÍvU (ujh"h5h (5[ (ÍvUVSu F8] F $F $Pw>YXjV!tue[^][ve[^]ÐU]ÍvUSR (ҋ]y^E PK(B#C,]ÉUWVS uVlҋ} u.h 6(S/X5(sZYPS莉Fl (y"^Gp5(OËFlP EFpPSFuPvlR t SXQEPuF8PVhU҉t8u6hD6h(PX5(ZYPh(FpC C FpFpus(ym]W tiA(uIGt@jwPGWS58"jRX(G$=(G HA(Q@ uWvpP e[^_]ÍvUWVS E] EEEu?p O68u#EpEuPJZe[^1_]ÐMEM] Ee[^_]U ((uOjh"h57h((uX((ÍvUE3E 1Љ1%]ÉUVSu] F $jV+tue[^]EXe[^]ÐU(uPh(hG7h(RQ(USh4'XÉ$I؃"t SW h'uQ]ÍvU8(ujh"h8h8(bW8(UVSu] F `$jV;tue[^]UWe[^]ÐU H(u'Rh(h8hH(bPH(USh<7WÉ$]؃"t SV h0'P]ÍvUVSu] F $jVtue[^]Ve[^]ÐUT(ukPh(h8hT(OT(USj8~VÉ$hC $C$C4 t SV hL'O]ÍvUVSu] F $F$jVtue[^]Ue[^]ÐU `(u;jh"h9h`(aU`(ÍvUWVS]K4щS BAיC:h(gI(ÐUSj8>PÉ$؃!t SO h'I]ÍvUVSu] F $F$jVtue[^]Oe[^]ÐU(ujh"hm:h(6O(UVSu] F $jVtue[^])Oe[^]ÐU (uRh(h|:h(6H(USj4OÉ$C $C$#vt SN h (MH]ÍvU(u,'jh"h;h(:N(UVSu] F $jVtue[^]-Ne[^]ÐU (uRh(h;h (:G (UShNÉ$؃"t SM h((]G]ÍvUVSu] F $jVWtue[^]qMe[^]ÐU (uRh(h;h(~F(UVSu] F $jVtue[^]Me[^]ÐU ((u_Rh(h;h((F((UVSu] F S%jVO~tue[^]Le[^]ÐU8(uQh(h<h8(E8(ÐUVSu] F $jVtue[^]!Le[^]ÐU D(uRh(h<hD(.ED(USj LÉ$`؃!t SK hD(UE]ÍvU \(u+Rh@(h!=h\(D\(UVSu] F S%jV|tue[^]5Ke[^]ÐUP(uPh8(h2=hP(BDP(UE@ EvUSQ]C E@u ]" PN$sKK ]ÉUVSu] F $jVGtue[^]aJe[^]ÐUh(u3Ph(h==hh(nCh(USjPFJÉ$,؃!t SI h(C]ÍvU(ukPh@(h=h(B(UEPM @$H BB BB]ÉUVSu] F S%jVztue[^]9Ie[^]ÐUt(uQh8(h=ht(GBt(ÐU]ÍvU]ÐU1]ÐU]ÍvU]ÍvUVSu] F $F$jVtue[^]He[^]ÐU(ukjh.$h>h(5H(ÍvUVSu] F S%jVytue[^]%He[^]ÐU塴(uQht(h>h(3A(ÐUVSu] F $jV}tue[^]Ge[^]ÐU (u臒Rh(h>h(@(USj(GÉ$؃!t SIG h(@]ÍvUVSu] F $jV|tue[^]Fe[^]ÐU(uϑPh(h>h( @(USjdFÉ$4؃!t SF h(1@]ÍvUVSu] F S%jVxtue[^]EFe[^]ÐU(uQht(h7?h(S?(ÐUE]ÉUVSu] F $jV{tue[^]Ee[^]ÐU (u藐Rh(hE?h(>(UShEÉ$)؃"t SUE h(>]ÍvUWVS}@$u G $X jPvYXGxX jPvXZG S%jWvt}e[^_]De[^_]U (uRht(h?h(=(UVSu] F $jVOztue[^]iDe[^]ÐU(u;Ph(h?h(v=(UShKDÉ$U ؃"t SC hD(=]ÍvUVSu] F S%jVkutue[^]Ce[^]ÐU(u_Pht(ht@h(<(UE@\]ÐUVSu] F $jVytue[^]1Ce[^]ÐU(uQh(h@h(?<(ÐUSjtCÉ$` ؃!t SB h(e<]ÍvU(u;Ph@(h@h(;(UEPM @$H BB BB]ÉU (ujh.$h@h(A(ÍvUVSu] F $jVwtue[^]Ae[^]ÐU$(u裌Ph(h@h$(:$(USjlAÉ$P؃!t SeA h(;]ÍvUVSu] F $jVvtue[^]Ae[^]ÐU 0(uwRh(h@h0(&:0(USj]hAS~ jh AS ~ j hAS}]ÐU @(u+Rh@(hAh@(9@(UEPM @$H BB BB]ÉUX(ujh.$hAhX(?X(UVSu] F @$jVutue[^]?e[^]ÐU L(u藊Rh(hAhL(8L(USh?É$؃"t SU? h(8]ÍvUVSu] F `$F$jVhGtue[^]?e[^]ÐUt(ujh.$h Bht(>t(UVSu] F $jVwttue[^]>e[^]ÐU h(ucRh(h.Bhh(7h(USjXv>É$(؃!t S%> h$(7]ÍvUVSu] F $F`$jV,xtue[^]=e[^]ÐU(u#jh.$hJBh(m=(ÍvUE ]ÐUE@ ]ÐUVSu] F $jV'stue[^]A=e[^]ÐU塄(uQh(hWBh(O6(ÐUSj(&=É$h؃!t S< h@(u6]ÍvU (uKRh@(hCh(5(UEPM @$H BB BB]ÉUVSu] F $F$jVlvtue[^]0É$x'؃!t S/ h,()]ÍvUVSu] F $F$jVitue[^]/e[^]ÐU(usjh/$hGh(5/(ÍvUS]SC $ C$PhGSn0C $C$jSKi$H((v)v]ÍvUVSu] F $jVdtue[^].e[^]ÐU塼(uyQh(hGh('(ÐUSh.É$؃"t SE. hh(']ÍvUVSu] F @$F$jVLhtue[^]-e[^]ÐU (ujh /$h[Hh(-(ÍvUVSu] F $jVcctue[^]}-e[^]ÐU(uOxPh(hfHh(&(USh_-É$'؃"t S - h(&]ÍvUVSu] F $F$jVgtue[^],e[^]ÐU(ujh(/$hHh(V,(UVSu] F `$jV/btue[^]I,e[^]ÐU (uwRh(hHh(V%(USh+,É$)؃"t S+ h(y%]ÍvUVSu] F $F$jV3tue[^]+e[^]ÐU(ujh0/$hHh("+(UVSu] F $F$jVt3tue[^]+e[^]ÐU(usjh8/$hIh(*(ÍvUEU Dp]ÉUVSu] F $jVk`tue[^]*e[^]ÐU(uXuQh(h Ih(#(ÐUShg*É$M-؃"t S* h(#]ÍvUVSu] F $F$jV(2tue[^])e[^]ÐU8(u(jh@/$h/Ih8(^)8(UVSu] F $jV7_tue[^]Q)e[^]ÐU ,(u#tRh(h9Ih,(^",(USj\6)É$-؃!t S( h("]ÍvUT(uh_LhT(*!T(UE UBH$t(ÉU]ÉU`(uQhT(hhLh`(!`(ÐUVS]Cu C0$t P&CH$t]e[^]'e[^]ÐUE@ ]ÐUVS uj(ÃC0$F C ~ P$ Cs vP!%C5CH$ h4(,!t Sm' hD( !e[^]ÐUl(u诰jhL/$huLhl(&l(ÍvU]ÍvU EPR uu pR UEP juu PR@ÍvU EP ju PRLÉUE0]ÐUE ]ÐUE$]ÐUE(]ÐUE,]ÐUUE B4]ÉUVSu] F `$jV\tue[^]9&e[^]ÐUH(u qQh(h|LhH(GH(ÐUSjX&ZYj3S+؃#vt S% hT(i]ÍvUVSu] F $F$jV-tue[^]v%e[^]ÐU|(ujhT/$hLh|(%|(ÍvUVSu] F $jVZtue[^]%e[^]ÐU塜(u`Qh(hMh((ÐUVSu] F $jVwZtue[^]$e[^]ÐU (ucoRh(hMh((USjXv$É$x:؃!t S%$ h(]ÍvUVSu] F $F$jV8,tue[^]#e[^]ÐU塴(u`jh\/$hMh(n#(UVSu] F $jVGYtue[^]a#e[^]ÐU (u3nRh(hMh(n(USj\F#É$<؃!t S" h(]ÍvUVSu] F $jVgTtue[^]"e[^]ÐU(u mQh(hkNh((ÐU(uGjhd/$hvNh("(ÍvUE@@]ÉUVSu] F $jVWtue[^]!e[^]ÐU(ulQh(hNh((ÐUSS} ~1 j$!Ãjj jEpyZYPStC؃%1 t Se! h((]ÍvUVSu] F $jVVtue[^]!e[^]ÐU(ukPh(hNh(&(USj$ É$h>؃!t S  h8(M]ÍvU(u#Ph@(hPOh((UEPM @$H BB BB]ÉUVSu] F $F$jVP(tue[^]e[^]ÐU (uwjhl/$hZOh((ÍvUVSu] F $jV[Utue[^]ue[^]ÐU(uӡPh(hdOh((UVSu] F $jVTtue[^]e[^]ÐU$(uiQh(huOh$($(ÐUShÉ$EB؃"t S ht(5]ÍvU L(u Rh@(hOhL(L(UEPM @$H BB BB]ÉUVSu] F `$F$jV8&tue[^]e[^]ÐU<(u`jht/$hOh<(n<(UVSu] F $jVGStue[^]ae[^]ÐU 0(u3hRh(hOh0(n0(UShCÉ$H؃"t S h(]ÍvUVSu] F $F`$jV%tue[^]e[^]ÐU塐(u,jh|/$hjQh(:(UVSu] F @$F$jV$tue[^]&e[^]ÐUd(ujh/$huQhd(d(ÍvUE@p QE QXp]ÍvUVSu] F $jVwQtue[^]e[^]ÐU塄(uQh(hQh((ÐUVSu] F $jVQtue[^]!e[^]ÐU X(ueRh(hQhX(.X(USjxÉ$J؃!t S h (U]ÍvUVSu] F $jVOPtue[^]ie[^]ÐUt(u;ePh(hQht(vt(UShKÉ$1L؃"t S h(]ÍvU (uoRh@(hXh((UEPM @ $H BB BB]ÉU(uPh@(hXh((UEPM @$H BB BB]ÉU塼(u萓Qh@(hXh((ÐUEPM @$H BB BB]ÉUVSu] F $F$jV tue[^]Ve[^]ÐU(ujh/$hYh((ÍvU]ÍvU]ÍvU]ÍvU]ÍvU]ÍvUSQ]TPu (H RPQ$ǃTu (H RPQ$ǃxtu (H RPQ$ǃx]ÉUSS]TPu (H RPQ$ǃT]UVSu] F $jVLtue[^]e[^]ÐU(u?Ph(hYh((UVSu] F @$jVWLtue[^]qe[^]ÐU(uDaQh(h"Yh((ÐUShSÉ$Q؃"t S hX(]ÍvD$WvD$_vU(uh[h('(ÐUE Uǂ`$t {vÉUEH]ÐUE݀ ]ÉUE@]ÐUE@]ÐU<(u#_^jh/$h[h<(<(ÉUS]S0$jFǃ$ǃ( $ǃ,ǃ4ǃ`$ h(Q]ÍvUVSu] F `$F$jVtue[^]^e[^]ÐU (ujh/$h[h ( (ÍvUE`]ÐU0(u蟎Ph@(h[h0(& 0(UEPM @0$H BB BB]ÉUVSu] F `$F$jVtue[^]fe[^]ÐU (ujh/$h[h((ÍvUVSu] F $jVHtue[^]e[^]ÐUX(u]Ph(h[hX( X(UVS h$É$ƕYXSViB1t Si h( t VJ h( e[^]ÐUVSu] F $jVGtue[^]e[^]ÐU (u\Rh(h[h( (UVS h$É$ҔXZSVUB1t Su h( t VV h( e[^]ÐUVSu] F $jVFtue[^] e[^]ÐU$(u[Qh(h[h$( $(ÐUVS h8Ɖ4$$XZVS聕ZYSVXe[^]ðt Vu h$( t SU h4( UVSu] F $jVEtue[^]e[^]ÐUL(uZQh(h\hL( L(ÐUVS h8Ɖ4$$XZVSiZYSV`e[^]ðt V} hD( t S] hT(D$JD$*D$ D$ D$D$~D$UVSu] @ $@$t@ $@$jP tue[^]e[^]ÐU d(u;jh/$hb\hd(Ad(ÍvUVSu] F $jVDtue[^]1e[^]ÐUt(uYPh(hq\ht(>t(UWVShY[jS耣11t;t S !t S  hp(=e[^_]ÃD$bD$ڬD$D$?vD$?vD$髢vD$nD$UVSu] @ $@$t@ $@$jP*tue[^] e[^]ÐU(u jh/$hU]h(a (ÍvUVSu] F $jV7Btue[^]Q e[^]ÐU塐(u$WQh(hg]h(_(ÐUWVSh1 ZYÿjS,1t01t S  t S  h(Ye[^_]ÁD$lvD$lOvD$lvD$lvD$l߱vD$lcvD$lKvD$lkvU塨(ujh/$h]h( (UE(݀j]ÍvUVSu] F @$jV@tue[^] e[^]ÐU (uoURh(h^h((UWVShD} [^þjSخ11t;t S !t S  h(e[^_]ÃD$JD$fD$髞vD$D$D$鋢vD$D$SvD$vD$zD$vD$D$WvD$D$kvU(u诃Ph@(h^h(6(UEPM @p$H BB BB]ÉUVS]u @ $@`$t*jRlYX@ $@$jPt]e[^]Ne[^]ÐU(ujh/$h^h((ÍvU(u蜂Qh@(h^h(#(ÐUEPM @P$H BB BB]ÉUVSu] @ `$@@$t@ $@$jPtue[^]He[^]ÐU(ujh/$h^h((ÍvUVSu] F $jV<tue[^]e[^]ÐU(uQQh(h_h((ÐUWVShZYÿjS01t01t SS t S= hT (e[^_]UVSu] F $jV;tue[^]e[^]ÐU(uPPh(h_h((UWVShY[jSܿ1t01t So t SY hd (e[^_]U(uPh@(hdeh(V(UEPM @$H BB BB]ÉUVSu] F `$jV[6tue[^]e[^]ÐUL(uOQh(hrehL(L(ÐU(ujh/$heh((ÍvUUE0]ÍvU(@]ÍvUVSu] F $F $jVtue[^]e[^]ÐU p(uCjh/$hehp(]p(ÍvUVSu] F $F$jV tue[^]Fe[^]ÐU<(ujh/$heh<(<(U,(ujh0$heh,(,(ÍvUVSu] F $jV8tue[^]e[^]ÐU(upMQh(heh((ÐUShÉ$y؃"t S- h (]ÍvUVSu] F $jV7tue[^]e[^]ÐU (uLRh(heh ( (UShÉ$C $C$ t Se h (]ÍvUVSu] F $jV6tue[^]e[^]ÐUX(uKPh(hehX(&X(UShÉ$e؃"t S h (I]ÍvUVSu] F $jVC6tue[^]]e[^]ÐUd(u0KQh(h fhd(kd(ÐUSh?É$؃"t S h (]ÍvU(uczPh@(hih((UEPM @0$H BB BB]ÉUVSu] F $F$jVtue[^]*e[^]ÐU (ujh0$hih((ÍvU(ujh0$hih((UE]ÉU(@]ÍvUVSu] F $jVG4tue[^]ae[^]ÐU (u3IRh(hih(n(USh CÉ$؃"t S hl (]ÍvUVSu] F $jV3tue[^]e[^]ÐU(uwHPh(hih((USh É$ ؃"t S5 h| (]ÍvUVSu] F $jV2tue[^]e[^]ÐU塨(uGQh(h jh((ÐUSh É$M؃"t Sy h (]ÍvUVSu] F `$jV2tue[^]-e[^]ÐU (uFRh(h%jh(:(USh É$؃"t S h (]]ÍvU]ÍvU(u+vPh@(hjh((UEPM @p$H BB BB]ÉUVSu] F $F@$jVXtue[^]e[^]ÐU (uwjh0$hjh((ÍvU(@]ÍvUVSu] F $F@$jVtue[^]fe[^]ÐU(ujh0$hjh((UVSu] F $jV/tue[^]e[^]ÐU (uDRh(hjh((UShÉ$؃"t S h (%]ÍvUVSu] F $F@$jVtue[^]2e[^]ÐU0(ujh1$hkh0(0(U(@]ÍvUVSu] F $jV.tue[^]e[^]ÐU$(uCQh(h(kh$($(ÐUSjdÉ$؃!t SE h (]ÍvUVSu] F $F$jVXtue[^]e[^]ÐU@(ujh 1$hkh@(@(UVSu] F $jVg-tue[^]e[^]ÐU P(uSBRh(h lhP(P(UShcÉ$؃"t S h (]ÍvUVSu] F $F$jV$tue[^]e[^]ÐU\(uSjh(1$hlh\(Y\(ÍvUVSu] F @$jV/,tue[^]Ie[^]ÐUl(uAQh(hlhl(Wl(ÐUSh+É$!؃"t S h, (y]ÍvD$>D$B0D$&.D$.D$/D$*/UVS]u C0`$@ $@`$t@ $@$jPt]e[^]ve[^]ÐU塄(ujh01$hmh((UVSu] F $jV*tue[^]e[^]ÐU (u wRh(hmh((UVSu] F $jV#*tue[^]=e[^]ÐU(u?Ph(hmh(J(UWVShY[jS+11t;t S!t S hh (Ie[^_]UVSu] F $jVC)tue[^]]e[^]ÐU(u/>Ph(hmh(j(USh?ÍC hD (e[^_]ÃD$ZD$ D$ D$* D$* D$ D$ D$F5D$* D$ D$ D$8D$D$rD$RD$RD$D$JD$麀D$D$D$D$D$D$D$D$D$D$D$D$6D$n0D$>2D$2D$ 2D$2D$5D$5D$Z4UL(udPh@(hxohL(fL(UEPM @$H BB BB]ÉUVS]u C\$@ $@$t@ $@$jPt]e[^]ve[^]ÐU $(ujh`1$hoh$(!$(ÍvUVu S]tC`t C`P$C@CCC CCC@@@ @K8C\$CB $B$C C$C4C8$AQ PC,Pho3h* C0Pho3U* C4Pho3B* C(Pho3/*:t@ $@$jPm h` (ve[^]ÐU]ÍvUE@ o@]UVS]u CCd$B $B$Cd$@ $@$B $B$tB $B$jRt]e[^]ae[^]ÐU(u#jhh1$hoh((ÉUVu S]tChCt ChPa"jS| C@\$@@ @@ @$@4@@@@CHS@@ @@K@C4B $B$AC@$Q Phos+( C8Phos( C(USj(É$Q؃!t S h,(e]ÍvUVSu] F $jV_tue[^]ye[^]ÐU(uKPh(hvh((USj$^É$؃!t S  h<(]ÍvUVSu] F $jVtue[^]e[^]ÐU(u#Ph(h yh((US]SC $ CCCCCC C$C(C,C0C4C8C<C@CDCHCLCPCTCXC\C`?CdChC|PhwS C PhwS C$PhwS C,PhwS C4PhwS C C $ǃǃǃǃǃǃǃǃPhg~S Ph~SU Ph~S@jS=$d(9C $jS$t(jS$(C `$jS$(t S# h(æv軧v]ÍvUVSu] F $jVtue[^]ͬe[^]ÐU (uRh(h~h(ڥ(USh诬É$؃"t S] h(]ÍvUVSu] F $jVtue[^]e[^]ÐU8(uPh(h~h8(8(UShÉ$ ؃"t S衫 h(A]ÍvUVSu] F $jVtue[^]Ue[^]ÐU(uQhD(h~h(c(ÐUS(RU] y裮vK(@ܢ܊ ܂݂EݚuݚA݂Eu=(y1C@݂aݚ݂ݚ݂ݚݚ]ÍvUVSu] F $F`%jVltue[^]e[^]ÐU (u蓂jh2$hth(衩(ÍvUVSu] F %jVwtue[^]鑩e[^]ÐUt(ucPh(hht(螢t(USjtvÉ$R؃!t S% h(Ţ]ÍvUVSu] F %jVtue[^]٨e[^]ÐU塠(u<Qh(hh((ÐUS]SC %CCC]UE@]ÐUUBM uJJH$JB@$B]ÍvUUJu1!vA$;JBuBBJ]UE@U t Jx @$u1]ÉUE@]ÐUE@]ÐUUBM uJA$BJ]ÉUUBB]ÉUUBH$J]ÍvU (u"Rh8(hh(蒠(UEU %P]UVSu] F $F`$jVTtue[^]e[^]ÐU塐(uL0jh2$hh(薦(UU1z$]ÍvUE@$]ÐUE@$]ÐUE@ ]ÐUE@4P PR U(u_jh 2$hfh( (ÍvUVSu VRF `%F%$ 1É${ C %CCC^8^4FÉ$ C %CCC^8^4FDF@F FHPhqV WhyV Fe[^]ÐU (u/jhP2$hh(ٕ(ÍvUVSu] F %jVtue[^]ɕe[^]ÐU(uPh(hh(֎(USjP讕É$,q؃!t S] h(]ÍvUVSu] F $F`$jVdtue[^] e[^]ÐU塸(ujhX2$h h(覔(UE @M@]ÐUVSu] F `%jVktue[^]酔e[^]ÐU (uWRh(h h(蒍(UShgÉ$u؃"t S h(赍]ÍvUVSu] F %jVtue[^]ɓe[^]ÐU (uRh(h h(֌(UVSu] F $F`$jVtue[^]Re[^]ÐU(uDjh`2$hh((UES@P] ~vB(9C(}IR0u؋$ÐUE@L]ÐUE@H]ÐUVSu] F @%jVtue[^]陒e[^]ÐU (ukRh(hh(見(USj\~É$x؃!t S- h4(͋]ÍvUVSu] F $F`$jV4tue[^]ڑe[^]ÐU(u,jhh2$h5h(v(UVSu] F $F`$jVtue[^]be[^]ÐU$(uSjhp2$h?h$($(ÍvUEqUE@X]ÐUUE ]ÍvU]ÍvUE@T]ÐUU1]U]ÉUEM 19Qt]ÍvUVSu] F $F`$jVtue[^]^e[^]ÐU 4(ujhx2$hHh4(4(ÍvUWS ]Sla~1C `%C%󫍻󫍻 e[_]ÐUE UD E\ UVSu] F %jVWtue[^]qe[^]ÐU(uCPh(hVh(~(UShSÉ$u}؃"t S h(衈]ÍvUVSu] F %jVtue[^]鵎e[^]ÐUD(uQh(hfhD(ÇD(ÐUSh藎É$i؃"t SE h(]ÍvUVSu] F %jVtue[^]e[^]ÐU (uRh(hvh((UShۍÉ$؃"t S艍 h()]ÍvUVSu] F $F`$jVtue[^]6e[^]ÐU\(ujh2$h,h\(Ҍ\(US]S<C %C` %C C$C(C,C0C4]UVSu] F %jV[tue[^]ue[^]ÐU P(uGRh(h<hP(肅P(USj8ZÉ$(؃!t S  h(詅]ÍvUVSu] F $F`$jVtue[^]鶋e[^]ÐU\(ujh2$h0h\(R\(UE@0]ÐUE@,]ÐUVSu] F $F`$jVtue[^]&e[^]ÐU(u[jh2$h=h((ÍvUVSu] F $F`$jVtue[^]骊e[^]ÐU (ujh2$hRh(E(ÍvUVSu] F $F`$jVtue[^].e[^]ÐU((udjh2$hih((ʉ((UVSu] F $F`$jVtue[^]鶉e[^]ÐU(ujh2$h{h(Q(ÍvU l(ujh2$hhl(l(ÍvUS]SܐC %C %CpCtCxC|]ÉUVS]Ctu C %C %t PψC $C`$jSt]e[^]靈e[^]ÐUVSu] F $F`$jVtue[^]Ze[^]ÐU(ujh2$hh((UVSu] F $F`$jV<tue[^]e[^]ÐU|(ujh2$hh|(}|(ÍvU]ÉUVSu] F $F`$jVtue[^]Ze[^]ÐU (ujh2$hǔh((ÍvUS]S\C %C` %C ]ÍvUVSu] F $F`$jVtue[^]鮆e[^]ÐU(u@jh2$hՔh(J(UVSu] F %jV#tue[^]=e[^]ÐU 8(uRh(hh8(J8(USjp"É$蘍؃!t Sх h(q]ÍvUVSu] F %jVktue[^]酅e[^]ÐUl(uWPh(hhl(~l(UShgÉ$؃"t S h(~]ÍvUVSu] F `%jV诺tue[^]Ʉe[^]ÐU(uQh(hh(}(ÐUSh諄É$)؃"t SY h(}]ÍvUVSu] F @%jVtue[^] e[^]ÐU (uRh(h-h(}(UShÉ$؃"t S蝃 h(=}]ÍvUVSu] F %jV7tue[^]Qe[^]ÐU(u#Ph(hDh(^|(USh3É$ј؃"t S h(|]ÍvUVSu] F %jV{tue[^]镂e[^]ÐUP(uhQh(h^hP({P(ÐUShwÉ$؃"t S% h({]ÍvUVSu] F %jV迷tue[^]فe[^]ÐU (uRh(hth(z(USj|辁É$ԝ؃!t Sm h( {]ÍvUVSu] F %jVtue[^]!e[^]ÐUD(uPh(hhD(.zD(USj|É$谞؃!t S赀 h(Uz]ÍvUVSu] F %jVOtue[^]ie[^]ÐU(u<Qh(hh(wy(ÐUShKÉ$=؃"t S h(y]ÍvUVSu] F %jV蓵tue[^]e[^]ÐU x(uRh(hhx(xx(USj$É$@؃!t SA h(x]ÍvUVSu] F B%FB%jVHtue[^]~e[^]ÐU(ujh2$h h(~(ÍvUVSu] F @%jV_tue[^]y~e[^]ÐU塄(uLQh(hh(w(ÐUSj4^~É$0؃!t S ~ h4(w]ÍvD$:UVSu] F $F`$jVtue[^]}e[^]ÐU塠(ujh3$hh(J}(UE@(]ÐU(yvE PEJp ÐUE@ ]ÐUVSu] F %jV۲tue[^]|e[^]ÐU (uRh(hȖh(v(USj`|É$l؃!t S| h()v]ÍvD$骰D$xUVSu] F $F`$jVxtue[^]|e[^]ÐU(uKxjh3$hh({(ÍvUS]S\]C `% C%PhS襼0C $C`$jSϵ$(/uv'vv]ÍvUE݀ (܀݀EuÐUE]ÉUVSu] F %F@%jVDtue[^]ze[^]ÐU (ujh3$hh(z(ÍvUPU BЋM0UE u E0H]ÉUM AyQ)]ÍvUU ҸtB]UUfBh1f9B`u B0u]ÍvUUBu&BL 0BD݂4Eu0.݀ 0܀݀EuÉU(u/Ph8(hh(r(UEU %P]UVSu] F $jV#tue[^]=ye[^]ÐU(uPh(hAh(Jr(UVSu] F %jV賮tue[^]xe[^]ÐU(uQh(hTh(q(ÐUShxÉ$؃"t S]x h(q]ÍvUVSu] F %jVtue[^]xe[^]ÐU (uRh(hch(q(UShLwÉ$ ؃"t Sw h(Aq]ÍvU d(uRh@(h~hd(pd(UEPM @%H BB BB]ÉUD(uPh@(hhD(.pD(UEPM @h%H BB BB]ÉUp(u8Qh@(hhp(op(ÐUVSu] F %F@%jV~tue[^]:ve[^]ÐU4(uNjh 3$hh4(u4(ÍvUE]ÉUVSu] F $F`$jVtue[^]ue[^]ÐU T(ujh(3$hhT(IuT(ÍvUE@ E EUVSu] F $jVtue[^]ue[^]ÐU(u{Ph(hșh(*n(UVSu] F %jV蓪tue[^]te[^]ÐU((u耿Qh(hٙh((m((ÐUVS ]htƃjj js8pZYPVK t V)t h(me[^]ÐUVSu] F %jVétue[^]se[^]ÐU(u课Ph(hh(l(USj4sÉ$0؃!t Sqs h(m]ÍvUVSu] F $F`$jVxtue[^]se[^]ÐU|(uojh03$hh|(r|(ÍvUS]S C % C$C`%C C$Ph*S蚳1C $C`$jSì$(#lvmv]ÍvUVSu] F %jVtue[^]-re[^]ÐU塌(uQh(h2h(;k(ÐUSj(rÉ$؃!t Sq h(ak]ÍvUVSu] F %F %jVytue[^]nqe[^]ÐU塤(uIjh83$hh( q(US j]S.wC %C %]UVSu] F $jV軦tue[^]pe[^]ÐU (u3Rh(hh(i(UVSu] F @%jVKtue[^]epe[^]ÐU(u7Ph(hh(ri(USjXJpÉ$؃!t So h(i]ÍvUVSu] F $F`$jVtue[^]oe[^]ÐU(ujh@3$hޚh(Bo(US]S4p(C C %C%]ÉUE@ ]ÐUM S]C$tC$B(K($ÍvUE@$]ÐUVSu] F %jV諤tue[^]ne[^]ÐU (u藹Rh(hh(g(USj,nÉ$؃!t SYn h (g]ÍvUVSu] F %F@%jVlvtue[^]ne[^]ÐU(uFjhH3$hMh(m(US j]SsC %C@%]UVSu] F %F%jVutue[^]fme[^]ÐU(uEjhP3$h]h(m(ÍvUS j]S"sC %C%]UVSu] F $jV询tue[^]le[^]ÐU(u(Qh(hmh(e(ÐUVSu] F %jV?tue[^]Yle[^]ÐU (u+Rh(hh(fe(USjX>lÉ$<؃!t Sk h((e]ÍvUVSu] F `%jV臡tue[^]ke[^]ÐU(usPh(hh(d(USjXkÉ$(؃!t S5k h8(d]ÍvUVSu] F $jVϠtue[^]je[^]ÐU ((uGRh(hߛh((c((UVSu] F %jV_tue[^]yje[^]ÐUH(uKPh(hhH(cH(USjX^jYXj3S2p C @%C0C%Ph SCvjS=r$T(ct Si hd(rckdv]ÍvUVSu] F @%F%jVqtue[^]vie[^]ÐU8(uBjhX3$hh8(i8(ÍvUS4(R] ylK(ylrt RE0h-h(1( y|lK{ tTB(uIStBjRPCKP58"jQh(C$(C vHB(]ÍvUWVS E] EEEp>8eUZX$޿C8uE@4޿I8uUB4 ޿O 8uE@4 kv޿X8uUB4 Cv޿]8uE@4 v(dv uzơ4(yjU^rSPhjj jEp bCUB P jVPR 1vEUE] Ue[^_]}oe[^_]U T(u??jh`3$hthT(MfT(ÍvUS]ECdS P@@j4kfChXZjsh`H EShPs shR0SdP Cl]UWVS]ESh} PWshER0Mɉ CljHe1҉PSd?Sdx@@ @H@,@4@8@<@@@D@@ @$F e[F ^_]UE@hEoHvU]ÍvU]ÍvUWVSEUE 9P<| 1E@P$X$[}ME mM]mUEM +A<B$aEE x^É$؃!t S] h(W]ÍvUVSu] F $F`$jVtue[^]]e[^]ÐU(ujhx3$hoh(6](U(y`vE PE@$E@tJÐUE@$]ÐUVSu] F @%jV軒tue[^]\e[^]ÐU (u觧Rh(hh(U(USj,\É$؃!t Si\ h8( V]ÍvUVSu] F `%F %jVtue[^]\e[^]ÐU(uOjh3$h֢h([(ÍvUVSu] F $jV臑tue[^][e[^]ÐU(uQh(hh(T(ÐUVSu] F @%jVtue[^]1[e[^]ÐU (uRh(hh(>T(USh[É$؃"t SZ ht(aT]ÍvU L(uRh8(hhL(SL(UE%@@@ ]ÐUUE B]ÉUd(u諤Ph(h$hd(VSd(UE@]ÐUE@]ÐUE@$]ÐUE@D]ÐUVSu] F %jVStue[^]Ye[^]ÐUX(uLQhd(h.hX(RX(ÐUSu]u SC % CLPhAq(S3 CPPhDS蹘 CXPhKS觘 C`PhQS jS h(RSv]ÍvUVSu] F %jVKtue[^]Xe[^]ÐU p(uCRhd(h4hp(Qp(USu]u SC % CLPhAq(S+ CPPhDS豗 CXPhKS蟗 C`PhQS jS} h(QRv]ÍvUVSu] F %jVCtue[^]We[^]ÐU@(u;Phd(h;h@(P@(USu]u SC % CLPhAq(S# CPPhDS詖 CXPhKS藖"jS h(PQv]ÍvUE@L]ÐUVSu] F %jV{tue[^]Ve[^]ÐU((ugPh(hbh((O((UVSjj jEp2R$ddVƃ jSV#vt V V h(Oe[^]ÐUVSu] F %jV觋tue[^]Ue[^]ÐU(u蔠Qh(hmh(N(ÐUVSjj jEp^Q$dUƃ jSV#vt V9U h (Ne[^]ÐUVSu] F %jVӊtue[^]Te[^]ÐU 4(u迟Rh(hzh4(M4(UVSjj jEpP$`Tƃ jSV"#vt VeT h0(Ne[^]ÐUVSu] F %F %jVx\tue[^]Te[^]ÐU|(u,jh3$hh|(S|(ÍvU(ujh3$h8h(uS(ÍvUVSu] F !%jVKtue[^]eSe[^]ÐU塐(u8Qh(hGh(sL(ÐUShGSÉ$ ؃"t SR h(L]ÍvUVSu] F $jV菈tue[^]Re[^]ÐU (uRh(h[h(K(U (uOjh3$hh(R(ÍvUVSu] F `"%jVtue[^]Re[^]ÐU(uӜPh(hh(K(UShQÉ$Y؃"t SQ h(1K]ÍvU(uPh(hh(J(UVSu] F "%jVtue[^]Qe[^]ÐU(uQh(hh(J(ÐUSjPÉ$?؃!t SP h(EJ]ÍvU(uPh(hh(I(U(]ÉUEP$@]ÍvUEP$@]ÍvUMU#E#U ]ÐUVSu] F #%jV軅tue[^]Oe[^]ÐU(u訚Qh(hh(H(ÐUSj(OÉ$@؃!t SiO h( I]ÍvUE@]ÍvUS]E PPLC]ÐUEU MH]ÐUVS]Cu t PMt]e[^]Nve[^]ÐUVSu ];3r S\HeC[^]UUE R]ÍvUE]ÉUu u'Lƒ1ÐUE@U ju uAHU0HUGUVS]Cu t PLt]e[^]Mve[^]ÐUU 1Ʌx E;}]UVu S]y STG;3|FPSOeC[^]ÃD$D$D$.U(uhh(E(UVS]u C%%t PKt]e[^]Le[^]ÐUt(uQh(hht(Ft(ÐUVS]C u C`%%t PJKCH$t]e[^]}Le[^]ÐUE@]ÉUE@]ÐUVS ujvLÃFCC`%%FCFC~ PGIZYC v s WM C 5CH$ h(Et SK h(qEe[^]ÐU,(uPh(hh,(D,(UVS]Cu C@%%t PJCH$t]e[^]EKe[^]ÐUE@  ]ÍvUEP Ҹt]ÍvUWVSju)KÃFCC@%%F C ~% PGNjK {vC5CH$ h(DDt SJ h(%De[^_]U(upQh(hh(C(ÐUVS]Cu C %%t PHCH$t]e[^]Ie[^]ÐUE@ ]ÍvUE@]ÐUWVSjuIÃFCC %%V S F҉C~+ PFK Ǎ {vC5CH$ h(Bt S9I h((Be[^_]U (u#Rh(hɷh(6B(UVS]Cu C%%t PzGCH$t]e[^]He[^]ÐUE@ ]ÉUE@ ]ÉUWVSjuHÃFCC%%F C ~% PqENjK {vC5CH$ h8(At SG hH(Ae[^_]U\(uSPh(hٷh\(@\(UE@]ÐUj|1UUE B]ÉUVSu] F $%jVJtue[^]IGe[^]ÐUh(uLQh\(hhh(W@h(ÐUVSu] F $%jVJtue[^]Fe[^]ÐU D(uRhP(hhD(?D(UVSu] F $%jVItue[^]iFe[^]ÐU(ukPh\(hh(v?(U(uQh8(hh(C?(ÐUU t"E@BtB(t <v8]ÐUE3$]ÍvUVSu] @ @#%tjP-_tue[^]sEve[^]ÐU(u'jh3$h!h( E(ÍvUU t6E@Bt$B(1ɩutt <v8]ÐU(uQhT(h@h(=(ÐU P(u_Rhh(hJhP(=P(U8(u Ph(h\h8(=8(UVSu] F &%jVytue[^]De[^]ÐU塰(uQh(hmh('=(ÐUSj$CÉ$hF؃!t SC hX(M=]ÍvUVSu] F &%jVGytue[^]aCe[^]ÐU (u3Rh(h|h(n<(USj$FCÉ$EC '%"t SB hh(<]ÍvUVSu] F `&%jVxtue[^]Be[^]ÐU(usPh(hh(;(USj$BÉ$DC $%"t S-B hx(;]ÍvUVSu] F @&%jVwtue[^]Ae[^]ÐU(u贌Qh(hh(:(ÐUSj$AÉ$0DC @'%"t SmA h( ;]ÍvUVSu] F &%jVwtue[^]!Ae[^]ÐU (uRh(hh(.:(USjPAÉ$$P؃!t S@ h(U:]ÍvUVSu] F &%jVOvtue[^]i@e[^]ÐU(u;Ph(hѸh(v9(USj$N@É$BC $%"t S? h(9]ÍvUVSu] F %%jVutue[^]?e[^]ÐU塀(u|Qh(hh(8(ÐUSj$?É$AC &%"t S5? h(8]ÍvUVSu] F %%jVttue[^]>e[^]ÐU (u軉Rh(hh(7(USh>É$V؃"t Sy> h(8]ÍvUVSu] F %%jVttue[^]->e[^]ÐU(uPh(hh(:7(UWVSh >Y[jSr11t;t S=!t S= h(97e[^_]UVSu] F @'%jVtue[^]M=e[^]ÐUVSu] F '%jVS@tue[^]=e[^]ÐU (uPh\(h)h (6 (UVSu] F &%jVtue[^] j4,ZYSV t V], h< (%e[^]ÐU h(uRh8(hhh(Z%h(UUE B ]ÉUjWa1UE$UE-aUEaUP(uPhT(hhP($P(UVS]C u C-%t P*CH$t]e[^]A+e[^]ÐUE@]ÉUVS ujF+ÃC-%FC~ P#(YZC v s 3, C 5CH$ h (l$t S* h (M$e[^]ÐUVSu] F -%jVG`tue[^]a*e[^]ÐU\(u3uPh(hh\(n#\(U} VSuEph(Yƃu1= j4*YXVS؃ t S) h (m#e[^]ÐU (uCRh@(hh("(UUVSB]Mu @@ @@B-%r J$Z([^]ÉUME UQ(A$]UE@$]ÐUWVS"?}P8-]uEɃ e(G$[^_]ÐU Ep(p$PGÉUWVS"?}P,]uE0G$8X$WGe[^_]ÐUWVSu }WG"?$m,]uE@G$HZ$WUGe[^_]ÉU塌(u耢Qh@(hh(!(ÐUUVSB]Mu @@ @@B-%r J$Z([^]ÉUME UQ(A$]UE@$]ÐU Ep(p$P?FÉU t(uáRh@(h ht(J t(UWVUSB]Mu} @@ @@B-%z r$J(Z,[^_]ÉU Ep,p(PEÉU Ep,p(PEÉUMtABQtA]UMU JtP]ÍvUMAU B AtQ]ÐU,(uPh(hh,(,(U(u`Qh(hh((ÐUS]SC ]ÐU(upQh(hh((ÐU 8(uהRh(hh8(b8(U(u+PhD(h(h(.(U]ÉUE(]ÉUEU ]ÉUSQMU (D DP<$X]EC[]ÉUE E@D]ÍvUMU (9}Љ(]ÍvUE E8EUSEE u8]PS ؋]USEE u8]PS@ ؋]UVSDEuE 8VPUR]F 9E~E;F|\/%EEEEEEEtECEĉC EȉCEC C ECECC/%Ce[^]UE,]ÐUE,]ÐUE,]ÍvUE,]ÐUE,]ÐUE,]ÍvUE0]ÉUEU DŽ]ÍvUUM 1]ÐUVSu] F /%jVWttue[^])"e[^]ÐU(uCPh(h3h(6(UE@,]ÐUE@0]ÐUE4UVSu] F *%jVOStue[^]!e[^]ÐU(uQh(hEh((ÐU (uRh(hUh(j(UE@]ÐUVSu] F '%jV#$tue[^] e[^]ÐUP(uPh (hbhP(P(US]S8#C @.%]ÐUE@]ÐU塸(u$Qhh(hph((ÐU(uhh((UE ҋMtB9Huu1]ÉUVSEPU u]REE^Y]E[UEF$Rv$P,u1@ e[^]ÉUS EP(u p(R,Ãu"h5_($TC ]ÍvUWVS uۋ} tv ؋P'utue[^_]e[^_]U塘(uhh([(ÐUVSu] F @0%jVTtue[^]e[^]ÐU(uoiPh(hh((USjDÉ$؃!t S1 h!(]ÍvUVSu] F 0%jVStue[^]e[^]ÐU(uhQh(hh((ÐUSj4É$`؃!t Sy h!(]ÍvUVSu] F 0%jVStue[^]-e[^]ÐU D(ugRh(hhD(:D(USj,É$؃!t S h!(a]ÍvUVSu] F /%jV[Rtue[^]ue[^]ÐU (uGgPh(hh ( (USj$ZÉ$|؃!t S  h!(]ÍvUVSu] F /%jVQtue[^]e[^]ÐU塠(ufQh(hh((ÐUSj,É$@؃!t SQ h"(]ÍvUVSut ؋Pue[^]ÍvUWVS }7t 6s$ue[^_]U\(uTQh@(hh\(\(ÐUWVESu}P]M @0%@ @$@(@,H0X4p8@<@@xDBB BB[^_]UE ]ÐUE$]ÐUE(]ÐUE,]ÐUE@D]ÐUE@0]ÐU (uRh(hh((UWVS11ۃX]uE}"o8P}m]uE}fE% fEfEmm]E}ԋEE mԉE]mԋUЍe[G<^_]ÉUWVS11ۃX]uE}"o0P}#m]uE}fE% fEfEmm]E}ԋEE mԉE]mԋUЍe[G4^_]ÉUVSuFP] tShV,tj4PV,e[^]ÉUE@@]ÐUE@D]ÐUE@P]ÐUVS u ]j AAAtABqe[^]ÐUSRE u1$QҋtABA Q؋]ÐUWVS } utR0h(Sgv(VS=FÃuQVhZ5_(1ۉe[^_]ÉUh(u蠑Qh@(hhh('h(ÐUE U`0%t vÉUS$]C(9C, C$@, P PR }fE% fEfEmm]E}UE mU]mEP53$S3$s$aS$B0@Pts,s rDhVS$B, P PR }fE% fEfEmm]E}UE mU]mES$Ps,s rD (qqh ]ÉUSQ]C(9C,,u S$5C$@(P C,$R Z$S\4Ss$]UVSu] F 0%jVJtue[^] e[^]ÐUt(u_Ph(hht(t(USjTÉ$؃!t S h<"(A]ÍvUVSu] F S%jVFtue[^]Ue[^]ÐU (uRht(hh(b (UVSu] F 1%jVItue[^]e[^]ÐU(u^Ph(hh( (UShÉ$؃"t Su hx"( ]ÍvUVSu] F 1%F1%jV|Mtue[^]"e[^]ÐU塰(ujh3$hh((US]S\MC 1%C1%CCC@]U]ÍvUVSu] F 2%jVWHtue[^]qe[^]ÐU (uC]Rh(hh(~ (USjDVÉ$8؃!t S h"( ]ÍvUVSu] F $F`$jV Ltue[^]e[^]ÐU(ujh3$hh(N(UE@ ]ÐUVSu] F $F`$jVKtue[^].e[^]ÐU(ugjh3$hh((ÍvUVSu] F $F`$jV Ktue[^]e[^]ÐU (ujh3$h*h(M(ÍvUVSu] F 3%jV#Ftue[^]=e[^]ÐU(u[Ph(h=h(J (USj$"É$؃!t S h"(q ]ÍvUVSu] F 3%jVkEtue[^]e[^]ÐU(uXZQh(hKh((ÐUSj,jÉ$(؃!t S h"(]ÍvUVSu] F 3%jVDtue[^]e[^]ÐU (uYRh(h^h((USj(É$؃!t Sa h"(]ÍvUVSu] F $F`$jVhHtue[^]e[^]ÐU(u_jh4$hh( (ÍvUS]SsC 4%C@4%C ]ÍvUSUBM] B @ QSrP ]ÍvUVSu] F `4%jV#Ctue[^]= e[^]ÐU$(uXQh(hh$(K$(ÐUSj$" É$؃!t S  h #(q]ÍvUVSu] F 4%F5%jVtue[^]~ e[^]ÐU<(u jh 4$hh<( <(ÍvUVSu] F 5%jVAtue[^] e[^]ÐU0(uVQh(hh0(0(ÐUSj\ É$؃!t S  h(#(=]ÍvUVSu] F @5%F5%jVtue[^]J e[^]ÐUX(ujh4$hhX( X(UVSu] F 5%jV@tue[^] e[^]ÐU L(uURh(h.hL(L(USjd É$؃!t Sm  hd#( ]ÍvUVSu] F $jV@tue[^]! e[^]ÐU h(uRh(hYhh(.h(UVSu] F 6%jVo;tue[^] e[^]ÐU(uTPh(hDh((UE@]ÐUE@]ÐUVSu] F 6%jV:tue[^]) e[^]ÐU塜(udQh(hMh(7(ÐUVSu] F 6%jV>tue[^]e[^]ÐU (uSRh(h_h((USj(É$؃!t SM h#(]ÍvUVSu] F 6%jV=tue[^]e[^]ÐUx(uRPh(hnhx(x(USj(É$؃!t S h#(5]ÍvU (uRh8(hh((UEU 7%P]U(u諂Ph8(h$h(J(UEU 7%P]UVSu] F B%FB%jV Atue[^]e[^]ÐU (u"jh$4$h5h(M(ÍvUUE BD]ÉU@EM p,]U(y vE PB@PH $XEp,ÐUE@,]ÐUE@(]ÐUE@|]ÐUE UB|]ÉUEU ~BB]ÉUEU ~BB]ÉUEfU tfB B ]U EP$R ju p$R ÐUUJ@1tJt Rt]UVSu] F $jV;tue[^]!e[^]ÐU (uRh(hYh(.(USj]htS!B jh{SB]ÐUVSu] F 7%jVg:tue[^]e[^]ÐU(uSOPh(hjh((UShcÉ$؃"t S h#(]ÍvUVSu] F $F`$jV>tue[^]e[^]ÐU(ujh,4$hh(Z(U EP ju PR ÉUUJp1ttt]ÉUE@`]ÐUE@d]ÐUE@h]ÐUE@l]ÐUE]ÉUE]ÉUE@x]ÐUVSu] F $jV8tue[^]e[^]ÐU(uPh(hh((UVSu] F 8%jV8tue[^]9e[^]ÐU(u MQh(hh(G(ÐUShÉ$q؃"t S h($(i]ÍvUVSu] F B%FB%jV;tue[^]ve[^]ÐU(ujh4$hh((UU1tAt7t-|t#1Ƀz@tzt Rtt]ÍvU E|R ju |R ÍvU(UM yBA@B,P<$XـEuPB hQRP8$ÉUM4D4R9v4]ÐUE4]ÉUE (}fE% fEfEmm]E}UE mU]mEÍvU塠(S@E P0 $U݂XEu8ɍݚSt S}am $S؋]ÐUUM ~AAAQAQ Q Q ]ÉUUM ~A A A Q A Q  Q  Q ]ÉUUfҋM t fAQAQ ]ÍvUU u!$u(@݂Eu1v]ÐUVSu] F 9%jV3tue[^]e[^]ÐU ((uHRh(h8h((((UShà h4$h@4$S؃#vt S hD$(5]ÍvUd(ugPhX(hhd(d(UEU PP @@$:%@(BB BB]ÍvUE@(]ÐU4(uQhX(hh4( 4(ÐUEU PP @@$:%@(BB BB]ÍvU L(ucRhX(hhL(L(UEU PP @@$h:%@(@,BB BB]USS]{$t SP C,C(]ÍvUVSu^(tx(yOvS{ tTA(uICt@jsPCSP58"jR(C$(C HA(F(e[^]ÉUE@(]ÐUUE B(]ÉU @(uRhX(hh@(2@(UVSu] F B%FB%jV5tue[^]e[^]ÐUp(ujh4$hhp(Jp(UhyUS ](C J PRQ$C$C(]ÉUVSu(V H RPQ$(F$^(yS{ tTA(uICt@jsPCSQ58"jR,(C$(C HA(F(e[^]ÉUU( H RPQ$ÉUS ](C J PRQ$C$]ÐUS]uu C PS5( C$]UE@$@P PRdUX(uwtPh8(hhX(X(UVSu] F :%jV.tue[^]e[^]ÐU塀(ulCQh(hh((ÐUSh<{É$#؃"t S) h$(]ÍvU (usRh8(hh(&(UEU SM]PPBB ;%@ @@0@4@(@,H8X%F>%jVLtue[^]e[^]ÐU,(usjh5$h4h,(,(ÍvU<(u4iQh@(hAh<(<(ÐUEPM @>%H BB BB]ÉUVSu] F =%F>%jV`tue[^]e[^]ÐUl(ujh5$hPhl(l(ÍvUVSu] F $jVk#tue[^]e[^]ÐUT(uoQh(h]hT(T(ÐUVSu] F ?%jV"tue[^]e[^]ÐU H(u7Rh(hnhH("H(UShÉ$8؃"t S hd%(E]ÍvUVSu] F ?%jV?"tue[^]Ye[^]ÐU (u+7Ph(hh (f (USh;É$U?؃"t S ht%(]ÍvU (uGgRh8(h0h((U(u6Ph(h>h((U(]ÉUVSu] F ?%jV!tue[^])e[^]ÐU(u5Ph(hTh(6(USj$É$H؃!t S h%(]]ÍvUVSu] F @@%jV/tue[^]qe[^]ÐU(u4Ph(hbh(~(US]SC @@%CC]ÍvUVSu] F @@%jVtue[^]e[^]ÐU(uLQh(hph((ÐUVSu] F @%jVGtue[^]ae[^]ÐU (u34Rh(h{h(n(USjFÉ$C @%"t S h%(]ÍvUVSu] F @@%jV_tue[^]e[^]ÐU (uRh(hh((UVSu] F @%jVtue[^]1e[^]ÐU(u3Ph(h,h(>(USj0É$X؃!t S h%(e]ÍvUVSu] F A%jV7tue[^]ye[^]ÐU(u1Ph(hQh((UM S]CtCBK$ÍvUE@]ÐUE@ ]ÐUE@(]ÐUVSu] F @A%jVtue[^]e[^]ÐU(u1Qh(hZh((ÐUSj0É$Z؃!t SQ h$&(]ÍvUVSu] F A%jVtue[^]e[^]ÐU(uwPh(hh((UE@0]ÐUE@8]ÐUE]U]ÍvUVSu] F A%jVStue[^]me[^]ÐU(u@0Qh(hh({(ÐUSj@RÉ$Z؃!t S h`&(]ÍvU(ukPh(hh((UVSu] F B%jVgtue[^]e[^]ÐU (uT/Qh(hh ( (ÐUSj8fÉ$0[؃!t S h&(]ÍvUVSu] F B%FB%jVtue[^]e[^]ÐU8(uejh5$hh8(^8(UE@]ÐUE@]ÐU EPR uu pR U EPR uu pR UVSu] F B%jVtue[^]e[^]ÐU ,(u-Rh(hh,(,(USj$É$P_؃!t S h&(-]ÍvUVSu] F `C%jVtue[^]Ae[^]ÐU(u,Ph(hh(N(UE@]ÐUE@]ÐU]ÍvU]ÍvUVSu] F $F`$jVtue[^]e[^]ÐU (ujjh5$hh(=(ÍvUE@$]ÐUE@(]ÐUM S]C,tC,B0K0$ÍvUE@,]ÐU(uPh(hh(*(UE@$]ÐUE@(]ÐUUJ,1]ÉUM S]CtCB K $ÍvUE@]ÐUE0]ÐUE4]ÐUE@@]ÐUE@D]ÐUVSu] F C%jVtue[^]e[^]ÐU`(u*Ph(hh`(*`(USj4É$Da؃!t S h'(Q]ÍvUVSu] F C%jVKtue[^]ee[^]ÐU塜(u8*Qh(hh(s(ÐUSjHJÉ$a؃!t S h$'(]ÍvU (uWZRh8(hh((UEU D%P]UVSu] F C%jVobtue[^]ee[^]ÐU(u3Ph(hh(r(UWVS]u }SvCXS\VC`SdWChSlMQe[^_]ÐUES@xHpU ݀]HpMC$ÍvUE]ÉUE]ÉUUE ]ÍvUE]ÍvUE@X]ÐUE@`]ÐUE@h]ÐUE@p]ÐUE@x]ÐUE݀]ÉUE݀]ÉUE݀]ÉUE݀]ÉUE݀]ÉUMS1ۅt^tTAXuBBB È@s*A`uBÈ@s ؉؋$UVSu] F @D%jVtue[^]-e[^]ÐU(u'Qh(hh(;(ÐUShÉ$f؃"t S h`'(]]ÍvUVSu] F $F`$jVtue[^]je[^]ÐU(u]jh5$h!h((ÍvUUJd1t Jht]ÍvUVSu] F E%jVtue[^]e[^]ÐU(u%Ph(h+h((UVS ]jtƃ ssV1y"t V] h'(e[^]ÐUVSu] F $jVtue[^]e[^]ÐU(up\Qh(h;h((ÐUVSu] F B%FB%jVtue[^]e[^]ÐU(ujh5$hh(6(UU1tt Rt]ÉU(]ÉUE]ÉUESU ۀMۀ]ۀ$ÍvUE]ÉUVSu] F E%jVtue[^]e[^]ÐU(us#Ph(hh((UShÉ$M؃"t S1 h'(]ÍvUVSu] F E%jV tue[^]e[^]ÐU$(uG"Ph(hh$($(US]S C E%C C$CCCCC(]U]ÐUE@H ]ÉU]ÐUE@H ]ÉUE@ ]ÐUVSu] F F%jV tue[^]e[^]ÐU0(u!Qh(hh0(0(ÐUSj,É$؃!t S} h'(]ÍvU<(uPhH(hh<(z<(U H(uhhH(H(UVS]S8ҋu C `%C%tB jRPC $C`$jSt]e[^]e[^]ÐU\(u$/jh5$hGh\(B\(UVSu] F F%jV tue[^]5e[^]ÐU P(u Rh(hQhP(BP(USjLÉ$萩؃!t S hP((i]ÍvUVSu] F B%FB%jVtue[^]ve[^]ÐUl(ujh5$h8hl(l(U(yvE P@EJp@ÐUHEM p@]UEp@]ÍvUE@0]ÐUM S]C0tC0B4K4$ÍvUE@8]ÐUM S]C8tC8B<K<$ÍvUMQ0tA4B4A4]ÉUUE BH]ÉUUE B(]ÉUE@(]ÐUE@H]ÐUE@,]ÐUVSu] F B%FB%jV< tue[^]e[^]ÐU(uWjh5$hh(}(ÍvUUJ(1tJt Jt]UVSu] F H%jV/tue[^]Ie[^]ÐU|(uPh(hh|(V|(USjL.É$خ؃!t S h((}]ÍvU (uSLRh@(hHh((UEPM @H%H BB BB]ÉUVSu] F B%FB%jVt tue[^]e[^]ÐU塤(ujh5$hUh((UE݀]ÉUE݀]ÉUE@(]ÐUE@T]ÐUUJ(1tJtJtt]ÉUEP PRT@@UVSu] F I%jVtue[^])e[^]ÐU(uPh(hch(6(USh É$詮؃"t S h((Y]ÍvU(uKPh8(hh((UEU SM]PPBB I%H8X<@ @@0@4@(@,BB$ÍvU]ÍvU]ÍvUE@]ÐUE@ ]ÐUE@(@0(`]ÉU(uQh(hh((ÐUEU SM]PPBB @ H8X<@@0@4@(@,I%@@@DBB$ÐU (uWRh(hh("(UEU SM]PPBB @ H8X<@@0@4@(@,I%BB$ÍvU(uPh(hh(~(UEU PPBB @ @8@<@@0@4@(@,I%BB]ÐU(uQh(hh((ÐUEU PPBB @ @8@<@@0@4@(@,`I%BB]ÐU (usRh(hh(>(UEU PPBB @ @8@<@@0@4@(@,@I%BB]ÐU(uPh(hh((UEU PPBB @ @8@<@@0@4@(@, I%BB]ÐUVSu] F J%F`J%jV6tue[^]e[^]ÐU (uwYjh5$hh (I (ÍvUU@@1]ÍvUVSu] F J%jVtue[^]!e[^]ÐU(uQh(hh(/(ÐUVS ]hH@ƃ CPsV貼#vt V h((Ae[^]ÐU<(uPh(hh<(<(UVSu] F J%jVtue[^]!e[^]ÐU0(uQh(hh0(/0(ÐUSjÉ$l؃!t S h)(U]ÍvUVSu] F K%FK%jVtue[^]be[^]ÐU l(ujh6$h+hl(l(ÍvU`(uCPh8(h8h`(6`(UE@EvUH(uLCQh8(hFhH(H(ÐUEU K%P]UVSu] F K%jV?tue[^]Ye[^]ÐUT(u,Qh(hdhT(gT(ÐUSh;É$؃"t S h)(]ÍvUVSu] F $F`$jVtue[^]e[^]ÐU|(uOjh6$hh|(2|(UEU+UWVS %}u G @L%GL%jPYXjPXZjP~ZYjWt}e[^_]e[^_]U(uCjh6$h5h(Q(ÍvUEll]UUp1t#ttxt|t]ÐUVSu] F $jVtue[^]e[^]ÐU(uSGPh(h@h((UVSu] F L%jVktue[^]e[^]ÐU塌(uXQh(hRh(蓽(ÐUVS ]hcƃjj jsZYPV_ t V h*(衽e[^]ÐU(u_?Ph8(hLh((UUSB]M @@ @@@M%BJ Z$$UE@]ÐUVSu] F N%FN%jVtue[^]*e[^]ÐU(u跛jh6$hyh((ÍvUVSuFlF `M%FN%] @ K%F| L%@ $F|`$jPYXF N%FN%jVtue[^]wve[^]ÐU(u7jh 6$hh((ÍvUUJh1tt Jdt]ÐUVSu] F $jVtue[^]e[^]ÐU (u7DRh(hh((UVSu] F N%jVOtue[^]ie[^]ÐU(u; Ph(hh(v(UVS ]hGƃjj jsY[PV6 t V hd*(腺e[^]ÐD$D$^hD$mD$zdU(uh%h((U$(u;Qh@(h%h$(臹$(ÐUEPM @P%H BB BB]ÉU(u#藘Jjh|6$h%h(蠿(ÉUVSu] @O%F`O%FO%jVvctue[^]鄿e[^]ÐU 0(ugjh6$h%h0(!0(ÍvUS]S^@O%C`O%CO%]UVSu] F Q%jVtue[^]e[^]ÐU@(u Ph(h%h@(@(USh ǾÉ$]1҃CJ!#vt Si h-( ]ÍvUVSu] F P%jVtue[^]e[^]ÐU(uQh(h%h(+(ÐUSh É$1҃CJ!#vt S衽 h-(A]ÍvUSj]h-&S jh4&S jh?&S]ÐU\(uPhh(hG(h\(^\(UVSu] F `Q%jVtue[^]e[^]ÐUP(uQh(hR(hP(P(ÐUSjLƼÉ$H؃!t Su h/(]ÍvUh(uPh(h)hh(rh(UVSu] F Q%jVtue[^]e[^]ÐUt(uQh(h*ht(t(ÐU$U(u#7Ph8(h!,h(´(UEU R%P@@ @@]ÐU塸(u6Qh8(h2,h([(ÐUEU R%P@@ @@]ÐU (uS6Rh8(h?,h((UEU R%P@@ @@]ÐU(u5Ph8(hO,h(芳(UEU R%P@@ @@]ÐU塌(u5Qh8(ha,h(#(ÐUEU pR%P@@ @@]ÐUVSu] F Q%F`R%dž  $dž$`$jPZYjVtue[^]Fe[^]ÐU塜(uԑjh6$ht,h((UUR1]ÉUVSu] F $jVtue[^]e[^]ÐU(u;Ph(h,h(α(UVSu] F R%jV7tue[^]Qe[^]ÐU(u$Qh(h,h(_(ÐUVS ]hT/ƃjj jsܳZYPV_ t Vͷ h/(me[^]ÐUVSu] F S%jV?tue[^]遷e[^]ÐU(uQh(h,h(菰(ÐUS]SC S%C]ÉUE]ÐUUBtQ@ uu rP ÍvUVSu] F `S%jVtue[^]鵶e[^]ÐU(uPh(h,h(¯(USj蚶É$؃!t SI h/(]ÍvUVSu] F S%jVtue[^]e[^]ÐU (uRh(hx-h (  (USjÉ$,C S%$-ղ"t S} h/(]ÍvUVSu] F S%jVtue[^]1e[^]ÐU(uPh(h-h(>(U$(u/Ph@(hR0h$( $(UEPM @T%H BB BB]ÉU`(u/Qh@(he0h`(蛭`(ÐUEPM @T%H BB BB]ÉUVSu] F `T%jVtue[^]e[^]ÐU T(uCRh(hw0hT(T(UEP PR ÍvUE@]ÐU1]ÐUVSu] F `T%jVtue[^]Ee[^]ÐU0(uOPhT(h0h0(R0(UVSu] F `T%jVtue[^]ղe[^]ÐU(uQhT(h0h((ÐUVSu] F U%jVKtue[^]ee[^]ÐU <(u7Rh(h0h<(r<(USjJÉ$؃!t S h40(虫]ÍvUVSu] F U%jVtue[^]魱e[^]ÐUl(uPh(h0hl(躪l(USj8蒱É$P؃!t SA hD0(]ÍvUVSu] F T%jVtue[^]e[^]ÐUH(uQh(h0hH(H(ÐUSj8ڰÉ$$؃!t S艰 hT0()]ÍvUVSu] F $F`$jVtue[^]6e[^]ÐUx(ucjh6$h4hx(ѯx(ÍvUS]StC X%CX%ǃǃ]ÉU(uH*Qh@(h4h(Ϩ(ÐUEPM @hX%H BB BB]ÉU (u)Rh@(h4h(^(UEPM @PX%H BB BB]ÉUVSu] F B%FB%jVtue[^]鞮e[^]ÐU(uاjh6$h&4h(:(US]SB@@ @@Z @@ @@C W%C@X%ǃhX%BǃPX%Z ]ÉU]ÍvU]ÍvUVSu] F B%FB%jVtue[^]ve[^]ÐU(ujh6$h.4h((ÍvUVSu] F B%FB%jVTtue[^]e[^]ÐU (uojh7$hB4h(蕬(ÍvUS]SC V%CW%]ÉUVSu] F B%FB%jVtue[^]Ve[^]ÐU((ujh7$hJ4h((((US]SxC U%C`V%]ÉU1]ÐUVSu] F 6%jVstue[^]鵫e[^]ÐU (uRh(hX4h(¤(UE@]ÐUVSu] F $F`$jVtue[^]2e[^]ÐU塘(u|jh7$he4h(Ϊ(UE@8]ÐUE@<]ÐUE@@]ÐUE@D]ÐUE@H]ÐUE@L]ÐUE@$]ÐUVSu] F Y%jVStue[^]me[^]ÐU (u?Rh(hs4h(z(USjPRÉ$l؃!t S h0(衣]ÍvUVSu] F Y%jVtue[^]鵩e[^]ÐU(uPh(h4h(¢(USh藩É$i؃"t SE h0(]ÍvUVSu] F Y%jVtue[^]e[^]ÐU8(uQh(h4h8(8(ÐUShۨÉ$A؃"t S艨 h0()]ÍvUVSu] F `Y%jV#tue[^]=e[^]ÐU (uRh(h4h(J(UShÉ$؃"t Sͧ h0(m]ÍvUVSu] F @Y%jVgtue[^]遧e[^]ÐU(uSPh(h4h(莠(USjLfÉ$t؃!t S h0(赠]ÍvUVSu] F Y%jVtue[^]ɦe[^]ÐU塨(uQh(h4h(ן(ÐUSjL讦É$\؃!t S] h0(]ÍvUVSu] F Y%jVtue[^]e[^]ÐU D(uRh(h4hD(D(USj(É$ ؃!t S襥 h0(E]ÍvUVSu] F Y%jVc)tue[^]Ye[^]ÐU\(u(Qh(h6h\(g\(ÐUE@H]ÐUE@T]ÐUE@X]ÐUE@L]ÐUE@P]ÐUVSu] F Z%jVtue[^]魤e[^]ÐU P(uRh(h6hP(躝P(USj`蒤É$؃!t SA h,1(]ÍvUVSu] F [%jVtue[^]e[^]ÐU(uWPh(h:h((UE@0]ÐUE@(]ÐUE@4]ÐUVSu] F [%jVtue[^]ae[^]ÐU塘(uXQh(h%:h(o(ÐUE@8]ÐUE@<]ÐUVSu] F [%jVtue[^]٢e[^]ÐU (uRh(h8:h((UVSu] F [%jV'tue[^]ie[^]ÐU(u_Ph(hI:h(v(UVSu] F [%jVtue[^]e[^]ÐUh(uQh(h[:hh(h(ÐUS} u?EPEPh:Epw$8軡à E\$E$S j8薡$jjjS؃ Bt S9 h1(ٚt S h1(蹚]ÍvUVSu] F [%jVtue[^]͠e[^]ÐU (uRh(hr:h(ڙ(US} SEPEPEPEPEPh:EEEEEEpjH]ÃE\$ E\$E\$E\$E$S1 jH"à jjjjjjhV@jh@@jSM؃0Bt S赟 h1(Ut S蕟 h1(5]ÍvUVSu] F `[%jV/tue[^]Ie[^]ÐU(uPh(h:h(V(USS} u- j8'à jjEp#Y$Sv j8à jjS؃@t S襞 h2(Et S腞 h2(%]ÍvUVSu] F @[%jVtue[^]9e[^]ÐUt(u Ph(h:ht(Ft(Uh:,1ÐU(u|vjh(7$h=h(芝(UE@h]ÐUVSu] F [%jV7tue[^]qe[^]ÐU (u#Rh(h=h(~(U(]ÉUE@L]ÐUVSu] F \%jVtue[^]e[^]ÐU(uPh(h=h((USjlΜÉ$؃!t S} ht2(]ÍvUVSu] F \%jVtue[^]1e[^]ÐU(uQh(h=h(?(ÐUSjPÉ$؃!t Sś h2(e]ÍvUVSu] F `]%F]%jVtue[^]re[^]ÐU((u<*jhD7$hV?h((((US u ]S)C `]%C]%]ÍvUVSu] F `]%F]%jVtue[^]Κe[^]ÐU(uGjhL7$h`?h(i(ÍvUS u ]SC \%C@]%]ÍvUVSu] F ^%jVtue[^]-e[^]ÐU(uQh(hp?h(;(ÐUSS} ~% j8 ZE@YPS؃$1 t S譙 h2(M]ÍvUVSu] F ]%jVGtue[^]ae[^]ÐU(u3Ph(h?h(n(USR} ~% j8?YXE@PSo؃$1 t S h2(聒]ÍvUD(uXQh@(hChD(ߑD(ÐUEPM @^%H BB BB]ÉU p(uRh@(hChp(np(UEPM @^%H BB BB]ÉUP(upjhX7$hChP(莗P(UE@]UE݀]ÉUE]ÉUE]ÉUEPBHRPQ ÐUE݀4]ÉUE݀]ÉUE]ÍvUE]ÍvUE]ÍvUME U]ÉUE݀ܰǀǀ$RP ÍvUM݁ـE@t '݁݁܁4ܹ4 ɋ$RP ÍvUVSu] F $jVtue[^]e[^]ÐU `(u[Rh(hCh`( `(UVSu] F ^%jVstue[^]鍕e[^]ÐU8(u_Ph(hCh8(蚎8(UShoÉ$3؃"t S h2(轎]ÍvU]ÉUE UBH$tڔÉU(uOQh(hNh((ÐUD]ÉUVS ]jH貔XZCFC4F4C8F8CÉ$P؃!t S hD4(荅]ÍvUVSu] F b%jVtue[^]顋e[^]ÐU (usRh(hPh(讄(USj膋É$d؃!t S5 hT4(Մ]ÍvUVSu] F b%jVtue[^]e[^]ÐU@(uPh(hPh@(@(USjΊÉ$l؃!t S} hd4(]ÍvUh(uPh@(hRhh(zh(UEPM @Pg%H BB BB]ÉUVSu] F f%F@g%jV tue[^]麉e[^]ÐU ((uGbjh7$hSh((U((ÍvUE8]ÐUSSUZp{u(xH RPQ$C]ÐUMpM{vUVSu] F f%F@g%jVLtue[^]e[^]ÐU塀(ujh7$hSh(肈(UVSu] F f%F@g%jVԐtue[^]ne[^]ÐU(ujh7$h(Sh( (ÍvUVSu] F f%F@g%jVXtue[^]e[^]ÐU (u#jh7$h=Sh(荇(ÍvUVSu] F f%F@g%jV܏tue[^]ve[^]ÐU (ujh7$hVSh ( (UVSu] F c%F d%jVdtue[^]e[^]ÐUX(u_jh7$hnShX(虆X(ÍvU塸(uLQh@(h{Sh((ÐUEPM @pc%H BB BB]ÉUVSu] F c%F d%jVxtue[^]e[^]ÐU8(ujh7$hSh8(譅8(ÍvUVSu] F $F`$jVtue[^]閅e[^]ÐU (ujh7$hSh(1(ÍvU(]ÉUVSu] F @h%jVtue[^]e[^]ÐU(uPh(hSh("~(UShÉ$؃"t S襄 h5(E~]ÍvUVSu] F h%jV?tue[^]Ye[^]ÐU塠(u,Qh(hSh(g}(ÐUSh;É$q؃"t S h5(}]ÍvUVSu] F h%jV胹tue[^]靃e[^]ÐU (uoRh(hSh(|(UShÉ$1؃"t S- h 5(|]ÍvUVSu] F g%jVǸtue[^]e[^]ÐUt(uPh(hSht({t(UShÂÉ$؃"t Sq h05(|]ÍvUVSu] F g%jV tue[^]%e[^]ÐU(uQh(h Th(3{(ÐUSjX É$؃!t S蹁 h@5(Y{]ÍvUVSu] F g%jVStue[^]me[^]ÐU (u?Rh(hTh(zz(UShOÉ$؃"t S hP5(z]ÍvUVSu] F g%jV藶tue[^]鱀e[^]ÐU(uPh(h0Th(y(USj$薀É$؃!t SE h`5(y]ÍvU H(uRh@(hVhH(ByH(UEPM @i%H BB BB]ÉUd(uKPh@(h,Vhd(xd(UEPM @h%H BB BB]ÉUVSu] F `h%Fh%jVxtue[^]e[^]ÐU p(uWjh8$h;Vhp(~p(ÍvU EDR uu DR ÉUVSu] F $jV[tue[^]u~e[^]ÐU(uPh(hLVh(w(UVSu] F i%jVtue[^]~e[^]ÐUX(uQh(h^VhX(wX(ÐUSh }É$؃"t S} h5(5w]ÍvU(uwPh(ho[h(v(U(uQh@(hy[h(_v(ÐUEPM @(j%H BB BB]ÉU (ugRh@(h[h(u(UEPM @j%H BB BB]ÉUVSu] F `h%Fh%jV蔄tue[^].|e[^]ÐU塰(ujh 8$h[h({(U (u Rh(h[h(u(UVSu] F `j%jVotue[^]{e[^]ÐU(u[Ph(h[h(t(UShk{É$؃"t S{ h5(t]ÍvU (uRh@(h^h(t(UUSBM@@ @@A@@] R( ^B(k%Z J$Z0$ÉU(uPh@(h^h(s(UUVSB]uM @@ @@Bk%J Z$r([^]ÉUWVS u^(ۋ} k%tp(yn}S{ tTA(uICt@jsPCSQ58"jRx(C$(C HA(tue[^_]Tye[^_]UVSu] F `h%Fh%jVxtue[^]ye[^]ÐU(ujh(8$h^h(x(UVSu] F `k%jV臮tue[^]xe[^]ÐU (usRh(h^h(q(USh xÉ$؃"t S1x h5(q]ÍvU(uQh@(h:`h(/q(ÐUEPM @@l%H BB BB]ÉU @(u7Rh@(hG`h@(p@(UEPM @(l%H BB BB]ÉU (uPh@(hV`h (Np (UEPM @l%H BB BB]ÉUVSu] F k%Fl%jV~tue[^]ve[^]ÐU $(uOjh08$hg`h$()v$(ÍvUVSu] F `l%jVtue[^]ve[^]ÐU4(uPh(hr`h4(&o4(USh<uÉ$}5؃"t Su h06(Io]ÍvUVSu] F l%Fm%jV}tue[^]Vue[^]ÐUX(uMjh88$hbahX(tX(U ER uu R ÉUVSu] F m%jV裪tue[^]te[^]ÐU L(u菿Rh(hrahL(mL(UShtÉ$ A؃"t SMt hl6(m]ÍvUx(uPh@(hbhx(Jmx(UEPM @m%H BB BB]ÉU塄(uTQh@(hbh(l(ÐUEPM @m%H BB BB]ÉUVSu] F @m%Fm%jV{tue[^]se[^]ÐUh(uKjh@8$hbhh(rh(ÍvU ER uu R ÉUVSu] F n%jVctue[^]}re[^]ÐU塐(uPQh(hbh(k(ÐUSh_rÉ$eT؃"t S r h6(k]ÍvU(uPh(hch( k(U塨(uhLch(j(ÐUE@ 0n%@@]ÐU(uQh@(h_eh(j(ÐUEPM @n%H BB BB]ÉU (uRh@(hoeh(j(UEPM @n%H BB BB]ÉUVSu] F @n%Fn%jVxtue[^]Vpe[^]ÐU(uHjhH8$heh(o(UVSu] F $jV˥tue[^]oe[^]ÐU (uCRh(heh(h(UVSu] F $jV[tue[^]uoe[^]ÐU(uPh(heh(h(UVSu] F o%jVtue[^]oe[^]ÐU(uعQh(heh(h(ÐUShnÉ$5o؃"t Sn h6(5h]ÍvU (u Ph@(hhh (g (UEPM @0p%H BB BB]ÉUVSu] F o%F p%jV8vtue[^]me[^]ÐU (u_FjhP8$hhh(mm(ÍvUVSu] F `p%jVCtue[^]]me[^]ÐU(u/Ph(hhh(jf(UShH?mÉ$詁؃"t Sl h 7(f]ÍvU8(uLQh8(hPih8(e8(ÐUEU p%P@@ @@]ÐUUE B ]ÉUUE B$]ÉU P(uRh8(hiihP(beP(UEPM p%HBB BB]ÐUVSu] F p%jVotue[^]ke[^]ÐUD(uPh(hihD(dD(UWVS(E]u}]E ]SԜC p%s{s{E[ E E[(C0C@CDCHCLCPCTCXCC\ChCpC4C8e[^_]ÍvUE@]ÐUE@]ÐUE@ ]ÐUE@(]ÐUME UQA]UE@u ]ÉUE@u ]ÉUE@u ]ÉUE@4]ÐUE@ ]ÐUE@(]ÐUE@@]ÐUE@`]ÐUE@d]ÐUEX]ÐUEh]ÐUEP]ÐUEp]ÐUEL]ÐUEH]ÐUED]ÐUE@l]ÐUE\]ÐUE@HE XH]ÍvUE@LE XL]ÍvUVSu] F q%jV/tue[^]Iie[^]ÐU,(uPh(hih,(Vb,(UWVS} Eph(E$tiǃ jUjr_ jjE]p^ ]jUjE؉֋Ur^uuVS$uW >hi5(m,1"t WAh h<7(ae[^_]UVSu] F @q%Fq%jVTptue[^]ge[^]ÐUl(u{@jhX8$hjhl(gl(ÍvUVSu] F $jV_tue[^]yge[^]ÐU`(uQh(h$jh`(``(ÐUVSu] F q%jVtue[^] ge[^]ÐU |(u۱Rh(h6jh|(`|(USjXfÉ$Н؃!t Sf hx7(=`]ÍvD$bD$ZD$麡D$鶦D$颣D$麣D$D$銫D$"UVS]u C(@r%@ `r%@@s%t@ $@$jP%nt]e[^]eve[^]ÐU (uSMjh`8$hkh(Ye(ÍvUVSu] F `s%jV/tue[^]Iee[^]ÐU(uPh(h$kh(V^(UWVSh)eY[jS11t;t Sd!t Sd h7(U^e[^_]ÁD$CvD$ӾvD$˲vD$飷vD$gvUVSu] @ s%@s%t@ $@`$jPTtue[^]ce[^]ÐU (ujhh8$hlh(c(ÍvUVSu] F t%jVktue[^]ce[^]ÐU(uWPh(hlh(\(UWVSh`ecY[jS11t;t Sc!t Sb h7(\e[^_]UVSu] F t%jV苘tue[^]be[^]ÐU(uwPh(hmh([(USh`bZYÍh&mPYXjS*@ @t%@t%Q@ $@`$jPI$7([t Sa h7([\v]ÍvD$#vD$vD$vUVSu] @ s%@s%t@ $@`$jP蠛tue[^]Fae[^]ÐU(u8jhp8$h+mh(`(UE@4E/UU@4E/UVSu] F $F$jVitue[^]`e[^]ÐU(u4Hjhx8$humh(:`(UVSu] F u%jVtue[^]-`e[^]ÐU (uRh(hmh(:Y(UShu`É$M؃"t S_ h(8(]Y]ÍvUVSu] F $F`%jVgtue[^]j_e[^]ÐU(uPjh8$hxnh(_(UVSu] F v%jVߔtue[^]^e[^]ÐU (u˩Rh(hnh(X(USh^É$؃"t S^ hd8()X]ÍvUVSu] F S%jVtue[^]=^e[^]ÐU (uPht(hoh (JW (UE@\]ÐUVSu] F w%jV觓tue[^]]e[^]ÐU(u蔨Qh(h*oh(V(ÐUSj|]É$4؃!t SU] h8(V]ÍvUVSu] F $jVtue[^] ]e[^]ÐU ,(ugRh(h[oh,(V,(UVSu] F $F $jVtue[^]\e[^]ÐUL(ujh8$huhL(-\L(ÍvUU E]ÍvUVSu] F w%jVtue[^] \e[^]ÐU<(uQh(huh<(U<(ÐUS ht]SGC w%]USh4[É$Y؃"t Sy[ h8(U]ÍvUVSu] F $jVtue[^]-[e[^]ÐU \(uRh(h8uh\(:T\(UVSu] F `x%Fx%jVctue[^]Ze[^]ÐUx(uC3jh8$h+yhx(QZx(ÍvUE@`]ÐUE@\]ÐUVSu] F $jV tue[^]%Ze[^]ÐU塈(uQh(h5yh(3S(ÐUVSu] F y%jV蛏tue[^]Ye[^]ÐU h(u臤Rh(hFyhh(Rh(UShX YÉ$؃"t SEY h8(R]ÍvU(uPhH(hzh(BR(US]SC `y%CC C$]Uz]ÉUVS u] j XAF$AAt V$ABF$N$Ae[^]ÍvUVSu] F y%jVtue[^]5Xe[^]ÐU塔(uQh(hzh(CQ(ÐUSj(XÉ$؃!t SW h8(iQ]ÍvUVSu] F @{%jV;tue[^]}We[^]ÐUH(uߡPh(hY|hH(PH(UE@]ÐUE UB1]U1]ÐUVSu] F @{%jV览tue[^]Ve[^]ÐU<(uXQhH(hi|h<(O<(ÐUS]SHC {%]ÐU|]ÉUVSu] F @{%jV tue[^]MVe[^]ÐU (uRhH(h}|h(ZO(US]SC z%]ÐU|]ÉUVSu] F @{%jVotue[^]Ue[^]ÐU(uPhH(h|h(N(US]SC z%]ÐU|]ÉUVSu] F @{%jVӆtue[^]Ue[^]ÐU0(uQhH(h|h0(#N0(ÐUS]StC @z%]ÐU|]ÉUVSu] F @{%jV7tue[^]yTe[^]ÐU (uRhH(h|h(M(US]SC z%]ÐU|]ÉUVSu] F @{%jV蛅tue[^]Se[^]ÐU$(uKPhH(h|h$(L$(US]S<C y%]ÐU}]ÉUVSu] F @|%jV'tue[^]ASe[^]ÐU(uQh(h}h(OL(ÐUSj&SÉ$؃!t SR h09(uL]ÍvUVSu] F |%jVotue[^]Re[^]ÐU (u[Rh(h}h(K(USjnRÉ$؃!t SR h@9(K]ÍvUVSu] F |%jV跇tue[^]Qe[^]ÐU(u補Ph(h3}h(J(USjQÉ$l؃!t SeQ hP9(K]ÍvUVSu] F {%jVtue[^]Qe[^]ÐU(uQh(hM}h('J(ÐUSjPÉ$P؃!t SP h`9(MJ]ÍvUVSu] F {%jVGtue[^]aPe[^]ÐU (u3Rh(hf}h(nI(USjFPÉ$4؃!t SO hp9(I]ÍvUVSu] F {%jV菅tue[^]Oe[^]ÐU (u{Ph(h}h (H (USjOÉ$؃!t S=O h9(H]ÍvUVSu] F {%jVׄtue[^]Ne[^]ÐU(uęQh(h}h(G(ÐUSjNÉ$؃!t SN h9(%H]ÍvUT(ujh8$h~hT(NT(US]SLC `|%8$@ C|%$7KC4#vjS h9(GHv]ÍvUVS]C4u C `|%C|%t P[LjSt]e[^]Mve[^]ÐU UB4H uu B40Q UVSu] F |%jV tue[^]%Me[^]ÐU d(uRh(h~hd(2Fd(USj8 MÉ$؃!t SL h9(YF]ÍvUVSu] F }%jVStue[^]mLe[^]ÐU p(u?Rh(h~hp(zEp(US h~]S见C }%C C$C(8$]ÐUh~h(w1U8$]ÉUE@]ÐUE@]ÐUE@]ÐUE@]ÐUEU @(]ÍvUEU @$]ÍvUE@ ]ÐUE@,]ÐUVSu] F $jV tue[^]%Ke[^]ÐU |(uRh(hh|(2D|(UVSu] F `}%F}%jVtue[^]Je[^]ÐU塘(u$jh8$hh(JJ(US]SC `}%C}%C4C8]UVSu] F }%jVtue[^] Je[^]ÐU (u۔Rh(hǀh(C(USjt]ÐUWVS,u B]}tv9Hr‹B@ u9ʉU؉MtB9s ,[^_]UWVSLE Kɋ}t!u;QtIvI uu؉]tmU @9ÉEu uSQERPEi;uC9Xu C E1vPt‹B uP;Bu ЋR;BtuU؋9Bs! VSQEu P_EGGe[^_]UWVS EP;Pt:tBAUBEA+E WPu )QI=U E)ʉt E vEu]v S<u S`s h@~%=~%u V$@~%~% ~%h@~%wB]U ES] )S}QW`<;փtMEXrR+] Su V4AB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9u::X h@~%r6~%~%$@~%~%;E t W:e[^_]ÉUWVSE PU}EUEMvʋGv" SI4u Smbs h@~%5~%u V$@~%~% ~%h@~%#:1҉G+EE4QVSWWBȉBZ FWB FBȉBG Ge U GGe[^_]à h@~%9$@;(;3v u5 h`;( 3 hP;(3v5E7GtT=v V<8AB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9u#e[^]ÐU (u[jh8$hh("(ÍvUUE ]ÍvUE ـÈ@ErEu ]UVSu] F %jV_Xtue[^]y"e[^]ÐU(uKmPh(hh((UWVS|} u) hP"à hhSKjEpxS?#^_hěS""Y[hěj"ƃu- hƛ$!à hWSi h!à VWSi؃cvt Si! h|>( t SI! h>(t S)! h>(e[^_]UVSu] F %jVVtue[^] e[^]ÐU(ukPh(hh((USh É$ R C $C\?CCCCCC C$C(C,C0C4C8C<C@CDCHCLCPCTCXS`CdChC|PhٛS` C PhߛS` C$PhSc C,PhSc C4PhSc C(5C $jSN$>(C $jSM$>(C $jSM$>(t S h>(vv]ÍvUVSu] F $jVMtue[^]e[^]ÐU(uePhD(hh((U(uPh@(h<h((U (u Qh (hLh (g (ÐU (uheh (z (UVSu] F $F`$jVUtue[^]e[^]ÐUD(uxjh8$hhD(QD(ÍvU,(uQh@(hh,(,(ÐUE@ E EԘUVSu] F %jVOtue[^]e[^]ÐU 8(udRh(h4h8(8(USQ} u h`$0 hXZEpS؃ t S] hH@(]ÍvUVSu] F %F%jVp!tue[^] e[^]ÐUx(ujh8$hhhx(x(ÍvU`(uXQh@(hxh`(`(ÐUEPM @%@ H$BB BB]ÍvUVSu] F $jVNtue[^]e[^]ÐU l(u{Rh(hhl(*l(UVSu] F %jVMtue[^]e[^]ÐUT(ubPh(hhT(T(UShÉ$葛؃"t S= htA(]ÍvUVSu] F `C%jVHtue[^]e[^]ÐU (u4Rh(hh((US]S(HCCC %]ÍvUVSu] F `C%jVHtue[^]Qe[^]ÐU(u3Ph(h"h(^(US]SGCCC `%]ÍvUVSu] F `C%jVoGtue[^]e[^]ÐU塤(u\3Qh(h/h((ÐUS]SFCCC %C]UVSu] F %jVJtue[^] e[^]ÐU(u_Ph(hLh((USjÉ$؃!t S hA(A]ÍvUVSu] F %jV;Jtue[^]Ue[^]ÐU塌(u(_Qh(h[h(c (ÐUSj:É$؃!t S hA( ]ÍvUVSu] F %jVItue[^]e[^]ÐU (uo^Rh(hmh( (USjÉ$؃!t S1 hA( ]ÍvU(u]Qh(h h(/ (ÐUE@]ÐUE@]ÐUE@]ÐUUE B]ÉUE@]ÐUUE B]ÉUE EPUEE(}fE% fEfEmm]EÍvUVSu] F @%jVtue[^] e[^]ÐU (uRh(hh( (US]SC @%]ÐUVSu] F %jV_Gtue[^]ye[^]ÐU(uK\Ph(h0h( (USj ^É$؃!t S  hA( ]ÍvUVSu] F %jVFtue[^]e[^]ÐU(u[Qh(hAh( (ÐUSj É$؃!t SU hA( ]ÍvU(uZQh(hWh(S (ÐUS]S|AC %CCCC]ÐUVS]Cu C %t PZjSDAt]e[^]e[^]ÐUVSu] F @%jV/Etue[^]Ie[^]ÐU (uZRh(hbh(V(USj .É$؃!t S hB(}]ÍvUWVS,u B]}tv9H|‹B@ u9ʉU؉MtB9} ,[^_]UWVS }09t8 6h@~% ~%~%$@~%~%59uȉ@e[^_]ÍvUWVSt h@~% ~%= ~%$@~% ~%jUJM ];e[^_]ÐUWVS,u B]}tv9H|‹B@ u9ʉU؉MtB9} ,[^_]UWVSLE Kɋ}t!u;QtIvI uu؉]tmU @9ÉEu uSQERP>Ei;uC9Xu C E1vPt‹B uP;Bu ЋR;BtuU؋9B}! VSQEu PEGGe[^_]UWVS } t|w uGw$\_$@~%~%~%$@~%~%$@~% ~%= ~%$@~% ~%sue[^_]UWVS] 9]UU؋EMȋ0T9ʉPtZ;PtZPLTE؋]]{TU؋M9ʉtT;Lu T;Pu*UxRMQu]ESxw 3fjPTPXRuhXB Ee[^_]UWVS<}M9tVE]3C 0F]h@~%R~%~%$@~%~%u؋M9uEEe[^_]UWVS|UE ;]t}u B9 ]h@~%~%u j$@~% ~%h@~%~%YGEwE h@~%o~%u j茳$@~% ~%h@~%~%[]ȋUfjPRMQ]V ExU 9Eu ExU;Px |h@~%~%u j޲$@~%v ~%h@~%~%AG|wx h@~%Q~%u jn$@~%v ~%h@~%~%[]xfjPRMQ]V Ex U U;P ux EGGG U X@9lj"E8‰JA9A t 8J 9u>AB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uuPV1fjWSVu U}zU 9EuEx;U;P1x) h@~%ރ ~%u j $@~%|v ~%h@~% ~%|u||BCBx h@~%{~%u j蘬$@~% ~%h@~%~%x[E]>uPVfjWSVx U|z U U;P ux EGGG U X@9lj5E8'JA9A t 8J 9u>AB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uAB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uAB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uAB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uAB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uAB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9uAB AtPBA;u vB;PuHvH QJRJA BA tPBA;u vB;P uH vHQ t8uvJ9utestint%dtestdouble%6eseedSetting random number seed to known bad value.next-random%udefaultrawpredefheuristicnormal%glognormal%10d default: predef source %2d: heuristic seeds should be different from each other and on each run. heuristic source %2d: RNG3RNG8RNGClassvalue%6euse-rngno such RNG %smin_max_avg_shape_std_val_cov_minCDF_maxCDF_interpolation_maxEntry_loadCDF%s loadCDF %s: invalid filer%lf %*f %lfRandomVariable/UniformRandomVariable/ExponentialRandomVariable/ParetoRandomVariable/ParetoIIRandomVariable/NormalRandomVariable/LogNormalRandomVariable/ConstantRandomVariable/HyperExponentialRandomVariable/Empirical14RandomVariable21UniformRandomVariable25ExponentialRandomVariable20ParetoRandomVariable22ParetoIIRandomVariable20NormalRandomVariable23LogNormalRandomVariable22ConstantRandomVariable30HyperExponentialRandomVariable23EmpiricalRandomVariable26UniformRandomVariableClass30ExponentialRandomVariableClass25ParetoRandomVariableClass27ParetoIIRandomVariableClass25NormalRandomVariableClass28LogNormalRandomVariableClass27ConstantRandomVariableClass35HyperExponentialRandomVariableClass28EmpiricalRandomVariableClass%qd%sns-add64 requires two arguments.%u%dns-versionns-randomtime_atofns-add6412Add64Command13RandomCommand14VersionCommand15TimeAtofCommand%gMbP?ư>& .>-q=Attempting to cancel timer at %p which is not scheduled Couldn't schedule timer12TimerHandler7HandlerScheduler: Event UID not valid! warning: ns Scheduler::schedule: scheduling event with negative delay (%f) at time %f. Scheduler: UID space exhausted! ns: scheduler going backwards in time from %f to %f. runnow%.17gresumehaltclearMemTraceSim.%s: utime/stime: %ld %ld stack/heap: %ld %ld is-running%ddumpqScheduler: dumpq only allowed while halted 0atcancelat-now%qdcan't schedule command in pastContents of scheduler queue (events) [cur time: %f]--- t:%f uid: handler: %p A????ư>@Amaxslop_ư>RealTimeScheduler: warning: slop %f exceeded limit %f [now:%f, clock_:%f] RTScheduler: wait problem ?*Scheduler/ListScheduler/HeapScheduler/CalendarScheduler/RealTime9Scheduler13ListScheduler13HeapScheduler17CalendarScheduler9AtHandler17RealTimeScheduler7Handler18ListSchedulerClass18HeapSchedulerClass22CalendarSchedulerClass22RealTimeSchedulerClassdebug_reset?*8NsObject7Handler%s set hdrlen_ %doffset%s set offset_(%s) %dWarning: cannot set offset_ for %s%d?*tcpudpcbraudiovideoackstartstopprunegraftgraftAckjoinassertmessagertcprtprtProtoDVCtrMcast_EncapCtrMcast_DecapSRMsa_reqsa_acceptsa_confsa_teardownlivesa_rejecttelnetftpparetoexphttpInvalhttpencapmftpARPMACTORADSRAODVIMEPrap_datarap_acktcpFriendtcpFriendCtlpingdiffusionrtProtoLSLDPgafrapushbackundefinedPacketHeader/CommonPacketHeader/FlagsPacketHeaderManager17PacketHeaderClass17CommonHeaderClass16FlagsHeaderClass24PacketHeaderManagerClassptype_size_uid_error_hdrlen_19PacketHeaderManager?*PacketHeader/IP13IPHeaderClasssrc_dst_ttl_fid_prio_computehier-computehier-printhier-print-routeresetinsertnegative node numberhlevel-issend-hlevel: # hierarchy levels should be non-zerosend-num-of-domainssend-num-of-domains: # domains should be larger than 1send-num-of-clusterssend-num-of-clusters: # of clusters %d != domain (%d) + 1 send-num-of-nodessend-hlastdata: # args do not matchhier-insertRequired Hier_data not senthier-resethier-lookuplookup%droutes not yet computednode out of rangeroutes not yet computed node out of range negative src node numbernegative dst domain numberRoutes not computed-1@.%d.%d.%d@ADJ MATRIX[%d] for cluster %d.%d : %d %d ~ ROUTE_TABLE[%d] for cluster %d.%d : RouteLogicRouteLogic/Algorithmic10RouteLogic15RouteLogicClass19RouteLogicAlgoClass14RouteLogicAlgo%s lookup %s %stargetdrop-target%sisDynamicno such object %sno object %s?*Connector9Connector14ConnectorClasstick?*TTLCheckerTTLChecker/Session17SessionTTLCheckerttl exceeded 15TTLCheckerClass22SessionTTLCheckerClass10TTLCheckerwarning%s: TTL must be positive (specified = %d) src_dst_callback_show_tcphdr_detachflushannotateattachtrace: can't attach %s for writingnamattachntrace%sv %.15g eval {set sim_annotation {%s}}v -t %.17g sim_annotation %g %s.A?NULLSRM_DATASRM_SESSSRM_RQSTSRM_REPRnullSRMcbrudp%c %.15g %d %d %s %d %s %d %s.%s %s.%s %d %d%c %.15g %d %d %s %d %s %d %s.%s %s.%s %d %d %d 0x%x %d %d%c -t %.15g -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}.A?%c t%.15g a%s n%s v%s.A?%s handle { %s }?*TraceTrace/Deque5Trace10DequeTrace10TraceClass15DequeTraceClass?*TraceIpTraceIp/Mac7TraceIp10TraceIpMacmask_shift_12TraceIpClass15TraceIpMacClassoffset_shift_mask_%s no-slot %lddefaulttargetalloc-port%uclearinstallNextClassifier::installNext attempt to install non-object %s into classifierslot%sClassifier: no object at slot %dfindslot-1install?*Classifier10Classifier15ClassifierClassreserve-port%s no-slot %dbcast-receiver?*Classifier/AddrClassifier/Addr/ReserveClassifier/Hash/Dest/Bcast17AddressClassifier24ReserveAddressClassifier22BcastAddressClassifier22AddressClassifierClass29ReserveAddressClassifierClass27BcastAddressClassifierClassset-hashlookup%sset-flowrate%u set target_rate_ %s%u set bucket_depth_ %s%u set tbucket_ %s%s set-rate %u %u %u %u %s %s %sdel-hash%uDestHashClassifier::set_hash from within DestHashClassifier::do_install returned value < 0install?*Classifier/Hash/SrcDestClassifier/Hash/FidClassifier/Hash/DestClassifier/Hash/SrcDestFid14HashClassifier18DestHashClassifierdefault_%s unknown-flow %u %u %u26SrcDestHashClassifierClass22FidHashClassifierClass23DestHashClassifierClass29SrcDestFidHashClassifierClass24SrcDestFidHashClassifier21SrcDestHashClassifier17FidHashClassifier?*Classifier/Virtual22VirtualClassifierClass17VirtualClassifier[Simulator instance] get-routelogic%s find %dnodeaddrx%s new-group %ld %ld %d cache-miss%s new-group %ld %ld %d wrong-iifset-hashchange-ifacelookup%slookup-iface%dclearAll?*Classifier/Multicast15MCastClassifier20MCastClassifierClassx%s new-group %ld %ld %d cache-miss%s new-group %ld %ld %d wrong-iif[%s set node_] id%d%s check-rpf-link %d %dError: Mcast info does not exist %s match-BST-iif %d %d%s info class%s%s upstream-link %d%s %d?*Classifier/Multicast/BST18MCastBSTClassifier23MCastBSTClassifierClassClassifier/MultiPath14MultiPathClass18MultiPathForwarderignore_direction_%s drop %ld %ld %dslots%s %s?*Classifier/Replicator10Replicator15ReplicatorClass?*Classifier/Mac13MacClassifierbcast_18MacClassifierClassreserve-port?*Classifier/PortClassifier/Port/Reserve14PortClassifier21ReservePortClassifier19PortClassifierClass26ReservePortClassifierClass?*Classifier/SR12SRClassifier17SRClassifierClassresetreset donetargetno such target %s The target is successfully setinstall_slotSRAgent: %s lookup of %s failed install_connection The connection id is not in routing tabel ?*Agent/SRAgent7SRAgent12SRAgentClass?*PacketHeader/Src_rt13SRHeaderClass?*PacketHeader/UMP14UmpHeaderClassstart[%s info class] info instprocs %s recv resume stopagent%sattach-agentno such agent %ssend%s recv %d%s resume?*Application11Application16ApplicationClassinterval_?*Application/Telnet14TelnetAppTimer9TelnetApp14TelnetAppClassoops, bug in tcplib_telnet_interarrival, pos = %d @?*12TrafficTimer16TrafficGeneratorfilenamecould not stat %s bad file size in %s rcan't open file %s read failed ?attach-tracefileno such node %s.A?*TracefileApplication/Traffic/Trace9TraceFile12TrafficTrace14TraceFileClass17TrafficTraceClassuse-rngno such RNG %sburst_time_idle_time_rate_shape_packetSize_???*Application/Traffic/Pareto11POO_Traffic15POOTrafficClassuse-rngburst_time_idle_time_rate_packetSize_?NEW_BURST?*Application/Traffic/Exponential13EXPOO_Traffic15EXPTrafficClassrate_random_packetSize_maxpkts_?*Application/Traffic/CBR11CBR_Traffic15CBRTrafficClassrate_bucket_qlen_ERROR in tbf ?*TBF9TBF_Timer3TBF8TBFClass?*PacketHeader/Resv15ResvHeaderClassrate_bucket_decision_rate_bucket_packetSize_targetno such object %sctrl-targetstoponidleattach-trafficno such node %sstartstop%s sched-stop %d%s %s@@Error: SA_Agent size = 0 ?*Agent/SA8SA_Timer8SA_Agent13SA_AgentClass?*Agent/SAack11SAack_Agent10SAackClass?*MeasureMod10MeasureMod15MeasureModClassperiod_src_dst_"Estimated Util.""Measured Util."load-est%.3flink-utlznattachEstimator: trace: can't attach %s for writingsetbufEstimator: unknown trace var %s f -t %g -s %d -a %s:%d-%d -T v -n %s -v %g -o %g15Estimator_Timer9Estimatorbandwidth_backoff_src_dst_dobump_startattach-measmodno measuremod foundattach-estno estmod foundattachADC: trace: can't attach %s for writingsetbuf3ADCutilization_MSACADC/MSADC/MSPK6MS_ADC11MS_ADCClass13MSPK_ADCClass8MSPK_ADCEst/TimeWindow14TimeWindow_EstT_19TimeWindow_EstClasss_ACTOADC/ACTO8ACTO_ADC13ACTO_ADCClassEst/PointSample15PointSample_Est20PointSample_EstClasssrc_dst_"Admitted Flows"MediumBlueredl -t %g -s %d -d %d -S COLOR -c %s]]]attach-adcno such node %sattachSALink: trace: can't attach %s for writingadd-tracea -t * -n %s:%d-%d -s %dRan out of pending space SALink: unknown trace var %s f -t %g -s %d -a %s:%d-%d -T v -n %s -v %d -o %d?*SALink6SALink11SALinkClasss_ACTP?ADC/ACTP8ACTP_ADC13ACTP_ADCClassepsilon_HB?ADC/HB6HB_ADC11HB_ADCClassEst/ExpAvg10ExpAvg_Estw_15ExpAvg_EstClassutilization_PBAC"Reserved Rate"PBAC: unknown trace var %s f -t %g -s %d -a %s:%d-%d -T v -n %s -v %g -o %gADC/Param9Param_ADC14Param_ADCClassEst/Null8Null_Est13Null_EstClass%s print-delay-stats %f %f %f@@?*12AdaptiveRcvrLate-Pkts?*Agent/VatRcvr7VatRcvr12VatRcvrClass?*Agent/ConsRcvr8ConsRcvr13ConsRcvrClassagent_addr_agent_port_dst_addr_dst_port_fid_prio_flags_ttl_class_delete-agent-traceshow-monitorcloselistendump-namtracedvarsattachtrace: can't attach %s for writingadd-agent-traceagent %s: no trace file attachedconnectsendset_pkttypesendmsgsendtotracevartracef -t %.17f -s %d -d %d -n %s -a %s -o %s -T v -xa -t %.17f -s %d -d %d -n %s -x[Simulator instance] is-startedf -t %.17f -s %d -d %d -n %s -a %s -v %s -o %s -T vf -t %.17f -s %d -d %d -n %s -a %s -v %s -T vv -t %.17f -e monitor_agent %d %sa -t %.17f -s %d -d %d -n %sAgent::sendmsg(int, AppData*, const char*) not implemented Off hdr_nv %d, ip_hdr %d myaddr %ld Node Object %p ?*Agent7AppData10PacketData5Agent10AgentClasspacketSize_%s recv {%s}sendmessage too big?*PacketHeader/MessageAgent/Message12MessageAgent18MessageHeaderClass12MessageClasspacketSize_Error: UDP size = 0 Error: sendmsg() for UDP should not be -1 NEW_BURST@@?*Agent/UDP8UdpAgent13UdpAgentClass%s adapt-timer %d %d %d%s sample-size %d%s new-source %denterlocalsrcsrcid_?*RTPSourceSession/RTP9RTPSource10RTPSession14RTPSourceClass15RTPSessionClassseqno_interval_packetSize_maxpkts_random_Error: RTPAgent size = 0 %s donerate-changestartstopsessionadvanceadvanceby?*PacketHeader/RTPAgent/RTP8RTPTimer8RTPAgent14RTPHeaderClass13RTPAgentClassinterval_random_seqno_%s rtcp_timeoutstartstopbyesession?*Agent/RTCP10RTCP_Timer9RTCPAgent14RTCPAgentClassS_R_state_rttShift_keyShift_key_maxrtt_%s handle {%s}ignoreR_packetSize_ns: ivs rcvr: seq number went backward @?.@Y@@*@@.@?%s respond %.17g %d%s solicit-rtt %.17g %dsendmessage too big?*PacketHeader/IVSAgent/IVS/SourceAgent/IVS/Receiver9IvsSource11IvsReceiver.@?14IvsHeaderClass14IvsSourceClass16IvsReceiverClasswindow_windowInit_windowInitOption_syn_windowOption_windowConstant_windowThresh_delay_growth_overhead_tcpTick_ecn_old_ecn_eln_eln_rxmit_thresh_packetSize_tcpip_base_hdr_size_bugFix_slow_start_restart_restart_bugfix_timestamps_maxburst_maxcwnd_numdupacks_maxrto_minrto_srtt_init_rttvar_init_rtxcur_init_T_SRTT_BITST_RTTVAR_BITSrttvar_exp_awnd_decrease_num_increase_num_k_parameter_l_parameter_to_inference_rl_owd_opt_thr_perc_sowd_param_trace_all_oneline_nam_tracevar_QOption_EnblRTTCtr_control_increase_noFastRetrans_precisionReduce_oldCode_timerfix_t_seqno_rtt_srtt_rttvar_backoff_dupacks_seqno_ack_cwnd_ssthresh_maxseq_ndatapack_ndatabytes_nackpack_nrexmit_nrexmitpack_nrexmitbytes_singledup_time: %-8.5f saddr: %-2d sport: %-2d daddr: %-2d dport: %-2d maxseq: %-4d hiack: %-4d seqno: %-4d cwnd: %-6.3f ssthresh: %-3d dupacks: %-2d rtt: %-6.3f srtt: %-6.3f rttvar: %-6.3f bkoff: %-d?%-8.5f %-2d %-2d %-2d %-2d %s %-6.3f%-8.5f %-2d %-2d %-2d %-2d %s %d???TcpAgent: negative RTO! (%f) ???Y@advanceadvancebyeventtracepersist illegal window option %d ?@@h㈵>?9v??@333333? r?H### $t$$0%t%@(''SLOW_START?@?Wrong number of wnd_init_option_ %d @@@FAST_RETXTIMEOUT%s donethe TcpAgent::closecwnd() function is now deprecated, please use the function slowdown() instead h;;p<<<??E %.15g %d %d TCP %s %d %dE -t %.15g -o TCP -e %s -s %d.%d -d %d.%d.A??*PacketHeader/TCPAgent/TCP8RtxTimer11DelSndTimer13BurstSndTimer8TcpAgent14TCPHeaderClass8TcpClassError, received TCP packet size <= 0 maxSackBlocks_packetSize_ts_echo_bugfix_generateDSacks_RFC2581_immediate_ack_resetinterval_warning: Sacker::configure(): no TCP sink! warning(Sacker::configure): TCP header limits number of SACK blocks to %d, not %d warning(Sacker::trace): TCP header limits number of SACK blocks to %d, not %d Error: invalid packet number %d Error: can't use DSACK with less than 2 SACK blocks ?*Agent/TCPSinkAgent/TCPSink/DelAckAgent/TCPSink/Sack1Agent/TCPSink/Sack1/DelAck5Acker6Sacker7TcpSink10DelayTimer10DelAckSink12TcpSinkClass12DelSinkClass17Sack1TcpSinkClass23Sack1DelAckTcpSinkClassRENO_FAST_RETX?*Agent/TCP/Reno12RenoTcpAgent12RenoTcpClassnewreno_changes_newreno_changes1_exit_recovery_fix_partial_window_deflation_False call to partialnewack: deflate %u last_ack_ %d NEWRENO_FAST_RETXNEWRENO_FAST_RECOVERY?*Agent/TCP/Newreno15NewRenoTcpAgent15NewRenoTcpClassv_alpha_v_beta_v_gamma_v_rtt_ @???@???*Agent/TCP/Vegas13VegasTcpAgent13VegasTcpClassrbp_scale_rbp_rate_algorithm_rbp_segs_actually_paced_rbp_inter_pace_delay_?@?@?*Agent/TCP/Vegas/RBPAgent/TCP/Reno/RBP17RBPVegasPaceTimer16RBPVegasTcpAgent16RBPRenoPaceTimer15RBPRenoTcpAgent16RBPVegasTcpClass15RBPRenoTcpClasssegsperack_segsize_tcprexmtthresh_iss_nodelay_data_on_syn_dupseg_fix_dupack_reset_close_on_empty_interval_ts_option_size_reno_fastrecov_pipectrl_open_cwnd_on_pack_halfclose_TCP-FULL(%s): warning: tcpip hdr size is only %d bytes %f: FullTcpAgent::advance(%s): cannot advance while in state %d MSG_EOF?%s done%f: FullTcpAgent::recv(%s): warning: CE bit on, but ECT false! %f: FullTcpAgent::recv(%s): bad ACK (%d) for our SYN(%d) %f: FullTcpAgent::recv(%s): no SYN for our SYN(%d) %f: FullTcpAgent::recv(%s) received unexpected SYN (state:%d) %f: FullTcpAgent::recv(%s) got packet lacking ACK (seq %d) %f: FullTcp(%s): warning, recvd ecnecho but I am not ECN capable! %f: FullTcpAgent::recv(%s) too-big ACK (ack: %d, maxseq:%d) %f: %d.%d>%d.%d FullTcpAgent::recv(%s) received non-ACK (state:%d) ??A%f FullTcpAgent(%s): app close in bad state %d %f FullTcpAgent(%s): app close in unknown state %d ((H||ԧԧVԧlistencloseadvanceadvancebyadvance-bytesDUMPLIST: head_ is NULL [->%d, %d<-][%d, %d] %f: (%s) unexpected timeout %d in state %d %f: (%s) UNKNOWN TIMEOUT %d %f: FullTcpAgent(%s) warning: ts_option enabled in this TCP, but appears to be disabled in peer recov_maxburst_sack_option_size_sack_block_size_max_sack_blocks_?*Agent/TCP/FullTcpAgent/TCP/FullTcp/TahoeAgent/TCP/FullTcp/NewrenoAgent/TCP/FullTcp/Sack11DelAckTimer15ReassemblyQueue12FullTcpAgent19NewRenoFullTcpAgent17TahoeFullTcpAgent16SackFullTcpAgent12FullTcpClass17TahoeFullTcpClass19NewRenoFullTcpClass16SackFullTcpClasssegsperack_segsize_tcprexmtthresh_iss_nodelay_data_on_syn_dupseg_fix_dupack_reset_interval_?%f: BayFullTcpAgent::advance(%s): cannot advance while in state %d ?%f: (%s) UNKNOWN TIMEOUT %d %f: BayFullTcpAgent::recv(%s): got a non-SYN while in LISTEN %f: BayFullTcpAgent::recv(%s): no SYN for our SYN(%d) %f: %d.%d>%d.%d BayFullTcpAgent::recv(%s) received unexpected SYN (state:%d) %f: %d.%d>%d.%d BayFullTcpAgent::recv(%s) got packet lacking ACK (seq %d) %f: BayFullTcpAgent::recv(%s) too-big ACK (ack: %d, maxseq:%d) %f: %d.%d>%d.%d BayFullTcpAgent::recv(%s) received non-ACK (state:%d) ?listencloseadvanceattach-applicationno such agent %sinitial-window??*Agent/TCP/BayFullTcpAgent/TCP/BayFullTcp/TahoeAgent/TCP/BayFullTcp/NewrenoAgent/TCP/BayFullTcp/Sack14BayDelAckTimer18BayReassemblyQueue15BayFullTcpAgent15BayFullTcpClass20BayTahoeFullTcpClass22BayNewRenoFullTcpClass19BaySackFullTcpClassftpclient: had to resched get startstoptcpno such agent %s?*Agent/BayTcpApp/FtpClient12NewFileTimer14FtpClientAgent14BayTcpAppAgent14FtpClientClassfile_size?*Agent/BayTcpApp/FtpServer12FtpSrvrAgent14BayTcpAppAgent12FtpSrvrClassError, scoreboard too large (increase SBSIZE for more space) Assert SB failed Assert1 SB (length) ?*pkt seq %d should be %d FAST_RECOVERY?*Agent/TCP/Sack113Sack1TcpAgent13Sack1TcpClassss-div4_rampdown_Error, retran_data_ < 0?@Hit a strange case 2. ?*Agent/TCP/Fack12FackTcpAgent12FackTcpClassg_?exact_srtt_%-8.5f %-2d %-2d %-2d %-2d %s %-6.3favg_win_time: %-8.5f saddr: %-2d sport: %-2d daddr: %-2d dport: %-2d exact_srtt %d?*PacketHeader/TCPAAgent/TCP/AsymAgent/TCP/Reno/AsymAgent/TCP/Newreno/Asym12TcpAsymAgent15TCPAHeaderClass12TcpAsymClass16TcpRenoAsymClass19NewRenoTcpAsymClass16TcpRenoAsymAgent19NewRenoTcpAsymAgentmaxdelack_time: %-6.3f saddr: %-2d sport: %-2d daddr: %-2d dport: %-2d dafactor: %2d dalim: %2d max_scs: %4d win: %4d ?*Agent/TCPSink/Asym11TcpAsymSink16TcpAsymSinkClass???@?*Agent/TCP/FSAgent/TCP/Reno/FSAgent/TCP/Newreno/FS10ResetTimer10TcpFsAgent14RenoTcpFsAgent17NewRenoTcpFsAgentfast_loss_recov_fast_reset_timer_count_bytes_acked_fs_enable_@10TcpFsClass14RenoTcpFsClass17NewRenoTcpFsClass?*Agent/TCP/Newreno/Asym/FS21NewRenoTcpAsymFsClassfast_loss_recov_fast_reset_timer_count_bytes_acked_fs_enable_19NewRenoTcpAsymAgent21NewRenoTcpAsymFsAgentcount_bytes_acked_=%d rightEdge_uniqTS_winInc_winMult_setwtsession%s%s set node_%s createTcpSession %dIn IntTcpAgent::createTcpSession(): failed ư>?*Agent/TCP/Int11IntTcpAgent11IntTcpClass5slinkfast_loss_recov_fast_reset_timer_count_bytes_acked_fs_enable_?X! !!!!!!Xd ! ?In adjust_ownd(): ownd_ = %g owndCorrection_ = %g In add_agent(): reached limit of number of parallel conn (%d); returning ?In ok_to_snd(): ownd_ = %g owndCorrection_ = %g ??*10CorresHost5slinkownd_owndCorr_proxyopt_fixedIw_schedDisp_disableIntLossRecov_resetwt@?TcpSessionAgent::timeout(): ignoring unknown timer %d ???In TcpSessionAgent::findSessionSeqno: search unsuccessful In removeSessionSeqno(): unable to find segment with sessionSeqno = %d %-8.5f %-2d %-2d %-2d %-2d %s %-6.3f%-8.5f %-2d %-2d %-2d %-2d %s %d?*Agent/TCP/Session15SessionRtxTimer17SessionResetTimer20SessionBurstSndTimer15TcpSessionAgent15TcpSessionClassIn remove(): Error: prev->next!=a prev=%p a=%p lastx_lasty_sum_resetnewpointmean%gtried to take mean with no sample pointscnt%uvariance0.0IntegratorSamples10Integrator7Samples15IntegratorClass12SamplesClassget-bytes-integrator%sget-pkts-integratorget-delay-samplesset-bytes-integratorset-pkts-integratorset-delay-samplestracetrace: can't attach %s for writingset-src-dstq -t %.15g -s %d -d %d -l %d -p %d?size_pkts_parrivals_barrivals_pdepartures_bdepartures_pdrops_bdrops_estimate_rate_k_prevTime_startTime_estRate_new Samplesbytes%dpktsdropsget-class-delay-samples?*QueueMonitorSnoopQueue/InSnoopQueue/OutSnoopQueue/DropSnoopQueue/EDropSnoopQueue/TaggerQueueMonitor/EDQueueMonitor/Compat12QueueMonitor18QueueMonitorCompat17QueueMonitorClass17SnoopQueueInClass18SnoopQueueOutClass19SnoopQueueDropClass20SnoopQueueEDropClass21SnoopQueueTaggerClass19QueueMonitorEDClass23QueueMonitorCompatClassebdrops_epdrops_mon_ebdrops_mon_epdrops_12SnoopQueueIn13SnoopQueueOut14SnoopQueueDrop16SnoopQueueTagger14EDQueueMonitor15SnoopQueueEDropset-monitor10SnoopQueue??@Tagger:: flow list exceeded working buffer recompile ns with larger Tagger::wrk_[] array %8.3f %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %dclassifier%sdumpflowsattachTagger (%s): can't attach %s for writingsize_pkts_parrivals_barrivals_pdepartures_bdepartures_pdrops_bdrops_estimate_rate_k_prevTime_startTime_estRate_ebdrops_epdrops_mon_ebdrops_mon_epdrops_enable_in_enable_out_enable_drop_enable_edrop_FlowMon:: flow list exceeded working buffer recompile ns with larger FlowMon::wrk_[] array %8.3f %d %d %d %d %d %d %qd %qd %d %d %qd %qd %d %d %d %d %d %dFlowMon (%s): can't attach %s for writing?*QueueMonitor/ED/FlowmonQueueMonitor/ED/FlowQueueMonitor/ED/Flow/TBQueueMonitor/ED/Flow/TSWQueueMonitor/ED/Tagger14EDQueueMonitor13TaggerTSWFlow6Tagger7FlowMonsrc_dst_flowid_target_rate_win_len_wait_4Flow16FlowMonitorClass9FlowClass17TaggerTBFlowClass18TaggerTSWFlowClass11TaggerClassbucket_depth_tbucket_12TaggerTBFlow??nlost_npkts_bytes_lastPktTime_expected_%s log-lossclear?*Agent/LossMonitor11LossMonitor16LossMonitorClassPacketQueue:: remove() couldn't find target limit_blocked_unblock_on_resume_?*11PacketQueue12QueueHandler5Queue7Handlerpacketqueue-attach?*Queue/DropTail8DropTaildrop_front_13DropTailClass?*Queue/SimpleIntServ13SimpleIntServqlimit%d_18SimpleIntServClasstrace type too long - allocate more space to traceType in red.h and recompile bytes_queue_in_bytes_thresh_maxthresh_mean_pktsize_q_weight_wait_linterm_setbit_gentle_drop_tail_drop_front_drop_rand_ns1_compat_ave_prob1_curq_Doing a queue reset Done queue reset @@@resetearly-drop-target%sedrop-traceedrop trace exists according to RED edrop trace doesn't exist according to RED 0trace-typeattachRED: trace: can't attach %s for writinglinkRED: no LinkDelay object %sno object %sOk, Here Ok, Here too Ok, Here too too too %d packetqueue-attach @aveprobcurqRED:unknown trace var %s Q %g %d%c %g %gmean_pktsz: %d bytes: %d, wait: %d, setbit: %d minth: %f, maxth: %f max_p_inv: %f, qw: %f, ptc: %f qlim: %d, idletime: %f ========= v_a: %f, v_b: %f ?*Queue/RED8REDQueue8REDClassDroppacketqueue-attachattachDrop-tail_VSP: can't attach %s for writing time: %g current_size: %d max_buf_size: %dcurqDropTail_VSP:unknown trace var %s Q %g %d?*Queue/DropTail_VSP12DropTail_VSPbuffer_curq_drop_front_17DropTail_VSPClassacksfirst_filteracks_reconsAcks_replace_head_priority_drop_random_drop_random_ecn_ackreconsIn deque_acksfirst(): ack_count: %d but no acks in queue, length = %d Warning: In filterAcks(): packet being dropped from queue is in scheduler queue oops! ackcount %d In SemanticPacketQueue::lookup(): index = %d ?*PacketQueue/Semantic19SemanticPacketQueue24SemanticPacketQueueClass?*Queue/RED/Semantic16SemanticREDClassDrop16SemanticREDQueue%s demux %d %dError: malformed ack reconstructor %s ackbw %d %f %s spacing %d ?*AckReconsControllerClassAgent/AckReconsClass9AckReconslastTime_lastAck_lastRealTime_lastRealAck_ackInterArr_ackSpacing_deltaAckThresh_delack_adaptive_alpha_size_24AckReconsControllerClass14AckReconsClass19AckReconsControllermaxqueue_buckets_SFQ changed while queue occupied limitbucketssfq: 0x%p(%d) ?*Queue/SFQ9PacketSFQ3SFQ8SFQClasssecsPerByte_install?*Queue/FQ2FQ7FQClassbuckets_blimit_quantum_mask_Collisions between %d and %d src addresses Changing non-empty bucket from drr blimitMore packets in buffer than the new limitbucketsquantummask?*Queue/DRR9PacketDRR3DRR8DRRClassmaxpkt_ancestor-onlytop-levelformalold-formalCBQ: old-formal LS not supported Wrong eligible_ CBQ class %s has invalid pri %d CBQ class %s has invalid allot %f CBQ obj %s has no link! CBQ obj %s has invalid link bw %f on link %s CBQ class %s has invalid level %d ?insert-classCBQ: no class object %sCBQ: trouble inserting class %slinkCBQ: no LinkDelay object %salgorithmWRR-CBQ: no class object %sWRR-CBQ: trouble inserting class %sM_[i]: %f, cnt_[i]: %d, maxpkt_: %d, alloc_[i]: %f priority_level_extradelay_okborrow_CBQClass: warning: maxidle_ not configured! @?..?allot%gcbq%sqdiscqmonparentnonecouldn't find object %s class %s already has allotment of %f!newallotmaxidleinvalid maxidle value %s (must be non-negative)?*Queue/CBQCBQClassQueue/CBQ/WRR8CBQClass7CBQueue11WRR_CBQueue13CBQQueueClass13CBQClassClass17WRR_CBQQueueClassdown-targetno object %sshow-paramssrc_ = %d, dst_ = %d, fid_ = %d, nth_ = %dset-paramsnth?*HackLossyLink13HackLossyLink18HackLossyLinkClasstimebytepktbitenable_rate_bandwidth_markecn_unitranvarFECstrengthdatapktsizecntrlpktsize%s%d @ @Warning: uniform rate error cannot be time-based %s does not has ranvar_[%d]sttype_texpired_curperiod_error-modelsttype%s corruptgood_loss_%s read?period_offset_burstlen_ListErrorModel: error, EU_TIME not supported warning: ListErrorModel: null drop list droplist%uListErrorModel(%s): parse_droplist: unknown drop specifier starting at >>>%s ListErrorModel(%s): no memory for drop list! ListErrorModel: error: dup %d in list pkt_type_drop_cycle_drop_offset_drop-packet/classifierCouldn't look up classifier %s?*ErrorModelErrorModel/TwoStateErrorModel/MultiStateErrorModel/TraceErrorModel/PeriodicErrorModel/ListSelectErrorModelSRMErrorModelErrorModel/Trace/MrouteErrorModule10ErrorModel18TwoStateErrorModel20MultiStateErrorModel15TraceErrorModel18PeriodicErrorModel14ListErrorModel16SelectErrorModel16MrouteErrorModel11ErrorModule13SRMErrorModel15ErrorModelClass23TwoStateErrorModelClass25MultiStateErrorModelClass20TraceErrorModelClass23PeriodicErrorModelClass19ListErrorModelClass21SelectErrorModelClass18SRMErrorModelClass21MrouteErrorModelClass16ErrorModuleClassFECstrength%dFEC: %d fixed ?*FECModel8FECModel13FECModelClassbandwidth_delay_isDynamicpktintran%s puttrace %d %d %d %d %d %d %d %d?*DelayLink9LinkDelay @14LinkDelayClasssnoopDisable_srtt_rttvar_maxbufs_snoopTick_g_tailTime_rxmitStatus_lru_llsnoopcheck-rxmit%s get-snoop %d %d%s integrate %d %d@snoop full, making room @??@?*PacketHeader/SnoopLL/LLSnoopSnoop7LLSnoop5Snoop17SnoopRxmitHandlerintegrate_@@7Handler16SnoopHeaderClass12LLSnoopClass10SnoopClassfatal error: node is outside topography %d gets wrong discovery msg Wrong GAF msg time! ,@@start-gafadapt-mobilitymaxttladdr_port_shift_mask_set-gafagent?*PacketHeader/GAFAgent/GAFGAFPartner7AppData10PacketData16GAFDiscoverTimer14GAFSelectTimer12GAFDutyTimer8GAFAgent10GAFPartner14GAFHeaderClass13GAFAgentClass15GAFPartnerClassstatus?updownDynamicLink11DynamicLinkstatus_16DynamicLinkClasssend-update%s recv-update %d %d?*PacketHeader/rtProtoDVAgent/rtProto/DV9rtProtoDV15rtDVHeaderClass14rtProtoDVclasslabel%d?*NetworkInterface16NetworkInterface21NetworkInterfaceClass?*PacketHeader/CtrMcastAgent/CtrMcast/EncapAgent/CtrMcast/Decap13CtrMcastEncap13CtrMcastDecap19CtrMcastHeaderClass18CtrMcastEncapclass18CtrMcastDecapclass?*PacketHeader/mcastCtrlAgent/Mcast/Control23mcastControlHeaderClass17mcastControlClasspacketSize_17mcastControlAgent%s recv %s %d %dsendprunegraftgraftAckjoinassertinvalid control messagetXXXXXXXXXXXXXXXLXXXXXXXXX$XpacketSize_groupSize_app_fid_sendsessionrequestrepair%s: invalid send request %sdistances?%s %d %fstartdistance?%lfError: sendmsg() for SRM should not be -1 %s recv data %d %d%s recv request %d %d %d %d%s recv repair %d %d %d@@@@??*PacketHeader/SRMPacketHeader/aSRMAgent/SRMAgent/SRM/Adaptive8SRMAgent%s %d%s request %d %s14SRMHeaderClass15ASRMHeaderClass13SRMAgentClass14ASRMAgentClasspdistance_requestor_9ASRMAgentrc_ư>bw:%.2f, delay:%.2f, ttl:%d, dropped:%d, addr:%d, obj:%s %d (%s: )list-mbr%s %sshow-loss-depobjshow-dstobjset-nodeupdate-loss-topupdate-loss-rcv%d0update-loss-lossdelete-dstaddr = %d add-dst?*SessionHelper9RcHandler13SessionHelper7Handler18SessionHelperClassranvarbandwidth%s @?*DelayModel10DelayModel @15DelayModelClassgroup_scope_local_scope_scope_flag_rep_id_sendsessionrequestrepair%s: invalid send request %sstart%s is %d and rep-status %d ch-repdistances?%s %d %fdistance?%f@@@@@@%f Recvd a glb-sess with diff header(%d) != inside(%d) %f Recvd a glb-sess with repid(%d) != address(%d) %s recv-gsess %d %d%s request %d %d@@?%s recv-lsess %d %d %d@@?Recvd a rep-sess with repid(%d) != address(%d) @@?@@@@?*PacketHeader/SRMEXTAgent/SRM/SSM11SSMSRMAgent17SRMEXTHeaderClass16SSMSRMAgentClasssrc_delay_D_frac_det_rtt_est_rand_flood??%f : (type %d) (in %d) -- @ %d --> Fired RREQ (node %d) panic: node(%d) Unexpected type %d ?Topology/LineTopology/BTreeTopology/Star7SrmNode8Topology4Line5BTree4Starc_alpha_beta_c2func_7Handler9LineClass10BTreeClass9StarClassdtuSize_fileSize_dtusPerBlock_dtusPerGroup_seekCount_%s: dtusPerBlock_ must be a multiple of 8?*9MFTPAgentreadAheadBufsize_txStatusDelay_nakCount_senddatastatreq%lu%lf%s: wrong number of parameters for "send statreq"start%s recv nak %lu %lu %lu%s send notify %lu %lu %s%s pass-finished %lu %lu-10?*Agent/MFTP/SndPacketHeader/MFTP9MFTPAgent12MFTPSndAgent17MFTPSndAgentClass15MFTPHeaderClassreply_addr_reply_port_sendnak%lustart%s: dtusPerBlock_ must be a multiple of 8%s: send not allowed with Agent/MFTP/Rcv %s recv status-req %lu %lu %lu %lf%s recv useful %lu %lu %s%s done-notify %lu %lu %s%s recv dependent %lu %lu %s%s recv group-full %lu %lu %s?*Agent/MFTP/Rcv9MFTPAgent12MFTPRcvAgent17MFTPRcvAgentClasscodeword.cc: sorry, the group size %lu is not supported. codeword.cc: sorry, the group size %lu that you selected requires a datatype of at least %lu bits. To achieve this, adjust Codeword::size in file "codeword.h" accordingly. 11111110111001110010111001111110010110110100111000100111110100110111001001101110010101110011100000111100111010010010111111000100110001011110101000101010110110101100101101111011010010100110111110010110101001001110101010110101001001111000101011100100110011010010011000110101100110100101100001011011011110101010101001011101100011100100011001101010101100110001100001000111010011101111001101001110101010101000111010011010011101010101010001110011001100011101010101010001110101001010001110101101001000111011001010010110001101001101101101101100011100110100100111001001010110010100101010100100111011011freebitsetbitsetbit: Size_ increased: Reallocate bitssetbit: no contiguous space found %d %dexpand-portexpand-port: Size_ increased: Reallocate bitsexpand-port: no contiguous space found AllocAddr9AllocAddr14AllocAddrClassstr2addr%dbpl-are#bpl don't match with #hier levels mcastbits-areadd-hieridsbits-are#idshiftbits don't match with #hier levels idmbits-are#idmaskbits don't match with #hier levels %d.Address::hier_addr: levels greater than total h_levels_ Error!! str2addr:Address outside range of address field length Address7Address12AddressClassFatal intVec error. %s Index out of range.id_id%dlog%sget-modtime%.17gexist-pageget-sizeget-ageget-cachetimeget-pageget-cncset-pagepoolis-connected01is-valid%d is-valid: No page %s%d: invalid log file handle %s disconnectget-pagetype%d get-pagetype: No page %sHTMLMEDIAUnknown page type %dget-layer%d get-layer: No page %s%d get-layer %s not a media pageconnect%s: failed to connect to %sset-modtimeset-cachetimesend%s: bad client name %senter-pageevTrace%.15g i %d .A?.A?Bad http invalidation data type %d hb_interval_enable_upd_Ca_Cb_push_thresh_push_high_bound_push_low_bound_add-inval-senderNon-existent agent %sadd-invcount-request%d count-request: No page %sS NTF p %s v %d count-inval%d count-inval: No page %sis-pushable%d is-pushable: No page %sserver %d timeout mpush request-mpushrefresh-mpushsend-hbstop-mpushserver %d stopped mpush @Ll\add-inval-listeneradd-upd-listeneradd-to-mapadd-upd-senderE NTF p %s v %d check-sstateis-unread%d is-unread: No page %sjoinNon-existent cache %sparent-cachepush-childrenrecv-invrecv-pushmodtimesizeageregister-serverstart-hbtimerserver-hbset-pinv-agentset-parentset-unreadset-readset-mandatory-push(P%g: cache %d: No neighbor cache for received invalidation from %d via %d [%g]: Cache %d has an invalid neighbor cache %d %s mark-rejoin@%s mark-leave%s: An unknown neighbor cache %d failed. %s (%g) gets a leave from cache without server! %s: Unknown reason %dwebcache/http.cc%s %d: couldn't find the server. %s mark-invalidE GINV p %s m %.17g %d gets an update which contain !=1 pages. E GUPD m %.17g z %d %s mark-valid%s cancel-mpush-refresh %s@direct_request_is-header-validenter-metadata?*HttpHttp/ClientHttp/ServerHttp/Server/InvalHttp/Server/Inval/YucHttp/CacheHttp/Cache/InvalHttp/Cache/Inval/McastHttp/Cache/Inval/Mcast/Perc7AppData15InvalidationRec14HttpNormalData10HttpHbData14HttpUpdateData13HttpLeaveData7HttpApp10HttpServer18HttpYucInvalServer9HttpCache15HttpMInvalCache18HttpPercInvalCache8HttpData15HttpInvalServer14HttpInvalCache12HttpAppClass15HttpClientClass15HttpServerClass20HttpInvalServerClass23HttpYucInvalServerClass14HttpCacheClass19HttpInvalCacheClass20HttpMInvalCacheClass23HttpPercInvalCacheClass10HttpClientSimpleTcp doesn't support infinite send. Do not use FTP::start(), etc. listenclose%s done?*Agent/TCP/SimpleTcp14SimpleTcpAgent14SimpleTcpClass:Non-exitent server name for page %s%s:%-dNon-exitent server name for page %s size %d modtime %.17g time %.17g age %.17g noc 1%s:%dset-allpushset-selpushrTracePagePool: couldn't open trace file %s TracePagePool: Duplicate entry %s TracePagePool: Duplicate entry %d get-poolsize%dget-start-time%.17gget-durationgen-pageidgen-sizeTracePagePool %s: page %d doesn't exists. ranvarset-start-timegen-init-modtimegen-modtime10%s: no page size generatorranvar-sizeranvar-age%s: no page age generatornum_pages_main_size_comp_size_gen-obj-sizeget-next-objs%s %s:%dranvar-main-ageranvar-obj-ageis-mainpageget-mainpage%s:0get-obj-numgen-obj-modtimelist-pages%s:%-d %smodtimesizeagenocPagePool %s: wrong information for page %s ProxyTracePagePool: couldn't open trace file %s ProxyTracePagePool: cannot read file information ProxyTracePagePool: trace file doesn't contain statistics. %lf %u%*d %*d %d %*u %lf %d %*d %d %ubimodal-ratio%gset-client-numgen-request%.17g: Wrong request time %g. %lf %dPagePool: id out of range. ranvar-dpranvar-spset-reqfileset-pagefileMbP?$@pick-pagemod?*PagePoolPagePool/TracePagePool/MathPagePool/CompMathPagePool/ClientPagePool/ProxyTracePagePool/ProxyTrace/epa10ServerPage10ClientPage8PagePool13TracePagePool12MathPagePool16CompMathPagePool14ClientPagePool18ProxyTracePagePool16EPATracePagePoolBad object name %s 4Page13PagePoolClass18TracePagePoolClass17MathPagePoolClass21CompMathPagePoolClass19ClientPagePoolClass23ProxyTracePagePoolClass16EPAPagePoolClassinval_hdr_size_set-app?*PacketHeader/HttpInvalAgent/HttpInvalApplication/TcpApp/HttpInval14HttpInvalAgent15HttpUInvalAgent20HttpInvalHeaderClass14HttpInvalClass15HttpUInvalClass[%g] %s receives a packet but no callback! [%g] %s gets extra data! [Simulator instance] flush-traceconnect%s: connected to null object.senddst%s?*Application/TcpApp6TcpApp12TcpAppString7AppData11TcpCncClass?*15InvalidationRec7HBTimer9PushTimer13LivenessTimer??? pgtype MEDIA layer %dWrong hit count list. (%s %d %f) max_size_set-repl-styleFINEGRAINATOMICUnknown style %sMClientPagePool: cannot add a new layer. modtimesizeagenocpgtypeMEDIAlayer%s: wrong page information %s Corrupted replacement style. Cache replacement cannot get enough space. get-poolsize%dget-start-time%.17gget-durationgen-pageidno page id ranvar.is-media-page1get-layerset-start-timeset-durationgen-init-modtimegen-sizeInvalid page id %dset-layerset-num-pagescan't change number of pagesranvar-reqgen-modtime%s: gen-modtime called! set-pagesize%s pref-segment %s %s %d %sMediaCache %s gets an unknown MediaRequest type %d MediaCache %s gets a segment for an unknown page %s E RSEG p %s l %d s %d e %d z %d f %d get-pref-styleNOPREFONLINE_PREFOFFLINE_PREFCorrupted prefetching style %doffline-completeset-pref-styleWrong prefetching style %sdump-pageE SEGS p %s l %d %s stream-receivedE SIZ n %d z %d t %d register-clientcannot create hash entryduplicate connectionunregister-clientcannot find hash entryE STAT p %s l %d d %d e %d p %d C RSEG p %s l %d s %d e %d z %d C SEGS p %s l %d %s Unknown connection! MediaServer %s gets an unknown MediaRequest type %d 0stop-prefetchingServer %d cannot stop prefetching! enter-pageregister-prefetchCannot create entry. ?*PagePool/Client/MediaPagePool/MediaHttp/Cache/MediaHttp/Client/MediaHttp/Server/Media12MediaSegment16MediaSegmentList10HttpServer9HttpCache8HitCount12HitCountList9MediaPage15MClientPagePool13MediaPagePool10MediaCache11MediaClient11MediaServert5Queue1ZQ211MediaServer8PrefInfo14DoubleListElem10HttpClient20MClientPagePoolClass18MediaPagePoolClass15MediaCacheClass20HttpMediaClientClass16MediaServerClassdone pages %d != all pages %d WebTrafSession must be idle when deleted. delete %s Session %d done page %d at time %g deleted session %d Session %d starting page %d, curpage %d %s launch-req %d %s %s %s %s %s %s %ddebug_%s alloc-tcpBad object name %s Failed to allocate a TCP agent %s alloc-tcp-sinkFailed to allocate a TCP sink set-num-sessionset-num-serverset-num-clientset-serverWrong server index %d set-clientWrong client index %d recyclecreate-sessionInvalid session index %d Invalid random variable ?*PagePool/WebTraf14WebTrafSession11WebTrafPool7WebPageSession %d launched page %d obj %d %f %d %d %d %d 16WebTrafPoolClassminCDF_maxCDF_interpolation_maxEntry_burst_time_idle_time_rate_packetSize_offtimecdferror:unable to load offtimecdf?r%lf %*f %lf?*Application/Traffic/RealAudio10RA_Traffic14RATrafficClass[Simulator instance] get-node-id-by-addr %s%dlanaddrroutinghierflatswitchroutelogic?*LanRouter9LanRouter14LanRouterClassfilter-targetoffset_match_filter-field?*FilterFilter/FieldFilter/MultiField6Filter11FieldFilter16MultiFieldFilter11FilterClass16FieldFilterClass21MultiFieldFilterClassresetvalue%dPktCounter10PktCounter15PktCounterClass?*Agent/Decapsulator12Decapsulator17DecapsulatorClassstatus_overhead_decap-target?*Agent/Encapsulator12Encapsulator17EncapsulatorClass?*PacketHeader/Encap16encapHeaderClassdelay_%s lookup failed trace-targetaddif%sid%dNetwork Interface List -------------------------------------------------- COLBSYcheck_pktCTRL:Invalid MAC Control subtype ư>check_pktRTS:Invalid MAC Control subtype check_pktTx:Invalid MAC Control subtype .Aư>.A.ARET---ERRrecvTimer1:Invalid MAC Control Subtype %x recv_timer2:Invalid MAC Data Subtype %x recv_timer3:Invalid MAC Type %x .Aư>STADUPMAC_802_11: accessing MAC cache_ array out of range (src %u, dst %u, size %d)! [suppressing additional MAC cache_ warnings] ?*Mac/802_119Mac802_11.Aư>14Mac802_11ClassX@@trace_V瞯< @Mac802_3: frame is too big: %d index: %d Retx Timer: %d IFS Timer: %d Recv Timer: %d Send Timer: %d @ BEB limit exceeded:Dropping packet %d`@ Checksum error Dropping packetX@?*Mac/802_318Mac8023HandlerSend14MacHandlerRecv14MacHandlerRetx13MacHandlerIFS8Mac802_310MacHandler13Mac802_3Class7Handlerslot_packet_len_max_node_num_Too many nodes taking part in the simulations, aborting... log-target [ %2x %2x %2x %2x ] %x %s %d %s --- (INDEX: %d, time: %2.9f) tx_state_: %x, rx_state_: %x, idle: %d pktTx_: %x, pktRx_: %x, callback: %x <%d>, %f, I am sleeping... <%d>, can't receive while transmitting! XXX<%d>, receiving, but the channel is not idle....??? <%d>, %f, no packet buffered. <%d>, %f, transmitting, but the channel is not idle...??? ?*Mac/Tdma12MacTdmaTimer13SlotTdmaTimer14RxPktTdmaTimer14TxPktTdmaTimer7MacTdma.A7Handler12MacTdmaClassaddr_port_shift_mask_ttl_%s tunnel-exit %d?*PacketHeader/IPinIPMIPEncapsulatorClassifier/Addr/MIPDecapsulator15MIPEncapsulator15MIPDecapsulator17IPinIPHeaderClass20MIPEncapsulatorClass20MIPDecapsulatorClassadSize_ad_lifetime_%s clear-reg %d%s encap-route %d %d %lf%s get-link %d %dXXX%s decap-route %d %s %lfbeacon-periodbcast-targetragenthome_agent_rreqSize_reg_rtx_reg_lifetime_%s update-reg %dnodemip-reg.cc%s: %s lookup of %s failed ?*PacketHeader/MIPAgent/MIPBSAgent/MIPMH11SimpleTimer10MIPBSAgent12AgtListTimer10MIPMHAgent14MIPHeaderClass15MIPBSAgentClass15MIPMHAgentClassdumpaddnodedimensionillegal grid dimensiongrid[%d][%d]: %d ------------------------------- ?*GridKeeper11GridHandler10GridKeeper7Handler15GridKeeperClassPropagation: %s lookup of %s failed topographyPropagation model %s not implemented for generic NetIF Propagation model %s not implemented for SharedMedia interface F,DT!)@?*Propagation/FreeSpace11Propagation9FreeSpace14FreeSpaceClasstworayground.cc%s: TwoRayGround propagation model assume flat ground F,DT!)@?*Propagation/TwoRayGround12TwoRayGround17TwoRayGroundClassX_Y_Z_Antenna7Antenna12AntennaClassGt_Gr_Antenna/OmniAntenna11OmniAntenna16OmniAntennaClasspathlossExp_std_db_dist0_seed_$$@seedrawpredefheuristic?*Propagation/Shadowing9Shadowing14ShadowingClassup-targetdown-targetdrop-target%sisDynamic%s lookup failed no such object %sno object %sError: Packet Direction not specified; Using default 'UP' direction ?*BiConnector11BiConnector16BiConnectorClassConfiguration error: Network Interface missing setnetinfsetnodeSimulator set nix-routingNix routing in use, creating NixNode populate-objectsaddress?%dget-nix-vectorset-neighboraddrnodeidaddlinkheadaddenergymodelnamattachnode: can't attach %sadd-neighborInvalid node %sNode::namdump() exceeds buffer size. Bail out. ?*Connector/LinkHeadNode10ParentNode8LinkHead4Node13LinkHeadClass9NodeClassX_Y_Z_speed_startlog-movementlog-energypowersavingadaptivefidelityenergy%fadjustenergyon%s set netif_(0)%s NodeOnoff%s NodeOff%s set ragent_%s reset-stateshutdownstartupaddifsetsleeptimesetenergysettalivemaxttlradiusrandom-motiontopographylog-targetbase-stationidleenergysetdestIndex: %d Network Interface List -------------------------------------------------- M %.5f %d (%.2f, %.2f, %.2f), (%.2f, %.2f), %.2fN -t %f -n %d -e %fN -t %f -n %d -e 0 Adjust position of node %d n -t %f -s %d -x %f -y %f -u %f -v %f -T %fNo TOPOLOGY assigned ?@A?*Node/MobileNode15PositionHandler10MobileNode7Handler15MobileNodeClassENDresetARP fatal ARP error... ?*ARPTablePacketHeader/ARP8ARPTable13ARPTableClass14ARPHeaderClassGod is off. index from higher than the maximum number of nodes. index to higher than the maximum number of nodes. Node %d status (sink %d, source %d, on_tree %d) Dump min_hops %2d) %2d God computes routes %d times. Dump next_hop NextHop(%d,%d):%d Dump SRC_TAB Dump OIF_MAP (%2d,%2d) Dump SK_TAB God is inactive. @o@Network parition !! Exiting... at time %f [Simulator instance] at %lf "finish"[Simulator instance] at %lf "[Simulator instance] halt"ư>>Grid info:%d %d %d (%d %d) update_node_statuscompute_routedumpdump_num_sendonoffallow_to_stopnot_allow_to_stopnum_nodes%dis_source10is_sinkis_on_treesnum_nodes is set %d num_data_typesnew_nodeis_reachableadd_sourceadd_sinkload_gridset-dist?*God3God8GodClassr%s: EOF *** A RECORD *** Quadrangle name: %s DEM Level code: %d Pattern code: %d Planimetric reference system code: %d Zone code: %d Map Projection Parameters: %f Ground planimetric coordinates: %d Elevation coordinates: %d Sides: %d Corners: %f, %f Min Elevation: %f Max Elevation: %f Clockwise angle: %f Accuracy code: %d Spatial Resolution: %f (x) %f (y) %f (z) Rows: %d Columns: %d *** B RECORD *** Row ID: %d Column ID: %d Ground planimetric coordinates: %f, %f Elevation: %f *** X,Y GRID *** ROW %5d --- %5d Opening DEM file %s... Processing DEM file... DEM File processing complete... load_demfileload_flatgridTopography10Topography15TopographyClass@@4BPSK10Modulationdrop_front_Prefer_Routing_Protocolsreset?*Queue/DropTail/PriQueue8PriQueue13PriQueueClassid%d%s lookup failed channelnodelinkheadDirection for pkt-flow not specified; Sending pkt up the stack on default. INDEX: %d uptarget: %x, channel: %x?*3Phy @ @bandwidth_%s lookup failed ?*Phy/WiredPhy8WiredPhy13WiredPhyClassCPThresh_CSThresh_RXThresh_bandwidth_Pt_freq_L_ANodeOnNodeOffsetTxPowersetRxPowersetIdlePowerWirelessPhy: %s lookup of %s failed propagationantennanodeWhat the heck ! negative gap time. @ @ Pt: %f, Gt: %f, Gr: %f, lambda: %f, L: %f bandwidth: %f -------------------------------------------------- ?*Phy/WirelessPhy10Idle_Timer11WirelessPhy16WirelessPhyClass?*8MacTimer12BackoffTimer10DeferTimer7IFTimer8NavTimer7RxTimer7TxTimer7HandlerRTRTRPMACIFQAGTCMU Trace Initialized with invalid type %c -t %.9f -Hs %d -Hd %d -Ni %d -Nx %.2f -Ny %.2f -Nz %.2f -Ne %f -Nl %3s -Nw %s -Ma %x -Md %x -Ms %x -Mt %x %c %.9f _%d_ %3s %4s %d %s %d [%x %x %x %x] [energy %f] -Is %d.%d -Id %d.%d -It %s -Il %d -If %d -Ii %d -Iv %d ------- [%d:%d %d:%d %d %d] REQUESTREPLY-P arp -Po %s -Pms %d -Ps %d -Pmd %d -Pd %d ------- [%s %d/%d %d/%d]-P dsr -Ph %d -Pq %d -Ps %d -Pp %d -Pn %d -Pl %d -Pe %d->%d -Pw %d -Pm %d -Pc %d -Pb %d->%d %d [%d %d] [%d %d %d %d->%d] [%d %d %d %d->%d]-Pn tcp -Ps %d -Pa %d -Pf %d -Po %d [%d %d] %d %d-Pn cbr -Pi %d -Pf %d -Po %d [%d] %d %d-P imep -Pa %c -Ph %c -Po %c -Pl 0x%04x ] [%c %c %c 0x%04x] -P tora -Pt 0x%x -Pd %d -Pc QUERY [0x%x %d] (QUERY)-P tora -Pt 0x%x -Pd %d (%f %d %d %d %d) -Pc UPDATE -Pt 0x%x -Pd %d -Pa %f -Po %d -Pr %d -Pe %d -Pi %d -Pc UPDATE -P tora -Pt 0x%x -Pd %d -Pa %f -Po %d -Pc CLEAR [0x%x %d %f %d] (CLEAR)format_aodv-P aodv -Pt 0x%x -Ph %d -Pb %d -Pd %d -Pds %d -Ps %d -Pss %d -Pc REQUEST [0x%x %d %d [%d %d] [%d %d]] (REQUEST)UNSOLICITED REPLYHELLO-P aodv -Pt 0x%x -Ph %d -Pd %d -Pds %d -Pl %d -Pc %s [0x%x %d [%d %d] %d] (%s)%s: invalid AODV packet type -c black -o red-c red -o yellow-c yellow -o green-c green -o black+ -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s - -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3sn -t %.9f -s %d -S COLOR %s%c -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s??%s - invalid packet type (%s). \ D t   \        D                        ,            nodenewtrace---?*CMUTrace8CMUTrace13CMUTraceClassmac-addr?*VARPTable9VARPTable14VARPTableClassV%s %.5f _%d_ [%d]:%s (%d,%d,%d)%sDFU: deimplementedPUTU??VPC %.5f _%d_VTO %.5f _%d_ %d->%dVTO %.5f _%d_ marking %dDFU: unknown queue event {Gz??CBKVLL %.8f %d->%d lost at %dVLP %.5f %d:%d->%d:%d lost at %d [hop %d]VCT %.5f _%d_ %d%c %.5f _%d_ (%d,%d->%d,%d->%d,%d->%d,%f)VWST %.12lf frm %d to %d wst %.12lf nxthp %d [of %d]VS%sdsdv/dsdv.cc%s DFU: unhandled adding a route entry? ?u"Awarning: Route to base_stn not known: dropping pkt VBP %.5f _%d_ %d:%d -> %d:%dIFQRouting pkts outside domain: VFP %.5f _%d_ %d:%d -> %d:%du"ALOOPTTLwst0_perup_use_mac_be_random_alpha_min_update_periods_verbose_trace_wst_start-dsdvdumprtabTable Dump %d[%d] ---------------------------------- VTD %.5f %d:%d ll-queueDSDV_Agent: ll-queue lookup of %s failed addr%s: %s lookup of %s failed tracetargetnodeport-dmux?*Agent/DSDV7AppData10PacketData10DSDV_Agent11DSDV_Helper18DSDVTriggerHandler7Handler9DSDVClass?*IFQTOUT?*7rtqueuestartresetrecvtargetsendtargetrtagentlog-targetimepAgent::findObjectSequence: Object Block without response list T %.9f _%d_ dup ack(?) from %dT %.9f _%d_ remove from reXq pkt %dT %.9f _%d_ remove %d from resp list %d (%d left) RL %sT %.9f _%d_ purge %d from reXmit QTOUTT %.9f _%d_ purge %d from resp list %d (%d left) RL %sT %.9f _%d_ imep pkt overflow %d %d %d leftoverT %.9f _%d_ rexmit timed out %d RL:%sT %.9f _%d_ punting neighbor %dT %.9f _%d_ rexmit %d as %dT %.9f _%d_ rexmit trigger again for %d at %.9f (in %.9f)?T %.9f _%d_ inorder - timer expiredT %.9f _%d_ inorder - src %d hole retired seq %d -> %dT %.9f _%d_ inorder - src %d seq %d (timer delivery)T %.9f _%d_ inorder - src %d seq %d (chain timer delivery)T %.9f _%d_ inorder - timer started (delay %.9f)T %.9f _%d_ inorder - timer startedIP dst is unicast - not encapsulating {Gz?T %.9f _%d_ %d acks seq %d : no obj blockT %.9f _d_ first object from neighbor %d seq %dT %.9f _%d_ from %d ignored seq %d (already heard)T %.9f _%d_ inorder - src %d seq %d out of order (%d expected)T %.9f _%d_ inorder - fastpath src %d seq %d (delivering)T %.9f _%d_ inorder - src %d seq %d (delivering)imep_version: 0x%x imep_block_flags: 0x%x imep_length: 0x%04x Packet ID: %d %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x T %.9f _%d_ neighbors: %d%c %d IL %.9f _%d_ Add-Adj: %d New-Neigh: %d Del-Neigh1: %d Del-Neigh2: %d Del-Neigh3: %dIL %.9f _%d_ Created QRY: %d UPD: %d CLR: %dIL %.9f _%d_ Received QRY: %d UPD: %d CLR: %dIL %.9f _%d_ Total-Obj-Created: %d Obj-Pkt-Created: %d Obj-Pkt-Recvd: %dIL %.9f _%d_ Rexmit Pkts: %d Acked: %d Retired: %d Rexmits: %dIL %.9f _%d_ Sum-Response-List-Size Created: %d Retired: %dIL %.9f _%d_ Holes Created: %d Retired: %d ReSeqQ-Drops: %d ReSeqQ-Recvd: %dIL %.9f _%d_ Unexpected-Acks: %d Out-Win-Obj: %d Out-Order-Obj: %d In-Order-Obj: %d?*PacketHeader/IMEPAgent/IMEP9imepAgent15IMEPHeaderClass14agentIMEPclassT %.9f _%d_ dest_queue - getNextExpire is %.9fT %.9f _%d_ purge dstQ id %dT %.9f _%d_ dstQ id %d delete seq %dT %.9f _%d_ dest_queue - src %d expire %.9f seqno %dT %.9f _%d_ dest_queue - src %d seq %d expire %.9f?*T %.9f _%d_ new link to %d@@T %.9f _%d_ down link to %dT %.9f _%d_ undeliverable pkt to %d?*?*?*?*9imepTimer7HandlerT %0.9f _%d_ ack %d:%dT %0.9f _%d_ hello %dInvalid Packet Type %d T %.9f _%d_ # obj %d seq %d #resp %d RL %s?*?333333??333333??*ENDid%dlog-targettracetargetdrop-targetif-queueimep-agentLOOPT %.9f _%d_ tora enq %d->%dTTL%s: Invalid TORA type (%x) Q?T %.9f _%d_ received `UPD` from non-neighbor %dT %.9f _%d_ received `CLR` from non-neighbor %d?*PacketHeader/TORAAgent/TORA7rtAgent9toraAgent7rtqueue15TORAHeaderClass14toraAgentclassT %.9f _%d_ QRY %d for %d (rtreq set)CBK?* DEST: %d, RT Req: %x, Time UPD: %f tau: %f, oid: %d, r: %d, delta: %d, id: %d Active: %d, Down: %d, Up: %d, Next Hop: %d ?*T %.9f _%d_ tora sendQRY %d?*T %.9f _%d_ routing loop (%d --> %d --> %d)T %.9f _%d_ LL unable to deliver packet %d to %d (%d) (reason = %d, ifqlen = %d)T %.9f _%d_ recycling packet %d (src = %d, dst = %d, prev = %d, next = %d)VALIDINVALIDT %.9f _%d_ deleting LL hop to %d (delete %d is %s)T %.9f _%d_ keeping LL hop to %d (keep %d is %s)T %.9f _%d_ destination %d removing neighbor %dT %.9f %d received `QRY` from %d --- %dT %.9f _%d_ received `UPD` from %d --- %d (%f %d %d %d %d)T %.9f _%d_ received `CLR` from %d --- %d (%f %d)T %.9f _%d_ %2d (%9f %2d %2d %2d %2d) ---> %2d (%9f %2d %2d %2d %2d) %d %.9f --- (%2d a, %2d d, %2d u) %d %9fT --------------------------------------------------T %.9f _%d_ TD %2d (%9f %2d %2d %2d %2d) --- (%2d a, %2d d, %2d u) %d %9fT %.9f _%d_ TN %2d (%.9f %2d %2d %2d %2d) %d %.9fT %.9f _%d_ nexthop for %d is %dT %.9f _%d_ --------------------------------------------------T %.9f _%d_ lost last downstream link for destination %d?* NEIG: %d, Link Status: %d, Time Active: %f tau: %f, oid: %d, r: %d, delta: %d, id: %d ?*Q?Ssb %.5f _%s_ dropped %s -> %sTOUTSdebug %.5f _%s_ stuck into send buff %s -> %s>@DFU: Don't do this! I haven't figured out ~DSRAgent ENDadding route to 1 adding route to 3 testinitresetcheck-cachestartdsronoffSconfig %.5f tap: %s snoop: rts? %s errs? %sSconfig %.5f salvage: %s !bd replies? %sSconfig %.5f grat error: %s grat reply: %sSconfig %.5f $reply for props: %s ring 0 search: %saddrmac-addrDSRAgent: %s lookup of %s failed log-targettracetargetinstall-tapnodeport-dmuxadd-llQ?S %.9f _%s_ originating %s -> %sdsragent: Error-received Invalid pkt! S$hit %.5f _%s_ %s -> %s %sS$miss %.5f _%s_ %s -> %sSF %.9f _%s_ --- %d [%s -> %s] %sdfu: ran off the end of a source route SDFU: ran off the end of a source route LOOPSRR %.5f _%s_ dropped %s #%d (ignored)SRR %.5f _%s_ dropped %s #%d (prop limit exceeded)SRR %.5f _%s_ dropped %s #%d (SR full)SRR %.5f _%s_ rebroadcast %s #%d ->%s %sSdebug %.9f _%s_ splitting %s to %sSRR %.9f _%s_ cache-reply-sent %s -> %s #%d (len %d) %sSO %.9f _%s_ originating %s %sSIFQ %.5f _%s_ len %d{Gz?SRR %.5f _%s_ RR-not-sent %s -> %sSRR %.5f _%s_ new-request %d %s #%d -> %sSRR %.9f _%s_ reply-sent %s -> %s #%d (len %d) %sSDFU non route containing packet given to acceptRouteReplydfu: non route containing packet given to acceptRouteReply SRR %.9f _%s_ reply-received %d from %s %s #%d -> %s %sSdebug %.9f _%s_ liberated from sendbuf %s->%s %sSRR %.9f _%s_ dead-link tell %d %d -> %dSdebug %.5f _%s_ unwrapping nested route errorSdebug _%s_ tap saw error %dSdebug _%s_ tap saw route reply %d %sSdebug _%s_ tap saw route use %d %sSdebug %s consider grat arp for %sSRR %.9f _%s_ gratuitous-reply-sent %s -> %s (len %d) %sSRR %.5f _%s_ --- %d dropping bad-reply %s -> %sCBKSsalv %.5f _%s_ salvaging %s -> %s --- %d with %sSsalv %.5f _%s_ dropping --- %d %s -> %sNRTESSendFailure %.9f _%s_ --- %d - %sSDFU: route error beyond end of source route????SDFU: route error beyond end of source route???? SDFU: route error forwarding route request????SDFU: route error forwarding route request???? Sdebug _%s_ not bothering to send route error to ourselvesSDFU %.5f _%s_ dumping maximally nested error %s %d -> %dSdebug %.5f _%s_ sending into dead-link (nest %d) tell %d %d -> %d?*Agent/DSRAgentAgent/DSRAgent/BS_DSRAgent3Tap15SendBufferTimer8DSRAgent11BS_DSRAgent13DSRAgentClass16BS_DSRAgentClass|%s%d ?*PacketHeader/SR13SRHeaderClassvalid_num_addrs_cur_addr_primarysecondarystartdsrSconfig %.5f using MOBICACHESRC %.9f _%s_ dead link %s->%sSRC %.9f _%s_ $hit for %s in %s %sSRC %.9f _%s_ find-route [%d] %s->%s miss %d %.9fSRC %.9f _%s_ %s suffix-rule (len %d/%d) %sSRC %.9f _%s_ %s prefix-rule (len %d/%d) %sSRC %.9f _%s_ %s evicting %sSRC %.9f _%s_ while adding %sSRC %.9f _%s_ %s truncating %s %sSRC %.9f _%s_ to %s %s?*MobiCache9MobiCache14MobiCacheClass%dNONE0x%xDFU: overflow in appendPath len2 %d (),[]%s%s ?*???*startdsrip-addrmac-addrlog-targettracetargetRoute cache dump unimplemented SRC %.9f _%s_ adding rt %s from %s%.9f _%s_ adding bad route to cache %s %s ?*RouteCache10RouteCache15RouteCacheClassVALIDINVALIDA %.9f _%d_ deleting LL hop to %d (delete %d is %s)A %.9f _%d_ LL unable to deliver packet %d to %d (%d) (reason = %d, ifqlen = %d)A %.9f _%d_ keeping LL hop to %d (keep %d is %s)?*??id%dstartindexlog-targettracetargetdrop-targetif-queue@@CBKNRTE{Gz?LOOPTTLInvalid AODV type (%x) I@$@{Gz?@I@{Gz?$@Q??*PacketHeader/AODVAgent/AODV14BroadcastTimer10HelloTimer13NeighborTimer15RouteCacheTimer16LocalRepairTimer4AODV7Handler15AODVHeaderClass9AODVclasstarget%sNon-existent media app %s Process7Process12ProcessClassחA?DLAחA?@F,DT!?@ @F,DT! @F,DT!@F,DT! -C6? eA@?@?*SatGeometry16SatGeometryClassStarted 11SatGeometryhandoff_randomization_setnodeError, couldn't find an empty crossseam stack for handoff Error: get_peer_linkhead called for a non-connected link on node %d Error: node %d's tx phy connected to channel with no receivers Error: This ISL channel has more than one target elevation_mask_term_handoff_int_Error: Terminal link type not valid %d NOW %f F,DT! @f@sat_handoff_int_latitude_threshold_longitude_threshold_Error: crossseam handoffs require setting the ``next'' field F,DT! @f@F,DT!@?*HandoffManagerHandoffManager/SatHandoffManager/Term16TermHandoffTimer15SatHandoffTimer14LinkHandoffMgr17SatLinkHandoffMgr18TermLinkHandoffMgr19LinkHandoffMgrClass22SatLinkHandoffMgrClass23TermLinkHandoffMgrClassset_typegeopolargslgsl-repeaterinterplaneintraplanecrossseamUnknown link type: %s setllsetphytxsetphyrxsetmacsetqueueseterrmodelError: next_hop_ field not set by routing agent Error: couldn't find dest mac on channel NOW %f Error: addr_type not set to NS_AF_INET or NS_AF_NONE %s lookup failed channel @mean_backoff_rtx_limit_send_timeout_Error: wrong tx_state in unslotted aloha: %d Error: wrong rx_state in unslotted aloha: %d @Error, queue callback_ is not valid Error, no channel on repeater ?*Connector/LinkHead/SatLL/SatMac/SatMac/Sat/UnslottedAlohaPhy/SatPhy/RepeaterChannel/Sat5SatLL12MacSendTimer12MacRecvTimer6SatMac17UnslottedAlohaMac6SatPhy11RepeaterPhy10SatChannel11SatLinkHead16SatLinkHeadClass10SatLLClass11SatMacClass22UnslottedAlohaMacClass11SatPhyClass16RepeaterPhyClass15SatChannelClassdist_routing_set_downlinkset_uplinkstart_handoffError: starting non-existent handoff mgr dump_satsno such object %sset_traceset_ragentaddifset_positionset_handoff_mgr Dumping satellites at time %.2f %d %.2f %.2f %d GEO TERM Links: %.2f %.2f %.2f %.2f %d Dumped satellites at time %.2f f@F,DT! @?*Node/SatNode7SatNode12SatNodeClasstime_advance_setnodeTermSatPosition: latitude out of bounds %f TermSatPosition: longitude out of bounds %f VV@ff@F,DT! @v@F,DT! @F,DT!@plane_PolarSatPosition: altitude out of bounds: %f PolarSatPosition: alpha out of bounds: %f PolarSatPosition: lon out of bounds: %f PolarSatPosition: inclination out of bounds: %f @v@F,DT! @f@f$TAF,DT!@ERROR: inclination_ > PI F,DT! @F,DT!@F,DT!?4!3|@F,DT! @F,DT!@F,DT!?4!3|@set_nextno such object %sF,DT! @F,DT!@GeoSatPosition: longitude out of bounds %f ff@v@F,DT! @?*Position/Sat/TermPosition/Sat/PolarPosition/Sat/GeoPosition/Sat11SatPosition16PolarSatPosition14GeoSatPosition15TermSatPosition20TermSatPositionClass21PolarSatPositionClass19GeoSatPositionClass16SatPositionClass%f %f%f %f %f %f %fError: do not instantiate Position/Sat myaddr_set_nodeno such object %sError: trying to forward a packet destined to self: %d Error: distributed routing not available metric_delay_data_driven_computation_suppress_initial_computationcompute_routesMbP?Configuration error: a transmit interface is a channel target Config error: a transmit interface is a channel target Error, routelogic target not populated %f Found a link from %d to %d with cost %f @@?*Agent/SatRouteSatRouteObject13SatRouteAgent14SatRouteObject13SatRouteClass19SatRouteObjectClassNULLSRM_DATASRM_SESSSRM_RQSTSRM_REPRnullSRMcbrudp%c %.4f %d %d %s %d %s %d %s.%s %s.%s %d %d %.2f %.2f %.2f %.2f%c %.4f %d %d %s %d %s %d %s.%s %s.%s %d %d %d 0x%x %d %d %.2f %.2f %.2f %.2f%c -t %g -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}8f@F,DT! @.A??*Trace/SatTrace/Sat/Deque8SatTrace13SatDequeTrace13SatTraceClass18SatDequeTraceClass?*packetSize_seqno_sessionLossCount_ipg_beta_alpha_srtt_variance_delta_mu_phi_timeout_overhead_useFineGrain_kfrtt_kxrtt_debugEnable_rap_base_hdr_size_dpthresh_- srtt updated to %f %.3f: RAP start. %.3f: RAP stop. - numPackets %d, totalTime %f startstoplistenadvanceby- packet %d sent %.3f: RAP packet received. RAP agent %s received a packet with unknown flags %x- ack %d - found in transmission history %.3f: IPG Timeout. %.3f: RTT Timeout. - %f Cannot increase rate due to insufficient data. - ipg decreased at %.3f to %f ?- purged seq num %d - timerlost seq num %d , last sent %d - acklost seqno %d , last sent %d - %d losses detected - history size %d - ipg increased at %.3f to %f - window full packets marked inactive ?- ack sent %u [%u %u %u] %s done?*PacketHeader/RAPAgent/RAP8IpgTimer8RttTimer8RapAgent14RapHeaderClass8RapClassMediaSegmentList corrupted: Point 1. MediaSegmentList: get a seg (%d %d) which is already in cache! List contents: MediaSegmentList corrupted: Point 2. MediaSegmentList corrupted: Point 3. Wrong hole: (%d %d) tmp(%d %d), s(%d %d) List content: Wrong hole #2: (%d %d) Invalid segment added: (%d %d), (%d %d) (%d, %d) Total = %d {%d %d} segmentSize_MediaApp::start() not supported log%s: invalid log file handle %s evTrace%.17g set-layerToo many layers than maximum allowed. %.17g i %s LAYERBW_MAXACTIVELAYERS_SRTTWEIGHT_SMOOTHFACTOR_MAXBKOFF_debug_output_pref_srtt_# t %.17g i %s.%s QA %s# t %.17g i %s.%s QA PANIC INIT Phase, send packet: layer 0 in send_pkt, rate: %.3f, avgrate: %.3f, srtt:%.3f ERROR L%d is not sent but L%d is. ERROR sending[0]=0 !!!STARTUP, send packet: layer 0 ... START Playing_ layer 0, buffer[0] = %f! ** Primary DROPPED L%d, TotBuf(avail:%.1f needed:%.1f), buf[%d]: %.2f ** Not enough buf to keep the base layer, TotBuf(avail:%.1f, needed:%.1f), ** RESTART Phase, set playing_[0] to 0 to rebuffer data WARNING: MAX No of backoff Reached, bs1: %d, bs2: %d sending Just ADDED layer %d, t: %.2f # ERROR: Unknown scenario: %d !! # Should not reach here, totbuf: %.2f, totbufs1: %.2f, layers: %d # Opps, should not reach here, bs1: %d, bs2: %d, scen: %d, totbufs1: %.2f, totbufs2: %.2f, totbufavail: %.2f # ERROR: bufToDrain: %.2f # Error: bufToDrain: %.2f, %d layers, srtt: %.2f # FinalDrainArray[%d]: %.2f, tosend[%d]: %.2f # QA::get_data() reached the end. ?@ư>%s finish-stream %s# ERROR We cannot advance pointers for segment (%d %d) Layer %d, data ptr (%d %d) layer i: (%d %d) # ERROR Wrong layer sending order!! ?# ERROR: backoff: %d in bufOptScen1 # ERROR: backoff: %d in bufOptScen2 # ERROR Should not reach here, extra: %.2f, bufs2: %.2f, bufs1: %.2f, L%d ERROR in DrainBuffer: layers>0 but L0 isn't playing Buffer %d ran dry: %.2f after draining, DROP # DROP layer %d: it is playing with %.2f buf but layer %d ran dry with %.2f buf ?# ERROR interval is negative %.2f %.2f %.2f X %d %.2g %.2f X %.2f %.2fQA %s MbP?MbP@?*Application/MediaAppApplication/MediaApp/QA7AppData12MediaSegment16MediaSegmentList13HttpMediaData12MediaRequest8MediaApp7QATimer2QA8HttpData14DoubleListElem9MappClass7QAClassrap.%u.logw?*10DoubleList #%-2d %*s %d: doneerrorRTTtimeout %*s %d %s -> #%d desired_pktsunimplemented-qsexceeded-pkts%s: p^%d*q^%d, %d rtt, %d timeouts, %d states:%c#%d [%.*s] FSM/TahoeAckFSM/RenoAckFSM/TahoeDelAckFSM/RenoDelAck3FSM11TahoeAckFSM10RenoAckFSM14TahoeDelAckFSM13RenoDelAckFSM16TahoeAckFSMClass15RenoAckFSMClass19TahoeDelAckFSMClass18RenoDelAckFSMClassError: This fsm can't handle multi losses per connection Error: current fsm can't handle this tcp connection flow id %d (possibly too long) Error: weird transition timer Error: sending more than %d packets @Error: Sorry, can't handle multiple drops per batch rttadvanceadvancebyprint-statsprint?*Agent/AbsTCP/TahoeAckAgent/AbsTCP/RenoAckAgent/AbsTCP/TahoeDelAckAgent/AbsTCP/RenoDelAckAgent/AbsTCPSinkAgent/AbsTCPSink/DelAckDropTargetAgent11AbsTcpTimer11AbsTcpAgent19AbsTcpTahoeAckAgent18AbsTcpRenoAckAgent22AbsTcpTahoeDelAckAgent21AbsTcpRenoDelAckAgent10AbsTcpSink13AbsDelayTimer13AbsDelAckSink15DropTargetAgent19AbsTcpTahoeAckClass18AbsTcpRenoAckClass22AbsTcpTahoeDelAckClass21AbsTcpRenoDelAckClass15AbsTcpSinkClass18AbsDelAckSinkClass15DropTargetClassINTERESTDATADATA_READYDATA_REQUESTPOS_REINFORCENEG_REINFORCEINHIBITTX_FAILEDDATA_STOPQ?p?Q?p?Q?reset-stateresetstartstopterminatestop-sourceenable-posenable-negdisable-posdisable-negon-nodeadd-llDiffusion Node: %d lookup of %s failed tracetargetdiffusion/diffusion.cc%s: %s lookup of %s failed port-dmux>@?*PacketHeader/DiffusionAgent/Diffusion14ArpBufferTimer12SendBufTimer14DiffusionAgent15DiffHeaderClass14DiffusionClassHey, we are not in pos_reinf mode. Hey, we are not in neg_reinf mode. : X= 8< > : T; .@@)\(?)\(?)\(?B?Hey! I've never seen that packet before. .@Node %d DATA TYPE %d: send bcast data %d, not send %d, rcv %d Node %d neg bcast send %d, neg bcast rcv %d DF node %d has oif %d (%f,%d) send data %d recv neg %d pos %d Diffusion node %d has iif for %d Node %d recv new sub %d,new org %d,old org %d:send neg %d pos %d enable-suppressiondisable-suppressionset-sub-tx-typeset-org-tx-typeset-pos-typeset-pos-node-typeset-neg-win-typeset-neg-thr-typeset-neg-max-typeBROADCASTUNICASTParseSubType Error -- Only BROADCAST or UNICAST ParseOrgType Error -- Only BROADCAST or UNICAST HASHLASTALLParsePosType Error -- Only HASH, LAST, or ALL ENDINTMParsePosNodeType Error -- Only END or INTM COUNTERTIMERParseNegWinType Error -- Only COUNTER or TIMER ABSOLUTERELATIVEParseNegThrType Error -- Only ABSOLUTE or RELATIVE FIXEDSCALEParseNegMaxType Error -- Only FIXED or SCALE ?*Agent/Diffusion/RateGradient8Out_List13GradientTimer22NegativeReinforceTimer13DiffusionRate9From_List18DiffusionRateClass??Hey, we are not in pos_reinf mode. Hey, we are not in neg_reinf mode. We are not in backtracking mode. ?@d j i Pn f h packetSize_df_tcp_tick_ndatapack_srtt_init_rttvar_init_rtxcur_init_rttvar_exp_T_SRTT_BITST_RTTVAR_BITSInitRate_overhead_ssmult_bval_ca_printStatus_conservative_ecn_maxHeavyRounds_SndrType_startstopadvanceadvancebyHz>??time: %5.2f losses: %d rate %5.2f time: %5.2f rate: %5.2f time: %5.2f packetrate: %5.2f ?Hz>?@??*PacketHeader/TFRCPacketHeader/TFRC_ACKAgent/TFRC13TfrcSendTimer19TfrcNoFeedbackTimer9TfrcAgent15TFRCHeaderClass19TFRC_ACKHeaderClass9TfrcClasswA@?@@Hz>??ffffff??packetSize_InitHistorySize_NumFeedback_AdjustHistoryAfterSS_printLoss_algo_NumSamples_discount_smooth_history_minlc_error allocating memory for packet buffers Hz>invalid algo specified ?error allocating packet weightserror allocating w +error in weights string %s error allocating memory for smaple and weights:2 time: %7.5f loss_rate: %7.5f time: %7.5f sample 0: %5d loss_rate: %7.5f %f: sample 0: %5d 1: %5d 2: %5d 3: %5d 4: %5d ??8@?????*Agent/TFRCSink13TfrcNackTimer13TfrcSinkAgent13TfrcSinkClass%s add-mark m1 blue hexagon%s delete-mark m1Wrong state, quit... Illegal Node State!&@?*EnergyModel22AdaptiveFidelityEntity19SoftNeighborHandler11EnergyModel7Handler16EnergyModelClassWrong arguments to ErrorModelpacketSize_send%s recv %d %3.1f@@?*PacketHeader/PingAgent/Ping9PingAgent15PingHeaderClass9PingClassadd793expbackoff_add793jacobsonrtt_add793fastrtx_add793slowstart_add793additiveinc_add793karnrtt_add793exponinc_rto_??8t?*Agent/TCP/RFC793edu17RFC793eduTcpAgent17RFC793eduTcpClassDropin_thresh_in_maxthresh_out_thresh_out_maxthresh_in_linterm_in_gentle_out_gentle_in_ave_out_ave_in_prob1_out_prob1_priority_method_@avein_aveout_aveprobin_probout_probcurqRIO:unknown trace var %s Q %g %d%c %g %gin_minth: %f, in_maxth: %f out_minth: %f, out_maxth: %f qlim: %d, in_idletime: %f ========= in_v_a: %f, in_v_b: %f out_v_a: %f, out_v_b: %f ?*Queue/RED/RIO8RIOQueue8RIOClass?*Queue/RED/RIO/Semantic16SemanticRIOClassDrop16SemanticRIOQueue?????*Agent/TCP/SackRH14SackRHTcpAgent14SackRHTcpClassError, scoreboard too large (increase SBSIZE for more space) Assert SB failed Assert1 SB (length) Renege!!! seqno = %d ?*flag_PP_packet_time_PP_fid_PP_seqno_%s log-loss%s log-PP?*Agent/LossMonitor/PLM14PLMLossMonitor19PLMLossMonitorClassrate_random_packetSize_maxpkts_PBM_@ư>NEW_BURST?*Application/Traffic/CBR_PP14CBR_PP_Traffic19CBR_PP_TrafficClass?*PacketHeader/rtProtoLS15rtLSHeaderClassminimum-lspiddont-careordered-control?on-demand?enable-ordered-controlenable-on-demand%dttl_trace_mpls_label_enable_reroute_reroute_option_data_driven_control_driven_[%s set mpls_mod_] get-link-status %ddownDrop(linkFail)L%s ldp-trigger-by-switch %dPush(penultimate)UPush(ingress)L3(errorLabel)L3(errorOIF)Pop(penultimate)SwapPush(tunnel)L3(errorOIf)L3L3(TTL=0)%s routing-update %d %.15g%s routing-nochange %d %.15g%s routing-new %d %.15gcontrol-driven?data-driven?enable-control-drivenenable-data-drivenPFTdumpERBdumpLIBdumpget-fec-for-lspid-1exist-fec1GetInIfaceGetInLabelGetOutIfaceGetOutLabelinstallErLspBindingErLspStackingFlowAggregationaPathBindingLSPreleaseLSPsetup --) ___PFT dump___ [node: %s] (-- --------------------------------------------- FEC PHB LIBptr AltanativePath %d %d --) ___ERB dump___ [node: %s] (-- FEC LSPid LIBptr Error in LIBinstall: higher than MaxLIBEntryNB ___LIB dump___ [node: %s] # iIface iLabel oIface oLabel LIBptr %d: %d %s trace-packet-switching %.15g %d %d %s %d %s %d %d %d %d?*PacketHeader/MPLSClassifier/Addr/MPLS21MPLSAddressClassifier23MPLSAddrClassifierClass17shimhdreaderClasstrace_ldp_msgtbl-dumpnew-msgid%dpeer-ldpnodeset-peermsgtbl-clearmsgtbl-get-srcmsgtbl-get-reqmsgidmsgtbl-get-labelopmsgtbl-get-erlspidmsgtbl-set-labelpassnotification-msg*LoopDetectedNoRoutewithdraw-msgrelease-msgrequest-msgmsgtbl-set-labelstackmsgtbl-get-msgidmapping-msgcr-mapping-msgcr-request-msgmsgtbl-install%s get-notification-msg %d %s %d%s get-cr-mapping-msg %d %d %d %d %d %d%s get-mapping-msg %d %d %d %d %s %d%s get-cr-request-msg %d %d %d %s %s %d %d%s get-request-msg %d %d %d %s%s get-withdraw-msg %d %d %d%s get-release-msg %d %d %d # MsgID = # FEC = # LspID = # Src = # PMsgID= # LabelOp=%s trace-ldp-packet %d %d %s %d %d %d %s %d %s %d %d %s %7fNotificationCR-MappingMappingCR-RequestRequestWithdrawReleaseErrorUnknown?PacketHeader/LDPAgent/LDP8LDPAgent14LDPHeaderClass8LDPClassnew-incoming-label%dnew-outgoing-labelget-ldp-agents%s %strace-ldptrace-msgtbl%d : message-table attach-ldpWrong object name %sdetach-ldpexist-ldp-agentget-ldp-agent%sroute-notifyInvalid node object %sNode object %s different from n_unreg-route-notifyattach-classifier?*RtModule/MPLS10MPLSModuleMPLS15MPLSModuleClassclassifier_node%smodule-nameattach-nodeWrong object name %sroute-notifyInvalid node object %sNode object %s different from n_unreg-route-notifyNode object %s different from node_defaultHashClassifier::set_hash() return value less than 0 ?*RtModuleRtModule/BaseRtModule/McastRtModule/HierRtModule/ManualRtModule/SourceRtModule/VC13RoutingModule17BaseRoutingModule18McastRoutingModule17HierRoutingModule19ManualRoutingModule19SourceRoutingModule15VcRoutingModuleBaseMcastHierManualSourceVC18RoutingModuleClass22BaseRoutingModuleClass23McastRoutingModuleClass22HierRoutingModuleClass24ManualRoutingModuleClass24SourceRoutingModuleClass20VcRoutingModuleClassclassifier%sdefaulttargetclearadd-classifierClassifier/Hier14HierClassifier19HierClassifierClassMcastShiftMcastMaskNodeShiftNodeMaskPortMaskPortShifthlevelnodebits%dAddrParams15AddrParamsClassCannot create instance of AddrParamsClass?*PacketHeader/NV13NVHeaderClassNixClassifier::find(), Unknown node id Returning Dmux objet %p Error! NixClassifier %s called with no NixVector NixClassifier::find(), can't find node id %ld Classifier %s, Node %ld next hop %ld (%s) set-node-idinstall%s NixClassifier::Command node %ld install %s %s m_Dmux obj is %p ?*Classifier/Nix13NixClassifier18NixClassifierClassHello from NixNode Constructor Node %ld adding neighbor %ld NextAdj returning first edge %ld NextAdj returning next edge %ld w %d Non-linear advance of NextAdj Computing nixvector from %ld to %ld Node %ld Getnix to target %ld, adjsize %d Node %ld checking nb %ld Nix %ld out of range (0 - %d Node %ld processing edge %ld [Simulator instance] get-link-head %d %dFound head at %s %s info classClass is %s Total NV %d Min %d Max %d Avg %f out of memory?*7NixNodeHello from RNOde::Getnix (should never occur) 5RNodePrinting adj for node %ld (addr %p) Found adj %ld Working on node %ld addr %p Enqueued %ld out of memoryHello from bitmap constructor size %ld bpe %ld epw %d m_Words %ld Exiting bitmap constructor Get which %ld Mask %08lx Shift %d Get Bit Mask m %08lx shifted m %08lx Size %ld BPE %ld Words %ld EPW %d Word 0 %08lx Word %ld %08lx Pop size %d Pop %d = %ld LOG calledPopulate(istream) called Created NOLookup Created FRLookup Created BMLookup Creating nix entry %d BMLookup::Populate..found %d NHN BLookup lookedup entry %ld ind %ld, found %ld Created HMLookup Created NHLookup out of memory7RLookup8NOLookup8FRLookup8BMLookup8HMLookup8NHLookupRoute to node %ld is : Parent vector is %ldPrinting Nv from %ld %ld PrintNix Error, no node for %ld Node %ld nixl %ld Huh? Node %ld can't get neighbor %ld No path..RouteAlgo::GetNix returned NIX_NONE! NVAdding ind %ld lth %ld Hello from nixvec destructor Extracting %ld bits, used %ld lth %ld alth %ld Lth %3ld ActualLth %3ld Used %3ld val[0] %08lx val[%ld] %08lx ?*RtModule/Nix21NixRoutingModuleClass16NixRoutingModuleNixnumQueues_ecn_?ERROR: No match found for code point %d in PHB Table. ERROR: PHB Table size limit exceeded. dropsedropspktsERROR: Cannot declare more than %d prcedence levels (as defined by MAX_PREC) RIO-CRIO-DWREDDROPError: MRED mode %s does not exist PHB Table: Code Point %d is associated with Queue %d, Precedence %d Packets Statistics ======================================= CP TotPkts TxPkts ldrops edrops -- ------- ------ ------ ------ All %8ld %8ld %8ld %8ld %3d %8ld %8ld %8ld %8ld %d: %d %d %d. RRWRRWIRRPRIError: Scheduler type %s does not exist The queue number is out of range. ?configQaddPHBEntrymeanPktSizesetNumPrecgetAverage%fgetStatgetCurrentprintStatsprintWRRcountprintPHBTablelinkRED: no LinkDelay object %searly-drop-targetno object %ssetSchedularModesetMREDModeaddQueueWeightsaddQueueRate?*Queue/dsRED10dsREDQueue10dsREDClassaddPolicyEntryaddPolicerEntrygetCBucket%fprintPolicyTableprintPolicerTable?*Queue/dsRED/edge9edgeQueue16PolicyClassifier9edgeClass?*Queue/dsRED/core9coreQueue9coreClassERROR: Policy Table size limit exceeded. DumbTSW2CMTSW3CMTokenBucketsrTCMtrTCMFWNo applicable policy specified, exit!!! ?ERROR: No Policy Table entry found for Source %d-Destination %d. ERROR: Policer Table size limit exceeded. No applicable policer specified, exit!!! ERROR: No Policer Table entry found for initial code point %d. The policy object doesn't exist, ERROR!!! ERROR: cannot update RTT; no existing policy found for Source %d-Desination %d. ERROR: cannot get bucket size; no existing policy found for Source %d-Desination %d. ERROR: cannot get bucket size; the Source %d-Desination %d Policy does not include a Committed Bucket. Policy Table(%d): Flow (%d to %d): DUMB policer, initial code point %d Flow (%d to %d): TSW2CM policer, initial code point %d, CIR %.1f bps. Flow (%d to %d): TSW3CM policer, initial code point %d, CIR %.1f bps, PIR %.1f bytes. Flow (%d to %d): Token Bucket policer, initial code point %d, CIR %.1f bps, CBS %.1f bytes. Flow (%d to %d): srTCM policer, initial code point %d, CIR %.1f bps, CBS %.1f bytes, EBS %.1f bytes. Flow (%d to %d): trTCM policer, initial code point %d, CIR %.1f bps, CBS %.1f bytes, PIR %.1f bps, PBS %.1f bytes. Flow (%d to %d): FW policer, initial code point %d, TH %d bytes. ERROR: Unknown policer type in Policy Table. @ t40Policer Table: Dumb TSW2CM TSW3CM Token Bucket srTCM trTCM FW ERROR: Unknown policer type in Policer Table.policer code point %d is policed to yellow code point %d and red code point %d. policer code point %d is policed to code point %d. $8DXlfree flow: %d @MISS: no flow %d in the table ?Flow table: flow id: %d, bytesSent: %d, last_update: %f ?*16PolicyClassifier6Policy10DumbPolicy12TSW2CMPolicy12TSW3CMPolicy8TBPolicy11SRTCMPolicy11TRTCMPolicy8FWPolicy? @?*RedPD : Too Long a trace type. Change the field length in red-pd.h and recompile auto_global_target_noidle_targetBW_noMonitored_unresponsive_penalty_P_testFRp_RedPD: ERROR: FlowMonitor Not Found -- RedPD: ERROR: Flow Not Found FRp_ mode ON with %g ?mon-edrop-trace%s0mon-trace-typeattach-flowmonError Creating Flowmonitor RedPD: Flow Monitor Set to %s showmeshowing now : %s = %d Error Attaching Trace RedPD: MEDTrace Set to %s unmonitor-flowCannot unmonitor an unmonitored flow: %d noMonitored gone below ZERO unresponsive-flowCannot make an unmonitored flow unresponsive: %d responsive-flowCannot make a responsive flow responsive: %d monitor-flow%s monitor-flow %s %g 1%s set targetBW_ %s%s set currentBW_ %s??*Queue/RED/PDQueueMonitor/ED/Flow/RedPD10RedPDQueue10ReDPDClass14RedPDFlowClassDrop calling null arg2 size_pkts_parrivals_barrivals_pdepartures_bdepartures_pdrops_bdrops_estimate_rate_k_prevTime_startTime_estRate_ebdrops_epdrops_mon_ebdrops_mon_epdrops_src_dst_flowid_currentBW_monitored_unresponsive_lastDropTime_monitorStartTime_unresponsiveStartTime_14EDQueueMonitor4Flow9RedPDFlowError: Anomaly Error: Anomaly no 2 RLSL: Error. No session in progress RLSL: Error. The correct RLS not found RLS: Error: logdata count or ID anomaly RLS: Error: Out of order log nodes. Or something more sinister RLS: Error: Different chains ?*TB: Starting a token bucket at %g with rate %g bps RLSt: Restricting type %d to %g hogging=%g at %g PTLog: invalid index ??*13PacketTypeLog22TokenBucketRateLimiter11RateLimiterTraversal %d/%d %d ERROR: Address out of Range ??ffffff?Error: Too Small MAX_CLUSTER. Increase and Recompile 333333???*AS: Error: Should never come here ?*LGDS: Error: This should never happen now LGDS: sender not in my list (status processing) חA??*??*DropWrong Argument for Pushback Queue Constructor pushbackID_rate_limiting_pushback queue instantiated %d PBQ:(%d:%d) rate limiting = %d rldrop-trace%s0set-monitorGot Invalid Queue Monitor Error Attaching Trace PBQ: RLDropTrace Set to %s set-src-dstGot Invalid Source or Destination PBQ:(%d:%d) (%g) arrs %d drops %d deps %d mdrops %d dr %g %g %s resetPBQ:(%d:%d) (%g) Arr: %d (%g) Drops: %d (%g %g) BW: %g ??In queue enque with ptype %d %d PBQ:(%d:%d). Got a pushback packet. |Gzt???*Queue/RED/Pushback13PushbackQueue18PushbackQueueTimer18PushbackQueueClassMissing Argument for Pushback Queue Constructor last_index_intResult_enable_pushback_verbose_initializeImproper Initialization for Pushback Agent node=%s rtLogic=%s id=%d address=%d add-queuequeue list size exhausted - recompile with a bigger MAX_QUEUES NULL queue passed %dGot invalid qid %d DropDetails from queue %d: %d.%d -> %d.%d (%d) Got invalid id from queue in identifyAggregate LB: count: %d totalCount_: %d arrRate: %g Warning: All clusters being rate limited identifyAggregate for %d got subset aggregate. Lowerbound = %g. agg = got rate <= minRate. agg = starting rate-limiting lower=%g estimate=%g agg @? drop log reset for qid %d Got invalid id from queue in resetDropLog CHECKREFRESHSTATUSINITIAL UPDATEUNKNOWN %s event for qid %d Unrecognized event %d Error: Update when not in initialphase Initial-Update: qdrop=%g dr=%g newL=%g oldTarget=%g lowerBound=%g arr=%g ???@??@ Warning: status timer expired for non-leaf node Some sessions merged. old = %d new = %d No sessions merged. number = %d Number of sessions = %d Releasing because of too many being rate-limited arr=%g totalLimit=%g totalRateLimit=%g excess=%g Negative Excess Rate. Things maybe fine now. Refresh. target=%g limit=%g floor=%g Waiting Zone 1: sendRate=%g oldLimit=%g Waiting Zone 2: sendRate=%g oldLimit=%g $@ffffff?4@??@Stopping rate-limiting for aggregate: REQUESTCANCEL %s msg from %d PBA: %s Undefined Message ID %d pushback request from %d for qid=%d limit=%g PBA: %s got a pushback req for agg I already rate-limit. Feature not yet Implemented @ Got invalid qid from %d in status message session %d not found height increased to %d got rate %g pushback refresh from %d for qid=%d with limit=%g ?@ pushback cancel from %d for queue index %d Sending refresh messages to %d nodes. Limit = %g arrRate = %g ?%s set intResult_ [%s check-queue %d %d %s] right queue not found %s set intResult_ [%s get-pba-port %d]PBA: %s Pushback Agent not found on Node %d sent %s message to %d.%d PBA:%d (%g) %sPushbackTimer: No event found on expiry %s timer set Timer: Nothing to schedule Error timer list empty Error status timer not found Sanity Check Failed ?*PacketHeader/PushbackAgent/Pushback13PushbackAgent13PushbackTimer19PushbackHeaderClass13PushbackClassaddrnodeidattach-classifierWrong object name %s?*LanNodeAbsLanNodeNode/Broadcast7LanNode10AbsLanNode13BroadcastNode10ParentNode12LanNodeClass15AbsLanNodeClass18BroadcastNodeClassdetachflushattachtrace: can't attach %s for writingnamattach?*BaseTraceBaseTrace/Event9BaseTrace10EventTrace?14BaseTraceClass15EventTraceClasspopulate-flat-classifierspopulate-hier-classifiersget-routelogicWrong rtobject name %sadd-nodeWrong object name %sadd-lannodeadd-abslan-nodeadd-broadcast-node%d%s%d%d.[Simulator instance] get-link-head %d %d?*Simulator9Simulator14SimulatorClass%s LsTopoMap::insertLinkState failed Can't insert new message in LsMessageCenter::newMessage. @Can't insert.AAAWait a minute, nothing to send for this neighborLsRouting::linkStateChanged: linkStateListPtr null LsRouting::linkStateChanged: oldLsPtr null!! New and old link State list are not aligned. 0 @@_Can't get new link state list, in LsRouting::sendLinkStates lsl is empty, in LsRouting::regenAndSend. computeRoutes: nhlp == NULL popShortestPath() failed 14LsRetransTimerout of memorysend-updatelookupinitializesetDelaysetNodeNumbercomputeRoutesintfChangedsend-buffered-messagessendUpdates%s recv-update %d %d%s get-node-id%s get-peers %s get-links-status%s get-delay-estimates%s set LS_ready%s%d %d%s route-changed?*Agent/rtProto/LS9rtProtoLSout of memory6LsNode14rtProtoLSclass set slinks_(0:0) 0 set nconn_ 0 set conn_(0) 0:0 proc warn {msg} { global warned_ if {![info exists warned_($msg)]} { puts stderr "warning: $msg" set warned_($msg) 1 } } if {[info commands debug] == ""} { proc debug args { warn {Script debugging disabled. Reconfigure with --with-tcldebug, and recompile.} } } proc assert args { if [catch "expr $args" ret] { set ret [eval expr $args] } if {! $ret} { error "assertion failed: $args" } } proc find-max list { set max 0 foreach val $list { if {$val > $max} { set max $val } } return $max } proc bw_parse { bspec } { if { [scan $bspec "%f%s" b unit] == 1 } { set unit bps } regsub {[/p]s(ec)?$} $unit {} unit if [string match {*B} $unit] { set b [expr $b*8] set unit "[string trimright B $unit]b" } switch $unit { b { return $b } kb { return [expr $b*1000] } Mb { return [expr $b*1000000] } Gb { return [expr $b*1000000000] } default { puts "error: bw_parse: unknown unit `$unit'" exit 1 } } } proc time_parse { spec } { if { [scan $spec "%f%s" t unit] == 1 } { set unit s } regsub {sec$} $unit {s} unit switch $unit { s { return $t } ms { return [expr $t*1e-3] } us { return [expr $t*1e-6] } ns { return [expr $t*1e-9] } ps { return [expr $t*1e-12] } default { puts "error: time_parse: unknown unit `$unit'" exit 1 } } } proc delay_parse { spec } { return [time_parse $spec] } proc checkout_executable {exe_var best alternate text} { global $exe_var set $exe_var $best if {"$best" == "" || ![file executable $best]} { puts stderr $text set $exe_var $alternate } } checkout_executable PERL "/usr/bin/perl" perl "\ When configured, ns found the right version of perl in\ /usr/bin/perl but it doesn't seem to be there anymore, so\ ns will fall back on running the first perl in your path.\ The wrong version of perl may break the test suites.\ Reconfigure and rebuild ns if this is a problem.\ " checkout_executable TCLSH "/local/akuzma/myns/ns-allinone-2.1b8a/bin/tclsh8.3" tclsh "\ When configured, ns found the right version of tclsh in\ /local/akuzma/myns/ns-allinone-2.1b8a/bin/tclsh8.3 but it doesn't seem to be there anymore, so\ ns will fall back on running the first tclsh in your path.\ The wrong version of tclsh may break the test suites.\ Reconfigure and rebuild ns if this is a problem.\ " Class AllocAddrBits Simulator proc address-format {} { return [Simulator set AddressFormat_] } Simulator proc default-addr? {} { if { [Simulator set AddressFormat_] == "DEF" } { return 1 } else { return 0 } } Simulator proc hier-addr? {} { if { [Simulator set AddressFormat_] == "HIER" } { return 1 } else { return 0 } } Simulator instproc set-address-format {opt args} { set len [llength $args] if {[string compare $opt "def"] == 0} { $self set-address 32 set mcastshift [AddrParams McastShift] Simulator set McastAddr_ [expr 1 << $mcastshift] mrtObject expandaddr Simulator set AddressFormat_ DEF } elseif {[string compare $opt "expanded"] == 0} { puts "set-address-format expanded is obsoleted by 32-bit addressing." } elseif {[string compare $opt "hierarchical"] == 0 && $len == 0} { if [$self multicast?] { $self set-hieraddress 3 9 11 11 } else { $self set-hieraddress 3 10 11 11 } } elseif {[string compare $opt "hierarchical"] == 0 && $len > 0} { eval $self set-hieraddress [lindex $args 0] \ [lrange $args 1 [expr $len - 1]] } else { error "ns-address.tcl:set-address-format: Unknown address format $opt" } } Simulator instproc set-hieraddress {hlevel args} { set a [$self get-AllocAddrBits "new"] $a set size_ [AllocAddrBits set MAXADDRSIZE_] Simulator set AddressFormat_ HIER Node enable-module "Hier" if [$self multicast?] { $a set-mcastbits 1 } eval $a set-idbits $hlevel $args } Simulator instproc set-address {node} { set a [$self get-AllocAddrBits "new"] $a set size_ [AllocAddrBits set DEFADDRSIZE_] if {[expr $node] > [$a set size_]} { $a set size_ [AllocAddrBits set MAXADDRSIZE_] } $a set-mcastbits 1 set lastbit [expr $node - [$a set mcastsize_]] $a set-idbits 1 $lastbit } Simulator instproc get-AllocAddrBits {prog} { $self instvar allocAddr_ if ![info exists allocAddr_] { set allocAddr_ [new AllocAddrBits] } elseif ![string compare $prog "new"] { set allocAddr_ [new AllocAddrBits] } return $allocAddr_ } Simulator instproc expand-port-field-bits nbits { puts "Warning: Simulator::expand-port-field-bits is obsolete. Ports are 32 bits wide" return } Simulator instproc expand-address {} { puts "Warning: Simulator::expand-address is obsolete. The node address is 32 bits wides" return } AllocAddrBits instproc init {} { eval $self next $self instvar size_ portsize_ idsize_ mcastsize_ set size_ 0 set portsize_ 0 set idsize_ 0 set mcastsize_ 0 } AllocAddrBits instproc get-AllocAddr {} { $self instvar addrStruct_ if ![info exists addrStruct_] { set addrStruct_ [new AllocAddr] } return $addrStruct_ } AllocAddrBits instproc get-Address {} { $self instvar address_ if ![info exists address_] { set address_ [new Address] } return $address_ } AllocAddrBits instproc chksize {bit_num prog} { $self instvar size_ portsize_ idsize_ mcastsize_ if {$bit_num <= 0 } { error "$prog : \# bits less than 1" } set totsize [expr $portsize_ + $idsize_ + $mcastsize_] if {$totsize > [AllocAddrBits set MAXADDRSIZE_]} { error "$prog : Total \# bits exceed MAXADDRSIZE" } if { $size_ < [AllocAddrBits set MAXADDRSIZE_]} { if {$totsize > [AllocAddrBits set DEFADDRSIZE_]} { set size_ [AllocAddrBits set MAXADDRSIZE_] return 1 } } return 0 } AllocAddrBits instproc set-portbits {bit_num} { puts "Warning: AllocAddrBits::set-portbits is obsolete. Ports are 32 bits wide." return } AllocAddrBits instproc expand-portbits nbits { puts "Warning: AllocAddrBits::expand-portbits is obsolete. Ports are 32 bits wide." return } AllocAddrBits instproc set-mcastbits {bit_num} { $self instvar size_ mcastsize_ if {$bit_num != 1} { error "setmcast : mcastbit > 1" } set mcastsize_ $bit_num if [$self chksize mcastsize_ "setmcast"] { error "set-mcastbits: size_ has been changed." } set a [$self get-AllocAddr] set v [$a setbit $bit_num $size_] AddrParams McastMask [lindex $v 0] AddrParams McastShift [lindex $v 1] set ad [$self get-Address] $ad mcastbits-are [AddrParams McastShift] [AddrParams McastMask] } AllocAddrBits instproc set-idbits {nlevel args} { $self instvar size_ portsize_ idsize_ hlevel_ hbits_ if {$nlevel != [llength $args]} { error "setid: hlevel < 1 OR nlevel and \# args donot match" } set a [$self get-AllocAddr] set old 0 set idsize_ 0 set nodebits 0 AddrParams hlevel $nlevel set hlevel_ $nlevel for {set i 0} {$i < $nlevel} {incr i} { set bpl($i) [lindex $args $i] set idsize_ [expr $idsize_ + $bpl($i)] set chk [$self chksize $bpl($i) "setid"] if {$chk > 0} { error "set-idbits: size_ has been changed." } set v [$a setbit $bpl($i) $size_] AddrParams NodeMask [expr $i+1] [lindex $v 0] set m([expr $i+1]) [lindex $v 0] AddrParams NodeShift [expr $i+1] [lindex $v 1] set s([expr $i+1]) [lindex $v 1] lappend hbits_ $bpl($i) } AddrParams nodebits $idsize_ set ad [$self get-Address] eval $ad idsbits-are [array get s] eval $ad idmbits-are [array get m] eval $ad bpl-are $hbits_ } AddrParams proc addr2id addrstr { if [Simulator hier-addr?] { set addressObj [[[Simulator instance] get-AllocAddrBits ""] \ get-Address] return [$addressObj str2addr $addrstr] } else { return [expr $addrstr & [AddrParams NodeMask 1] << \ [AddrParams NodeShift 1]] } } AddrParams proc id2addr addr { for {set i 1} {$i <= [AddrParams hlevel]} {incr i} { set a [expr ($addr >> [AddrParams NodeShift $i]) & \ [AddrParams NodeMask $i]] lappend str $a } return $str } AddrParams proc split-addrstr addrstr { return [split $addrstr .] } AddrParams proc elements-in-level? {nodeaddr level} { AddrParams instvar domain_num_ cluster_num_ nodes_num_ set L [AddrParams split-addrstr $nodeaddr] set level [expr $level + 1] if { $level == 1} { return $domain_num_ } if { $level == 2} { return [lindex $cluster_num_ [lindex $L 0]] } if { $level == 3} { set C 0 set index 0 while {$C < [lindex $L 0]} { set index [expr $index + [lindex $cluster_num_ $C]] incr C } return [lindex $nodes_num_ [expr $index + [lindex $L 1]]] } } Node set nn_ 0 Node proc getid {} { set id [Node set nn_] Node set nn_ [expr $id + 1] return $id } Node set module_list_ { Base } Node proc enable-module { mod_name } { Node instvar module_list_ if { [lsearch $module_list_ $mod_name] < 0 } { lappend module_list_ $mod_name } } Node proc disable-module { mod_name } { Node instvar module_list_ set pos [lsearch $module_list_ $mod_name] if { $pos >= 0 } { set module_list_ [lreplace $module_list_ $pos $pos] } } Node instproc init args { eval $self next $args $self instvar id_ agents_ dmux_ neighbor_ rtsize_ address_ \ nodetype_ multiPath_ ns_ rtnotif_ ptnotif_ set ns_ [Simulator instance] set id_ [Node getid] $self nodeid $id_ ;# Propagate id_ into c++ space if {[llength $args] != 0} { set address_ [lindex $args 0] } else { set address_ $id_ } $self cmd addr $address_; # new by tomh set neighbor_ "" set agents_ "" set dmux_ "" set rtsize_ 0 set ptnotif_ {} set rtnotif_ {} set nodetype_ [$ns_ get-nodetype] $self mk-default-classifier set multiPath_ [$class set multiPath_] } Node instproc mk-default-classifier {} { Node instvar module_list_ foreach modname [Node set module_list_] { $self register-module [new RtModule/$modname] } } Node instproc id {} { return [$self set id_] } Node instproc node-addr {} { return [$self set address_] } Node instproc node-type {} { return [$self set nodetype_] } Node instproc register-module { mod } { $self instvar reg_module_ $mod register $self set reg_module_([$mod module-name]) $mod } Node instproc unregister-module { mod } { $self instvar reg_module_ $mod unregister unset reg_module_([$mod module-name]) delete $mod } Node instproc list-modules {} { $self instvar reg_module_ set ret "" foreach n [array names reg_module_] { lappend ret $reg_module_($n) } return $ret } Node instproc get-module { name } { $self instvar reg_module_ if [info exists reg_module_($name)] { return $reg_module_($name) } else { return "" } } Node instproc incr-rtgtable-size {} { $self instvar rtsize_ incr rtsize_ } Node instproc decr-rtgtable-size {} { $self instvar rtsize_ incr rtsize_ -1 } Node instproc entry {} { return [$self set classifier_] } Node instproc insert-entry { module clsfr {hook ""} } { $self instvar classifier_ mod_assoc_ hook_assoc_ if { $hook != "" } { set hook_assoc_($clsfr) $classifier_ if { $hook == "target" } { $clsfr target $classifier_ } elseif { $hook != "" } { $clsfr install $hook $classifier_ } } set mod_assoc_($clsfr) $module set classifier_ $clsfr } Node instproc install-entry { module clsfr {hook ""} } { $self instvar classifier_ mod_assoc_ hook_assoc_ if [info exists classifier_] { if [info exists mod_assoc_($classifier_)] { $self unregister-module $mod_assoc_($classifier_) unset mod_assoc_($classifier_) } if [info exists hook_assoc_($classifier_)] { if { $hook == "target" } { $clsfr target $hook_assoc($classifier_) } elseif { $hook != "" } { $clsfr install $hook $hook_assoc_($classifier_) } set hook_assoc_($clsfr) $hook_assoc_($classifier_) unset hook_assoc_($classifier_) } } set mod_assoc_($clsfr) $module set classifier_ $clsfr } Node instproc route-notify { module } { $self instvar rtnotif_ if {$rtnotif_ == ""} { set rtnotif_ $module } else { $rtnotif_ route-notify $module } $module cmd route-notify $self } Node instproc unreg-route-notify { module } { $self instvar rtnotif_ if {$rtnotif_ != ""} { if {$rtnotif_ == $module} { set rtnotif_ [$rtnotif_ set next_rtm_] } else { $rtnotif_ unreg-route-notify $module } } $module cmd unreg-route-notify $self } Node instproc add-route { dst target } { $self instvar rtnotif_ if {$rtnotif_ != ""} { $rtnotif_ add-route $dst $target } $self incr-rtgtable-size } Node instproc delete-route args { $self instvar rtnotif_ if {$rtnotif_ != ""} { eval $rtnotif_ delete-route $args } $self decr-rtgtable-size } Node instproc init-routing rtObject { $self instvar multiPath_ routes_ rtObject_ set nn [$class set nn_] for {set i 0} {$i < $nn} {incr i} { set routes_($i) 0 } if ![info exists rtObject_] { $self set rtObject_ $rtObject } $self set rtObject_ } Node instproc rtObject? {} { $self instvar rtObject_ if ![info exists rtObject_] { return "" } else { return $rtObject_ } } Node instproc intf-changed {} { $self instvar rtObject_ if [info exists rtObject_] { ;# i.e. detailed dynamic routing $rtObject_ intf-changed } } Node instproc add-routes {id ifs} { $self instvar classifier_ multiPath_ routes_ mpathClsfr_ if !$multiPath_ { if {[llength $ifs] > 1} { warn "$class::$proc cannot install multiple routes" set ifs [lindex $ifs 0] } $self add-route $id [$ifs head] set routes_($id) 1 return } if {$routes_($id) <= 0 && [llength $ifs] == 1 && \ ![info exists mpathClsfr_($id)]} { $self add-route $id [$ifs head] set routes_($id) 1 } else { if ![info exists mpathClsfr_($id)] { set mpathClsfr_($id) [new Classifier/MultiPath] if {$routes_($id) > 0} { assert "$routes_($id) == 1" $mpathClsfr_($id) installNext \ [$classifier_ in-slot? $id] } $classifier_ install $id $mpathClsfr_($id) } foreach L $ifs { $mpathClsfr_($id) installNext [$L head] incr routes_($id) } } } Node instproc delete-routes {id ifs nullagent} { $self instvar mpathClsfr_ routes_ if [info exists mpathClsfr_($id)] { foreach L $ifs { set nonLink([$L head]) 1 } foreach {slot link} [$mpathClsfr_($id) adjacents] { if [info exists nonLink($link)] { $mpathClsfr_($id) clear $slot incr routes_($id) -1 } } } else { $self delete-route $id $nullagent incr routes_($id) -1 } } Node instproc enable-mcast args { $self register-module [new RtModule/Mcast] } Node instproc alloc-port { nullagent } { return [[$self set dmux_] alloc-port $nullagent] } Node instproc agent port { $self instvar agents_ foreach a $agents_ { if { [$a set agent_port_] == $port } { return $a } } return "" } Node instproc demux {} { return [$self set dmux_] } Node instproc install-demux { demux {port ""} } { $self instvar dmux_ address_ if { $dmux_ != "" } { $self delete-route $dmux_ if { $port != "" } { $demux install $port $dmux_ } } set dmux_ $demux $self add-route $address_ $dmux_ } Node instproc port-notify { module } { $self instvar ptnotif_ lappend ptnotif_ $module } Node instproc unreg-port-notify { module } { $self instvar ptnotif_ set pos [lsearch $ptnotif_ $module] if { $pos >= 0 } { set ptnotif_ [lreplace $ptnotif_ $pos $pos] } } Node instproc attach { agent { port "" } } { $self instvar agents_ address_ dmux_ lappend agents_ $agent $agent set node_ $self $agent set agent_addr_ [AddrParams addr2id $address_] if { $dmux_ == "" } { set dmux_ [new Classifier/Port] $self add-route $address_ $dmux_ } if { $port == "" } { set port [$dmux_ alloc-port [[Simulator instance] nullagent]] } $agent set agent_port_ $port $self add-target $agent $port } Node instproc add-target { agent port } { $self instvar ptnotif_ foreach m [$self set ptnotif_] { $m attach $agent $port } } Node instproc detach { agent nullagent } { $self instvar agents_ dmux_ set k [lsearch -exact $agents_ $agent] if { $k >= 0 } { set agents_ [lreplace $agents_ $k $k] } $agent set node_ "" $agent set agent_addr_ 0 $agent target $nullagent $dmux_ install [$agent set agent_port_] $nullagent foreach m [$self set ptnotif_] { $m detach $agent $nullagent } } Node instproc reset {} { $self instvar agents_ foreach a $agents_ { $a reset } foreach m [$self list-modules] { $m reset } } Node instproc neighbors {} { $self instvar neighbor_ return [lsort $neighbor_] } Node instproc add-neighbor {p {pushback 0}} { $self instvar neighbor_ lappend neighbor_ $p if { $pushback == 1 } { $self cmd add-neighbor $p } } Node instproc is-neighbor { node } { $self instvar neighbor_ return [expr [lsearch $neighbor_ $node] != -1] } RtModule instproc register { node } { $self attach-node $node $node route-notify $self $node port-notify $self } RtModule instproc init {} { $self next $self instvar classifier_ next_rtm_ set next_rtm_ "" set classifier_ "" } RtModule instproc unregister {} { $self instvar classifier_ delete $classifier_ [$self node] unreg-route-notify $self [$self node] unreg-port-notify $self } RtModule instproc route-notify { module } { $self instvar next_rtm_ if {$next_rtm_ == ""} { set next_rtm_ $module } else { $next_rtm_ route-notify $module } } RtModule instproc unreg-route-notify { module } { $self instvar next_rtm_ if {$next_rtm_ != ""} { if {$next_rtm_ == $module} { set next_rtm_ [$next_rtm_ set next_rtm_] } else { $next_rtm_ unreg-route-notify $module } } } RtModule instproc add-route { dst target } { $self instvar next_rtm_ [$self set classifier_] install $dst $target if {$next_rtm_ != ""} { $next_rtm_ add-route $dst $target } } RtModule instproc delete-route { dst nullagent} { $self instvar next_rtm_ [$self set classifier_] install $dst $nullagent if {$next_rtm_ != ""} { $next_rtm_ delete-route $dst $nullagent } } RtModule instproc attach { agent port } { $agent target [[$self node] entry] [[$self node] demux] install $port $agent } RtModule instproc detach { agent nullagent } { } RtModule instproc reset {} { } RtModule/Base instproc register { node } { $self next $node $self instvar classifier_ set classifier_ [new Classifier/Hash/Dest 32] $classifier_ set mask_ [AddrParams NodeMask 1] $classifier_ set shift_ [AddrParams NodeShift 1] $node install-entry $self $classifier_ } RtModule/Mcast instproc register { node } { $self next $node $self instvar classifier_ $self set classifier_ [$node entry] $node set switch_ [new Classifier/Addr] [$node set switch_] set mask_ [AddrParams McastMask] [$node set switch_] set shift_ [AddrParams McastShift] $node set multiclassifier_ [new Classifier/Multicast/Replicator] [$node set multiclassifier_] set node_ $node $node set mrtObject_ [new mrtObject $node] $node insert-entry $self [$node set switch_] 0 [$node set switch_] install 1 [$node set multiclassifier_] } RtModule/Hier instproc register { node } { $self next $node $self instvar classifier_ set classifier_ [new Classifier/Hier] $node install-entry $self $classifier_ } RtModule/Hier instproc delete-route args { eval [$self set classifier_] clear $args } Classifier/Hier instproc init {} { $self next for {set n 1} {$n <= [AddrParams hlevel]} {incr n} { set classifier [new Classifier/Addr] $classifier set mask_ [AddrParams NodeMask $n] $classifier set shift_ [AddrParams NodeShift $n] $self cmd add-classifier $n $classifier } } Classifier/Hier instproc destroy {} { for {set n 1} {$n <= [AddrParams hlevel]} {incr n} { delete [$self cmd classifier $n] } $self next } Classifier/Hier instproc clear args { set l [llength $args] [$self cmd classifier $l] clear [lindex $args [expr $l-1]] } Classifier/Hier instproc install { dst target } { set al [AddrParams split-addrstr $dst] set l [llength $al] for {set i 1} {$i < $l} {incr i} { set d [lindex $al [expr $i-1]] [$self cmd classifier $i] install $d \ [$self cmd classifier [expr $i+1]] } [$self cmd classifier $l] install [lindex $al [expr $l-1]] $target } RtModule/Manual instproc register { node } { $self next $node $self instvar classifier_ set classifier_ [new Classifier/Hash/Dest 2] $classifier_ set mask_ [AddrParams NodeMask 1] $classifier_ set shift_ [AddrParams NodeShift 1] $node install-entry $self $classifier_ } RtModule/Manual instproc add-route {dst_address target} { $self instvar classifier_ set slot [$classifier_ installNext $target] if {$dst_address == "default"} { $classifier_ set default_ $slot } else { set encoded_dst_address [expr $dst_address << [AddrParams NodeShift 1]] $classifier_ set-hash auto 0 $encoded_dst_address 0 $slot } } RtModule/Manual instproc add-route-to-adj-node { args } { $self instvar classifier_ set dst "" if {[lindex $args 0] == "-default"} { set dst default set args [lrange $args 1 end] } if {[llength $args] != 1} { error "ManualRtNode::add-route-to-adj-node [-default] node" } set target_node $args if {$dst == ""} { set dst [$target_node set address_] } set ns [Simulator instance] set link [$ns link [$self node] $target_node] set target [$link head] return [$self add-route $dst $target] } RtModule/Source instproc register { node } { $self next $node $self instvar classifier_ $self set classifier_ [$node entry] $node set src_classifier_ [new Classifier/SR] $node set src_agent_ [new Agent/SRAgent] $node set switch_ [$node set src_classifier_] $node insert-entry $self [$node set switch_] 1 [$node set switch_] install 0 [$node set src_agent_] $node attach [$node set src_agent_] } RtModule/VC instproc register { node } { $self instvar classifier_ $self attach-node $node $node port-notify $self set classifier_ [new Classifier/Virtual] $classifier_ set node_ $node $classifier_ set mask_ [AddrParams NodeMask 1] $classifier_ set shift_ [AddrParams NodeShift 1] $classifier_ nodeaddr [$node node-addr] $node install-entry $self $classifier_ } RtModule/VC instproc add-route { dst target } { } Classifier/Virtual instproc find dst { $self instvar node_ if {[$node_ id] == $dst} { return [$node_ set dmux_] } else { return [[[Simulator instance] link $node_ \ [[Simulator instance] set Node_($dst)]] head] } } Classifier/Virtual instproc install {dst target} { } Class RtModule/Nix -superclass RtModule RtModule/Nix instproc register { node } { $self next $node $self instvar classifier_ set classifier_ [new Classifier/Nix] $classifier_ set-node-id [$node set id_] $node install-entry $self $classifier_ } RtModule/Nix instproc route-notify { module } { } Class HierNode -superclass Node HierNode instproc init {args} { $self instvar address_ set haddress $args set address_ $args set args [lreplace $args 0 1] $self next $args set address_ $haddress } HierNode instproc mk-default-classifier {} { $self instvar classifiers_ $self set classifier_ [new Classifier/Hier] } ARPTable instproc init args { eval $self next $args ;# parent class constructor } ARPTable set bandwidth_ 0 ARPTable set delay_ 5us Node/MobileNode instproc init args { eval $self next $args $self instvar nifs_ arptable_ X_ Y_ Z_ nodetype_ set X_ 0.0 set Y_ 0.0 set Z_ 0.0 set arptable_ "" ;# no ARP table yet set nifs_ 0 ;# number of network interfaces $self makemip-New$nodetype_ } Node/MobileNode instproc makemip-NewMobile {} { } Node/MobileNode instproc makemip-NewBase {} { } Node/MobileNode instproc makemip-New {} { } Node/MobileNode instproc makemip-NewMIPBS {} { $self instvar regagent_ encap_ decap_ agents_ id_ set dmux [new Classifier/Port/Reserve] $dmux set mask_ 0x7fffffff $dmux set shift_ 0 $self install-demux $dmux set regagent_ [new Agent/MIPBS $self] $self attach $regagent_ [Node/MobileNode set REGAGENT_PORT] $self attach-encap $self attach-decap } Node/MobileNode instproc attach-encap {} { $self instvar encap_ set encap_ [new MIPEncapsulator] $encap_ set mask_ [AddrParams NodeMask 1] $encap_ set shift_ [AddrParams NodeShift 1] set nodeaddr [AddrParams addr2id [$self node-addr]] $encap_ set addr_ [expr ( ~([AddrParams NodeMask 1] << \ [AddrParams NodeShift 1]) & $nodeaddr )] $encap_ set port_ 1 $encap_ target [$self entry] $encap_ set node_ $self } Node/MobileNode instproc attach-decap {} { $self instvar decap_ dmux_ agents_ set decap_ [new Classifier/Addr/MIPDecapsulator] lappend agents_ $decap_ $decap_ set mask_ [AddrParams NodeMask 1] $decap_ set shift_ [AddrParams NodeShift 1] $dmux_ install [Node/MobileNode set DECAP_PORT] $decap_ } Node/MobileNode instproc makemip-NewMIPMH {} { $self instvar regagent_ set dmux [new Classifier/Port/Reserve] $dmux set mask_ 0x7fffffff $dmux set shift_ 0 $self install-demux $dmux set regagent_ [new Agent/MIPMH $self] $self attach $regagent_ [Node/MobileNode set REGAGENT_PORT] $regagent_ set mask_ [AddrParams NodeMask 1] $regagent_ set shift_ [AddrParams NodeShift 1] $regagent_ set dst_addr_ [expr (~0) << [AddrParams NodeShift 1]] $regagent_ set dst_port_ 0 $regagent_ node $self } Node/MobileNode instproc reset {} { $self instvar arptable_ nifs_ netif_ mac_ ifq_ ll_ imep_ for {set i 0} {$i < $nifs_} {incr i} { $netif_($i) reset $mac_($i) reset $ll_($i) reset $ifq_($i) reset if { [info exists opt(imep)] && $opt(imep) == "ON" } { $imep_($i) reset } } if { $arptable_ != "" } { $arptable_ reset } } Node/MobileNode instproc add-target { agent port } { $self instvar dmux_ imep_ toraDebug_ set ns [Simulator instance] set newapi [$ns imep-support] $agent set sport_ $port set toraonly [string first "TORA" [$agent info class]] if {$toraonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC $agent imep-agent [$self set imep_(0)] [$self set imep_(0)] rtagent $agent } set aodvonly [string first "AODV" [$agent info class]] if {$aodvonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC } if { $port == [Node set rtagent_port_] } { $self add-target-rtagent $agent $port return } set namfp [$ns get-nam-traceall] if { [Simulator set AgentTrace_] == "ON" } { if {$newapi != ""} { set sndT [$self mobility-trace Send "AGT"] } else { set sndT [cmu-trace Send AGT $self] } if { $namfp != "" } { $sndT namattach $namfp } $sndT target [$self entry] $agent target $sndT if {$newapi != ""} { set rcvT [$self mobility-trace Recv "AGT"] } else { set rcvT [cmu-trace Recv AGT $self] } if { $namfp != "" } { $rcvT namattach $namfp } $rcvT target $agent $dmux_ install $port $rcvT } else { $agent target [$self entry] $dmux_ install $port $agent } } Node/MobileNode instproc add-target-rtagent { agent port } { $self instvar imep_ toraDebug_ set ns [Simulator instance] set newapi [$ns imep-support] set namfp [$ns get-nam-traceall] set dmux_ [$self demux] set classifier_ [$self entry] if { [Simulator set RouterTrace_] == "ON" } { if {$newapi != ""} { set sndT [$self mobility-trace Send "RTR"] } else { set sndT [cmu-trace Send "RTR" $self] } if { $namfp != "" } { $sndT namattach $namfp } if { $newapi == "ON" } { $agent target $imep_(0) $imep_(0) sendtarget $sndT if { [info exists toraDebug_] && $toraDebug_ == "ON"} { set sndT2 [$self mobility-trace Send "TRP"] $sndT2 target $imep_(0) $agent target $sndT2 } } else { ;# no IMEP $agent target $sndT } $sndT target [$self set ll_(0)] if {$newapi != ""} { set rcvT [$self mobility-trace Recv "RTR"] } else { set rcvT [cmu-trace Recv "RTR" $self] } if { $namfp != "" } { $rcvT namattach $namfp } if {$newapi == "ON" } { [$self set ll_(0)] up-target $imep_(0) $classifier_ defaulttarget $agent if {[info exists toraDebug_] && $toraDebug_ == "ON" } { set rcvT2 [$self mobility-trace Recv "TRP"] $rcvT2 target $agent $classifier_ defaulttarget $rcvT2 } } else { $rcvT target $agent $classifier_ defaulttarget $rcvT $dmux_ install $port $rcvT } } else { if { $newapi == "ON" } { $agent target $imep_(0) if { [info exists toraDebug_] && $toraDebug_ == "ON"} { set sndT2 [$self mobility-trace Send "TRP"] $sndT2 target $imep_(0) $agent target $sndT2 } $imep_(0) sendtarget [$self set ll_(0)] } else { ;# no IMEP $agent target [$self set ll_(0)] } if {$newapi == "ON" } { [$self set ll_(0)] up-target $imep_(0) $classifier_ defaulttarget $agent if {[info exists toraDebug_] && $toraDebug_ == "ON" } { set rcvT2 [$self mobility-trace Recv "TRP"] $rcvT2 target $agent [$self set classifier_] defaulttarget $rcvT2 } } else { $classifier_ defaulttarget $agent $dmux_ install $port $agent } } } Node/MobileNode instproc add-interface { channel pmodel lltype mactype \ qtype qlen iftype anttype errproc fecproc} { $self instvar arptable_ nifs_ netif_ mac_ ifq_ ll_ imep_ err_ fec_ set ns [Simulator instance] set imepflag [$ns imep-support] set t $nifs_ incr nifs_ set netif_($t) [new $iftype] ;# interface set mac_($t) [new $mactype] ;# mac layer set ifq_($t) [new $qtype] ;# interface queue set ll_($t) [new $lltype] ;# link layer set ant_($t) [new $anttype] set err_($t) "" if {$errproc != ""} { set err_($t) [$errproc] } set fec_($t) "" if {$fecproc != ""} { set fec_($t) [$fecproc] } set namfp [$ns get-nam-traceall] if {$imepflag == "ON" } { set imep_($t) [new Agent/IMEP [$self id]] set imep $imep_($t) set drpT [$self mobility-trace Drop "RTR"] if { $namfp != "" } { $drpT namattach $namfp } $imep drop-target $drpT $ns at 0.[$self id] "$imep_($t) start" ;# start beacon timer } set nullAgent_ [$ns set nullAgent_] set netif $netif_($t) set mac $mac_($t) set ifq $ifq_($t) set ll $ll_($t) set err $err_($t) set fec $fec_($t) if { $arptable_ == "" } { set arptable_ [new ARPTable $self $mac] if {$imepflag != ""} { set drpT [$self mobility-trace Drop "IFQ"] } else { set drpT [cmu-trace Drop "IFQ" $self] } $arptable_ drop-target $drpT if { $namfp != "" } { $drpT namattach $namfp } } $ll arptable $arptable_ $ll mac $mac $ll down-target $ifq if {$imepflag == "ON" } { $imep recvtarget [$self entry] $imep sendtarget $ll $ll up-target $imep } else { $ll up-target [$self entry] } $ifq target $mac $ifq set limit_ $qlen if {$imepflag != ""} { set drpT [$self mobility-trace Drop "IFQ"] } else { set drpT [cmu-trace Drop "IFQ" $self] } $ifq drop-target $drpT if { $namfp != "" } { $drpT namattach $namfp } $mac netif $netif $mac up-target $ll if {$err == "" && $fec == ""} { $mac down-target $netif } elseif {$err != "" && $fec == ""} { $mac down-target $err $err target $netif } elseif {$err == "" && $fec != ""} { $mac down-target $fec $fec down-target $netif } else { $mac down-target $fec $fec down-target $err $err target $netif } set god_ [God instance] if {$mactype == "Mac/802_11"} { $mac nodes [$god_ num_nodes] } $netif channel $channel if {$fec == ""} { $netif up-target $mac } else { $netif up-target $fec $fec up-target $mac } $netif propagation $pmodel ;# Propagation Model $netif node $self ;# Bind node <---> interface $netif antenna $ant_($t) $channel addif $netif if { [Simulator set MacTrace_] == "ON" } { if {$imepflag != ""} { set rcvT [$self mobility-trace Recv "MAC"] } else { set rcvT [cmu-trace Recv "MAC" $self] } $mac log-target $rcvT if { $namfp != "" } { $rcvT namattach $namfp } if {$imepflag != ""} { set sndT [$self mobility-trace Send "MAC"] } else { set sndT [cmu-trace Send "MAC" $self] } $sndT target [$mac down-target] $mac down-target $sndT if { $namfp != "" } { $sndT namattach $namfp } if {$imepflag != ""} { set rcvT [$self mobility-trace Recv "MAC"] } else { set rcvT [cmu-trace Recv "MAC" $self] } $rcvT target [$mac up-target] $mac up-target $rcvT if { $namfp != "" } { $rcvT namattach $namfp } if {$imepflag != ""} { set drpT [$self mobility-trace Drop "MAC"] } else { set drpT [cmu-trace Drop "MAC" $self]` } $mac drop-target $drpT if { $namfp != "" } { $drpT namattach $namfp } } else { $mac log-target [$ns set nullAgent_] $mac drop-target [$ns set nullAgent_] } $self addif $netif } Node/MobileNode instproc setPt { val } { $self instvar netif_ $netif_(0) setTxPower $val } Node/MobileNode instproc setPr { val } { $self instvar netif_ $netif_(0) setRxPower $val } Node/MobileNode instproc setPidle { val } { $self instvar netif_ $netif_(0) setIdlePower $val } Node/MobileNode instproc mobility-trace { ttype atype } { set ns [Simulator instance] set tracefd [$ns get-ns-traceall] if { $tracefd == "" } { puts "Warning: You have not defined you tracefile yet!" puts "Please use trace-all command to define it." return "" } set T [new CMUTrace/$ttype $atype] $T newtrace [Simulator set WirelessNewTrace_] $T target [$ns nullagent] $T attach $tracefd $T set src_ [$self id] $T node $self return $T } Node/MobileNode instproc nodetrace { tracefd } { set T [new Trace/Generic] $T target [[Simulator instance] set nullAgent_] $T attach $tracefd $T set src_ [$self id] $self log-target $T } Node/MobileNode instproc agenttrace {tracefd} { set ns [Simulator instance] set ragent [$self set ragent_] set drpT [$self mobility-trace Drop "RTR"] set namfp [$ns get-nam-traceall] if { $namfp != ""} { $drpT namattach $namfp } $ragent drop-target $drpT set T [new Trace/Generic] $T target [$ns set nullAgent_] $T attach $tracefd $T set src_ [$self id] $ragent tracetarget $T set imepflag [$ns imep-support] if {$imepflag == "ON"} { [$self set imep_(0)] log-target $T } } Node/MobileNode instproc mip-call {ragent} { $self instvar regagent_ if [info exists regagent_] { $regagent_ ragent $ragent } } Node/MobileNode instproc attach-gafpartner {} { $self instvar gafpartner_ address_ ll_ set gafpartner_ [new GAFPartner] $gafpartner_ set mask_ [AddrParams NodeMask 1] $gafpartner_ set shift_ [AddrParams NodeShift 1] set nodeaddr [AddrParams addr2id [$self node-addr]] $gafpartner_ set addr_ $nodeaddr $gafpartner_ set port_ 254 $gafpartner_ target [$self entry] $ll_(0) up-target $gafpartner_ } Node/MobileNode instproc unset-gafpartner {} { $self instvar gafpartner_ $gafpartner_ set-gafagent 0 } Class SRNodeNew -superclass Node/MobileNode SRNodeNew instproc init args { $self instvar dsr_agent_ dmux_ entry_point_ address_ set ns [Simulator instance] eval $self next $args ;# parent class constructor if {$dmux_ == "" } { set dmux_ [new Classifier/Port] } set dsr_agent_ [new Agent/DSRAgent] $dsr_agent_ addr $address_ $dsr_agent_ node $self if [Simulator set mobile_ip_] { $dsr_agent_ port-dmux [$self set dmux_] } $self addr $address_ if { [Simulator set RouterTrace_] == "ON" } { set rcvT [$self mobility-trace Recv "RTR"] set namfp [$ns get-nam-traceall] if { $namfp != "" } { $rcvT namattach $namfp } $rcvT target $dsr_agent_ set entry_point_ $rcvT } else { set entry_point_ $dsr_agent_ } $self set ragent_ $dsr_agent_ $dsr_agent_ target $dmux_ set nullAgent_ [$ns set nullAgent_] $dmux_ install [Node set rtagent_port_] $nullAgent_ $self instvar classifier_ set classifier_ "srnode made illegal use of classifier_" return $self } SRNodeNew instproc start-dsr {} { $self instvar dsr_agent_ $dsr_agent_ startdsr } SRNodeNew instproc entry {} { $self instvar entry_point_ return $entry_point_ } SRNodeNew instproc add-interface args { eval $self next $args $self instvar dsr_agent_ ll_ mac_ ifq_ set ns [Simulator instance] $dsr_agent_ mac-addr [$mac_(0) id] if { [Simulator set RouterTrace_] == "ON" } { set sndT [$self mobility-trace Send "RTR"] set namfp [$ns get-nam-traceall] if {$namfp != "" } { $sndT namattach $namfp } $sndT target $ll_(0) $dsr_agent_ add-ll $sndT $ifq_(0) } else { $dsr_agent_ add-ll $ll_(0) $ifq_(0) } $dsr_agent_ install-tap $mac_(0) } SRNodeNew instproc reset args { $self instvar dsr_agent_ eval $self next $args $dsr_agent_ reset } Class Node/MobileNode/BaseStationNode -superclass Node/MobileNode Node/MobileNode/BaseStationNode instproc init args { $self next $args } Node/MobileNode/BaseStationNode instproc mk-default-classifier {} { $self instvar classifiers_ set levels [AddrParams hlevel] for {set n 1} {$n <= $levels} {incr n} { set classifiers_($n) [new Classifier/Hash/Dest/Bcast 32] $classifiers_($n) set mask_ [AddrParams NodeMask $n] $classifiers_($n) set shift_ [AddrParams NodeShift $n] } } Node/MobileNode/BaseStationNode instproc entry {} { $self instvar ns_ if ![info exist ns_] { set ns_ [Simulator instance] } if [$ns_ multicast?] { $self instvar switch_ return $switch_ } $self instvar classifiers_ return $classifiers_(1) } Node/MobileNode/BaseStationNode instproc add-target {agent port } { $self instvar dmux_ classifiers_ $agent set sport_ $port set level [AddrParams hlevel] if { $port == [Node set rtagent_port_] } { if { [Simulator set RouterTrace_] == "ON" } { set sndT [cmu-trace Send "RTR" $self] $sndT target [$self set ll_(0)] $agent target $sndT set rcvT [cmu-trace Recv "RTR" $self] $rcvT target $agent for {set i 1} {$i <= $level} {incr i} { $classifiers_($i) defaulttarget $rcvT $classifiers_($i) bcast-receiver $rcvT } $dmux_ install $port $rcvT } else { $agent target [$self set ll_(0)] for {set i 1} {$i <= $level} {incr i} { $classifiers_($i) bcast-receiver $agent $classifiers_($i) defaulttarget $agent } $dmux_ install $port $agent } } else { if { [Simulator set AgentTrace_] == "ON" } { set sndT [cmu-trace Send AGT $self] $sndT target [$self entry] $agent target $sndT set rcvT [cmu-trace Recv AGT $self] $rcvT target $agent $dmux_ install $port $rcvT } else { $agent target [$self entry] $dmux_ install $port $agent } } } Class Link Link set nl_ 0 Link instproc init { src dst } { $self next $self instvar id_ set id_ [Link set nl_] Link set nl_ [expr $id_ + 1] $self instvar trace_ fromNode_ toNode_ color_ oldColor_ set fromNode_ $src set toNode_ $dst set color_ "black" set oldColor_ "black" set trace_ "" } Link instproc head {} { $self instvar head_ return $head_ } Link instproc add-to-head { connector } { $self instvar head_ $connector target [$head_ target] $head_ target $connector } Link instproc queue {} { $self instvar queue_ return $queue_ } Link instproc link {} { $self instvar link_ return $link_ } Link instproc src {} { $self set fromNode_ } Link instproc dst {} { $self set toNode_ } Link instproc cost c { $self set cost_ $c } Link instproc cost? {} { $self instvar cost_ if ![info exists cost_] { set cost_ 1 } set cost_ } Link instproc id {} { $self set id_ } Link instproc setid { x } { $self set id_ $x } Link instproc bw {} { $self set bandwidth_ } Link instproc if-label? {} { $self instvar iif_ $iif_ label } Link instproc up { } { $self instvar dynamics_ dynT_ if ![info exists dynamics_] return $dynamics_ set status_ 1 if [info exists dynT_] { foreach tr $dynT_ { $tr format link-up {$src_} {$dst_} set ns [Simulator instance] $self instvar fromNode_ toNode_ $tr ntrace "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S UP" $tr ntrace "v -t [$ns now] link-up [$ns now] [$fromNode_ id] [$toNode_ id]" } } } Link instproc down { } { $self instvar dynamics_ dynT_ if ![info exists dynamics_] { puts stderr "$class::$proc Link $self was not declared dynamic, and cannot be taken down. ignored" return } $dynamics_ set status_ 0 $self all-connectors reset if [info exists dynT_] { foreach tr $dynT_ { $tr format link-down {$src_} {$dst_} set ns [Simulator instance] $self instvar fromNode_ toNode_ $tr ntrace "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DOWN" $tr ntrace "v -t [$ns now] link-down [$ns now] [$fromNode_ id] [$toNode_ id]" } } } Link instproc up? {} { $self instvar dynamics_ if [info exists dynamics_] { return [$dynamics_ status?] } else { return "up" } } Link instproc all-connectors op { foreach c [$self info vars] { $self instvar $c if ![info exists $c] continue if [array size $c] continue foreach var [$self set $c] { if [catch "$var info class"] { continue } if ![$var info class Node] { ;# $op on most everything catch "$var $op";# in case var isn't a connector } } } } Link instproc install-error {em} { $self instvar link_ $em target [$link_ target] $link_ target $em } Class SimpleLink -superclass Link SimpleLink instproc init { src dst bw delay q {lltype "DelayLink"} } { $self next $src $dst $self instvar link_ queue_ head_ toNode_ ttl_ $self instvar drophead_ set ns [Simulator instance] set drophead_ [new Connector] $drophead_ target [$ns set nullAgent_] set head_ [new Connector] $head_ set link_ $self if { [[$q info class] info heritage ErrModule] == "ErrorModule" } { $head_ target [$q classifier] } else { $head_ target $q } set queue_ $q set link_ [new $lltype] $link_ set bandwidth_ $bw $link_ set delay_ $delay $queue_ target $link_ $link_ target [$dst entry] $queue_ drop-target $drophead_ set ttl_ [new TTLChecker] $ttl_ target [$link_ target] $self ttl-drop-trace $link_ target $ttl_ if { [$ns multicast?] } { $self enable-mcast $src $dst } $ns instvar srcRt_ if [info exists srcRt_] { if { $srcRt_ == 1 } { $self enable-src-rt $src $dst $head_ } } } SimpleLink instproc enable-src-rt {src dst head} { $self instvar ttl_ $src instvar src_agent_ $ttl_ target [$dst entry] $src_agent_ install_slot $head [$dst id] } SimpleLink instproc enable-mcast {src dst} { $self instvar iif_ ttl_ set iif_ [new NetworkInterface] $iif_ target [$ttl_ target] $ttl_ target $iif_ $src add-oif [$self head] $self $dst add-iif [$iif_ label] $self } SimpleLink instproc bw {} { $self instvar link_ $link_ set bandwidth_ } SimpleLink instproc delay {} { $self instvar link_ $link_ set delay_ } SimpleLink instproc qsize {} { [$self queue] set limit_ } SimpleLink instproc nam-trace { ns f } { $self instvar enqT_ deqT_ drpT_ rcvT_ dynT_ if [info exists enqT_] { $enqT_ namattach $f if [info exists deqT_] { $deqT_ namattach $f } if [info exists drpT_] { $drpT_ namattach $f } if [info exists rcvT_] { $rcvT_ namattach $f } if [info exists dynT_] { foreach tr $dynT_ { $tr namattach $f } } } else { $self trace $ns $f "nam" } } SimpleLink instproc trace { ns f {op ""} } { $self instvar enqT_ deqT_ drpT_ queue_ link_ fromNode_ toNode_ $self instvar rcvT_ ttl_ trace_ $self instvar drophead_ ;# idea stolen from CBQ and Kevin set trace_ $f set enqT_ [$ns create-trace Enque $f $fromNode_ $toNode_ $op] set deqT_ [$ns create-trace Deque $f $fromNode_ $toNode_ $op] set drpT_ [$ns create-trace Drop $f $fromNode_ $toNode_ $op] set rcvT_ [$ns create-trace Recv $f $fromNode_ $toNode_ $op] $self instvar drpT_ drophead_ set nxt [$drophead_ target] $drophead_ target $drpT_ $drpT_ target $nxt $queue_ drop-target $drophead_ $deqT_ target [$queue_ target] $queue_ target $deqT_ $self add-to-head $enqT_ $rcvT_ target [$ttl_ target] $ttl_ target $rcvT_ $self instvar dynamics_ if [info exists dynamics_] { $self trace-dynamics $ns $f $op } } SimpleLink instproc trace-dynamics { ns f {op ""}} { $self instvar dynT_ fromNode_ toNode_ lappend dynT_ [$ns create-trace Generic $f $fromNode_ $toNode_ $op] $self transit-drop-trace $self linkfail-drop-trace } SimpleLink instproc ttl-drop-trace args { $self instvar ttl_ if ![info exists ttl_] return if {[llength $args] != 0} { $ttl_ drop-target [lindex $args 0] } else { $self instvar drophead_ $ttl_ drop-target $drophead_ } } SimpleLink instproc transit-drop-trace args { $self instvar link_ if {[llength $args] != 0} { $link_ drop-target [lindex $args 0] } else { $self instvar drophead_ $link_ drop-target $drophead_ } } SimpleLink instproc linkfail-drop-trace args { $self instvar dynamics_ if ![info exists dynamics_] return if {[llength $args] != 0} { $dynamics_ drop-target [lindex $args 0] } else { $self instvar drophead_ $dynamics_ drop-target $drophead_ } } SimpleLink instproc trace-callback {ns cmd} { $self trace $ns {} foreach part {enqT_ deqT_ drpT_ rcvT_} { $self instvar $part set to [$self set $part] $to set callback_ 1 $to proc handle a "$cmd \$a" } } SimpleLink instproc attach-monitors { insnoop outsnoop dropsnoop qmon } { $self instvar drpT_ queue_ snoopIn_ snoopOut_ snoopDrop_ $self instvar qMonitor_ drophead_ set snoopIn_ $insnoop set snoopOut_ $outsnoop set snoopDrop_ $dropsnoop $self add-to-head $snoopIn_ $snoopOut_ target [$queue_ target] $queue_ target $snoopOut_ set nxt [$drophead_ target] $drophead_ target $snoopDrop_ $snoopDrop_ target $nxt $snoopIn_ set-monitor $qmon $snoopOut_ set-monitor $qmon $snoopDrop_ set-monitor $qmon set qMonitor_ $qmon } SimpleLink instproc attach-taggers { insnoop qmon } { $self instvar drpT_ queue_ head_ snoopIn_ snoopOut_ snoopDrop_ $self instvar qMonitor_ drophead_ set snoopIn_ $insnoop $snoopIn_ target $head_ set head_ $snoopIn_ $snoopIn_ set-monitor $qmon set qMonitor_ $qmon } SimpleLink instproc init-monitor { ns qtrace sampleInterval} { $self instvar qMonitor_ ns_ qtrace_ sampleInterval_ set ns_ $ns set qtrace_ $qtrace set sampleInterval_ $sampleInterval set qMonitor_ [new QueueMonitor] $self attach-monitors [new SnoopQueue/In] \ [new SnoopQueue/Out] [new SnoopQueue/Drop] $qMonitor_ set bytesInt_ [new Integrator] $qMonitor_ set-bytes-integrator $bytesInt_ set pktsInt_ [new Integrator] $qMonitor_ set-pkts-integrator $pktsInt_ return $qMonitor_ } SimpleLink instproc start-tracing { } { $self instvar qMonitor_ ns_ qtrace_ sampleInterval_ $self instvar fromNode_ toNode_ if {$qtrace_ != 0} { $qMonitor_ trace $qtrace_ } $qMonitor_ set-src-dst [$fromNode_ id] [$toNode_ id] } SimpleLink instproc queue-sample-timeout { } { $self instvar qMonitor_ ns_ qtrace_ sampleInterval_ $self instvar fromNode_ toNode_ set qavg [$self sample-queue-size] if {$qtrace_ != 0} { puts $qtrace_ "[$ns_ now] [$fromNode_ id] [$toNode_ id] $qavg" } $ns_ at [expr [$ns_ now] + $sampleInterval_] "$self queue-sample-timeout" } SimpleLink instproc sample-queue-size { } { $self instvar qMonitor_ ns_ qtrace_ sampleInterval_ lastSample_ set now [$ns_ now] set qBytesMonitor_ [$qMonitor_ get-bytes-integrator] set qPktsMonitor_ [$qMonitor_ get-pkts-integrator] $qBytesMonitor_ newpoint $now [$qBytesMonitor_ set lasty_] set bsum [$qBytesMonitor_ set sum_] $qPktsMonitor_ newpoint $now [$qPktsMonitor_ set lasty_] set psum [$qPktsMonitor_ set sum_] if ![info exists lastSample_] { set lastSample_ 0 } set dur [expr $now - $lastSample_] if { $dur != 0 } { set meanBytesQ [expr $bsum / $dur] set meanPktsQ [expr $psum / $dur] } else { set meanBytesQ 0 set meanPktsQ 0 } $qBytesMonitor_ set sum_ 0.0 $qPktsMonitor_ set sum_ 0.0 set lastSample_ $now $qMonitor_ instvar pdrops_ pdepartures_ parrivals_ bdrops_ bdepartures_ barrivals_ return "$meanBytesQ $meanPktsQ $parrivals_ $pdepartures_ $pdrops_ $barrivals_ $bdepartures_ $bdrops_" } SimpleLink instproc dynamic {} { $self instvar dynamics_ if [info exists dynamics_] return set dynamics_ [new DynamicLink] $self add-to-head $dynamics_ $self transit-drop-trace $self all-connectors isDynamic } SimpleLink instproc errormodule args { $self instvar errmodule_ queue_ drophead_ if { $args == "" } { return $errmodule_ } set em [lindex $args 0] set errmodule_ $em $self add-to-head $em $em drop-target $drophead_ } SimpleLink instproc insert-linkloss args { $self instvar link_errmodule_ queue_ drophead_ deqT_ if { $args == "" } { return $link_errmodule_ } set em [lindex $args 0] if [info exists link_errmodule_] { delete link_errmodule_ } set link_errmodule_ $em if [info exists deqT_] { $em target [$deqT_ target] $deqT_ target $em } else { $em target [$queue_ target] $queue_ target $em } $em drop-target $drophead_ } Class Application/FTP -superclass Application Application/FTP instproc init {} { $self next } Application/FTP instproc start {} { [$self agent] send -1 } Application/FTP instproc stop {} { [$self agent] advance 0 [$self agent] close } Application/FTP instproc send {nbytes} { [$self agent] send $nbytes } Application/FTP instproc produce { pktcnt } { [$self agent] advance $pktcnt } Application/FTP instproc producemore { pktcnt } { [$self agent] advanceby $pktcnt } Application/Traffic instproc set args { $self instvar packetSize_ rate_ if { [lindex $args 0] == "packet_size_" } { if { [llength $args] == 2 } { set packetSize_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $packetSize_ } } eval $self next $args } Application/Traffic/CBR instproc set args { $self instvar packetSize_ rate_ if { [lindex $args 0] == "interval_" } { if { [llength $args] == 2 } { set ns_ [Simulator instance] set interval_ [$ns_ delay_parse [lindex $args 1]] $self set rate_ [expr $packetSize_ * 8.0/$interval_] return } elseif { [llength $args] == 1 } { return [expr $packetSize_ * 8.0/$rate_] } } eval $self next $args } Class Agent/CBR -superclass Agent/UDP Class Agent/CBR/UDP -superclass Agent/UDP Class Agent/CBR/RTP -superclass Agent/RTP Class Agent/CBR/UDP/SA -superclass Agent/SA Agent/SA instproc attach-traffic tg { $tg attach-agent $self eval $self cmd attach-traffic $tg } Agent/CBR/UDP instproc attach-traffic tg { $self instvar trafgen_ $tg attach-agent $self set trafgen_ $tg } Agent/CBR/UDP instproc done {} { } Agent/CBR/UDP instproc start {} { $self instvar trafgen_ $trafgen_ start } Agent/CBR/UDP instproc stop {} { $self instvar trafgen_ $trafgen_ stop } Agent/CBR/UDP instproc advance args { $self instvar trafgen_ eval $trafgen_ advance $args } Agent/CBR/UDP instproc advanceby args { $self instvar trafgen_ eval $trafgen_ advanceby $args } Agent/CBR instproc init {} { $self next $self instvar trafgen_ interval_ random_ packetSize_ maxpkts_ set packetSize_ 210 set random_ 0 set maxpkts_ 268435456 set interval_ 0.00375 set trafgen_ [new Application/Traffic/CBR] $trafgen_ attach-agent $self $trafgen_ set rate_ [expr $packetSize_ * 8.0/ $interval_] $trafgen_ set random_ [$self set random_] $trafgen_ set maxpkts_ [$self set maxpkts_] $trafgen_ set packetSize_ [$self set packetSize_] if {[Simulator set nsv1flag] == 0} { puts "using backward compatible Agent/CBR; use Application/Traffic/CBR instead" } } Agent/CBR instproc done {} { } Agent/CBR instproc start {} { $self instvar trafgen_ $trafgen_ start } Agent/CBR instproc stop {} { $self instvar trafgen_ $trafgen_ stop } Agent/CBR instproc advance args { $self instvar trafgen_ eval $trafgen_ advance $args } Agent/CBR instproc advanceby args { $self instvar trafgen_ eval $trafgen_ advanceby $args } Agent/CBR instproc set args { $self instvar interval_ random_ packetSize_ maxpkts_ trafgen_ if { [info exists trafgen_] } { if { [lindex $args 0] == "packetSize_" } { if { [llength $args] == 2 } { $trafgen_ set packetSize_ [lindex $args 1] set packetSize_ [lindex $args 1] $trafgen_ set rate_ [expr $packetSize_ * 8.0/ $interval_] return } elseif { [llength $args] == 1 } { return $packetSize_ } } elseif { [lindex $args 0] == "random_" } { if { [llength $args] == 2 } { $trafgen_ set random_ [lindex $args 1] set random_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $random_ } } elseif { [lindex $args 0] == "maxpkts_" } { if { [llength $args] == 2 } { $trafgen_ set maxpkts_ [lindex $args 1] set maxpkts_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $maxpkts_ } } elseif { [lindex $args 0] == "interval_" } { if { [llength $args] == 2 } { set ns_ [Simulator instance] set interval_ [$ns_ delay_parse [lindex $args 1]] $trafgen_ set rate_ [expr $packetSize_ * 8.0/ $interval_] return } elseif { [llength $args] == 1 } { return $interval_ } } } eval $self next $args } Class Traffic/Expoo -superclass Application/Traffic/Exponential Class Traffic/Pareto -superclass Application/Traffic/Pareto Class Traffic/RealAudio -superclass Application/Traffic/RealAudio Class Traffic/Trace -superclass Application/Traffic/Trace Traffic/Expoo instproc set args { $self instvar packetSize_ burst_time_ idle_time_ rate_ if { [lindex $args 0] == "packet-size" } { if { [llength $args] == 2 } { $self set packetSize_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $packetSize_ } } elseif { [lindex $args 0] == "burst-time" } { if { [llength $args] == 2 } { $self set burst_time_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $burst_time_ } } elseif { [lindex $args 0] == "idle-time" } { if { [llength $args] == 2 } { $self set idle_time_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $idle_time_ } } elseif { [lindex $args 0] == "rate" } { if { [llength $args] == 2 } { $self set rate_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $rate_ } } eval $self next $args } Traffic/Pareto instproc set args { $self instvar packetSize_ burst_time_ idle_time_ rate_ shape_ if { [lindex $args 0] == "packet-size" } { if { [llength $args] == 2 } { $self set packetSize_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $packetSize_ } } elseif { [lindex $args 0] == "burst-time" } { if { [llength $args] == 2 } { $self set burst_time_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $burst_time_ } } elseif { [lindex $args 0] == "idle-time" } { if { [llength $args] == 2 } { $self set idle_time_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $idle_time_ } } elseif { [lindex $args 0] == "rate" } { if { [llength $args] == 2 } { $self set rate_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $rate_ } } elseif { [lindex $args 0] == "shape" } { if { [llength $args] == 2 } { $self set shape_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $shape_ } } eval $self next $args } Traffic/RealAudio instproc set args { $self instvar packetSize_ burst_time_ idle_time_ rate_ if { [lindex $args 0] == "packet-size" } { if { [llength $args] == 2 } { $self set packetSize_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $packetSize_ } } elseif { [lindex $args 0] == "burst-time" } { if { [llength $args] == 2 } { $self set burst_time_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $burst_time_ } } elseif { [lindex $args 0] == "idle-time" } { if { [llength $args] == 2 } { $self set idle_time_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $idle_time_ } } elseif { [lindex $args 0] == "rate" } { if { [llength $args] == 2 } { $self set rate_ [lindex $args 1] return } elseif { [llength $args] == 1 } { return $rate_ } } eval $self next $args } Class Source/FTP -superclass Application Source/FTP set maxpkts_ 268435456 Source/FTP instproc attach o { $self instvar agent_ set agent_ $o $self attach-agent $o } Source/FTP instproc init {} { $self next $self instvar maxpkts_ agent_ set maxpkts_ 268435456 } Source/FTP instproc start {} { $self instvar agent_ maxpkts_ $agent_ advance $maxpkts_ } Source/FTP instproc stop {} { $self instvar agent_ $agent_ advance 0 } Source/FTP instproc produce { pktcnt } { $self instvar agent_ $agent_ advance $pktcnt } Source/FTP instproc producemore { pktcnt } { $self instvar agent_ $agent_ advanceby $pktcnt } Class Source/Telnet -superclass Application/Telnet Source/Telnet set maxpkts_ 268435456 Source/Telnet instproc attach o { $self instvar agent_ set agent_ $o $self attach-agent $o } Class OldSim -superclass Simulator proc ns args { OldSim ns eval ns $args } OldSim instproc default_catch { varName index op } { if { $index == "" } { error "ns-1 compat: default change caught, but not a default! (varName: $varName)" exit 1 } if { $op == "r" || $op == "u" } { error "ns-1 compat: default change caught a $op operation" exit 1 } set vname ${varName}($index) upvar $vname var $self default_assign $varName $index $var } OldSim instproc default_assign {aname index newval} { $self instvar classMap_ queueMap_ if { $index == "" } { puts "something funny with default traces" exit 1 } set obj [string trimleft $aname ns_] if { $obj == "link" } { if { $index == "queue-limit" } { Queue set limit_ $newval return } set ivar "$index\_" if { [lsearch [DelayLink info vars] $ivar] >= 0 } { DelayLink set $ivar $newval return } error "warning: ns-1 compatibility library cannot set link default ${aname}($index)" return } if ![info exists classMap_($obj)] { if ![info exists queueMap_($obj)] { puts "error: ns-2 compatibility library cannot set ns-v1 default ${aname}($index)" exit 1 } else { set ns2obj "Queue/$queueMap_($obj)" } } else { set ns2obj $classMap_($obj) } SplitObject instvar varMap_ if ![info exists varMap_($index)] { puts "error: ns-2 compatibility library cannot map instvar $index in class $ns2obj" exit 1 } $ns2obj set $varMap_($index) $newval } OldSim instproc map_ns_defaults old_arr { global $old_arr ; # these were all globals in ns-1 SplitObject instvar varMap_ foreach el [array names $old_arr] { set val [expr "$${old_arr}($el)"] $self default_assign $old_arr $el $val } trace variable $old_arr rwu "$self default_catch" } OldSim instproc trace_old_defaults {} { $self map_ns_defaults ns_tcp $self map_ns_defaults ns_tcpnewreno $self map_ns_defaults ns_trace $self map_ns_defaults ns_fulltcp $self map_ns_defaults ns_red $self map_ns_defaults ns_cbq $self map_ns_defaults ns_class $self map_ns_defaults ns_sink $self map_ns_defaults ns_delsink $self map_ns_defaults ns_sacksink $self map_ns_defaults ns_cbr $self map_ns_defaults ns_rlm $self map_ns_defaults ns_ivs $self map_ns_defaults ns_source $self map_ns_defaults ns_telnet $self map_ns_defaults ns_bursty $self map_ns_defaults ns_message $self map_ns_defaults ns_facktcp $self map_ns_defaults ns_link $self map_ns_defaults ns_lossy_uniform $self map_ns_defaults ns_lossy_patt $self map_ns_defaults ns_queue $self map_ns_defaults ns_srm } OldSim instproc init args { eval $self next $args puts stderr "warning: using backward compatibility mode" $self instvar classMap_ Simulator set nsv1flag 1 $self instvar scheduler_ set scheduler_ [new Scheduler/List] Queue/CBQ instproc set args { $self instvar compat_qlim_ if { [lindex $args 0] == "queue-limit" || \ [lindex $args 0] == "limit_" } { if { [llength $args] == 2 } { set val [lindex $args 1] set compat_qlim_ $val return $val } return $compat_qlim_ } elseif { [lindex $args 0] == "algorithm_" } { $self algorithm [lindex $args 1] } eval $self next $args } Queue/DropTail instproc set args { if { [llength $args] == 2 && [lindex $args 0] == "queue-limit" } { $self set limit_ [lindex $args 1] return } eval $self next $args } Queue/RED instproc set args { if { [llength $args] == 2 && [lindex $args 0] == "queue-limit" } { $self set limit_ [lindex $args 1] return } eval $self next $args } Queue/RED instproc enable-vartrace file { $self trace ave_ $self trace prob_ $self trace curq_ $self attach $file } Source/FTP instproc set args { if { [llength $args] == 2 && [lindex $args 0] == "maxpkts" } { $self set maxpkts_ [lindex $args 1] return } eval $self next $args } Source/Telnet instproc set args { if { [llength $args] == 2 && [lindex $args 0] == "interval" } { $self set interval_ [lindex $args 1] return } eval $self next $args } Agent/TCP instproc source type { if { $type == "ftp" } { set type FTP } if { $type == "telnet" } { set type Telnet } set src [new Source/$type] $src attach $self return $src } Agent/TCP set restart_bugfix_ false SplitObject instproc set args { SplitObject instvar varMap_ set var [lindex $args 0] if [info exists varMap_($var)] { set var $varMap_($var) set args "$var [lrange $args 1 end]" } $self instvar -parse-part1 $var if {[llength $args] == 1} { return [subst $[subst $var]] } else { return [set $var [lrange $args 1 end]] } } SplitObject instproc get {var} { SplitObject instvar varMap_ if [info exists varMap_($var)] { return [$self set $varMap_($var)] } else { return [$self next $var] } } TclObject set varMap_(addr) addr_ TclObject set varMap_(dst) dst_ TclObject set varMap_(cls) fid_ TclObject set varMap_(src) src_ TclObject set varMap_(show_tcphdr) show_tcphdr_ TclObject set varMap_(window) window_ TclObject set varMap_(window-init) windowInit_ TclObject set varMap_(window-option) windowOption_ TclObject set varMap_(window-constant) windowConstant_ TclObject set varMap_(window-thresh) windowThresh_ TclObject set varMap_(overhead) overhead_ TclObject set varMap_(tcp-tick) tcpTick_ TclObject set varMap_(ecn) ecn_ TclObject set varMap_(bug-fix) bugFix_ TclObject set varMap_(maxburst) maxburst_ TclObject set varMap_(maxcwnd) maxcwnd_ TclObject set varMap_(dupacks) dupacks_ TclObject set varMap_(seqno) seqno_ TclObject set varMap_(ack) ack_ TclObject set varMap_(cwnd) cwnd_ TclObject set varMap_(awnd) awnd_ TclObject set varMap_(ssthresh) ssthresh_ TclObject set varMap_(rtt) rtt_ TclObject set varMap_(srtt) srtt_ TclObject set varMap_(rttvar) rttvar_ TclObject set varMap_(backoff) backoff_ TclObject set varMap_(v-alpha) v_alpha_ TclObject set varMap_(v-beta) v_beta_ TclObject set varMap_(v-gamma) v_gamma_ TclObject set varMap_(changes) newreno_changes_ TclObject set varMap_(rampdown) rampdown_ TclObject set varMap_(ss-div4) ss-div4_ TclObject set varMap_(limit) limit_ TclObject set varMap_(limit) maxqueue_ TclObject set varMap_(buckets) buckets_ TclObject set varMap_(bytes) bytes_ TclObject set varMap_(thresh) thresh_ TclObject set varMap_(maxthresh) maxthresh_ TclObject set varMap_(mean_pktsize) meanPacketSize_ TclObject set varMap_(q_weight) queueWeight_ TclObject set varMap_(wait) wait_ TclObject set varMap_(linterm) linterm_ TclObject set varMap_(setbit) setbit_ TclObject set varMap_(drop-tail) dropTail_ TclObject set varMap_(doubleq) doubleq_ TclObject set varMap_(dqthresh) dqthresh_ TclObject set varMap_(subclasses) subclasses_ TclObject set varMap_(algorithm) algorithm_ TclObject set varMap_(max-pktsize) maxpkt_ TclObject set varMap_(priority) priority_ TclObject set varMap_(maxidle) maxidle_ TclObject set varMap_(extradelay) extradelay_ TclObject set varMap_(packet-size) packetSize_ TclObject set varMap_(interval) interval_ TclObject set varMap_(random) random_ TclObject set varMap_(S) S_ TclObject set varMap_(R) R_ TclObject set varMap_(state) state_ TclObject set varMap_(rttShift) rttShift_ TclObject set varMap_(keyShift) keyShift_ TclObject set varMap_(key) key_ TclObject set varMap_(maxrtt) maxrtt_ Class traceHelper traceHelper instproc attach f { $self instvar file_ set file_ $f } Class linkHelper linkHelper instproc init args { $self instvar node1_ node2_ linkref_ queue_ set node1_ [lindex $args 0] set node2_ [lindex $args 1] set lid [$node1_ id]:[$node2_ id] set linkref_ [ns set link_($lid)] set queue_ [$linkref_ queue] set sqi [new SnoopQueue/In] set sqo [new SnoopQueue/Out] set sqd [new SnoopQueue/Drop] set dsamples [new Samples] set qmon [new QueueMonitor/Compat] $qmon set-delay-samples $dsamples $linkref_ attach-monitors $sqi $sqo $sqd $qmon $linkref_ set bytesInt_ [new Integrator] $linkref_ set pktsInt_ [new Integrator] $qmon set-bytes-integrator [$linkref_ set bytesInt_] $qmon set-pkts-integrator [$linkref_ set pktsInt_] } linkHelper instproc trace traceObj { $self instvar node1_ node2_ $self instvar queue_ set tfile [$traceObj set file_] ns trace-queue $node1_ $node2_ $tfile if { [string first Queue/RED [$queue_ info class]] == 0 } { $queue_ enable-vartrace $tfile } } linkHelper instproc callback {fn} { $self instvar linkref_ foreach part {enqT_ deqT_ drpT_} { set to [$linkref_ set $part] $to set callback_ 1 $to proc handle {args} "$fn \$args" } } linkHelper instproc set { var val } { $self instvar linkref_ queue_ set qvars [$queue_ info vars] set linkvars [$linkref_ info vars] set linkdelayvars [[$linkref_ link] info vars] if { [string last _ $var] != ( [string length $var] - 1) } { set var ${var}_ } if { $var == "queue-limit_" } { set var "limit_" } if { [lsearch $qvars $var] >= 0 } { $queue_ set $var $val } elseif { [lsearch $linkvars $var] >= 0 } { $linkref_ set $var $val } elseif { [lsearch $linkdelayvars $var] >= 0 } { [$linkref_ link] set $var $val } else { puts stderr "linkHelper warning: couldn't set unknown variable $var" } } linkHelper instproc get var { $self instvar linkref_ queue_ set qvars [$queue_ info vars] set linkvars [$linkref_ info vars] set linkdelayvars [[$linkref_ link] info vars] if { [string last _ $var] != ( [string length $var] - 1) } { set var ${var}_ } if { $var == "queue-limit_" } { set var "limit_" } if { [lsearch $qvars $var] >= 0 } { return [$queue_ set $var] } elseif { [lsearch $linkvars $var] >= 0 } { return [$linkref_ set $var] } elseif { [lsearch $linkdelayvars $var] >= 0 } { return [[$linkref_ link] set $var] } else { puts stderr "linkHelper warning: couldn't set unknown variable $var" return "" } return "" } linkHelper instproc try { obj operation argv } { set op [eval list $obj $operation $argv] set ocl [$obj info class] set iprocs [$ocl info instcommands] set oprocs [$obj info commands] if { $operation != "cmd" } { if { [lsearch $iprocs $operation] >= 0 } { return [eval $op] } if { [lsearch $oprocs $operation] >= 0 } { return [eval $op] } } if [catch $op ret] { return -1 } return $ret } linkHelper instproc unknown { m args } { $self instvar linkref_ queue_ set oldbody [TclObject info instbody unknown] TclObject instproc unknown args { if { [lindex $args 0] == "cmd" } { puts stderr "Can't dispatch $args" exit 1 } eval $self cmd $args } set rval [$self try $queue_ $m $args] if { $rval != -1 } { TclObject instproc unknown args $oldbody return $rval } set rval [$self try $queue_ cmd [list $m $args]] if { $rval != -1 } { TclObject instproc unknown args $oldbody return $rval } set rval [$self try $linkref_ $m $args] if { $rval != -1 } { TclObject instproc unknown args $oldbody return $rval } set rval [$self try $linkref_ cmd [list $m $args]] if { $rval != -1 } { TclObject instproc unknown args $oldbody return $rval } set dlink [$linkref_ link] set rval [$self try $dlink $m $args] if { $rval != -1 } { TclObject instproc unknown args $oldbody return $rval } set rval [$self try $dlink cmd [list $m $args]] if { $rval != -1 } { TclObject instproc unknown args $oldbody return $rval } TclObject instproc unknown args $oldbody puts stderr "Unknown operation $m or subbordinate operation failed" exit 1 } linkHelper instproc stat { classid item } { $self instvar linkref_ set qmon [$linkref_ set qMonitor_] if { $item == "packets" } { return [$qmon pkts $classid] } elseif { $item == "bytes" } { return [$qmon bytes $classid] } elseif { $item == "drops"} { return [$qmon drops $classid] } elseif { $item == "mean-qdelay" } { set dsamp [$qmon get-class-delay-samples $classid] if { [$dsamp cnt] > 0 } { return [$dsamp mean] } else { return NaN } } else { puts stderr "linkHelper: unknown stat op $item" exit 1 } } linkHelper instproc integral { itype } { $self instvar linkref_ if { $itype == "qsize" } { set integ [$linkref_ set bytesInt_] } elseif { $itype == "qlen" } { set integ [$linkref_ set pktsInt_] } return [$integ set sum_] } set classMap_(tcp) Agent/TCP set classMap_(tcp-reno) Agent/TCP/Reno set classMap_(tcp-vegas) Agent/TCP/Vegas set classMap_(tcp-full) Agent/TCP/FullTcp set classMap_(fulltcp) Agent/TCP/FullTcp set classMap_(tcp-fack) Agent/TCP/Fack set classMap_(facktcp) Agent/TCP/Fack set classMap_(tcp-newreno) Agent/TCP/Newreno set classMap_(tcpnewreno) Agent/TCP/Newreno set classMap_(cbr) Agent/CBR set classMap_(tcp-sink) Agent/TCPSink set classMap_(tcp-sack1) Agent/TCP/Sack1 set classMap_(sack1-tcp-sink) Agent/TCPSink/Sack1 set classMap_(tcp-sink-da) Agent/TCPSink/DelAck set classMap_(sack1-tcp-sink-da) Agent/TCPSink/Sack1/DelAck set classMap_(sink) Agent/TCPSink set classMap_(delsink) Agent/TCPSink/DelAck set classMap_(sacksink) Agent/TCPSink ; # sacksink becomes TCPSink here set classMap_(loss-monitor) Agent/LossMonitor set classMap_(class) CBQClass set classMap_(ivs) Agent/IVS/Source set classMap_(trace) Trace set classMap_(srm) Agent/SRM $self instvar queueMap_ set queueMap_(drop-tail) DropTail set queueMap_(sfq) SFQ set queueMap_(red) RED set queueMap_(cbq) CBQ set queueMap_(wrr-cbq) CBQ/WRR $self trace_old_defaults global tcl_version if {$tcl_version < 8} { set class_name "class" } else { set class_name "::class" } proc $class_name args { set arglen [llength $args] if { $arglen < 2 } { return } set op [lindex $args 0] set id [lindex $args 1] if { $op != "create" } { error "ns-v1 compat: malformed class operation: op $op" return } eval CBQClass create $id [lrange $args 2 [expr $arglen - 1]] } } OldSim instproc simplex-link-compat { n1 n2 bw delay qtype } { set linkhelp [$self link-threeargs $n1 $n2 $qtype] $linkhelp set bandwidth_ $bw $linkhelp set delay_ $delay } OldSim instproc duplex-link-compat { n1 n2 bw delay type } { ns simplex-link-compat $n1 $n2 $bw $delay $type ns simplex-link-compat $n2 $n1 $bw $delay $type } OldSim instproc get-queues { n1 n2 } { $self instvar link_ set n1 [$n1 id] set n2 [$n2 id] return "[$link_($n1:$n2) queue] [$link_($n2:$n1) queue]" } OldSim instproc create-agent { node type pktClass } { $self instvar classMap_ if ![info exists classMap_($type)] { puts stderr \ "backward compat bug: need to update classMap for $type" exit 1 } set agent [new $classMap_($type)] $agent set fid_ $pktClass $self attach-agent $node $agent return $agent } OldSim instproc agent { type node } { return [$self create-agent $node $type 0] } OldSim instproc create-connection \ { srcType srcNode sinkType sinkNode pktClass } { set src [$self create-agent $srcNode $srcType $pktClass] set sink [$self create-agent $sinkNode $sinkType $pktClass] $self connect $src $sink return $src } proc ns_connect { src sink } { return [ns connect $src $sink] } OldSim instproc link args { set nargs [llength $args] set arg0 [lindex $args 0] set arg1 [lindex $args 1] if { $nargs == 2 } { return [$self link-twoargs $arg0 $arg1] } elseif { $nargs == 3 } { return [$self link-threeargs $arg0 $arg1 [lindex $args 2]] } } OldSim instproc link-twoargs { n1 n2 } { $self instvar LH_ if ![info exists LH_($n1:$n2)] { set LH_($n1:$n2) 1 linkHelper LH_:$n1:$n2 $n1 $n2 } return LH_:$n1:$n2 } OldSim instproc link-threeargs { n1 n2 qtype } { $self simplex-link $n1 $n2 0 0 $qtype return [$self link-twoargs $n1 $n2] } OldSim instproc trace {} { return [new traceHelper] } OldSim instproc random { seed } { return [ns-random $seed] } proc ns_simplex { n1 n2 bw delay type } { puts stderr "ns_simplex: no backward compat" exit 1 } proc ns_duplex { n1 n2 bw delay type } { ns duplex-link-compat $n1 $n2 $bw $delay $type return [ns get-queues $n1 $n2] } proc ns_create_connection { srcType srcNode sinkType sinkNode pktClass } { ns create-connection $srcType $srcNode $sinkType \ $sinkNode $pktClass } proc ns_create_cbr { srcNode sinkNode pktSize interval fid } { set s [ns create-connection cbr $srcNode loss-monitor \ $sinkNode $fid] $s set interval_ $interval $s set packetSize_ $pktSize return $s } proc ns_create_class { parent borrow allot maxidle notused prio depth xdelay } { set cl [new CBQClass] if { $prio < 8 } { set qtype [CBQClass set def_qtype_] set q [new Queue/$qtype] $cl install-queue $q } set depth [expr $depth + 1] if { $borrow == "none" } { set borrowok false } elseif { $borrow == $parent } { set borrowok true } else { puts stderr "CBQ: borrowing from non-parent not supported" exit 1 } $cl setparams $parent $borrowok $allot $maxidle $prio $depth $xdelay return $cl } proc ns_create_class1 { parent borrow allot maxidle notused prio depth xdelay Mb } { set cl [ns_create_class $parent $borrow $allot $maxidle $notused $prio $depth $xdelay] ns_class_maxIdle $cl $allot $maxidle $prio $Mb return $cl } proc ns_class_params { cl parent borrow allot maxidle notused prio depth xdelay Mb } { set depth [expr $depth + 1] if { $borrow == "none" } { set borrowok false } elseif { $borrow == $parent } { set borrowok true } else { puts stderr "CBQ: borrowing from non-parent not supported" exit 1 } $cl setparams $parent $borrowok $allot $maxidle $prio $depth $xdelay ns_class_maxIdle $cl $allot $maxidle $prio $Mb return $cl } proc ns_class_maxIdle { cl allot maxIdle priority Mbps } { if { $maxIdle == "auto" } { set g 0.9375 set n [expr 8 * $priority] set gTOn [expr pow($g, $n)] set first [expr ((1/$allot) - 1) * (1-$gTOn) / $gTOn ] set second [expr (1 - $g)] set packetsize 1000 set t [expr ($packetsize * 8)/($Mbps * 1000000) ] if { $first > $second } { $cl set maxidle_ [expr $t * $first] } else { $cl set maxidle_ [expr $t * $second] } } else { $cl set maxidle_ $maxIdle } return $cl } Agent instproc connect d { $self set dst_ $d } Agent/Message instproc recv msg { $self handle $msg } Queue/RED proc set { var {arg ""} } { if { $var == "queue-in-bytes_" } { warn "Warning: use `queue_in_bytes_' rather than `queue-in-bytes_'" set var "queue_in_bytes_" } elseif { $var == "drop-tail_" } { warn "Warning: use `drop_tail_' rather than `drop-tail_'" set var "drop_tail_" } elseif { $var == "drop-front_" } { warn "Warning: use `drop_front_' rather than `drop-front_'" set var "drop_front_" } elseif { $var == "drop-rand_" } { warn "Warning: use `drop_rand_' rather than `drop-rand_'" set var "drop_rand_" } elseif { $var == "ns1-compat_" } { warn "Warning: use `ns1_compat_' rather than `ns1-compat_'" set var "ns1_compat_" } eval $self next $var $arg } Queue/DropTail proc set { var {arg ""} } { if { $var == "drop-front_" } { warn "Warning: use `drop_front_' rather than `drop-front_'" set var "drop_front_" } eval $self next $var $arg } PacketHeaderManager set hdrlen_ 0 PacketHeaderManager set tab_(Common) 1 proc add-packet-header args { foreach cl $args { PacketHeaderManager set tab_(PacketHeader/$cl) 1 } } proc add-all-packet-headers {} { foreach cl [PacketHeader info subclass] { PacketHeaderManager set tab_($cl) 1 } } proc remove-packet-header args { foreach cl $args { if { $cl == "Common" } { warn "Cannot exclude common packet header." continue } PacketHeaderManager unset tab_(PacketHeader/$cl) } } proc remove-all-packet-headers {} { foreach cl [PacketHeader info subclass] { if { $cl != "PacketHeader/Common" } { PacketHeaderManager unset tab_($cl) } } } foreach prot { AODV ARP aSRM Common CtrMcast Diffusion Encap Flags HttpInval IMEP IP IPinIP IVS LDP LL mcastCtrl MFTP MPLS Mac Message MIP Ping RAP RTP Resv rtProtoDV rtProtoLS SR SRM SRMEXT Snoop TCP TCPA TFRC TFRC_ACK TORA GAF UMP PUSHBACK NV } { add-packet-header $prot } proc PktHdr_offset { hdrName {field ""} } { set offset [$hdrName offset] if { $field != "" } { incr offset [$hdrName set offset_($field)] } return $offset } Simulator instproc create_packetformat { } { PacketHeaderManager instvar tab_ set pm [new PacketHeaderManager] foreach cl [PacketHeader info subclass] { if [info exists tab_($cl)] { set off [$pm allochdr $cl] $cl offset $off } } $self set packetManager_ $pm } PacketHeaderManager instproc allochdr cl { set size [$cl set hdrlen_] $self instvar hdrlen_ set NS_ALIGN 8 set incr [expr ($size + ($NS_ALIGN-1)) & ~($NS_ALIGN-1)] set base $hdrlen_ incr hdrlen_ $incr return $base } Class CBQLink -superclass SimpleLink CBQLink instproc init { src dst bw delay q cl {lltype "DelayLink"} } { $self next $src $dst $bw $delay $q $lltype ; # SimpleLink ctor $self instvar head_ queue_ link_ $self instvar classifier_ ; # not found in a SimpleLink $queue_ link $link_ ; # queue_ set by SimpleLink ctor, CBQ needs $link_ set classifier_ $cl $head_ target $classifier_ set defalg [Queue/CBQ set algorithm_] $queue_ set algorithm_ $defalg $queue_ algorithm $defalg } CBQLink instproc classifier {} { $self instvar classifier_ return $classifier_ } CBQLink instproc bind args { $self instvar classifier_ set nargs [llength $args] set cbqcl [lindex $args 0] set a [lindex $args 1] if { $nargs == 3 } { set b [lindex $args 2] } else { set b $a } while { $a <= $b } { set slot [$classifier_ installNext $cbqcl] $classifier_ set-hash auto 0 0 $a $slot incr a } } CBQLink instproc insert args { $self instvar queue_ drophead_ link_ set nargs [llength $args] set cbqcl [lindex $args 0] set qdisc [$cbqcl qdisc] if { $nargs == 1 } { set qmon [new QueueMonitor] } else { set qmon [lindex $args 1] } if { $qmon == "" } { error "CBQ requires a q-monitor for class $cbqcl" } if { $qdisc != "" } { set in [new SnoopQueue/In] set out [new SnoopQueue/Out] set drop [new SnoopQueue/Drop] $in set-monitor $qmon $out set-monitor $qmon $drop set-monitor $qmon $in target $qdisc $cbqcl target $in $qdisc drop-target $drop $drop target $drophead_ $qdisc target $out $out target $queue_ $cbqcl qmon $qmon } $cbqcl instvar maxidle_ if { $maxidle_ == "auto" } { $cbqcl automaxidle [$link_ set bandwidth_] \ [$queue_ set maxpkt_] set maxidle_ [$cbqcl set maxidle_] } $cbqcl maxidle $maxidle_ $queue_ insert-class $cbqcl } CBQClass instproc init {} { $self next $self instvar automaxidle_gain_ set automaxidle_gain_ [$class set automaxidle_gain_] } CBQClass instproc automaxidle { linkbw maxpkt } { $self instvar automaxidle_gain_ maxidle_ $self instvar priority_ set allot [$self allot] set g $automaxidle_gain_ set n [expr 8 * $priority_] if { $g == 0 || $allot == 0 || $linkbw == 0 } { set maxidle_ 0.0 return } set gTOn [expr pow($g, $n)] set first [expr ((1/$allot) - 1) * (1-$gTOn) / $gTOn ] set second [expr (1 - $g)] set t [expr ($maxpkt * 8.0)/$linkbw] if { $first > $second } { set maxidle_ [expr $t * $first] } else { set maxidle_ [expr $t * $second] } return $maxidle_ } CBQClass instproc setparams { parent okborrow allot maxidle prio level xdelay } { $self allot $allot $self parent $parent $self set okborrow_ $okborrow $self set maxidle_ $maxidle $self set priority_ $prio $self set level_ $level $self set extradelay_ $xdelay return $self } CBQClass instproc install-queue q { $q set blocked_ true $q set unblock_on_resume_ false $self qdisc $q } QueueMonitor instproc reset {} { $self instvar size_ pkts_ $self instvar parrivals_ barrivals_ $self instvar pdepartures_ bdepartures_ $self instvar pdrops_ bdrops_ set parrivals_ 0 set barrivals_ 0 set pdepartures_ 0 set bdepartures_ 0 set pdrops_ 0 set bdrops_ 0 set bint [$self get-bytes-integrator] if { $bint != "" } { $bint reset } set pint [$self get-pkts-integrator] if { $pint != "" } { $pint reset } set samp [$self get-delay-samples] if { $samp != "" } { $samp reset } } QueueMonitor/ED instproc reset {} { $self next $self instvar epdrops_ ebdrops_ mon_epdrops_ mon_ebdrops_ set epdrops_ 0 set ebdrops_ 0 set mon_epdrops_ 0 set mon_ebdrops_ 0 } Class AckReconsClass -superclass Agent AckReconsControllerClass instproc demux { src dst } { $self instvar reconslist_ queue_ set addr $src:$dst if { ![info exists reconslist_($addr)] } { set recons [new Agent/AckReconsClass $src $dst] $recons target $queue_ set reconslist_($addr) $recons } return $reconslist_($addr) } Agent/AckReconsClass instproc spacing { ack } { $self instvar ackInterArr_ ackSpacing_ delack_ \ lastAck_ lastRealAck_ lastRealTime_ adaptive_ size_ global ns set deltaTime [expr [$ns now] - $lastRealTime_] set deltaAck [expr $ack - $lastAck_] if {$adaptive_} { set bw [expr $deltaAck*$size_/$deltaTime] set ackSpacing_ $ackInterArr_ if { $deltaAck > 0 } { } } else { set deltaT [expr $deltaTime / ($deltaAck/$delack_ +1)] set ackSpacing_ $deltaT } } Agent/AckReconsClass instproc ackbw {ack time} { $self instvar ackInterArr_ lastRealTime_ lastRealAck_ alpha_ set sample [expr $time - $lastRealTime_] set ackInterArr_ [expr $alpha_*$sample + (1-$alpha_)*$ackInterArr_] } Class Classifier/Hash/Fid/FQ -superclass Classifier/Hash/Fid Classifier/Hash/Fid/FQ instproc unknown-flow { src dst fid } { $self instvar fq_ $fq_ new-flow $src $dst $fid } Class FQLink -superclass SimpleLink FQLink instproc init { src dst bw delay q } { $self next $src $dst $bw $delay $q $self instvar link_ queue_ head_ toNode_ ttl_ classifier_ \ nactive_ $self instvar drophead_ ;# idea stolen from CBQ and Kevin set nactive_ 0 set classifier_ [new Classifier/Hash/Fid/FQ 33] $classifier_ set fq_ $self $head_ target $classifier_ $queue_ set secsPerByte_ [expr 8.0 / [$link_ set bandwidth_]] } FQLink instproc new-flow { src dst fid } { $self instvar classifier_ nactive_ queue_ link_ drpT_ incr nactive_ set type [$class set queueManagement_] set q [new Queue/$type] if { $type == "RED" } { set bw [$link_ set bandwidth_] $q set ptc_ [expr $bw / (8. * [$q set mean_pktsize_])] } $q drop-target $drpT_ set slot [$classifier_ installNext $q] $classifier_ set-hash auto $src $dst $fid $slot $q target $queue_ $queue_ install $fid $q } FQLink instproc up? { } { return up } Queue/RED/PD instproc makeflowmon { link {cltype "SrcDestFid"} {cslots 29}} { set flowmon [new QueueMonitor/ED/Flowmon] set cl [new Classifier/Hash/$cltype $cslots] $cl proc unknown-flow { src dst fid } { set nflow [new QueueMonitor/ED/Flow/RedPD] set slot [$self installNext $nflow] $self set-hash auto $src $dst $fid $slot } $cl proc no-slot slotnum { puts stderr "classifier $self, no-slot for slotnum $slotnum" } $flowmon classifier $cl $self attach-flowmon $flowmon set isnoop [new SnoopQueue/In] set osnoop [new SnoopQueue/Out] set dsnoop [new SnoopQueue/Drop] set edsnoop [new SnoopQueue/EDrop] $link attach-monitors $isnoop $osnoop $dsnoop $flowmon $edsnoop set-monitor $flowmon $self early-drop-target $edsnoop set ns [Simulator instance] $edsnoop target [$ns set nullAgent_] $self drop-target $dsnoop return $flowmon } Queue instproc attach-nam-traces {src dst file} { $self attach-traces $src $dst $file "nam" } Queue instproc attach-traces {src dst file {op ""}} { } Queue/RED instproc attach-traces {src dst file {op ""}} { set ns [Simulator instance] set type [$self trace-type] if {$op == "nam"} { set type "Drop" } set newtrace [$ns create-trace $type $file $src $dst $op] set oldTrace [$self edrop-trace] if {$oldTrace!=0} { $newtrace target $oldTrace } else { $newtrace target [$ns set nullAgent_] } $self edrop-trace $newtrace } Queue/RED/PD instproc attach-traces {src dst file {op ""}} { $self next $src $dst $file $op set ns [Simulator instance] set type [$self mon-trace-type] if {$op == "nam"} { set type "Drop" } set medtrace [$ns create-trace $type $file $src $dst $op] set oldTrace [$self mon-edrop-trace] if {$oldTrace!=0} { puts "exists" $medtrace target $oldTrace } else { $medtrace target [$ns set nullAgent_] } $self mon-edrop-trace $medtrace } Trace instproc init type { $self next $type $self instvar type_ set type_ $type } Trace instproc format args { $self instvar type_ fp_ src_ dst_ if [info exists fp_] { set ns [Simulator instance] puts $fp_ [eval list $type_ [$ns now] [eval concat $args]] } } Trace instproc attach fp { $self instvar fp_ set fp_ $fp $self cmd attach $fp_ } BaseTrace instproc attach fp { $self instvar fp_ set fp_ $fp $self cmd attach $fp_ } Class Trace/Hop -superclass Trace Trace/Hop instproc init {} { $self next "h" } Class Trace/Enque -superclass Trace Trace/Enque instproc init {} { $self next "+" } Trace/Deque instproc init {} { $self next "-" } Class Trace/EDrop -superclass Trace Trace/EDrop instproc init {} { $self next "e" } Class Trace/MEDrop -superclass Trace Trace/MEDrop instproc init {} { $self next "m" } Class Trace/SessEnque -superclass Trace Trace/SessEnque instproc init {} { $self next "E" ;# Should use '='? :) } Class Trace/SessDeque -superclass Trace Trace/SessDeque instproc init {} { $self next "D" ;# Should use '_'? } Class Trace/Recv -superclass Trace Trace/Recv instproc init {} { $self next "r" } Class Trace/Drop -superclass Trace Trace/Drop instproc init {} { $self next "d" } Class Trace/Generic -superclass Trace Trace/Generic instproc init {} { $self next "v" } Class Trace/Collision -superclass Trace Trace/Collision instproc init {} { $self next "c" } Class Trace/Var -superclass Trace Trace/Var instproc init {} { $self next "f" } proc f-time t { format "%7.4f" $t } proc f-node n { set node [expr $n >> 8] set port [expr $n & 0xff] return "$node.$port" } proc gc o { set ret "NULL_OBJECT" if { $o != "" } { set ret "" foreach i $o { if ![catch "$i info class" val] { lappend ret $val } } } set ret } Node instproc tn {} { $self instvar id_ return "${self}(id $id_)" } Simulator instproc gen-map {} { $self instvar Node_ link_ MobileNode_ set nn [Node set nn_] for {set i 0} {$i < $nn} {incr i} { if ![info exists Node_($i)] { continue } set n $Node_($i) puts "Node [$n tn]" foreach nc [$n info vars] { switch $nc { ns_ continue id_ continue neighbor_ continue agents_ continue routes_ continue np_ continue default { if [$n array exists $nc] { puts "\t\t$nc\t[$n array get $nc]" } else { set v [$n set $nc] puts "\t\t$nc${v}([gc $v])" } } } } if {[llength [$n set agents_]] > 0} { puts "\n\tAgents at node (possibly in order of creation):" foreach a [$n set agents_] { puts "\t\t$a\t[gc $a]\t\tdst-addr/port: [$a set dst_addr_]/[$a set dst_port_]" } } puts "" foreach li [array names link_ [$n id]:*] { set L [split $li :] set nbr [[$self get-node-by-id [lindex $L 1]] entry] set ln $link_($li) puts "\tLink $ln, fromNode_ [[$ln set fromNode_] tn] -> toNode_ [[$ln set toNode_] tn]" puts "\tComponents (in order) head first" for {set c [$ln head]} {$c != $nbr} {set c [$c target]} { puts "\t\t$c\t[gc $c]" } } puts "---" } } Simulator instproc maybeEnableTraceAll {obj args} { foreach {file tag} { traceAllFile_ {} namtraceAllFile_ nam } { $self instvar $file if [info exists $file] { $obj trace [set $file] $args $tag } } } proc exponential {args} { global defaultRNG eval [list $defaultRNG exponential] $args } proc uniform {args} { global defaultRNG eval [list $defaultRNG uniform] $args } proc integer {args} { global defaultRNG eval [list $defaultRNG integer] $args } RNG instproc init {} { $self next $self instvar z2 set z2 0 } RNG instproc uniform {a b} { expr $a + (($b - $a) * ([$self next-random] * 1.0 / 0x7fffffff)) } RNG instproc integer k { expr [$self next-random] % abs($k) } RNG instproc exponential {{mu 1.0}} { expr - $mu * log(([$self next-random] + 1.0) / (0x7fffffff + 1.0)) } RandomVariable instproc test count { for {set i 0} {$i < $count} {incr i} { puts stdout [$self value] } } set defaultRNG [new RNG] $defaultRNG seed 1 $defaultRNG default trace variable defaultRNG w { abort "cannot update defaultRNG once assigned"; } Class RandomVariable/TraceDriven -superclass RandomVariable RandomVariable/TraceDriven instproc init {} { $self instvar filename_ file_ } RandomVariable/TraceDriven instproc value {} { $self instvar file_ filename_ if ![info exist file_] { if [info exist filename_] { set file_ [open $filename_ r] } else { puts "RandomVariable/TraceDriven: Filename is not given" exit 0 } } if ![eof $file_] { gets $file_ tmp return $tmp } else { close $file_ puts "Error: RandomVariable/TraceDriven: Reached the end of the trace fi le " exit 0 } } Agent instproc set args { if { [lindex $args 0] == "dst_" } { puts "Warning dst_ is no longer being supported in NS. $args" puts "Use dst_addr_ and dst_port_ instead" $self instvar dst_addr_ dst_port_ set addr [lindex $args 1] set baseAddr [Simulator set McastBaseAddr_] if { $addr >= $baseAddr } { $self set dst_addr_ $addr $self set dst_port_ 0 } else { $self set dst_addr_ [expr ($addr >> 8) ] $self set dst_port_ [expr ($addr % 256) ] exit } return } eval $self next $args } Agent instproc init {} { } Agent instproc nodeid {} { [$self set node_] id } Agent instproc port {} { $self instvar agent_port_ return $agent_port_ } Agent instproc dst-port {} { $self instvar dst_port_ return [expr $dst_port_] } Agent instproc attach-source {s_type} { set source [new Source/$s_type] $source attach $self $self set type_ $s_type return $source } Agent instproc attach-app {s_type} { set app_ [new Application/$s_type] $app_ attach-agent $self $self set type_ $s_type return $app_ } Agent instproc attach-tbf { tbf } { $tbf target [$self target] $self target $tbf } Class Agent/Null -superclass Agent Agent/Null instproc init args { eval $self next $args } Agent/LossMonitor instproc log-loss {} { } Agent/CBR/UDP/SA instproc attach-tbf { tbf } { $tbf target [$self target] $self target $tbf $self ctrl-target [$tbf target] } Agent proc set-maxttl {objectOrClass var} { if { [catch "$objectOrClass set $var" value] || \ ($value < [Agent set ttl_]) } { $objectOrClass set $var [Agent set ttl_] } $objectOrClass set $var } Agent/TCP instproc init {} { eval $self next set ns [Simulator instance] $ns create-eventtrace Event $self } Agent/TCP/FullTcp/Tahoe instproc init {} { $self next $self instvar reno_fastrecov_ set reno_fastrecov_ false } Agent/TCP/FullTcp/Sack instproc init {} { $self next $self instvar reno_fastrecov_ maxburst_ open_cwnd_on_pack_ set reno_fastrecov_ false set maxburst_ 5 set open_cwnd_on_pack_ false } Agent/TCP/FullTcp/Newreno instproc init {} { $self next $self instvar open_cwnd_on_pack_ set open_cwnd_on_pack_ false } Agent/TORA instproc init args { $self next $args } Agent/TORA set sport_ 0 Agent/TORA set dport_ 0 Agent/AODV instproc init args { $self next $args } Agent/AODV set sport_ 0 Agent/AODV set dport_ 0 RouteLogic instproc register {proto args} { $self instvar rtprotos_ node_rtprotos_ default_node_rtprotos_ if [info exists rtprotos_($proto)] { eval lappend rtprotos_($proto) $args } else { set rtprotos_($proto) $args } if { [Agent/rtProto/$proto info procs pre-init-all] != "" } { Agent/rtProto/$proto pre-init-all $args } } RouteLogic instproc configure {} { $self instvar rtprotos_ if [info exists rtprotos_] { foreach proto [array names rtprotos_] { eval Agent/rtProto/$proto init-all $rtprotos_($proto) } } else { Agent/rtProto/Static init-all } } RouteLogic instproc lookup { nodeid destid } { if { $nodeid == $destid } { return $nodeid } set ns [Simulator instance] set node [$ns get-node-by-id $nodeid] if [Simulator hier-addr?] { set dest [$ns get-node-by-id $destid] set nh [$self hier-lookup [$node node-addr] [$dest node-addr]] return [$ns get-node-id-by-addr $nh] } set rtobj [$node rtObject?] if { $rtobj != "" } { $rtobj lookup [$ns get-node-by-id $destid] } else { $self cmd lookup $nodeid $destid } } RouteLogic instproc notify {} { $self instvar rtprotos_ foreach i [array names rtprotos_] { Agent/rtProto/$i compute-all } foreach i [CtrMcastComp info instances] { $i notify } if { [rtObject info instances] == ""} { foreach node [[Simulator instance] all-nodes-list] { $node notify-mcast 0 } } } RouteLogic instproc append-addr {level addrstr} { if {$level != 0} { set str [lindex $addrstr 0] for {set i 1} {$i < $level} {incr i} { append str . [lindex $addrstr [expr $i]] } return $str } } RouteLogic instproc dump nn { set i 0 while { $i < $nn } { set j 0 while { $j < $nn } { puts "$i -> $j via [$self lookup $i $j]" incr j } incr i } } Simulator instproc rtproto {proto args} { $self instvar routingTable_ if {$proto == "Algorithmic"} { set routingTable_ [new RouteLogic/Algorithmic] } eval [$self get-routelogic] register $proto $args } Simulator instproc get-routelogic {} { $self instvar routingTable_ if ![info exists routingTable_] { set routingTable_ [new RouteLogic] } return $routingTable_ } Simulator instproc dump-approx-sim-data {} { $self instvar routingTable_ Node_ link_ if ![info exists routingTable_] { puts "error: routing table is not computed yet!" return 0 } puts "# Dumping Approx-Sim Data" set n [Node set nn_] puts "m [Link set nl_] " foreach qn [array names link_] { set l $link_($qn) puts "link [expr [$l set id_] + 1] [expr [$l bw] / 8000] [expr [$l bw] / 8000] [$l delay] [$l qsize]" } puts "" global nconn_ conn_ puts "n $nconn_" for { set i 0 } { $i < $nconn_ } { incr i } { set len 0 set str "" set list [split $conn_($i) ":"] set srcid [lindex $list 0] set dstid [lindex $list 1] while { $srcid != $dstid } { incr len set nh [$routingTable_ lookup $srcid $dstid] append str " " [$link_($srcid:$nh) id] set srcid $nh } puts "route [expr $i + 1] $len $str" } } Simulator instproc dump-routelogic-nh {} { $self instvar routingTable_ Node_ link_ if ![info exists routingTable_] { puts "error: routing table is not computed yet!" return 0 } puts "Dumping Routing Table: Next Hop Information" set n [Node set nn_] set i 0 puts -nonewline "\t" while { $i < $n } { if ![info exists Node_($i)] { incr i continue } puts -nonewline "$i\t" incr i } set i 0 while { $i < $n } { if ![info exists Node_($i)] { incr i continue } puts -nonewline "\n$i\t" set n1 $Node_($i) set j 0 while { $j < $n } { if { $i != $j } { set nh [$routingTable_ lookup $i $j] if { $nh >= 0 } { puts -nonewline "$nh\t" } } else { puts -nonewline "--\t" } incr j } incr i } puts "" } Simulator instproc dump-routelogic-distance {} { $self instvar routingTable_ Node_ link_ if ![info exists routingTable_] { puts "error: routing table is not computed yet!" return 0 } set n [Node set nn_] set i 0 puts -nonewline "\t" while { $i < $n } { if ![info exists Node_($i)] { incr i continue } puts -nonewline "$i\t" incr i } for {set i 0} {$i < $n} {incr i} { if ![info exists Node_($i)] { continue } puts -nonewline "\n$i\t" set n1 $Node_($i) for {set j 0} {$j < $n} {incr j} { if { $i == $j } { puts -nonewline "0\t" continue } set nh [$routingTable_ lookup $i $j] if { $nh < 0 } { puts -nonewline "0\t" continue } set distance 0 set tmpfrom $i set tmpto $j while {$tmpfrom != $tmpto} { set tmpnext [$routingTable_ lookup \ $tmpfrom $tmpto] set distance [expr $distance + \ [$link_($tmpfrom:$tmpnext) cost?]] set tmpfrom $tmpnext } puts -nonewline "$distance\t" } } puts "" } Simulator instproc compute-routes {} { if [Simulator hier-addr?] { $self compute-hier-routes } else { $self compute-flat-routes } } Simulator instproc compute-flat-routes {} { $self instvar Node_ link_ if { [ Simulator set nix-routing] } { puts "Using NixVector routing, skipping route computations" return } set r [$self get-routelogic] $self cmd get-routelogic $r ;# propagate rl in C++ foreach ln [array names link_] { set L [split $ln :] set srcID [lindex $L 0] set dstID [lindex $L 1] if { [$link_($ln) up?] == "up" } { $r insert $srcID $dstID [$link_($ln) cost?] } else { $r reset $srcID $dstID } } $r compute set n [Node set nn_] $self populate-flat-classifiers $n } Simulator instproc get-link-head { n1 n2 } { $self instvar link_ return [$link_($n1:$n2) head] } Simulator instproc hier-topo {rl} { AddrParams instvar domain_num_ cluster_num_ nodes_num_ if ![info exists cluster_num_] { if {[AddrParams hlevel] > 1} { set def [AddrParams set def_clusters] puts "Default value for cluster_num set to $def\n" for {set i 0} {$i < $domain_num_} {incr i} { lappend clusters $def } } else { puts stderr "hierarchy level = 1; should use flat-rtg instead of hier-rtg" exit 1 } AddrParams set cluster_num_ $clusters } if ![info exists nodes_num_ ] { set total_node 0 set def [AddrParams set def_nodes] puts "Default value for nodes_num set to $def\n" for {set i 0} {$i < $domain_num_} {incr i} { set total_node [expr $total_node + \ [lindex $clusters $i]] } for {set i 0} {$i < $total_node} {incr i} { lappend nodes $def } AddrParams set nodes_num_ $nodes } eval $rl send-num-of-domains $domain_num_ eval $rl send-num-of-clusters $cluster_num_ eval $rl send-num-of-nodes $nodes_num_ } Simulator instproc compute-hier-routes {} { $self instvar Node_ link_ set r [$self get-routelogic] $self cmd get-routelogic $r ;# propagate rl in C++ if ![info exists link_] { return } set level [AddrParams hlevel] $r hlevel-is $level $self hier-topo $r foreach ln [array names link_] { set L [split $ln :] set srcID [[$self get-node-by-id [lindex $L 0]] node-addr] set dstID [[$self get-node-by-id [lindex $L 1]] node-addr] if { [$link_($ln) up?] == "up" } { $r hier-insert $srcID $dstID [$link_($ln) cost?] } else { $r hier-reset $srcID $dstID } } $r hier-compute set n [Node set nn_] $self populate-hier-classifiers $n } set rtglibRNG [new RNG] $rtglibRNG seed 1 Class rtObject rtObject set unreach_ -1 rtObject set maxpref_ 255 rtObject proc init-all args { foreach node $args { if { [$node rtObject?] == "" } { set rtobj($node) [new rtObject $node] } } foreach node $args { ;# XXX $rtobj($node) compute-routes } } rtObject instproc init node { $self next $self instvar ns_ nullAgent_ $self instvar nextHop_ rtpref_ metric_ node_ rtVia_ rtProtos_ set ns_ [Simulator instance] set nullAgent_ [$ns_ set nullAgent_] $node init-routing $self set node_ $node foreach dest [$ns_ all-nodes-list] { set nextHop_($dest) "" if {$node == $dest} { set rtpref_($dest) 0 set metric_($dest) 0 set rtVia_($dest) "Agent/rtProto/Local" ;# make dump happy } else { set rtpref_($dest) [$class set maxpref_] set metric_($dest) [$class set unreach_] set rtVia_($dest) "" $node add-route [$dest id] $nullAgent_ } } $self add-proto Direct $node $rtProtos_(Direct) compute-routes } rtObject instproc add-proto {proto node} { $self instvar ns_ rtProtos_ set rtProtos_($proto) [new Agent/rtProto/$proto $node] $ns_ attach-agent $node $rtProtos_($proto) set rtProtos_($proto) } rtObject instproc lookup dest { $self instvar nextHop_ node_ if {![info exists nextHop_($dest)] || $nextHop_($dest) == ""} { return -1 } else { return [[$nextHop_($dest) set toNode_] id] } } rtObject instproc compute-routes {} { $self instvar ns_ node_ rtProtos_ nullAgent_ $self instvar nextHop_ rtpref_ metric_ rtVia_ set protos "" set changes 0 foreach p [array names rtProtos_] { if [$rtProtos_($p) set rtsChanged_] { incr changes $rtProtos_($p) set rtsChanged_ 0 } lappend protos $rtProtos_($p) } if !$changes return set changes 0 foreach dst [$ns_ all-nodes-list] { if {$dst == $node_} continue set nh "" set pf [$class set maxpref_] set mt [$class set unreach_] set rv "" foreach p $protos { set pnh [$p set nextHop_($dst)] if { $pnh == "" } continue set ppf [$p set rtpref_($dst)] set pmt [$p set metric_($dst)] if {$ppf < $pf || ($ppf == $pf && $pmt < $mt) || $mt < 0} { set nh $pnh set pf $ppf set mt $pmt set rv $p } } if { $nh == "" } { if { $nextHop_($dst) != "" } { $node_ delete-routes [$dst id] $nextHop_($dst) $nullAgent_ set nextHop_($dst) $nh set rtpref_($dst) $pf set metric_($dst) $mt set rtVia_($dst) $rv incr changes } } else { if { $rv == $rtVia_($dst) } { if { $nh != $nextHop_($dst) } { $node_ delete-routes [$dst id] $nextHop_($dst) $nullAgent_ set nextHop_($dst) $nh $node_ add-routes [$dst id] $nextHop_($dst) incr changes } if { $mt != $metric_($dst) } { set metric_($dst) $mt incr changes } if { $pf != $rtpref_($dst) } { set rtpref_($dst) $pf } } else { if { $rtVia_($dst) != "" } { set nextHop_($dst) [$rtVia_($dst) set nextHop_($dst)] set rtpref_($dst) [$rtVia_($dst) set rtpref_($dst)] set metric_($dst) [$rtVia_($dst) set metric_($dst)] } if {$rtpref_($dst) != $pf || $metric_($dst) != $mt} { $node_ delete-routes [$dst id] $nextHop_($dst) $nullAgent_ set nextHop_($dst) $nh set rtpref_($dst) $pf set metric_($dst) $mt set rtVia_($dst) $rv $node_ add-routes [$dst id] $nextHop_($dst) incr changes } } } } foreach proto [array names rtProtos_] { $rtProtos_($proto) send-updates $changes } $self flag-multicast $changes } rtObject instproc flag-multicast changes { $self instvar node_ $node_ notify-mcast $changes } rtObject instproc intf-changed {} { $self instvar ns_ node_ rtProtos_ rtVia_ nextHop_ rtpref_ metric_ foreach p [array names rtProtos_] { $rtProtos_($p) intf-changed $rtProtos_($p) compute-routes } $self compute-routes } rtObject instproc dump-routes chan { $self instvar ns_ node_ nextHop_ rtpref_ metric_ rtVia_ if {$ns_ != ""} { set time [$ns_ now] } else { set time 0.0 } puts $chan [concat "Node:\t${node_}([$node_ id])\tat t =" \ [format "%4.2f" $time]] puts $chan " Dest\t\t nextHop\tPref\tMetric\tProto" foreach dest [$ns_ all-nodes-list] { if {[llength $nextHop_($dest)] > 1} { set p [split [$rtVia_($dest) info class] /] set proto [lindex $p [expr [llength $p] - 1]] foreach rt $nextHop_($dest) { puts $chan [format "%-5s(%d)\t%-5s(%d)\t%3d\t%4d\t %s" \ $dest [$dest id] $rt [[$rt set toNode_] id] \ $rtpref_($dest) $metric_($dest) $proto] } } elseif {$nextHop_($dest) != ""} { set p [split [$rtVia_($dest) info class] /] set proto [lindex $p [expr [llength $p] - 1]] puts $chan [format "%-5s(%d)\t%-5s(%d)\t%3d\t%4d\t %s" \ $dest [$dest id] \ $nextHop_($dest) [[$nextHop_($dest) set toNode_] id] \ $rtpref_($dest) $metric_($dest) $proto] } elseif {$dest == $node_} { puts $chan [format "%-5s(%d)\t%-5s(%d)\t%03d\t%4d\t %s" \ $dest [$dest id] $dest [$dest id] 0 0 "Local"] } else { puts $chan [format "%-5s(%d)\t%-5s(%s)\t%03d\t%4d\t %s" \ $dest [$dest id] "" "-" 255 32 "Unknown"] } } } rtObject instproc rtProto? proto { $self instvar rtProtos_ if [info exists rtProtos_($proto)] { return $rtProtos_($proto) } else { return "" } } rtObject instproc nextHop? dest { $self instvar nextHop_ $self set nextHop_($dest) } rtObject instproc rtpref? dest { $self instvar rtpref_ $self set rtpref_($dest) } rtObject instproc metric? dest { $self instvar metric_ $self set metric_($dest) } Class rtPeer rtPeer instproc init {addr port cls} { $self next $self instvar addr_ port_ metric_ rtpref_ set addr_ $addr set port_ $port foreach dest [[Simulator instance] all-nodes-list] { set metric_($dest) [$cls set INFINITY] set rtpref_($dest) [$cls set preference_] } } rtPeer instproc addr? {} { $self instvar addr_ return $addr_ } rtPeer instproc port? {} { $self instvar port_ return $port_ } rtPeer instproc metric {dest val} { $self instvar metric_ set metric_($dest) $val } rtPeer instproc metric? dest { $self instvar metric_ return $metric_($dest) } rtPeer instproc preference {dest val} { $self instvar rtpref_ set rtpref_($dest) $val } rtPeer instproc preference? dest { $self instvar rtpref_ return $rtpref_($dest) } Agent/rtProto proc pre-init-all args { } Agent/rtProto proc init-all args { error "No initialization defined" } Agent/rtProto instproc init node { $self next $self instvar ns_ node_ rtObject_ preference_ ifs_ ifstat_ set ns_ [Simulator instance] catch "set preference_ [[$self info class] set preference_]" ret if { $ret == "" } { set preference_ [$class set preference_] } foreach nbr [$node set neighbor_] { set link [$ns_ link $node $nbr] set ifs_($nbr) $link set ifstat_($nbr) [$link up?] } set rtObject_ [$node rtObject?] } Agent/rtProto instproc compute-routes {} { error "No route computation defined" } Agent/rtProto instproc intf-changed {} { } Agent/rtProto instproc send-updates args { } Agent/rtProto proc compute-all {} { } Class Agent/rtProto/Static -superclass Agent/rtProto Agent/rtProto/Static proc init-all args { [Simulator instance] compute-routes } Class Agent/rtProto/Session -superclass Agent/rtProto Agent/rtProto/Session proc init-all args { [Simulator instance] compute-routes } Agent/rtProto/Session proc compute-all {} { [Simulator instance] compute-routes } Class Agent/rtProto/Direct -superclass Agent/rtProto Agent/rtProto/Direct instproc init node { $self next $node $self instvar ns_ rtpref_ nextHop_ metric_ ifs_ foreach node [$ns_ all-nodes-list] { set rtpref_($node) 255 set nextHop_($node) "" set metric_($node) -1 } foreach node [array names ifs_] { set rtpref_($node) [$class set preference_] } } Agent/rtProto/Direct instproc compute-routes {} { $self instvar ifs_ ifstat_ nextHop_ metric_ rtsChanged_ set rtsChanged_ 0 foreach nbr [array names ifs_] { if {$nextHop_($nbr) == "" && [$ifs_($nbr) up?] == "up"} { set ifstat_($nbr) 1 set nextHop_($nbr) $ifs_($nbr) set metric_($nbr) [$ifs_($nbr) cost?] incr rtsChanged_ } elseif {$nextHop_($nbr) != "" && [$ifs_($nbr) up?] != "up"} { set ifstat_($nbr) 0 set nextHop_($nbr) "" set metric_($nbr) -1 incr rtsChanged_ } } } Agent/rtProto/DV set UNREACHABLE [rtObject set unreach_] Agent/rtProto/DV set mid_ 0 Agent/rtProto/DV proc init-all args { if { [llength $args] == 0 } { set nodeslist [[Simulator instance] all-nodes-list] } else { eval "set nodeslist $args" } Agent set-maxttl Agent/rtProto/DV INFINITY eval rtObject init-all $nodeslist foreach node $nodeslist { set proto($node) [[$node rtObject?] add-proto DV $node] } foreach node $nodeslist { foreach nbr [$node neighbors] { set rtobj [$nbr rtObject?] if { $rtobj != "" } { set rtproto [$rtobj rtProto? DV] if { $rtproto != "" } { $proto($node) add-peer $nbr [$rtproto set agent_addr_] [$rtproto set agent_port_] } } } } } Agent/rtProto/DV instproc init node { global rtglibRNG $self next $node $self instvar ns_ rtObject_ ifsUp_ $self instvar preference_ rtpref_ nextHop_ nextHopPeer_ metric_ multiPath_ set UNREACHABLE [$class set UNREACHABLE] foreach dest [$ns_ all-nodes-list] { set rtpref_($dest) $preference_ set nextHop_($dest) "" set nextHopPeer_($dest) "" set metric_($dest) $UNREACHABLE } set ifsUp_ "" set multiPath_ [[$rtObject_ set node_] set multiPath_] set updateTime [$rtglibRNG uniform 0.0 0.5] $ns_ at $updateTime "$self send-periodic-update" } Agent/rtProto/DV instproc add-peer {nbr agentAddr agentPort} { $self instvar peers_ $self set peers_($nbr) [new rtPeer $agentAddr $agentPort $class] } Agent/rtProto/DV instproc send-periodic-update {} { global rtglibRNG $self instvar ns_ $self send-updates 1 ;# Anything but 0 set updateTime [expr [$ns_ now] + \ ([$class set advertInterval] * [$rtglibRNG uniform 0.9 1.1])] $ns_ at $updateTime "$self send-periodic-update" } Agent/rtProto/DV instproc compute-routes {} { $self instvar ns_ ifs_ rtpref_ metric_ nextHop_ nextHopPeer_ $self instvar peers_ rtsChanged_ multiPath_ set INFINITY [$class set INFINITY] set MAXPREF [rtObject set maxpref_] set UNREACH [rtObject set unreach_] set rtsChanged_ 0 foreach dst [$ns_ all-nodes-list] { set p [lindex $nextHopPeer_($dst) 0] if {$p != ""} { set metric_($dst) [$p metric? $dst] set rtpref_($dst) [$p preference? $dst] } set pf $MAXPREF set mt $INFINITY set nh(0) 0 foreach nbr [lsort -dictionary [array names peers_]] { set pmt [$peers_($nbr) metric? $dst] set ppf [$peers_($nbr) preference? $dst] if { $pmt < 0 || $pmt >= $INFINITY || $ppf > $pf || $pmt > $mt } \ continue if { $ppf < $pf || $pmt < $mt } { set pf $ppf set mt $pmt unset nh ;# because we must compute *new* next hops } set nh($ifs_($nbr)) $peers_($nbr) } catch "unset nh(0)" if { $pf == $MAXPREF && $mt == $INFINITY } continue if { $pf > $rtpref_($dst) || \ ($metric_($dst) >= 0 && $mt > $metric_($dst)) } \ continue if {$mt >= $INFINITY} { set mt $UNREACH } incr rtsChanged_ if { $pf < $rtpref_($dst) || $mt < $metric_($dst) } { set rtpref_($dst) $pf set metric_($dst) $mt set nextHop_($dst) "" set nextHopPeer_($dst) "" foreach n [array names nh] { lappend nextHop_($dst) $n lappend nextHopPeer_($dst) $nh($n) if !$multiPath_ break; } continue } set rtpref_($dst) $pf set metric_($dst) $mt set newNextHop "" set newNextHopPeer "" foreach rt $nextHop_($dst) { if [info exists nh($rt)] { lappend newNextHop $rt lappend newNextHopPeer $nh($rt) unset nh($rt) } } set nextHop_($dst) $newNextHop set nextHopPeer_($dst) $newNextHopPeer if { $multiPath_ || $nextHop_($dst) == "" } { foreach rt [array names nh] { lappend nextHop_($dst) $rt lappend nextHopPeer_($dst) $nh($rt) if !$multiPath_ break } } } set rtsChanged_ } Agent/rtProto/DV instproc intf-changed {} { $self instvar ns_ peers_ ifs_ ifstat_ ifsUp_ nextHop_ nextHopPeer_ metric_ set INFINITY [$class set INFINITY] set ifsUp_ "" foreach nbr [lsort -dictionary [array names peers_]] { set state [$ifs_($nbr) up?] if {$state != $ifstat_($nbr)} { set ifstat_($nbr) $state if {$state != "up"} { if ![info exists all-nodes] { set all-nodes [$ns_ all-nodes-list] } foreach dest ${all-nodes} { $peers_($nbr) metric $dest $INFINITY } } else { lappend ifsUp_ $nbr } } } } Agent/rtProto/DV proc get-next-mid {} { set ret [Agent/rtProto/DV set mid_] Agent/rtProto/DV set mid_ [expr $ret + 1] set ret } Agent/rtProto/DV proc retrieve-msg id { set ret [Agent/rtProto/DV set msg_($id)] Agent/rtProto/DV unset msg_($id) set ret } Agent/rtProto/DV instproc send-updates changes { $self instvar peers_ ifs_ ifsUp_ if $changes { set to-send-to [lsort -dictionary [array names peers_]] } else { set to-send-to $ifsUp_ } set ifsUp_ "" foreach nbr ${to-send-to} { if { [$ifs_($nbr) up?] == "up" } { $self send-to-peer $nbr } } } Agent/rtProto/DV instproc send-to-peer nbr { $self instvar ns_ rtObject_ ifs_ peers_ set INFINITY [$class set INFINITY] foreach dest [$ns_ all-nodes-list] { set metric [$rtObject_ metric? $dest] if {$metric < 0} { set update($dest) $INFINITY } else { set update($dest) [$rtObject_ metric? $dest] foreach nh [$rtObject_ nextHop? $dest] { if {$nh == $ifs_($nbr)} { set update($dest) $INFINITY } } } } if { $peers_($nbr) == "" } { return } set id [$class get-next-mid] $class set msg_($id) [array get update] $self send-update [$peers_($nbr) addr?] [$peers_($nbr) port?] $id [array size update] } Agent/rtProto/DV instproc recv-update {peerAddr id} { $self instvar peers_ ifs_ nextHopPeer_ metric_ $self instvar rtsChanged_ rtObject_ set INFINITY [$class set INFINITY] set UNREACHABLE [$class set UNREACHABLE] set msg [$class retrieve-msg $id] array set metrics $msg foreach nbr [lsort -dictionary [array names peers_]] { if {[$peers_($nbr) addr?] == $peerAddr} { set peer $peers_($nbr) if { [array size metrics] > [Node set nn_] } { error "$class::$proc update $peerAddr:$msg:$count is larger than the simulation topology" } set metricsChanged 0 foreach dest [array names metrics] { set metric [expr $metrics($dest) + [$ifs_($nbr) cost?]] if {$metric > $INFINITY} { set metric $INFINITY } if {$metric != [$peer metric? $dest]} { $peer metric $dest $metric incr metricsChanged } } if $metricsChanged { $self compute-routes incr rtsChanged_ $metricsChanged $rtObject_ compute-routes } else { $rtObject_ flag-multicast -1 } return } } error "$class::$proc update $peerAddr:$msg:$count from unknown peer" } Agent/rtProto/DV proc compute-all {} { } Class Agent/rtProto/Manual -superclass Agent/rtProto Agent/rtProto/Manual proc pre-init-all args { Node enable-module Manual } Agent/rtProto/Manual proc init-all args { } Class rtQueue Simulator instproc rtmodel { dist parms args } { set ret "" if { [rtModel info subclass rtModel/$dist] != "" } { $self instvar rtModel_ set ret [eval new rtModel/$dist $self] eval $ret set-elements $args eval $ret set-parms $parms set trace [$self get-ns-traceall] if {$trace != ""} { $ret trace $self $trace } set trace [$self get-nam-traceall] if {$trace != ""} { $ret trace $self $trace "nam" } if [info exists rtModel_] { lappend rtModel_ $ret } else { set rtModel_ $ret } } return $ret } Simulator instproc rtmodel-configure {} { $self instvar rtq_ rtModel_ if [info exists rtModel_] { set rtq_ [new rtQueue $self] foreach m $rtModel_ { $m configure } } } Simulator instproc rtmodel-at {at op args} { set parms [list $op $at] eval $self rtmodel Manual [list $parms] $args } Simulator instproc rtmodel-delete model { $self instvar rtModel_ set idx [lsearch -exact $rtModel_ $model] if { $idx != -1 } { delete $model set rtModel_ [lreplace $rtModel_ $idx $idx] } } rtQueue instproc init ns { $self next $self instvar ns_ set ns_ $ns } rtQueue instproc insq-i { interval obj iproc args } { $self instvar rtq_ ns_ set time [expr $interval + [$ns_ now]] if ![info exists rtq_($time)] { $ns_ at $time "$self runq $time" } lappend rtq_($time) "$obj $iproc $args" return $time } rtQueue instproc insq { at obj iproc args } { $self instvar rtq_ ns_ if {[$ns_ now] >= $at} { puts stderr "$proc: Cannot set event in the past" set at "" } else { if ![info exists rtq_($at)] { $ns_ at $at "$self runq $at" } lappend rtq_($at) "$obj $iproc $args" } return $at } rtQueue instproc delq { time obj } { $self instvar rtq_ set ret "" set nevent "" if [info exists rtq_($time)] { foreach event $rtq_($time) { if {[lindex $event 0] != $obj} { lappend nevent $event } else { set ret $event } } set rtq_($time) $nevent ;# XXX } return ret } rtQueue instproc runq { time } { $self instvar rtq_ set objects "" foreach event $rtq_($time) { set obj [lindex $event 0] set iproc [lindex $event 1] set args [lrange $event 2 end] eval $obj $iproc $args lappend objects $obj } foreach obj $objects { $obj notify } unset rtq_($time) } Class rtModel rtModel set rtq_ "" rtModel instproc init ns { $self next $self instvar ns_ startTime_ finishTime_ set ns_ $ns set startTime_ [$class set startTime_] set finishTime_ [$class set finishTime_] } rtModel instproc set-elements args { $self instvar ns_ links_ nodes_ if { [llength $args] == 2 } { set n0 [lindex $args 0] set n1 [lindex $args 1] set n0id [$n0 id] set n1id [$n1 id] set nodes_($n0id) $n0 set nodes_($n1id) $n1 set links_($n0id:$n1id) [$ns_ link $n0 $n1] set links_($n1id:$n0id) [$ns_ link $n1 $n0] } else { set n0 [lindex $args 0] set n0id [$n0 id] set nodes_($n0id) $n0 foreach nbr [$n0 set neighbor_] { set n1 $nbr set n1id [$n1 id] set nodes_($n1id) $n1 set links_($n0id:$n1id) [$ns_ link $n0 $n1] set links_($n1id:$n0id) [$ns_ link $n1 $n0] } } } rtModel instproc set-parms args { $self instvar startTime_ upInterval_ downInterval_ finishTime_ set cls [$self info class] foreach i {startTime_ upInterval_ downInterval_ finishTime_} { if [catch "$cls set $i" $i] { set $i [$class set $i] } } set off "-" set up "-" set dn "-" set fin "-" switch [llength $args] { 4 { set off [lindex $args 0] set up [lindex $args 1] set dn [lindex $args 2] set fin [lindex $args 3] } 3 { set off [lindex $args 0] set up [lindex $args 1] set dn [lindex $args 2] } 2 { set up [lindex $args 0] set dn [lindex $args 1] } } if {$off != "-" && $off != ""} { set startTime_ $off } if {$up != "-" && $up != ""} { set upInterval_ $up } if {$dn != "-" && $dn != ""} { set downInterval_ $dn } if {$fin != "-" && $fin != ""} { set finishTime_ $fin } } rtModel instproc configure {} { $self instvar ns_ links_ if { [rtModel set rtq_] == "" } { rtModel set rtq_ [$ns_ set rtq_] } foreach l [array names links_] { $links_($l) dynamic } $self set-first-event } rtModel instproc set-event-exact {fireTime op} { $self instvar ns_ finishTime_ if {$finishTime_ != "-" && $fireTime > $finishTime_} { if {$op == "up"} { [rtModel set rtq_] insq $finishTime_ $self $op } } else { [rtModel set rtq_] insq $fireTime $self $op } } rtModel instproc set-event {interval op} { $self instvar ns_ $self set-event-exact [expr [$ns_ now] + $interval] $op } rtModel instproc set-first-event {} { $self instvar startTime_ upInterval_ $self set-event [expr $startTime_ + $upInterval_] down } rtModel instproc up {} { $self instvar links_ foreach l [array names links_] { $links_($l) up } } rtModel instproc down {} { $self instvar links_ foreach l [array names links_] { $links_($l) down } } rtModel instproc notify {} { $self instvar nodes_ ns_ foreach n [array names nodes_] { $nodes_($n) intf-changed } [$ns_ get-routelogic] notify } rtModel instproc trace { ns f {op ""} } { $self instvar links_ foreach l [array names links_] { $links_($l) trace-dynamics $ns $f $op } } Class rtModel/Exponential -superclass rtModel rtModel/Exponential instproc set-first-event {} { global rtglibRNG $self instvar startTime_ upInterval_ $self set-event [expr $startTime_ + [$rtglibRNG exponential] * $upInterval_] down } rtModel/Exponential instproc up { } { global rtglibRNG $self next $self instvar upInterval_ $self set-event [expr [$rtglibRNG exponential] * $upInterval_] down } rtModel/Exponential instproc down { } { global rtglibRNG $self next $self instvar downInterval_ $self set-event [expr [$rtglibRNG exponential] * $downInterval_] up } Class rtModel/Deterministic -superclass rtModel rtModel/Deterministic instproc up { } { $self next $self instvar upInterval_ $self set-event $upInterval_ down } rtModel/Deterministic instproc down { } { $self next $self instvar downInterval_ $self set-event $downInterval_ up } Class rtModel/Trace -superclass rtModel rtModel/Trace instproc get-next-event {} { $self instvar tracef_ links_ while {[gets $tracef_ event] >= 0} { set toks [split $event] if [info exists links_([lindex $toks 3]:[lindex $toks 4])] { return $toks } } return "" } rtModel/Trace instproc set-trace-events {} { $self instvar ns_ nextEvent_ evq_ set time [lindex $nextEvent_ 1] while {$nextEvent_ != ""} { set nextTime [lindex $nextEvent_ 1] if {$nextTime < $time} { puts stderr "event $nextEvent_ is before current time $time. ignored." continue } if {$nextTime > $time} break if ![info exists evq_($time)] { set op [string range [lindex $nextEvent_ 2] 5 end] $self set-event-exact $time $op set evq_($time) 1 } set nextEvent_ [$self get-next-event] } } rtModel/Trace instproc set-parms traceFile { $self instvar tracef_ nextEvent_ if [catch "open $traceFile r" tracef_] { puts stderr "cannot open $traceFile" } else { set nextEvent_ [$self get-next-event] if {$nextEvent_ == ""} { puts stderr "no relevant events in $traceFile" } } } rtModel/Trace instproc set-first-event {} { $self set-trace-events } rtModel/Trace instproc up {} { $self next $self set-trace-events } rtModel/Trace instproc down {} { $self next $self set-trace-events } Class rtModel/Manual -superclass rtModel rtModel/Manual instproc set-first-event {} { $self instvar op_ at_ $self set-event-exact $at_ $op_ ;# you could concievably set a finishTime_? } rtModel/Manual instproc set-parms {op at} { $self instvar op_ at_ set op_ $op set at_ $at } rtModel/Manual instproc notify {} { $self next delete $self ;# XXX wierd code alert. } Class Agent/rtProto/Algorithmic -superclass Agent/rtProto Agent/rtProto/Algorithmic proc init-all args { [Simulator instance] compute-algo-routes } Agent/rtProto/Algorithmic proc compute-all {} { [Simulator instance] compute-algo-routes } RouteLogic/Algorithmic instproc BFS {} { $self instvar ns_ children_ root_ rank_ set ns_ [Simulator instance] if {[$ns_ info class] == "Simulator"} { $ns_ instvar link_ foreach ln [array names link_] { set L [split $ln :] set srcID [lindex $L 0] set dstID [lindex $L 1] if ![info exist adj($srcID)] { set adj($srcID) "" } if ![info exist adj($dstID)] { set adj($dstID) "" } if {[lsearch $adj($srcID) $dstID] < 0} { lappend adj($srcID) $dstID } if {[lsearch $adj($dstID) $srcID] < 0} { lappend adj($dstID) $srcID } } } elseif {[$ns_ info class] == "SessionSim"} { $ns_ instvar delay_ foreach ln [array names delay_] { set L [split $ln :] set srcID [lindex $L 0] set dstID [lindex $L 1] if ![info exist adj($srcID)] { set adj($srcID) "" } if ![info exist adj($dstID)] { set adj($dstID) "" } if {[lsearch $adj($srcID) $dstID] < 0} { lappend adj($srcID) $dstID } if {[lsearch $adj($dstID) $srcID] < 0} { lappend adj($dstID) $srcID } } } set rank_ 0 set root_ 0 set traversed($root_) 1 set queue "$root_" while {[llength $queue] > 0} { set parent [lindex $queue 0] set queue [lreplace $queue 0 0] if ![info exist children_($parent)] { set children_($parent) "" } foreach nd $adj($parent) { if ![info exist traversed($nd)] { set traversed($nd) 0 } if !$traversed($nd) { set traversed($nd) 1 lappend children_($parent) $nd lappend queue $nd } } set num_children [llength $children_($parent)] if {$rank_ < $num_children} { set rank_ $num_children } } } RouteLogic/Algorithmic instproc compute {} { $self instvar root_ children_ rank_ id_ algoAdd_ set queue [list [list $root_ 0]] while {[llength $queue] > 0} { set parent [lindex $queue 0] set queue [lreplace $queue 0 0] set id [lindex $parent 0] set algoAdd [lindex $parent 1] set id_($algoAdd) $id set algoAdd_($id) $algoAdd set i 0 foreach child $children_($id) { incr i lappend queue [list $child [expr [expr $algoAdd * $rank_] + $i]] } } } RouteLogic/Algorithmic instproc lookup {src dst} { $self instvar id_ algoAdd_ set algosrc $algoAdd_($src) set algodst $algoAdd_($dst) set algonxt [$self algo-lookup $algosrc $algodst] return $id_($algonxt) } RouteLogic/Algorithmic instproc algo-lookup {src dst} { $self instvar rank_ if {$src == $dst} { return $src } set a $src set b $dst set offset 0 while {$b > $a} { set offset [expr $b % $rank_] set b [expr $b / $rank_] if {$offset == 0} { set offset $rank_ set b [expr $b - 1] } } if {$b == $a} { return [expr [expr $a * $rank_] + $offset] } else { return [expr [expr $a - 1] / $rank_] } } Simulator instproc compute-algo-routes {} { $self instvar Node_ link_ set r [$self get-routelogic] $r BFS $r compute set i 0 set n [Node set nn_] while { $i < $n } { if ![info exists Node_($i)] { incr i continue } set n1 $Node_($i) $n1 set rtsize_ 1 set j 0 while { $j < $n } { if { $i != $j } { set nh [$r lookup $i $j] if { $nh >= 0 } { $n1 add-route $j [$link_($i:$nh) head] } } incr j } incr i } } ErrorModel/Trace instproc init {{filename ""}} { $self instvar file_ $self next set file_ "" if {$filename != ""} { $self open $filename } } ErrorModel/Trace instproc open {filename} { $self instvar file_ if {! [file readable $filename]} { puts "$class: cannot open $filename" return } if {$file_ != ""} { close $file_ } set file_ [open $filename] $self read } ErrorModel/Trace instproc read {} { $self instvar file_ good_ loss_ if {$file_ != ""} { set line [gets $file_] set good_ [lindex $line 0] set loss_ [lindex $line 1] } else { set good_ 123456789 set loss_ 0 } } ErrorModel/TwoState instproc init {rv0 rv1 {unit "pkt"}} { $self next $self unit $unit $self ranvar 0 $rv0 $self ranvar 1 $rv1 } Class ErrorModel/Uniform -superclass ErrorModel Class ErrorModel/Expo -superclass ErrorModel/TwoState Class ErrorModel/Empirical -superclass ErrorModel/TwoState ErrorModel/Uniform instproc init {rate {unit "pkt"}} { $self next $self unit $unit $self set rate_ $rate } ErrorModel/Expo instproc init {avgList {unit "pkt"}} { set rv0 [new RandomVariable/Exponential] set rv1 [new RandomVariable/Exponential] $rv0 set avg_ [lindex $avgList 0] $rv1 set avg_ [lindex $avgList 1] $self next $rv0 $rv1 $unit } ErrorModel/Empirical instproc init {fileList {unit "pkt"}} { set rv0 [new RandomVariable/Empirical] set rv1 [new RandomVariable/Empirical] $rv0 loadCDF [lindex $fileList 0] $rv1 loadCDF [lindex $fileList 1] $self next $rv0 $rv1 $unit } ErrorModel/MultiState instproc init {states periods trans transunit sttype nstates start} { $self instvar states_ transmatrix_ transunit_ nstates_ curstate_ eu_ periods_ $self next set states_ $states set periods_ $periods set transmatrix_ $trans set transunit_ $transunit $self sttype $sttype set nstates_ $nstates set curstate_ $start set eu_ $transunit $self error-model $start if { [$self sttype] == "time" } { for { set i 0 } { $i < $nstates_ } {incr i} { if { [lindex $states_ $i] == $curstate_ } { break } } $self set curperiod_ [lindex $periods_ $i] } } ErrorModel/MultiState instproc corrupt { } { $self instvar states_ transmatrix_ transunit_ curstate_ set cur $curstate_ if { [$self sttype] == "time" } { set curstate_ [$self time-transition] } else { set curstate_ [$self transition] } if { $cur != $curstate_ } { $cur reset $self reset $self error-model $curstate_ } return [$curstate_ next] } ErrorModel/MultiState instproc time-transition { } { $self instvar states_ transmatrix_ transunit_ curstate_ nstates_ periods_ if {[$self set texpired_] != 1} { return $curstate_ } for { set i 0 } { $i < $nstates_ } {incr i} { if { [lindex $states_ $i] == $curstate_ } { break } } set trans [lindex $transmatrix_ $i] set p [uniform 0 1] set total 0 for { set i 0 } { $i < $nstates_ } {incr i } { set total [expr $total + [lindex $trans $i]] if { $p <= $total } { $self set curperiod_ [lindex $periods_ $i] return [lindex $states_ $i] } } puts "Misconfigured state transition: prob $p total $total $nstates_" return $curstate_ } ErrorModel/MultiState instproc transition { } { $self instvar states_ transmatrix_ transunit_ curstate_ nstates_ for { set i 0 } { $i < $nstates_ } {incr i} { if { [lindex $states_ $i] == $curstate_ } { break } } set trans [lindex $transmatrix_ $i] set p [uniform 0 1] set total 0 for { set i 0 } { $i < $nstates_ } {incr i } { set total [expr $total + [lindex $trans $i]] if { $p <= $total } { return [lindex $states_ $i] } } puts "Misconfigured state transition: prob $p total $total $nstates_" return $curstate_ } Class ErrorModel/TwoStateMarkov -superclass ErrorModel/TwoState ErrorModel/TwoStateMarkov instproc init {rate eu {transition}} { $self next $self unit time set rv0 [new RandomVariable/Exponential] set rv1 [new RandomVariable/Exponential] $rv0 set avg_ [lindex $rate 0] $rv1 set avg_ [lindex $rate 1] $self ranvar 0 $rv0 $self ranvar 1 $rv1 } ErrorModule instproc init { cltype { clslots 29 } } { $self next set nullagent [[Simulator instance] set nullAgent_] set classifier [new Classifier/Hash/$cltype $clslots] $self cmd classifier $classifier $self cmd target [new Connector] $self cmd drop-target [new Connector] $classifier proc unknown-flow { src dst fid } { puts "warning: classifier $self unknown flow s:$src, d:$dst, fid:$fid" } } ErrorModule instproc default errmodel { set cl [$self cmd classifier] if { $errmodel == "pass" } { set target [$self cmd target] set pslot [$cl installNext $target] $cl set default_ $pslot return } set emslot [$cl findslot $errmodel] if { $emslot == -1 } { puts "ErrorModule: couldn't find classifier entry for error model $errmodel" return } $cl set default_ $emslot } ErrorModule instproc insert errmodel { $self instvar models_ $errmodel target [$self cmd target] $errmodel drop-target [$self cmd drop-target] if { [info exists models_] } { set models_ [concat $models_ $errmodel] } else { set models_ $errmodel } } ErrorModule instproc errormodels {} { $self instvar models_ return $models_ } ErrorModule instproc bind args { set nargs [llength $args] set errmod [lindex $args 0] set a [lindex $args 1] if { $nargs == 3 } { set b [lindex $args 2] } else { set b $a } set cls [$self cmd classifier] while { $a <= $b } { set slot [$cls installNext $errmod] $cls set-hash auto 0 0 $a $slot incr a } } ErrorModule instproc target args { if { $args == "" } { return [[$self cmd target] target] } set obj [lindex $args 0] [$self cmd target] target $obj [$self cmd target] drop-target $obj } ErrorModule instproc drop-target args { if { $args == "" } { return [[$self cmd drop-target] target] } set obj [lindex $args 0] [$self cmd drop-target] drop-target $obj [$self cmd drop-target] target $obj } Queue/SimpleIntServ set qlimit1_ 50 Queue/SimpleIntServ set qlimit0_ 50 Agent/SA set rate_ 0 Agent/SA set bucket_ 0 Agent/SA set packetSize_ 210 ADC set backoff_ true ADC set dobump_ true ADC/MS set backoff_ false ADC set src_ -1 ADC set dst_ -1 ADC/MS set utilization_ 0.95 ADC/MSPK set utilization_ 0.95 ADC/Param set utilization_ 1.0 ADC/HB set epsilon_ 0.7 ADC/ACTO set s_ 0.002 ADC/ACTO set dobump_ false ADC/ACTP set s_ 0.002 ADC/ACTP set dobump_ false Est/TimeWindow set T_ 3 Est/ExpAvg set w_ 0.125 Est set period_ 0.5 ADC set bandwidth_ 0 SALink set src_ -1 SALink set dst_ -1 Est set src_ -1 Est set dst_ -1 Class IntServLink -superclass SimpleLink IntServLink instproc init { src dst bw delay q arg {lltype "DelayLink"} } { $self next $src $dst $bw $delay $q $lltype ; # SimpleLink ctor $self instvar queue_ link_ $self instvar measclassifier_ signalmod_ adc_ est_ measmod_ set ns_ [Simulator instance] set adctype [lindex $arg 3] set adc_ [new ADC/$adctype] $adc_ set bandwidth_ $bw $adc_ set src_ [$src id] $adc_ set dst_ [$dst id] if { [lindex $arg 5] == "CL" } { set esttype [lindex $arg 4] set est_ [new Est/$esttype] $est_ set src_ [$src id] $est_ set dst_ [$dst id] $adc_ attach-est $est_ 1 set measmod_ [new MeasureMod] $measmod_ target $queue_ $adc_ attach-measmod $measmod_ 1 } set signaltype [lindex $arg 2] set signalmod_ [new $signaltype] $signalmod_ set src_ [$src id] $signalmod_ set dst_ [$dst id] $signalmod_ attach-adc $adc_ $self add-to-head $signalmod_ $self create-meas-classifier $signalmod_ target $measclassifier_ $ns_ at 0.0 "$adc_ start" } IntServLink instproc buffersize { b } { $self instvar est_ adc_ $est_ setbuf [set b] $adc_ setbuf [set b] } IntServLink instproc create-meas-classifier {} { $self instvar measclassifier_ measmod_ link_ queue_ set measclassifier_ [new Classifier/Hash/Fid 1 ] set slot [$measclassifier_ installNext $queue_] $measclassifier_ set-hash auto 0 0 0 $slot set slot [$measclassifier_ installNext $measmod_] $measclassifier_ set default_ 1 } IntServLink instproc trace-sig { f } { $self instvar signalmod_ est_ adc_ $signalmod_ attach $f $est_ attach $f $adc_ attach $f set ns [Simulator instance] $ns at 0.0 "$signalmod_ add-trace" } IntServLink instproc trace-util { interval {f ""}} { $self instvar est_ set ns [Simulator instance] if { $f != "" } { puts $f "[$ns now] [$est_ load-est] [$est_ link-utlzn]" } $ns at [expr [$ns now]+$interval] "$self trace-util $interval $f" } CMUTrace instproc init { tname type } { $self next $tname $type $self instvar type_ src_ dst_ callback_ show_tcphdr_ set type_ $type set src_ 0 set dst_ 0 set callback_ 0 set show_tcphdr_ 0 } CMUTrace instproc attach fp { $self instvar fp_ set fp_ $fp $self cmd attach $fp_ } Class CMUTrace/Send -superclass CMUTrace CMUTrace/Send instproc init { tname } { $self next $tname "s" } Class CMUTrace/Recv -superclass CMUTrace CMUTrace/Recv instproc init { tname } { $self next $tname "r" } Class CMUTrace/Drop -superclass CMUTrace CMUTrace/Drop instproc init { tname } { $self next $tname "D" } CMUTrace/Recv set src_ 0 CMUTrace/Recv set dst_ 0 CMUTrace/Recv set callback_ 0 CMUTrace/Recv set show_tcphdr_ 0 CMUTrace/Send set src_ 0 CMUTrace/Send set dst_ 0 CMUTrace/Send set callback_ 0 CMUTrace/Send set show_tcphdr_ 0 CMUTrace/Drop set src_ 0 CMUTrace/Drop set dst_ 0 CMUTrace/Drop set callback_ 0 CMUTrace/Drop set show_tcphdr_ 0 Node/Broadcast instproc init {} { $self next $self instvar address_ classifier_ id_ dmux_ [Simulator instance] add-broadcast-node $self $id_ set classifier_ [new Classifier/Hash/Dest/Bcast 32] $classifier_ set mask_ [AddrParams NodeMask 1] $classifier_ set shift_ [AddrParams NodeShift 1] set address_ $id_ if { $dmux_ == "" } { set dmux_ [new Classifier/Port/Reserve] $dmux_ set mask_ [AddrParams set ALL_BITS_SET] $dmux_ set shift_ 0 $self add-route $address_ $dmux_ } $classifier_ bcast-receiver $dmux_ $self attach-classifier $classifier_ } Node/Broadcast instproc mk-default-classifier {} { } Node/Broadcast instproc add-route { dst target } { [$self set classifier_] install $dst $target } Node/Broadcast instproc delete-route { dst nullagent } { [$self set classifier_] install $dst $nullagent } Node/Broadcast instproc add-target { agent port } { $agent target [$self entry] [$self demux] install $port $agent } MIPEncapsulator instproc tunnel-exit mhaddr { $self instvar node_ return [[$node_ set regagent_] set TunnelExit_($mhaddr)] } Class Node/MIPBS -superclass Node/Broadcast Node/MIPBS instproc init { args } { eval $self next $args $self instvar regagent_ encap_ decap_ agents_ address_ dmux_ id_ if { $dmux_ == "" } { error "serious internal error at Node/MIPBS\n" } set regagent_ [new Agent/MIPBS $self] $self attach $regagent_ 0 $regagent_ set mask_ [AddrParams NodeMask 1] $regagent_ set shift_ [AddrParams NodeShift 1] $regagent_ set dst_addr_ [expr (~0) << [AddrParams NodeShift 1]] $regagent_ set dst_port_ 0 set encap_ [new MIPEncapsulator] set decap_ [new Classifier/Addr/MIPDecapsulator] lappend agents_ $decap_ set nodeaddr [AddrParams addr2id $address_] $encap_ set addr_ $nodeaddr $encap_ set port_ 1 $encap_ target [$self entry] $encap_ set node_ $self $dmux_ install 1 $decap_ $encap_ set mask_ [AddrParams NodeMask 1] $encap_ set shift_ [AddrParams NodeShift 1] $decap_ set mask_ [AddrParams NodeMask 1] $decap_ set shift_ [AddrParams NodeShift 1] } Class Node/MIPMH -superclass Node/Broadcast Node/MIPMH instproc init { args } { eval $self next $args $self instvar regagent_ set regagent_ [new Agent/MIPMH $self] $self attach $regagent_ 0 $regagent_ set mask_ [AddrParams NodeMask 1] $regagent_ set shift_ [AddrParams NodeShift 1] $regagent_ set dst_addr_ [expr (~0) << [AddrParams NodeShift 1]] $regagent_ set dst_port_ 0 } Agent/MIPBS instproc init { node args } { eval $self next $args if {[$node info class] != "MobileNode/MIPBS" && \ [$node info class] != "Node/MobileNode"} { $self instvar BcastTarget_ set BcastTarget_ [new Classifier/Replicator] $self bcast-target $BcastTarget_ } $self beacon-period 1.0 ;# default value } Agent/MIPBS instproc clear-reg mhaddr { $self instvar node_ OldRoute_ RegTimer_ if [info exists OldRoute_($mhaddr)] { $node_ add-route $mhaddr $OldRoute_($mhaddr) } if {[$node_ info class] == "MobileNode/MIPBS" || [$node_ info class] =="Node/MobileNode" } { eval $node_ delete-route [AddrParams id2addr $mhaddr] } if { [info exists RegTimer_($mhaddr)] && $RegTimer_($mhaddr) != "" } { [Simulator instance] cancel $RegTimer_($mhaddr) set RegTimer_($mhaddr) "" } } Agent/MIPBS instproc encap-route { mhaddr coa lifetime } { $self instvar node_ TunnelExit_ OldRoute_ RegTimer_ set ns [Simulator instance] set encap [$node_ set encap_] if {[$node_ info class] == "MobileNode/MIPBS" || [$node_ info class] == "Node/MobileNode"} { set addr [AddrParams id2addr $mhaddr] set a [split $addr] set b [join $a .] $node_ add-route $b $encap } else { set or [[$node_ entry] slot $mhaddr] if { $or != $encap } { set OldRoute_($mhaddr) $or $node_ add-route $mhaddr $encap } } set TunnelExit_($mhaddr) $coa if { [info exists RegTimer_($mhaddr)] && $RegTimer_($mhaddr) != "" } { $ns cancel $RegTimer_($mhaddr) } set RegTimer_($mhaddr) [$ns at [expr [$ns now] + $lifetime] \ "$self clear-reg $mhaddr"] } Agent/MIPBS instproc decap-route { mhaddr target lifetime } { $self instvar node_ RegTimer_ if {[$node_ info class] != "MobileNode/MIPBS" && \ [$node_ info class] != "Node/MobileNode" } { set ns [Simulator instance] [$node_ set decap_] install $mhaddr $target if { [info exists RegTimer_($mhaddr)] && \ $RegTimer_($mhaddr) != "" } { $ns cancel $RegTimer_($mhaddr) } set RegTimer_($mhaddr) [$ns at [expr [$ns now] + $lifetime] \ "$self clear-decap $mhaddr"] } else { [$node_ set decap_] defaulttarget [$node_ set ragent_] } } Agent/MIPBS instproc clear-decap mhaddr { $self instvar node_ RegTimer_ if { [info exists RegTimer_($mhaddr)] && $RegTimer_($mhaddr) != "" } { [Simulator instance] cancel $RegTimer_($mhaddr) set RegTimer_($mhaddr) "" } [$node_ set decap_] clear $mhaddr } Agent/MIPBS instproc get-link { src dst } { $self instvar node_ if {[$node_ info class] != "MobileNode/MIPBS" && \ [$node_ info class] != "Node/MobileNode"} { set ns [Simulator instance] return [[$ns link [$ns get-node-by-addr $src] \ [$ns get-node-by-addr $dst]] head] } else { return "" } } Agent/MIPBS instproc add-ads-bcast-link { ll } { $self instvar BcastTarget_ $BcastTarget_ installNext [$ll head] } Agent/MIPMH instproc init { node args } { eval $self next $args if {[$node info class] != "MobileNode/MIPMH" && \ [$node info class] != "SRNode/MIPMH" && \ [$node info class] != "Node/MobileNode" } { $self instvar BcastTarget_ set BcastTarget_ [new Classifier/Replicator] $self bcast-target $BcastTarget_ } $self beacon-period 1.0 ;# default value } Agent/MIPMH instproc update-reg coa { $self instvar node_ if {[$node_ info class] != "MobileNode/MIPMH" && \ [$node_ info class] != "SRNode/MIPMH" && \ [$node_ info class] != "Node/MobileNode" } { set n [Node set nn_] set ns [Simulator instance] set id [$node_ id] set l [[$ns link $node_ [$ns get-node-by-addr $coa]] head] for { set i 0 } { $i < $n } { incr i } { if { $i != $id } { $node_ add-route $i $l } } } } Agent/MIPMH instproc get-link { src dst } { $self instvar node_ if {[$node_ info class] != "MobileNode/MIPMH" && \ [$node_ info class] != "SRNode/MIPMH" && \ [$node_ info class] != "Node/MobileNode" } { set ns [Simulator instance] return [[$ns link [$ns get-node-by-addr $src] \ [$ns get-node-by-addr $dst]] head] } else { return "" } } Agent/MIPMH instproc add-sol-bcast-link { ll } { $self instvar BcastTarget_ $BcastTarget_ installNext [$ll head] } Node/SatNode instproc init args { eval $self next $args ;# parent class constructor $self instvar nifs_ $self instvar phy_tx_ phy_rx_ mac_ ifq_ ll_ pos_ hm_ set nifs_ 0 ;# number of network interfaces set ns_ [Simulator instance] set trace_ [$ns_ get-ns-traceall] if {$trace_ != ""} { set dropT_ [$ns_ create-trace Sat/Drop $trace_ $self $self ""] $self set_trace $dropT_ } } Node/SatNode instproc reset {} { eval $self next $self instvar hm_ instvar nifs_ phy_tx_ phy_rx_ mac_ ifq_ ll_ set ns [Simulator instance] set now_ [$ns now] for {set i 0} {$i < $nifs_} {incr i} { $phy_tx_($i) reset $phy_rx_($i) reset if {[info exists mac_($i)]} { $mac_($i) reset } if {[info exists ll_($i)]} { $ll_($i) reset } if {[info exists ifq_($i)]} { $ifq_($i) reset } } if {$now_ == 0} { if {[info exists hm_]} { $ns at 0.0 "$self start_handoff" } } } Node/SatNode instproc set_next {node_} { $self instvar pos_ $pos_ set_next [$node_ set pos_] } Node/SatNode instproc add-target {agent port } { $self instvar dmux_ if { $port == [Node set rtagent_port_] } { [$self set classifier_] defaulttarget $agent $dmux_ install $port $agent } else { $agent target [$self entry] $dmux_ install $port $agent } } Simulator instproc satnode-polar {alt inc lon alpha plane linkargs chan} { set tmp [$self satnode polar $alt $inc $lon $alpha $plane] $self add-first-links $tmp gsl $linkargs $chan return $tmp } Simulator instproc satnode-geo {lon linkargs chan} { set tmp [$self satnode geo $lon] $self add-first-links $tmp gsl $linkargs $chan return $tmp } Simulator instproc satnode-geo-repeater {lon chan} { set tmp [$self satnode geo $lon] $self add-first-links $tmp gsl-repeater "" $chan return $tmp } Simulator instproc satnode-terminal {lat lon} { $self satnode terminal $lat $lon } Simulator instproc satnode args { $self instvar Node_ set node [new Node/SatNode] if {[lindex $args 0] == "polar" || [lindex $args 0] == "Polar"} { set args [lreplace $args 0 0] $node set pos_ [new Position/Sat/Polar $args] $node cmd set_position [$node set pos_] [$node set pos_] setnode $node $node set hm_ [new HandoffManager/Sat] $node cmd set_handoff_mgr [$node set hm_] [$node set hm_] setnode $node $node create-ragent } elseif {[lindex $args 0] == "geo" || [lindex $args 0] == "Geo"} { set args [lreplace $args 0 0] $node set pos_ [new Position/Sat/Geo $args] $node cmd set_position [$node set pos_] [$node set pos_] setnode $node $node create-ragent } elseif {[lindex $args 0] == "geo-repeater" || [lindex $args 0] == "Geo-repeater"} { set args [lreplace $args 0 0] $node set pos_ [new Position/Sat/Geo $args] $node cmd set_position [$node set pos_] [$node set pos_] setnode $node } elseif {[lindex $args 0] == "terminal" || [lindex $args 0] == "Terminal"} { set args [lreplace $args 0 0] $node set pos_ [new Position/Sat/Term $args] $node cmd set_position [$node set pos_] [$node set pos_] setnode $node $node set hm_ [new HandoffManager/Term] $node cmd set_handoff_mgr [$node set hm_] [$node set hm_] setnode $node $node create-ragent } else { puts "Otcl error; satnode specified incorrectly: $args" } set Node_([$node id]) $node $node set ns_ $self if [$self multicast?] { $node enable-mcast $self } $self check-node-num return $node } Simulator instproc add-first-links {node_ linktype linkargs chan} { $node_ set_downlink $chan $node_ set_uplink $chan if {$linktype == "gsl-repeater"} { $node_ add-repeater $chan } else { eval $node_ add-interface $linktype $linkargs } $node_ attach-to-outlink [$node_ set downlink_] $node_ attach-to-inlink [$node_ set uplink_] } Node/SatNode instproc add-gsl {ltype opt_ll opt_ifq opt_qlim opt_mac \ opt_bw opt_phy opt_inlink opt_outlink} { $self add-interface $ltype $opt_ll $opt_ifq $opt_qlim $opt_mac $opt_bw \ $opt_phy $self attach-to-inlink $opt_inlink $self attach-to-outlink $opt_outlink } Simulator instproc add-isl {ltype node1 node2 bw qtype qlim} { set opt_ll LL/Sat set opt_mac Mac/Sat set opt_phy Phy/Sat set opt_chan Channel/Sat set chan1 [new $opt_chan] set chan2 [new $opt_chan] $node1 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy $chan1 $chan2 $node2 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy $chan2 $chan1 if {$ltype == "crossseam"} { $node1 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy $node2 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy } } Node/SatNode instproc add-repeater chan { $self instvar nifs_ phy_tx_ phy_rx_ linkhead_ set t $nifs_ incr nifs_ set linkhead_($t) [new Connector/LinkHead/Sat] set phy_tx_($t) [new Phy/Repeater] ;# interface set phy_rx_($t) [new Phy/Repeater] $linkhead_($t) setnode $self $linkhead_($t) setphytx $phy_tx_($t) $linkhead_($t) setphyrx $phy_rx_($t) $linkhead_($t) set_type "gsl-repeater" $linkhead_($t) set type_ "gsl-repeater" $phy_rx_($t) up-target $phy_tx_($t) $phy_tx_($t) linkhead $linkhead_($t) $phy_rx_($t) linkhead $linkhead_($t) $phy_tx_($t) node $self ;# Bind node <---> interface $phy_rx_($t) node $self ;# Bind node <---> interface } Node/SatNode instproc add-interface args { $self instvar nifs_ phy_tx_ phy_rx_ mac_ ifq_ ll_ drophead_ linkhead_ global ns_ MacTrace opt set t $nifs_ incr nifs_ set linkhead_($t) [new Connector/LinkHead/Sat] set linktype [lindex $args 0] set ll_($t) [new [lindex $args 1]] ;# link layer set ifq_($t) [new [lindex $args 2]] ;# interface queue set qlen [lindex $args 3] set mac_($t) [new [lindex $args 4]] ;# mac layer set mac_bw [lindex $args 5] set phy_tx_($t) [new [lindex $args 6]] ;# interface set phy_rx_($t) [new [lindex $args 6]] ;# interface set inchan [lindex $args 7] set outchan [lindex $args 8] set drophead_($t) [new Connector] ;# drop target for queue set iif_($t) [new NetworkInterface] set linkhead $linkhead_($t) set phy_tx $phy_tx_($t) set phy_rx $phy_rx_($t) set mac $mac_($t) set ifq $ifq_($t) set ll $ll_($t) set drophead $drophead_($t) set iif $iif_($t) $linkhead setnode $self $linkhead setll $ll $linkhead setmac $mac $linkhead setqueue $ifq $linkhead setphytx $phy_tx $linkhead setphyrx $phy_rx $linkhead setnetinf $iif $self addlinkhead $linkhead; # Add NetworkInterface to node's list $linkhead target $ll; $linkhead set_type $linktype $linkhead set type_ $linktype $iif target [$self entry] $ll mac $mac; # XXX is this needed? $ll up-target $iif $ll down-target $ifq $ll set delay_ 0ms; # processing delay between ll and ifq $ifq target $mac $ifq set limit_ $qlen $drophead target [[Simulator instance] set nullAgent_] $ifq drop-target $drophead $mac netif $phy_tx; # Not used by satellite code at this time $mac up-target $ll $mac down-target $phy_tx $mac set bandwidth_ $mac_bw; $phy_rx up-target $mac $phy_tx linkhead $linkhead $phy_rx linkhead $linkhead $phy_tx node $self ;# Bind node <---> interface $phy_rx node $self ;# Bind node <---> interface if {$outchan != "" && $inchan != ""} { $phy_tx channel $outchan $phy_rx channel $inchan $inchan addif $phy_rx } return $t } Node/SatNode instproc set_uplink {chan} { $self instvar uplink_ set uplink_ [new $chan] $self cmd set_uplink $uplink_ } Node/SatNode instproc set_downlink {chan} { $self instvar downlink_ set downlink_ [new $chan] $self cmd set_downlink $downlink_ } Node/SatNode instproc attach-to-outlink {chan {index 0} } { $self instvar phy_tx_ mac_ $phy_tx_($index) channel $chan } Node/SatNode instproc attach-to-inlink { chan {index 0}} { $self instvar phy_rx_ $phy_rx_($index) channel $chan $chan addif $phy_rx_($index) } Node/SatNode instproc interface-errormodel { em { index 0 } } { $self instvar mac_ ll_ em_ linkhead_ $mac_($index) up-target $em $em target $ll_($index) $em drop-target [new Agent/Null]; # otherwise, packet is only marked set em_($index) $em $linkhead_($index) seterrmodel $em } Node/SatNode instproc create-ragent {} { set ragent [new Agent/SatRoute] $self attach $ragent 255; # attaches to default target of classifier $ragent set myaddr_ [$self set id_] $self set_ragent $ragent; # sets pointer at C++ level $ragent set_node $self; # sets back pointer in ragent to node } Class Agent/rtProto/Dummy -superclass Agent/rtProto Agent/rtProto/Dummy proc init-all args { } Simulator instproc trace-all-satlinks {f} { $self instvar Node_ foreach nn [array names Node_] { if {![$Node_($nn) info class Node/SatNode]} { continue; # Not a SatNode } $Node_($nn) trace-all-satlinks $f } } Node/SatNode instproc trace-all-satlinks {f} { $self instvar nifs_ enqT_ rcvT_ linkhead_ for {set i 0} {$i < $nifs_} {incr i} { if {[$linkhead_($i) set type_] == "gsl-repeater"} { continue; } if {[info exists enqT_($i)]} { puts "Tracing already exists on node [$self id]" } else { $self trace-outlink-queue $f $i } if {[info exists rcvT_($i)]} { puts "Tracing already exists on node [$self id]" } else { $self trace-inlink-queue $f $i } } } Node/SatNode instproc trace-outlink-queue {f {index_ 0} } { $self instvar id_ enqT_ deqT_ drpT_ mac_ ll_ ifq_ drophead_ set ns [Simulator instance] set fromNode_ $id_ set toNode_ -1 set enqT_($index_) [$ns create-trace Sat/Enque $f $fromNode_ $toNode_] $enqT_($index_) target $ifq_($index_) $ll_($index_) down-target $enqT_($index_) set deqT_($index_) [$ns create-trace Sat/Deque $f $fromNode_ $toNode_] $deqT_($index_) target $mac_($index_) $ifq_($index_) target $deqT_($index_) set drpT_($index_) [$ns create-trace Sat/Drop $f $fromNode_ $toNode_] $drpT_($index_) target [$drophead_($index_) target] $drophead_($index_) target $drpT_($index_) $ifq_($index_) drop-target $drpT_($index_) } Node/SatNode instproc trace-inlink-queue {f {index_ 0} } { $self instvar id_ rcvT_ mac_ ll_ phy_rx_ em_ errT_ set ns [Simulator instance] set toNode_ $id_ set fromNode_ -1 if {[info exists em_($index_)]} { set errT_($index_) [$ns create-trace Sat/Error $f $fromNode_ $toNode_] $errT_($index_) target [$em_($index_) drop-target] $em_($index_) drop-target $errT_($index_) set rcvT_($index_) [$ns create-trace Sat/Recv $f $fromNode_ $toNode_] $rcvT_($index_) target [$em_($index_) target] $em_($index_) target $rcvT_($index_) } else { set rcvT_($index_) [$ns create-trace Sat/Recv $f $fromNode_ $toNode_] $rcvT_($index_) target [$mac_($index_) up-target] $mac_($index_) up-target $rcvT_($index_) } } Class Trace/Sat/Hop -superclass Trace/Sat Trace/Sat/Hop instproc init {} { $self next "h" } Class Trace/Sat/Enque -superclass Trace/Sat Trace/Sat/Enque instproc init {} { $self next "+" } Trace/Sat/Deque instproc init {} { $self next "-" } Class Trace/Sat/Recv -superclass Trace/Sat Trace/Sat/Recv instproc init {} { $self next "r" } Class Trace/Sat/Drop -superclass Trace/Sat Trace/Sat/Drop instproc init {} { $self next "d" } Class Trace/Sat/Error -superclass Trace/Sat Trace/Sat/Error instproc init {} { $self next "e" } Class Trace/Sat/Generic -superclass Trace/Sat Trace/Sat/Generic instproc init {} { $self next "v" } Node/SatNode set dist_routing_ "false"; # distributed routing not yet supported Position/Sat set time_advance_ 0; # time offset to start of simulation Position/Sat/Polar set plane_ 0 HandoffManager/Term set elevation_mask_ 0 HandoffManager/Term set term_handoff_int_ 10 HandoffManager/Sat set sat_handoff_int_ 10 HandoffManager/Sat set latitude_threshold_ 70 HandoffManager/Sat set longitude_threshold_ 0 HandoffManager set handoff_randomization_ "false" SatRouteObject set metric_delay_ "true" SatRouteObject set data_driven_computation_ "false" Mac/Sat/UnslottedAloha set mean_backoff_ 1s; # mean backoff time upon collision Mac/Sat/UnslottedAloha set rtx_limit_ 3; # Retransmission limit Mac/Sat/UnslottedAloha set send_timeout_ 270ms; # Timer interval for new sends Agent/SatRoute set myaddr_ 0 ;# My address Mac/Sat set bandwidth_ 2Mb Simulator instproc set-nix-routing { } { Simulator set nix-routing 1 Node enable-module "Nix" } Simulator instproc get-link-head { n1 n2 } { $self instvar link_ return [$link_($n1:$n2) head] } Link instproc set-ipaddr { ipaddr netmask } { } proc mvar args { upvar self _s uplevel $_s instvar $args } Session/RTP set uniq_srcid 0 Session/RTP proc alloc_srcid {} { set id [Session/RTP set uniq_srcid] Session/RTP set uniq_srcid [expr $id+1] return $id } Session/RTP instproc init {} { $self next mvar dchan_ cchan_ set cchan_ [new Agent/RTCP] set dchan_ [new Agent/CBR/RTP] $dchan_ set packetSize_ 512 $dchan_ session $self $cchan_ session $self $self set rtcp_timer_ [new RTCPTimer $self] mvar srcid_ localsrc_ set srcid_ [Session/RTP alloc_srcid] set localsrc_ [new RTPSource $srcid_] $self localsrc $localsrc_ $self set srctab_ $localsrc_ $self set stopped_ 1 } Session/RTP instproc start {} { mvar group_ if ![info exists group_] { puts "error: can't transmit before joining group!" exit 1 } mvar cchan_ $cchan_ start } Session/RTP instproc stop {} { $self instvar cchan_ dchan_ $dchan_ stop $cchan_ stop $self set stopped_ 1 } Session/RTP instproc report-interval { i } { mvar cchan_ $cchan_ set interval_ $i } Session/RTP instproc bye {} { mvar cchan_ dchan_ $dchan_ stop $cchan_ bye } Session/RTP instproc attach-node { node } { mvar dchan_ cchan_ global ns $ns attach-agent $node $dchan_ $ns attach-agent $node $cchan_ $self set node_ $node } Session/RTP instproc detach-node { node } { mvar dchan_ cchan_ global ns $ns detach-agent $node $dchan_ $ns detach-agent $node $cchan_ $self unset node_ } Session/RTP instproc rtcp_timeout {} { mvar rtcp_timeout_callback_ if [info exists rtcp_timeout_callback_] { eval $rtcp_timeout_callback_ } } Session/RTP instproc join-group { g } { set g [expr $g] $self set group_ $g mvar node_ dchan_ cchan_ $dchan_ set dst_ $g $node_ join-group $dchan_ $g incr g $cchan_ set dst_ $g $node_ join-group $cchan_ $g } Session/RTP instproc leave-group { } { mvar group_ node_ cchan_ dchan_ $node_ leave-group $dchan_ $group_ $node_ leave-group $cchan_ [expr $group_+1] $self unset group_ } Session/RTP instproc session_bw { bspec } { set b [bw_parse $bspec] $self set session_bw_ $b mvar rtcp_timer_ $rtcp_timer_ session-bw $b } Session/RTP instproc transmit { bspec } { set b [bw_parse $bspec] $self set txBW_ $b $self instvar dchan_ stopped_ if { $b == 0 } { $dchan_ stop set stopped_ 1 } set ps [$dchan_ set packetSize_] $dchan_ set interval_ [expr 8.*$ps/$b] if { $stopped_ == 1 } { $dchan_ start set stopped_ 0 } else { $dchan_ rate-change } } Session/RTP instproc sample-size { cc } { mvar rtcp_timer_ $rtcp_timer_ sample-size $cc } Session/RTP instproc adapt-timer { nsrc nrr we_sent } { mvar rtcp_timer_ $rtcp_timer_ adapt $nsrc $nrr $we_sent } Session/RTP instproc new-source { srcid } { set src [new RTPSource $srcid] $self enter $src mvar srctab_ lappend srctab_ $src return $src } Class RTCPTimer RTCPTimer instproc init { session } { $self next mvar session_bw_fraction_ min_rpt_time_ inv_sender_bw_fraction_ mvar inv_rcvr_bw_fraction_ size_gain_ avg_size_ inv_bw_ set session_bw_fraction_ 0.05 set min_rpt_time_ 1. set sender_bw_fraction 0.25 set rcvr_bw_fraction [expr 1. - $sender_bw_fraction] set inv_sender_bw_fraction_ [expr 1. / $sender_bw_fraction] set inv_rcvr_bw_fraction_ [expr 1. / $rcvr_bw_fraction] set size_gain_ 0.125 set avg_size_ 128. set inv_bw_ 0. mvar session_ set session_ $session mvar min_rtp_time_ avg_size_ inv_bw_ set rint [expr 8*$avg_size_ * $inv_bw_] set t [expr $min_rpt_time_ / 2.] if { $rint < $t } { set rint $t } $session_ report-interval $rint } RTCPTimer instproc sample-size { cc } { mvar avg_size_ size_gain_ set avg_size_ [expr $avg_size_ + $size_gain_ * ($cc + 28 - $avg_size_)] } RTCPTimer instproc adapt { nsrc nrr we_sent } { mvar inv_bw_ avg_size_ min_rpt_time_ mvar inv_sender_bw_fraction_ inv_rcvr_bw_fraction_ set ibw $inv_bw_ if { $nrr > 0 } { if { $we_sent } { set ibw [expr $ibw * $inv_sender_bw_fraction_] set nsrc $nrr } else { set ibw [expr $ibw * $inv_rcvr_bw_fraction_] incr nsrc -$nrr } } set rint [expr 8*$avg_size_ * $nsrc * $ibw] if { $rint < $min_rpt_time_ } { set rint $min_rpt_time_ } mvar session_ $session_ report-interval $rint } RTCPTimer instproc session-bw { b } { $self set inv_bw_ [expr 1. / $b ] } Agent/RTCP set interval_ 0. Agent/RTCP set random_ 0 Agent/RTCP set class_ 32 RTPSource set srcid_ -1 NetworkInterface set ifacenum_ 0 NetworkInterface proc getid {} { $self instvar ifacenum_ return [incr ifacenum_] } NetworkInterface instproc init {} { $self next $self cmd label [NetworkInterface getid] } Channel set delay_ 4us Classifier/Mac set bcast_ 0 Mac set bandwidth_ 2Mb Mac set delay_ 0us if [TclObject is-class Mac/802_11] { Mac/802_11 set delay_ 64us Mac/802_11 set ifs_ 16us Mac/802_11 set slotTime_ 16us Mac/802_11 set cwmin_ 16 Mac/802_11 set cwmax_ 1024 Mac/802_11 set rtxLimit_ 16 Mac/802_11 set bssId_ -1 Mac/802_11 set sifs_ 8us Mac/802_11 set pifs_ 12us Mac/802_11 set difs_ 16us Mac/802_11 set rtxAckLimit_ 1 Mac/802_11 set rtxRtsLimit_ 3 } if [TclObject is-class Mac/Mcns] { Mac/Mcns set bandwidth_ 10Mb Mac/Mcns set hlen_ 6 Mac/Mcns set bssId_ -1 Mac/Mcns set slotTime_ 10us } if [TclObject is-class Mac/Multihop] { Mac/Multihop set bandwidth_ 100Kb Mac/Multihop set delay_ 10ms Mac/Multihop set tx_rx_ 11.125ms Mac/Multihop set rx_tx_ 13.25ms Mac/Multihop set rx_rx_ 10.5625 Mac/Multihop set backoffBase_ 20ms Mac/Multihop set hlen_ 16 } Mac instproc classify-macs {peerinfo} { set peerlabel [lindex $peerinfo 0] set peerll [lindex $peerinfo 1] $self instvar mclass_ set mclass_ [new Classifier/Mac] $mclass_ install $peerlabel $peerll $self target $mclass_ } Node instproc addmac {mac} { $self instvar machead_ mactail_ if ![info exists mactail_] { set mactail_ [set machead_ $mac] $mac maclist $mactail_ } else { $mactail_ maclist $mac $mac maclist $machead_ set mactail_ $mac } } LL set bandwidth_ 0 ;# not used LL set delay_ 1ms LL set macDA_ 0 if [TclObject is-class LL/Arq] { LL/Arq set mode_ 2 LL/Arq set hlen_ 16 LL/Arq set slen_ 1400 LL/Arq set limit_ 8 LL/Arq set timeout_ 100ms Class LL/Rlp -superclass LL/Arq LL/Rlp set mode_ 1 LL/Rlp set hlen_ 6 LL/Rlp set slen_ 30 LL/Rlp set limit_ 63 LL/Rlp set timeout_ 500ms LL/Rlp set delay_ 70ms } if [TclObject is-class Snoop] { Snoop set snoopTick_ 0.1 Snoop set snoopDisable_ 0 Snoop set srtt_ 0.1 Snoop set rttvar_ 0.25 Snoop set g_ 0.125 Snoop set tailTime_ 0 Snoop set rxmitStatus_ 0 Snoop set lru_ 0 Snoop set maxbufs_ 0 } if [TclObject is-class LL/LLSnoop] { LL/LLSnoop set integrate_ 0 LL/LLSnoop set delay_ 0ms Snoop set srtt_ 0.1 Snoop set rttvar_ 0.25 Snoop set g_ 0.125 LL/LLSnoop set snoopTick_ 0.1 } LL/LLSnoop instproc get-snoop { src dst } { $self instvar snoops_ off_ll_ delay_ if { ![info exists snoops_($src:$dst)] } { set snoops_($src:$dst) [new Snoop] } $snoops_($src:$dst) llsnoop $self $snoops_($src:$dst) set delay_ $delay_ return $snoops_($src:$dst) } LL/LLSnoop instproc integrate { src dst } { $self instvar snoops_ set conn $src:$dst if {![info exists snoops_($conn)]} { return } set snoop $snoops_($conn) set threshtime [$snoop set tailTime_] foreach a [array names snoops_] { if { $a != $conn } { $snoops_($a) check-rxmit $threshtime if { [$snoops_($a) set rxmitStatus_] == 2 } { break; } } } } LanNode set ifqType_ Queue/DropTail LanNode set llType_ LL LanNode set macType_ Mac LanNode set chanType_ Channel LanNode set phyType_ Phy/WiredPhy LanNode set address_ "" LanNode set mactrace_ false LanNode instproc address {val} { $self set address_ $val } LanNode instproc bw {val} { $self set bw_ $val } LanNode instproc delay {val} { $self set delay_ $val } LanNode instproc ifqType {val} { $self set ifqType_ $val } LanNode instproc llType {val} { $self set llType_ $val } LanNode instproc macType {val} { $self set macType_ $val } LanNode instproc chanType {val} { $self set chanType_ $val } LanNode instproc phyType {val} { $self set phyType_ $val } LanNode instproc mactrace {val} { $self set mactrace_ $val } LanNode instproc init {ns args} { set args [eval $self init-vars $args] $self instvar bw_ delay_ ifqType_ llType_ macType_ chanType_ $self instvar phyType_ mactrace_ $self instvar ns_ nodelist_ defRouter_ cost_ $self instvar id_ address_ channel_ mcl_ varp_ $ns instvar Node_ $self next set ns_ $ns set nodelist_ "" set cost_ 1 set id_ [Node getid] $self nodeid $id_ $ns_ add-lannode $self $id_ set Node_($id_) $self if [Simulator hier-addr?] { if {$address_ == ""} { error "LanNode: use \"-address\" option \ with hierarchical routing" } } else { set address_ $id_ } $self addr $address_ set defRouter_ [new LanRouter $ns $self] if [$ns multicast?] { set switch_ [new Classifier/Hash/Dest 32] $switch_ set mask_ [AddrParams McastMask] $switch_ set shift_ [AddrParams McastShift] $defRouter_ switch $switch_ } set channel_ [new $chanType_] set varp_ [new VARPTable] } LanNode instproc addNode {nodes bw delay {llType ""} {ifqType ""} \ {macType ""} {phyType ""} {mactrace ""}} { $self instvar ifqType_ llType_ macType_ chanType_ phyType_ mactrace_ $self instvar id_ channel_ mcl_ lanIface_ $self instvar ns_ nodelist_ cost_ varp_ $ns_ instvar link_ Node_ if {$ifqType == ""} { set ifqType $ifqType_ } if {$macType == ""} { set macType $macType_ } if {$llType == ""} { set llType $llType_ } if {$phyType == ""} { set phyType $phyType_ } if {$mactrace == ""} { set mactrace $mactrace_ } set vlinkcost [expr $cost_ / 2.0] foreach src $nodes { set nif [new LanIface $src $self \ -ifqType $ifqType \ -llType $llType \ -macType $macType \ -phyType $phyType \ -mactrace $mactrace ] set tr [$ns_ get-ns-traceall] if {$tr != ""} { $nif trace $ns_ $tr } set tr [$ns_ get-nam-traceall] if {$tr != ""} { $nif nam-trace $ns_ $tr } set ll [$nif set ll_] $ll set delay_ $delay $ll varp $varp_ $varp_ mac-addr [[$nif set node_] id] \ [[$nif set mac_] id] set phy [$nif set phy_] $phy node $src $phy channel $channel_ $channel_ addif $phy $phy set bandwidth_ $bw set lanIface_($src) $nif $src add-neighbor $self set sid [$src id] set link_($sid:$id_) [new Vlink $ns_ $self $src $self $bw 0] set link_($id_:$sid) [new Vlink $ns_ $self $self $src $bw 0] $src add-oif [$link_($sid:$id_) head] $link_($sid:$id_) $src add-iif [[$nif set iface_] label] $link_($id_:$sid) [$link_($sid:$id_) head] set link_ $link_($sid:$id_) $link_($sid:$id_) queue [$nif set ifq_] $link_($id_:$sid) queue [$nif set ifq_] $link_($sid:$id_) set iif_ [$nif set iface_] $link_($id_:$sid) set iif_ [$nif set iface_] $link_($sid:$id_) cost $vlinkcost $link_($id_:$sid) cost $vlinkcost } set nodelist_ [concat $nodelist_ $nodes] } LanNode instproc assign-mac {ip} { return $ip ;# use ip addresses at MAC layer } LanNode instproc cost c { $self instvar ns_ nodelist_ id_ cost_ $ns_ instvar link_ set cost_ $c set vlinkcost [expr $c / 2.0] foreach node $nodelist_ { set nid [$node id] $link_($id_:$nid) cost $vlinkcost $link_($nid:$id_) cost $vlinkcost } } LanNode instproc cost? {} { $self instvar cost_ return $cost_ } LanNode instproc rtObject? {} { } LanNode instproc id {} { $self set id_ } LanNode instproc node-addr {{addr ""}} { eval $self set address_ $addr } LanNode instproc reset {} { } LanNode instproc is-lan? {} { return 1 } LanNode instproc dump-namconfig {} { $self instvar ns_ bw_ delay_ nodelist_ id_ $ns_ puts-nam-config \ "X -t * -n $id_ -r $bw_ -D $delay_ -o left" set cnt 0 set LanOrient(0) "up" set LanOrient(1) "down" foreach n $nodelist_ { $ns_ puts-nam-config \ "L -t * -s $id_ -d [$n id] -o $LanOrient($cnt)" set cnt [expr 1 - $cnt] } } LanNode instproc init-outLink {} { } LanNode instproc start-mcast {} { } LanNode instproc getArbiter {} { } LanNode instproc attach {agent} { } LanNode instproc sp-add-route {args} { } LanNode instproc add-route {args} { } LanNode instproc add-hroute {args} { } Class LanIface LanIface set ifqType_ Queue/DropTail LanIface set macType_ Mac LanIface set llType_ LL LanIface set phyType_ Phy/WiredPhy LanIface set mactrace_ false LanIface instproc llType {val} { $self set llType_ $val } LanIface instproc ifqType {val} { $self set ifqType_ $val } LanIface instproc macType {val} { $self set macType_ $val } LanIface instproc phyType {val} { $self set phyType_ $val } LanIface instproc mactrace {val} { $self set mactrace_ $val } LanIface instproc entry {} { $self set entry_ } LanIface instproc init {node lan args} { set args [eval $self init-vars $args] eval $self next $args $self instvar llType_ ifqType_ macType_ phyType_ mactrace_ $self instvar node_ lan_ ifq_ mac_ ll_ phy_ $self instvar iface_ entry_ drophead_ set node_ $node set lan_ $lan set ll_ [new $llType_] set ifq_ [new $ifqType_] set mac_ [new $macType_] if {[string compare $macType_ "Mac/802_3"] == 0} { $mac_ set trace_ $mactrace_ } set iface_ [new NetworkInterface] set phy_ [new $phyType_] set entry_ [new Connector] set drophead_ [new Connector] $ll_ set macDA_ -1 ;# bcast address if there is no LAN router $ll_ lanrouter [$lan set defRouter_] $ll_ up-target $iface_ $ll_ down-target $ifq_ $ll_ mac $mac_ $ll_ ifq $ifq_ $ifq_ target $mac_ $mac_ up-target $ll_ $mac_ down-target $phy_ $mac_ netif $phy_ $phy_ up-target $mac_ $iface_ target [$node entry] $entry_ target $ll_ set ns [Simulator instance] $drophead_ target [$ns set nullAgent_] $ifq_ drop-target $drophead_ $mac_ drop-target $drophead_ $ll_ drop-target $drophead_ } LanIface instproc trace {ns f {op ""}} { $self instvar hopT_ rcvT_ enqT_ deqT_ drpT_ $self instvar iface_ entry_ node_ lan_ drophead_ $self instvar ll_ ifq_ mac_ mactrace_ set hopT_ [$ns create-trace Hop $f $node_ $lan_ $op] set rcvT_ [$ns create-trace Recv $f $lan_ $node_ $op] set enqT_ [$ns create-trace Enque $f $node_ $lan_ $op] set deqT_ [$ns create-trace Deque $f $node_ $lan_ $op] set drpT_ [$ns create-trace Drop $f $node_ $lan_ $op] if {[string compare $mactrace_ "true"] == 0} { set macdrpT_ [$ns create-trace Collision $f $node_ $lan_ $op] set macdrophead_ [new Connector] $mac_ drop-target $macdrophead_ $macdrophead_ target $macdrpT_ } $hopT_ target [$entry_ target] $entry_ target $hopT_ $rcvT_ target [$iface_ target] $iface_ target $rcvT_ $enqT_ target [$ll_ down-target] $ll_ down-target $enqT_ $deqT_ target [$ifq_ target] $ifq_ target $deqT_ $drpT_ target [$drophead_ target] $drophead_ target $drpT_ } LanIface instproc nam-trace {ns f} { $self instvar hopT_ rcvT_ enqT_ deqT_ drpT_ if [info exists hopT_] { $hopT_ namattach $f } else { $self trace $ns $f "nam" } $rcvT_ namattach $f $enqT_ namattach $f $deqT_ namattach $f $drpT_ namattach $f } LanIface instproc add-receive-filter filter { $self instvar mac_ $filter target [$mac_ target] $mac_ target $filter } Class Vlink Vlink instproc up? {} { return "up" } Vlink instproc queue {{q ""}} { eval $self set queue_ $q } Vlink instproc init {ns lan src dst b d} { $self instvar ns_ lan_ src_ dst_ bw_ delay_ set ns_ $ns set lan_ $lan set src_ $src set dst_ $dst set bw_ $b set delay_ $d } Vlink instproc src {} { $self set src_ } Vlink instproc dst {} { $self set dst_ } Vlink instproc dump-nam-queueconfig {} { } Vlink instproc head {} { $self instvar lan_ dst_ src_ if {$src_ == $lan_ } { return "" } else { set src_lif [$lan_ set lanIface_($src_)] return [$src_lif entry] } } Vlink instproc cost c { $self set cost_ $c} Vlink instproc cost? {} { $self instvar cost_ if ![info exists cost_] { return 1 } return $cost_ } LanRouter instproc init {ns lan} { $self next if [Simulator hier-addr?] { $self routing hier } else { $self routing flat } $self lanaddr [$lan node-addr] $self routelogic [$ns get-routelogic] } Node instproc is-lan? {} { return 0 } Simulator instproc newLan {nodelist bw delay args} { set lan [eval new LanNode $self -bw $bw -delay $delay $args] $lan addNode $nodelist $bw $delay return $lan } Simulator instproc make-lan { args } { set t [lindex $args 0] set mactrace "false" if { $t == "-trace" } { set mactrace [lindex $args 1] if {$mactrace == "on" } { set mactrace "true" } } if { $t == "-trace" } { set nodelist [lindex $args 2] set bw [lindex $args 3] set delay [lindex $args 4] set llType [lindex $args 5] set ifqType [lindex $args 6] set macType [lindex $args 7] set chanType [lindex $args 8] set phyType [lindex $args 9] } else { set nodelist [lindex $args 0] set bw [lindex $args 1] set delay [lindex $args 2] set llType [lindex $args 3] set ifqType [lindex $args 4] set macType [lindex $args 5] set chanType [lindex $args 6] set phyType [lindex $args 7] } if { $llType == "" } { set llType "LL" } if { $ifqType == "" } { set ifqtype "Queue/DropTail" } if { $macType == "" } { set macType "Mac" } if { $chanType == "" } { set chanType "Channel" } if { $phyType == ""} { set phyType "Phy/WiredPhy" } if {[string compare $macType "Mac/Csma/Cd"] == 0} { puts "Warning: Mac/Csma/Cd is out of date" puts "Warning: Please use Mac/802_3 to replace Mac/Csma/Cd" set macType "Mac/802_3" } set lan [new LanNode $self \ -bw $bw \ -delay $delay \ -llType $llType \ -ifqType $ifqType \ -macType $macType \ -chanType $chanType \ -phyType $phyType \ -mactrace $mactrace] $lan addNode $nodelist $bw $delay $llType $ifqType $macType \ $phyType $mactrace return $lan } AbsLanNode set address_ "" AbsLanNode instproc address {val} { $self set address_ $val } AbsLanNode instproc bw {val} { $self set bw_ $val } AbsLanNode instproc delay {val} { $self set delay_ $val } AbsLanNode instproc qlen {val} { $self set qlen_ $val } AbsLanNode instproc init {ns args} { set args [eval $self init-vars $args] $self instvar bw_ delay_ qlen_ $self instvar ns_ nodelist_ defRouter_ cost_ $self instvar id_ address_ q_ dlink_ mcl_ varp_ $ns instvar Node_ $self next set ns_ $ns set nodelist_ "" set cost_ 1 set id_ [Node getid] $ns_ add-abslan-node $self $id_ $self nodeid $id_ ;# Propagate id_ into c++ space set Node_($id_) $self set address_ $id_ ;# won't work for hier rtg! set defRouter_ [new LanRouter $ns $self] if [$ns multicast?] { set switch_ [new Classifier/Hash/Dest 32] $switch_ set mask_ [AddrParams set McastMask_] $switch_ set shift_ [AddrParams set McastShift_] $defRouter_ switch $switch_ } set varp_ [new VARPTable] set q_ [new Queue/DropTail] set dlink_ [new DelayLink] $dlink_ set bandwidth_ $bw_ $dlink_ set delay_ $delay_ set mcl_ [new Classifier/Replicator] $mcl_ set offset_ [PktHdr_offset PacketHeader/Mac macDA_] $mcl_ set direction_ true $q_ target $dlink_ $q_ set limit_ $qlen_ $dlink_ target $mcl_ } AbsLanNode instproc addNode {nodes} { $self instvar id_ lanIface_ $self instvar q_ ns_ nodelist_ cost_ varp_ $self instvar dlink_ mcl_ bw_ $self instvar deqT_ $ns_ instvar link_ Node_ set vlinkcost [expr $cost_ / 2.0] foreach src $nodes { set nif [new AbsLanIface $src $self] set tr [$ns_ get-ns-traceall] if {$tr != ""} { $nif trace $ns_ $tr } set tr [$ns_ get-nam-traceall] if {$tr != ""} { $nif nam-trace $ns_ $tr } $mcl_ installNext [$nif set mac_] $varp_ mac-addr [[$nif set node_] id] \ [[$nif set mac_] id] $q_ drop-target [$nif set drophead_] set lanIface_($src) $nif $src add-neighbor $self set sid [$src id] set link_($sid:$id_) [new Vlink $ns_ $self $src $self $bw_ 0] set link_($id_:$sid) [new Vlink $ns_ $self $self $src $bw_ 0] [$link_($sid:$id_) head] set link_ $link_($sid:$id_) $link_($sid:$id_) queue [$self set q_ ] $link_($id_:$sid) queue [$self set q_ ] $link_($sid:$id_) cost $vlinkcost $link_($id_:$sid) cost $vlinkcost } set nodelist_ [concat $nodelist_ $nodes] set f [$ns_ get-ns-traceall] set deqT_ [$ns_ create-trace Deque $f $src $self ] $deqT_ target $dlink_ $q_ target $deqT_ } AbsLanNode instproc assign-mac {ip} { return $ip ;# use ip addresses at MAC layer } AbsLanNode instproc cost c { $self instvar ns_ nodelist_ id_ cost_ $ns_ instvar link_ set cost_ $c set vlinkcost [expr $c / 2.0] foreach node $nodelist_ { set nid [$node id] $link_($id_:$nid) cost $vlinkcost $link_($nid:$id_) cost $vlinkcost } } AbsLanNode instproc cost? {} { $self instvar cost_ return $cost_ } AbsLanNode instproc rtObject? {} { } AbsLanNode instproc id {} { $self set id_ } AbsLanNode instproc node-addr {{addr ""}} { eval $self set address_ $addr } AbsLanNode instproc reset {} { } AbsLanNode instproc is-lan? {} { return 1 } AbsLanNode instproc dump-namconfig {} { $self instvar ns_ bw_ delay_ nodelist_ id_ $ns_ puts-nam-config \ "X -t * -n $id_ -r $bw_ -D $delay_ -o left" set cnt 0 set LanOrient(0) "up" set LanOrient(1) "down" foreach n $nodelist_ { $ns_ puts-nam-config \ "L -t * -s $id_ -d [$n id] -o $LanOrient($cnt)" set cnt [expr 1 - $cnt] } } AbsLanNode instproc init-outLink {} { } AbsLanNode instproc start-mcast {} { } AbsLanNode instproc getArbiter {} { } AbsLanNode instproc attach {agent} { } AbsLanNode instproc sp-add-route {args} { } AbsLanNode instproc add-route {args} { } AbsLanNode instproc add-hroute {args} { } AbsLanNode instproc split-addrstr addrstr { set L [split $addrstr .] return $L } Class AbsLanIface AbsLanIface instproc entry {} { $self set entry_ } AbsLanIface instproc init {node lan } { $self next $self instvar node_ lan_ $self instvar entry_ mac_ ll_ $self instvar drophead_ set node_ $node set lan_ $lan set entry_ [new Connector] set ll_ [new LL] set mac_ [new Mac] $mac_ set abstract_ true $entry_ target $ll_ $ll_ mac $mac_ $ll_ up-target [$node entry] $ll_ down-target $mac_ $ll_ set macDA_ -1 $ll_ set delay_ 0 $ll_ lanrouter [$lan set defRouter_] $ll_ varp [$lan set varp_] $mac_ up-target $ll_ $mac_ down-target [$lan set q_] $mac_ set delay_ 0 set ns [Simulator instance] set drophead_ [new Connector] $drophead_ target [$ns set nullAgent_] $mac_ drop-target $drophead_ $ll_ drop-target $drophead_ } AbsLanIface instproc trace {ns f {op ""}} { $self instvar hopT_ rcvT_ enqT_ drpT_ deqT_ $self instvar iface_ entry_ node_ lan_ drophead_ $self instvar ll_ mac_ set hopT_ [$ns create-trace Hop $f $node_ $lan_ $op] set rcvT_ [$ns create-trace Recv $f $lan_ $node_ $op] set enqT_ [$ns create-trace Enque $f $node_ $lan_ $op] set drpT_ [$ns create-trace Drop $f $node_ $lan_ $op] $hopT_ target [$entry_ target] $entry_ target $hopT_ $rcvT_ target [$ll_ up-target] $ll_ up-target $rcvT_ $enqT_ target [$mac_ down-target] $mac_ down-target $enqT_ $drpT_ target [$drophead_ target] $drophead_ target $drpT_ } AbsLanIface instproc nam-trace {ns f} { $self instvar hopT_ rcvT_ enqT_ drpT_ deqT_ if [info exists hopT_] { $hopT_ namattach $f } else { $self trace $ns $f "nam" } $rcvT_ namattach $f $enqT_ namattach $f $drpT_ namattach $f } Simulator instproc make-abslan {nodelist bw delay {qlen 50}} { set lan [new AbsLanNode $self \ -bw $bw \ -delay $delay \ -qlen $qlen] $lan addNode $nodelist return $lan } Class Timer Timer instproc init { ns } { $self set ns_ $ns } Timer instproc sched delay { $self instvar ns_ $self instvar id_ $self cancel set id_ [$ns_ after $delay "$self timeout"] } Timer instproc destroy {} { $self cancel } Timer instproc cancel {} { $self instvar ns_ $self instvar id_ if [info exists id_] { $ns_ cancel $id_ unset id_ } } Timer instproc resched delay { $self sched $delay } Timer instproc expire {} { $self timeout } Class Timer/Iface -superclass Timer Timer/Iface instproc init { protocol source group oiface sim} { $self instvar proto_ src_ grp_ oif_ $self next $sim set proto_ $protocol set src_ $source set grp_ $group set oif_ $oiface } Timer/Iface instproc schedule {} { $self sched [[$self info class] set timeout] } Class MultiSim -superclass Simulator MultiSim instproc init args { eval $self next $args $self multicast on } Simulator instproc multicast args { $self set multiSim_ 1 Node enable-module Mcast } Simulator instproc multicast? {} { $self instvar multiSim_ if { ![info exists multiSim_] } { set multiSim_ 0 } set multiSim_ } Simulator instproc run-mcast {} { $self instvar Node_ foreach n [array names Node_] { set node $Node_($n) $node start-mcast } $self next } Simulator instproc clear-mcast {} { $self instvar Node_ foreach n [array names Node_] { $Node_($n) stop-mcast } } Simulator instproc mrtproto { mproto { nodelist "" } } { $self instvar Node_ MrtHandle_ set MrtHandle_ "" if { $mproto == "CtrMcast" } { set MrtHandle_ [new CtrMcastComp $self] $MrtHandle_ set ctrrpcomp [new CtrRPComp $self] } if { $mproto == "BST" } { foreach n [array names Node_] { if ![$Node_($n) is-lan?] { $Node_($n) instvar multiclassifier_ switch_ set multiclassifier_ [new Classifier/Multicast/Replicator/BST] $multiclassifier_ set node_ $Node_($n) $switch_ install 1 $multiclassifier_ } } } if { $nodelist == "" } { foreach n [array names Node_] { $self mrtproto-iifs $mproto $Node_($n) "" } } else { foreach node $nodelist { $self mrtproto-iifs $mproto $node "" } } $self at 0.0 "$self run-mcast" return $MrtHandle_ } Simulator instproc mrtproto-iifs {mproto node iiflist } { set mh [new $mproto $self $node] set arbiter [$node getArbiter] if { $arbiter != "" } { $arbiter addproto $mh $iiflist } } Node proc allocaddr {} { set addr [Simulator set McastAddr_] Simulator set McastAddr_ [expr $addr + 1] return $addr } Node proc expandaddr {} { [Simulator instance] set-address-format expanded puts "Backward compatibility: Use \"set-address-format expanded\" instead of \"Node expandaddr\";" } Node instproc start-mcast {} { $self instvar mrtObject_ $mrtObject_ start } Node instproc getArbiter {} { $self instvar mrtObject_ if [info exists mrtObject_] { return $mrtObject_ } return "" } Node instproc notify-mcast changes { $self instvar mrtObject_ if [info exists mrtObject_] { $mrtObject_ notify $changes } } Node instproc stop-mcast {} { $self instvar mrtObject_ $self clear-caches $mrtObject_ stop } Node instproc clear-caches {} { $self instvar Agents_ multiclassifier_ replicator_ $multiclassifier_ clearAll $multiclassifier_ set nrep_ 0 foreach var {Agents_ replicator_} { $self instvar $var if { [info exists $var] } { delete $var unset $var } } } Node instproc dump-routes args { $self instvar mrtObject_ if { [info exists mrtObject_] } { eval $mrtObject_ dump-routes $args } } Node instproc check-local { group } { $self instvar Agents_ if [info exists Agents_($group)] { return [llength $Agents_($group)] } return 0 } Node instproc new-group { src group iface code } { $self instvar mrtObject_ $mrtObject_ upcall $code $src $group $iface } Node instproc join-group { agent group { src "" } } { $self instvar replicator_ Agents_ mrtObject_ set group [expr $group] ;# use expr to convert to decimal $mrtObject_ join-group $group $src lappend Agents_($group) $agent if { $src == "" } { set reps [$self getReps "*" $group] } else { set reps [$self getReps $src $group] } foreach rep $reps { $rep insert $agent } } Node instproc leave-group { agent group { src "" } } { $self instvar replicator_ Agents_ mrtObject_ set group [expr $group] ;# use expr to get rid of possible leading 0x if { $src == "" } { set reps [$self getReps "*" $group] } else { set reps [$self getReps $src $group] } foreach rep $reps { $rep disable $agent } if [info exists Agents_($group)] { set k [lsearch -exact $Agents_($group) $agent] set Agents_($group) [lreplace $Agents_($group) $k $k] $mrtObject_ leave-group $group $src } else { warn "cannot leave a group without joining it" } } Node instproc add-mfc { src group iif oiflist } { $self instvar multiclassifier_ \ replicator_ Agents_ if [info exists replicator_($src:$group)] { set r $replicator_($src:$group) } else { set r [new Classifier/Replicator/Demuxer] $r set srcID_ $src $r set grp_ $group set replicator_($src:$group) $r $r set node_ $self if [info exists Agents_($group)] { foreach a $Agents_($group) { $r insert $a } } if [info exists Agents_($src:$group)] { foreach a $Agents_($src:$group) { $r insert $a } } $multiclassifier_ add-rep $r $src $group $iif } foreach oif [lsort $oiflist] { $r insert $oif } } Node instproc del-mfc { srcID group oiflist } { $self instvar replicator_ multiclassifier_ if [info exists replicator_($srcID:$group)] { set r $replicator_($srcID:$group) foreach oif $oiflist { $r disable $oif } return 1 } return 0 } Class Classifier/Multicast/Replicator -superclass Classifier/Multicast Classifier/Multicast instproc new-group { src group iface code} { $self instvar node_ $node_ new-group $src $group $iface $code } Classifier/Multicast instproc no-slot slot { } Classifier/Multicast/Replicator instproc init args { $self next $self instvar nrep_ set nrep_ 0 } Classifier/Multicast/Replicator instproc add-rep { rep src group iif } { $self instvar nrep_ $self set-hash $src $group $nrep_ $iif $self install $nrep_ $rep incr nrep_ } Class Classifier/Replicator/Demuxer -superclass Classifier/Replicator Classifier/Replicator/Demuxer set ignore_ 0 Classifier/Replicator/Demuxer instproc init args { eval $self next $args $self instvar nslot_ nactive_ set nactive_ 0 } Classifier/Replicator/Demuxer instproc is-active {} { $self instvar nactive_ expr $nactive_ > 0 } Classifier/Replicator/Demuxer instproc insert target { $self instvar nactive_ active_ if ![info exists active_($target)] { set active_($target) -1 } if {$active_($target) < 0} { $self enable $target } } Classifier/Replicator/Demuxer instproc dump-oifs {} { set oifs "" if [$self is-active] { $self instvar active_ foreach target [array names active_] { if { $active_($target) >= 0 } { lappend oifs [$self slot $active_($target)] } } } return [lsort $oifs] } Classifier/Replicator/Demuxer instproc disable target { $self instvar nactive_ active_ if {[info exists active_($target)] && $active_($target) >= 0} { $self clear $active_($target) set active_($target) -1 incr nactive_ -1 } } Classifier/Replicator/Demuxer instproc enable target { $self instvar nactive_ active_ ignore_ if {$active_($target) < 0} { set active_($target) [$self installNext $target] incr nactive_ set ignore_ 0 } } Classifier/Replicator/Demuxer instproc exists target { $self instvar active_ info exists active_($target) } Classifier/Replicator/Demuxer instproc is-active-target target { $self instvar active_ if { [info exists active_($target)] && $active_($target) >= 0 } { return 1 } else { return 0 } } Classifier/Replicator/Demuxer instproc drop { src dst {iface -1} } { $self instvar node_ [$node_ getArbiter] drop $self $src $dst $iface } Node instproc change-iface { src dst oldiface newiface} { $self instvar multiclassifier_ $multiclassifier_ change-iface $src $dst $oldiface $newiface } Node instproc lookup-iface { src dst } { $self instvar multiclassifier_ $multiclassifier_ lookup-iface $src $dst } Classifier/Replicator/Demuxer instproc reset {} { $self instvar nactive_ active_ foreach { target slot } [array get active_] { $self clear $slot } set nactive_ 0 unset active_ } Agent/Mcast/Control instproc init { protocol } { $self next $self instvar proto_ set proto_ $protocol } Agent/Mcast/Control array set messages {} Agent/Mcast/Control set mcounter 0 Agent/Mcast/Control instproc send {type from src group args} { Agent/Mcast/Control instvar mcounter messages set messages($mcounter) [concat [list $from $src $group] $args] $self cmd send $type $mcounter incr mcounter } Agent/Mcast/Control instproc recv {type iface m} { Agent/Mcast/Control instvar messages eval $self recv2 $type $iface $messages($m) } Agent/Mcast/Control instproc recv2 {type iface from src group args} { $self instvar proto_ eval $proto_ recv-$type $from $src $group $iface $args } Node instproc rpf-nbr src { $self instvar ns_ id_ if [catch "$src id" srcID] { set srcID $src } $ns_ get-node-by-id [[$ns_ get-routelogic] lookup $id_ $srcID] } LanNode instproc rpf-nbr src { $self instvar ns_ id_ if [catch "$src id" srcID] { set srcID $src } $ns_ get-node-by-id [[$ns_ get-routelogic] lookup $id_ $srcID] } Node instproc getReps { src group } { $self instvar replicator_ set reps "" foreach key [array names replicator_ "$src:$group"] { lappend reps $replicator_($key) } return [lsort $reps] } Node instproc getReps-raw { src group } { $self array get replicator_ "$src:$group" } Node instproc clearReps { src group } { $self instvar multiclassifier_ foreach {key rep} [$self getReps-raw $src $group] { $rep reset delete $rep foreach {slot val} [$multiclassifier_ adjacents] { if { $val == $rep } { $multiclassifier_ clear $slot } } $self unset replicator_($key) } } Node instproc add-oif {head link} { $self instvar outLink_ set outLink_($head) $link } Node instproc add-iif {iflbl link} { $self set inLink_($iflbl) $link } Node instproc get-all-oifs {} { $self instvar outLink_ return [lsort [array names outLink_]] } Node instproc get-all-iifs {} { $self instvar inLink_ return [array names inLink_] } Node instproc iif2oif ifid { $self instvar ns_ set link [$self iif2link $ifid] set outlink [$ns_ link $self [$link src]] return [$self link2oif $outlink] } Node instproc iif2link ifid { $self set inLink_($ifid) } Node instproc link2iif link { return [[$link set iif_] label] } Node instproc link2oif link { $link head } Node instproc oif2link oif { $oif set link_ } Node instproc from-node-iface { node } { $self instvar ns_ catch { set node [$ns_ get-node-by-id $node] } set rpfnbr [$self rpf-nbr $node] set rpflink [$ns_ link $rpfnbr $self] if { $rpflink != "" } { return [$rpflink if-label?] } return "?" ;#unknown iface } Vlink instproc if-label? {} { $self instvar iif_ $iif_ label } Simulator instproc src_rting args { $self set srcRt_ 1 add-packet-header Src_rt Node enable-module Source } Simulator instproc src_rting? {} { $self instvar srcRt_ if { ![info exists srcRt_] } { set srcRt_ 0 } set srcRt_ } Class McastProtocol McastProtocol instproc init {sim node} { $self next $self instvar ns_ node_ status_ type_ id_ set ns_ $sim set node_ $node set status_ "down" set type_ [$self info class] set id_ [$node id] $ns_ maybeEnableTraceAll $self $node_ } McastProtocol instproc getType {} { $self set type_ } McastProtocol instproc start {} { $self set status_ "up" } McastProtocol instproc stop {} { $self set status_"down" } McastProtocol instproc getStatus {} { $self set status_ } McastProtocol instproc upcall {code args} { eval $self handle-$code $args } McastProtocol instproc handle-wrong-iif { srcID group iface } { return 0 } McastProtocol instproc handle-cache-miss { srcID group iface } { return 0 } McastProtocol instproc annotate args { $self instvar dynT_ node_ ns_ set s "[$ns_ now] [$node_ id] $args" ;#nam wants uinique first arg??? if [info exists dynT_] { foreach tr $dynT_ { $tr annotate $s } } } McastProtocol instproc join-group arg { $self annotate $proc $arg } McastProtocol instproc leave-group arg { $self annotate $proc $arg } McastProtocol instproc trace { f src {op ""} } { $self instvar ns_ dynT_ if {$op == "nam" && [info exists dynT_] > 0} { foreach tr $dynT_ { $tr namattach $f } } else { lappend dynT_ [$ns_ create-trace Generic $f $src $src $op] } } McastProtocol instproc notify { dummy } { $self instvar ns_ node_ PruneTimer_ foreach r [$node_ getReps "*" "*"] { set src_id [$r set srcID_] set sources($src_id) 1 } set sourceIDs [array names sources] foreach src_id $sourceIDs { set src [$ns_ get-node-by-id $src_id] if {$src != $node_} { set upstream [$node_ rpf-nbr $src] if { $upstream != ""} { set inlink [$ns_ link $upstream $node_] set newiif [$node_ link2iif $inlink] set reps [$node_ getReps $src_id "*"] foreach r $reps { set oldiif [$node_ lookup-iface $src_id [$r set grp_]] if { $oldiif != $newiif } { $node_ change-iface $src_id [$r set grp_] $oldiif $newiif } } } } set oiflist "" foreach nbr [$node_ neighbors] { set nbr_id [$nbr id] set nh [$nbr rpf-nbr $src] if { $nh != $node_ } { continue } set oif [$node_ link2oif [$ns_ link $node_ $nbr]] set oifs($oif) 1 } set oiflist [array names oifs] set reps [$node_ getReps $src_id "*"] foreach r $reps { set grp [$r set grp_] set oldoifs [$r dump-oifs] set newoifs $oiflist foreach old $oldoifs { if [catch "$node_ oif2link $old" ] { continue } set idx [lsearch $newoifs $old] if { $idx < 0} { $r disable $old if [info exists PruneTimer_($src_id:$grp:$old)] { delete $PruneTimer_($src_id:$grp:$old) unset PruneTimer_($src_id:$grp:$old) } } else { set newoifs [lreplace $newoifs $idx $idx] } } foreach new $newoifs { foreach r $reps { $r insert $new } } } } } McastProtocol instproc dump-routes {chan {grp ""} {src ""}} { $self instvar ns_ node_ if { $grp == "" } { array set reps [$node_ getReps-raw * *] } elseif { $src == "" } { array set reps [$node_ getReps-raw * $grp] ;# actually, more than *,g } else { array set reps [$node_ getReps-raw $src $grp] } puts $chan [concat "Node:\t${node_}([$node_ id])\tat t =" \ [format "%4.2f" [$ns_ now]]] puts $chan "\trepTag\tActive\t\tsrc\tgroup\tiifNode\t\tdest_nodes" foreach ent [lsort [array names reps]] { set sg [split $ent ":"] if { [$reps($ent) is-active] } { set active Y } else { set active N } set dest "" foreach oif [$reps($ent) dump-oifs] { if ![catch { set nbr [[$node_ oif2link $oif] dst] } ] { set nbrid [$nbr id] if [$nbr is-lan?] { set nbrid ${nbrid}(L) } lappend dest $nbrid } } set s [lindex $sg 0] set g [lindex $sg 1] set iif [$node_ lookup-iface $s $g] set iif_node_id $iif catch { set iif_node [[$node_ iif2link $iif] src] if [$iif_node is-lan?] { set iif_node_id [$iif_node id](L) } else { set iif_node_id [$iif_node id] } } puts $chan [format "\t%5s\t %s\t\t%d\t0x%x\t%s\t\t%s" \ $reps($ent) $active $s $g $iif_node_id $dest] } } Class mrtObject mrtObject set mask-wkgroups 0xfff0 mrtObject set wkgroups(Allocd) [mrtObject set mask-wkgroups] mrtObject proc registerWellKnownGroups name { set newGroup [mrtObject set wkgroups(Allocd)] mrtObject set wkgroups(Allocd) [expr $newGroup + 1] mrtObject set wkgroups($name) $newGroup } mrtObject proc getWellKnownGroup name { assert "\"$name\" != \"Allocd\"" mrtObject set wkgroups($name) } mrtObject registerWellKnownGroups ALL_ROUTERS mrtObject registerWellKnownGroups ALL_PIM_ROUTERS mrtObject proc expandaddr {} { mrtObject set mask-wkgroups 0x7fffffff foreach {name group} [mrtObject array get wkgroups] { mrtObject set wkgroups($name) [expr $group | 0x7fffffff] } } mrtObject instproc init { node } { $self next $self set node_ $node } mrtObject instproc addproto { proto { iiflist "" } } { $self instvar node_ protocols_ if { $iiflist == "" } { set iiflist [$node_ get-all-iifs] lappend iiflist -1 ;#for local packets } foreach iif $iiflist { set protocols_($iif) $proto } } mrtObject instproc getType { protocolType } { $self instvar protocols_ foreach iif [array names protocols_] { if { [$protocols_($iif) getType] == $protocolType } { return $protocols_($iif) } } return "" } mrtObject instproc all-mprotos {op args} { $self instvar protocols_ foreach iif [array names protocols_] { set p $protocols_($iif) if ![info exists protos($p)] { set protos($p) 1 eval $p $op $args } } } mrtObject instproc start {} { $self all-mprotos start } mrtObject instproc stop {} { $self all-mprotos stop } mrtObject instproc notify dummy { $self all-mprotos notify $dummy } mrtObject instproc dump-routes args { $self all-mprotos dump-routes $args } mrtObject instproc join-group { grp src } { eval $self all-mprotos join-group $grp $src } mrtObject instproc leave-group { grp src } { eval $self all-mprotos leave-group $grp $src } mrtObject instproc upcall { code source group iface } { set wkgroup [expr [$class set mask-wkgroups]] if { [expr ( $group & $wkgroup ) == $wkgroup] } { $self instvar node_ $node_ add-mfc $source $group -1 {} return 1 } else { $self instvar protocols_ $protocols_($iface) upcall $code $source $group $iface } } mrtObject instproc drop { replicator src dst {iface -1} } { $self instvar protocols_ $protocols_($iface) drop $replicator $src $dst $iface } Class DM -superclass McastProtocol DM set PruneTimeout 0.5 DM set CacheMissMode pimdm ;#or dvmrp (lowercase) DM instproc init { sim node } { $self instvar mctrl_ set mctrl_ [new Agent/Mcast/Control $self] $node attach $mctrl_ Timer/Iface/Prune set timeout [[$self info class] set PruneTimeout] $self next $sim $node } DM instproc join-group { group } { $self instvar node_ $self next $group set listOfReps [$node_ getReps * $group] foreach r $listOfReps { if ![$r is-active] { $self send-ctrl "graft" [$r set srcID_] $group set nbr [$node_ rpf-nbr [$r set srcID_]] set nbrs($nbr) 1 } } foreach nbr [array names nbrs] { if [$nbr is-lan?] { $nbr instvar receivers_ if [info exists receivers_($group)] { incr receivers_($group) } else { set receivers_($group) 1 } } } } DM instproc leave-group { group } { $self next $group $self instvar node_ set listOfReps [$node_ getReps * $group] foreach r $listOfReps { set nbr [$node_ rpf-nbr [$r set srcID_]] set nbrs($nbr) 1 } foreach nbr [array names nbrs] { if [$nbr is-lan?] { $nbr instvar receivers_ if { [info exists receivers_($group)] && \ $receivers_($group) > 0 } { incr receivers_($group) -1 } } } } DM instproc handle-wrong-iif { srcID group iface } { $self instvar node_ ns_ set inlink [$node_ iif2link $iface] set from [$inlink src] $self send-ctrl "prune" $srcID $group [$from id] return 0 ;# don't call this method two times } DM instproc handle-cache-miss { srcID group iface } { DM instvar CacheMissMode $self handle-cache-miss-$CacheMissMode $srcID $group $iface return 1 ;#call again } DM instproc handle-cache-miss-pimdm { srcID group iface } { $self instvar node_ ns_ if { $iface >= 0 } { set rpf_nbr [$node_ rpf-nbr $srcID] set inlink [$node_ iif2link $iface] set rpflink [$ns_ link $rpf_nbr $node_] if { $inlink != $rpflink } { set from [$inlink src] $self send-ctrl "prune" $srcID $group [$from id] return 0; #drop this packet } set rpfoif [$node_ iif2oif $iface] } else { set rpfoif "" } set alloifs [$node_ get-all-oifs] set oiflist "" foreach oif $alloifs { if {$oif == $rpfoif} { continue ;#exclude incoming iface } set dst [[$node_ oif2link $oif] dst] if { [$dst is-lan?] && [$dst rpf-nbr $srcID] != $node_ } { continue } lappend oiflist $oif } $node_ add-mfc $srcID $group $iface $oiflist } DM instproc handle-cache-miss-dvmrp { srcID group iface } { $self instvar node_ ns_ set oiflist "" foreach nbr [$node_ neighbors] { set rpfnbr [$nbr rpf-nbr $srcID] if { $rpfnbr == $node_ } { set link [$ns_ link $node_ $nbr] lappend oiflist [$node_ link2oif $link] } } $node_ add-mfc $srcID $group $iface $oiflist } DM instproc drop { replicator src dst iface} { $self instvar node_ ns_ if { $iface < 0 } { $replicator set ignore_ 1 } else { set from [[$node_ iif2link $iface] src] if [$from is-lan?] { $self send-ctrl "prune" $src $dst } else { $self send-ctrl "prune" $src $dst [$from id] } } } DM instproc recv-prune { from src group iface} { $self instvar node_ PruneTimer_ ns_ set r [$node_ getReps $src $group] if { $r == "" } { return 0 } set id [$node_ id] set tmpoif [$node_ iif2oif $iface] if { [$r is-active-target $tmpoif] } { $r disable $tmpoif if ![$r is-active] { if { $src != $id } { $self send-ctrl prune $src $group } } } if ![info exists PruneTimer_($src:$group:$tmpoif)] { set PruneTimer_($src:$group:$tmpoif) \ [new Timer/Iface/Prune $self $src $group $tmpoif $ns_] } $PruneTimer_($src:$group:$tmpoif) schedule } DM instproc recv-graft { from src group iface} { $self instvar node_ PruneTimer_ ns_ set id [$node_ id] set r [$node_ getReps $src $group] if { $r == "" } { if { $id == $src } { set iif "?" } else { set rpfnbr [$node_ rpf_nbr $src] set rpflnk [$ns_ link $src $id] set iif [$node_ link2iif $rpflnk] } $node_ add-mfc $src $group $iif "" set r [$node_ getReps $src $group] } if { ![$r is-active] && $src != $id } { $self send-ctrl graft $src $group } set tmpoif [$node_ iif2oif $iface] $r enable $tmpoif if [info exists PruneTimer_($src:$group:$tmpoif)] { delete $PruneTimer_($src:$group:$tmpoif) unset PruneTimer_($src:$group:$tmpoif) } } DM instproc send-ctrl { which src group { to "" } } { $self instvar mctrl_ ns_ node_ if { $to != "" } { set n [$ns_ get-node-by-id $to] if [$n is-lan?] return set toid $to } else { set toid $src } set nbr [$node_ rpf-nbr $toid] if [$nbr is-lan?] { $nbr instvar receivers_ if { [info exists receivers_($group)] && \ $receivers_($group) > 0 } return set nbr [$nbr rpf-nbr $toid] } $ns_ simplex-connect $mctrl_ \ [[[$nbr getArbiter] getType [$self info class]] set mctrl_] if { $which == "prune" } { $mctrl_ set class_ 30 } else { $mctrl_ set class_ 31 } $mctrl_ send $which [$node_ id] $src $group } DM instproc timeoutPrune { oif src grp } { $self instvar node_ PruneTimer_ ns_ set r [$node_ getReps $src $grp] $r insert $oif if [info exists PruneTimer_($src:$grp:$oif)] { delete $PruneTimer_($src:$grp:$oif) unset PruneTimer_($src:$grp:$oif) } return } Class Timer/Iface/Prune -superclass Timer/Iface Timer/Iface/Prune set timeout 0.5 Timer/Iface/Prune instproc timeout {} { $self instvar proto_ src_ grp_ oif_ $proto_ timeoutPrune $oif_ $src_ $grp_ } Class CtrMcast -superclass McastProtocol CtrMcast instproc init { sim node } { $self next $sim $node $self instvar ns_ node_ $self instvar agent_ defaultTree_ decapagent_ $self instvar c_rp_ c_bsr_ priority_ set agent_ [$ns_ set MrtHandle_] set defaultTree_ "RPT" set decapagent_ [new Agent/Decapsulator] $ns_ attach-agent $node_ $decapagent_ set c_rp_ 1 set c_bsr_ 1 set priority_ 0 } CtrMcast instproc join-group { group } { $self next $group $self instvar node_ ns_ agent_ $self instvar defaultTree_ if { [$agent_ treetype? $group] == "" } { $agent_ treetype $group $defaultTree_ $agent_ add-new-group $group } $agent_ add-new-member $group $node_ foreach src [$agent_ sources? $group] { $agent_ compute-branch $src $group $node_ } } CtrMcast instproc leave-group { group } { $self next $group $self instvar node_ ns_ agent_ defaultTree_ $agent_ remove-member $group $node_ foreach src [$agent_ sources? $group] { $agent_ prune-branch $src $group $node_ } } CtrMcast instproc handle-cache-miss { srcID group iface } { $self instvar ns_ agent_ node_ $self instvar defaultTree_ if { [$agent_ treetype? $group] == "" } { $agent_ treetype $group $defaultTree_ } if { [$node_ id] == $srcID } { set RP [$self get_rp $group] if {[$agent_ treetype? $group] == "RPT" && $srcID != [$RP id]} { set encapagent [new Agent/Encapsulator] $ns_ attach-agent $node_ $encapagent set ctrmcast [[$RP getArbiter] getType "CtrMcast"] $ns_ connect $encapagent [$ctrmcast set decapagent_] $node_ add-mfc-reg $srcID $group -1 $encapagent } if [$agent_ new-source? $group $node_] { $agent_ compute-tree $node_ $group } } elseif [SessionSim set MixMode_] { set srcnode [$ns_ get-node-by-id $srcID] if [$agent_ new-source? $group $srcnode] { $agent_ compute-tree $srcnode $group } } return 1 ;#call again } CtrMcast instproc drop { replicator src group iface } { } CtrMcast instproc handle-wrong-iif { srcID group iface } { warn "$self: $proc for ?" return 0 ;#call once } CtrMcast instproc notify { dummy } { } CtrMcast instproc get_rp group { $self instvar rpset_ agent_ if ![info exists rpset_] { [$agent_ set ctrrpcomp] compute-rpset assert [info exists rpset_] } set returnrp -1 set hashval -1 foreach rp $rpset_ { if {[$self hash $rp $group] > $hashval} { set hashval [$self hash $rp $group] set returnrp $rp } } set returnrp ;# return } CtrMcast instproc hash {rp group} { $rp id } CtrMcast instproc set-rpset args { eval $self set rpset_ "$args" } CtrMcast instproc get_bsr {} { warn "$self: CtrMcast doesn't require a BSR" } CtrMcast instproc set_c_bsr { prior } { $self instvar c_bsr_ priority_ set c_bsr_ 1 set priority_ $prior } CtrMcast instproc set_c_rp {} { $self instvar c_rp_ set c_rp_ 1 } CtrMcast instproc unset_c_rp {} { $self instvar c_rp_ set c_rp_ 0 } Node instproc add-mfc-reg { src group iif oiflist } { $self instvar multiclassifier_ Regreplicator_ if [info exists Regreplicator_($group)] { foreach oif $oiflist { $Regreplicator_($group) insert $oif } return 1 } set r [new Classifier/Replicator/Demuxer] $r set node_ $self $r set srcID_ $src set Regreplicator_($group) $r foreach oif $oiflist { $r insert $oif } $multiclassifier_ add-rep $r $src $group $iif } Node instproc getRegreplicator group { $self instvar Regreplicator_ if [info exists Regreplicator_($group)] { return $Regreplicator_($group) } else { return -1 } } Class CtrMcastComp CtrMcastComp instproc init sim { $self instvar ns_ set ns_ $sim $self init-groups $ns_ maybeEnableTraceAll $self {} } CtrMcastComp instproc id {} { return 0 } CtrMcastComp instproc trace { f nop {op ""} } { $self instvar ns_ dynT_ if {$op == "nam" && [info exists dynT_]} { foreach tr $dynT_ { $tr namattach $f } } else { lappend dynT_ [$ns_ create-trace Generic $f $self $self $op] } } CtrMcastComp instproc reset-mroutes {} { $self instvar ns_ foreach node [$ns_ all-nodes-list] { foreach group [$self groups?] { set class_info [$node info class] if {$class_info != "LanNode"} { $node clearReps * $group } } } } CtrMcastComp instproc compute-mroutes {} { $self reset-mroutes foreach group [$self groups?] { foreach src [$self sources? $group] { $self compute-tree $src $group } } } CtrMcastComp instproc compute-tree { src group } { foreach mem [$self members? $group] { $self compute-branch $src $group $mem } } CtrMcastComp instproc compute-branch { src group nodeh } { $self instvar ns_ set tt [$self treetype? $group] if { $tt == "SPT" } { set target $src } elseif { $tt == "RPT" } { set target [$self get_rp $nodeh $group] } for { set downstreamtmp "" set tmp $nodeh } { $downstreamtmp != $target } { set downstreamtmp $tmp set tmp [$tmp rpf-nbr $target] } { if {[SessionSim set MixMode_] && $downstreamtmp != "" && ![$ns_ detailed-link? [$tmp id] [$downstreamtmp id]]} { break } if {$tmp == $target} { set iif -1 } else { set rpfl [$ns_ link [$tmp rpf-nbr $target] $tmp] if {[SessionSim set MixMode_] && $rpfl == ""} { set iif -1 set ttmp $tmp while {$ttmp != $target} { set rpfl [$ns_ link [$ttmp rpf-nbr $target] $ttmp] if {$rpfl != ""} { set iif [$rpfl if-label?] break } set ttmp [$ttmp rpf-nbr $target] } } else { set iif [$rpfl if-label?] } } set oiflist "" if { $downstreamtmp != "" } { set rpfnbr [$downstreamtmp rpf-nbr $target] if { $rpfnbr == $tmp } { set rpflink [$ns_ link $tmp $downstreamtmp] if {$rpflink != ""} { set oiflist [$tmp link2oif $rpflink] } } } if { [set r [$tmp getReps [$src id] $group]] != "" } { if [$r is-active] { if { $oiflist != "" } { $r insert [lindex $oiflist 0] } break } else { if { $oiflist != "" } { $r insert [lindex $oiflist 0] } } } else { $tmp add-mfc [$src id] $group $iif $oiflist } } } CtrMcastComp instproc prune-branch { src group nodeh } { $self instvar ns_ set tt [$self treetype? $group] if { $tt == "SPT" } { set target $src } elseif { $tt == "RPT" } { set target [$self get_rp $nodeh $group] } for { set downstreamtmp "" set tmp $nodeh } { $downstreamtmp != $target } { set downstreamtmp $tmp set tmp [$tmp rpf-nbr $target] } { set iif -1 set oif "" if { $downstreamtmp != "" } { set rpfnbr [$downstreamtmp rpf-nbr $target] if { $rpfnbr == $tmp } { set oif [$tmp link2oif [$ns_ link $tmp $downstreamtmp]] } } if { [set r [$tmp getReps [$src id] $group]] != "" } { if { $oif != "" } { $r disable $oif } if [$r is-active] { break } } else { break } } } CtrMcastComp instproc notify {} { $self instvar ctrrpcomp $ctrrpcomp compute-rpset $self compute-mroutes } CtrMcastComp instproc init-groups {} { $self set Glist_ "" } CtrMcastComp instproc add-new-group group { $self instvar Glist_ set group [expr $group] if ![info exist Glist_] { set Glist_ "" } if {[lsearch $Glist_ $group] < 0} { lappend Glist_ $group } } CtrMcastComp instproc add-new-member {group node} { $self instvar Mlist_ set group [expr $group] $self add-new-group $group if ![info exist Mlist_($group)] { set Mlist_($group) "" } if {[lsearch $Mlist_($group) $node] < 0} { lappend Mlist_($group) $node } } CtrMcastComp instproc new-source? {group node} { $self instvar Slist_ set group [expr $group] $self add-new-group $group if ![info exist Slist_($group)] { set Slist_($group) "" } if {[lsearch $Slist_($group) $node] < 0} { lappend Slist_($group) $node return 1 } else { return 0 } } CtrMcastComp instproc groups? {} { $self set Glist_ } CtrMcastComp instproc members? group { $self instvar Mlist_ set group [expr $group] if ![info exists Mlist_($group)] { set Mlist_($group) "" } set Mlist_($group) } CtrMcastComp instproc sources? group { $self instvar Slist_ set group [expr $group] if ![info exists Slist_($group)] { set Slist_($group) "" } set Slist_($group) } CtrMcastComp instproc remove-member {group node} { $self instvar Mlist_ Glist_ set group [expr $group] set k [lsearch $Mlist_($group) $node] if {$k < 0} { puts "warning: removing non-member" } else { set Mlist_($group) [lreplace $Mlist_($group) $k $k] } if { $Mlist_($group) == "" } { set k [lsearch $Glist_ $group] if {$k < 0} { puts "warning: removing non-existing group" } else { set Glist_ [lreplace $Glist_ $k $k] } } } CtrMcastComp instproc treetype? group { $self instvar treetype_ set group [expr $group] if [info exists treetype_($group)] { return $treetype_($group) } else { return "" } } CtrMcastComp instproc treetype {group tree} { $self set treetype_([expr $group]) $tree } CtrMcastComp instproc switch-treetype group { $self instvar treetype_ dynT_ set group [expr $group] if [info exists dynT_] { foreach tr $dynT_ { $tr annotate "$group switch tree type" } } set treetype_($group) "SPT" $self add-new-group $group $self compute-mroutes } CtrMcastComp instproc set_c_rp args { $self instvar ns_ foreach n [$ns_ all-nodes-list] { set arbiter [$n getArbiter] if {$arbiter != ""} { set ctrmcast [$arbiter getType "CtrMcast"] $ctrmcast instvar c_rp_ $ctrmcast unset_c_rp } } foreach node $args { set arbiter [$node getArbiter] set ctrmcast [$arbiter getType "CtrMcast"] $ctrmcast set_c_rp } } CtrMcastComp instproc set_c_bsr args { foreach node $args { set tmp [split $node :] set node [lindex $tmp 0] set prior [lindex $tmp 1] set arbiter [$node getArbiter] set ctrmcast [$arbiter getType "CtrMcast"] $ctrmcast set_c_bsr $prior } } CtrMcastComp instproc get_rp { node group } { set ctrmcast [[$node getArbiter] getType "CtrMcast"] $ctrmcast get_rp $group } CtrMcastComp instproc get_bsr { node } { set arbiter [$node getArbiter] set ctrmcast [$arbiter getType "CtrMcast"] $ctrmcast get_bsr } Class CtrRPComp CtrRPComp instproc init sim { $self set ns_ $sim $self next } CtrRPComp instproc compute-rpset {} { $self instvar ns_ foreach node [$ns_ all-nodes-list] { set connected($node) 0 } set urtl [$ns_ get-routelogic] foreach node [$ns_ all-nodes-list] { foreach {vertix lvertix} [array get ldomain] { if {[$urtl lookup [$node id] [$vertix id]] >= 0} { lappend ldomain($vertix) $node set connected($node) 1 break } } if {!$connected($node)} { set ldomain($node) $node set connected($node) 1 } } foreach {vnode lvertix} [array get ldomain] { set hasbsr 0 set rpset "" foreach vertix $lvertix { set class_info [$vertix info class] if {$class_info != "LanNode"} { set ctrdm [[$vertix getArbiter] getType "CtrMcast"] if [$ctrdm set c_bsr_] {set hasbsr 1} if [$ctrdm set c_rp_] { lappend rpset $vertix } } } foreach vertix $lvertix { set class_info [$vertix info class] if {$class_info != "LanNode"} { set ctrdm [[$vertix getArbiter] getType "CtrMcast"] if $hasbsr { $ctrdm set-rpset $rpset } else { $ctrdm set-rpset "" puts "no c_bsr" } } } } } Class BST -superclass McastProtocol BST instproc init { sim node } { $self instvar mctrl_ oiflist_ BST instvar RP_ set mctrl_ [new Agent/Mcast/Control $self] $node attach $mctrl_ $self next $sim $node } BST instproc start {} { $self instvar node_ oiflist_ BST instvar RP_ foreach grpx [array names RP_] { set grp [expr $grpx] if { [string compare $grp $grpx] } { set RP_($grp) $RP_(grpx) unset RP_($grpx) } set rpfiif [$node_ from-node-iface $RP_($grp)] if { $rpfiif != "?" } { set rpfoif [$node_ iif2oif $rpfiif] } else { set rpfoif "" } set oiflist_($grp) $rpfoif set neighbors [$node_ set neighbor_] if [info exists neighbors] { for {set i 0} {$i < [llength $neighbors]} {incr i} { set neighbor [lindex $neighbors $i] set class_info [$neighbor info class] if {$class_info == "LanNode"} { $neighbor designate-ump-router $grp \ $RP_($grp) } } } } } BST instproc join-group { group {src "x"} } { $self instvar node_ ns_ oiflist_ BST instvar RP_ set nbr [$node_ rpf-nbr $RP_($group)] set nbrs($nbr) 1 $node_ add-mark m1 blue "[$node_ get-shape]" foreach nbr [array names nbrs] { if [$nbr is-lan?] { $nbr instvar receivers_ if [info exists receivers_($group)] { incr receivers_($group) } else { $self send-ctrl "graft" $RP_($group) $group set receivers_($group) 1 } } $self next $group ; #annotate } if { ![$node_ check-local $group] || [$node_ getReps "x" \ $group] == ""} { $self send-ctrl "graft" $RP_($group) $group } } BST instproc leave-group { group {src "x"} } { BST instvar RP_ $self next $group ;#annotate $self instvar node_ oiflist_ set nbr [$node_ rpf-nbr $RP_($group)] if [$nbr is-lan?] { $nbr instvar receivers_ if [info exists receivers_($group)] { if {$receivers_($group) > 0} { incr receivers_($group) -1 if {$receivers_($group) == 0} { $node_ delete-mark m1 $self send-ctrl "prune" $RP_($group) $group } } } else { return } } else { set rpfiif [$node_ from-node-iface $RP_($group)] if { $rpfiif != "?" } { set rpfoif [$node_ iif2oif $rpfiif] } else { set rpfoif "" } if { $oiflist_($group) == \ $rpfoif && ![$node_ check-local $group] } { $self send-ctrl "prune" $RP_($group) $group $node_ delete-mark m1 } } } BST instproc handle-wrong-iif { srcID group iface } { $self instvar node_ oiflist_ BST instvar RP_ set rep [$node_ getReps "x" $group] $node_ add-mfc "x" $group $iface $oiflist_($group) set iif [$node_ lookup-iface "x" $group] if { $iface >= 0 } { set oif [$node_ iif2oif $iface] set rpfiif [$node_ from-node-iface $RP_($group)] if { $iface == $rpfiif } { $rep disable [$node_ iif2oif $rpfiif] } else { $rep disable $oif if { $node_ != $RP_($group) } { $rep insert [$node_ iif2oif $rpfiif] } } } $node_ change-iface "x" $group $iif $iface return 1 ;#classify packet again } BST instproc handle-cache-miss { srcID group iface } { $self instvar node_ ns_ oiflist_ BST instvar RP_ if { [$node_ getReps "x" $group] != "" } { error } if {$iface != -1} { set neighbors [$node_ set neighbor_] if [info exists neighbors] { for {set i 0} {$i < [llength $neighbors]} {incr i} { set neighbor [lindex $neighbors $i] set nbr [$node_ rpf-nbr $RP_($group)] if {[$neighbor is-lan?] && \ [$nbr info class] != "LanNode"} { $neighbor instvar up_ set up [$neighbor set up_($group)] if {$node_ != $up} { if [$self link2lan? $neighbor \ $iface] { return 0 } } } } } } $node_ add-mfc "x" $group $iface $oiflist_($group) if { $iface > 0 } { set rep [$node_ getReps "x" $group] $rep disable [$node_ iif2oif $iface] } return 1 ;# classify the packet again. } BST instproc drop { replicator src dst iface} { $self instvar node_ ns_ BST instvar RP_ if {$iface >= 0} { } } BST instproc recv-prune { from src group iface} { $self instvar node_ ns_ oiflist_ BST instvar RP_ set rep [$node_ getReps "x" $group] if {$rep != ""} { set oif [$node_ iif2oif $iface] set idx [lsearch $oiflist_($group) $oif] if { $idx >= 0 } { set oiflist_($group) [lreplace $oiflist_($group) $idx $idx] $rep disable $oif set rpfiif [$node_ from-node-iface $RP_($group)] if { $rpfiif != "?" } { set rpfoif [$node_ iif2oif $rpfiif] } else { set rpfoif "" } if { $oiflist_($group) == $rpfoif && ![$node_ check-local $group] } { $node_ delete-mark m2 $self send-ctrl "prune" $RP_($group) $group } } } } BST instproc recv-graft { from to group iface } { $self instvar node_ ns_ oiflist_ BST instvar RP_ set oif [$node_ iif2oif $iface] set rpfiif [$node_ from-node-iface $RP_($group)] if { $rpfiif != "?" } { set rpfoif [$node_ iif2oif $rpfiif] } else { set rpfoif "" } if { $oiflist_($group) == $rpfoif && ![$node_ check-local $group] } { $node_ add-mark m2 red circle $self send-ctrl "graft" $RP_($group) $group } if { [lsearch $oiflist_($group) $oif] < 0 } { lappend oiflist_($group) $oif if { [$node_ lookup-iface "x" $group] != $iface } { set rep [$node_ getReps "x" $group] if { $rep != "" } { $rep insert $oif } } } } BST instproc send-ctrl { which dst group } { $self instvar mctrl_ ns_ node_ if {$node_ != $dst} { set nbr [$node_ rpf-nbr $dst] if [$nbr is-lan?] { $nbr instvar receivers_ if { [info exists receivers_($group)] && \ $receivers_($group) > 0 } return set nbr [$nbr rpf-nbr $dst] } $ns_ simplex-connect $mctrl_ \ [[[$nbr getArbiter] getType [$self info class]] set mctrl_] if { $which == "prune" } { $mctrl_ set fid_ 2 } else { $mctrl_ set fid_ 3 } $mctrl_ send $which [$node_ id] $dst $group } } BST instproc dbg arg { $self instvar ns_ node_ puts [format "At %.4f : node [$node_ id] $arg" [$ns_ now]] } LanNode instproc designate-ump-router {group dst} { $self instvar nodelist_ $self instvar up_ set nbr [$self rpf-nbr $dst] set up_($group) $nbr return } BST instproc next-hop-router {node group} { BST instvar RP_ set nbr [$node rpf-nbr $RP_($group)] if [$nbr is-lan?] { set nbr [$nbr rpf-nbr $RP_($group)] } return $nbr } BST instproc is-group-bidir? {group} { BST instvar RP_ foreach grp [array names RP_] { if {$grp == $group} { return 1 } } return 0 } BST instproc match-oif {group link} { $self instvar oiflist_ set oiflist $oiflist_($group) if {$oiflist != ""} { foreach oif $oiflist { set oiflink [$oif set link_] if {$oiflink == $link} { return $oiflink } } } return } BST instproc find-oif {dst group} { $self instvar node_ ns_ if {$node_ != $dst} { set ns [$self set ns_] $ns instvar link_ set link [$ns set link_([$node_ id]:[$dst id])] return [$self match-oif $group $link] } else { return "" } } BST instproc link2lan? {neighbor iface} { $self instvar node_ ns_ set link1 [[[$node_ iif2oif $iface] set link_] set iif_] set link2 [[$ns_ link $node_ $neighbor] set iif_] if {$link1 == $link2} { return 1 } else { return 0 } } Class Classifier/Multicast/Replicator/BST -superclass Classifier/Multicast/BST Classifier/Multicast/BST instproc new-group { src group iface code} { $self instvar node_ $node_ new-group $src $group $iface $code } Classifier/Multicast/BST instproc no-slot slot { } Classifier/Multicast/Replicator/BST instproc init args { $self next $self instvar nrep_ set nrep_ 0 } Classifier/Multicast/Replicator/BST instproc add-rep { rep src group iif } { $self instvar nrep_ $self set-hash $src $group $nrep_ $iif $self install $nrep_ $rep incr nrep_ } Classifier/Multicast/Replicator/BST instproc match-BST-iif {iface group} { $self instvar node_ list retval_ set agents [$node_ set agents_] for {set i 0} {$i < [llength $agents]} {incr i} { set agent [lindex $agents $i] $agent instvar proto_ if [info exists proto_] { set protocol [$agent set proto_] if {[$protocol info class] == "BST"} { BST instvar RP_ $protocol instvar oiflist_ set bidir [$protocol is-group-bidir? $group] if {$bidir == 1} { if {$node_ == $RP_($group)} { return 1 } set iif [$node_ from-node-iface \ $RP_($group)] if {$iif == $iface} { return 1 } else { return 0 } } } } } return -1 } Classifier/Multicast/Replicator/BST instproc upstream-link {group} { $self instvar node_ list retval_ set agents [$node_ set agents_] for {set i 0} {$i < [llength $agents]} {incr i} { set agent [lindex $agents $i] $agent instvar proto_ if [info exists proto_] { set protocol [$agent set proto_] if {[$protocol info class] == "BST"} { BST instvar RP_ $protocol instvar oiflist_ set bidir [$protocol is-group-bidir? $group] if {$bidir == 1} { set nbr [$node_ rpf-nbr $RP_($group)] set oif [$protocol find-oif $nbr \ $group] if {$oif == ""} { set oif "self" } lappend retval_ $oif if [$nbr is-lan?] { set nbr [$nbr rpf-nbr $RP_($group)] } lappend retval_ [$nbr id] return $retval_ } } } } return {} } Classifier/Multicast/Replicator/BST instproc check-rpf-link {node group} { $self instvar node_ set agents [$node_ set agents_] for {set i 0} {$i < [llength $agents]} {incr i} { set agent [lindex $agents $i] $agent instvar proto_ if [info exists proto_] { set protocol [$agent set proto_] set classInfo [$protocol info class] if {$classInfo == "BST"} { BST instvar RP_ set rpfiif [$node_ from-node-iface \ $RP_($group)] return $rpfiif } } } return -1 } Agent instproc traffic-source agent { $self instvar tg_ set tg_ $agent $tg_ target $self $tg_ set agent_addr_ [$self set agent_addr_] $tg_ set agent_port_ [$self set agent_port_] } Agent/SRM set packetSize_ 1024 ;# assume default message size for repair is 1K Agent/SRM set groupSize_ 0 Agent/SRM set app_fid_ 0 Agent/SRM set distanceCompute_ ewma Agent/SRM set C1_ 2.0 Agent/SRM set C2_ 2.0 Agent/SRM set requestFunction_ "SRM/request" Agent/SRM set requestBackoffLimit_ 5 Agent/SRM set D1_ 1.0 Agent/SRM set D2_ 1.0 Agent/SRM set repairFunction_ "SRM/repair" Agent/SRM set sessionDelay_ 1.0 Agent/SRM set sessionFunction_ "SRM/session" Class Agent/SRM/Deterministic -superclass Agent/SRM Agent/SRM/Deterministic set C2_ 0.0 Agent/SRM/Deterministic set D2_ 0.0 Class Agent/SRM/Probabilistic -superclass Agent/SRM Agent/SRM/Probabilistic set C1_ 0.0 Agent/SRM/Probabilistic set D1_ 0.0 Class Agent/SRM/Fixed -superclass Agent/SRM Class SRM Class SRM/request -superclass SRM Class SRM/repair -superclass SRM Class SRM/session -superclass SRM Agent/SRM/Adaptive set pdistance_ 0.0 ;# bound instance variables Agent/SRM/Adaptive set requestor_ 0 Agent/SRM/Adaptive set C1_ 2.0 Agent/SRM/Adaptive set MinC1_ 0.5 Agent/SRM/Adaptive set MaxC1_ 2.0 Agent/SRM/Adaptive set C2_ 2.0 Agent/SRM/Adaptive set MinC2_ 1.0 Agent/SRM/Adaptive set MaxC2_ 1.0 ;# G Agent/SRM/Adaptive set D1_ -1 ;# log10 G Agent/SRM/Adaptive set MinD1_ 0.5 Agent/SRM/Adaptive set MaxD1_ 0.0 ;# log10 G Agent/SRM/Adaptive set D2_ -1 ;# log10 G XXX Agent/SRM/Adaptive set MinD2_ 1.0 Agent/SRM/Adaptive set MaxD2_ 1.0 ;# G Agent/SRM/Adaptive set requestFunction_ "SRM/request/Adaptive" Agent/SRM/Adaptive set repairFunction_ "SRM/repair/Adaptive" Agent/SRM/Adaptive set AveDups_ 1.0 Agent/SRM/Adaptive set AveDelay_ 1.0 Agent/SRM/Adaptive set eps_ 0.10 Agent/SRM/Adaptive instproc init args { eval $self next $args $self array set closest_ "requestor 0 repairor 0" $self set AveDups_ [$class set AveDups_] $self set AveDelay_ [$class set AveDelay_] foreach i [list MinC1_ MaxC1_ MinC2_ MaxC2_ \ MinD1_ MaxD1_ MinD2_ MaxD2_] { $self instvar $i set $i [$class set $i] } $self set eps_ [$class set eps_] } Agent/SRM/Adaptive instproc check-bounds args { set G [$self set groupSize_] $self set MaxC2_ $G $self set MaxD1_ [expr log10($G)] $self set MaxD2_ $G if {[llength $args] <= 0} { set args "C1_ C2_ D1_ D2_" } foreach i $args { $self instvar $i set val [$self set $i] ;# We do this for notational convenience set min [$self set Min$i] set max [$self set Max$i] if { $val < $min } { set $i $min } elseif { $val > $max } { set $i $max } } } Agent/SRM/Adaptive instproc recompute-request-params {} { $self instvar closest_ C1_ C2_ stats_ AveDups_ AveDelay_ eps_ if {$stats_(ave-req-delay) < 0} { $self check-bounds C1_ C2_ ;# adjust bounds to estimated size of G return } $self compute-ave dup-req if $closest_(requestor) { set C2_ [expr $C2_ - 0.1] set closest_(requestor) 0 } elseif {$stats_(ave-dup-req) >= $AveDups_} { set C1_ [expr $C1_ + 0.1] set C2_ [expr $C2_ + 0.5] } elseif {$stats_(ave-dup-req) < [expr $AveDups_ - $eps_]} { if {$stats_(ave-req-delay) > $AveDelay_} { set C2_ [expr $C2_ - 0.1] } if {$stats_(ave-dup-req) < 0.25} { set C1_ [expr $C1_ - 0.05] } } else { set C1_ [expr $C1_ + 0.05] } $self check-bounds C1_ C2_ } Agent/SRM/Adaptive instproc sending-request {} { $self set C1_ [expr [$self set C1_] - 0.1] ;# XXX SF's code uses other $self set closest_(requestor) 1 $self check-bounds C1_ } Agent/SRM/Adaptive instproc recv-request {r d s m} { $self instvar pending_ closest_ if { [info exists pending_($s:$m)] && $d == 1 } { set closeness [$pending_($s:$m) closest-requestor?] if {$closeness >= 0} { set closest_(requestor) $closeness } } $self next $r $d $s $m } Agent/SRM/Adaptive instproc recompute-repair-params {} { $self instvar closest_ D1_ D2_ stats_ AveDups_ AveDelay_ eps_ if {$stats_(ave-rep-delay) < 0} { set logG [expr log10([$self set groupSize_])] set D1_ $logG set D2_ $logG $self check-bounds D1_ D2_ ;# adjust bounds to estimated size of G return } $self compute-ave dup-rep if $closest_(repairor) { set D2_ [expr $D2_ - 0.1] set closest_(repairor) 0 } elseif {$stats_(ave-dup-rep) >= $AveDups_} { set D1_ [expr $D1_ + 0.1] set D2_ [expr $D2_ + 0.5] } elseif {$stats_(ave-dup-rep) < [expr $AveDups_ - $eps_]} { if {$stats_(ave-rep-delay) > $AveDelay_} { set D2_ [expr $D2_ - 0.1] } if {$stats_(ave-dup-rep) < 0.25} { set D1_ [expr $D1_ - 0.05] } } else { set D1_ [expr $D1_ + 0.05] } $self check-bounds D1_ D2_ } Agent/SRM/Adaptive instproc sending-repair {} { $self set D1_ [expr [$self set D1_] - 0.1] ;# XXX SF's code uses other $self set closest_(repairor) 1 $self check-bounds D1_ } Agent/SRM/Adaptive instproc recv-repair {d s m} { $self instvar pending_ closest_ if { [info exists pending_($s:$m)] && $d == 1 } { set closeness [$pending_($s:$m) closest-repairor?] if {$closeness >= 0} { set closest_(repairor) $closeness } } $self next $d $s $m } Class SRM/request/Adaptive -superclass SRM/request SRM/request/Adaptive instproc set-params args { $self instvar agent_ $agent_ recompute-request-params eval $self next $args } SRM/request/Adaptive instproc backoff? {} { $self instvar backoff_ backoffCtr_ backoffLimit_ set retval $backoff_ if {[incr backoffCtr_] <= $backoffLimit_} { set backoff_ [expr $backoff_ * 3] } set retval } SRM/request/Adaptive instproc schedule {} { $self next } SRM/request/Adaptive instproc send-request {} { $self instvar agent_ round_ if { $round_ == 1 } { $agent_ sending-request } $self next } SRM/request/Adaptive instproc closest-requestor? {} { $self instvar agent_ sender_ sent_ round_ if {$sent_ == 1 && $round_ == 1} { ;# since repairs aren't rescheduled. if {[$agent_ set pdistance_] > \ [expr 1.5 * [$self distance? $sender_]]} { return 1 } else { return 0 } } else { return -1 } } SRM/request/Adaptive instproc closest-repairor? {} { return -1 } Class SRM/repair/Adaptive -superclass SRM/repair SRM/repair/Adaptive instproc set-params args { $self instvar agent_ $agent_ recompute-repair-params eval $self next $args } SRM/repair/Adaptive instproc schedule {} { $self next } SRM/repair/Adaptive instproc send-repair {} { $self instvar round_ agent_ if { $round_ == 1 } { $agent_ sending-repair } $self next } SRM/repair/Adaptive instproc closest-requestor? {} { return -1 } SRM/repair/Adaptive instproc closest-repairor? {} { $self instvar agent_ requestor_ sent_ round_ if {$sent_ == 1 && $round_ == 1} { if {[$agent_ set pdistance_] > \ [expr 1.5 * [$self distance? $requestor_]]} { return 1 } else { return 0 } } else { return -1 } } Agent/SRM instproc init {} { $self next $self instvar ns_ requestFunction_ repairFunction_ set ns_ [Simulator instance] $self init-instvar sessionDelay_ foreach var {C1_ C2_ D1_ D2_} { $self init-instvar $var } $self init-instvar requestFunction_ $self init-instvar repairFunction_ $self init-instvar sessionFunction_ $self init-instvar requestBackoffLimit_ $self init-instvar distanceCompute_ $self array set stats_ [list \ dup-req -1 ave-dup-req -1 \ dup-rep -1 ave-dup-rep -1 \ req-delay 0.0 ave-req-delay -1 \ rep-delay 0.0 ave-rep-delay -1 \ ] } Agent/SRM instproc delete {} { $self instvar ns_ pending_ done_ session_ tg_ foreach i [array names pending_] { $pending_($i) cancel DELETE delete $pending_($i) } $self cleanup delete $session_ if [info exists tg_] { delete $tg_ } } Agent/SRM instproc start {} { $self instvar node_ dst_addr_ ;# defined in Agent base class set dst_addr_ [expr $dst_addr_] ; # get rid of possibly leading 0x etc. $self cmd start $node_ join-group $self $dst_addr_ $self instvar ns_ session_ sessionFunction_ set session_ [new $sessionFunction_ $ns_ $self] $session_ schedule } Agent/SRM instproc start-source {} { $self instvar tg_ if ![info exists tg_] { error "No source defined for agent $self" } $tg_ start } Agent/SRM instproc sessionFunction f { $self instvar sessionFunction_ set sessionFunction_ $f } Agent/SRM instproc requestFunction f { $self instvar requestFunction_ set requestFunction_ $f } Agent/SRM instproc repairFunction f { $self instvar repairFunction_ set repairFunction_ $f } Agent/SRM instproc groupSize? {} { $self set groupSize_ } global alpha if ![info exists alpha] { set alpha 0.25 } proc ewma {ave cur} { if {$ave < 0} { return $cur } else { global alpha return [expr (1 - $alpha) * $ave + $alpha * $cur] } } proc instantaneous {ave cur} { set cur } Agent/SRM instproc compute-ave var { $self instvar stats_ set stats_(ave-$var) [ewma $stats_(ave-$var) $stats_($var)] } Agent/SRM instproc recv {type args} { eval $self recv-$type $args } Agent/SRM instproc recv-data {sender msgid} { $self instvar pending_ if ![info exists pending_($sender:$msgid)] { error "Oy vey! How did we get here?" } if {[$pending_($sender:$msgid) set round_] == 1} { $pending_($sender:$msgid) cancel DATA $pending_($sender:$msgid) evTrace Q DATA delete $pending_($sender:$msgid) unset pending_($sender:$msgid) } else { $pending_($sender:$msgid) recv-repair } } Agent/SRM instproc mark-period period { $self compute-ave $period $self set stats_($period) 0 } Agent/SRM instproc request {sender args} { $self instvar pending_ ns_ requestFunction_ set newReq 0 foreach msgid $args { if [info exists pending_($sender:$msgid)] { error "duplicate loss detection in agent" } set pending_($sender:$msgid) [new $requestFunction_ $ns_ $self] $pending_($sender:$msgid) set-params $sender $msgid $pending_($sender:$msgid) schedule if ![info exists old_($sender:$msgid)] { incr newReq } } if $newReq { $self mark-period dup-req } } Agent/SRM instproc update-ave {type delay} { $self instvar stats_ set stats_(${type}-delay) $delay $self compute-ave ${type}-delay } Agent/SRM instproc recv-request {requestor round sender msgid} { $self instvar pending_ stats_ if [info exists pending_($sender:$msgid)] { if { $round == 1 } { incr stats_(dup-req) [$pending_($sender:$msgid) \ dup-request?] } $pending_($sender:$msgid) recv-request } else { $self repair $requestor $sender $msgid } } Agent/SRM instproc repair {requestor sender msgid} { $self instvar pending_ ns_ repairFunction_ if [info exists pending_($sender:$msgid)] { error "duplicate repair detection in agent?? really??" } set pending_($sender:$msgid) [new $repairFunction_ $ns_ $self] $pending_($sender:$msgid) set requestor_ $requestor $pending_($sender:$msgid) set-params $sender $msgid $pending_($sender:$msgid) schedule $self mark-period dup-rep } Agent/SRM instproc recv-repair {round sender msgid} { $self instvar pending_ stats_ if ![info exists pending_($sender:$msgid)] { $self instvar trace_ ns_ node_ if [info exists trace_] { } } else { if { $round == 1 } { incr stats_(dup-rep) [$pending_($sender:$msgid) \ dup-repair?] } $pending_($sender:$msgid) recv-repair } } Agent/SRM/Fixed instproc repair args { $self set D1_ [expr log10([$self set groupSize_])] $self set D2_ [expr log10([$self set groupSize_])] eval $self next $args } Agent/SRM instproc clear {obj s m} { $self instvar pending_ done_ old_ logfile_ set done_($s:$m) $obj set old_($s:$m) [$obj set round_] if [info exists logfile_] { $obj dump-stats $logfile_ } unset pending_($s:$m) if {[array size done_] > 32} { $self instvar ns_ $ns_ at [expr [$ns_ now] + 0.01] "$self cleanup" } } Agent/SRM instproc round? {s m} { $self instvar old_ if [info exists old_($s:$m)] { return $old_($s:$m) } else { return 0 } } Agent/SRM instproc cleanup {} { $self instvar done_ if [info exists done_] { foreach i [array names done_] { delete $done_($i) } unset done_ } } Agent/SRM instproc trace file { $self set trace_ $file } Agent/SRM instproc log file { $self set logfile_ $file } SRM instproc init {ns agent} { $self next $self instvar ns_ agent_ nid_ distf_ set ns_ $ns set agent_ $agent set nid_ [[$agent_ set node_] id] set distf_ [$agent_ set distanceCompute_] if ![catch "$agent_ set trace_" traceVar] { $self set trace_ $traceVar } $self array set times_ [list \ startTime [$ns_ now] serviceTime -1 distance -1] } SRM instproc set-params {sender msgid} { $self next $self instvar agent_ sender_ msgid_ round_ sent_ set sender_ $sender set msgid_ $msgid set round_ [$agent_ round? $sender_ $msgid_] set sent_ 0 } SRM instproc cancel {} { $self instvar ns_ eventID_ if [info exists eventID_] { $ns_ cancel $eventID_ unset eventID_ } } SRM instproc schedule {} { $self instvar round_ incr round_ } SRM instproc distance? node { $self instvar agent_ times_ distf_ set times_(distance) [$distf_ $times_(distance) \ [$agent_ distance? $node]] } SRM instproc serviceTime {} { $self instvar ns_ times_ set times_(serviceTime) [expr ([$ns_ now] - $times_(startTime)) / \ ( 2 * $times_(distance))] } SRM instproc logpfx fp { $self instvar ns_ nid_ sender_ msgid_ round_ puts -nonewline $fp [format "%7.4f" [$ns_ now]] puts -nonewline $fp " n $nid_ m <$sender_:$msgid_> r $round_ " } SRM instproc dump-stats fp { $self instvar times_ statistics_ $self logpfx $fp puts -nonewline $fp "type [string range [$self info class] 4 end] " puts $fp "[array get times_] [array get statistics_]" } SRM instproc evTrace {tag type args} { $self instvar trace_ if [info exists trace_] { $self logpfx $trace_ puts -nonewline $trace_ "$tag $type" foreach elem $args { puts -nonewline $trace_ " $elem" } puts $trace_ {} } } SRM/request instproc init args { eval $self next $args $self array set statistics_ "dupRQST 0 dupREPR 0 #sent 0 backoff 0" } SRM/request instproc set-params args { eval $self next $args $self instvar agent_ sender_ foreach var {C1_ C2_} { if ![catch "$agent_ set $var" val] { $self instvar $var set $var $val } } $self distance? $sender_ $self instvar backoff_ backoffCtr_ backoffLimit_ set backoff_ 1 set backoffCtr_ 0 set backoffLimit_ [$agent_ set requestBackoffLimit_] $self evTrace Q DETECT } SRM/request instproc dup-request? {} { $self instvar ns_ round_ ignore_ if {$round_ == 2 && [$ns_ now] <= $ignore_} { return 1 } else { return 0 } } SRM/request instproc dup-repair? {} { return 0 } SRM/request instproc backoff? {} { $self instvar backoff_ backoffCtr_ backoffLimit_ set retval $backoff_ if {[incr backoffCtr_] <= $backoffLimit_} { incr backoff_ $backoff_ } set retval } SRM/request instproc compute-delay {} { $self instvar C1_ C2_ set rancomp [expr $C1_ + $C2_ * [uniform 0 1]] $self instvar sender_ backoff_ set dist [$self distance? $sender_] $self evTrace Q INTERVALS C1 $C1_ C2 $C2_ d $dist i $backoff_ set delay [expr $rancomp * $dist] } SRM/request instproc schedule {} { $self instvar ns_ eventID_ delay_ $self next set now [$ns_ now] set delay_ [expr [$self compute-delay] * [$self backoff?]] set fireTime [expr $now + $delay_] $self evTrace Q NTIMER at $fireTime set eventID_ [$ns_ at $fireTime "$self send-request"] } SRM/request instproc cancel type { $self next if {$type == "REQUEST" || $type == "REPAIR"} { $self instvar agent_ round_ if {$round_ == 1} { $agent_ update-ave req [$self serviceTime] } } } SRM/request instproc send-request {} { $self instvar agent_ round_ sender_ msgid_ sent_ round_ $self evTrace Q SENDNACK $agent_ send request $round_ $sender_ $msgid_ $self instvar statistics_ incr statistics_(#sent) set sent_ $round_ } SRM/request instproc recv-request {} { $self instvar ns_ agent_ round_ delay_ ignore_ statistics_ if {[info exists ignore_] && [$ns_ now] < $ignore_} { incr statistics_(dupRQST) } else { $self cancel REQUEST $self schedule ;# or rather, reschedule-rqst set ignore_ [expr [$ns_ now] + ($delay_ / 2)] incr statistics_(backoff) $self evTrace Q NACK IGNORE-BACKOFF $ignore_ } } SRM/request instproc recv-repair {} { $self instvar ns_ agent_ sender_ msgid_ ignore_ eventID_ if [info exists eventID_] { $self serviceTime set ignore_ [expr [$ns_ now] + 3 * [$self distance? $sender_]] $ns_ at $ignore_ "$agent_ clear $self $sender_ $msgid_" $self cancel REPAIR $self evTrace Q REPAIR IGNORES $ignore_ } else { ;# we must be in the 3dS,B holdDown interval $self instvar statistics_ incr statistics_(dupREPR) } } SRM/repair instproc init args { eval $self next $args $self array set statistics_ "dupRQST 0 dupREPR 0 #sent 0" } SRM/repair instproc set-params args { eval $self next $args $self instvar agent_ requestor_ foreach var {D1_ D2_} { if ![catch "$agent_ set $var" val] { $self instvar $var set $var $val } } $self distance? $requestor_ $self evTrace P NACK from $requestor_ } SRM/repair instproc dup-request? {} { return 0 } SRM/repair instproc dup-repair? {} { $self instvar ns_ round_ if {$round_ == 1} { ;# because repairs do not reschedule return 1 } else { return 0 } } SRM/repair instproc compute-delay {} { $self instvar D1_ D2_ set rancomp [expr $D1_ + $D2_ * [uniform 0 1]] $self instvar requestor_ set dist [$self distance? $requestor_] $self evTrace P INTERVALS D1 $D1_ D2 $D2_ d $dist set delay [expr $rancomp * $dist] } SRM/repair instproc schedule {} { $self instvar ns_ eventID_ $self next set fireTime [expr [$ns_ now] + [$self compute-delay]] $self evTrace P RTIMER at $fireTime set eventID_ [$ns_ at $fireTime "$self send-repair"] } SRM/repair instproc cancel type { $self next if {$type == "REQUEST" || $type == "REPAIR"} { $self instvar agent_ round_ if {$round_ == 1} { $agent_ update-ave rep [$self serviceTime] } } } SRM/repair instproc send-repair {} { $self instvar ns_ agent_ round_ sender_ msgid_ requestor_ sent_ round_ $self evTrace P SENDREP $agent_ set requestor_ $requestor_ $agent_ send repair $round_ $sender_ $msgid_ $self instvar statistics_ incr statistics_(#sent) set sent_ $round_ } SRM/repair instproc recv-request {} { $self instvar statistics_ incr statistics_(dupRQST) } SRM/repair instproc recv-repair {} { $self instvar ns_ agent_ round_ sender_ msgid_ eventID_ requestor_ if [info exists eventID_] { set holdDown [expr [$ns_ now] + \ 3 * [$self distance? $requestor_]] $ns_ at $holdDown "$agent_ clear $self $sender_ $msgid_" $self cancel REPAIR $self evTrace P REPAIR IGNORES $holdDown } else { ;# we must in the 3dS,B holdDown interval $self instvar statistics_ incr statistics_(dupREPR) } } SRM/session instproc init args { eval $self next $args $self instvar agent_ sessionDelay_ round_ set sessionDelay_ [$agent_ set sessionDelay_] set round_ 1 $self array set statistics_ "#sent 0" $self set sender_ 0 $self set msgid_ 0 } SRM/session instproc delete {} { $self instvar $ns_ eventID_ $ns_ cancel $eventID_ $self next } SRM/session instproc schedule {} { $self instvar ns_ agent_ sessionDelay_ eventID_ $self next set fireTime [expr $sessionDelay_ * [uniform 0.9 1.1]] set eventID_ [$ns_ at [expr [$ns_ now] + $fireTime] \ "$self send-session"] } SRM/session instproc send-session {} { $self instvar agent_ statistics_ $agent_ send session $self evTrace S SESSION incr statistics_(#sent) $self schedule } SRM/session instproc evTrace args {} ;# because I don't want to trace Class SRM/session/log-scaled -superclass SRM/session SRM/session/log-scaled instproc schedule {} { $self instvar ns_ agent_ sessionDelay_ eventID_ set fireTime [expr $sessionDelay_ * [uniform 0.9 1.1] * \ (1 + log([$agent_ set groupSize_])) ] set eventID_ [$ns_ at [expr [$ns_ now] + $fireTime] \ "$self send-session"] } Agent/SRM/SSM set group_scope_ 32 Agent/SRM/SSM set local_scope_ 2 Agent/SRM/SSM set scope_flag_ 2 Agent/SRM/SSM set rep_id_ 0 Agent/SRM/SSM set numrep_ 0 Agent/SRM/SSM set repthresh_up_ 100 Agent/SRM/SSM set repthresh_low_ 7 Agent/SRM/SSM set Z1_ 1.5 Agent/SRM/SSM set S1_ 0.0 Agent/SRM/SSM set S2_ 3.0 Agent/SRM/SSM instproc init {} { $self next $self instvar numrep_ numloc_ repthresh_up_ repthresh_low_ Z1_ \ S1_ S2_ set numrep_ 0 set numloc_ 0 set repthresh_up_ [$class set repthresh_up_] set repthresh_low_ [$class set repthresh_low_] set Z1_ [$class set Z1_] set S1_ [$class set S1_] set S2_ [$class set S2_] } Agent/SRM/SSM instproc start {} { $self next $self instvar deactivateID_ sessionDelay_ ns_ set now [expr [$ns_ now]] set deactivateID_ [$ns_ at [expr $now + 3 * $sessionDelay_] \ "$self deactivate-reps $now"] } Agent/SRM/SSM instproc repid { rep} { $self instvar rep_id_ $self set rep_id_ [$rep set addr_] $self ch-rep } Agent/SRM/SSM instproc member-scope {scope } { $self instvar scope_flag_ $self set scope_flag_ $scope } Agent/SRM/SSM instproc local-member? {} { $self instvar scope_flag_ if {$scope_flag_ == 1 } { return 1 } else { return 0 } } Agent/SRM/SSM instproc global-member? {} { $self instvar scope_flag_ if {$scope_flag_ == 2 } { return 1 } else { return 0 } } Agent/SRM/SSM instproc local-member {} { $self member-scope 1 } Agent/SRM/SSM instproc global-rep {} { $self member-scope 2 set rep_id_ [$self set addr_] $self ch-rep } Agent/SRM/SSM instproc set-local-scope {scope} { $self instvar local_scope_ $self set local_scope_ $scope } Agent/SRM/SSM instproc set-global-scope {scope} { $self instvar global-scope $self set global-scope $scope } Agent/SRM/SSM instproc set-repid {rep} { $self instvar rep_id_ $self set rep_id_ [$rep set addr_] $self ch-rep } Agent/SRM/SSM instproc dump-reps {} { $self instvar ns_ activerep_ numrep_ puts "[ft $ns_ $self] numreps: $numrep_" if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] set ttl [$activerep_($i) set ttl_] puts "rep: $i recvtime: [ftime $rtime] ttl: $ttl" } } } Agent/SRM/SSM instproc dump-locs {} { $self instvar ns_ activeloc_ numloc_ puts "[ft $ns_ $self] numlocs: $numloc_" if [info exists activeloc_] { foreach i [array names activeloc_] { set rtime [$activeloc_($i) set recvTime_] set ttl [$activeloc_($i) set ttl_] set repid [$activeloc_($i) set repid_] puts "loc: $i recvtime: [ftime $rtime] ttl: \ $ttl repid: $repid" } } } Agent/SRM/SSM instproc send-session {} { $self instvar session_ $session_ send-session } Agent/SRM/SSM instproc repchange-action {} { $self instvar rep_id_ tentativerep_ tentativettl_ $self instvar ns_ $self cur-num-reps set rep_id_ $tentativerep_ puts "[ft $ns_ $self] chrep rep : $tentativerep_\ ttl : $tentativettl_" $self set-local-scope $tentativettl_ $self local-member $self ch-rep $self send-session } Agent/SRM/SSM instproc recv-lsess {sender repid ttl} { $self instvar activeloc_ ns_ numloc_ sessionDelay_ deactivatelocID_ $self instvar activerep_ numrep_ $self instvar ch_localID_ tentativerep_ addr_ rep_id_ tentativettl_ if [info exists activeloc_($sender)] { $activeloc_($sender) recv-lsess $repid $ttl } else { set activeloc_($sender) [new SRMinfo/loc $sender] incr numloc_ $activeloc_($sender) set-params $ns_ $self $activeloc_($sender) recv-lsess $repid $ttl } if [info exists activerep_($sender)] { delete $activerep_($sender) unset activerep_($sender) incr numrep_ -1 if [info exists ch_localID_] { if {[info exists tentativerep_] && $tentativerep_ == $sender } { $self cur-num-reps } if { $repid == $addr_} { $ns_ cancel $ch_localID_ $self unset ch_localID_ $self check-status } } if { [$self local-member?]} { if { $sender == $rep_id_} { $self repchange-action } } else { if { $sender == $rep_id_} { puts "[ft $ns_ $self] error" } } } set time [expr [$ns_ now] - 3 * $sessionDelay_] if [info exists deactivatelocID_] { $ns_ cancel $deactivatelocID_ unset deactivatelocID_ } $self deactivate-locs $time } Agent/SRM/SSM instproc recv-gsess {sender ttl} { $self instvar activerep_ ns_ numrep_ sessionDelay_ $self instvar deactivateID_ local_scope_ $self instvar activeloc_ numloc_ if [info exists activerep_($sender)] { $activerep_($sender) recv-gsess $ttl } else { set activerep_($sender) [new SRMinfo/rep $sender] incr numrep_ $activerep_($sender) set-params $ns_ $self $activerep_($sender) recv-gsess $ttl } set time [expr [$ns_ now] - 3 * $sessionDelay_] if [info exists deactivateID_] { $ns_ cancel $deactivateID_ unset deactivateID_ } if [info exists activeloc_($sender)] { delete $activeloc_($sender) unset activeloc_($sender) incr numloc_ -1 } if { [$self local-member?]} { if {$ttl < $local_scope_} { set rep_id_ $sender puts "[ft $ns_ $self] closerrep rep : $sender \ ttl : $ttl" $self set-local-scope $ttl $self local-member $self ch-rep $self send-session } } $self deactivate-reps $time $self check-status } Agent/SRM/SSM instproc bias {} { $self instvar activerep_ ns_ sessionDelay_ set now [expr [$ns_ now]] set biasfactor 0 set time [expr $now - 1.5 * $sessionDelay_] if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] if { $rtime >= $time} { incr biasfactor } } } return $biasfactor } Agent/SRM/SSM instproc my-loc {} { $self instvar activeloc_ set num 0 if [info exists activeloc_] { foreach i [array names activeloc_] { set repid [$activeloc_($i) set repid_] if { $repid == [$self set addr_]} { incr num } } } return $num } Agent/SRM/SSM instproc cur-num-reps {} { $self instvar activerep_ ns_ sessionDelay_ tentativerep_ tentativettl_ $self instvar Z1_ set now [expr [$ns_ now]] set num 0 set min_ttl 32 set time [expr $now - $Z1_ * $sessionDelay_] if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] set ttl [$activerep_($i) set ttl_] if { $rtime >= $time} { if {$min_ttl > $ttl} { set tentativerep_ $i set min_ttl $ttl } incr num } } } set tentativettl_ $min_ttl return $num } Agent/SRM/SSM instproc compute-localdelay {} { $self instvar S1_ S2_ sessionDelay_ set num [$self my-loc] if {$num > 0} { set rancomp [expr $S1_+ 1 + $S2_ * [uniform 0 1]] } else { set rancomp [expr $S1_+ $S2_ * [uniform 0 1]] } set delay [expr $rancomp * $sessionDelay_] return $delay } Agent/SRM/SSM instproc compute-globaldelay {} { $self instvar S1_ S2_ sessionDelay_ set rancomp [expr $S1_ + $S2_ * [uniform 0 1]] set delay [expr $rancomp * $sessionDelay_] return $delay } Agent/SRM/SSM instproc schedule-ch-local {} { $self instvar ns_ ch_localID_ set now [$ns_ now] set delay [$self compute-localdelay] set fireTime [expr $now + $delay] if [info exists ch_localID_] { puts "[new_ft $ns_ $self] scheduled called without cancel" $ns_ cancel $ch_localID_ unset ch_localID_ } set ch_localID_ [$ns_ at $fireTime "$self ch-local"] puts "[ft $ns_ $self] schlocal [ftime $fireTime] evid : $ch_localID_" } Agent/SRM/SSM instproc schedule-ch-global {} { $self instvar ns_ ch_globalID_ set now [$ns_ now] set delay [$self compute-globaldelay] set fireTime [expr $now + $delay] if [info exists ch_globalID_] { puts "[ft $ns_ $self] glbscheduled called without cancel" $ns_ cancel $ch_globalID_ unset ch_globalID_ } set ch_globalID_ [$ns_ at $fireTime "$self ch-global"] puts "[ft $ns_ $self] schglobal [ftime $fireTime] evid : $ch_globalID_" } Agent/SRM/SSM instproc check-status {} { $self instvar ns_ numrep_ repthresh_up_ ch_localID_ $self instvar ch_globalID_ repthresh_low_ if { $numrep_ > $repthresh_up_ } { if [info exists ch_localID_] { return; } if { [$self local-member?]} { if [info exists ch_globalID_] { $ns_ cancel $ch_globalID_ unset ch_globalID_ } return; } $self schedule-ch-local return; } if {$numrep_ < $repthresh_low_} { if [info exists ch_globalID_] { return; } if { [$self global-member?]} { if [info exists ch_localID_] { $ns_ cancel $ch_localID_ unset ch_localID_ } return; } $self schedule-ch-global return; } if [info exists ch_localID_] { $ns_ cancel $ch_localID_ unset ch_localID_ } if [info exists ch_globalID_] { $ns_ cancel $ch_globalID_ unset ch_globalID_ } } Agent/SRM/SSM instproc ch-local {} { $self instvar repthresh_up_ tentativerep_ tentativettl_ ns_ rep_id_ if {[$self cur-num-reps] > $repthresh_up_} { set rep_id_ $tentativerep_ puts "[ft $ns_ $self] chlocal rep : $tentativerep_\ ttl : $tentativettl_" $self local-member $self ch-rep $self send-session $self set-local-scope $tentativettl_ } if [info exists ch_localID_] { $ns_ cancel ch_localID_ unset ch_localID_ } } Agent/SRM/SSM instproc ch-global {} { $self instvar repthresh_low_ tentativerep_ tentativettl_ ns_ rep_id_ if {[$self cur-num-reps] < $repthresh_low_} { set rep_id_ [$self set addr_] puts "[ft $ns_ $self] chglobal rep : $rep_id_\ ttl : $tentativettl_" $self set-local-scope 0 $self global-rep $self ch-rep $self send-session } if [info exists ch_globalID_] { $ns_ cancel ch_globalID_ unset ch_globalID_ } } Agent/SRM/SSM instproc deactivate-reps {time} { $self instvar numrep_ activerep_ deactivateID_ ns_ $self instvar sessionDelay_ rep_id_ if [info exists activerep_] { foreach i [array names activerep_] { set rtime [$activerep_($i) set recvTime_] if { $rtime < $time} { delete $activerep_($i) unset activerep_($i) incr numrep_ -1 if { $i == $rep_id_ } { puts "[ft $ns_ $self] $i == $rep_id_" $self repchange-action } } } if {$numrep_ <= 0} { unset activerep_ } } set now [expr [$ns_ now]] set deactivateID_ [$ns_ at [expr $now + 3 * $sessionDelay_] \ "$self deactivate-reps $now"] } Agent/SRM/SSM instproc deactivate-locs {time} { $self instvar numloc_ activeloc_ deactivatelocID_ ns_ $self instvar sessionDelay_ local_scope_ set maxttl 0 if [info exists activeloc_] { foreach i [array names activeloc_] { set rtime [$activeloc_($i) set recvTime_] if { $rtime < $time} { delete $activeloc_($i) unset activeloc_($i) incr numloc_ -1 } else { if { [$self global-member?] } { set ttl [$activeloc_($i) set ttl_] if {$maxttl < $ttl} { set maxttl $ttl } set local_scope_ $maxttl } } } if {$numloc_ <= 0} { unset activeloc_ } } set now [expr [$ns_ now]] set deactivatelocID_ [$ns_ at [expr $now + 3 * $sessionDelay_] \ "$self deactivate-locs $now"] } Class SRMinfo SRMinfo set recvTime_ 0 SRMinfo instproc init {sender} { $self next $self instvar sender_ set sender_ $sender } SRMinfo instproc set-params {ns agent} { $self instvar ns_ agent_ set ns_ $ns set agent_ $agent } Class SRMinfo/rep -superclass SRMinfo SRMinfo/rep instproc recv-gsess {ttl} { $self instvar recvTime_ ns_ ttl_ set now [$ns_ now] set recvTime_ [expr $now] set ttl_ [expr $ttl] } Class SRMinfo/loc -superclass SRMinfo SRMinfo/loc instproc recv-lsess {repid ttl} { $self instvar recvTime_ ns_ ttl_ repid_ set now [$ns_ now] set recvTime_ [expr $now] set ttl_ [expr $ttl] set repid_ [expr $repid] } Agent/MFTP/Snd set dtuSize_ 1424 ;# default size of DTUs (in bytes) Agent/MFTP/Snd set dtusPerBlock_ 1472 ;# default number of DTUs per block Agent/MFTP/Snd set dtusPerGroup_ 8 ;# default group size Agent/MFTP/Snd set fileSize_ 1000000 ;# default file size in bytes Agent/MFTP/Snd set readAheadBufsize_ 2097152;# default size of read-ahead buffer in bytes Agent/MFTP/Snd set interval_ 512000 ;# default transmission rate is 512kbps Agent/MFTP/Snd set txStatusLimit_ 100 ;# default max. number of consecutive status requests without NAK Agent/MFTP/Snd set txStatusDelay_ 2 ;# default time to wait for status responses after a request before polling again Agent/MFTP/Snd set rspBackoffWindow_ 1 ;# default max. time for receivers to wait before replying with nak(s) after a request Agent/MFTP/Snd set reply_addr_ undefined ; # application _must_ specify the sender address (i.e. the one ;# to which NAKs are unicast to). Default is "undefined" Agent/MFTP/Snd set reply_port_ undefined Agent/MFTP/Snd set nakCount_ 0 Agent/MFTP/Snd set seekCount_ 0 ;# number of disk seeks performed Agent/MFTP/Snd instproc init {} { $self next $self instvar ns_ dtuSize_ dtusPerBlock_ dtusPerGroup_ fileSize_ $self instvar reply_addr_ reply_port_ readAheadBufsize_ interval_ $self instvar txStatusLimit_ txStatusDelay_ rspBackoffWindow_ nakCount_ $self instvar seekCount_ set ns_ [Simulator instance] foreach var { dtuSize_ dtusPerBlock_ dtusPerGroup_ fileSize_ \ readAheadBufsize_ interval_ txStatusLimit_ \ txStatusDelay_ rspBackoffWindow_ nakCount_ seekCount_ } { $self init-instvar $var } } Agent/MFTP/Snd instproc send-data { } { $self instvar ns_ interval_ if { [$self cmd send data] != -1 } { $ns_ at [expr [$ns_ now] + $interval_] "$self send-data" } } Agent/MFTP/Snd instproc start {} { $self instvar node_ dst_addr_ set dst_addr_ [expr $dst_addr_] ;# get rid of possibly leading 0x etc. $self cmd start $node_ join-group $self $dst_addr_ $self send-data } Agent/MFTP/Snd instproc pass-finished { CurrentPass NbBlocks } { $self instvar ns_ dtusPerGroup_ interval_ tx_status_requests_ rspBackoffWindow_ set tx_status_requests_ 0 ;# number of consecutively sent status requests if { $CurrentPass >= $dtusPerGroup_ - 1 } { $self send status-req $CurrentPass 0 [expr $NbBlocks-1] $rspBackoffWindow_ } else { $ns_ at [expr [$ns_ now] + $interval_] "$self send-data" } } Agent/MFTP/Snd instproc send-status-req { CurrentPass blockLo blockHi rspBackoffWindow } { $self instvar ns_ tx_status_requests_ txStatusDelay_ $self cmd send statreq $CurrentPass $blockLo $blockHi $rspBackoffWindow incr tx_status_requests_ $ns_ at [expr [$ns_ now] + $txStatusDelay_] \ "$self status-rsp-pending $CurrentPass $blockLo $blockHi" } Agent/MFTP/Snd instproc status-rsp-pending { CurrentPass blockLo blockHi } { $self instvar nakCount_ tx_status_requests_ txStatusLimit_ rspBackoffWindow_ if { $nakCount_ > 0 } { set nakCount_ 0 $self send-data } elseif { $tx_status_requests_ < $txStatusLimit_ } { $self send status-req $CurrentPass $blockLo $blockHi $rspBackoffWindow_ } else { $self done } } Agent/MFTP/Snd instproc recv { type args } { eval $self evTrace $proc $type $args eval $self $proc-$type $args } Agent/MFTP/Snd instproc send { type args } { eval $self evTrace $proc $type $args eval $self $proc-$type $args } Agent/MFTP/Snd instproc send-notify { args } { } Agent/MFTP/Snd instproc recv-nak { passNb block_nb nak_count} { } Agent/MFTP/Snd instproc done {} { } Agent/MFTP/Snd instproc trace fd { $self instvar trace_ set trace_ $fd } Agent/MFTP/Snd instproc delete {} { } Agent/MFTP/Snd instproc evTrace { op type args } { $self instvar trace_ ns_ if [info exists trace_] { puts $trace_ [format "%7.4f [[$self set node_] id] $op-$type $args" [$ns_ now]] } } Agent/MFTP/Rcv set dtuSize_ 1424 Agent/MFTP/Rcv set dtusPerBlock_ 1472 Agent/MFTP/Rcv set dtusPerGroup_ 8 Agent/MFTP/Rcv set fileSize_ 1000000 Agent/MFTP/Rcv set nakCount_ 0 Agent/MFTP/Rcv set seekCount_ 0 Agent/MFTP/Rcv set reply_addr_ 0 ; # unicast reply addr (=address of server) Agent/MFTP/Rcv set reply_port_ 0 ; # unicast reply addr (=address of server) Agent/MFTP/Rcv instproc init {} { $self next $self instvar ns_ dtuSize_ dtusPerBlock_ dtusPerGroup_ fileSize_ $self instvar reply_addr_ reply_port_ nakCount_ seekCount_ set ns_ [Simulator instance] foreach var { dtuSize_ dtusPerBlock_ dtusPerGroup_ fileSize_ reply_addr_ reply_port_ nakCount_ seekCount_} { $self init-instvar $var } } Agent/MFTP/Rcv instproc start {} { $self instvar node_ dst_addr_ set dst_addr_ [expr $dst_addr_] ;# get rid of possibly leading 0x etc. $self cmd start $node_ join-group $self $dst_addr_ } Agent/MFTP/Rcv instproc delete {} { } Agent/MFTP/Rcv instproc done-notify { args } { $self instvar node_ dst_addr_ eval $self evTrace done notify $args $node_ leave-group $self $dst_addr_ } Agent/MFTP/Rcv instproc recv { type args } { eval $self evTrace $proc $type $args eval $self recv-$type $args } Agent/MFTP/Rcv instproc recv-dependent { CurrentPass CurrentGroup CwPat } { } Agent/MFTP/Rcv instproc recv-group-full { CurrentPass CurrentGroup CwPat } { } Agent/MFTP/Rcv instproc recv-useful { CurrentPass CurrentGroup CwPat } { } Agent/MFTP/Rcv instproc recv-status-req { passNb blockLo blockHi txStatusDelay } { $self instvar ns_ set backoff [uniform 0 $txStatusDelay] $ns_ at [expr [$ns_ now] + $backoff] "$self send-nak [list $passNb $blockLo $blockHi]" } Agent/MFTP/Rcv instproc send-nak { passNb blockLo blockHi } { while { $blockLo <= $blockHi } { set bit_count [$self cmd send nak $passNb $blockLo] $self evTrace send nak $passNb $blockLo $bit_count incr blockLo } } Agent/MFTP/Rcv instproc trace fd { $self instvar trace_ set trace_ $fd } Agent/MFTP/Rcv instproc evTrace { op type args } { $self instvar trace_ ns_ if [info exists trace_] { puts $trace_ [format "%7.4f [[$self set node_] id] $op-$type $args" [$ns_ now]] } } Class Agent/MFTP/Rcv/Stat -superclass Agent/MFTP/Rcv Agent/MFTP/Rcv/Stat instproc init { } { $self instvar nb_useful_recv nb_full_disc nb_lin_dep_disc $self next foreach var [list nb_useful_recv nb_full_disc nb_lin_dep_disc] { set $var 0 } } Agent/MFTP/Rcv/Stat instproc recv-useful { CurrentPass CurrentGroup CwPat } { $self instvar nb_useful_recv puts stdout "recv-useful!" $self next $CurrentPass $CurrentGroup $CwPat incr nb_useful_recv } Agent/MFTP/Rcv/Stat instproc recv-group-full { CurrentPass CurrentGroup CwPat } { $self instvar nb_full_disc puts stdout "recv-group-full!" $self next $CurrentPass $CurrentGroup $CwPat incr nb_full_disc } Agent/MFTP/Rcv/Stat instproc recv-dependent { CurrentPass CurrentGroup CwPat } { $self instvar nb_lin_dep_disc puts stdout "recv-dependent!" $self next $CurrentPass $CurrentGroup $CwPat incr nb_lin_dep_disc } Agent/MFTP/Rcv/Stat instproc done-notify { args } { $self instvar nb_useful_recv nb_full_disc nb_lin_dep_disc eval $self next $args $nb_useful_recv $nb_full_disc $nb_lin_dep_disc } Class McastMonitor McastMonitor instproc init {} { $self instvar period_ ns_ set ns_ [Simulator instance] set period_ 0.03 } McastMonitor instproc trace-topo {} { $self instvar ns_ period_ $self trace-links [$ns_ all-links-list] } McastMonitor instproc trace-links links { $self instvar pktmon_ foreach l $links { set pktmon_($l) [new PktInTranMonitor] $pktmon_($l) attach-link $l $l add-pktmon $pktmon_($l) } } McastMonitor instproc filter {header field value} { $self instvar pktmon_ foreach index [array name pktmon_] { $pktmon_($index) filter $header $field $value } } McastMonitor instproc pktintran {} { $self instvar ns_ pktmon_ set total 0 foreach index [array name pktmon_] { if {[$index up?] == "up"} { incr total [$pktmon_($index) pktintran] } } return $total } McastMonitor instproc print-trace {} { $self instvar ns_ period_ file_ if [info exists file_] { puts $file_ "[$ns_ now] [$self pktintran]" } else { puts "[$ns_ now] [$self pktintran]" } $ns_ at [expr [$ns_ now] + $period_] "$self print-trace" } McastMonitor instproc attach file { $self instvar file_ set file_ $file } Class PktInTranMonitor PktInTranMonitor instproc init {} { $self instvar period_ ns_ front_counter_ rear_counter_ front_filter_ rear_filter_ set ns_ [Simulator instance] set period_ 0.03 set front_counter_ [new PktCounter] $front_counter_ set pktInTranMonitor_ $self set front_filter_ [new Filter/MultiField] $front_filter_ filter-target $front_counter_ set rear_counter_ [new PktCounter] $rear_counter_ set pktInTranMonitor_ $self set rear_filter_ [new Filter/MultiField] $rear_filter_ filter-target $rear_counter_ } PktInTranMonitor instproc reset {} { $self instvar front_counter_ rear_counter_ ns_ next_ $front_counter_ reset $rear_counter_ reset if {[info exist next_] && $next_ != 0} { $next_ reset } } PktInTranMonitor instproc filter {header field value} { $self instvar front_filter_ rear_filter_ $front_filter_ filter-field [PktHdr_offset PacketHeader/$header $field] $value $rear_filter_ filter-field [PktHdr_offset PacketHeader/$header $field] $value } PktInTranMonitor instproc attach-link link { $self instvar front_filter_ rear_filter_ front_counter_ rear_counter_ set tmp [$link head] while {[$tmp target] != [$link link]} { set tmp [$tmp target] } $tmp target $front_filter_ $front_filter_ target [$link link] $front_counter_ target [$link link] $rear_filter_ target [[$link link] target] $rear_counter_ target [[$link link] target] [$link link] target $rear_filter_ } PktInTranMonitor instproc attach file { $self instvar file_ set file_ $file } PktInTranMonitor instproc pktintran {} { $self instvar front_counter_ rear_counter_ return [expr [$front_counter_ value] - [$rear_counter_ value]] } PktInTranMonitor instproc output {} { $self instvar front_counter_ rear_counter_ ns_ file_ puts $file_ "[$ns_ now] [expr [$front_counter_ value] - [$rear_counter_ value]]" } PktInTranMonitor instproc periodical-output {} { $self instvar period_ ns_ $self output $ns_ at [expr [$ns_ now] + $period_] "$self periodical-output" } Simulator instproc all-links-list {} { $self instvar link_ set links "" foreach n [array names link_] { lappend links $link_($n) } set links } Link instproc add-pktmon pktmon { $self instvar pktmon_ if [info exists pktmon_] { $pktmon set next_ $pktmon_ } else { $pktmon set next_ 0 } set pktmon_ $pktmon } set rlm_param(alpha) 4 set rlm_param(alpha) 2 set rlm_param(beta) 0.75 set rlm_param(init-tj) 1.5 set rlm_param(init-tj) 10 set rlm_param(init-tj) 5 set rlm_param(init-td) 5 set rlm_param(init-td-var) 2 set rlm_param(max) 600 set rlm_param(max) 60 set rlm_param(g1) 0.25 set rlm_param(g2) 0.25 Class MMG MMG instproc init { levels } { $self next $self instvar debug_ env_ maxlevel_ set debug_ 0 set env_ [lindex [split [$self info class] /] 1] set maxlevel_ $levels global rlm_debug_flag if [info exists rlm_debug_flag] { set debug_ $rlm_debug_flag } $self instvar TD TDVAR state_ subscription_ global rlm_param set TD $rlm_param(init-td) set TDVAR $rlm_param(init-td-var) set state_ /S $self instvar layer_ layers_ set i 1 while { $i <= $maxlevel_ } { set layer_($i) [$self create-layer [expr $i - 1]] lappend layers_ $layer_($i) incr i } set subscription_ 0 $self add-layer set state_ /S $self set_TJ_timer } MMG instproc set-state s { $self instvar state_ set old $state_ set state_ $s $self debug "FSM: $old -> $s" } MMG instproc drop-layer {} { $self dumpLevel $self instvar subscription_ layer_ set n $subscription_ if { $n > 0 } { $self debug "DRP-LAYER $n" $layer_($n) leave-group incr n -1 set subscription_ $n } $self dumpLevel } MMG instproc add-layer {} { $self dumpLevel $self instvar maxlevel_ subscription_ layer_ set n $subscription_ if { $n < $maxlevel_ } { $self debug "ADD-LAYER" incr n set subscription_ $n $layer_($n) join-group } $self dumpLevel } MMG instproc current_layer_getting_packets {} { $self instvar subscription_ layer_ TD set n $subscription_ if { $n == 0 } { return 0 } set l $layer_($subscription_) $self debug "npkts [$l npkts]" if [$l getting-pkts] { return 1 } set delta [expr [$self now] - [$l last-add]] if { $delta > $TD } { set TD [expr 1.2 * $delta] } return 0 } MMG instproc mmg_loss {} { $self instvar layers_ set loss 0 foreach l $layers_ { incr loss [$l nlost] } return $loss } MMG instproc mmg_pkts {} { $self instvar layers_ set npkts 0 foreach l $layers_ { incr npkts [$l npkts] } return $npkts } MMG instproc check-equilibrium {} { global rlm_param $self instvar subscription_ maxlevel_ layer_ set n [expr $subscription_ + 1] if { $n >= $maxlevel_ || [$layer_($n) timer] >= $rlm_param(max) } { set eq 1 } else { set eq 0 } $self debug "EQ $eq" } MMG instproc backoff-one { n alpha } { $self debug "BACKOFF $n by $alpha" $self instvar layer_ $layer_($n) backoff $alpha } MMG instproc backoff n { $self debug "BACKOFF $n" global rlm_param $self instvar maxlevel_ layer_ set alpha $rlm_param(alpha) set L $layer_($n) $L backoff $alpha incr n while { $n <= $maxlevel_ } { $layer_($n) peg-backoff $L incr n } $self check-equilibrium } MMG instproc highest_level_pending {} { $self instvar maxlevel_ set m "" set n 0 incr n while { $n <= $maxlevel_ } { if [$self level_pending $n] { set m $n } incr n } return $m } MMG instproc rlm_update_D D { global rlm_param $self instvar TD TDVAR set v [expr abs($D - $TD)] set TD [expr $TD * (1 - $rlm_param(g1)) \ + $rlm_param(g1) * $D] set TDVAR [expr $TDVAR * (1 - $rlm_param(g2)) \ + $rlm_param(g2) * $v] } MMG instproc exceed_loss_thresh {} { $self instvar h_npkts h_nlost set npkts [expr [$self mmg_pkts] - $h_npkts] if { $npkts >= 10 } { set nloss [expr [$self mmg_loss] - $h_nlost] set loss [expr double($nloss) / ($nloss + $npkts)] $self debug "H-THRESH $nloss $npkts $loss" if { $loss > 0.25 } { return 1 } } return 0 } MMG instproc enter_M {} { $self set-state /M $self set_TD_timer_wait $self instvar h_npkts h_nlost set h_npkts [$self mmg_pkts] set h_nlost [$self mmg_loss] } MMG instproc enter_D {} { $self set-state /D $self set_TD_timer_conservative } MMG instproc enter_H {} { $self set_TD_timer_conservative $self set-state /H } MMG instproc log-loss {} { $self debug "LOSS [$self mmg_loss]" $self instvar state_ subscription_ pending_ts_ if { $state_ == "/M" } { if [$self exceed_loss_thresh] { $self cancel_timer TD $self drop-layer $self check-equilibrium $self enter_D } return } if { $state_ == "/S" } { $self cancel_timer TD set n [$self highest_level_pending] if { $n != "" } { $self backoff $n if { $n == $subscription_ } { set ts $pending_ts_($subscription_) $self rlm_update_D [expr [$self now] - $ts] $self drop-layer $self check-equilibrium $self enter_D return } if { $n == [expr $subscription_ + 1] } { $self cancel_timer TJ $self set_TJ_timer } } if [$self our_level_recently_added] { $self enter_M return } $self enter_H return } if { $state_ == "/H" || $state_ == "/D" } { return } puts stderr "rlm state machine botched" exit -1 } MMG instproc relax_TJ {} { $self instvar subscription_ layer_ if { $subscription_ > 0 } { $layer_($subscription_) relax $self check-equilibrium } } MMG instproc trigger_TD {} { $self instvar state_ if { $state_ == "/H" } { $self enter_M return } if { $state_ == "/D" || $state_ == "/M" } { $self set-state /S $self set_TD_timer_conservative return } if { $state_ == "/S" } { $self relax_TJ $self set_TD_timer_conservative return } puts stderr "trigger_TD: rlm state machine botched $state)" exit -1 } MMG instproc set_TJ_timer {} { global rlm_param $self instvar subscription_ layer_ set n [expr $subscription_ + 1] if ![info exists layer_($n)] { return } set I [$layer_($n) timer] set d [expr $I / 2.0 + [trunc_exponential $I]] $self debug "TJ $d" $self set_timer TJ $d } MMG instproc set_TD_timer_conservative {} { $self instvar TD TDVAR set delay [expr $TD + 1.5 * $TDVAR] $self set_timer TD $delay } MMG instproc set_TD_timer_wait {} { $self instvar TD TDVAR $self instvar subscription_ set k [expr $subscription_ / 2. + 1.5] $self set_timer TD [expr $TD + $k * $TDVAR] } MMG instproc is-recent { ts } { $self instvar TD TDVAR set ts [expr $ts + ($TD + 2 * $TDVAR)] if { $ts > [$self now] } { return 1 } return 0 } MMG instproc level_pending n { $self instvar pending_ts_ if { [info exists pending_ts_($n)] && \ [$self is-recent $pending_ts_($n)] } { return 1 } return 0 } MMG instproc level_recently_joined n { $self instvar join_ts_ if { [info exists join_ts_($n)] && \ [$self is-recent $join_ts_($n)] } { return 1 } return 0 } MMG instproc pending_inferior_jexps {} { set n 0 $self instvar subscription_ while { $n <= $subscription_ } { if [$self level_recently_joined $n] { return 1 } incr n } $self debug "NO-PEND-INF" return 0 } MMG instproc trigger_TJ {} { $self debug "trigger-TJ" $self instvar state_ ctrl_ subscription_ if { ($state_ == "/S" && ![$self pending_inferior_jexps] && \ [$self current_layer_getting_packets]) } { $self add-layer $self check-equilibrium set msg "add $subscription_" $ctrl_ send $msg $self local-join } $self set_TJ_timer } MMG instproc our_level_recently_added {} { $self instvar subscription_ layer_ return [$self is-recent [$layer_($subscription_) last-add]] } MMG instproc recv-ctrl msg { $self instvar join_ts_ pending_ts_ subscription_ $self debug "X-JOIN $msg" set what [lindex $msg 0] if { $what != "add" } { return } set level [lindex $msg 1] set join_ts_($level) [$self now] if { $level > $subscription_ } { set pending_ts_($level) [$self now] } } MMG instproc local-join {} { $self instvar subscription_ pending_ts_ join_ts_ set join_ts_($subscription_) [$self now] set pending_ts_($subscription_) [$self now] } MMG instproc debug { msg } { $self instvar debug_ subscription_ state_ if {$debug_} { puts stderr "[gettimeofday] layer $subscription_ $state_ $msg" } } MMG instproc dumpLevel {} { } Class Layer Layer instproc init { mmg } { $self next $self instvar mmg_ TJ npkts_ global rlm_param set mmg_ $mmg set TJ $rlm_param(init-tj) set npkts_ 0 } Layer instproc relax {} { global rlm_param $self instvar TJ set TJ [expr $TJ * $rlm_param(beta)] if { $TJ <= $rlm_param(init-tj) } { set TJ $rlm_param(init-tj) } } Layer instproc backoff alpha { global rlm_param $self instvar TJ set TJ [expr $TJ * $alpha] if { $TJ >= $rlm_param(max) } { set TJ $rlm_param(max) } } Layer instproc peg-backoff L { $self instvar TJ set t [$L set TJ] if { $t >= $TJ } { set TJ $t } } Layer instproc timer {} { $self instvar TJ return $TJ } Layer instproc last-add {} { $self instvar add_time_ return $add_time_ } Layer instproc join-group {} { $self instvar npkts_ add_time_ mmg_ set npkts_ [$self npkts] set add_time_ [$mmg_ now] } Layer instproc leave-group {} { } Layer instproc getting-pkts {} { $self instvar npkts_ return [expr [$self npkts] != $npkts_] } Agent/LossMonitor set npkts_ 0 Agent/LossMonitor set bytes_ 0 Agent/LossMonitor set nlost_ 0 Agent/LossMonitor set lastPktTime_ 0 Class LossTrace -superclass Agent/LossMonitor LossTrace set expected_ -1 LossTrace instproc init {} { $self next $self instvar lastTime set lastTime 0 } LossTrace instproc log-loss {} { $self instvar mmg_ $mmg_ log-loss global lossTraceFile lossNode if [info exists lossTraceFile] { set id [[$mmg_ node] id] if { [info exists lossNode] && $lossNode != $id } { return } set f $lossTraceFile $self instvar layerNo seqno_ expected_ lastPktTime_ \ lastSeqno lastTime if [info exists lastSeqno] { set npkt [expr $expected_ - $lastSeqno] puts $f "p $id $layerNo $lastTime $lastPktTime_ $npkt" set lastTime $lastPktTime_ } set lost [expr $seqno_ - $expected_] set t [ns-now] puts $f "d $id $layerNo $lastPktTime_ $t $lost" set lastSeqno $seqno_ set lastTime $t } } LossTrace instproc flush {} { global lossTraceFile $self instvar lastSeqno expected_ layerNo lastTime \ lastPktTime_ mmg_ seqno_ if [info exists lastSeqno] { set id [[$mmg_ node] id] set npkt [expr $seqno_ - $lastSeqno] if { $npkt != 0 } { puts $lossTraceFile \ "p $id $layerNo $lastTime $lastPktTime_ $npkt" } unset lastSeqno } } Class Layer/ns -superclass Layer Layer/ns instproc init {ns mmg addr layerNo} { $self next $mmg $self instvar ns_ addr_ mon_ set ns_ $ns set addr_ $addr set mon_ [$ns_ create-agent [$mmg node] LossTrace 0] $mon_ set layerNo $layerNo $mon_ set mmg_ $mmg $mon_ set dst_ $addr } Layer/ns instproc join-group {} { $self instvar mon_ mmg_ addr_ $mon_ clear [$mmg_ node] join-group $mon_ $addr_ $self next } Layer/ns instproc leave-group {} { $self instvar mon_ mmg_ addr_ [$mmg_ node] leave-group $mon_ $addr_ $self next } Layer/ns instproc npkts {} { $self instvar mon_ return [$mon_ set npkts_] } Layer/ns instproc nlost {} { $self instvar mon_ return [$mon_ set nlost_] } Layer/ns instproc mon {} { $self instvar mon_ return $mon_ } Class MMG/ns -superclass MMG MMG/ns instproc init {ns localNode caddr addrs} { $self instvar ns_ node_ addrs_ set ns_ $ns set node_ $localNode set addrs_ $addrs $self next [llength $addrs] $self instvar ctrl_ set ctrl_ [$ns create-agent $node_ Agent/Message 0] $ctrl_ set dst_ $caddr $ctrl_ proc handle msg "$self recv-ctrl \$msg" $node_ join-group $ctrl_ $caddr } MMG/ns instproc create-layer {layerNo} { $self instvar ns_ addrs_ return [new Layer/ns $ns_ $self [lindex $addrs_ $layerNo] $layerNo] } MMG/ns instproc now {} { $self instvar ns_ return [$ns_ now] } MMG/ns instproc set_timer {which delay} { $self instvar ns_ timers_ if [info exists timers_($which)] { puts "timer botched ($which)" exit 1 } set time [expr [$ns_ now] + $delay] set timers_($which) [$ns_ at $time "$self trigger_timer $which"] } MMG/ns instproc trigger_timer {which} { $self instvar timers_ unset timers_($which) $self trigger_$which } MMG/ns instproc cancel_timer {which} { $self instvar ns_ timers_ if [info exists timers_($which)] { $ns_ at $timers_($which) unset timers_($which) } } MMG/ns instproc node {} { $self instvar node_ return $node_ } MMG/ns instproc debug { msg } { $self instvar debug_ if {!$debug_} { return } $self instvar subscription_ state_ node_ set time [format %.05f [ns-now]] puts stderr "$time node [$node_ id] layer $subscription_ $state_ $msg" } MMG/ns instproc trace { trace } { $self instvar layers_ foreach s $layers_ { [$s mon] trace $trace } } MMG/ns instproc total_bytes_delivered {} { $self instvar layers_ set v 0 foreach s $layers_ { incr v [[$s mon] set bytes] } return $v } Class SessionSim -superclass Simulator SessionSim set MixMode_ 0 SessionSim set rc_ 0 SessionSim instproc create-session { srcNode srcAgent } { $self instvar session_ set nid [$srcNode id] set dst [$srcAgent set dst_addr_] set session_($nid:$dst:$nid) [new SessionHelper] $session_($nid:$dst:$nid) set-node $nid if {[SessionSim set rc_]} { $session_($nid:$dst:$nid) set rc_ 1 } set trace [$self get-nam-traceall] if {$trace != ""} { set p [$self create-trace SessEnque $trace $nid $dst "nam"] $srcAgent target $p $p target $session_($nid:$dst:$nid) } else { $srcAgent target $session_($nid:$dst:$nid) } return $session_($nid:$dst:$nid) } SessionSim instproc update-loss-dependency { src dst owner agent group } { $self instvar session_ routingTable_ loss_ set loss_rcv 1 set tmp $dst while {$tmp != $owner} { set next [$routingTable_ lookup $tmp $owner] if {[info exists loss_($next:$tmp)] && $loss_($next:$tmp) != 0} { if {$loss_rcv} { set dep_loss [$session_($src:$group:$owner) update-loss-rcv $loss_($next:$tmp) $agent] } else { set dep_loss [$session_($src:$group:$owner) update-loss-loss $loss_($next:$tmp) $dep_loss] } if {$dep_loss == 0} { return } set loss_rcv 0 } set tmp $next } if [info exists dep_loss] { $session_($src:$group:$owner) update-loss-top $dep_loss } } SessionSim instproc join-group { rcvAgent group } { $self instvar session_ routingTable_ delay_ bw_ foreach index [array names session_] { set tri [split $index :] if {[lindex $tri 1] == $group} { set src [lindex $tri 0] set dst [[$rcvAgent set node_] id] set delay 0 set accu_bw 0 set ttl 0 set tmp $dst while {$tmp != $src} { set next [$routingTable_ lookup $tmp $src] set delay [expr $delay + $delay_($tmp:$next)] if {$accu_bw} { set accu_bw [expr 1 / (1 / $accu_bw + 1 / $bw_($tmp:$next))] } else { set accu_bw $bw_($tmp:$next) } incr ttl set tmp $next } $self puts-nam-config "G -t [$self now] -i $group -a $dst" set f [$self get-nam-traceall] if {$f != ""} { set p [$self create-trace SessDeque $f $src $dst "nam"] $p target $rcvAgent $session_($index) add-dst $accu_bw $delay $ttl $dst $p $self update-loss-dependency $src $dst $src $p $group } else { $session_($index) add-dst $accu_bw $delay $ttl $dst $rcvAgent $self update-loss-dependency $src $dst $src $rcvAgent $group } } } } SessionSim instproc leave-group { rcvAgent group } { $self instvar session_ foreach index [array names session_] { set tri [split $index :] if {[lindex $tri 1] == $group} { set dst [[$rcvAgent set node_] id] $self puts-nam-traceall \ "G -t [$self now] -i $group -x $dst" } } } SessionSim instproc insert-loss { lossmodule from to } { $self instvar loss_ bw_ Node_ if {[SessionSim set MixMode_] && [$self detailed-link? [$from id] [$to id]]} { $self lossmodel $lossmodule $from $to } elseif [info exists bw_([$from id]:[$to id])] { set loss_([$from id]:[$to id]) $lossmodule } } SessionSim instproc get-delay { src dst } { $self instvar routingTable_ delay_ set delay 0 set tmp $src while {$tmp != $dst} { set next [$routingTable_ lookup $tmp $dst] set delay [expr $delay + $delay_($tmp:$next)] set tmp $next } return $delay } SessionSim instproc get-bw { src dst } { $self instvar routingTable_ bw_ set accu_bw 0 set tmp $src while {$tmp != $dst} { set next [$routingTable_ lookup $tmp $dst] if {$accu_bw} { set accu_bw [expr 1 / (1 / $accu_bw + 1 / $bw_($tmp:$next))] } else { set accu_bw $bw_($tmp:$next) } set tmp $next } return $accu_bw } SessionSim instproc node args { $self instvar sessionNode_ if {[llength $args] == 0} { set node [new SessionNode] } else { set node [new SessionNode $args] } set sessionNode_([$node id]) $node $node set ns_ $self return $node } SessionSim instproc simplex-link { n1 n2 bw delay type } { $self instvar bw_ delay_ linkAttr_ set sid [$n1 id] set did [$n2 id] set bw_($sid:$did) [bw_parse $bw] set delay_($sid:$did) [delay_parse $delay] set linkAttr_($sid:$did:ORIENT) "" set linkAttr_($sid:$did:COLOR) "black" } SessionSim instproc duplex-link { n1 n2 bw delay type } { $self simplex-link $n1 $n2 $bw $delay $type $self simplex-link $n2 $n1 $bw $delay $type $self session-register-nam-linkconfig [$n1 id]:[$n2 id] } SessionSim instproc simplex-link-of-interfaces { n1 n2 bw delay type } { $self simplex-link $n1 $n2 $bw $delay $type } SessionSim instproc duplex-link-of-interfaces { n1 n2 bw delay type } { $self simplex-link $n1 $n2 $bw $delay $type $self simplex-link $n2 $n1 $bw $delay $type $self session-register-nam-linkconfig [$n1 id]:[$n2 id] } SessionSim instproc detailed-node { id address } { $self instvar Node_ if { [Simulator info vars EnableMcast_] != "" } { warn "Flag variable Simulator::EnableMcast_ discontinued.\n\t\ Use multicast methods as:\n\t\t\ % set ns \[new Simulator -multicast on]\n\t\t\ % \$ns multicast" $self multicast Simulator unset EnableMcast_ } if ![info exist Node_($id)] { set node [new [Simulator set node_factory_] $address] Node set nn_ [expr [Node set nn_] - 1] $node set id_ $id set Node_($id) $node return $node } else { return $Node_($id) } } SessionSim instproc detailed-duplex-link { from to } { $self instvar bw_ delay_ SessionSim set MixMode_ 1 set fromNode [$self detailed-node [$from id] [$from set address_]] set toNode [$self detailed-node [$to id] [$from set address_]] $self simulator-duplex-link $fromNode $toNode $bw_([$from id]:[$to id]) $delay_([$from id]:[$to id]) DropTail } SessionSim instproc simulator-duplex-link { n1 n2 bw delay type args } { $self instvar link_ set i1 [$n1 id] set i2 [$n2 id] if [info exists link_($i1:$i2)] { $self remove-nam-linkconfig $i1 $i2 } eval $self simulator-simplex-link $n1 $n2 $bw $delay $type $args eval $self simulator-simplex-link $n2 $n1 $bw $delay $type $args } SessionSim instproc simulator-simplex-link { n1 n2 bw delay qtype args } { $self instvar link_ queueMap_ nullAgent_ set sid [$n1 id] set did [$n2 id] if [info exists queueMap_($qtype)] { set qtype $queueMap_($qtype) } set qtypeOrig $qtype switch -exact $qtype { ErrorModule { if { [llength $args] > 0 } { set q [eval new $qtype $args] } else { set q [new $qtype Fid] } } intserv { set qtype [lindex $args 0] set q [new Queue/$qtype] } default { set q [new Queue/$qtype] } } switch -exact $qtypeOrig { RTM { set c [lindex $args 1] set link_($sid:$did) [new CBQLink \ $n1 $n2 $bw $delay $q $c] } CBQ - CBQ/WRR { if {[llength $args] == 0} { set c [new Classifier/Hash/Fid 33] } else { set c [lindex $args 1] } set link_($sid:$did) [new CBQLink \ $n1 $n2 $bw $delay $q $c] } intserv { set link_($sid:$did) [new IntServLink \ $n1 $n2 $bw $delay $q \ [concat $qtypeOrig $args]] } default { set link_($sid:$did) [new SimpleLink \ $n1 $n2 $bw $delay $q] } } $n1 add-neighbor $n2 if {[string first "RED" $qtype] != -1} { $q link [$link_($sid:$did) set link_] } set trace [$self get-ns-traceall] if {$trace != ""} { $self trace-queue $n1 $n2 $trace } set trace [$self get-nam-traceall] if {$trace != ""} { $self namtrace-queue $n1 $n2 $trace } $self register-nam-linkconfig $link_($sid:$did) } SessionSim instproc duplex-link-op { n1 n2 op args } { $self instvar linkAttr_ bw_ set sid [$n1 id] set did [$n2 id] if ![info exists bw_($sid:$did)] { error "Non-existent link [$n1 id]:[$n2 id]" } switch $op { "orient" { set linkAttr_($sid:$did:ORIENT) $args set linkAttr_($did:$sid:ORIENT) $args } "color" { set ns [Simulator instance] $ns puts-nam-traceall \ [eval list "l -t [$self now] -s $sid -d $did \ -S COLOR -c $args -o $linkAttr_($sid:$did:COLOR)"] $ns puts-nam-traceall \ [eval list "l -t [$self now] -s $did -d $sid \ -S COLOR -c $args -o $linkAttr_($sid:$did:COLOR)"] eval set attr_($sid:$did:COLOR) $args eval set attr_($did:$sid:COLOR) $args } default { eval puts "Duplex link option $args not implemented \ in SessionSim" } } } SessionSim instproc session-register-nam-linkconfig link { $self instvar sessionLinkConfigList_ bw_ linkAttr_ if [info exists sessionLinkConfigList_] { set tmp [split $link :] set i1 [lindex $tmp 0] set i2 [lindex $tmp 1] if [info exists bw_($i2:$i1)] { set pos [lsearch $sessionLinkConfigList_ $i2:$i1] if {$pos >= 0} { set a1 $linkAttr_($i2:$i1:ORIENT) set a2 $linkAttr_($link:ORIENT) if {$a1 == "" && $a2 != ""} { set sessionLinkConfigList_ [lreplace $sessionLinkConfigList_ $pos $pos] } else { return } } } set pos [lsearch $sessionLinkConfigList_ $link] if {$pos >= 0} { set sessionLinkConfigList_ \ [lreplace $sessionLinkConfigList_ $pos $pos] } } lappend sessionLinkConfigList_ $link } SessionSim instproc dump-namlinks {} { $self instvar bw_ delay_ sessionLinkConfigList_ linkAttr_ set ns [Simulator instance] foreach lnk $sessionLinkConfigList_ { set tmp [split $lnk :] set i1 [lindex $tmp 0] set i2 [lindex $tmp 1] $ns puts-nam-traceall \ "l -t * -s $i1 -d $i2 -S UP -r $bw_($lnk) -D \ $delay_($lnk) -o $linkAttr_($lnk:ORIENT)" } } SessionSim instproc dump-namnodes {} { $self instvar sessionNode_ if ![$self is-started] { return } foreach nn [array names sessionNode_] { if ![$sessionNode_($nn) is-lan?] { $sessionNode_($nn) dump-namconfig } } } SessionSim instproc compute-routes {} { if [Simulator hier-addr?] { $self compute-hier-routes } else { $self compute-flat-routes } } SessionSim instproc compute-flat-routes {} { $self instvar bw_ set r [$self get-routelogic] foreach ln [array names bw_] { set L [split $ln :] set srcID [lindex $L 0] set dstID [lindex $L 1] if {$bw_($ln) != 0} { $r insert $srcID $dstID } else { $r reset $srcID $dstID } } $r compute } SessionSim instproc compute-hier-routes {} { $self instvar bw_ set r [$self get-routelogic] set level [AddrParams hlevel] $r hlevel-is $level $self hier-topo $r foreach ln [array names bw_] { set L [split $ln :] set srcID [[$self get-node-by-id [lindex $L 0]] node-addr] set dstID [[$self get-node-by-id [lindex $L 1]] node-addr] if { $bw_($ln) != 0 } { $r hier-insert $srcID $dstID } else { $r hier-reset $srcID $dstID } } $r hier-compute } SessionSim instproc compute-algo-routes {} { set r [$self get-routelogic] $r BFS $r compute } SessionSim instproc dump-routelogic-distance {} { $self instvar routingTable_ sessionNode_ bw_ if ![info exists routingTable_] { puts "error: routing table is not computed yet!" return 0 } set n [Node set nn_] set i 0 puts -nonewline "\t" while { $i < $n } { if ![info exists sessionNode_($i)] { incr i continue } puts -nonewline "$i\t" incr i } set i 0 while { $i < $n } { if ![info exists sessionNode_($i)] { incr i continue } puts -nonewline "\n$i\t" set n1 $sessionNode_($i) set j 0 while { $j < $n } { if { $i != $j } { set nh [$routingTable_ lookup $i $j] if { $nh >= 0 } { set distance 0 set tmpfrom $i set tmpto $j while {$tmpfrom != $tmpto} { set tmpnext [$routingTable_ lookup $tmpfrom $tmpto] set distance [expr $distance + 1] set tmpfrom $tmpnext } puts -nonewline "$distance\t" } else { puts -nonewline "0\t" } } else { puts -nonewline "0\t" } incr j } incr i } puts "" } SessionSim instproc run args { $self rtmodel-configure ;# in case there are any [$self get-routelogic] configure $self instvar scheduler_ sessionNode_ started_ set started_ 1 foreach nn [array names sessionNode_] { $sessionNode_($nn) reset } if {[SessionSim set MixMode_]} { foreach nn [array names Node_] { $Node_($nn) reset } } $self dump-namcolors $self dump-namnodes $self dump-namlinks $self dump-namagents return [$scheduler_ run] } SessionSim instproc get-mcast-tree { src grp } { $self instvar treeLinks_ session_ if [info exists treeLinks_] { unset treeLinks_ } set sid [$src id] foreach idx [array names session_] { set tri [split $idx :] if {[lindex $tri 0] == $sid && [lindex $tri 1] == $grp} { set mbrs [$session_($idx) list-mbr] break } } foreach mbr $mbrs { while {![string match "Agent*" [$mbr info class]]} { set mbr [$mbr target] } set mid [[$mbr set node_] id] if {$sid == $mid} { continue } $self merge-path $sid $mid } foreach lnk [array names treeLinks_] { lappend res $lnk $treeLinks_($lnk) } return $res } SessionSim instproc merge-path { src mbr } { $self instvar routingTable_ treeLinks_ bw_ set tmp $mbr while {$tmp != $src} { set nxt [$routingTable_ lookup $tmp $src] if ![info exists treeLinks_($nxt:$tmp)] { set treeLinks_($nxt:$tmp) $bw_($nxt:$tmp) } if [info exists treeLinks_($tmp:$nxt)] { error "Reverse links in a SPT!" } set tmp $nxt } } SessionSim instproc get-node-by-id id { $self instvar sessionNode_ Node_ if [info exists Node_($id)] { set Node_($id) } else { set sessionNode_($id) } } SessionSim instproc get-node-id-by-addr address { $self instvar sessionNode_ set n [Node set nn_] for {set q 0} {$q < $n} {incr q} { set nq $sessionNode_($q) if {[string compare [$nq node-addr] $address] == 0} { return $q } } error "get-node-id-by-addr:Cannot find node with given address" } Class SessionNode -superclass Node SessionNode instproc init args { $self instvar id_ np_ address_ set id_ [Node getid] set np_ 0 if {[llength $args] > 0} { set address_ $args } else { set address_ $id_ } } SessionNode instproc id {} { $self instvar id_ return $id_ } SessionNode instproc reset {} { } SessionNode instproc alloc-port {} { $self instvar np_ set p $np_ incr np_ return $p } SessionNode instproc attach agent { $self instvar id_ address_ $agent set node_ $self set port [$self alloc-port] $agent set agent_addr_ [AddrParams addr2id $address_] $agent set agent_port_ $port } SessionNode instproc join-group { rcvAgent group } { set group [expr $group] if {[SessionSim set MixMode_]} { [Simulator instance] join-intermediate-session $rcvAgent $group } else { [Simulator instance] join-group $rcvAgent $group } } SessionNode instproc leave-group { rcvAgent group } { set group [expr $group] [Simulator instance] leave-group $rcvAgent $group } Agent/LossMonitor instproc show-delay { seqno delay } { $self instvar node_ puts "[$node_ id] $seqno $delay" } SessionSim instproc RPF-link { src from to } { $self instvar routingTable_ link_ if [info exists routingTable_] { set tmp $to while {$tmp != $src} { set reverse [$routingTable_ lookup $tmp $src] if [info exists link_($reverse:$tmp)] { return $link_($reverse:$tmp) } set tmp $reverse } } return "" } SessionSim instproc detailed-link? { from to } { $self instvar link_ return [info exist link_($from:$to)] } SessionSim instproc create-intermediate-session { src group nid } { $self instvar session_ set session_($src:$group:$nid) [new SessionHelper] $session_($src:$group:$nid) set-node $nid if {[SessionSim set rc_]} { $session_($src:$group:$nid) set rc_ 1 } set trace [$self get-nam-traceall] if {$trace != ""} { set p [$self create-trace SessEnque $trace $nid $dst "nam"] $p target $session_($src:$group:$nid) return $p } else { return $session_($src:$group:$nid) } } SessionSim instproc join-intermediate-session { rcvAgent group } { $self instvar session_ routingTable_ delay_ bw_ link_ Node_ dlist_ foreach index [array names session_] { set tri [split $index :] set src [lindex $tri 0] set grp [lindex $tri 1] set owner [lindex $tri 2] if {$grp == $group && $src == $owner} { set session_area 1 set dst [[$rcvAgent set node_] id] set delay 0 set accu_bw 0 set ttl 0 set tmp $dst while {$tmp != $src} { set next [$routingTable_ lookup $tmp $src] if {$session_area} { if [info exist link_($tmp:$next)] { set session_area 0 if ![info exist session_($src:$grp:$tmp)] { set inter_session [$self create-intermediate-session $src $grp $tmp] } else { set inter_session $session_($src:$grp:$tmp) } if {![info exist dlist_($src:$grp:$tmp)] || [lsearch $dlist_($src:$grp:$tmp) $rcvAgent] < 0 } { $inter_session add-dst $accu_bw $delay $ttl $dst $rcvAgent $self update-loss-dependency $src $dst $tmp $rcvAgent $group lappend dlist_($src:$grp:$tmp) $rcvAgent } $Node_($tmp) join-group $inter_session $group } else { set delay [expr $delay + $delay_($tmp:$next)] if {$accu_bw} { set accu_bw [expr 1 / (1 / $accu_bw + 1 / $bw_($tmp:$next))] } else { set accu_bw $bw_($tmp:$next) } incr ttl } } else { if [info exist link_($tmp:$next)] { } else { set session_area 1 set accu_bw $bw_($tmp:$next) set delay $delay_($tmp:$next) set ttl 1 set dst $tmp set rcvAgent [$Node_($tmp) entry] } } set tmp $next } $self puts-nam-config "G -t [$self now] -i $group -a $dst" set f [$self get-nam-traceall] if {$session_area} { if {$f != ""} { set p [$self create-trace SessDeque $f $src $dst "nam"] $p target $rcvAgent if {![info exist dlist_($index)] || [lsearch $dlist_($index) $rcvAgent] < 0 } { $session_($index) add-dst $accu_bw $delay $ttl $dst $p $self update-loss-dependency $src $dst $src $p $group lappend dlist_($index) $rcvAgent } } else { if {![info exist dlist_($index)] || [lsearch $dlist_($index) $rcvAgent] < 0 } { $session_($index) add-dst $accu_bw $delay $ttl $dst $rcvAgent $self update-loss-dependency $src $dst $src $rcvAgent $group lappend dlist_($index) $rcvAgent } } } else { if {$f != ""} { set p [$self create-trace SessDeque $f $src $src "nam"] $p target [$Node_($tmp) entry] if {![info exist dlist_($index)] || [lsearch $dlist_($index) [$Node_($tmp) entry]] < 0 } { $session_($index) add-dst 0 0 0 $src $p $self update-loss-dependency $src $src $src $p $group lappend dlist_($index) [$Node_($tmp) entry] } } else { if {![info exist dlist_($index)] || [lsearch $dlist_($index) [$Node_($tmp) entry]] < 0 } { $session_($index) add-dst 0 0 0 $src [$Node_($tmp) entry] $self update-loss-dependency $src $src $src [$Node_($tmp) entry] $group lappend dlist_($index) [$Node_($tmp) entry] } } } } } } PagePool instproc gen-page { pageid thismod } { set size [$self gen-size $pageid] if {$thismod >= 0} { set age [expr [$self gen-modtime $pageid $thismod] - $thismod] } else { set age -1 } return "size $size age $age modtime $thismod" } Class PagePool/CompMath/noc -superclass PagePool/CompMath PagePool/CompMath/noc instproc gen-page { pageid thismod } { set res [eval $self next $pageid $thismod] if {$pageid == 0} { return "$res noc 1" } else { return $res } } Http/Server instproc init args { eval $self next $args $self instvar node_ stat_ $node_ color "HotPink" array set stat_ [list hit-num 0 mod-num 0 barrival 0] } Http/Server instproc set-page-generator { pagepool } { $self instvar pgtr_ set pgtr_ $pagepool } Http/Server instproc gen-init-modtime { id } { $self instvar pgtr_ ns_ if [info exists pgtr_] { return [$pgtr_ gen-init-modtime $id] } else { return [$ns_ now] } } Http/Server instproc stale-time { pageid modtime } { $self instvar modseq_ modtimes_ ns_ for {set i $modseq_($pageid)} {$i >= 0} {incr i -1} { if {$modtimes_($pageid:$i) <= $modtime} { break } } if {$i < 0} { error "Non-existent modtime $modtime for page $pageid" } set ii [expr $i + 1] set t1 [expr abs($modtimes_($pageid:$i) - $modtime)] set t2 [expr abs($modtimes_($pageid:$ii) - $modtime)] if {$t1 > $t2} { incr ii } return [expr [$ns_ now] - $modtimes_($pageid:$ii)] } Http/Server instproc modify-page { pageid } { $self instvar ns_ id_ stat_ pgtr_ incr stat_(mod-num) set id [lindex [split $pageid :] end] set modtime [$ns_ now] if [info exists pgtr_] { set pginfo [$pgtr_ gen-page $id $modtime] } else { set pginfo "size 2000 age 50 modtime $modtime" } array set data $pginfo set age $data(age) $self schedule-nextmod [expr [$ns_ now] + $age] $pageid eval $self enter-page $pageid $pginfo $ns_ trace-annotate "S $id_ INV $pageid" $self evTrace S MOD p $pageid m [$ns_ now] n [expr [$ns_ now] + $age] $self instvar modtimes_ modseq_ incr modseq_($pageid) set modtimes_($pageid:$modseq_($pageid)) $modtime } Http/Server instproc schedule-nextmod { time pageid } { $self instvar ns_ $ns_ at $time "$self modify-page $pageid" } Http/Server instproc gen-page { pageid } { set pginfo [$self gen-pageinfo $pageid] eval $self enter-page $pageid $pginfo return $pginfo } Http/Server instproc gen-pageinfo { pageid } { $self instvar ns_ pgtr_ if [$self exist-page $pageid] { error "$self: shouldn't use gen-page for existing pages" } set id [lindex [split $pageid :] end] set modtime [$self gen-init-modtime $id] if [info exists pgtr_] { set pginfo [$pgtr_ gen-page $id $modtime] } else { set pginfo "size 2000 age 50 modtime $modtime" } array set data $pginfo set age $data(age) if {$modtime >= 0} { $self schedule-nextmod [expr [$ns_ now] + $age] $pageid } $self evTrace S MOD p $pageid m [$ns_ now] n [expr [$ns_ now] + $age] $self instvar modtimes_ modseq_ set modseq_($pageid) 0 set modtimes_($pageid:0) $modtime return [join $pginfo] } Http/Server instproc disconnect { client } { $self instvar ns_ clist_ node_ set pos [lsearch $clist_ $client] if {$pos >= 0} { lreplace $clist_ $pos $pos } else { error "Http/Server::disconnect: not connected to $server" } set tcp [[$self get-cnc $client] agent] $self cmd disconnect $client $tcp proc done {} "$ns_ detach-agent $node_ $tcp; delete $tcp" $tcp close } Http/Server instproc alloc-connection { client fid } { Http instvar TRANSPORT_ $self instvar ns_ clist_ node_ fid_ lappend clist_ $client set snk [new Agent/TCP/$TRANSPORT_] $snk set fid_ $fid $ns_ attach-agent $node_ $snk $snk listen set wrapper [new Application/TcpApp $snk] $self cmd connect $client $wrapper return $wrapper } Http/Server instproc handle-request-GET { pageid args } { $self instvar ns_ if [$self exist-page $pageid] { set pageinfo [$self get-page $pageid] } else { set pageinfo [$self gen-page $pageid] } lappend res [$self get-size $pageid] eval lappend res $pageinfo } Http/Server instproc handle-request-IMS { pageid args } { array set data $args set mt [$self get-modtime $pageid] if {$mt <= $data(modtime)} { set size [$self get-invsize] set pageinfo \ "size $size modtime $mt time [$self get-cachetime $pageid]" $self evTrace S SND p $pageid m $mt z $size t IMS-NM } else { set size [$self get-size $pageid] set pageinfo [$self get-page $pageid] $self evTrace S SND p $pageid m $mt z $size t IMS-M } lappend res $size eval lappend res $pageinfo return $res } Http/Server instproc get-request { client type pageid args } { $self instvar ns_ id_ stat_ incr stat_(hit-num) array set data $args incr stat_(barrival) $data(size) unset data set res [eval $self handle-request-$type $pageid $args] set size [lindex $res 0] set pageinfo [lrange $res 1 end] $self send $client $size \ "$client get-response-$type $self $pageid $pageinfo" } Http/Server instproc set-parent-cache { cache } { } Class Http/Server/epa -superclass Http/Server Http/Server/epa instproc start-update { interval } { $self instvar pm_itv_ ns_ set pm_itv_ $interval $ns_ at [expr [$ns_ now] + $pm_itv_] "$self modify-page" } Http/Server/epa instproc schedule-nextmod { time pageid } { $self instvar ns_ pm_itv_ $ns_ at [expr [$ns_ now]+$pm_itv_] "$self modify-page $pageid" } Http/Server/epa instproc modify-page args { $self instvar pgtr_ set pageid $self:[$pgtr_ pick-pagemod] eval $self next $pageid } Http/Server/epa instproc gen-pageinfo { pageid } { $self instvar ns_ pgtr_ if [$self exist-page $pageid] { error "$self: shouldn't use gen-page for existing pages" } set id [lindex [split $pageid :] end] set modtime [$self gen-init-modtime $id] if [info exists pgtr_] { set pginfo [$pgtr_ gen-page $id $modtime] } else { set pginfo "size 2000 age 50 modtime $modtime" } array set data $pginfo set age $data(age) $self instvar modtimes_ modseq_ set modseq_($pageid) 0 set modtimes_($pageid:0) $modtime return [join $pginfo] } Http/Server/Inval instproc modify-page { pageid } { $self next $pageid $self instvar ns_ id_ $self invalidate $pageid [$ns_ now] } Http/Server/Inval instproc handle-request-REF { pageid args } { return [eval $self handle-request-GET $pageid $args] } Class Http/Server/Inval/Ucast -superclass Http/Server/Inval Http/Server/Inval/Ucast instproc get-request { client type pageid args } { eval $self next $client $type $pageid $args $self instvar cacheList_ if [info exists cacheList_($pageid)] { set pos [lsearch $cacheList_($pageid) $client] } else { set pos -1 } if {$pos < 0 && [regexp "Cache" [$client info class]]} { lappend cacheList_($pageid) $client } } Http/Server/Inval/Ucast instproc invalidate { pageid modtime } { $self instvar cacheList_ if ![info exists cacheList_($pageid)] { return } foreach c $cacheList_($pageid) { set size [$self get-invsize] set agent [[$self get-cnc $c] agent] set fid [$agent set fid_] $agent_ set fid_ [Http set PINV_FID_] $self send $c $size \ "$c invalidate $pageid $modtime" $agent_ set fid_ $fid $self evTrace S INV p $pageid m $modtime z $size } } Http/Server/Inval/Yuc instproc set-tlc { tlc } { $self instvar tlc_ set tlc_ $tlc } Http/Server/Inval/Yuc instproc get-tlc { tlc } { $self instvar tlc_ return $tlc_ } Http/Server/Inval/Yuc instproc next-hb {} { Http/Server/Inval/Yuc instvar hb_interval_ return [expr $hb_interval_ * [uniform 0.9 1.1]] } Http/Server/Inval/Yuc instproc set-parent-cache { cache } { $self instvar pcache_ set pcache_ $cache $self send $pcache_ [$self get-joinsize] \ "$pcache_ server-join $self $self" Http instvar TRANSPORT_ $self instvar ns_ node_ set tcp [new Agent/TCP/$TRANSPORT_] $tcp set fid_ [Http set HB_FID_] $ns_ attach-agent $node_ $tcp set dst [$pcache_ setup-unicast-hb] set snk [$dst agent] $ns_ connect $tcp $snk $tcp set window_ 100 set wrapper [new Application/TcpApp/HttpInval $tcp] $wrapper connect $dst $wrapper set-app $self $self add-inval-sender $wrapper $self instvar ns_ $ns_ at [expr [$ns_ now] + [$self next-hb]] "$self heartbeat" } Http/Server/Inval/Yuc instproc heartbeat {} { $self instvar pcache_ ns_ $self cmd send-hb $ns_ at [expr [$ns_ now] + [$self next-hb]] \ "$self heartbeat" } Http/Server/Inval/Yuc instproc get-request { cl type pageid args } { eval $self next $cl $type $pageid $args if {($type == "GET") || ($type == "REF")} { $self count-request $pageid } } Http/Server/Inval/Yuc instproc invalidate { pageid modtime } { $self instvar pcache_ id_ enable_upd_ if ![info exists pcache_] { error "Server $id_ doesn't have a parent cache!" } $self count-inval $pageid if [$self is-pushable $pageid] { $self push-page $pageid $modtime return } $self cmd add-inv $pageid $modtime $self evTrace S INV p $pageid m $modtime } Http/Server/Inval/Yuc instproc push-page { pageid modtime } { $self instvar pcache_ id_ if ![info exists pcache_] { error "Server $id_ doesn't have a parent cache!" } set size [$self get-size $pageid] set pageinfo [$self get-page $pageid] set agent [[$self get-cnc $pcache_] agent] set fid [$agent set fid_] $agent set fid_ [Http set PINV_FID_] $self send $pcache_ $size \ "$pcache_ push-update $pageid $pageinfo" $agent set fid_ $fid $self evTrace S UPD p $pageid m $modtime z $size } Http/Server/Inval/Yuc instproc get-req-notify { pageid } { $self count-request $pageid } Http/Server/Inval/Yuc instproc handle-request-TLC { pageid args } { $self instvar tlc_ array set data $args lappend res $data(size) ;# Same size of queries lappend res $tlc_ return $res } Class Http/Server/Compound -superclass Http/Server Class Http/Server/Inval/MYuc -superclass \ { Http/Server/Inval/Yuc Http/Server/Compound} Http/Cache instproc init args { eval $self next $args $self instvar node_ stat_ $node_ color "yellow" ;# no page array set stat_ [list hit-num 0 barrival 0 ims-num 0] } Http instproc set-cachesize { size } { $self instvar pool_ $pool_ set max_size_ $size } Http instproc get-cachesize {} { $self instvar pool_ return [$pool_ set max_size_] } Http/Cache instproc connect { server } { $self next $server } Http/Cache instproc disconnect { http } { $self instvar slist_ clist_ if [$http info class Http/Cache] { error "Cannot disconnect a cache from another cache" } if {[lsearch $slist_ $http] >= 0} { $self disconnect-server $http } else { $self disconnect-client $http } } Http/Cache instproc disconnect-server { server } { $self instvar ns_ slist_ node_ set pos [lsearch $slist_ $server] if {$pos >= 0} { lreplace $slist_ $pos $pos } else { error "Http::disconnect: not connected to $server" } set tcp [[$self get-cnc $server] agent] $self cmd disconnect $server $server disconnect $self $tcp proc done {} "$ns_ detach-agent $node_ $tcp; delete $tcp" $tcp close $self instvar pending_ foreach p [array names pending_] { if {$server == [lindex [split $p :] 0]} { unset pending_($p) } } } Http/Cache instproc disconnect-client { client } { $self instvar ns_ clist_ node_ set pos [lsearch $clist_ $client] if {$pos >= 0} { lreplace $clist_ $pos $pos } else { error "Http/Cache::disconnect: not connected to $server" } set tcp [[$self get-cnc $client] agent] $self cmd disconnect $client $tcp proc done {} "$ns_ detach-agent $node_ $tcp; delete $tcp" $tcp close $self instvar creq_ foreach p [array names creq_] { set res {} for {set i 0} {$i < [llength $creq_($p)]} {incr i} { set clt [lindex $creq_($p) $i] if {$client != [lindex [split clt /] 0]} { lappend res $clt } } if {[llength $res] == 0} { unset creq_($p) } else { set creq_($p) $res } } } Http/Cache instproc set-parent { server } { $self instvar parent_ set parent_ $server } Http/Cache instproc alloc-connection { client fid } { Http instvar TRANSPORT_ $self instvar ns_ clist_ node_ id_ fid_ lappend clist_ $client set snk [new Agent/TCP/$TRANSPORT_] $snk set fid_ $fid $ns_ attach-agent $node_ $snk $snk listen set wrapper [new Application/TcpApp $snk] $self cmd connect $client $wrapper return $wrapper } Http/Cache instproc send-request { server type pageid size args } { $self instvar ns_ pending_ ;# pending requests, includes those ;# from itself if ![$self is-connected $server] { return } set pending_($pageid) [$ns_ now] $self send $server $size \ "$server get-request $self $type $pageid size $size [join $args]" } Http/Cache instproc get-request { cl type pageid args } { $self instvar slist_ clist_ ns_ id_ pending_ stat_ incr stat_(hit-num) array set data $args if ![info exists data(size)] { error "Http/Cache $id_: client [$cl id] must include request size in its request" } if [$self exist-page $pageid] { $self cache-hit $cl $type $pageid } else { $self cache-miss $cl $type $pageid } } Http/Cache instproc cache-miss { cl type pageid } { $self instvar parent_ pending_ \ creq_ ;# pending client requests lappend creq_($pageid) $cl/$type if [info exists pending_($pageid)] { return } set server [lindex [split $pageid :] 0] if [info exists parent_] { set server $parent_ } set size [$self get-reqsize] $self evTrace E MISS p $pageid c [$cl id] s [$server id] z $size $self send-request $server $type $pageid $size } Http/Cache instproc is-consistent { cl type pageid } { return 1 } Http/Cache instproc refetch-pending { cl type pageid } { return 0 } Http/Cache instproc refetch args { } Http/Cache instproc cache-hit { cl type pageid } { if ![$self is-consistent $cl $type $pageid] { if ![$self refetch-pending $cl $type $pageid] { $self refetch $cl $type $pageid } return } set server [lindex [split $pageid :] 0] $self evTrace E HIT p $pageid c [$cl id] s [$server id] eval $self answer-request-$type $cl $pageid [$self get-page $pageid] } Http/Cache instproc get-response-GET { server pageid args } { array set data $args if ![info exists data(noc)] { if ![$self exist-page $pageid] { eval $self enter-page $pageid $args $self evTrace E ENT p $pageid m $data(modtime) \ z $data(size) s [$server id] } else { $self instvar id_ ns_ puts stderr "At [$ns_ now], cache $id_ has requested a page which it already has." } } eval $self answer-pending-requests $pageid $args $self instvar stat_ incr stat_(barrival) $data(size) $self instvar node_ $node_ color "blue" ;# valid page } Http/Cache instproc answer-pending-requests { pageid args } { $self instvar creq_ pending_ array set data $args if [info exists creq_($pageid)] { foreach clt $creq_($pageid) { set tmp [split $clt /] set cl [lindex $tmp 0] set type [lindex $tmp 1] eval $self answer-request-$type $cl $pageid $args } unset creq_($pageid) unset pending_($pageid) } else { unset pending_($pageid) } } Http/Cache instproc answer-request-GET { cl pageid args } { array set data $args $self send $cl $data(size) \ "$cl get-response-GET $self $pageid $args" $self evTrace E SND c [$cl id] p $pageid z $data(size) } Class Http/Cache/TTL -superclass Http/Cache Http/Cache/TTL set updateThreshold_ 0.1 Http/Cache/TTL instproc init args { eval $self next $args $self instvar thresh_ set thresh_ [Http/Cache/TTL set updateThreshold_] } Http/Cache/TTL instproc set-thresh { th } { $self instvar thresh_ set thresh_ $th } Http/Cache/TTL instproc answer-request-IMS { client pageid args } { if ![$self exist-page $pageid] { error "At [$ns_ now], cache [$self id] gets an IMS of a non-cacheable page." } set mt [$self get-modtime $pageid] if ![$client exist-page $pageid] { error "client [$client id] IMS a page which it doesn't have" } if {$mt < [$client get-modtime $pageid]} { error "client [$client id] IMS a newer page" } if {$mt > [$client get-modtime $pageid]} { set pginfo [$self get-page $pageid] set size [$self get-size $pageid] } else { set size [$self get-invsize] set pginfo "size $size modtime $mt time [$self get-cachetime $pageid]" } $self evTrace E SND c [$client id] t IMS z $size $self send $client $size \ "$client get-response-IMS $self $pageid $pginfo" } Http/Cache/TTL instproc get-response-IMS { server pageid args } { $self instvar ns_ array set data $args if {$data(modtime) > [$self get-modtime $pageid]} { eval $self enter-page $pageid $args $self evTrace E ENT p $pageid m [$self get-modtime $pageid] \ z [$self get-size $pageid] s [$server id] $self set-cachetime $pageid $data(time) } else { $self set-cachetime $pageid [$ns_ now] } eval $self answer-pending-requests $pageid [$self get-page $pageid] $self instvar stat_ incr stat_(barrival) $data(size) } Http/Cache/TTL instproc is-expired { pageid } { $self instvar thresh_ ns_ set cktime [expr [$ns_ now] - [$self get-cachetime $pageid]] set age [expr ([$ns_ now] - [$self get-modtime $pageid]) * $thresh_] if {$cktime <= $age} { return 0 } return 1 } Http/Cache/TTL instproc is-consistent { cl type pageid } { return ![$self is-expired $pageid] } Http/Cache/TTL instproc refetch-pending { cl type pageid } { $self instvar creq_ if [info exists creq_($pageid)] { if [regexp $cl:* $creq_($pageid)] { return 1 } lappend creq_($pageid) $cl/$type return 1 } lappend creq_($pageid) $cl/$type return 0 } Http/Cache/TTL instproc refetch { cl type pageid } { $self instvar parent_ set server [lindex [split $pageid :] 0] set size [$self get-imssize] if [info exists parent_] { set server $parent_ } $self instvar stat_ incr stat_(ims-num) $self evTrace E IMS p $pageid c [$cl id] s [$server id] z $size \ t [$self get-cachetime $pageid] m [$self get-modtime $pageid] $self send-request $server IMS $pageid $size \ modtime [$self get-modtime $pageid] return 0 } Class Http/Cache/TTL/Plain -superclass Http/Cache/TTL Http/Cache/TTL/Plain set updateThreshold_ 100 Http/Cache/TTL/Plain instproc init { args } { eval $self next $args $self instvar thresh_ set thresh_ [[$self info class] set updateThreshold_] } Http/Cache/TTL/Plain instproc is-expired { pageid } { $self instvar ns_ thresh_ set cktime [expr [$ns_ now] - [$self get-cachetime $pageid]] if {$cktime < $thresh_} { return 0 } return 1 } Class Http/Cache/TTL/Omniscient -superclass Http/Cache/TTL Http/Cache/TTL/Omniscient instproc is-expired { pageid } { $self instvar ns_ set nmt [expr [$self get-modtime $pageid] + [$self get-age $pageid]] if {[$ns_ now] >= $nmt} { return 1 } return 0 } Http/Cache/Inval instproc mark-invalid {} { $self instvar node_ $node_ color "red" } Http/Cache/Inval instproc mark-valid {} { $self instvar node_ $node_ color "blue" } Http/Cache/Inval instproc mark-leave {} { $self instvar node_ $node_ add-mark down "cyan" } Http/Cache/Inval instproc mark-rejoin {} { $self instvar node_ $node_ delete-mark down } Http/Cache/Inval instproc answer-request-REF { cl pageid args } { if ![$self exist-page $pageid] { error "At [$ns_ now], cache [$self id] gets a REF of a non-cacheable page." } set pginfo [$self get-page $pageid] set size [$self get-size $pageid] $self evTrace E SND c [$cl id] t REF p $pageid z $size $self send $cl $size \ "$cl get-response-REF $self $pageid $pginfo" } Http/Cache/Inval instproc get-response-GET { server pageid args } { set sid [[lindex [split $pageid :] 0] id] set cid [$server id] $self check-sstate $sid $cid eval $self next $server $pageid $args } Http/Cache/Inval instproc get-response-REF { server pageid args } { $self instvar creq_ id_ set sid [[lindex [split $pageid :] 0] id] set cid [$server id] $self check-sstate $sid $cid array set data $args if {[$self get-modtime $pageid] > $data(modtime)} { puts stderr "At [$ns_ now], cache $self ($id_) refetched an old page\ $pageid ($data(modtime), new time [$self get-modtime $pageid])\ from [$server id]" } else { eval $self enter-page $pageid $args $self evTrace E UPD p $pageid m [$self get-modtime $pageid] \ z [$self get-size $pageid] s [$server id] } eval $self answer-pending-requests $pageid [$self get-page $pageid] $self instvar node_ marks_ ns_ set mk [lindex $marks_($pageid) 0] $node_ delete-mark $mk set marks_($pageid) [lreplace $marks_($pageid) 0 0] $node_ color "blue" } Http/Cache/Inval instproc is-consistent { cl type pageid } { return [$self is-valid $pageid] } Http/Cache/Inval instproc refetch-pending { cl type pageid } { $self instvar creq_ if [info exists creq_($pageid)] { if [regexp $cl:* $creq_($pageid)] { return 1 } lappend creq_($pageid) $cl/$type return 1 } lappend creq_($pageid) $cl/$type return 0 } Http/Cache/Inval instproc refetch { cl type pageid } { $self instvar parent_ set size [$self get-refsize] set server [lindex [split $pageid :] 0] if [info exists parent_] { set par $parent_ } else { set par $server } $self evTrace E REF p $pageid s [$server id] z $size $self send-request $par REF $pageid $size $self instvar node_ marks_ ns_ lappend marks_($pageid) $pageid:[$ns_ now] $node_ add-mark $pageid:[$ns_ now] "brown" } Http/Cache/Inval/Mcast instproc init args { eval $self next $args $self add-to-map } Http/Cache/Inval/Mcast instproc get-response-GET { server pageid args } { eval $self next $server $pageid $args set sid [[lindex [split $pageid :] 0] id] set cid [$server id] $self register-server $cid $sid } Http/Cache/Inval/Mcast instproc set-parent { parent } { $self next $parent $self cmd set-parent $parent } Http/Cache/Inval/Mcast instproc join-inval-group { group } { $self instvar invalListener_ invListenGroup_ ns_ node_ if [info exists invalListener_] { return } set invalListener_ [new Agent/HttpInval] set invListenGroup_ $group $invalListener_ set dst_addr_ $group $invalListener_ set dst_port_ 0 $self add-inval-listener $invalListener_ $ns_ attach-agent $node_ $invalListener_ $node_ join-group $invalListener_ $group } Http/Cache/Inval/Mcast instproc init-inval-group { group } { $self instvar invalSender_ invSndGroup_ ns_ node_ if [info exists invalSender_] { return } set invalSender_ [new Agent/HttpInval] set invSndGroup_ $group $invalSender_ set dst_addr_ $group $invalSender_ set dst_port_ 0 $self add-inval-sender $invalSender_ $ns_ attach-agent $node_ $invalSender_ $node_ join-group $invalSender_ $group $self start-hbtimer } Http/Cache/Inval/Mcast instproc parent-cache { server } { $self instvar parent_ set par [$self cmd parent-cache [$server id]] if {$par == ""} { if [info exists parent_] { set par $parent_ } else { set par $server } } return $par } Http/Cache/Inval/Mcast instproc refetch { cl type pageid } { set size [$self get-refsize] set server [lindex [split $pageid :] 0] set par [$self parent-cache $server] $self evTrace E REF p $pageid s [$server id] z $size $self send-request $par REF $pageid $size $self instvar node_ marks_ ns_ lappend marks_($pageid) $pageid:[$ns_ now] $node_ add-mark $pageid:[$ns_ now] "brown" } Http/Cache/Inval/Mcast instproc cache-miss { cl type pageid } { $self instvar parent_ pending_ creq_ ;# pending client requests lappend creq_($pageid) $cl/$type if [info exists pending_($pageid)] { return } set size [$self get-reqsize] set server [lindex [split $pageid :] 0] $self evTrace E MISS p $pageid c [$cl id] s [$server id] z $size set par [$self cmd parent-cache [$server id]] if {$par == ""} { if [info exists parent_] { set par $parent_ } else { $self instvar ns_ id_ $self send-request $server TLC $pageid $size return } } $self send-request $par $type $pageid $size } Http/Cache/Inval/Mcast instproc invalidate { pageid modtime } { if [$self recv-inv $pageid $modtime] { $self instvar parent_ if ![info exists parent_] { return } set size [$self get-invsize] $self evTrace E SND t INV c [$parent_ id] p $pageid z $size set agent [[$self get-cnc $parent_] agent] set fid [$agent set fid_] $agent set fid_ [Http set PINV_FID_] $self send $parent_ $size \ "$parent_ invalidate $pageid $modtime" $agent set fid_ $fid } } Http/Cache/Inval/Mcast instproc get-request { cl type pageid args } { eval $self next $cl $type $pageid $args if {(($type == "GET") || ($type == "REF")) && \ [$self exist-page $pageid]} { $self count-request $pageid if [$self is-unread $pageid] { $self send-req-notify $pageid $self set-read $pageid } } } Http/Cache/Inval/Mcast instproc get-req-notify { pageid } { $self count-request $pageid if [$self is-unread $pageid] { $self set-read $pageid $self send-req-notify $pageid } } Http/Cache/Inval/Mcast instproc send-req-notify { pageid } { set server [lindex [split $pageid :] 0] set par [$self parent-cache $server] $self send $par [$self get-ntfsize] "$par get-req-notify $pageid" } Http/Cache/Inval/Mcast instproc push-update { pageid args } { if [eval $self recv-push $pageid $args] { $self instvar parent_ if [info exists parent_] { set pginfo [$self get-page $pageid] set size [$self get-size $pageid] $self evTrace E UPD c [$parent_ id] p $pageid z $size $self send $parent_ $size \ "$parent_ push-update $pageid $pginfo" } $self push-children $pageid } } Http/Cache/Inval/Mcast instproc init-update-group { group } { $self instvar ns_ node_ updSender_ updSendGroup_ set snd [new Agent/HttpInval] $snd set dst_addr_ $group $snd set dst_port_ 0 $self add-upd-sender $snd $ns_ attach-agent $node_ $snd $node_ join-group $snd $group } Http/Cache/Inval/Mcast instproc join-update-group { group } { $self instvar updListener_ updListenGroup_ ns_ node_ set updListenGroup_ $group if ![info exists updListener_] { set updListener_ [new Agent/HttpInval] $self add-upd-listener $updListener_ $updListener_ set dst_addr_ $updListenGroup_ $updListener_ set dst_port_ 0 $ns_ attach-agent $node_ $updListener_ } $node_ join-group $updListener_ $updListenGroup_ } Http/Cache/Inval/Mcast instproc leave-update-group {} { $self instvar updListener_ updListenGroup_ ns_ node_ if ![info exists updListener_] { return } $node_ leave-group $updListener_ $updListenGroup_ $node_ delete-mark "Updating" } Http/Cache/Inval/Mcast instproc setup-unicast-hb {} { Http instvar TRANSPORT_ $self instvar node_ ns_ set snk [new Agent/TCP/$TRANSPORT_] $snk set fid_ [Http set HB_FID_] $ns_ attach-agent $node_ $snk $snk listen set wrapper [new Application/TcpApp/HttpInval $snk] $wrapper set-app $self return $wrapper } Http/Cache/Inval/Mcast instproc server-join { server cache } { $self cmd join [$server id] $cache $self instvar parent_ if ![info exists parent_] { return } $self send $parent_ [$self get-joinsize] \ "$parent_ server-join $server $self" Http instvar TRANSPORT_ $self instvar ns_ node_ set tcp [new Agent/TCP/$TRANSPORT_] $tcp set fid_ [Http set HB_FID_] $ns_ attach-agent $node_ $tcp set dst [$parent_ setup-unicast-hb] set snk [$dst agent] $ns_ connect $tcp $snk $tcp set window_ 100 set wrapper [new Application/TcpApp/HttpInval $tcp] $wrapper connect $dst $wrapper set-app $self $self set-pinv-agent $wrapper $self start-hbtimer } Http/Cache/Inval/Mcast instproc request-mpush { page } { $self instvar mpush_refresh_ ns_ hb_interval_ if [info exists mpush_refresh_($page)] { return } $self set-mandatory-push $page set server [lindex [split $page :] 0] set cache [$self parent-cache $server] set mpush_refresh_($page) [$ns_ at [expr [$ns_ now] + $hb_interval_] \ "$self send-refresh-mpush $cache $page"] $self send $cache [$self get-mpusize] "$cache request-mpush $page" } Http/Cache/Inval/Mcast instproc refresh-mpush { page } { $self cmd set-mandatory-push $page } Http/Cache/Inval/Mcast instproc send-refresh-mpush { cache page } { $self instvar mpush_refresh_ ns_ hb_interval_ $self send $cache [$self get-mpusize] "$cache refresh-mpush $page" set mpush_refresh_($page) [$ns_ at [expr [$ns_ now] + $hb_interval_] \ "$self send-refresh-mpush $cache $page"] } Http/Cache/Inval/Mcast instproc cancel-mpush-refresh { page } { $self instvar mpush_refresh_ ns_ if [info exists mpush_refresh_($page)] { $ns_ cancel $mpush_refresh_($page) } else { error "Cache [$self id]: No mpush to stop!" } } Http/Cache/Inval/Mcast instproc stop-mpush { page } { $self cancel-mpush-refresh $page $self cmd stop-mpush $page set server [lindex [split $page :] 0] set cache [$self parent-cache $server] $self send $cache [$self get-mpusize] "$cache stop-mpush $page" } Http/Cache/Inval/Mcast instproc join-tlc-group { group } { $self instvar tlcAgent_ tlcGroup_ ns_ node_ if [info exists tlcAgent_] { return } set tlcAgent_ [new Agent/HttpInval] set tlcGroup_ $group $tlcAgent_ set dst_addr_ $group $tlcAgent_ set dst_port_ 0 $self add-inval-sender $tlcAgent_ $self add-inval-listener $tlcAgent_ $ns_ attach-agent $node_ $tlcAgent_ $node_ join-group $tlcAgent_ $group } Http/Cache/Inval/Mcast instproc get-response-TLC { server pageid tlc } { $self register-server [$tlc id] [$server id] $self instvar ns_ id_ $self send-request $tlc GET $pageid [$self get-reqsize] } Http/Cache/Inval/Mcast/Perc instproc check-sstate {sid cid} { $self instvar direct_request_ if !$direct_request_ { $self cmd check-sstate $sid $cid } } Http/Cache/Inval/Mcast/Perc instproc register-server {cid sid} { $self instvar parent_ direct_request_ if {$direct_request_ && [info exists parent_]} { $self cmd register-server [$parent_ id] $sid } } Http/Cache/Inval/Mcast/Perc instproc cache-miss { cl type pageid } { $self instvar direct_request_ if !$direct_request_ { $self next $cl $type $pageid return } $self instvar parent_ pending_ creq_ ;# pending client requests $self instvar dreq_ ;# pending direct requests lappend creq_($pageid) $cl/$type if [info exists pending_($pageid)] { return } $self instvar dreq_ set dreq_($pageid) 1 set server [lindex [split $pageid :] 0] set size [$self get-reqsize] $self evTrace E MISS p $pageid c [$cl id] s [$server id] z $size $self send-request $server $type $pageid $size } Http/Cache/Inval/Mcast/Perc instproc refetch { cl type pageid } { $self instvar direct_request_ if !$direct_request_ { $self next $cl $type $pageid return } $self instvar dreq_ set dreq_($pageid) 1 set size [$self get-refsize] set server [lindex [split $pageid :] 0] $self evTrace E REF p $pageid s [$server id] z $size $self send-request $server REF $pageid $size $self instvar node_ marks_ ns_ lappend marks_($pageid) $pageid:[$ns_ now] $node_ add-mark $pageid:[$ns_ now] "brown" } Http/Cache/Inval/Mcast/Perc instproc get-response-GET { server pageid args } { eval $self next $server $pageid $args $self instvar dreq_ if [info exists dreq_($pageid)] { eval $self send-proforma $pageid $args unset dreq_($pageid) } } Http/Cache/Inval/Mcast/Perc instproc get-response-REF { server pageid args } { eval $self next $server $pageid $args $self instvar dreq_ if [info exists dreq_($pageid)] { eval $self send-proforma $pageid $args unset dreq_($pageid) } } Http/Cache/Inval/Mcast/Perc instproc send-proforma { pageid args } { set server [lindex [split $pageid :] 0] set par [$self parent-cache $server] if {$par == $server} { return } elseif {$par == ""} { set par [$server get-tlc] } $self send $par [$self get-pfsize] \ "$par recv-proforma $self $pageid [join $args]" $self evTrace E SPF p $pageid c [$par id] } Http/Cache/Inval/Mcast/Perc instproc get-response-IMS { server pageid args } { $self instvar ns_ array set data $args if {$data(modtime) <= [$self get-modtime $pageid]} { return } $self invalidate $pageid eval $self enter-page $pageid $args $self mark-valid } Http/Cache/Inval/Mcast/Perc instproc mark-valid-hdr {} { $self instvar node_ $node_ color "orange" } Http/Cache/Inval/Mcast/Perc instproc recv-proforma { cache pageid args } { $self instvar stat_ incr stat_(hit-num) $self evTrace E RPF p $pageid c [$cache id] array set data $args if ![$self exist-page $pageid] { eval $self enter-metadata $pageid $args $self mark-valid-hdr set server [lindex [split $pageid :] 0] set par [$self parent-cache $server] if {$par == $server} { $self send-request $par IMS $pageid \ [$self get-imssize] modtime $data(modtime) } else { eval $self send-proforma $pageid $args } } elseif [$self is-valid $pageid] { set mt [$self get-modtime $pageid] if {$data(modtime) < $mt} { $self recv-inv $pageid $data(modtime) return } elseif {$data(modtime) > $mt} { $self recv-inv $pageid $data(modtime) eval $self enter-metadata $pageid $args $self mark-valid-hdr eval $self send-proforma $pageid $args } $self count-request $pageid if [$self is-unread $pageid] { $self set-read $pageid } } else { array set data $args set mt [$self get-modtime $pageid] if {$data(modtime) < $mt} { return } eval $self enter-metadata $pageid $args $self mark-valid-hdr eval $self send-proforma $pageid $args } } Http set id_ 0 ;# required by TclCL Http set TRANSPORT_ FullTcp Http set HB_FID_ 40 Http set PINV_FID_ 41 Http set INVSize_ 43 ;# unicast invalidation Http set REQSize_ 43 ;# Request Http set REFSize_ 50 ;# Refetch request Http set IMSSize_ 50 ;# If-Modified-Since Http set JOINSize_ 10 ;# Server join/leave Http set HBSize_ 1 ;# Used by Http/Server/Inval only Http set PFSize_ 1 ;# Pro forma Http set NTFSize_ 10 ;# Request Notification Http set MPUSize_ 10 ;# Mandatory push request Http/Server set id_ 0 Http/Server/Inval set id_ 0 Http/Server/Inval/Yuc set hb_interval_ 60 Http/Server/Inval/Yuc set enable_upd_ 0 Http/Server/Inval/Yuc set Ca_ 1 Http/Server/Inval/Yuc set Cb_ 4 Http/Server/Inval/Yuc set push_thresh_ 4 Http/Server/Inval/Yuc set push_low_bound_ 0 Http/Server/Inval/Yuc set push_high_bound_ 8 Http/Cache set id_ 0 Http/Cache/Inval set id_ 0 Http/Cache/Inval/Mcast set hb_interval_ 60 Http/Cache/Inval/Mcast set upd_interval_ 5 Http/Cache/Inval/Mcast set enable_upd_ 0 Http/Cache/Inval/Mcast set Ca_ 1 Http/Cache/Inval/Mcast set Cb_ 4 Http/Cache/Inval/Mcast set push_thresh_ 4 Http/Cache/Inval/Mcast set push_low_bound_ 0 Http/Cache/Inval/Mcast set push_high_bound_ 8 Http/Cache/Inval/Mcast/Perc set direct_request_ 0 PagePool/CompMath set num_pages_ 1 PagePool/CompMath set main_size_ 1024 PagePool/CompMath set comp_size_ 10240 Http set MEDIA_TRANSPORT_ RAP Http set MEDIA_APP_ MediaApp Application/MediaApp set segmentSize_ 1024 Application/MediaApp set MAX_LAYER_ 10 Application/MediaApp/QA set LAYERBW_ 2500 ;# Byte per-second Application/MediaApp/QA set MAXACTIVELAYERS_ 10 Application/MediaApp/QA set SRTTWEIGHT_ 0.95 Application/MediaApp/QA set SMOOTHFACTOR_ 4 Application/MediaApp/QA set MAXBKOFF_ 100 Application/MediaApp/QA set debug_output_ 0 Application/MediaApp/QA set pref_srtt_ 0.6 PagePool/Client/Media set max_size_ 104857600 Http instproc init { ns node } { $self next $self instvar ns_ node_ id_ pool_ set ns_ $ns set node_ $node $self set id_ [$node_ id] set pool_ [$self create-pagepool] } Http instproc create-pagepool {} { set pool [new PagePool/Client] $self set-pagepool $pool return $pool } Http instproc addr {} { $self instvar node_ return [$node_ node-addr] } Http set fid_ -1 Http instproc getfid {} { $self instvar fid_ set fid_ [Http set fid_] Http set fid_ [incr fid_] } Http instproc get-mpusize {} { return [Http set MPUSize_] } Http instproc get-ntfsize {} { return [Http set NTFSize_] } Http instproc get-pfsize {} { return [Http set PFSize_] } Http instproc get-hbsize {} { return [Http set HBSize_] } Http instproc get-imssize {} { return [Http set IMSSize_] } Http instproc get-invsize {} { return [Http set INVSize_] } Http instproc get-reqsize {} { return [Http set REQSize_] } Http instproc get-refsize {} { return [Http set REFSize_] } Http instproc get-joinsize {} { return [Http set JOINSize_] } Http instproc connect { server } { Http instvar TRANSPORT_ $self instvar ns_ slist_ node_ fid_ id_ lappend slist_ $server set tcp [new Agent/TCP/$TRANSPORT_] $tcp set fid_ [$self getfid] $ns_ attach-agent $node_ $tcp set ret [$server alloc-connection $self $fid_] set snk [$ret agent] $ns_ connect $tcp $snk $tcp set window_ 100 set wrapper [new Application/TcpApp $tcp] $self cmd connect $server $wrapper $wrapper connect $ret } Http instproc stat { name } { $self instvar stat_ return $stat_($name) } Http/Client set hb_interval_ 60 Http/Client instproc init args { eval $self next $args $self instvar node_ stat_ $node_ color "SteelBlue" array set stat_ [list req-num 0 stale-num 0 stale-time 0 rep-time 0 \ rt-min 987654321 rt-max 0 st-min 987654321 st-max 0] } Http/Client instproc disconnect { server } { $self instvar ns_ slist_ set pos [lsearch $slist_ $server] if {$pos >= 0} { lreplace $slist_ $pos $pos } else { error "Http::disconnect: not connected to $server" } $self instvar ns_ node_ cache_ $self stop-session $server set tcp [[$self get-cnc $server] agent] $self cmd disconnect $server $server disconnect $self $tcp proc done {} "$ns_ detach-agent $node_ $tcp; delete $tcp" $tcp close } Http/Client instproc send-request { server type pageid args } { $self instvar ns_ pending_ ;# unansewered requests if ![$self cmd is-connected $server] { return } if ![info exists pending_($pageid)] { lappend pending_($pageid) [$ns_ now] } else { return } set size [$self get-reqsize] $self send $server $size \ "$server get-request $self $type $pageid size $size [join $args]" $self evTrace C GET p $pageid s [$server id] z $size $self instvar stat_ simStartTime_ if [info exists simStartTime_] { incr stat_(req-num) } $self mark-request $pageid } Http/Client instproc mark-request { pageid } { $self instvar node_ marks_ ns_ $node_ add-mark $pageid:[$ns_ now] "purple" lappend marks_($pageid) $pageid:[$ns_ now] } Http/Client instproc get-response-GET { server pageid args } { $self instvar pending_ id_ ns_ stat_ simStartTime_ if ![info exists pending_($pageid)] { error "Client $id_: Unrequested response page $pageid from server [$server id]" } array set data $args set origsvr [lindex [split $pageid :] 0] set modtime [$origsvr get-modtime $pageid] set reqtime [lindex $pending_($pageid) 0] set reqrtt [expr [$ns_ now] - $reqtime] if {$modtime > $data(modtime)} { set tmp [$origsvr stale-time $pageid $data(modtime)] if {$tmp > $reqrtt/2} { $self evTrace C STA p $pageid s [$origsvr id] l $tmp if [info exists simStartTime_] { incr stat_(stale-num) set stat_(stale-time) [expr \ $stat_(stale-time) + $tmp] if {$stat_(st-min) > $tmp} { set stat_(st-min) $tmp } if {$stat_(st-max) < $tmp} { set stat_(st-max) $tmp } } } } $self evTrace C RCV p $pageid s [$server id] l $reqrtt z $data(size) if [info exists simStartTime_] { set stat_(rep-time) [expr $stat_(rep-time) + $reqrtt] if {$stat_(rt-min) > $reqrtt} { set stat_(rt-min) $reqrtt } if {$stat_(rt-max) < $reqrtt} { set stat_(rt-max) $reqrtt } } set pending_($pageid) [lreplace $pending_($pageid) 0 0] if {[llength $pending_($pageid)] == 0} { unset pending_($pageid) } $self mark-response $pageid } Http/Client instproc mark-response { pageid } { $self instvar node_ marks_ ns_ set mk [lindex $marks_($pageid) 0] $node_ delete-mark $mk set marks_($pageid) [lreplace $marks_($pageid) 0 0] } Http/Client instproc get-response-REF { server pageid args } { eval $self get-response-GET $server $pageid $args } Http/Client instproc get-response-IMS { server pageid args } { eval $self get-response-GET $server $pageid $args } Http/Client instproc set-page-generator { pagepool } { $self instvar pgtr_ ;# Page generator set pgtr_ $pagepool } Http/Client instproc set-interval-generator { ranvar } { $self instvar rvInterPage_ set rvInterPage_ $ranvar } Http/Client instproc gen-request {} { $self instvar pgtr_ rvInterPage_ id_ if ![info exists pgtr_] { error "Http/Client requires a page generator (pgtr_)!" } if [info exists rvInterPage_] { return [list [$rvInterPage_ value] [$pgtr_ gen-pageid $id_]] } else { return [$pgtr_ gen-request $id_] } } Http/Client instproc next-request { server pageid } { $self instvar ns_ cache_ nextreq_ if [info exists cache_] { $self send-request $cache_ GET $pageid } else { $self send-request $server GET $pageid } set req [$self gen-request] set pageid $server:[lindex $req 1] set itvl [lindex $req 0] if {$itvl >= 0} { set nextreq_([$server id]) [$ns_ at [expr [$ns_ now] + $itvl] \ "$self next-request $server $pageid"] } ;# otherwise it's the end of the request stream } Http/Client instproc set-cache { cache } { $self instvar cache_ set cache_ $cache } Http/Client instproc start-session { cache server } { $self instvar ns_ cache_ simStartTime_ $self instvar simStartTime_ pgtr_ set simStartTime_ [$ns_ now] if [info exists pgtr_] { if {[$pgtr_ get-start-time] > $simStartTime_} { $pgtr_ set-start-time $simStartTime_ } } set cache_ $cache set req [$self gen-request] set pageid $server:[lindex $req 1] set itvl [lindex $req 0] if {$itvl >= 0} { $ns_ at [expr [$ns_ now] + $itvl] \ "$self next-request $server $pageid" } ;# otherwise it's the end of the request stream } Http/Client instproc stop-session { server } { $self instvar ns_ nextreq_ pending_ cache_ set sid [$server id] if [info exists nextreq_($sid)] { $ns_ cancel $nextreq_($sid) } if {![info exists pending_]} { return } if {[info exists cache_] && ($server == $cache_)} { unset pending_ } else { foreach p [array names pending_] { if {$server == [lindex [split $p :] 0]} { unset pending_($p) } } } } Http/Client instproc populate { cache server } { $self instvar pgtr_ curpage_ status_ ns_ if ![info exists status_] { set status_ "POPULATE" set curpage_ 0 } if [info exists pgtr_] { if {$curpage_ < [$pgtr_ get-poolsize]} { $self send-request $cache GET $server:$curpage_ incr curpage_ $ns_ at [expr [$ns_ now] + 1] \ "$self populate $cache $server" return } } $ns_ at [expr [$ns_ now] + 10] "$self start-session $cache $server" } Http/Client instproc start { cache server } { $self instvar cache_ set cache_ $cache $self populate $cache $server } Http/Client instproc request-mpush { page } { $self instvar mpush_refresh_ ns_ cache_ $self send $cache_ [$self get-mpusize] \ "$cache_ request-mpush $page" Http/Client instvar hb_interval_ set mpush_refresh_($page) [$ns_ at [expr [$ns_ now] + $hb_interval_] \ "$self send-refresh-mpush $page"] } Http/Client instproc send-refresh-mpush { page } { $self instvar mpush_refresh_ ns_ cache_ $self send $cache_ [$self get-mpusize] "$cache_ refresh-mpush $page" Http/Client instvar hb_interval_ set mpush_refresh_($page) [$ns_ at [expr [$ns_ now] + $hb_interval_] \ "$self send-refresh-mpush $page"] } Http/Client instproc stop-mpush { page } { $self instvar mpush_refresh_ ns_ cache_ if [info exists mpush_refresh_($page)] { $ns_ cancel $mpush_refresh_($page) } else { error "no mpush to cancel!" } $self send $cache_ [$self get-mpusize] "$cache_ stop-mpush $page" } Class Http/Client/Compound -superclass Http/Client Http/Client/Compound instproc set-interobj-generator { ranvar } { $self instvar rvInterObj_ set rvInterObj_ $ranvar } Http/Client/Compound instproc next-request { server pageid } { eval $self next $server $pageid } Http/Client/Compound instproc next-obj { server args } { $self instvar pgtr_ cache_ req_objs_ ns_ rvInterObj_ if ![llength $args] { return } if [info exists cache_] { set dest $cache_ } else { set dest $server } set pageid [lindex $args 0] set mpgid [$pgtr_ get-mainpage $pageid] ;# main page id set max 0 set origsvr [lindex [split $pageid :] 0] foreach pageid $args { set id [lindex [split $pageid :] 1] if {$max < $id} { set max $id } incr req_objs_($mpgid) -1 $self send-request $dest GET $pageid } if {$req_objs_($mpgid) <= 0} { return } set objid [join [$pgtr_ get-next-objs $origsvr:$max]] puts "At [$ns_ now], client [$self id] get objs $objid" if [info exists rvInterObj_] { $ns_ at [expr [$ns_ now] + [$rvInterObj_ value]] \ "$self next-obj $server $objid" } else { $self next-obj $server $objid } } Http/Client/Compound instproc get-response-GET { server pageid args } { $self instvar pending_ id_ ns_ recv_objs_ max_stale_ stat_ \ simStartTime_ pgtr_ if ![info exists pending_($pageid)] { error "Client $id_: Unrequested response page $pageid from server/cache [$server id]" } if [$pgtr_ is-mainpage $pageid] { set mpgid $pageid $self instvar req_objs_ recv_objs_ rvInterObj_ set recv_objs_($pageid) [$pgtr_ get-obj-num $pageid] set req_objs_($pageid) $recv_objs_($pageid) set objid [join [$pgtr_ get-next-objs $pageid]] if [info exists rvInterObj_] { $ns_ at [expr [$ns_ now] + [$rvInterObj_ value]] \ "$self next-obj $server $objid" } else { eval $self next-obj $server $objid } } else { set mpgid [$pgtr_ get-mainpage $pageid] } array set data $args set origsvr [lindex [split $pageid :] 0] set modtime [$origsvr get-modtime $pageid] set reqtime [lindex $pending_($pageid) 0] set reqrtt [expr [$ns_ now] - $reqtime] if {$modtime > $data(modtime)} { $self instvar ns_ set tmp [$origsvr stale-time $pageid $data(modtime)] if {$tmp > $reqrtt/2} { if ![info exists max_stale_($mpgid)] { set max_stale_($mpgid) $tmp } elseif {$max_stale_($mpgid) < $tmp} { set max_stale_($mpgid) $tmp } } } if [$pgtr_ is-mainpage $pageid] { return } $self evTrace C RCV p $pageid s [$server id] l $reqrtt z $data(size) unset pending_($pageid) incr recv_objs_($mpgid) -1 if {$recv_objs_($mpgid) > 0} { return } $self instvar pgtr_ set reqtime [lindex $pending_($mpgid) 0] $self evTrace C RCV p $mpgid s [$origsvr id] l \ [expr [$ns_ now] - $reqtime] z $data(size) unset pending_($mpgid) if [info exists simStartTime_] { set tmp [expr [$ns_ now] - $reqtime] set stat_(rep-time) [expr $stat_(rep-time) + $tmp] if {$stat_(rt-min) > $tmp} { set stat_(rt-min) $tmp } if {$stat_(rt-max) < $tmp} { set stat_(rt-max) $tmp } unset tmp } if [info exists max_stale_($mpgid)] { $self evTrace C STA p $mpgid s [$origsvr id] \ l $max_stale_($mpgid) if [info exists simStartTime_] { incr stat_(stale-num) set stat_(stale-time) [expr \ $stat_(stale-time) + $max_stale_($mpgid)] if {$stat_(st-min) > $max_stale_($mpgid)} { set stat_(st-min) $max_stale_($mpgid) } if {$stat_(st-max) < $max_stale_($mpgid)} { set stat_(st-max) $max_stale_($mpgid) } } unset max_stale_($mpgid) } $self mark-response $mpgid } Http/Client/Compound instproc mark-request { pageid } { set id [lindex [split $pageid :] end] if {$id == 0} { $self next $pageid } } Http/Client/Media instproc create-pagepool {} { set pool [new PagePool/Client/Media] $self set-pagepool $pool return $pool } Http/Client/Media instproc get-response-GET { server pageid args } { eval $self next $server $pageid $args if [$self exist-page $pageid] { error "Http/Client/Media: receives an \"active\" page!" } eval $self enter-page $pageid $args array set data $args if {[info exists data(pgtype)] && ($data(pgtype) == "MEDIA")} { $self media-connect $server $pageid } } Http/Client/Media instproc send-request { server type pageid args } { $self instvar mmapp_ if [info exists mmapp_($pageid)] { return } eval $self next $server $type $pageid $args } Http/Client/Media instproc media-connect { server pageid } { $self instvar mmapp_ ns_ node_ Http instvar MEDIA_TRANSPORT_ MEDIA_APP_ if [info exists mmapp_($pageid)] { puts "Media client [$self id] got a request for an existing stream" return } set agent [new Agent/$MEDIA_TRANSPORT_] $ns_ attach-agent $node_ $agent set app [new Application/$MEDIA_APP_ $pageid] $app attach-agent $agent $app target $self $server alloc-mcon $self $pageid $agent set mmapp_($pageid) $app $app set-layer [$self get-layer $pageid] } Http/Client/Media instproc media-disconnect { server pageid } { $self instvar mmapp_ ns_ node_ if {![info exists mmapp_($pageid)]} { error "Media client [$self id] disconnect: not connected to \ server [$server id] with page $pageid" } set app $mmapp_($pageid) set agent [$app agent] $ns_ detach-agent $node_ $agent $server media-disconnect $self $pageid delete $agent delete $app unset mmapp_($pageid) $self stream-received $pageid } Http/Server/Media instproc gen-page { pageid } { $self instvar pgtr_ set pginfo [$self next $pageid] if [$pgtr_ is-media-page $pageid] { return [lappend pginfo pgtype MEDIA] } else { return $pginfo } } Http/Server/Media instproc create-pagepool {} { set pool [new PagePool/Client/Media] $self set-pagepool $pool $pool set max_size_ 2147483647 return $pool } Http/Server/Media instproc medialog-on {} { $self instvar MediaLog_ set MediaLog_ 1 } Http/Server/Media instproc alloc-mcon { client pageid dst_agent } { $self instvar ns_ node_ mmapp_ Http instvar MEDIA_TRANSPORT_ MEDIA_APP_ set agent [new Agent/$MEDIA_TRANSPORT_] $ns_ attach-agent $node_ $agent set app [new Application/$MEDIA_APP_ $pageid] $app attach-agent $agent $app target $self set mmapp_($client/$pageid) $app $app set-layer [$self get-layer $pageid] $self register-client $app $client $pageid $self instvar MediaLog_ if [info exists MediaLog_] { set lf [$self log] if {$lf != ""} { $app log $lf } } $ns_ connect $agent $dst_agent $agent start } Http/Server/Media instproc media-disconnect { client pageid } { $self instvar mmapp_ ns_ node_ if {![info exists mmapp_($client/$pageid)]} { error "Media server [$self id] disconnect: not connected to \ client [$client id] with page $pageid" } set app $mmapp_($client/$pageid) set agent [$app agent] $ns_ detach-agent $node_ $agent $self unregister-client $app $client $pageid delete $agent delete $app unset mmapp_($client/$pageid) } Http/Server/Media instproc finish-stream { app } { $self instvar mmapp_ foreach n [array names mmapp_] { if {$mmapp_($n) == $app} { set tmp [split $n /] set client [lindex $tmp 0] set pageid [lindex $tmp 1] $self send $client [$self get-reqsize] \ "$client media-disconnect $self $pageid" return } } } Http/Server/Media instproc handle-request-GET { pageid args } { set pginfo [eval $self next $pageid $args] if {[$self get-pagetype $pageid] == "MEDIA"} { set pginfo [lreplace $pginfo 0 0 [$self get-reqsize]] } return $pginfo } Http/Server/Media instproc gen-pageinfo { pageid } { set pginfo [eval $self next $pageid] $self instvar pgtr_ if [$pgtr_ is-media-page $pageid] { return [lappend pginfo pgtype MEDIA layer \ [$pgtr_ get-layer $pageid]] } else { return $pginfo } } Http/Server/Media instproc get-request { client type pageid args } { if {$type == "PREFSEG"} { set pagenum [lindex [split $pageid :] 1] set conid [lindex $args 0] set layer [lindex $args 1] set seglist [lrange $args 2 end] eval $self register-prefetch $client $pagenum $conid \ $layer $seglist $client start-prefetch $self $pageid $conid $self evTrace S PREF p $pageid l $layer [join $seglist] } elseif {$type == "STOPPREF"} { set pagenum [lindex [split $pageid :] 1] set conid [lindex $args 0] if [$self stop-prefetching $client $conid $pagenum] { $client media-disconnect $self $pageid $conid } } elseif {$type == "OFFLPREF"} { if ![$self exist-page $pageid] { error "Server [$self id] offline-prefetch non-existent page $pageid!" } set size [$self get-size $pageid] $self send $client $size "$client offline-complete $pageid" } else { eval $self next $client $type $pageid $args } } Http/Cache/Media instproc create-pagepool {} { set pool [new PagePool/Client/Media] $self set-pagepool $pool return $pool } Http/Cache/Media instproc start-prefetch { server pageid conid } { $self instvar pref_ ns_ if [info exists pref_($server/$pageid)] { if {[lsearch -exact $pref_($server/$pageid) $conid] == -1} { lappend pref_($server/$pageid) $conid } return } else { lappend pref_($server/$pageid) $conid } Http instvar MEDIA_APP_ set oldapp $MEDIA_APP_ set oldipg [Agent/RAP set ipg_] set oldsrtt [Agent/RAP set srtt_] Agent/RAP set ipg_ 0.01 Agent/RAP set srtt_ 0.01 set MEDIA_APP_ MediaApp $self media-connect $server $pageid set MEDIA_APP_ $oldapp Agent/RAP set ipg_ $oldipg Agent/RAP set srtt_ $oldsrtt } Http/Cache/Media instproc media-connect { server pageid } { $self instvar s_mmapp_ ns_ node_ Http instvar MEDIA_TRANSPORT_ MEDIA_APP_ if [info exists s_mmapp_($server/$pageid)] { error "Media client [$self id] got a request for an existing \ stream" } set agent [new Agent/$MEDIA_TRANSPORT_] $ns_ attach-agent $node_ $agent set app [new Application/$MEDIA_APP_ $pageid] $app attach-agent $agent $app target $self $server alloc-mcon $self $pageid $agent set s_mmapp_($server/$pageid) $app $app set-layer [$self get-layer $pageid] } Http/Cache/Media instproc alloc-mcon { client pageid dst_agent } { $self instvar ns_ node_ c_mmapp_ Http instvar MEDIA_TRANSPORT_ MEDIA_APP_ if [info exists c_mmapp_($client/$pageid)] { error "Media cache [$self id] got a request for an existing \ stream $pageid from client [$client id]" } set agent [new Agent/$MEDIA_TRANSPORT_] $ns_ attach-agent $node_ $agent set app [new Application/$MEDIA_APP_ $pageid] $app attach-agent $agent $app target $self set c_mmapp_($client/$pageid) $app $app set-layer [$self get-layer $pageid] $self register-client $app $client $pageid $self instvar MediaLog_ if [info exists MediaLog_] { set lf [$self log] if {$lf != ""} { $app log $lf } } $ns_ connect $agent $dst_agent $agent start } Http/Cache/Media instproc medialog-on {} { $self instvar MediaLog_ set MediaLog_ 1 } Http/Cache/Media instproc media-disconnect { host pageid args } { $self instvar c_mmapp_ s_mmapp_ ns_ node_ pref_ c_tbt_ set cntdisco 0 set svrdisco 0 set server [lindex [split $pageid :] 0] if {($host != $server) && [info exists c_mmapp_($host/$pageid)]} { set app $c_mmapp_($host/$pageid) set agent [$app agent] $ns_ detach-agent $node_ $agent $self unregister-client $app $host $pageid if {[info exists pref_($server/$pageid)] && \ [lsearch -exact $pref_($server/$pageid) $app] != -1} { $self send $server [$self get-reqsize] "$server get-request $self STOPPREF $pageid $app" set c_tbt_($host/$pageid) $app $app stop } else { delete $app } delete $agent unset c_mmapp_($host/$pageid) $self instvar pool_ foreach p [lsort [$pool_ list-pages]] { $self dump-page $p } set cntdisco 1 } elseif [info exists s_mmapp_($host/$pageid)] { set svrdisco 1 if [info exists pref_($server/$pageid)] { set teardown 0 set conid [lindex $args 0] set pos [lsearch -exact $pref_($server/$pageid) $conid] if {$pos == -1} { error "media-disconnect cannot find $conid!!" } set pref_($server/$pageid) [lreplace \ $pref_($server/$pageid) $pos $pos] if {[llength $pref_($server/$pageid)] == 0} { $self evTrace E STP s [$server id] p $pageid unset pref_($server/$pageid) set teardown 1 } delete $conid } else { set teardown 1 } if {$teardown} { set app $s_mmapp_($host/$pageid) set agent [$app agent] $ns_ detach-agent $node_ $agent $host media-disconnect $self $pageid delete $agent delete $app unset s_mmapp_($host/$pageid) } $self instvar firstreq_ if {([$self get-pref-style] == "OFFLINE_PREF") && \ [info exists firstreq_($pageid)]} { $self send $server [$self get-reqsize] \ "$server get-request $self OFFLPREF $pageid" } if [info exists firstreq_($pageid)] { unset firstreq_($pageid) } } else { error "At [$ns_ now] Media cache [$self id] tries to \ disconnect from a non-connected host [$host id]" } if {$svrdisco == 1} { $self stream-received $pageid } } Http/Cache/Media instproc finish-stream { app } { $self instvar c_mmapp_ s_mmapp_ foreach n [array names c_mmapp_] { if {$c_mmapp_($n) == $app} { set tmp [split $n /] set client [lindex $tmp 0] set pageid [lindex $tmp 1] $self send $client [$self get-reqsize] \ "$client media-disconnect $self $pageid" return } } } Http/Cache/Media instproc get-response-GET { server pageid args } { $self instvar firstreq_ if ![$self exist-page $pageid] { set firstreq_($pageid) 1 } eval $self next $server $pageid $args array set data $args if {[info exists data(pgtype)] && ($data(pgtype) == "MEDIA")} { $self media-connect $server $pageid } } Http/Cache/Media instproc answer-request-GET { cl pageid args } { array set data $args if {[info exists data(pgtype)] && ($data(pgtype) == "MEDIA")} { set size [$self get-reqsize] } else { set size $data(size) } $self send $cl $size \ "$cl get-response-GET $self $pageid $args" $self evTrace E SND c [$cl id] p $pageid z $data(size) } Http/Cache/Media instproc pref-segment {conid pageid layer args} { set server [lindex [split $pageid :] 0] set size [$self get-reqsize] $self send $server $size "$server get-request $self PREFSEG \ $pageid $conid $layer [join $args]" } Http/Cache/Media instproc set-repl-style { style } { $self instvar pool_ $pool_ set-repl-style $style } PagePool/WebTraf set debug_ false PagePool/WebTraf set TCPTYPE_ Reno PagePool/WebTraf set TCPSINKTYPE_ TCPSink ;#required for SACK1 Sinks. PagePool/WebTraf set FID_ASSIGNING_MODE_ 0 PagePool/WebTraf set VERBOSE_ 0 PagePool/WebTraf instproc launch-req { id clnt svr ctcp csnk stcp ssnk size } { set ns [Simulator instance] $ns attach-agent $svr $stcp $ns attach-agent $clnt $ssnk $ns connect $stcp $ssnk $ns attach-agent $clnt $ctcp $ns attach-agent $svr $csnk $ns connect $ctcp $csnk if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} { $stcp set fid_ $id $ctcp set fid_ $id } $ctcp proc done {} "$self done-req $id $clnt $svr $ctcp $csnk $stcp $size" $stcp proc done {} "$self done-resp $id $clnt $svr $stcp $ssnk $size [$ns now] [$stcp set fid_]" $ctcp advanceby 1 } PagePool/WebTraf instproc done-req { id clnt svr ctcp csnk stcp size } { set ns [Simulator instance] $ns detach-agent $clnt $ctcp $ns detach-agent $svr $csnk $ctcp reset $csnk reset $self recycle $ctcp $csnk $stcp advanceby $size } PagePool/WebTraf instproc done-resp { id clnt svr stcp ssnk size {startTime 0} {fid 0}} { set ns [Simulator instance] if {[PagePool/WebTraf set VERBOSE_] == 1} { puts "done-resp - $id [$svr id] [$clnt id] $size $startTime [$ns now] $fid" } $ns detach-agent $clnt $ssnk $ns detach-agent $svr $stcp $stcp reset $ssnk reset $self recycle $stcp $ssnk } PagePool/WebTraf instproc alloc-tcp {} { set tcp [new Agent/TCP/[PagePool/WebTraf set TCPTYPE_]] set fidMode [PagePool/WebTraf set FID_ASSIGNING_MODE_] if {$fidMode == 1} { $self instvar maxFid_ $tcp set fid_ $maxFid_ incr maxFid_ } elseif {$fidMode == 2} { $self instvar sameFid_ $tcp set fid_ $sameFid_ } return $tcp } PagePool/WebTraf instproc alloc-tcp-sink {} { return [new Agent/[PagePool/WebTraf set TCPSINKTYPE_]] } Node instproc shape { shape } { $self instvar attr_ set attr_(SHAPE) $shape } Node instproc get-shape {} { $self instvar attr_ if [info exists attr_(SHAPE)] { return $attr_(SHAPE) } else { return "" } } Node instproc color { color } { $self instvar attr_ id_ set ns [Simulator instance] if [$ns is-started] { $ns puts-nam-config \ [eval list "n -t [$ns now] -s $id_ -S COLOR -c $color -o $attr_(COLOR) -i $color -I $attr_(LCOLOR)"] set attr_(COLOR) $color set attr_(LCOLOR) $color } else { set attr_(COLOR) $color set attr_(LCOLOR) $color } } Node instproc label { str} { $self instvar attr_ id_ set ns [Simulator instance] if [info exists attr_(DLABEL)] { $ns puts-nam-config "n -t [$ns now] -s $id_ -S DLABEL -l \"$str\" -L $attr_(DLABEL)" } else { $ns puts-nam-config "n -t [$ns now] -s $id_ -S DLABEL -l \"$str\" -L \"\"" } set attr_(DLABEL) \"$str\" } Node instproc label-color { str} { $self instvar attr_ id_ set ns [Simulator instance] if [info exists attr_(DCOLOR)] { $ns puts-nam-config "n -t [$ns now] -s $id_ -S DCOLOR -e \"$str\" -E $attr_(DCOLOR)" } else { $ns puts-nam-config "n -t [$ns now] -s $id_ -S DCOLOR -e \"$str\" -E \"\"" } set attr_(DCOLOR) \"$str\" } Node instproc label-at { str } { $self instvar attr_ id_ set ns [Simulator instance] if [info exists attr_(DIRECTION)] { $ns puts-nam-config "n -t [$ns now] -s $id_ -S DIRECTION -p \"$str\" -P $attr_(DIRECTION)" } else { $ns puts-nam-config "n -t [$ns now] -s $id_ -S DIRECTION -p \"$str\" -P \"\"" } set attr_(DIRECTION) \"$str\" } Node instproc dump-namconfig {} { $self instvar attr_ id_ address_ set ns [Simulator instance] if ![info exists attr_(SHAPE)] { set attr_(SHAPE) "circle" } if ![info exists attr_(COLOR)] { set attr_(COLOR) "black" set attr_(LCOLOR) "black" } if ![info exists attr_(DCOLOR)] { set attr_(DCOLOR) "black" } $ns puts-nam-config \ [eval list "n -t * -a $address_ -s $id_ -S UP -v $attr_(SHAPE) -c $attr_(COLOR) -i $attr_(LCOLOR)"] } Node instproc change-color { color } { puts "Warning: Node::change-color is obsolete. Use Node::color instead" $self color $color } Node instproc get-attribute { name } { $self instvar attr_ if [info exists attr_($name)] { return $attr_($name) } else { return "" } } Node instproc get-color {} { puts "Warning: Node::get-color is obsolete. Please use Node::get-attribute" return [$self get-attribute "COLOR"] } Node instproc add-mark { name color {shape "circle"} } { $self instvar id_ markColor_ shape_ set ns [Simulator instance] $ns puts-nam-config "m -t [$ns now] -s $id_ -n $name -c $color -h $shape" set markColor_($name) $color set shape_($name) $shape } Node instproc delete-mark { name } { $self instvar id_ markColor_ shape_ if ![info exists markColor_($name)] { return } set ns [Simulator instance] $ns puts-nam-config \ "m -t [$ns now] -s $id_ -n $name -c $markColor_($name) -h $shape_($name) -X" } SimpleLink instproc dump-namconfig {} { $self instvar link_ attr_ fromNode_ toNode_ if ![info exists attr_(COLOR)] { set attr_(COLOR) "black" } if ![info exists attr_(ORIENTATION)] { set attr_(ORIENTATION) "" } set ns [Simulator instance] set bw [$link_ set bandwidth_] set delay [$link_ set delay_] $ns puts-nam-config \ "l -t * -s [$fromNode_ id] -d [$toNode_ id] -S UP -r $bw -D $delay -c $attr_(COLOR) -o $attr_(ORIENTATION)" } Link instproc dump-nam-queueconfig {} { $self instvar attr_ fromNode_ toNode_ if ![info exists attr_(COLOR)] { set attr_(COLOR) "black" } set ns [Simulator instance] if [info exists attr_(QUEUE_POS)] { $ns puts-nam-config "q -t * -s [$fromNode_ id] -d [$toNode_ id] -a $attr_(QUEUE_POS)" } else { set attr_(QUEUE_POS) "" } } Link instproc orient { ori } { $self instvar attr_ set attr_(ORIENTATION) $ori [Simulator instance] register-nam-linkconfig $self } Link instproc get-attribute { name } { $self instvar attr_ if [info exists attr_($name)] { return $attr_($name) } else { return "" } } Link instproc queuePos { pos } { $self instvar attr_ set attr_(QUEUE_POS) $pos } Link instproc color { color } { $self instvar attr_ fromNode_ toNode_ trace_ set ns [Simulator instance] if [$ns is-started] { $ns puts-nam-config \ [eval list "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S COLOR -c $color -o $attr_(COLOR)"] set attr_(COLOR) $color } else { set attr_(COLOR) $color } } Link instproc change-color { color } { puts "Warning: Link::change-color is obsolete. Please use Link::color." $self color $color } Link instproc get-color {} { puts "Warning: Node::get-color is obsolete. Please use Node::get-attribute" return [$self get-attribute "COLOR"] } Link instproc label { label } { $self instvar attr_ fromNode_ toNode_ trace_ set ns [Simulator instance] if [info exists attr_(DLABEL)] { $ns puts-nam-config \ "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DLABEL -l \"$label\" -L $attr_(DLABEL)" } else { $ns puts-nam-config \ "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DLABEL -l \"$label\" -L \"\"" } set attr_(DLABEL) \"$label\" } Link instproc label-color { str } { $self instvar attr_ fromNode_ toNode_ trace_ set ns [Simulator instance] if [info exists attr_(DCOLOR)] { $ns puts-nam-config \ "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DCOLOR -e \"$str\" -E $attr_(DCOLOR)" } else { $ns puts-nam-config \ "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DCOLOR -e \"$str\" -E \"\"" } set attr_(DCOLOR) \"$str\" } Link instproc label-at { str } { $self instvar attr_ fromNode_ toNode_ trace_ set ns [Simulator instance] if [info exists attr_(DIRECTION)] { $ns puts-nam-config \ "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DIRECTION -p \"$str\" -P $attr_(DIRECTION)" } else { $ns puts-nam-config \ "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DIRECTION -p \"$str\" -P \"\"" } set attr_(DIRECTION) \"$str\" } Simulator instproc snapshot { } { set ns [Simulator instance] $ns puts-nam-config \ "v -t [$self now] take_snapshot" } Simulator instproc rewind-nam { } { set ns [Simulator instance] $ns puts-nam-config \ "v -t [$self now] playing_backward" } Simulator instproc re-rewind-nam { } { set ns [Simulator instance] $ns puts-nam-config \ "v -t [$self now] playing_forward" } Simulator instproc terminate-nam { } { set ns [Simulator instance] $ns puts-nam-config \ "v -t [$self now] terminating_nam" } Simulator instproc add-agent-trace { agent name {f ""} } { $self instvar tracedAgents_ set tracedAgents_($name) $agent set trace [$self get-nam-traceall] if {$f != ""} { $agent attach-trace $f } elseif {$trace != ""} { $agent attach-trace $trace } } Simulator instproc delete-agent-trace { agent } { $agent delete-agent-trace } Simulator instproc monitor-agent-trace { agent } { $self instvar monitoredAgents_ lappend monitoredAgents_ $agent } Agent instproc attach-trace { file } { $self instvar namTrace_ set namTrace_ $file $self attach $file } Simulator instproc dump-namagents {} { $self instvar tracedAgents_ monitoredAgents_ if {![$self is-started]} { return } if [info exists tracedAgents_] { foreach id [array names tracedAgents_] { $tracedAgents_($id) add-agent-trace $id $tracedAgents_($id) cmd dump-namtracedvars } unset tracedAgents_ } if [info exists monitoredAgents_] { foreach a $monitoredAgents_ { $a show-monitor } unset monitoredAgents_ } } Simulator instproc dump-namversion { v } { $self puts-nam-config "V -t * -v $v -a 0" } Simulator instproc dump-namcolors {} { $self instvar color_ if ![$self is-started] { return } foreach id [array names color_] { $self puts-nam-config "c -t * -i $id -n $color_($id)" } } Simulator instproc dump-namlans {} { if ![$self is-started] { return } $self instvar Node_ foreach nn [array names Node_] { if [$Node_($nn) is-lan?] { $Node_($nn) dump-namconfig } } } Simulator instproc dump-namlinks {} { $self instvar linkConfigList_ if ![$self is-started] { return } if [info exists linkConfigList_] { foreach lnk $linkConfigList_ { $lnk dump-namconfig } unset linkConfigList_ } } Simulator instproc dump-namnodes {} { $self instvar Node_ if ![$self is-started] { return } foreach nn [array names Node_] { if ![$Node_($nn) is-lan?] { $Node_($nn) dump-namconfig } } } Simulator instproc dump-namqueues {} { $self instvar link_ if ![$self is-started] { return } foreach qn [array names link_] { $link_($qn) dump-nam-queueconfig } } Simulator instproc dump-namaddress {} { $self puts-nam-config \ "A -t * -n [AddrParams hlevel] -p 0 -o [AddrParams set \ ALL_BITS_SET] -c [AddrParams McastShift] -a [AddrParams McastMask]" for {set i 1} {$i <= [AddrParams hlevel]} {incr i} { $self puts-nam-config "A -t * -h $i -m [AddrParams \ NodeMask $i] -s [AddrParams NodeShift $i]" } } Simulator instproc init-nam {} { $self instvar annotationSeq_ set annotationSeq_ 0 $self dump-namversion 1.0a5 $self dump-namaddress $self dump-namcolors $self dump-namnodes $self dump-namlinks $self dump-namlans $self dump-namqueues $self dump-namagents } Simulator instproc trace-annotate { str } { $self instvar annotationSeq_ $self puts-ns-traceall [format \ "v %s %s {set sim_annotation {%s}}" [$self now] eval $str] incr annotationSeq_ $self puts-nam-config \ "v -t [$self now] sim_annotation [$self now] $annotationSeq_ $str" } proc trace_annotate { str } { set ns [Simulator instance] $ns trace-annotate $str } proc flash_annotate { start duration msg } { set ns [Simulator instance] $ns at $start "trace_annotate {$msg}" $ns at [expr $start+$duration] "trace_annotate periodic_message" } Simulator instproc set-animation-rate { rate } { set r [time_parse $rate] $self puts-nam-config "v -t [$self now] set_rate [expr 10*log10($r)] 1" } Agent/DSDV set sport_ 0 Agent/DSDV set dport_ 0 Agent/DSDV set wst0_ 6 ;# As specified by Pravin Agent/DSDV set perup_ 15 ;# As given in the paper (update period) Agent/DSDV set use_mac_ 0 ;# Performance suffers with this on Agent/DSDV set be_random_ 1 ;# Flavor the performance numbers :) Agent/DSDV set alpha_ 0.875 ;# 7/8, as in RIP(?) Agent/DSDV set min_update_periods_ 3 ;# Missing perups before linkbreak Agent/DSDV set verbose_ 0 ;# Agent/DSDV set trace_wst_ 0 ;# set opt(ragent) Agent/DSDV set opt(pos) NONE ;# Box or NONE if { $opt(pos) == "Box" } { puts "*** DSDV using Box configuration..." } Agent instproc init args { eval $self next $args } Agent/DSDV instproc init args { eval $self next $args } proc create-dsdv-routing-agent { node id } { global ns_ ragent_ tracefd opt set ragent_($id) [new $opt(ragent)] set ragent $ragent_($id) set addr [$node node-addr] $ragent addr $addr $ragent node $node if [Simulator set mobile_ip_] { $ragent port-dmux [$node set dmux_] } $node addr $addr $node set ragent_ $ragent $node attach $ragent [Node set rtagent_port_] $ns_ at 0.0 "$ragent_($id) start-dsdv" ;# start updates set drpT [cmu-trace Drop "RTR" $node] $ragent drop-target $drpT set T [new Trace/Generic] $T target [$ns_ set nullAgent_] $T attach $tracefd $T set src_ $id $ragent tracetarget $T } proc dsdv-create-mobile-node { id args } { global ns ns_ chan prop topo tracefd opt node_ global chan prop tracefd topo opt set ns_ [Simulator instance] if [Simulator hier-addr?] { if [Simulator set mobile_ip_] { set node_($id) [new MobileNode/MIPMH $args] } else { set node_($id) [new Node/MobileNode/BaseStationNode $args] } } else { set node_($id) [new Node/MobileNode] } set node $node_($id) $node random-motion 0 ;# disable random motion $node topography $topo if [info exists opt(energy)] { $node addenergymodel [new $opt(energy) $node 1000 0.5 0.2] } set T [new Trace/Generic] $T target [$ns_ set nullAgent_] $T attach $tracefd $T set src_ $id $node log-target $T if ![info exist opt(err)] { set opt(err) "" } if ![info exist opt(fec)] { set opt(fec) "" } $node add-interface $chan $prop $opt(ll) $opt(mac) \ $opt(ifq) $opt(ifqlen) $opt(netif) $opt(ant) $opt(err) $opt(fec) create-$opt(rp)-routing-agent $node $id if { $opt(pos) == "Box" } { set spacing 200 set maxrow 7 set col [expr ($id - 1) % $maxrow] set row [expr ($id - 1) / $maxrow] $node set X_ [expr $col * $spacing] $node set Y_ [expr $row * $spacing] $node set Z_ 0.0 $node set speed_ 0.0 $ns_ at 0.0 "$node_($id) start" } return $node } set opt(rt_port) 255 set opt(cc) "off" ;# have god check the caches for bad links? Class CacheTimer -superclass Timer CacheTimer instproc timeout {} { global opt node_; $self instvar agent; $agent check-cache $self sched 1.0 } proc checkcache {a} { global cachetimer ns set cachetimer [new CacheTimer] $cachetimer set agent $a $cachetimer sched 1.0 } Class SRNode -superclass Node/MobileNode SRNode instproc init {args} { global ns ns_ opt tracefd RouterTrace $self instvar dsr_agent_ dmux_ entry_point_ address_ set ns_ [Simulator instance] eval $self next $args ;# parent class constructor if {$dmux_ == "" } { set dmux_ [new Classifier/Port] $dmux_ set mask_ [AddrParams PortMask] $dmux_ set shift_ [AddrParams PortShift] } set dsr_agent_ [new Agent/DSRAgent] $dsr_agent_ addr $address_ $dsr_agent_ node $self if [Simulator set mobile_ip_] { $dsr_agent_ port-dmux [$self set dmux_] } $self addr $address_ if { $RouterTrace == "ON" } { set rcvT [cmu-trace Recv "RTR" $self] $rcvT target $dsr_agent_ set entry_point_ $rcvT } else { set entry_point_ $dsr_agent_ } set drpT [cmu-trace Drop "RTR" $self] $dsr_agent_ drop-target $drpT set T [new Trace/Generic] $T target [$ns_ set nullAgent_] $T attach $tracefd $T set src_ [$self id] $dsr_agent_ log-target $T $dsr_agent_ target $dmux_ set nullAgent_ [$ns_ set nullAgent_] $dmux_ install $opt(rt_port) $nullAgent_ $self instvar classifier_ set classifier_ "srnode made illegal use of classifier_" } SRNode instproc start-dsr {} { $self instvar dsr_agent_ global opt; $dsr_agent_ startdsr if {$opt(cc) == "on"} {checkcache $dsr_agent_} } SRNode instproc entry {} { $self instvar entry_point_ return $entry_point_ } SRNode instproc add-interface {args} { global ns ns_ opt RouterTrace eval $self next $args $self instvar dsr_agent_ ll_ mac_ ifq_ $dsr_agent_ mac-addr [$mac_(0) id] if { $RouterTrace == "ON" } { set sndT [cmu-trace Send "RTR" $self] $sndT target $ll_(0) $dsr_agent_ add-ll $sndT $ifq_(0) } else { $dsr_agent_ add-ll $ll_(0) $ifq_(0) } $dsr_agent_ install-tap $mac_(0) } SRNode instproc reset args { $self instvar dsr_agent_ eval $self next $args $dsr_agent_ reset } proc dsr-create-mobile-node { id args } { global ns_ chan prop topo tracefd opt node_ set ns_ [Simulator instance] if [Simulator hier-addr?] { if [Simulator set mobile_ip_] { set node_($id) [new SRNode/MIPMH $args] } else { set node_($id) [new SRNode $args] } } else { set node_($id) [new SRNode] } set node $node_($id) $node random-motion 0 ;# disable random motion $node topography $topo if [info exists opt(energy)] { $node addenergymodel [new $opt(energy) $node 1000 0.5 0.2] } if ![info exist opt(err)] { set opt(err) "" } if ![info exist opt(fec)] { set opt(fec) "" } $node add-interface $chan $prop $opt(ll) $opt(mac) \ $opt(ifq) $opt(ifqlen) $opt(netif) $opt(ant) $opt(err) $opt(fec) set T [new Trace/Generic] $T target [$ns_ set nullAgent_] $T attach $tracefd $T set src_ $id $node log-target $T $ns_ at 0.0 "$node start-dsr" return $node } proc create-base-station-node {address } { global topo tracefd opt node node_ ns_ set ns_ [Simulator instance] if [Simulator set mobile_ip_] { Simulator set node_factory_ MobileNode/MIPBS } else { Simulator set node_factory_ Node/MobileNode/BaseStationNode } set node [$ns_ node $address] set id [$node id] $node random-motion 0 ;# disable random motion $node topography $topo set T [new Trace/Generic] $T target [$ns_ set nullAgent_] $T attach $tracefd $T set src_ $id $node log-target $T $node base-station [AddrParams addr2id [$node node-addr]] create-$opt(rp)-bs-node $node $id Simulator set node_factory_ Node ;# default value return $node } proc create-dsdv-bs-node {node id} { global ns_ chan prop opt node_ $node instvar regagent_ ragent_ $node add-interface $chan $prop $opt(ll) $opt(mac) \ $opt(ifq) $opt(ifqlen) $opt(netif) \ $opt(ant) create-$opt(rp)-routing-agent $node $id if [info exists regagent_] { $regagent_ ragent $ragent_ } if { $opt(pos) == "Box" } { set spacing 200 set maxrow 7 set col [expr ($id - 1) % $maxrow] set row [expr ($id - 1) / $maxrow] $node set X_ [expr $col * $spacing] $node set Y_ [expr $row * $spacing] $node set Z_ 0.0 $node set speed_ 0.0 $ns_ at 0.0 "$node_($id) start" } } proc create-dsr-bs-node {node id} { global ns_ chan prop opt $node instvar regagent_ ragent_ $node add-interface $chan $prop $opt(ll) $opt(mac) \ $opt(ifq) $opt(ifqlen) $opt(netif) \ $opt(ant) create-$opt(rp)-routing-agent $node $id $node create-xtra-interface if [info exists regagent_] { $regagent_ ragent $ragent_ } $ns_ at 0.0 "$node start-dsr" } proc create-dsr-routing-agent { node id } { global ns_ ragent_ tracefd opt set ragent_($id) [new Agent/DSRAgent/BS_DSRAgent] set ragent $ragent_($id) set address [$node node-addr] $ragent addr $address $ragent node $node if [Simulator set mobile_ip_] { $ragent port-dmux [$node set dmux_] } $node addr $address $node set ragent_ $ragent set dmux [$node set dmux_] if {$dmux == "" } { set dmux [new Classifier/Hash/Dest 32] $dmux set mask_ [AddrParams PortMask] $dmux set shift_ [AddrParams PortShift] $node add-route $address $ragent $node set dmux_ $dmux } set level [AddrParams hlevel] if { [Simulator set RouterTrace_] == "ON" } { set rcvT [cmu-trace Recv "RTR" $node] $rcvT target $ragent for {set i 1} {$i <= $level} {incr i} { [$node set classifiers_($i)] defaulttarget $rcvT [$node set classifiers_($i)] bcast-receiver $rcvT } } else { for {set i 1} {$i <= $level} {incr i} { [$node set classifiers_($i)] defaulttarget $ragent [$node set classifiers_($i)] bcast-receiver $ragent } } set drpT [cmu-trace Drop "RTR" $node] $ragent drop-target $drpT $ragent target $dmux $dmux install $opt(rt_port) $ragent } Node/MobileNode/BaseStationNode instproc create-xtra-interface { } { global ns_ opt $self instvar ragent_ ll_ mac_ ifq_ $ragent_ mac-addr [$mac_(0) id] if { [Simulator set RouterTrace_] == "ON" } { set sndT [cmu-trace Send "RTR" $self] $sndT target $ll_(0) $ragent_ add-ll $sndT $ifq_(0) } else { $ragent_ add-ll $ll_(0) $ifq_(0) } $ragent_ install-tap $mac_(0) } Node/MobileNode/BaseStationNode instproc start-dsr {} { $self instvar ragent_ global opt; $ragent_ startdsr if {$opt(cc) == "on"} {checkcache $dsr_agent_} } Node/MobileNode/BaseStationNode instproc reset args { $self instvar ragent_ eval $self next $args $ragent_ reset } proc create-god { nodes } { set god [God info instances] if { $god == "" } { set god [new God] } $god num_nodes $nodes return $god } God proc instance {} { set god [God info instances] if { $god != "" } { return $god } error "Cannot find instance of god" } proc cmu-trace { ttype atype node } { global ns_ tracefd if { $tracefd == "" } { return "" } set T [new CMUTrace/$ttype $atype] $T target [$ns_ set nullAgent_] $T attach $tracefd $T set src_ [$node id] $T node $node return $T } proc log-movement {} { global logtimer ns_ ns set ns $ns_ source ../mobility/timer.tcl Class LogTimer -superclass Timer LogTimer instproc timeout {} { global opt node_; for {set i 0} {$i < $opt(nn)} {incr i} { $node_($i) log-movement } $self sched 0.1 } set logtimer [new LogTimer] $logtimer sched 0.1 } proc set-wireless-traces { args } { set len [llength $args] if { $len <= 0 || [expr $len%2] } { error "Incorrect number of parameters" } for {set n 0} {$n < $len} {incr n 2} { if {[string compare [lindex $args $n] "-AgentTrace"] == 0 } { Simulator set AgentTrace_ [lindex $args [expr $n+1]] } elseif {[string compare [lindex $args $n] "-RouterTrace"] == 0 } { Simulator set RouterTrace_ [lindex $args [expr $n+1]] } elseif {[string compare [lindex $args $n] "-MacTrace"] == 0 } { Simulator set MacTrace_ [lindex $args [expr $n+1]] } else { error "Unknown wireless trace type: [lindex $args $n]" } } } Class PLM PLM instproc init {levels chk_estimate n_id} { $self next $self instvar PP_estimate wait_loss time_loss $self instvar start_loss time_estimate check_estimate node_id global rates set PP_estimate {} set start_loss -1 set wait_loss 0 set time_loss 0 set time_estimate 0 set check_estimate $chk_estimate set node_id $n_id $self instvar debug_ env_ maxlevel_ set debug_ 0 set env_ [lindex [split [$self info class] /] 1] set maxlevel_ $levels global plm_debug_flag if [info exists plm_debug_flag] { set debug_ $plm_debug_flag } $self instvar subscription_ $self instvar layer_ layers_ set i 1 while { $i <= $maxlevel_ } { set layer_($i) [$self create-layer [expr $i - 1]] lappend layers_ $layer_($i) incr i } set subscription_ 0 $self add-layer } PLM instproc make_estimate {PP_value} { $self instvar PP_estimate PP_estimate_value ns_ time_estimate check_estimate debug_ global PP_estimation_length lappend PP_estimate $PP_value $self stability-drop $PP_value set ns_time [$ns_ now] if {$time_estimate==0} { set time_estimate [expr $ns_time + $check_estimate] } if {$debug_>=3} { trace_annotate "[$self node]: check: $check_estimate $PP_estimate , nb: [llength $PP_estimate]" } if {($time_estimate<=$ns_time) && ([llength $PP_estimate] >= $PP_estimation_length)} { set PP_estimate_value [lindex [lsort -real $PP_estimate] 0] if {$debug_>=3} { trace_annotate "[$self node]: check: $check_estimate PP estim: $PP_estimate, value: $PP_estimate_value" } if {$debug_>=2} { trace_annotate [expr round($PP_estimate_value)] } set PP_estimate {} set time_estimate [expr $ns_time + $check_estimate] $self choose_layer $PP_estimate_value } } PLM instproc stability-drop {PP_value} { $self instvar subscription_ start_loss time_estimate PP_estimate $self instvar check_estimate ns_ global rates_cum set ns_time [$ns_ now] for {set i 0} {[lindex $rates_cum $i] < [expr round($PP_value)]} {incr i} { if {$i > [llength $rates_cum]} {break} } if {$subscription_ > $i} { for {set j $subscription_} {$i < $j} {incr j -1} { set start_loss -1 $self drop-layer } set PP_estimate {} set time_estimate [expr $ns_time + $check_estimate] } } proc calc_cum {rates} { set temp 0 set rates_cum {} for {set i 0} {$i<[llength $rates]} {incr i} { set temp [expr $temp + [lindex $rates $i]] lappend rates_cum $temp } return $rates_cum } PLM instproc choose_layer {PP_estimate_value} { $self instvar subscription_ start_loss global rates_cum set start_loss -1 for {set i 0} {[lindex $rates_cum $i] < [expr round($PP_estimate_value)]} {incr i} { if {$i > [llength $rates_cum]} {break} } if {$subscription_ < $i} { for {set j $subscription_} {$j < $i} {incr j} { $self add-layer } } elseif {$subscription_ > $i} { for {set j $subscription_} {$i < $j} {incr j -1} { $self drop-layer } } elseif {$subscription_ == $i} { return } } PLM instproc log-loss {} { $self instvar subscription_ h_npkts h_nlost start_loss debug_ $self instvar time_loss ns_ wait_loss $self debug "LOSS [$self plm_loss]" if {$debug_>=2} { trace_annotate "$self pkt_lost" } set ns_time [$ns_ now] if {$time_loss <= $ns_time} { if {$debug_>=2} { trace_annotate "not enough losses during 1s: reinitialize" } set start_loss -1 } if {($start_loss == -1) || ($wait_loss >= $ns_time)} { if {$debug_>=2} { trace_annotate "$start_loss [expr $wait_loss >= $ns_time] reinitialize" } set h_npkts [$self plm_pkts] set h_nlost [$self plm_loss] set start_loss 1 set time_loss [expr [$ns_ now] + 5] if {$debug_>=2} { trace_annotate "time_loss : $time_loss" } } if {([$self exceed_loss_thresh]) && ($wait_loss <= $ns_time)} { $self drop-layer set start_loss -1 set wait_loss [expr $ns_time + 0.5] if {$debug_>=2} { trace_annotate "drop layer wait_loss: $wait_loss" } } } PLM instproc exceed_loss_thresh {} { $self instvar h_npkts h_nlost debug_ set npkts [expr [$self plm_pkts] - $h_npkts] if { $npkts >= 10 } { set nloss [expr [$self plm_loss] - $h_nlost] set loss [expr double($nloss) / ($nloss + $npkts)] $self debug "H-THRESH $nloss $npkts $loss" if { $loss > 0.10 } { return 1 } } return 0 } PLM instproc drop-layer {} { $self instvar subscription_ layer_ node_id debug_ set n $subscription_ if { $n > 0 } { $self debug "DRP-LAYER $n" $layer_($n) leave-group incr n -1 set subscription_ $n if {$debug_>=2} { trace_annotate " [$self set node_id] : change layer $subscription_ " } } if { $subscription_ == 0 } { set ns [Simulator instance] set rejoin_timer 30 $ns at [expr [$ns now] + $rejoin_timer] "$self add-layer" if {$debug_>=2} { trace_annotate " Try to re-join the session after dropping all the layers " } } } PLM instproc add-layer {} { $self instvar maxlevel_ subscription_ layer_ node_id debug_ set n $subscription_ if { $n < $maxlevel_ } { $self debug "ADD-LAYER" incr n set subscription_ $n $layer_($n) join-group if {$debug_>=2} { trace_annotate " [$self set node_id] : change layer $subscription_ " } } } PLM instproc plm_loss {} { $self instvar layers_ set loss 0 foreach l $layers_ { incr loss [$l nlost] } return $loss } PLM instproc plm_pkts {} { $self instvar layers_ set npkts 0 foreach l $layers_ { incr npkts [$l npkts] } return $npkts } PLM instproc debug { msg } { $self instvar debug_ subscription_ ns_ if {$debug_ <1} { return } set time [format %.05f [$ns_ now]] puts stderr "PLM: $time layer $subscription_ $msg" } Class PLMLayer PLMLayer instproc init { plm } { $self next $self instvar plm_ npkts_ set plm_ $plm set npkts_ 0 } PLMLayer instproc join-group {} { $self instvar npkts_ add_time_ plm_ set npkts_ [$self npkts] set add_time_ [$plm_ now] } PLMLayer instproc leave-group {} { } PLMLayer instproc getting-pkts {} { $self instvar npkts_ return [expr [$self npkts] != $npkts_] } Application/Traffic/CBR_PP instproc set args { $self instvar packet_size_ rate_ if { [lindex $args 0] == "interval_" } { puts "Cannot use CBR_PP with interval_, specify rate_ instead" } eval $self next $args } Agent/LossMonitor/PLM instproc log-PP {} { } Class PLMLossTrace -superclass Agent/LossMonitor/PLM PLMLossTrace set expected_ -1 PLMLossTrace instproc init {} { $self next $self instvar lastTime measure debug_ set lastTime 0 set measure -1 global plm_debug_flag if [info exists plm_debug_flag] { set debug_ $plm_debug_flag } } PLMLossTrace instproc log-loss {} { $self instvar plm_ $plm_ log-loss } PLMLossTrace instproc log-PP {} { $self instvar plm_ PP_first measure next_pkt debug_ global PP_burst_length packetSize if {[$self set flag_PP_] == 128} { set measure 1 set next_pkt [expr [$self set seqno_] + 1] set PP_first [$self set packet_time_PP_] if {$debug_>=2} { trace_annotate "[$plm_ node]: first PP [$self set seqno_], next: $next_pkt" } } elseif {$measure>-1} { if {[$self set seqno_]==$next_pkt} { set measure [expr $measure + 1] set next_pkt [expr [$self set seqno_] + 1] if {$debug_>=2} { trace_annotate "[$plm_ node]: pending measurement : $measure, next $next_pkt" } if {$measure==$PP_burst_length} { set PP_value [expr $packetSize*8.*($PP_burst_length - 1)/([$self set packet_time_PP_] - $PP_first)] set measure -1 if {$debug_>=2} { trace_annotate "[$plm_ node]: measure : $PP_value" } $plm_ make_estimate $PP_value } } else { if {$debug_>=2} { trace_annotate "[$plm_ node]: out of sequence : [$self set seqno_], next: $next_pkt" } set measure -1 } } } Class PLMLayer/ns -superclass PLMLayer PLMLayer/ns instproc init {ns plm addr layerNo} { $self next $plm $self instvar ns_ addr_ mon_ set ns_ $ns set addr_ $addr set mon_ [$ns_ PLMcreate-agent [$plm node] PLMLossTrace 0] $mon_ set layerNo $layerNo $mon_ set plm_ $plm $mon_ set dst_addr_ $addr $mon_ set dst_port_ 0 } PLMLayer/ns instproc join-group {} { $self instvar mon_ plm_ addr_ $mon_ clear [$plm_ node] join-group $mon_ $addr_ $self next } PLMLayer/ns instproc leave-group {} { $self instvar mon_ plm_ addr_ [$plm_ node] leave-group $mon_ $addr_ $self next } PLMLayer/ns instproc npkts {} { $self instvar mon_ return [$mon_ set npkts_] } PLMLayer/ns instproc nlost {} { $self instvar mon_ return [$mon_ set nlost_] } PLMLayer/ns instproc mon {} { $self instvar mon_ return $mon_ } Class PLM/ns -superclass PLM PLM/ns instproc init {ns localNode addrs check_estimate nn} { $self instvar ns_ node_ addrs_ set ns_ $ns set node_ $localNode set addrs_ $addrs $self next [llength $addrs] $check_estimate $nn } PLM/ns instproc create-layer {layerNo} { $self instvar ns_ addrs_ return [new PLMLayer/ns $ns_ $self [lindex $addrs_ $layerNo] $layerNo] } PLM/ns instproc now {} { $self instvar ns_ return [$ns_ now] } PLM/ns instproc node {} { $self instvar node_ return $node_ } PLM/ns instproc debug { msg } { $self instvar debug_ ns_ if {$debug_ <1} { return } $self instvar subscription_ node_ set time [format %.05f [$ns_ now]] } PLM/ns instproc trace { trace } { $self instvar layers_ foreach s $layers_ { [$s mon] trace $trace } } PLM/ns instproc total_bytes_delivered {} { $self instvar layers_ set v 0 foreach s $layers_ { incr v [[$s mon] set bytes] } return $v } Simulator instproc PLMcreate-agent { node type pktClass } { $self instvar Agents PortID set agent [new $type] $agent set fid_ $pktClass $self attach-agent $node $agent $agent proc get var { return [$self set $var] } return $agent } Simulator instproc PLMcbr_flow_PP { node fid addr bw } { global packetSize PP_burst_length set agent [$self PLMcreate-agent $node Agent/UDP $fid] set cbr [new Application/Traffic/CBR_PP] $cbr attach-agent $agent $agent set dst_addr_ $addr $agent set dst_port_ 0 $cbr set packet_size_ $packetSize $cbr set rate_ $bw $cbr set random_ 1 $cbr set PBM_ $PP_burst_length return $cbr } Simulator instproc PLMbuild_source_set { plmName rates addrs baseClass node when } { global src_plm src_rate set n [llength $rates] set r [lindex $rates 0] set addr [expr [lindex $addrs 0]] set src_rate($addr) $r set k $plmName:0 set src_plm($k) [$self PLMcbr_flow_PP $node $baseClass $addr $r] $self at 0 "$src_plm($k) set maxpkts_ 1; $src_plm($k) start" $self at $when "$src_plm($k) set maxpkts_ 268435456; $src_plm($k) start" for {set i 1} {$i<$n} {incr i} { set r [lindex $rates $i] set addr [expr [lindex $addrs $i]] set src_rate($addr) $r set k $plmName:$i set src_plm($k) [$self PLMcbr_flow_PP $node $baseClass $addr $r] $self at 0 "$src_plm($k) set maxpkts_ 1; $src_plm($k) start" $self at $when "$src_plm($k) set maxpkts_ 268435456; $src_plm($k) start" } } Class PLMTopology PLMTopology instproc init { simulator } { $self instvar ns id set ns $simulator set id 0 } PLMTopology instproc mknode nn { $self instvar node ns if ![info exists node($nn)] { set node($nn) [$ns node] } } PLMTopology instproc build_link { a b delay bw } { global buffers packetSize Queue_sched_ if { $a == $b } { puts stderr "link from $a to $b?" exit 1 } $self instvar node ns $self mknode $a $self mknode $b $ns duplex-link $node($a) $node($b) $bw $delay $Queue_sched_ } PLMTopology instproc build_link-simple { a b delay bw f} { global buffers packetSize Queue_sched_ if { $a == $b } { puts stderr "link from $a to $b?" exit 1 } $self instvar node ns $self mknode $a $self mknode $b $ns duplex-link-trace $node($a) $node($b) $bw $delay $Queue_sched_ $f } PLMTopology instproc place_source { nn when } { global rates $self instvar node ns id addrs incr id set addrs($id) {} foreach r $rates { lappend addrs($id) [Node allocaddr] } $ns PLMbuild_source_set s$id $rates $addrs($id) $id $node($nn) $when return $id } PLMTopology instproc place_receiver { nn id when check_estimate {nb 1}} { $self instvar ns $ns at $when "$self build_receiver $nn $id $check_estimate $nb" } PLMTopology instproc build_receiver { nn id check_estimate nb} { $self instvar node ns addrs global PLMrcvr set PLMrcvr($nb) [new PLM/ns $ns $node($nn) $addrs($id) $check_estimate $nn] global plm_debug_flag $PLMrcvr($nb) set debug_ $plm_debug_flag } Simulator instproc mpls-node args { $self node-config -MPLS ON set n [$self node] $self node-config -MPLS OFF return $n } Simulator instproc LDP-peer { src dst } { if { ![$src is-neighbor $dst] } { return } set ldpsrc [[$src get-module "MPLS"] make-ldp] set ldpdst [[$dst get-module "MPLS"] make-ldp] $ldpsrc set-peer [$dst id] $ldpdst set-peer [$src id] $self connect $ldpsrc $ldpdst } Simulator instproc ldp-notification-color {color} { $self color 101 $color } Simulator instproc ldp-request-color {color} { $self color 102 $color } Simulator instproc ldp-mapping-color {color} { $self color 103 $color } Simulator instproc ldp-withdraw-color {color} { $self color 104 $color } Simulator instproc ldp-release-color {color} { $self color 105 $color } RtModule/MPLS instproc register { node } { $self instvar classifier_ $self attach-node $node $node route-notify $self $node port-notify $self set classifier_ [new Classifier/Addr/MPLS] $classifier_ set-node $node $self $node install-entry $self $classifier_ 0 $self attach-classifier $classifier_ } RtModule/MPLS instproc enable-data-driven {} { [$self set classifier_] cmd enable-data-driven } RtModule/MPLS instproc enable-control-driven {} { [$self set classifier_] cmd enable-control-driven } RtModule/MPLS instproc make-ldp {} { set ldp [new Agent/LDP] $self cmd attach-ldp $ldp $ldp set-mpls-module $self [$self node] attach $ldp return $ldp } RtModule/MPLS instproc exist-fec {fec phb} { return [[$self set classifier_] exist-fec $fec $phb] } RtModule/MPLS instproc get-incoming-iface {fec lspid} { return [[$self set classifier_] GetInIface $fec $lspid] } RtModule/MPLS instproc get-incoming-label {fec lspid} { return [[$self set classifier_] GetInLabel $fec $lspid] } RtModule/MPLS instproc get-outgoing-label {fec lspid} { return [[$self set classifier_] GetOutLabel $fec $lspid] } RtModule/MPLS instproc get-outgoing-iface {fec lspid} { return [[$self set classifier_] GetOutIface $fec $lspid] } RtModule/MPLS instproc get-fec-for-lspid {lspid} { return [[$self set classifier_] get-fec-for-lspid $lspid] } RtModule/MPLS instproc in-label-install {fec lspid iface label} { set dontcare [Classifier/Addr/MPLS dont-care] $self label-install $fec $lspid $iface $label $dontcare $dontcare } RtModule/MPLS instproc out-label-install {fec lspid iface label} { set dontcare [Classifier/Addr/MPLS dont-care] $self label-install $fec $lspid $dontcare $dontcare $iface $label } RtModule/MPLS instproc in-label-clear {fec lspid} { set dontcare [Classifier/Addr/MPLS dont-care] $self label-clear $fec $lspid -1 -1 $dontcare $dontcare } RtModule/MPLS instproc out-label-clear {fec lspid} { set dontcare [Classifier/Addr/MPLS dont-care] $self label-clear $fec $lspid $dontcare $dontcare -1 -1 } RtModule/MPLS instproc label-install {fec lspid iif ilbl oif olbl} { [$self set classifier_] LSPsetup $fec $lspid $iif $ilbl $oif $olbl } RtModule/MPLS instproc label-clear {fec lspid iif ilbl oif olbl} { [$self set classifier_] LSPrelease $fec $lspid $iif $ilbl $oif $olbl } RtModule/MPLS instproc flow-erlsp-install {fec phb lspid} { [$self set classifier_] ErLspBinding $fec $phb $lspid } RtModule/MPLS instproc erlsp-stacking {erlspid tunnelid} { [$self set classifier_] ErLspStacking -1 $erlspid -1 $tunnelid } RtModule/MPLS instproc flow-aggregation {fineFec finePhb coarseFec coarsePhb} { [$self set classifier_] FlowAggregation $fineFec $finePhb $coarseFec \ $coarsePhb } RtModule/MPLS instproc enable-reroute {option} { $self instvar classifier_ $classifier_ set enable_reroute_ 1 if {$option == "drop"} { $classifier_ set reroute_option_ 0 } elseif {$option == "L3"} { $classifier_ set reroute_option_ 1 } elseif {$option == "new"} { $classifier_ set reroute_option_ 2 } else { $classifier_ set reroute_option_ 0 } } RtModule/MPLS instproc reroute-binding {fec phb lspid} { [$self set classifier_] aPathBinding $fec $phb -1 $lspid } RtModule/MPLS instproc lookup-nexthop {node fec} { set ns [Simulator instance] set routingtable [$ns get-routelogic] set nexthop [$routingtable lookup $node $fec] return $nexthop } RtModule/MPLS instproc get-nexthop {fec} { set nodeid [[$self node] id] set nexthop [$self lookup-nexthop $nodeid $fec] return $nexthop } RtModule/MPLS instproc get-link-status {hop} { if {$hop < 0} { return "down" } set nexthop [$self get-nexthop $hop] if {$nexthop == $hop} { set status "up" } else { set status "down" } return $status } RtModule/MPLS instproc is-egress-lsr { fec } { if { [[$self node] id] == $fec } { return "1" } set nexthopid [$self get-nexthop $fec] if { $nexthopid < 0 } { return "-1" } set nexthop [[Simulator instance] get-node-by-id $nexthopid] if { [$nexthop get-module "MPLS"] == "" } { return "1" } else { return "-1" } } RtModule/MPLS instproc ldp-trigger-by-routing-table {} { if { [[$self set classifier_] cmd control-driven?] != 1 } { return } set ns [Simulator instance] for {set i 0} {$i < [$ns get-number-of-nodes]} {incr i} { set host [$ns get-node-by-id $i] if { [$self is-egress-lsr [$host id]] == 1 } { $self ldp-trigger-by-control [$host id] * } } } RtModule/MPLS instproc ldp-trigger-by-control {fec pathvec} { lappend pathvec [[$self node] id] set inlabel [$self get-incoming-label $fec -1] set nexthop [$self get-nexthop $fec] set ldpagents [lsort [$self get-ldp-agents]] for {set i 0} {$i < [llength $ldpagents]} {incr i 1} { set ldpagent [lindex $ldpagents $i] if { [$ldpagent peer-ldpnode] == $nexthop } { continue } if { $inlabel == -1 } { if { [$self is-egress-lsr $fec] == 1 } { set inlabel 0 } else { set inlabel [$self new-incoming-label] $self in-label-install $fec -1 -1 $inlabel } } $ldpagent new-msgid $ldpagent send-mapping-msg $fec $inlabel $pathvec -1 } } RtModule/MPLS instproc ldp-trigger-by-data {reqmsgid src fec pathvec} { if { [$self is-egress-lsr $fec] == 1 } { return } set outlabel [$self get-outgoing-label $fec -1] if { $outlabel > -1 } { set outiface [$self get-outgoing-iface $fec -1] if { [$self get-link-status $outiface] == "up" } { return } } lappend pathvec [[$self node] id] set nexthop [$self get-nexthop $fec] set ldpagent [$self get-ldp-agent $nexthop] if { $ldpagent == "" } { return } if {$reqmsgid > -1} { set working [$ldpagent msgtbl-get-msgid $fec -1 $src] if { $working < 0 } { set newmsgid [$ldpagent new-msgid] $ldpagent msgtbl-install $newmsgid $fec -1 \ $src $reqmsgid $ldpagent send-request-msg $fec $pathvec } else { } } else { if {$fec == $nexthop} { set outlabel 0 } else { set outlabel [$self new-outgoing-label] } $self out-label-install $fec -1 $nexthop $outlabel $ldpagent new-msgid $ldpagent send-mapping-msg $fec $outlabel $pathvec -1 } } RtModule/MPLS instproc make-explicit-route {fec er lspid rc} { $self ldp-trigger-by-explicit-route -1 [[$self node] id] $fec "*" \ $er $lspid $rc } RtModule/MPLS instproc ldp-trigger-by-explicit-route {reqmsgid src fec \ pathvec er lspid rc} { $self instvar classifier_ set outlabel [$self get-outgoing-label $fec $lspid] if { $outlabel > -1 } { return } if { [[$self node] id] != $src && [[$self node] id] == $fec } { set ldpagent [$self get-ldp-agent $src] if { $ldpagent != "" } { $ldpagent new-msgid $ldpagent send-cr-mapping-msg $fec 0 $lspid $reqmsgid } return } lappend pathvec [[$self node] id] set er [split $er "_"] set erlen [llength $er] for {set i 0} {$i <= $erlen} {incr i 1} { if { $i != $erlen } { set erhop [lindex $er $i] } else { set erhop $fec } set stackERhop -1 if { $erhop >= [Classifier/Addr/MPLS minimum-lspid] } { set lspidFEC [$self get-fec-for-lspid $erhop] set inlabel [$self get-incoming-label -1 $erhop] set outlabel [$self get-outgoing-label -1 $erhop] if { $lspidFEC == $fec } { if { $outlabel <= -1 } { continue } if { $inlabel < 0 } { set inlabel [$self new-incoming-label] $self in-label-install -1 $erhop \ $src $inlabel } set ldpagent [$self get-ldp-agent $src] $ldpagent new-msgid $ldpagent send-cr-mapping-msg $fec $inlabel \ $lspid $reqmsgid return } set existExplicitPeer [$self exist-ldp-agent $lspidFEC] if { $outlabel > -1 && $existExplicitPeer == "1" } { set stackERhop $erhop set erhop $lspidFEC } elseif { $outlabel > -1 && $existExplicitPeer == "0" } { set nexthop [$self get-outgoing-iface -1 \ $erhop] set iiface [$self get-incoming-iface -1 \ $erhop] set ldpagent [$self get-ldp-agent $nexthop] set working [$ldpagent msgtbl-get-msgid $fec \ $lspid $src] if { $working < 0 } { set newmsgid [$ldpagent new-msgid] $ldpagent msgtbl-install $newmsgid \ $fec $lspid $src $reqmsgid if {($iiface == $src) && \ ($inlabel > -1) } { $ldpagent msgtbl-set-labelpass $newmsgid } else { $ldpagent msgtbl-set-labelstack $newmsgid $erhop } $ldpagent send-cr-request-msg $fec \ $pathvec $er $lspid $rc } return } else { continue } } if { [lsearch $pathvec $erhop] < 0 } { set nexthop [$self get-nexthop $erhop] if { [$self is-egress-lsr $nexthop] == 1 } { set ldpagent [$self get-ldp-agent $src] if { $erhop == $fec } { $ldpagent new-msgid $ldpagent send-cr-mapping-msg $fec 0 \ $lspid $reqmsgid } else { $ldpagent new-msgid $ldpagent send-notification-msg \ "NoRoute" $lspid } } else { set ldpagent [$self get-ldp-agent $nexthop] set working [$ldpagent msgtbl-get-msgid $fec \ $lspid $src] if { $working < 0 } { set newmsgid [$ldpagent new-msgid] set id [$ldpagent msgtbl-install \ $newmsgid $fec \ $lspid $src $reqmsgid] if { $stackERhop > -1 } { $ldpagent msgtbl-set-labelstack $newmsgid $stackERhop } $ldpagent send-cr-request-msg $fec $pathvec $er $lspid $rc } } return } } set ldpagent [$self get-ldp-agent $src] if { $ldpagent != "" } { $ldpagent new-msgid $ldpagent send-notification-msg "NoRoute" $lspid } } RtModule/MPLS instproc ldp-trigger-by-withdraw {fec lspid} { set inlabel [$self get-incoming-label $fec $lspid] set iniface [$self get-incoming-iface $fec $lspid] $self in-label-clear $fec $lspid if {$iniface > -1} { set ldpagent [$self get-ldp-agent $iniface] if { $ldpagent != "" } { $ldpagent new-msgid $ldpagent send-withdraw-msg $fec $lspid } } else { set nexthop [$self get-nexthop $fec] set ldpagents [lsort [$self get-ldp-agents]] for {set i 0} {$i < [llength $ldpagents]} {incr i 1} { set ldpagent [lindex $ldpagents $i] if { [$ldpagent peer-ldpnode] == $nexthop } { continue } $ldpagent new-msgid $ldpagent send-withdraw-msg $fec $lspid } } } RtModule/MPLS instproc ldp-trigger-by-release {fec lspid} { set outlabel [$self get-outgoing-label $fec $lspid] if {$outlabel < 0} { return } set nexthop [$self get-outgoing-iface $fec $lspid] $self out-label-clear $fec $lspid set ldpagent [$self get-ldp-agent $nexthop] if { $ldpagent != "" } { $ldpagent new-msgid $ldpagent send-release-msg $fec $lspid } } RtModule/MPLS instproc trace-mpls {} { [$self set classifier_] set trace_mpls_ 1 } RtModule/MPLS instproc pft-dump {} { set nodeid [[$self node] id] [$self set classifier_] PFTdump $nodeid } RtModule/MPLS instproc erb-dump {} { set nodeid [[$self node] id] [$self set classifier_] ERBdump $nodeid } RtModule/MPLS instproc lib-dump {} { set nodeid [[$self node] id] [$self set classifier_] LIBdump $nodeid } Agent/LDP instproc set-mpls-module { mod } { $self set module_ $mod } Agent/LDP instproc get-request-msg {msgid src fec pathvec} { $self instvar node_ module_ set pathvec [split $pathvec "_"] if {[lsearch $pathvec [$node_ id]] > -1} { set ldpagent [$module_ get-ldp-agent $src] $ldpagent new-msgid $ldpagent send-notification-msg "LoopDetected" -1 return } set nexthop [$module_ get-nexthop $fec] if {$src == $nexthop} { $self request-msg-from-downstream $msgid $src $fec $pathvec } else { $self request-msg-from-upstream $msgid $src $fec $pathvec } } Agent/LDP instproc request-msg-from-downstream {msgid src fec pathvec} { $self instvar module_ set outlabel [$module_ get-outgoing-label $fec -1] if { $outlabel < 0 } { if { $fec == $src } { set outlabel 0 } else { set outlabel [$module_ new-outgoing-label] } $module_ out-label-install $fec -1 $src $outlabel } else { set outIface [$module_ get-outgoing-iface $fec -1] if { $src != $outIface} { $module_ out-label-install $fec -1 $src $outlabel } } set ldpagent [$module_ get-ldp-agent $src] $ldpagent new-msgid $ldpagent send-mapping-msg $fec $outlabel "*" $msgid $module_ ldp-trigger-by-control $fec $pathvec } Agent/LDP instproc request-msg-from-upstream {msgid src fec pathvec} { $self instvar module_ set ldpagent [$module_ get-ldp-agent $src] if { [$module_ is-egress-lsr $fec] == 1 } { $ldpagent new-msgid $ldpagent send-mapping-msg $fec 0 "*" $msgid return } set inlabel [$module_ get-incoming-label $fec -1] set outlabel [$module_ get-outgoing-label $fec -1] if { [Classifier/Addr/MPLS ordered-control?] == 1 } { if { $outlabel > -1 } { if { $inlabel < 0 } { set inlabel [$module_ new-incoming-label] } $ldpagent new-msgid $ldpagent send-mapping-msg $fec inlabel "*" $msgid } else { $module_ ldp-trigger-by-data $msgid $src $fec $pathvec } return } if { $inlabel < 0 } { set inlabel [$module_ new-incoming-label] $module_ in-label-install $fec -1 $src $inlabel } else { set inIface [$module_ get-incoming-iface $fec -1] if { $src != $inIface} { set classifier [$module_ set classifier_] set dontcare [$classifier set dont_care_] $module_ in-label-install $fec -1 -1 $dontcare } } $ldpagent new-msgid $ldpagent send-mapping-msg $fec $inlabel "*" $msgid $module_ ldp-trigger-by-data $msgid $src $fec $pathvec } Agent/LDP instproc get-cr-request-msg {msgid src fec pathvec er lspid rc} { $self instvar node_ module_ set pathvec [split $pathvec "_"] if {[lsearch $pathvec [$node_ id]] > -1} { set ldpagent [$module_ get-ldp-agent $src] $ldpagent new-msgid $ldpagent send-notification-msg "NoRoute" $lspid return } set ldpagent [$module_ get-ldp-agent $src] set inlabel [$module_ get-incoming-label $fec $lspid] set outlabel [$module_ get-outgoing-label $fec $lspid] if { $outlabel > -1 } { if { $inlabel < 0 } { set inlabel [$module_ new-incoming-label] $module_ in-label-install $fec $lspid $src $inlabel } $ldpagent new-msgid $ldpagent send-cr-mapping-msg $fec $inlabel $lspid $msgid return } $module_ ldp-trigger-by-explicit-route $msgid $src $fec $pathvec $er \ $lspid $rc } Agent/LDP instproc get-cr-mapping-msg {msgid src fec label lspid reqmsgid} { $self instvar node_ trace_ldp_ module_ set prvsrc [$self msgtbl-get-src $reqmsgid] set prvmsgid [$self msgtbl-get-reqmsgid $reqmsgid] set labelop [$self msgtbl-get-labelop $reqmsgid] if {$labelop == 2} { set tunnelid [$self msgtbl-get-erlspid $reqmsgid] } else { set tunnelid -1 } $self msgtbl-clear $reqmsgid if { $trace_ldp_ } { puts "$src -> [$node_ id] : prvsrc($prvsrc)" } if { $labelop == 2 } { $module_ out-label-install $fec $lspid $src $label $module_ erlsp-stacking $lspid $tunnelid } elseif {$labelop == 1} { set ldpagent [$module_ get-ldp-agent $prvsrc] $ldpagent new-msgid $ldpagent send-cr-mapping-msg $fec $label $lspid $prvmsgid return } else { $module_ out-label-install $fec $lspid $src $label } if {$prvsrc == [$node_ id]} { return } set inlabel [$module_ new-incoming-label] $module_ in-label-install $fec $lspid $prvsrc $inlabel set ldpagent [$module_ get-ldp-agent $prvsrc] $ldpagent new-msgid $ldpagent send-cr-mapping-msg $fec $inlabel $lspid $prvmsgid } Agent/LDP instproc get-mapping-msg {msgid src fec label pathvec reqmsgid} { $self instvar node_ trace_ldp_ module_ if { $trace_ldp_ } { puts "[[Simulator instance] now]: $src ->\ [$node_ id] : fec($fec), label($label) [$module_ get-nexthop $fec]" } set pathvec [split $pathvec "_"] if {[lsearch $pathvec [$node_ id]] > -1} { set ldpagent [$module_ get-ldp-agent $src] $ldpagent new-msgid $ldpagent send-notification-msg "LoopDetected" -1 return } set nexthop [$module_ get-nexthop $fec] if {$src == $nexthop} { $self mapping-msg-from-downstream $msgid $src $fec $label \ $pathvec $reqmsgid } else { $self mapping-msg-from-upstream $msgid $src $fec $label \ $pathvec $reqmsgid } } Agent/LDP instproc mapping-msg-from-downstream {msgid src fec label \ pathvec reqmsgid} { $self instvar node_ module_ $module_ out-label-install $fec -1 $src $label if { $reqmsgid > -1 } { set prvsrc [$self msgtbl-get-src $reqmsgid] set prvmsgid [$self msgtbl-get-reqmsgid $reqmsgid] $self msgtbl-clear $reqmsgid if { $prvsrc == [$node_ id] || $prvsrc < 0} { return } if { [Classifier/Addr/MPLS ordered-control?] == 1 } { set inlabel [$module_ new-incoming-label] $module_ in-label-install $fec -1 $prvsrc $inlabel set ldpagent [$module_ get-ldp-agent $prvsrc] $ldpagent new-msgid $ldpagent send-mapping-msg $fec $inlabel -1 $prvmsgid return } } else { $module_ ldp-trigger-by-control $fec $pathvec return } } Agent/LDP instproc mapping-msg-from-upstream {msgid src fec label pathvec \ reqmsgid} { $self instvar node_ module_ set nexthop [$module_ lookup-nexthop $src $fec] if { $nexthop != [$node_ id] } { return } set inlabel [$module_ get-incoming-label $fec -1] if { $inlabel == -1 } { if { [$module_ is-egress-lsr $fec] == 1 } { if { $label != 0 } { set ldpagent [$module_ get-ldp-agent $src] $ldpagent new-msgid $ldpagent send-mapping-msg $fec 0 "*" $msgid } } else { $module_ in-label-install $fec -1 $src $label } } else { set ldpagent [$module_ get-ldp-agent $src] if { $reqmsgid < 0 } { $ldpagent new-msgid $ldpagent send-mapping-msg $fec $inlabel "*" $msgid } } if { $reqmsgid < 0 } { $module_ ldp-trigger-by-data -1 $src $fec $pathvec } else { $self msgtbl-clear $reqmsgid } } Agent/LDP instproc get-notification-msg {src status lspid} { $self instvar node_ trace_ldp_ module_ if { $trace_ldp_ } { puts "Notification($src->[$node_ id]): $status src=$src lspid=$lspid" } set msgid [$self msgtbl-get-msgid -1 $lspid -1] if {$msgid > -1} { set prvsrc [$self msgtbl-get-src $msgid] $self msgtbl-clear $msgid if { $prvsrc < -1 || $prvsrc == [$node_ id] } { return } set ldpagent [$module_ get-ldp-agent $prvsrc] $ldpagent new-msgid $ldpagent send-notification-msg $status $lspid } } Agent/LDP instproc get-withdraw-msg {src fec lspid} { $self instvar module_ set outiface [$module_ get-outgoing-iface $fec $lspid] if {$src == $outiface} { $module_ out-label-clear $fec $lspid set inlabel [$module_ get-incoming-label $fec $lspid] if {$inlabel > -1} { $module_ ldp-trigger-by-withdraw $fec $lspid } } } Agent/LDP instproc get-release-msg {src fec lspid} { $self instvar module_ set iniface [$module_ get-incoming-iface $fec $lspid] set outlabel [$module_ get-outgoing-label $fec $lspid] if {$iniface == $src} { $module_ in-label-clear $fec $lspid if {$outlabel > -1} { $module_ ldp-trigger-by-release $fec $lspid } } } Agent/LDP instproc trace-ldp-packet {src_addr src_port msgtype msgid fec \ label pathvec lspid er rc reqmsgid status atime} { $self instvar node_ puts "$atime [$node_ id]: $src_addr ($msgtype $msgid) $fec $label $pathvec \[$reqmsgid $status\] \[$lspid $er $rc\]" } Agent/LDP instproc send-notification-msg {status lspid} { $self set fid_ 101 $self cmd notification-msg $status $lspid } Agent/LDP instproc send-request-msg {fec pathvec} { $self set fid_ 102 $self request-msg $fec $pathvec } Agent/LDP instproc send-mapping-msg {fec label pathvec reqmsgid} { $self set fid_ 103 $self cmd mapping-msg $fec $label $pathvec $reqmsgid } Agent/LDP instproc send-withdraw-msg {fec lspid} { $self set fid_ 104 $self withdraw-msg $fec $lspid } Agent/LDP instproc send-release-msg {fec lspid} { $self set fid_ 105 $self release-msg $fec $lspid } Agent/LDP instproc send-cr-request-msg {fec pathvec er lspid rc} { $self set fid_ 102 $self cr-request-msg $fec $pathvec $er $lspid $rc } Agent/LDP instproc send-cr-mapping-msg {fec inlabel lspid prvmsgid} { $self set fid_ 103 $self cr-mapping-msg $fec $inlabel $lspid $prvmsgid } Classifier/Addr/MPLS instproc init {args} { eval $self next $args $self set rtable_ "" } Classifier/Addr/MPLS instproc set-node { node module } { $self set mpls_node_ $node $self set mpls_mod_ $module } Classifier/Addr/MPLS instproc no-slot args { } Classifier/Addr/MPLS instproc trace-packet-switching { time src dst ptype \ ilabel op oiface olabel ttl psize } { $self instvar mpls_node_ puts "$time [$mpls_node_ id]($src->$dst): $ptype $ilabel $op $oiface $olabel $ttl $psize" } Classifier/Addr/MPLS instproc ldp-trigger-by-switch { fec } { $self instvar mpls_node_ mpls_mod_ if { [Classifier/Addr/MPLS on-demand?] == 1 } { set msgid 1 } else { set msgid -1 } $mpls_mod_ ldp-trigger-by-data $msgid [$mpls_node_ id] $fec * } Classifier/Addr/MPLS instproc rtable-ready { fec } { $self instvar rtable_ set ns [Simulator instance] if { [lsearch $rtable_ $fec] == -1 } { lappend rtable_ $fec } set rtlen [llength $rtable_] set nodelen [$ns array size Node_] if { $rtlen == $nodelen } { return 1 } else { return 0 } } Classifier/Addr/MPLS instproc routing-new { slot time } { $self instvar mpls_node_ rtable_ mpls_mod_ if { [$self control-driven?] != 1 } { return } if { [lsearch $rtable_ [$mpls_node_ id]] == -1 } { lappend rtable_ [$mpls_node_ id] } if { [$self rtable-ready $slot] == 1 } { set rtlen [llength $rtable_] for {set i 0} {$i < $rtlen} {incr i 1} { set nodeid [lindex $rtable_ $i] if { [$mpls_mod_ get-nexthop $nodeid] == -1 } { set rtable_ "" return } } set rtable_ "" [Simulator instance] at [expr $time] \ "$mpls_mod_ ldp-trigger-by-routing-table" } } Classifier/Addr/MPLS instproc routing-nochange {slot time} { $self instvar mpls_node_ rtable_ mpls_mod_ if { [$self control-driven?] != 1 } { return } if { [lsearch $rtable_ [$mpls_node_ id]] == -1 } { lappend rtable_ [$mpls_node_ id] } if { [$self rtable-ready $slot] == 1 } { set rtable_ "" [Simulator instance] at $time \ "$mpls_mod_ ldp-trigger-by-routing-table" } } Classifier/Addr/MPLS instproc routing-update {slot time} { $self instvar mpls_mod_ rtable_ if {[$self control-driven?] != 1} { return } set fec $slot set pft_outif [$mpls_mod_ get-outgoing-iface $fec -1] set rt_outif [$mpls_mod_ get-nexthop $fec] if { $pft_outif == -1 || $rt_outif == -1 } { return } $mpls_mod_ ldp-trigger-by-control $fec * return } set tcl_precision 17 Connector set debug_ false TTLChecker set debug_ false Trace set src_ -1 Trace set dst_ -1 Trace set callback_ 0 Trace set show_tcphdr_ 0 Trace set debug_ false CMUTrace set debug_ false Scheduler/RealTime set maxslop_ 0.010; # max allowed slop b4 error (sec) Integrator set lastx_ 0.0 Integrator set lasty_ 0.0 Integrator set sum_ 0.0 Queue set limit_ 50 Queue set blocked_ false Queue set unblock_on_resume_ true Queue set interleave_ false Queue set acksfirst_ false Queue set ackfromfront_ false Queue set debug_ false Queue/SFQ set maxqueue_ 40 Queue/SFQ set buckets_ 16 Queue/FQ set secsPerByte_ 0 FQLink set queueManagement_ DropTail Queue/DropTail set drop_front_ false Queue/DropTail/PriQueue set Prefer_Routing_Protocols 1 Queue/dsRED set numQueues_ 4 Queue/dsRED set ecn_ 0 Queue/RED set bytes_ false Queue/RED set queue_in_bytes_ false Queue/RED set thresh_ 5 Queue/RED set maxthresh_ 15 Queue/RED set mean_pktsize_ 1000 Queue/RED set q_weight_ 0.002 Queue/RED set wait_ true Queue/RED set linterm_ 10 Queue/RED set setbit_ false Queue/RED set gentle_ true Queue/RED set drop_tail_ true Queue/RED set drop_front_ false Queue/RED set drop_rand_ false Queue/RED set doubleq_ false Queue/RED set ns1_compat_ false Queue/RED set dqthresh_ 50 Queue/RED set ave_ 0.0 Queue/RED set prob1_ 0.0 Queue/RED set curq_ 0 Queue/RED/RIO set bytes_ false Queue/RED/RIO set queue_in_bytes_ false Queue/RED/RIO set thresh_ 5 Queue/RED/RIO set maxthresh_ 15 Queue/RED/RIO set in_thresh_ 15 Queue/RED/RIO set in_maxthresh_ 30 Queue/RED/RIO set out_thresh_ 5 Queue/RED/RIO set out_maxthresh_ 15 Queue/RED/RIO set mean_pktsize_ 500 Queue/RED/RIO set q_weight_ 0.002 Queue/RED/RIO set wait_ true Queue/RED/RIO set linterm_ 10 Queue/RED/RIO set in_linterm_ 50 Queue/RED/RIO set out_linterm_ 5 Queue/RED/RIO set setbit_ false Queue/RED/RIO set gentle_ false Queue/RED/RIO set in_gentle_ false Queue/RED/RIO set out_gentle_ false Queue/RED/RIO set drop_tail_ true Queue/RED/RIO set drop_front_ false Queue/RED/RIO set drop_rand_ false Queue/RED/RIO set doubleq_ false Queue/RED/RIO set ns1_compat_ false Queue/RED/RIO set dqthresh_ 50 Queue/RED/RIO set ave_ 0.0 Queue/RED/RIO set in_ave_ 0.0 Queue/RED/RIO set out_ave_ 0.0 Queue/RED/RIO set prob1_ 0.0 Queue/RED/RIO set in_prob1_ 0.0 Queue/RED/RIO set out_prob1_ 0.0 Queue/RED/RIO set curq_ 0 Queue/RED/RIO set priority_method_ 0 Queue/RED/PD set auto_ false Queue/RED/PD set global_target_ false Queue/RED/PD set noMonitored_ 0 Queue/RED/PD set targetBW_ 0 Queue/RED/PD set unresponsive_penalty_ 1 Queue/RED/PD set P_testFRp_ -1 Queue/RED/PD set noidle_ false Queue/DRR set buckets_ 10 Queue/DRR set blimit_ 25000 Queue/DRR set quantum_ 250 Queue/DRR set mask_ 0 Queue/CBQ set algorithm_ 0 ;# used by compat only, not bound Queue/CBQ set maxpkt_ 1024 CBQClass set priority_ 0 CBQClass set level_ 1 CBQClass set extradelay_ 0.0 CBQClass set def_qtype_ DropTail CBQClass set okborrow_ true CBQClass set automaxidle_gain_ 0.9375 CBQClass set debug_ false SnoopQueue/In set debug_ false SnoopQueue/Out set debug_ false SnoopQueue/Drop set debug_ false SnoopQueue/EDrop set debug_ false SnoopQueue/Tagger set debug_ false PacketQueue/Semantic set acksfirst_ false PacketQueue/Semantic set filteracks_ false PacketQueue/Semantic set replace_head_ false PacketQueue/Semantic set priority_drop_ false PacketQueue/Semantic set random_drop_ false PacketQueue/Semantic set reconsAcks_ false PacketQueue/Semantic set random_ecn_ false QueueMonitor set size_ 0 QueueMonitor set pkts_ 0 QueueMonitor set parrivals_ 0 QueueMonitor set barrivals_ 0 QueueMonitor set pdepartures_ 0 QueueMonitor set bdepartures_ 0 QueueMonitor set pdrops_ 0 QueueMonitor set bdrops_ 0 QueueMonitor set k_ 0.1 QueueMonitor set prevTime_ 0 QueueMonitor set startTime_ 0 QueueMonitor set estRate_ 0 QueueMonitor set estimate_rate_ 0 QueueMonitor/ED set epdrops_ 0 QueueMonitor/ED set ebdrops_ 0 QueueMonitor/ED set mon_epdrops_ 0 QueueMonitor/ED set mon_ebdrops_ 0 QueueMonitor/ED/Flowmon set enable_in_ true QueueMonitor/ED/Flowmon set enable_out_ true QueueMonitor/ED/Flowmon set enable_drop_ true QueueMonitor/ED/Flowmon set enable_edrop_ true QueueMonitor/ED/Flowmon set enable_mon_edrop_ true QueueMonitor/ED/Flow set src_ -1 QueueMonitor/ED/Flow set dst_ -1 QueueMonitor/ED/Flow set flowid_ -1 QueueMonitor/ED/Flow/TB set target_rate_ 128000 QueueMonitor/ED/Flow/TB set bucket_depth_ 10000 QueueMonitor/ED/Flow/TB set tbucket_ 10000 QueueMonitor/ED/Flow/TSW set target_rate_ 0 QueueMonitor/ED/Flow/TSW set win_len_ 10 QueueMonitor/ED/Flow/TSW set wait_ true QueueMonitor/ED/Flow/RedPD set targetBW_ 0 QueueMonitor/ED/Flow/RedPD set currentBW_ 0 QueueMonitor/ED/Flow/RedPD set monitored_ 0 QueueMonitor/ED/Flow/RedPD set unresponsive_ 0 QueueMonitor/ED/Flow/RedPD set monitorStartTime_ 0 QueueMonitor/ED/Flow/RedPD set unresponsiveStartTime_ 0 QueueMonitor/ED/Flow/RedPD set lastDropTime_ 0 QueueMonitor/ED/Flow/RedPD set auto_ 0 DelayLink set bandwidth_ 1.5Mb DelayLink set delay_ 100ms DelayLink set debug_ false DynamicLink set status_ 1 DynamicLink set debug_ false Filter set debug_ false Filter/Field set offset_ 0 Filter/Field set match_ -1 Classifier set offset_ 0 Classifier set shift_ 0 Classifier set mask_ 0xffffffff Classifier set debug_ false Classifier/Hash set default_ -1; # none Classifier/Replicator set ignore_ 0 Classifier/Addr/MPLS set ttl_ 32 Classifier/Addr/MPLS set trace_mpls_ 0 Classifier/Addr/MPLS set label_ -1 Classifier/Addr/MPLS set enable_reroute_ 0 Classifier/Addr/MPLS set reroute_option_ 0 Classifier/Addr/MPLS set control_driven_ 0 Classifier/Addr/MPLS set data_driven_ 0 FECModel set debug_ false ErrorModule set debug_ false ErrorModel set enable_ 1 ErrorModel set markecn_ false ErrorModel set rate_ 0 ErrorModel set bandwidth_ 2Mb ErrorModel set debug_ false ErrorModel/Trace set good_ 123456789 ErrorModel/Trace set loss_ 0 ErrorModel/Periodic set period_ 1.0 ErrorModel/Periodic set offset_ 0.0 ErrorModel/Periodic set burstlen_ 0.0 ErrorModel/MultiState set curperiod_ 0.0 ErrorModel/MultiState set sttype_ pkt ErrorModel/MultiState set texpired_ 0 SelectErrorModel set enable_ 1 SelectErrorModel set markecn_ false SelectErrorModel set rate_ 0 SelectErrorModel set bandwidth_ 2Mb SelectErrorModel set pkt_type_ 2 SelectErrorModel set drop_cycle_ 10 SelectErrorModel set drop_offset_ 1 SelectErrorModel set debug_ false SRMErrorModel set enable_ 1 SRMErrorModel set markecn_ false SRMErrorModel set rate_ 0 SRMErrorModel set bandwidth_ 2Mb SRMErrorModel set pkt_type_ 2 SRMErrorModel set drop_cycle_ 10 SRMErrorModel set drop_offset_ 1 SRMErrorModel set debug_ false rtModel set startTime_ 0.5 rtModel set finishTime_ "-" rtModel/Exponential set upInterval_ 10.0 rtModel/Exponential set downInterval_ 1.0 rtModel/Deterministic set upInterval_ 2.0 rtModel/Deterministic set downInterval_ 1.0 Application/Traffic/CBR_PP set rate_ 448Kb ;# corresponds to interval of 3.75ms Application/Traffic/CBR_PP set packetSize_ 210 Application/Traffic/CBR_PP set random_ 0 Application/Traffic/CBR_PP set maxpkts_ 268435456; # 0x10000000 Application/Traffic/CBR_PP set PBM_ 2 Application/Traffic/Exponential set burst_time_ .5 Application/Traffic/Exponential set idle_time_ .5 Application/Traffic/Exponential set rate_ 64Kb Application/Traffic/Exponential set packetSize_ 210 Application/Traffic/Pareto set burst_time_ 500ms Application/Traffic/Pareto set idle_time_ 500ms Application/Traffic/Pareto set rate_ 64Kb Application/Traffic/Pareto set packetSize_ 210 Application/Traffic/Pareto set shape_ 1.5 Application/Traffic/RealAudio set burst_time_ 0.05ms Application/Traffic/RealAudio set idle_time_ 1800ms Application/Traffic/RealAudio set rate_ 2Kb Application/Traffic/RealAudio set packetSize_ 240 Application/Traffic/RealAudio set minCDF_ 0 Application/Traffic/RealAudio set maxCDF_ 1 Application/Traffic/RealAudio set interpolation_ 0 Application/Traffic/RealAudio set maxEntry_ 32 Application/Traffic/CBR set rate_ 448Kb ;# corresponds to interval of 3.75ms Application/Traffic/CBR set packetSize_ 210 Application/Traffic/CBR set random_ 0 Application/Traffic/CBR set maxpkts_ 268435456; # 0x10000000 Application/Telnet set interval_ 1.0 RandomVariable/Uniform set min_ 0.0 RandomVariable/Uniform set max_ 1.0 RandomVariable/Exponential set avg_ 1.0 RandomVariable/Pareto set avg_ 1.0 RandomVariable/Pareto set shape_ 1.5 RandomVariable/ParetoII set avg_ 10.0 RandomVariable/ParetoII set shape_ 1.2 RandomVariable/Constant set val_ 1.0 RandomVariable/HyperExponential set avg_ 1.0 RandomVariable/HyperExponential set cov_ 4.0 RandomVariable/Empirical set minCDF_ 0 RandomVariable/Empirical set maxCDF_ 1 RandomVariable/Empirical set interpolation_ 0 RandomVariable/Empirical set maxEntry_ 32 RandomVariable/Normal set avg_ 0.0 RandomVariable/Normal set std_ 1.0 RandomVariable/LogNormal set avg_ 1.0 RandomVariable/LogNormal set std_ 1.0 ADC/MS set debug_ false ADC/HB set debug_ false ADC/Param set debug_ false ADC/ACTP set debug_ false ADC/ACTO set debug_ false Est/Null set debug_ false Est/TimeWindow set debug_ false Est/ExpAvg set debug_ false Est/PointSample set debug_ false MeasureMod set debug_ false SALink set debug_ false Node set multiPath_ 0 Node set rtagent_port_ 255 Node/MobileNode set X_ 0 Node/MobileNode set Y_ 0 Node/MobileNode set Z_ 0 Node/MobileNode set speed_ 0 Node/MobileNode set position_update_interval_ 0 Node/MobileNode set bandwidth_ 0 ;# not used Node/MobileNode set delay_ 0 ;# not used Node/MobileNode set REGAGENT_PORT 0 Node/MobileNode set DECAP_PORT 1 AddrParams set ALL_BITS_SET 0xffffffff AddrParams PortShift 0 AddrParams PortMask [AddrParams set ALL_BITS_SET] AddrParams set domain_num_ 1 AddrParams set def_clusters 4 AddrParams set def_nodes 5 AllocAddrBits set DEFADDRSIZE_ 32 AllocAddrBits set MAXADDRSIZE_ 32 ;# leaving the signed bit Simulator set node_factory_ Node Simulator set nsv1flag 0 Simulator set mobile_ip_ 0 ;# flag for mobileIP Simulator set routingAgent_ "" Simulator set addressType_ "" Simulator set MovementTrace_ OFF Simulator set IMEPFlag_ "" Simulator set WirelessNewTrace_ 0 Simulator set propInstCreated_ 0 SessionSim set rc_ 0 Simulator set McastBaseAddr_ 0x80000000 Simulator set McastAddr_ 0x80000000 Simulator set AgentTrace_ ON Simulator set RouterTrace_ OFF Simulator set MacTrace_ OFF SessionHelper set rc_ 0 ;# just to eliminate warnings SessionHelper set debug_ false NetworkInterface set debug_ false TBF set rate_ 64k TBF set bucket_ 1024 TBF set qlen_ 0 MIPEncapsulator set addr_ 0 MIPEncapsulator set port_ 0 MIPEncapsulator set shift_ 0 MIPEncapsulator set mask_ [AddrParams set ALL_BITS_SET] MIPEncapsulator set ttl_ 32 MIPEncapsulator set debug_ false GAFPartner set addr_ 0 GAFPartner set port_ 254 GAFPartner set shift_ 0 GAFPartner set mask_ [AddrParams set ALL_BITS_SET] GAFPartner set debug_ false Mac set debug_ false ARPTable set debug_ false God set debug_ false Mac/Tdma set slot_packet_len_ 1500 Mac/Tdma set max_node_num_ 64 LL set mindelay_ 50us LL set delay_ 25us LL set bandwidth_ 0 ;# not used LL set debug_ false Classifier/Replicator set direction_ false Mac set abstract_ false Mac/802_3 set trace_ false Antenna/OmniAntenna set X_ 0 Antenna/OmniAntenna set Y_ 0 Antenna/OmniAntenna set Z_ 1.5 Antenna/OmniAntenna set Gt_ 1.0 Antenna/OmniAntenna set Gr_ 1.0 Phy/WirelessPhy set CPThresh_ 10.0 Phy/WirelessPhy set CSThresh_ 1.559e-11 Phy/WirelessPhy set RXThresh_ 3.652e-10 Phy/WirelessPhy set bandwidth_ 2e6 Phy/WirelessPhy set Pt_ 0.28183815 Phy/WirelessPhy set freq_ 914e+6 Phy/WirelessPhy set L_ 1.0 Phy/WirelessPhy set debug_ false Phy/WiredPhy set bandwidth_ 10e6 Phy/WiredPhy set debug_ false Phy/Repeater set debug_ false LanRouter set debug_ false Phy/Sat set debug_ false Mac/Sat set debug_ false LL/Sat set debug_ false Propagation/Shadowing set pathlossExp_ 2.0 Propagation/Shadowing set std_db_ 4.0 Propagation/Shadowing set dist0_ 1.0 Propagation/Shadowing set seed_ 0 Agent set fid_ 0 Agent set prio_ 0 Agent set agent_addr_ -1 Agent set agent_port_ -1 Agent set dst_addr_ -1 Agent set dst_port_ -1 Agent set flags_ 0 Agent set ttl_ 32 ; # arbitrary choice here Agent set debug_ false Agent set class_ 0 Agent/Ping set packetSize_ 64 Agent/UDP set packetSize_ 1000 Agent/UDP instproc done {} { } Agent/TCP set to_inference_ 20 Agent/TCP set thr_ 0.3 Agent/TCP set owd_opt_ 0 Agent/TCP set thr_perc_ 100 Agent/TCP set sowd_param_ 1 Agent/TCP set rl_ 0 Agent/TCP set seqno_ 0 Agent/TCP set t_seqno_ 0 Agent/TCP set maxburst_ 0 Agent/TCP set maxcwnd_ 0 Agent/TCP set numdupacks_ 3 Agent/TCP set window_ 20 Agent/TCP set windowInit_ 2 ; # default changed on 2001/5/26. Agent/TCP set windowInitOption_ 1 Agent/TCP set syn_ true ; # default changed on 2001/5/17. Agent/TCP set windowOption_ 1 Agent/TCP set windowConstant_ 4 Agent/TCP set windowThresh_ 0.002 Agent/TCP set decrease_num_ 0.5 Agent/TCP set increase_num_ 1.0 Agent/TCP set k_parameter_ 0.0 ; # for binomial congestion control Agent/TCP set l_parameter_ 1.0 ; # for binomial congestion control Agent/TCP set overhead_ 0 Agent/TCP set ecn_ 0 Agent/TCP set old_ecn_ 0 Agent/TCP set packetSize_ 1000 Agent/TCP set tcpip_base_hdr_size_ 40 Agent/TCP set bugFix_ true Agent/TCP set timestamps_ false Agent/TCP set slow_start_restart_ true Agent/TCP set restart_bugfix_ true Agent/TCP set tcpTick_ 0.1 Agent/TCP set maxrto_ 100000 Agent/TCP set minrto_ 1 ; # Default set to 1 on 2001/05/14. Agent/TCP set srtt_init_ 0 Agent/TCP set rttvar_init_ 12 Agent/TCP set rtxcur_init_ 6.0 Agent/TCP set T_SRTT_BITS 3 Agent/TCP set T_RTTVAR_BITS 2 Agent/TCP set rttvar_exp_ 2 Agent/TCP set timerfix_ true ; # Variable added on 2001/05/11 Agent/TCP instproc done {} { } Agent/TCP set noFastRetrans_ false Agent/TCP set dupacks_ 0 Agent/TCP set ack_ 0 Agent/TCP set cwnd_ 0 Agent/TCP set awnd_ 0 Agent/TCP set ssthresh_ 0 Agent/TCP set rtt_ 0 Agent/TCP set srtt_ 0 Agent/TCP set rttvar_ 0 Agent/TCP set backoff_ 0 Agent/TCP set maxseq_ 0 Agent/TCP set singledup_ 0 Agent/TCP set precisionReduce_ false Agent/TCP set oldCode_ false Agent/TCP set ndatapack_ 0 Agent/TCP set ndatabytes_ 0 Agent/TCP set nackpack_ 0 Agent/TCP set nrexmit_ 0 Agent/TCP set nrexmitpack_ 0 Agent/TCP set nrexmitbytes_ 0 Agent/TCP set trace_all_oneline_ false Agent/TCP set QOption_ 0 Agent/TCP set EnblRTTCtr_ 0 Agent/TCP set control_increase_ 0 Agent/TCP set nam_tracevar_ false Agent/TCP/Fack set ss-div4_ false Agent/TCP/Fack set rampdown_ false Agent/TCP set eln_ 0 Agent/TCP set eln_rxmit_thresh_ 1 Agent/TCP set delay_growth_ true ; # default changed on 2001/5/17. Agent/TCP set CoarseTimer_ 0 Agent/TCPSink set sport_ 0 Agent/TCPSink set dport_ 0 Agent/TCPSink set packetSize_ 40 Agent/TCPSink set maxSackBlocks_ 3 Agent/TCPSink set ts_echo_bugfix_ false Agent/TCPSink set generateDSacks_ false Agent/TCPSink set RFC2581_immediate_ack_ true Agent/TCPSink/DelAck set interval_ 100ms catch { Agent/TCPSink/Asym set interval_ 100ms Agent/TCPSink/Asym set maxdelack_ 5 } Agent/TCPSink/Sack1/DelAck set interval_ 100ms Agent/TCP/Newreno set newreno_changes_ 0 Agent/TCP/Newreno set newreno_changes1_ 0 Agent/TCP/Newreno set partial_window_deflation_ 0 Agent/TCP/Newreno set exit_recovery_fix_ 0 Agent/TCP/Vegas set v_alpha_ 1 Agent/TCP/Vegas set v_beta_ 3 Agent/TCP/Vegas set v_gamma_ 1 Agent/TCP/Vegas set v_rtt_ 0 Agent/TCP/Vegas/RBP set rbp_scale_ 0.75 Agent/TCP/Vegas/RBP set rbp_rate_algorithm_ 1 Agent/TCP/Vegas/RBP set rbp_segs_actually_paced_ 0 Agent/TCP/Vegas/RBP set rbp_inter_pace_delay_ 0 Agent/TCP/Reno/RBP set rbp_scale_ 0.75 Agent/TCP/Reno/RBP set rbp_segs_actually_paced_ 0 Agent/TCP/Reno/RBP set rbp_inter_pace_delay_ 0 Agent/TCP/Asym set g_ 0.125 Agent/TCP/Reno/Asym set g_ 0.125 Agent/TCP/Newreno/Asym set g_ 0.125 Agent/TCP/RFC793edu set add793expbackoff_ true Agent/TCP/RFC793edu set add793jacobsonrtt_ false Agent/TCP/RFC793edu set add793fastrtx_ false Agent/TCP/RFC793edu set add793slowstart_ false Agent/TCP/RFC793edu set add793additiveinc_ false Agent/TCP/RFC793edu set add793karnrtt_ true Agent/TCP/RFC793edu set rto_ 60 Agent/TCP/RFC793edu set syn_ true Agent/TCP/RFC793edu set add793exponinc_ false Agent/TFRC set packetSize_ 1000 Agent/TFRC set df_ 0.95 ; # decay factor for accurate RTT estimate Agent/TFRC set tcp_tick_ 0.01 ; Agent/TFRC set ndatapack_ 0 ; # Number of packets sent Agent/TFRC set srtt_init_ 0 ; # Variables for tracking RTT Agent/TFRC set rttvar_init_ 12 Agent/TFRC set rtxcur_init_ 6.0 Agent/TFRC set rttvar_exp_ 2 Agent/TFRC set T_SRTT_BITS 3 Agent/TFRC set T_RTTVAR_BITS 2 Agent/TFRC set InitRate_ 300 ; # Initial send rate Agent/TFRC set overhead_ 0 ; # If > 0, dither outgoing packets Agent/TFRC set ssmult_ 2 ; # Rate of increase during slow-start: Agent/TFRC set bval_ 1 ; # Value of B for TCP formula Agent/TFRC set ca_ 1 ; # Enable Sqrt(RTT) congestion avoidance Agent/TFRC set printStatus_ 0 Agent/TFRC set maxHeavyRounds_ 1; # Number of rounds for sending rate allowed Agent/TFRC set conservative_ 0 ; # Set to true for a conservative Agent/TFRC set ecn_ 0 ; # Set to 1 for ECN-capable connection. Agent/TFRC set SndrType_ 0 ; # Set to 1 to use data-producing applications Agent/TFRCSink set packetSize_ 40 Agent/TFRCSink set InitHistorySize_ 100000 Agent/TFRCSink set NumFeedback_ 1 Agent/TFRCSink set AdjustHistoryAfterSS_ 1 Agent/TFRCSink set NumSamples_ -1 Agent/TFRCSink set discount_ 1; # History Discounting Agent/TFRCSink set printLoss_ 0 Agent/TFRCSink set smooth_ 1 ; # smoother Average Loss Interval Agent/TFRCSink set minlc_ 4 Agent/TFRCSink set algo_ 1 ; # 1: algo from sigcomm paper 2: ewma Agent/TFRCSink set maxint_ 1000 ; # max loss interval history Agent/TFRCSink set history_ 0.75 ; # loss history for EWMA if [TclObject is-class Agent/TCP/FullTcp] { Agent/TCP/FullTcp set segsperack_ 1; # ACK frequency Agent/TCP/FullTcp set segsize_ 536; # segment size Agent/TCP/FullTcp set tcprexmtthresh_ 3; # num dupacks to enter recov Agent/TCP/FullTcp set iss_ 0; # Initial send seq# Agent/TCP/FullTcp set nodelay_ false; # Nagle disable? Agent/TCP/FullTcp set data_on_syn_ false; # allow data on 1st SYN? Agent/TCP/FullTcp set dupseg_fix_ true ; # no rexmt w/dup segs from peer Agent/TCP/FullTcp set dupack_reset_ false; # exit recov on ack < highest Agent/TCP/FullTcp set interval_ 0.1 ; # delayed ACK interval 100ms Agent/TCP/FullTcp set close_on_empty_ false; # close conn if sent all Agent/TCP/FullTcp set ts_option_size_ 10; # in bytes Agent/TCP/FullTcp set reno_fastrecov_ true; # fast recov true by default Agent/TCP/FullTcp set pipectrl_ false; # use "pipe" ctrl Agent/TCP/FullTcp set open_cwnd_on_pack_ true; # ^ win on partial acks? Agent/TCP/FullTcp set halfclose_ false; # do simplex closes (shutdown)? Agent/TCP/FullTcp/Newreno set recov_maxburst_ 2; # max burst dur recov Agent/TCP/FullTcp/Sack set sack_block_size_ 8; # bytes in a SACK block Agent/TCP/FullTcp/Sack set sack_option_size_ 2; # bytes in opt hdr Agent/TCP/FullTcp/Sack set max_sack_blocks_ 3; # max # of sack blks } if [TclObject is-class Agent/TCP/BayFullTcp] { Agent/TCP/BayFullTcp set segsperack_ 1; # ACK frequency Agent/TCP/BayFullTcp set segsize_ 536; # segment size Agent/TCP/BayFullTcp set tcprexmtthresh_ 3; # num dupacks to enter recov Agent/TCP/BayFullTcp set iss_ 0; # Initial send seq# Agent/TCP/BayFullTcp set nodelay_ false; # Nagle disable? Agent/TCP/BayFullTcp set data_on_syn_ false; # allow data on 1st SYN? Agent/TCP/BayFullTcp set dupseg_fix_ true ; # no rexmt w/dup segs from peer Agent/TCP/BayFullTcp set dupack_reset_ false; # exit recov on ack < highest Agent/TCP/BayFullTcp set interval_ 0.1 ; # delayed ACK interval 100ms Agent/TCP/BayFullTcp set close_on_empty_ false; # close conn if sent all } Agent/Null set sport_ 0 Agent/Null set dport_ 0 Agent/CBR set sport_ 0 Agent/CBR set dport_ 0 Agent/HttpInval set inval_hdr_size_ 40 Agent/RTP set seqno_ 0 Agent/RTP set interval_ 3.75ms Agent/RTP set random_ 0 Agent/RTP set packetSize_ 210 Agent/RTP set maxpkts_ 0x10000000 Agent/RTP instproc done {} { } Agent/RTCP set seqno_ 0 Agent/Message set packetSize_ 180 Agent/LossMonitor set nlost_ 0 Agent/LossMonitor set npkts_ 0 Agent/LossMonitor set bytes_ 0 Agent/LossMonitor set lastPktTime_ 0 Agent/LossMonitor set expected_ 0 Agent/RAP set packetSize_ 512 Agent/RAP set seqno_ 0 Agent/RAP set sessionLossCount_ 0 Agent/RAP set ipg_ 2.0 Agent/RAP set alpha_ 1.0 Agent/RAP set beta_ 0.5 Agent/RAP set srtt_ 2.0 Agent/RAP set variance_ 0.0 Agent/RAP set delta_ 0.5 Agent/RAP set mu_ 1.2 Agent/RAP set phi_ 4.0 Agent/RAP set timeout_ 2.0 Agent/RAP set overhead_ 0 Agent/RAP set useFineGrain_ 0 Agent/RAP set kfrtt_ 0.9 Agent/RAP set kxrtt_ 0.01 Agent/RAP set debugEnable_ 0 Agent/RAP set rap_base_hdr_size_ 44 Agent/RAP set dpthresh_ 50 Agent/RAP instproc done {} { } Agent/Mcast/Control set packetSize_ 80 Agent/rtProto set preference_ 200 ;# global default preference Agent/rtProto/Direct set preference_ 100 Agent/rtProto/DV set preference_ 120 Agent/rtProto/DV set INFINITY [Agent set ttl_] Agent/rtProto/DV set advertInterval 2 Agent/Encapsulator set status_ 1 Agent/Encapsulator set overhead_ 20 Agent/DSRAgent set sport_ 255 Agent/DSRAgent set dport_ 255 Agent/MIPBS set adSize_ 48 Agent/MIPBS set shift_ 0 Agent/MIPBS set mask_ [AddrParams set ALL_BITS_SET] Agent/MIPBS set ad_lifetime_ 2 Agent/MIPMH set home_agent_ 0 Agent/MIPMH set rreqSize_ 52 Agent/MIPMH set reg_rtx_ 0.5 Agent/MIPMH set shift_ 0 Agent/MIPMH set mask_ [AddrParams set ALL_BITS_SET] Agent/MIPMH set reg_lifetime_ 2 Agent/Diff_Sink set packetSize_ 512 Agent/Diff_Sink set interval_ 0.5 Agent/Diff_Sink set random_ 1 Agent/Diff_Sink set maxpkts_ 10000 Agent/Diff_Sink set data_type_ 0 Agent/LossMonitor/PLM set flag_PP_ 0 Agent/LossMonitor/PLM set packet_time_PP_ 0 Agent/LossMonitor/PLM set fid_PP_ 0 Agent/LossMonitor/PLM set seqno_ 0 Agent/LDP set trace_ldp_ 0 Simulator set nix-routing 0 RtModule set classifier_ "" RtModule/Base set classifier_ "" if [TclObject is-class Network/Pcap/Live] { Network/Pcap/Live set snaplen_ 4096;# bpf snap len Network/Pcap/Live set promisc_ false; Network/Pcap/Live set timeout_ 0 Network/Pcap/Live set optimize_ true;# bpf code optimizer Network/Pcap/Live set offset_ 0.0; # Network/Pcap/File set offset_ 0.0; # ts for 1st pkt in trace file } if [TclObject is-class Agent/Tap] { Agent/Tap set maxpkt_ 1600 } if [TclObject is-class Agent/TCPTap] { Agent/TCPTap set maxpkt_ 1600 } if [TclObject is-class Agent/IcmpAgent] { Agent/IcmpAgent set ttl_ 254 } if [TclObject is-class Agent/IPTap] { Agent/IPTap set maxpkt_ 1600 } if [TclObject is-class ArpAgent] { ArpAgent set cachesize_ 10; # entries in arp cache ArpAgent instproc init {} { $self next } ArpAgent instproc config ifname { $self instvar net_ myether_ myip_ set net_ [new Network/Pcap/Live] $net_ open readwrite $ifname set myether_ [$net_ linkaddr] set myip_ [$net_ netaddr] $net_ filter "arp and (not ether src $myether_) and \ (ether dst $myether_ \ or ether dst ff:ff:ff:ff:ff:ff)" $self cmd network $net_ $self cmd myether $myether_ $self cmd myip $myip_ } } Node instproc add-pushback-agent {} { $self instvar pushback_ set pushback_ [new Agent/Pushback] [Simulator instance] attach-agent $self $pushback_ $pushback_ initialize $self [[Simulator instance] get-routelogic] return $pushback_ } Node instproc get-pushback-agent {} { $self instvar pushback_ if [info exists pushback_] { return $pushback_ } else { return -1 } } Simulator instproc pushback-duplex-link {n1 n2 bw delay} { $self pushback-simplex-link $n1 $n2 $bw $delay $self pushback-simplex-link $n2 $n1 $bw $delay } Simulator instproc pushback-simplex-link {n1 n2 bw delay} { set pba [$n1 get-pushback-agent] if {$pba == -1} { puts "Node does not have a pushback agent" exit } $self simplex-link $n1 $n2 $bw $delay RED/Pushback $pba set link [$self link $n1 $n2] set qmon [new QueueMonitor/ED] $link attach-monitors [new SnoopQueue/In] [new SnoopQueue/Out] [new SnoopQueue/Drop] $qmon set queue [$link queue] $queue set pushbackID_ [$pba add-queue $queue] $queue set-monitor $qmon $queue set-src-dst [$n1 set id_] [$n2 set id_] } Agent/Pushback instproc get-pba-port {nodeid} { set node [[Simulator instance] set Node_($nodeid)] set pba [$node get-pushback-agent] if {$pba == -1} { return -1 } else { return [$pba set agent_port_] } } Agent/Pushback instproc check-queue { src dst qToCheck } { set link [[Simulator instance] set link_($src:$dst)] set queue [$link queue] if {$qToCheck == $queue} { return 1 } else { return 0 } } Queue/RED/Pushback set pushbackID_ -1 Queue/RED/Pushback set rate_limiting_ 1 Agent/Pushback set last_index_ 0 Agent/Pushback set intResult_ -1 Agent/Pushback set enable_pushback_ 1 Agent/Pushback set verbose_ false Queue/RED/Pushback instproc attach-traces {src dst file {op ""}} { $self next $src $dst $file $op set ns [Simulator instance] set type "Drop" set rldrop_trace [$ns create-trace $type $file $src $dst $op] set oldTrace [$self rldrop-trace] if {$oldTrace!=0} { puts "exists" $rldrop_trace target $oldTrace } else { $rldrop_trace target [$ns set nullAgent_] } $self rldrop-trace $rldrop_trace } Simulator instproc init args { $self create_packetformat $self use-scheduler Calendar $self set nullAgent_ [new Agent/Null] $self set-address-format def if {[lindex $args 0] == "-multicast"} { $self multicast $args } eval $self next $args } Simulator instproc nullagent {} { $self instvar nullAgent_ return $nullAgent_ } Simulator instproc use-scheduler type { $self instvar scheduler_ if [info exists scheduler_] { if { [$scheduler_ info class] == "Scheduler/$type" } { return } else { delete $scheduler_ } } set scheduler_ [new Scheduler/$type] $scheduler_ now } Simulator instproc delay_parse { spec } { return [time_parse $spec] } Simulator instproc bw_parse { spec } { return [bw_parse $spec] } Simulator instproc dumper obj { set t [$self alloc-trace hop stdout] $t target $obj return $t } Simulator instproc addressType {val} { $self set addressType_ $val } Simulator instproc adhocRouting {val} { $self set routingAgent_ $val } Simulator instproc llType {val} { $self set llType_ $val } Simulator instproc macType {val} { $self set macType_ $val } Simulator instproc propType {val} { $self set propType_ $val } Simulator instproc propInstance {val} { $self set propInstance_ $val } Simulator instproc ifqType {val} { $self set ifqType_ $val } Simulator instproc ifqLen {val} { $self set ifqlen_ $val } Simulator instproc phyType {val} { $self set phyType_ $val } Simulator instproc antType {val} { $self set antType_ $val } Simulator instproc channel {val} {$self set channel_ $val} Simulator instproc channelType {val} {$self set channelType_ $val} Simulator instproc topoInstance {val} {$self set topoInstance_ $val} Simulator instproc wiredRouting {val} {$self set wiredRouting_ $val} Simulator instproc mobileIP {val} {$self set mobileIP_ $val} Simulator instproc energyModel {val} { $self set energyModel_ $val } Simulator instproc initialEnergy {val} { $self set initialEnergy_ $val } Simulator instproc txPower {val} { $self set txPower_ $val } Simulator instproc rxPower {val} { $self set rxPower_ $val } Simulator instproc idlePower {val} { $self set idlePower_ $val } Simulator instproc errProc {val} { $self set errProc_ $val } Simulator instproc FECProc {val} { $self set FECProc_ $val } Simulator instproc agentTrace {val} { $self set agentTrace_ $val } Simulator instproc routerTrace {val} { $self set routerTrace_ $val } Simulator instproc macTrace {val} { $self set macTrace_ $val } Simulator instproc movementTrace {val} { $self set movementTrace_ $val } Simulator instproc toraDebug {val} {$self set toraDebug_ $val } Simulator instproc MPLS { val } { if { $val == "ON" } { Node enable-module "MPLS" } else { Node disable-module "MPLS" } } Simulator instproc get-nodetype {} { $self instvar addressType_ routingAgent_ wiredRouting_ set val "" if { [info exists addressType_] && $addressType_ == "hierarchical" } { set val Hier } if { [info exists routingAgent_] && $routingAgent_ != "" } { set val Mobile } if { [info exists wiredRouting_] && $wiredRouting_ == "ON" } { set val Base } if { [info exists wiredRouting_] && $wiredRouting_ == "OFF"} { set val Base } if { [Simulator set mobile_ip_] } { if { $val == "Base" && $wiredRouting_ == "ON" } { set val MIPBS } if { $val == "Base" && $wiredRouting_ == "OFF" } { set val MIPMH } } return $val } Simulator instproc node-config args { set args [eval $self init-vars $args] $self instvar addressType_ routingAgent_ propType_ macTrace_ \ routerTrace_ agentTrace_ movementTrace_ channelType_ channel_ \ chan topoInstance_ propInstance_ mobileIP_ rxPower_ \ txPower_ idlePower_ if [info exists macTrace_] { Simulator set MacTrace_ $macTrace_ } if [info exists routerTrace_] { Simulator set RouterTrace_ $routerTrace_ } if [info exists agentTrace_] { Simulator set AgentTrace_ $agentTrace_ } if [info exists movementTrace_] { Simulator set MovementTrace_ $movementTrace_ } if {[info exists propInstance_]} { if {[info exists propType_] && [Simulator set propInstCreated_] == 0} { warn "Both propType and propInstance are set. propType is ignored." } } else { if {[info exists propType_]} { set propInstance_ [new $propType_] Simulator set propInstCreated_ 1 } } if {[info exists channelType_] && [info exists channel_]} { error "Can't specify both channel and channelType, error!" } elseif {[info exists channelType_]} { warn "Please use -channel as shown in tcl/ex/wireless-mitf.tcl" if {![info exists chan]} { set chan [new $channelType_] } } elseif {[info exists channel_]} { set chan $channel_ } if [info exists topoInstance_] { $propInstance_ topography $topoInstance_ } if {[string compare $addressType_ ""] != 0} { $self set-address-format $addressType_ } if { [info exists mobileIP_] && $mobileIP_ == "ON"} { Simulator set mobile_ip_ 1 } else { if { [info exists mobileIP_] } { Simulator set mobile_ip_ 0 } } } Simulator instproc node args { $self instvar Node_ routingAgent_ wiredRouting_ if { [Simulator info vars EnableMcast_] != "" } { warn "Flag variable Simulator::EnableMcast_ discontinued.\n\t\ Use multicast methods as:\n\t\t\ % set ns \[new Simulator -multicast on]\n\t\t\ % \$ns multicast" $self multicast Simulator unset EnableMcast_ } if { [Simulator info vars NumberInterfaces_] != "" } { warn "Flag variable Simulator::NumberInterfaces_ discontinued.\n\t\ Setting this variable will not affect simulations." Simulator unset NumberInterfaces_ } if { [info exists routingAgent_] && ($routingAgent_ != "") } { set node [eval $self create-wireless-node $args] if {[info exists wiredRouting_] && $wiredRouting_ == "ON"} { set Node_([$node id]) $node $self add-node $node [$node id] } return $node } set node [eval new [Simulator set node_factory_] $args] set Node_([$node id]) $node $self add-node $node [$node id] $node nodeid [$node id] $node set ns_ $self $self check-node-num return $node } Simulator instproc imep-support {} { return [Simulator set IMEPFlag_] } Simulator instproc create-wireless-node args { $self instvar routingAgent_ wiredRouting_ propInstance_ llType_ \ macType_ ifqType_ ifqlen_ phyType_ chan antType_ energyModel_ \ initialEnergy_ txPower_ rxPower_ idlePower_ \ topoInstance_ level1_ level2_ errProc_ FECProc_ Simulator set IMEPFlag_ OFF set node [eval $self create-node-instance $args] if { [info exist wiredRouting_] && $wiredRouting_ == "ON" } { $node base-station [AddrParams addr2id [$node node-addr]] } switch -exact $routingAgent_ { DSDV { set ragent [$self create-dsdv-agent $node] } DSR { $self at 0.0 "$node start-dsr" } AODV { set ragent [$self create-aodv-agent $node] } TORA { Simulator set IMEPFlag_ ON set ragent [$self create-tora-agent $node] } DIFFUSION/RATE { eval $node addr $args set ragent [$self create-diffusion-rate-agent $node] } DIFFUSION/PROB { eval $node addr $args set ragent [$self create-diffusion-probability-agent $node] } FLOODING { eval $node addr $args set ragent [$self create-flooding-agent $node] } OMNIMCAST { eval $node addr $args set ragent [$self create-omnimcast-agent $node] } default { puts "Wrong node routing agent!" exit } } if ![info exist errProc_] { set errProc_ "" } if ![info exist FECProc_] { set FECProc_ "" } $node add-interface $chan $propInstance_ $llType_ $macType_ \ $ifqType_ $ifqlen_ $phyType_ $antType_ $errProc_ $FECProc_ if {$routingAgent_ != "DSR"} { $node attach $ragent [Node set rtagent_port_] } if {$routingAgent_ == "DIFFUSION/RATE" || $routingAgent_ == "DIFFUSION/PROB" || $routingAgent_ == "FLOODING" || $routingAgent_ == "OMNIMCAST" } { $ragent port-dmux [$node demux] $node instvar ll_ $ragent add-ll $ll_(0) } if { [info exist wiredRouting_] && $wiredRouting_ == "ON" } { if { $routingAgent_ != "DSR" } { $node mip-call $ragent } } set tracefd [$self get-ns-traceall] if {$tracefd != "" } { $node nodetrace $tracefd $node agenttrace $tracefd } set namtracefd [$self get-nam-traceall] if {$namtracefd != "" } { $node namattach $namtracefd } if [info exists energyModel_] { if [info exists level1_] { set l1 $level1_ } else { set l1 0.5 } if [info exists level2_] { set l2 $level2_ } else { set l2 0.2 } $node addenergymodel [new $energyModel_ $node \ $initialEnergy_ $l1 $l2] } if [info exists txPower_] { $node setPt $txPower_ } if [info exists rxPower_] { $node setPr $rxPower_ } if [info exists idlePower_] { $node setPidle $idlePower_ } $node topography $topoInstance_ return $node } Simulator instproc create-node-instance args { $self instvar routingAgent_ if {$routingAgent_ == "DSR"} { set nodeclass [$self set-dsr-nodetype] } else { set nodeclass Node/MobileNode } return [eval new $nodeclass $args] } Simulator instproc set-dsr-nodetype {} { $self instvar wiredRouting_ set nodetype SRNodeNew if [Simulator set mobile_ip_] { set nodetype SRNodeNew/MIPMH } if { [info exists wiredRouting_] && $wiredRouting_ == "ON"} { set nodetype Node/MobileNode/BaseStationNode } return $nodetype } Simulator instproc create-tora-agent { node } { set ragent [new Agent/TORA [$node id]] $node set ragent_ $ragent return $ragent } Simulator instproc create-dsdv-agent { node } { set ragent [new Agent/DSDV] set addr [$node node-addr] $ragent addr $addr $ragent node $node if [Simulator set mobile_ip_] { $ragent port-dmux [$node demux] } $node addr $addr $node set ragent_ $ragent $self at 0.0 "$ragent start-dsdv" ;# start updates return $ragent } Simulator instproc create-aodv-agent { node } { set ragent [new Agent/AODV [$node id]] $self at 0.0 "$ragent start" ;# start BEACON/HELLO Messages $node set ragent_ $ragent return $ragent } Simulator instproc use-newtrace {} { Simulator set WirelessNewTrace_ 1 } Simulator instproc hier-node haddr { error "hier-nodes should be created with [$ns_ node $haddr]" } Simulator instproc now {} { $self instvar scheduler_ return [$scheduler_ now] } Simulator instproc at args { $self instvar scheduler_ return [eval $scheduler_ at $args] } Simulator instproc at-now args { $self instvar scheduler_ return [eval $scheduler_ at-now $args] } Simulator instproc cancel args { $self instvar scheduler_ return [eval $scheduler_ cancel $args] } Simulator instproc after {ival args} { eval $self at [expr [$self now] + $ival] $args } Simulator instproc check-node-num {} { if {[Node set nn_] > [expr pow(2, [AddrParams nodebits])]} { error "Number of nodes exceeds node-field-size of [AddrParams nodebits] bits" } } Simulator instproc chk-hier-field-lengths {} { AddrParams instvar domain_num_ cluster_num_ nodes_num_ if [info exists domain_num_] { if {[expr $domain_num_ - 1]> [AddrParams NodeMask 1]} { error "\# of domains exceed dom-field-size " } } if [info exists cluster_num_] { set maxval [expr [find-max $cluster_num_] - 1] if {$maxval > [expr pow(2, [AddrParams NodeMask 2])]} { error "\# of clusters exceed clus-field-size " } } if [info exists nodes_num_] { set maxval [expr [find-max $nodes_num_] -1] if {$maxval > [expr pow(2, [AddrParams NodeMask 3])]} { error "\# of nodess exceed node-field-size" } } } Simulator instproc run {} { $self check-node-num $self rtmodel-configure ;# in case there are any [$self get-routelogic] configure $self instvar scheduler_ Node_ link_ started_ set started_ 1 foreach nn [array names Node_] { $Node_($nn) reset if { [Simulator set nix-routing] } { $Node_($nn) populate-objects } } foreach qn [array names link_] { set q [$link_($qn) queue] $q reset } $self init-nam return [$scheduler_ run] } Simulator instproc log-simstart { } { global simstart puts "Starting Actual Simulation" set simstart [clock seconds] } Simulator instproc halt {} { $self instvar scheduler_ $scheduler_ halt } Simulator instproc dumpq {} { $self instvar scheduler_ $scheduler_ dumpq } Simulator instproc is-started {} { $self instvar started_ return [info exists started_] } Simulator instproc clearMemTrace {} { $self instvar scheduler_ $scheduler_ clearMemTrace } Simulator instproc simplex-link { n1 n2 bw delay qtype args } { $self instvar link_ queueMap_ nullAgent_ set sid [$n1 id] set did [$n2 id] global slink_ set slink_($sid:$did) $self if [info exists queueMap_($qtype)] { set qtype $queueMap_($qtype) } set qtypeOrig $qtype switch -exact $qtype { ErrorModule { if { [llength $args] > 0 } { set q [eval new $qtype $args] } else { set q [new $qtype Fid] } } intserv { set qtype [lindex $args 0] set q [new Queue/$qtype] } default { if { [llength $args] == 0} { set q [new Queue/$qtype] } else { set q [new Queue/$qtype $args] } } } switch -exact $qtypeOrig { RTM { set c [lindex $args 1] set link_($sid:$did) [new CBQLink \ $n1 $n2 $bw $delay $q $c] } CBQ - CBQ/WRR { if {[llength $args] == 0} { set c [new Classifier/Hash/Fid 33] } else { set c [lindex $args 0] } set link_($sid:$did) [new CBQLink \ $n1 $n2 $bw $delay $q $c] } FQ { set link_($sid:$did) [new FQLink $n1 $n2 $bw $delay $q] } intserv { set link_($sid:$did) [new IntServLink \ $n1 $n2 $bw $delay $q \ [concat $qtypeOrig $args]] } default { set link_($sid:$did) [new SimpleLink \ $n1 $n2 $bw $delay $q] } } if {$qtype == "RED/Pushback"} { set pushback 1 } else { set pushback 0 } $n1 add-neighbor $n2 $pushback if {[string first "RED" $qtype] != -1} { $q link [$link_($sid:$did) set link_] } if {[string first "RIO" $qtype] != -1} { $q link [$link_($sid:$did) set link_] } set trace [$self get-ns-traceall] if {$trace != ""} { $self trace-queue $n1 $n2 $trace } set trace [$self get-nam-traceall] if {$trace != ""} { $self namtrace-queue $n1 $n2 $trace } $self register-nam-linkconfig $link_($sid:$did) } Simulator instproc register-nam-linkconfig link { $self instvar linkConfigList_ link_ if [info exists linkConfigList_] { set i1 [[$link src] id] set i2 [[$link dst] id] if [info exists link_($i2:$i1)] { set pos [lsearch $linkConfigList_ $link_($i2:$i1)] if {$pos >= 0} { set a1 [$link_($i2:$i1) get-attribute \ "ORIENTATION"] set a2 [$link get-attribute "ORIENTATION"] if {$a1 == "" && $a2 != ""} { set linkConfigList_ [lreplace \ $linkConfigList_ $pos $pos] } else { return } } } set pos [lsearch $linkConfigList_ $link] if {$pos >= 0} { set linkConfigList_ \ [lreplace $linkConfigList_ $pos $pos] } } lappend linkConfigList_ $link } Simulator instproc remove-nam-linkconfig {i1 i2} { $self instvar linkConfigList_ link_ if ![info exists linkConfigList_] { return } set pos [lsearch $linkConfigList_ $link_($i1:$i2)] if {$pos >= 0} { set linkConfigList_ [lreplace $linkConfigList_ $pos $pos] return } set pos [lsearch $linkConfigList_ $link_($i2:$i1)] if {$pos >= 0} { set linkConfigList_ [lreplace $linkConfigList_ $pos $pos] } } Simulator instproc duplex-link { n1 n2 bw delay type args } { $self instvar link_ set i1 [$n1 id] set i2 [$n2 id] if [info exists link_($i1:$i2)] { $self remove-nam-linkconfig $i1 $i2 } eval $self simplex-link $n1 $n2 $bw $delay $type $args eval $self simplex-link $n2 $n1 $bw $delay $type $args if { [Simulator set nix-routing] } { $n1 set-neighbor [$n2 id] $n2 set-neighbor [$n1 id] } } Simulator instproc duplex-intserv-link { n1 n2 bw pd sched signal adc args } { eval $self duplex-link $n1 $n2 $bw $pd intserv $sched $signal $adc $args } Simulator instproc simplex-link-op { n1 n2 op args } { $self instvar link_ eval $link_([$n1 id]:[$n2 id]) $op $args } Simulator instproc duplex-link-op { n1 n2 op args } { $self instvar link_ eval $link_([$n1 id]:[$n2 id]) $op $args eval $link_([$n2 id]:[$n1 id]) $op $args } Simulator instproc flush-trace {} { $self instvar alltrace_ if [info exists alltrace_] { foreach trace $alltrace_ { $trace flush } } } Simulator instproc namtrace-all file { $self instvar namtraceAllFile_ if {$file != ""} { set namtraceAllFile_ $file } else { unset namtraceAllFile_ } } Simulator instproc energy-color-change {level1 level2} { $self instvar level1_ level2_ set level1_ $level1 set level2_ $level2 } Simulator instproc namtrace-all-wireless {file optx opty} { $self instvar namtraceAllFile_ if {$file != ""} { set namtraceAllFile_ $file } else { unset namtraceAllFile_ } if { $optx != "" && $opty != "" } { $self puts-nam-config "W -t * -x $optx -y $opty" } } Simulator instproc nam-end-wireless {stoptime} { $self instvar namtraceAllFile_ if {$namtraceAllFile_ != ""} { $self puts-nam-config "W -t $stoptime" } } Simulator instproc namtrace-some file { $self instvar namtraceSomeFile_ set namtraceSomeFile_ $file } Simulator instproc namtrace-all-wireless {file optx opty} { $self instvar namtraceAllFile_ if {$file != ""} { set namtraceAllFile_ $file } else { unset namtraceAllFile_ } $self puts-nam-config "W -t * -x $optx -y $opty" } Simulator instproc eventtrace-all {{file ""}} { $self instvar eventTraceAll_ eventtraceAllFile_ traceAllFile_ set eventTraceAll_ 1 if {$file != ""} { set eventtraceAllFile_ $file } else { set eventtraceAllFile_ $traceAllFile_ } } Simulator instproc initial_node_pos {nodep size} { $self instvar addressType_ $self instvar energyModel_ if [info exists energyModel_] { set nodeColor "green" } else { set nodeColor "black" } if { [info exists addressType_] && $addressType_ == "hierarchical" } { $self puts-nam-config "n -t * -a [$nodep set address_] \ -s [$nodep id] -x [$nodep set X_] -y [$nodep set Y_] -Z [$nodep set Z_] \ -z $size -v circle -c $nodeColor" } else { $self puts-nam-config "n -t * -s [$nodep id] \ -x [$nodep set X_] -y [$nodep set Y_] -Z [$nodep set Z_] -z $size \ -v circle -c $nodeColor" } } Simulator instproc trace-all file { $self instvar traceAllFile_ set traceAllFile_ $file } Simulator instproc get-nam-traceall {} { $self instvar namtraceAllFile_ if [info exists namtraceAllFile_] { return $namtraceAllFile_ } else { return "" } } Simulator instproc get-ns-traceall {} { $self instvar traceAllFile_ if [info exists traceAllFile_] { return $traceAllFile_ } else { return "" } } Simulator instproc puts-ns-traceall { str } { $self instvar traceAllFile_ if [info exists traceAllFile_] { puts $traceAllFile_ $str } } Simulator instproc puts-nam-traceall { str } { $self instvar namtraceAllFile_ if [info exists namtraceAllFile_] { puts $namtraceAllFile_ $str } elseif [info exists namtraceSomeFile_] { puts $namtraceSomeFile_ $str } } Simulator instproc namtrace-config { f } { $self instvar namConfigFile_ set namConfigFile_ $f } Simulator instproc get-nam-config {} { $self instvar namConfigFile_ if [info exists namConfigFile_] { return $namConfigFile_ } else { return "" } } Simulator instproc puts-nam-config { str } { $self instvar namtraceAllFile_ namConfigFile_ if [info exists namConfigFile_] { puts $namConfigFile_ $str } elseif [info exists namtraceAllFile_] { puts $namtraceAllFile_ $str } elseif [info exists namtraceSomeFile_] { puts $namtraceSomeFile_ $str } } Simulator instproc color { id name } { $self instvar color_ set color_($id) $name } Simulator instproc get-color { id } { $self instvar color_ return $color_($id) } Simulator instproc create-trace { type file src dst {op ""} } { $self instvar alltrace_ set p [new Trace/$type] if [catch {$p set src_ [$src id]}] { $p set src_ $src } if [catch {$p set dst_ [$dst id]}] { $p set dst_ $dst } lappend alltrace_ $p if {$file != ""} { $p ${op}attach $file } return $p } Simulator instproc create-eventtrace {type owner } { $self instvar alltrace_ $self instvar eventTraceAll_ eventtraceAllFile_ namtraceAllFile_ if ![info exists eventTraceAll_] return if { $eventTraceAll_ == 1 } { set et [new BaseTrace/$type] $owner cmd eventtrace $et lappend alltrace_ $et $et attach $eventtraceAllFile_ if [info exists namtraceAllFile_] { $et namattach $namtraceAllFile_ } } } Simulator instproc namtrace-queue { n1 n2 {file ""} } { $self instvar link_ namtraceAllFile_ if {$file == ""} { if ![info exists namtraceAllFile_] return set file $namtraceAllFile_ } $link_([$n1 id]:[$n2 id]) nam-trace $self $file set queue [$link_([$n1 id]:[$n2 id]) queue] $queue attach-nam-traces $n1 $n2 $file } Simulator instproc trace-queue { n1 n2 {file ""} } { $self instvar link_ traceAllFile_ if {$file == ""} { if ![info exists traceAllFile_] return set file $traceAllFile_ } $link_([$n1 id]:[$n2 id]) trace $self $file set queue [$link_([$n1 id]:[$n2 id]) queue] $queue attach-traces $n1 $n2 $file } Simulator instproc monitor-queue { n1 n2 qtrace { sampleInterval 0.1 } } { $self instvar link_ return [$link_([$n1 id]:[$n2 id]) init-monitor $self $qtrace $sampleInterval] } Simulator instproc queue-limit { n1 n2 limit } { $self instvar link_ [$link_([$n1 id]:[$n2 id]) queue] set limit_ $limit } Simulator instproc drop-trace { n1 n2 trace } { $self instvar link_ [$link_([$n1 id]:[$n2 id]) queue] drop-target $trace } Simulator instproc cost {n1 n2 c} { $self instvar link_ $link_([$n1 id]:[$n2 id]) cost $c } Simulator instproc attach-agent { node agent } { $node attach $agent } Simulator instproc attach-tbf-agent { node agent tbf } { $node attach $agent $agent attach-tbf $tbf } Simulator instproc detach-agent { node agent } { $self instvar nullAgent_ $node detach $agent $nullAgent_ } Simulator instproc delay { n1 n2 delay {type simplex} } { $self instvar link_ set sid [$n1 id] set did [$n2 id] if [info exists link_($sid:$did)] { set d [$link_($sid:$did) link] $d set delay_ $delay } if {$type == "duplex"} { if [info exists link_($did:$sid)] { set d [$link_($did:$sid) link] $d set delay_ $delay } } } Simulator instproc bandwidth { n1 n2 bandwidth {type simplex} } { $self instvar link_ set sid [$n1 id] set did [$n2 id] if [info exists link_($sid:$did)] { set d [$link_($sid:$did) link] $d set bandwidth_ $bandwidth } if {$type == "duplex"} { if [info exists link_($did:$sid)] { set d [$link_($did:$sid) link] $d set bandwidth_ $bandwidth } } } Simulator instproc connect {src dst} { $self simplex-connect $src $dst $self simplex-connect $dst $src global nconn_ conn_ set sid [$src nodeid] set did [$dst nodeid] if {[lindex [split [$src info class] "/"] 1] == "TCP"} { set conn_($nconn_) $sid:$did incr nconn_ } return $src } Simulator instproc simplex-connect { src dst } { $src set dst_addr_ [$dst set agent_addr_] $src set dst_port_ [$dst set agent_port_] if {[lindex [split [$src info class] "/"] 1] == "AbsTCP"} { $self at [$self now] "$self rtt $src $dst" $dst set class_ [$src set class_] } return $src } Simulator proc instance {} { set ns [Simulator info instances] if { $ns != "" } { return $ns } foreach sim [Simulator info subclass] { set ns [$sim info instances] if { $ns != "" } { return $ns } } error "Cannot find instance of simulator" } Simulator instproc get-number-of-nodes {} { return [$self array size Node_] } Simulator instproc get-node-by-id id { $self instvar Node_ return $Node_($id) } Simulator instproc get-node-id-by-addr address { $self instvar Node_ set n [Node set nn_] for {set q 0} {$q < $n} {incr q} { set nq $Node_($q) if {[string compare [$nq node-addr] $address] == 0} { return $q } } error "get-node-id-by-addr:Cannot find node with given address" } Simulator instproc get-node-by-addr address { return [$self get-node-by-id [$self get-node-id-by-addr $address]] } Simulator instproc all-nodes-list {} { $self instvar Node_ set nodes "" foreach n [lsort -dictionary [array names Node_]] { lappend nodes $Node_($n) } return $nodes } Simulator instproc link { n1 n2 } { $self instvar Node_ link_ if { ![catch "$n1 info class Node"] } { set n1 [$n1 id] } if { ![catch "$n2 info class Node"] } { set n2 [$n2 id] } if [info exists link_($n1:$n2)] { return $link_($n1:$n2) } return "" } Simulator instproc create-connection {s_type source d_type dest pktClass} { set s_agent [new Agent/$s_type] set d_agent [new Agent/$d_type] $s_agent set fid_ $pktClass $d_agent set fid_ $pktClass $self attach-agent $source $s_agent $self attach-agent $dest $d_agent $self connect $s_agent $d_agent return $s_agent } Simulator instproc create-connection-list {s_type source d_type dest pktClass} { set s_agent [new Agent/$s_type] set d_agent [new Agent/$d_type] $s_agent set fid_ $pktClass $d_agent set fid_ $pktClass $self attach-agent $source $s_agent $self attach-agent $dest $d_agent $self connect $s_agent $d_agent return [list $s_agent $d_agent] } Simulator instproc create-connection-listen {s_type source d_type dest pktClass} { set s_agent [new Agent/$s_type] set d_agent [new Agent/$d_type] $s_agent set fid_ $pktClass $d_agent set fid_ $pktClass $self attach-agent $source $s_agent $self attach-agent $dest $d_agent $self connect $s_agent $d_agent $d_agent listen return $s_agent } Simulator instproc create-tcp-connection {s_type source d_type dest pktClass} { set s_agent [new Agent/$s_type] set d_agent [new Agent/$d_type] $s_agent set fid_ $pktClass $d_agent set fid_ $pktClass $self attach-agent $source $s_agent $self attach-agent $dest $d_agent return "$s_agent $d_agent" } Classifier instproc install {slot val} { $self set slots_($slot) $val $self cmd install $slot $val } Classifier instproc installNext val { set slot [$self cmd installNext $val] $self set slots_($slot) $val set slot } Classifier instproc adjacents {} { $self array get slots_ } Classifier instproc in-slot? slot { $self instvar slots_ set ret "" if {[array size slots_] < $slot} { set ret slots_($slot) } set ret } Classifier instproc dump {} { $self instvar slots_ offset_ shift_ mask_ puts "classifier $self" puts "\t$offset_ offset" puts "\t$shift_ shift" puts "\t$mask_ mask" puts "\t[array size slots_] slots" foreach i [lsort -integer [array names slots_]] { set iv $slots_($i) puts "\t\tslot $i: $iv ([$iv info class])" } } Classifier instproc no-slot slot { puts stderr "--- Classfier::no-slot{} default handler (tcl/lib/ns-lib.tcl) ---" puts stderr "\t$self: no target for slot $slot" puts stderr "\t$self type: [$self info class]" puts stderr "content dump:" $self dump puts stderr "---------- Finished standard no-slot{} default handler ----------" [Simulator instance] flush-trace exit 1 } Classifier/Hash instproc dump args { eval $self next $args $self instvar default_ puts "\t$default_ default" } Classifier/Hash instproc init nbuck { $self next $nbuck $self instvar shift_ mask_ set shift_ [AddrParams NodeShift 1] set mask_ [AddrParams NodeMask 1] } Classifier/Port/Reserve instproc init args { eval $self next $self reserve-port 2 } Simulator instproc makeflowmon { cltype { clslots 29 } } { set flowmon [new QueueMonitor/ED/Flowmon] set cl [new Classifier/Hash/$cltype $clslots] $cl proc unknown-flow { src dst fid } { set fdesc [new QueueMonitor/ED/Flow] set dsamp [new Samples] $fdesc set-delay-samples $dsamp set slot [$self installNext $fdesc] $self set-hash auto $src $dst $fid $slot } $cl proc no-slot slotnum { } $flowmon classifier $cl return $flowmon } Simulator instproc attach-fmon {lnk fm { edrop 0 } } { set isnoop [new SnoopQueue/In] set osnoop [new SnoopQueue/Out] set dsnoop [new SnoopQueue/Drop] $lnk attach-monitors $isnoop $osnoop $dsnoop $fm if { $edrop != 0 } { set edsnoop [new SnoopQueue/EDrop] $edsnoop set-monitor $fm [$lnk queue] early-drop-target $edsnoop $edsnoop target [$self set nullAgent_] } [$lnk queue] drop-target $dsnoop } Simulator instproc maketbtagger { cltype { clslots 29 } } { set tagger [new QueueMonitor/ED/Tagger] set cl [new Classifier/Hash/$cltype $clslots] $cl proc unknown-flow { src dst fid } { set fdesc [new QueueMonitor/ED/Flow/TB] set dsamp [new Samples] $fdesc set-delay-samples $dsamp set slot [$self installNext $fdesc] $self set-hash auto $src $dst $fid $slot } $cl proc set-rate { src dst fid hashbucket rate depth init} { set fdesc [new QueueMonitor/ED/Flow/TB] set dsamp [new Samples] $fdesc set-delay-samples $dsamp $fdesc set target_rate_ $rate $fdesc set bucket_depth_ $depth $fdesc set tbucket_ $init set slot [$self installNext $fdesc] $self set-hash $hashbucket $src $dst $fid $slot } $cl proc no-slot slotnum { } $tagger classifier $cl return $tagger } Simulator instproc maketswtagger { cltype { clslots 29 } } { set tagger [new QueueMonitor/ED/Tagger] set cl [new Classifier/Hash/$cltype $clslots] $cl proc unknown-flow { src dst fid hashbucket } { set fdesc [new QueueMonitor/ED/Flow/TSW] set dsamp [new Samples] $fdesc set-delay-samples $dsamp set slot [$self installNext $fdesc] $self set-hash $hashbucket $src $dst $fid $slot } $cl proc no-slot slotnum { } $tagger classifier $cl return $tagger } Simulator instproc attach-tagger {lnk fm} { set isnoop [new SnoopQueue/Tagger] $lnk attach-taggers $isnoop $fm } Simulator instproc lossmodel {lossobj from to} { set link [$self link $from $to] $link errormodule $lossobj } Simulator instproc link-lossmodel {lossobj from to} { set link [$self link $from $to] $link insert-linkloss $lossobj } Simulator instproc rtt { src dst } { $self instvar routingTable_ delay_ set srcid [[$src set node_] id] set dstid [[$dst set node_] id] set delay 0 set tmpid $srcid while {$tmpid != $dstid} { set nextid [$routingTable_ lookup $tmpid $dstid] set tmpnode [$self get-node-by-id $tmpid] set nextnode [$self get-node-by-id $nextid] set tmplink [[$self link $tmpnode $nextnode] link] set delay [expr $delay + [expr 2 * [$tmplink set delay_]]] set delay [expr $delay + [expr 8320 / [$tmplink set bandwidth_]]] set tmpid $nextid } $src rtt $delay return $delay } Simulator instproc abstract-tcp {} { $self instvar TahoeAckfsm_ RenoAckfsm_ TahoeDelAckfsm_ RenoDelAckfsm_ dropper_ $self set TahoeAckfsm_ [new FSM/TahoeAck] $self set RenoAckfsm_ [new FSM/RenoAck] $self set TahoeDelAckfsm_ [new FSM/TahoeDelAck] $self set RenoDelAckfsm_ [new FSM/RenoDelAck] $self set nullAgent_ [new DropTargetAgent] } Simulator instproc create-diffusion-rate-agent {node} { global opt set diff [new Agent/Diffusion/RateGradient] $node set diffagent_ $diff $node set ragent_ $diff $diff on-node $node if [info exist opt(enablePos)] { if {$opt(enablePos) == "true"} { $diff enable-pos } else { $diff disable-pos } } if [info exist opt(enableNeg)] { if {$opt(enableNeg) == "true"} { $diff enable-neg } else { $diff disable-neg } } if [info exist opt(suppression)] { if {$opt(suppression) == "true"} { $diff enable-suppression } else { $diff disable-suppression } } if [info exist opt(subTxType)] { $diff set-sub-tx-type $opt(subTxType) } if [info exist opt(orgTxType)] { $diff set-org-tx-type $opt(orgTxType) } if [info exist opt(posType)] { $diff set-pos-type $opt(posType) } if [info exist opt(posNodeType)] { $diff set-pos-node-type $opt(posNodeType) } if [info exist opt(negWinType)] { $diff set-neg-win-type $opt(negWinType) } if [info exist opt(negThrType)] { $diff set-neg-thr-type $opt(negThrType) } if [info exist opt(negMaxType)] { $diff set-neg-max-type $opt(negMaxType) } $self put-in-list $diff $self at 0.0 "$diff start" return $diff } Simulator instproc create-diffusion-probability-agent {node} { global opt set diff [new Agent/Diffusion/ProbGradient] $node set diffagent_ $diff $node set ragent_ $diff $diff on-node $node if [info exist opt(enablePos)] { if {$opt(enablePos) == "true"} { $diff enable-pos } else { $diff disable-pos } } if [info exist opt(enableNeg)] { if {$opt(enableNeg) == "true"} { $diff enable-neg } else { $diff disable-neg } } $self put-in-list $diff $self at 0.0 "$diff start" return $diff } Simulator instproc create-flooding-agent {node} { set flood [new Agent/Flooding] $node set ragent_ $flood $flood on-node $node $self put-in-list $flood $self at 0.0 "$flood start" return $flood } Simulator instproc create-omnimcast-agent {node} { set omni [new Agent/OmniMcast] $node set ragent_ $omni $omni on-node $node $self put-in-list $omni $self at 0.0 "$omni start" return $omni } Simulator instproc put-in-list {agent} { $self instvar lagent lappend lagent $agent } Simulator instproc terminate-all-agents {} { $self instvar lagent foreach i $lagent { $i terminate } } Simulator instproc prepare-to-stop {} { $self instvar lagent foreach i $lagent { $i stop } } Agent/rtProto/LS set UNREACHABLE [rtObject set unreach_] Agent/rtProto/LS set preference_ 120 Agent/rtProto/LS set INFINITY [Agent set ttl_] Agent/rtProto/LS set advertInterval 1800 Agent/rtProto/LS proc init-all args { if { [llength $args] == 0 } { set nodeslist [[Simulator instance] all-nodes-list] } else { eval "set nodeslist $args" } Agent set-maxttl Agent/rtProto/LS INFINITY eval rtObject init-all $nodeslist foreach node $nodeslist { set proto($node) [[$node rtObject?] add-proto LS $node] } foreach node $nodeslist { foreach nbr [$node neighbors] { set rtobj [$nbr rtObject?] if { $rtobj == "" } { continue } set rtproto [$rtobj rtProto? LS] if { $rtproto == "" } { continue } $proto($node) add-peer $nbr \ [$rtproto set agent_addr_] \ [$rtproto set agent_port_] } } set first_node [lindex $nodeslist 0 ] foreach node $nodeslist { set rtobj [$node rtObject?] if { $rtobj == "" } { continue } set rtproto [$rtobj rtProto? LS] if { $rtproto == "" } { continue } $rtproto cmd initialize if { $node == $first_node } { $rtproto cmd setNodeNumber \ [[Simulator instance] get-number-of-nodes] } } } Agent/rtProto/LS instproc init node { global rtglibRNG $self next $node $self instvar ns_ rtObject_ ifsUp_ rtsChanged_ rtpref_ nextHop_ \ nextHopPeer_ metric_ multiPath_ Agent/rtProto/LS instvar preference_ ;# -- LS stuffs -- $self instvar LS_ready set LS_ready 0 set rtsChanged_ 1 set UNREACHABLE [$class set UNREACHABLE] foreach dest [$ns_ all-nodes-list] { set rtpref_($dest) $preference_ set nextHop_($dest) "" set nextHopPeer_($dest) "" set metric_($dest) $UNREACHABLE } set ifsUp_ "" set multiPath_ [[$rtObject_ set node_] set multiPath_] set updateTime [$rtglibRNG uniform 0.0 0.5] $ns_ at $updateTime "$self send-periodic-update" } Agent/rtProto/LS instproc add-peer {nbr agentAddr agentPort} { $self instvar peers_ $self set peers_($nbr) [new rtPeer $agentAddr $agentPort $class] } Agent/rtProto/LS instproc send-periodic-update {} { global rtglibRNG $self instvar ns_ $self cmd sendUpdates set updateTime [expr [$ns_ now] + ([$class set advertInterval] * \ [$rtglibRNG uniform 0.5 1.5])] $ns_ at $updateTime "$self send-periodic-update" } Agent/rtProto/LS instproc compute-routes {} { $self instvar node_ $self cmd computeRoutes $self install-routes } Agent/rtProto/LS instproc intf-changed {} { $self instvar ns_ peers_ ifs_ ifstat_ ifsUp_ nextHop_ \ nextHopPeer_ metric_ set INFINITY [$class set INFINITY] set ifsUp_ "" foreach nbr [lsort -dictionary [array names peers_]] { set state [$ifs_($nbr) up?] if {$state != $ifstat_($nbr)} { set ifstat_($nbr) $state } } $self cmd intfChanged $self route-changed } ;# called by C++ whenever a LSA or Topo causes a change in the routing table Agent/rtProto/LS instproc route-changed {} { $self instvar node_ $self instvar rtObject_ rtsChanged_ $self install-routes set rtsChanged_ 1 $rtObject_ compute-routes } Agent/rtProto/LS instproc install-routes {} { $self instvar ns_ ifs_ rtpref_ metric_ nextHop_ nextHopPeer_ $self instvar peers_ rtsChanged_ multiPath_ $self instvar node_ preference_ set INFINITY [$class set INFINITY] set MAXPREF [rtObject set maxpref_] set UNREACH [rtObject set unreach_] set rtsChanged_ 1 foreach dst [$ns_ all-nodes-list] { if { $dst == $node_ } { set metric_($dst) 32 ;# the magic number continue } set path [$self cmd lookup [$dst id]] if { [llength $path ] == 0 } { set rtpref_($dst) $MAXPREF set metric_($dst) $UNREACH set nextHop_($dst) "" continue } set cost [lindex $path 0] set rtpref_($dst) $preference_ set metric_($dst) $cost if { ! $multiPath_ } { set nhNode [$ns_ get-node-by-id [lindex $path 1]] set nextHop_($dst) $ifs_($nhNode) continue } set nextHop_($dst) "" set nh "" set count [llength $path] foreach nbr [lsort -dictionary [array names peers_]] { foreach nhId [lrange $path 1 $count ] { if { [$nbr id] == $nhId } { lappend nextHop_($dst) $ifs_($nbr) break } } } } } Agent/rtProto/LS instproc send-updates changes { $self cmd send-buffered-messages } Agent/rtProto/LS proc compute-all {} { } Agent/rtProto/LS instproc get-node-id {} { $self instvar node_ return [$node_ id] } Agent/rtProto/LS instproc get-links-status {} { $self instvar ifs_ ifstat_ set linksStatus "" foreach nbr [array names ifs_] { lappend linksStatus [$nbr id] if {[$ifs_($nbr) up?] == "up"} { lappend linksStatus 1 } else { lappend linksStatus 0 } lappend linksStatus [$ifs_($nbr) cost?] } set linksStatus } Agent/rtProto/LS instproc get-peers {} { $self instvar peers_ set peers "" foreach nbr [lsort -dictionary [array names peers_]] { lappend peers [$nbr id] lappend peers [$peers_($nbr) addr?] lappend peers [$peers_($nbr) port?] } set peers } Agent/rtProto/LS instproc get-delay-estimates {} { $self instvar ifs_ ifstat_ set total_delays "" set packet_size 8000.0 ;# bits foreach nbr [array names ifs_] { set intf $ifs_($nbr) set q_limit [ [$intf queue ] set limit_] set bw [bw_parse [ [$intf link ] set bandwidth_ ] ] set p_delay [time_parse [ [$intf link ] set delay_] ] set total_delay [expr $q_limit * $packet_size / $bw + $p_delay] $self cmd setDelay [$nbr id] $total_delay } } global ptype pvals set ptype(error) -1 set pvals(-1) error set ptype(tcp) 0 set pvals(0) tcp set ptype(udp) 1 set pvals(1) udp set ptype(cbr) 2 set pvals(2) cbr set ptype(audio) 3 set pvals(3) audio set ptype(video) 4 set pvals(4) video set ptype(ack) 5 set pvals(5) ack set ptype(start) 6 set pvals(6) start set ptype(stop) 7 set pvals(7) stop set ptype(prune) 8 set pvals(8) prune set ptype(graft) 9 set pvals(9) graft set ptype(graftack) 10 set pvals(10) graftAck set ptype(join) 11 set pvals(11) join set ptype(assert) 12 set pvals(12) assert set ptype(message) 13 set pvals(13) message set ptype(rtcp) 14 set pvals(14) rtcp set ptype(rtp) 15 set pvals(15) rtp set ptype(rtprotodv) 16 set pvals(16) rtProtoDV set ptype(ctrmcast_encap) 17 set pvals(17) CtrMcast_Encap set ptype(ctrmcast_decap) 18 set pvals(18) CtrMcast_Decap set ptype(srm) 19 set pvals(19) SRM set ptype(sa_req) 20 set pvals(20) sa_req set ptype(sa_accept) 21 set pvals(21) sa_accept set ptype(sa_conf) 22 set pvals(22) sa_conf set ptype(sa_teardown) 23 set pvals(23) sa_teardown set ptype(live) 24 set pvals(24) live set ptype(sa_reject) 25 set pvals(25) sa_reject set ptype(telnet) 26 set pvals(26) telnet set ptype(ftp) 27 set pvals(27) ftp set ptype(pareto) 28 set pvals(28) pareto set ptype(exp) 29 set pvals(29) exp set ptype(httpinval) 30 set pvals(30) httpInval set ptype(http) 31 set pvals(31) http set ptype(encap) 32 set pvals(32) encap set ptype(mftp) 33 set pvals(33) mftp set ptype(arp) 34 set pvals(34) ARP set ptype(mac) 35 set pvals(35) MAC set ptype(tora) 36 set pvals(36) TORA set ptype(dsr) 37 set pvals(37) DSR set ptype(aodv) 38 set pvals(38) AODV set ptype(imep) 39 set pvals(39) IMEP set ptype(rap_data) 40 set pvals(40) rap_data set ptype(rap_ack) 41 set pvals(41) rap_ack set ptype(tcpfriend) 42 set pvals(42) tcpFriend set ptype(tcpfriendctl) 43 set pvals(43) tcpFriendCtl set ptype(ping) 44 set pvals(44) ping set ptype(diffusion) 45 set pvals(45) diffusion set ptype(rtprotols) 46 set pvals(46) rtProtoLS set ptype(ldp) 47 set pvals(47) LDP set ptype(gaf) 48 set pvals(48) gaf set ptype(ra) 49 set pvals(49) ra set ptype(pushback) 50 set pvals(50) pushback proc ptype2val {str} { global ptype set str [string tolower $str] if ![info exists ptype($str)] { set str error } set ptype($str) } proc pval2type {val} { global pvals if ![info exists pvals($val)] { set val -1 } set pvals($val) } tkerror {%s: %s}%s: tcl error on eval of: %s bailing in Tcl::eval [code omitted because of length] %s: "%s": %s trace$self instvar %sset %s 0trace: %s is not a TracedVar1SplitObject::trace called in the base class of %s cmdinstvarnew failed while creating object of class %s-parse-part1expected ?inst/local? or ?inst? ?local? but got XXX delete-shadowSplitObject register %screate-shadowdelete-shadow$self init-instvar %sputs stderr "init-instvar: $errorInfo"@@.AeAmB4&k C @MbP?ư>& .>-q=TclObject: %s is not a TracedVar. newdelete no otcl object associated with C++ TclObject invoked from withing TclObject::invoke()%s too few argumentsnull argument invoked from within '%s %s'Invalid object name '%s'9TclObject8TclClass10TclCommand7InstVar12TracedVarTcl16InstVarTclObject11InstVarReal16InstVarBandwidth11InstVarTime10InstVarInt11InstVarUInt12InstVarInt6411InstVarBool12InstVarError16InstVarTracedInt17InstVarTracedReal%s%.17g%d%u%qd ERROR: %s 9TracedVar%d%g9TracedVar9TracedInt12TracedDouble??? Class InitObject Object instproc init-vars {args} { $self init-default-vars [$self info class] set shadow_args "" for {} {$args != ""} {set args [lrange $args 2 end]} { set key [lindex $args 0] set val [lindex $args 1] if {$val != "" && [string match {-[A-z]*} $key]} { set cmd [string range $key 1 end] if ![catch "$self $cmd $val"] { continue } } lappend shadow_args $key $val } return $shadow_args } Object instproc init-default-vars {classes} { foreach cl $classes { if {$cl == "Object"} continue $self init-default-vars "[$cl info superclass]" foreach var [$cl info vars] { if [catch "$self set $var"] { $self set $var [$cl set $var] } } } } Class SplitObject SplitObject set id 0 SplitObject instproc init args { $self next if [catch "$self create-shadow $args"] { error "__FAILED_SHADOW_OBJECT_" "" } } SplitObject instproc set args { set var [lindex $args 0] $self instvar -parse-part1 $var if {[llength $args] == 1} { return [subst $[subst $var]] } else { return [set $var [lindex $args 1]] } } SplitObject instproc destroy {} { $self delete-shadow $self next } SplitObject proc getid {} { $self instvar id incr id return _o$id } SplitObject proc is-class cl { if [catch "SplitObject info subclass $cl" v] { return 0 } return $v } SplitObject instproc unknown args { if [catch "$self cmd $args" ret] { set cls [$self info class] global errorInfo set savedInfo $errorInfo error "error when calling class $cls: $args" $savedInfo } return $ret } proc new { className args } { set o [SplitObject getid] if [catch "$className create $o $args" msg] { if [string match "__FAILED_SHADOW_OBJECT_" $msg] { delete $o return "" } global errorInfo error "class $className: constructor failed: $msg" $errorInfo } return $o } proc delete o { $o delete_tkvar $o destroy } SplitObject proc register className { set classes [split $className /] set parent SplitObject set path "" set sep "" foreach cl $classes { set path $path$sep$cl if ![$self is-class $path] { Class $path -superclass $parent } set sep / set parent $path } } SplitObject instproc warn-instvar item { $self instvar issuedWarning if ![info exists issuedWarning($item)] { set issuedWarning($item) 1 puts stderr "warning: no class variable $item\n" $self instvar SplitObject_issued_undeclared_warning if ![info exists SplitObject_issued_undeclared_warning] { puts stderr "\tsee tcl-object.tcl in tclcl for info about this warning.\n" set SplitObject_issued_undeclared_warning 1 } } } SplitObject instproc init-instvar var { set cl [$self info class] while { "$cl" != "" && "$cl" != "SplitObject" } { foreach c $cl { if ![catch "$c set $var" val] { $self set $var $val return } } set parents "" foreach c $cl { if { $cl != "SplitObject" && $cl != "Object" } { set parents "$parents [$c info superclass]" } } set cl $parents } $self warn-instvar [$self info class]::$var } proc tkerror msg { global errorInfo puts -nonewline "$msg: " puts $errorInfo exit 1 } proc bgerror msg { global errorInfo puts -nonewline "$msg: " puts $errorInfo exit 1 } Object instproc public args { eval $self instproc $args } Object instproc private args { eval $self instproc $args } Object instproc proc.public args { eval $self proc $args } Object instproc proc.private args { eval $self proc $args } Object instproc proc.invoke { arglist body args } { $self proc invokeproc_ $arglist $body eval [list $self] invokeproc_ $args } Object instproc tkvar args { foreach var $args { if { [llength $var] > 1 } { set varname [lindex $var 1] set var [lindex $var 0] } else { set varname $var } uplevel upvar #0 $self/$var $varname } } Object instproc tkvarname var { return $self/$var } Object instproc delete_tkvar { } { set fullname [$self tkvarname foo] regexp "(.*)foo$" $fullname dummy prefix foreach global [info globals "$prefix*"] { global $global unset $global } } Object instproc info_tkvar { pattern } { set pattern [$self tkvarname $pattern] return [info globals $pattern] } proc TclObject args { return [eval SplitObject $args] } proc SplitObjectCompare {a b} { set o1 [string range $a 2 end] set o2 [string range $b 2 end] if {$o1 < $o2} { return -1 } elseif {$o1 == $o2} { return 0 } else { return 1 } } Object instproc extract-var varname { set aidx [string first "(" $varname] if { $aidx >= 0 } { string range $varname 0 [incr aidx -1] } else { set varname } } Object instproc add-to-list {list elem} { $self instvar [$self extract-var $list] set ret 0 if ![info exists $list] { set $list $elem set ret 1 } elseif { [lsearch [set $list] $elem] < 0 } { lappend $list $elem set ret 1 } set ret } Object instproc remove-from-list {list elem} { $self instvar [$self extract-var $list] set wtag "$self: remove $elem from $list failed" set ret 0 if ![info exists $list] { warn "$wtag: list does not exist" } else { set k [lsearch [set $list] $elem] if { $k < 0 } { warn "$wtag: element does not exist" } else { set $list [lreplace [set $list] $k $k] set ret 1 } } set ret } Class Import Import public init { } { $self next $self set use_http_cache_ 1 } Import public import { args } { $self instvar import_dirs_ table_ if { ![info exists import_dirs_] } { $self init_table } $self consistency_check foreach item $args { if [info exists table_($item)] { set file_list $table_($item) foreach file $table_($item) { if { [set msg [$self source_file $file]]!=""} { error "could not source $file for\ $item:\n$msg" } } } else { set list {} foreach dir $import_dirs_ { lappend list [$self file join $dir \ [$self class_to_file \ $item].mash] } set imported 0 foreach filename $list { if { [$self source_file $filename] == "" } { set imported 1 break } } if { ! $imported } { error "don't know how to import $item\n not\ mapped in: $import_dirs_\ \n and not found in default\ locations: $list" } } } } Import public override_importTable_mapping { object file_list } { $self instvar overrideTable_ import_dirs_ if { [info exists import_dirs_] } { puts stderr "warning: ignoring \"override_importTable_mapping\ $object $file_list\" \n\ It is illegal to modify the internal table \ after the first call to import." return } if { [info exists overrideTable_($object)] } { unset overrideTable_($object) } foreach file $file_list { set fname [$self condense_into_absolute_filename \ [$self file join [pwd] $file]] lappend overrideTable_($object) $fname } } Import proc.private redefine_unknown {} { rename unknown unknown.orig proc unknown { args } { if { ![catch "eval {unknown.orig} $args" m] } { return } $self instvar autoimport_ if { [info exists autoimport_] && $autoimport_ } { really_import [lindex $args 0] } else { error "$m" } } Import proc.private redefine_unknown {} {} } Import proc.public enable_autoimport {} { import Class Object mashutils Import set autoimport_ 1 $self redefine_unknown return } Import proc.public disable_autoimport {} { Import set autoimport_ 0 return } Import disable_autoimport Import private init_table { } { $self instvar import_dirs_ global env if { ![info exists env(TCLCL_IMPORT_DIRS)] } { set env(TCLCL_IMPORT_DIRS) . } set import_dirs_ "" foreach dir [$self smart_parse_env_var $env(TCLCL_IMPORT_DIRS)] { lappend import_dirs_ [$self condense_to_absolute_filename $dir] } set dirs [$self find_import_dirs $import_dirs_] $self make_table $dirs } Import private make_table { dirs } { foreach d $dirs { $self read_dir $d } $self incorporate_table_overrides } Import private incorporate_table_overrides {} { $self instvar overrideTable_ table_ foreach object [array names overrideTable_] { set table_($object) $overrideTable_($object) } } Import private find_import_dirs { dirs } { set list {} foreach dir $dirs { set importLocation [$self file join $dir importLocation] set r [$self file readable $importLocation] if [lindex $r 0] { set lines [$self read_file_into_list $importLocation] foreach line $lines { lappend list [$self \ condense_to_absolute_filename \ [$self file join $dir $line]] } if { [lindex $r 1] != {} } { unset [lindex $r 1] } } else { lappend list $dir } } $self instvar last_modified_ set dirs "" foreach d $list { set import_table [$self file join $d importTable] set last_modified_($import_table) -1 set r [$self file readable $import_table] if [lindex $r 0] { lappend dirs $d if { [lindex $r 1] != {} } { unset [lindex $r 1] } } } return $dirs } Import private read_dir { dir } { $self instvar table_ classes_mapped_ last_modified_ set importTableFile [$self condense_to_absolute_filename \ [$self file join $dir importTable]] set last_modified_($importTableFile) -1 set lines [$self read_file_into_list $importTableFile] foreach line $lines { set index [lindex $line 0] set fname [$self condense_to_absolute_filename \ [$self file join $dir [lindex $line 1]]] set last_modified [string trim [lindex $line 2]] if [info exists classes_mapped_($index)] { continue } if {[info exists table_($index)]} { if {-1!=[lsearch -exact $table_($index) $fname]} { continue } } lappend table_($index) $fname if { $last_modified!={} } { set last_modified_($fname) $last_modified } set this_mappings($index) 1 } foreach index [array names this_mappings] { set classes_mapped_($index) 1 } } Import private smart_parse_env_var { env_value } { set env $env_value while {[string length [set env [string trim $env ":"]]] != 0 } { if [regexp {^([^:]+)://([^:/]+)(:([0-9]+))?(/[^:]*)} \ $env url protocol server x port trailingpath] { lappend list $url regsub {([^:]+)://([^:/]+)(:([0-9]+))?(/[^:]*)} \ $env {} env } else { regexp {^[^:]+} $env dir lappend list $dir regsub {^[^:]+} $env {} env } } return $list } Import private consistency_check { } { global env $self instvar orig_val_ if { ![info exists orig_val_] } { set orig_val_ $env(TCLCL_IMPORT_DIRS) } if { $env(TCLCL_IMPORT_DIRS) != $orig_val_ } { puts stderr "warning: ignoring modification to\ env(TCLCL_IMPORT_DIRS)\nit is illegal to\ modify this after the first call to the\ import procedure." } } Import private source_file { file } { set file_readable_result [$self file readable $file] set file_readable [lindex $file_readable_result 0] if { $file_readable } { set read_token [lindex $file_readable_result 1] $self source $file $read_token if { $read_token!={} } { unset $read_token } return "" } else { return [lindex $file_readable_result 1] } } Import private source { file { read_token {} } } { $self instvar loaded_ uniq_num_ if { ![info exists uniq_num_] } { set uniq_num_ 0 } set file [$self condense_to_absolute_filename $file] if [info exists loaded_($file)] { return } set loaded_($file) 1 incr uniq_num_ uplevel \#0 "rename source source.$uniq_num_" uplevel \#0 "proc source {args} \{ $self source \$args \}" if [$self is_http_url $file] { set buffer [$self read_url $file $read_token] if [catch "uplevel \#0 {$buffer}" errormsg] { global errorInfo error "error in $file: $errormsg\n$errorInfo\n\n" } } else { if [catch "uplevel \#0 source.orig $file" errormsg] { global errorInfo error "error in $file: $errormsg\n$errorInfo\n\n" } } uplevel \#0 {rename source {}} uplevel \#0 "rename source.$uniq_num_ source" incr uniq_num_ -1 } Import private enable { args } { } Import private class_to_file c { regsub -all -- "/" $c "-" filename return $filename } Import private is_http_url { name } { if [regexp {([^:]+)://([^:/]+)(:([0-9]+))?(/.*)} $name url protocol \ server x port trailingpath] { if { ![info exists protocol] } { return 0 } else { return [regexp -nocase {http} $protocol] } } else { return 0 } } Import private read_url { url {token {}} } { $self instvar use_http_cache_ cache_ last_modified_ if { $token == {} } { if $use_http_cache_ { if { ![info exists cache_] } { set cache_ [new HTTPCache] } if [info exists last_modified_($url)] { set buffer [$cache_ get $url \ $last_modified_($url)] } else { set buffer [$cache_ get $url] } if { $buffer=="" } { unset buffer } } if { ![info exists buffer] } { set token [Http geturl $url] if { [lindex [set code [::http::code $token]] 1] \ != 200 } { error "couldn't read \"$url\": no such file \ or directory (HTTP code $code)" } set buffer [::http::data $token] unset $token if $use_http_cache_ { if { ![info exists cache_] } { set cache_ [new HTTPCache] } $cache_ put $url $buffer } } } else { set buffer [::http::data $token] } return $buffer } Import private condense_to_absolute_filename { name } { return $name set before_cd [pwd] while { ![catch "file readlink $filename"] } { set filename [file readlink $filename] } set dirname [$self file dirname $filename] set tailname [file tail $filename] set condensed_name $filename if { ![catch "cd $dirname"] } { set condensed_name [ufile join [pwd] $tailname] } cd $before_cd return $condensed_name } Import private read_file_into_list { filename } { if [$self is_http_url $filename] { set buffer [$self read_url $filename] set lines [split $buffer "\n"] } else { set f [open $filename "r"] set lines {} while 1 { set line [gets $f] if [eof $f] { close $f break } lappend lines "$line" } } return $lines } Import private file_readable { args } { if { [llength $args] == 0 } { error "wrong # args: should be \"$self file\ readable name ?arg ...?\"" } set name [lindex $args 0] if [$self is_http_url $name] { $self instvar use_http_cache_ cache_ last_modified_ if $use_http_cache_ { if { ![info exists cache_] } { set cache_ [new HTTPCache] } if [info exists last_modified_($name)] { set buffer [$cache_ get $name \ $last_modified_($name)] } else { set buffer [$cache_ get $name] } if { $buffer!={} } { $self instvar buf_cnt_ if ![info exists buf_cnt_] { set buf_cnt_ 0 } set token ::http::readable_$buf_cnt_ upvar #0 $token state set state(body) $buffer incr buf_cnt_ return [list 1 $token] } } if [catch {set token [Http geturl $name]} m] { return [list 0 "error executing \"::http::geturl\ $name\": $m"] } else { set code [::http::code $token] if {[lindex $code 1] != 200} { return [list 0 $code] } else { if $use_http_cache_ { if { ![info exists cache_] } { set cache_ [new HTTPCache] } $cache_ put $name [::http::data $token] } return [list 1 $token] } } } else { eval file readable $args } } Import public file { option args } { if { $option == "readable" } { eval [list $self] file_readable $args } elseif { $option == "dirname" } { if { [llength $args] == 0 } { error "wrong # args: should be \"$self file\ dirname name ?arg ...?\"" } else { set name [lindex $args 0] if [$self is_http_url $name] { set url $name regexp {([^:]+)://([^:/]+)(:([0-9]+))?(/.*)} \ $name url protocol server x \ port trailingpath if {[string length $trailingpath] == 0} { set trailingpath / } set trailingpath [file dirname "$trailingpath"] return "$protocol://$server$x$trailingpath" } else { eval {file $option} $args } } } elseif { $option == "join" } { if { [llength $args] == 0 } { error "wrong # args: should be \"$self file\ join name ?arg ...?\"" } else { set base_url "[string trimright [lindex $args 0] /]/" set file_name [lindex $args 1] if [$self is_http_url $file_name] { return $file_name } if { [$self is_http_url $base_url] && \ [llength $args] ==2 } { regexp {([^:]+)://([^:/]+)(:([0-9]+))?(/.*)} \ $base_url url protocol server \ x port trailingpath regsub -all {^\./} $file_name {} file_name regsub -all {/\./} $file_name {/} file_name set counter 0 while [regsub {^\.\./} $file_name {} \ file_name] { incr counter } while { $counter > 0 } { set trailingpath [$self \ format_as_dir_string \ [$self file dirname \ $trailingpath]] incr counter -1 } set trailingpath "[$self format_as_dir_string \ $trailingpath]$file_name" return "$protocol://$server$x$trailingpath" } else { eval {file $option} $args } } } else { eval {file $option} $args } } Import private format_as_dir_string { dir_string } { return "[string trimright [$self file join $dir_string .] .]" } rename source source.orig proc source {fileName} { Import instvar instance_ if ![info exists instance_] { set instance_ [new Import] } if [$instance_ is_http_url $fileName] { set buffer [$instance_ read_url $fileName] uplevel eval $buffer } else { uplevel source.orig $fileName } } proc import args { if { ![catch "Import set autoimport_"] && ![Import set autoimport_] } { if [catch "really_import $args" error_msg] { error $error_msg } } } proc import args { Import instvar instance_ if ![info exists instance_] { set instance_ [new Import] } if [catch "eval $instance_ import $args" errormsg] { error $errormsg } } proc override_importTable_mapping { object file_list } { Import instvar instance_ if ![info exists instance_] { set instance_ [new Import] } $instance_ override_importTable_mapping $object $file_list } proc import_use_http_cache { {yes 1} } { Import instvar instance_ if ![info exists instance_] { set instance_ [new Import] } $instance_ set use_http_cache_ 1 } Class HTTP HTTP public init { } { $self next if { [lsearch -exact [package names] Tk] != -1 } { $self set enable_output_ 1 } else { $self set enable_output_ 0 } $self set token_count_ 0 } HTTP public geturl { url } { set token [$self start_fetch $url] $self wait return $token } HTTP public geturls { args } { set tokens [eval "$self start_fetch $args"] $self wait return $tokens } HTTP public start_fetch { args } { $self instvar token_count_ urls_ set urls_ $args foreach url $args { lappend tokens [::http::geturl $url \ -progress "$self progress_callback" \ -command "$self fetch_done"] incr token_count_ } if { [llength $tokens] == 1 } { return [lindex $tokens 0] } else { return $tokens } } HTTP public wait { } { $self tkvar vwait_ if { ![info exists vwait_] } { $self start_ping_pong if { ![info exists vwait_] } { vwait [$self tkvarname vwait_] } $self stop_ping_pong } unset vwait_ } HTTP private fetch_done { token } { $self instvar token_count_ $self tkvar vwait_ incr token_count_ -1 if { $token_count_ <= 0 } { set vwait_ 1 set token_count_ 0 $self instvar total_bytes_ current_bytes_ per_token_ unset total_bytes_ current_bytes_ per_token_ } } HTTP private progress_callback { token total_bytes current_bytes } { $self instvar total_bytes_ current_bytes_ per_token_ if { ![info exists total_bytes_] } { set total_bytes_ 0 set current_bytes_ 0 } if { ![info exists per_token_($token)] } { set per_token_($token) $current_bytes incr total_bytes_ $total_bytes incr current_bytes_ $current_bytes } else { set current_bytes_ [expr $current_bytes_ - \ $per_token_($token) + $current_bytes] set per_token_($token) $current_bytes } $self instvar urls_ $self print_status "Fetching $urls_ ... (rcvd $current_bytes_ bytes)" } HTTP private build_widget { } { $self instvar frame_ rect_ if { ![info exists frame_] } { set cnt 0 while [winfo exists .http_$cnt] { incr $cnt } set frame_ .http_$cnt toplevel $frame_ wm withdraw $frame_ wm transient $frame_ . wm title $frame_ "HTTP Status" set new_toplevel 1 } set textheight [font metric http_font -linespace] label $frame_.label -font http_font -width 100 \ -justify left -anchor w -text "" canvas $frame_.canvas -height $textheight \ -width 50 -bd 1 -relief sunken pack $frame_.canvas -side right pack $frame_.label -expand 1 -fill x -side left set rect_ [$frame_.canvas create rectangle 1 2 10 $textheight \ -fill blue -outline blue] $frame_.canvas move $rect_ -1000 0 if [info exists new_toplevel] { update idletasks update set x [expr [winfo screenwidth $frame_]/2 \ - [winfo reqwidth $frame_]/2 \ - [winfo vrootx [winfo parent $frame_]]] set y [expr [winfo screenheight $frame_]/2 \ - [winfo reqheight $frame_]/2 \ - [winfo vrooty [winfo parent $frame_]]] wm geom $frame_ +$x+$y } } HTTP private start_ping_pong { } { if { ![$self set enable_output_] } return $self instvar frame_ rect_ after_id_ hide_id_ dir_ pos_ if { [lsearch -exact [package names] Tk] != -1 } { if { ![info exists frame_] } { $self build_widget } if { [wm state [winfo toplevel $frame_]] == "withdrawn" } { wm deiconify $frame_ } if { ![info exists dir_] } { set dir_ 2 set pos_ 1 } set coords [$frame_.canvas coords $rect_] set x1 [lindex $coords 0] set y1 [lindex $coords 1] set x2 [lindex $coords 2] set y2 [lindex $coords 3] $frame_.canvas coords $rect_ $pos_ $y1 [expr $pos_-$x1+$x2] $y2 } else { $self set ping_cnt_ 0 puts -nonewline stderr "Fetching URL " } set after_id_ [after 100 "$self do_ping_pong"] if [info exists hide_id_] { after cancel $hide_id_ } $self instvar urls_ $self print_status "Fetching $urls_ ..." } HTTP private stop_ping_pong { } { if { ![$self set enable_output_] } return $self instvar after_id_ hide_id_ frame_ rect_ if [info exists after_id_] { after cancel $after_id_ unset after_id_ if { [lsearch -exact [package names] Tk] != -1 } { set hide_id_ [after idle "$self hide"] } else { puts stderr "" } } } HTTP private hide { } { $self instvar frame_ rect_ pos_ dir_ set pos_ 1 set dir_ 2 $self print_status "" $frame_.canvas move $rect_ -1000 0 if { [winfo toplevel $frame_] == $frame_ } { wm withdraw $frame_ } } HTTP private do_ping_pong { } { if { ![$self set enable_output_] } return $self instvar frame_ rect_ dir_ pos_ after_id_ if { [lsearch -exact [package names] Tk] != -1 } { incr pos_ $dir_ $frame_.canvas move $rect_ $dir_ 0 if { $pos_ <= 1 || $pos_ >= 42 } { set dir_ [expr 0 - $dir_] } } else { $self instvar ping_cnt_ incr ping_cnt_ if { $ping_cnt_ >= 10 } { puts -nonewline stderr "." set ping_cnt_ 0 } } set after_id_ [after 100 "$self do_ping_pong"] } HTTP private print_status { status } { if { ![$self set enable_output_] } return if { [lsearch -exact [package names] Tk] != -1 } { $self instvar frame_ if [info exists frame_] { $frame_.label configure -text $status } } } HTTP public set_frame { frame } { if { [lsearch -exact [package names] Tk] != -1 } { $self instvar frame_ if [info exists frame_] { destroy $frame_ } set frame_ $frame $self build_widget } } HTTP public enable_output { { yes 1 } } { $self set enable_output_ $yes } HTTP proc.invoke { } { if { [lsearch -exact [package names] Tk] != -1 } { font create http_font -family helvetica -size 10 } } Class HTTPCache HTTPCache public init { {dir ~/.mash/cache/} } { $self next $self instvar dir_ index_ index_filename_ $self create_dir $dir set dir_ [glob $dir] set index_filename_ [file join $dir_ index.db] if {! [catch {set f [open $index_filename_]}] } { while 1 { set line [gets $f] if [eof $f] { close $f break } set index_([lindex $line 0]) [lindex $line 1] } } } HTTPCache public get { url {last_modified {}} } { $self instvar index_ if [info exists index_($url)] { if { $last_modified != {} } { if [catch {set mtime [file mtime $index_($url)]}] \ { return "" } if { $last_modified==-1 || $mtime < $last_modified } \ { return "" } } if [catch {set f [open $index_($url)]}] { return "" } fconfigure $f -translation binary set buffer "" while { ![eof $f] } { append buffer [read $f 4096] } close $f return $buffer } else { return "" } } HTTPCache public put { url buffer } { $self instvar index_ dir_ index_filename_ if { ![info exists index_($url)] } { set update_index_file 1 } set name cache[clock clicks] set index_($url) [file join $dir_ $name[file extension $url]] set f [open $index_($url) w 0644] fconfigure $f -translation binary puts -nonewline $f $buffer close $f if [catch {set f [open $index_filename_ a]}] { set f [open $index_filename_ w 0644] } puts $f [list $url $index_($url)] close $f } HTTPCache public flush { } { $self instvar index_ dir_ file delete -force -- [glob -nocomplain [file join $dir_ *]] catch {unset index_} } HTTPCache private create_dir { path } { if { ![file isdirectory $path] } { set dir "" foreach split [file split $path] { set dir [file join $dir $split] if { ![file exists $dir] } { file mkdir $dir } } } } HTTP Http wrong # args: should be { } but gotexpected is not of type type check failed: message ?args...? (%.40s %.40s line %d)unknown (%.30s unknown line %d): unable to dispatch method {}), proc=, class= during autoloading (object=no new proc during autoloading (object=::otcl::p%s%dself class proc a tcl method name"couldn't store default value in variable "10" doesn't have an argument "procedure "destroyClassalloc ?args?Object alloc failedObjectinit ?args?uneven number of args} { during {class a classinfo ?args?classinfo class ?class?superclasscommandsinfo commands ?pat?procsinfo procs ?pat?argsinfo args defaultinfo default bodyinfo body varsinfo vars ?pat?an info optionproc name args bodyautoprocnext ?args?no executing procset var ?value?unset ?vars?no instvar in global :: scopeinstvar ?vars?expected ?inst/local? or ?inst? ?local? but got alloc ?args?Class alloc failedcreate ?args?allocno reachable alloccouldn't find result of alloc init superclass auto_load a list of classesclasses in dependence ordera cycle-free graphinfo superclass ?class?subclassinfo subclass ?class?heritageinfo heritage ?pat?instancesinfo instances ?pat?instcommandsinfo instcommands ?pat?instprocsinfo instprocs ?pat?instargsinfo instargs instdefaultinfo instdefault instbodyinfo instbody instproc name args bodycreate_fake_returnproc failedObject table failedClass table failedObject/Class failedotclcreation of name space failedinitinfonextsetunsetinstvarinstprocObject instproc array {opt ary args} { $self instvar $ary eval array [list $opt] [list $ary] $args } Class instproc unknown {m args} { if {$m == {create}} then { error "$self: unable to dispatch $m" } eval [list $self] create [list $m] $args proc otcl_load {obj file} { global auto_index source $file foreach i [array names auto_index \ [list $obj *proc *]] { set type [lindex $i 1] set meth [lindex $i 2] if {[$obj info ${type}s $meth] == {}} then { $obj $type $meth {auto} $auto_index($i) } } } proc otcl_mkindex {meta dir args} { set sp {[ ]+} set st {^[ ]*} set wd {([^ ]+)} foreach creator $meta { lappend cp "$st$creator${sp}create$sp$wd" lappend ap "$st$creator$sp$wd" foreach method {proc instproc} { lappend mp "$st$wd${sp}($method)$sp$wd" foreach cl [concat Class [Class info heritage]] { eval lappend meths [$cl info instcommands] set old [pwd] cd $dir append idx "# Tcl autoload index file, " append idx "version 2.0\n" append idx "# otcl additions generated with " append idx "\"otcl_mkindex [list $meta] " append idx "[list $dir] $args\"\n" set oc 0 set mc 0 foreach file [eval glob -nocomplain -- $args] { if {[catch {set f [open $file]} msg]} then { catch {close $f} cd $old error $msg } while {[gets $f line] >= 0} { foreach c $cp { if {[regexp $c $line x obj]==1 && [string index $obj 0]!={$}} then { incr oc append idx "set auto_index($obj) " append idx "\"otcl_load $obj " append idx "\$dir/$file\"\n" } } foreach a $ap { if {[regexp $a $line x obj]==1 && [string index $obj 0]!={$} && [lsearch -exact $meths $obj]==-1} { foreach m $mp { if {[regexp $m $line x obj ty pr]==1 && [string index $pr 0]!={$}} then { incr mc append idx "set \{auto_index($obj " append idx "$ty $pr)\} \"source " append idx "\$dir/$file\"\n" } close $f set t [open tclIndex a+] puts $t $idx nonewline close $t cd $old return "$oc objects, $mc methods" sourceexecvwaitupdatetimetellsocketseekreadpwdputspidopenglobgetsflushfilefconfigurefblockedeofclosecdafterwhilevariableupvaruplevelunsettraceswitchsubststringsplitsetscanreturnrenameregsubregexpprocpackagenamespacelsortlsearchlreplacelrangeloadllengthlistlinsertlindexlappendjoininfoincrifglobalformatforeachforfileeventfcopyexprexitevalerrorencodingcontinueconcatclockcatchcasebreakbinaryarrayappendTcl_CallFrame and CallFrame are not the same sizeTcl_CreateInterp: can't create global namespaceTcl_CreateInterp: builtin command with NULL string and object command procs and a NULL compile proc Tcl_CreateInterp: Tcl_CreateMathFunc incorrectly registered '%s'littleEndianbigEndianbyteOrdertcl_platform8.3.2tcl_patchLevel8.3tcl_versiontcl_precisionTclAssoc Data Key #%dDeleteInterpProc called with active evalsDeleteInterpProc called on interpreter not marked deleted::token (rename)cannot use namespace qualifiers as hidden command (use rename then hide)can only hide global namespace commands" already existshidden command named "(use expose to toplevel, then rename)can not expose to a namespace "unknown hidden command "trying to expose a non global command name space commandexposed command "": command doesn't exist "deletecan't ": bad command namecan't rename to "": command already existstoo many nested calls to Tcl_EvalObj (infinite loop?)attempt to call eval in deleted interpreterIDELETECORETcl_EvalObj: compiled script jumped interpsinvoked "break" outside of a loopinvoked "continue" outside of a loopcommand returned bad code: %d ... while executing "%.*s%s" invoked from within "%.*s%s"expression didn't have numeric valueillegal argument vectorinvalid hidden command name "unknowninvalid command name " while invoking " invoked from within " ...%ld0Tcl_ExprObj: compiled expression jumped interpserrorInfoNONEerrorCodebytearrayTcl_SetByteArrayObj called with shared objectTcl_SetObjLength called with shared objectscanformatoption ?arg arg ...?optionformatString ?arg arg ...?number of elements in list does not match countcannot use "*" in format string with "x"binaryhexadecimalvalue formatString ?varName varName ...?" instead string but got "expected missing count for "@" field specifiernot enough arguments for all format specifiers"bad field specifier "Gunable to alloc %d bytesunable to alloc %d bytes, %s line %dunable to realloc %d bytesunable to realloc %d bytes, %s line %d%a %b %d %X %Z %Ysecondsscanformatclicks-gmt-format-baseoption ?arg ...?option-milliseconds": must be -millisecondsbad switch "?-milliseconds?clockval ?-format string? ?-gmt boolean?switchdateString ?-base clockValue? ?-gmt boolean?"unable to convert date-time string "bad format string "string ?in? patList body ... ?default body?inextra case pattern with no bodydefault ("%.50s" arm line %d)command ?varName?couldn't save command result in variable?dirName?~": couldn't change working directory to "systemnamesconverttoconvertfromoption ?arg ...?option?encoding? data?encoding?message ?errorInfo? ?errorCode?errorCodearg ?arg ...? ("eval" body line %d)?returnCode? writablevolumestypetailstatsplitsizerootnamerenamereadlinkreadablepathtypeownednativenamemkdirmtimelstatjoinisfileisdirectoryextensionexistsexecutabledirnamedeletecopychannelsattributesatimename ?time?could not set access time for file "?pattern?:.name ?name ...?name varNamecould not set modification time for file "absoluterelativevolumerelativecould not readlink "stat name varNamenamecould not read "devinomodenlinkuidgid%luctimefiledirectorycharacterSpecialblockSpecialfifolinksocketunknownstart test next command ("for" initial command) ("for" body line %d) ("for" loop-end command)varList list ?varList list ...? commandforeach varlist is emptyTcl_ForeachObjCmd: could not reconvert variable list %d to a list object Tcl_ForeachObjCmd: could not reconvert value list %d to a list object "couldn't set loop variable: " ("foreach" body line %d)formatString ?arg arg ...?format string ended in middle of field specifierbad field specifier "%c"cannot mix "%" and "%n$" conversion specifiers"%n$" argument index out of rangenot enough arguments for all format specifiers" argumentwrong # args: no expression after "wrong # args: no script following "thenelseifelsewrong # args: no script following "else" argumentwrong # args: extra words after "else" clause in "if" commandvarName ?increment? (reading increment)varstclversionsharedlibextensionscriptprocspatchlevelnameofexecutablelocalsloadedlibrarylevelhostnameglobalsexistsdefaultcompletecommandscmdcountbodyargsoption ?arg arg ...?optionprocname" isn't a procedure"?pattern?commandprocname arg varnamecouldn't store default value in variable "" doesn't have an argument "procedure "varNameunable to determine name of hostbad level "?number?tcl_libraryno library has been specified for Tcl?interp?tcl_patchLevel.sotcl_version list ?joinString?list indexlist index element ?element ...?listlist first lastlist first last ?element element ...?endlist doesn't contain element -regexp-glob-exactsearch mode?mode? list pattern-unique-real-integer-index-increasing-dictionary-decreasing-command-ascii?options? list"-command" option must be followed by comparison command"-index" option must be followed by list index missing from sublist "element (-compare command)-compare command returned non-numeric result---start-nocase-lineanchor-linestop-line-expanded-inline-indices-about-allswitch?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...? when using -inlineregexp match variables not allowed"couldn't set variable "?switches? exp string subSpec varNameoldName newName-codeokerrorreturnbreakcontinuecontinue, or an integer": must be ok, error, return, break, bad completion code "-errorinfo-errorcode": must be -code, -errorcode, or -errorinfobad option "fileName string ?splitChars?wordstartwordendtrimrighttrimlefttrimtotitletouppertolowerreplacerepeatrangematchmaplengthlastisindexfirstequalcomparebytelengthoption arg ?arg ...?option?-nocase? ?-length int? string1 string2-length": must be -nocase or -lengthstring1 string2 ?startIndex?string charIndexxdigitwordcharuppertruespacepunctprintlowerintegergraphfalsedoubledigitbooleancontrolasciialphaalnumclass ?-strict? ?-failindex var? strclass-strict-failindex?-strict? ?-failindex var? str": must be -strict or -failindexstring?-nocase? charMap string": must be -nocasechar map list unbalanced?-nocase? pattern stringstring first laststring countstring first last ?string?string ?first? ?last? string ?chars?string index-novariables-nocommands-nobackslashesTcl_SubstObjCmd: bad option index to SubstOptions?-nobackslashes? ?-nocommands? ?-novariables? string-regexp-glob-exact?switches? string pattern body ... ?default body?extra switch pattern with no body, this may be due to a comment incorrectly placed outside of a switch body - see the "switch" documentationdefaultno body specified for pattern "- ("%.50s" arm line %d)command ?count?%.0f microseconds per iterationvinfovdeletevariableoption [arg arg ...]name ops commandnameTcl_TraceObjCmd: bad option index to TraceOptions": should be one or more of rwubad operations " r w utest command ("while" body line %d)ForeachInfowrong # args: should be "break"wrong # args: should be "catch command ?varName?" ("catch" body line %d)0TclCompileCatchCmd: bad jump distance %d wrong # args: should be "continue"wrong # args: should be "expr arg ?arg ...?"wrong # args: should be "for start test next command" ("for" initial command) ("for" test expression) ("for" body line %d) ("for" loop-end command)wrong # args: should be "foreach varList list ?varList list ...? command" ("foreach" body line %d)elseifwrong # args: no expression after "%.30s" argument ("if" test expression)wrong # args: no script following "%.20s" argumentthenwrong # args: no script following "then" argument ("if" then script line %d)elsewrong # args: no script following "else" argument ("if" else script line %d)wrong # args: extra words after "else" clause in "if" commandTclCompileIfCmd: unexpected opcode updating ifFalse jumpwrong # args: should be "incr varName ?increment?" (parsing index for array "%.*s") (increment expression)wrong # args: should be "set varName ?newValue?"wrong # args: should be "while test command" ("while" test expression) ("while" body line %d)~!?||&&|^&!===>=<=><>><<-+%/*CompileSubExpr: token type %d not TCL_TOKEN_SUB_EXPR CompileSubExpr: unexpected operator %d requiring special treatment CompileSubExpr: unexpected token type %d 0CompileLandOrLorExpr: bad jump distance %d 1"unknown math function "too few arguments for math functiontoo many arguments for math functionsyntax error in expression "%.*s"pushReturnCodepushResultendCatchbeginCatch4foreach_step4foreach_start4continuebreaktryCvtToNumericcallFunc1callBuiltinFunc1notbitnotuminusuplusmoddivmultsubaddrshiftlshiftgelegtltneqeqbitandbitxorbitorlandlorjumpFalse4jumpFalse1jumpTrue4jumpTrue1jump4jump1incrStkImmincrArrayStkImmincrArray1ImmincrScalarStkImmincrScalar1ImmincrStkincrArrayStkincrArray1incrScalarStkincrScalar1storeStkstoreArrayStkstoreArray4storeArray1storeScalarStkstoreScalar4storeScalar1loadStkloadArrayStkloadArray4loadArray1loadScalarStkloadScalar4loadScalar1exprStkevalStkinvokeStk4invokeStk1concat1duppoppush4push1donebytecodetcl_traceCompileSetByteCodeFromAny: unable to create link for tcl_traceCompile variable Compiling: (parsing index for array "%.*s")Unexpected token type in TclCompileTokens ... while compiling "%.*s%s"EnterCmdStartData: bad command index %d EnterCmdStartData: cmd map not sorted by code offsetEnterCmdExtentData: bad command index %d EnterCmdExtentData: missing start data for command %d TclFixupForwardJump: bad ExceptionRange type %d GetCmdLocEncodingSize: bad code offsetGetCmdLocEncodingSize: bad code lengthGetCmdLocEncodingSize: bad source lengthEncodeCmdLocMap: bad code offsetEncodeCmdLocMap: bad code lengthEncodeCmdLocMap: bad source length(%u) %s %d # pc %u%d%u # TclPrintInstruction: bad local var index %u (%u locals) %u # temp var %u%u # var %u """\"\f\n\r\t\v%csaturdayfridaythursthurthursdaywedneswednesdaytuestuesdaymondaysundaydecembernovemberoctoberseptseptemberaugustjulyjunemayaprilmarchfebruaryjanuarysecsecondminminutehourdayweekfortnightmonthyearstardateepochagonextthislastnowtodayyesterdaytomorrowdstidlenzdtnzstnztgsteadteastcadtcastjstcctjtwadtwastzp6istzp5zp4itbteetfstfwtsstswtmestmewtmetcestcetidlwntahstcathdthstydtystpdtpstmdtmstcdtcstedtestadtastndtnstnftatwatbstwetuctutcutgmtzyxwvutsrqponmlkihgfedcbaama.m.pmp.m.($6Q)5%*:&8! =2PL3KJIHGFE410/-'>N.ODA<CB7,? #+9;M "@@igigigigigigigigigigigigig ,igigigigigigigigigigig igigigig igigigigigigigigigigigigigigigig igig0FEDBA@?><;:97       ig   -+ :/-   ,       ,.-:/--:        -:   5!*01/234  ,'#-)6"%$.+ 7(6&yacc stack overflowsyntax erroridentityutf-8unicode*.encencoding-encoding"invalid encoding file "unknown encoding ".encrnameinitfinalEscapeToUtfProc: invalid sub tableenvno such variableerrorInfoerrorCodetclBgErrorbgerror"bgerror" is an invalid command name or ambiguous abbreviation bgerror failed to handle background error. Original error: Error in bgerror: TclInitSubsystems called while finalizingname": would wait forevercan't wait for variable "idletasksoptionTcl_UpdateObjCmd: bad option index to UpdateOptions?idletasks?FUNCTIONBUILTIN FUNCTION!~%/*-+>><<>=<=><!===&^|&&||srandroundrandintdoubleabstanhtansqrtsinhsinpowlog10loghypotfmodfloorexpcoshcosceilatan2atanasinacoscmdNametcl_traceExecInitByteCodeExecution: can't create link for tcl_traceExec variable%2d: %2d TclExecuteByteCode: done instruction at pc %u: stack top %d != entry stack top %d TclExecuteByteCode execution failure: end stack top != start stack topattempt to call eval in deleted interpreterIDELETECOREunknown"invalid command name "%d: (%u) invoking %s TclExecuteByteCode: bad ExceptionRange type TclExecuteByteCode: unrecognized ExceptionRange type %d TclExecuteByteCode: unrecognized builtin function code %dTclExecuteByteCode: unrecognized opCode %udivide by zeroDIVZEROARITHcan't use empty string as operand of "non-numeric stringinvalid octal numberfloating-point value as operand of "can't use argument to math function was an invalid octal numberargument to math function didn't have numeric valueinteger value too large to representIOVERFLOWA >?Acan't use floating-point value as argument to srandunknown math function "ExprCallMathFunc: expected number of args %d != actual number %ddomain error: argument not in valid rangeDOMAINfloating-point value too small to representUNDERFLOWfloating-point value too large to representOVERFLOWunknown floating-point error, errno = %dUNKNOWN ?options? source ?source ...? target" wrong # args: should be "" is not a directory: target "copyingrenamingerror ": can't create directory " ?options? file ?file ...?"": directory not emptyerror deleting """ with directory "can't overwrite file "" with file "can't overwrite directory "move a directory into itself": trying to rename a volume or " to "error renaming "can't unlink "error copying "": "-force--": should be -force or --bad option "name ?option? ?value? ?option value ...?option" missingvalue for "^((/+([.][.]?/+)*([.][.]?)?)|(~[^:/]*)(/[^:]*)?|(~[^:]*)(:.*)?|/+([.][.]?/+)*([^:/]+)(/[^:]*)?|([^:]+):.*)$///./:::/\:HOMEvariable to expand pathcouldn't find HOME environment " doesn't existuser "---types-path-nocomplain-join-directoryoptionmissing argument to "-directory""-directory" cannot be used with "-path"missing argument to "-path""-path" cannot be used with "-directory"missing argument to "-types"?switches? name ?name ...?\[]*?{}\readonlyhiddenmacintoshtypecreatorbad argument to "-types": only one MacOS type or creator argument to "-types" allowed "s "no files matched glob pattern "}unmatched open-brace in file nameunmatched close-brace in file name,*[]?\."expected integer but got "integer value too large to representIOVERFLOWARITHexpected floating-point number but got "yesnotruefalseonoffexpected boolean value but got "malformed bucket chain in Tcl_DeleteHashEntry%d entries in table, %d buckets number of buckets with %d entries: %d number of buckets with %d or more entries: %d average search distance for entry: %.1f??called Tcl_FindHashEntry on deleted tablecalled Tcl_CreateHashEntry on deleted tableindex": must be "ambiguous bad , or or , can't convert value to index except via Tcl_GetIndexFromObj APIwrong # args: should be " "interpInterpInfoDeleteProc: still exist commandsInterpInfoDeleteProc: still exist aliasestransfertargetshareslavesmarktrustedinvokehiddenissafehiddenhideexposeexistsevaldeletecreatealiasesaliascmd ?arg ...?optionslavePath slaveCmd ?masterPath masterCmd? ?args ..?---safe?-safe? ?--? ?path?interp%dcannot delete the current interpreterpath arg ?arg ...?path hiddenCmdName ?cmdName?path cmdName ?hiddenCmdName?-globalpath ?-global? ?--? cmd ?arg ..?pathsrcPath channelId destPathpath alias" not found" in path "alias "" is not my descendanttarget interpreter for alias "?path?": would create a loopcannot define or rename alias "invoked "break" outside of a loopinvoked "continue" outside of a loopcommand returned bad code: %d"could not find interpreter "" already exists, cannot createinterpreter named "0tcl_interactiveSlaveObjCmd: interpreter has been deletedaliasName ?targetName? ?args..?arg ?arg ...?hiddenCmdName ?cmdName?cmdName ?hiddenCmdName??-global? ?--? cmd ?arg ..?permission denied: safe interpreter cannot expose commandspermission denied: safe interpreter cannot hide commandsnot allowed to invoke hidden commands from safe interpreterpermission denied: safe interpreter cannot mark trustedenvostcl_platformosVersionmachineusertclDefaultLibrarytcl_librarytcl_pkgPathon-blockingtclIOTcl_RegisterChannel: channel without nameTcl_RegisterChannel: duplicate channel namesstdinstdoutstderr"can not find channel named "Tcl_CreateChannel: NULL channel namebinarycouldn't find state for channel "reading and writing both disallowed for channel "could not flush channel "unable to access channel: invalid channelTclFlush, closed channel: queued output leftFlushChannel: damaged channel listcalled Tcl_Close on channel with refCount > 0iso8859-1blocking buffering buffersize encoding eofchar translation malformed option list in channel driver": should be one of bad option ", -or -01-bufferinglinenonefull-buffersize-encoding-eofchar%c-translationautocrcrlflfunable to set channel options: background copy in progressmust be one of full, line, or nonebad value for -buffering: two elementsbad value for -eofchar: should be a list of one or element listbad value for -translation: must be a one or twoplatform or platformmust be one of auto, binary, cr, lf, crlf,bad value for -translation: tcpwritablereadablechannelId event ?script?event namechannel is not " is busychannel "": error reading "error writing "unknown eol translation modeTcl_Write: AUTO output translation mode not supportedTcl_Write: unknown output translation modeerror setting blocking mode: -nonewline?-nonewline? ?channelId? stringnonewline": should be "nonewline"bad argument "stdout" wasn't opened for writingchannel " ": error writing "channelIderror flushing "channelId ?varName?" wasn't opened for readingerror reading "channelId ?numChars? ?-nonewline? channelId" or "endcurrentstartchannelId offset ?origin?originerror during seek on "channelId ?optionName? ?value? ?optionName value?...---keepnewlineswitch?switches? arg ?arg ...?error reading output from command: fileName ?access? ?permissions?rTcl_OpenCmd: invalid mode valuetclTCPAcceptCallbacksRegisterTcpServerCleanup: damaged accept record table -server-myport-myaddr-asyncoptioncannot set -async option for server socketsno argument given for -myaddr optionno argument given for -myport optiontcpno argument given for -server optionTcl_SocketObjCmd: bad option index to SocketOptionsOption -myport is not valid for servers -server command ?-myaddr addr? port ?-myaddr addr? ?-myport myport? ?-async? host port wrong # args: should be either: -command-sizeinput output ?-size size? ?-command callback?couldn't open socket: port number too high"illegal access mode " while processing open access modes "RDONLYWRONLYRDWRAPPENDCREATEXCLNOCTTYNONBLOCKTRUNC EXCL, NOCTTY, NONBLOCK, or TRUNC": must be RDONLY, WRONLY, RDWR, APPEND, CREATinvalid access mode " RDONLY, WRONLY, or RDWRaccess mode must include either": couldn't read file "r (file "%.150s" line %d)POSIXinternal error: bad linked variable typelinked variable is read-onlyinternal error: linked variable couldn't be readvariable must have integer valuevariable must have real valuevariable must have boolean value10NULL??listTcl_SetListObj called with shared objectTcl_ListObjAppendList called with shared objectTcl_ListObjAppendElement called with shared objectTcl_ListObjReplace called with shared objectSetListFromAny: bad size estimate for listfileName ?packageName? ?interp?must specify either file name or package name"" is already loaded for package "file "tclLoad" isn't loaded staticallypackage "couldn't figure out package name for _Init_SafeInitcouldn't find procedure _SafeInit procedureno can't use package in a safe interpreter: {} {argvargcargv010tcl_interactiveapplication-specific initialization failed: errorInfotcl_prompt2tcl_prompt1% (script that generates prompt)exit %dnsNameTrying to push call frame for dead namespacecan't create namespace "": only global namespace can have empty name": already existscan't create namespace "::errorInfoerrorCode": pattern can't specify a namespaceinvalid export pattern "auto_importempty import pattern"unknown namespace in import pattern "no namespace specified in import pattern "" into itself" tries to import from namespace "import pattern "" would create a loop containing command "can't import command "unknown namespace in namespace forget pattern "DeleteImportedCmd: did not find cmd in real cmd's list of import referencesCould not create namespace '%s'unknown namespace "unknown command "unknown variable "whichtailqualifiersparentorigininscopeimportforgetexportevaldeletecurrentcodechildrensubcommand ?arg ...?option" in namespace children command?name? ?pattern?argnamespace?name name...?" in namespace delete commandname arg ?arg...? (in namespace eval "%.200s" script line %d)?-clear? ?pattern pattern...?-clear?pattern pattern...??-force? ?pattern pattern...?-force" in inscope namespace command (in namespace inscope "%.200s" script line %d)nameinvalid command name "" in namespace parent command?name?string?-command? ?-variable? name-command-variablebooleandoubleintUpdateStringProc should not be invoked for type %sTcl_SetBooleanObj called with shared objectyesnotruefalseonoffexpected boolean value but got "%.50s"Tcl_SetDoubleObj called with shared objectexpected floating-point number but got "%.50s"Tcl_SetIntObj called with shared objectinteger value too large to represent as non-long integerexpected integer but got "%.50s"integer value too large to representIOVERFLOWARITHTcl_SetLongObj called with shared object extra characters after close-quoteextra characters after close-bracemissing close-bracketParseTokens encountered unknown characterattempt to call eval in deleted interpreterIDELETECOREtoo many nested calls to Tcl_Eval (infinite loop?)unknown"invalid command name "... while executing "%.*s%s" invoked from within "%.*s%s"unexpected token type in Tcl_EvalTokensmissing close-brace for variable namemissing )$missing close-brace: possible unbalanced brace in commentmissing "missing close-bracketinteger value too large to representIOVERFLOWARITH" is an invalid octal number"syntax error in expression "%.*s"writingreading" wasn't opened for channel "": file "writereadcouldn't " as last word in commandcan't specify "child process lost (is SIGCHLD ignored or trapped?)error waiting for process to exit: CHILDSTATUSCHILDKILLED child killed: CHILDSUSPchild suspended: child wait status didn't make sense error reading stderr output file: child process exited abnormallyillegal use of | or |& in commandcouldn't create input file for command: couldn't create input pipe for command: couldn't create output pipe for command: couldn't create error file for command: couldn't create pipe: standard output was redirectedcan't read output from command: standard input was redirectedcan't write input to command:pipe for command could not be created, then ": conflicting versions provided for package "compiled with stub support" in standalone executable: This package is not Cannot load package " ("package ifneeded" script) {} -exact ("package unknown" script)can't find package , need ": have version conflict for package " is not presentpackage vsatisfiesversionsvcompareunknownrequireprovidepresentnamesifneededforgetoption ?arg arg ...?optionpackage version ?script??-exact? package ?version?-exactpackage ?version??command?version1 version2packageTcl_PackageObjCmd: bad option index to pkgOptions"expected version number but got "E2BIGEACCESEADDRINUSEEADDRNOTAVAILEADVEAFNOSUPPORTEAGAINEALREADYEBADEEBADFEBADFDEBADMSGEBADREBADRQCEBADSLTEBFONTEBUSYECHILDECHRNGECOMMECONNABORTEDECONNREFUSEDECONNRESETEDEADLKEDESTADDRREQEDOMEDOTDOTEDQUOTEEXISTEFAULTEFBIGEHOSTDOWNEHOSTUNREACHEIDRMEINPROGRESSEINTREINVALEIOEISCONNEISDIREL2HLTEL2NSYNCEL3HLTEL3RSTELIBACCELIBBADELIBEXECELIBMAXELIBSCNELNRNGELOOPEMFILEEMLINKEMSGSIZEEMULTIHOPENAMETOOLONGENAVAILENETDOWNENETRESETENETUNREACHENFILEENOANOENOBUFSENOCSIENODATAENODEVENOENTENOEXECENOLCKENOLINKENOMEMENOMSGENONETENOPKGENOPROTOOPTENOSPCENOSRENOSTRENOSYSENOTBLKENOTCONNENOTDIRENOTEMPTYENOTNAMENOTSOCKENOTSUPENOTTYENOTUNIQENXIOEPERMEPFNOSUPPORTEPIPEEPROTOEPROTONOSUPPORTEPROTOTYPEERANGEEREMCHGEREMOTEEREMOTEIOEROFSESHUTDOWNESOCKTNOSUPPORTESPIPEESRCHESRMNTESTALEETIMEETIMEDOUTETOOMANYREFSETXTBSYEUCLEANEUNATCHEUSERSEXDEVEXFULLunknown errorargument list too longpermission deniedaddress already in usecan't assign requested addressadvertise erroraddress family not supported by protocol familyresource temporarily unavailableoperation already in progressbad exchange descriptorbad file numberfile descriptor in bad statenot a data messagebad request descriptorbad request codeinvalid slotbad font file formatfile busyno childrenchannel number out of rangecommunication error on sendsoftware caused connection abortconnection refusedconnection reset by peerresource deadlock avoideddestination address requiredmath argument out of rangecross mount pointdisk quota exceededfile already existsbad address in system call argumentfile too largehost is downhost is unreachableidentifier removedoperation now in progressinterrupted system callinvalid argumentI/O errorsocket is already connectedillegal operation on a directorylevel 2 haltedlevel 2 not synchronizedlevel 3 haltedlevel 3 resetcan not access a needed shared libraryaccessing a corrupted shared librarycan not exec a shared library directlyattempting to link in more shared libraries than system limit.lib section in a.out corruptedlink number out of rangetoo many levels of symbolic linkstoo many open filestoo many linksmessage too longmultihop attemptedfile name too longnot availablenetwork is downnetwork dropped connection on resetnetwork is unreachablefile table overflowanode table overflowno buffer space availableno CSI structure availableno data availableno such deviceno such file or directoryexec format errorno locks availablelink has be severednot enough memoryno message of desired typemachine is not on the networkpackage not installedbad protocol optionno space left on deviceout of stream resourcesnot a stream devicefunction not implementedblock device requiredsocket is not connectednot a directorydirectory not emptynot a name filesocket operation on non-socketoperation not supportedinappropriate device for ioctlname not unique on networkno such device or addressnot ownerprotocol family not supportedbroken pipeprotocol errorprotocol not supporedprotocol wrong type for socketmath result unrepresentableremote address changedpathname hit remote file systemremote i/o errorread-only file systemcan't send afer socket shutdownsocket type not supportedinvalid seekno such processsrmount errorstale remote file handletimer expiredconnection timed outtoo many references: can't splicetext file or pseudo-device busystructure needs cleaningprotocol driver not attachedtoo many userscross-domain linkmessage tables fullSIGABRTSIGALRMSIGBUSSIGCHLDSIGCONTSIGFPESIGHUPSIGILLSIGINTSIGIOSIGKILLSIGPIPESIGPROFSIGPWRSIGQUITSIGSEGVSIGSTOPSIGSYSSIGTERMSIGTRAPSIGTSTPSIGTTINSIGTTOUSIGURGSIGUSR1SIGUSR2SIGVTALRMSIGWINCHSIGXCPUSIGXFSZunknown signalalarm clockbus errorchild status changedcontinue after stopfloating-point exceptionhangupillegal instructioninterruptinput/output possible on filekill signalwrite on pipe with no readersprofiling alarmpower-fail restartquit signalsegmentation violationstopbad argument to system callsoftware termination signaltrace trapstop signal from ttybackground tty readbackground tty writeurgent I/O conditionuser-defined signal 1user-defined signal 2virtual time alarmwindow changedexceeded CPU time limitexceeded file size limitTcl_Release couldn't find reference for 0x%xTcl_EventuallyFree called twice for 0x%x procbodyname args body": unknown namespacecan't create procedure "": bad procedure name" in non-global namespace with name starting with ":"::": arg list contains %d entries, precompiled header expects %dprocedure ""too many fields in argument specifier "" has argument with no name" that is an array element" has formal parameter "": formal parameter %d is inconsistent with precompiled body" has default value inconsistent with precompiled body": formal parameter "bad level "?level? command ?arg ...? ("uplevel" body line %d)body of procTclObjInterpProc: local variable %s is not argument but should beTclObjInterpProc: local variable %d is temporary but should be an argumentargs" to "no value given for parameter "" with too many argumentscalled "Calling proc %.*s a precompiled script jumped interps...Compiling %s "%.*s%s" (compiling %s "%.*s%s", line %d) (procedure "%.*s%s" line %d)invoked "break" outside of a loopinvoked "continue" outside of a loopNONEerrorCodeerrorInfocalled ProcBodySetFromAnycalled ProcBodyUpdateStringregexperror while matching regular expression: REG_USHORTESTREG_UIMPOSSIBLEREG_UEMPTYMATCHREG_ULOCALEREG_UUNPORTREG_UUNSPECREG_UNONPOSIXREG_UBBSREG_UPBOTCHREG_UBSALNUMREG_UBRACESREG_UBOUNDSREG_ULOOKAHEADREG_UBACKREF%u {}...%dREGEXPcouldn't compile regular expression pattern: errorCodeerrorInfocannot mix "%" and "%n$" conversion specifiersfield width may not be specified in %c conversionunmatched [ in format string"bad scan conversion character "variable is assigned by multiple "%n$" conversion specifiersvariable is not assigned by any conversion specifiers"%n$" argument index out of rangedifferent numbers of variable names and field specifiersstring format ?varName varName ...?%ucouldn't set variable "stringTcl_SetStringObj called with shared objectTcl_SetObjLength called with shared objectTcl_AppendToObj called with shared objectTcl_AppendUnicodeToObj called with shared objectTcl_AppendStringsToObj called with shared objectThis interpreter does not support stubs-enabled extensions.Tclinfoidlecanceloption ?arg arg ...?tclAfterafter#%dargument": must be cancel, idle, info, or a numberbad argument "id|commandscript script ...?id?" doesn't existevent "timerTcl_AfterObjCmd: bad subcommand index to afterSubCmdsafter# ("after" script)list element in braces followed by "%.*s" instead of spaceinstead of spacelist element in quotes followed by "%.*s" %sunmatched open brace in listunmatched open quote in listinternal error in Tcl_SplitList {{}can't modify precision from a safe interpreterimproper value for precision%%.%dg0123456789%ldend": must be integer or end?-integer?bad index " (looks like invalid octal number)no such variablevariable is arrayvariable isn't arrayno such element in arrayupvar refers to element in deleted arrayupvar refers to variable in deleted namespaceparent namespace doesn't existmissing variable namename refers to an element in an array::readvarName ?newValue?set (reading value of variable to increment)unsettracevarName ?varName ...?varName ?value value ...?startsearchsizenextelementnamesgetexistsdonesearchanymoreoption arrayName ?arg ...?optiontrace arrayarrayName searchIdarrayNamearrayName ?pattern?arrayName lists-1--s-" isn't an array"list must have an even number of elementsarray setaccess": unknown namespacebad variable name "": upvar won't create namespace variable that refers to procedure variablecan't upvar from variable to itself" already existsvariable "" has traces: can't use for upvardefine?level? otherVar localVar ?otherVar localVar ...?illegal search identifier "" isn't for variable "search identifier "couldn't find search " "can't )(": filettytcp-modemode%d,%c,%d,%dbad value for -mode%d,%c,%d,%d%n: should be baud,parity,data,stopnoe parity: should be n, o, or e data: should be 5, 6, 7, or 8 stop: should be 1 or 2TclpOpenFileChannel: invalid mode value": couldn't open "file%dauto crlfcouldn't seek to end of file on "-translation-error-peernamecan't get peername: -socknamecan't get sockname: peername socknamecouldn't open socket: sock%dlinenoneTclGetDefaultStdChannel: Unexpected channel typeauto-buffering" wasn't opened for writing"" wasn't opened for readingpipewrcannot get a FILE * for "" cannot be used to get a FILE *TclWaitForFile can't handle file id %d-permissions-owner-group.../": could not read "%0#5lo" does not exist": group "could not set group for file "": user "could not set owner for file ""unknown permission string format "could not set permissions for file "PATH:/bin:/usr/bin.//.": couldn't read directory "stat failed on known fileerror getting working directory name: pipecouldn't create pipe: %dforked process couldn't set up input/output: %dcouldn't execute "%.150s": couldn't fork child process: file%d?channelId?Stardate %2d%03d.%01dcp936zhru_SUru_RUiso8859-5rukoreanko_KR.eucKRko_KR.eucko_KR.EUCko_KReuc-krkojapanese-ujisjapanese-sjisjapanese.eucjapanese.sjisjajapanesejapanJp_JPJa_JPja_JPja_JP.ujisja_JP.mscodeiso2022-jpja_JP.JISeuc-jpja_JP.EUCshiftjisja_JP.SJIS8.3lib/tcl%stcl%s/libraryTCL_LIBRARYlibraryLC_ALLLC_CTYPELANGiso8859-1CtclDefaultLibrarytcl_pkgPathunixplatformtcl_platformososVersion.machineUSERLOGNAMEusertcl_libPathtcl_rcFileNamer ": couldn't load file "_ ========= RAW ========== ========= TREE FIXED ========== ========= LA%d ========== ========= SEARCH ========== ========= TREE NODE %s ========== null tree %s. `%c' longest shortest hasmixed hascapture hasbackref UNUSED (#%d) {%d,%d} %ld-%ld L:%s R:%s unable0x%x initial cleanup: empties: constraints: final cleanup: DELtilderight-curly-bracketright-bracevertical-lineleft-curly-bracketleft-bracegrave-accentlow-lineunderscorecircumflex-accentcircumflexright-square-bracketreverse-solidusbackslashleft-square-bracketcommercial-atquestion-markgreater-than-signequals-signless-than-signsemicoloncolonnineeightsevensixfivefourthreetwoonezerosolidusslashfull-stopperiodhyphen-minushyphencommaplus-signasteriskright-parenthesisleft-parenthesisapostropheampersandpercent-signdollar-signnumber-signquotation-markexclamation-markspaceUSIS1RSIS2GSIS3FSIS4ESCSUBEMCANETBSYNNAKDC4DC3DC2DC1DLESISOcarriage-returnCRform-feedFFvertical-tabVTnewlineLFtabHTbackspaceBSalertBELACKENQEOTETXSTXSOHNULxdigitupperpunctprintlowergraphdigitcntrlblankasciialphaalnumoopsinvalid embedded optionREG_BADOPTcharacter widths of regex and string differREG_MIXEDinvalid argument to regex functionREG_INVARG"can't happen" -- you found a bugREG_ASSERTquantifier operand invalidREG_BADRPTout of memoryREG_ESPACEinvalid character rangeREG_ERANGEinvalid repetition count(s)REG_BADBRbraces {} not balancedREG_EBRACEparentheses () not balancedREG_EPARENbrackets [] not balancedREG_EBRACKinvalid backreference numberREG_ESUBREGinvalid escape \ sequenceREG_EESCAPEinvalid character classREG_ECTYPEinvalid collating elementREG_ECOLLATEinvalid regexp (reg version 0.8)REG_BADPATfailed to matchREG_NOMATCHno errors detectedREG_OKAY%dREG_%uhistoryaddtransform-blocking" failed to stack channel "create/writecreate/readdelete/writeflush/writeflush/readdelete/readquery/maxReadreadwriteclear/readpure virtual method called V(Puk9 A?c)w>7RursoB_-lo`M!m}$[R:|_ b. ^2wۚ;tviPpys# n̟fwnF 9OG*v-|X8M[Cw3:_ = 1~)9,C9QwA} ~yK<[_n5P2n3 -RmPr(Ptk.N$Lw O(Z;:<+ken6_eιvD5^DF!֟(@8(@(@X(@X(@.....X(@(@(@(@(@(@,(@,(@(@(@(@(@(@(@(@((@(@(@(@(@(@(@l(@9oC?Q>D?hsD?OiE?)$E?'#x/E?e0XE? UE?B1sF? OIF?=YF?$&oF?qRۭF?huhoF?ycG?GahDH?|QH?ZH?`TOH?% H?4;I?֮{uI?-p $J?+dJ?wK?^L?iӧxL??)L?qtPL?ԑV&L? 4M?*JgM?`8M?, ; N?;QN?sGq!N?M2 >N? dO?P*L~O?07;O?O?CBP?en!<P?na"P?"q;P?XcP?^^iP?cRqSkP?>dOnP?7gQqP?\%{wP?|P?} P?!jP?һP?"9xP?7`P?oP?$d*AP?!LO-bP?0RP?DgP?t%QP?֡P?P?Y7dWP?lI}P?5FPP?Кb"Q?,1Q?g7Q?7Ge7Q?p;Q?-݅>| U?z|U? XV?Gj%V?-AV? ;9V?f;PQV?DzV?Ȳ ֹV?"V?P+%V?#Wh"W?Zv)W?d>H9W?l BW?EyDW?@/jVW?6PW?DW?fW?>>sW?Pmݾ(W?wW;_W?4X?e X?6W X?!'X?_/X?sۋc?|X;c?\&7Hc?U×c? 1c? u񴅲c?]'VUc? c?4謘c??[yc?~c?Ѥ+Qd?"tGd?G$\d?m秪cd?4|d?Vɫd?}ygd?USd?sid?Q]d?Cd?{>d?t=@d? dxe?\ jnne??"e?0-e?J)Fe?2<&[e?BkĖe?!=\e?|ɬe?WVe?e?2Bue?7e?UEe?e- f?ZFf?Zfrf?'xf?J~f?2HPf?q@f?Ȳ ֹf?Zf?$ g?d!g_g?7 Hg?vg?+3g?$lm.g?*!+g?9g]g?C~h?rh?*!h?l4 a-%h?^&1h?!Ih?\h?S }h?õ|_h?ĩ ѿh?$h?0<"h?KDnh?Gfh?gh?w2i?GQ9i?]^;i?쟹>i?ci?Di?zLi?Fii?Vj?Jj?´Tj?3Koj?rk?bk? FUKk?.krTk?Nnk?+>Jk?ml?"o$l?ܴmRdl?rSjl?B/,ul?RWl?:l?wl?%am?N;m?$IdOm?JWqm?d-po?\o?*o?$!e!p?0)p?:-p?R.Kp? ۴Lp?LoHlp?o<p?-p?GDp?) p?6+p?5|ip?p?I38p?,sqVop?I~6q?Aq?eOq?@}Qq?$/ԭiq?%kyq?NfLq?6%q?r?j۝r?]G.2r?931kr?r?Hf.r?)r?(r?վs?chs?Xs?^eB9v?]rqv?NQ[9w?w?WСU+x?:A]x?y~ex?>Yx?KZy?Kf.y?1fVy?1ԲZy?>hy?z?z?%>Xz?jUz?u ŏz?.lz?L{?Bk;p|?Q@z|?>|?r#Z|?%2GC}?EI}?m]Y}?R ?*?!4?kTT.?&y*.?b?+Y?6К$?ap=|,?0W2?3?IZ5?=>?ל(A? ܹCF?g|a?޻3p?j'Ԅ?YO踠?DP?c0?U6?A?X?ll?nwѨ?L ?1Oa[?Ж9~$?Kf?j ?r'!?޵Da)?>7?Ǽ:9?/l:?cؖ>A?ܿ}uZ?%#q ?w2]?e?6;R,?!2m~J5?=' >?A?wP?،"W?Gb\?: ̗^?0Ub?k$3^g?ϤGj?"e|?h?5K*?6r?@:?"ţ?K ?fcSE??$Գ?q?.%5.?l| ?ZTYN!?}81?:0_U?utӛ?q?nlʤ?4$BФ?>3?f#f?±BK ?=ek?XHL?b|o?6t ~?\ĩ?݂?: V鯥?՘?dW ɥ?:V?.C|]?VROhW?Jx?tʴc?u1U?'V ?+?V{=?qW?rc?0d?Ju?iR|?Ծ1?-.?}aѵ?{YO? 5i̦?TZ+LrϦ?SSަ?@zy?h?8"??K?smp?kq?_R??KkUx?o`˧?C) sCҧ?JᆇLӧ?g(ܧ?Ӑ?^r?O?9Twy?6?8d;?,l ?[^? ?F߃` ?&?A<8?B$q"9?Y~9?ίl:?p͡5b?Px?gaW{?T?zv̌?D7$??aN?s^k»??殜?pY?gBp)?7W~-?ׁH7??0@?P:)f?=x?a$#~?Љ#`?SW?k?3i?V˄?BIAꈫ?n_?2,?g?4p谤?2WY?$? {pg?m?[-C?%xT«?«?APū?T ȫ?"Bɫ?Lӫ?۫?r  ޫ?dx$?V_~#?fO)r?ZY?|da?~ ϫ7?#?uە?5Q? EÀ*?$?U?{o&?-3?N.?.Ƭ?ڹά?fH?L }?j?=S6L7? ?|^?:?FyW$? )?f*?R+?NA+?h '.?Q$3?K(;?x$R?­?z =ɭ?VG׭?+#fڭ?jݭ?c$?k M?j?.4x?>|?&??ZV?աt=?:?TV? E?GQ?KÚ?Muw?L S1 ?k#?u&%?R'?%s*? 2?#H6?YQ?\?jQ`?hEc? !i?Im?Bn?7v?qw?O Iqy?U_%f?[?f/?+zε?ɋ+Ư?8ί?~xˬί?;Uί?Bϯ? |+ϯ?ʮIЯ?_Aѯ?,-A֯?|ݯ?{?z4?72?T5r?$?v $?X?mZD?Z? ?hlJ?6XW?ݥ(%?3`h,?f@2'0?>1?.2?1F5? -mE? J?ϺqK?_܆#X?A8\?Io,^?!i`?R?y^?8&w?A˫?,B?6ss?:j`?*?n*?]x?9D*״?r`Ts?Yt?& {?uB;?w›?m5?םۿ?w+P°? ð?q?p-İ?X˰?.Ͱ?Rxа?}tѰ?tѰ?|SS԰?eaְ?e8װ?C/Mذ?.}nܰ?0Ėݰ?w߰?BF?v N?64~?Bi?U>?~ ? ]?~On?Ѿ@?]?Fǖdk?α?16?S? "?LAVn$?l)?A7-.?4E20?2?y5?0#K8?a):?(,>?!gB?KA`I?C#U?NFf?:Ug?dG6i?Ti!k?N& t?3w?z?=}?kZɖ~?%&~?/MG?bب!?V,??֕>?K?P ?L^?iI1?fЭ?* $?cA=?2^?!봱?d$?2 ݀*ɱ?&`%ϱ?Ogر?jx]?Z?n0?AW%2?" x7?x6q8?8?B()?wHMC?6ND?QLrG?#^H?)X% H?')I?; M?.2N?oN4.mO? :R?ruNS?]qU?RX7W?,%W?3wa?hc?yi? CPm?q?V^̲? KؾͲ?Ѳ?YjqѲ?9/7?Ҳ?jU۲? J;ݲ?A߲?Crq?Cڮ?ƅ?fU?5}?3e/?uh?>?J?2tJ?Vt?5K?OL?7 M?ᄬM?AN? gO?vR?v}S?:~_U?>TM"X?x܏Y?o+ Y? Z?vx^?_?!X`?#w`?-;`?2d?ņvg?=i?u _k?"ډp?yHzYr?..1w?Qsz?aCLN|? cĂ?cς?_q?{;?f-?R?ֳ?rR۳?2(ӝ?k ?ۨF?~p?gr(?v|D?o=?ȵ m?z?i?P!?n& ?a+?4?6eY?ެ.??x4?-1=?Ѩ?FV!?4Dk.?/?:0?80?4Ϣ1? R2?̙C 6?R¶_>? D?`(F?~I?kJ?H&N?M0R?T8T?)u/U?hpVW?0,.w.X?[?7^?"c? "f?Lmwj?w 5m?bd;r?Ϗ8u?Y{7w? ђ{?]W?.섴?e?Qቴ?Bѳ牴?/?F`Ō?q-?2dm:?)ђ?6lW?o?#*?񵈤?)?rߪ?e?{?!z3?x?B!?xPEf?tKf?^4ƴ?auɴ?-!@ɴ?}6hʴ?82ʴ?˴? \ʹ?7BѴ?WjԴ?rmԴ? C״?/)ٴ?w ۴?@ܴ?쬫4?4?69C?dE?E?mJqJ?R?FJMR?S?y*uW?Ae5\?^A1S]?~(Ϸc?)>>!;o?!=ac@q?Xtr?:t?;Kt?Ðu? *v? 0v?P@Hw?|τ0{? 0U.?#?J ?4{?7/5?90?št?bw??_?d&ں?۰?z&ܾ?{Ƶ?L8)ǵ?Gt F˵?nε?_F<۵?iRݵ??Vs~_?1?Zg?.?T\vs?l2?fH}?p]?(?0;?n}/?|I?2U+?m?|XӘ? ? w. ?l?AyR8?:?.ZT?O@"?#?'hhC(?a///?\6X8?ag@?$] 2D? F?BQNH?PH?,?K?y>L?jㅻM?L5P?_FP?UQ?;T?_{T?>V?k,R^?]_?]V_? PGc?HLc?[B'Ld?+Yd?o&e?9e?0ܤf?vV{i? +pm?n?wl'q?֭ 0 r? )gr?pwt? w?IVn7{?IC |?5?5⁶?5.&?2A?㌼?4˥?'(?pk??PH?g:?Q?!?׬?q?~:j?'?bo?"?hxʶ?w;T˶?dҶ?<ڄrն?yն?+Gֶ?~Xyٶ? ϧ۶?Ơqݶ?`L%߶?jޯ?$/?.Yd?{T?v ?8?Y? ?#Ĥޤ?cD?\8۟5? Q8 ?~i&?Gu?#@?jŽM !?{*!V!??\?a?.Ab?a} c?I7d? 6g?:1l?^?m?ك/m?g>o?6@Er?ZXr?.Ws?\dmt?T-'x?4b,=z?J3W{?H '}?Ҥ`?}e?#F? ?ft?+?<0۩?A?@{#*?8Y?c`?X\Σ??~XĦ?2X?gʮ?j?ƚ??Kv?P3?Fx?3񲽷?e\*ǿ?Z?4)S÷? -Ƿ?!ɷ?nη?Ϸ?2ѷ?Oҷ?Lӷ?kٷ?olڷ?]-???a?]?CQq?@?1m?#?oLz>?{ P?:?P$?sB?Ie?sj?MƷ ?㚴 ?/ mG ? ?u?0?E]?X??z?0 ?P(?{v0?Y:?,ٶA@?kB?@$&f~?F/3???/B???㌼?xˉ?vJG?ȡ?5?e?ԝMeV?U쌒?τ? l ?-ȕ?m?L㣸?Wjeބ?ܤ?Q)bP?!ٓ?ug7D&?Ļ?=!?EE?~?i?|? ս?!Z?Q=¸?Vȸ?7:Oɸ?sR̸? Ѹ?:!Ӹ?sQF*ո?Cٸ?d.=ٸ? U,ٸ?i޸? pn-߸?ͪ?ebr?sb`??3TX?m@`?}?Ig?1A?= z?cTcS?O K?Gzi ?" ?|P; ?9B?1ks8?h*?T;-? !?z !?uV^%?>B`(?TT,?PR/?4*/?ڇȦ0?m'5?6?< 2#8?[?@?rtB?ɦ}F?Ԟ/I? <K?ɭ T?EViT?CFh6U?,eV?&N[W?=2IqW?UN2X?C}X?Cc6Y?C6Y?FY?Cf [?[?r[?3\?ӎ_4]?e_?PW`?\b?>n{_b?~/c?"ӕ`Uc?srXc?% d?d?d d?7Yd?e?B-e?YZ$h?_/i?ň i?BA3,i?c*??z?峳?9?Bzˬ?X;?b֨?ʋL?+Α?,Pב?.DO?UA?e?ƖK|?K% 2?C-8I?G a?"?v~j?H???*Õ?-I>ʖ?%Tr?Mpؗ?]*?:=?$~]7?j`H?5A=ȹ?f!˹?k[_P͹?>HԹ?h\׹?Kyvع?i߹?˫g?8zP4?*p-?a?~?q? 'fF ?<$? ??& ?t?rcK?9?!?`w "? Fd{%? 0](?go)? %)?2 0?A=;?\v<;? !;?E74I?wQ"U?6Z?\)a?evd?[8e?B e?iMh?i?Ga5ip?Oq?"&v?.{uv?]x?6~?JlH?H?`JO?V4V?)<^?~Em`?sޫ{d?zd?M(xik?7tNn?Ān?=m1o? |?"<9~?m^Z?-郻?Clj?{5쐻?}AP?? L홻?vWiޚ?\H1??6曭?j?;@?ص?fK?0з?ܻ?9+ኽ?aP??Au?4ǻ?֐rͻ?%ۻ?ܻ?ଧܻ?π3^޻?쁎 '߻?,߻?Ė?,T?d3xy??vUL?饜?ܑ?i>?;?`}9z?E##?j+G+?n3?:3?6?{E>?{EV>?SB?MOF?IF?G? H?/I?23J?M?`~N?0w8Q?ʍ ϗS?ZZ?yM[?w[?|7^? b?y|c? -d?XjTj?挧l?q?s?8w?1\w?x?URy?k|?N?a0?|J)C?-*?[A?M鎼?= xِ?1 G?Ƅծ“? ?Af `:?U^?QA"ƛ?~?Y?$ƞ?k?p.́?9@&?g2{?:?V ?I6?ٖ?$?(?V[?̵?S苵?w[? W?1h?g{? 0@?ƭü?dJ˼?.μ?6ϼ?Cм?6ټ?ټ?N@Rڼ?x"ۼ?#O޼?&v|޼?Uǀ ?NH?س?uK&?ba?Zɡ?Q;z?8?!(?-h'?NB?==?Xm}_?*y?:?'y ?э ?ʮ?Eޔx?۹?_d ?}3^??>?{׏?1Kh?,`"?\$k'?0-R,?(N1?!2?$V2?8°3?cn7?+O8;?-|;?6>>?0(@?14kA?5eFG?H?/*K? @yT?+NX?KY&Y?K1\?Mr]^?.Wya?ZG!f?44?y4?CPݔ4?N5?(m6?D7?y98?_]=?D{=?Qrh@?x8B?CeqC? /NC?4_C?'ᢐG?AoMauI?[I? K?$RwO?|ʛQ?^b0R?#o U? WeU?&M_?yLa?a9c?-l?o?A2;o?=SLp?2Sr? xx?Iy?y?A 2?/?W2?*N8?5|3ޔ?6┾?#?R?fj? gM?%"6?t=?{ =?|a/?1ȭ?ʭ?6?)$?LQľ?Hjd ̾?FU۾?n??ViO?(:?}?e\/?7i?enQu?&?ˡ6 ?6 ?~AB ?&+?,?if.?%S?>qn? f?U"?N!?3MJ#?Пk#?'?le,?/5?M4#6?K;?Ϊ=? NHF?GB]P?h|nW?3`?2Tc?@@g?Wih?!&qn?pp?V^y?50~?)?]?v?I4~j?crf&?w#rH?ht~?4~?@P<_?Q?1 ?I{?@S0?Q#?&η?pH?$*?V0o?ّntc?֌?rܹ?юXO?_?%#{ſ?N̿?6ο?}'XtϿ?Lѿ?豘ѿ? ҿ?DWԿ?Gx.տ?Hտ?t-ֿ? RCٿ?VHXۿ?cl?%d,B?Ak$? &A?&?T%֑??@0B?j ?U98??U?9 ?19?e?KZ?sXL2?ڳȥ?_l]? w-r?ڦ?e?YHZ?C?|?̲r?覫?Pfc?ś?롬?_9?|1? Eذ?BQE?\?8T?s۹?4?淋?{/?0V?w0?GO6Q?q›m"?d"?|VŰ?Vy|?l?*L?6m?Da@?]>#K?ո?"\z?.<{`??ɷN?tn;o?7X?$nM"?If?O 7? f?U?TS P?OF??0(?c)?6Y?ͣF?thn?T?(G?x?f?2z?x?,a(?a/???FΜ?4D?X5?F>?>?+?G?4n?`R:D?!<?[0H|!?k#?J%?9yO%?o2'?Vf2(?\gA(?)g *?]ӽ0?%) 1?6sӭ1?9T.2?cѐa2?o2?ȝy 3?}y93?ёxSs4?]4?d$5?Fy;?CC;?#7u?\ux?M` |?W} }?8a}?k}&?Q?yi??8\?M5?u)sȍ???bS?z^?gd?d?Nhn?}Şf?$c}O?'{? բ?^?"?Ik?a?F?O?Z?Ec?q|Nj?_uߏ?ʟi?x????X?4؜ϵ?%h?n?B˸?"!¦k?X=B0?n2?ݺ8}?('m?yJl?a E?G<?T\?f\d?"?dT?l|??á?7?t?W?O?OZ:O?!a?OTc?lq??1'? r'C?O&?vt?^?̈=z?)p ?0?Z?yqM?]?P2?@x?',3?_\T]?/?mLE??uB?B?O^B?YB?ߦB?asF?;OH?KI?zwI?C]*J?nQEucO?AZϗO?~0IO?fGS?]6YT?)T?W? NX?kf]>Z?˧[?o٣`[?qɅ[?Q9?([?3\?[_?r[/`?n޹a?(b?@S0c?C,c?Eʁd?@π)j?]BVm?5^1Xn? Xn?eur?[spu?{.-w?iy?[z?P}?ݠҕ?v2H?o_(܂?2 ?l&???A ?8oR?&?ٻ?oԉ?{ ?|\?)?rũ?̉?+uÏ?`,?}?K2?{3?*O ?l?z3Õ?~j?dfv?gn?=_Z?+?rx֨f?TXi?Gt?k?UN?oޏ?:o?k7ɨ?O?I36?Iˡu?_ޟ?(?&Ϝ? %?yr?4g6?z}?I?}?`H\?Æ?1K^D?bq?!Ѫ?%?a?TiĽ?xý?ܲU?}j"?|,?-\??ˤ6?;?L ?{(g'?Z8?,Q4?N}?4?o?KSŐ?Oݏ?"G?%>?$O}?(?F?/?>0?VN?4?Z8P?[?,ˁ??3ĕ>?0e?&zo?scY?U%,R??BV?˺:?AB0?{6y?4?J?&?6S?{??BTc?n*W? ]?2i?!?T3?;-?AvX?_`? }?$.?? X@I?M ?+iy??4D[??Y1r?ֵ?"ޱ ?v?Ky ?_9)iQ!?2"?p=$?yS&?+]i5&?l*?ABR+?X 7+?v(S,?**0-?ˣRh.?;kfi.??o.?s,a.?>E1?k2?l3?_43?@i5?5?M65?̈́JO6?دCN9?DR:?~:?"1 =?)S??n@W@?AfQI?m|J?_{OJ?Yj4J?GUK?"/W~L?T(DN?ſ#N?L O?kfwP?ٛ\P?aPQ?qL@Q?mR?gS?'U?ԆĐU?>9mU? V?UJXpW?\ MY? X=#Y?{[?Z?}\?Nyy\?\?8+\?r`%^?$h!b?cb? n@c?Y c?(d?Ge?77g??h?ɜm?mn?lp?p?9J5r?'2br?㾯s?Ws?*8%t?ZmGv?iOv?? x?>-x?ey?h;z?}{?Fa{?YNR}?ocK?i(l?Oc6Y?u?=~DSC?he@?f8J?>G?p9$?ۇOI???ޞN??_Q?A$F?j؎?;3#?!c?;tі?,2?heK? da?3z؅˜?r7۝?|sG?svM?򄢜?;?tT8?[?"lw?X`?f~x ?,*?a?yC?ϐ'?BK?g?j?Wwҽ? ] ?Cs?>?v"[? P ?kr?}ܶ?Ϟ)F&?>?\%h?:I?r66?z?9 D[??b߿?h'A??5?D@?{=?{#XI?J?`?C??꾞?#?vG? f?; ?lnc?1rX?E&?.{?'?0e?hT_?7C?rZ?H?N? [ ?2T??@?l4?d?:?S;? ?7/?Q?L4?dj\IZ?$@;? D?a$J?Ca?Ia?#>?a??Q@?|50@?7fC?j1D?oTF?3G?w(/H? }EH?uH?II?"T7J?wf@J?eJK?;L?"P?L?X|L?A ^L?eO?TrO?}n;P?lP?H I\R?coT?NvT?6|3T?T?fU?3Z?w;Z?hv[?Snr]?yi^?4 G_?V@:H?e?"?, !?5"?GHQ%?N(&?gga'?#GW(?ެ).? E/?=![/?{13?s5?@5?zq7?iSd8?^o:?2y;?z?x>?#@?FbwB?;nuB?B?c C?w0D??e>E?َJ?AK?W:sM?PMP?5lZQ?aR?TR?iFT?1E5U?A)lZ?Aֳ]?g^?O*^?xCx _?)3`?8lb?K 'd?ggag?#GWh?0oi?&} Mn?@o?@q?r?X/ոv?]cw?Œߓhx?8y?#V;/z?bV a?۶s??%Ƌ?WT?\c?O&E?f? n?rek?7'q?\?V?GV5^?QL?? m4?I?Sa?~L?}uE?Sḵ?տ:?͉k??B}?00?P˜i?=ӥ+ ?`5 ?#+ ?4 ?v<?7?/}???f? ?"<?q^??|[U?یt?5=#$?<-$?`:$?(%?:rX%?<%?&"%?r&?;]:(?p )?VL)?zn*?{̼*?+*?{<2?2?D&l55?4E8?rN?5'??5G??*W@?:i@?9=C?3ŠC?vD?ոE?J&vF?J&ٞF?ld)"[G?z̪IG?@ H? H?tJ?&@S?ǶT?=-yV?DZ^?xD,2_?.ü_?U:0a?A`c?ԗ=e?\_Of?tMg?#tSg?\ʠg?Lg? 1g?S#Og?GT'h?\i?vђi?Pim?J>Jn?v o?;eq?v+s?([s?5]zt?v^u?2C{w?w?z?[Q%z?pz?`щ}?\Eb@~?T?? rHQ?=>Y?2}o?TFj܆?"1?=M?$Cg?&q?0hQ?$6۹?"]?\Bw?6_?ynV?Yv( ?/V?17$]O?Yi 5.?T9?_?Ə?ĭm?g6ِ?#g!?M?B?s?4?$b2s?>P L?#<?ԙ>?';ؠ?w!?3?Fg?x?Ig?j~?]I?8:oM?Z?Z '?Y? )\?Į?= Θ? ذ??(ᐭ?γ?<?cZ??0H? `E?}K?9?X?=T?E3?k"?E? {?9l ?ZHs ?Ex ?/؎ ?qm{ ?̹o?+?w]:/?qx9?ݖ:[O?j1?Rh?ӣ,?[6ؓ?K? ga ?% ]O(?(? b(?ގu*?M"-?s.?d&/?$͜3?xb6?3 7?6y;?Q;?`U=?mIW@?͔@?IC@?oC6B?]*F?ҝ+G?a:H?I?.lwK?P,LL?74#M?֚/]Q?L݁yIU?PU?GKYtU?5V?p.V?;BQZ?֠]\? )ȚT^?WZ`?z۹a?lb?1>d?*vf?Zg?Uwh?]|C"?`"?f[G$?sa%?:%?܏g&?Ā'?&U)?)?ի)?N*?c)+?_k-?f^-?G.?j.?ѱ0? ym1?d3?4?9D*4?^k4?+o+8?7Y8?s-;?q4h??O>?s4N@?@A?.CB?QC?tD?^M$G?8ճPM?feM?XO?\YdP?,,uQ?t<R?PXR??,bS?=S?H'T?.yT?a~V?W9W? mW?<;W?tyoX?Y?QY?rd"Y?ُ5[?6NU~[?)Qk[?2*\?>K7\?tA\??ţ?I>A?/J G?{w?4<7?rX˱}?! ?`x?m ?q?z?=YdM‹?{?h?ȶ?ȍʍ?u?xE??z4?Yh3Ð?5 ?jLG?_?0y?Ȕ?!e??:Il?>h B?r?BX?uH?3? 9(?Ե񅛜?F"k?nO? m?p?rb!П?Nc۟?_?rc@?N?8W2*?<˖&Q?,|\?l?q?O:/?"0b??=}?9sh?[?G???Fq?:eM?lUN?$ 9$?h?]SU?z?0?un?0پ?Hɷ?GZ+G?ש۹?n?o&'?&p?W|??1?]*?oh݄?7W?,d/?^H?&Q?Gd?F r?R>0?0@?@Y2?˨K)\?|?/?;??.Hv?Bss?~|?BS@?7i|? 0?~Tr? ?bn?9;0?b4?A}8?dV?`HQ?vg ?|A?o?ߏ?]5?Ki;?-TI?b?IAs?P??>?/H?}?Z( P?74f?:e?Q?0?} ?8JG?8A;?xY+??!ְ?wn?䲗?钳?c4ܔ?Gp?4r'1?3[? >?)p;?kJ-?Hå?LVB?v#?ZdZ?Fx?[3?<3?Ho?^?U\?k =?qVN?):o?;?iD)??,"?=d?LI 2?O2?6=?6a?R8 ?DP%?R1?u?2?r"?G ?b- ?˔ ?bG ?&$ ?> ? ?1RĠ?XcalG?6K?"G?@?Ov?µ? q ?BK?B?lb?-n?5LR??A?Q'?5?I8?dDт?f?G ?E&n ?5 ?!`2!?u@"?ׅ#? |4$?M^$?~p-%?E͐&?Sµ'?2z(?$(?;[P +? Ĝ+?4+?68`,?--?2M.?NJ0?r0? %)2?A2?e_53?a'q3?d E4?[v>5?tw?Qex?Bɖy?z?E&z?^{?aL+|?ԁ|?p"K}?2l̟}?4? {Ԁ?^\1Ȃ?x.؂?Ttc?1(?_?l? ?ъe?L`Y?7?ո?aoU?24Y?k?s?Uh?y?0?Ɣ?AAK?|6?\?2P?3Yl+?xg?|1>??? ?&???l?l?X*˷? k,?]ˑ?),?8/? 0?{I1?:1?\DsX2?Y(4?49? %?<>?G??;6y??)oF?^ƟH?HiI?"J?8(;J?/K?W'L?,nN?{O?|KX?ύ7Y?]hY? *Z?G_C\?G]? ]?x_?lfw`?y`?JCb5e?78xYe??*f?fB g?}#;h?`h?rDm?Wo?J{ds? yPv?ny?Z \[y?J?5z?E6z?tfQz?|{?eB?v?-ɦ? ?ã?*P5 ?f𫬌?Χ?#?ag?b{?8:!?"m%?gq?3?0؜?8_=*?Nnj[?P?DD(L?S%v?h?18]?=?[`懆?m?Ux?Bxx?zUx?FI{?4d|?z:f?|?+l18}?'+}?yy}?>{~?n(y)?^'&?]fm?Q!y?m02ӆ??m?w:/?y]?(I?й ?j˼?@_?ϑ?: W?!GeK?O>D?ǻ?jWe?{Е?QMtV>?(ݴ?F~ʟ?H?&?ml@p?.?;?L[䥪?6X?zH?b@'?b?'Q??;;?_F?!9s?BqH!?SW?g?Ԓd?D˲?>,? ?Ν?F`?cj?™g>J?~oq?*?^+?(}?G g?}=?T7bP?E-? ek??0K??=ǿZ?+Hӣ ?q$S#?/a?W"2?As??)h]? '?v#?_5?mh?Q/?؜?@,r?9yx?;j?FԘ?0?=V?ҟ?Ԋlp?{^$?.?ֹg2# ? ?h ?8@?R8?И?W?L0?dP?ǒl? >;?V'?5 ?hQ޿ ?$O/!?ޣꖞ"?wMM$"?^ğ*$?g6 B '?JE'?O'?<ӂ'?Zǁ(? *?i=*?o,?/.?K2?Fj 7?Zh?|Jݴj?ik?}m?7m?wE~jm?7XIp?Fr?zr? os?Sdu? ]8u?7iy?65kQz?Y'1~? 0U.?S;?UcxY?BNb?D+lj?BT܉?D?"%1?q3?Ze?ʝÐ?Mw%i?6k ? 5ㅒ? ?_?mD?zaL?ML+? 5 ?h$c?Dp(?g?Ѯ?ZMO?whQ?I^?=?@dӲ?cT?)?"Z⥴?q?rg3Bе?-5? m?o"?vF?\CC۾?x?;OS?S ?)K[_??'!`?ҧ;?+?3?;jL?M?a?DP?tS? tJ?y7ׯ?ť?&?6? ha??]Q?|?/y?\?Ӽ?5W ?vP=??,? ޖoM?…?0?&??l?QP}?4\&?숔}?s ?e?GDE]?n?ǾC?|?z?`A?2?h;?y j ?b"WJ?j)ς?F?b?9~?,X ?z ? tJ ?DX?9QV>?7Ҡ?:{j??ט?As8?ݚM?: ? ?|0?C4?NI ?*V.!?vwn#?}!&?!&?Kw(?p)?S#*?@S+?#bp+?.-?YQ.?cˡ.?v/?m2/?˽s/?R1?o2?3I3?>w3?a]5?.T7?ǕxY8?s9?~*g:?@e4??"YU@?ta…A?eB?`xB?:WCB?LF?a3RG?U ?G?rqH?I?c3iJ?;:L?0  M?^q=T?"hT?T?mpU?kX??[?kG9[?=m\?%]?$ӗa]?&0]?F{^?^? k_?/f_?>qXb?ɶd?ݢ$d?(k|?Ipν?iL?\N?kr8?O?`*?v??? ף???k?v?Ō 0? Ҕ#?tݠe?!?ZQy9?+q?۲ ?&B ?t ?kW?e?V?O4?숙6I?o/?, D?^-?e6%?$}4~?K?{1$? 8t%?N5\%?%˒&?Fkw&?3]_V&?T"r+?%+?!,?+&-?Ybå3?If;?0A;?J ?ʎ.@?AJLR@?׳@?]O]A?YOB?lu7C?*jlC?4D?)!G?2J?>!Q?$YDS?ѸT?yENMU?QQl:?[?! W[? PGc?:?e? 3f?g?-i?.1k?o?Yp?{^Os?vۙu?Zv?f w?Nc=z?I~v{?z ?X\[? c#M?2w? ?Ʈ?5N?xG]ڌ?:?@{?cx?3s(?qaƓ?;?ݜ;?dz;;?SXA=?I7[??n?? nz??=B?@C?brD?H?QPI?gMhqJ?"J?8hQM?N?@;nP?lbXP?MR?zR?4-2S?q\T?C}T?6~/%U? .U?ɺU?˳W?TNI\X?.s:Y?!@Y?>T0Z?@oZ?HM [?m;F[?8"c[?h[?LIK_\?`j79]?ɰs]?55^^?蹒F`?sa?:w^b?Q~:c?s*f?%ηf? Lh?VNh?GA:i?cdl??ک?3z?m[o?t0իL?wEơ?1?%Y}18?-%G?ݤ?-U?nKw?_U?n?\?dʁ?>)?尪?7ª?ʫ?i'?|ϭ?pSS?ï?QJ?cm??X&?2? MJ(?|_?(Ga?(o6I?{nv>?=U?Ss?YrJ}?|? ?ż?e?%哺 ?ifV?[?AP? `m? 9?;?'̋~?Υ2?_U&Q?nκ? 0?0,.w.?abGq?@DV?hꖙ?i?uw?W ?!f63?~?ϯ?Ҹ?Iڸ?Ob ?:J?m/6?!>CG?6I?rSj?zj ? ? ?A# ?+? 1}? ?Vm?Z`?µ?βf?b/?~"\O?}fK?9a}?8A??5?%dK?=B??M?? ?X*!?|$?HV%?rb %?֕,%?SA )?QAb*?b3*?W+?',?u.?fƛ/?(HZ3?:8XI5?PMH?;J?p:sVJ?%@1K?0-M?2xM?&?%N?kO?C~O?gO?˙UQ?Sn)R?q*"S?7P}S?`S?<\W?X?"Y?F?wiE?˿?o]?nub??#s/?U&Z ?-n"!?ýl_$?:?%?/\(?8c(?9*?tU*?o4ɍ*?AKpM.?d/?kWt-R/?0?/21?a{1?i&u3?*4?yTC5?n.6?07?bZ 8?E]'8?@? B?HB?wQD?iP?OApR?'ҴS?]JW?euW?+X?dY?I%a?J?HM ?/?1| ?#糧?!?bS?,$&?y0M?I$w?YI ?-?|x)?"??ٚ.=? ? u? Zyb?[V??篳?L"7I?—. ?GX ?=N. ?8 ? E ?\;??M݃zt?T?k'? <?t?c+?$Fv?E^?ޅp?]"? &R(?VI?;?x?=?b?F|}fv!?1HC!? "?7p#?F$?v%? 9G(?iM(?$)?&*?⑭+?~=,?L ,?h6,?o!l2-?zd-?zt-?24Y.?).?/ڍ/?:4^0?0?01? 4>2?.3?hP4?4?X5?b)6?tƈ(L6?h#-N7?&;8?189?u"8:?J^>?5^??랋r@?P*@?EB?t/B?QD?Zf4~F?G?K?K?99ٌ'P?=L0P?S?E1T?.U? ?V?]ΧW?jX?)}?Z?vZ?.r8[?cZ^?oZ_?h_?W`?! a? a?Xa?6ya?{$b?d?[}e?^ӷf?:Ilf?O<ԧ6g?"`j?Np? 1p?''q?;_u?FmUv?^_j w?5a0?,<׀?@7I?`8?iKǃ?e+?8?)_? ɉ?v? 0?L?K?mRf?ӖB94?V?a9?)%/+G?nm?櫜?lg?Ј_?u%Ǩ?h.?c֮??`%p ??뱶?e'?S??U6??nX9?b̜?Ip??С]?h "?6|E?z$?;j&???3bT3?s?'=Z??d?[ (T?kGu?QU,?S?[?@v[E&?24?.-1x?cl?q:V?T¸?[%Ef?Jn?qd ?\9/n?hM?- ^? ?WX??B?; ?`?pޕ ?m ? =?.j?hj?9]X/m?˿Y?G5?Fk?#F?;O)?Uf+?$s+?~:A+?cQ,?.<1?Sh514?wLp.6??i7?&V豝7? 9?94:?p:?F:?i>?fI@? Vn2B?DZI|E?%MqG?nufG?ܵk/H?ׁ)I?W)qI?/J? 3J?s*}L?tpqL?@ϊM? +GN?~{N?3Q?T>ոT?~+X?Q9tZ?|p[?M,r\?Cj]?;]??<^? _?b_?НNe?x[f?sĮ?f«?_:?|Ԋ/ ?i'?Aqbp?zГ(?I??t?| ?[;?HBO-?XzjK.M? Tx?+]i5?_I ?0h!?.İ?PdOͨ? >[t??+?d? A ?׭=j?P'?0ݴ?jwn?NP?rd"?6"?^kb?6-¾?t?i?sh|?Kge?p}*7?pl?DjL?7|?B?ge?ER?z&?{O?:?_?kw ?ңt?s؞?n/y?"l?_3!?8?יI!?^C%?Yh%?bMeQ%?qr'?+?+?J k0?>22?S]S2?R 27?`(9?E?caD?aJ?kN`eM? ? gO?ZP?N.GAP?ӒR{R?'W?X?64 b? Kp}g?Si?PKnrj?PEFk?33l?}hIm?$g Pm?4q_n?5Kn?_?o?rs?8ys?Cftz?ŏM\{?N*E|?-B?bz?z3?H?s?'T/?h?ŝ?*+?QG?(fnҕ?O[-B?d?eØ?"Il?0Ȟ?KZ?6\?9Wy?4G?~K ?iX?{?;|:?;kfi?@?;;?/lw?Ô̲? |C3?΀E?0 ?Tulg?o?DEA?<8r?WX)?¸~?`01h?#?Ƥ;_?@'Λ?X,?  ?l8I?/?ץ*8?Ew/H??P?0#k? 9? ?ל?@ ??z۹?Px?j?%0Hq?C?n?/?2?+?dS?Fs?{T?}( ?U&?%~-?/?@k'3?455? ws`U7?c7?bhO9?6i9?Fn;?E'=?I?'HR?k$AS?%>S?"-(lS?A\]jT?V{f\?f ]?j]?zbE_?J(/_?]d?Ԍf?zݵg? M9$j?ˊj? 1dl?  o?d;p?zrq?%q?$s?WhAt?X!u?7xu?`~w?\~3sy?~'y?!z?|?2>R?nF?Q?KJ鵳?)?33333?&X!??Gt?~lI? 7S?tjC?h}/]?奘 ?U4?dM?k?=j?|+?)K?Å/X?ZO=?ȋ3#?C?[v>?Gs>?0F4?t`Q?7 Z?z?/2?LXv?7?Miv?2v? ͌?LR ?9BU?A?9R"?-&??]?G?ok]J? pm?΀?)ok ?~ƫ ?>t ?6Z; ?+ ?ɥ ?MȦ?~XD? ??bpB?zEE?lJ?/;J?J?FQ?vLR?.9DU?^ZU?J%U?ނdZ? >\?)N^?Mvb?$Ǽc?8-c?>d?_Չfd?%6f?+h?Ujm?m{Xo?E0o?vso?@]?%p?W,r?ss?Jupt?v?l}?']~?+B&#~?y0n?'!Bp?RU?h?M*WΗ?בe?^Y<т?#d?GKǗ?µ?U,)|?|n?ޚ? ̜?#7?@?#?J+̝?e'?WI?y͟?q?l?̜?OQ;?ĥ?0ّM?O?qҭ7?^绫?…?q+? w>?f%?`]P?_ѯ?Vj)?@DT?iޏ? ]?ϱ?{?my;{?4S-?h?M,r?/?%̾o? y??^`?d+?K?v~?8*o??/w?#sgQ?y??Xi?O(?A_u?Ԃ0?MZ9$?;?':t?vn?f"?uh?)[#?F*T?"?9?9a? ?|*?Zr?_?? ?WUa?bT;o?5~?A+?+\ |?aTC+?XNJZT?suap? (/?Vq?1?:3, ?y?\O?8??3?I ?st6 ?<= ?0?r?/X(?Zn!?d[/?Þ9S??r ?.0?dU%?LE ?Ov3?#/E ?)Ȉq"?ÛD#?#?PΔ&?SgX'?B+?g6?WUb8?EUU9? s:?fo;?87;?e?TiA?@$A?C?JYtD?5FE? ) F?A.G?.H?C/pI?(\BK?4 :L?E?L?M?\2)fO?wdP?g6S?*XS?O WT?}s8V? (dW?2i55X?SsY?o\?V{f\?.*w]?>_?sh_?Ib?jlb?b?*l!c?A?lGc?Ќc?}7e?(f?icf?CI?P~j?`Ɲϊ?%P?M;?_uߏ?N`E? G?etuƓ??p9H?4i?8b?6?՗?{nv>? b?>s|?3Z?C򾿛? ?Y4r? 5?gY?,?Qr??9T?? L?ЛƋ?3X9?H79?Cp}?=?. ?Y? 2?OKAB?Klǿ?ZQy9?F}?떨Ԩ?g?:[)?GZ4?4?|o?+'?Y?9?P?ra ?Ctc?ΒV5n?w?u3?i0? 6r?qK?]R?)#?N}?0Ts?Ihx ?< ?Hp:?-?6z?%P?qxi?ф?1HC?Zd?׼zzD?Y{ FF?M?n[h?CXM?˰.[ ??5^I ?R4?U-???>t?Qd?mh?Jj?wLX9?@oR?YA?j{ ?%? (?n-?IZp/?J k0?M3? 3?ǞK5?TԼ\5?@7?\i=?nX>?kW1@?@?zňD?SE?haM?%CO?C"+R?%pDV?dW?ž>X?F xX?0o[?f\?fG]?p_?ab_?MI,b?ݶ6f?7g?O]|m? n?] n?Uq?@r?u?^zx?o]?z??*?`+?Fv?A+? ?>/b?t\?܍?/4#?گݒ?d?V?F '?%M??UN?/_$?gs?n?W??7I?h?Ű?@c?9n?ޒBwN?9gV??O?w37?R ?xz? ?F(#տ??tj`?H?~ql?̂0?i~*?B?yv?/??V{>?ttd4B?!D?Ȑ$J?vL?^xM?ց*pM?SQ?ӭS? 3T?Lb";U?䆆U?%V?&vw*V?v+W?oA`W?r]OY?+?!Z?G 0[?oA^?xIa?;1-b?ß?d?ak?ó&1o?UOu?V?M?$뱉?T?ٯז?\/?? r'C?@?ۑ=?ha?,??E??X2V?Sµ?LK?.D?+[0`?E?2?<-5?3#?H\?P{?sdd?Hƛ?*j?Ű?.~?3\?e֣?L[?1?|j?R?<$?8?7??3?}?D=?7~A ? 0M?y ?dqb?w>??"_`#?Հ0$? Lmʑ%??(?m2/?H3?Yl!57?fe?,ˁe?f?CMk?O n?,n?0?-q?谐q?? z`?\?Ad??*Z?g]?\ؠ?zmWdK?\۸?8?c11?"v}QH?AY?6ύ?5hּ$?Il7?^?ICо? z?[?I?0ƫ?g/?|?0k?3)?6Kg?0U?&#??WA?@j?FC=?^gp?v^?G&?0?04?$+EF?͑Q?{ԀU?#)$?'?'`m'?*븓?Σ?#?^gp?t/?Oha?~C ?* ?HS5?(?gQ?41?UJ?>TM"?ՐV? wp?/V?e|i?~nr??1Q '?G b(?6>~)?_/?C3u3?#b@]:?$@X?6&?To)?\.?}߅3?xL E?{@H?5~N?L*W?ޕ[?Vp[?Xn"`?; b?-d?He?Ll?j,o?2Ss?ݜc v?>6Xw?/Cz? Ő{?Q?}?T"/~?V~?¹&?"MB?S͇?ƛ??&X?.?A?UOg?[?t]?6?8,?}?,?d?yk?@.=?j Y??zT?זٞ? Q˻?sk(nB?—?E??톧6?8$?\d+?[Y?x 3S?wC0?W?񓉬L?\h? ?gCX?_?BS2D?'s8? k$?x?{{t?dG`?=a?Ș%f?Hh?Ri?ev/Zl?u7\m?Xm?ɷNn?}9p?5!Rxu?~x?c{?0{?Q{?F?l&^?Y[:?X?v\KG?#acƍ?I&hC?z?qN=:?RAp?o=:?n9?l%ߜ?H?@}a?l9?d?6sӭ?,@?ZX?z? 持?%07?`q竬?Hn?*?8c?9?XI?h ?';??,Y?euj?v^?X~ F?be?E?C?$Y?H}?.m?Q=?=?C% ?)S^?05??Z?RQ?7,?dZ?rv?v>??D??k ? {p?D?K??7d?X'?m.?4Q?%M?zʆ?0?Pe?s}??jA ?gZ=*?9[ W??ᴊE?H ?~?s ?I10?-R?U?/?ׅ?P ?\!?_4#?b$?C@&?J߿'?fl?*?/*Y*?B]-?3/?4p=/?Vh2?S[3?A}6?y4@/7?7$9?I?5:?,PP;?U?pcݧ?GZ? 4;/?5n?v?.G?IO8|?"鉝߶?kxa?-0݄?3I粒?h^ػ?P )̼?v{?("?Y?敗n?* {?|j?NX?'u?\~?cҍ?6E? : ?OrWN ?U$ ?%) ?c+x? (O ?A R?M0/]?Zt?B?eO#?t &?\'?5fd+?L`36?[Afv?]k??X53?X#A ?/~?U4ib?Z'?tY4?&YM?\㛼? }?dh?^ ?]o?d?}p?H?U?k??0dk9t?*`P?b??(?^2&w?_3?x)?MOt??_ ?S(?(N\?˱?m?<?o?@x? ?\3s?EE V?1Hf? ?v??-?d#;/?xA?o̼ ?4Td+ ?eK?)X??_F?M? |+?> ?%!?ޖ"'?2O(?iO;)?k,?S#.?0:0?Y֣4?#P 09?16Lq:?i9?EOz?3Uc?ck?,`4?oZ? "R?»?)G0?_]C ?.?}xi?% ?̝;?4M?e@?&aOM?E?Q?<1~ ?k"?hj ?eO ?XXM?J5?Kr?S?,d(|?Si^?pnb?|MC?z? ? lb?v&b0??(,?cyh?UUV=?E? ?ռ?SI?xI?Iz?3$?B?kq[#?y\?wޯ?e"?s ?3 ?ye ? X?3~L1(?tV2?ҭ?- 7?Mn?q@9t?\i? z ?K?.(d?d#?? ?iz3"?o"?m*#?Qh%?م+&?iSd(?xI,?|/?nU/?/Ҫ3?h<74?Fb7I4?C2ff4?ČK5?Q6?/t8??8?螛T9?Rl(\_9?ߍ@?3?E?.E?>J?I.O?R?yl'S?6#RhS?*gY??^? X`?A|i?$`s?cbv?>(z?_-خ{?K7?g%[?)끁?rd ?IK ? ?j"?z,Zn?^"[?%"k?nA?8?!5?R v?{?Z6?DL?@ S?f|?rcO-?f?#c2?u7)?Z?l??\1L;o?r ?26I3?;?A0?v<?ՆyE??$ 9 ?!Z?=?{a?L?i <?Bv~?~??l}hQ?PAE??D?$?L$?5"?̀$?a59?P/!X9?3;?G!ٮ??6I?ߌlwW?^W?VW y_?nRd?;n|g?(Hh?M l?0u?:I&x?,I5y?"~?ڝK~?V)p?TCۄ?%pD?JE?Fvj?5a?w "?@^Ck?FM?g}?E$3?hg@n??t??R8?ʍ ϗ?^~:?;2#?7`q竼?'d߿?-? $?v~? ?Lz?_t?ө?̟*?M? ={}?dۮ??^W4?z?ԭ?#j?f1X?2\?a}`?: ?x ? ?xOm?u<?F)<?R"?P'/?;;5?^d7?w'8?$8?b;?oa?? lb??3E@?u;LD?H?O 7L?ZN?Ύc 'P?c8KVP?ʲKGU?uRX?o~c?c?S5d?i?Fj?&Eo?̻)f6x? ?qj?⌔?u?"4Ԓ?lgf?9??&?u+?c:݄?H@$?j"? H r?|N!'?A̼?RUtS??rMR?KC?L?xj|?{?I?;?K*'?p ?K?$,?(t;T?d?e|?| ?ء%?AX ?M\?IW)|?s$~b?ex"?4{61x?Xp ?1S ?p) ?c ?Жp ?hQ ?V?8q ?Ď ?0I ?c ?iEp?<"?ݳK'?,tc.?z:?3?4?;n|?Ȧ?Ȏj1!?N,!"?ԇ'"?t#?t;?&?)|?x?c11?w ? HzJ?e?vʁ?CCi鶶? ? й?d?'v޽?#糧?dEf?…?fFl?BĀ?/pA?%?J&?QF?̀?r}?LO=?OA?`U?ġ5?;߫ ?G?0 '?2xhA?{?HդKg?SA ?u{?0<?}uE?xZ?)ȕ$?};7?eخ?+O'?',?k -? ҝ/?U1?ec3?g͜8?1bP:?B?T)B?C?!E?d|G?ėK?NoL?ʱN?D^?`# i?rYtk?(5p?sr ?K?RxCk?`;_?Eߛ?#?sr.᪤?==`e?AP?^љ ?ء%?[~EV?DR@?juNj?s?&W?X8ם?#5n?`?—.?w%F?sѭ?zD?D?Y ?vQH ?R?.?VR@=*?p1?3? ℻#?s#b&?j'?^J)?P\-?q+;1?4X%2?ɛ{2?a3?{3?(ן5?,v8?O9?`;?d;>?r CF?HHI?u+=M?3R?(R?L U?t(W?BuW?hd^?Xz$^?n_?0<_?oc?Pa(f?[1+7h?9i?LGk?`k?Hjd l?|u?i;aw?{tw?9C?x?Ex?d:%z?(~G?_۹?-tl?T?@Z?Ujη?Ø?n/?"l ?l"+#?(?jfv^6?EV8?O'=?rL?LM?1hQN?+^N?uR?G%:T?_ZW?HZX?X?E[?(Ic?d0e1e? Q7Rj?j?l?Kp?Ԡ,b~?o?y?_S?{P=?5Ԙ?F?P`%?{ ?w;?%8?A:?ę?ObМ??[="C?)D?hI?O?N7 S?@nW?A7-^?Ո^?G^?%'np}c?G(g?Bug?,l?Bo?Yp?(ZTp?NPr?r?D>t?R?ex?|ԣx?rlĄ?F(?jG?q#?E>?>?Ѳ?~?CA?S?փ?ؒ?Ѳ??87?ܳ2 ?Q?áO?ʀ?YJu?b$g?65^?p?@??e?L7?y;_?M ????l•? ?\^!?!?Ri"?{~%?-:+?@ 1?#}/5?ut~J??%,M?"^ZQ?]T?$T?V?fpY?g"SY?'9]?tg?ci?2j?@w?ۅ}?8yxlW?/?q'/?OE&?GGlG?"? ? _?m?lH??sс ?no"?3?ir;?)?aM½?7?ITZ??[uE?> p?«k?_S"? Q7R? ǟ?x?17?q`9 ?Ȑ$ ?4et?󲕳? Z?6 ?a!?b}=#?S#?qӽS%?p'?Lf-(?3)?8!1?ЇZ/2?_P-7?pc7?D`c9?,?biV??' ^zB? c9B?T}G?BТG?)YG?GL?&M?,O?hFW?9aKZZ?,B[?_n\?m?u3sv?~(5~x?YBz?Ljw|?~~?~`?ȳ&q?̌?9X?|?5?^}?.Il? -? *ո? [?؟}ñ?}X?S??s P?-?hA?3u߿?(;?a r?xXC ?V#C{?iPֹ?Q6 ?'?~9?"k?Md?+$6?d?߼?V{?v(?n,駆?,?Of?i??k9?o/? ?MC?>? P??:\?H"???T`?0V?ԺB\?[Ы?@?CXz?+|O?[?D?E-t?iz3?1V?B䂠?@1?朾?4?Ġ?l'?5?&u?Kǒx?n\?}A?7A)?$?TdB?zW?Gq?^z)?7K?;\??TB?r?pi0?c?D?Z#R8?Kf?[?*7?? fb?c?>?H KK?q?L?d Q?G_V?BV?jJX?.f Y?7G9]?%d?o?-)-q?Sߏq? ğZu?27x?4yf&y?\y?Qf~xy? ]}?U?DԈ??K?M[և?Gb?33c?4 ?e=J? T͏?z?ɩ+ ? ~?}A?6$D?xצڪ?$ ?ד?:^Z?5޴?a`?q"?u &?Cp?)? u"^*?HVAs? P?ǀ?`ZD?\_`5?F63?@t?~?}kף?4Go?q `u?oV7I?᭝o?-2??Wx? ?u?'&?6*?_?ס?4$?(/?f @ ?qeA?r 7?Ȧ?{c?{T?o?kp$?*O %?53?ܳ2 4?)$v8?ʹr>?(`D?mJ?xK?@O?K']?jt\_?-0݄`?Բ_g?4Nr?llbs?γĐu?{?d?R~P? C?mGA??b}= ?=tj ?g?l`v? r&?yK7;?Oh 2o?S u?~O-z?ipmz?EuH}?vuR?}j\?>}n??1ef?Ƹ~?2`?S^j?#f3ݤ?[ ?Q?ixn2?(M%1x?O?sN?HC?mJ?vsF?[>.M??E?[?t3?13?[#?7/#?:3&?9x&?'?tc/?ҝ_0?'Z1?'A3?#35??vD?oiJ?m0J?yJ?X'47IM?f2X9P?[K3P?u9X??Z?oe?K5e?+֡eh?R$u?%Q~?Ā?Y?]M?2,Ґ?M?]|n?P?WO?;ׯ?Dv?ˌO? ?N6*O?؇U?⇙i?qG?!"K?}B?qv?x?/}?6G?P?Eb?9?w$?.t? F?\?$\?i!x?Fr(?n?9vn(?l)?O,? Y4?]T7D?tON?IQ??x?d?T vd?P)e?Kg?",q?(t?2/Mz?&n??zr(?l? *ո?x?E?B?Xy?`3/?# ?9 ?EPz?WfhA*?"쟝/?)`?yjW?Tha?6x f?83g?5p;/k?aw?tKf??%'q?>3?Dʯ?[T?X2G?`K?"?:\?A4/ ?,?+g?#u ?M"?U^q%?i~*6?\#??H A?c|Y?$@a?zo?U/fq?8xu?c-?`"ہ?Γ3`?ɍ?#??Y팭??D?d?l&?un+?F 1?0I 9?D=?%:??#yiE?향F?]s>H?XΊV?unc?Fİd?1,Ce?Sj?ip?Pu?;Bރ?#f3ݤ?ȦCK?SӢ?'1Z?EV?&n?De?DG?{?6's???PH?"1x?N?M?(r?Lz?t?e$?O'?miY,?Ux 2?rzd3?1Hf:? K?;FP?1ۣ h?#p?U^w?Q(?]xɅ?*N?'\/?4 ?xu=?a?f?G!?7p?'?I?t>?G?5>i?e53#?<*g?b?4MI?<^"?6Ef?eM_??A?ˡE?CcyY"?[!Z%?e"+?Yʗ9? XB?B&o9S?.]?c׾e?Rn?uƅpw?A?{x?X5.?Y?zK?荕ç?2LW?Nc=?t /?+kh?3?A?䁘6?f/?̣S?1H?_?H9?F&H?Ev.R?.Wh1Z?U^\?ok?};7u?v?X#A ?>?K?Gfj? 0ȫ?m<?^?u?Q?1*7?3" ?V?ֱG1?՘?z?F?PS^:? ?piO ?#߯?yl?O?enL ?&{7?OK?_Q?qU?o]?p8=9Te?Pq?PvNs?9x|? M?J|?,`?<+?&t> ?jA?@}xi@Q(@ U5@g@*L9@7`q@Gƻ@7@A7X@6Z(@p)@ҳ 9@TrC@dH5V@`@;^g@V^m@Z8 v@㩎g@zG@'q@"@C>@71@-:3@-0݄@lĠ@*@ךts@F(@$un"@Y @co@F @'G{h@޾pM@t"E@?T@wIxi@#P 0@Cf@)/@Ly @ ?@R$%^@D}"@"i='@I(@1@34@=SsO@019P@8U@CNV@향^@Ie@jh@I}@sZ@u@F43@PM`5@M=3 G@=H@Xɭ@,v@|LQ@C@,Dx@G@ȭ6@M@`dK@ @;}@@ xA`@RQ@@|l@SQ@@Gz&@IW(@q= ף0@?l1@>`2@<@2S@ց a@ڮȖf@`1Kgj@xYm@cȣ`u@r?tCw@y>"+y@r@Dy@@ nҤ@d@(@r=@d@Q';^@g@]@4/]@(@ND@n@$V@`M"g@1k@}2j{@iEց@tN+@oX @S@جt#@"k@$@ϲrX@٨M@L "@n 3@@G:$1@CL)M@&5c@nR@P(@OEp/@B@ ;H@yM@dzJ7)S@\n2]@"7i@R$%^v@^}@xY@0{@78@@* C@~:@r 13s@$f@4@a7qN@mR@+h9T@ U @u.@XѠ'@P1@J 5@?@TKg@@f'#1K@K?^@Vq^@}kף^@v.c@7He@ߵx@[!Z@z…@Y\@.og@Jޙ@Y;@a @/2@C`@/@ ס@7@َ@2x)@Mz=j4@fch!?@\\@9?c@:`um@ܦ@V@Ђ@U @cޣ@d(^j@ }@{j3@Iq@z@Qp@?ĊC @Ugy$@B%@pf4@΃jl?@\K@X;\@{Me@z5r@CO͔@eƣ@f=3Ý@ ɑO@ӽʱ@X9v@B @5d@*9i @Љ? @6QV. @@HY @c @M @L3 @/r @ @n8 @+^F` @`d{ @ƫ @RR @t{ @rG @:$ @pơ% @P)A @!yAA @-=MQ @*W @)/I^ @ʒ$va @:tc @nWy @/ j @Ih @6Ef @їD @0 @2  @~% @Ρ @$ @SM @* @,3 @:V @c- @*\ @sX @J'^2 @/Vm @ }n @XO= @70 @Vf @d @ϴ @aq @]e= @X @Q" @aG @1rV @6p-] @N` @L~?c @-" @ @s @"4 @8D^* @e: @c~ @Uf @gid! @:eM @UܜpV @OԨ` @ŲDe @ Cn @x @$X @Ѡad۷ @ʡ @'y aU@7Sb@;@t3G@P>`I@MM@>p@­%^Jw@C;~@m#@Nr8@pm@:ih1@[½@vb㵿@'A@PI<@&g@ U>@ @=l@q@+zc@ @L?@m@x @{F>@6A)@,@~2@mC@*]9O@6O\@4zk@ w@Gm@%M@/$@A@@g@GP팚@ @OUΨ@FE@$@49|@R@1@ġ5@l2}@y^@N?@~jt@C;@`;_@ @{_@B.@ C@H2L@96B bR@!WK'm@K?r@] u@5.@Bڣ@`Ƌ@#x@Z@M#Z@cIC@.@`@/@@@l7@[A/@_;@Xzj<@c~@_6@H,@ɥƋ@d@t>*@tO:@G@&!M@,3X@18`a@"~~@a~@0"@ҡ@@ȭ6<@X&?@SO}B@"d@8e@TWw@Đ}@=@2:<^*@q`9@g I@n@ @x&@7`q@3@ $\@=@Z@G$@K*@^I ?@V@fq@xXC z@$@ZQh@Xzj@Yʗy@nI@0"@vVlG@B@w&Q@*B)9Q@86u@0aU9Ĥ@rķ@ѭX@%@-@ޞ@@m@H7@p]@SK+@RdL@*1Xf@z( @&rha\ @Vz @= @i < @s @/$ @p] @p @ @> 7 @(\ @KD<5> !@]!@qY'\u!@cIC!@2^!@nS!@>!@c;!@4!i!@6!@!k!@ j>5!@Ҧ -!@"@NJz"@"{"@ C"@~n=Jc"@7J*7e"@0Aܵ"@X|"@+"@3"@6m$ۉ#@ s?#@.κtL#@ ? gS#@!tv#@r 13s#@5cfv#@+y?#@ o#@A@#@$@L$@W$@80C{$@: l$@%@7e%@+\y%@%@>9ߏ%@!)%@<%@E(@X]'(@r+ 8(@Tbf(@fsZD(@s)@08)@PvN)@_$)@n6F)@Ü?%K)@UP)@Ԇa)@}~xhd)@*g)@tc)@u.)@ʡE)@gEF)@zM)@-'dm*@ ד*@B`E*@e53#*@D+[+@] +@ 7,@*v8,@ ,@2x),@y/-@_{-@l׈-@{-@N -@nb 1@VK .1@bDLJ1@V9d1@!o1@.κt|1@%11@أP1@:1@0KbP1@ 4@:,4@y44@+Y<4@(\T4@> q4@K4@c,u4@`"4@F5@Q5@%_5@mq}5@t-b5@#C -R5@Ɨ-M5@]գ5@bD5@@tS5@I| 6@ق+6@6@Rl(\_'7@srX57@/ݤU8@>~Z8@Kgb8@/8@oJ8@j|9@ +9@/$:@K:@)+:@"Z:@tV9$:@Gz:@{-r;@M;@i+;@?;@!d|?e@@`@p@@@g}@@+@@h㥋@@ƋA@XB@ .B@l0B@|?5{B@f\B@d;O C@ 0LrC@8=K7C@caC@!d|?C@.C@vD@h ZD@D?v/~D@iͨD@hPD@D@ҎEoE@x~E@cE@!h]E@+E@(|SF@3< gTF@^I F@|OF@ffF@3M@V-M@QM@3< M@]AM@S{\M@S㥛M@nM@?TM@ԹIܱM@["M@RM@B`M@\CM@=vM@;߿M@M@oƌM@Cl'M@p= M@>jP@7A`jV@N\@ ףp=`@ +6a@vz=j@(@X(@l(@l(@X(@(@(@(@(@(@(@(@X(@(@(@(@(@(@l(@(@(@X(@l(@l(@(@l(@l(@l(@l(@l(@(@(@l(@ (@(`d(`(`(`d(`(@(@(@(@(@(@@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/baytcp/ftpc.cc,v 1.1 2001/04/05 22:49:46 haldar Exp $ (LBL)(@l(@@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/baytcp/ftps.cc,v 1.1 2001/04/05 22:49:46 haldar Exp $ ()(@l(@(@(@(`d(@(@(4`(@(@(`d(@$(@(``$(@(4`(@(@(8@(@(@(@$(@(@(@(@(@(@(@X(@l(@X(@(@(@(@(@(@l(@(@(@(@X(@(@$(@X(@`ejn`jX(@\(@\(@\(@\(@\(@\(@((@X(@(@8(@X(@(@(@l(@X(@X(@l(@X(@l(@l(@l(@l(@T(@X(@X(@T(@l(@l(@|(@l(@|(@(`(@l(@(@X(@(@(@X(@l(@l(@8(@(@h㈵>iUMu>h㈵>h㈵>0* (@(@h㈵>iUMu>h㈵>h㈵>0(@X(@,(@l(@l(@(@X(@(@8(@(@8(@l(@l(@(@l(@X(@l(@l(@(@X(@Q??$@??(@l(@(@l(@ (@(@(@l(@l(@(@l(@====>(@((@l(@qOvO|OOl(@((@((@((@((@l(@X(@X(@`TaTjToTzTTTTTTl(@p(@p(@l(@l(@l(@l(@l(@l(@(`(`(@(@(@,(@l(@(@(@(@$(@$(@(@(@l(@l(@P(X@2.1b8a@(#) $Header: /nfs/jade/vint/CVSROOT/tclcl/Tcl2.cc,v 1.9 1999/11/19 23:50:48 heideman Exp $ (LBL)."."."."D>.",."\>."Ԣ."(."pC."."ԯ."."@."ıtD~."Ct."p."tDh."pJa."Z."8W."(VR."`4]M."H."x@."9."p1."4,."$."\."Hj."."."."-"H-",-"84-"-"-" -"| -"h-"hf-"-"-".-"1-"t7-"H-"<-"`-"-"`=p|-"đy-"Ds-"45o-"\7f-":[-"5V-" P-".K-"/F-"A-"X;=-"S8-",4-"/-" 1*-"3#-"t?-"4-"6-"  -"-"7-"@6"ԉL؈6"6"0123456789abcdeff9"_9"Z9"R9"r9"m9"z9"m9";";";";"7=",="#="="="="="<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"}<"x<"s<"k<"b<"C"C"C"C"C"C"C"|C"sC"mC"eC"^C"WC"FC";C"5C".C"C"C" C"E"E"E"hF"_F"SF"GF";F"4F"+F"%F"F"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"G"EJ"=J"7J"1J"+J"(J"#J"J"J"J" J"J"I"I"I"I"I"I"I"I"I"lK"fK"`K"XK"PK"JK"CK"=K"7K"/K")K"#K"K"K"K" K"K"J"L"L"L"M"}M"uM"G"6O".O"(O"@P"pUHVpV"7nV"8lV"9jV"hV"eV"3bV"4`V"/^V"0[V"1XV"2UV"-RV".PV",NV"+LV"*IV"FV"DV"BV"=@V"<["[" ["["["Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"Z"uZ"hZ"YZ"MZ"AZ"3Z"*Z"Z"Z"Z"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"Y"|Y"qY"mY"hY"bY"[Y"TY"QY"MY"JY"GY"DY"AY":Y"3Y"/Y"+Y"&Y""Y"Y"Y"Y" Y"Y"X"X"X"X"X"X"X"X"X"X"X"["@8`((C`":`"4`".`"*`"%`" `"`"`" `" `" _" _" _"_"_"_"_"_"_"_"_"_"_"`" y`"o`"j`"f`"a`" Z`" <V`" <O`" K`" `"`"`"`" `" `" `"`"`"`" a" a" a" a" a" a"a" <a" xa" a" a"a" a"a" ,a",}a" hya"hua" qa"ma" ia"ea" aa"]a" XYa"XUa" XPa" XMa" Ha" Da" ?a";a" 6a" 1a"-a" )a"%a" !a"a" a" La" .a" a"  a" a" a" \`"\`" >`"  `" `" `"`" `"`" `" 0`" 0`"0`" 0`"a" <a" xa" a" a" ,a" ha" a" a" a" Xa" a" a" a" a" La" a" a" a" \a"  a" a" a" la" 0a"  n"'o"$o""o" o"o"o"o"o"o"o"o" o"o"o"o"o"o"n"o"o"n"n"n"n"o"pOo"pOxo"pOضo"PHo"pOho"pO8o"pOxo"pOzo"pOuo"Poo"PȺko"pOeo"pOXao"P]o"pOXo"pOXSo"pOȽOo"pOXJo"pO(Fo" R?o"S;o",T6o"U0o"V*o"Xo"`\``y"y"y"y"zy"wy"""""""z"s"n"g"`"S"G"@":"3"*""""""""s"n"g"`"S"G"""5","Ѝ"ȍ"č"X"U"""""""EU$CU$ U$@"]p] `]O"4"""ߜ"ڜ"Ӝ"̜"Ŝ"""""""( "("0/" @@D";"5"-"%""" """"\I,III"dOOO""y"m"`" T"@K"="1"%"" "" "" "xTϺLLNMlkܬ\D6@ԔĢ]oafdlaD >x$@4(;HXxrtH$FpCxjXdwHedh>E g,$WDtELL|M(M H|#x|\$&`t^i{8{|D{$%TUVPc0DlhpD fHeD3334MK Ntt@>ϺNPHNGH FLF FϺ[$X$[$Ϻ[$ \HdDec#,g\~Pܸ0Vȵ$yHṗx0\`,з0W X,WYxYYt0pU@tlx<ĽXV||Lt\[ZTT|XLt̹ܺx\aTkb$̌|ZP|jjX|L[č|Y8<LT(,Ƚ$D% I2`DtvrXvqu~}@]dpZPl( 8iiKT@@XxudH|W^alp8[|O  d0X Lh0 K,ld8IJ LJ$2`]|Y hK\_D$Vt_|WTX,.dbXvq@\tPx@hhP4ح(Yt  p^XRlHl8 hU,4PlȊ, 4chc8 0XcHTS`ĬlԤ`lx̚|@cdȥ\@h@x@M8L``hܹ`lL$MLy}@zz${`{~Lpc+D+84l\ch,(,@,\,h,t,,,,,,,,,"""  !"#$%&'()*+,-./0123456789:;<=>?@AB7CDEFGHIJKLMNOPMNQRMSTUVWXYZ[\]^_`a//b//c/defghijhklmnopqrstuvwxyz{|}~~~~~~~{{}{{{{{{{{S/S///{{{{{////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////            !"!#$%%&%''(&&&&&&&)*+)*+)*+,)*+-.//01/234456777889::::::::: ::::::: :: ::::: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<;; : =>>>?@@ ABBB C DEEFGHHHIJHHHHKL,&MMMMMMMMMMMMMM LLLLLLLLLLLLLL;;;;&NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN:OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&:&&&&&&&&&&;;;;;;;; ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;;;;;;;PP;;;;;;::;;;;;; ;;Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&QQQ;;;;;;;;QQQQ;&;;;;&&&&&&&&&&;; ;QQ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;QQQ;;;;QQQQ;Q&&&&&;; &&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;QQQ;;;;;;;&&&&& ;;&&&;;Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&QQQ;;;;;;;QQQ;&& &&&&&&&&&&&&&&&&&&&&&&;&Q;Q;;;QQQQ;;Q&&&&& ;Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&QQ;QQQQQQQQ;Q QQQ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;;;QQQQ;;;;;;;;;&& QQ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Q;QQQQQ;QQQQ;;QQ&&&&&&&&&&&&&&&&&&&&&&&&&&QQQ;;;QQQQQQ;Q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&&;;;;;;;&&&&&&:;;;;;;;; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&&;;;;;;;;&&&&&&:;;;;;; &&&;; ;;;QQ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;;;;;;;;;;;;;;Q;;;;;;;&&&&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RSSSSSSSSTTTTTTTTSSSSSSTTTTTTSSSSSSSSTTTTTTTTSSSSSSSSTTTTTTTTSSSSSSTTTTTTSSSSTTTTSSSSSSSSTTTTTTTTUUVVVVWWXXYYZZSSSSSSSSTTTTTTTTSS[TT\\] ^ [____] SSTT`` SSaTTbbc [ddee] ffffghfffff ffffff;;;;;;;;;;;;;PPPP;HHHHHHHHHHHHHHHHHHHHHHHH&&&&iiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjkkkllllllllllllllllllllllllllmmmmmmmmmmmmmmmmmmmmmmmmmm:&kkkkkkkkkk;;;;;;:::::&&&&&&&&&&&&&&&&&&&&&;; ::&&&&&&&&&&&&&&&&&&&&&&&&&&& :::&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnoooooooooooooooooooooooooooooooo&&&&&&&&&&&&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;;;;  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&f   &&&&&&&&&&:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&::&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&   A A@@A@΂:AKA4A3A@3AA2A2A3A4A@4A@5A5A6A@6A6a@43@3223@44@556@66A A@ AA @ @ AA AAA@ AA@AA@AA J ]12%.12g "1"C"X"""""@"C"8"1"-"'"""" """hH"ph` H "DP|p2Kn,X  `  % KK$"T"M"@"02l13024@"OHPPQQQ|Rif {[info proc tclInit]==""} { proc tclInit {} { global tcl_libPath tcl_library errorInfo global env tclDefaultLibrary rename tclInit {} set errors {} set dirs {} if {[info exists tcl_library]} { lappend dirs $tcl_library } else { if {[info exists env(TCL_LIBRARY)]} { lappend dirs $env(TCL_LIBRARY) } lappend dirs $tclDefaultLibrary unset tclDefaultLibrary set dirs [concat $dirs $tcl_libPath] } foreach i $dirs { set tcl_library $i set tclfile [file join $i init.tcl] if {[file exists $tclfile]} { if {![catch {uplevel #0 [list source $tclfile]} msg]} { return } else { append errors "$tclfile: $msg $errorInfo " } } } set msg "Can't find a usable init.tcl in the following directories: " append msg " $dirs " append msg "$errors " append msg "This probably means that Tcl wasn't installed properly. " error $msg } } tclInit/local/akuzma/myns/ns-allinone-2.1b8a/lib/tcl8.3/local/akuzma/myns/ns-allinone-2.1b8a/lib""""""""""""""""""""""x""k""]""O""L"E"?"E"5"E"+"E""E""E"" "" "" """[[:digit:]][^[:digit:]][:digit:][[:space:]][^[:space:]][:space:][[:alnum:]_][^[:alnum:]_][:alnum:]_alertESC}"y"u"q"m"i"e"a"["X"N"K" G" D" <" 9" ," )" " " " """""""""