EDEN-1.66/0000755000175000017500000000000010435611106012110 5ustar rboyattrboyattEDEN-1.66/tkeden-1.660000755000175000017500000304273510435611066013723 0ustar rboyattrboyattELF`4 4 (%"444@ @ -h#@ @ ((((( Qtd/lib/ld-linux.so.2GNUe7_bRa+EG^U %Z*iky8 )AwV9Cph>  @={$n;uDJ( r/d 14< 6 cjO":Y~&N-\FHl0|qm [.M#'z3ofW`LBQItTS!X g2xP?],vs}K5'4r U{; 4&  R~g  g b)     + q7 | 6o[? '` CA MU q 4uq  T$[ Y/ h# CD)j Ķ!e:p\ BF  g  [  `$\  <! ( # 4}} h :j b ax  / .N $O ?k< 6!o !'  /~z@SRf m  m _   C+P 2 3&  ԺpI4 C*U o]47 6/ L9 d  c3",6 YH tp:  L@[ gx* )  m (5 ]=+q  FNTo Latx : T: , V + 9t c F k * 4N qB W93u :ED ;Q y: | < S` 4 m  \b[ h- <Sy n Du m  02 ])N9 3F " m 2b 0T  T[# j<K 4 {X#i &)wK <  qv P  m  j p |($ 4 ] !libtk8.4.so.0Tk_SetClassProcsXMapWindowXGetVisualInfoXRootWindowTk_CreateEventHandlerXResizeWindowTk_MainWindow_initTk_SetGridTk_DeleteEventHandlerTk_ConfigureWidgetXSendEventTk_SetInternalBorderXFreeTk_ResizeWindowXFreeColorsTk_MainLoopXCreateColormapTk_CreateWindowFromPathTk_UnsetGridTk_InitTk_ConfigureInfoTk_SetWindowVisualTk_MakeWindowExistXLoadQueryFontXQueryColors_finiTk_DestroyWindowTk_NameToWindowXInternAtomXAllocColorXCreateWindowXSetWMColormapWindowsTk_FreeOptionsTk_SetClassTk_FreeCursorXWarpPointerTk_GeometryRequest_Jv_RegisterClassesXUnmapWindow__gmon_start__libtcl8.4.so.0Tcl_GetVersionTcl_GetStringResultTcl_EventuallyFreeTcl_InitTcl_ReleaseTcl_PreserveTcl_PkgProvideTcl_DeleteTimerHandlerTcl_EvalExTcl_AllocTcl_FindExecutableTcl_SetResultTcl_SetObjResultTcl_NextHashEntryTcl_EvalFileTcl_CreateInterpTcl_DStringFreeTcl_InitHashTableTcl_GlobalEvalTcl_SetVarTcl_DStringAppendElementTcl_DStringAppendTcl_ResetResultTcl_GetVarTcl_AppendResultTcl_PutEnvTcl_DeleteCommandTcl_FirstHashEntryTcl_CreateCommandTcl_NewIntObjTcl_DoWhenIdleTcl_CreateTimerHandlerTcl_EvalTcl_DeleteCommandFromTokenTcl_CancelIdleCallTcl_LinkVarTcl_DStringInitTcl_VarEvalTcl_FreelibGL.so.1glXQueryServerStringglPixelStoreiglTexImage2DglReadPixelsglGenTexturesglRotatefglXUseXFontglFlushglColorTableEXTglVertex3fglXQueryExtensionglPixelMapfvglDisableglDepthMaskglMatrixModeglViewportglBeginglDrawBufferglXMakeCurrentglTexParameteriglXChooseVisualglTexCoord2fglGenListsglLightfglLightfvglGetIntegervglXDestroyContextglLoadIdentityglPointSizeglPixelTransferiglPopMatrixglClearColorglDepthFuncglGetStringglMaterialfglLightModeliglPushMatrixglBindTextureglEnableglNormal3fglCullFaceglFrustumglClearglMaterialfvglShadeModelglScalefglTexEnviglXSwapBuffersglTranslatefglXCreateContextglXGetConfigglColor4fglBlendFuncglEndglDeleteListslibSM.so.6libICE.so.6libpng12.so.0png_set_strip_alphapng_get_rowbytespng_create_read_structpng_set_sig_bytespng_set_gray_to_rgbpng_get_gAMApng_set_expandpng_get_PLTEpng_get_IHDRpng_read_infopng_destroy_read_structpng_check_sigpng_read_update_infopng_read_imagepng_create_info_structpng_set_gammapng_init_iopng_read_endlibXt.so.6XRaiseWindowlibX11.so.6XStoreColorXGetRGBColormapsXInstallColormaplibXmu.so.6XmuLookupStandardColormaplibXext.so.6libdl.so.2libm.so.6logsqrtcoshtanhatan2powsinhlog10expatanasinacoslibc.so.6longjmpputcharstrcpyioctl__strtod_internalstdoutungetcstrerror__xpg_basenamememmovegetenv__strtol_internalqsortfscanffgetsdirnamememcpypcloseperrordup2tolowersystemfeofmallocoptargvsnprintfselectpopenpipecfsetispeed__ctype_tolower_loccallocstrcatchdirfseekcfsetospeedoptindstdinstrstrunlockptrandsignalstrncmpstrncpyrealloc__strdup_IO_getcstrtokforksscanfstrncatfreadgettimeofdaygetoptlocaltimecfmakerawgrantpttcgetattr__assert_failptsnamestrcmpgetcwdfgetcsprintffclosestderrsrandomfputc__ctype_b_locfwriteaccess__xstat__errno_locationsetbuffopenfileno_setjmp__ctype_toupper_loc_IO_stdin_used__libc_start_mainstrlenstrchrfputsexecvpsetsidtcsetattrvfprintfraisefree__cxa_atexit_edata__bss_startGLIBC_2.0GLIBC_2.1.3GLIBC_2.3GLIBC_2.1PNG12_0  ii   Psi  ii  ii  ii  pH* @A m gm hm  m m  PA TA XA \A `A dA hA lA pA  tA  xA  |A  A  A A A A A A A A A A A A A A A A A A A  A !A "A #A $A %A &A 'A (A )A *A +A ,B -B .B / B 0B 1B 2B 3B 4 B 5$B 6(B 7,B 80B 94B :8B ;HB ?LB @PB ATB BXB C\B D`B EdB FhB GlB HpB ItB JxB K|B LB MB NB OB PB RB SB TB UB VB WB XB YB ZB [B \B ]B ^B _B `B aB bB cB dB eB fB iB jB kB lB mB nB oC pC qC r C sC tC uC vC w C x$C y(C z,C {0C |4C }8C ~/T$$D$,m $t @$,m $f/,m t$$$l ;t @ $QTKED@EN_L@IB=,m $D$$"@[^]øVD$m \$$Z@t$$8[D$ D$m \$$ &D$ D$ D$m $*E[^]D$VD$m $,m 9L$$K g1491ۉD$$K I$\$pU D$D$m $/D$$D$m $Ív'UD$D$D$  D$D$m $,m tlD$D$m $m L$$,D$ >D$#D$m T$$[$_덍t&UV1Slt$\$$,m tdD$$$ /ede@n.edf@en@ L$$Pt#@T$t$$M[^]R$\$$4D$P븍&'UWVS]u D$$ 5  *1t$$ I|ZL$t$$t @4$-Ko>-tX D$4$tp(t$D$$$pt$|$$K t$ D$D$m $$ t$ |$D$m $VD$m t$$D$ <$D T$@D$m ${ m D$KD$m $`J}$vOG_ m $x|F91D$$K $` D$D$m $$US]$8 t`t @u2 CC@@@ []ÍD$ m  L$T$$A멸9D$$K 1땉UVSut @FX u=$Vt @B @ B ug$HuFF[^]ËD$VD$m $$GVt @B @ B t&'VD$m \$$jzUS]uX[]É$$t$uލ&'U(}} uu]t @WZ ECECEC B u<$HuGGE^ FEFE]u}]VD$m \$$먍'UVS]s$F Cp E s$SSB EBEB[^]Í&'U1҉WVSE }p^ uX ƅtw;{ut t @$hC t @F uy$QU Hu U BBX ƅu&t %ftt[^_]ËE |$T$D$ m $H[^_]ám V\$L$$&hD$VD$m $.|$ D$CD$D$m $t D$ rD$aD$$jt&U1ɉWVS}w^ u[v@$vC t @F $HuGGX ƅS؅tt t tT$ D$CD$<D$m $t @jVL$D$m $$^C t @F O&m V\$T$$)t %ftt[^_]øD$m |$$O[^_]ÍvUVSEt>@X t-1vFt$D$ uD$m $[ u؃[^]ám $D$ D$D$N[^]ÐUMSU] A9t%t9Xu Jt @9u1[]ÉUS] Et'9t#St @PSu][][]ÉVD$m \$$*][]'UMS] Q9tPXI []É'U1҉Mt$1ɍ'1BBuʃ]É'UVSu4$`m tt$$t [Du1ۃ[^]ÍUWVSu}$H ht @ 4$@$ t @ t$$S$BD$BD$&t @uEht D8$}ho EEE9E|1lo 1ho [^_]Ë5ht 떡ht D8D$VD$m $膻U= tø D$E$`D$#ÐUE]E ÍvUWVS<E   1ɉ E W E 15E `t 1Pt 1 Y Xt 5Tt E5E ؃`t Xt M<6fPD98E )C']E~\$ 1=do t9t @>E $t @E $e[^_]Á'=E ~ ' E E ]D)čL$' E \$U $T$yE u)ċE|$'=E E  E Ѝp \ Xt 5Tt E DA;Xt `t   f \t  u.5 AUܸUE }:  `o  \t `o сy \t w 9`t @ɉ \t  \t  ҉|o ~5Tt )Ћo  5Tt |o Xt )ơ )Ӊ5Tt Xt o 5Tt B\t q \t 6 y`t wf916 E `t   \t JpPt `t   =w \t wT14 EG&9u$輼UTU$ Pt iPt &`t  f \t t&Ay \t wf &Xt  E 9XP -Tt Xt `t tm Y$ D$ D$D$;Xt t0&" |$D$m $;Xt uءm $ D$ \t K2f=5 5Tt  E Xt FTt  F\t `t  ;do /t @E $t @aE $ؿe[^_]Ë   ɣ`o + T$D$  D$m $m |$t$${ D$ Em $ D$ D$D$}$8 = 1`o 1 m t$\$$ D$ _ L$D$ @ D$m $ \t  f~? D$ D$m $׳fӋ \t   D$H D$m $蜳 \t -f=أ\t & T$|$m $Z`t E V\$D$m $0E Vt$D$m $ Ed$艵pars 1@e er@ror`o L$<$ D$X$ \t d4 EC \t  9uۃ}8U D$<$h<$D$Z<$ҷf8'E똡m E |$$ D$ D$w;Xt t(" t$D$m $ϱ9Xt uءm $ D$貸Xt 5Tt }~&E t$<$D$ $<$t @<$Pt O    1f  t  5Tt  BPt 5Tt tHPt \t  E Xt `t V|$\$m $蛰65Tt o /5Tt F@o $p_-5Tt Tt P@@9B$]$0I5Tt $N5Tt o $PP5Tt $Q5Tt o w$PS5Tt `$p_r5Tt I5Tt Fo 6$\HTt @$8$,5Tt $a5Tt $`<$`5Tt $_ $(o $5Tt $_ WTt @o $5Tt e$f '$`Yko $Z$cN5Tt %Tt @o $c*5Tt Tt @o $ e$`5Tt Tt @죀o $f$`5Tt Tt @o $i$`5Tt q=" VK D$Tt @$K 5Tt o 6=" K $D$K 5Tt o  K E o $\$$05$5Tt $5E E Tt R)ƒ$Tt t$BD$B$4\$K D$Tt @$5Tt F ! o 0E D$K $X$05,$ Tt PK )ЃB$ETt @$|E D$K D$Tt @$z5Tt F " o $05Tt R)ƒ$Tt S)ЃBSKB9tK )BKSE )эABE D$CD$C$|$K D$Tt @$5Tt F ! o =! zK E o T$$$05$5Tt K 5Tt o w5Tt K F)ƒPFo P5Tt V)ЃBK V)ЃBF죀o $05,Tt R)ƒ$ Tt K Q)ЃBAE L$D$$E T$K D$Tt @$p5Tt F ! o E ! D$K $E D$K $5Tt LE ! D$K $nE D$K $X5Tt E ! D$K $1E D$K $5Tt K 5Tt o $`<5Tt $05o $5Tt ~$6$5Tt [$05mo $\5Tt 3$05Eo $45Tt  $`<$05$5Tt $05o $5Tt $6o $5Tt $05o $5Tt d5Tt Fo Q$`c5Tt o 5# 5Tt  E " o |$K $55Tt $05o $5Tt K 5Tt o # G5@ 5Tt &Tt D$K $$=|o Tt $h5Tt ?# > 5Tt '5Tt o $\'Tt @$5Tt Fo $)5Tt $)5Tt $*5Tt $P+5Tt $`,5Tt s$]5Tt \$?n5Tt E$BW5Tt .$@@5Tt $0C)5Tt $`D5Tt $ E5Tt $T5Tt Tt o $j$U5Tt Tt o $-5Tt i$b{5Tt RTt o $p.X5Tt /Tt o $/55Tt  5Tt V)ЃBK V)ЃB$85Tt $95Tt Tt PK )ЃB$>5Tt Tt PK )ЃB$>{5Tt R$ :d5Tt ;$;M5Tt $$6K D$Tt @$}K D$Tt @$5Tt 1ɉ @ o 5Tt @ $05o $5Tt $<$6o $$`<y5Tt P$<b$`7Vo $E$`<95Tt Tt @$5Tt o Tt @o $V5Tt 5Tt o $Y5Tt %# $K D$Tt @$Tt BD$1D$K D$ BD$B$ D$5Tt o .$V@5Tt %# $"K D$Tt @$iTt BD$1D$ K D$B$ D$5Tt o I  # o $X5Tt Tt 1҃x % У $dX5Tt K$(]$QK D$Tt @$Tt 5K PU؋PHXxt1U؉L$t$ \$T$|$$$o Tt $`5Tt %# 5Tt o 5Tt 1o y5Tt o d I Ho ˆ $5Tt , 5Tt ȉo   $Y5Tt 5Tt o 5Tt o Tt @o $VԿ# @   _5Tt s5Tt Fo _$0Iq5Tt H$`KZ5Tt 1$MC5Tt %# 5Tt 5Tt 1ɉ o  # 5Tt 5Tt %# FVУo 5Tt o 5Tt F@o 5Tt 1o 5Tt ~15o 5Tt kTt o $_U5Tt FTt PBo $;U5Tt " # 5Tt 5Tt 1=o 5Tt o $ Vo Tt $5Tt $P 5@ 3$`Y踽o Tt $褽5Tt {$ = @ $`Yso $b5Tt 9$`K$? I "$ @ e$`Yo $$<Tt $ڼ$Yμ5Tt 5Tt 1=Pt E VT$D$m $ś{E VL$D$m $衛= E `t ϸd߁m$(  Pt Tfى \t ہdo 1t @tE V|$D$m $E $聥t @tE Vt$D$m $蹚E $L1h`o T$ D$  D$m ${@E D$ D$m $W E  / D$  L$D$m $"m \$L$$' D$ v3m \$L$$ D$ Jd \$$K | |$$K b+ t$$K H6$075Tt l D$$K  \$$K 5Tt I o D$$E  _ T$$K 貪. D$$K 蘪Tt $tP5Tt [5Tt P L$$K Yl$H5Tt $1Tt @$5Tt -K 5Tt 5Tt 5Tt UE$`D$  D$辩ÍU @PB~[ L$ B $BD$BD$ @@@ƒ £t  %-$- t  US]CD$; D$$ԳCS BCtP t @u:$袡t @tVD$m \$$ߖ][]rD$VD$m $趖머d' D$ T$ D$$# }'US$ @Pz$$( H @@P2t ^$轘 t @  @@@$Ct PC S@tX t X \$L$@@@$;fEUCED$E$D$蕯$[]û \$ B $BD$BD$-  L$ @PB$BD$B D$@ @@Pv'$H ԦD$ D$ D$m $$_ ttt @uF t @@@ Z9\$1$K HjD$ D$ D$m $T땸9D$$K  1끐t&UWVS B@xt$Y  B@fx P   L$ @ $BD$BD$ @@x<$t `X1҅unths;{uSt  t S BCtP @$t @$ݝut %fuJ   |$@@@$ t$@@@$[^_]Gu( D$m |$$轒떸VD$m \$$衒UD$VD$m $耒|$D$ ( D$m $[C t $P(  t 3q' D$ T$ D$$jU @@@it uPum2t @@$t @t @$=t @t @$ t B@Bt %ftD$ BD$T) D$m $5t @@$bt @ft @D$VD$m $t @$~t @A't @D$VD$m $袐 $ $ $l _t t %fuám $$) D$ /D$D$讜Ð&U(E fEPEU$ET$D$ÐUS$E tN$z@$áE $D$謝fEE]\$$ED$詩$[]Ív$[]U(]u @Pzt$) G]u]ù L$ B $BD$BD$ @@@$9$诔@$2t$$fEE]\$$ED$]u]Ít&'U(]u @Pzt$) ]u]û \$ B $BD$BD$; @@@$詔$@$rt$$(fEE]\$$ED$%]u]Ít&'UVS  @@@uvD$$赘$c@$t$É$蜛fEE]\$$ED$虧t @uS4$ [^]Ð$~ TD$$3u'$  [^]øVD$m t$$두U @Pzt$) ø D$ B $BD$BD$ @@@$t^$贍D$ @@@$ D$NÍUSt]$Ґ$芋fEËEU$ET$D$CSfEEUT$$ED$!SfEEԉU؉T$$E܉D$S fEEȉỦT$$EЉD$ݥSfEEBU$EĉT$D$躥SfEEUT$$ED$蘥SfEEUT$$ED$v$0t[]Ít&U(EfE$譏U$ED$ED$0Í&'UHED$E$LUfEEUT$$ED$MMbfE)‹E؉U܉T$$ED$豤$%0ÍvU( @PB~Y D$ B $BD$BD$f fE@@@$讈UE$D$ED$1$ ɉ U(m fE$軖U$ED$ED$ޣÍU( @PB~Y L$ B $BD$BD$ fE@@@$^UE$D$ED$a$ 3ɉ US B@xt$   D$ BPB $BD$BD$ @@XED$$\$虌fEUEUT$$ED$蛢UfEEUT$$ED$yUfEEUT$$ED$WUfEEUT$$ED$5UfEEUT$$ED$UfEEUT$$ED$$e-Ą[]{$ш\$$ D$yĄ[]UVS $ ơ @@@~ $% \m 4$D$D$F4$~Dtp4$׌@$Zt$É$fEE]\$$ED$ t @tVD$m t$$ކ4$v [^]6Ǎt&UWVS, @Pr3 \$ B $BD$BD$ 3 @PrL$ B$BD$B D$_ @@X4$͈t$\$lj$<$軋@$>|$É$fEE]\$$ED$t @u<$t,[^_]øVD$m |$$貅$; ,[^_]v뭍&'US @PB~wS D$ B $BD$BD$U @PS ZD$ B$BD$B D$% @@@$D$迃[]Ðt&$\ []Í&'UWVS\ @PB ct D$ B $BD$BD$V B@H~PI1y t FD$ BP$DD$D D$9uȋ BHAEQ~NR1ۍr TC: 9t'Af8u@C 9u卶ED$$ED$ E܉D$E؉D$EԉD$EЉD$ẺD$ EȉD$EĉD$E$jfEËE]\$$ED$e\[^_]$* 1fEE]\$$ED$2\[^_]$<* fEE]\$$ED$\[^_]Í&UWVSl @PB Ps L$ B $BD$BD$ s T$ @PB$BD$B D$9 B@HBPBEBEZ~G[1 {TĻF 9tAf8u@F 9ut&ED$(ED$$E܉D$ E؉D$EԉD$EЉD$ẺD$EȉD$ EĉD$ED$E$sfEËE]\$$ED$莛l[^_]Í$`* TfEE]\$$ED$Ul[^_]ÍI1y s FD$ BP$DD$D D$9uȋ BPBEBEZ$* fEE]\$$ED$谚l[^_]Ð&UWVSl @PB P| D$ B $BD$BD$| D$  @PB$BD$B D$ B@HBPBEBEZ~G[1 {TĻF 9tAf8u@F 9ut&ED$(ED$$E܉D$ E؉D$EԉD$EЉD$ẺD$EȉD$ EĉD$ED$E$ÉfEËE]\$$ED$>l[^_]Í$* fEE]\$$ED$l[^_]ÍI1y | FD$ BP$DD$D D$89uȋ BPBEBEZ$* _fEE]\$$ED$`l[^_]Ð&UWVSL @p~"F ^ UȉD$CD$C$D$ >EȉF ẼCEЉC @XCEĉ$uE D$ C$CD$C D$ D$  @PB$$B(D$B,D$ @@p(XNK9$聾9Uڍ;] } CB@9}fEE܉}|$$ED$e[^_]Ív$ fEE܉}|$$ED$e[^_]É)؃$9h+ D$$K n3'UWVS @Pz  |$  B $BD$BD$v t$ @PB$BD$B D$. \$ @PB$$B(D$B,D$ @@XSUPUҋx(~m19}BUR4Ӎv;]캔K C $BD$BD$訕9}ԋU)׍G$![^_]$ `[^_]ù0+ L$$K #y&'U(]]uu}}%=t@= tbv'E ]E 3 E}]u}]zv$' EE d E}]u}]zE ED$ E<$D$X+ D$z%y/|$ \$L$$+ ׆|$$)G]u}]É|$$@*E E  EF|$$[E EPr|$$]뚋E tt&6EE i  E E  EE E " EE E  EE E + EE E  EE E  EuE E + EaE E + EME E  ]t$|$ U$BD$BD$tE i t$<$D$xi|$E $!~U|$E $Q} ]Eu}]}þ F 9vD$|$ $CD$CD$UB9}ʼn|$$,*UB뭍&'UD$m D$ E$E D$ED$Í'UVS  @PB [^] 1FD$m D$ $DD$D D$2 @P;r~ƒ [^]&Uu$ xÍ&UVS0 B@xt$E  BPB EBEBUE%=t$8$, D$蒈E04$Y|@$ܷt$É$蒄fEE]\$$ED$菐0[^]Ð&UWVSL @XKP$xǡ @@PfEE܉}|$$ED$e[^_]Í E GD$CD$CD$ Eȉ$n6EȉẼCEЉC @XD $4{E9{}E@$謶ǡ @@P4 DF <$D$`} @@;p~fEE܉}|$$ED$e[^_]Ðt&UWVS @PErM $c[^_]EE BEPE E;BȋMW \$  $D D$D D$ MB@Dpu~X v'G$CD$C D$D9} jt&U @@P~ fx P t1$S]B$BLUVS  B@@t t$ BPB $BD$BD$Yt t( ~ @@@\$D$m $\s$,5K $  1ɉL$@@@$D$趑$ع4$蛂fEE]\$$ED$ [^]Ðt&$^  'UWVS, B@@tDB@@EdEfEEE$E؉D$ED$j,[^_]É$8, 4 B@@E~&' EB$\$t$$萐E舁E܃ E9ER  D$ BP:$D:D$D:D$v @@\8 D$$ }l \$D$$`3v&'US @Pz~B Z - fv$  []Ðt&ȸtfzJu1D$BD$AD$AD$ C$ޘ뱍UWVSX9tNtJ1&CGfEEU$T$ED$苊[9tuЉ<$[^_]1<$[^_]Í&'UVS  B@XB@H P %=tEf $1$\, D$賁 @@P @ %=ZfEEU$ET$D$證fEC$[1U$ED$ED$肉SfEEUT$$ED$XC,C xS@fEEUT$$ED$&$ [^]Ívr4$`m t'v't$$Vn [Du㹔, 1ۉt$L$$`xvfEi EEi T$$ED$興+$ W ;UVS  B@@ B@P H %=t=fto$/$, D$ @@H @ %=u9YSfEEUT$$ED$輇 [^]Ðt&q4$赥`m t#v't$$lt[Du, 1ۉt$D$$`SvfEi EEi t$$ED$( [^]$  v'UWVS\ B@H~fx t$  B@X )uS )1 EM E1۹`m v'tBv'Eu)B9Et E-B$'CRDuȃ`o u[ $XfE`m E vEċ0]_FtqfEE܉U$ET$D$蟅Eȉ$蔆EȃE ;ẼD;EЉD; vDt/EuF9EtEuF9EtvDuِ&E}`o OfEE܉}|$$ED$e[^_]ËB9ES )CS )1$ ,EPU`m WVS1ۃLtv'@DCu`o uݍ[  $薫EfXE`m t&EċufEE܉UT$$ED$*C, OC GS@fEE܉UT$$ED$$iEȉ$ބEȉẼFEЉF [DfEE܉U$ET$D$蛃fEC$I+U܉$ED$ED$pSfEEEi $i D$ED$=E}`o EfEEE܉$ED$ED$e[^_]Ív'UV1St$$ $q`m tt&$j[DuFuƃ[^]t&'U(]]uu}%=tC= tev*E ]E 3 Eu]u}]t$' EE d uE]u}]jtE  L$4$D$Ft4$nmK6  E tH E]U uM}]tf@]u}]ËE E + uEmE E + uEVE E  uE?E E Z uE(E E  uEE E m uEE E  uEf[^E EPf]/M $"V<\BAA<"u\B"E uE  EeE uE " EPE E  ] ƿ G 9\\$ $FD$FD$$kUËB9}f,CB"BN\B\9&UWVSu8u [^_]Í } $qL$qD$ |$$WkD$ $jF< $t"<t<\ t< Df t5' LT$$jF@D$L$jLD$ $ujL$wiFf= -fF X@9؉?ۿu 2C9˺ t D$  T$<$D$p<$j[9@@ HC9ˋu뭹u L$ F$FD$FD$T$D$L$iD$ D$L$iD$u D$L$iD$j D$L$}iLD$ $i D$-$>nu' $gL$g[^_]Í 1$ - gL$g-|$t$$i\$$`D$t놻\$D$L$h LL$T$$hD$FD$L$ khLt$\$$Uhu   GFf=tf= t D$LT$$ hD$D$L$gD$u D$L$gFE|$-UUB- f wȸੁt ]Ít&Bf=~ f=vt]1f=}f=uB<uvȍ&'UUB- f w ȸੁtt&']1fzuB<t]Í&UVSÃt tc$iƸze D$4$lt1&\$$H`tOze D$$lut @u4$:k1[^]øVD$m t$$w`t @u4$k[^]øVD$m t$$>`А&UWVS,}t01 D$  |$D$E $Rg,[^_]Ei `m E&'u 8[Dt1Us@T$4$3_t$t֋[DEuuА`o 9uE`m  U$蘠Ei Eƍu H[DtAED$C@$^t$St։S@[DUuˍ`o uWt$ \$ED$U$dMU1 ,[^_]ÿi 1F;utދUX@|$$^t1Ҹ T$ ߉\$D$E $l뿍'U1ɉE]u0E 9t*C@D$F@$]uVCf9~ ]ȋu]t]E uE]q]'UWVS, B@HLH @ f=t1%=$h$0- D$Xo B@H @ %=twy<$~4`m Et.E &Ƌ|$$\tAFDu܅ufEEET$$ED$ w,[^_]ËA8녋F0E؍F,9EtlFf= t>1f= fEE}|$$ED$v,[^_]-fwκK F8$D$F8뱍H tt @$fFtt @$fF$FD$FD$U؉4$T$E܅t!FDU܉BDt @u(4$1f FDU`m ٺK ?VD$m t$$[뼉D$VD$m $[FQVD$m \$$w[&'U(EEuu]}UMu,-vu]u}]$( &$4U]u}]$U]u}]ËEP҉U~ȍX 4$GSK <9}}$蹛E$覛UpUS$$}á H$ QIfEE]\$$ED$ t$[]Ív'UVS  A@@. t$ APB $BD$BD$  A@pAPz~bBEBEB Et41ۍ&'EC$ED$ED$fs9u  A@@$ [^]áK E졘K EK E떻d- \$$K j  X$   vU @PB~H6 D$ B $BD$BD$v @@@$K D$XjÍA D$$K ;jÉ'UVS @PB1[^] P FD$ $DD$DD$ @@D $ђ @P;r~輔[^]1U( B@@~mt L$ BPB $BD$BD$O @@@$Wt#fEEET$$ED$TqÉ$X  |vUS$ B@@ D$ BPB $BD$BD$ @@@$h\@$á @@@$D$d$fE5^U$ED$ED$p$[]É$} T W'U(fEWEU$ET$D$4pÉUWVS, @pFEHUU؉$X t @? U}U1ۋE\U L$$ a$WU$T1҉T$$a]$)^ED$ @@@$[@t @tVUD$m T$$UE$_,[^_]fEEET$$ED$n릍&^t& D$ $CD$C D$| UDG9}}D$ E؉D$ D$m $xT @@@$ D$Ql $- 0<9D$$K eEOv'UWVSL @pFEHj D$ V F Uĉ$BD$BD$EEȉ$}EE1ɋUȉLE$V@t[StXm $RÉ$ASE\$$R[E$'SfEEut$$ED$DmL[^_]ám $RÉ$RE\$$ZE$REЋUĉD$B$Y@uUċB$ D$j뗍^ D$ $CD$C D$l UЉDG9}}$- it&UWVS| @pFEH  D$ V F U$BD$BD$UD$B$$TEE$'}EE1Ut\$$ [b$P$ _)E$T@Qt&E$=QfEE]\$$ED$ZkfEE]\$$ED$;kUfEEUT$$ED$k$|[^_]Ðt&S$N$T$$Z9! D$SD$4$Z[>! D$SD$4$8[}|$4$]1e|$D$4$Q$P4$P$/ P$0Z^ D$ $CD$C D$輿 UDG9}}$O$! aO9$O$"! oa&$fO$d. Va$\$BO$. 2a L$$8. a$- 'P$7PUD$B$ . D$`$N$. N$X$N4$N$/ N$X$N4$N$@/ N$X$`N4$XN$l/ lN$X$11N|$4$EV\$4$9V4$Nm $MÉ$ME\$$ VE$MEUD$B$TL$$E! WT$$UUB$M$W$M$. M$W&UVS B@xt$R! Z l! L$ BPB $BD$BD$l B@@xt$R!   l! D$ B@PB $BD$BD$l! D$  @@PB$BD$B D$ʻl! D$  @@PB$$B(D$B,D$蚻 @@@Xp(@$?L$7L4$/L[^]Ít&UWVS B@xt$/  v! v! |$ BPB $BD$BD$ t$ @PB$BD$B D$; B@fx$H$t(v! \$ @$$AD$AD$» B@Pfx$8P$HKDt!Rz!$/ 41D 1э`󫍵щ󫍝`щ󫀽KrKwKe9$/ \D1u<@EEUD$8`\$ t$L$@$kKfEUED$E$D$d[^_]Ë88`q88Rv! D$ B $BD$BD$v! D$  @@P(B$BD$B D$ @@@(P<@@1Dt88`UWVS, B@xt$! Y ! D$ BPB $BD$BD$K! D$  @PB$BD$B D$ @@Xp$K4$\$ljD$gVts@$t$|$É$S3fEE]\$$ED$bt @tVD$m |$$}H<$S,[^_]J$nI$! D$Z赺맍vUWVS B@xt$!   ! D$ BPB $BD$BD$! D$  @PB$BD$B D$获 @p^$LM\$D$NjF$F9t>I$H$! D$@Y[^_]Թt&UVS` B@xt$(0 * ! t$ BPB $BD$BD$׶ \$@@@$Put$$HT4$Q L$4$gGuo T$4$"QuJ1t$D$$Gt $>" lFfEE]\$$ED$i``[^]É$#" 8F먉$" (F냉$! FS$P0 Fv(t&'U B@xt$W" ̭ k" D$ BPB $BD$BD$辴 @@@$lEx$t0 vEUWVS, B@xt$|" 9 " D$ BPB $BD$BD$+" D$  @PB$BD$B D$ @@Xp$iG4$\$ljD$GRts@$t$|$É$O3fEE]\$$ED$^t @tVD$m |$$]D<$N,[^_]E tD$$" U蘶몍US$ B@xt$0  " D$ BPB $BD$BD$蝳1D$ @@@$Mx+fEE]\$$ED$]$[]Í$0 hCfEE]\$$ED$e]$[] UWS B@xt$"  " D$ TBPB $BD$BD$  @@X1ډTE1E1ED$TD$C|$ L$$WCEԉT$D$$OfEUԋEUT$$ED$H\MغMbfE)‹EUT$$ED$\$UfEEUT$$ED$[UfEEUT$$ED$[UfEEUT$$ED$[$[_]$[_]Ív$" HA U B@xt$"    # D$ BPB $BD$BD$ @@@$@x>$0 @,UWVS B@xt$# v $ D$ BPB $BD$BD$($ D$  @PB$BD$B D$ @@X@$\1D$ED$ ED$1D$,P1D$h1D$\|$t$$[E1ɉL$D$ \D$P$Zt  T2TtTr1X`&`duXlD`h)C$0\$Ƌ\4$D$JfEEut$$ED$XX`X9TdT$&t @t PD$VD$m $q>P$I[^_]Ít&lT1 \$T$D$hD$TD$\D$ m $>T$Z D$$1 O@AE\$$1 D$ ED$}OT$4# D$bO'UWVS}$? t @5 ~9؉$? t @uk t  ^t&D$D$ 1 D$m \$t$$<[^_]ÉD$  D$m t$$0QFu0,[^_]Ít&y$Q0\F͍AEAPЃ UYIAЃ w LAЉM]UE9E}nEUЋ]U ‰UU<$)ÍD$h~1ɉEA2F9uUB(Q0$FHUD$E$2 T$ D$#KEUЋs{SUiE$$3 D$JOD$$82 JUU$2 T$JUWVS B@@v$T3 衠 - - |$ - BPB $BD$BD$I t$ @PB$BD$B D$! \$ @PB$$B(D$B,D$ @PBHBPB(TLzh1HD$ED$ ED$1D$$$DmL$N=@$!`1X1\\1D$h1D$L|$T$$;h<$\\TXX9T`\L$;$;DD$`$`\$$=`$V;@$v`Ë$D$CfEE]\$$ED$O`$t @t DVm L$T$$A5D$?[^_]Ít&t~vD$$4# Ft&l3 LD$hT$D$\$D$ HD$m $4& |$$1 [FM- D$ B0$B4D$B8D$t @@@4T]E$1 D$ ED$HD$EjU B@@]# D$ BPB $BD$BD$諣t t( d# @@@L$D$m $3C1҉T$D$ @@@$5P$O# c e&U]Ít&'U]Ít&'U]Ít&'U]Ít&'U( @@@t$# fE@P$ p8 E]$ED$ED$LÍt&U @@x~ v$# 脚&'U @@x~ Ӥv$# D龤&'U( B@@B@fx B@@D$-$;7u(-fEEU$T$ED$Ká-D$  @@@D$3 D$m $1$3 TC h$# ] ?UWVSÁ$iEEfxlUB$BD$BD$ K4$6@$/rt$É$>EEĉȉ$$Ẻ$ⴳ<$n6@$q|$É$>fEE]\$$ED$J$MQB$@D$}8ǣ _EC_[$RKMEuUMu܃UL$t$T$ $EU;ED;ED;ztKMA<$ЈAU؉1$$v<[^_]Ð&U@I @I ]DI  @I ÍU]DI uu@I tu1ۉ؋u]]Ð[@I ttCtۉt$$,uː&UWVSl]$$2@$/ t @ 5 \$4$:E$GUME]UET$D$ $]܉\$褘EEċE$ EȋEE'/ t @ [$$. t @ DI z]؉uuEEB@I 1@I DI e[!‰^_]ÐD$ $1t$@D$m $+t&D$ $D$ D$m $+PD$  D$m T$$y+91ۉD$$K )=9D$$K =191L$$K <%UWVS  APz~B %=$4 ’  AHQBEBEBEEf=Ih=DI @I 0h$|5|B |JMB0|EB IRxEp0t4PP׋I9ʉT~1#)rP1ۉ)I8$j8ۉ`~1B@ 98uT)ȉ<)Љ@@$j@d~1B@ 9@u9<Rd,0,P @\ȉ -\ 9\#9~ŋ,48`؍X \Bt3t.AttA@D$B@$'dG ;3D$ CD$CD$$BD$BD$ܮj$ hQxPA$ h\PV0PFcM9Tp\PlLSFQ;~狍9Q lh<ȋ4 $T$D$ 7$ D$.4D$-$hG$(@$chL$É$60fLLP\$$ $TD$<f@D@T$$HD$;4 $\$D$+.4! t€u҃4)A$b4T$É$T/f44\$8$I44R0^ P @ D$ BD$BD$F $CD$CD$uIEM9s pU@E$ \)ʋdRxGJHBp ;iF HpKtC(0xB@P @ dJhBl( Lxy (lR$hZƉCF@9XB9Y$4\$C$D$ hD$# D$&-4L$$ԌB@9eLxu$\$hCL$D$ $ D$4$j&-4T$$oB@9~$ABHpA4‰ $D$B$ D$%4B@hULAtF$D$B$ D$4$%(4B@hLAR h$@$ZhT$É$&fLLP\$$ $TD$2f@@$HDL$D$p2$4 $\$D$$4! t€.҃4)A$1Y4T$É$%f44\$8$C9t9~t ËC9u[]Ðt&Ct$0  tJt @u CC뮉D$ 0D$ D$m $ 뿸9D$$K q UWVSU$E@E-ED$E4$D$.u E8=tB;t.s4$;E~,L$4$hu>t [^_]ËU)@D$$t )K\$!ƃt [^_]Í&'U( B@x~mB@fx t$$ q B@fxPt|Bfx$P$tiBfx0P0t;B\$ \$\$@$$$ /q |t&B\$ \$\$@$rBB낍U B@xB@fx P t5fxBPt5fx$BP$t7B\$$\$pfxBPufx$BP$uˉB\$$\$9Í&$$ Dp e'U B@xB@fx t$$ o B@fxt$% o B@fx$t$% o BPB(D$BD$B$Ív$p4 o e'U B@xB@fx t$$ :o B@fxt$% o B@fx$t$% n BPB(D$BD$B$5Ív$4 n e'U B@xB@fx t$5% zn B@fxt$$ Zn B@fx$t$% :n BPB(D$BD$B$%Ív$4 n e'U( B@xB@fx t$$ m B@fxPBfx$P$Bfx0P0tsBfx<P` BPBD$B$@$6 ` 뒍v'U B@x~\B@fx t$& _ B@fxPtB\$@$ÍvB\$@$~$ 7 _ 됐&U B@x~ZB@fx t$5% >_ B@fxt$3& _ BPBD$B$$87 ^ 뒍v'UWVS  B@x~ fx $X7 ^ BPB EЋBEԋBE؋BEBME B a& EB$EB(EZ,]L$ C$CD$CD$f[ t t ҉U  ;C0EЍXD$EԉD$E؉$D$ cX\E`UۉEJɉ4I41(&Sz~e1$ PD$ DD$DD$$FD$FD$D|$ ;$u( (94pm& s& t Vt ;YjQ x& t  \M,AHω0&'G EċWEĉUȋOf=MZ& fEċEĉZL$T$$2 fEE$ED$ED$U$BD$BD$ E$ED$ED$ \$ t$p4$T$\$t$-$u'11fET$D$$qE]$ED$ED$a & L$ D$4$\$D$t$-$1fED$1D$$& E]$ED$ED$ D$ \$4$T$!L$t$-$w1fED$1D$$sE]$ED$ED$c & L$ D$4$\$D$t$-$P11fED$t$$E]$ED$ED$ $XH K $ HE܋LEPE$& )1ɉL$U܉T$UT$U$T$ wK 0 ,0;PUЋM]t pUԉtU؉x|QUQUUSUSU ;H$0d t @5  ^8pD$tD$x$D$ k\8F <F@F|D$ED$E$D$ -\8F<F@F ED$ED$E$D$ [8F$<F(@F, ;G~GFwe[^_]ËF7e[^_]@$%=t&P$DD$DD$lZK Q(K DK D(K K FK F 94@ 8$GD$GD$YG$GD$G D$YG$$G(D$G,D$YpD$tD$x$D$ Z8G <G@G|D$ED$E$D$ MZ8G<G@G ED$ED$E$D$ Z8G$<G(@G,e[^_]ÉD$ 0 T$D$m $UD$ BD$BD$C$CD$C D$tUD$ BD$BD$C$$C(D$C,1ۉD$ztcYJA pETf}UDEtBB R<$D$D$ 7 L$T$T$D$`|$-$k_F H;q~t & t$D$$`q& t$T$$`S& t$D$$`5X& t$L$$`91D$$K vUWVS,}ut01D$ 7 D$ D$E $?,[^_]11 \$L$|$ F$1҉T$ ø D$1ۉD$F$]܈Eu~t t0t @tD$VD$m $ft $& D$-$ -s:t:B15t E`m `o  uh}[DtW$tC@賉tES<$<tEt$< t[DEu'9u `m EE$+Elj'ux}[Dtg$_tC@tES<$<t(Et$< tEt$<t t&[Dut&`o 9pWL$\$ ED$E$-' T$E $\EEL8 I' t$ E $[\$E $[,1[^_]Ív$؇R`$Çt&S<_&S} OPD$$g 뢺T$$Qj ] $$D$D$$Qj \D$]$ E $D$: D$D$$|$$ }E ]$D$" D$ً! t€u҃)ى$L$#]u}]E : ]\$D$$_ً! t뜍_ F 9$CD$CD$G9}պT$$ G뻍t&'U]u$!ËE$4$ ؋u]]U]u诒$04$؋u]]Ít&'UWVS }uЃ  Qt   :B$ B B $n pt4$JW- w $= v$4= D$$ = s XP@t $ EBEBEUME] $UT$ED$ ]܉\$DEEċEEȋEEEċ$ EEȁ EẺEt u]EEBEBB $ t t3 T= -@ ỉD$ L$D$m $Ue[^_]ám (; $9 D$ D$D$m t$D$ E$ED$ED$Z$ \$- s iD$ ED$m $$ cv@ i̺ = D$ T$D$m $  G$-\$$< D$ }m $ : D$ D$D$D$m D$ E$ED$ED$Y$ - s iD$: D$m $E $ EE EEEt {EEBEB $ Wt  -@ i̅‹$\$ D$: D$m $D$m D$ E $ED$ED$Xm $ D$E U$D$ED$ED$ ?UMEUԉU$ MЉE؁ MEt EEBEB $ w t1ۍt&CE9uG$t  -@ i̅G: $Д\$ t$D$m $m $ \$D$ B$BD$BD$vWm $ D$NE $ EE EEEzt EEBEB $ G$&<E $ EE EEEWt EEBEB $ G$:E$EEEEEEm $9 D$ D$D$D$m D$ E$ED$ED$/V$ - s iD$ ED$(; D$m $?$ m $9 D$ D$D$D$m D$ E$ED$ED$U$ - s iD$ ED$(; D$m $$ m  t$\$$9 D$ m L$D$ E$ED$ED$ U$ (; T$- s iD$ ED$m $$ m  T$L$$9 D$ kD$m D$ E$ED$ED$|T$ - s iD$ ED$(; D$m $$ 1ۍt&'m C$ D$^ -@ i9|ӋW1ۉ'm C$ D$ -@ i9|t&W&t&'{ikUStt $ = s  P@t $ EԋBE؋BEtEԉEE؉EE܉E$ = s P@t $ EԋBE؋BEEԋ]؉EEU]E荂fwȸu$诏$t= D$]1ɉL$ED$ED$E$D$ ]É11۹: D$ \$L$m $m : $ : D$ D$D$D$m D$ Eԉ$E؉D$E܉D$Q$ \$- s iD$m $t&m  T$$ : D$ D$MD$m D$ Eԉ$E؉D$E܉D$^Q$ - s iD$: D$m $uE$1EEԋEE؋EEE$ EEԋEE؋EEUVSPt $ = s OP@t $ EBEBEM9 UE\$ MU $T$ED$8< ]0 $t$躋uJ: D$$`D$;t$$Oe[^]1D$ 1D$= D$m $:&m : $ : D$ D$D$D$m D$ E$ED$ED$O$ t$- s iD$m $Eȉ$qEȉEẼEEЉE&UWVSl$;E$K D$E$| EK $ = s lP@t $ EЋBEԋBEE$ E܋E}܉EE؉E~ t @5 f>w $ > &< T$$K kf}܋E܉$ED$ED$K t$$m $=14$)Ee[^_]ËEF뫍D$ D$ D$m $!Hm  L$\$$ : D$ um T$D$ EЉ$EԉD$E؉D$M$ - s iD$: D$m $]$-@$ t @ \$$IFE^]VCBKE  VE D D D D E ;C~I91D$$K E$EEЋEEԋEED$ $;@D$ D$m $9D$$K 21UVSÃPf tWIf t t($\$ > \$D$m $[^]Ífwt K u*K8tOABqH[^]ËD$8> D$m $K8u'Cf= t-feC 9C$Y$  tet @uu rZPS8t K 3D$$> D$m $f= 놸9D$$K 1둉D$ m  L$T$$ct&'UVSt ]uCS<$u0s,S<^9t tC$[9uv'[^]ËD$L> D$m $!럍t&'UVSu,^9t)t&'tC$QC[9u[^]Ít&'Ut t1D$e> D$m $1 ÍUVS@ Pt  t&K =K pD$$K F84$莄t $iE؉$M܋U]؉MU]L$T$ \$D$4$IK =K n1ҁ=K K  {e[^]{t .? L$D$m $f > \$D$m $E31> D$t$m $$e[^]Ít&US  t  t&K =K tQXD$$K AC<C8uTt tˋD$? D$m $K =K u1=K K  }[]$Ȃtt ub$Ca^t QD$? D$m $0m 1۹ D$m $1  rH9 D$- $3[]Ut ]]uu uGS<$‰؈S<$ t  ]u]Ét$ 0@ L$D$m $뗍UVS K K tZtV1t&CFfEUHME$L$D$[K tuˍt&'4$e [^]Ð14$e [^] UVS K K tZtV1t&CFfEUHME$L$D$ [K tuˍt&'4$he [^]Ð14$Ve [^] Ut 1 K =K t=t9t&B@8RK tut&D$$K K =K u䡤K =K t;t7B@8RK tut&D$$K K =K u1D$`@ D$m $ھ4UVSt uu| 2=@-sMӍЃ t )B t t D$@ D$m $l[^]ú@ T$$K  떉m @ t$\$$*t ] @ L$D$m $9t&U t uV =@ @  ƒt )Ѓ uá D$@ D$m $菽1D$@ D$m $q t t D$@ D$m $G  t =@ ^'@  JUE]K ÍvU$ 肿 tJt @u  EUfE QAÉD$ m  L$T$$衼뿸9D$$K V1묉USÃD =~ u#1ƀ`-1D `-@D []Ë @ uӉD$$`-2D 뼍t&'U@ D$$K Í&'UVSK ut&K &D$4$8tCu1[^]Ã[^]ÐUSDH t]øH $`$B tAE؉$WM؋U܋EMUE$D$L$T$D$ &]á D$C D$m $$Uh=K t $8D $I`$C }Eȉ$EȉEẼ$C EEЉEU1ɉL$T$U$T$UT$ nIE$^MUEMU $T$ED$)E$"ÍUxU:%t1Ë ,m tfEEUT$$ED$$Y_$ C E$EEEEEE$ C 1҉T$UT$UT$U$T$ ~YE$nMUEMԉU؃E܉ $T$D$I(EÍt&USd$M" T$ËE$D$ D$fEE]\$$ED$$_^$C $C tTEȉ$MȋŰEЉMUL$T$$ED$D$ `E$u]$pD ! UWVSÃt<\tsGu[^_]ÉsECMEAt'1ҹ0 FIt ]DCuGuEsG돉D$$pN ׵t@sGj&'USEE EC(S 9}'C(SM@C( E P@(D[]ÍC D$C$' t0CE MC(S@C( E P@(D[]ùuL$$K 1뷐USE BftNfHtWztBB(B$É$1҃ 1  ¡E PE @$[[]ËB@B몐B$tE 돋E 1녍UVSX`-D ;K K Pu_uD =~СN D ƃ`-t*1&D$$`-$tlFN u#  u&ƃ`-$`- [^]á@ uщ\$$`-HD 빋4N t:t= t @ tƃ`-[^]É\$$`-D غ@ $`-WtN t@ uD $`-D$D ƀ`-- $`-=`-K K K =`-_` K `-t$$` $` 茹_f` K t$$` ` D$$`-$`-BD  t @ t@D $`-ƀ`- p۾% D $`-D$?멹`-L$$` <K `-$` _蓸f` a-`-D$$` 1D$ D$t$$`-P7t&'UK K K *t /tGu޹D L$$K ø*{/K ugK ø/Q*K urUD ` "K `-BD  K ÍvK  UWVS E {uQCtTf{tdlaǐfHtB‰$E Dp@tCfu؋C0@CЋSC( [^_]ËE$;m EuɿuՋE 뀍'U]uE PftfJt%]u]Í&@]0u]ËX$w\$Ɖ$Yu1빍US$K >K D @-=[`-@D ~B-£K EA-D =`-@D GK 1D `-@D K K Pu_uD =~СD `-ƀ`-=`-tq}~À}>t`-D$$`-b1" D$D `-D$-L$ T$$Լ1D 4K $[]1D$[C D$-$蟼1D $[]t&}uC t$It&$8$$t&.D$]C D$$芹1D$\$$ £K @E xt%#'vJ\u]EnotaEtionECharE('\\E');tC th$I$-ã -X£K t[E xt>Ѓ%ٳ܄Ѓ%<${tC8$H,s£K u$ 跽C8v K $ K C tuC<+h<-$D =%`-@D K /Ѓ%ܴǃf=$W\$$E D$蘧  AC @;X00f=uAC B@;X~ݍ'E\$HE\$@E\$8E\$0E\$(E\$ E\$E\$E\$E$UfEE$]ED$ED$&ļ[^_]B?UE]u}f=tf=t6]u}]Ðt&] tt @u;]u]}]P} GXt @u0}]u}])V\$L$m $o멺V|$T$m $S}봍_ F$CD$C D$$9w}xv'UHE }}]uf=Et1f}tmEfE E EGEG]u}]]tЉ$U@$< Kt @uh \$$uE듋UUȋB@ $ t @ E̋UȋZy7ỦUAD$ $˜@D$ D$m $l]̉ED$FD$F D$ E؉$EEЋUȉE܃CECEЃ ;B~oUȉD$ B@ D$ D$m $z*9t$$K ,E9D$$K  1t&UHE }}]uf=Et1f}tYUfU E EGEG]u}]]tЉ$u@$\$$谟E뮍&UUȋB@ $E̋EȋPy ẺEt]̉EU؉D$FD$F $D$ EEЉUЋE܃CECEȃ 9P}럍&UE$K D$ E D$ED$ɢÍ&UUuu]fv4$R$R]]uuEK E ]m]u]ÍvUUuu]fv4$9R$+R]]uuEK E ] ]u]ÍvUEuu]f=t7$Q$Q]]uuEK E ]鳡v]u]ÍUEuu]f=t7$Q$qQ]]uuEK E ]Sv]u]ÍUSE]tY[]É$!Q] E L E[[] UE$HL D$Ðt&UVS0E]u $EEFEFE؉$E؉E܃CECf=kf=f=f=$^P$|L D$Nf=fuCf[e[^]Ðf=t*$P$|L D$f=~'념t&ff=lf=zf=Ve[^]f=t$O$|L D$蒟f]Ff^e[^]fUt t1D$CF D$m $iK $K D$K D$VÍt&U8t u(ED$E$=tH=te{1D$\F D$m $ED$E$=ut&EE]E$ED$ED$辦ËEEE$ED$ED$蝦Ít&'U8t u(ED$E$O=tH=te1oF L$D$m $1ED$E$ =ut&Em]E$ED$ED$ËEU)ЉEE$ED$ED$إÍU8t u(ED$E$=tH=te1F L$D$m $qED$E$K=ut&EM]E$ED$ED$>ËUE‰EE$ED$ED$Ðt&U8t u(ED$E$=tH=tt;1D$F D$m $豊ED$E$=ut&EٞthE]E$ED$ED$oËUt&EљEE$ED$ED$BËE$L D$UzE$L \$ћEy'U8t u1ED$E$=tX=(Í1D$F D$m $蘉ED$E$r=ut&'EE}Ef fEm]mދEP$]E$ED$ED$4ÉUt&EљUE$ED$ED$ËE$M D$谚Ut&'U8t E؉$£E؉EE܃EEEEf=t{~7f=tf=&u*fEE]$ED$ED$lf=td$J$0M D$ 1ҸF T$D$m $![EE]$ED$ED$Ðt&Zv'UVS0t E؉$ТE؉EEuEEfEt1ft*4$aI$SI\$$hM D$?fw31}fEEE$ED$ED$He[^]ÐEfEEE$ED$ED$e[^]1۹F \$L$m $׆&'UVS0t E؉$谡E؉EEuEEfEt1ft*4$AH$3H\$$M D$fti} e[^]f1}fEEE$ED$ED$e[^]É1F D$t$m $4EfEEE$ED$ED$赟e[^]Í&'UWVSt E8 $wEE܋EEEEE$WEEЋEEԋEE؍E$7UMEUȉMăẺT$\$ $D$Uf/uf fAft.$F4$F\$$M D$se[^_]fuˋEȻ8 L‰\$ $BD$BD$]CTLPTJ$ȍ@ D$Fƣ TEċL%=ru<]1D$$fC<$ЈCG  $T$Et  ]ø+G 1҉D$m T$$@뉍v'US4 t  uYE؉$M؋U܋EMUf}Et, $D$ fG T$D$Mu  ]øSG 1҉D$m T$$뉍v'US4 t  uYE؉$vM؋U܋EMUf}Et $D$ G T$D$AMu  ]ø{G 1҉D$m T$$뉍v'US4 t  uYE؉$֙M؋U܋EMUf}Et $D$ G T$D$Mt  ]øG 1҉D$m T$$`~뉍v'UVS0t u_ED$E$==t 0[^]Ë]1ҋEUT$$ED$0[^]É1G D$m t$$}ED$E$=ut&'E$d?E$V?$H?t$ \$$ N D$0@MIBUVS0t u`ED$E$ ==t v0[^]ËEEUT$$ED$0[^]1D$G D$m $|ED$E$=uv'E$T>E$F>$8>t$ \$$HN D$ @E1҅OE'UVS0t uWED$E$=tv=tj0[^]ÍvUE!ЋUED$$ED$ߕ0[^]ám G 1ۉL$\$${ED$E$=uvE$T=E$F=$8=t$ \$$N D$ Lt&'UVS0t uWED$E$ =tv=tz0[^]ÍvuEU E$D$ED$0[^]1D$ H D$m $zED$E$=uvE$d<E$V<$H<t$ \$$N D$0Lt&'U(t t1D$H D$m $)z$ HMPU@ $T$ED$ÍU8t t1D$3H D$m $yE؉$ʔÐt&U(t tm 1ɺGH L$T$$y fE EU$ET$D$gÐt&Ut t1D$^H D$m $)y $BD$BD$ Í'U(UM]u}f9t ffff fvft&ft&E EPE;P~UuX  D$ CD$CD$$FD$FD$'ucEG 9x}؋]1ҋuЋ}]ftE]&'Em ztv]Ћu}]ftEU ]u}])‰E ] 릋ED$E $vUSt up $ QYft,}0$9$8\$$N D$[]Ífw1{fAC[]Í1D$wH D$m $vo U]u}t E$薑EEЋEEԋEE؍E$v}MЋu]}U܃u]f9t0fv]u}]&fwftft΋EЉD$ EԉD$E؉<$t$\$D$1fEE‰UȉT$$ẺD$ˏ]u}]1ҸH T$D$m $u'U]u}t E$fEEЋEEԋEE؍E$F}MЋu]}U܃u]f9t0fv]u}]g&fwftft΋EЉD$ EԉD$E؉<$t$\$D$fEUEȉ$D$ẺD$蟎]u}]É1۹H \$L$m $ht U]u}t E$6EEЋEEԋEE؍E$}MЋu]}U܃u]f9t0fv]u}]7&fwftft΋EЉD$ EԉD$E؉<$t$\$D$fEUEȉ$D$ẺD$m]u}]1H |$t$m $8s U]u}t E$EEЋEEԋEE؍E$}MЋu]}U܃u]f9t0fv]u}]&fwftft΋EЉD$ EԉD$E؉<$t$\$D$a1fEE‰UȉT$$ẺD$;]u}]1D$H D$m $r'USdt t1D$H D$m $qEȉ$ɌEȉEẼEEЉEE$詌E]MU]D$ EMU$D$EL$T$D$o1fEE‰UT$$ED$I]Ít&USdt t1D$H D$m $qEȉ$ EȉEẼEEЉEE$E]MU]D$ EMU$D$EL$T$D$1fEE‰UT$$ED$艊]Ít&UHt E؉$bE؋ EE܋ EEɉEtJD$ AD$AD$E$ED$ED$tF ЃH uB 1ɺ0O L$T$m $o\ B ÍU( ]u}Xp xUPUP E$UD$/t~;stGE[U{ sfCSfC貊C<$ЈC<=C@E$D${t tXO \$D$m $n]u}]øH D$$`D$莀b'UWVS|O LEȉ$觉MȋŰEЉM܉UE\$ $T$D$ ]pxUPUP E$UĉD$h.ty;stGE[Uĉ{ sfCSfC菉C<$ЈC<~C@E$D$Xt tD$O D$m $me[^_]øH D$$`D$pgt&'US$EEUM%= t=t $[]ÍvAf=t$/D$ D$E$O D$~$[]É'UVSpt E7I $ EEEEEEE$UEMUEMT$D$\$ $BEUEȋEUЉEE%=$1I EUMu%th>$7I "E$ED$ED$Ce[^]1I D$t$m $lEUD$ED$E$D$ E]EԋEE؋EE܋$CD$CD$EԉE؉CE܉CGfz O BB fBBD$$ъ]1t$$ƆC<$ЈCR T$$K LPP ]u}]Í&FP t‹P <$D$=u܅u륍P UMt/19t)'BP t9uP ]Í1ҋP ]Ðt&U( B@@B@H P tU1f9tN&'BP t5f9ufEP UE$D$ED$hWÍ1fEP UE$D$ED$8WÍfE EE L$$ED$WÍ$R Ԥ 'U( B@@BPB EJMBUE%=tIf~ftst&f})fu}EEf fEm]m&fEE$ED$ED$1V$R  U1D$ D$1 $D$AfEEE$ED$ED$UÍ&U( B@HtwBPB EJMBUE%=tf~ ftc٭f|IQ$]fEE$ED$ED$IUÍ&$R  rft|11T$D$ $8fEE]$ED$ED$TÍt&U( B@@tBPB EJMBEEf='f=|5fEE$ED$ED$Tf=tIɐ&ˬf=u}EEf fEm]m$S  jfEEE$ED$ED$ TÉ'UU]u}%== t(v!]u}]Ít&$$S E $D$" D$EfEE] \$D$E$D$ "MU E $T$D$4S]u}]Íƅ@ƅE : D$\$$WEcE ƅHE$E D$ED$R$-; t @ $>f[E x$=f]fEE] \$D$E$D$ MU E $T$D$Qt @u2$B(E$D$d D$-D9V\$D$m $7벃 t&$BD$BD$S$ERE܋uE4$<ЍP 9lj} &9|$|$>ã fft|t$$>B9|F 9&D$ D$ D$m $[6$;f,B롉$;f't$$C>$;f'c$;f"t$$>$;f"6uD$$K G91ۉD$$K ~G0'U( B@@u$S k B@H MPU@ $T$ED$]Ít&'UWVS, B@xBPB EBEBEZ]܋JMB E$L$D$跤P }u)f]E$ED$ED$N,[^_]Ít&P t&'F<$D$4t^uf]E$ED$ED$uN,[^_]$)UFEuL+EE]MFX~?u *!,5< FwAt B!^6 u1)MCT 9EuE4$D$T D$+uʅE 1  T x2xF |BD)A!uNuȋp luM$]0UL$1ɋu$L$Eu t&u<؃ \u1>1EUw?u1?E}ub uM` E ]01c Exb jU $É|$׉t$Fw3$X CSÀ;8tFvڍ'؋t$$|$]C뱅~sȉ#!9t Euщ7돍v'UVSÃt&C$JЃFEZ\CFuPt]uK%!t x{eEE1ۅt))G<{<*<+8t1,[^_]øD$ 1D$VML$]$FV8t9tEv'FVƀ>8tE@DD$ 1D$VML$]$Y0FVƀ>8ٸ+\;8FGFV)Nj;4&F])‹F)‹E,<<ABtDX~X@ Íۉ~M;Q A9;;0D$ UT$M L$]$y YUB,t ;z<My@YD-~CV(NF  ;UBt$ ML$]\$u4$hT$ ^UT$ڋML$u4$4$CSÀ;8tKs4M;y8GAF];{8GCFE;x8G@vF];{8aGCPFE;x8;G@*Fv];{8GCFPFVЉE1VhE@8)9Er UɋRTL WT9Lx׺B9 GDT9Lu1E$fS V`S ؄]uErU_R8)9ȉ_ $d_ FVЉE1+1ɍVFVЉEVpF!^x$V!-r2 4 1p`E][89%L$ȃ0B;` )@9u1^F  9F|! UJ L)щ |-r2 4M؉L$u4$ L| UR H+ H M EP0L$ ML$]$\$H~(}OU B)C9H}E; t $P }MF]ID{@FEUBi B497E89* FeUR8H9ljz F/U9z8E^ RG: lfS V`S ؄]uEuv8)9ȉWErEɋ@XP^_X9PߺB9,GDX9Pt1FVЉE11ɍVl;FVЉE1Vl^ٍt&AQ98tD$ QED$ML$u4$_O EkE;x8 ?  FYEE@89ljs ? ;GF]F[8)9Et'EKFPG8 t1zIFG8t1^fS `S VhuQEEFVЉE1"1ɍVh]C49F9D$ SED$ML$E$CS<8t8tuVLF)؋11D$ UT$ML$]$8gW|$ }|$E$D$82 {eC E1ɉL$ VML$] \$u4$T$ E\$4$D$E Eϋd9MZED$؋U$ u19MH FMAC;M}#;sX9P1K@D$ ED$؋UT$M $9@@;M};s,9,1,D$ UKT$ML$E$,QA9 ,봋EC)9t9tX9Pt91E,);,t,9t9t9,F19dD1D$ ]\$ED$U$Do )D9Ds1=p`1|$ ED$؋UT$M $x ;u};_8 C$ȃF1ҋd(D)‰ML$E$؋ Dt ( D(9u9D1Cu9`}ދW89}$ȃ8tEF`)9t9u91D$ ~ED$UT$M $x9뼉ލt&;MW9K09:E0)ȍ90t90t 09u;0:1ҋ0T$ MKL$ED$U$0'90;M9T9LEC)ȍ9t9tT9Lu91KERCPuɋN EEl MlMNM܉tMNE䉅xlEԋl EЉEȉЃE̋FU؉E@ElEVUUUm$E$)…ɍR|tVUUUꋅ|)9M EM|VUUUEɉE)FUL9M$}|U҉pt<|h)Љ‹h9r 9vEl@E~EtE<8l EEMpU9sv9wrE;xs(u9txB9t 09uӋE9UstE9Ep9xv: B9MtR9MtM9xv"H9U59U,9xwދEuM1E$P MUUD$ 1D$E$؉T$t]Uu}u9xCvËEp;x9xB99uM$pMEU9;x{ u t&B9xt: uvEt&9xJ9Eu9xQ9EuMEE;x UȃB9x uȃtVlUUe $ D$JZ D$ -$ D$BNu\$|$4$jE$ D$JZ D$b -$ D$Mu#e \$D$4$EJZ t$$ D$ -$ D$Mue \$L$4$3EJZ t$$ D$ -$ D$]Mu\$Ke \$4$U]] }}uCt{~PWuK[C5 <$D$;5 ]u}]yE ]Eu}]'C$59xtC$+$D$&C~$-T$|$$$- F]u}]ËC<$D$[ ׋C@$$:C 5 <$D$;5 |!]u}]L75 '5 ҋC$$2'U8}}]utuGtz~P/Wt&uGG $; ]]u}]1ɉL$$e%]u}]ËG$EExtG${$D$%UEd B=-=G$2ƋG$5ËGae $U\$ t$$ T$D$ Z D$ -$ D$6J$-UB$\|$$l$ ÉD$Cd \$$ Cd \$$ Cje \$$uCoe \$$^Ce \$$ Gt @u*$]u}]t&E-V\$t$m $뺋G$ G@$$GG  $f; tU dE G$?E&U]]ut]Cte~8W&u,C$]u] 1D$$"]u]ÍC$-D$4$JC$OtlFBu]u]C$'[ /늋C@$$C 5 $;5 |!]u] $V F5 ҋC$$D$!2'UWVSu }u@FD$ D$|e D$m $F=tK=tDvtVt1ۍ&m C$we D$ D$D$9u늉FD$G$^vu[^_] Um $e D$ D$D$$V $D$m L$T$D$ $e yÍvUS] CWtC$ D$ []ËCJ @t‰T$$ $ '/f [ {tC$ D$ []$ /f [CZ'UWVS ]CWt@t\C$t1F'Cz9u [^_]gBC$ [^_]1t&CF@$$[ {tNxv'UVSt1۸f CD$-$39u[^]Í&'Ue D$-$3ÉUWVS,҉EMU\UB8u,=d D$$NjUzȗ SD$$#tW5 1=ė Ue 1ۉ\$L$ Bf T$D$-$U1 Bȗ UB;ė  :E1E@$ @ze " T$ t$L$\$D$e D$-$kU Bė UB==UR҉U5EEae  tοd td tje toe te  z+E111U f L$ \$= f T$5ė D$-$dE1ɁxEPE@  E-g D$-$1U1 1ė R҉U&,[^_]d UB;ė =1D$" D$ D$e D$-$ )1= $aDoNaf@LD@yE1ft&'UVS k&=C t|1ɺf L$T$ D$e D$-$$C $1D$Qj D$ D$ f D$-$k[̗ tC$D$2t41ɺf L$T$ CD$0g D$-$C̗ C=1D$ f D$ D$f D$-$SFg D$-$.[< [^]ÍU''UWVS u }= t=t1D$$_d td $4$;C ӳC -d td $P\$$& -$j D$&$C4$ % - D$ $Y& -Ej E [^_]>&US]$蒥 tt @uL t"[]ú91ۉT$$K 蓴v1D$$.[]ÍD$ m  \$L$$膢US! -xa ]$V%E $D$E@a D$譮~;u D$$C\$$Pu ߳Ĕ[]ÍUE$D$gÐt&UWVS<xa  $-1ɉ xa p a 1=a ` 1P 1(-Y,-X =T E5|a ؃` X M<6fPD98a )C']E~\$ !=d t9t @Pa $蜫t @a $肫e[^_]Á'=|a ~ ' |a |a ]D)čL$# a \$U $T$|a u)ċE|$#=a a  a Ѝx$-\ X =T |a DA;X ` $- f5\ ,-u.5$-DUܸUE,-t $-` 5\ ` ցf 5\ w6 9` ~ 5\ 5\ 6} ҉h ~=T )ЋTljp l $-.=T h X )ǡ$-)Ӊ=T X l p =T A\ Q  v 5\ w6@v f ` wf9 !6v  a ` 6 5\ :P ` (- =d5\ wT17 4 EG%9u$IUTU$ P oP t&`  f5\ t&Ff 5\ wf6 &X  a 9XP$--T X ` tm Y$ D$ D$D$T;X t0&" |$D$m $褜;X uءm $ D$臣6 \ T2f=5$-=T 4- a X GT 0-W G\ ` ,-Q5d t @a $yt @Ka $_e[^_]Ë $- ɣ`   T$|$D$ m $im t$\$${ D$ ̧m $ D$ D$D$蠧d$ =$-1` 1,-rm t$\$$ D$ QF6| t$D$ @ D$m $覚5\ 6`{ w f~?w  D$ D$m $^fӋ5\ 6v  D$H D$m $#5\ f=أ\  T$|$m $` a V\$D$m $辙a Vt$D$m $蚙Ed$Evpars @e er@ror` \$1ۋ D$E؉$Mȉ$襥5\ O< EC5\ 3 9uۃ}DU D$U؉$D$E؉$ܠU؉$QUf'E댡m a |$$ D$ D$;X t(" t$D$m $K9X uءm $ D$.X =T g}~+E |$D$E؉$虝u$\U؉$t @U؉$iP 3  $-e,-f $-,-t ,-=T 0-4-AP =T Q tHP \  a X ` EػV\$D$m $( -$[u D$=T  -$cu D$=T  =T T @$=T T  c $T $=T qc  =T [c =T Ec ޿=T / -=T @ -=T @T PT$@$=T T $D=T =T  l =T  l =T  l =T  l q -=T @Z1=P =T GT t$D$$=T   t =T T @$VD$1D$=T l T BD$B$VD$=T l =T l =l =T q=T 5l [=T l E=T  l /=T l =T l =T l =T  l =T l T pX4$.$309t1D$$~ -$ku D$s;\$4$K4$S$KOd -$|u D$/=T  T @$/T @$D$T @$=T T @$a/T @$D$T @$=T  -D$T @$ -$ D$pt @T @$ל=T D -D$T @$/ -$ D$t @T @$聜=T T D$B$D$=T l $G=T l $K+=T l  @‚@ ! @s$ T ϣl  PJ$!T t ףl  Xu T$\$m $=T $4t T t ϣl  PD$u D$m $臐=T $) T ϣl  Pk$O=T l  I$P=T l  '$Q=T l  $R=T l  $Sk=T l  $TI=T l  =T Gl =T Gl yT @$YD$=T l QT @$D$=T l )T BD$B$D$==T l T BD$B$D$ =T l T BD$B$D$=T l T BD$ BD$B$JD$f=T l bT BD$B$%D$v=T l 2T BD$B$[D$F=T l T BD$ BD$B$HD$=T l T BD$B$1D$=T l T D$B$D$=T l lT D$B$D$=T l =T D$B$D$R=T l T D$B$D$#=T l T D$B$D$=T l T $D$=T l T $(D$=T l bT D$B$&D$w=T l 3T D$B$'D$H=T l T D$B$7D$=T l T D$B$8D$=T l T D$B$;D$=T l wT D$B$<D$=T l HT D$B$9D$]=T l T D$B$:D$.=T l T D$B$LD$=T l T @$MD$=T l T BD$B$ND$=T l cT @$ D$=T l ;T @$ D$=T l T @$ D$_=T l T @$ D$7=T l T @$ D$=T l T @$D$=T l s1D$T @$XD$=T l ET BD$B$XD$Y=T l 1D$T @$ZD$+=T l T BD$B$ZD$=T l T BD$B$=T l T BD$BD$B؉$=T l `T BD$ BD$B؉D$Bȉ$.=T l *T BD$BD$ B؉D$B$#D$=T l T D$ BD$B$D$=T l =T =l =T  l =T l w>=l =T a=T ?5l K=T @l 5=T A l =T Bl  =T Cl =T Dl =T El =T 6l =T Il =T "l $=l =T u=T 55l _=T l I=T , l 3=T .l =T Fl =T \l =T l =T Gl =T ]l =T *l +=l =T =T -5l s=T /l ]=T 0 l GT $WD$d=T l  T D$B$D$5=T l T 1ҋT$$<\$$D$=T  c l T $D$=T l 1D$1D$$U=T l _=T TT D$B$UD$i=T l %T D$B$UD$:=T l T @$VD$1D$ =T l T BD$$VD$=T l a VL$D$m $ba V\$D$m $>S  a ` d߁|$( P dfމ5\ ہd 1t @ta D$VD$m $苂a $t @ta V|$D$m $Va $1e` T$ D$  D$m $l|a D$ D$m $ a  / D$ ,-T$D$m $迁;m \$L$$' D$ @m \$L$$ D$ T V@\$D$m $@T V@L$D$m $#諽=T 苰1ɉ 1D$$\Lb=T 1 =T ed 1Uh 1]l Ít&Ub ]u}t.1>D$E$t3~,{79}1]u}]9ݠa usҋݤa ԍU1U @?t9Ťa uŠa ]]1Ít&USÃc  h B9td Ah []Íc D$d $荇 t&d  h d Ah []ùuL$$K 1USd -$蔁8-[/],m $D$،$耄/don@ald.@eden@ D$$4t{< \$D$$3[]ác $ tot @u d @D$ c D$ D$m $7~ɡ \$ D$D$m $~$9D$$K 轏1놉'U(l ]u}'@$L d $,=`-5c K  K c K ƅR`-D$$&ً! t€u҃f_K d $D$d \$$Ɗd $Ʌ$"0-d 1ۉ5c 1ɉh E l $]u}]ËE u $ LUPu _Eg=l UDP}.&}E}e11D$ D$1D$d $ځ$&0-1h d M=l  $ 菈UDP}.}Ed}evW1D$1D$d $Uy$'0-_1h d 1Ml  $>UDP }+ }- d 11ۉL$\$$x$'0-d 1҉h 1Ml  $荇UDP l }x}y}1Q}2}a.}rUDPDl }=F $K1 Ul $W}= $T1l E$$}a $.11d 5h l $rM $}/ $g1bM1l =c  $J} } &}>x ! l $<$i$-$1=l E$}= $R&U1l $SUDPAl $]}  }  }- }>x !l $< $i=l M $@}= $OM1҉l  $} } t&s}i" x ! l $<hE$]} S} I$\8U1l $&}& $i M1l  $T}| $k1E=l $%} } &}1Q x !x 5l $<x$il$-`U$UUDPMD%l }/ E11҉ c l $[} v1҉l D賂UDPpп=l } } }< l }"~ } } vEm=l } } EF l UDPо%5l Z}ru$.1h d 1l $aE$} } t&}< l } } l }!$l UDP75l $x}dR$.&1h d 1l $r$aE$}g$.1h d 1l $a$ryU$n8UP_ E!]$ı l yl i""f5x l D!!x x l l 1l l "5l  l $l_1l $lG'l &l l zl k=l [#l L=l < x l #.l  EqM $1l EO1c E^EpEkErEgEJEIETt&EKERvEWhEot&XE[t&HEit&8Emt&(Ent&EZt&EXt&ELt&EYt&1l E$il $INM $C l $d1 1h d M=l  $[1҉l N1=l $I$!M $1D$1D$d $m$'0-1h d 1Ml  $rd 1ۉ$Bx$#0-Md 1ɉh  l M $,=l w!l h"l Y$e1d 1ɉh  l M $%l l d 11ۉ$yw$H0-$lxd 5h l d 11\$t$$*l$'0-4d  h HX1h 1 $l $M $K$l1l 3"d $v$$0-1h d 1l E5l п|=l Eil Sl E;l |о 5l e$U1l M$S1l 5$P15l $cd 11҉ h l $V1l r l $NU1l 1ۉ5c c $_*l $b1h d 1l X$M1l @a=l &$Q1ɉ l  El Ul $Ml  $gl $iL$-@$14=l bU$wl $i$-M $D=%6=t&$U l $$.1h d 1Ml  $s5l l =l x !"t d 1҉h 1l c" d $r$$0-1h d 1l  $`1h d 1l l $i=l E$k$a11Vd =h 5l rC l 1 %l j.l Qd 11ۉL$\$$f$'0-d 1҉h 1l $.x !" V1h d 1l 2i l EQl a8 l x$ =`-0K #1t =p  $ $ $5d s& 0-$r$a$ O$ >I$- $d $D$t`-D$$nU1D$$ (ÍUuƉ]}@t?+O T$$]u}]ÃWtEYu^ۍv$G]u}]Í請膋F^F]u}]鶎FX$芑G=t=t$w$ D$<$F F ]u}]$7$D$G*< L$$$臈떉$$D$H&U1]]uu ]u]ÐSt:Bv ܃WtYt͸vÉ볋C$ƋC $tt댍&USË@9t=t[]É1[]Í&USË@9t=t []ÉC ;Et=u1[]Ð&USË@9t=t []ÉC;Et=uC ;E t=uԉ1[]Í&USË@9t=t []ÉC;Et=uC ;E t=uԋC;Et=uÉ1[]ÍU]]u1ttC]v F]u]$X C$ުt1 Hu/tt&uC$C$C $}C$r닋C $eF뀉FsS C 9 FQ   F2   F $ F! FF v  j  Q F  $ [FaF U $) F/ D$ $:FF t& $FC $ FF F F s  bFT  $ (KF. D$$9F  $  F$FD$ $FC V > ; ؉L$Ѻ$ fF,  $ ] C= = C 8 ;bFC؉щ$;RFt&F t&Cщغ$ RU FXC    ؉L$Ѻ$: F$F  $ F  _iF @FvCFiT$غ $t8F:  F $"F$2F$ F  L$عT$$FqC$ HU= =  F/$&F C ) щغ$~ F _F@iFv $ JFPC H - ؉L$Ѻ$ 1 FvC$ щT$FC$[ ƅC F$ D$$Fj $>FD щD$$WF щD$$ 0-F щD$$  ^Fщ$FCF$ED$ICщ$ qFw $ K^FQD$$\UF"Fv{F t&kFt&[Ft&KFt&;F$ 0F F  $ l Fr D$ $}FCF8t&F) $FjFt&[Ft&KF $FFt& F D$ D$$Fa D$$lF2  QFzFt&kF'F;Ft&+F $F >`FtCFXCyF=Fv/Ft& t&-  $ 9  $ 6Ft&&Ft&  $   $ cc  $ CC$ ##$ vFt&fFt&VFt&t&C D$$ mFC D$$mFwC D$$ RFK&F9t&F)t&Ft&{F C$ #FJFC$ F D$ D$$@F}Fvo  $ CFI D$ $TF{F t&kF $ 0F:Ft&+FdFFt&Fyt&FiFC\FOFIFC D$$S$;d~$ |W < |S  |u#d$ f | |{  |D  |  |  | | |urdt&'4GÉ$?\$ D$> D$$0R$N;d~`  |Aq |_ |u#d$ g |u#d_$ / | | | |  |¶  |϶ |"޶  |,  |6 |@  |Je  |h t&' [^_]Ðt&BBd$  |dn$ qdi $  I|8d$  |d$  |R4  |o7¶  |L9϶ |:޶  |<  |cI |H  |d"$ e | d$  [^_]Ãd@$ q T|d!$ yd $  | Wdj$  | 9d>$|  |d$L  P|kd$`  |+dl&.GÉ$5> \$ L$D$$K$;d~{  |dht&- GËT$\$D$ $hK$\$\$h\$ \$D$ D$$)K$G;d{dlv;- GËT$\$D$ $J$\$\$l\$ \$D$@ D$$iJ$;d{dp'{,GË\$D$ 8 D$$I$\ \$\$pL$\$ \$D$$I$;d{|t&'$>CCu |18$  [^_]$ m$@ $ ZD+Ƌ$t$D$ D$H$t$$t$ t$D$ D$H$/*> É$3\$ |$D$$7H$US \$$D$H$'q L$$D$G$:* Ë\$t$D$ $G$\$\$ \$ \$D$$gG$")Ƌ$t$D$ D$(G$Lt$$t$ t$D$ D$F$ $9 D$ D$F$$|$D$F$$t$D$F$( Ët$\$4$D$ BF4$f L$\$4$D$ F4$? T$\$4$D$ E4$\$$\$ \$\$\$\$ D$ \$D$4$E4$ (0 ËT$\$D$ $wE$\$D$ T D$$DE$b\$D$ x D$$E$/\$$\$ \$\$\$\$ D$ D$\$$D$'  Ë\$D$ D$$xD$\$|$D$ $JD$h\$t$D$ $D$:0 \$$\$ \$\$\$\$ D$\$L$$C$ &Ë\$D$ D$$C$\$\$ \$D$ D$$MC$k% ƋT$$t$D$ C$2t$$t$ t$D$, D$B$s4%Ë\$D$ p D$$B$\$D$ D$$nB$\$D$ D$$;B$Y\$$\$ \$\$\$\$ D$ D$\$$A$ D$||t$ |$$?D  t$ |$\$$? $ ' D$||\$ t$$;? $ . | D$||\$ t$$>X $ < z|z$ƅg"Ë\$D$ D$$_@$}\$D$  D$$,@$J\$D$ @ D$$?$db D$\$$? $\$,\$(\$$\$ \$\$\$D$\$ \$|$$k?$ ! Ë\$t$D$ $,?$J L$\$D$ $>$H T$\$D$ $>$d D$\$$>$\$,\$(\$$\$ \$\$\$D$ D$\$ \$$8>$V* Ë\$D$ D$$=$\$D$  D$$=$\$D$ @ D$$=$d \$t$$]=${ \$,\$(\$$\$ \$\$\$D$\$ \$L$$=$#Y Ë\$t$D$ $<$ L$\$D$ $<$@ T$\$D$ $`<$~dV D$\$$*<$H\$,\$(\$$\$ \$\$\$D$ D$\$ \$$;$fT$T$ \$É$>\$ D$> D$$};$\$D$ D$$J;$h\$D$ D$$;$5dܵ D$\$$:$$ D$\$$\$ \$\$\$\$\$ \$$:$Wp ËT$\$D$ $X:$v\$D$ D$$%:$C\$D$ D$$9$d D$\$$9$\$,\$(\$$\$ \$\$\$D$4 D$\$ \$$d9$Ë\$D$ D$$%9$C\$D$  D$$8$\$D$ @ D$$8$d7 D$\$$8 $\$,\$(\$$\$ \$\$\$D$\$ \$|$$18$O;Ë\$D$ 4 D$$7$\$D$ \ D$$7$\$D$ D$$7$dԾ \$t$$V7$t \$,\$(\$$\$ \$\$\$D$\$ \$L$$6$(\$D$ d D$$6d \$|$D$ $6:\$D$ p D$$r6\$D$ d D$$H6\$D$ D$$6]\$D$ D$$5\$D$ d D$$5 \$|$D$ $5E\$D$4$#1\$D$4$ 4$=t$ \$t$$25$P \$\$ \$T$|$$4$sL` t$ L$ÉD$$ {$D j$ Yt&UnoneWVS ] | ƅD$$r3$F&ƅw\$D$ D$$*< t< t$%u5< t< tw1Ɉ5tfBt<#uBBut5 $(CCuv' D$T$$31H÷ 18q   u u 6.4 D$t$$a2$$K$$. [^_]ø D$"^@t$\$ |$$/n$  D$"\$$/H$ Yʷ D$"t$$w/Ht$T Ulj$E$|$t$ D$ַ D$)1$M$D-D$!xÉ4$/*$'Ct$$e2t |t$$A2|D$ E\$$D$ D$0$|D$ E\$|$ $t$D$|$J0$a\$ D$$0$, D$m |$ t$$#'U1ɉ WVnoneS< ] Xƅ\ƅ:EE D-T$$.R 1111v$V!}ƅvvw\$D$ D$$%< t< t$ u5v< t< tw1Ɉ5vvbw<#Buv1vt&'$#CCuꀽv11ۍv2< t7<,t3ېu8Azt< uŅt1Azu狅<- $D$S/18ua$\ ]4 u$ * u$ B u$D _ ub u$x w: ME$T$ D$T$\,$ G;8EЍUԉD$ T$ D$$*tUи T$D$$)ƍFwEmMEЉD$E$[D$$}XHE ƋEԉD$E$G[t$$*;X:uB,q D$P$P$$'< [^_]Ít&BB3vD$ D$$v*$*EPHF $|$D$DT$ D$@D$ED$*$qubHe \$$D$DT$ D$@D$ED$)$~ $%EЍU$D$T$T$D$ D$F)$MU$D$XD$ T$T$D$($\@:$t$S*D-14t$C$u S[ u݋t  t$D$ D$m $@D$E$ É$U@\$$T$t$ ; D$'$Xt$$R)EԍU$D$T$T$D$ ( D$'$@4 Ë@$D$ݝH$ݝ$\$݅- \$ ݅\$ D$E$ XM Ë@$D$ݝ(kH$ݝ W$\$݅ \$ ݅(\$G D$E$r X$ 9:UL D$\$$T$D$ T$B&$ \$ D$$&$J$ $ ,$p $ bt&US$] tX tSL-t$[]$@-=tNÉD$]: $D$r%\$$@-!$[]áL-t/1L-@-$[]$Ÿ L-끍v$@-ʐUSDE ]]E]E]$ tEXEX EXD[]-E\$E\$ E$\$O׍'U1҉?Eؽ--Eܽ-Ƚ-E]н-,v'UE]] uu$ \$$ p]u]s,vUE]] uu$c \$$d p]u]3,vU(E E]E]E]E$]$ EX EXEXEX$+'USE] $ X,Y[]+UE]] uu$ \$P$ p]u]+vU(E E]E]E]$m EXEX EXE+t&U(E E]E]E]$- EXEX$EX,+t&U(E E]E]E]$ EX4EX$ 3$5 "$J  C\$C \$ C$U \$ C,\$C$\$ C$ \$ CL\$CD\$ C<$ \$ Cl\$Cd\$ C\$ \$ ݃$j \$ tR$! D$s {|$- =$>  $ $[]$| $[]Ít&'U ]ÍUS]$E A AAu ‹B uJ ȉQ[[]Aȉ [[]ÍUEU t ;t @ u1] U]] uu\$4$t]u]Ít&] ]uu]U: D$E p-\$$1ÍU: E x-T$\$$1ÍU: E -L$\$$1ÍU: D$E -\$$^1ÍU: D$E -\$$.1ÍU: D$E -\$$ 1ÍU: D$E -\$$ 1ÍU: D$E -\$$ 1ÍU: D$E -\$$n 1ÍUE]uu$?} t&1D$ D$$]u]ù 11L$T$D$ F$-FD$$f]1u]ÍU-D$" D$E $ 1Í&U8$}d \$(d \$ d \$d \$ d \$(d $ $+&U" D$E (d \$$ 1ÍU" D$E  d \$$ 1ÍU" E d T$\$$ 1ÍU" E d L$\$$~ 1ÍU" D$E d \$$N 1ÍUE]uu$=} t&1D$ D$$]u]1D$1D$F$ud 6FD$$I ]1u]É'U" D$E d \$$ 1ÍUS-$# D$$ _&D$$ J&@D$$ 5&1$ D$1D$ -L$\$B $11҉D$ D$3 D$-T$$1D$1D$ D$-\$1ۉ$kL$$Q %`T$$Y %D$$a x%1D$1D$ @D$i D$-$1pD$-x L$T$\$ $1D$1D$ D$ D$-$D$$ $D$$ $\$$ $д1ɉD$ 1҉D$-L$T$ $C1D$1D$ D$ D$-$ 1ۉD$-1ɺ0T$L$ \$0$`D$$ $1D$1D$ D$ D$-$\$i $ #L$$ #PT$$- #D$$; #pD$$L #D$$[ v#1D$1D$ D$-\$1ۉ$1ɉD$ 1҉D$-L$T$ $1D$1D$ D$ D$-$ 1ɉD$- L$ T$\$1ۉ$1D$1D$ PD$ D$-$V1D$- L$T$\$ $'-h-1ؽ-?ܽ--,m $-Ƚ-н-D$$+/sas@ami.@eden@ D$$tF T$D$$[]Ðt&D$ D$m $( \$ L$D$m $$UE]-ÍvU u1ɺ  T$-$1k U]&US t 1[]Ð $pC$G$[h-$D$-D$ D$D$-\$$~j D$$1 t  tN$@d T$D$m $t t D$u D$m $~h-)$D$ -D$1D$$$$D $q $ $x$ $` $ t$ h$ \$ p&D$(D$$ &D$(D$$ t(L$\$$ V)(T$D$$ 8!D$"D$$#1D$$ D$$ 1D$$ \$>$ 1ɉL$$ zT$$ e1D$$ SD$$ >1D$$ ,$P D$${$ 1D$$Q 11--p-x-- ----- -tvPdt@l@pu[]1D$ D$m $t $D$1 D$m $wt $B \$D$m $Dt $S L$D$m $t 7vUuu}} ] u2ۉ5-=h-u]u}]Ít&]u}]/ǐ&UVS $`-\$-\$-$5-1۾p-\$ $\$t$Jx-\$ $\$t$0-\$$\$t$ -t"-\$-\$-$: [^]-\$-\$-$Q&UWVS, ~$D 1$P $@9= s|tNC\$C \$C$uEEEE?@EL$D$4$C]C$]C,]C4]ET$D$4$nCC\E]Cd]Cl]Ct]D$D$4$݃zD$D$?4$>݃\$D$4$#$GfCT\$ CL\$CD\$C<$D$D$$*4$MXD$D ($P ,[^_]øD$D$4${D$?D$4$b:C]C ]C]E#1ۉ'@C$; |D`$@?xc T$D$$@uc D$D$$@Wc D$D$$@9c D$|$$@\$t$$@g$@c L$T$$@c D$D$$@c D$D$$@c D$D$$@\$|$$@,[^_]ÍvUWL?V?S1ۃ$D $P $t$ \$\$4$G\$\$$\$\$4$\$\$4$\$<$D$=\$\$4$s\$<$D$̽_t$ \$t$$\$\$$;\$t$$+\$t$$\$|$$=\$t$$\$|$$̽t$ t$\$$O\$\$$t$\$$t$\$$|$\$$=t$\$${|$\$$̽g[^_]+&UELEDEEԚ?EEEU$P \t&\B$OX@,$rxl~ChCd$ClChFD$$ $ 0$D }!x$XBD$x$EEݝ`EݝhݝP݅P1+݅h݅`t&'C]C ]C]C]C$]C,]C4]C<]CD]CL]CT]C\]Cٞ'C<ٞC\EؾD$t$$3EȉD$\$$ED$L$$D$AT$$$P wXzZ$ /uGC$@ \$@$'[F\$F \$F$tPG$et݅`\$݅h݅P\$$uF \$F$듍v_\@\$$ pe[^_]Ít&؅X=E؉E܉E333?B ]B]B]B$]EEEE?E?/$D $$ $D $C$P X@$\$ @\$@\$@ $XB$ $D T$X US4u[TCLtC\$C \$C$D$ D$D$?C$JD$ D$?D$C$$'D$ ?D$D$C,$CD\$C<\$C4$;CP$l[T>[]Ív'US4 ]-tat ueؽ-\$ н-\$Ƚ-\$-$$Aj-u$!4[]ED$E$[m $ D$ D$D$d uGm $ D$ %D$D$4EU`-d- `-U d- )‹Ei@B)¸ R$D$m T$$|$ JEU`-d-UE]uu$!} t&1 t$$L$]u]11T$D$F$Fp-D$$]1u]Í&'UE]uu$ } t&1D$@ D$$]u]1D$1D$F$EFx-D$$]1u]Í&'UE]uu$} t&1ɺp $L$T$]u]1D$1D$F$F-D$$]1u]Í&'UE]uu$f} t&1D$ D$$k]u]1D$1D$F$%F-D$$]1u]Í&'UE]uu$} t&1ɺ $L$T$]u]1D$1D$F$F-D$$n]1u]Í&'UE]uu$F} t&1D$ D$$K]u]1D$1D$F$F-D$$]1u]Í&'UE]uu$} t&1ɺ0 $L$T$]u]1D$1D$F$uF-D$$N]1u]Í&'UE]uu$&} t&1D$d D$$+]u]1D$1D$F$F-D$$]1u]Í&'UE]uu$} t&1ɺ $L$T$]u]1D$1D$F$UF-D$$.]1u]Í&'UE]uu$} t&1D$ D$$ ]u]1D$1D$F$(d FD$$]1u]É'UE]uu$v} t&1ɺ $L$T${]u]1D$1D$F$5 d FD$$ ]1u]É'UE]uu$} t&1D$< D$$]u]1D$1D$F$d fFD$$y]1u]É'UE]uu$V} t&1ɺt $L$T$[]u]1D$1D$F$d FD$$]1u]É'UE]uu$} t&1D$ D$$]u]1D$1D$F$d FFD$$Y]1u]ÐUVSܧ t(t$$tu1ۃ[^]É'US$E]D$ ED$ED$E$}Pt01/ X + D$L$$tQ$[]Ã}uȋE}~&/ X + D$L$$u$t1ҹ`T$4 L$T$$D$ p{1D$$ $1[]Ív'UE]ا ÍvUE]ԧ ÍvUE]Ч ÍvUE]̧ ÍvUE]ȧ Ív11U1҉ا 1ԧ 1]Ч 1ȧ 1 ̧ ħ  Ð&UU E] UU E] UU E] UU E] US]t $и`\$D$C($SC,[]ÍUSE ]t`\$D$C($C,[]Ð&U(ED$E$ D$P U P Í&USMQtA 1ۅtXT$\$A$[]Ív'US]t$$1҉X[] US]Ctt4t*D$D$C $h$1[]Í'UWVSuF 8ED$D$<$u*1D$ D$F$?Č[^_]Ë= PY V^ V0C҉@Fp ;L(B<$D$1҉T$ L$D$<$^ D$ B D$$1ۉD$ED$,(D$(EM1ED$$D$ B D$1D$F D$FL$\$ <$D$E D$T$ UT$<$ED$?E<$D$D$ML$ <$D$t^@u MV0E |1&F4 F8 FEE؉]1ې&;]MSU 33?fUG?fP3333$EfAEɉU(? H f$zE$fA P EʉU_@f$)\‰E1$ X EEUE` ٞECEffPfB$f$$fBf$$v@EC EffPfB$f$$fBf$$v EC EffPfB$f$$fBf$$vECEffPfB$f$$fBf$$vEčCEffPfB$f$$fBf$$vEȍCEffPfB$f$$fBf$$vẼffPfB$f$$fBf$$ L$T$4$OE}' D$4$1;]EE D$4$ D$t$ D$$ ^L$\$t$ $ < T$t$ D$$ #D$t$ D$$T D$t$ D$$ ָ \$t$ D$$x 贸-T$L$t$ $ 蒸+D$t$ D$$ pD$t$ D$$ N D$t$ D$$ ,L$\$t$ $  T$t$ D$$ #D$t$ D$$ ƷD$t$ D$$- 褷 \$t$ D$$@ 肷 T$L$t$ $@ `D$t$ D$$M >D$t$ D$$h  D$t$ D$$ L$\$'t$ $ ضUE4$‰D$ D$:EU4$D$ T$ D$UD$E4$T$ D$ D$EU4$D$ T$ D$ԩL$t$ \$$ 7U4$T$ T$蟩 D$t$ D$$ E^ t$ D$\$$ е<$4$1҅tČ[^_]Ít& S|;xh<CxZ<SxL<Cx:<Sx,<Cx<rh1a݃σt&뽃믃 롃@뒋E M D$4$~tD$$r D$9D$$s D$D$$t D$SEEE;]t>C4$D$ D$E}'~ىt$$ ɮ;]Eu‹E@t$$ 袮+'UHE E}$EE E\$(\$ E\$E\$\$$];E1EE ]酳U]ÍU($h "t =` tÍED$C D$$I uh Ít&U‰V5d S9|1ɻ At 9[^]Ív'UWV1S|EUUM] EEUUЉǃ$˨1ɉE\$ D$Et$D$UT$E|$L$$ D$ EEǃ}Eƒ}EEÀ}}GEU}t EE}}t EE}UT$ T$ED$1D$UT$E|$D$ U$ T$\EE]ǃ}Eƒ}EEÀ}Q}uEE|[^_]髯}uEu=uEEv'1Ʌ~,v' ẺU AEF9uE܋U9UuËẼEËE9E}ZUUEUԋEE~G'~(1ِ&9FAЋUB9UuEE9EEU9UuHM=MEE1~.&1҅~v'BCA9u9uڋẼEËE9EuEEE~a~CE1EЉ ЋUЉEEЍ AEF9uEU9UEE̋U9UWELME1&'1҅~v'BCA9uF9uuރEE̋U9UMEE1~+t&1҅~v'BCA9u9uEE9Euv'UWVSl} t9E\$]ȉt$$D$ PL$$u l1[^_]11҉D$1T$ D$$v 裧E$EE$EE$LqUT$E$D$E$ED$E$謨1D$ 1D$1D$EԉD$E؉D$E܉D$ ED$ED$E$lU EE܉BE؉BED$ED$E$jE\$ h \$E$膞ED$E$ED$E$]É$DEE$3]܅ۉtz1'ED$E$ҡMȉ]F9sO \ tыE)D$E$衡UЉD̍ED$ED$E$*l1[^_]É|$E$衝<$詪}E @EԨt]U BU B EU BED$E$WED$ED$E$螢l[^_]èt-E @E @ 륿]tѾE?|$ t$etϋU B̓aE @\EЉD$ E D$ED$E$eU| ]}} uD$E$^t|$$x$肧tu1]u}]Ðt&G1$7G$,]u}]É'UWVSE]$D$ D$D$tD$$Cu ļ1[^_]11D$ 1D$|$$v ģE$)EE$E܋E$mt&E܉D$ED$E$ļ1[^_]ËU1ۉT$E$ڧt$E$ED$E$詤E1ɉD$E1҉D$EԉD$ E؉\$ L$T$D$ED$E$kEtME؉EԉAEЉAd  =h E̅E$`Et}tE$蹩eh t E x}t }ED$ED$E$E\$ h \$E$ED$E$耨ED$E$螝]É$ОxE$輞]ԅۉt81 \ 1ED$E$Qx]ȉF9rʉ|$E$l<$tEEE];]؉Eu ;E ED$E$1u؋UƋEƉ$MEEԋUMEEEUEE}]EEf fEE}Mm]mEDžɉE~G1vW$Um]mEЋx…~1ɐt&ABC9uG9}uEE9Eu؋UMxU؉Mԉ$IuxED$$ sED$$ `|$$ 0t$$ h tM x }@EvẼt M̃ P}t uF } } xt$D$T$ 1ɉL$EԉD$E؉\$D$ M $ L$蕗E$ D$BE$ D$/E܉D$E$E܉D$ED$E$4x$ƣļ[^_]à d D$$3 1h E)D$E$xFЉD]9]tѾE?|$ t$U؋Eԋx@։$|Et ]C E } 7} |D$ D$D$1D$EԉD$E؉D$ D$U $ T$| $脢ZEt ]C $ 1MԋU؉D$|$t$ 띋|xEx)OG]WcUSKD$ED$c$h Cx]D29u c b |=a pxtlAdqYZBp9dtB;luK;tu9uBۍ&x|C9 GWOЍ=SK~C̋x|C9GWOЍ=SK~C̋x|GOWȈS¸VUUUKS9uWx|C92GWOS҈K=~Cċx|C9GWOS҈K=~Cċx|VUUUS9GWOS҈K=~Cċxx|)CxD29 GWOS҈K=P$za$Ȝ}Ef fEm]mEC{E$躘@}U҉t E@ EĉD$ EȉD$ED$E$Uă _EȉT$$ D$D$D$ QD$xD$D$T$ 1MԋU؉|$x$؉t$MԸU؉\$|$\$cMԾU؉t$tCt/t& U| VSD$E$؝t+E$D$ ED$E D$$t1[^]Ð&U(]ÍEu։}ωD$$lE$ D$Y(D$\$$ 谕\$(\$$ 藕(t$L$$ ~(|$T$$ eE]u}]ÐUSEMU ;u 1ۃ[]ËED$ ED$E D$E$t҃[] USEMU u 1ۃ[]ËED$ ED$E D$E$Kt҃[] UEc E b E]a ÍvUEt]h ]0h ÍvUEٞv ]` h Í]h @` h ÐUE]\ ÐUSEtHD$$ 0K $$ 蒨1D$E@$D$F葟$1[]ÐUEtHD$$ E1ɺ L$T$@$1UEtHD$$$ 聦 D$E@$j 1ÍU$^Í&U $1tuu=m $% D$ D$D$+ D$$8@tKm $N D$ D$D$$r$ F$Z$C .$B&'UxEtHD$$` Q-D$E@D$E $1E EUPEEUP@UPDEL$ UUT$T$PT$$V1Í&'U]] uu=t xI1D$ D$\$4$>u ]u]É4$H]E~ uE ]ܞl \$D$m $U]] uu=t xLD$ D$\$4$軎u ]u]É4$Ŋ]E uE ]Y \$D$m $s똍'US]$蒋H$cH1D$1D$ @'D$ $D$V1' D$1L$T$$D$ 01D$1D$ P&D$5' $D$ 1& D$1L$T$$D$ 1D$1D$ 0(D$ $D$辔1@0 D$1L$T$$D$ 蘔1D$1D$ 0D$ $D$r1` D$1L$T$$D$ L1D$1D$ `D$ $D$&1 V D$1L$T$$D$ 1D$1D$ D$ $D$ړ1`'D$ 1$D$ L$T$贓1[]Ã[]Í'U-E $׌ D$ i D$-L$$o-$uá- T$D$m $ۉ$ߓt&'UVS$, ͉ $@@$á $D$to-$舋$- -,m 4$D$'4$ώ/ede@nio.@tclh  h  $ H  $肎4 ø1.66C D$ -L$\$$莔$2| | $,ø| rexpCortefCdD$D D$-T$ $/$ 蓊x x $͍øtkedfCenCD$ x D$U D$-$Γ$<2t D$t $-t e L$T$\$ $聓$l l $f1D$ l D$v D$-$1$ 蕉p p $ό0.0D$ p D$ D$-$$Dh h $~h  f0-L$T$\$ $萒-t$$?u7[^]á-D$ D$m $p$t t$ D$ D$m $A1D$ D$-$D$ D$뙉U8}}}]utE  ]u}]ËW: 1҉D$11T$ D$G $賋1D$ D$1D$G1$菋11҉\$ 1ۉ|$t$\$ L$D$1D$T$-$舑E i 1]u}]á-T$D$E $X1D$ D$1D$G $1D$ D$1D$G1$11҉\$ 1ۉ|$\$L$T$ D$FD$1D$$ݐPUWVS K 1" D$"  D$  D$-|$1$h |$t$ \$D$-$螑=`-tA`-L$$h =@-t3@-T$$h ‘Ĝ[^_]Ív=@-h u͸>>fh h Ĝ[^_]Ív=h   tt @1ۉ$ p Enter ttfxƅzh D$$2ً! t€u҉ȃ sta@teme@nts:@ K D&C  th  % h  K  H th @ l 8-$D$Bً! t€tA҃f):@ K vD$m Vt$$ʁ W뷍t&UWVSE ]EiE - -H-K v';&޿$1< Bt< u'4T$E$D$D$U$ T$<di ;e1D$ED$UB$JEE[^_]U$? T$1Xt&u$#$t&t$u)$U$. T$qC $|UT$Ɖ$E$ D$t @u%4$ E$7 D$yVD$m t$$>뿐US 9 ~# CC []$ 老 at @ $T Qt @ C u_$ 0t @    @ CC []ÍD$ $, uuD$$K ʏ1뒉D$ D$ D$m $}(D$  D$m T$$}D$  D$m L$$}91ۉD$$K 79D$$K 19T$$K 1v'UUBB]Ít&'UE @]Ít&'U(}} uE]_EU$\ƋE$O9E~U]u]}U ]魄E$D$茄 tU'G]U uE}]tuL$$K  1ȍ&UWVS} EUwEU4$豁M9~Hۉ4$蘁U9w\$4$ t3UGEUUU [^_]yUuU [^_]yu\$$K ^1봐UVuSgSDXu*FON؉)ʍ R )ˉ[^])zaǍt&'UWVS}u $} t @uo  C  4$t@$[} t @uY t$$蒈C'C[^_]ÍD$  D$m \$$aziD$ 4$ T$@D$m $5z{9D$$K 1d91ۉL$$K ɋ t&UWVS u4$\ Džt( t$$6yt[ ut$<${à [^_] USE$~E @!$$C[]ÐUS$E$D$D$D$D$ D$| D$茅 -$D$'$[]Í&'UVS E u8,tiSB='94$*ƋC@$*t$\$ $@-D$m D$1 [^]9ue[;,uCHPB='u(ru݋CH@$ːt&(rt [^]ËC$됉4$m)ƋCH@KU t$ 9E A ú $Jz t @u&   E A ÉD$ D$ D$m $Xw벉A D$ $H uuD$$K 1t9D$$K ʈ1XvU1ɉ] ÍvUhuu]] } t,%=?v$ uX]u}]$  -$: D$ա -$ D$ -!$9j D$k|$F$\ -$` D$G]u}]É\$F$+ -$di D$\$FH$= -$q D$!D$F$!D$F$ -$i D$!|$FH$!D$F$~ -$h D$뼸!D$F$X -$ i D$떸!D$F$2 -$i D$m!T$F$ -$h D$D!L$F$ -$h D$!D$F$ -$h D$!D$F$ -$h D$ -!$N D$_\$F$P -$%j D$;VHD$B$' -$ D$VHD$BH=hi phi  -D$F$ -$Sj D$ -$ D$ -$Qj D$^H;. -$Wj D$uD$C$d[H3u -$/ D$A\$F$2 -$Wj D$!T$FH -$* D$\$F$ -$Wj D$!L$FH@$ -$Wj D$1&#D$FH@H" -$ D$q#D$F$] -$Wj D$H#D$FH$4 -$ D$U -$ D$#D$F$ -$Wj D$#D$FH$ -$ D$ -$ D$#L$F$ -$Wj D$p#T$FH$\ -$ D$G} -##$ D$#|$F$ -$Wj D$\$FH$ -$ D$ -$ D$#D$F$ -$Wj D$!D$FH@$ -$Wj D$l!D$FH@H -$ D$C -$9j D$.#D$F -$ D$ -$9j D$#D$F$~ -$ D$뻡 -$ D$멡 -$ D$뗡 -$ D$녡 -$ D$p -$ D$[ -$ D$S%D$F$? -$Wj D$* -$ D$ -$ D$%D$F$ -$Wj D$ -$ D$\ -$ D$%D$F$ -$Wj D$z -$ D$e -$ D$K%T$F$7 -$Wj D$" -$ D$ -$ D$%L$F$ -$Wj D$ -$ D$T -%$ D$\$F$ -$Wj D$r -$ D$] -%$ D$>|$F$/ -$Wj D$ -$/d D$ -$ D$%D$F$ -$Wj D$ -$ D$L -$ D$%D$F$ -$Wj D$j -$ D$U -$ D$;%D$F$' -$Wj D$ -$z D$ -$ D$%D$F$ -$Wj D$ -$- D$D -$ D$%D$F$w -$Wj D$b -$ D$M -$ D$3%D$F$ -$Wj D$ -$ D$ -%$ D$\$F$ -$Wj D$ -$i D$< -$ D$%D$F$o -$Wj D$Z -$ D$E -$ D$+%T$F$ -$Wj D$ -$ D$ -$ D$%L$F$ -$Wj D$ -$i D$4 -$ D${!D$F -$ D$U D$F$A -$ D$,b  |$ -$w D$ L$F$ -$Wj D$ T$FHa -$ D$ D$ -$K D$!D$F$y -$g D$dF $ D$" D$fq -$ D$ -$Wj D$ !D$$ -$Wj D$b D$$ -$Wj D$t t$$O -$Wj D$: L$$ g T$$ D$Kp -$ D$ -$g D$t( tƅt$D$Dqً! t€u҉ȃ_cha@nge$m+   uto $ currD$ D$ D$Ho -$ D$ $ D$ D$o -$ D$ $ D$$ D$n -$ D$y a;  -Text 5 9   D$<$7I f K   -$ D$ $ D$ D$7n -$ D$ $ D$ D$n -$ D$ $ D$` D$m -$ D$h $ D$L D$m -$ D$5 $ D$a D$km -$ D$ -$" D$# -$K D$#D$FA -$ D$"D$F$ -$Wj D$"D$FH -$K D$^!L$F$J -$Wj D$5!T$FHF \$$ D$Zl -$ D$'!\$F$ -$g D$F$ D$m -$ D$ -$ D$F ٽf f٭ە٭P$Ƀٞ\$T$$ fk -$ D$3 - "$ D$^t2<\<"  -C$ D$uΡ - "$ D$ -"$ D$e|$!/ -$4 D$!D$F$' -$g D$bF( D$K D$$ 7j -$ D$ -!$3i D$|$F$ -$I D$! -$< D$\$F$` -$Wj D$0 -$ D$6"D$p -C$ D$4 -C$ D$K ƅ $D$jً! t€u҉ȃ_clif@ck@$L $ D${ D$h -$ D$F  t$$ D$ D$kh -$ D$  L$$ D$8h -$ D$ T$\$$  h -$ D$ $ D$ D$g -$ D$n -$ D$Y -$" D$D: 5 4$`$`-`t$)É\$$Yً! t€u҉ȃclicf@k_@`-D$$b$!D$F$ -$g D$4$\ D$  $ D$ D$f -$ D$@v -$9 D$&$!D$F$ -$g D$HD$ D$$ 3f -$ D$ -$ D$ -$ D$/ -$ D$w -$^ D$]C -$W D$C -$M D$) -$A D$G -$0 D$ -$& D$I -$ D$ -$ D$ -$ D$M -$ D$s -$ D$Y  |$$ D$ D$dn \$D$$ hd -$ D$ $ D$ D$0d -$ D$UWVSUB@t` S hi MAHQBA@ $D$s -$j D$^ E 9E}EG94ÍvU\$ KB T$$ D$^chi  -$ D$ -$K D$(D$ D0$ -$j D$9l 9EGyt @tVMD$m L$$GVE$`1` [^_]É$UWVS Et"m $\$$ [^_]þ  t&t"v'm $D$o[ u9uу [^_]É'UWV S1ۃtv'@ Cu uݡ E$v lj'tv'@ u9uݸaD$ D$\$<$[T D$E $k:E b |$ E $FE t$$71[^_]1F$29u벉'UE E EE]SUE$]V tDt @u EXÍvD$ m  L$T$$TŸ9D$$K e1뱉U$bV tAt @u EXÉD$ D$ D$m $Sȸ9D$$K ?e1봍t&'U$U tJt @u EBÍD$ D$ D$m $S뿸9D$$K d1묉US$aU t]t @u/ D-CT$UT$$([[]ÉD$ D$m \$$mR묹91ۉL$$K  d뙍&'U$T tJt @u E EBÍ&D$ D$ D$m $Q뿸9D$$K c1묉U$BT tJt @u E=BE BHÉD$ D$m T$$aQ뿸9D$$K c1묉U$S tJt @u E EBHBÉD$ D$ D$m $P뿹9L$$K b1묉U$BS tJt @u E EBEBHÐD$ D$ D$m $aP뿸9D$$K b1묉US]>=~(= |>='yt @uI][]Z=}=t=C$CH$t @tVD$m \$$O][]>Z=-uC$HC $=C$2C$'C$C$C $C$$C($C,$C0$C4$C<$t @1[]t @vuC$wYt @CVT$D$m $NĐU U w$ &']]% ] ] ] ] ] ] e ]Y& ÍU Uw$ [> t&]] ] ] ] ÉUX]]uu }tG%=?w $ t&t$ T$D$$ "Z]u}]Ðt$$@T]u}]Ét$C$tD$t$ D$$J Y[H_KHC T$4$D$M[H2t$C$ D$4$L[H C4$D$i D$L*C D$\$4$L t$C$D$t$ D$$ Xt$C$vD$t$ D$$T Xu }Cu]E]Qt$${St$C$L$t$ |$$Wj fXt$CH$t$$}R t$$[Rt$C$t$ T$D$$Wj Xt$CH$~t$$]bRt$$[MRt$C$JD$t$ D$$Wj Wt$CH@$D$t$ D$$Wj hWt$CH@H_t$$(Qt$C$t$$)QCDEC@ECP=D$t$ D$$ =Vt$C$D$t$ D$$Wj  Vt$CH@$D$t$ D$$Wj Ut$CH@HD$t$ D$$w Ut$C$$D$t$ D$$Wj vUt$CH(t$C$t$ L$T$$di 9U[HD$t$ D$$R Ut$Ct$ |$L$$i Tt$Ct$C$R 'D$s 4$D$H]u}]Ét$C$% ȉt$ C$s |$\$4$G,t$C$R s L$T$4$Gt$C$ St$C$ :t$C$k !t$ C$MTt$C$9 it$C$  t$C$ t$C$( t$O C$t$C$2 t$C$` Yt$C$w @t$C$qC 't$j C$SZt$C$? ot$C$&AC t$C$ t$C$ t$C$t$C$K t$C$ _t$ T$D$$  t$ D$|$$^h #t$ L$T$$Z D$t$ D$$b D$t$ D$$k D$t$ D$$ t$ |$L$$ yC |$4$D$D[H  Ët$C$oCHtܸD$t$ D$$Wj PCH뵸D$t$ D$$j Pt$C$ D$t$ D$$j [Pt$CH@$t$ D$|$$j ,Pt$CH@H$t$ \$L$$ Ot$C$pD$t$ D$$i O[H[t$$-*J[Ct$C$t$ T$D$$ qO[H t$C$t$ L$T$$g 8O[Ht$C$D$t$ D$$g N[Ht$C$tD$t$ D$$Wj N[H_t$C$6t$ D$|$$g N[H&t$C$t$$.H[Ht$C$t$ D$|$$h -N[Ht$C$t$ L$T$$i M[Ht$C$iD$t$ D$$ i M[HTt$C$0D$t$ D$$h M[Ht$C$t$ T$D$$h IM[Ht$C$D$t$ D$$h M[Ht$C$t$ |$L$$h L[Hpt$ L$T$$ Lt& D$ D$4$@t$<$Et)%  D$|$4$?t$E$]t)  L$T$4$?t$E$Et) D$ D$4$?t$E$Et) D$ D$4$R?t$E$O}t)  \$L$4$"?t$E$U܅t) D$ D$4$>t$E܉$E؅t) D$ D$4$>t$E؉$Eԅt)  |$\$4$>t$Eԉ$MЅt)  T$D$4$b>t$EЉ$_E̅t)( D$ D$4$2>t$Ẻ$/Eȅt)O  D$|$4$>t$Eȉ$]ąt)2  L$T$4$=t$Eĉ$Et1 D$t$ D$$ Jt$E$}t E$F4$D$, D$e=Et"t$ D$|$$? It$ t$\$$! Ist$ T$D$$ sID$t$ D$$ LID$t$ D$$ %Ist$ D$\$$sr HLD$t$ D$$ H%&'UVS]u S't[Ct`$D$ r4$D$ D$@  - =@ <$Y?vHlj=@ F$ @ f.=@ vHG=@ F$@  / =@ <$>vHlj=@ ^HF L$D$@ $E=@ <$>vHlj=@ OF$d@  / =@ <$>vHlj=@ F}Ef fEmUmUR$Ƀٞ؉T$" T$@ $D@ $ ><=@ 5F$@ f.r@@ FD$i D$@ $D@ $=<=@ F$`@ f.c@@ FD$@ $E@ $V=<=@ @ f{F@ $@ f, @FH@ $@ f}@ 0@ f[F@ $@ f, @@ FH$@ f]@ @ f[F@ $Y@ f, @FH@ @$6@ f, @FH@ @H눡@ f(@ F$@ f)@ UFDEF@EF@ @ subs@tr(@ F$@ f, @FH@ @$@ f, @FH@ @H@ strc@at(@ F$@ f, @@ FHeF$`@  // @=@ vH=@ @ strl@en(@ F@ itosf@(@ FFs $ |$D$@ $@@ $9<=@ Fs % $\$t$@ $@@ $9<=@ F$b s L$T$@ $G@@ $i9<=@ F$R D$s D$@ $@@ $#9<=@ MF$ D$s D$@ $?@ $8<=@ F$ D$s D$@ $u?@ $8<=@ F s $@|$t$@ $/?@ $Q8<=@ {F $s \$L$@ $>@ $ 8<=@ 5F$ s T$D$@ $>@ $7<=@ F$x D$s D$@ $]>@ $7<=@ F$2 D$s D$@ $>@ $97<=@ cFs $( |$D$@ $=@ $6<=@ Fs O $\$t$@ $=@ $6<=@ F$`2 s L$T$@ $E=@ $g6<=@ F$` D$s D$@ $<@ $!6<=@ KF$w D$s D$@ $<@ $5<=@ F$C D$s D$@ $s<@ $5<=@ F$Hj D$s D$@ $-<@ $O5<=@ yF$ D$s D$@ $;@ $ 5<=@ 3F$AC D$s D$@ $;@ $4<=@ F s $l|$t$@ $[;@ $}4<=@ F $+s \$L$@ $;@ $74<=@ aF$s T$D$@ $:@ $3<=@ F$K D$s D$@ $:@ $3<=@ F$^ D$s D$@ $C:@ $e3<=@ @ shiff@t(@@ @ inte@rsecf@t(@ @ $ 3<=@ 7@ cent@re(@ $2<F=@ $@ f, @@ $2<FH=@ c@ encl@ose(@@ $y2<F=@ $1@ f, @@ $I2<FH=@ @ redu@ce(@ $2<F=@ $@ f, @@ $1<FH=@ @ appe@nd(@ $1<F=@ $o@ f, @@ $1<FH=@ @$<@ f, @@ $T1<FH=@ @H@ dele@te(@ $ 1<F=@ $@ f, @@ $0<FH=@ F |$D$@ $7=@ <$0^H3lj=@ uCf)@ @ f, @=@ <$w0NjCH=@ ÅC$!CHt뷡@ if @ $10<F=@ $@  thef@n @@ $/<FH=@ @$@  elsf@e @@ $/<FH=@ @H$u@  endf@if@@ $/<=@ F$9@  || @=@ <$P/vHlj=@ F$@  && @=@ <$/vHlj=@ F$@  == @=@ <$.vHlj=@ |F$@  != @=@ <$.vHlj=@ DF$Y@  < =@ <$t.vHlj=@ F$%@  <= @=@ <$<.vHlj=@ F$@  > =@ <$.vHlj=@ F$@  >= @=@ <$-vHlj=@ l@ f-=@ vG=@ MTEXT@=@ <$-NjE=@ t< D$ <$D$04@ $R-<E=@ $ EtA%  |$t$@ $3@ $ -<E=@ $]tA  L$T$@ $3@ $,<E=@ $zE܅tA D$ D$@ $X3@ $z,<E܉=@ $2E؅tA D$ D$@ $3@ $2,<E؉=@ $}ԅtA  \$t$@ $2@ $+<Eԉ=@ $MЅtA  T$D$@ $2@ $+<EЉ=@ $ZE̅tA D$ D$@ $82@ $Z+<Ẻ=@ $EȅtA  |$D$@ $1@ $+<Eȉ=@ $uątA  \$L$@ $1@ $*<Eĉ=@ $UtA( D$ D$@ $`1@ $*<E=@ $:EtAO D$ D$@ $1@ $:*<E=@ $EtA2  |$t$@ $0@ $)<E=@ $]tA@  @ rel@ief:f@ @ $)<E=@ $b}E$, L$D$@ $70=@ <$Y)lj=@ Ut7? O fQ G=@ <$)lj=@ f }G@ $(<=@ &DONAf@LD@BARCA@3IMAGf@E"TEXT@BOXUNKN@OWN: \$D$@ $K/]=@ =@ FD$@ $0@ $<(<=@ fv'UWVSu <$.F='V`  @ $\$ D$ D$@ $.@ $'ËF@ $f@ f; @@ $~'É@  D$<$E'` <$D$2't$<$&' D$-$<$&[^_]Ë$\$ D$ D$@ $-@ $&É@ c11ɣ-11ңľ-1Ⱦ-1̾-1о-1Ծ-1-1-1U-1-1]-1 ؾ-1ɉܾ--1 ---Í'UWVSÃLEHuL}PEEDEE@EE  -* 6 f -u.5-)UUE-f -d   d ʁ w& 96    ҉ 7  ҉l ~0  )ЉDȉT$D$$ K#-J =  l ) )ѡ-  DD   t$\$ $"  r  6    wf9 & &6@ =xi     &t  -6 =υ wT1L&& 4@2 EG09u$UTU$ E  ' 6 f t&B wf& & xi 9#PH-- D   tm $ D$ D$D$$; t0&" |$D$m $D; uءm $ D$'  V2f=%5-& D -D T$|$$W  =xi   i-)h t @#xi $"t @#ti $!e[^_]Ë -4 ɣd @2 T$D$  D$m $ m ${ D$ D$D$d#m $ D$ D$D$8#/$ : =-1d 1-Em t$\$$ D$ "  \$D$ @ D$m $>   f~? @2 D$ D$m $fӋ  H |$@2 D$m $f=أ  L$|$m $  ti V\$D$m $[xi Vt$D$m $7\Ed$!pars 1@e er@rord L$<$@2 D$$H! !4@2 EC & 9uۃ}8U D$<$<$D$<$f8'E똡m xi $ D$ D$D$ ; t(" |$D$m $9 uءm $ D$  g}~&E t$<$D$Q$ <$t @<$) K  -!--fg -4!-t =-  D -D  t$\$ $ tH   =xi    V|$\$m $'11D$  |$$t$D$ @$\$D$ 4$=> g!L$$T\$T$$f   1!D$1!D$($/|$D$ @$t$D$ 4$\$D$ $=> "L$$T\$T$$    4$ D$M# BD$4@$W   v&!\$ $訾   G 4$%D$͗[" BD$4@$׾   & BD$4$襾    ~"JQ"&` L$T$@@$QD$ $:   Y 4$&D$ߖ BD$4@$    BD$4$辽   $R   @$5   $˻    D$ $ü   b 1|$D$x$   / 0Bt$D$4$ܽ    1ۋB\$D$4$諽/L$D$ $苽   3T$ @$   %D$ $躻   Y&D$ $蒻   1'D$ $j    (D$ $B   #T$ $   $D$ $   "L$ $ʺ   i 4$#D$  BD$4@$    BD$4$κ    4$$D$s BD$4@$}    BD$4$R   q 4$"D$ BD$4@$     BD$4$չ    BD$4$誹    ,|$D$x$w    t$ $ϸ   n 4$(D$ BD$4@$     t$   -@5D$ @$*   8D$ @$   >D$ @$ظ   w?D$ @$诸   N@D$ @$膸   %BD$ @$]   =|$ @$4     UBt$D$4${\$D$ $`    $衴   ` $   AL$ @$y   T$ @$P   !D$ $(    D$+D$x$u    D$-D$x$B   a D$*D$x$   . D$/D$x$ܶ    D$%D$x$詶    ^|$D$x$v    _t$D$x$C   b `\$D$x$   / aL$D$x$ݵ    D$bD$x$誵    D$cD$x$w    D$^D$x$D   c D$_D$x$   0 D$`D$x$޴    D$aD$x$諴    b|$D$x$x    ct$D$x$E   d ^\$D$x$   1 _L$D$x$߳    D$`D$x$謳    D$aD$x$y    D$bD$x$F   e D$cD$x$   2 D$\D$x$    D$]D$x$譲   d|$ $   (t$ @$ܱ   {2\$ @$賱   R .L$D$x$   9T$ @$W   :D$ @$.   ;D$ @$   <D$ @$ܰ   { BD$!D$4$(D$UD$ $   '"D$ $`    )B|$D$4$謰    +t$D$x$y    -\$D$x$F   eEL$ @$蝯    >|$D$x$    &t$ $D   .\$ @$    1ɋBL$D$4$jRT$D$ $J   i BD$SD$4$   5 D$&D$x$    BD$&D$4$诧D$UD$ $菧   (D$ $    @$#D$t  [ @$$D$~  0 @$%D$~   @$&D$~T   @$(D$c~    15  4$!D$"~ BD$4@$,   K BD$4$     @$!D$}G   @$"D$~}   @$ D$S}@   BD$4$U   t     X     <              =    5        ]QDT$H1҉D$DDؾDRt$\$$ r  B  ]QT$H1҉D$DD;DL$\$$    BD$%D$4$蝣D$UD$ $}            c ]PT$H1҉D$DDNؿD#|$\$$ C  t&ti D$VD$m $xi D$VD$m $a  =xi   ׸d߁$( ) f<ډ ہE5h 1,t @txi V\$D$m $xi $At @tti VL$D$m $yti $ 1d T$@2 D$  D$m $;pi D$ D$m $=xi @2 D$ -D$/ D$m $m \$L$$' D$ 6m \$L$$ D$ -BBBPBZ @$$@-   4$Р @$$@-  X$ qImag@eFilf@e 4$j @$Z$@-^   @$3$@-7   4$  @$$@-   @$ҟ$@-  j @$諟$@-  C @$脟$@-   @$]$@-a   @$6$@-:   @$$@-   4$ @$՞$@-  m$ mImag@eScaf@le@ Q 4${ @$k$@-o   4$A @$1$@-5   4$ @$$@-   4$͝ @$轝$@-  U@@$D$   3$x @$h$@-l   1U 1] Ít&USÃi   B9t A []Íi D$ $- t&    A []ùuL$$K 1UVS ,m 4$D$4$=/sco@ut.e@den D$4$$? ? fr@&t$\$$ [^]ái $ tot @u  HD$ i D$ D$m $ɡ t$ D$D$m $$9D$$K d1U( ]u}$? XUPZ_Q;} } } } }.}">}#}&2}8}=\}!A}<(}>K}/f}~D1 = &']u}]bUPO_F l tK1D$$js>99|[@l uxk tH1.D$$T{79|9 j uĀ=`- K K  ƅ:_K 4$T$X! t€u҃f_K [ 4$D$  t$$ $n -@$JUDP}.l 11|$t$$u$ - 11ɉ E  $&UDPtо5 UDP  j t=1 D$$Lt s>99 1Ƀ  [tݤi $} !} OUDP$$.1}  }&$&^1 E$lw}|$|+U1ɉ  $8C}=$=뛃}=$!UDP`}.1D$1D$ $b$ -1  E= $}"0}\uM }=$b }/$/} t}nER 3}=$`ݠi 11҉D$ T$$t$ -1   $11҉ л E xE{ = V_ @$a15 '$^1 $_1= $]1 $\1 $c1  \. E5 m $$ - 1҉ 1 3{{s`-D$4$K +! t€u҃f_ `-D$4$=  [Dl Hl  -$*v&j $ Y  (        E1$5  U]mu}M)Eu ]u}]1֍v'G;}r]u}]Ð&U]Oælu})EHt41&G9}u]u}]Ë$ÐU1S9l tD$1D$E$ []ÐUS@ t@ v'ЋCuX[]ÐUSP[k&X[NEWOTHERUNKNOWNOHDEARINTERNAL%eden%scout%donald%arcaENTSTK popEntryStack appendHistTcl error (appendHist): %s MALLOC emalloc(%d) 0x%x out of memory%s: error: %s MALLOC free 0x%x called by action %s in action %s called by %s while executing file %s while executing stdin while executing string near line %d, char %d: ^ DATSTK reset_stack errorf: longjmp %s: error: appendErr%s: warning: %s notice: %saction in %s%s%s: notice: %s system error: ereallocENTSTK pushEntryStack(%s) ENTSTK clearEntryStack %s: interrupt button pressed FILE_DEVSTRING_DEVrun: setjmp PARSER yylex() returned %d PARSER yyparse() returned %d swapAndRunRunSet start main.cRS->nitems == 0RS->nitems > 0edeninterruptededeninterrupted();%s->Failed to putenv TKEDEN_LIBhttp://go.warwick.ac.uk/EDEN/rexported1.66tkeden%s: %s version %s (%s) unknownLib directory is %s See %s for more information /eden.edenargument p %s +vul:esystemautocalceden_error_index_rangeeden_notice_undef_referenceinitialisation-e%s: unknown argument %s %s: can't open %s swapAndRunRunSetzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzTcl error (errorComplete): %s Tcl error (errorContentf): %s topEntryStack failed: TopEntryStack <= 0%s: interrupted using control-c: press again within three seconds to quit queue: adding master <%s> timertoken <%d> action <%s> MCSTAT run start: %s %s%s%s Inp_Dev level: %d MCSTAT run end: Inp_Dev level: %d, errorflag: %d swapAndRunRunSet: ignoring invocation since already processingRunSet swapAndRunRunSet: newly active RunSet RS->nitems=%d swapAndRunRunSet: run with master <%s> action <%s> swapAndRunRunSet exiting: EDEN becoming quiescent unless queue() was called recently interrupted: clearing both RunSets (current queue and todo)Failed to get current working directoryUsage: %s {-l} {-v|-u} {-e }|{} {-e }|{}... -l name of the directory containing the library files -v output version information and exit -u output this usage information and exit -e execute 'code' if file is '-', standard input will be read See %s for more information Use the -u option for information on usage of command options func cwd { return _eden_internal_cwd(); } proc cd { _eden_internal_cd($1); touch(&cwd); } dirname is _eden_internal_dirname; basename is _eden_internal_basename; PI = 3.14159265358979323846;couldn't open initialisation file %s: %sFailed to get current working directory -- we will not be able to restart. Continuing anyway.%s: Could not find library files location (try using the -l argument) eden_backticks_dependency_hack%%eden include("%s"); /* (invoked from command line) */ runset.cfound == 0** printRunSet: %d: %s deleteActionWithTokendeleteActionWithToken: removing master <%s> timertoken <%d> action <%s> deleteActionWithToken: failed to find Action fortoken <%d> in RunSet <%d> deleteAllTokenActions: removing master <%s> timertoken <%d> action <%s> deleteAllTokenActions: failed to find any Actions with timer tokens to remove from RunSet <%d> ** printRunSet: no items in RS *%s %d %d redeclare local variable:local variable is not in this level:compiler error while patching code-./0234k5_6[7K9Q:;<p=q>? gJbTTTUUUUUUUUUVVVWVVVVVXXXYYZZZZZZZZZZZZZZZZZZZZZ[\]^^__`aabcdeffghijjjjkkkkklllllllllllllllllmlllllllllllllnopqrrrstsuvwvxzy{{{|}~~ZjJ'UKlL>X>GUMlMNUOU+lU,lU-lU+UW=lDUUDEUUEUYNlOXNOYKlLrlP&P&lP"P"UP#U*lP$U*l*lP%U*lP QQPPglhZ]^_`abZ\ZNlOP[NlOcZ NlOcZ NlOcZdZePNPlPPlPOlO!RfSfZNOk   VXGUKiLl;ll<ll>ll?ll@ll=ll7ll8ll9ll:ll5ll6l.mU<llFClBll.cloll1ll/llpllqll3ll4lnNlOIQ20vyskuKLPMlMtuKLP)kxlPMlMwxlP({kz~|f}RSQk*kPP*l*l !%)-.58;>ACEINSUX[_bfltz~  $(,0158;>AHLPTX\`egikmoqsz{    &')++6789<>?BEIKLNPSTVXZ`fkpy    !"(*-39:;>BCGKRS[agxyz}  LGHDEF|}~IJK10]kB/>MN.Cqop&'@%2C_ baO3yu;nm`z$ ^ =? 574Aedhi[\WXYZQRVSTUfg; P;6(vj!#8:l,+9rc<"x*)>-t{81P@RVWno\^ABC`abDlem`abEeFeeg`abcd8fiheecdecdeeon8JLMN TXYZ]   rstuvwxyz{|}~8U{|}~8888 8 yz{|}~ !"#$%&'()*+,  !"#$%&'()*+,  !"#$%&'()*+,  !"#$%&'()*+,   !"#$%&'(G*O !"#$%&'(G*j   !"#$%&'(G* !"#$%&'(G*     'GHI !"#$%&'( G*S'G* 'GHrstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~rstuvwxyz{|}~uvwxyz{|}~wxyz{|}~***P**!"()>?@)*PN F+,-Q4K6+,-PNKNPKPKK+,-FGDE3N3NKKDEOON=?K()Q[DEK`abKFefghLKk*F)ONqQs(u_wxyz{|}~=L;<=>?@ F* RK#$%P!P*LP./0123456789:;<=>?@HF LQS789:;<=>?@`fF  "#$%&'.56789:;<=>?<>FBCDEGIJKMNPR  "#$%&'.<>BCDEGIJKMNPRS  "#$%&'.<>BCDEGIJKMNPRS  "#$%&'.<>BCDEGIJKMNPR  '.<>'.<>BCDEGIJKMNP  '.<>'.<>BCDEGIJKMNO  ' '> .J'MNP<>'>>./0123456789:;<=>?FQ./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FP./0123456789:;<=>?FO./0123456789:;<=>?FO./0123456789:;<=>?FO./0123456789:;<=>?FO./0123456789:;<=>?FO./0123456789:;<=>?FO./0123456789:;<=>?FO./0123456789:;<=>?FM./0123456789:;<=>?FM./0123456789:;<=>?F*L./0123456789:;<=>?F./0123456789:;<=>?F123456789:;<=>?F3456789:;<=>?F J  8    r r  =     r                # |> ) E> . 5 < C #t J M V Z ^ f o   s  {                              ! % ) - 1 5 = 9 D G O Y ^  d h r n | x        u  u                    % / ; C P S a d o w CFJ@GNO>;*<?QP9+7.KLMRS  !"#$%&'(),-/01234568:=ABDEHI ###0###Hhr###P) +   k   r388883+ :.51#YDr6 >Mo=rYxn]r @ F|E|yy]B!38Vmyy9m1a +  o Q    yv  y  0 E \     &Nv>Syyyyyyyyy3Jax0Gv$;R4Jryyy6KbV~bwyy >$$ܲԻھԱ.鷡շҷѳ۰ᴡ䰿մ󰿸ѱձ鳢ʸ鰿ʲѴ󱫱ձʸ鰿䷡ٱ鷡ʸ鰿Ѵ鰿հʴ鴡䴡鷡䰿ձ±հ䴡ٷ󴡱ٰ󰿸±ʱʷٷշ鷡ձ鱷ձٷҰ',''='ʳ巡ѱ巡'?'ܳ۳尿ܳ۳崡մհϳ巡ճ巡'>'Ұճ巡'<'LT_EQ'+''-'SLASH_SLASH'*''/''%'NEGATENOT'!'PLUS_PLUSMINUS_MINUS'#''&'ASTERISKEVAL'$''['']''`''('')'';'':''{''}'programlvalue@1primarysecondarystmtwhileforexpr1end_expr2end_expr3thenelsecompoundstmtlistcasesexpr@2evaluatecolonlazy_andlazy_ordefndeclare_relation@3tilde_gtdeclare_formula@4declare_action@5def_begindef_endrefer_optid_list_optid_listdeclare_para@6declare_local@7local_listarglistargument_listused outside definitionStarting parse parser stack overflowStack size increased to %d Entering state %d Reading a token: Now at end of input. Next token is %d (%sShifting token %d (%s), -> %s local variablereturnshift'case' used outside switch'default' used outside switch'continue' used outside loop, encountered `%s', expecting ` or `parse errorDiscarding token %d (%s). Error: state stack nowShifting error token, Reducing via rule %d (line %d), can't reference local variable within eval()can't reference local $ variable within eval()'break' used outside loop/switchassignment used inside formula or... (%d other possibilities)parse error; also virtual memory exceededexitexecuteincludeinclude_file_eden_internal_cwd_eden_internal_cd_eden_internal_dirname_eden_internal_basenameusbhidopenusbhidreadusbhidcloserawserialopenrawserialcloserawserialreadapplysubstrstrcatsublistlistcatfloat_type_convertwritelnarraynameofformula_listaction_listsymbolssymboldetailsymboltextsymboltableforgetpackget_msgqsend_msgreceive_msgremove_msgqrealranderror_nobackgndpipeipopenipclosefdreadyrawreadrawwriteregmatchregreplacegetenvputenvprinthashtouchgettimeftimefeofgetcharfgetcstatfgetsungetcfscanfsscanfdebugDisp2PSStringRemaintclDisplayScreenPlotShapecreatetimerdeletetimerdeletealltimerstodosasami_vertexsasami_set_bgcoloursasami_poly_geom_vertexsasami_poly_tex_vertexsasami_poly_coloursasami_poly_materialsasami_object_polysasami_object_possasami_object_rotsasami_object_scalesasami_object_visiblesasami_viewportsasami_setshowaxessasami_material_ambientsasami_material_diffusesasami_material_specularsasami_material_texturesasami_light_possasami_light_ambientsasami_light_diffusesasami_light_specularsasami_light_enabledsasami_light_attenuationsasami_light_directionalinpdevlinenoinpdevnameusage: debug()builtin.cpqt->tok != ((void *)0)timerhandlertime must be >=1deletetimer(token)deletealltimers()string eden_internal_cwd()failed to get cwdfailed to cd into '%s': %sfeof()int feof(stream)fgetc()int fgetc(stream)stat(filename);stat()failed to stat %s: %sstring gets()fgets()string fgets(n, stream)ungetc()void ungetc(c, stream)fscanf()sscanf()substr()substr(s, from, to)sublist()sublist(L, from, to)%.15g'%c'(%s is variable)(%s is built-in function)(%s is int-valued C function)(%s is user-defined function)(type=%d, val=%d)s = nameof(&var);lcat()execute(string_expr);execute()execute("%s"); include()can't read file apply(function, list);symboldetail(symbol);symboltext(symbol);symbols(type);anypointer%d ---------------------- (local variable #%d, data pointer: %d)char pointer: %d)(%s is C function)(%s is formula)edenDefn internal is,func procmacro proc errorInfosetupViewOptions"wrong # args: should be ".view.left.list insert end address=pack(data,...);list = array(n, data);array()user_errorrun-time errortouch()string = getenv("env_name")getenv()ok = putenv("env_name=value")putenv()backgnd()/dev/nullbackgnd: can't execute %s pipe()pipe(): can't execute %s ipopen()/dev/ptmxipopen(): can't make pipe ipopen(): fork failed ptemldterm/dev/consoleipclose([rfd, wfd, efd]);ipclose()fdready()rawread(fd, maxbytes);rawread()rawread(): %srawwrite(fd, string);rawwrite()rawwrite(): %srawserialopen()rawserialopen: tcgetattrrawserialopen: cfsetospeedrawserialopen: cfsetispeedrawserialopen: tcsetattrrawserialclose(fd);rawserialclose()rawserialread(fd, maxbytes);rawserialread()rawread(): %dusbhidopen()usbhidread(fd);usbhidread()usbhidread(): short readusbhidclose(fd);usbhidclose()regmatch(pattern, subject)internal matching error %dtodo(string);todo()todo called: queuing <%s> real realrand()Disp2PS(screen, file);StringRemain(screen, box);string tcl(string)catch {destroy .%s.b%d_%d}canvas .%s.b%d_%db%dscout_show_canvastext .%s.b%d_%dscout_show_textcanvas .%s.b%d_1scout_show_2Dcatch { destroy .%s.b%d_%d }raise .%s.b%d_%dlower .%s.b%d_%d .%s.b%d_%dsasami_vertex(n,x,y,z)n must be an integersasami_set_bgcolour(r,g,b) must be an integer must be an integer must be an integer must be an integer must be an integersasami_viewport(x,y) must be an integer must be an integersasami_setshowaxes(n) must be an integer must be a stringsasami_light_pos(light,x,y,z) must be an integer must be an integer must be an integerPlotShape()locustruetransparent%s.%s_xOrigintcl variable not found: %s.%s_yOrigin%s.%s_xScale%s.%s_yScaledraw_shapewinfo exists .view.left.list.view.left.list curselection.view.left.list get cleanup eden } masteragent.eden.t.text see inserttimerhandlerdeletetimer<9=<<s<@<I;,<<<<<I;I;I;<%==NOOOOfONOO8O!O O ONNNNNN[a[[a[[token createtimer(cmdstring, timemillis)you must call createtimer() before deletetimer()deletetimer: removing token <%d> cmdstring <%s> from prequeuetimers list deletetimer: failed to find any timers with token <%d> in the prequeuetimers list deletealltimers: no timers list to delete from deletealltimers: removing token <%d> cmdstring <%s> from prequeuetimers list string _eden_internal_dirname(string)string _eden_internal_basename(string)void _eden_internal_cd(string)scanf can handle at most 9 variablesint scanf(format [, pointer ... ])fscanf can handle at most 9 variablesint fscanf(stream, format [, pointer ... ])sscanf can handle at most 9 variablesint sscanf(string, format [, pointer ... ])substr: index out of range (from < 0)sublist: index out of range (from < 1)(local variable #%d, location 0x%x, value oops - internal error - unknown type of pointer(%s is real-valued C function)(%s is user-defined procedure)(%s is user-defined procmacro)nameof(): address needed (got %s)include(filename[, filename...]);symboldetail(): address or symbol name needed (got %s)symboldetail(): no such variable symboltext(): address or symbol name needed (got %s)symboltext(): no such variable Tcl errorInfo (from tkdefine): forget(): pointer or symbol name needed (got %s)listcat: -ve number in 1st argumentpid = backgnd("cmd", "cmd", "arg1", ...);pid = pipe("cmd", "cmd", "arg1", ...);fileidlist = ipopen("cmd", "cmd", "arg1", ...);ipopen(): can't execute command file %s: %sipopen(): failed to open master ptty %s ipopen(): failed to set permissions on slave ptty ipopen(): failed to unlock the slave ptty ipopen(): couldn't get name of slave pttyipopen(): couldn't open slave pttyipopen(): ioctl couldn't push ptem moduleipopen(): ioctl couldn't push ldterm moduleipopen(): couldn't get terminal attributesipopen(): couldn't set terminal attributesfdready(fd, type, [sec, milli]);fdready(): second type argument must be one of 'r', 'w' or 'e'rawserialopen(file - eg /dev/ttyS0);rawserialopen: couldn't open filerawserialclose(): couldn't close fileusbhidopen(file - eg /dev/input/event0);usbhidopen(): couldn't open fileusbhidclose(): couldn't close filecouldn't compile regular expression '%s': failed at offset %d: %sregmatch: pcre_exec p='%s' s='%s' rc=%d o[0]=%d o[1]=%d ovector overflow: found more than %d matchesnewStringBuf 0x%x s=0x%x l=%d %s reallocStringBuf 0x%x s=0x%x l=%d rl=%d %s %s freeStringBuf 0x%x s=0x%x l=%d %s $ in replacement denotes a reference and must be followed by an integer (found %c)reference cannot be negative (encountered %d)reference number greater than the number of subpatterns (reference %d, subpatterns %d in pattern "%s")reference (%d) to subpattern that was not usedregreplace(pattern, replacement, subject [, limit])regreplace: p=%s r=%s s=%s o[0]=%d o[1]=%d Eden tcl() called with @ parameterEden tcl() command, whilst executing `%s`, got Tcl errorInfo: %s DisplayScreen(&screen, screen_name);DisplayScreen called with screen undefinedsasami_poly_geom_vertex(,,)sasami_poly_tex_vertex(,,)sasami_object_poly(,,)sasami_poly_colour(poly,r,g,b,a)sasami_poly_material(,)sasami_object_pos(object,x,y,z)sasami_object_rot(object,x,y,z)sasami_object_scale(object,x,y,z)sasami_material_ambient(material,r,g,b,a)sasami_material_diffuse(material,r,g,b,a)sasami_material_specular(material,r,g,b,a)sasami_material_texture(material,texture)sasami_light_ambient(light,r,g,b,a)sasami_light_diffuse(light,r,g,b,a)sasami_light_specular(light,r,g,b,a)sasami_light_specular(light,e)sasami_light_specular(light,d)sasami_light_attenuation(light,attenuation)sasami_object_visible(object,e)PlotShape(viewport_list, segid, &attr);if [ winfo exists .%s.%s ] { .%s.%s delete t%d }dumpeden notation-option show-not-yet-define".eden.t.text config -state normal.eden.t.text insert end {AGENT .eden.t.text config -state disabled.eden.t.text mark set insert 1.00muldividenegatelazy_notconcatconcatoptjmpjptjpfjpntjpnfdduppopdpushUNDEFpushintconstpushcnv_2_booleqswitchcodedefinition_runtimelhsassigninc_asgndec_asgnpre_incpost_incpre_decpost_decnoupdateresetupdatelookup_addresslocaladdrindexcalcmakelistgetvaluesellistsizeappenddeletequerybitandbitoreagerfreeheapevalrelated_by_coderelated_by_code_runtimelhsDATSTK push DATSTK pop (DATSTK now %d) 0x%x (%d)CALSTK|DATSTK ret_call : CYCLIC DEFINITION: ABORTEDprogram too bigVRWRIT codeswitch no. of 'case' overflowtext buffer overflow%f%c@%s %s starting: args %s %s ending: return VMOPER|CALSTK eval VMEXEC|MCSTAT reset_compiler_status (datum at 0x%x, pushed to DATSTK %d) VMEXEC|VMREAD execute(0x%x) (to start, %d items on DATSTK) VMEXEC|VMREAD execute: next is pc=0x%x, *pc=%s VMEXEC execute end execute(0x%x) (now %d items on DATSTK) SYMTBL|DEFNET change_targets %s SYMTBL|DEFNET change_sources %s internal error: change_sources()VMOPER|VMREAD|SYMTBL|DEFNET related_by_code VMWRIT code %s to location progp=0x%x EVAL error : unsuitable usage of eval syntaxcall to %s %s nested too deeplyCALSTK|DATSTK call %s: frame level %d func/proc/procmacro '%s' neededCALSTK end call %s (level %d) func/proc/procmacro needed, found %sVMREAD|SYMTBL|DEFNET related_by_code_runtimelhs JG FQUEUE schedule %s AQUEUE schedule %s SYMTBL mark_changed(%s) MCSTAT resetLock VMOPER|MCSTAT|FQUEUE eager schedule: not scheduling %s %s MCSTAT|AQUEUE|DATSTK|FQUEUE invoke_action_queue invoke_action_queue: invoke action %s invoke_action_queue: action %s not invoked MCSTAT|FQUEUE|SYMTBL|AQUEUE eval_formula_queue eval_formula_queue: formula %s changed and ready: evaluating it eval_formula_queue: formula %s not ready: not evaluating it eval_formula_queue: formula %s not changed: not evaluating it SYMTBL|FQUEUE|VMEXEC change %s->changed = %d) MCSTAT|FQUEUE|AQUEUE reset_eval HEAPAL getheap(%d) start hptr=0x%x heap overflowend hptr=0x%x VMOPER|HEAPAL freeheap input buffer overflowsendClientsendServerpropagateaddAgencyremoveAgencycheckAgencyFALSETRUEOFFMOTIONENTERLEAVEpropagateTypeEveryOneAllowedsynchronizehigherPriorityqueryObsrenewObsOpenDisplayDoNaLDdefaultWincartCARTtransPIintersectparallelperpendbetweencolinearintersectsseparatesincludesdistlargerdistsmallerdistmidpointsqrtasinacosatanlogincidentDD_randomrtosdotxdotydot1dot2dotraddotargpolarvector_addvector_subpt_addpt_subtractscalar_multscalar_divscalar_modsysClockscoutScreenInitOpennotationGetnotationSwitchnotationPushPopautobreakcontinuecasedefaultprocprocmacro.agentName config -text {}notationChar('#');notationChar('%c');%donald0%sasami%lf%o%xsingle char expectedFloating-point format error%s: Can't find scoutScreenInitOpen: do you have the correct -l setting? notationGet: called when currentNotation != NEWOTHEREden proc 'notationPushPop' not found: was eden.eden loaded correctly?unexpected end-of-file in /* */ comment.agentName config -text {current agent: expecting string, char or integer for virtual agentunexpected end-of-file in character constantunexpected end-of-file in string constantparameter with illegal type passed to C-lib function (got %s for parameter no %d)parameter with illegal type passed to C-lib function: (got %s for parameter no %d)VMOPER|DATSTK pushUNDEF VMOPER|DATSTK add VMOPER|DATSTK sub VMOPER|DATSTK mul VMOPER|DATSTK divide VMOPER|DATSTK mod VMOPER|DATSTK negate VMOPER|DATSTK lazy_not VMOPER|DATSTK not VMOPER|DATSTK concatopt VMOPER|DATSTK jmp VMOPER|DATSTK jpt jpt (loop construct)VMOPER|DATSTK jpf jpf (loop construct)VMOPER|DATSTK jpnt jpnt (loop construct)VMOPER|DATSTK jpnf jpnf (loop construct)VMOPER|DATSTK and VMOPER|DATSTK or VMOPER|DATSTK bitand VMOPER|DATSTK bitor VMOPER|DATSTK ddup VMOPER|DATSTK popd VMOPER|DATSTK pushint VMOPER|DATSTK constpush VMOPER|DATSTK cnv_2_bool VMOPER|DATSTK gt VMOPER|DATSTK lt VMOPER|DATSTK ge VMOPER|DATSTK le VMOPER|DATSTK eq VMOPER|DATSTK ne : CYCLIC DEF : ABORTEDVMOPER|DATSTK|SYMTBL assign '=':+='+=':-='-=':VMOPER|DATSTK|SYMTBL pre_inc ++ (pre-inc)'++':++ (post-inc)VMOPER|DATSTK|SYMTBL pre_dec -- (pre-dec)'--':-- (post-dec)VMOPER|MCSTAT noupdate VMOPER|MCSTAT resetupdate MCSTAT|VMEXEC|SYMTBL update ~VMOPER|DATSTK indexcalc indexing into list/stringHEAPAL|DATSTK makearr(%d) VMOPER|VMREAD makelist VMOPER|DATSTK concat VMOPER|DATSTK getvalue VMOPER|DATSTK sel VMOPER|DATSTK listsize VMOPER|DATSTK|SYMTBL shift VMOPER|DATSTK|SYMTBL append VMOPER|DATSTK|SYMTBL insert VMOPER|DATSTK|SYMTBL delete VMOPER|DATSTK query query (?)%s is%s /* current value of %s is */%c %s%s=%s ~> [, %sindex out of range (%d is outside the range %d...%d)type clash: expecting %s (in %s, got %s)type clash: expecting reference to variable (in %s, got %s)type clash: expecting reference to variable (in %s)type clash: number type required (got %s)division by zero (trying to calculate %d/0)division by zero (trying to calculate %f/0)division by zero (trying to calculate %d%%0)type clash on negation: number type required (got %s)type clash: lazy not: expecting %s (got %s)type clash: logical not: expecting %s (got %s)type clash on concatenation: expecting strings or lists (got %s and %s)type clash: eager logical and: expecting %s (got %s and %s)type clash: eager logical or: expecting %s (got %s and %s)type clash: bitwise and: expecting %s (got %s and %s)type clash: bitwise or: expecting %s (got %s and %s)type clash: convert integer to bool: expecting %s (got %s)VMOPER|DATSTK|VMREAD|VMEXEC switchcode VMOPER|VMREAD|DEFNET definition %s definition_runtimelhs (adding definition)VMOPER|VMREAD|DEFNET definition_runtimelhs %s %s %s is %s, not a read/write variableVMOPER|DATSTK|SYMTBL inc_asgn VMOPER|DATSTK|SYMTBL dec_asgn VMOPER|DATSTK|SYMTBL post_inc VMOPER|DATSTK|SYMTBL post_dec VMOPER|VMREAD|DATSTK addr: %s VMOPER|DATSTK|SYMTBL lookup_address: %s VMOPER|VMREAD|DATSTK localaddr: %d index error: list or string required (got %s, when trying to find item with index %d)index error: data isn't a list or string (when trying to find item with index %d)reference to undefined variable %s (turn these notices off with eden_notice_undef_reference=0;)zero sized list found in 'shift']; /* %s last changed by %s */ addID: id=* addID: id=%s addID: not adding id=%s IDlist nowrefer_to: sp=%s, Q=builtinC-funcReal-funcvar???string neededunknown data types = type(expr);i = int(expr);f = float(expr);c = char(expr);c = str(expr);9}O}|r}}}data = _type_convert(data, "type");:;<=>?[\]^_` ``@`  @ 0Gw^^}}}}W```````````````````````````````````4```WWK``^```````````````````````````````````````````&`4````````````````````````````WEvEEEEEEEEEEEEEEEEEEEEEEC.QEEEEEEEEEEEEEEEEEEEkɜߜ (ѠѠԠТТТТͦɧͦͦͦͦfͦئPͬ٬,d̴>ݲ3ڻ<<dааааааааܶ)llm{M׺M%X     I'=UkKYYYYYe~%u\lowerupperalnumasciicntrlgraphprintpunctspacewordxdigit3.9 02-Jan-2002\ at end of pattern\c at end of patternunknown POSIX class namenothing to repeatinvalid condition (?(0)missing )erroffset passed as NULLunknown option bit(s) setmissing ) after comment(?p must be followed by )malformed number after (?(assertion expected after (?(parentheses nested too deeplyregular expression too largefailed to get memoryunmatched parenthesesinternal error: code overflowunrecognized character follows \numbers out of order in {} quantifiernumber too big in {} quantifiermissing terminating ] for character classPOSIX collating elements are not supportedinvalid escape sequence in character classrange out of order in character classinternal error: unexpected repeatunrecognized character after (?<unrecognized character after (?conditional group contains more than two brancheslookbehind assertion is not fixed lengththis version of PCRE is not compiled with PCRE_UTF8 supportback reference to non-existent subpatternatan2log10powsinhcoshtanhfprintfsprintffopenfclosefseeksetbuftracesrandstdoutstderrcontext variable name too longchange_scope%s is [ OPENSHAPEx_xi_, &%sf_fi_ ]; InitDoNaLDViewport(); DoNaLDplot_pointplot_lineplot_arcplot_circleplot_rectangleplot_ellipseplot_labelplot_shapenSegmentnodesegment| %s %d Symbol Table :- Symbol Table End. .donald.t.text insert end { } } viewport.donald.t.text insert end {, .donald.t.text insert end { {\n" } master = }.donald.t.text insert end "cleanup donald.donald.t.text see insertF\f.donald.t.text insert end { }.donald.t.text insert end {viewport .donald.t.text insert end "within .donald.t.text insert end "}\n".donald.t.text insert end {AGENT .donald.t.text config -state normal.donald.t.text mark set insert 1.0.donald.t.text config -state disabled[ INF ] + - * % dotx(doty(dot1(dot2(dotrad(dotarg(cart(polar(line(rot(scale(vector_add(vector_sub(scalar_mult(scalar_div(scalar_mod(intersect(parallel(perpend(circle( && || ! between(colinear(intersects(separates(includes(distlarger(distsmaller(label(dist(midpoint( == != > >= < <= sqrt(asin(acos(atan(log(exp(float(incident(trans(ellipse(DD_random(arc( // rtos(?1?2?3?4?5?6rectangle(reflect(scalexy(inf mod div .x.y.1.2.rad.argpt_betwn_pts(trunc(rand(piitos(xf; free_treecopyTreefalseif then else ) ? @ \[\[]I!!(dumpdtree impose ", "("", image(print_tree is open2shape(define = ""; XDaXQ@@@@@@@@@@@@@@@@@@@@@@@@@a@@@@@@@@@@@@@@@@@@@@@@@@aQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XQ   %E]]F78e77FeFFeF7$0OAAAA9AAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAAAAAAAAAAAAAA AAAAUUUUUUol    U    [  6  x w0  J   impossible error occurs in %ssyntax errorundefined id: %sid list expectedredeclared identifier: %sundeclared identifier: %s%sstack overflow%sstack underflownot openshape or graph: %stype mismatchedINFXIFIXI_1FI_1IMAGEBOOLEANLABELGSPECGSPECLISTANYCIRCLEELLIPSEARCRECTANGLEGRAPHOFVIEWPORTWITHINTHENIMGFUNCCSTRINGBOOLINUMBERRNUMBERITOSRTOSTRUNCFLOATSQRTASINACOSATANLOGEXPRANDOMROTSCALESCALEXYTRANSREFLECTPARALLELPERPENDDISTANCEMIDPOINTPT_BETWN_PTSCOLINEARINTERSECTSSEPARATESINCLUDESINCIDENTDISTLARGERDISTSMALLERQUERYSEMICOLONEQUALSCOMMAATSIGNSTARPERCENTDIVMODTILDETILDE_SLASHDOTXDOTYDOTARGDOTRADDOT1DOT2UMINUSLIDAMPERSANDHASHVERTBARNEWLINELPARENRPARENLBRACKRBRACKLCURLYRCURLYLANGLERANGLEprogram_listwithin_idwithin_clausestmt_listdeclarationtype_nameevaluationexpr_listfunc1func2func3local_identifierlocal_idgraph_spec_listgraph_spec (context was reset)DoNaLD: %s%+eden %-eden autocalc = OFF; autocalc = ON; rnumber(%lf) cstring(%s) id list and expr list unmatched%s is not declared as a functionMNOPQRSTUVWXYZ[\|}`Owwwxxxyxxxxz{|||}}~~wxw$~y|znn {x{ns}t{s}tx}xn  MnMnMnJnJnN()&' qrqnr$QopsNtsYtqNrqNNroNpoNpoNNpoNpZ[\_^[QPORSVWTUX*op+oNpbcfged$Qop$Qop%op%opopoNpoNNp>!"#./0123456,-7=?9<8;:BCEHIiia$KKnLLLnLn "(-/269;=?ACEGIKMOQSUZ_dgkmqsuwy{}   #&),/4:>CHOXcjlnprtvxz|~ /14@prstuvwxyz{|}~  "#$%&'-./01234578:=>?@ABDFHJLNPRV]_`abcdefghijmopqrstuxz{|}~ *+012345! "./,-mndefghijklpyt{zxqrso|}u~vw   (812 9IH UVZYWX ]:"6&()KJLMPQNORCDEGF$%[^S7'#_\=;<B?@cT`>AabnLvwll]z^ik_`a btujox{~pzFFqrsGzm z     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKcd  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGyIJKcd efgh !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJKcd efgh !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJKcd efgh !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJKcd efgh !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJK  FGMNNK$$KMJMNoNoo NNoDEp$QIJKrnJropbcdefgynni]^_`abaaRNooooiOooJoqrsZ[\^_Lnbcdefgpsnny OPRSTUVWXZ[\^_bcdefgr\^_bcdefg   !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJQ[ainoqs  !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[ainoqst  !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[ainoqst  !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[ainoqs  !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[ainoqs !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[ainoqs !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[aiopqs !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[aiopqs !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIQ[ainoqs !$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI"Q[a#ioqsOPRSTUVWXZ[\^_bcdefgOPRSTUVWXZ[\^_bcdefgOPRSTUVWXZ[\^_bcdefgOPRSTUVWXtZ[\^_bcdefgNOPRSTUVWXtZ[\^_bcdefgOPRSTUVWXrZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPpRSTUVWXZ[\^_bcdefgOPnRSTUVWXZ[\^_bcdefgOPnRSTUVWXZ[\^_bcdefgNOPnRSTUVWXYZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgNOPRSTUVWXZ[\^_bcdefgOPRSTUVWXZ[\^_bcdefgPRSTUVWXZ[\^_bcdefgRSTUVWXZ[\^_bcdefgTUVWXZ[\^_bcdefgXZ[\^_bcdefg J  _r A gr cr fr or ir nr sr   ss yr qs r r r r ]t r r d d r r r r r < r |> r ) @t r r r r r r s s  s s s s !s s s  s %s )s -s 4s 8s >s Fs Ls N> Ts ]s es ns ws s s s s s s s s s s s s       S     s  9t s s s t t  t t t  t 't .t 3t 8t t ?t Ct Mt Rt Zt bt it pt wt ~t t t t t Y D 9 t t t t t  t t  t t u  u u u u  u 0u   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv)Gv\Bv | cBhh,.%}vGbF1P`ozOz 2 2 !%!L! 2Xx 2 2 ' = T k      !!!"'"="S"h"}"""L###($ 2~$$$$"%%%&#&E&g&&&&& 2&'C's''' (:(j((()/)^)))) *9*h****$+S++++ ,1,Y,,,,,'-W---- .B...... /!/7/M/c/x/////// 0#090O0d0y00000001 2%1L1{1 2 211 22G2v22r!!booleanimageitosopenshapept_betwn_ptsrealreflectscalexytruncwithin/donald.eden99!::7;;@;;=+BvAB<XB@A?AO?|?K<>y<=<>>>?+=+=9A@B @JAK@u@CDCCDCCCCCCCCCCCCCCCCCCCCCCCCGCCCCCCCCDDCCCCCCCCCCCCDGDVDeDCCCCCCCCCuDCCCCCCCCCCCCCCCCCCWCCCCCCCCCCgCCCCCCCCCCCCCCCCCCCCCCCC8DDDDDuEEDEEEEEEDEDDDDDDDDDD"E+E4EBEKEDWEDDDDDDDDDDDDDDDDDDDDDDDDDDeEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEDillegal use of `~'check.cW#SUWUWVYVpX#SZZXXpZpZZZ$XWWSS#SW[X0[#S#S#S#S#SeTeT#SKV{Y/YUYJXJXX#SXX YqVTTTT#S#S#S5U7TTTTTTTeTeTeTeTeTeTeTSS[Z[pXU#SUU%VU$UUVTUT[USSSSt[YZVSasami: %sOut:%s sasami_bgcolour_r=%d; sasami_bgcolour_g=%d; sasami_bgcolour_b=%d; sasami_viewport_xsize=%d; sasami_viewport_ysize=%d; sasami_show_axes=1; sasami_show_axes=0; _sasami_vertex_%d_x is %s; _sasami_vertex_%d_y is %s; _sasami_vertex_%d_z is %s; _sasami_vertex_%d_z=0; Syntax : material %*s %s "%[^"]%*s %s %sload_objload_full_objpolygonSyntax : polygon _sasami_poly_%d_colour_a=1; objectlightSyntax : light dump_verticesdump_polysdump_objectsdump_materialsdump_lightsopen_displayclose_displaysasami_bgcolour_r is %s; sasami_bgcolour_g is %s; sasami_bgcolour_b is %s; sasami_viewport_xsize is %s; sasami_viewport_ysize is %s; Unknown commandUnable to open MTL file '%s'! %s newmtl newmtl %s %s_mat_%s=%d; map_kd map_kd %s kd %s %s %s ksillumUnable to open obj file '%s'!mtllibusemtl%s_%s=%d; vertex %s_v_%d %s %s %s vnvtvertex %s_vt_%d %s (1-%s) %s polygon %s_p_%d %d/%d/%*d %d//%*d object_poly %s_%s %s_p_%d Input string too long! -------------------- Sasami closing down! -------------------- -------------------- Sasami initialising! -------------------- proc _sasami_bgcolour_mon : sasami_bgcolour_r,sasami_bgcolour_g,sasami_bgcolour_b { sasami_set_bgcolour(sasami_bgcolour_r,sasami_bgcolour_g,sasami_bgcolour_b); }; sasami_viewport_bpp is int(tcl("winfo depth .")); proc _sasami_viewport_mon : sasami_viewport_xsize,sasami_viewport_ysize { sasami_viewport(sasami_viewport_xsize,sasami_viewport_ysize); }; proc _sasami_showaxes_mon : sasami_show_axes { sasami_setshowaxes(sasami_show_axes); }; proc _sasami_vertex_mon_%d : _sasami_vertex_%d_x,_sasami_vertex_%d_y,_sasami_vertex_%d_z { sasami_vertex(%d,_sasami_vertex_%d_x,_sasami_vertex_%d_y,_sasami_vertex_%d_z); }; Syntax : vertex [z]_sasami_material_%d_ambient_r is %s; _sasami_material_%d_ambient_g is %s; _sasami_material_%d_ambient_b is %s; _sasami_material_%d_ambient_a is %s; _sasami_material_%d_ambient_a=1; proc _sasami_material_%d_ambient_mon : _sasami_material_%d_ambient_r,_sasami_material_%d_ambient_g,_sasami_material_%d_ambient_b,_sasami_material_%d_ambient_a { sasami_material_ambient(%s,_sasami_material_%d_ambient_r,_sasami_material_%d_ambient_g,_sasami_material_%d_ambient_b,_sasami_material_%d_ambient_a); }; Syntax : material_ambient [a]_sasami_material_%d_diffuse_r is %s; _sasami_material_%d_diffuse_g is %s; _sasami_material_%d_diffuse_b is %s; _sasami_material_%d_diffuse_a is %s; _sasami_material_%d_diffuse_a=1; proc _sasami_material_%d_diffuse_mon : _sasami_material_%d_diffuse_r,_sasami_material_%d_diffuse_g,_sasami_material_%d_diffuse_b,_sasami_material_%d_diffuse_a { sasami_material_diffuse(%s,_sasami_material_%d_diffuse_r,_sasami_material_%d_diffuse_g,_sasami_material_%d_diffuse_b,_sasami_material_%d_diffuse_a); }; Syntax : material_diffuse [a]_sasami_material_%d_specular_r is %s; _sasami_material_%d_specular_g is %s; _sasami_material_%d_specular_b is %s; _sasami_material_%d_specular_a is %s; _sasami_material_%d_specular_a=1; proc _sasami_material_%d_specular_mon : _sasami_material_%d_specular_r,_sasami_material_%d_specular_g,_sasami_material_%d_specular_b,_sasami_material_%d_specular_a { sasami_material_specular(%s,_sasami_material_%d_specular_r,_sasami_material_%d_specular_g,_sasami_material_%d_specular_b,_sasami_material_%d_specular_a); }; Syntax : material_specular [a]_sasami_material_%d_texture is "%s"; proc _sasami_material_%d_texture_mon : _sasami_material_%d_texture { sasami_material_texture(%s,_sasami_material_%d_texture); }; _sasami_material_%d_texture is %s; Syntax : material_texture ("" or )Syntax : load_obj ""Syntax : load_full_obj ""_sasami_poly_geom_vertex_%d is %s; proc _sasami_poly_geom_vertex_%d_mon : _sasami_poly_geom_vertex_%d { sasami_poly_geom_vertex(%s,%d,_sasami_poly_geom_vertex_%d); }; Syntax : poly_geom_vertex _sasami_poly_tex_vertex_%d is %s; proc _sasami_poly_tex_vertex_%d_mon : _sasami_poly_tex_vertex_%d { sasami_poly_tex_vertex(%s,%d,_sasami_poly_tex_vertex_%d); }; Syntax : poly_tex_vertex _sasami_poly_%d_colour_r is %s; _sasami_poly_%d_colour_g is %s; _sasami_poly_%d_colour_b is %s; _sasami_poly_%d_colour_a is %s; proc _sasami_poly_%d_colour_mon : _sasami_poly_%d_colour_r,_sasami_poly_%d_colour_g,_sasami_poly_%d_colour_b,_sasami_poly_%d_colour_a { sasami_poly_colour(%s,_sasami_poly_%d_colour_r,_sasami_poly_%d_colour_g,_sasami_poly_%d_colour_b,_sasami_poly_%d_colour_a); }; Syntax : poly_colour [a]_sasami_poly_%d_material is %s; proc _sasami_poly_%d_material_mon : _sasami_poly_%d_material { sasami_poly_material(%s,_sasami_poly_%d_material); }; Syntax : poly_material Syntax : object _sasami_object_poly_%d is %s; proc _sasami_object_poly_%d_mon : _sasami_object_poly_%d { sasami_object_poly(%s,%d,_sasami_object_poly_%d); }; Syntax : object_poly _sasami_object_%d_pos_x is %s; _sasami_object_%d_pos_y is %s; _sasami_object_%d_pos_z is %s; proc _sasami_object_%d_pos_mon : _sasami_object_%d_pos_x,_sasami_object_%d_pos_y,_sasami_object_%d_pos_z { sasami_object_pos(%s,_sasami_object_%d_pos_x,_sasami_object_%d_pos_y,_sasami_object_%d_pos_z); }; Syntax : object_pos _sasami_object_%d_rot_x is %s; _sasami_object_%d_rot_y is %s; _sasami_object_%d_rot_z is %s; proc _sasami_object_%d_rot_mon : _sasami_object_%d_rot_x,_sasami_object_%d_rot_y,_sasami_object_%d_rot_z { sasami_object_rot(%s,_sasami_object_%d_rot_x,_sasami_object_%d_rot_y,_sasami_object_%d_rot_z); }; Syntax : object_rot _sasami_object_%d_scale_x is %s; _sasami_object_%d_scale_y is %s; _sasami_object_%d_scale_z is %s; proc _sasami_object_%d_scale_mon : _sasami_object_%d_scale_x,_sasami_object_%d_scale_y,_sasami_object_%d_scale_z { sasami_object_scale(%s,_sasami_object_%d_scale_x,_sasami_object_%d_scale_y,_sasami_object_%d_scale_z); }; Syntax : object_scale _sasami_object_%d_visible is %s; proc _sasami_object_%d_visible_mon : _sasami_object_%d_visible { sasami_object_visible(%s,_sasami_object_%d_visible); }; Syntax : object_visible (e=0 to make invisible, 1 to make visible) _sasami_light_%d_pos_x is %s; _sasami_light_%d_pos_y is %s; _sasami_light_%d_pos_z is %s; proc _sasami_light_%d_pos_mon : _sasami_light_%d_pos_x,_sasami_light_%d_pos_y,_sasami_light_%d_pos_z { sasami_light_pos(%s,_sasami_light_%d_pos_x,_sasami_light_%d_pos_y,_sasami_light_%d_pos_z); }; Syntax : light_pos _sasami_light_%d_ambient_r is %s; _sasami_light_%d_ambient_g is %s; _sasami_light_%d_ambient_b is %s; _sasami_light_%d_ambient_a is %s; _sasami_light_%d_ambient_a=1; proc _sasami_light_%d_ambient_mon : _sasami_light_%d_ambient_r,_sasami_light_%d_ambient_g,_sasami_light_%d_ambient_b,_sasami_light_%d_ambient_a { sasami_light_ambient(%s,_sasami_light_%d_ambient_r,_sasami_light_%d_ambient_g,_sasami_light_%d_ambient_b,_sasami_light_%d_ambient_a); }; Syntax : light_ambient [a]_sasami_light_%d_diffuse_r is %s; _sasami_light_%d_diffuse_g is %s; _sasami_light_%d_diffuse_b is %s; _sasami_light_%d_diffuse_a is %s; _sasami_light_%d_diffuse_a=1; proc _sasami_light_%d_diffuse_mon : _sasami_light_%d_diffuse_r,_sasami_light_%d_diffuse_g,_sasami_light_%d_diffuse_b,_sasami_light_%d_diffuse_a { sasami_light_diffuse(%s,_sasami_light_%d_diffuse_r,_sasami_light_%d_diffuse_g,_sasami_light_%d_diffuse_b,_sasami_light_%d_diffuse_a); }; Syntax : light_diffuse [a]_sasami_light_%d_specular_r is %s; _sasami_light_%d_specular_g is %s; _sasami_light_%d_specular_b is %s; _sasami_light_%d_specular_a is %s; _sasami_light_%d_specular_a=1; proc _sasami_light_%d_specular_mon : _sasami_light_%d_specular_r,_sasami_light_%d_specular_g,_sasami_light_%d_specular_b,_sasami_light_%d_specular_a { sasami_light_specular(%s,_sasami_light_%d_specular_r,_sasami_light_%d_specular_g,_sasami_light_%d_specular_b,_sasami_light_%d_specular_a); }; Syntax : light_specular [a]_sasami_light_%d_enabled is %s; proc _sasami_light_%d_enabled_mon : _sasami_light_%d_enabled { sasami_light_enabled(%s,_sasami_light_%d_enabled); }; Syntax : light_enabled (e=0 to disable, 1 to enable) _sasami_light_%d_directional is %s; proc _sasami_light_%d_directional_mon : _sasami_light_%d_directional { sasami_light_directional(%s,_sasami_light_%d_directional); }; Syntax : light_directional (d=0 for positional, 1 for directional) _sasami_light_%d_attenuation is %s; proc _sasami_light_%d_attenuation_mon : _sasami_light_%d_attenuation { sasami_light_attenuation(%s,_sasami_light_%d_attenuation); }; Syntax : light_attenuation Syntax : set_bgcolour Syntax : viewport Got material name '%s', assigned id %d MTL file error - could not get material name!material_texture %s_mat_%s "%s" MTL file error - could not get texture filename!material_diffuse %s_mat_%s %s %s %s MTL file error - could not get diffuse colour!MTL file error - unknown command '%s'Obj file error - could not get MTL filename!Could not find declaration of material!Found material name '%s', retrieved id %d Obj file error - could not get USEMTL material name!Obj file error - could not get object name!Obj file error - could not get vertex co-ordinates!Obj file error - could not get texture vertex co-ordinates!Unable to locate vertex for face!poly_geom_vertex %s_p_%d %s_v_%d Unable to locate texture vertex for face!poly_tex_vertex %s_p_%d %s_vt_%d poly_material %s_p_%d %s_mat_%s Obj file error - polygon data with no object!Obj file error - could not get polygon data!Obj file error - unknown command '%s' A$@?structures.cvUID >= 1400000000vUID <= (1900000000-1)foundvuid == vuid--- Vertex list ---Vertex %d : (%g,%g,%g) pUID >= 1900000000foundpuid == puid--- Poly list ---Poly %d : Geometry : Vertex %d (link UID %d) Texture co-ordinates :--- Object list ---Object %d : Polys : Poly %d (link UID %d) No objects to list.--- Material list ---Material %d : Ambient : %g,%g,%g Diffuse : %g,%g,%g Specular : %g,%g,%g No textureTexture file : "%s" ---------------------No materials to list.--- light list ---light %d : EnabledDisabledDirectionalPositionalPosition : %g,%g,%g Attenuation : %g No lights to list.sa_getUID: exceeded limit for number of identifiers for Sasami general data, presently %d -- please ask for GENUIDEND to be increasedsa_getvertexUID: exceeded limit for number of identifiers for Sasami vertex data, presently %d -- please ask for VERTEXINFOUIDSTART to be modifiedsa_getpolyUID: exceeded limit for number of identifiers for Sasami polygon data, presently %d -- please ask for POLYINFOUIDSTART to be modifiedResizing vertexinfostore from %d items to %d items Resizing polyinfostore from %d items to %d items sa_index_from_vUIDsa_findvertexsa_index_from_pUIDsa_findpoly?ffffff?Togl_Init error %d setXrotsetYrotsetZrotsasami_getXrotsasami_getYrotsasami_getZrotsetXpossetYpossetZpossasami_getXpossasami_getYpossasami_getZpossetXscalesetYscalesetZscalesasami_getXscalesasami_getYscalesasami_getZscalesetRotThenTranssasami_getRotThenTranssetFrustumLeftsetFrustumRightsetFrustumTopsetFrustumBottomsetFrustumNearsetFrustumFarsasami_getFrustumLeftsasami_getFrustumRightsasami_getFrustumTopsasami_getFrustumBottomsasami_getFrustumNearsasami_getFrustumFar/sasami.edensasamiWindowClosesasamiWindow %d %dOpenGL driver : Vendor : %s Version : %s Renderer : %s Extensions : %s Max lights : %d Loading texture file '%s' sa_r_render: wrong # args: should be "pathName setRotThenTrans pos"wrong # args: should be "pathName setFrustumFar pos"Sasami: Unable to generate texture binding! Sasami: unable to load texture file `%s`Successfully loaded %s: size=%i,%i depth=%i alpha=%i %d usec since last render (= effectively %Lf fps) first render -- no timings available wrong # args: should be "pathName setXrot pos"wrong # args: should be "pathName setYrot pos"wrong # args: should be "pathName setZrot pos"wrong # args: should be "pathName setXpos pos"wrong # args: should be "pathName setYpos pos"wrong # args: should be "pathName setZpos pos"wrong # args: should be "pathName setXscale pos"wrong # args: should be "pathName setYscale pos"wrong # args: should be "pathName setZscale pos"wrong # args: should be "pathName setFrustumLeft pos"wrong # args: should be "pathName setFrustumRight pos"wrong # args: should be "pathName setFrustumTop pos"wrong # args: should be "pathName setFrustumBottom pos"wrong # args: should be "pathName setFrustumNear pos"$tI-heightHeight400-widthWidth-setgridsetGridSetGrid-rgbaRgba-redsize-greensize-bluesize-doubleDouble-depthDepth-depthsizeDepthSize-accumAccum-accumredsizeAccumRedSize-accumgreensizeAccumGreenSize-accumbluesizeAccumBlueSize-accumalphasizeAccumAlphaSize-alphaAlpha-alphasize-stencilStencil-stencilsizeStencilSize-auxbuffersAuxBuffers-privatecmapprivateCmapPrivateCmap-overlayOverlay-stereoStereo-cursorCursor-timeTime-sharelistShareList-sharecontextShareContext-identIdent-indirectIndirect-pixelformatpixelFormatPixelFormat1.7Togltogltogl.cshareWith != ((void *)0)Togl: couldn't get visualMesa_HP_RGB_SMOOTH_MAP_LISTSorry, overlay was disabled8x139x15fixed ?options?"configure-extensionsrenderswapbuffersmakecurrentCould not allocate fontwrong # argsunloadbitmapfontTry: configure or render Togl: Unknown option: %%!PS-Adobe-2.0 EPSF-1.2 %%%%BoundingBox: 0 0 %d %d %%%%EndComments %02x %% %%%%EndPreview gsave /bwproc { rgbproc 5 -1 roll { { 2 1 roll } ifelse } forall pop pop pop /colorimage { pop /rgbproc exch def { bwproc } image } def } if /picstr %d string def %d %d scale %d %d %d [%d 0 0 %d 0 0] false %d colorimage %02hxgrestore Togl_CreateWindowTogl_LoadBitmapFontTogl: X server has no OpenGL GLX extensionshareWith->GlCtx != ((void *)0)Togl: couldn't choose pixel formatcould not create rendering contextwrong # args: should be "pathName read filename"Couldn't configure togl widget Error: Togl_AllocColor illegal in RGBA mode. Error: Togl_FreeColor illegal with private colormap Error: Togl_SetColor requires a private colormap -adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1-adobe-helvetica-medium-r-normal--10-100-75-75-p-57-iso8859-1-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1or one of the user-defined commands: %%%%Creator: OpenGL pixmap render output %%%%BeginPreview: %d %d %d %d %% dup length 3 idiv string 0 3 0 add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } systemdict /colorimage known not { {currentfile picstr readhexstring pop} G333333?zG?)\(?_@VIEWING_GAMMA1.2.8rb@= h   S!!Tcl: eden: wrong # of arguments - expecting 1, got %dTcl: todo: wrong # of arguments - expecting 1, got %dTcl: evaluate: wrong # of arguments - expecting 1, got %dTcl: refresh: wrong # of arguments - expecting 1, got %dTcl error (Tcl_GlobalEvalEC): %s%s: Tcl error whilst evaluating %s Tcl errorInfo (from EXinit): %s userinterfaceinputcan't forkstarting new EDEN process... can't execstopping old EDEN process... Tcl_EvalEC("%s") Tcl error (Tcl_EvalEC): %sTcl_GlobalEvalEC("%s") quitrefreshgotodumpedendumpscoutdumpdonaldsetupViewOptionsinterruptrestarttcl_interactiveTcl_AppInit failed: %s DISPLAY_tkeden_version_eden_svnversion_tkeden_variant_tkeden_web_site_tkeden_sasamiAvail_tkeden_win32_version_tkeden_appleEnter EDEN statements:Enter statements:Enter Sasami statements:Enter SCOUT statements:.prompt config -text {set notation {%donald %scout %sasami Enter DoNaLD statements (in context can't redeclare %s %s to %s I_%s is %.1frowcolumn\\\"unknown operatorI_%sformbox(textbox([%d, [[0,0,100,100]]""[0,0,100,100]"pict1"DFxminDFyminDFxmaxDFymaxDFbgcolorDFfgcolorDFborderDFalignDFsensitiveDFbdcolorDFfontDFrelief, "%s"; proc %s {}; proc %s_mouseButtonPress : %s_mouse, %s_mouseClick { %s_mouse_1, %s_mouseClick { if (%s_mouseClick) { %s(); }; proc %s_change {} %s_change(); }; proc %s_setText { currText = $1; ; proc %s_getText { return %s_TEXT_1; strcat((()#)substr(boxshift(boxop(, BOXINTERSECT), BOXCENTRE), BOXENCLOSING), BOXREDUCE)dotnedotnwdotsedotswdotndotedotsdotwdotint(91112141617I_%s_temp%dapp(del(pt_add(pt_subtract() / (int(cleanup scout.scout.t.text see insertproc P_%s : I_%s, %s { ShowImage(&I_%s, &%s); } %s_mouseClick = FALSE; ; proc %s_textCHANGE : %s_TEXT_1 { tcl("$%s_boxName delete 1.0 end"); if ($1!=@) { tcl("$%s_boxName insert end \""//$1//"\""); %s_TEXT_1 = currText; } }.scout.t.text mark set insert 1.0V6@???5XXYXWX?????????????^XY??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????xWVV????????????????????????????VVVVVVV?LVUU%YUNMM\MIMMLL0LKK(KJxJ JIpIIHhHHG`GGFFFFFFSFFE.EDVDCdCCoBA??????AA|ASA*AA@@n@error !!!boxframewindowEXPANDNOADJLEFTRIGHT%g.r{ type: TEXTDONALDARCATEXTBOXUNKNOWN %s: pict relief: alignment: %s sensitive: ONstrlen(centre(enclose(reduce(.%salignment%s(append(delete( & %% endifUnknown operator!%s %s = %s %s; gh hhgggggBhWhPh7hIhCi2sh{khkssstOthhhhhhhhhhhhhhihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhkiiiihhhhhhhhhhhhhhhhhhhhhhhhhhhjjjjjjjjj-jjj{kkAlul mjmmmmBnXnnnnnno1oJoco|oooooop+pDp]pvpppppq'qIqkqqq!rhhhhhhuZuuvttt!urs?yfyyyvscoutDefnW{{zz{ |@|w|||zzzzzzzzzzzzz }Q}zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz~}}U~zzzzzzzzzzzzzzzzzzzzzzzzzzzz~z~z~z~z~z~z~z~z~~~L}Uǁ S߂%k=ɄU'm?ˇWWzzzzzz|$\ȍ4S*;#$F{|}~g )$J{{|||||}}}}}}}}~~~~~~~~~~~~~~~~~|{|q}~q q q qqqqqq#^q ^q"^q ^q$^q ^q%^q^q&^q^q'^q^q(^q(p^(q^q*^q^qr"#$%&'()*s!qsq"#$%&'()*"32tru1trru5tu7:@ABD?WXYZ mn#ghijkabcdefabcdefabcdef_`htu4tuo;<=>WXYZ$vrwghGHIJKLMNWXYZ%xryxrryo8OtrruPtruQtruRtruStruWXYZr&tu6TtrruUtrupWXYZ'vwoWXYZrzz zzzzzzzzzzzz zzzj(ceTtrruUtrupWXYZ*[tru\trru  $(,05;@FKQV\aglrw} "&*.26:>BFJNRVZ^bfjmqvz} !%-/37?ADHLPTX\`dhlptx| #%./89BCLMVW`aoxy !#$%),-023456789:;<=>?@BEGJLMOQSWY\#$%&'()*+!!!!!!!!./0123456 78EFIly,-"=>C?@ABcGHpqrstuvw}ghij 9dUVWXYZabOPQRSTJKLMN[\]^_`nof|<emz:Dkx{;~f4m[\Yhfi&(*,.02Zjklm[\3tu\45]^n_nco[\6dopqrstu7v`a8ffccw9`aHIx yfz:c;f9:;<=Jdffffff>@LYqmN[\]^_`abZP[\eRfGr]^T_DEtVvfXfKIxfffffyMI`abcqdre%')+-/1OIfQI  SIUIWI7f?Af 6NOPQRSTUVWXYZ 5 !c8"kzdu#$HIJKLM%&'()* +,u-|}~./01 luuuusw{Gklm[\opqrstucyzYhiZjklm[\]^n_ !" opqrstuv clm[\w<=>?@ABCDExyzopqrstucdz23BfCghijpF356783X336&'(33Z3753Jq 3N3P6R8T36P8p NRc"#$%&'(^TU(W^*^12Y45rYzcZuuxrr'(6uq^YqtzvqYOPQRSTU^WTU^WIp[\YcopYchY^Z32TUeWqrtjvxppqpc^opp^vYabcdef^oprgh^GHIJKLMN"Ygh^'(Z^oprr129^5rghugh^ !"#^%qqr"*+,-gh^1V#qrTUqWabcdefghBtDcLqoBpDrghijkBmnBqpvrGpbr3 fghiqrtfgovwxytJfghfprtqr6qrqrt3ttijkmnqropYoptabcdefghYpqotabcdefttpqtpqmnghtq(qttqzqq7z:q?@ABDzz7zz:zz?@ABYDzz zzBz&'()zzzz.30"#$%&'(r*rrrrrpYBYuZFGfghijuuuZ!uu%*+,-1$%&'(nqrBabcdefghqsoyOPQRSTUWoc`abcdefghijkmntvx  "#$%&'(GHIJKLMN1245"#$%&'()* OPQRSTUW"#$%&'(*c%&'(h!"#$%&'()*tv x OPQRSTUW_`abcdfghickmnqstvx678:;<=>?@ABD_`abcdefghijkmnYryw_`abcdefghijkmnXw_`abcdefghijkXmn_`abcdefghijkmn_`abcdefghijkmnXu_`abcdefghijkXmn_`abcdefghijkXmn_`abcdefghijkXmn_`abcdefghijkXmn_`abcdefghijkmn_`abcdefghijkmnu_`abcdefghijkmnu_`abcdefghijkmnu_`abcdefghijkmnu_`abcdefghijkmnu_`abcdefghijkmn u Y_`abcdefghijkZmn_`abcdefghijkmn_`abcdefghijkmnr_`abcdefghijkmnr_`abcdefghijkmnr_`abcdefghijkmnr_`abcdefghijkmnr_`abcdefghijkmnr_`abcdefghijkmnr_`abcdefghijkmnq_`abcdefghijkmnq_`abcdefghijkmn678:;<=>?@ABDabcdefghijkmncdefghijkmn J  d= r < < < <  < r  qs B= J= < , sr = = = = = = = = = = = >  > = < < =  = = = != (=  0= 7= >=  F= P= X= a= h= o= v= }= = = = = = = = = = = = = = = = >  > > > "> (> .> 3> 8> => B> K> X> b> o> . < r |> r ) y> > > > Z     _t  ;s S vr      8t > > >  % V o  ! - 1   ) 5 > t  > > > > > > > > > > ? ? ? #? /? kptuigrhojzq^sxyvw  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_`abcdeflmn /@Qaw| ) ))!&; Hps?@AB'E(H,I,=COPXY[^efoprwxyz@1Ppsl        g{N)Am Wcc111FFFFFF: )::::::*fyM) )x  #:@@ɖA@@@'u[×ݗ9vʿ9d #t˪NVҩ#xХfQv)P.ި>fvvvvvvvvv5]ħͫHqì@_~Э+^Į*]ï)\°(['ZDmɳD'Zյ'PyRַP vtϹ!rٺ-U~\.}#@Kgλ">ZvܼV:ROWCOLUMNCONTENTJUSTINTEGERHONESTWINDOWALLSTRVARINTVARPTVARBOXVARFRAMEVARWINVARDISPVARIMGVARFORMPTFORMBOXFORMFRAMEFORMWINFORMDISPSUBSTRSTRCATCONCATSTRLENTOSTRINGDOTFRAMEDOTSTRDOTBOXDOTTYPEDOTPICTDOTXMINDOTYMINDOTXMAXDOTYMAXDOTFONTDOTBGDOTFGDOTBDCOLORDOTBORDERDOTBDTYPEDOTALIGNDOTSENSITIVEDOTNEDOTNWDOTSEDOTSWDOTNDOTEDOTSDOTWBOXSHIFTBOXINTERSECTBOXCENTREBOXENCLOSINGBOXREDUCEENDIFImageFileImageScaleERRORDOTRDOTC'.'statementvar_listenquiryvar_namestr_exppoint_expbox_expbox_listframe_expwin_expwin_field_listwin_fieldwin_listdisplay_expimage_expSCOUT: %syyerror: %s bdcolourbordercolorbordercolourfgcolourallcentreenclosereducestrlenscreen/scout.edenA)u,YH^l E k x    tH8ȉ  DA P< 0o|ooNE @ ʳڳ *:JZjzʴڴ *:JZjzʵڵ *:JZjzʶڶ *:JZjzʷڷ *:JZjzʸڸ *:JZjzʹڹ *:JZjzʺں *:JZjzʻڻ *:JZjzʼڼ *:JZjzʽڽ *:JZjzʾھ *:JZjzʿڿ *:JZjz *:JZjz *:JZjz *:JZjz *:J @  E E E E E E o r {R 0BW B_ Cg Ct P( @) & ' 0r s u n Pp p E 8" ?) 91 PAR px8 y9 zl { ?  >M ?U P\[  ?b o { `I F H K pX [J p]      0 ` 0` @b c h  j l n$ u- p}8 ^? 0_F pMP ]V ) +^ @+d +i P,q ,w  -} .| / 0 1 p3 5 p  Ѓ  @ `   " P$ 0   P 5 ЮL P_ `t     о `  ` p( A Y  j      @  0& `&@I @I  B )B )t8 *x8 P+B `,8 -8 p.8 /8 ]8 08 058 58  68 68 `7 8 98 <8 `<8 (8 <8 =8 > ?IC @ B> 0C8 `Dj  E8 E F8 G 9 0I9 `K9 M$9 N,9 PP59 Q=9 PSF9 TO9 Uo9  V[9 Vj9 `Yt9 Y~9 \9 p_9 a9 bf c9  e^f f9 i9 j9  :9 ;9 9 `9 9 9 0% K K K K  hR W _ 9 g t          " ) 1 R 8 9 l  ?  M @ @ A A A (A 4A :A O ?A CA JA PA VA dA tA A A A U [ b o {     J               $ - 8 ? F P V  ^ d i q w } |     a     A  A  A A Pe A e (e 4e e A  8 9 A A A A A A B B B &B 2B 7B @B KB FB PB EB JB OB TB 5? XB Ce aB kB pB uB zB B B B B /  B B B B B B B B            bf n r t +C K _ $0C 6C    ^ d  ?C DC f  9 !^f "9 #R  LC QC  & , *8 69 :9 .9 /+=(++7-=)--8//4==0!=1~>'>=2<=3&&-||+O O O O O : 9 8 l % &   R LC QC  R  R  R R R   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~>~~x _ _ ` `  ` 0` ` ` ` $` *` /` @B FB KB 4PB EB 4JB DOB &d 5? TB ,d 2d 6d ;d Ժ@d TEd TMd a4  ĶUd [d bd hd od 09  ud T SetGraph("%s","%s"); %s_viewport = "%s"; A%s = NullStr; %s = @; forget("%s"); forget("P%s"); A%s = @; forget("A%s"); forget("P%s"); dd_delete(&%s,&%s,&A%s); proc P%s:%s, A%s, %s { %s(%s, &%s, &A%s); } g  g g g g J g g g g g g g h h h h h i Wj 9j !h -h 9h Fh Rh i i !^h ih sh |h h h h )h h h h h h h h 234h h h h h i i  i i $i i i #i )i .i O 3i :i Di Ki Ti _i A di  ii oi ri ui xi {i ~i UVWi XYZi i i )i  g g g i i q J i i i i i i h h K Wj 9j g g g i i i i !^h ih sh |h h h  )i h h h h h h h 234h h h h h i i  i i $i i i #i )i .i i 3i :i Di Ki i Ji di i ii d d d i i i Ui V Wi XYZi i i , K q q 9q q u q q r "r 4r Or u   JB 1 Ne EB 0OB 2  l  (e A AKB .9 2B >B F&B GB \Ce  !5? 4 j %9 +`    XB EB Di 8  A ;A B (Pe e TB 37B ?B ]8 Of   MA <A =i  e  @ 5  4e  :/ 6kB ) 7' 8B C[e FB -@B ,PB /  A 9s& %/ *e 5 ?qNrS333?333?333??fff?fff?fff??L?L?L??333333333?333??@$@??            s$! " ' s& 0, -  i 45 6  i 8@ A  i <J K R  j @Y Z `  j Df g q i H{ |   j L   i P   i T   i X   i \    j `   i d    j h' ( 4 i l@ A L s|W d p  j p| }   j t    j x   i    i (         i     j    s  @0>>   w CO @P? @ > >2 AY? @e? @ 6: fJ( ?r? ? = 4 Ij E F 8 e` BK KAC GC D% 5 HR 7 L ; 9 < :> Y> Zw {? 9 RO P?   2 Y? e?   ? O9 S  W? P X( r?     U Y&  A N 3  e    ? Q` C f M" 0%  ? 2 / VR       [>  JA  sr PA  CA  ?A O    GCC: (GNU) 4.0.3 (Debian 4.0.3-1)GCC: (GNU) 4.0.3 (Debian 4.0.3-1)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 (Debian 4.0.3-1)GCC: (GNU) 4.0.3 (Debian 4.0.3-1)GCC: (GNU) 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)GCC: (GNU) 4.0.3 (Debian 4.0.3-1)`", t $|" *P&8@,wP.@%OpP!JL{mT w UU>P" 0x@!'50O4g.6"AO^_G({/3x0SP&\ v 1h 7:' a'g [-z[3 3@[ $M!zy_IO_stdin_usedMp wouldBlock notationTypeToString popEntryStack popMasterStack4 clearMasterStackH topMasterStack errorComplete appendHist% errorf errorContentf warningfP warning noticef pushMasterStack pushEntryStackclearEntryStack(topEntryStack@yyerroreeden_interrupt_handlerControl_Cqueue/eden_init`terminaterun_initrunswapAndRunRunSetuser_tracesetLibLocationOprintUsagebprintVersionvinit_edenmainemalloc_perealloc_plibLocationprognamestartstartValidgargvgargcautocalc+eden_error_index_range=eden_notice_undef_referenceOeden_backticks_dependency_hackainterruptedsstartupargcstartupargvstartupcwdprocessingRunSetInput_DevicesInp_DevInp_Dev_SaveRS1RS2+TopEntryStackZinitRunSetrmActionclearRunSetgetAction)addActionrdeleteActionWithTokendeleteAllTokenActionsKprintRunSetemalloc_perealloc_p SEARCH_symptr8DELETE_symptr_ATOMjMOVE_symptr_Qhashindexlookup installwSEARCH_entryDELETE_entry_ATOMMOVE_entry_Q1search_localiadd_local_variableinsert_level_markerinit_LocalVarList delete_local_levelL printlocals local_declare lookup_local dispatch0 patch0 emalloc_pB erealloc_pk hashtable} break_q cont_q*jJmarkGarbagezunmarkGarbageincGarbageLeveldecGarbageLevelclearGarbage defnonly0setyyparseinitWyyparsej emalloc_p| erealloc_p!yychar3yylvalEyynerrsWyydebugH87>usage debug timerhandlercreatetimerdeletetimer@deletealltimersTinpdevlinenozinpdevname_eden_internal_dirname_eden_internal_basename:_eden_internal_cwd_eden_internal_cdgettime>inttimeufinetimef_eofget_charGfget_charfile_statget_stringqfget_stringunget_charscan_fsfscan_fsscan_f9substrsublist$printvprintstdoutb_writewritelnnameof*scat|lcatb_exitexec_string6exec_fileapply symboldetail`symboltextsymbolssymtbl2listprinthashtkdefineDatumbtkdefineisUserDefinedisNotYetDefined{viewOptionsforget packB arrayv user_error touch get_environ put_environ!error_no?!backgnd!pipe_processI"ipopen+#ipclosep#fdready$rawread8%rawwrite%rawserialopen%rawserialclose&rawserialreadl&usbhidopen&usbhidreadL'usbhidclosep'regmatch\(newStringBuf(reallocStringBuf)freeStringBuf+)replaceRefs)regreplace)+todo=+get_msgqQ+send_messagee+receive_messagey+remove_msgq+realrand+E_Disp2PS+E_StringRemain+E_tcl -init_ScoutScreenList3-search_ScoutScreenQk-add_ScoutScreen-DisplayScreen0ed_sasami_vertex0ed_sasami_set_bgcolour1ed_sasami_poly_geom_vertexS1ed_sasami_poly_tex_vertex1ed_sasami_object_poly1ed_sasami_poly_colour(2ed_sasami_poly_materialK2ed_sasami_object_pos2ed_sasami_object_rot2ed_sasami_object_scale 3ed_sasami_viewportM3ed_sasami_setshowaxesp3ed_sasami_material_ambient3ed_sasami_material_diffuse4ed_sasami_material_speculari4ed_sasami_material_texture4ed_sasami_light_pos4ed_sasami_light_ambientN5ed_sasami_light_diffuse5ed_sasami_light_specular5ed_sasami_light_enabled6ed_sasami_light_directional6ed_sasami_light_attenuationK6ed_sasami_object_visible 7PlotShape2:dumpeden<Debug<emalloc_p<erealloc_p1=blibtbl=pqtlisthead=Input_Devices#>WidgetMap,w\reset_compiler_statusinitcode-stack_overflow_err@stack_underflow_erropushpopdisAssexecuteJret_callochange_targetschange_sourcesrelated_by_code%code`codeswitchaddentrysaveprogR push_text savetext code_definitionm code_definition_runtimelhs evalDatum\ code_related_by code_related_by_runtimelhs call evalS related_by_code_runtimelhs code_evalemalloc_perealloc_pUndefDatumprogpprog!compiler_flag3entry_ptrUentry_tblxstackstackppcframefpinsttbl5textcodeHtextptrfmark_changedschedule_parents_ofresetLockinvoke_action_queue9eval_formula_queueheagerchangeformula_list-action_listreset_evalemalloc_p(erealloc_p@formula_queueRaction_queueVgetheap?freeheapemalloc_perealloc_phptr heap.changeNotationmakedatumh builtin_ft_check scoutScreenInitOpen notationGet- notationSwitch~ notationPushPopD append_linebufk keyin init_lex flushRestOfLine+ peekjyylex1emalloc_pCerealloc_pocurrentNotationInput_DevicesnextcyytextyylenginEVALagentName7agentTypeIappAgentName[append_agentNamemappend_NoAgentNameinPrefixGjcall_libcall_float?emalloc_pKerealloc_pVp freedatumnewdatum>newhdatout_of_range_errormustintmustchar/muststrbmustlistmustaddraddress_errorget2num'pushUNDEF;addmsubmuldivide modK negateq lazy_not not concatoptb jmp jpt jpf jpnt% jpnfY and or bitand bitor, ddupR popdz pushint constpush datacmp( cnv_2_bool< gt} lt ge le@eqtneswitchcodedefinitionOdefinition_runtimelhsGassigninc_asgndec_asgnpre_incPpost_incpre_decpost_decnoupdateresetupdateupdate?addrzlookup_addresslocaladdr*indexcalc~makearrmakelistconcatRgetvaluesellistsizeshiftFappendinsertdeletequery9emalloc_pKerealloc_p{printlistaddID[clear_IDlistnsave_IDlistrefer_to1refer_bycheckok1checkok2hcheckokreadyDemalloc_pVerealloc_pbIDlisttlastNullInIDlistautocalcA 7ctosrtypenotypenamet_type~t_intt_floatmt_chart_str1't_strKt_super emalloc_p erealloc_p|Upcre_versionpcre_infoQpcre_fullinfopcre_compilecpcre_execpcre_mallocpcre_free`> install_custom_variablesyemalloc_perealloc_pilibtblrlibtbl^change_promptchange_context8resume_context[reset_contextbackup_contextrestore_contextresume_scopedonald_full_namewnew_symbolfree_symbollook_upcontext_searchychange_scopesymbol_searchlook_up_tree*look_prevweden_full_namedeclare_openshape> declare_action eden_delete eden_declare Declarew DeclareGraph Delete% print_symbol_tablew print_all_symbols expr_to_donald_name expr_to_eden_nameMdumpdonaldemalloc_perealloc_p$dd_script<_changed^viewport_name   4initbuf[extendbufis_shapeis_openshapeis_graphdtree4\dtree3dtree2dtree17dtree0jnaryfreeTreecopyTree5dumpdtreeprint_tree1DefineDefineFunc emalloc_p erealloc_p dumpbuf6xQgetmem%emalloc_pDerealloc_p7 don_errdd_errordd_parse emalloc_p erealloc_p dd_char dd_lval dd_nerrs$ dd_debug' dd_restartmap_name_to_tokenJmap_token_to_nameinit_donaldndd_lexemalloc_p erealloc_pf dd_promptx dd_appAgentName translation*0count_idfcount_expr4v sa_errorsa_exit_trapsa_outputsa_init_sasamisa_eden_initIstrtodoublesa_addescapes/sa_parsestringDsa_load_mtlO sa_load_objj sa_input sa_script sa_inputstring sa_skipline sa_eden_initialised/ objmateriallistd"A sasami_vertex_sasami_set_bgcoloursasami_poly_geom_vertexsasami_poly_tex_vertexNsasami_poly_coloursasami_poly_materialsasami_object_polyKsasami_object_possasami_object_rotsasami_object_scaleM sasami_object_visible sasami_viewport sasami_setshowaxes sasami_material_ambientU sasami_material_diffuse sasami_material_specular' sasami_material_textureh sasami_light_pos sasami_light_ambient3 sasami_light_diffuse sasami_light_specular sasami_light_enabledF sasami_light_attenuation sasami_light_directionalwOKbsa_clear_vertexinfostoresa_clear_polyinfostoresa_structures_initsa_getUIDsa_getvertexUIDsa_getpolyUID%sa_index_from_vUIDusa_addvertexsa_findvertex[sa_getvertexsa_dumpverticessa_adduidlist sa_finduidlist` sa_getuidlist sa_index_from_pUID sa_addpoly@ sa_findpoly sa_getpoly sa_dumppolys& sa_addobjects sa_findobject sa_getobject sa_dumpobjects sa_getfirstobject8 sa_addmaterial sa_findmaterial sa_getmaterial sa_dumpmaterials" sa_getfirstmaterial: sa_addlight sa_findlight sa_getlight sa_dumplights"sa_getfirstlight:sa_addlistsa_findlistsa_getlistemalloc_perealloc_pfirstpolyfirstobjectfirstmaterialfirstlightvertexinfostorevertexinfostoresize&polyinfostore8polyinfostoresize^_LgetXrotgetYrotgetZrotEgetXposgetYposgetZpos> getXscale getYscale getZscale setRotThenTrans) getRotThenTrans setGlFrustum getFrustumLeft getFrustumRightD getFrustumTop getFrustumBottom getFrustumNear setFrustumFargetFrustumFarusa_r_initsa_togl_createfuncsa_r_closedisplaysa_togl_destroyfuncBsa_r_opendisplaysa_r_resizeviewportsa_r_setupcamerasa_r_setuplightingJsa_r_render_axes^sa_get_face_normalsa_get_face_normal_from_uid_list3sa_r_updateGsa_r_setshowaxesmsa_getandbindnewtexturesa_loadtexturesa_r_render_object_polyssa_r_render_objectssa_r_renderDsetXrotsetYrotDsetZrotsetXposDsetYpossetZposDsetXscalesetYscaleDsetZscalesetFrustumLeftNsetFrustumRightsetFrustumTopXsetFrustumBottomsetFrustumNearemalloc_perealloc_psa_r_xsizesa_r_ysizesa_r_bgcoloursa_r_showaxessa_camera_possa_camera_rotsa_camera_scale,sa_camera_rotthentrans>sa_camera_frustum_leftPsa_camera_frustum_rightbsa_camera_frustum_bottomtsa_camera_frustum_topsa_camera_frustum_nearsa_camera_frustum_farsa_def_light_pos1sa_def_light_pos2sa_def_light_ambientsa_def_light_specularsa_def_light_diffuseglobToglsa_r_initialised5sa_r_maxlightsGlastRenderTimeYlastRenderTimeValid{I/Togl_InitJ0Togl_CreateFuncq0Togl_DisplayFunc0Togl_ReshapeFunc0Togl_DestroyFunc0Togl_TimerFunc 1Togl_ResetDefaultCallbacks!1Togl_SetCreateFuncV1Togl_SetDisplayFunc1Togl_SetReshapeFunc1Togl_SetDestroyFunc)2Togl_SetTimerFuncb2Togl_CreateCommand2Togl_MakeCurrentM7Togl_Configure ;Togl_UseLayerC;Togl_PostOverlayRedisplayl;Togl_PostRedisplay;Togl_SwapBuffers<Togl_Ident-<Togl_WidthX<Togl_Height<Togl_Interp<Togl_TkWin=Togl_AllocColor>Togl_FreeColor>Togl_SetColor>?Togl_LoadBitmapFont/@Togl_UnloadBitmapFontBTogl_ShowOverlay+BTogl_HideOverlayTBTogl_OverlayDisplayFunc{BTogl_ExistsOverlayBTogl_GetOverlayTransparentValueBTogl_IsMappedOverlayBTogl_AllocColorOverlaymCTogl_FreeColorOverlayCTogl_ClientDataCTogl_GetClientDataCTogl_SetClientData,DTogl_DisplayWDTogl_ScreenDTogl_ScreenNumberDTogl_Colormap#FTogl_DumpToEpsFileGTogl_StereoFrustumx#]pngLoadRawFpngLoadRawpngLoadF` pngLoad.!pngBind!pngBindFJ"pngSetStencil"pngSetAlphaCallback"pngSetViewingGamma#pngSetStandardOrientationS# TTcl_EvalECTcl_GlobalEvalECTcl_AppInitEXinitTclGEXinitMemalloc_pYerealloc_peinterpwmainWindowsptrv setpromptevaluateemalloc_perealloc_plinenoprompt_oncurrentAgentNamecurrentAgentTypecurrentAgentNamePtr currentAgentTypePtrcurrent_Notation-otherNotation?curScriptynewScriptresetScript=deleteScriptbappendEdenappendnEdenVemalloc_puerealloc_p chashnew_symlookUp-installIntVarodeclare_image_actiondeclareappendTreeListclearTreeList/translatedefinelistsymQdumpscoutj emalloc_p erealloc_p st_script scoutErrorStr int_treeinthonest_treestr_tree1win_treefsym_treedef_treetree2,tree3zfreetreeemalloc_perealloc_pD'scoutTypejust_nameprintdefCprintsym)[-EWstoreDefnstoreSym3 5initDefaultWindow|scout_errst_errorst_parse* emalloc_pC erealloc_pb useOldTree defaultWindow st_char st_lval st_nerrs st_debugp@6 st_restartinit_scout st_lex emalloc_p erealloc_p st_script st_promptv`../sysdeps/i386/elf/start.S/build/buildd/glibc-2.3.6/build-tree/glibc-2.3.6/csuGNU AS 2.16.91[lTygVintFbKl]OV/build/buildd/glibc-2.3.6/build-tree/i386-libc/csu/crti.S/build/buildd/glibc-2.3.6/build-tree/glibc-2.3.6/csuGNU AS 2.16.91If ?Y0lTygVintFbk ;aSKolq]L ._H .RC Z#a # # # . # # #4 # # ' #$Q #(6 #, #0 #4 "Z#8 &Z#<  (z#@ ,>#DG -L#F" .#G 2#H$ ;#L Aj#TH Bj#XVF DZ#\ F#`e7 +w  n  # 0 # {> Z#  }  3sL # E SQF G# 1H#7uN Ku# S )N^= & Z % *# +Z# ,#? -  il4Int Z3 %+2t =C,H  g ##  $S#  %#  &0# 2 '#d 5&#  6#  6#, i 7#8{ 9#< :#< ;#< +/ =#@  E2#D &M  \ )S#u 4M# r +i ,Zs -a . sym /2v 3b ~. #  #obj 2#    3x 1Z#y 2Z# ] V0#O W0# X0# Y0# Z0#C [0#r \0# Ts ]all ^Zt adp b #ip c#0 sp 2#  #  # O # +/ # j\ g# \%#JCj ##Z#vaZ=#Z#Z#=# M w  s # +/ #tok #  # Yw Y   Z# @ #  # " |A V Z g# \a #a ZV   g # \ #  j  g# \S#ptr# ^ #  #  Z# zZ# # _ Z# Z#$ Z#( j #, 6" #00 ZU u~!fdZ *up"#"Z#"Z& 8U$n8" 9%k>U%@]U%`lU&npU' U$t X( 5U$t k) {U  u^ )% U*P Mu~) B /U$fmtB+IZ!iIZ+}J+J#K#M&) 0U,fmtP#R#;r Mu~)@ (U,fmt(P )@ u} +ux P ) Z< BU,s;P,t;P) PU,fmtP ux  @ u}) [ -U,mP)X0}U$mW" %wU&QZU)e U,sPZ eU*ju*,u *Zu* u)pU,sigZu)/U$cmd-+/$tokI)`g5 U.i#Z!s$2)CU*RBZP)IU,pcHP/urunUZU-\TS$ptrTj@*gTu#Z [uP#\Z nbuuU#,sZ0 " !pB!nZ`  )a"U*`ju1abuX2J  )H0U!pj )OU- #V !cwd (3cFU%qP U)'U#\+g u}+  4ZU-Z- !opM#Zv#$Z#k#g !s2U Yu_5g{+%+%6g{#_+Z5++!%+!%6+!_+!Z"8####!inp#6# #j!c#} 4c  278RSPm  bKZDm  MLm  - Z@m  yZ 9q _9 d; <9d d <92% 9  90<9 .=fp j  ]A<9TR u- <9j g <9 9,S;a,m ;%e ;g ;OhZ(m ;j  ;kZ ;l% ;8m%| ;q% ;ru% ;! zZ$m ;|Z ;}  ;~ ;Z m   ; ! ;,E  ;=m >RS1 >RS2 ?LZm :5]Zi? lintKTygVFbk ;]S3kl]5H.RC ,#a### .###4## '#$Q#(6#,s#0 y#4",#8&,#< (v#@,A#DG -O#F".#G2#H$;#LA#THB#XVFD,#\F#` sn  s# 0y# {>,#<  5  3 a4w  s # +/ #tok # # w O  ,# @# # .UrsO K0UrsJptrL  ("Urs' ) 4 0Urs3P ptr5 a6 rt \"UrsXSsXP+/XPtokXP k0Utokk rsku  l ~.m;  n,d J  K  Urs   ~.  ,7 ~ Ursŀk ptrǻ n,  3 yyy9, ^. fB? lTygVintFbk ;VS zK dl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  33 t ,H g## $H# %# &%# 2'#d5# 6Z# 6Z#, i7e#8{9#<:#< ;#< +/=#@ E#D  \)H#u4#r+i,Os-a.sym/v3vTb  ~. T#  T#obj # pZ3x1O#y2O#4*]V%#OW%#X%#Y%#Z%#C[%#r\%#KTs]all^O  g֓# bH#numH# K+  ~. #  #obj #  8m pUQp obj nO Pp< j 7UQpO Ae R (@gU 'p ` 'p 7 +OpUs*4 i,OQ _7Us6_ sp9 wA HUsB stBO tBOiBOP.JOKspK^ UQobjnOP  UQAF17 (U '` 'i HUgA* PUgHE~FI ~UbOE XA!! )UL  1Ub0OE28Q3s  ; UE<V" EOUgDtEF" # PO5UgOEQ0  `@U#p_P$Q_p pAae&  fBU eD$ped$QepAgeiph 4% ] 5%D  { 5%K  & E 'y'y'y'9 O( 3 )^ .3'q_* k  ( 3[ `m *e [ZE *0 \ZE f 2P?* lintKTygVFbk ;]S3kl]Int,3 t  ,H g## $V# %# &%# 2'# d5# 6p# 6p#, i7{#8 {9#< :#< ;#< +/=#@ E#D   \)V# u4#%r+i,,s-a.sym/v3 H.RC ,#a### .###4## '#$Q#(6#,#0 #4",#8&,#< (v#@,A#DG -O#F". #G2#H$;#LA#THB#XVFD,#\F##` n  # 0# {>,#%33 jb  ~. j#  j# obj #33 p3 x1,# y2,#4@] V%# OW%# X%# Y%# Z%# C[%# r\%#aTs]all^,ta dpb# ipc#;  9# dp:#h;@ ># end?# @9dpsym' funsw9 a zdSP}U QPdpRPbgUePendfPa xU~U +Ui,upj, %,0 UsP!Wq  U" ,P#[ uW,2U"V,u$ [,$%lex"& F~& R& & I& &}P&1 F.& U'P!& %&A/(T$J[ D) a $q`,d($q`,*msg+x,$H,,b$a ,+iX,,-$ta , Q  +p,( o + +p},D y +p-.cE ?Vw 2/g W 0 B,xo 05 C,to 0 D ht 0 E dt 0F,ho 0Y G,lo 0H,po  1:0 +   @ V0Q 0 g V12 y V  V2 5 ~  2 K    V2 ]   V2 o  + V12, = @ R V32 d B z V12   i  V32    V1y2    V1y2   2 ,E 2O $,`t .yyn%,\t 2 &a Xt 2= '[ Tt 2 (,Pt 2 ),`o  V2 + r  ?2\, o 2T .a E 2p/[ E 2C ;,E 2? <,do 2! G?o 2 K,|o 39,3334 4^. 3>3q_@3d93 - 538- 3e .p30 .p3I,3J,3rK4, 4M ? 4 , 4 , 3> A@?3Y0lTygVintFbk ;a #D G -L#F ".?#G 2O#H $;#L A#T HB#X VFDZ#\ FU#` 7  8 3n  3# 09# {>Z#JO8e83n's L #E{ w  x# n y#Q F  G# 1 H#7!N K!#1)N 7X% &# '># )# {-# :.# 8/# 0# X1# H2>#( 4#, 8#0 r;#4 BF#8 G#@ }H#H WUE#P aVE#TIntZ3MSZt ekC,H g#2# $S# %A# &0# 2'2#d5N# 6# 6#, i7#8{98#<:8#< ;8#< +/=2#@ EZ#DNu  \)S#u4u#r+4i,Zs-2a.;sym/Zv3b  ~. #  #obj Z#  43x1Z#y2Z#4CBspZ# A# ;# O2# +/2#G\ g2# \M#|A 700<  !# ;!!# j"!# #!# $ # %# &#4 '#8 JC   2#  # Z# 2 * 0 a< Z  2# Z# Z#  #  8H 2 w  s 2# +/ 2#tok  #  #  4   Z# @ #  #   D2#tok #  # ~.„ # ? ? = &  Z % * # +Z# ,#? -    g2# \S#ptr2# ^ 2#  8#  Z# zZ# 2# _ Z# Z#$ Z#(  #, 6" #0  9 l :Z#  ;Z# tm, ~ Z#  Z#  Z#  Z#  Z#  Z#  Z# c Z# S Z# < #$ \ #(>.Z f Y# \ # R # & # P . F sG 2#lH Z#I  q B  ~.q #  q #obj Z#: B :  refZ# gZ#  g2# C# # Z# " # w  S,$ ~.S# S#obj#,!oY05l6#r7#key8Z#vp9C# ent:C# ,;C#$uh<u X@dU sW2P!vpUeU"͹u#pqte"$J{d'  {8 k"U#tok @%dCup#pqteS&+G "D$U' Zq(pqte' e(tok $J;q' ;8 +)%[P$(&U&z0&_&U*dCut&]`&&U*dCup(t26&k&'U'2I'{2g*dCul&:'E(U'2'{2*dCul&yP(?)U(cwd2*dCul'{2) @))U&8)*U*secCul*minCu`+CuT+CuH*monCu+Cu+Cu'8+pux &u-+2+U+.Cup+/pu|&7@++U+8Cud+8CuX+9ux+R: up&-D+A,U*dECut'F[F1?,*Z&GRP,,U*dSCut-V,[,&}Z,-U*d[Cut'F[\D.mZ/nl/ l6 &f -.U'vg2W*bufh<u(retiZu*djCup0}--11&q./U*dCul'62(t22s23sZ&/0U*dCuh(nZ'F['62,(t2J2s2&0r1U(cZh3F[&c1i3U*dCuh*argcuD(iZ{'}c2s&p35U*dCuh*argcuD(iZ'F[e'}c2&9 58U*d Cuh*arg cuD(i Z(str2'}c2?&(89U*d)Cu\'.*Z_(to*Z}2len*Z2i*Z(s+2(t+2(str+2&$kF9;U(aG;(iHZ '<HZ3'.HZS(toHZs&v^;2>U4d^Cu5f^6^Z (i_Z&@>s>U4dCu&C>>U(iZ)??U&*U ??U*dCul+"Cu`(s2'g2&|=?KAU*dCu\(iZ#(lenZA(s2a&PA+BU(iZ(jZ+Zul'<Z(a;)$0BtBU&6.BCU'/Z*d0Cul(n1"&JCDU'kK5'gL2S*dMCuh'NZq(iPZ(nPZ)oEEU7 EFU5Q 'HZ *dCuh(A# &`FGU(spZA *dCul'g2_ (iZ} &HVIU(spZ *dCul'g2 (iZ &I/`IKU(spZ *dCu\(p;!'H7P3p%3p%8h3u%3u%&pXZU*dCuh'Z`&(s2&(spZ&'Z&(iZ'(Q I'=YY3%3%7 Z[U4dCuh6v2g'=[[(n7'(i7'&B cX[F\U(mem 2 (*d Cup&v P\m]U(n7(*dCul),p]]U& r:]^U(i=Z:(& FI^-_U*dJCut(sK2M(&!Y0__U*dZCup(s[2v(&?!li`.`U*djCut&!(v0`6bU(pidwZ(*dxCuh(py;(+zZu\(izZ('{ )=``(f;)&I"+@bcU(pidZY)*dCu`(p;)+ZuL(iZ)' )') *&+#chU(pidZ)**dCu`(p;R*+Zu(iZ{*' *'*302'|2+'+/Z0+'hZz++,u2s22t2&p# hiU2rfd Z(wfd Z+(efd Z+&$ jlU*fd Zu|(sec Z+' Z++) Zu|(ret Z ,+\ 8u|+ 1u~+ 1u}+& 1u|*tv ul(tvp $ ,*d Cu`,<$&k3k+ Zu|' ZQ,=3k@k' Zd,' Z,&8% l nU2s 2(t 2,(fd Z,3 Z'6 e,*d Cuh&%3 nnU2fd Z(s 2-36 %2n %&%4 nEpU35 2(fd6 Z#-*d7 Cul*new8 ,u(r9 ZL-&&"V PppU2fdW Z&l&"f p*rU2sg 2(tg 2-(fdh Z-3h Z'6i e-*dj Cuh&&1 0rsU3 2(fd Z-*d Cup&L' suU(fd Z$.+ 1u~*tv up2tvp $30 %*ev uT*d Cud8' ZM.' Z`.&p' uuU2fd Z&F( uxU*re F(u~'5 s.'d Z.+ L(u~(rc Z.(i Z.'"( 2.+) 2u~3  2'  Z /2s 2(t 2>/*d Cu` \(Z9(K (x zU6_K Z\/(resL (/(lM Z/. &)` zzU5sb` (/6_` Z0(la ZE0'uc Zy0&+)y z{U5sby (09) ({n}U6 20;) 2u ;"( 2u; B u4rc Zu*n Zud(i Z_1(rp 2r1' (1' Z2+ 2ul' Z%2&)+ p}.U(re F(d2'5 2'd Z2+ L(u~(rc Z22i Z+"( 2u~+) 2u~+ 2u~+ Zu~'H Z33  23  Z2s 2(t 23*d Cu`(si Z-3' (B3' (W3)` 0U)s U) U)} U)`  %U&+ 0U*d Cut)! ƒU) ЃU&, U*d Cut83  27,G" 2U5v 236g 235box 23+ CuD+ Cu(s 24*sp Zu(a ;:47 -; @U5v: 2c46g: 2v45box: 24*d< Cuh(i= Z4(j= Z4*sp> ZuX!R U?k-%dU@g24#Ad5?-d4U@g2:5%Eu@AFd8#A)d5&/ [ @U+B\ Cu'] Z5'] Z"6'D] ZQ6'K] Z6(k^ ZG7(l^ Z58(r^ Z93_ Z3_ Z'V` ;'#` W;(new` ;+x` w u(ref` ;(r2` <'ga 2<' b Z<*sc /u|(td 2,='e =+f Cu~'g R>'h Z>'"i >']j d>2ssqk Y8*NewFCu~*OldFCu~*winFCu~+FCu~+FCu~+FCu~/8:"0E"0U5mapB"0?5keyDZy?70~rU5s}2?6,}2?'@2?2lsZ2laZ&0JU2iZ*x4]*y4\*z4[&1PU2iZ*r4]*g4\*b4[&S1 ǮU2i!Z2r"42g"42b"4&1C1ЮU2i2Z2r342g342b34&1BGU2iCZ2rD42gD42bD4&(2SPUU2iTZ*rU4^*gU4]*bU4\*aU4[&K2a`U2iZ&2JU2iZ*x4]*y4\*z4[&2U2iZ*x4]*y4\*z4[& 3fZU2iZ*x4]*y4\*z4[&M3`U2xZ2yZ&p3TU2nZ&3*#`eU2i$Z*r%4^*g%4]*b%4\*a%4[&4RpuU2iSZ*rT4^*gT4]*bT4\*aT4[&i4nU2iZ*r4^*g4]*b4\*a4[&4<U2iZ2r42g42b42a4&40 U2iZ*x4]*y4\*z4[&N5NU2iZ*r4^*g4]*b4\*a4[&5U2iZ*r4^*g4]*b4\*a4[&5FU2iGZ*rH4^*gH4]*bH4\*aH4[)Nu U)6U&K6E@ȾU2iZ*a4[)оVU.6E4/.6F4/E/E B 7\Cmap["0Ckey[ZCvp[CCent[C/,[C2ans]"02new^"0&E9`*U+:CuP+HCuD+Cu+Cu+Cu*dCu',2?'OZ@(iZ2@(jZ@'Z@(ans"0A*s/u|'B2*A(v2YA(var2ADH8_61r6061616Dw8_6HJ1r606HJ1616D8_61r6061616D8_6FJ1r606FJ1616D96 E6uE6u~E6u~16F6B>,9HG6'BG7qB=u*dCu.e9JZ/.9L/J/J /;JZB2:322s2H:3%3%H9353ZI33ZI3+%329;Z0AU;u;,< u ;Zu6 B'2B(spZC(pSC'b%C'H7C(i7C' 8C+8uo'#2CDI;E9r1X90e9r19191x9D};E91X90e919191x9D;9`8xG9.DG9LD=(J9J9=(G9uDJ :=~3!%3!%<85K;&<8L+<u +2t +WU Y@I l<85K\<<8O+?z{<t M 9M 9M 9N9oZt N N^. M]QCOfp PO521=jNTO!=E MMM,6< M-2?ZM pZMqZMrZN9et QRS1\4 QRS2\4 = R !=M,#= =ZSP =PPT\>"0t X}(P?lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  3 IntO3t ,H g## $H# %# &%# 2'#d5# 6e# 6e#, i7p#8{9#<:#< ;#< +/=#@ E#D  \)H#u4#(r+i,Os-a.sym/v3_b  ~. _#  _#obj #(( {e3x1O#y2O#45]V%#OW%#X%#Y%#Z%#C[%#r\%#VTs]all^O{tadpb#ipc#sp# # # O# +/#{V g# \#'YPUfU#pUv `Uo dW`WUeupopd`vUulU dDiO!"   "JvKU pD#!E"oP?U$iO?E%m@U&splsE'l{E(Ao{E%}U&sp|E'|{KF%%U(spF){F*`R U&fF)=G%tU&tblG(ipvG)G+t%U&dpG&ipG*R QU'DH'>H)q`OtH(pH(qH% ,`U,2)P&len)OH* ~5QU'24H(s7$I*m \D`U,\BOP-idBP,=Cu,CS,CP,2CP)DEBI.E.=F)G{UI* HlU,\iOP,=ju ,jS,kP,2kP)DmhI.m.=n)o{{I%L lU-du/s2L u(iOI \ O* L U-spP){I(ipI0  UU){I(ipI" `U spJ16u 2+/9J$iOJ3duD4\ =5u4w Wu4 Wu4 Wu4 Wu6Wu%S N.U76Oul76Pu`46 5uT6L5uT% 0U(spzK){K7"ul6E5u`*iU,=u,u .D..=(dpK/du\(sK(iOK6 G58uP y 28i9y9y9y99O:3 ;^.3:]K :> K  <:% :q#5 :*  UV :d)E  x<:2%g s :$ =pc!   c:%@ =fp& 9O˓  =:I 9! O 5>?8%" ? &I -?lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  3 IntO3t ,H g## $H# %# &%# 2'#d5# 6e# 6e#, i7p#8{9#<:#< ;#< +/=#@ E#D  \)H#u4#(r+i,Os-a.sym/v3_b  ~. _#  _#obj #(( {e3x1O#y2O#4 ##O#f?Usp>LP@pLQA{L`A{pLj5UspiMPk{QMQk{dM m@U!vuPpwMQ{M"cU 9<U#Q{spM$dul h@U%Q{spM+U&,OMCtUspB N'MBOCN&EyN-zU&H{ONP|pN#Q}{x$dulUPpN#Q{&HON$dulUPpO#Q{  2()O *y*y*y*9O+3 ,^.3-pc+eK + eK .,'.D7d/??<int37=Dt OU-,Hg# #$#%#&# 2' # d58#6Z# 6Z#,i7e#8 {9#< :#< ;#<+/= #@ED#D8_ \)# u4_#  r+ i,% s-  a. sym/D v3v l K T y g V  F bk ;S l ]H.RC %#a # # # . # # #4 # # ' #$Q #(6 #,#0 #4"%#8&%#< (#@,#DG -#F".#G2#H$;#LA#THB#XVFD%#\F #`n #0#{>%#3Tb  ~. T# T# obj D# pZ3 x1%# y2%# 4-, spD###O # +/ #?C$ [Uq`#%8Op% nO3L`?Ub2RK9%^.fpO   7@ 20@?3Y 0lTygVintFbk ;aSKol]L.IH.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAT#THBT#XVFDZ#\F#`O7 \ n  # 0# {>Z#h  a  3 # E = & Z U% *# +Z# ,#? -` p IntZ3t |,H g## $S# %# &0# 2'#d5# 6;# 6;#, i7F#8{9#<:#< ;#< +/=#@ E#D  \)S#u4#r+xi,Zs-a.sym/v3W5b  ~. 5#  5#obj # Q;x3x1Z#y2Z#4|{ ]V0#OW0#X0#Y0#Z0#C[0#r\0#,Ts]all^ZQtadpb#ipc#sp# # # O# +/#Q dp sym  ' pfun {sw  , N #Z#Z#ZN`>f   Z# 2 #  Z#>f x|A   g # \ S#ptr # ^ #  #  Z# z Z#  # _ Z#  Z#$  Z#(  #, 6" U#0@MU P!. PU \ZP &PR"pO#R 5U$cZO%zZ@bU! ZpU&gƞO  gʞ#' K (iZ ) &jU* P+- p4U,ret|u`+~ :Z@U-s3P,d|u`,ret|uT.t)   U/VZP,d|u`0t^P*qP14 U22P0iZP0nZP0sP34 pN  D )k U-c>Q+ PZ$U0cZ^Q4k 5N Z6g O g# Z#7qN (iZ87%7%94 75I7Z87I7Z ^ : Z0U0i"ZQ0sp#)R*$RR; < => ? R@PUA(PU)+ .SU*k/ R0c0ZS+f  kZ`U0clZES*km nS1 QU0spS* S*zS1`U*S.s**+ZT=3>u0c?ZT ) c5Z(iZ(rx(mZ(nZ(eZ71Z7}cߞ7IZ(uBJZCVBLCJVCJrC;JZD]ETqZF;uGc1s#Gc2s#tZ#.tabuT4WuZ j +ZU0sT,uuPH3IV=>;>GJbI <;<<<Ih)3=0?:U?C=U>>>?ձ?V?Vܱ;<;<<<  1LMbof*Z`  N'DY` 3ZH OOOO9 ZP T P^ .T Oq_ OM .PM~K   Q !O, #P5+ZK PH,`-Ps-ZD O,4lP8Z@   Pg@`- 7 P:A'@-P-2BZK P`CZK PDZK PEZK R%RRR~RfE7O!? Int0int3BHOt Z`8,H g## $# %# &# 2'# d5C# 6e# 6e#, i7p#8 {9#< :#< ;#< +/=#@ EO#DCj  \)# u4j#  r+ i,0 s- a. sym/O v3lKTygVFbk ;Sl]H.RC 0#a### .###4## '#$Q#(6#,#0 #4"0#8&0#< (#@,#DG -#F".#G2#H$;#LA##THB##XVFD0#\F#`n  # 0# {>0#%(3_b  ~. _#  _# obj O#(( {e3 x10# y20#487 spO# # # O# +/#S )- U(7ui*0Wj*09WA+u@,%WWdG8uh0 \ L0 O!UK7uAQuR[iS0jW!:!dh8ud 0" #^.#fpc7mP!?<"Y0lTygVintFbk ;aSKol]>H.RC Z#a### .###4## '#$Q#(6#,~#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LA>#THB>#XVFDZ#\F#` ~n  ~# 0# {>Z#G  @  3 IntZ3t ,H g## $S# %# &0# 2'#d5# 6p# 6p#, i7{#8{9#<:#< ;#< +/=#@ E#D  \)S#u4#3r+i,Zs-a.sym/v3jb  ~. j#  j#obj #33 p3x1Z#y2Z#4@]V0#OW0#X0#Y0#Z0#C[0#r\0#aTs]all^Zsp# # # O# +/#a GP!6"UdFuiIZW>"[@"$UdZu s\Wa]Wi^ZX "w $)%Udvu sz3Xa{FXi|ZfX!0%Y%UiZPlowZPupZPd"`%%Udug X/G!%&Udug Xb! &z&Udug Y &&Udug XYT"&'Udug Y! ';'Ug ÞP's"Z@'(Udp1ɴYdp2ɴ@Z"( )Umadd))Ud1utd2uhsub)*U d1ut d2uhmul#*K+U d1$ut d2$uh! l"8P+W,U d19ut d29uhK modS`,u-U d1Tut d2Tuh"rU!q j&l-f.U dmul!  !p./U dul not/0U dul!b !0$5U#u\# uP#"uD du$aZ$dpZ"lenZ"s$iZZ%F"Z[ jmpR05~5U$iS3[ jpt\56U$i]F[ d^ul jpfn 66U$iod[ dpul!% !6V7U$i[ dul!Y !`77U$i[ dul and8 9U d1ul d2u` or9:U d1ul d2u`! ! :;U d1ul d2u`!, 2!;;U d1ul d2u`!R %"<T<U dut!z  `<<U# ul! y <<U dut #=S=U&( !1Z`=>U'd10u'd20u$i2Z[ r3[(>>)E%)E%'!W>?U} gtk?@U d1lu\ d2luP dluD lt}@AU d1~u\ d2~uP d~uD geB!CU d1u\ d2uP duD@le0CSDU d1u\ d2uP duDteq`DEU d1ul d2u`ne EEU d1ul d2u`!c!EFU dul!OaFGU$sp[#uh%1"\)#\ul%.\#2up!MGHU$sp L\#!u%1""j\)"#\#u@%$\#2%uD#"(u\*n!dH'IU+"cup+.cP,G!t-"s"spv)"wp!!0I_KU dul#"u` tmpuT.II/#uH01/1:! `KMU dul#"u`!P!MNU dul#"u`!P!"NFPU d#ul#"#u`!"RPPQU dSul#"Su`!!QFSU dul#"u`!w!PSTU dul#"u`"TUUm UGUU!?A>PUVU2sp\!z" VVU$sp \0 dup!8!V`YU dul$sp]#]"u~%!.](WW dIu`  !*"R`YYU dSup$nTx]!~Y!`Y[U#"bu\$dpb]#ZbuP$ic]! [\U2n] arru\ duP \\U!R{"]f_U d1u\ d2uP"lenZ$s)^$iZ<^%!Z{^%N"Z^!!p_`U dul#"u`$sp^selabU#Zul datu`$i_!!#bcU d$ul!FV=ceU#">ul$dp>;_$i?d_!"Q efU#"Ru\$dpR_ dSuP$aS_!*"cfhU#"du\$dpd_ deuP peuD$ae`$ifG`$posfZ`!w-|ijU#"}u\$dp}` p~uP"a~$i`$pos`!!jmU#"u\$sp`$Pa$QEa  53 #"ZO 44449Z5> 5^.> 4]Q4q_@46pc6fp7-2Z7g7Z7Z78d77 .Bvm?"lintKTygVFbk ;]S3kl]Int,3 t  ,H g## $V# %# &%# 2'# d5# 6e# 6e#, i7p#8 {9#< :#< ;#< +/=#@ E#D   \)V# u4#%r+i,,s-a.sym/v3 H.RC ,#a### .###4## '#$Q#(6#,#0 #4",#8&,#< (v#@,A#DG -O#F".#G2#H$;#LA#THB#XVFD,#\F#` n  # 0# {>,#%(3 _b  ~. _#  _# obj #(( {e3 x1,# y2,#4##$mnUQ#{yaP&pa["0npUid/a0Ph{bni,"bGAsp@bAbpib"ppU"{pqUApP{Q{b1Y#qsUspuQ{u #pb"{1cb#{ec ApcHApc-#tuUspuQ{u idup#pc "{b#{ dxAp2dApPdG#,uvUspydQ{diddPpehP#,vxvUsp!eQ{We!ide!Ppe""!,vvU#sp S#Q {V$$,e">,vvU#sp=u%P@pR%QA{Q2&"'9,'''( )^.("eO (6#{O )= S"C w?#lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,~#0 #4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#`; ~n  ~# 0# {>O#G  @  33t ,H g## $H# %# &%# 2'#d5# 6e# 6e#, i7p#8{9#<:#< ;#< +/=#@ E#D  \)H#u4#(r+i,Os-a.sym/v3_b  ~. _#  _#obj #(( {e3x1O#y2O#4sp# # # O# +/#7 \H# g#r#3wwUd2u s5e#DOwxU#CeiEO%f#R xkxU\QOCfiSOR '_pxwyUd`ut\aHbfibOf@JO5xLzJ5Jx;JOq#uyzUdvut Hzez 3@Hzez k _ SE5FE5Exm#z|{UdutD{X{ D{X{  {W|Udut#`|Udubufuwj#f#Of#O'giOpg!\Od1u\ '"K#Udֱut#w#\ U$d]uh$t^u\%s_g&i`O  2'#  (#P ))))9O*3 *^.3 +fp: $4F?!$'Y0lTygVintFbk ;aSKol]>H.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAI#THBI#XVFDZ#\F#`D7 QKb n I n  # 0# {>Z#un3P}M&FE#q`G%#)H>#=)IE# %J>#(K>#C+L#%M#RN#'Q'!N=)T#(U#8%yZ$@7O'VL*\lcc]L#fcc^L#)&_L#+`L# R*a$%Hf=%gZ#&h#*iZ#'jZ# lcckL#+lL#3(m#'n#)o# )p#$&q#(%r#,(sL#0W'tL#4)uL#8z%vL#<*wL#@)xZ#DZ$%ycz$ ~.# &L#z$&NKU;Q)mZ U(l;g)lgC+lhrenFAL&ZsU(;bhP$h@$Zhg IireF)}$ZU):i)VYi*(Zi=)Zi'u cduptrLicZjiZkX& LLW%SUpLkcd1l]C(L`AUpLOl%lp)l)VucdPminZlmaxZm)ZPURm=)Z1mZPm$ZnmccmdZnopZ7 * =)Z % 7'7 ) )V G% % U%!cd'Z$Z'ZN+Z&ZZ@*Ze*Z&ZU*ZR%ZcZRi(ptrL_%L*$&"')"'"g%"$d"[)"$#&( Z* ZM& Z|( Z% Z$ d&l$mZimZ)&nL#r(Z$ )&L$< dZ$. X&L#ucZ$N len{Z$ iZu)ZlenZa($ ket($ %[Z$ %Z#+Z%Zbra$ setZO*Z+#&Z$' tc#&Z $!ptrL !cdE$Z $Z!ptrL!lenZ'Z#%%$ 5>Z#>Zj(RpU=)OZ6nG%OZ/o%Opo7'O7 u)Pu )PVu-)Pu|(PZu%QuU%Qu cdQu$ptrSLoRT!r%E)Uu~)V%$Wu~%L'XZu~5+YZ!s%%+YZu~&8cZzs'gW(_ (S (G (; (/ (# ( ( (P)j s)v t) Du) u) v* u~+ + + * u~* uh) [w) sy* ud* u`) y+( *4 u,@ ړ,H ,P `,X ,` -h *q u~*} u~) {+ ) }* u\&)S ^~*] u*i u)u ~.^+ ) J&) ]&%8) /0)/ 'U= E(g ([ (O `*r u~&x* u~) + * u~' ґ֑0 u( + ) K)A &* uX) ) .+ &%` ) U) s) &4x +! &G )( .Z˙+  ) ͂[$LpURL=)*&ZQr$u$&& ¡UR% L^=)%  (( Lƃop* Zu%J СhURI L (L LLopM Z%n Zp URm L=)m ݄co Z dq Z:(r Lcopt Z( U"( Ku=) Z) Vu$ u) >ure  Z* Zc ZP% Z`U% Z%*( Zuh( Zy' Z(( Zq+' 0q` %;R Yptr L%) Wu@%/% uw%( u}1;&" |1g% 1%? &( min Zmax ZL( Z' Z.' L& ( L&9 (*q Zt%r Z*s Z&s set ZFO* Z+ &H chg ZQ&` s%& Zz& 8)3 Zđ/ch8 ZZ~ )O {U%M Z& &M L9M ZbmdM ~uimsN EpP LM% U & L' L) Zmd ~uims E._* MuSC Zȥ) E%$ ul1$1&1*L& op Zܥmin Zmax Z) Zi Zc Z$ %&  %~.Lu~%&Lu~ %%$Zu~&%Zn&& % Z޶.DL&^8 %*YLu~&h %Zu~%Z5& 2rc~u}%%u~%%Su.׺3L& Z޽& ~.L&L&E %&u~*&Z0 pp)L. % Z@& Z^/2?' Z% Z) Z&` ppIL&x pp@L.ppLlenZ&& ppL&; ppL ppvLcZ%ZU(;*)KDZu3$Zu=)Z*u *Zu$V(Z+ZC+Z %Z_o'ZimsE%%/&u(L{z% L)!L%("Lure#F'$*%]&&%'.+g_&k&l>&~ rcZr_&&(pL[HppZ)`cZ3%TfS 3(U`S SJ3H6nS K 3x*T 6 3q&GT &\Z&3/*m T L74?3( rP 556I %7)P 7e'\P O'VI?+Y+lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  34Z g# \# O g # \ # +'IU C 33x+yyy3^.3  U     U C(CW%P? /Y0lTygVintFbk ;aSKol]>H.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAI#THBI#XVFDZ#\F#`D7  n  # 0# {>Z#R  K  3  # # Z# 4Z, \Z#opZ# =# : # mid # ' #',-'i2 t f 3, g# # +/#  # \ Z# .3# 3#,{>f   Z# 2 #  Z#>f Dc7sym8# W9#9+PUstiZ;lenZl+Z8.Usym[-UcntȆ-ZUixZ>-UiZ. UiZ-JU g. U!idu"gg s:tYiZw#lenZ"+Zul w .q@U$gpP#symrz,@U%sym -RU&gsym Q-``U&g_ syma?'y,#nU&3"]2/@pU$3?S &-SU&gRsymT *Y,U&3symI(HZg wy. U&gsym(~- ,.U!id-u"g/g s0t1i2Z3#len3Z"+4Zup> - UsS)x*%*% .U%ids&g%vp r-68U%sym4 %vp4As7wid8 Q/^@0U!id\u$\\Zu %vp\w ,0U&\Z&3{symdcZ5 ,U&3isym dc Zt -% .#U&3Ksym(~-dcZ#w /.0U&bZA$(.u syml#iZ?/]U f,X`#U&3V  ,n0U&3leo%(HpZN(gqa'; j/U&bZ+. >U,m^/Z-g. *%*%. *5>*Z/*>*Z. *%*%. *5>*Z/*>*Z.n *%*%.S *5>*Z/*>*Z. *%*%. *5>*Z/*>*Z.*%*%. *5>*Z/*>*Z/*%*%.Q*5>*Z/*>*Z'Y.@U&bZ&(.&B.Z0symup1N 2` 3w*+%(Y'M.TU&bZ&(.sym4,Z`%U u 45e$,6,-g 6,5   6.: V 6k-M 6.OZ 6.PZ 6_-R 6-Z 6M-Z 6.> 6.Z 6J.Z 6-!   )"+w Z   "- JZ   -", Z   ",Z   ("-Z  1 ", !ZZ  S "-!CqZ "4-Sg "'/̗ ",ȗ "-Zė ".Z 7778I 79Z8^.I 7,8~,6 -{82Z  ^ ?8HVN-7o.9+ o+\20?//lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  34 , \O# opO# = # : # mid # ' #,-i2(I t f , g# # +/#  .# \ O# .# #I,I_n MgoO# 0p#)>f   O# 2 #  O#>f [q/K0Uq`JO0XUq`WO4S0dOU3cP0jOU3iP0pOU3oP\/ XUopORlRmRrRxRptry/`UopORlRmRrRptr0UopORlRrRptr70UopORlRptrj0 UopORptr\0O hU/OPq0pU3g00AU3@tBg0C5 0Us{0 U3MgOg0us"tK/O z0v tu1/TU3tMgOg0-/O !"50_`7U<0^/^sym`aOtopaOiaO/@2UFXO13\sym  2#/ % $," ` $/#O [ $0$T $0%i P $0'O $G0(O  O$/)  $/*O $)0FO   ]$_ @[    ]$B0 @^  & a0 0a  H 08 0^ %y%y%y&3 %9O&^.3 %~! )&+G M-ua@?0/lintKTygVFbk ;]S3kl]5H.RC ,#a### .###4## '#$Q#(6#,s#0 y#4",#8&,#< (v#@,A#DG -O#F".#G2#H$;#LA#THB#XVFD,#\F#` sn  s# 0y# {>,#<  5  3 1@Uq`,ptr  40yyy 9,^.3 .b5?1/lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,~#0 #4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#`; ~n  ~# 0# {>O#G  @  3, \O#opO# =# : # mid # ' #4,-i2341121u12`1112z2 1  1 J1 o2 >f   O# 2 #  O#>f  ^sZi[Or\t]( ^^#O#O#^# n Hm1JU9PsP1uerrnn  w1PkUsP1WOp5UVOu [Olex F RN P I 0}P1 F3 P! % A/  J% zq`O Qq`Omsg!xOHO"oVz"<!iXO"7tz#1O!t1(!t3(M   4$:2%?1N  %,O :&t' oK  ) `H 'q`{  P H&' w  v H ' |   5 '    H    v   H  2}   HH&, -Z~  7 oH  Lv  _ H& R   H  q@v   H&f  {    H&f  o    Oxa O $O` (yyn%O\  &zX = 'T  (OP  )O`  H  +    \,  T .za p/a C ;O|a ? <Od ! G l  KOh  c 1S @a )))* 3)90O*^ .3)~: );O)*2PO+1O,-+1 0-+W1O(-+O$- 0fO5?3/Y0lTygVintFbk ;aSKol]L.IH.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAT#THBT#XVFDZ#\F#`O7 \ n  # 0# {>Z#h  a  31, \Z#opZ# =1# : 1# mid 1# ' 1#4,-i2T>siZr7tI ZI gG# HZ#3@55UJ#3Z5D6UguiZZendZcmpZ56%%2P6|6UZiZ%67UcZA3d 7g8Uge fu} gLU3k  !(2Z"cZ#2Z2ƴ$g+%מ%%%$5IZ%IZ  &JZ'V&L'JV'J';JZ&BE7'V&nF7'EV'E3p8OU(cZu)(89*+5j,@u})V:X:-.V:X:---) "::-5.B::-a-U)O"`;y;-5.B`;y;-a-U)f 0CGC-)"FF-5.BFF-a-U/HH0EZ0SZ."H*H-5.BH*H-a-U."MM-5.BMM-a-U & 11222(d 2c )Zc 2M3*Zh 2^+Zl 2a3,Zx 2i3-Zt 22.Zp 220Zc 33331}39 Z4 T 4^ .T  2 3g" 3-2Z3Z34o.8-4*2/Zc   >453I a 3Z5%h 65Hi 3l{gO?3/int2],\%#op%#=#: # mid #' #94,-9i2  t f ,L,g,#,#+/,# # \ %#.L#L#, 3%OOU 4.OHQU 3-id0,[sym1R3f%PQQU 3e4g%(g%8C3%Q RU 3VE%RL%3%RHRU 3E%RL%QR%u3%PRRU 3E%RL%QM%uR%u Ku3%RRU 3E%RL%QM%uR%u X%uf3}3|3%S{gU 3KSSY23l3r 85og?1 6\>f \#2c#\#inti]>f %lTygVFbk ;SKlL.H.RC \#ac#c#c# .c#c#c#4c#c# 'c#$Qc#(6c#,#0 #4"\#8&\#< (#@,#DG -#F".#G2#H$;#LA#THB#XVFD\#\F#`  n #0#{>\# i  i 34 Cc#\#\#C# Si <54x#y#z#4f5 r#g#b#a#6 -J48n9\#uid>\#?-#~.@-# K4A40{L8|\#`6}#5~## p\#,34>4\#Dz#dz#:#4\#<#P#T~.#X4n\#D5\#*## ~.#..59ggUs8cPerr;S;S5KggU5Ug4hUsTcN4_@hhU8d5hJjUo8u} Ii4PjkUscycc5\uX#4\u\i\d\4\.6\6 /B6}k-lUs|cTc~coutcoc e40l,U!4cP"s u}4 u{"o uy"cmd uvi\n\id\]5\"arguj5.ur6\6\ i .c Di   50גU#gcu$c!o u}cmd u{%5 upl uy%-43 up&n\Li\&id\69 '5\%4 uv'5I K 3 i  I \  ^ )5U!gcu(ct!5\u"o u}"cmd u{"l uxS4 uv4 utP6\J5\q5^ -43 ukn\i\id\\5\`69 uP5\4\4\46\2xy"z[5\"argul6\6\5d 4ul4uh,I # 4zUcyi3%,{ uz i ))))9\*# H-p*55)8@-*>4*\L-*i6+\| *}6,I D-)5)5\)76\)5\ 7x?6 6lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  36O<454 x# y# z#475  r# g# b# a#6 6x' n(O# =)7# *7#$ +7#D 6,#d O-#h 7.O#l /#p ~.0#tB61BJ48 n9O# uid>O# ?# ~.@# K4AY6q :7rO# poss#6t040{ L8|O# `6}# 5~# 7# pO#,%4dCt4\ nO# pos# rot# J:#4 O#L J<#P C#T ~.C#X47 nO# pos# =7# 7#< 7#\ ^O#| U# O# # ~.#T6TYUnOxyzvY8Y7 VUr6[g6[b6[L`UpKOPvKOSidKOVMV`6NiNFeݞUpdOPvdOSiddOVf|`6g~'Up}OPr}uxg}upb}uha}u`d0PUpOPmOSEPUoOPpOSidOVobjEIM˟UoOPxɷuxyɷupzɷuh8EП UoOPxuxyupzuh8EM iKUoOPxuxyupzuh8E PpUoOPvOS8E' 0pyUx/OPy/Ou  =Un<OuO -JנUmIOPrIuxgIupbIuhaIu`pKO :  e'UmdOPrduxgdupbduhadu`pfO M' q0wUmOPruxgupbuhau`pO `h ?ءUmOPtVpO s 3UoOPxuxyupzuh&: 3 Q gUmOPruxgupbuhau`&:  pUmOPruxgupbuhau`&:   Um OPr uxg upb uha u`&:  F Q&0Um%OPe%OS&:'  H>0VUm=OPa=ux&:?  V`UmUOPdUOS&:W yy587G8z?7 6lTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  36O<454 x# y# z#475  r# g# b# a#6 6x' n(O# =)7# *7#$ +7#D 6,#d O-#h 7.O#l /#p ~.0#tB61BJ48 n9O# uid>O# ?# ~.@# K4AY6q :7rO# poss#6t040{ L8|O# `6}# 5~# 7# pO#,%4dCt4\ nO# pos# rot# J:#4 O#L J<#P C#T ~.C#X47 nO# pos# =7# 7#< 7#\ ^O#| U# O# # ~.#T6TQ nO# D5O# *3# Q# ~.Q#8ѣUQ8O ZOP19}UQ8|O6Z~OR7.%U8^O0gU7lOpU|9zOU`9O\U9OaJp  p `d9`]U:7Oxyz0ZOPP9OYF9`ŧU:7OyZO57OJV  V F8Ч U:7Ov.k8UZOL V9US _nO P7!7` ,:8!U"S7 Pn7O!79  {8W0tUSV 3nVOu#rX 9qOU9pOJ  `: 7: UL8O!ZOMh 9O %9: UL8Ov!ZO!G8OJ     q9: KUL8O#p: +& 9PVU!ZOI!:\m 8m `UnOz 9m !;:m I [7.m Un-O!;:/m  :Nm KUnMO #rOm N \8aPU!q5bm l!:c$r7m U 8 UnO 5 !4  7 UnO!4  7 ЮUnO/#r q" ?7U!4 $9" U  :/ ѰU%n.OP i70 !91  (7a Un`O!9b  9 ;UnO#r ?"H9@U!9 ]$$8 U8$US{nO 8!8W80QU"SPnO!8</8`USOnO#r9TOc 8UOc 9VOc &y&y&y&9O'3 '^.3 '8:  'x7m  '9  '*8  '8 '7 O ':9#:  '58$O *;}?= 6lTygVintFbk ;VSzKdlqzz]L.TH.RC O#a### .###4## '#$Q#(6#,#0 #4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LAT#THBT#XVFDO#\F#`\ n  # 0# {>O#h  a  3 N K J%# M K%# ? L%# A M%# : NJCTd #p#O#pd)4vQ F  G# 1 H#6O<<=54x#y#z#4Z5 r#g#b#a#6 6x'n(O# =)Z# *Z#$ +Z#D 6,#d O-#h 7.O#l /#p ~.0#te61eBJ48n9O#uid>O# ?B# ~.@B# K4A|6q :7rO#poss#6tS40{ L8|O# `6}# 5~# Z# pO#,H4ft4\nO#pos#rot# J:#4 O#L J<#P f#T ~.f#X47nO#pos# =Z# Z#< Z#\ ^O#| U# O# # ~.#w6wL 9 l :O#  ;O#<nOڳUmu,mPnOunu=O Uu,POuuER;O:Uu,POuu:O@jUu,POuu<OpUu,ĉPOuŸu> <OʴUu,ىPOuڸu F:OдUu,POuu ;O*Uu,POuuA =O0ZUu,POuua JOV LzJVJ;JO# Z>"O`Ue?"# P"Ou ",#3A ȵT a ȵ  t  >2OU1u,1P2Ou2u;9 U a<VOUUu,UPVOuVuD p<lOUku,kPlOulu >OUu,POuu <O JUu,POuuL P:OPzUu,POuul EV FEVE=OUe?# POu Q,L ȷ߷_ l ȷ߷  u>O:Uu,POuu n:@nU!g" u}<O  #&=/p}Ue?/# P$(?U#B:(ɽUe?(# u:5OнMU"7u}48  #<PU%xO%yOMV?O$m=U#4;U&:4&iO"<:ud J $;CyU <cU'abu 'bbu$'cbu<(rd(led;US+&iOV)cuZ;x&v- - |$<>)#=0'*>*&#/;0%(")ܱ#7<U=d"5u~"9=u~>H>&v-&tv- "<u"::uX"<:uH"&;:u!=:#>;NU Ogl#D=u Ue?u# "Rw#ut:x;yz~=^O Ue?^# P^Ou +^,,_WL h_ l h  Dj>sO2Ue?s# PsOu +su,,tL _ l   <O@Ue?# POu +,,L _ l   Dx:ORUe?# POu +5,,wL /_ l /  N?O`Ue?# POu +,,L _ l   D<OrUe?# POu +ʸ,,ˉ7 L 8O_ l 8O  >OUe?# POu +U ,, L _ l   D2>OUe?# POu + ,, L Xo_ l Xo  < O"Ue? # P Ou   , W L _ l   N#>EO0Ue?E# PEOu Eu ,F L x_ l x  '<[OGUe?[# P[Ou [ ,\ L _ l   X;qOPUe?q# PqOu q5 ,rw L _ l   P<OgUe?# POu  , L (?_ l (?  b;OpUe?# POu  ,7 L _ l   ----9 O. T.^ .T/5,O-/76-Oh-/5.Z-/5/O-/r>2-/=3-/?4-/>5-/=<(d /:= d /;>d />?d /G=@d /:Ad />D:c /;E:c /=F:c /;G:c />H:c /=J# -/<NO -,O/^=PO /_:V`-/:?WO 0%0I=/?YC 6Y 0lTygVintFbk ;aSKol]L .IH .RC Z#a # # # . # # #4 # # ' #$Q #(6 #, #0 #4 "Z#8 &Z#<  (z#@ ,>#DG -L#F" .#G 2#H$ ;#L A_#TH B_#XVF DZ#\ F#`Y 7 g a  n  # 0 # {> Z#y r 3JC_@Ea5 #A#Z#A5C@_e+Kw}a4GMKZ#5#Z#HZ# *I#ZLZKK*66I5GLNcZO*Pg#I#?#zG# wT#cBPo-T _#2T _#ZD/GYA _}E IM6`KDKD2dZ#SCZ#J#S# B#F#NIENI8EJ#nD#SZ#@Z#AZ#EZ# -RZ#$cKZ#(kK$#,VD#0HJ#4YHFYHF:CbX#1Ae1#h_#t# key#gAH101_ BJCXZ_XTLjX1_.UNX(PwrUxrty}IZ 7^XX $X1aDX1a*xR 1A1#$FZ#MX#RPXIDGEBOETQE{RE#IeaOf?iDkDl@mTl[ ^B &Z# [ # ?q # C #  q Z[ a _B GC  @ T #V#& Z#)R E# S E#@ E#A Z#L Z#w "R c _Z#^MZ#_Mc # ?,  P3T" #?# #@$#lc%Z# b%Z#R&Z#QH&Z#D'Z#tF( # B)Z#$A*c #({H+ #,CM, #0:A-E#4F.E#8~@/Z#<LE/Z#@nM0Z#D`C1Z#HR2#LR i uB3u  <R\DC#|BDE##HE#HFE# .FGZ#FHZ#nMIZ#MJE#AKE# ALZ#$AM#(HMN#,)MOZ#0MP #4HQ#8JTR  5 xZ#yZ#lcZ#bZ# ^EZ#@#QFZ# Q  BE#red>#>[>#4Z>#SC# pad# TA  R <[\NZ#UOE#NPZ#?Q# |KR#@S#yKT#YU#xVZ# yVZ#$ @WZ#((GWZ#,^X0#0 LY0#4BZZ#8 N[ <m\`Z#UaE#NbZ#?c# |Kd#@e#yKf#Yg#xhZ# yhZ#$ @iZ#((GiZ#,^j0#0iBk0#4BlZ#82Rm<\rZ#UsE#NtZ#?u# |Kv#@w#yKx#Yy#xzZ# yzZ#$ @{Z#((G{Z#,^|0#0M}#4B~Z#8EJD\Z#UE#NZ#?# |K#@#yK#Y#xZ# yZ#$ @Z#((GZ#,WFZ#0Z#4BZ#8HZ#<^0#@I0\Z#UE#NZ#?# |K#WFZ#Z#F4\Z#UE#NZ#?# |K#J #_T<H(\Z#UE#NZ#?# |K#xZ#yZ#lcZ#bZ# HZ#$8J0\Z#UE#NZ#?# J#xZ#yZ#lcZ#bZ# HZ#$RZ#(SZ#,hST\Z#UE#NZ#?# J#RZ#SZ#U\Z#UE#NZ#?# |K#^Z#$E0\Z#UE#NZ#?# J#|K#xZ#yZ#lcZ# bZ#$^EZ#()MZ#,H 3\Z#UE#NZ#?# N#|K#O\Z#UE#NZ#?# N#|K#LZ#G?1 \Z#UE#NZ#?# N#|K#)MZ#\I \ Z#U E#NZ#?# J#|K#tQ=I(\Z#UE#NZ#?# N#|K#J#xZ#yZ# )MZ#$C4,\!Z#U"E#N#Z#?$# N%#|K&#x'Z#y'Z#lc(Z# b(Z#$^E)Z#(N*#,)M+Z#0IP,U 6\/Z#U0E#N1Z#?2# N3#|K4#x5Z#y5Z#Q6*'?\9Z#U:E#N;Z#?<# |K=#lc>Z#b>Z#R? 8N\BZ#UCE#NDZ#?E# JF#|KG#xHZ#yHZ#lcIZ# bIZ#$^EJZ#(NK#,LZ#0FAME#4QN3X\QZ#URE#NSZ#?T# NU#|KV#WZ#PX b\[Z#U\E#N]Z#?^# J_#|K`#aZ#Jb m\eZ#UfE#NgZ#?h# |Ki#Bj#Yk#^lZ#Dmw\pZ#UqE#NrZ#?s# |Kt#Qu#Yv# Aw(\zZ#U{E#N|Z#?}# E~#L#Q#b3#N# Y#$:F"_$\Z#UE#NZ#?# L#Q#b3#N#Y# ? \Z#UE#NZ#?# |K#M #newZ#^Z#Bk!b!s1lA1 AS Q 0\Z#UE#NZ#?# |K#TO#}cZ#*#LQa \Z#UE#NZ#?# |K#0SZ#LZ#HZ#p@ \Z#?#Q#UE# 7#U7#S7#?m A!\Z#UE#NZ#?# |K#M "U`\ZtKA!MhBL|MH0GHCONSN3FD1RBJIGNaN'&S lTS  NE@Q_ESUa N Bpad"" UM!g# CS#BS#lcS#MS#TS#5E># Q## g #E E#K s#$PT #fid#V0#AD0# Q0#JQ0#P0#TZ#E0# GZ#$G$#(CIg##,Tg##8C$#DMZ#HTZ#L#g#S#$XIC$$@|Dz$$T I$%BZNa8KQ"%K%Z$aZyITW%{%$Z{%l%C XNY%#SS\%#_#%K%Cb%Z&ES k\lZ#Do#TGq %#?r %# Ms %#%uZ#BxZ#S{Z&#%ES%7T<x&&$;G>kE?&&$&" 'b@Bq`C0#UD '#VH'#UL'# &l&&b@P&)wA?#I#UZ#Ac # _Z#|K#K #K #j? $# K #$K #(N#,;M %#0U %#49D5 #8K0#TC #XKE#SC0#K#K$#RN#jOZ#rOZ#zO#O#O#I Z#C Z#G!Z#O"#O##O$#O%#@&Z#A'Z#L(Z#K)Z#J*Z#wA+)' )$)') U 0 gM 6 ZN 0< )<))=u*r-=t Uى-# P /# ?# Q$# # LS# D$# KZ# MZ# jHZ#$ RZ#( Fk#, GZ#0 IZ#4 UZ#8 GZ#< QZ#@ |PZ#D PZ#H ECZ#L sNZ#P OZ#TtLZ#XAZ#\@Z#`JZ#dSZ#hAZ#liRZ#pEZ#tGZ#xT Z#|? Z#-DZ#iJa#gQa#tGa#J#cFZ#?T/#E/#N/#K/#E/#H /#F$#0@%/#\F&Z#M' #O(Z#yR)Z#M,#/#M. *# G/ *#@0 *#A1)#=Ow}---*Ex--Z-ZlT.( 'A c #V #B Z#_ Z# & Z#)R "E#S #E#@ $E#I %Z# A &Z#$1Q '-/( DM : #S ;E#@P <E#P =E# Q >E#S ?E#T @E#P AE#V B# bJ C#$C D`.B=//GT.Cx&D%B&/K  V/# P/# U/#)/4/?/KJ/r-/S-GURaU t-s J0N1ZPFU,0  @2Zux!U2Z !O2Z !6B2Z "q0BBqP]U#/Op/P"0sJ{`mU#/Oz/P"0t?p}U#/O/P"0{FU#/O/P" 1KU#/O/P$PU"V1O@U#e?-P#/O/R"1[GU#e?-P#/O/R"1@ 1U#e?-P#/O/R"1G@QU#e?-P#/O/R%)2H`U( &e?-"b2TUe?-S /O/~ "2fI U#LP#+O2R AZu| XP-"2D$FUe?#2 2 *%"3NtPUs &e?u-%V3LU &e?-'4M; (dpy9)L:Z)S:4)RJ:$&WR<&6=Z&R>Z*i?Z&P@(4&@A& HBZ+3&CMI +4&CMo ,&CM #4 T./6&J%U#RJ$u#JPK*&e?-!S#/wdpy!CM !LZL!|K!XJ Z L 6u_!H Z=  Zul-swa u qF6`h  OC6 h .J7 /o5!TNZ/5!B3-/5!LZ Z'/5 @<T.u!H=Z_05&_nZ06!Ii Z!Jl )1|6V323232t32h3343&43O434343J435306"!B-e!7N /x065306Ig546%546Z77Z 7  7%M7D 0U#K u!e? -8RZTU#,ue?-#ZP#lP#SCZP GZu@ IZuD UZuH GZuL QZuP yPZuT PZuX BCZu\ pNZu` OZud qLZuh AZul&@Z&JZ&SZ&AZ&TZ!QUZ!yUZ gHZup88-N(t-9BZ`KU#P#,u #Zu#lu&ga&%D$!RJ$2&e?-95^09k&UE )198Wf286&UE9!bR9f/)':C -)e? -*t -%{:O PU# u!e? -!RJ $:9q296q4:8:D(t-&~.-*pos-% ;8S U# u!e? - :{:Lp2:304:>5:"C;E Ue? -r(U Z"l;_P IUe? -";? PUe? -!%;F U LlC &&e? -"<U Ue? 2e-<oG a .U#e? 2PX< K Z0;U#e? 2P<M Z@KU#e? 2P<(L P[U#e? 2P<Q $`kU#e? 2P8=R (dpy )CM )I Z)#] ))YP &@ )&rH *i Z&P Z&QA ,*dr *dg *db &X >ZU Ep'Ue?~ 2;red~ )u #>[~ )u#4Z~ )u/j>H #P uh&YP Z:<2=2 =<< <<4<<T3`5#==/=u\4;=r4E==Q=a35^==i=\=t=[5=">F 0Ue? 2#B Eu ">?I Ue? 2 #Z EP;red )u#>[ )u#4Z )u6  #P up*@? )>U#e? 2PKO ay H Zh !SD $!S Z! Z H Zup!1C )!g a'.J*@ 0@0Xi Z:3io ZM !"u@F @U#e? 2u1C )ki Z>@JZ)a>@L)Ja)J$);JZBF4ZU#2u#,2u #2Zu#3lu&e?5-!6Z! 7XV --8uh&+O92/A&I%&I%0A&5PKa/A!1Cg)!?hr:u@2@:@2@2@2@"+BM Ue? -"TB C  cUe? -"{BP p}U#/O /PBM ZU#e? 2PB1H ZU#e? 2PBD ZUe? 2>mCH EWUe? 2];red )u #>[ )u#4Z )u3 #P ut"CU `Ue? 2#B Eu "CJ% U#$ PCTQ, U#e?+ 2P",DH3 U#e?2 -P#2 RWD=Q? U#e?> 2PDpBE  U#e?D 2PDDK Z .U#e?J 2PD@Q  0AU#e?P 2P'zE|N Z)v a)J Z)lc 0)b 0*fp zE&aS *&?R Y&Q 0*i 0*pos Z&~L 0,*pix '#FQ *)J Z)lc 0)b 0&V *&J )&}S )&G )&A )&]S )&G )&}c )&q` 0GIZPUe?2#vaP#JZu#uCGu& HZ!Z  lc0u b0u*dpy&LZ:D 2E2E2D2D34E*4%Ei41E4=E4IE4SE 4_E 1GE2E2E2E35E4E$!4EP!4E|!4E!4E!4E"4 F,"4FU"385lEG2G"`H4Lo/U#=m)^#:m)\#<m)[;topm)[#Y=n)_;farn)[#jUn)[#En)u$ 4Op)]?FR)X H`&  HWqH@d  R/ا  E/ԧ  N/Ч  K/̧  )@/ħ  E/ȧ  @N  DU  E-ܧ FI)7 N 5I  #T 5I @ @ @ #$AӎM&0?[ 6Y 0lTygVintFbk ;aSKol]L.IH.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAZ#THBZ#XVFDZ#\F#`O77 b n  # 0# {>Z#n  g  3N KJ0# MK0# ?L0# AM0# :NY KQ0# MR0# ?S0# AT0# YV0# JWT# WXT#V\Y# U06Z<4   # E  _7[V0WE`^Z\ M6<V;a NagxI _8 R ^ SI# M[ T# ` U# a WI# [ X# va Y#msg [# ^ \k# ` ^+# \ _V#$ ^ `#( c bZ#, ^ c#0 ] d#4k^ P BZ#OD[ ex= & Z % *|# +Z# ,#? -  W E\ aW !>]_ #7Y +%k] l^ oZZ pI ^] s[7Y u\#` vHX I]Z [\ bred #>[ #4Z #]R_g^ Z #red#>[#4Z#Y#Nb`red #>[ #4Z #Y #yZ #F_s1Z red#>[#4Z#yZ#c#d^D]I10X g m#_ #L=#rc# YO] #_` Z#key%m#2&m# ](# ]0d[1   H`FG#]H #dayI #J #XK #rYL #_M  aXgY #*ZI#q`[#  ^ #  V` ca  yn[ lc#b#b#X# V#V#{_#b #b #c #[ #V #/[ #_ #_ #]y# !W#(W #,_Z#0XZ#42 #8Y #<c#D_=#LWg#Pq\g#ZX#dX#hV #lZ#pYa#t?b #x` O#|W#&^#z`#"a#<[#Z#2Z#Z#(\-m#bY.#jY/#Y0m#9Z1#]2 #[3 #s_8#V= #@W># bCm#'WDm#WF# `G #kZL#^M#L\X #acZ#a[#Z^m#SX_m#[f#bj%#Wn%#"^o%#v`p%#aq%#8[r%#Zs%#.Zt%#Zu%#   X`x "czc lc#X#b #b # /[ # _ # ZZ'W9hX4#c6#Y7#XY81#a9#W:#][;1#Y>#~[B#9\I1#[J # [K #WFO#SCP#^Q#[Sq#YT=#l`U#bVZ#cWZ#jVXZ#VYZ#VZZ#lc\#b]#_^#__#X`#Xa#cb#Zc#`d=#]e=#]f=#V[g=#{]h=#_i=#Zj#`Vl#crcm#Vn#Vo#{_p#aq #`r #Ys #a`t #9^u #Yv #bw #bx #by #_z #/[{ #c| #_} #4a#\ #W#q\g#-`g#Y#X#]#VZ#!W#2b#"Y=#]=#.^=#|W#[#6]#c#V#_=#Wg#>^"#O^J#@XV#C^#:`y#Y=#X=#3_=#_=#OV#d#`#Qc#`#[#cZ#&bZ#\#X#Lam#]m#^=#GY=#`O#a #9c #=c=#XO#XO#XO#XO#Vm#s_#5V1#`#mWZ#qW=#` #]#EZ#V #a#b%#[ #b) #\*#`+#wX01#T]1#.]2(#]6=#[b:=#\;=#Z==#cB #aE#a\F#4W-TYaka=a"Z.4JZ ^._bhys^bgb=Z5\=1V Z c' (1c(4:K1a570:Ured57u>[57u 4Z57u{VW@U,cXux|\Ys"yYcZUicZ"pdZQn\Z Q lc b *I!dT YZ"xZ"yZ"cZ#Z$]`U%Q"%lc"%b"%}c#*IS%YZ9#bZu&dTZ#I#'X[(<(3((((()P*G&$*P$*Y%+buL,jW ZDU-fp yu.b ju /bpuH0pngul/V)uh/bud1*=%1^%1X &1lc6&1bV&1_Zv&1#]Z&2i&3D/J^LZuP 7 =4DVZPUv\P%bj&Z,'&fpyJ'5|Eap QpZ!d1p|!w1pZ!h1pZ!d2p=!w2pZ!h2pZ"sxq"syq"xrZ"yrZ"xxrZ"yyrZ"crZ"ds==,U \vZ#U-fpvyu.JcvZu ._vZu.bvU u1cXws'1aXw'/bxpu2pngy'1V)z'1b{'1*|='1`|=D(1^}(1X~(1lc>)1bu)2rw)2rh)1_Z$*1#]Z[*2i*61/[[ $+'7%7+7s+((7+(()+/\+9]*C+*L ,8U*_E,*i,*r,91{c,1_ ,9 :p(=1W(=%-2q(=-2r)Z.2g)Zw/2b)Z02a)Z1)2palD21J^Zd21)]2Z, WjZ#8$U.vj\P.JcjZP._jZP.bjU P1kZ22fply3;.![0@$$U> {Da1P&?3kdlTygVintFbk ;VSzKddOl]>H .RC O#a # # # . # # #4 # # ' #$Q #(6 #, #0 #4 "O#8 &O#<  (o#@ ,3#DG -A#F" .#G 2#H$ ;#L A>#TH B>#XVF DO#\ F#`F  n  # 0 # {> O#R  K  3ddJC>  ##O# 4XID G:B O:{ R:#I e8aO f8@ m8R  Rz<[\NO#UO:#NPO#?Q# |KRY#@SY#yKTY#YUN#xVO# yVO#$ @WO#((GWO#,^X%#0 LY%#4BZO#8N[|<m\`O#Ua:#NbO#?c# |KdY#@eY#yKfY#YgN#xhO# yhO#$ @iO#((GiO#,^j%#0iBk%#4BlO#82Rmo<\rO#Us:#NtO#?u# |KvY#@wY#yKxY#YyN#xzO# yzO#$ @{O#((G{O#,^|%#0M}#4B~O#8EJD\O#U:#NO#?# |KY#@Y#yKY#YN#xO# yO#$ @O#((GO#,WFO#0O#4BO#8HO#<^%#@I{\O#U:#NO#?# |KY#WFO#O#Fo4\O#U:#NO#?# |KY#J#_T  (\O#U:#NO#?# |KY#xO#yO#lcO#bO# HO#$8J{ 0\O#U:#NO#?# Jd#xO#yO#lcO#bO# HO#$RO#(SO#,hS# \ \O#U:#NO#?# Jd#RO#SO#U  \O#U:#NO#?# |KY#^O#$Eh  0\O#U:#NO#?# JY#|KY#xO#yO#lcO# bO#$^EO#()MO#,H  \O#U:#NO#?# NY#|KY#O  \O#U:#NO#?# NY#|KY#LO#G   \O#U:#NO#?# NY#|KY#)MO#\I  p \ O#U :#NO#?# JY#|KY#tQ (\O#U:#NO#?# NY#|KY#JY#xO#yO# )MO#$C| 4,\!O#U":#N#O#?$# N%Y#|K&Y#x'O#y'O#lc(O# b(O#$^E)O#(N*Y#,)M+O#0IP,$w 6\/O#U0:#N1O#?2# N3Y#|K4Y#x5O#y5O#Q6?\9O#U::#N;O#?<# |K=Y#lc>O#b>O#R?8N\BO#UC:#NDO#?E# JFY#|KGY#xHO#yHO#lcIO# bIO#$^EJO#(NKY#,LO#0FAM:#4QNYX\QO#UR:#NSO#?T# NUY#|KVY#WO#PXb\[O#U\:#N]O#?^# J_Y#|K`Y#aO#Jbef m\eO#Uf:#NgO#?h# |KiY#BjC#YkN#^lO#Dmw\pO#Uq:#NrO#?s# |KtY#QuC#YvN# Awr(\zO#U{:#N|O#?}# E~Y#LY#QC#b3C#NC# YN#$:F.$\O#U:#NO#?# LY#QC#b3C#NC#YN# ? \O#U:#NO#?# |KY#Mo#newO#^O#B:bsl   H z 0\O#U:#NO#?# |KY#TOC#}cO#*#L 0 \O#U:#NO#?# |KY#0SO#LO#HO#p@\O#?#Q8#U:# ,#U,#S,#?<\O#U:#NO#?# |KY#MU`\OtKMhB|Lo|MHG C O\ N S N F D RBp JGNwaN&SlTYS NfE@Q.ESU0NBopad z U IB"|A Y^OP&&U]u,]2u ]O3]P_"$4dpO&'Uou,o2u oO74oP5eO':'U~u,~2u ~Ob4~PeO@'Y'Uu,2u OuudO`'"(Uu,2u Ouu pidTEeO0((Uu,2PO4PRJ4!eu"2e(`)U#,24#5"d `))U#, 2e5# 5$&e-O)+U#,,25")ds,,U%rOu%rP&G%d O'__c O"Vd,>0U%Ou%u (g) Vu}(?*&A6(U3)2d )d| )=ex )dt )-dp )_dl )dh +,,(:dO f ,JO-@,Lz-J@-J-;JOdO@01Uu,2u Ou_6RJ6.Tf00/y000///.f00/y000///.f.1P1/y0.1P1///0fP1h1/y0P1h1///  01 Pe2 2 2 2M"29 O3 >3^ .>4,H2-4TdI-3^U5%2W22  5d  5d5d5@dSG71?1kdY0lTygVintFbk ;aSKol]>H.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAI#THBI#XVFDZ#\F#`D7  n  # 0# {>Z#R  K  3 ##Z#4X>f  Z# 2# Z#>f !|A ced14Ueeu~ef6  fstrs^eiZ % %m5 > Z > Z"%"%5">"Z">"Z4*%*%5*>*Z*>*Z-%-%k5->-Z->-ZX e[47U sZ 7!+/Zw7"\up#45$$%& &'7')7  4( e)))), )g)M)9 Z* I*^ .I+Zdi +eZ`i +dh   +dh +d" +@d# +e$h +f' *e))o.h):i,~],],_~I: 7?fkdlintKTygVFbk ;]S3kl]>f ,#2#,#>f wH. RC ,# a# # # .# # # 4# # '#$ Q#( 6#, #0  #4 ",#8 &,#< (v#@ ,A#D G -O#F ".#G 2#H $;#L A#T HB#X VFD,#\ F#` n #0#{>,#~  w  3 Ef& 7&9U'7=fA09E9U@Rb8fHP9e9UGPfPp9:UsO(8OH8f_ ::Us^8^8n^,9  4Off f, ,f,  9,^.  J˜a:? glTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  3, g# \O# def#  "# i opIO# lQ5# rQ5#H, *D. \O# # # box# f # g!# !g"# g## f$# {g%#$ f&#( f'#, lg(#0 Lg)#4 f*#8 g+O#< Bg-#@g.3tDQsKcLiMtvN"tOwP*4iS({>f   O# 2 #  O#>f JC3 #'#O#'-cfO__cOsO:%;Ugr"9;;:duOf0;\<Uh~OX9g~9v9-tg`<<Ug9hO:v6:og<<UgP&Ou symI:g=R=UgPsu}  GO`=P>U\Og:Pp: z0P>]?U!tP"f"`?m?U  ,p?^U#t+:$\+O;%w-*&s.r=&arg/='g3u~'f3u}   ^4`U!tu(O=&topO=&iO= Qf@``U#s=%iO&p5>) &gO`aU*u*,9u *Ou*?u'up&iOH>(HOf>&sp>&p >(b% >+@ 0gOaaU!s1 P!s2 P P 4,@ $, o -:g*_   ss2    -Wk  '/Ohi '0 '0  '0O 'G0 O  1 O'/ !  .y.y.y/ 3 .9 O/^ .3 /)  -/Sg4! @-00O 10g1 0agO0O M+ga?/glTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  3 D. \O# # #box# f # g!# !g"# g## f$# {g%#$ f&#( f'#, lg(#0 Lg)#4 f*#8 g+O#< Bg-#@iopIO#lQ#rQ#Hg.DQsKcLiMvNjtOwP4j,N g# \O#def#  j# %iS, %{p/)anbUi(>t*>hBpbbUiAOutC?1&hPbncUsOPtQE?f8h^pcdUw]ut_c?hlddUsymkP\kOPtm?hzdeUvyPdefyPt{?,0eeUt1P/OPt?zz/efUt1P/OPt2Pt?/hfgUt?  1gyyy3 9O^.3Npzg?hglTygVintFbk ;VSzKdl]L.>H.RC O#a### .###4## '#$Q#(6#,~#0 #4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA>#THB>#XVFDO#\F#` ~n  ~# 0# {>O#G  @  3, g# \O# def'#  -# 'i opIO# lQ@# rQ@#H, 5D. \O# '# '# box'# f '# g!'# !g"'# g#'# f$'# {g%'#$ f&'#( f''#, lg('#0 Lg)'#4 f*'#8 g+O#< Bg-'#@g.>DQsKcLiMvN-tO'wP54iS3Oh0ghU\/OuhM h^hUJhLO]@=Ahb`hzUta|@fpa=vAwc5argdByhzzUv1Bfp=sB  2yYhAPfz?hglTygVintFbk ;VSzKdl]3H.RC O#a### .###4## '#$Q#(6#,s#0 y#4"O#8&O#< (o#@,3#DG -A#F".#G2#H$;#LA3#THB3#XVFDO#\F#` sn  s# 0y# {>O#<  5  3, g# \O# def#  "# i opIO# lQ5# rQ5#H, *D. \O# # # box# f # g!# !g"# g## f$# {g%#$ f&#( f'#, lg(#0 Lg)#4 f*#8 g+O#< Bg-#@g.3tDQsKcLiMtvN"tOwP*4iS({ ##O#;#O#O#;# K hBzƓUtABwC*argHChBГUvACnCKu~  3h h` vM@ yy, $R ?1gY0lTygVintFbk ;aSKol]>H.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LA>#THB>#XVFDZ#\F#`F n  # 0# {>Z#R  K  3, g# \Z#def2#  8# 2iopIZ#lQ=#rQ=#H, @D. \Z# 2# 2#box2# f 2# g!2# !g"2# g#2# f$2# {g%2#$ f&2#( f'2#, lg(2#0 Lg)2#4 f*2#8 g+Z#< Bg-2#@g.IE\3Z4252box62f72g82!g92g:2f;2{g<2f=2f>2lg?2Lg@2fA2gBZBgD22F 1Z#fEK#iF|DQsKcLiM|vN8tO2wP@4iS>f   Z# 2 #  Z#>f Dsd|iZvtw@f2> Sci< U|iR@UwQ@ufQ2D~ih WUsgPuiv`UsuDiWZUVZu [ZDlex F R  I; }PQ1 Fn  P! %A/  JE! /q`ZE Hq`ZE"msg#xZFHZF$'2/F$C#iXZcG$at/G$g!+Z%ZG%R!+]%]G$  4&.i 'f( 4    S (    5 S'( F   $ [ S ) Hm    K @ ) a @2  r S ) u   S )    S'),     S ) 1 @   G S') Y 6  6 n S )     ^ S')    S')  &  ) Zli )O $Z *yyn%Z ) &/ )= ' ) (Z ) )Zd  c S ) +S   $ )\,u  )T ./xi )p/ti )C ;Zpi )? <Zh )! G$ ) KZl +++, >+9 Z,^ .>+,\ -ag5Z`   .+Sg7t -i8@--F+Z--&i$ --iZ--Z-2 T?%jgY0lTygVintFbk ;aSKol]L.IH.RC Z#a### .###4## '#$Q#(6#,#0 #4"Z#8&Z#< (z#@,>#DG -L#F".#G2#H$;#LAT#THBT#XVFDZ#\F#`O7 \ n  # 0# {>Z#h  a  3, g# \Z#defH#  N# Hiop IZ#l QS#r QS#H, VD . \ Z#  H#  H#box H# f H# g !H# !g "H# g #H# f $H# {g %H#$ f &H#( f 'H#, lg (H#0 Lg )H#4 f *H#8 g +Z#< Bg -H#@g ._% E\ 3Z 4H 5Hbox 6Hf 7Hg 8H!g 9Hg :Hf ;H{g Hlg ?HLg @Hf AHg BZBg DHH F  1Z#f Ea#i F%D Qs Kc Li Mv NNt OHw PV4i SD sdiZvtwVfHT  :>f   Z# 2 #  Z#>f x 6 g3#val4Z# 5Z#P gN# OZ# g# Z#CjU%UcZGM.jUg Mu}]HU3" ] 2posZj  -iZgiZZendZcmpZ %%!5IZ IZNjZgÞiZZendZcmpZ %%!5IZ IZ"E#V" F#EV#E  iZg۞iZZendZcmpZ %%! 5IZ IZ{ i5U$c4Zu% c&'q8H(}u}%? Y)&*'H'H*+,**,-Y)>&*I'RBI']I*h+n*t*% ),))- .posZI, a/# J&*. '7 ^J'B J*M +v*Y *d %O ),)),),)) 10{ i1i-Z  E 1j6 @l  x .1jP j   1i i 1j 1c Zi 1iZ 1^Z 2222&ir3 T 29 Z3^ .T  2g 2-2Z2Z2"4/ :49j05Z5% OW/build/buildd/glibc-2.3.6/build-tree/i386-libc/csu/crtn.S/build/buildd/glibc-2.3.6/build-tree/glibc-2.3.6/csuGNU AS 2.16.91%% $ > $ > 4: ; I?  &I%% : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ; : ; I : ; I8  : ; I 8  : ;  : ; I : ; : ;I : ;' I<  : ; ( I.? : ;' I@ 4: ;I !4: ;I" U#4: ;I$: ;I%.? : ;' @ &.? : ;' I@ '.: ;' @ (.: ;' I@ ).? : ;' @ *: ;I +4: ;I,: ;I -: ;I.4: ;I/.? : ;' I@ 0 : ;14: ;I 24I4  3.? : ;@ 4!I/5 6 74: ; I84: ; I 94: ; I? < :4: ;I? < ;4: ; I?  4: ; I?  ?4: ;I?  % $ > $ > : ; I I  : ;  : ;I8 : ; : ; I8 I !I/ : ;I<  : ; I8 .? : ; ' @ : ; I4: ; I.? : ; ' I@ 4: ; I: ; I : ; I 4: ; I4I4  &I4: ; I4: ; I? < 4: ; I?  4: ; I? % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/  : ; I8  : ; I 8  : ;  : ; I : ; .? : ; ' I@ : ; I4: ; I.? : ; ' @ : ; I4: ; I : ; I 4: ; I4: ;I.? : ;' @ : ;I4: ;I U!.? : ;' @ ".? : ;' I@ #: ;I $: ;I%4: ; I&4: ; I '4: ; I? < (4: ; I?  )4: ; I? *4: ;I?  % $ > $ > : ; I I : ; I   : ; : ; I8 : ; I8 : ; I 8  : ;  : ; I : ;I8 &I: ; I!I/  : ;  : ;  : ;  : ; I.? : ; @ : ; I : ; I .? : ; ' @ .? : ; ' @ 4: ; I 4: ; I 4: ; I!.? : ;' @ ": ;I #.? : ;' I@ $4: ;I% : ;& : ;' : ;( U)4: ;I*4: ;I+4: ;I, - U.4: ;I /4: ; I04: ; I 1!I/24: ;I 34: ; I? < 44: ; I?  5!% : ; I$ > $ > I!I/  I : ; : ;I8 &I  : ; : ; I8  : ; : ; I : ; I8  : ; I 8  : ;  : ; I : ; ( : ;I : ;' I<  : ;  : ;I8 .? : ; ' @ : ; I !.? : ; ' @ ": ; I #4: ; I$4I4  %4: ; I &.? : ;' @ '4: ;I(4: ;I).? : ;' @ *4: ;I +4: ;I ,.? : ; ' I -1..? : ;' I /: ;I011124: ;I34: ;I4: ;I 5: ;I6: ;I7.: ;' @ 8 U9.? : ;' I@ :.: ;' I@ ;: ;I < = > U?.? : ; ' I@ @: ; IA4: ; IB.: ;' C: ;ID1E1 F1G41H I J41K4: ; IL!I/M4: ; I? < N4: ; I?  O4: ; I? < P4: ;I? < Q4: ;I? < R4: ; I? S!T4: ;I?  % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I : ; I8  : ; I 8  : ;  : ; I : ;  : ; .? : ; ' @ .? : ; ' I@ .? : ; ' : ; I.1@ 1 .? : ; ' I 4: ; I41 .? : ; ' I@ : ; I!4: ; I ".? : ; ' @ #4: ; I$4: ; I%.? : ;' @ &: ;I': ;I(4: ;I)4: ;I*.? : ;' I@ +4: ;I,: ;I -: ;I .4: ;I/4: ;I 0.? : ;I@ 1: ; I 2: ; I34: ; I 415 U6174: ;I 84: ; I94: ; I? < :4: ; I?  ;4: ; I? !I/?4: ;I?  % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I : ; I8  : ; I 8  : ;  : ; I : ;  : ;' I: ;I.: ; ' @ : ; I4: ; I U.? : ;' @ : ;I4: ;I .? : ; ' @ !: ; I ".? : ; ' @ #4: ;I$4: ;I %4: ; I&4: ;I': ;I(4: ; I)4: ; I *4: ; I? < +4: ; I?  ,4: ; I? -4: ; I? < .4: ;I? < % $ > : ; I I : ;  : ; I8 : ; I8 : ; I 8  : ; : ; I $ >   : ;I8 : ; I!I/  : ; .? : ; ' I@ : ; I4: ; I.? : ; ' @ 4: ; I4: ; I? < 4: ; I? !4: ; I? < 4: ; I?  !I/% : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ; : ; I : ; I8  : ; I 8  : ;  : ; I : ;  : ;  : ; I : ;' I: ;I : ; ( .? : ; ' @ : ; I !.? : ; ' I@ "4: ; I#.: ; ' @ $: ; I%.: ; ' I@ &: ; I'4: ; I (4: ; I).? : ;' @ *4: ;I+.? : ;' I@ ,4: ;I -: ;I.4: ;I/: ;I 04: ;I1.: ;' @ 2: ;I34: ;I 44: ;I5.: ; ' I 6: ; I74: ; I8 9 :.: ;' I@ ;1<1= U>41?41@.: ;' @ A.? : ; ' @ B.? : ;' I C: ;ID.: ;' E.: ;' I F : ;G : ;I8 H : ;I1J1K41 L4: ; IM4: ; I N!I/O4: ; I? < P4: ; I?  Q4: ; I? R4: ;I? < % : ; I$ > : ; I I : ; : ; I8 : ; I8 : ; I 8  : ; : ; I$ >   : ;I8 : ; I!I/  : ; .? : ; ' @ : ; I 4: ; I4: ; I 4: ; I 4: ; I 4: ; I4: ; I? < 4: ; I? 4: ; I? < % : ; I$ > $ >  I : ;  : ;I8  : ; : ; I8 I !I/ : ; I : ; I8  : ; I 8  : ;  : ; I : ; .? : ; ' @ : ; I 4: ; I.? : ; ' I@ : ; I: ; I : ; I.? : ;' @ .? : ; ' @ 4: ; I .? : ;' @ 4: ;I !.? : ;' @ "4: ;I#4: ;I $4: ;I%4: ;I&.? : ;I@ ': ;I ( )4: ;I*.: ;' @ +: ;I ,.: ;' -: ;I.1/1 0 U1412: ;I34: ; I44: ; I? < 54: ; I?  64: ; I? < 74: ;I? < % $ > $ > : ; I I : ; I   : ; : ; I8 : ; I8 : ; I 8  : ;  : ; I : ;I8 : ; I!I/  : ; .? : ; ' @ : ; I4: ; I U U.? : ; ' @ .? : ; ' I@ 4: ; I: ; I 4: ; I4: ; I 4: ; I!4: ;I".? : ;' I@ #: ;I $4: ;I%4: ;I &4: ; I'4: ; I? < (4: ; I?  )4: ; I? % $ > $ > : ; I I : ;  : ;I8  &I : ; : ; I8 I !I/  : ; I8  : ; I 8  : ;  : ; I : ; .? : ; ' I@ : ; I  U4: ; I: ; I4: ; I .? : ; ' @ 4: ; I.? : ;' I : ;I1 1!4: ; I"!I/#.? : ;' @ $4: ;I %4: ;I&4: ;I'4: ; I(4: ; I )4: ; I? < *4: ; I?  +4: ; I? < % : ; I$ > $ >  I : ;  : ;I8 &I  ' I : ; : ; I8 I!I/ : ;I : ; : ;I8 .? : ;' I@ .? : ;' I@ : ;I4: ;I4: ;I.: ;' I@ : ;I : ;I 4: ;I U: ;I4: ;I.: ;' I : ;I!: ;I" : ;# $ %4: ;I & U'1(1)41*41 +41, 1- 1. / 01 1 : ;24: ;I 34: ; I 4!I/54: ; I? < 6' I74: ; I?  % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ I.? : ; ' @ 4: ; I4: ; I? < 4: ; I? 4: ; I?  % : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ;' I: ;I : ; I8  : ;  : ; I : ; .? : ; ' @ 4: ; I4: ; I 4: ; I: ; I4: ; I.? : ; ' I@ .? : ;' @ 4: ;I.? : ;' @ .? : ;' I@ !: ;I "4: ;I #4: ;I$: ;I %: ;I&: ;I'.: ;' @ (4: ;I) U*4: ;I+.: ;' @ ,.: ;' I -: ;I. / 04: ;I 11213 4.? : ;' I@ 54: ; I64: ; I 74: ; I? < 84: ; I?  94: ;I? < % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I8  : ;  : ; I.? : ; ' @ : ; I.? : ; ' I@ : ; I : ; I 4: ; I.? : ;' @ : ;I4: ;I.? : ;' I@ 4: ;I.: ;' @ : ;I4: ;I4: ;I .: ; ' : ; I!1"1#4: ; I$4: ; I %4: ; I? < &4: ; I?  % $ > $ > : ; I I  : ;  : ;I8 : ; : ; I8 I !I/ .? : ; ' I@ : ; I4: ; I4: ; I4: ; I? < 4: ; I?  4: ; I? % $ > $ > : ; I I : ;  : ;I8  &I : ; : ; I8 I !I/  : ; I8  : ; (  : ;  : ; I : ;: ;I.? : ;' @ : ;I : ;I 4: ;I 4: ;I4: ;I.? : ;' I@ 4: ;I : ; : ; : ; U!4: ;I" # U$4: ; I%4: ; I&!I/'4: ; I (4: ;I )4: ; I? < *4: ; I? +4: ; I?  % : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ; I8  : ;  : ; I : ; .? : ; ' @ .? : ; ' I@ : ; I 4: ; I4: ; I4: ; I 4: ; I: ; I.: ; ' @ : ; I.? : ;' @ 4: ;I4: ;I 4: ;I!.: ; ' I ": ; I#.: ; ' $ % &.? : ;' I ': ;I(: ;I )1* U+41,41 -1.1/ 04: ;I14: ; I24: ; I 34: ; I? < 44: ; I?  54: ;I? < 6!% $ >  I$ >  : ;  : ; I8  : ; I8 : ; I  : ; : ; I .: ; ' @ .: ; ' @ : ; I4: ; I.? : ; ' I@ 4: ; I.: ; ' I@ : ; I : ; I.: ;' : ;I11I!I/ 4: ; I%  : ;  : ; I8 $ >  I$ > : ; I : ;I8  : ; I !I/  : ;: ;I : ; I8 .? : ; ' @ : ; I 4: ; I4: ; I.? : ; ' @ : ; I.? : ; @ 4: ; I !I/.? : ;' I@ : ;I4: ;I4: ;I4: ;I 4: ;I4: ;I .? : ;' @ !: ;I "4: ;I #: ; I $: ; I%4: ; I &4: ; I'4: ; I(: ;I)4: ; I? < *4: ; I?  % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I8 .? : ; ' @ : ; I4: ; I: ; I 4: ; I.? : ;' @ : ;I 4: ;I4: ; I? < % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I8 .? : ; ' @ : ; I4: ; I .? : ;' @ : ;I4: ;I .? : ; ' @ .? : ; ' I@ .? : ; ' I@ 4I4  &I: ; I4: ; I U4: ; I4: ; I.? : ;' I@ : ;I 4: ;I!4: ;I": ;I #4: ;I$.? : ;' I@ %: ;I &4: ; I? < '4: ; I?  % $ > $ > : ; I I : ;  : ;I8  &I : ; : ; I8 I !I/  : ; : ;I : ;' I<  : ; I8 .? : ; ' I@ : ; I .? : ;' I@ : ;I .? : ;' I : ;I: ;I4: ;I11.? : ;@ .? : ;@ !4: ;I"4: ;I #.? : ;' @ $.? : ;' @ %: ;I&4: ;I': ;I (4: ;I)4: ;I *.? : ;I@ +: ; I,4: ; I-4: ; I? < .4: ; I? /4: ; I?  04: ;I? < % : ; I$ > $ >  I : ;  : ;I8 I !I/  &I : ; : ; I8 : ;I : ;' I< ' I : ; : ; : ;I : ;I8 : ; I : ;I : ;: ;I.: ;' I@ : ;I4: ;I.? : ;' I@ 4: ;I !4: ;I".? : ;' @ #: ;I $.? : ;' @ %.: ;' @ &4: ;I'.: ;' I (: ;I): ;I*4: ;I+ , -4: ;I .4I4  / U0 11213 U4415416 7!I/8.: ;' 9 : ;:1;: ;I <1=41 >.? : ;' I ?4: ; I @4: ; I? < % : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ; : ;I' II'  : ; I8  : ; : ;I8  : ;.: ; ' I@ : ; I : ; I .: ; @ 4: ; I 4: ; I: ; I4: ; I .: ; ' I : ; I!: ; I"4: ; I#4: ; I$.: ; ' @ %: ; I&4: ; I'1(1) U*41+41 ,.? : ;' I@ -: ;I .: ;I /4: ;I 04: ;I 14: ;I24: ;I3 4.? : ; ' I@ 5.: ; ' 6 718419 U:4: ;I;.: ;' I@ <: ;I=.? : ;' @ >4: ; I? < % $ > $ > : ; I I : ;  : ;I8  &I : ; : ; I8 I !I/ : ;I : ;' I: ; I<  : ; : ;I8  : ; : ;I : ; : ;I : ; ( .: ; ' I@ : ; I : ; I4: ; I 4: ; I!4: ; I ".? : ;' @ #: ;I$.? : ;' I@ %: ;I &.? : ; ' I ': ; I(4: ;I)4: ;I *4: ;I+ ,.? : ;' I -: ;I.1/10114: ; I24: ; I? < 34: ; I? 44: ; I?  54: ;I? < % : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ;' I: ;I : ; ( .? : ; ' @ 4: ; I 4: ; I.: ; ' : ; I: ; I4: ; I4: ; I 4: ;I .? : ;' @ : ;I!: ;I"4: ;I #1$1% U&41'41(4: ; I)4: ; I? < *4: ; I? +4: ; I?  ,4: ;I? < % $ > $ > : ; I I  : ;  : ; I8 : ;I8 : ; I !I/ .? : ; ' I@ 4: ; I.? : ; ' @ : ; I : ; I: ; I4: ; I4: ; I 4: ; I? < 4: ; I?  % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I8  : ;  : ;  : ; I: ;I : ;' I.? : ; ' I : ; I.? : ; ' I@ : ; I 4: ; I: ; I4: ; I.? : ; ' @ : ; I 4: ; I .? : ;' @ !: ;I ".? : ;' @ #: ;I$: ;I%4: ;I&4: ;I'4: ;I (4: ;I).? : ;' I@ *: ;I +.: ;' I@ ,4: ; I-4: ; I .4: ; I? < /4: ; I?  04: ;I? < 1!% $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/  : ;  : ; I8  : ;  : ; I.? : ; ' I@ : ; I4: ; I: ; I : ; I .? : ; ' @ 4: ; I4: ; I? < 4: ; I?  4: ; I? % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I8  : ;  : ;  : ; I.? : ; ' I@ : ; I : ; I.? : ; ' @ : ; I4: ; I4: ; I.? : ;' @ : ;I4: ; I4: ; I? < % $ > $ > : ; I I : ;  : ;I8  : ; : ; I8 I !I/ : ; I8  : ;  : ;  : ; I : ;' I: ;I.? : ; ' @ : ; I4: ; I4: ; I.? : ;' @ : ;I4: ;I 4: ; I!I/4: ; I 4: ; I? < % : ; I$ > $ >  I : ;  : ;I8  &I : ; : ; I8 I !I/  : ; I8  : ;  : ;  : ; I : ; I.? : ; ' @ .: ; ' I@ : ; I : ; I.? : ;' @ : ;I : ;I.? : ;' I@ : ;I 4: ;I : ; : ; : ; U!4: ;I"4: ;I#4: ;I$ % &4: ; I'!I/(4: ; I )4: ;I *4: ;I +4: ; I? < ,4: ; I? -4: ; I?  .!% : ; I$ > $ >  I : ;  : ;I8 &I  : ; : ; I8 I !I/  : ; I8  : ;  : ;  : ; I : ; I.? : ;' @ .: ;' @ : ;I.? : ;' @ 4: ;I4: ;I 4: ;I.: ;' 4: ;I.: ; ' I : ; I4: ; I4: ; I ! ".? : ;' I #: ;I$: ;I %1& U'41(41 )1*41+ ,1- U.4: ;I/104: ; I14: ; I 24: ; I? < 34: ; I?  44: ; I? 54: ;I? < %W2 ../sysdeps/i386/elfstart.S`3!4=%" YZ!"\[# init.cP /build/buildd/glibc-2.3.6/build-tree/i386-libc/csucrti.St3!/!!Z!#!/= !/!!Z!gg//Z!!!E /usr/include/sys/usr/include/bits/usr/include/usr/include/tcl8.4/usr/lib/gcc/i486-linux-gnu/4.0.3/include../Miscmain.cselect.htime.htypes.hnotation.htime.htcl.hstdarg.heden.hsymptr.q.hrunset.hstdio.hlibio.hstddef.hemalloc.hbuiltin.hcustom.hsetjmp.hsetjmp.hsigset.hinput_device.h\bs2Y.s=!W.=w< Xw. Xz.^y._x.`)h-S-W=;uN!-0Y\Lg0/g&zXiˑOxf'z'J sX < .W==$Z$T2uvr"V!W ul_YuYZ^z^g&gsXrfvtXK-.$6:W=K~ȳ3=I=˻܃+n J'2tf"'yf.9h/sYYRgJg/{&zX^\"!WYK &`.$J>*;;ܱ0>:=>:=>:=W%#+/ۤ2#$<*=9[9uv  g[pu?gv!I;Y q..\X[ <:YZ>YͭYmXڄs//yJYs/"7=t2 "j9s,& s}JȠ'A,[i  <YYuJ'+M=Y.Z\*O)Wg?1, b,x'5wK==T@0K= ,=jtq/(xba$p7th!WY5#'w' Js. sX f<!V$3/ QX/gg 5.K5X KYY.f .sXYY'UK#]X+K&([9[YY][gZ\YgZq/;gZY#Lu  X\55h>ܴ1=<5BZO`f>_~(tN(p~,\p <uf}  /usr/include/tcl8.4/usr/include/usr/include/bitsrunset.crunset.htcl.hstdio.hlibio.htypes.hemalloc.ht=i)gvvuy.@?rh=s=-//gzt&=sX0t=hIg X JwtiYhhg=-//g=)=!g;=A-o/hjO%);=jiXKu&!=s=g-//iXP}l1 "+%)=j K=s==-//jX,0=s= -P} @ixzt' /usr/include/usr/include/bitssymptr.q.csymbol.centry.q.csymptr.q.heden.hentry.q.hstdio.hlibio.htypes.hemalloc.htigՕ\tgZr=YZVZVt=uuuZ#+.?uW΂@K Jf,2G=uu?zfM=uKlh<nVefYWY6/wJY/qȻu"eWgWguWg Ki(#((/(((5wZWeZ(M-u+x!/gggggggggggggh#g##Yvghuiuhggׁ(j f$NjuFgu?YsZk"luYK$K!|"g!!D .hhfx!%ff3%$pt| ++p(u<m8$~$/W/2~XK5<}/*/},~,G/f|%~f"-]$ /usr/include/bits/usr/include/sys/usr/include/usr/include/tcl8.4/usr/lib/gcc/i486-linux-gnu/4.0.3/include/usr/include/linux/usr/include/asm-i486../pcre-3.9builtin.cstdio.hstat.hscreen.q.cstdlib.htcl.heden.hsymptr.q.htime.htypes.htime.htime.hstdio.hlibio.hstat.hnotation.hstddef.htermios.hselect.htypes.hinput.htypes.hpcre.hscreen.q.hemalloc.hbuiltin.hrunset.hinput_device.hsetjmp.hsetjmp.hsigset.h@gf!"׮+[=Wg]W7t@iu>/&WWw 0yK[,Ys2;?u>ZV>Ό@YQf"-q((guu q%C!$L"؄=m./>:0/3gu>/mf.mX. WKsrXKwxr.`(3i\  0r.r<#0DA`Xf.' i'>//"91s/"91s/ч$/܂$rg."1y/"""#""*k!"5!"۱-2{ҥ!"۱-0!"(}ڄ""""""#!82۰ڰ/+"۰‘׃//!"W="< t.sXK>H>8Jb2p׀h"-vgpfK>H>8Qb2nf f.gh"-vgpfK>H>8Qb2nf f.gK8"->:"w/;L?תxv*#KYWLV((gh-=0KKWLz (X?t2lt"<`" "x_ v<p uv5 w<88<8C<h (K< <9<G<9<G_u%2&!WY& #eV-!=etgY!"KI=vYI/k:0[u-!3>:0'IK̕x%'/gY-!=Di'Wh(1g$r0YYo0,>.Z%i!,>iuXu*  ,uo 4K=}2X i&w"<+ڃ"^=KWy#`-8# i"w<k=Ky (`t% "1W=;g-=g0":/Y!)u- h;=/kx% /sYjڭ"t+z-I;g=$re\|2vt de=<<<<fX Xraavfzf fpfqfY=_g u,."h,>Ԩ+=³\?ճ5<=]rf 3r   <=*3y *EQ0ry<_yJ$ g'#Y<'X[X#>d g;=#/;:?9-${w /#+[9iv%0:Z:>:   4Br>Y 6(t.Jj KxuKur wv2-;g1?dX!<ovg-=Y;!=Wlt6"xi(养$Hztg!"̀L$ZeW!>Zekj1(WzX xh('} i& Jhw4Y-/kKs/YY t1~h(s=,>r&j#!+hw(I=jY-/ .mK=pts=,>r,Jhw(I=jXmXt&3f"^" "m-uus=,>r*׃lt]. @/S\QK.!!(K"+00=B!"YW#(g(ci: <!'ge= f%as"0g X!"(-9?r0:03/K+t !"(->/Kr!"[U#-/i億LL!zi!"(V!"(-9?r0:0 ./K+oy!"("׷M !"bZVY&Tx+w)u"5##"oi!"(V !"(->:hz.l f Ovt fm͊b&I/=Ks7SB R #*(@,#p/?/&q(? P=K<tRwt%vV>^rguVb@`x.JD0V0 X"XT/tiP$.\.xY=ЮZ:0!INNXt/'<X.$vg"YWLV((\T>dh(z.lk S0q1nJ&[khy=e/7a5U"P" +gh(1%tX <#<< e!/xc;;k9jaj+?+iN $"gYW0gYW  <fJf0-6(o:= c?ciuic#ci"=d>-0Y/b2=*-; h-0Y/b2=*-; Sf- S<5Je=egu ,!e/)cy$p$6u-!;=W~ ~f>r/x Jvt tf Jt/;!-=W26heu/U"@uC/.gRg!f#/0iT=/!V!5uC/.egeUfdf**-Y&vYNPv ;=]9eK;>Y(~>;=->-< !S=eueg'Le=!= w vf$age=@-###)hYU/hV!5A/.gR~_ wfe=!Y!ct=!diT=/!V!5uC/.gR@<Z/ hYU/hV!5A/.gR~==nȼ=v3@4y-4&b$)S~# ^=!d9A+g$a}fKK5hYU/!hV!5C/.gR} "$+g$a$P0Kwf4 trtK$Ɏ7KA{$Ys<:02-//_vyzXi#!>>85b._p.xXi[d>`d>^85!n.zfB`zfBv_!di[!!"vX i[!!"vX i[!!"vX j["P>>>[Y._p.xx#ti#!"ux. j#">>85a._p.xXj#">>85a._p.xXj#">>85a._p.xXi#""uw. i1"zf j["P>>>[Y._p.xx#tj["P>>>[Y._p.xx#tj["P>>>[Y._p.xx#tj#""uw. j#">>85a._p.xXj["P>>>[Y._p.xx#tj["P>>>[Y._p.xx#tj["P>>>[Y._p.xx#tg#""uw. g#""uw. j#"?xXCq.g#""uw.u "uU=">hYgh >-=g]$J\%7y  Y JY/3EAiDSqg#KWbJbf;=Z%b$.bfbXX;=Zb$.bf ;=Z%b$Jbf;=ZdhUOf<I=/g,J>;;=<~-u/.$iFmzf;?cYD>;~(w;e01wdfyyy~o" tJ (ܳ"+-,?{<{t.%=Loo{('+23B &e=-k{%H /usr/include/usr/include/bits/usr/include/tcl8.4eval.ceden.hsymptr.q.hstdio.hlibio.htypes.hemalloc.htcl.h>t+1E zzX.yOt  Ȼ3L(3 Lq?0=;>xt~)gYy(g%u։q=uɻwX/ghezXy.y tq=Iu.i%/YhWhtj. hf)w%-gY\i fnxtD4-=Y gZhg/.u=}2]u=}2\jvY[=[s.! /usr/include/usr/include/bitsheap.cemalloc.hstdio.hlibio.htypes.heden.hsymptr.q.h#q?2/CyXm/(d$6gY-s.*#@ /usr/include/usr/include/bits/usr/lib/gcc/i486-linux-gnu/4.0.3/include../EX/usr/include/tcl8.4lex.cstdlib.hnotation.heden.hsymptr.q.hstdio.hlibio.htypes.hstddef.hscript.hemalloc.hyacc.hinput_device.hsetjmp.hsetjmp.hsigset.htcl.h@>=YNi$=;=F@-ub,!WY&J uX <73p\Xz vX-//<U'iOYs=fBX/k  ׻OY=hz/u׻-/1<Y:>z./ Jtt=sW="4z.=[v,U=x*XtKe=zfga x h=uvofyȮ:0x /.Xf.t;/9XFtK?As !/-uj <4suuKqwYP$ ufjT" -4g>.Pm.;Y/t.;Y/~t!WZeY%W x tJl.Ÿrlc?2%Ⱦ*@8@i <Z Jz?Wgqu=Z&uW//YswLL.u"fftGf.sFx0Vh#%[9wtP%}J2 vQX <[3(%#u ^(Y}!&B!- XX| tY !-=x)#gtYZh~hgZKY+u `%Yg,~&\.#u [.ZgR&EK~+hggY)y@;'2~ /hgZ;"Kfnx. <$h0e"  -u0,Z f&Lvz;WgY-2;Yl(z -\.;YgYYsY gutzY1O<1XrXz7]g=W{'Y040/Z0/ZK/-ggyBYy63 <suKgWx.us3liy%[vʟv%[v4;=z~$:vXiy8.~9G9tH<= qxyy/hy-=/suɏmy /usr/include/usr/include/bitslib.ceden.hsymptr.q.hstdio.hlibio.htypes.hemalloc.h(Hj$ ' u  & u"!{yXtH"o K  /usr/lib/gcc/i486-linux-gnu/4.0.3/include/usr/include/usr/include/bitsmachine.ceden.hsymptr.q.hstddef.hstdio.hlibio.htypes.hemalloc.hP!j8 v u VzXԟ-!= <]EAuov,=u ,=gxT_yJCuouzɡ-==-= ::Z/:>::Z/g:>::/g:>::uI=[HL:g0x;g . ?Y <Y fxu  X/;YYJ fY@htg%{fi\r.v. fi\r.v. i\r.v. xi\l.p.w q.yK $j $\o$3sJw t.#ifs< <Yn. fk.v< Yx W=*nxfA?~c#mt/W=*buXx fvf@Bkzf&1J@T>"t&\y,9Ig= >))<'\'w9?uhG#>h+f3KurZ#uq[0e=1uuvX(uq[0e=1uuvX(uq[0e=1uuvX(uq[0e=1uuvX($\vt w< </r$E$\vt w< </rt#E \v w< </rt P\v fw< X/rt Pi%=s=i% tj%Wg;=/xg%uj% X4L!0 f73gwB ]ltk3f< Xu X*sfeg fq0#IIzKu.#IIzGu0#IIzIu0#IIzKu.w%;sge0:h/w%;sge0:h/ieg--=L)'frX/>>7>jaA XL=7==M:MK%i)fjX<4V>0>8=jaA XL=7==M:MK%i!+t=Ig{z%?Uc&*<K =eYWt#;!uQX yXuuju..q"ֈʯU. <L =eYX$ .pt"ʯU. <L =eYX$ .p"Ȉ>V <L Zrf-= X8qt1>V <L Zrfu <8qt%X>V <L Zrf-= X8qt1>V <L Zrfu <8qt%Xg%ug%p@h:-!xt )wsY/"pg"a*)d>ksu f!#+1jʽ"^t0$ɻ1Zl)Xvzr'U1!xsYg==H>:>ɮV.;=14J>,.D J;w#`tog;=;Kx 2.p@jh+=Y=u. Cy w Jlp)g%hvjF t&su@ktx ;!#;u;=|g-!=-!= < gI yXC t JVt*\fX it %it"yx9:> <kX /&rX $xy3wg; Gpt $y{q%ɭW.Kz;!;=ՠK>tt K>V4$+DI=v .~)=W@T4:>1$g(qt-!vFH==xx.y (ɯU.:>1$q-!LI=xy.9> %#8'r!+t/;wsrX!+a*+sMX  /usr/include/usr/include/bitsrefer.csymptr.q.heden.hemalloc.hstdio.hlibio.htypes.hm#@(vue0< ;HQ ot3;K ȑ'wcwXo.Fg/;g'o"&Tg6 (/e=z!;Kt(&i===r:gIg==*>HNw(f%y %'g/=u<V0y6myJ (DlK==-=0y. ulK==-=0y. u Jr0`Agy]o3K /usr/include/usr/include/bitstype.cstdlib.heden.hsymptr.q.hstdio.hlibio.htypes.hemalloc.hw2= tuKKwJwUY=I5EAړqDx.HG{'x ks=I-=hA1."<^.i\ $<#!,uZ^/w<Y=;YN*x8j1٩wg JxY[oxxf6.NT$*N8 <="=R6=KY<sXt X[!<6J$- XhY]XJH> ;.t<tkJt  tg;lzf fy<; .8?yf2jgwX < gkvd"Kw.gtxD;YW= of &w. .f k=k%KkaeB=w%[e/Bi9?y/}JVwhK  >^7@8jx x<<{u t  X  3 w .w< <fw tv-/;/QKwtvMY-K/o< /nX<nf.wtu}QX/ Qfu}j*N8jy.5i$.hm~J 1lJXMYL,> fi0=-uzDxf}Kg">l==Ҷ<J~t&  "/Ky< <I=-/%.w. w<{k73w,KB<:L,>,m=-=<tw)  t u|gfi+=h| JWڄg-/-/xf ,0lwX?v?egLZ}J9:"?c./wօgeY/| uxX )u. .hX|t{ty@xg{>>d?W==x  xfz }?=|z"/i}f }{"|#X#D%zJ;=#=gYU?s=VLo"%  ֟;gyJ{\<[\x.\x\xX\f}iy>,hg{ wؗ}~"g,>K=;/ȣ҂~"{"|"z.#;=w=<!Jqq<>05ܲ;=:0Z:܂"ɳ/;/=۲0մvf== <s< f@uXDgL;u98eO*N\" yɄ蒑 X&eKZ <}dKW=?ge-g}w!h$vlbuqhw;u ;/-gg~?sh}u=4aJ1:v:v@= Stt} <~f~}#X{fz.hf~=~}3~L<.jK1G[  wJ f0==<2  w~05 X .v4\A>;= 4Z};=;K;<'I=h"=r?-=tsJ fh=-/g)|tWx| =?JO$p-}0"-|$>-x==|1I=122|׮$g/ܰ;=-=z-z;~<|J$g/urg=-g $13zfB}X ~<X/ֻ/K~&}#A JxCof< ֖!+20ٓ%s!v%!ve%#<{+ew7w( #GsIs/>Wu "uy7%YyJmy-/Qt?gKu&WU,U?yfhv(fYLof.xYzYt=Z/-,vt@x!x/eMoYYXsi;!-])OSA u=#kQ=-s׼s/{%S'LzuJ[Kp"0 <:gaJXyYh,3j8LgJ=W.J1u11u=W.ut1u116Q)tZ;gsNX;x8xKf-/hY9?/wH<Z;gf XZqZe?&KYZ;gs$ȭ-=h?qw*kXE s/uuuuu+fN!"<:Z;gZ ZKYYscX&$XL-/1g <`X]<Z;glqX .Zo-8@#uI({mg'g'Xt=u\0r0wutA;/!eMrYY Xvi;!-geLN!WYR*j,e/;u%=-YD;`` `.g;Y?,/,[hgʃUX,<><>ig:h=gghig:h=ghig:h=hlig:h>i;g>.=n .n.n.Xr.tv. Xt?u+X&WU`fuu\#"-$L2 NJ.r8.ZSoK JM"!v.lK >'ȑege==2M 6XWG t+~fXultuhlzXܖz.#&i=Xg;=&g+o"'~ۑzX{""Wg$g g gg f"1KKK~g2't.}6YYYYKKK >0!YKu uuK(K((/gg0YggYgY3gYgY-Yg""""""02((00070070/////''/////////(0((((((.0.0(/6><KKYYYYKKKKNYYYYKNKKKYY'/3e '3//./$~$/W/2~XK5<}/*/},E,'~'Y~ff ? /usr/include/usr/lib/gcc/i486-linux-gnu/4.0.3/include/usr/include/bits../Edendd_lex.cstdlib.hstddef.hstdio.hlibio.htypes.hparser.htree.hemalloc.h5s=/YX fwX Z/x;v~?;u Ȣ;u̢u;Z;g>Ku~:/-ggȟ|K/WY>~m=WYCK/WY}uv@}K/ȣ/u\u~?fzYYVggYYVggfa%mYWYj򻽻7c c-syb^t s .s s* s@u_T}v,Y;gȃ|sgY/;YZ,sYYY-g~vv~u-YY-g&~[/*sYY~sgY=Ku->;YY^sYY~=WY/WY^yuv/WY au-Yu-~[+gg~YWY}ȃ; ;ȟT򭻻{;~Ȼ/;Y& ~sYY}u/,Y vYWY[7sgYu }{Y-Yd{% z1C{4 check.ctree.hsymbol.hO$!-Y'.MV#_="#Xq.YY tulg"utmoXu#%#+Jo  ut yɭXJ/LVLJ/[GMJ/\F&J/]E7f|f|t+jȮȮ}f~&}&}& /~&n&p~^&,/&&/,},a.wf?i#,,&}&.#m/~&&<&~8ʭ&,~)z&-@/~'z=}/&&'D''~~&p/~~&$&}/&~,&~8/"~3%}&Bew}c@|}Z,j,3&P~&#W8$&}5&,%~}qf\,h~,~&~&8}7<,u,/@h/i+$~<+0Ouq<+H+<  /usr/include/tcl8.4/usr/include/usr/include/bits../EXparser.ctcl.hstdio.hlibio.htypes.hstructures.hscript.hg8j͜vDg%Dus='g%s{[]0(xX<gX eX t]K*Vz<%2jqp.v1-Mg=-Q\+:>zJ t =-ւAN /t L>gy<<>=e O ( MglfK<5.MM X$ix  (L  L ;!L'U#0yfCxL  L#U#0yfCx(L  L          .w>H  tvX > X tuX > tvX > tvX > Xw X Xw X Xw X Xw X`x``x` Xv X  tuX > } tvX > ~X tvX > tvX > tvX > twX ~ ttX >U#0yCYx ZS#0)A1v{ ZS#0)A1vR $ U#0)A1v}( zXXXZd0ׄ'y \T0KW.{ZV0V".Zd0ׄ' V@T!YY} ZV0׃ׄ+VZV0%%5VW.\ZzX0%1V1.v%"V.Z0'} v%%%5V}.+X+tlXA+ twX }v%%%hV4V}.ZV0%%=V.v%%%9VE.ZV0%%=Vz.Z0%%%/W.ZV0%%=V.v%%%hV4V{.v%%%9V.*z**{*~**{**!Z:0ZhVy.Z0f~tJ tX H5|'#   ~XJ5cX|PX<kX\b0K;0Y, 4 ,' Y.).WX.bXt L L L  L ;g(&:01!-/ld>|v!-/lRf, >.<Hք~;g F ;g F &.3, 0~uh0zղl======x./{===uv3w@+?r.tt. f U}2Y========uuuvN3w@+?r.tt. f tUa.s.==BOg0o.@========gvhN3j+ir.t. f U a, L/#XjX[ wX!K!JlX!K!K#K%05w.ghgggbgggjZuuu9O33@MhP*gi/zX 䃻Z""xt /Z,0fv,YAf=uZuuuw@T=ggg0@8=gggL@8=gggLg tt [[[Afֻb\gggWe!Z,0iyWTYTxX>< JvX(xX(x.==$$=$$=$$s<=W0WMxX L-K3aO! J J17===>o/;0V Ax<`vtg",0Pz i0uxp@i y6rf}+(xX6xXDV=!i+1iuv x8\c4zXlI. <tJ=ggggggggggg 4Wg> ! <`ɴٻ&ܻw,0p <c.uuuuuuuuuuuuuuuuuuuuuxvfs.gVf-gsfg (˻guuv< 0\\xwtu Y~%~<XX>bguu s1.aȭ > <ptOzXtguu>ճ3'#+?uoݳ󰭠5.>o>hA<>>k<>>k<>>k<>>f= 8w:ZU~f<~<tgIYIY, azJ% [<%.[X%'[<%.~X-=g- KwefLH!I==I=quI==IW0I?80L+Kz#f=zz-v. 'p<'t>u';==ѳ҇78ܰ‘۳'&5C./d y,1E-./U$  3i5mu-Y+i$qsKK=-Yw<w.Xw<$/9g4Ktt>=.==۰<>>k<>hA<=YW/f>9uW@p\f>b' ==YO<>hA= <>ZN==Y@<>h@<> <9Bi}X-/j<o.////2!!!!!M!._X/////.OEs/ih:>6d?9=9=9=9=9=9=>:?<tfYWT"""S=""""T"""S=""""S(u" ".~L:hvK3tVVVVf.X(Y?q5f=-Ys08 /usr/include/GL/usr/include/usr/include/bits/usr/lib/gcc/i486-linux-gnu/4.0.3/includeglpng.cgl.hstdio.hlibio.htypes.hglpng.hpng.hsetjmp.hsetjmp.hsigset.hpngconf.hstddef.hzlib.hzconf.h04"V0 h,0+uiic#0gy)J":>$+?:<t>>ܭ!"<=<>>.1ڲݲ!e܃g˭۰Y"&V0谪ʳ0>:0}<f}fv%;!IFcgeg>VMU/ #B/1!c[~Xl"dyf!;/䠡L..t):;9K*B=YVhBYYVh$:/-====;=;=uBY;=;=uB;=;=uKq;=;=u~L1/* X2 %/Vt~"Vv-/0:0910tZ,0M$htZ,0M$h=/YL<=NY+L<=ʈy uluZ0==Y /usr/include/usr/include/tcl8.4../Eden/usr/include/sys/usr/include/bits/usr/X11R6/include/X11ex.cstdlib.htcl.hnotation.htypes.htypes.htk.hXlib.hX.hctype.hstdio.hlibio.hemalloc.hP&t?YgYf=YNf=Yhgf'^'sf@Y w.uuY=ur?g=uH>$ >ٜ:v:>:U>":v:>:U)t= &&&&&&&&&&&)&W<).eYg(s.ft;YYg؟=W/W=W/W/=WzX#=Y#>@(=K(@؜h J<ʶ#}-myJ/u.-.7y:.: /usr/lib/gcc/i486-linux-gnu/4.0.3/include/usr/include/usr/include/bits/usr/include/tcl8.4../Edenparser.cscript.hstddef.hstdio.hlibio.htypes.htcl.hnotation.hemalloc.h1  /WWY-"su/!O-iY-Yj$\ NYY^ZZ-Y^>"$X'K2*IfgsX #to3V,tKZYs//yX{ /usr/include/usr/include/bits../Edenscript.cscript.hstdio.hlibio.htypes.hemalloc.h 7%wj+uhqf,.WgK+[>j+uhwf: (((&<=gu>;guKW=myC:U;,A:>:>dU 䐑;gNIK;=rzXrWe /usr/include/usr/include/tcl8.4/usr/include/bits../Eden../EXsymbol.cctype.hsymbol.htree.htcl.hstdio.hlibio.htypes.hemalloc.hscript.h:8cW Ji(u.+uvx(H@s/1zw;s0y?+n.f tt0mtzJe=/ fe= .8\xJv<%Jg=y.'=z.*9 !-0gR tuN{qf6J~JK<K= WYo<=z =z =zJ=zJ="J=zJ= JYWK=K~Ϡ=KKKKKKsKKgKK=K=uK=K=uK=K=uYZUKsK=KgK5<;z3GJNw Ntb NqNnNkNNhNeNbN_!N\$NP0NY'NV*NS-NKqK=rZVK=K KiK~~U=MMMiMiMiMiMiMiMiMiMiMMMiMiMiMkPM)2ʫu;^zzzXYKKKWVKKKKKK~KoY=K|K=Ky=|JK]yh Wu=uYW!w tWuJYWJ={J=euiJYWlJeJ|JKVW!GW!JWug> K"KKKQK~4>X=J'}=|Jyyyyyyqyyyyyyt'"  !#s=;"s!ɢKKx DwJ ȑ^1uY0@OzO /s%WN=M=YWIYy/;! ==A /usr/include/usr/include/bits../Edentree.ctree.hsymbol.hstdio.hlibio.htypes.hemalloc.ha(f<qt<;g>T @i#;g>* Ii$;g> @w$WgZ~ Li$Yh @i$;g=hE @i$Y=s?E @i$YghS @t=)UWX'&UWXtDcfgt /usr/include/usr/include/bitsprint.ctree.hsymbol.hstdio.hlibio.htypes.hg/!W/ J6k<Xk.Xv. Xt. Xr.Xp.Xn.Xl.X{!W.=s< Xs. Xv. Xt. XCNNf"|B"}}u''<}<<}fX}<[LVM" tzJ"!"tJ=WWWgv-JY"!"a8Y"@" " "0J~[<e<eF """"" "n"u'\T"!uWk""Hp""t"p"KWKW""" "["KW}"*000000000000u"gu"X'''''5gv#"## /usr/include/tcl8.4/usr/include/usr/include/bitsstore.ctree.hsymbol.htcl.hstdio.hlibio.htypes.hz(O&[|.YfȭY;|f;!;r;mȭ;ȭ;ȭg;;|ȭ;ȭ;}<qY;g;u;gu <v;g;u;u^g<`W=u;5Ƞ;g!t;u;uS!uuug;!uuFFFFFFFFFFFFFFFFFFFFFFFFFK  !;g;Y;g;!;g;!;g;g;g!;g;aWQY~;gK;gK;gKj;̭;Tȭ;̭;̭;̭;̭;̭;ȟg;};g@HHHHHHHHHHHHu;g%ZuZTM# x5Y&>;(:h^/Wgw( bison/usr/lib/gcc/i486-linux-gnu/4.0.3/include/usr/include/usr/include/bits../Eden../EXparser.ybison.simpletree.hsymbol.hstddef.hstdio.hlibio.htypes.hemalloc.hscript.h <4z.Y4z.Yuuuwuuu. K=W}bvf .ufYu|yž.s۳-;/³~!ܲVY3uu-Yk u-Ya 'u-YK=WYsYY~PxX=1Z#XNegɑ0<=-zxP /build/buildd/glibc-2.3.6/build-tree/i386-libc/csucrtn.S!!! !| AB HEAG NAB @FB ` AD pLB AB &AB AAG DAB G AB F0mAB HsAB G "AB PAB G  AB 0MAB DCAB .AB AB  EAG pAG  AB FFFAB DAB AD AB F"AB F0jAB DTAB EFAB PAG AB ACAG I| AB D0AB E2AB D 0AB FFFRAB E0|AD F]AD F}AB E| >AB DgAB D@'AB Dp7AD DAB EAB FeAB FL AB D'AB DXAB FIPAD FAB D(AG gAB D gAB DAAB DUAB FF@AB DrAB F| P-AB -AB  AH  AH AB F/AB  AB "#AB F| @$AB pAB AB DKAB D "$AB FP$AB 0&/AB `&jAB D&AB I'AB IP(AB E@)AB )AB D+2AB @+}AB +AB P,4AB ,AB  -AB G.AB E/2AB F0AB D1AB Fp3HAB F5HAB F8AB F9BAB F ;"AB FGF@>3AG >yAB E?AB  ?AB E?kAB FPAAB F0BDAB BAB ECRAB FEAB DErAB BFFAB EHVAB E`I?AB FKAG CpMUAB AF MAB FGFPAB ITbAB TIAB @UAB B VAB FWsAD LpXrAB FZAB MI[VAB DP\AB Ep]wAB ]AB E^AB 0_AB D`.AB 0`AB F@bAB FcAB Fh<AB EjAB IlMAB FnAB FnUAB EPpAB pJAB F0rAB DsAB HuAB u#AB Ix<AB F zAB FFFzAB D{AB BFp}AB I0AB AB AB AB  AB 0\AB 2AB Ѓ2AB AB  BAB ACC@HAB FAG XAB FI$AB F@AB IAB AAB BFAB PAB AB ЮAB AB PAB `AB AB AB AB `AB dAB `AB pAB AB AB  AB AB AB AB  AB AB @AB оAB ` AB I0AB F| dPUAB dIAG dAG d @AG Dd`AB d`AB DdsAB DdKAB EdPAB Fd@wAB EdAB FFdAB Ed AB EdAB Fd8FB dAB Fd`TAB DdAB Dd`AB IIdAB IId%AB Pd@AB Id 5AB Id`: AB IdAB Dd0AB Ed%AB F| AB BuAB E@EAB E4AB lAB E@EAB D`AB DAB MFAB EAB EAB | AB E`AB | @@ AB @P~AB @eAB A@@"AG @pOAB E@AB D@pAB @@AB @ AB D@AB AD@AB D@AB D@0AB E@AB @PQAG @AB F@`dAB I@AB D@`AB I@ AB C| -AB F0 AB I| P!AB O@"AB JI $ AB JI0%)AB `%]AB JF%]AB JF &ZAB JF&ZAB JF&4AB D 'AB @'~AB E(LAB )AB )AB *AB P+AB `,AB -AB p.AB E/"AB E0dAB I05NAB D5AB D 6AB D6AB D`7AB D8 AB E9AB E :AB E;AB E<TAB `<;AB <[AB =SAB `=AB T>AB D?#AB O@!AB OB!AB O0C#AB O`DAB D EAB DEAB FAB QGAB CHgAB D0I/AB E`KAB EMAB ENvAB EPPqAB EQvAB EPSqAB ET4AB U7AB PUAB E VAB DVAB H`YlAB DYAB F[AB F\DAB ]fAB Ip_AB EaAB DbAB DcxAB E eAB Ff2AB IiAB FjAB F|  %meAB E %n|AB E %pHAB  %pAB E %qAB F %tAB F %uhAB F %vhAB F %v>AB FFF %v4AB | T&wAB FG T&wzAB FJET& xKHB T&pxAB T&y AB T&zAB T&{AB T&`|GAB ST&UAB T&AB F| |' AG |' fAG A|'AB J|'@AB IE|'AD B|'`AB AD |'P@AB AFF|'AB I |'pAB FFF|'AB AC|'СAB A |'pAB ACF|' AB I|'{AB BC |'!AB ACI|'*AB UR| )AB | )PVAB F)1AB D)AB I)AI ))AB F) AB F) AB ) AB F)PAB D)@AB D)BAB E)`rAB FF)AB A)pAB D)TAB FF)AB F)KAB BF)AB F)-AG F)AB E)AB FI)@AB II )0AB FFF)AB FI)cAB FF)0AB F)mAB )`AB D)0AB F)2AB AF) AG )@AB F)AB AF)`AG | -0AB D-AB D-AB -AB -AB - 8AB -`2AB -,AB -&AB - AB - HAB -pRAB D-AB FI-jAB FL- AB E-TAB E-`AB F-@AB F| /@AB D| 0zAB G0PAB 0p4!AB F| l05HB l05tAB Ql0P6,AD l06AB Al0 7GAB Gl0p8AB T| (1OAD (1OAB FH(1PQAD FF(1Q)AB A(1R8AB A(1PRIAB A(1RZAB A(1S{AB FF| $2g/AB $2g1AB $2gDAB D$2@hQAB  $2hAG AFL$2PjXAB F$2k}AB E$20l!AB I$20AG I$2 AD GL$2AB D| |3cAB D|3 6AD |3`=AB IF|3=AB IF|3GAB |30 AB D|3P=AB IF|3;AB |3П;AB |3;AB |3P AB D|3p AB |3 AB |3GAB |3GAB |30GAB |3XAB E|3;AB |3 GAB |3pGAB |3GAB |3 AB D|30&AB |3`#AB D| 6AAB D60AH 6AB 607AB 6p7AB 67AB 6lAB 6`AB F6`eAB D6Ч<AB D6AB E6WAB D6!AB 60DAB FF6>AB 6AB F6_AB D6 +AB D6PAB F6`AB 6!FB 6 +AB D6PAB E6 AG 6AB 6!FB 6Ю+AB D6AB D6 AG 6 AB 6"FB 6+AB D6@eAB D6 AG 6dAB D60!AB 6`DAB FF| 9*AG 9*AG 9*AG 9@*AG 9p*AG 9*AG 9д*AG 9*AG 90*AG 9`AB L9)AB 9 iAB 9*AG 9*AG 9*AG 9 *AG 9P*AG 9AB L9*AG 9@.AB G9p AB 91AB 9 AB 9н}AB G 9PXAB FFF9AB E9 AB F 9AB AFF9AB 9AB R9AB 90AD 9PAB 90AB D9AG N9AB D9pAB D9 AB L9AB L9@AB L9AB L9`AB L9AB L9AB L9AB L9AB L90AB L9AB L9PAB L9AB L9pAB L| ?GAB AF?PAB D?P AB ?` AB ?p AB ? AB ? AB ?8ED ?AB ?AB ? AB ?@AB ?`:AB D?8AB D?)AB ?6AB D?P1AB D?SAB D?5 AB I?0xAB D?AB F?`AB F?PAB E?AD D?[AB ?IAB D?P2AB ?UAB E?,AB ? AB ?0 AB ?@ AB ?P AB ?` AB ?pAB F?0AB ?5AB D?.AB F?@MAB A?2AB F?MAB D? CAB D?p AB ? AB ?AB ?$AB ?AB ?`IAB ? AB ?AB ?AB ? AB ?AB ? AB ?0AB ?Pg AB I?oAB | E0 AG E@LAB E6AD AG E&AB ACFEDAB FEPAG IFE AB IE#XAG E E@$AB FHEE$QAB DEP%QAB DE%AB E%AB E%OAB E@& AB | TGP&oAB DTG&@AB TG':AB TG@'AB TG`'AB TG0(AB TG(AB FFTG`)AB FFTG)AB DTG,AB TG,AB HTG@0lAB JI| H1AB IH4xAB F| I 7AB DI09AB IP9AB Ip9AB FLI :AB F| I:UAB ADI0;,AB FI`<aAB FI</AB DI=RAB GI`=AB EIP> AB I`? AD  Ip?>AB IFFI^AB FI@`wAB FI`AB BFIaAB | AG  0L`hAB FFF0LzAB E| LzAB FILГKAB I|  M B  MiAB C M 7AB  M`:AB D M0AB I| MHB MAB AM@AB HM[ AB Tinit.cshort int/build/buildd/glibc-2.3.6/build-tree/glibc-2.3.6/csulong long intunsigned charlong long unsigned intshort unsigned intGNU C 4.0.3 (Debian 4.0.3-1)_IO_stdin_usedprintUsage_unused2_fileno__saved_maskRLIBTBLentry_ptrstderreden_notice_undef_reference_IO_buf_end_shortbufparserettimedEventsEnableduser_trace__off_tpushMasterStackfileineden_backticks_dependency_hackerrorContentferrorf__sigset_tstaticSpace__jmpbufTopEntryStackframedefine_level_IO_write_endSASAMI__mask_was_savedpostexec__s1autocalcusedArginterpInsteden_error_index_rangehptrblibtblBLIBTBLentry_tbltopMasterStackstmpoptargterminatetimeoutSCOUTntmp__gnuc_va_list_chain__jmp_buf_tagpushEntryStacknotationTypeToString__fd_maskrcsid_IO_lock_tyyerrorEDENclearMasterStackinit_edentv_usecDebugGNU C 4.0.3 20060104 (prerelease) (Debian 4.0.2-6)procmacroINTERNAL_IO_write_ptrerrorLinenitemsstartupargc__s2_lencompiler_flagssymptr_QUEUEemalloc_pnautoretpcnewline/home/rboyatt/tkeden-1.66/EdenilibtblargProcessed_IO_save_basenextcerrorMessage__pad2loop_levelILIBTBLsymptr_queuelastControlCTime_nextprintVersion__resultrun_initappendHisterrorflaginstsavepcwarningfTcl_TimerToken__valinput_deviceARCAswapAndRunRunSetTcl_InterperrorCompletefullnamefd_set_sbuf_IO_save_endarg_declarestartValidwarningentryStackSize__time_tlastcnoticefcharnotopEntryStacksetTimerwouldBlockinitStrstartupcwd__off64_terrorsbuf_IO_read_baseinerrorfretcalltoAppendlastBeepTimeNEWOTHERclearEntryStackprogname_IO_write_baseInp_Dev_Save__PRETTY_FUNCTION__erealloc_pQloc_IO_markerTopMasterStack_IO_read_end__fds_bitsclientData__suseconds_tnotationTypeTcl_DStringeden_interrupt_handlergargcgargv_cur_columntclCommandrlibtblfdset_lock_old_offsetInp_Dev_IO_buf_baseDONALD_IO_FILEtimevaledenCmdTcl_TimerToken_compiler_flag__pad1stackpswitch_levelargerrstartupargvprocessingRunSetmain.cargplinebufendinitFileformulastypetv_secpopEntryStacksetLibLocationlocal_declare$Id: main.c,v 1.53 2002/03/01 23:47:43 cssbz Exp $_IO_backup_base_IO_read_ptrinitPtrStuffmarked__s1_lenstdinspaceAvloptindfreeProc_flags2__d0uDatumargIn__d1libLocation_markerspopMasterStackstmpoutControl_CFramelocationoutpInput_DevicesinterruptedmasterStackSize__jmp_buf_vtable_offsettoPutEnvlinebufsize__quad_taddActionprintRunSetclearRunSetcurrentrunset.c$Id: runset.c,v 1.9 2001/12/06 22:48:41 cssbz Exp $getActiondeleteActionWithTokendeleteAllTokenActionsfoundrmActioninitRunSetentry_queuehashindexinstallinsert_level_marker$Id: symbol.c,v 1.11 2001/07/27 17:56:37 cssbz Exp $SEARCH_entry$Id: entry.q.c,v 1.10 2001/07/27 17:28:43 cssbz Exp $search_localinit_LocalVarListdispatchQsrcsymbol.cmarkadd_local_variablelookup_localcont_qMOVE_entry_Qrcsid3rcsid4MOVE_symptr_QQdstbreak_qSEARCH_symptr$Id: symptr.q.c,v 1.8 2001/07/27 17:57:16 cssbz Exp $hashtabledelete_local_levelentry_QUEUEDELETE_entry_ATOMDELETE_symptr_ATOMprintlocalyyssayynewstateyylenyyvalnargyydefactMAXUSABLEyyfree_stacksyylvalyyssnUsableincGarbageLevelsetyyparseinityydefgotoYYSTYPEyy_parse_inityytnameusableyyrlineyyabortlabyytranslateyypactyyr1yyr2yypgotoyynerrsyydebugyyerrlabyytableyy_token_readyycheckyyerrstatusyacc.cyyacceptlabyyvspyystacksizeyystate$Id: yacc.y,v 1.19 2002/07/10 19:26:05 cssbz Exp $yyerrlab1yybackupyydefaulttextptryyerrdefaultyyrhsUsefulGarbageyyss1tbeginyysspyychar1garbagesettoMAXGARBAGEnGarbagedefnonlyssp1decGarbageLevelclearGarbagetextcodeyyerrpopyyvs1yyerrhandleyyvsaunmarkGarbageyyvsyyparseyyreduceyyprhsyycharinEVALgarbageLevelsscan_fscreenNameuser_errorst_dev$Id: screen.q.c,v 1.6 2001/07/27 17:54:03 cssbz Exp $c_lflagsubstring_startrcsid2rawserialreadmastername__basest_atimed_sasami_object_posrequestedLc_cflagtouchdiscard__gid_t__blkcnt_twritelnc_ispeeddd_debugcreatetimer$Id: builtin.c,v 1.47 2002/07/10 19:22:18 cssbz Exp $tkdefinefscan_fcc_tst_sizelastBoxc_ospeedtm_minsearch_ScoutScreenQpqtlistheadatofatoisegidnameoftm_zoneerroffset__pathreallocDoneresied_sasami_set_bgcolourprinted_sasami_object_rottm_monsymtbl2listviewOptionsregreplacefile_statreflect_eden_internal_basenamenextpqttm_hourtimespecdeletealltimers__s2st_nlinked_sasami_poly_tex_vertexssptrtm_yday_eden_internal_dirnamereadfdsindiceslimitoWinInfoapplywinNoed_sasami_poly_colourMaxRefunget_charprinthashacceptablesymboltextipopened_sasami_light_specularreplaceRefsE_Disp2PSpipe_processst_uidlookAttrResulted_sasami_light_enabled__ino_tcommandfilenamebtreeusbhidcloseinpdevlinenogettimepackparalskipprintstdouted_sasami_light_diffusenoOfoScreened_sasami_poly_geom_vertextkdefineDatumtermiosadd_ScoutScreenexceptfdsed_sasami_light_posnext_refcurrentNotationinpdevnameBtreetv_nsecerr_msgtm_secforgeted_sasami_vertexisUserDefineded_sasami_viewportlookAttrattrPtrnoOfscreenstrtodstrtolwinfogetcharovectorrealranded_sasami_material_diffuseReferbackgndread_bytesc_oflagb_writeselecttzonest_rdevremove_msgqerror_no__uid_tst_ctimbuildAcceptTabletz_dsttime__endptrexec_stringfullUpdatesegPtrtm_wdayfreeStringBufvp_listtotalfdreadyipclose__blksize_tRemoveed_sasami_light_directional__lenusbhidopenlistlencmdstringed_sasami_light_ambientinput_eventst_blocksslavenamec_iflagsubstred_sasami_setshowaxesexec_fileregmatch__nlink_ttm_mdayshow_not_yet_definedfget_stringst_gidmaxbytesfinetimesubstring_lengthpointerlastMasterfrombuiltin.cscatintQdeletetimertm_isdstWidgetMaped_sasami_object_scalereceive_messagesearchKeylast_eden_internal_cdst_debugpushlistsecondserror_codeed_sasami_object_polypipefdsarraytcflag_tb_exitclockDisplayScreenst_mtimoldrefed_sasami_material_ambiented_sasami_light_attenuationed_sasami_poly_material_eden_internal_cwdsymboldetailmodesst_inotimerhandlertimezoneput_environusbhidreadreal_pcrewritefdstm_year__ssize_tst_blksizespeed_t__statbufboxNameisNotYetDefinedf_eofrawwriteed_sasami_material_texture__unused4__unused5sublistslengthmyHeapPreQueueTimerusagetloc__retvalE_tcldumpedensymcmpnewStringBuffget_charrawreadget_msgqE_StringRemainc_linereplaceKeymillierrorInfolcatScoutScreen_ATOMfdes__s32__dev_ttm_gmtoffget_environinit_ScoutScreenListnboxtz_minuteswestst_modesend_messagesaveHeapPtr__nptrPlotShapeed_sasami_object_visiblenewsubjectreplacedrskipinttimetodoreallocStringBuf__u16rawserialopenc_cc__u_quad_trawserialclose__mode_tviewport_listviewport_namenewrefUndefDatumslaveed_sasami_material_speculardefndefpret_callcode_evalsaveprog$Id: code.c,v 1.24 2002/03/01 23:45:10 cssbz Exp $p_endchange_sourcesprog_endcode_related_by_runtimelhsdisAssstack_overflow_errlvalueoprogpp_begincode_related_bycode_definitionevalDatumexecutesavetextcodeswitchcode.cpush_textrelated_by_codeINSTTBLsplistinsttblrelated_by_code_runtimelhschange_targetsstack_underflow_erraddentryinitcoderesume_pointreset_compiler_statusprog_startcode_definition_runtimelhsresetLockschedule_parents_oflockvaluemark_changedreset_evaleval_formula_queuescheduleinvoke_action_queueformula_listchangeeval.caction_listeager$Id: eval.c,v 1.12 2002/02/18 19:27:11 cssbz Exp $freeheapheap.cgetheap$Id: heap.c,v 1.10 2001/07/27 17:32:20 cssbz Exp $dd_script$Id: lex.c,v 1.30 2002/02/18 19:28:14 cssbz Exp $nppsymbackslashnotationst_scriptskip_commentscoutScreenInitOpenedkeyword_tokenchangeNotationmaxScriptinit_lexis_floatnotationSwitchis_hexkeyindirectionappend_agentNamekeywordsbuffer_overflowbuiltinF_tableappend_chartranstabmulti_symbol_tokentempyytextappend_linebufid_tokenskip_percent_commentbuiltin_ft_checkpeeknumber_tokenmakedatumscoutScreenInitOpenagentTypenew_yytextkeyword_tableskip_one_line_commentyylengfirstCyylexnotationGetinPrefixsa_scriptflushRestOfLineexecstrscoutScreenInitOpenSymappend_NoAgentNamegetAgentNamekvalbuiltinFsnotationPushPopsecondClib.c$Id: lib.c,v 1.7 2002/02/18 19:29:51 cssbz Exp $call_libcall_floatwhereresetupdatepushintmakearr$Id: machine.c,v 1.22 2002/07/10 19:24:49 cssbz Exp $mustlistfreedatumpopddummycurrValueconstpushinc_asgnmakelistmuststrlazy_notcnv_formula_to_rwvcnv_2_boolbitorlookup_addressmustchardec_asgnindexcalcswitchcodeneed_rwvpost_decgetvaluesize1jpnfbitandjpntpre_inclistsizeout_of_range_errorpre_decdatacmptempStrconcatoptqueryassignaddress_errornoupdatenewhdatnewdatumpushUNDEFddupinsertprog_beginmachine.cnAppendsize2mustaddrnewStrmustintdivideget2numconcatNullListlocaladdrappendpost_incUPDATESourceTargetsrefer.caddIDcheckokclear_IDlistsave_IDlist$Id: refer.c,v 1.8 2001/07/27 17:52:39 cssbz Exp $Symbolprintlistrefer_bylastNullInIDlistcheckok1checkok2refer_toSourcesdynbuft_intt_supertype.ct_str1t_strtypenodynbufsizedatatypedynbufstrlentypenamectost_float$Id: type.c,v 1.19 2001/12/06 22:50:22 cssbz Exp $END_REPEATREPEATCHARuschar./pcre.cpreviousstart_offsetwhatterminatorstudy_datafirst_significant_codeoptstopeptrblockop_typenewptrbreverse_countbranchlengthcheck_posix_namecheck_posix_syntaxminimizeposix_classerroroffsetcheck_escapefind_firstcharmaxvalis_startlinematch_databrastackBOOLerrorcodeoptchangedsubcountlitstempptrNORMAL_CHARrefnumstart_matchtop_bracketsubreqcharminpEND_OPTIONSrep_minbracketsis_counted_repeatstacksavepcre_execsave_offset2req_charnotemptysaved_eptrmagic_numberprev_is_wordcbitsmatch_blockPCRE_ERROR_RETURNnewoptionsoldptriptrlocal_negateposix_name_lengthspcre_versionbravalueendonlycondrefiendREPEATNOTCHARpcre_fullinfois_anchoredoffset_vectorprevreqcharoptbitnegate_classoffset_maxrepeat_typebracket_lengthbrastackptrcodeptrsave_offset1oldoptionsstart_subjectpcre_freereq_char2branch_extrayieldrepeat_minreal_pcre_extrasave_ptr/home/rboyatt/tkeden-1.66/pcre-3.9notbolecodeSINGLE_CHARACTERisclassFAILEDcompile_regexscodesaveptrstart_patternbracountoffset_overflowread_repeat_countsresetcountbralinktempcodetaboffsetskipbytesbranch_newextraexternal_retop_backrefreq_char_ptrpcre_compilestart_bitsrep_maxclass_charcountbralenstackpcre_default_tablesmatch_refoptptrfind_fixedlengthlookbehindtemp_optionslast_branchpcre_infoOUTPUT_SINGLE_REPEATmaxpketoffsetpcre_mallocend_offset_topsave_offset3start_bracketutf8noteolstudyptrptrctypeend_subjectcompile_blockerrorptroriginal_imsrunlengthoffset_endexternal_extraminvalposix_class_mapsgreedy_defaultunsetcondcounteptrbgreedy_non_defaultposix_namesduplengthoffsetcountREPEATTYPEcur_is_wordusing_temporary_offsetscompile_dataclass_lastcharend_match_ptrcompile_brancholdlinkoffsetocountoptsetctypesbranchcountlitsbranchreqcharfirst_charrepeat_max/home/rboyatt/tkeden-1.66/Misc$Id: custom.c,v 1.8 2001/07/27 16:44:15 cssbz Exp $custom.cinstall_custom_variablesprompt_lenx_default_graphdumpbufid_lenchange_promptdumpdonaldnode4DeclareGraph$Id: symbol.c,v 1.14 2001/08/02 16:26:11 cssbz Exp $look_up_treeexpr_to_donald_namefree_symboltempDeclarechange_scope2expr_to_eden_nameeden_full_namex_delete_attrGlobalSymbolslastvpx_draw_actx_delete_openshaperesume_scopereset_contextlook_upsymbol_searchexpr_namebackup_contextbackupContextSizebackcontextNORMALeden_deletesym_prevx_delete_actresume_contextx_default_attrlasttypedeclare_openshapecontext_searchMaxBackupContextx_delete_graphbackupIndxdonald_full_namerestore_contextsymtabprint_symbol_tableisGraphbackupIndxSizedumpDonaldDeclarationdd_promptlook_previnsert_nlneednlbackindxdeclare_actionnew_symboldumpDonaldDefinitionDeletebackupContextchange_contextderivedMaxBackupIndx/home/rboyatt/tkeden-1.66/Donaldlastmasterchange_scopeprint_all_symbolseden_declareisGraphAttrindentinitbufdtree3dtree4print_treeexpr2opcodetree.cstage$Id: tree.c,v 1.12 2001/08/02 16:26:11 cssbz Exp $inPrintTreeDefineFunctempnameglevelextendbufop_strcopyTreedump_strdumpbufsizeDefineexpr1origTopTreeListis_shapenaryCommaop_stringfreeTreeappendTreeListdefnamedtree0is_openshapedumpdtreeis_graphdtree1dtree2treeListSizeRparenutility.c$Id: utility.c,v 1.8 2001/07/27 16:34:39 cssbz Exp $getmemNotOpenshapeOrGrapherrorcodeswithinNameTypeMismatchdd_nerrsIdListExpectdon_errOutOfMemoryStackUnderflowdd_lvaldd_errordd_parseerrStrUnclassifiedRedeclareIDSyntaxErrorerrorstringparser.cdd_charno_idIdExprUnmatchUndefinedIDUndeclareIDImpossibledd_appAgentName$Id: parser.y,v 1.16 2001/12/06 22:27:37 cssbz Exp $FuncExpectStackOverflowtokenize$Id: lex.c,v 1.21 2002/03/01 23:37:56 cssbz Exp $action_Amap_token_to_nameDonaldAppAgentNamenew_dd_textcurlyCountdd_lexdd_lex.cdd_restartmap_name_to_tokentranslationinit_donalddd_lengenvcontentsgtargetisOpenshapesemantic_4count_exprTypeClashcheck_children_typesemantic_2semantic_3check.ccount_idsemantic_1$Id: check.c,v 1.11 2002/07/10 19:20:26 cssbz Exp $check_idobjectinfoindecimalobjfilecoordptrsa_skipline_uidlistcurrentobjectnamesa_parsestringobjectinfoptrstrtodoublecurrentmaterialscopytexvertexlistsa_init_sasami_polyinfocvertexcoordpolygon_numberdecimalcountsa_inputtexture_vertex_numberacceptedsa_load_mtlsa_load_objsa_inputstringidatacurrentmaterialidpoly_idsa_eden_initcurrentobjectcurrentpolysa_exit_trapsa_outputsa_r_xsizenewmaterialsa_errorcolourinfoptrtexcoordssargnegativenodetailsa_r_showaxessa_r_bgcolour/home/rboyatt/tkeden-1.66/Sasamiexponentsa_r_ysizesa_addescapescurrentobjectidgeometrysa_eden_initialisedobjmateriallistnumargscolourinfodargvertexuidinwordfunctions.cmaterialinfoptrmaterialinfo_vertexinfoGLinttexturefilelightinfolightinfoptrtextureneedsloadingsa_findlightfoundvuidsa_dumpmaterialsnewuidlistsa_findobjectnewlightsa_getfirstobjectvertexinfostoresizesa_addpolysa_getvertexUIDcurrentuidlistsa_structures_initsa_findmaterialstructures.csa_getmaterialsa_addmaterialsa_vertexuidcountersa_getfirstlightpolyinfostoresizefoundpuidstartindexsa_dumpobjectssa_dumpverticessa_getuidlistsa_findlistsa_addlistsa_clear_vertexinfostoresa_getUIDnewlistfirstpolysa_getvertexsa_getlistsa_addobjectcurrentlistsa_dumppolyssa_polyuidcountersa_findpolysa_clear_polyinfostoresa_dumplightssa_adduidlistsa_addvertexsa_getpolysa_getpolyUIDsa_findvertexnewobjsa_getfirstmaterialoldsizesa_index_from_pUIDsa_index_from_vUIDsa_uidcountercurrentlightsa_getlightsa_getobjectcurrentuidsa_addlightsa_finduidlistcurrentobjgetXscalegetFrustumNearlastRenderTimesa_r_initsetXposmat_ambsa_camera_frustum_rightpolymatsa_camera_frustum_farsa_r_opendisplaypngInfogetXposcurrentRenderTimesa_togl_destroyfuncsetFrustumTopsa_r_setuplightingmat_specsa_loadtexturesa_r_render_objectsgetZrotcurrentidsa_get_face_normal_from_uid_listsa_r_render_axessa_def_light_pos2setFrustumNearsa_def_light_speculargetYscalesetGlFrustumtimeSinceLastsa_camera_frustum_bottomsa_get_face_normalmat_diffsetFrustumRightsa_r_render_object_polyssetFrustumBottomgetFrustumLeftgetFrustumRightsetZposgetYpossa_r_resizeviewportgetZpossa_r_initialisedlightparamstogl_errorsetZscaleGLfloatgetFrustumBottomsetZrotgetXrotsa_r_renderpolylistgetZscalesa_togl_createfunccurrentpolyidsa_camera_frustum_nearsa_r_maxlightssa_r_setupcamerasetXrotmat_shineglobToglsa_camera_frustum_leftsa_camera_rotrender.csa_def_light_ambientgetYrotsetFrustumFarsa_r_setshowaxessa_def_light_pos1getFrustumFarsetFrustumLeftsetYscalesa_r_updatecurrenttexcoordidsetRotThenTranssetYrotsa_camera_possa_getandbindnewtexturesa_camera_rotthentransgetRotThenTranscurrentvertexidsetXscalegetFrustumTopsa_def_light_diffusesa_camera_frustum_topDepthsa_camera_scalesa_r_closedisplaylastRenderTimeValidsetYposwasinitialisedtoglparentPtrTogl_ReshapeFuncdbClassfree_privateIndirectTogl_PostRedisplayXErrorEventTogl_LoadBitmapFontfontbaseAsTclObjectXSelectionEventdupIntRepProc_XGCx_rootsiblingoldAlphaFlagDefaultOverlayDisplayProcTcl_CommandTogl_SetCreateFuncTk_ClassProcsXMappingEventmax_maps_XICblue_maskmajorTogl_ColormapinternalBorderRightnumEntriesctablexselectionrequestEpsBlueMaptemplateTogl_SetReshapeFuncXSelectionClearEventinternalBorderToptablePtrwhite_pixelvalue_maskmindistotherValuePtrTcl_HashKeyProcTk_FakeWinevent_maskskiprowsoldAccumAlphabits_per_rgbbacking_pixelrebuildSizesave_underoldStencilSizenew_itemEpsMapSizeroot_visualxkeymapTcl_CompareHashKeysProcTkClassModalProcreleaseTypeTogl_CreateFuncxmaprequest_XExtDataxbuttonTogl_Screenbackground_pixelTk_Window_allocEntryProcshareWithsame_screenXColormapEventrbearingGLXContextroot_depthTogl_CmdatomAtomspecFlagsFindToglWithSameContextTogl_HideOverlayfontbasenextPtroldAccumFlagdbl_flagstogl.csave_underseventPtruser_redrawXReparentEventreqHeightlbearingTk_CustomOptionper_charTkClassCreateProcprivate_dataXStandardColormapattsxgraphicsexposeTogl_ScreenNumberPixmaplongValuemainwinPixelFormatchangesmin_char_or_byte2fontinfobackground_pixmapstaticBucketsTk_CursorRemoveFromListTogl_IsMappedOverlayTogl_MakeCurrentndepthsargvNameTogl_WorldChangedTkClassGeometryProcXPropertyEventdefault_charToglHeadTogl_CmdProcXVisibilityEventattributesTcl_WideIntmin_mapsprocsPtrborder_widthTk_ClassModalProcwideValuecard32downShiftDefaultTimerProcxselectionclearOverlayFlagxcolormapownerTogl_UseLayerDefaultDisplayProceyeOffsetTogl_UnloadBitmapFontOverlayWindownextIndexbit_gravityXSelectionRequestEventstack_modeOverlayUpdatePendingci_depthsTogl_DestroyFuncblack_pixelwin_gravitytimerHandlerTogl_FreeColorxunmapXFocusChangeEventfreeEntryProcTogl_WidgetTogl_EventProcrowlengthEpsGreenMap__GLXcontextRecy_rootdoubleValueTk_ClassWorldChangedProcdbNameTogl_SetDisplayFuncTogl_IdentupdateStringProcn_propertiesXUnmapEventoldRgbaBlueTogl_SetDestroyFuncxexposealignmentStereoFlagoldRgbaFlagxconfigureinternalBorderLeftusing_mesaborder_pixelborder_pixmapTogl_GetOverlayTransparentValuemheightTcl_HashEntryoldSetGridsubColordefault_gcXCreateWindowEventOverlayCtxtypePtrconfigSpecscursorattrib_countTogl_AllocColorOverlayxfocusTogl_TimerFirstTimeTogl_SetClientDataTogl_SetColorTk_WindowinternalRepTcl_FreeProcmin_boundsTcl_HashTableXMapEventTogl_CreateCommandTk_OptionPrintProcreqWidtholdRgbaRedXCrossingEventdummy1freeIntRepProccolormap_sizeTogl_DumpToEpsFiletwoPtrValueindex_sizecmapSizeinColorkey_vectorminReqHeightTogl_CreateWindowXExposeEventXMotionEventtkwindirectCtxkillidShareListTogl_DisplayFuncxreparentindex_bitsoldAlphaSizeswapbyteshashKeyProcdrawablebucketsClient_DataTogl_ClientDataXCirculateRequestEventXFontPropTogl_WidthrefCountinstanceDataTcl_Command_Tk_OptionParseProcTcl_FreeInternalRepProckeyTypefindProcxanysubwindowminReqWidthTkClassProcsTogl_TimerFuncTcl_HashKeyTypeDefaultDestroyProcdummy2dummy3dummy4dummy5dummy6dummy7dummy8dummy9first_keycodeXClientMessageEventTogl_InterpTogl_StereoFrustumTcl_SetFromAnyProcTcl_DupInternalRepProcoldAccumBluebitpixelscrnumrequestorfrom_configurecmd_nameinternalBorderBottomattrib_listmap_entriesxmotionRenderOverlaywidgetCmddbl_flagXAnyEventEpsRedMapbacking_planesoverride_redirectnameUidcmapdo_not_propagate_masknvisualsGLvoidbacking_storexcrossingVisInfoxkeyTogl_HeightTogl_ExistsOverlayTcl_Objget_rgb_colormapdefValueascentnextEntryPtris_hintOverlayCmapTogl_ShowOverlayxpropertyGLuintxdestroywindowAddToListshareCtxDefaultClientDatadummy10Tk_UidxresizerequestoldAccumRedgenerateEPSListBasepathNameXKeyEventTogl_RenderxgravityDefaultReshapeProcparseProcabovexerrorTogl_Initxvisibilitysend_eventToglCmdDeletedProcXDestroyWindowEventcmd_proceyeShiftTogl_Callbackfontnamemessage_typeDrawabledummy11dummy12dummy13dummy14dummy15dummy16dummy17dummy18dummy19oldAccumGreenTcl_UpdateStringProcpatchLevelxnoexposeOverlayTransparentPixelTcl_ObjTypebase_pixelmax_byte1xcoloneWordValueextensionsred_multXConfigureEventexactTogl_PostOverlayRedisplayoldDepthFlagstandardCmapsGlCtxgreen_maxTogl_OverlayDisplayFuncgeometryProcXCirculateEventbestmatcholdDepthSizeTogl_ResetDefaultCallbacksXWindowChangesXConfigureRequestEventXVisualInfoTogl_Displaymin_byte1Togl_GetClientDataShareContextXMapRequestEventTogl_TkWinXCharStructmax_char_or_byte2componentsXGravityEventresourceidxselectionoldDoubleFlaggrabPixelsgreen_multmwidthidentXResizeRequestEventVisualred_maskXButtonEventcurpixSetClassProcsPtrhp_cr_mapswinPtrPrivateCmapFlagOverlayIsMappedDefaultCreateProcnumCmapsmajor_coderoot_input_maskTogl_ConfigurenoFaultXAllocColor_XDisplayTimerIntervalTcl_HashSearchcompareKeysProcxcreatewindowxconfigurerequestTogl_DestroyTk_ConfigSpecprintProcskippixelsXGraphicsExposeEventlsbfirstvisinfoxcirculaterequestred_maxxclientnumBucketsFindToglXFontStructblue_maxoldStencilFlagcustomPtrgreen_maskminor_codeext_datamax_boundsXColorListCountptr1ptr2Tk_ClassCreateProcXSetWindowAttributesXKeymapEventxcirculatesetFromAnyProcTogl_SetTimerFuncTk_Cursor_VisualIDdescentblue_multoldAuxNumberattemptall_chars_existXPointerTcl_AllocHashEntryProc_XEventGLenumTogl_FreeColorOverlaylayerTcl_FreeHashEntryProcCommandTableoldWidthTogl_AllocColoreyeDistobjPtroldHeightclassUidminorNextworldChangedProcXNoExposeEventserialoldRgbaGreenmodalProcrequest_codescreenNumTogl_SwapBuffersxmappingcreateProcvisualidrgb_to_gray_blue_coeffpng_user_chunk_ptrpngLoadRawpush_lengthuIntidat_sizezlib_window_bitscheckForGammaEnvinterlace_typezlib_strategyoffset_unit_typegamma_shiftunknown_chunkspng_unknown_chunknum_palettetime_bufferzlib_mem_levelPalettebackground_gammaiccp_profilepng_structpunknown_chunks_numgammaExplicitpng_uint_16num_chunk_listgamma_16_tabletrans_valuespng_structuLongsrgb_intenticcp_proflenpng_uint_32read_data_fnpngLoadRawFendppngLoadint_x_whiteMaxTextureSizefileGammaflush_distStencilBluepng_sPLT_structinfo_fnpng_byteppscal_s_heightunpackpng_struct_defmem_ptrx_offsetmax_textinv_filter_weightsminuteirowbytespngSetStandardOrientationy_offsetcurrent_text_leftinv_filter_costssave_buffersave_buffer_ptrpcal_unitsgamma_tablecallbackpng_const_charpdither_indexpng_error_ptrpcal_X0pcal_X1secondSafeSizeoutput_flush_fnzbufmod_timeComponentspng_sPLT_twarning_fnpng_size_tPalettedTexturesdo_filtergrayread_user_transform_fnint_y_bluepng_byteppng_sPLT_entry_structint_x_bluepcal_paramsrgb_to_gray_green_coeffpng_uint_16ppsplt_palettesalphaint_y_greenx_pixels_per_unitpng_row_infoppng_row_infopngSetStencilpng_read_status_ptrscal_s_widthpalette_to_indexrow_numberuser_transform_depthzstreamuser_transform_channelsint_x_greenz_streamavail_inup_rowio_ptrpng_textppng_info_structwrite_user_transform_fnpcal_nparamscurrent_buffer_sizeStencilRedglpng.cgamma_16_from_1avail_outfilter_typeSetParamsrow_pointersminfiltermmx_rowbytes_thresholdpcal_purposepng_user_transform_ptrscal_unitpngRawInfouser_height_maxbackgroundgammaEnvHalfSizepngLoadFindex_to_palettezfreealloc_funcpng_int_32background_gamma_typepngSetViewingGammapng_charppcurrent_text_sizetext_lengthreservedpng_colorintffree_fngamma_16_to_1png_sPLT_entrypmalloc_fnpng_uint_16ppng_fixed_pointavg_rowsub_rowbig_row_bufcurrent_text_ptrpng_textmonthpcal_typegamma_from_1signatureflush_rowsrgb_to_gray_red_coeffpng_sPLT_tpnext_inpng_write_status_ptrint_y_whitegamma_to_1passread_row_fncolswrite_row_fnpngBindpng_sPLT_entrypng_progressive_end_ptrpng_color_16_structadlervoidpfsplt_palettes_numinternal_statepng_voidptransformationsopaquerow_ppngBindFpalette_lookupz_stream_spixel_depthpng_text_structcurrent_buffer_ptrpng_color_8png_colorppng_byteStencilGreenfree_menum_transpng_timepng_progressive_info_ptrspare_bytesig_bytesByteusr_widthnum_rowsglcomponentpaeth_rowcurrent_buffernum_textzallociccp_compressiontotal_inpng_charpbackground_1end_fnwrapstpng_time_structpng_infointerlacedzbuf_sizeint_x_redmagfilterBuild2DMipmapsrgb_to_gray_statusprev_rowdata2asm_flagsread_user_chunk_fnsave_buffer_sizeBytefhistpng_color_8_structmng_features_permittedint_y_redscreenGammafillerfree_funcResizecurrent_texty_pixels_per_unitpng_rw_ptrtotal_outpng_unknown_chunk_theuristic_methodDefaultAlphaCallbacknext_outchunk_namewrite_data_fnuser_width_maxpng_flush_ptrscal_pixel_heighticcp_nameint_gammaheadercur_palettescreen_gammaphys_unit_typepng_color_16dither_sortpng_progressive_row_ptrmmx_bitdepth_thresholdcolor_typezlib_levelpngSetAlphaCallbackvalidpinfousr_bit_depthendinfostandardorientationpng_color_structsig_bitzlib_methodiwidthpng_infopviewingGammanum_prev_filtersmipmapsave_buffer_maxscal_pixel_widthnentriesglformatdata_typepng_row_info_structcompression_typeprocess_modepng_free_ptrusr_channelserror_fnpng_malloc_ptrfrequencypng_unknown_chunkpskip_lengthEXinitTcltoupperwin32version__rescurrentAgentTypePtrmainWindowsasamiAvail/home/rboyatt/tkeden-1.66/EXwebSitesvnversioncurrentAgentNameEXinitcurrentAgentTyperestartCmdgotoCmdapple__pid_tTcl_GlobalEvalECtodoCmdcurrentAgentNamePtrevaluateCmdquitCmdTcl_AppInitTcl_EvalECvariantrefreshCmd$Id: ex.c,v 1.26 2002/02/27 16:31:55 cssbz Exp $stmtTypecurScriptcurrent_Notationevaluatenotnamesetpromptlabel$Id: parser.c,v 1.14 2001/09/27 14:07:23 cssbz Exp $prompt_onotherNotationdistributenScriptBufferscriptLeveldeleteScriptnewScript$Id: script.c,v 1.15 2002/03/01 23:39:40 cssbz Exp $resetScriptappendEdenscript.cappendnEdenprocClickNamepicttolowerlistsymbdtypeclearTreeListfgcolorymaxbgcolornew_symWinStructautogen_proc_nameymindumpscoutsymbolcmpedenStrsensitiveborderscoutErrorStruseOldTreebdcolorlookUpfontalignxmax/home/rboyatt/tkeden-1.66/Scoutdeclare_image_actionxmininstallIntVar$Id: tree.c,v 1.8 2001/07/27 17:03:59 cssbz Exp $def_treesym_treeinthonest_treestr_treefreetreewin_treeprintdefjustscoutType$Id: print.c,v 1.8 2001/07/27 16:58:33 cssbz Exp $printsymprint.cjust_namestoreSym$Id: store.c,v 1.11 2001/07/27 17:00:29 cssbz Exp $storeDefnScoutDefnstore.csubstst_nerrsdefaultWindowst_parsest_lval$Id: parser.y,v 1.16 2001/08/02 16:26:11 cssbz Exp $initDefaultWindowst_errorscout_errWinFieldst_lexScoutAppAgentNamesearch_constantfieldssearch_fieldst_leng$Id: lex.c,v 1.17 2002/02/27 16:55:56 cssbz Exp $tokensconstantsnew_st_textst_lex.cinit_scoutst_promptst_restartsearch_token8S=vQWRPPS<<W(S(SSvSSOSSHSSSbHpvpp tZt^ SES 6 6 a Sa c c S  m S RWRZZW  HVHZ ZV >S>ZZSP#2PsP,,ZHZHHnHnHH'H'SHSHHH, ,W nWn W' 'WOOSxSSSSS,xSSSSSSWVg)V,VnV'VOSVdVdjjVSXcSS P =SSStvPxVV(S(F!F!M!SM!!!$"S$"@"@"|"S (V(F! F!M!VM!! !$"V$"@" @"|"VKaPPQ"V"PWF!M!W!$"WQ"|"W6@"^Q"|"^(MWW P !WM!W!W(VH V F!VM!u!V!!V$"+"VP%PLSP|P(F!_M!!_$"@"_(MWW Wu!!W$"@"W(JVVH Vu!!V+"@"V(6SJ R RR Su!!SL QO P%%XSXZZSV_VS_S`pprSrttS W 3WS3SYWY[[WWSP*EP[SSPXV[VVR/cRRRR 88YWY[[{W{}4SP?EP[yS1XV[zV#UQQQ?uQPPSV>Q <S<> >R<P@QQWPWxx~P~@Q QrSrx x|S|~ ~S Q S Q >>bVbd:aSpVVp "P" P pWWiPSS S BBW B BB{V{;~SPP/ S S S  /S0AAWQ0A AUSUW `}}VVoSSWKW SS/S6KSVKVPpRR ::SS-PRVRSS?S?A7;PPooViS S 4 SR2 4 R@ [ [ p@ [  [ W  W  @ [ [ V  V [ S SR/[R.D \p &\.D `p &`.D dp &d.D hp &hSfSWvS X Sw Sp w S  S? S  W" Sc SOTSnSSJSSQ!Sl! #S##W#$S$$S?%D%SY%%S%&S.D lp &lSfSvSX S Sp w S  S? SnSSJSSQ!Sl! #S#_$S$$S?%D%SY%%S%&S - R? h R X S 0P4DPP<SBSrPSSlRR9WRRRj1S9SSrrVtVV9VVRW9WE{SP A V  P > S P  V P S? A PC V P V V` S S S PPDBSDnS[oPDIPSBSELSBSEVHdVxVS/DSHdSxSPx}PDSHdSSQQQRDRSS %S@QSSqQyySSQQ7ESZtS.E@4E@$Q$1SllQlSSS#4Q:hQSS~!@@ SCwS VCwV W%AWV]WP7 DCwD(MSSSMS.ll4pp9WW%W%--RWRZZWWW"V"--OVOZZV!V!33?V?TTVVV!3VVj Vj!!SS!!V""W"#V! "D!" #D!!P!"W""P" #W2#E#hL##h2#C#WU##W2#B#VU##VU#X#P##P%8%S$9%V%%V%&V%%S%&S%%X%&X%%\%&\%%`%&`P'h'Ph''V''P''Vh''W''W^''S''SR( )S"))SR( )V))V)6)PM)h)P:*h*S**S:*i*Vs**V{**P**P+%,R=,-V-*-R%,(,P*,-W+P,S,-S-*-S+*-O-_-+*-O-_-+*-@Z-_-@k+q+Rz++R*-.-R7-W-Rp--P-"/Sm--S:/~/S6//V////V///0V000O0VO0e0Qe0s0s0x0Vx0x0Rx0{0S~000.1V.1?1S?1I1I1Z1VZ11R11S1222R292Vx00W?1I1W12Wx00QL1r1Q11Q292Q@2V2V2^2V^2a2a2w4Vw4$5$5|5V|555@6VU33Sw44S44Sm55S5@6S[33|w4$5|m5@6|l33Ww44W44W576W@6T6T66R6666R77P77S77S77S#77V77V77V47L7Pe7z7P77P288S8 9VF9V9V`99V&828l288V88pF9F9WF9U9S^9b9Wb99S99 99P9#: 99Q99P9#:Q-;r;Wt;;W;<W:;W#;-;W::V::P::P%;q;Vt;;V;<V:;\%;;\;<\:;`%;;`;<`;;R@<E<R<<<<V<<<=V=!=!=8=V8=?=?==V=!=`J={=`==WT={=W=>Sf>>V>?V?I@V@@P@@R@@RWAAS`BbBPdBBRC'CRBCVC;CV{CCVOBCWC)CW8C{CWCCWEB{C`CC`CC`BCSCCSDDPDDVDEEVDDVDDVEEPEVEEVgDDWDDSDDWDEESMEEWaDEPDDl EEElFFPG%GPTHeHPE+FVGGVH IV&FGWGGWGHW I|IWI7JS7J?JPYJYJW FH IyJFGlIYJl-GFGPYJaJPGFIFPKFGSGGS;HHS IISYJyJSFGHGPJGGV IYJVKKSKKVLM|JNN|LM|SNN|MMP;MEMPQM^MPLLWLLWL3MQ3MdMQMMQ`NNQL9MWMMW`NNWIOOSO2OV-O0OP2OOVOOV`PPS#Q%QP'QQSQRSSSFSHfS~SSSSWWO`Wy%&S&&S'&G&S|% &V'&G&V%#&W'&G&W&A'SE'e'S&B'VE'e'V&C'WE'e'W4444V4444V45S5T5SV5w5S66P 66SL77S6 6S6!7S!7!7S27;7S77S 88S8z8S)9H9WS99W9:W ::W8G9VJ99V9:V ::V:::5;W5;7;7;V;Ww==Pd<i<V<<V==V==V=>Vd<l<<<=><j<W<<W=>W>>V>?V?z?V|??V@S@Sv@w@S@@S@8ASB CVCCVCCVC CSCYCSBDDWEEEWGEaEWDDPDDVEDEVGEaEV!F GW G1GWRGGWGGWrFtFPvF GVRGGVGGVFFQEFS G1GSGGS>HHVHIV!ITIVHHQ!I2IQ HHWHIW!IUIWIoKWuKKW&LJLWJrJSJJS&LJLSJrJVJJVJnKV&LJLV_V_e^SpVLVLVRRQQR&aRRRuRRpV*V1FVsW=S=?PAASWSWS;S;WWySCWW;WiVVWVRcRRRWRCcRR6;RouVxVtSxSSRRRIxRRbWbddhW aVad dhVLQPhQ`SdhSpWWp V VQQSS  WtPWWVV 11kQQ(Q*;QRRSwSS S SWwWWW Wwwwww wwwwww ws W W&&vR& &vQ&&'S'))hShnnvScR S S cSVVcVcQpP\pRVRV@V0VVpQXpfqQdhVThTSSS33Q35ShTh$T0CVRXVVQQSRWRSWR5SRRR$RWRRR@RR'RPSQRSR./R::Q:;SRRP`P`SS!S%1SPiRi1pPuQu1lVWW#W%1W%Q-1Q@\P@YRYpIWWLVVSSPPPSPPP'PENP`gPqPPPP~R R9~$$NR8HRRR!ARafRR3RaRR !RRRR~PpPPQ`~RVVfV V R V } Va V+ T Vc V0-VkVVVV VVV"VIVVV*2VHUVotVVV4FVXfVVVWVcoV{VVVV$0VJVVilPnVPV&V6[VhVV4<VY~VV:VIVV6LVaVVV V*`V~99_PQW[$ W Q QQ j S S Q( ; Q~W+QiQ\tQQQQSPP~P PPP/=PM i R RRPRRR=RR~W ~; !~!DW rWWNNWaWF~FFWXf~flW<YWW~P( ; PFPP /PPPNPPh|PFHPfnP<?PpPpP`p l H SH l S l8S8 l cScNlNSlSlSFlFOSOlSlS<l<YSYlS`l  V} a VNVVV2HVVV0AVVfVV&3V!VV VSQ<>P@NQNSQS S$ * SG s S S S( + V; S~~S~QPSSQiVVS VVVSNVSQ2HSU\SFQFFVfVSSSSS4<S<<VYSSSwSVS~S S ; SqSOXSO`~WN[WVV V$ S W  W$ x W } W( W QQQAQV!WiWQWWQWW=WQ2<WUWWWQW+WAQWfWW3W4<WYWWQUcWctQ W!WWWW/WR`QWR R W P9;PHRPP#5P5<RRWW PWRWP2WWPWW8ROoRWR4WW3RcWWRWR`WW $ Wx WWNWWW<HWWW+AWQfWW3W !WWW/=WP V P V( ( P( + V=ViiPiwVOXVVW} W RW=WOOROXWWW P Q9QQ5AQQQQQCQoQQ4Q3QctQQ P R9HR5RRRP(R(2PPcfRqR Q9QAQQQQCQQ3QctQQ(SSSS9;P/RPe~PPSuSSTPaTapPp`TP?PPP{P4<PYaPPwP=HPPQ( ; Q=Q}RRFRRRRR`uPuSS`uRuWRWPNSQyS|SROVQzV|VQQQdR|RRPC SE L SN X S R' * P, ; R? B RN X RP/ 6 P` r Pr S S S` r Rr W W Wl V V V P P P P P P P P!K+ i++S++ +, ,,S,- '!>!ɱ!--!-!ȷ-!-!̷-!-!-!!pK++p,,p-!>!lV++l,,l-!>!w!##wM#V)wb)v)w))w)+w+5,w@,-w-!>!w!V)wb)v)w)5,w@,-w!!PN"u"Pl##P%V%P&&P**P;*@*PZ**P++PN,[,P,-P-!>!w!V)wb)v)w)5,w@,-wi""S,,S-!>!d"#d))dE++d++d,,d--d-!>!`!!V!!`!5"V5"N"`N""V"~#`~##V##`##V#$`$$V$$`$f%Vf%n%`n%%V%%`%/&V/&&`&&V&&`&&V&'`''V''`''V''`'V(VV( )` ))V)K)`K)V)Vb)v)`))`))V))`)+V++`++V++`++P++`+5,V@,[,V[,,`,,V,,`,8-V8-}-`}--V--`-!>!\!V)\b)v)\)5,\@,-\-!>!X!.'X.'Z'RZ'V)Xb)m)Rm)v)X)8+X8+E+RE++X++R+5,X@,-Xk%%SN((S((Sm)v)S!!R %V%R&&R**R6*@*R**RV,[,R,-R-!>!T!V)Tb)v)T)5,T@,-T-!>!P!V)Pb)v)P)5,P@,-P!!S%&S''S#(N(S((S )()S-!>!P!)P))P)*P***5,P,-P-!>!!)߲))ߌ)*߳**ʴ*5,߰,-##''(#(鰪*****+,,%%ʳ((ʳ))!!ʱ""-))ʌ))ʋ++++-!>!P++P++P,,P--P++ʳ---.---.ճ..-.<.G.Q-. <.G. .A.SG.b.Sp..P..W..S..R..~..P..}..S..~..S..V..W..~..~..S..~..S..~..~..W..R..S//RO/O/SO/O/~O/O/RO/O/~O/O/SO/O/~O/O/SO/O/~O/O/VO/O/WO/O/PO/Q/~Q/X/~\/\/S\/\/W//S//R=0=0S=0e0Ry00Rh1h1Wh1h1Sh1h1~h1h1Sh1h1~h1h1~h1h1Sh1h1~h1h1Sh1h1~h1r1Vr1r1R11S11R 2 2S 22Rp2p2Sp22R22R22S22R22R33S33R.313RT3T3ST3\3R 4 4S 4$4R<44S44R44R44R55S/5t5St5x5R55R66S66R66W66S67R?7B7Ru7x7R77R77S77SJ8}8W}8}8S}88R88R88R#9#9S#9x9Rx99P99R99S99R,:,:S,:4:RT:W:RZ:m:S;;S;;W;;R;;R;;R;;S;<Rz<<S<<R<<S==SH=N=S{==S==S@@W@@R@@SeAeAReAhASAASAAR"B-BSABIBWYBzBSBBSBBRBBSBBRDDSDDR`FGWG1GSaGyGSyGG~GG~G7HSoHH~HI~IISIIWIJ~JJS"JfJVfJJWJJWJK~KbKS|KKSKL~LL~LLS!L!LS!L;LRnLnLSnLLRLLSLLRLL~LLRMMRMMS-M^MS^M`MReMeMSwMwMSMMSMMRMMSMMRNNSLNLNSLNLNRqNNSNNRNNSNNSNNSNNSOOSp..R..V..S..R..S..~..~..S..R..S..V//V//RO/O/SO/O/RO/O/SO/X/VY/\/R\/\/S\/n/V//S//R//V=0=0S=0=0R=0=0S=0e0Vy0y0Vy00Rr1r1Sr1r1Rr1r1Sr1u1V11S11R11S11V 2 2S 2 2R 2 2S 22Vk2p2Vp2p2Sp2p2Rp22V22V22R22S22R22S22V22V22R33S33R33S33V.3.3V.313RT3T3ST3T3RT3T3ST3\3Vk33R 4 4S 4 4R 4 4S 4$4V$4$4R<4E4S44V44R44R44V44R44R44V44Rt5t5St5t5Rt5x5V55V55R 66V66S66R66V66S66R66S67V?7?7V?7B7Ru7u7Vu7x7R77S77R77V77S8O8V}8}8S}8}8R}8}8S}88V88R88V88R88R88V88R99S9#9V#9#9S#9#9R#99V99V99R99S99R99S99V,:,:S,:,:R,:,:S,:4:VI:T:RT:T:VT:W:RZ:m:S;;S;;R;;S;;V;;V;;R;;V;;R;;S;<Vz<<S<<S==SH=N=S{==S==S>>V>;>RS>l>R>>R>>R?)?RW?i?R@9@Rg@i@R@@V@@R@@S@@S@@VA3AQOAOAVOAeAQeAeASeAeAReAeASeAhAVAASAARAAVAAV?BIBVIBQBSYBzBSBBSBBRBBVBBQBBSBBRBBSBBVCCSbDDVDDSDDRDDSDDVEEVEESPF`FSFGVG1GSOGgGRwGGRGGRoHHRIJVJJVJKR KKRLLR!L;LSnLLSM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNOSp..Q.qO}p.. .3 4"7?7778}8-9K9V9999Z:k:;;<<>>?)???@9@eAvAAABBOGGG'H7HHJKbKKL!L_LnLLLL M^MeMNNNOqOp....P..P/ /PO/Q/P\/a/P//P=0K0P]0a0Py00Pr1x1P11P 22Pp22P22P22P22P3 3P.3A3PT3X3P 44P44P44P44Pt5|5P6H6P66P67P?7G7Pu77P77P}88P88P88P#909PK9Y9Po9x9P99P99P,:0:PT:Z:Pk:r:P;;P;;P@@PeAvAPAAPAAPYB`BPDDPDEPEEP..~.O/~O/\/Qf3 4Q!44Q44Q44Q77Q7}8Q88Q88Q9,:QF:T:Q;<Qz<=Q>S>Q>>Q>>Q?)?QW?Y?Q??Q??Q@9@Qg@@QOG~GQGHQ7HHQJ$KQbKKQL!LQ!L;LQnLLQLLQMOQ..}.......qO..R....R..P..R....V..S....S....S..R..R..R..R//RO/O/RO/O/SO/O/O/O/RO/O/VO/O/RO/O/SO/O/RO/O/O/O/RO/O/SO/O/RO/O/O/O/RO/X/S//R=0e0Ry00Rh1h1h1h1Vh1r1Sr1r1Rr1r1Rr1u1R11R 22Rp22R22R22R22R33R.3=3RT3\3R3$4R44R44R44R/55R55R66RE6P6R66S67R?7B7Ru7x7R77R77P77RO88R88R88R#99R99R9 :R,:4:RT:y:R;;R;;R;;R;;R;;P; <R</<S<<P<<R<=R.=H=Ra={=R==R==R;>S>Rl>>R>>S>>R?'?R'?)?W?i?R??R??S??R@@R7@9@g@i@R@@ReAhARAAR*BIBRBBRBBRBBRnCCDDRDER9GOGSOGOGRwGGRGGRoHHRI(IR(I:IVJ%JRfJ{JRJJRJKR KKRbKKRKKRLLR!L!LR!L;LR;L;LSnLnLRnLLRLLRLLRM+MR^MzMRMMRMNRLNoNRNOROqOS..~..S..~..~..S.%/SO/O/QO/O/SO/O/RO/O/QO/O/PO/O/RO/O/SO/Q/Q\/\/S/ 0S=00Sr11S11S 22Sp22S22S313ST33S 44S4+4P<44S/5t5Qt5t5St5x5S646S67S77S77P77S}88S#99S99S99P,:W:SZ:m:S;;S;<S</<Rf<z<Rz<<S<<S==SH=N=S{==S==S>S>S??S@@S@@SeAASAASAAP*BDBQYBzBSBBSBBSBCPDDSG1GS9GOGRGGSoHHSIAIQuIIQJ0JQ0JRJQ^JJQJJQJJSLLS!L;LS;L;LRnLnLSnLLSLLRLLPLLRLLPM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNNSNOPOOROOR..~..~..}..~.qO~..S.%/SO/X/S\/z/S/ 0S=00S0L1Sr11S11S 22Sp22S22S313ST33S 4.4S<44St5x5S646S67S77S77S}88S#99S99S,:W:SZ:m:S;;S;<Sz<<S<<S==SH=N=S{==S==S@@SeAASAASYBzBSBBSBBSCDSDDSDDS`FuFSG1GS!L;LSnLLSM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNOS11QBBQ..S.%/SO/X/S\/z/S/ 0S=00Sh11S11S 22S22S313ST33S 4.4S<44St5x5S646S67S77S77S}88S#99S99S,:W:SZ:m:S;;S;<Sz<<S<<S==SH=N=S{==S==S@@SeAASAASYBzBSBBSBBSDDSG1GS!L;LSnLLSM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNOS..S.%/SO/X/S\/z/S/ 0S=00Sh11S11S 22Sp22S22S313ST33S 4.4S<44St546S67S77S77S}88S#99S99S,:W:SZ:m:S;;S;<Sz<<S<<S==SH=N=S{==S==S@@SeAASAASYBzBSBBSBCSbDDSDDSF1GSHHSIJS!L;LSnLLSM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNOS..S.%/SO/X/S\/z/S/ 0S=00Sh11S11S 22Sp22S22S313ST33S 4.4S<44St5x5S646S67S77S77S}88S88Q99S99S,:W:SZ:m:S;;S;<Sz<<S<<S==SH=N=S{==S==S@@SeAASAASYBzBSBBSBBSDDSG1GS!L;LSnLLSM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNOSO/Q/P99P..S.%/SO/X/S\/z/S/ 0S=00Sr11S11S 22Sp22S22S313ST33S 4.4S<44St5x5S646S67S77S77S}88S#99S99S,:W:SZ:m:S;;S;<Sz<<S<<S==SH=N=S{==S==S@@SeAASAASYBzBSBBSBBSDDSG1GS!L;LSnLLSM%MS^M`MSeMwMSMMSMNSLNiNSNNSNNSNOS/ /PE%EP..S/%/Sh1r1SDES..~h1r1~?EE~..~h1r1~EEE~..~h1r1~XEE~OOOQVQ2S2SGSVGSSSSVSRTRTrTVrTTTTVTfUfUUVUUOO OzQWzQ2S 2SGSWGSS SSWST TTWTfU fUUWUU OOO?PP?P2S2SGSPGSUOOOPRP2S2SGSRGSUQQQSSQRTTQOO~P2S~GSU~OOWzQ2SWGSSWSTWTTWOOQ2SGSSSRTcTTTfUUUOOQ2SGSSSRTfTTTfUUUOOPQQQRRGSSSUOOQ2SGSSSTTfUUUOOSOQSQ RRRRRRRPwRzRPRRRRRPS2SRtS{SR{SSPTRTROOP2SGSfUUUOO P2SGSUOOP2SGSUOO~6Q@Q~@QZQPGSfU~UU~CQQRSSRRTVTRTTROOQOOQPPQRRQRRQ=SGSQTUQUUQQQPRRPR SPGSUSPSSPQQRR$RRRRRRSRGSXSRSTROOR$RCRRCRURPURXRQwRwRRwRwRQwRzRRRRQRRRRRQRRPRRQRRRSSQSSPSSRSSQSSROOR@RURQUR[RRwRRQRRQRRQRRRSSR R@RQwRRQRRQRRQSSQ T8TQ=WS[mSS-:SJXV[nVP :V7JVJXp[nVvV p::V`rrS$S$ZZwSwP gSS#RGXRR JpJPP*S7S,W5W  o So u u S  V   S % % a Va h h V! d Sh S P S S  S@ ] ] b Vb i i V W Y P[ e Si S  V   7 V7 : : e V  S+ 6 S  W: e Wp  W  S P Pw V  S 4 S4 9 S  V) V  l' l ppTST[ UVU[ P  APA[`V  V` W  WDSSS DSSYSYssSOWOWWwWwWLWLTTW ISIW WjSj S FSFT TSPVPVqV.LV/IVTdVdqVW$W$((WWiW8pVipSS"FSSSpSS3S3>>SSP6VVV!#P%>RRuVVWV--NSNPPSSS44VSVZZ`S`S*0S`S\V2WKXWPVPPu lRZ]RkRRQu hSS>SSe S?DW3 5 P7 R W P "V""P R9!?!R!"R "S"S"$$KSKMMSSSS@\\SSWWW|WSS[dSSSS 5Ss|SPp5V5]]V V  V  V0P]jPrtPPPP<>P`cP:SVZS]tStP S S S S% : S: ? Po S S PH S SV]P P P P P P  V 6 6 cVcV$V  R= X RRR+RPaRR 3 S6 SLS-S[SxS$S0MMl0M MhSSWWppS((W( (V `|S*S*66=S=jjS*4S=hS=\i!\X`XsVs`V=`i`Vq `q V !`=di!d=hi!hWSFFWFdS}WWWfSW<SppWpSiiSipWWS8S, W, d Sg S W Wf f Wf n S S W W W & W+ < WA R WW h Wm x W W W W W W  W  W+ 6 WB D WU w W| W W S WWW+1WAGWWWWW]SmsWWWWWW||W|SWSWXWWW W)=WRmWWW1CWSeWuWWWWWW#AWKiWsWWW0W:`WjWWW&W0UW_WWW W0W:_WiWWWW%JWTyWWWW /W9WWaWWWWW)MWW}WWWW 2W<hWrWWWWW%*W;AWQWWggWgmS}WWWWWWWW'-W=CWSSWSYSioWWWWWWWWW)/W??W?ESUrW|WWW S3W=CWHmWwWWW1WdWW S. q W W S"!"!W"!,!SI!p!S!!W!!W!!S=li!lSFS fSNS~SipSS8S S LSWS|\SgHSS4S?S1SB S S"!,!SI!p!S!!S&R8aR \ SPVW!!W!!WV ! VA g V|V!!V!!VS|S!!S!!SDkSuS:qWuW?nVuVRPPPSTSVoS PotPPSSSPSPS(P(BSQ#SS 4P4_VfVVFVQV{SCSQSSPWPIWQsWWSISVV/IVP?GPPYPYlSpuSPiQptQPSSPSSP'S.hSpSSpSRR(SWS(WpPP PV(VQ(Q0YYVUR+WWWDJW5 WuW?WaWWPP (PgP%%P%%P%%P_&d&PHS/ S V  V - V(oS:S}S8StVS}S]VS{SlSSwV~QSSS&3S^jS S !S!#S-#:$SY$$S$$S$$S%+%S+%U%S%%S%&S& &P &+&Ss&y&SHSS/  S5 S (SoS:?SI}S8SS!S%rSS+Sq}SSSiSSS{SlSSm~SQSS#WSSSS&S3^SjS S!!S#-#S:$Y$S%%S%%S<&_&Sy&&SI j5 ?jIj&jCS  SS& + ++S+W+ &&W&(V((P))W))VO)i)P))P))P**P;(A(W)*W4+W+W&'S3((S))S);)Sd)})S))Sw**S**S+ +S8*;*P=*w*S4+W+S`++ ++S+5 55S5{5 +5k75{5k+5k75{5k++W+,V./V00V,0s0Vs0s0Ws00V00W00V1Y2Vw33VH5j5V+,W.0W1Y2Ww33W45WH5{5W++V+,l///V/0V,0?0V?0I0P 2Y2V343S374SC44S75Y5lY5{5V+5k75{5k+5k75{5k+5l75{5l+5l75{5l{/}/P//S//P//SH5Y5Sj5{5S+ ,S. /S//S/0S 22Sw33S44SY5j5S++l+5l7575l75{5l+5l75{5l+ ,S-.S..S/ /Ss00S00S00S:1`1S11SY2w2S23S[3w3S33S74C4S44S75H5S+5l75{5l+ ,S,-Ss00S+5l75{5lw22S44S5555S5555S55P5556S666.6S((>S>DDcS( (cp((ch((c`$DPDaPPPP-P\wPPPPPF[PPP 'P\wPP!SVkPPP<WPuyPPP*Q*AP``pRp`pp}P}~~PPWW h`XPSSS S 5SP5R@VVZSZ\\zSz|RYP\vPVAAVSVXXeSegA ACPCX XaPag 4CRCQPp R{PVV S S PPP P .0PPW#WJLPNS#S0VV^S^``fSfhhSHKPRRSSPPW-S-uS' ' ) P) C C L PL T ) R) > P` o o Re ~ P  S  S  P P H VJ [ V G Sp  P   P  R P   1 R . P@ V V W SW Z Z e Se k R W PZ d P} ` Sb r S  R ' PP _ _ r RU q P  S  S  P P SS0hhSS0h hjPj P TjRj~P RPV V  S S PPV6V6:S1SVSVSW SNSE b P PPk y P PVVV W W WSSSP <S@SPS/>W@WS` PW y~W~ySSHWSyPPPHWP|P|Pz|SS4S@SW$.WWNeWSS9VVNeV PPSPqSSS PS~S~p S"NlRNl Pp] p Pp3 Z Rp  V  V  S S!"!"!D!VD!H!H!~!V~!! !(SPEVDSPSDSDFtFtpFplFl`ttSS P !!@Q@FPddSSBVBEE V  %V&E_/_U_ _ %_CWE W %W:E_/_ _ _ _ _Z g _:E_/_ _ _Q g _ _ %_:Ep/p p p&E_/_H_ g _ _ %_&ASSjSR ZSS S 4 S S&E_/_P_ g _ _ %_kP P P:Ed/d d d:Ed/d d dQ d d %d:AS'/S S:Ed'/Q, = d= O QO dW Y P[ u R  Ro z P P P* N P P%P:Ed/d do d g d2 d %do S  S  QI O Sk S S Q:Eh/h ho h  h _ R_ g hI f hf R h h R hR%h:E_/_ _ _ g _ _ %_ P  R:SSL LS NSNT VVQVW(WPlWn{WKWjSnySS&KS[SSS^VVVvPPPP wS}SR\R\nPp}P}RQQ P P GSGIPccPS S ''SSS V  V ' '~V~ V V V PPpRVRUUVV'VQSS'SUH'HSW'WRULL/QQ'L0@@LPLvv{P{PSSS% %Q> PS:SW<WRPV;V`P'RP9P@N NuRu FS, B V V !V%!2!V!!V3"8"Vw"|"V""V""V #(#Vi#n#V##V##V#$V$$V, ; PH#g#P$$Pb$u$P$$P$$P##P# $P##P$$$%S%% %4%4%B%SB%D%D%a%Sa%c%%%%%R%%%C&QC&W&`&p&p&&R&&P''''S'111S111@2S@22x))R1,1Rx)z)P|))1V,11V11V@22V''P'*1W,11W11W@22W00SE22Sh)111@22(*(*S(*(*(*(*@(*(*D(*(*H(*(*L(*(*(*,,,R,,P,171S71K1RK1T1PT1T1R]1]1Pf1f1Ro1o1P11R11P11R11P11R11S11@11D11H11L111111@2@2@2@2D@2@2H@2@2L@2@2@2@2@@22 *00,111@2L2L22*-Q411Q11Q(1l11l@22l(1h11h@22h )1d11d@22d)1`11`@22`/)1\11\@22\B)1X11X@22X'(S1(1S11S''P11P"$P&KR`zPzRPWWRQRRRRRRVRrTrQ-V8V 8V8DQVV)V)2Qx{V{QRSS Q SRRVRRXRRVRR\RRVRD-VV DVV2VxVRRHRR`RRdRRhRRlRpRrVrrQrrRrQ-V?QV?DRVQV2lRxVRsWWWW"@@@``\\XXTTVVVV L LwWw{ {W ]tV{VFHPJqS{S l h d# d `. ` \< \ ~ ~Bv~~/~   m S ~E~e~/B~SZ~ W] WBvW  Bv/ X XRX T TQT [ / l / P  P P P L : L L t Qt LELEeQe/L9LQBLBEQEL V VBvV ~ V  /  /  / W W  /  / Q g Q  R0 d RD } P[ePPBSPI S`eSSBSS VEVeVV VVV8AV{VV#,V}VBV S  SSR"SllSllllRltS $RS8SG{SS#S2}SSSRSSZS ~E~l~F~P"PN]PPPSnPPB~ SRQR"SllRllQllRlqSRFSR8RR{QR#R7>RA}RRRRRQRSSZR VQ2VllQlqVQFZVpVVQ8QVbRQ#Q7<QA}QQQQVSZQPlnPPPP%8PPPP#P7>PASPp}PPP Pt HH Dt DlDZDt SS{SSSSSVPSPmS8R8V8Q8WPSS57P9CSEoSPPo&mSp~~PPP-vPVVV S S S++SVSWWlVlwwV+ +PSPW WbSbw wSSSoSs S    W # # m Wm   W \  V \ V$lW %WW4W?[WW''ISIXVVDSDKV' 'hl6XVV4VLhV~RBKR6SdSbSSSPlP W W W..p. .rWrx xW W..lDVDFFUV`WW` V VS(pSwSVPWSP-SVUVUWWuVuSSTSWSVDVDffAVAJJVVa a k Vk  e!Ve!!!!V!# S <S<f fjSj S 1S1  S J Jm Sm  S H HS S S S S S! !xSxa  a k Sk  e!Se!! !!S!# S!SxSD\S JSP$U%WN$W%pP$S%Sp%%%%P%%%%P%%%%S&&V&&V%&S&&S&(&PC&x&PA&&W&&WC&&R!!~x/2P2=P|~PPPP*:R|~RSSJYRRRRJ`RRRR 22]S]ccStStvvSpRS#S#--pSp}}SiSiSS S q q  S 1 1 USUR V &V&- -mVm} }V vVv RVSS q S`yySS `y yV V  lVlyyVVZVZV\ V\  V  VVVVloSSS;;V[VVVWWVWWVWWVW@SStStzU  3CC^V^kkV1V1  V U   V ---V-..(/V(/3U  3U  3SS17SWkS S~ S  W' Sb S]bS--S- .W9.q.S..SW/a/SU  3SS17SkS S~ SN.q.S..SW/a/S > QP y QS b S PS0s0PP>2b2P 8P8USWSS!P#\SSZS<SS18S S  S SVPVBVV1YV V  V VWUWW1YW W | W WWW1YW | W WVBVV1YV V  V VSSSS S}}}} }VVVV VWWWW W8=!( $"@"u!![4 [$$ ####Otc N% &V++*-O-V++*-O-O3355559999 : ::#:::::UU@UEU2U7UEfxfyffklllPlxl llFuw݋%|ɀ{<|yywyFΫ< N[ ?F d0yLO?E5;8]l-t034V@ETKMy`#z#0":"fF %%$z%T$x$$%$z##"`#:"" `(t(g))45.5P5za+z.C5BH*;W04Wc;f!Wx]a`z~@GVxygqN`G`WG R`=fUXH R`w=LnCUL{roffFX8>7UHs e k ; d z 2 t w G s > $ >  + OX OX 4o5c25R`-biw!Y4<{rU\@iq278>HQk N T  ? r !9"--,,@,,+5,++)E+))b)v)(V)#((((#(d$$((%% )()((#(N(''%&&&--}--,,@,[,+5,)+((((''''N((p)v)()K)---`-++))++--..YBqO\/9B.Q/0h1`FFDDCD@@=>01DD1 2BB4m5JJIIDbDA9Bt56IJH IFGbDDBC@@66DDBBYBzBk:m:9999m:;PF`FEFFCC;;BBzBB^MeM7HhHOGGG9GG7HoHHH IIJJbKLLbKLL!L!L;LeMOM^MnL MQwRUUTfUSRTGSSR2SRRRwRSSRR=RMRURoR T)T5TRTGJUW;q sdf g  |!!!!B_`#&: Q U`  =Ug  % g Lp}M''4!!!!}###$%J&Q&V&'1C22011'(11(U)D*,11(+2r a BZEeEBe9Zh.(/  ^9.N.-!.]|b  : | E    .symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_loc.debug_ranges#(( 1HH7 ȉ p?88 GoNN(.To||*c   +0l <<+P u3p3{``DttUUTj ? @ @ @ @ (0D Lcx R` i l0 w   7G `i    0I/  D ] 1 r +2  0CpO T{ [@. e m  q  h q0 } * p4! K  w B 0|  /E : E M ]P ey  kP2 ~ $m >y ,m @ PX PU  ? M    ` )|:6OoX[dpc m'" > `C@ O   @$ "q34uC" T@-^e`-l~P >   `D `:  H-T$Yd 0 = h$O 5 CUDk$-tpJ )Ķ!0 (-{  0 * PjX   (3z AMF X0C# [m i  v   2 <T   \"# P `d @)     B0j )V 8  ? Ec U ' c ih zpG W @! e~ P I  `r p  'g@-J  Wu dE lf  5 uh * P P~ G $ ' C 8c M`  W] gs r@e `@&    `  @  $` + <J]<wg  @  gj  U7 % F K T  + )K 5:U : D%  NIP  U a(}, Pp #p c z +   @'~  0m   / + <l P ^ * o]f v`%] ~`<a A 0d @>3 G  s 0PQ 4}p  h d-% 0 `&j ; :M Ч< Z  h @ | 0   Nv  - b X z  !a! ! ? #!4!  F!Q![ Y!p_ b!P u! !`  !! !0 ! !!D ! G !Qv "* "/"5 )".;"p K"K U"lM ]" k"x"$"p "П; "" " 8 "p?> "?"` "d #  #I (#<I#  ^#) m#6}#* ##d #% #1 #h #@M # $ -$!>$Q$]$0M l$}$  $ $z$P* $P $S$д* $$ $p3H $. %P( %K "%wz )%p 6%fC% V%d~ _%h-j%` %u# %n %Ѓ2 %@E %`, %. % %) %  %` &8 &@ )&m ;&K G&m Y& d q&a }&&P= &P,4 &  &0  &?k &CR & & &&c  ' $  ' '0l! ,'- :'  >' I'\'p. e'u'p} '' ''C 'E  'C' ' '+(P (((@hQ 7(c E(-L((d c(B o((`  (3( ( ( ( (&(0 (D ))Ժ )I0)=)nU K)V)`I? ^) m)` })` ) )`) )px ) )) )) )C***9B *0 )*o:*]J* [* : b*` m*^ t*`= *p *`= *4** * *p9 * 7 *`e ++0 $+p-2+F ?+e L+ : X+7g+6x+/+n| +' + U +L+ + h> +, +9+d,,c+,0* 5,0 D,a~ M,  `,3,d ,`h ,M , 6 ,,  ,PSq ,,L--( - "-0-! >- M- h-* v-t -k} -`: -K ---Ю+ -0\ -Y-t-P  -p. .c 6.d L.1 [.4x d.u..0 ..@ .@.  .R . ./  /&/8/&4 A/R/p]w ]/h< e/6 v/e~ |/pMU //0;, /pXr /; /P! /P%Q /P / / / /4 /0 0& 0 g 0 H #0* '0)20` =0U0 V Z0v> b00 j08-t0 0 0P 0@ 0о 06 0PPq 0` 00 h 0P 1X $10G =1a A1 U1I ^1X k1ГK t107 ~1 1  1m 11; 1 1 1p7 11 1\D 12 2-D$252) H2pH U2P6, g20_ s2+2@  2</ 2  222F2T20 3=R 3 ,3P+ 33u ?3- H3oS3b3 p3U v3L3%] 33@`w 3_ 3) 3` 3@ 309 3`Yl 3$ 3@ 44 !40r ,4н} =4`T G42 S4:c4Ю }4T4  4K 4,4 -4-44P 4P 4s 4@E 5V05 D5(m O55 ]5`D h5+w5E  5 55   595  55  5j 56 6/ 6t 6F/6k?6S{ J6@ X6 i e6M s6 6m 66@' 6-6`I 6 6*66! 64 7 7@  %7qD7; K7(L U7  h7-v7t 7@ 7W7 7@ 79777P  8T 8!8P ,80! 889 ;8:S8Pg  f8 t8?# w8HV 8E X8s 88D88  8;8y8P\ 8Y 9 99|&919=9K M9 Y9c `9! o9 9,-9 9TI 90-9P 95t 9d~ 9p7 9, :pR :`7 :-:':  9:0  D:` J:Z:p d:l:@ {:<:p  :, :b~ :: : " :[  ::K  : ;;K ;K  %;  0;8  4;c F;p* N;0BD U;4g;m n;l ;@b ;\; "$ ;) ; ;[;T ;<@* < <h-#<<4< A<7 O<g1 \<8 e< ~<-<S<gD <o <+ <<n< <( <  < =Du=-)= ==me G=G _=m p= |== =t ==, = =p8 = e =@-P=0>. > 3> ?> -DG>P Q> g>z>* >>]> >>N> > >vh >G > >$ ? !?32?P- >?"Q?g?PU n?p z? m ??#X ?`<; ?f2 ???@  ?E ??0?] @q @ )@g/ 2@z :@U G@B! J@`. S@h `@ 6 d@  u@&Z ~@T[@v4 @@ @j@[ @ - @  @G Ac A@" AA0` %A^ 1A<[ 9AN GAVA0 _AoA|A@+} A` At A4Ad A0%) A{AE  A#B@ "B`|G )B 2BT4 ;B-FB% ZBE gB- uBB &Z B&BwB) B=S B 7 BP>  B8 B E BC` Cg ,C @C]CqvCC`-C Cz C& C m C CCU pC D-D* #D  3D?D  PD` UDb ^DK oD0 wD-D* DDD V Dm D| D`= DP9 D`2 DD Ej Ep /E`m 9ENE|^E(jExEP E% E8 E E`K E$Q E/" E| EPV E xK E> E[V E$FP$ F!Fdi (F9F0 BF QF eF mF!F f abi-note.S../sysdeps/i386/elf/start.Sinit.cinitfini.c/build/buildd/glibc-2.3.6/build-tree/i386-libc/csu/crti.Scall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__completed.4463p.4462__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_aux/build/buildd/glibc-2.3.6/build-tree/i386-libc/csu/crtn.Smain.clastControlCTimeinerrorfretcalllastBeepTimeTopMasterStackmasterStackSizeentryStackSizeMasterStacksetTimertimedEventsEnabledEntryStackRS__PRETTY_FUNCTION__.15312runset.c__PRETTY_FUNCTION__.7043symbol.cLocalVarListyacc.cyydefgotoyypgotoyyr1yyrhsyyprhsyyrlineyyr2yydefactyytableyycheckyytnameyytranslateyychar1yypactyyfree_stacksyystacksizeyyvsyyvsayyssyyssayy_parse_initnGarbagenUsablegarbageLevelMAXUSABLEMAXGARBAGEgarbageusablec.2927yystateyyerrstatusyysspyyvspyynyylenyyvalbuiltin.cScoutScreenListAcceptTable__PRETTY_FUNCTION__.13618__PRETTY_FUNCTION__.13682pushlistdefnacceptablesymcmppackparaAppendRemovesearchKeylookAttrlookAttrResultcode.caddr.3084eval.clockscheduleheap.clex.cscoutScreenInitOpenedappend_charbuffer_overflowbuiltinFs.13048transtab.13667backslashkeywords.13026id_tokennew_yytextskip_commentbofgetAgentNameskip_percent_commenttable.13227tab.13226lib.cmachine.cUPDATEneed_rwvNullList.4007refer.ctype.cdatatypepcre.crep_maxrep_minpcre_default_tablesescapesposix_class_mapsposix_namesposix_name_lengthscheck_escapeis_counted_repeatread_repeat_countsfind_fixedlengthcompile_regexfirst_significant_codeis_anchoredis_startlinefind_firstcharmatch_refmatchcustom.cGlobalSymbolsindxcontextx_default_graphx_default_attrx_delete_openshapex_delete_graphx_delete_attrx_delete_actx_draw_actbackupContextbackupContextSizebackindxbackupIndxbackupIndxSizeMaxBackupIndxMaxBackupContextNORMALbackcontextname.13225change_scope2name.13252tempexpr_nameindentinsert_nldumpDonaldDeclarationlastvpneednllasttypedumpDonaldDefinitionlastmastertree.cinPrintTreeTopTreeListstagetranstreeListSizeRparenorigCommadumpbufsizedump_strglevel.12813glevel.12892TreeListdefnametempnameutility.cparser.cerrorstringdd_lex.cbufsizedd_textDonaldAppAgentNamedd_lengstatecurlyCountisOpenshapesavegtargetcheck.cTypeClashcheck_idsemantic_1semantic_2semantic_3semantic_4functions.cstructures.csa_polyuidcountersa_vertexuidcountersa_uidcounter__PRETTY_FUNCTION__.18969__PRETTY_FUNCTION__.19024__PRETTY_FUNCTION__.19093__PRETTY_FUNCTION__.19144render.ctogl.cDefaultClientDataDefaultOverlayDisplayProcconfigSpecsDefaultTimerProcDefaultDestroyProcDefaultReshapeProcDefaultDisplayProcDefaultCreateProcToglHeadFindToglSetClassProcsPtrTogl_CmdCommandTableTogl_TimerTogl_RenderRenderOverlay__PRETTY_FUNCTION__.20052dbl_flags.20050ci_depths.20049Togl_CreateWindowTogl_WorldChangedToglCmdDeletedProcTogl_WidgetTogl_EventProcTogl_Destroy__PRETTY_FUNCTION__.20432FirstTime.20421ListCountListBaseglpng.cStandardOrientationscreenGammagammaExplicitAlphaCallbackDefaultAlphaCallbackStencilBlueStencilGreenStencilRedPalettedTexturesMaxTextureSizecheckForGammaEnvSafeSizeBuild2DMipmapsSetParamsex.cedenCmdtodoCmdevaluateCmdquitCmdrestartCmdrefreshCmdgotoCmdapple.13540sasamiAvail.13539win32version.13538webSite.13537variant.13536svnversion.13535version.13534script.cscriptLevelnScriptBufferScriptBuffertablessedenStrsymbolcmpprint.cstore.cstoreScoutDefnsubstst_lex.cst_textfieldsst_lengtokensconstantsScoutAppAgentNamenothing.c_DYNAMIC__fini_array_end__dso_handle__fini_array_start__init_array_end_GLOBAL_OFFSET_TABLE___init_array_startsa_addpolysetYposnetodolastRenderTimeviewport_namelocal_declarepng_get_gAMA@@PNG12_0png_set_gray_to_rgb@@PNG12_0glXQueryServerStringTogl_GetOverlayTransparentValuepng_read_image@@PNG12_0png_set_gamma@@PNG12_0sa_r_maxlightsisUserDefinedptsname@@GLIBC_2.1expr_to_donald_nameTcl_GetVersionclearTreeListchange_targetsnotationGetsscan_fglPixelStoreinegatenotationTypeToStringed_sasami_object_posTogl_ReshapeFunccos@@GLIBC_2.0inpdevlinenoappend_linebufgetmemprintfgetc@@GLIBC_2.0setXrotprognamesa_clear_polyinfostoremainWindowstack_overflow_errjmpdelete__strtod_internal@@GLIBC_2.0insert_level_markersasami_light_attenuationsasami_light_directionallcatchangecount_idpngSetViewingGammafdreadyInp_Dev_Savesasami_object_scalesasami_viewportnewStringBuffget_stringsetYscalesasami_light_posed_sasami_light_posglTexImage2DTcl_GetStringResultTogl_SetReshapeFunceden_notice_undef_referencesa_inputstringdd_scriptstrncat@@GLIBC_2.0strchr@@GLIBC_2.0Tk_SetClassProcsTogl_PostOverlayRedisplayappend_NoAgentNamet_floatinthonest_treeglReadPixelsjptgetFrustumTopobjmateriallistDefineinEVALfeof@@GLIBC_2.0sa_load_objsa_getuidlistshiftglGenTextures_changedfpunget_chardecGarbageLevelinit_donaldprompt_onXMapWindowdumpdtreeed_sasami_object_rotassignatan@@GLIBC_2.0lookuptouchscan_fpatchinttimewouldBlockTcl_EventuallyFreeungetc@@GLIBC_2.0grantpt@@GLIBC_2.1builtin_ft_checkt_charsa_r_initdumpbufRS2sa_getfirstmaterialcurrent_NotationXGetVisualInfo__ctype_tolower_loc@@GLIBC_2.3Togl_ColormapprintRunSetgetZrotdd_parseaction_queuectoslook_updeleteActionWithTokensetFrustumRightswitchcodeinitRunSett_superrelated_by_codenoticeft_intTogl_PostRedisplayfirstlightinterruptedb_writelibLocationsetZrotsa_r_resizeviewportreset_compiler_statusXRaiseWindowget_msgqwritelndec_asgnentry_ptrglRotatefrun_initdumpscoutwrite@@GLIBC_2.0localtime@@GLIBC_2.0Tcl_InitTcl_Releasewin_treefileno@@GLIBC_2.0sa_findlightSEARCH_symptrpng_set_sig_bytes@@PNG12_0strcmp@@GLIBC_2.0code_related_byglXUseXFontlog10@@GLIBC_2.0IDlistglFlushsavetextglColorTableEXTusageclose@@GLIBC_2.0asin@@GLIBC_2.0swapAndRunRunSetagentType_fp_hwyytextperror@@GLIBC_2.0ret_callcnv_2_boolTogl_ScreenNumbereqcallsa_scriptfprintf@@GLIBC_2.0fork@@GLIBC_2.0sa_addlistgetActiongetenv@@GLIBC_2.0sasami_poly_tex_vertexTcl_PreservelastNullInIDlistpcre_fullinfosignal@@GLIBC_2.0png_get_PLTE@@PNG12_0dd_debugrawserialreadTcl_PkgProvidepclose@@GLIBC_2.1related_by_code_runtimelhsdd_nerrsreplaceRefsed_sasami_vertexsa_r_setshowaxesgetFrustumLeftstrtodoubletimerhandlerstartupcwdglVertex3ffreeStringBufXRootWindowdefinitionleTopEntryStackresume_scopeTogl_TimerFuncsetZposE_Disp2PSddupnotationPushPopglXQueryExtensionyyparsedd_errorpeek_eden_internal_cdTogl_Screengargcsetyyparseinitcfsetospeed@@GLIBC_2.0user_tracelookup_addressdtree0queuedd_appAgentNameaddress_errorkeyincurrentAgentNamesasami_light_diffuseTk_CreateEventHandlersa_adduidlistltselect@@GLIBC_2.0tree3sa_dumppolystextptrglPixelMapfvinit_ScoutScreenListcontext_searchsa_togl_createfunc__assert_fail@@GLIBC_2.0curScriptTogl_Displaymark_changedInp_Devvsnprintf@@GLIBC_2.0freetreestrerror@@GLIBC_2.0code_related_by_runtimelhscheckok1getYscaleed_sasami_poly_colourmakedatumsasami_poly_colourdirname@@GLIBC_2.0Togl_IsMappedOverlayTogl_HideOverlaysa_def_light_diffusePlotShape__libc_csu_finiusbhidreadsa_dumplightstcsetattr@@GLIBC_2.0Tcl_DeleteTimerHandlerpngSetStandardOrientationcodeswitchcurrentAgentTypePtrTogl_TkWininit_scoutautocalcpng_get_rowbytes@@PNG12_0sa_addvertexsa_r_setupcameraXResizeWindowputchar@@GLIBC_2.0__cxa_atexit@@GLIBC_2.1.3delete_local_levelentry_tblDeclareGrapheden_backticks_dependency_hackscoutTypesa_inputresetupdateevalDatumprintUsageglDisableprogpsymbol_searchglDepthMasksa_getpolysymtbl2listhasheden_initprogTogl_Interpeden_delete__errno_location@@GLIBC_2.0dtree2rawserialclosepow@@GLIBC_2.0debugglMatrixModesa_def_light_pos1printsymsa_getlightTogl_GetClientDatafirstpolyget2numvertexinfostoreerrorContentfincGarbageLevelsa_getobjectinvoke_action_queuefirstmaterialgetFrustumBottomconcatmustintlookUpsa_clear_vertexinfostoreconcatoptprintstdoutsasami_material_diffusestackinit_lexsystem@@GLIBC_2.0ed_sasami_material_diffusetolower@@GLIBC_2.0st_promptTcl_EvalExinpdevnameaccess@@GLIBC_2.0sa_getvertexerrorCompletestack_underflow_errsasami_poly_materialTk_MainWindowpre_incdeclare_actiondeclare_openshaperandom@@GLIBC_2.0sasami_material_texturestoreDefnputs@@GLIBC_2.0Tcl_Alloc_initnameofpopen@@GLIBC_2.1DELETE_entry_ATOMglViewportmakearrgetvalueadd_local_variablechange_sourcesTogl_DisplayFuncglBeginTogl_SetCreateFuncrmActionsa_addmaterialmalloc@@GLIBC_2.0pngLoadRawFsasami_light_ambientpre_decgetXrotTcl_FindExecutabledd_restartsetsid@@GLIBC_2.0Togl_AllocColorlook_prevrawreadreset_contextglDrawBufferfscanf@@GLIBC_2.0setFrustumNearsasami_object_rotglXMakeCurrentreset_evaldtree4translatescanf@@GLIBC_2.0ed_sasami_viewportsa_camera_frustum_bottompcre_versioninsttblpng_destroy_read_struct@@PNG12_0sasami_light_enabledbackup_contextpipe@@GLIBC_2.0getFrustumRightTcl_SetResultsa_camera_frustum_farpngSetStencilsetpromptcurrentAgentTypeTogl_UnloadBitmapFontsa_get_face_normal_from_uid_listed_sasami_material_specularfread@@GLIBC_2.0memmove@@GLIBC_2.0XStoreColorpushEntryStackTcl_SetObjResulterrorfsetYrotTk_SetGridgetFrustumNearsa_dumpobjectsTcl_NextHashEntrygetXscaleTk_DeleteEventHandlerhptrfscan_ftopEntryStack_eden_internal_cwdappAgentNametypenochange_scopeTcl_EvalFileTogl_SetClientDatadef_treesa_r_ysizeed_sasami_material_ambientregmatchrawwriteE_StringRemainschedule_parents_ofmodget_stringeden_full_nameadded_sasami_light_enabledsa_addobjectTogl_ResetDefaultCallbackseden_declarestdout@@GLIBC_2.0createtimerstderr@@GLIBC_2.0sa_camera_frustum_righttranslationTcl_CreateInterpsasami_object_polyget_charsa_addlightTogl_Widthscatexec_filetextcodeyynerrsTk_ConfigureWidgetsa_def_light_ambientnewhdatsa_r_updatesa_parsestringunmarkGarbageRS1XSendEvent__xstat@@GLIBC_2.0lazy_notglTexParameteriregreplace_eden_internal_basenameglXChooseVisualclearEntryStackbreak_qvfprintf@@GLIBC_2.0emalloc_psa_structures_initTk_SetInternalBorderpcre_mallocpng_get_IHDR@@PNG12_0sa_init_sasamisasami_vertexinterpsa_camera_frustum_leftexec_stringfseek@@GLIBC_2.0clearMasterStacksetbuf@@GLIBC_2.0sa_get_face_normalsend_messageflushRestOfLinevertexinfostoresizeXFreesa_load_mtlyylengtime@@GLIBC_2.0cosh@@GLIBC_2.0Tcl_DStringFreeglTexCoord2frawserialopenglGenListssymbolsresume_contextcode_definition_startotherNotationTcl_GlobalEvalECt_typest_restartpng_set_expand@@PNG12_0setFrustumBottomgetRotThenTransgetopt@@GLIBC_2.0Tcl_InitHashTablesublistTogl_FreeColorfgets@@GLIBC_2.0Tk_ResizeWindowsa_r_initialisedbitanddumpdonalddefinesasami_poly_geom_vertexsa_r_renderdatacmppng_check_sig@@PNG12_0XFreeColorsed_sasami_light_ambientcompiler_flagappendEdennewScriptsa_findvertexglLightfsetFrustumLeftsa_camera_rotsymboldetailSEARCH_entryappendnEdenTcl_GlobalEvalchdir@@GLIBC_2.0Tcl_SetVaraddIDMOVE_entry_Qrlibtblfputs@@GLIBC_2.0ed_sasami_material_texturejust_nameEXinitTcl_DStringAppendElementstrstr@@GLIBC_2.0strlen@@GLIBC_2.0longjmp@@GLIBC_2.0getZscalesa_loadtextureint_treesasami_setshowaxespng_create_read_struct@@PNG12_0ed_sasami_setshowaxesprintdefTogl_ShowOverlaysasami_set_bgcolourglLightfvInput_Devicespost_decTcl_DStringAppendsa_skiplineinit_LocalVarListformula_listglGetIntegervsa_findobjectTogl_Configureed_sasami_poly_geom_vertexgetFrustumFarrefer_bysa_addescapesst_errorinPrefixst_nerrssa_getmaterialrealrand__strtol_internal@@GLIBC_2.0qsort@@GLIBC_2.0Togl_CreateFuncTcl_ResetResultglXDestroyContextsa_def_light_specularsa_camera_frustum_topchange_contextevaluateatan2@@GLIBC_2.0__xpg_basename@@GLIBC_2.0print_symbol_tableglLoadIdentitydispatchTk_MainLoopTogl_DestroyFuncaddActionTogl_AllocColorOverlayglPointSizesa_getfirstobjectXCreateColormapexecvp@@GLIBC_2.0mustaddrglPixelTransferiuser_erroripcloseTogl_MakeCurrenttree2printhashglPopMatrixnew_symforgetbitorfreedatumpngBindFtkdefineinit_edensa_dumpmaterialsis_graphresetLockstrncmp@@GLIBC_2.0getheapdtree1printlocalnarymulTcl_GetVaruseOldTreeTk_CreateWindowFromPathaddrcheckokinitbufdd_promptinstall_custom_variablesgargvTogl_InitpopMasterStacked_sasami_object_visiblejpntpost_incpopfputc@@GLIBC_2.0__libc_csu_initsa_getandbindnewtexturesearch_ScoutScreenQsasami_material_specularselscoutScreenInitOpeninitcodesearch_localstoreSymsa_getUIDis_shapepcre_compile__bss_startTk_UnsetGridsasami_object_posmainTk_Initsa_getvertexUIDsa_r_closedisplaymakelistpng_read_info@@PNG12_0setXposdefaultWindowTk_ConfigureInfoTogl_CreateCommandclear_IDlistmap_token_to_nameput_environTcl_AppendResultheapinstallIntVarremove_msgq__libc_start_main@@GLIBC_2.0glClearColorraise@@GLIBC_2.0Tk_SetWindowVisualexpr_to_eden_namedeclare_image_actionlastRenderTimeValiddivideusbhidclosecall_libTcl_PutEnvexp@@GLIBC_2.0setFrustumFart_strTcl_DeleteCommandmustcharTk_MakeWindowExistlistsymsa_findpolyTcl_AppInitsetRotThenTransfree_symbolresetScriptlocaladdrstackpDefineFuncXLoadQueryFontsetXscaleusbhidopensa_r_opendisplaypush_textclearRunSetdup2@@GLIBC_2.0ed_sasami_poly_tex_vertextanh@@GLIBC_2.0restore_contextexecuterealloc@@GLIBC_2.0st_scriptst_debugstrcat@@GLIBC_2.0new_symbolsetFrustumTopdisAsseval_formula_queuepng_create_info_struct@@PNG12_0currentAgentNamePtrstartValidTogl_SetColorsa_getlisttan@@GLIBC_2.0data_starterealloc_pXQueryColorspushMasterStackprintf@@GLIBC_2.0Togl_ExistsOverlayglDepthFuncsa_togl_destroyfuncqueryglGetStringlook_up_treedefnonly_finimemcpy@@GLIBC_2.0sqrt@@GLIBC_2.0count_exprDisplayScreensetGlFrustumtkdefineDatumstartupargcprint_all_symbolsglMaterialfMOVE_symptr_QsptrTogl_FreeColorOverlayrunfclose@@GLIBC_2.1glLightModelisa_findmaterialTcl_FirstHashEntrysaveprogchangeNotation__ctype_toupper_loc@@GLIBC_2.3atexitpushUNDEFsa_r_setuplightingsa_camera_pospqtlistheaded_sasami_light_attenuation__strdup@@GLIBC_2.0yydebugframeTk_DestroyWindowglPushMatrixTk_NameToWindowsasami_object_visibleprint_treeTcl_CreateCommandpngLoadRawsa_findlistorgettimeofday@@GLIBC_2.0Togl_DumpToEpsFilepolyinfostoregtsymboltextblibtblwarningfXInternAtomTcl_NewIntObjglBindTexturepngLoadFsnprintf@@GLIBC_2.0XmuLookupStandardColormaparrayindexcalcglEnableglNormal3fopen@@GLIBC_2.0glCullFaceXAllocColorcurrentNotationaction_listipopensa_finduidlistcode_definition_runtimelhsdd_charsa_dumpverticesisNotYetDefineddd_lvaled_sasami_set_bgcolourmap_name_to_tokensym_treehashindexTogl_SwapBuffersfreeTreejpnfst_charglFrustuminitDefaultWindowcall_floateagerexit@@GLIBC_2.0Control_CglClearnotationSwitchXCreateWindowTogl_OverlayDisplayFuncEXinitTclstr_treepng_init_io@@PNG12_0setZscalewarningst_lexcalloc@@GLIBC_2.0UndefDatumpcTcl_DoWhenIdlenextcformula_queueTogl_Identandsa_def_light_pos2getYposb_exitsscanf@@GLIBC_2.0_edatasa_index_from_vUIDpipe_processcfsetispeed@@GLIBC_2.0deletetimergettime__i686.get_pc_thunk.bxTcl_CreateTimerHandlersetLibLocationfree@@GLIBC_2.0getXposreceive_message_endioctl@@GLIBC_2.0clearGarbagesa_getpolyUIDsa_exit_trapaddentrysa_r_render_object_polysglobToglXSetWMColormapWindowssa_outputTogl_StereoFrustumf_eofTcl_Evalgetcwd@@GLIBC_2.0polyinfostoresizeTcl_EvalECcodeevalacos@@GLIBC_2.0sa_camera_rotthentransTogl_SetDisplayFuncprintlistsasami_material_ambientstdin@@GLIBC_2.0startupargvTcl_DeleteCommandFromTokenappendHistDebugglMaterialfvfget_chared_sasami_object_scaledd_lexappendscoutErrorStrcfmakeraw@@GLIBC_2.0Togl_LoadBitmapFonted_sasami_light_diffusefirstobjectst_lvalpcre_freeed_sasami_object_polystrncpy@@GLIBC_2.0getZposglShadeModelTk_FreeOptionsyylvalglScalefTk_SetClasssa_r_render_axesstartcheckok2sasami_light_specularinstalladd_ScoutScreened_sasami_light_specularfopen@@GLIBC_2.1markGarbage_setjmp@@GLIBC_2.0png_read_end@@PNG12_0updatesave_IDlistoptarg@@GLIBC_2.0Tk_FreeCursorpngLoadpopdinsertglTexEnviTcl_CancelIdleCallTogl_Heightapply_IO_stdin_usedTcl_LinkVardeleteAllTokenActionsrefer_tostrtok@@GLIBC_2.0sa_errordon_errlookup_localgeerror_nosa_eden_initjpfdonald_full_namemustlistsrandom@@GLIBC_2.0readyXGetRGBColormapsE_tclpng_read_update_info@@PNG12_0Togl_UseLayerfile_statyylexdefinition_runtimelhsDeletenewdatumXWarpPointerbackgndget_environpushintpopEntryStackglXSwapBuffersdumpedenTcl_DStringInitglTranslateffinetimeed_sasami_poly_materialWidgetMapsprintf@@GLIBC_2.0sa_camera_frustum_nearout_of_range_errorfwrite@@GLIBC_2.0cont_qglXCreateContextTogl_SetDestroyFunct_str1copyTreenoupdatesa_r_xsizepngSetAlphaCallback__data_startsa_r_bgcolourglXGetConfigmuststrsin@@GLIBC_2.0Tk_GeometryRequestsubconstpushscout_errappendTreeListTogl_SetTimerFunceden_interrupt_handler_IO_getc@@GLIBC_2.0freeheapDELETE_symptr_ATOM_Jv_RegisterClassespng_set_strip_alpha@@PNG12_0__ctype_b_loc@@GLIBC_2.3glColor4fagentNameterminatereallocStringBuf_eden_internal_dirnameprocessingRunSetextendbufrand@@GLIBC_2.0ilibtbled_sasami_light_directionalsa_camera_scalegetYrotTogl_ClientDataglBlendFuncsa_getfirstlightpushlistsizeappend_agentNameDeclaresa_r_showaxespcre_execXUnmapWindowlog@@GLIBC_2.0viewOptionsoptind@@GLIBC_2.0sa_eden_initialiseddeclaredeleteScriptdtree3glEndis_openshapeunlockpt@@GLIBC_2.1topMasterStackhashtabletcgetattr@@GLIBC_2.0read@@GLIBC_2.0Tcl_VarEvalglDeleteListsprintVersioncode_evalsubstryycharinc_asgnpngBindnoteden_error_index_rangechange_prompttypenamesa_index_from_pUIDpackTcl_Freedeletealltimerssinh@@GLIBC_2.0linenoXInstallColormapst_parse__gmon_start__sa_r_render_objectsyyerrorstrcpy@@GLIBC_2.0pcre_infoEDEN-1.66/lib-tkeden-1.66/0000755000175000017500000000000010435602735014526 5ustar rboyattrboyattEDEN-1.66/lib-tkeden-1.66/aop/0000755000175000017500000000000010435602735015305 5ustar rboyattrboyattEDEN-1.66/lib-tkeden-1.66/aop/operations.e0000644000175000017500000001331510271160766017642 0ustar rboyattrboyatt/* operations.e [09/11/2002][Ant] */ FAIL = 0; /* pivot finds a sub-string, ignoring given blocks, and returns the sub-strings on either side of it */ func aop_pivot { para instr, pivot, ignore; auto i; i = extract(instr, pivot, ignore, 1); if (i == 0) return FAIL; else return [pivot, [substr(instr, 1, i - 1), substr(instr, i + pivot#, instr#)]]; } /* pivot_rev is pivot but searches from the end of the string backwards */ func aop_pivot_rev { para instr, pivot, ignore; auto str, i, j; i = extract (instr, pivot, ignore, 1); if (i == 0) return FAIL; while (i != 0) { j = i; i = extract (instr, pivot, ignore, j + pivot#); } return [pivot, [substr(instr, 1, j-1), substr(instr, j+pivot#, instr#)]]; } /* split divides a string into chunks using a separator, ignoring all occurrences of the separator within the given blocks */ func aop_split { para instr, split, ignore; auto i, j, list; i = 1; list = []; while (1) { j = extract (instr, split, ignore, i); if (j == 0) return [split] // [list // [substr (instr, i, instr#)]]; list = list // [substr (instr, i, j - 1)]; i = j + split#; } } /* read_prefix matches a prefix to a sort of regular expresion it returns the prefix found and the remainder */ func aop_read_prefix { para instr, chars, count; auto result; if (chars == []) { if (count == "*") return [instr, []]; else if (count <= instr#) return [substr(instr, 1, count), [substr(instr, count + 1, instr#)]]; else return FAIL; } else { if (count == "*") result = chars_begin(instr, chars); else result = chars_finite_begin(instr, chars, count); if (result == []) return FAIL; return [ result[1], [result[2]] ]; } } /* read_suffix matches a suffix to a sort of regular expresion it returns the suffix found and the remainder */ func aop_read_suffix { para instr, chars, count; auto result; if (chars == []) { if (count == "*") return [instr, []]; else if (count <= instr#) return [substr(instr, 1, instr#-count), substr(instr, instr#-count+1, instr#)]; else return FAIL; } else { if (count == "*") result = chars_end(instr, chars); else result = chars_finite_end(instr, chars, count); if (result == []) return FAIL; return [ result[1], [result[2]] ]; } } /* read_all attempts to match a string to a sort of regular expresion it returns either the string, or [] if it did not match */ func aop_read_all { para instr, chars; auto result; if (chars == []) return [instr, []]; result = chars_finite_begin (instr, chars, instr#); if (result == []) return FAIL; /*strange behaviour, for some reason the old "read_all" does this backwards! return ["", [instr]]; */ return [instr, []]; } /* prefix checks a string for a literal prefix */ func aop_prefix { para instr, prefix; auto i; if (prefix# > instr#) return FAIL; for (i = 1; i <= prefix#; i++) if (prefix[i] != instr[i]) return FAIL; return [prefix, [substr(instr, prefix#+1, instr#)]]; } /* suffix checks a string for a literal suffix */ func aop_suffix { para instr, suffix; auto i; if (suffix# > instr#) return FAIL; for (i = 0; i < suffix#; i++) if (suffix[suffix# - i] != instr[instr# - i]) return FAIL; return [suffix, [substr(instr, 1, instr#-suffix#)]]; } func aop_literal_re { para instr, pattern; auto matches, i; matches = regmatch(pattern, instr); for (i = 1; i <= matches#; i++) if (matches[i] == instr) return [instr, []]; return FAIL; } func aop_prefix_re { para instr, pattern; auto matches, result; matches = regmatch(pattern, instr); for (i = 1; i <= matches#; i++) { result = aop_prefix(instr, matches[i]); if (result != FAIL) return result; } return FAIL; } func aop_suffix_re { para instr, pattern; auto matches, result; matches = regmatch(pattern, instr); for (i = 1; i <= matches#; i++) { result = aop_suffix(instr, matches[i]); if (result != FAIL) return result; } return FAIL; } func aop_operation { para instr, op_name, op_value, ignore; auto result; switch (op_name) { case "prefix": result = aop_prefix(instr, op_value); break; case "suffix": result = aop_suffix(instr, op_value); break; case "pivot": result = aop_pivot(instr, op_value, ignore); break; case "rev_pivot": result = aop_pivot_rev(instr, op_value, ignore); break; case "split": result = aop_split(instr, op_value, ignore); break; case "read_prefix": if (type(op_value) != "list" || op_value# < 2) return ["badop"]; result = aop_read_prefix(instr, op_value[1], op_value[2]); break; case "read_suffix": if (type(op_value) != "list" || op_value# < 2) return ["badop"]; result = aop_read_suffix(instr, op_value[1], op_value[2]); break; case "read_all": result = aop_read_all(instr, op_value); break; case "literal": if (instr != op_value) result = FAIL; else result = [instr, []]; break; case "literal_re": result = aop_literal_re(instr, op_value); break; case "prefix_re": result = aop_prefix_re(instr, op_value); break; case "suffix_re": result = aop_suffix_re(instr, op_value); break; default: return ["badop"]; } return result; } EDEN-1.66/lib-tkeden-1.66/aop/action.e0000644000175000017500000000701310271160766016732 0ustar rboyattrboyatt/* action.e [18/11/2002][Ant] */ func aop_action { para script, instr, token_matched, child_substrs, passed_var, instr_var; auto i, child_params, formatted_str, script_later; script_later = []; ##check that script is a list if (type(script) != "list") return ERROR; ##create child variables/parameters child_params = []; for (i = 1; i <= child_substrs#; i++) append child_params, makevarname(); ##process script for (i = 1; i <= script#; i++) { ##check that script[i] is a tuple if (!(type(script[i]) == "list" && script[i]# >= 2)) return ERROR; ##format the script action string formatted_str = aop_action_format(script[i][2], instr, token_matched, child_substrs, passed_var, instr_var, child_params); switch (script[i][1]) { case "now": aop_action_execute(formatted_str); break; case "later": ##store script action in a list to be processed later append script_later, formatted_str; break; } } return [child_params, script_later]; } /* function: aop_action_format * params: script_str = string to format, * i = agent input string, * t = token matched, * s = list of child substrs, * v = name of variable passed to agent, * j = name of variable containing input string * p = list of child parameters to be passed * returns: formatted string */ func aop_action_format { para script_str, i, t, s, v, j, p; auto formatted_str, x, y; formatted_str = ""; ##loop through characters for (x = 1; x <= script_str#; x++) { if (script_str[x] == '$' && x < script_str#) { x++; switch (script_str[x]) { case 'i': formatted_str = formatted_str // i; break; case 't': formatted_str = formatted_str // t; break; case 'v': formatted_str = formatted_str // v; break; case 'j': formatted_str = formatted_str // j; break; case 's': if (x < script_str# && isdigit(script_str[++x])) { y = int(script_str[x])-48; if (y > 0 && y <= s#) formatted_str = formatted_str // s[y]; else aop_error(AOP_WARNING, "script variable does not exist: $s" // script_str[x]); } else aop_error(AOP_WARNING, "expected digit after $s"); break; case 'p': if (x < script_str# && isdigit(script_str[++x])) { y = int(script_str[x])-48; if (y > 0 && y <= p#) formatted_str = formatted_str // p[y]; else aop_error(AOP_WARNING, "script variable does not exist: $p" // script_str[x]); } else aop_error(AOP_WARNING, "expected digit after $p"); break; case '$': formatted_str = formatted_str // script_str[x]; break; default: aop_error(AOP_WARNING, "script variable does not exist: $" // script_str[x]); } } else { formatted_str = formatted_str // script_str[x]; } } return formatted_str; } /* function: aop_action_execute * params: string to execute * returns: nothing * notes: redefine this function to do clever things like * delaying executing the string until later */ func aop_action_execute { para script_str; execute(script_str); }EDEN-1.66/lib-tkeden-1.66/aop/agent.e0000644000175000017500000002000710271160766016551 0ustar rboyattrboyatt/* agent.e [17/11/2002][Ant] */ FALSE = 0; TRUE = 1; aop_debug = FALSE; func aop_agent { para instr, rulename, param; auto ruledef, paracount, op_name, op_value, child_rules, ignore, script, fail_rule; auto i, result, token_matched, child_substrs, child_params, children, instr_var, old_script, later; /* load data for rule into local variable */ ruledef = getvar(rulename); /* check it is a valid ruledef template */ if (! isdefined(ruledef)) return "undefined"; if (type(ruledef) != "list" || ruledef# < 2) return "badagent"; /* get the operation name and value, i.e. pivot and "=" */ paracount = 1; op_name = ruledef[paracount++]; op_value = ruledef[paracount++]; /* get the agents to create on success */ switch (aop_has_children(op_name)) { case 0: if (ruledef# >= paracount && ruledef[paracount] == []) paracount++; child_rules = []; break; default: if (type(ruledef[paracount]) == "string") child_rules = [ruledef[paracount++]]; else if (type(ruledef[paracount]) == "list") child_rules = ruledef[paracount++]; else child_rules = []; if (child_rules == []) return "badagent"; break; } /* set default values */ ignore = []; script = []; old_script = FALSE; fail_rule = ""; /* get the optional arguments */ while (paracount <= ruledef#) { /* check this is a valid argument */ if (type(ruledef[paracount]) != "list" || ruledef[paracount]# < 2) { aop_error(AOP_WARNING, "rule has unreadable items: \""//rulename//"\""); paracount++; continue; } switch (ruledef[paracount][1]) { case "ignore": /* blocks to ignore */ ignore = ruledef[paracount][2]; break; case "fail": /* child to create on failure */ fail_rule = ruledef[paracount][2]; break; case "script": /* old style script to run */ old_script = TRUE; if (script != []) return "badagent"; for (i = 2; i <= ruledef[paracount]#; i++) script = script // [ruledef[paracount][i]]; break; case "action": /* script actions */ old_script = FALSE; if (script != []) return "badagent"; for (i = 2; i <= ruledef[paracount]#; i++) script = script // [ruledef[paracount][i]]; break; default: /* unrecognised argument */ return "badagent"; } paracount++; } /* strip whitespace from beginning and end of string */ instr = stripspace(instr); /* perform operation */ result = aop_operation(instr, op_name, op_value, ignore); /* badly formed operation */ if (result == "badop") return "badagent"; /* operation did not return a match */ if (result == FAIL) { if (fail_rule == "") /* if no fail template then parsing has failed */ return "fail"; else /* else pass string, and all variables to next ruledef */ return [[[instr, fail_rule, param]],[]]; } /* simplify result to token and child strings */ token_matched = result[1]; child_substrs = result[2]; /* execute script */ if (old_script) { /* using old style scripts - set globals */ v_string = instr; v_match = token_matched; if (op_name == "read_all") v_substrs = [token_matched]; else v_substrs = child_substrs; v_paras = param; result = aop_script_old(script, child_substrs#); } else { /* using new style scripts */ instr_var = makevarname(); execute(instr_var // "=\"" // escapequotes(instr) // "\";"); result = aop_action(script, instr, token_matched, child_substrs, param, instr_var); } child_params = result[1]; later = result[2]; /* useful debug information */ if (aop_debug == 1) { writeln("\n***"); writeln("OPERATION: ",op_name,", ",op_value,", ",instr,";"); writeln("RESULT: ",token_matched,", ",child_substrs,";"); writeln("SCRIPT: ", script, ";"); writeln("RESULT: ",child_params,";\n"); } /* create child list with inputs, rules and parameters */ children = []; for (i = 1; i <= child_substrs#; i++) { children = children // [ [ child_substrs[i], child_rules[((i-1)%child_rules#)+1], child_params[i] ] ]; } aop_agent_end(rulename, op_name, op_value, param, instr, instr_var, token_matched, child_substrs, child_rules, child_params, script); return [children, later]; } func aop_script_old { para script, children; auto i, j, k, instruction, return_params, all_vars, var_tmp, str_tmp, exec_args, later; later = []; return_params = []; while (return_params# < children) append return_params, []; for (i = 1; i <= script#; i++) { /* each script instruction */ instruction = script[i]; switch (instruction[1]) { case "declare": /* for each script variable, a local EDEN string variable is created to hold the name of a persistent, uniquely named EDEN variable */ for (j = 2; j <= instruction#; j++) execute (instruction[j] // " = \"" // makevarname() // "\";"); break; case "setparas": for (j = 2; j <= instruction#; j++) { /* add the EDEN variable names of the script variables indicated to the list of each childs parameters */ for (k = 1; k <= instruction[j]#; k++) return_params[j-1] = return_params[j-1] // [getvar(instruction[j][k])]; } break; case "allparas": if (children < 1) break; /* all_vars holds the name of the list of all variables */ all_vars = makevarname(); /* create a script variable with the given name to the list of all variables */ execute(instruction[2] // " = \"" // all_vars // "\";"); /* start to build up the list of variables */ var_tmp = makevarname(); str_tmp = all_vars // " is [" // var_tmp; return_params[1] = return_params[1] // [var_tmp]; /* for each child */ for (j = 2; j <= children; j++) { /* make a new EDEN variable and add it to the list of variables*/ var_tmp = makevarname(); str_tmp = str_tmp // ", " // var_tmp; /* add the new variable to the childs parameter list */ return_params[j] = return_params[j] // [var_tmp]; } /* create the list of variables */ str_tmp = str_tmp // "];"; execute(str_tmp); break; case "execute": /* extract the variable names */ exec_args = []; for (j = 3; j <= instruction#; j++) exec_args = exec_args // [instruction[j]]; /* format once to substitute for %%s */ str_tmp = format(instruction[2], exec_args); /* format again to substitute for $$s */ str_tmp = format(str_tmp[1], str_tmp[2]); /* execute command */ execute(str_tmp[1]); break; case "later": /* extract the variable names */ exec_args = []; for (j = 3; j <= instruction#; j++) exec_args = exec_args // [instruction[j]]; /* format once to substitute for "%%"s but do not substitute for "$$"s until later, when the variables will have been defined*/ str_tmp = format(instruction[2], exec_args); /* save command to be executed later */ later = later // [str_tmp]; break; default: } } return [return_params, later]; } func aop_has_children { para op_name; switch (op_name) { case "literal": case "read_all": case "literal_re": return 0; case "pivot": case "rev_pivot": return 2; default: return 1; } } proc aop_agent_end { para rulename, op_name, op_value, param, instr, instr_var, token_matched, child_substrs, child_rules, child_params, script; return; }EDEN-1.66/lib-tkeden-1.66/aop/aop_notation.eden0000644000175000017500000010007010271160766020633 0ustar rboyattrboyatt##============================================================================== ## A Notation for Creating Notations ## ## Version 2.0 Charlie Care - May 2005 ##============================================================================== ## Change log: ## ## Version 2.0 (May 2005): ## Incorporates querying support and some syntax changes. Notable differences ## from previous versions are: ## The definition of notations: ## notation %mynotation = split on ";"; ## and the definition of blocks: ## block bras = "(" to ")" contains [bras,string]; ## ## Version 1.1 (March 2005): ## First stable version ## ##============================================================================== ## TODO: ## ## - implement ?rules; ## - get ?obs; erroring properly if no rule or block with that name ## - work out a way to query the observables notations,blocks and rules ## - investigate whether comments work ok ## - investigate seg-faults from loading calc.eden ##============================================================================== ##------------------------------------------------------------------------------ ## Preamble ##------------------------------------------------------------------------------ ## Load the up-to-date AOP /*removed for tkeden-ant cd("aop_v204"); include("Run.e"); cd("..");*/ ## The following file patches aop_v204 to allow for \ characters in the input ## to the parser. /* folded patch into v211 include("aop_patch.eden");*/ ## Name of Notation: ## Changing this should change the name that users of tkeden see for this ## notation. It is used for the radio button text and also for error messages. AOP_notationName="%aop"; ##------------------------------------------------------------------------------ ## Blocks: ## ## These denote the chunks (or blocks) of input that parser rules can choose ## ignore. ##------------------------------------------------------------------------------ ## Standard Parentheses - this one is already added to the parser bras = [ ["(", ")"], ["bras","string"] ]; ## Curly braces cbras = [ ["{", "}"], ["bras"] ]; addblocks("cbras"); ## C-style comments comment = [ ["/*", "*/"], [] ]; addblocks("comment"); ## Strings string = [ ["\"", "\""], [] ]; addblocks("string"); ## Square brackets sqbras = [ ["[", "]"], [] ]; addblocks("sqbras"); ##------------------------------------------------------------------------------ ## Install this parser: ##------------------------------------------------------------------------------ installAOP(AOP_notationName,"AOPparse_init"); ##------------------------------------------------------------------------------ ## Top-Level Rules: ##------------------------------------------------------------------------------ ## Initial Rule (parse in blocks between ";") AOPparse_init = [";", "AOPparse_stm", ["cbras","comment","string"]]; ## Statements statements by ";" AOPparse_stm = ["suffix", ";", "AOPparse_notationDecl", [ "ignore", ["cbras","comment","string"] ], [ "fail", "AOPparse_ERROR1"] ]; ##------------------------------------------------------------------------------ ## Definitions to declare a parser and add a notation: ## ## New notation are defined with the notation keyord ## e.g. ## %aop ## notation %newNotation = split on "\n"; ## ## or: ## %aop ## notation %newNotation = split on "\n" ## : ignore [block1,block2]; ##------------------------------------------------------------------------------ AOPparse_notationDecl = ["prefix", "notation", "AOPparse_notationDecl2", [ "fail", "AOPparse_query"], ["action", ["later", "if ($p1[2]# == 2) {if ($p1# == 3) AOPparse_addNotation($p1[1],$p1[2][2],$p1[3],[]); else AOPparse_addNotation($p1[1],$p1[2][2],$p1[3],$p1[4]);};"]]]; AOPparse_notationDecl2 = ["pivot", "=", ["AOPparse_notationName","AOPparse_notationDecl3"], [ "fail", "AOPparse_ERROR1"], ["action",["now", "$v is [$p1] // $p2;"]]]; AOPparse_notationDecl3 = ["pivot", "split on", ["AOPparse_term_parserRule","AOPparse_notationDecl3a"], ["action",["now", "$v is $p1 // $p2;"]], [ "fail", "AOPparse_ERROR1"], [ "ignore", ["string","cbras"] ]]; AOPparse_notationDecl3a = ["pivot", ":", ["AOPparse_notationDecl4","AOPparse_notDeclIgnore"], ["action", ["now", "$v is $p1 // $p2;"]], [ "fail", "AOPparse_notationDecl4"], [ "ignore", ["string","cbras"] ]]; AOPparse_notationDecl4 = ["prefix", "\"", "AOPparse_term_string2", [ "fail", "AOPparse_ERROR1"], ["action",["now", "$v is [$p1];"]]]; AOPparse_notDeclIgnore = ["prefix", "ignore", "AOPparse_ignore2", ["fail","AOPparse_ERROR1"], ["action",["now", "$v is [$p1];"]] ]; ## This proc. does the procedural bit to add a notation to the tkeden tool ## it also creates an observable where the inital rule is stored. This ## is placed in the "AOP_notation_" namespace. proc AOPparse_addNotation { para notationName, initialRule, sepChar, blocks; execute("AOP_notation_" // notationName // "= [\"" // sepChar // "\",\"" // initialRule // "\","//str(blocks)//"];"); execute("installAOP(\"%" // notationName // "\",\"AOP_notation_" // notationName // "\");"); } ##------------------------------------------------------------------------------ ## Query: ## ## This provides query support in %aop. Any notation that has been constructed ## terms with the aop v2.04 onwards will be supported by the query even if the ## parser for the notation was construced in raw aop lists. ## ## A few special queries are provided as well as conventional observable queries ## - ?notations; -- gives the current aop notations installed ## - ?blocks; -- gives the current aop blocks ## - ?symbols; -- gives the current aop notations, blocks and rules ## - ?%aop; -- gives information about a specific notation (e.g. %aop) ## - ??%aop; -- gives information about a notation and all of its rules ## - ?name; -- gives information about a rule or block ##------------------------------------------------------------------------------ AOPparse_query = ["prefix", "?", "AOPparse_queryBlocks", [ "fail", "AOPparse_block"], ["action",["later", ""]]]; ## Query all blocks AOPparse_queryBlocks = ["literal", "blocks", ["fail", "AOPparse_queryNotations"], ["action",["now", "AOP_printBlocksQuery();"]]]; ## Query all notations AOPparse_queryNotations = ["literal", "notations", ["fail", "AOPparse_querysymbols"], ["action",["now", "AOP_printNotationsQuery();"]]]; ## Query all %aop symbols AOPparse_querysymbols = ["literal", "symbols", ["fail", "AOPparse_queryNotation"], ["action",["now", "AOP_printSymbols();"]]]; ## Query a specific notation AOPparse_queryNotation = ["prefix", "%", "AOPparse_queryNotation2", [ "fail", "AOPparse_queryNotationFull"], ["action",["later", "AOP_printNotationQuery(\"%\"//$p1);"]]]; ## Query a specific notation and get all of its rule definitions recursively AOPparse_queryNotationFull = ["prefix", "?%", "AOPparse_queryNotation2", [ "fail", "AOPparse_queryObservable"], ["action",["later", "AOP_printNotationRecursiveQuery(\"%\"//$p1);"]]]; AOPparse_queryNotation2 = ["read_all", [], ["action",["now", "$v is $j;"]]]; ## Query a specific entity (block rule etc...) AOPparse_queryObservable = ["read_all", [], ["action",["now", "AOP_observableQuery($j);"]]]; ## Output a query of all blocks proc AOP_printBlocksQuery { auto i; for (i=1;i<=scope_blocks#;i++) { writeln("block "//scope_blocks[i]// " = " //AOP_formatBlock(scope_blocks[i])); } } ## Format block definition from eden source func AOP_formatBlock { para name; auto list; list = `name`; if (list[2] == []) { return "\"" // list[1][1] // "\" to \"" // list[1][2] //"\";"; } else { return "\"" // list[1][1] // "\" to \"" // list[1][2] // "\" contains " // regreplace("\"","",str(list[2])) // ";"; } } ## Output a query of all notations proc AOP_printNotationsQuery { auto i; for (i=1;i<=AOP_installedNotations#;i++) { writeln("notation "//AOP_installedNotations[i][1]// " = " // AOP_formatNotationQuery(`AOP_installedNotations[i][2]`)); } } ## Output individual notation query proc AOP_printNotationQuery { para notation; writeln("notation "//notation// " = " // AOP_formatNotationQuery(`AOP_getNotationDefinitionObservable(notation)`)); } ## Output recursive notation query proc AOP_printNotationRecursiveQuery { para notation; auto rules,i,notationDefn; ## get observable name of the initial notation defnintion (an eden list) notationDefn = AOP_getNotationDefinitionObservable(notation); ## use the eden representation to produce a %aop meaningful representation writeln("notation " // notation // " = " // AOP_formatNotationQuery(`notationDefn`)); ## The list in notationDefn is the parser "init" rule. To recursively move ## through the parser we need the first grammar rule of the notation. This ## is the second element of this list. ## The following code is adapted from Ant Harfields "print_notation" proc. rules = AOP_traverse_agent(`notationDefn`[2], []); for (i=1; i<=rules#; i++) { writeln(AOP_formatParserRule(rules[i])); } } ## returns the observable containing the initial rule of a notation func AOP_getNotationDefinitionObservable { para notation; auto i; for (i=1;i<=AOP_installedNotations#;i++) { if (notation == AOP_installedNotations[i][1]) { return AOP_installedNotations[i][2]; } } } ## Format rhs of a %aop notation definition from the eden source func AOP_formatNotationQuery { para notationInfo; auto output; output = "<" // notationInfo[2] // "> split on \"" // notationInfo[1] // "\""; if (notationInfo[3] != []) { output = output // " : ignore " // regreplace("\"","",str(notationInfo[3])); } return output // ";"; } ## To query an observable it is necessary to proc AOP_observableQuery { para obs; auto type; ## is obs an AOP observable, if so what kind? type = AOP_getObservableType(obs); if (type == "none") { AOP_reportError(obs // " is not a " // AOP_notationName // " observable "); } else if (type == "block") { writeln("block " // obs // " = " // AOP_formatBlock(obs)); } else { writeln(AOP_formatParserRule(obs)); } } ## Use the %aop symbol table to work out the type of an observable func AOP_getObservableType { para obs; auto i; for (i=1;i<=AOP_vars#;i++) { if (AOP_vars[i][1] == obs) { return AOP_vars[i][2]; } } return @; ## Return @ if obs is not an AOP observable } ## This function interprets the eden form of a parser rule and provides ## a representation of the rule in a %aop interpretable form. func AOP_formatParserRule { para ruleName; auto i,j,str,rule,ignore,fail,action; ignore = ""; fail = ""; action = ""; rule = `ruleName`; if (rule[1] == "prefix") { if (AOP_noStringObservable(ruleName)) { str = "\"" // rule[2] // "\""; } else { str = "`" // AOP_getStringObservable(ruleName) // "`"; } if (type(rule[3])=="list") { str = str // " <" // rule[3][1] // ">"; } else { str = str // " <" // rule[3] // ">"; } } else if (rule[1] == "suffix") { if (type(rule[3])=="list") { str = "<" // rule[3][1] // "> "; } else { str = "<" // rule[3] // "> "; } if (AOP_noStringObservable(ruleName)) { str = str // "\"" // rule[2] // "\""; } else { str = str // "`" // AOP_getStringObservable(ruleName) // "`"; } } else if (rule[1] == "prefix_re") { if (type(rule[3])=="list") { str = "(" // rule[2] // ") <" // rule[3][1] // ">"; } else { str = "(" // rule[2] // ") <" // rule[3] // ">"; } } else if (rule[1] == "suffix_re") { if (type(rule[3])=="list") { str = "<" // rule[3][1] // "> (" // rule[2] // ")"; } else { str = "<" // rule[3] // "> (" // rule[2] // ")"; } } else if (rule[1] == "pivot") { if (AOP_noStringObservable(ruleName)) { str = "<" // rule[3][1] // "> \"" // rule[2] // "\" <" // rule[3][2] // ">"; } else { str = "<" // rule[3][1] // "> `" // AOP_getStringObservable(ruleName) // "` <" // rule[3][2] // ">"; } } else if (rule[1] == "literal") { str = "\"" // rule[2] // "\""; } else if (rule[1] == "literal_re") { str = "(" // rule[2] // ")"; } else if (rule[1] == "read_all") { str = "*"; } for (i=1;i<=rule#;i++) { if (rule[i]# == 2) { if (rule[i][1] == "fail") { fail = " | " // rule[i][2]; } else if (rule[i][1] == "action") { action = " : do {" // rule[i][2][2] // "} " // rule[i][2][1]; } else if (rule[i][1] == "ignore") { ignore = " : ignore ["; for (j=1;j = " // str // ignore // action // fail // ";"; } ## Is there an observable reference in the eden representation? ## This function refers to the symbol definition in eden and compares it to the ## value and checks for a discrepency. func AOP_noStringObservable { para name; auto formula,value; formula = symboltext(name); formula = substr(formula,2,formula#-1); formula = regreplace("\\\\\"","\"",formula); value = str(`name`); return formula=="" || formula==value; } ## If a rule contains a reference to an observable rather than a string ## return that observable name as a string. func AOP_getStringObservable { para name; auto formula,value,fmatch,vmatch; formula = symboltext(name); formula = substr(formula,2,formula#); value = str(`name`); fmatch = regmatch(",[@a-zA-Z0-9_-]+,",formula); vmatch = regmatch(",[\"@a-zA-Z0-9_-]+,",value); if (fmatch# > 0 && fmatch# == vmatch#) { formula = regreplace(",","",fmatch[1]); value = regreplace(",","",vmatch[1]); } return formula; } ##------------------------------------------------------------------------------ ## Symbol table ##------------------------------------------------------------------------------ ## Need a list containing every %aop observable. AOP_vars is AOP_vars_addMeta(scope_blocks,"block"); ## This gets updated by the AOP_unpackNotationsList proc AOP_installedNotations = []; ## Build the variable AOP_installedNotations whenever the aop_notations list is updated proc AOP_unpackNotationsList : aop_notations { auto i,output; output=[]; for (i=1;i<=notations#;i++) { if (notations[i][2] == &aopSwitch && aop_notations# >= i) { output = output // [[notations[i][1], aop_notations[i]]]; } } AOP_installedNotations = output; } ## Add meta data to a list of data func AOP_vars_addMeta { para list,metaStr; ## a list of varNames auto i,output; output=[]; for (i=1;i<=list#;i++) { output = output // [[list[i],metaStr]]; } return output; } ## Print out the current aop symbols. These are notations, blocks and known rules. ## currently rules are not printed. proc AOP_printSymbols { auto i; for (i=1;i<=AOP_installedNotations#;i++) { writeln(AOP_installedNotations[i][1] // "\t notation"); } for (i=1;i<=AOP_vars#;i++) { writeln(AOP_vars[i][1] // "\t " // AOP_vars[i][2]); } AOP_installedNotations = output; } ##------------------------------------------------------------------------------ ## Code to traverse parser rules from Ant Harfield: ## ## This code has been modified to sit within the AOP_ namespace and executes ## that were setting temporary values have been replaced with backticks and ## "auto" variables. ##------------------------------------------------------------------------------ func AOP_traverse_agent { para agent_name, traversed; auto i, subagents,vartmp; subagents = []; if (type(agent_name) == "string" && agent_name != "") vartmp = `agent_name`; if (vartmp == @) { return traversed; } else { if (vartmp# > 2) { ##normal agent if (AOP_hasChildren(vartmp[1])) { if (type(vartmp[3]) == "list") subagents = subagents // vartmp[3]; else append subagents, vartmp[3]; } ##look for fail clause for (i=3; i<=vartmp#; i++) if (type(vartmp[i]) == "list" && vartmp[i]# > 1 && vartmp[i][1] == "fail") append subagents, vartmp[i][2]; } } append traversed, agent_name; for (i=1; i<=subagents#; i++) { if (! AOP_isMemberOf(subagents[i], traversed)) { traversed = AOP_traverse_agent(subagents[i], traversed); } } return traversed; } func AOP_isMemberOf { para item, list; while (list != []) { if (item == list[1]) return 1; shift list; } return 0; } func AOP_hasChildren { para op_name; switch (op_name) { case "literal": case "read_all": case "literal_re": return 0; case "pivot": case "rev_pivot": return 2; default: return 1; } } ##------------------------------------------------------------------------------ ## Blocks: ## ## These rules allow %aop to be able to define blocks. While implementing this, ## some improvements have been made to the way blocks are added to make this ## task more 'definitive'. ## ## e.g. A redefinition of the current bras block ## %aop ## block bras = "(" to ")" contains [bras,string]; ##------------------------------------------------------------------------------ AOPparse_block = ["prefix", "block", "AOPparse_block2", [ "fail", "AOPparse_definition"], ["action",["later", "execute($p1[1]// \" is \" // AOP_transCode(str(tail($p1))) // \";AOP_addBlock(\\\"\"//$p1[1]//\"\\\");\");"]]]; AOPparse_block2 = ["pivot", "=", ["AOPparse_blockName","AOPparse_block2a"], [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is $p1//$p2;"]]]; AOPparse_block2a = ["pivot", "contains", ["AOPparse_block3","AOPparse_ignore2"], [ "ignore", ["string"]], [ "fail", "AOPparse_block3"], ["action", ["now", "$v is [$p1,$p2];"]]]; AOPparse_block3 = ["pivot", "to", ["AOPparse_blockStr","AOPparse_blockStr"], [ "ignore", ["string"]], [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is $p1//$p2;"]]]; AOPparse_blockStr = ["prefix", "\"", "AOPparse_term_string2", [ "fail", "AOPparse_blockVar"], ["action", ["now", "$v is [$p1];"]]]; AOPparse_blockVar = ["prefix", "`", "AOPparse_term_observable2", [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is [$p1];"]]]; AOPparse_blocks = ["read_all", [], ["action",["now", "$v is $j;"]]]; ## This proc. replaces Chris Brown's addblocks() proc. It is preferable to use ## this one so that redefinition of blocks doesn't create duplicate entries. proc AOP_addBlock { para name; if (! isInstalledBlock(name)) scope_blocks = scope_blocks // [name]; } ## Is a block already installed (i.e. is it in notations) func isInstalledBlock { para name; auto i; ## Check through scope_blocks for (i=1;i<=scope_blocks#;i++) { if (name == scope_blocks[i]) return TRUE; } return FALSE; } ##------------------------------------------------------------------------------ ## Definitions to define the parser rules. One of the motivations of moving ## towards %aop for parser definition is to improve readability of the ## parser definitions. Although this is significantly improved by the use of ## a proper notation rather than exposing the user to lists of lists of various ## parameters defined by strings; another aspect is the removal of the terms ## prefix, suffix, pivot etc. from the notation. For the idea that the parser ## rules could be defined from just the positions of terms in the definition ## and without having to declare the types of the different terms, I am ## indebted to Karl King's suggestions. ## ## Prefixes, suffixes and pivots are denoted by the position of the string ## the parser is matching. ## ## = "str" ; A prefix of "str" ## = "str" ; A suffix of "str" ## = "str" ; A pivot on "str" ## = "str"; Match the literal "str" ## = *; Match any string ## ## As well as this, references to eden observables or to regular expressions ## can be given in the rules. ## ## = ([a-zA-Z]+) ; A prefix of one or more alphabet characters ## = `myVar` ; Pivot on the current contents of myVar ## ## The rule to fail into is given by a | character ## ## = "hello" | ; Match "Hello" or match the rule ## ## %eden action is given in the following way between the two curly braces: ## ## = "hello" : do {writeln("hello");} now; ## ## Ignore blocks are given in a similar way: ## ## = "+" : ignore [block1,block2]; ##------------------------------------------------------------------------------ AOPparse_definition = ["pivot", "=", ["AOPparse_term_parserRule","AOPparse_definition2"], [ "fail", "AOPparse_ERROR1"], ["action", ["later", "execute(AOP_transCode( $p1[1][2] // \" is \" // str($p2) // \";\"));"]]]; AOPparse_definition2 = ["pivot", "|", ["AOPparse_rule","AOPparse_term_parserRule"], [ "fail", "AOPparse_rule"], [ "ignore", ["string","cbras"] ], ["action", ["later", "$v is $p1 // [[\"fail\",$p2[1][2]]];"]]]; AOPparse_rule = ["pivot", ":", ["AOPparse_terms","AOPparse_actionIgnore"], ["action", ["now", "$v is $p1 // $p2;"]], [ "fail", "AOPparse_terms"], [ "ignore", ["string","cbras"] ]]; func AOP_transCode { ## observables names are passed back as a string ## of the form [...,"%name%",...]. This converts ## ["%n%\"] -> [n] para str; str = regreplace("\"%","",str); str = regreplace("%\"","",str); ## return the translated eden code produced. return str; } ##------------------------------------------------------------------------------ ## Actions and ignored blocks ##------------------------------------------------------------------------------ AOPparse_actionIgnore = ["pivot", ":", ["AOPparse_ignore","AOPparse_ignore"], ["action", ["now", "$v is $p1 // $p2;"]], [ "fail", "AOPparse_ignore"], [ "ignore", ["string"] ]]; AOPparse_ignore = ["prefix", "ignore", "AOPparse_ignore2", ["fail","AOPparse_action"], ["action",["now", "$v is [[\"ignore\",$p1]];"]] ]; AOPparse_ignore2 = ["prefix", "[", "AOPparse_ignore3", ["fail","AOPparse_ERROR1"], ["action",["now", "$v is $p1;"]] ]; AOPparse_ignore3 = ["suffix", "]", "AOPparse_ignore4", ["fail","AOPparse_ERROR1"], ["action",["now", "$v is $p1;"]] ]; AOPparse_ignore4 = ["pivot", "," ,["AOPparse_blockName","AOPparse_ignore4"], [ "fail", "AOPparse_blockName"], [ "ignore", ["string"] ], ["action", ["now", "$v is $p1 // $p2;"]]]; AOPparse_action = ["prefix", "do" , "AOPparse_actionNow", [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is [[\"action\",$p1]];"]]]; AOPparse_actionNow = ["suffix", "now" , "AOPparse_actionBlock", [ "fail", "AOPparse_actionLater"], ["action", ["now", "$v is [\"now\",$p1];"]]]; AOPparse_actionLater = ["suffix", "later" , "AOPparse_actionBlock", [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is [\"later\",$p1];"]]]; AOPparse_actionBlock= ["prefix", "{" , "AOPparse_actionBlock2", [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is $p1;"]]]; AOPparse_actionBlock2 = ["suffix", "}" , "AOPparse_actionCode", [ "fail", "AOPparse_ERROR1"], ["action", ["later", "$v is $p1;"]]]; AOPparse_actionCode = [ "read_all", [], ["action", ["now", "$v=regreplace(\"\\\"\",\"\\\\\\\"\",$j);"]]]; AOPparse_null = ["literal", "",["fail","AOPparse_ERROR1"], ["action",["now", "$v=[];"]]]; ##------------------------------------------------------------------------------ ## Names ##------------------------------------------------------------------------------ AOPparse_varName = [ "literal_re", "[a-zA-Z]+[a-zA-Z0-9_]*", ["fail", "AOPparse_nameERROR"], ["action", ["now","$v = \"`\\\"$t\\\"`\";"]] ]; AOPparse_blockName = [ "literal_re", "[a-zA-Z]+[a-zA-Z0-9_]*", ["fail", "AOPparse_nameERROR"], ["action", ["now","$v=[\"$t\"];"]] ]; AOPparse_nameERROR = [ "read_all", [], ["action", ["now", "AOP_reportError(\"$t is not a valid \" // AOP_notationName // \" definition\");"]]]; AOPparse_notationName = ["prefix", "%" , "AOPparse_name", [ "fail", "AOPparse_ERROR1"], ["action", ["now", "$v is $p1;"]]]; AOPparse_name = [ "literal_re", "[a-zA-Z]+[a-zA-Z0-9_]*", ["fail", "AOPparse_nameERROR"], ["action", ["now","$v=\"$t\";"]] ]; ##------------------------------------------------------------------------------ ## Parser Rules: ## ## Allowed rules have either 1,2 or 3 terms ## ## Pivots have three terms. Terms 1 & 3 are terms ## and term 2 is an "X" `X` or [X] ## ## Prefix and Suffix have 2 rules: ## either Y (prefix) or Y (suffix) ## ## Literal has one term that is either an "X",`X` or [X] ## ## ReadAll has the term * ##------------------------------------------------------------------------------ AOPparse_terms = ["prefix","","AOPparse_terms1", ["action", ["later","$v = AOPparse_interpretTerms($p1);"]]]; AOPparse_terms1 = ["pivot"," ",["AOPparse_term_string","AOPparse_terms2"], ["fail","AOPparse_term_string"], ["action", ["now","$v is $p1 // $p2;"]]]; AOPparse_terms2 = ["pivot"," ",["AOPparse_term_string", "AOPparse_term_string"], ["fail","AOPparse_term_string"], ["action",["now","$v is $p1 // $p2;"]]]; ## ------------------------------------------------------------------- ## The parser generates a list structure and then uses this function to ## determine which kind of aop rule (pivot, prefix, prefix_re etc.) ## needs to be generated. ## ------------------------------------------------------------------- func AOPparse_interpretTerms { para terms; auto n; n = terms#; if (n == 3) { ## Terms must be a pivot if (terms[1][1] == "rule" && terms[3][1] == "rule" && (terms[2][1] == "string" || terms[2][1] == "observable")) { return(["pivot",terms[2][2], [terms[1][2],terms[3][2]]]); } else { AOP_reportError("Expecting:\n\t rule pattern rule\n Got:\n\t " // terms[1][1] //" "// terms[2][1] //" "// terms[3][1] //" "); } } else if (n == 2) { ## Terms must be a prefix or suffix if (terms[2][1] == "rule" && (terms[1][1] == "string" || terms[1][1] == "regexp" || terms[1][1] == "observable")) { if (terms[1][1] == "regexp") { return(["prefix_re",terms[1][2],terms[2][2]]); } else { return(["prefix",terms[1][2],terms[2][2]]); } } else if (terms[1][1] == "rule" && (terms[2][1] == "string" || terms[2][1] == "regexp" || terms[2][1] == "observable")) { if (terms[2][1] == "regexp") { return(["suffix_re",terms[2][2],terms[1][2]]); } else { return(["suffix",terms[2][2],terms[1][2]]); } } else { AOP_reportError("Expecting:\n\t rule pattern\n"// "Or:\n\t pattern rule\nGot:\n\t " // terms[1][1] //" "// terms[2][1] //" "); } } else if (n == 1) { ## Terms must be a literal or * if (terms[1][1] == "string" || terms[1][1] == "regexp" || terms[1][1] == "observable") { if (terms[1][1] == "regexp") { return(["literal_re",terms[1][2]]); } else { return(["literal",terms[1][2]]); } } else if (terms[1][1] == "readAll") { return(["read_all",[]]); } else { AOP_reportError("Expecting:\n\t pattern\n"// "Got:\n\t " // terms[1][1]); } } } ##------------------------------------------------------------------------------ ## Parser Terms: ## ## In %aop a lot of meaning is infered through the symbols used to define a ## parser rule. The following section matches the various terms used in a ## rule. ## ## is the parser rule X ## "X" is the string X ## `X` is the value of the eden observable X ## (X) is the regular expression X ## * is read all ## ##------------------------------------------------------------------------------ ## ------------------------------------------------------------------- ## An string is designated by a "X" notation ## ------------------------------------------------------------------- AOPparse_term_string = ["prefix","\"","AOPparse_term_string2", ["fail","AOPparse_term_observable"], ["action", ["later","$v is [[\"string\",$p1]];"]]]; AOPparse_term_string2 = ["suffix","\"","AOPparse_stringText", ["fail","AOPparse_term_stringErr"], ["action", ["now","$v is $p1;"]]]; AOPparse_term_stringErr = [ "read_all", [], ["action", ["now", "AOP_reportError(\"Expecting a \\\"\");"]]]; AOPparse_stringText = [ "read_all", [], ["action",["now", "$v=regreplace(\"\\\\\\\\\\\\\\\\\",\"\\\\\",$j);"]]]; ## ------------------------------------------------------------------- ## An eden obervable is designated by a `X` notation ## ------------------------------------------------------------------- AOPparse_term_observable = ["prefix","`","AOPparse_term_observable2", ["fail","AOPparse_term_regexp"], ["action", ["now","$v is [[\"observable\",$p1]];"]]]; AOPparse_term_observable2 = ["suffix","`","AOPparse_term_observableName", ["fail","AOPparse_term_observable2Err"], ["action", ["now","$v is $p1;"]]]; AOPparse_term_observableErr = [ "read_all", [], ["action", ["now", "AOP_reportError(\"Expecting a `\");"]]]; AOPparse_term_observableName = [ "literal_re", "[a-zA-Z]+[a-zA-Z0-9_]*", ["fail", "AOPparse_nameERROR"], ["action", ["now","$v is \"%$t%\";"]] ]; ## ------------------------------------------------------------------- ## An regexp is designated by a (X) notation ## ------------------------------------------------------------------- AOPparse_term_regexp = ["prefix","(","AOPparse_term_regexp2", ["fail","AOPparse_term_readAll"], ["action", ["now","$v is [[\"regexp\",$p1]];"]]]; AOPparse_term_regexp2 = ["suffix",")","AOPparse_stringText", ["fail","AOPparse_term_regexpErr"], ["action", ["now","$v is $p1;"]]]; AOPparse_term_regexpErr = [ "read_all", [], ["action", ["now", "AOP_reportError(\"Expecting a ]\");"]]]; AOPparse_term_error = [ "read_all", [], ["action", ["now", "AOP_reportError(\"Expecting a term\");"]]]; ## ------------------------------------------------------------------- ## An readall is designated by a * ## ------------------------------------------------------------------- AOPparse_term_readAll = ["literal","*", ["fail","AOPparse_term_parserRule"], ["action", ["now","$v is [[\"readAll\",\"*\"]];"]]]; ## ------------------------------------------------------------------- ## A Parser Rule is designated by a notation ## ------------------------------------------------------------------- AOPparse_term_parserRule = ["prefix","<","AOPparse_term_parserRule2", ["fail","AOPparse_term_error"], ["action", ["now","$v is [[\"rule\",$p1]];"]]]; AOPparse_term_parserRule2 = ["suffix",">","AOPparse_name", ["fail","AOPparse_term_parserRuleErr"], ["action", ["now","$v is $p1;"]]]; AOPparse_term_parserRuleErr = [ "read_all", [], ["action", ["now", "AOP_reportError(\"Expecting a >\");"]]]; ## ------------------------------------------------------------------- ## General Error for not matching a term ## ------------------------------------------------------------------- AOPparse_term_error = [ "read_all", [], ["action", ["now", "AOP_reportError(\"couldn't match a term\");"]]]; ##------------------------------------------------------------------------------ ## Error handling: ## ## There is a convention with current aop notations to use terminal output for ## error messages. This is usually because tkeden-1.51 and below puts a lot of ## clutter into error messages that makes writing error messages from other ## notations difficult. %aop writes an errors using this function, so the way ## it reports errors can be changed. Currently a message is written to the ## terminal and error() is called to alert the user to that output. ##------------------------------------------------------------------------------ ## General Error Case AOPparse_ERROR1 = [ "read_all", [], ["action", ["now", "AOP_reportError($j);"]]]; proc AOP_reportError { para str; ## Error to terminal writeln(AOP_notationName // " ERROR: ----------------------------------------------------------\n" //str); writeln("----------------------------------------------------------------------"); ## Alert tkeden of error and tell user to look at the terminal error(AOP_notationName// " error: See terminal output\n\n"); } EDEN-1.66/lib-tkeden-1.66/aop/parserbuf.e0000644000175000017500000000206210271160766017445 0ustar rboyattrboyattaop_notations = []; aop_buffers = []; proc installAOP { para name, info; auto ni; ni = newNotation(name, &aopSwitch, &aopParseChar); while (ni > aop_notations#) append aop_notations, ""; while (ni > aop_buffers#) append aop_buffers, ""; aop_notations[ni] = info; aop_buffers[ni] = ""; } proc aopParseChar { para c; auto l, splitchar, firstrule, ignore, i; if ((currentNotation < 1) || (currentNotation > aop_notations#)) error("aopParseChar called when a non-AOP notation is in effect"); l = `aop_notations[currentNotation]`; if (l# != 3) error("the AOP initialisation variable " // notations[currentNotation] // " must be a list with 3 items"); splitchar = l[1]; firstrule = l[2]; ignore = l[3]; aop_buffers[currentNotation] = aop_buffers[currentNotation] // c; i = extract(aop_buffers[currentNotation], splitchar, ignore, 1); if (i != 0) { if (!isspace (aop_buffers[currentNotation])) aop_parse(aop_buffers[currentNotation], firstrule, []); aop_buffers[currentNotation] = ""; } } proc aopSwitch { } EDEN-1.66/lib-tkeden-1.66/aop/error.e0000644000175000017500000000125410271160766016607 0ustar rboyattrboyatt/* error.e [15/11/2002][Ant] */ /* constants */ AOP_ERROR = 1; AOP_WARNING = 2; /* set this to false to suppress warning messages */ aop_show_warnings = TRUE; /* function: aop_error * params: err_type = 1 for error or 2 for warning, err_text is string of error message * returns: nothing * notes: maybe change this function to throw eden style errors - error() */ func aop_error { para err_type, err_text; switch (err_type) { case 2: ##AOP_WARNING if (aop_show_warnings) writeln("WARNING: AOP: ", err_text); break; case 1: ##AOP_ERROR default: writeln("ERROR: AOP: ", err_text); break; } }EDEN-1.66/lib-tkeden-1.66/aop/parse.e0000644000175000017500000000304710271160766016572 0ustar rboyattrboyatt/* parse.e [18/11/2002][Ant] */ proc aop_parse { para instr, start_agent; auto agent_queue, script_later, agent, result, i, tmp_str; /* make \ characters escaped - [Charlie v211] */ instr = regreplace("\\\\","\\\\\\\\",instr); /* initialise the commands that the agents may ask us to run later*/ script_later = []; /* initialise the list of agents to be run to the first */ agent_queue = [[instr, start_agent, makevarname()]]; /* get the next agent */ while ((agent = removehead(&agent_queue)) != []) { /* run it */ result = aop_agent(agent[1], agent[2], agent[3]); /* make sure it ran ok */ if (result == "badagent") { aop_error(AOP_ERROR, "agent is badly defined: \"" // agent[2] // "\""); return; } else if (result == "undefined") { aop_error(AOP_ERROR, "agent is undefined: \"" // agent[2] // "\""); return; } else if (result == "fail") { aop_error(AOP_ERROR, "parse failure"); return; } else { /* add the child agents to the beginning of the queue */ agent_queue = result[1] // agent_queue; /* append the script actions to be run after the child agents */ script_later = result[2] // script_later; } } /* execute the later list */ for (i = 1; i <= script_later#; i++) { if (type(script_later[i]) == "string") { ##new style script aop_action_execute(script_later[i]); } else { ##old style script tmp_str = format(script_later[i][1], script_later[i][2]); execute(tmp_str[1]); } } } EDEN-1.66/lib-tkeden-1.66/eddi.eden0000644000175000017500000010015410271160766016272 0ustar rboyattrboyatt%eden /* * Ant's recompilation of the eddi parser to use aop_v210 * */ ## ## notation.e (Eddi ant-style) ## eddi_notation = [ "\n", "eddi_statement", [] ]; eddi_statement = [ "suffix", ";", "eddi_comment", [ "action", [ "later", "garbage_collect();" ] ], [ "fail", "eddi_comment" ] ]; eddi_comment = [ "prefix", "##", [ "anything" ], [ "fail", "eddi_virtualagent1" ] ]; eddi_virtualagent1 = [ "prefix", ">>", [ "anything" ], [ "fail", "eddi_virtualagent2" ] ]; eddi_virtualagent2 = [ "prefix", "<>", [ "anything" ], [ "fail", "eddi_virtualagent3" ] ]; eddi_virtualagent3 = [ "prefix", "><", [ "anything" ], [ "fail", "eddi_virtualagent4" ] ]; eddi_virtualagent4 = [ "prefix", "<<", [ "anything" ], [ "fail", "eddi_virtualagent5" ] ]; eddi_virtualagent5 = [ "prefix", ">~", [ "anything" ], [ "fail", "eddi_statement_0" ] ]; eddi_statement_0 = [ "prefix", "??", [ "table_name" ], [ "action", [ "later", "describe($p1);" ] ], [ "fail", "eddi_statement_1" ] ]; eddi_statement_1 = [ "prefix", "?", "rel_exp", [ "action", [ "later", "showrel($p1);" ], [ "now", "curr_agent=1;" ] ], [ "fail", "eddi_statement_2" ] ]; rel_exp = [ "pivot", "+", [ "rel_exp", "rel_exp" ], [ "action", [ "now", "$v is union($p1, $p2);" ] ], [ "ignore", [ "bras" ] ], [ "fail", "rel_exp_1" ] ]; rel_exp_1 = [ "pivot", "-", [ "rel_exp", "rel_exp" ], [ "action", [ "now", "$v is diff($p1, $p2);" ] ], [ "ignore", [ "bras" ] ], [ "fail", "rel_exp_2" ] ]; rel_exp_2 = [ "pivot", ".", [ "rel_exp", "rel_exp" ], [ "action", [ "now", "$v is inter($p1, $p2);" ] ], [ "ignore", [ "bras" ] ], [ "fail", "rel_exp_3" ] ]; rel_exp_3 = [ "rev_pivot", "%", [ "rel_exp", "attr_list" ], [ "action", [ "now", "$v is project($p1, $p2);" ] ], [ "ignore", [ "bras" ] ], [ "fail", "rel_exp_4" ] ]; attr_list = [ "pivot", ",", ["col_naming", "attr_list"], [ "action", [ "now", "$v is [$p1] // $p2;" ] ], [ "fail", "attr_list_2" ] ]; attr_list_2 = [ "prefix", "", "col_naming", [ "action", [ "now", "$v is [$p1];" ] ] ]; col_naming = [ "pivot", ">>", [ "col_name", "col_name" ], [ "action", [ "now", "$v is [$p1, $p2];" ] ], [ "fail", "col_name" ] ]; col_name = [ "literal_re", "[a-zA-Z_][a-zA-Z0-9_]*", [ "action", [ "now", "$v = $j;" ] ], [ "fail", "error_col_name" ] ]; error_col_name = [ "read_all", [], [ "action", [ "now", "writeln(\"EDDI: unrecognised column name\");" ] ] ]; rel_exp_4 = [ "rev_pivot", ":", [ "rel_exp", "predicate" ], [ "action", [ "now", "$v is select_wrapper($p1, $p2);" ] ], [ "ignore", [ "bras" ] ], [ "fail", "rel_exp_5" ] ]; predicate = [ "read_all", [], [ "action", [ "now", "$v = $j;" ] ] ]; rel_exp_5 = [ "pivot", "*", [ "rel_exp", "rel_exp" ], [ "action", [ "now", "$v is njoin($p1, $p2);" ] ], [ "ignore", [ "bras" ] ], [ "fail", "rel_exp_6" ] ]; rel_exp_6 = [ "prefix", "(", "rel_exp_7", [ "fail", "table_val" ], [ "action", [ "now", "$v is $p1;" ] ] ]; rel_exp_7 = [ "suffix", ")", "rel_exp", [ "action", [ "now", "$v is $p1;" ] ] ]; table_val = [ "literal_re", "[a-zA-Z_][a-zA-Z0-9_]*", [ "action", [ "now", "if (search_CAT($j)!=0) $v is $i; else writeln(\"Invalid table reference\");" ] ], [ "fail", "error_tblval" ] ]; error_tblval = [ "read_all", [], [ "action", [ "now", "writeln(\"Unrecognised table value\");" ] ] ]; eddi_statement_2 = [ "prefix", "~~", "table_name", [ "action", [ "later", "if (($p1[1]!='_') && (search_CAT($p1)>2) && (dependants($p1)[ 1]==[])) { delrelvar($p1); delete _CATALOGUE, search_CAT($p1);} else {if (search_CAT($p1)==2) writeln (\"Can't delete the catalogue\"); else {if ((search_CAT($p1)>2) && (dependants($p1)[1]!=[])) writeln(\"Cannot delete table / view with dependants\"); else writeln(\"Table / view name is not in the catalogue\");}}" ], [ "now", "curr_agent=2;" ] ], [ "fail", "eddi_statement_2a" ] ]; table_name = [ "literal_re", "[a-zA-Z_][a-zA-Z0-9_]*", [ "action", [ "now", "$v = $j;" ] ], [ "fail", "error_tblname" ] ]; error_tblname = [ "read_all", [], [ "action", [ "now", "writeln(\"Unrecognised table name\");" ] ] ]; eddi_statement_2a = [ "prefix", "~", "table_name", [ "action", [ "later", "if (($p1[1]!='_') && (search_CAT($p1)!=0)) {if (CATALOGUE[search_CAT($p1)][2]==\"table\") $s1 = [ $s1[1] ]; else writeln(\"Can't truncate a view\");} else writeln(\"Table / view name is not in the catalogue\");" ], [ "now", "curr_agent = 2;" ] ], [ "fail", "eddi_statement_3" ] ]; eddi_statement_3 = [ "pivot", "<<", [ "table_name", "tuples" ], [ "action", [ "now", "curr_agent=3;" ], [ "later", "if(istablevar($p1)) $s1 = addvals($s1, $s2); else writeln(\"Can't add tuples to a view / non-existent table\");" ] ], [ "fail", "eddi_statement_4" ] ]; tuples = [ "split", ",", "tuple", [ "ignore", [ "sq_bras" ] ] ]; tuple = [ "prefix", "[", "tuple_1" ]; tuple_1 = [ "suffix", "]", "tuple_2" ]; tuple_2 = [ "split", ",", "tuple_3", [ "ignore", [ "quotes" ] ] ]; tuple_3 = [ "prefix", "\"", "tuple_5", [ "fail", "float_num" ] ]; tuple_5 = [ "suffix", "\"", "stringval" ]; stringval = [ "read_all", [] ]; eddi_statement_4 = [ "pivot", "!!", [ "table_name", "tuples" ], [ "action", [ "now", "curr_agent=4;" ], [ "later", "if(istablevar($p1)) $s1 = delvals($s1, $s2); else writeln(\"Can't delete tuples from a view / non-existent table\");" ] ], [ "fail", "eddi_statement_5" ] ]; eddi_statement_5 = [ "pivot", "is", [ "table_name", "rel_exp" ], [ "action", [ "now", "curr_agent=5;" ], [ "later", "if (search_CAT($p1)==0) { if ($p2!=@) { $s1 is $p2; _CATALOGUE = addvals(_CATALOGUE, [$p1, \"view\", $j, &$s1]); } else writeln(\"Invalid definition\"); } else writeln(\"Table name already in use\");" ] ], [ "fail", "eddi_statement_6" ] ]; eddi_statement_6 = [ "pivot", "=", [ "table_name", "rel_exp" ], [ "action", [ "later", "if (search_CAT($p1)==0) { if ($p2!=@) { $s1 = $p2; _CATALOGUE = addvals(_CATALOGUE, [$p1, \"table\", \"\", &$s1]); } else writeln(\"Invalid assignment\"); } else writeln(\"Table name already in use\");" ], [ "now", "curr_agent=6;" ] ], [ "fail", "eddi_statement_7" ] ]; eddi_statement_7 = [ "pivot", "(", [ "table_name", "create_state" ], [ "action", [ "later", "if (search_CAT($p1)==0) { execute(\"$s1=create(\"//$p2//\");\"); _CATALOGUE = addvals (_CATALOGUE, [$p1, \"table\", \"\", &$s1]); } else writeln(\"Table name already in use\");" ], [ "now", "curr_agent=7;" ] ], [ "fail", "eddi_statement_8" ] ]; create_state = [ "suffix", ")", "create_state_1", [ "action", [ "now", "$v is convertcols($p1);" ] ], [ "fail", "error_create_state" ] ]; create_state_1 = [ "pivot", ",", ["col_info", "create_state_1"], [ "action", [ "now", "$v is [$p1] // $p2;" ] ], [ "fail", "create_state_2" ] ]; create_state_2 = [ "prefix", "", "col_info", [ "action", [ "now", "$v is [$p1];" ] ] ]; col_info = [ "pivot", " ", [ "col_name", "col_info_2" ], [ "action", [ "now", "$v is [$p1, $p2];" ] ], [ "fail", "error_col_info" ] ]; col_info_2 = [ "suffix", "key", "anything", [ "action", [ "now", "$v = \"#\";" ] ], [ "fail", "col_info_3" ] ]; col_info_3 = [ "read_all", [], [ "action", [ "now", "$v = $j;" ] ] ]; error_col_info = [ "read_all", [], [ "action", [ "now", "writeln(\"EDDI: unrecognised column for projection\");" ] ] ]; error_create_state = [ "read_all", [], [ "action", [ "now", "writeln(\"EDDI: unrecognised tuple list in table create\");" ] ] ]; eddi_statement_8 = [ "literal", "#", [ "action", [ "now", "curr_agent = 8; showrel(CATALOGUE);" ] ], [ "fail", "error_unrecog" ] ]; quotes=[["\"", "\""], ["quotes"]]; addblocks("quotes"); installAOP("%eddi","eddi_notation"); ## ## Original eddi script (with over-written definitions removed) ## operators is [[':',"select_wrapper"],['%',"project"],['.',"inter"],['*',EDDI_join],['+',"union"],['-',"diff"]]; func lookupop { para op; auto i; for (i = 1; i <= operators#; i++) if (char (op) == operators [i][1]) return operators [i][2]; return "unknown"; } eddi_tables = []; proc droptable { para tbl; auto i, new_tables; new_tables = []; for (i = 1; i <= eddi_tables#; i++) if (eddi_tables [i] != tbl) new_tables = new_tables // [eddi_tables [i]]; eddi_tables = new_tables; forget (tbl); } proc addtotablelist { para tbl; eddi_tables = eddi_tables // [tbl]; } proc listtables { auto i; writeln ("----------------"); for (i = 1; i <= eddi_tables#; i++) writeln (eddi_tables [i]); writeln ("----------------"); } func convertcols { para inlist; auto outstr, i; if (inlist# < 1) return ""; outstr = "\"" // inlist [1][1] // "\", \"" // inlist [1][2] // "\""; for (i = 2; i <= inlist#; i++) outstr = outstr // ", \"" // inlist [i][1] // "\", \"" // inlist [i][2] // "\""; return outstr; } proc garbage_collect { auto i, j, dCAT; for (i=2; i<=CATALOGUE#; i++) { dCAT = dependants(CATALOGUE[i][1]); /* writeln("i = ", i); writeln(dCAT); writeln((dCAT[2])#); */ for (j=1; j<=dCAT[2]#; j++) { /* writeln(dependants(dCAT[2][j])); */ if ((dependants(dCAT[2][j])[1])==[]) { /* writeln(dCAT[2][j]); */ /* this line changed on WMB's request 14 January 2004 [Ash] */ if (substr(dCAT[2][j], 1, 4) == "var_") self_asgn(dCAT[2][j]); } } } } ## ## Original file neweddipf.e (length 10034, dated Oct 23 2001) follows... ## %eden /* File: eddipf.e Program: EDEN functions for EDDI/P Date: 6/2/96 Author: Son V Truong */ /* Generally messed around with since by Ashley and Meurig */ /* Added some checking to the input of functions - Michael */ /* */ /* Make a version of a table with no repeated rows */ func Makedistinct { para l; auto result, elt, ix; result = []; while (l#!=0) { elt = l[1]; shift l; ix = 1; while ((ix<=result#)&&(elt!=result[ix])) ix++; if (result#i) && (strx[j]=='0')) j--; }; result = ""; for (i=1; i<=j; i++) result = result // strx[i]; return result; }; func normalise_len { para s, n; auto i, result; i = 0; result = ""; while (i display list for $1 above $2 */ auto s,i; s = $1; for (i=1; i<=$2#; i++) { append s, $2[i]; } return s; } func displayrt { /* two display lists $1 and $2 -> display list for $1 to right of $2 */ auto s,i; s = []; for (i=1; i<=$1#; i++) { append s, ($1[i] // $2[i]); } return s; } /* some instances of showrel() in action that can be used to test above in connection with the fruits.eddi database */ proc showrel { para rel; if (rel==@) { writeln("EDEN: ERROR: showrel has been given an "// "undefined table."); return [[[]]]; } autocalc = 0; curr_rel = rel; display_list(mkdisplist_rel()); if (rel# == 2) writeln("(1 row)"); else writeln("(" // str(rel#-1) // " rows)"); curr_rel = _DUMMY; autocalc = 1; }; ## ## Original file newselect2.e (length 2709, dated Oct 27 2001) follows... ## autocalc=0; func select /* t2 = select(t1,c,c_op,c_val) */ { auto i,j,k,addcol,compval, constval, constelt; tlist1 = []; /* why isn't tlist auto? */ if ($1==@) { writeln("EDEN: ERROR: select has been given an "// "undefined table."); return @; } else if (!isinlist($2, tail($1[1]))) { writeln("EDEN: ERROR: select has been given an "// "invalid attribute."); return @; } append tlist1, $1[1]; keys = getcolval($1,getcolumn($1,$2)); /* writeln(type($4), " ", $4); indicates types of selection */ constelt =((type($4) == "string") && ($4[1]== '\"')) ? cutquotes($4) : $4; constval = []; for (i=1; i<=$1#-1; i++) constval = constval // [constelt]; compval = constval; /* constval is the list of constant values of type number or string that is appropriate when $4 is a literal value */ if ((type($4) == "string") && ($4[1]!= '\"')) { if (!isinlist($4, tail($1[1]))) { writeln("EDEN: ERROR: select has been given an "// "invalid attribute."); return @; } else compval = getcolval($1,getcolumn($1,$4)); } /* compval is the list of values resulting from column selection where $4 is the name of an attribute in the relation $1 */ switch($3) { case "==" : { for (i=1; i<=keys#; i++) { if (keys[i] == compval[i]) append tlist1,$1[i+1]; } break; } case "!=" : { for (i=1; i<=keys#; i++) { if (keys[i] != compval[i]) append tlist1,$1[i+1]; } break; } case "<" : { for (i=1; i<=keys#; i++) { if (keys[i] < compval[i]) append tlist1,$1[i+1]; } break; } case "<=" : { for (i=1; i<=keys#; i++) { if (keys[i] <= compval[i]) append tlist1,$1[i+1]; } break; } case ">" : { for (i=1; i<=keys#; i++) { if (keys[i] > compval[i]) append tlist1,$1[i+1]; } break; } case ">=" : { for (i=1; i<=keys#; i++) { if (keys[i] >= compval[i]) append tlist1,$1[i+1]; } break; } default : writeln("EDDI/P Error: not a comparison."); return(@); } return makedistinct(tlist1); } func select_wrapper { para tbl, pred; auto var, op, val, i, j; i = 1; while (i <= pred# && (isalphanum (pred[i]) || pred[i] == ' ')) i++; var = stripspace(substr (pred, 1, i - 1)); j = i; while (i <= pred# && pred[i] != ' ' && !isalphanum (pred [i]) && pred[i] != '\"') i++; /* originally the terminating condition pred[i] == '\"' was omitted */ op = stripspace (substr (pred, j, i - 1)); val = converttonum (stripspace (substr (pred, i, pred#))); return select (tbl, var, op, val); } autocalc=1; func converttonum { para instr; auto i, radix, sum; i = instr#; radix = 1; sum = 0; while ((i >= 1) && (isdigit (instr [i]))) { sum += ((instr [i] - '0') * radix); radix = radix * 10; i--; } if (i==0) return sum; if (!isdigit(instr [i]) && (instr[i]!='.')) return instr; if (instr[i]=='.') sum2 = float(sum) / float(radix); radix = 1; i--; /* writeln(sum2); */ sum= 0; while (i >= 1) { if (!isdigit(instr[i])) return instr; if (isdigit (instr [i])) { sum += ((instr [i] - '0') * radix); radix = radix * 10; i--; } } /* writeln(" ", i); */ return sum+sum2; } autocalc=1; ## ## Catalogue ## eddi_tables=["_CATALOGUE"]; _CATALOGUE=[[["string","string","string","pointer"],"relname","reltype","defn","ptr"],["CATALOGUE","view","CATALOGUE is _CATALOGUE % relname, reltype",&CATALOGUE]]; func search_CAT { para tablename; auto cat, i, result; cat = _CATALOGUE; i= 1; result = 0; shift cat; while (cat!=[]) { i++; if (cat[1][1] == tablename) result = i; shift cat; } return result; } proc delrelvar { para tablename; /* name of table - as string - presumed to be in the catalogue */ *(_CATALOGUE[search_CAT(tablename)][4]) = @; } CATALOGUE is project(_CATALOGUE, ["relname","reltype"]); func size { para tblname; return *(_CATALOGUE[search_CAT(tblname)][4])# -1; } func typerel { para tblname; return tail((*(_CATALOGUE[search_CAT(tblname)][4]))[1]); } func typedom { para tblname; return (*(_CATALOGUE[search_CAT(tblname)][4]))[1][1]; } func relvartype { para tblname; return _CATALOGUE[search_CAT(tblname)][2]; } func viewdefn { para tblname; return _CATALOGUE[search_CAT(tblname)][3]; } func searchCAT { para tablename; auto cat, i, result; cat = CATALOGUE; i= 1; result = 0; shift cat; while (cat!=[]) { i++; if (cat[1][1] == tablename) result = i; shift cat; } return result; } proc describe { para tblname; if (searchCAT(tblname)!= 0) { writeln(); writeln(tblname // " is a " // relvartype(tblname)); if (relvartype(tblname)=="view") writeln("\tdefn: " // viewdefn(tblname)); write("\ttype: "); writeln(typedom(tblname)); write("\t\attr: "); writeln(typerel(tblname)); write("\tsize: "); writeln(size(tblname)); write("The list of views dependent on ", tblname, " is : "); writeln(dependants(tblname)[1]); writeln(); } else writeln ("There is no table or view ", tblname); } func isinlist { para elt, lst; auto result; result = 0; while(lst!=[]) { if (elt==lst[1]) result = 1; shift lst; } return result; } func inclist { para l1, l2; auto result; result = 1; while (l2!=[]) { if (!isinlist(l2[1], l1)) result = 0; shift l2; } return result; } func extractattrs { para attrlist; auto result; result = []; while (attrlist != []) { result = result // [(type(attrlist[1])=="list")?attrlist[1][1]:attrlist[1]]; shift attrlist; } return result; } func project { auto i,j,k,attr; /* project takes as its 2nd argument a single attribute name or an (attribute name, rename) pair */ /* writeln("Project called with pars ", $1, " ", $2); */ if ($#<1) { writeln("EDEN: ERROR: table not provided for project."); return @; } else { if ($1==@) { writeln("EDEN: ERROR: project has received an "// "undefined table."); return @; } else if (!inclist(tail($1[1]), extractattrs($2))) { writeln("EDEN: ERROR: invalid attribute "// "in projection."); return @; } } tlist = [[[]]]; /* For renaming attrs: c_list can contain [col_name,new_name] - ME*/ for (i=1; i<=$2#; i++) if (type($2[i]) == "list") { append tlist[1],$2[i][2]; $2[i] = $2[i][1]; } else append tlist[1],$2[i]; for (i=2; i<=$1#; i++) append tlist,[]; for (i=1; i<=$2#; i++) { addcol = getcolumn($1,$2[i]); append tlist[1][1], $1[1][1][addcol]; for (j=2; j<=$1#; j++) append tlist[j], $1[j][addcol]; } return makedistinct(tlist); } ## ## Original file deps.e (length 3753, dated Nov 20 2001) follows... ## func dependants { para tblname; auto result, symbolinfo, currvar, ddcurrvar; result = [[], []]; symbolinfo = symboldetail(tblname)[4]; /* writeln(symboldetail(tblname)[4]); */ if (symbolinfo!=[]) while (symbolinfo!=[]) { currvar = symbolinfo[1]; if (search_CAT(currvar)!=0) result[1] = result[1] // [currvar]; else result[2] = result[2] // [currvar]; ddcurrvar = dependants(currvar); result[1] = result[1] // ddcurrvar[1]; result[2] = result[2] // ddcurrvar[2]; shift symbolinfo; } result[1] = Makedistinct(result[1]); result[2] = Makedistinct(result[2]); return result; } func dependees { para tblname; auto result, symbolinfo, currvar, ddcurrvar; result = [[], []]; symbolinfo = symboldetail(tblname)[5]; /* writeln(symboldetail(tblname)[4]); */ if (symbolinfo!=[]) while (symbolinfo!=[]) { currvar = symbolinfo[1]; if (search_CAT(currvar)!=0) result[1] = result[1] // [currvar]; else result[2] = result[2] // [currvar]; ddcurrvar = dependees(currvar); result[1] = result[1] // ddcurrvar[1]; result[2] = result[2] // ddcurrvar[2]; shift symbolinfo; } result[1] = Makedistinct(result[1]); result[2] = Makedistinct(result[2]); return result; } proc self_asgn { para varname; execute (varname // "=" // varname //";"); } func istablevar { para tblname; return ((search_CAT(tblname)!=0) && (CATALOGUE[search_CAT(tblname)][2]=="table")); } /* typeseq returns the list of types of tuple elts in a list */ func typeseq { para tple; auto result; result = []; while (tple!=[]) { result = result // [type(tple[1])]; shift tple; } return result; } func ucompatdom /* bool = ucompat(t1,t2): union compatible on domain */ { return ($1[1][1] == $2[1][1]); } func ucompatrel /* bool = ucompat(t1,t2): union compatible on attrname */ { return (tail($1[1]) == tail($2[1])); } /* propose to define ucompat(x,y) as ucompatdom(x,y) && ucompatdom(x,y); */ func ucompat { para x,y; return ucompatdom(x,y) && ucompatrel(x,y); } ## ## this is the SQL style unnatural join that replaces natural join ## func unnjoin { auto i,j,k,x,y,z; if ($#<2) { writeln("EDEN: ERROR: two tables not provided for njoin."); return @; } else if (($1==@) || ($2==@)) { writeln("EDEN: ERROR: njoin has received at least one "// "undefined table."); return @; } tlist1 = []; vals1 = []; vals2 = []; nvals1 = []; nvals2 = []; append tlist1, $1[1]; matcols = matchcols($1,$2); for (i=1; i<=matcols[1]#; i++) { $1[1][matcols[1][i]] = $1[1][matcols[1][i]] // "_1"; $2[1][matcols[2][i]] = $2[1][matcols[2][i]] // "_2"; } /* writeln($1[1]); */ attr = $1[1]; attr[1] = attr[1] // $2[1][1]; /* writeln($2[1]); */ for (i=2; i<=$2[1]#; i++) append attr, $2[1][i]; tlist = [attr]; /* writeln(tlist); */ for (x=2;x<=$1#;x++) for (y=2; y<=$2#; y++) { append tlist, ($1[x] // $2[y]); } return tlist; } ## ## the uneddifying interface ## func ucompatdomrel { para x,y; return ucompatdom(x,y) && ucompatrel(x,y); } distinctvals = [1,0]; ucompatval = [ucompatdomrel, ucompatdom, ucompatrel]; joinval = ["njoin", "unnjoin"]; /* these descriptive identifiers aren't used except to initialise variables temporarily, but indicate the semantics of the various options for ucompatix etc */ CHECKDOMREL = 1; CHECKDOM = 2; CHECKREL = 3; NODUPROWS = 1; DUPROWS = 2; NATJOIN = 1; UNNATJOIN = 2; ucompatix = CHECKDOMREL; distinctix = NODUPROWS; joinix = NATJOIN; ucompat is ucompatval[ucompatix]; EDDI_distinct is distinctvals[distinctix]; EDDI_join is joinval[joinix]; proc changejoin: joinix { touch(&op_exp); } EDEN-1.66/lib-tkeden-1.66/donald.txt0000644000175000017500000001007210325420260016515 0ustar rboyattrboyatt------ DoNaLD (Definitive Notation for Line Drawing) QUICK REFERENCE ------ Warning: this documentation isn't quite finished yet... CONTENTS OF THIS QUICK REFERENCE: 1. Syntax 2. Data types 3. Functions 4. References 5. Pre-defined variables 6. Attributes 7. Viewports 8. More information -- 1. SYNTAX ----------------------------------------------------------------- No semi-colons: line feeds are terminators Line continuation: use \ at the end of a line to continue to the next # UNIX shell style one-line comments Variables must be declared before use (except when using the ! operator) Redeclaration of type is not possible Name space: append ! to an identifier to reference an Eden variable: eg eq!(a, b) Escaping to Eden: ? is a one-line escape to Eden (remember to terminate with a semi-colon) -- 2. DATA TYPES ------------------------------------------------------------- int: 34 real: 10.0 char: "abc" boolean: true, false point: {50, 100} point: {modulo @ angle} ie distance and angle (radians) from the origin line: [{10, 10}, {80, 90}] arc: [point1, point2, angle] -- 'angle' (degrees) portion of a circle, end points are point1, point2: note NOT arc(p, p, a) circle: circle(centre, radius), circle({500, 500}, 400) ellipse: ellipse(centre, major, minor) rectangle: rectangle(point1, point2) label: label(string, point) image: I!ImageFile("gif", "hill.gif") openshape: openshape cross within cross { line l1, l2 l2 = [{300, 300}, {100, 100}] l1 = [{300, 100}, {100, 300}] } shape: shape S S = trans(cross, 100, 200) graph: (see other documentation) -- 3. FUNCTIONS -------------------------------------------------------------- Arithmetic: + - * div mod sqrt log exp trunc float rand Trigonometric: sin cos tan asin acos atan Relational: && || ! < <= == > >= Geometric: point midpoint(line) point intersect(line, line) line perpend(point, line) real dist(point, point) bool intersects(line, line) bool separates(line, point, point) bool includes(circle, point) bool incident(line, point) bool incident(circle, point) bool pt_betwn_pts(point, point, point) bool colinear(point, point, point) bool distlarger(point, point, value) bool distlarger(line, point, value) bool distsmaller(point, point, value) bool distsmaller(line, point, value) Shape transformations (note "entity" can be any Donald type): trans(entity, x, y) scale(entity, factor) scalexy(entity, xfactor, yfactor) rot(entity, point, angle) reflect(entity, line) String functions: // (string concatenation) itos(int) rtos(real, fprintf-format-string) Image functions: I!functionName denotes a function returning an image -- 4. REFERENCES ------------------------------------------------------------- x: variable x in the immediate context ~/x: variable x in the context one level up /x: variable x in the root (topmost) context x!: the Eden variable x .1, .2: first and second points of a line or first and second coordinates of a point .x, .y: projection of a point onto the x- and y- axes -- 5. PRE-DEFINED VARIABLES -------------------------------------------------- pi: ratio of circle circumference to diameter (note upper case PI in Eden) -- 6. ATTRIBUTES ------------------------------------------------------------- To give an attribute to the DoNaLD variable Obj/line1, use the Eden escape: ?A_Obj_line1 = "attribute1=value1,attribute2=value2..."; color outlinecolor linewidth linestyle: dotted, dashed or solid arrow: first, last, both or none locus: true, false fill: solid or hollow font: a string: "{family size style}"... family = times, courier or helvetica, size = in points (1/72th inch) style = normal, bold, roman, italic, underline, overstrike (multiple styles are possible: "{times 12 {bold italic}}") -- 7. VIEWPORTS -------------------------------------------------------------- viewport VIEW1 The default viewport is DoNaLD. -- 8. MORE INFORMATION ------------------------------------------------------- See http://go.warwick.ac.uk/EDEN/ for more detail. EDEN-1.66/lib-tkeden-1.66/arca.eden0000644000175000017500000005675410251557473016316 0ustar rboyattrboyatt/*** * - EDEN library routines - * * - edenlib.e - * ****/ /* $Id: arca.lib,v 1.2 2001/08/01 17:58:02 cssbz Exp $ */ /* used the operator `varname` which turns a string into a variable */ setbuf(stdout, 0); NullStr =""; ON = 1; OFF = 0; CART ='C'; LINE ='L'; LABEL ='T'; ABST ='A'; EXPL ='E'; INT ='I'; VERT ='V'; COL ='C'; DIAG ='D'; DEBUG ='N'; ARROW_BEGIN = 0.51; ARROW_END = 0.6; ARROW_FACTOR = 0.05; _ARROW = ON; _LABEL = ON; _line_colour=["red","blue","green","brown","thistle","yellow","lightblue"]; proc debugmsg { if (DEBUG=='Y') writeln($1); } proc _writeln { auto count; for (count = 1; count <= $#; count++) writeln($[count]); } func if_assign { return $1 ? $2 : $3; } proc check_mode { if ($1 == 0) writeln("ERROR LHS IS ABSTRACT OR UNDEFINED"); } func one_int { return [INT,EXPL,0,$1]; } UNDEF = one_int(@); UNDEF_VERT = [VERT, EXPL, 2, [[UNDEF], [UNDEF]]]; UNDEF_COL = [COL, EXPL, @, [[UNDEF]]]; func op_and { return $1 && $2; } func op_or { return $1 || $2; } func check_int{ auto modval, val,value, int; int = ($# == 2) ? $1 : $1[4][$3]; val = int[4]; if (val==@) return [$2[1],$2[2],$2[3],value]; modval = $2[3]; value = (modval==0 || modval==1 ) ? val : val % modval; if (value == 0) value = modval; if (modval==@) return[INT,ABST,int[3],value]; if ($2!=@) if (int[3]!=$2[3] && int[3]) { writeln("ERROR INTS OF INCOMPATIBLE MODULUS"); exit(0); } else return ($2[2]==EXPL) ? [$2[1],$2[2],$2[3],value] : [$2[1],$2[2],int[3],value]; else return[INT,@,@,int[4]]; } func int_mult { /* if ($1==2 || $2==@) return [INT,@,@,@]; */ if ($1[3]!=$2[3] && $1[3] && $2[3]) writeln("ERROR INTEGERS OF INCOMPATIBLE DIM"); else return [$1[1],$1[2],$1[3],$1[4] * $2[4]]; } func int_div { /* if ($1==2 || $2==@) return [INT,@,@,@]; */ if ($1[3]!=$2[3] && $1[3] && $2[3]) writeln("ERROR INTEGERS OF INCOMPATIBLE DIM"); else return [$1[1],$1[2],$1[3],int($1[4] / $2[4])]; } func int_add { /* if ($1==2 || $2==@) return [INT,@,@,@]; */ if ($1[3]!=$2[3] && $1[3] && $2[3]) writeln("ERROR INTEGERS OF INCOMPATIBLE DIM"); else return [$1[1],$1[2],$1[3],$1[4] + $2[4]]; } func int_sub { /* if ($1==2 || $2==@) return UNDEF; */ if ($1[3]!=$2[3] && $1[3] || $2[3]) { writeln("ERROR INTEGERS OF INCOMPATIBLE DIM"); return UNDEF; } else return ($1[3]>$2[3]) ? [$1[1],$1[2],$1[3],$1[4] - $2[4]] : [$1[1],$1[2],$2[3],$1[4] - $2[4]]; } func int_mod { if ($2[3]==0) return [$1[1],$1[2],$1[3],$1[4] % $2[4]]; else { writeln("ERROR ILLEGAL DIM IN MOD INT"); return UNDEF; }; } func int_rup { auto result, sign; if ($1[4] == @ || $2[4] == @) return UNDEF; sign = ($2[4] < 0) ? -1 : 1; result = $1[4] % $2[4]; return one_int((result == 0) ? $1[4] : (result > 0) ? $1[4] - result + sign * $2[4] : $1[4] + result - sign * $2[4]); } func int_smash { auto new_mod, int1, int2, result; int1 = $1[4]; int2 = $2[4]; if (int1 == @ || int2 == @ || $1[3] == @ || $2[3] == @) return UNDEF; new_mod = $1[3] * $2[3]; result = int1+$1[3]; while (result%$1[3] != int1 || result%$2[3] != int2) result = result+$1[3]; return [INT,$1[2],new_mod,result]; } func int_inv { auto u,v,q,r,f,g,h,m,n; n = $1[3]; m = $1[4]; if (n == @ || m == @) return UNDEF; u=m; v=n; r=n; f=1; g=0; h=0; while (r) { q=u/v; h=f-g*q; r=u-v*q; f=g; u=v; g=h; v=r; }; if (u==1) return [INT,EXPL,$1[3],f]; writeln("NO INVERSE - INT INV"); return UNDEF; } func int_prime {return [INT, EXPL, 0,$1[4]];}/*normalises after mod calc*/ func int_size {return [INT,EXPL,0,$1[3]];} func i_eq { return ($1[4]==$2[4]); } func int_lt { if ($1[3] == $2[3]) { return ($1[4] == @ || $2[4] == @) ? 0 : ($1[4] < $2[4]); } else { writeln("ERROR INTS OF INCOMPATIBLE DIM"); return 0; }; } func int_grt { if ($1[3] == $2[3]) { return ($1[4] == @ || $2[4] == @) ? 0 : ($1[4] > $2[4]); } else { writeln("ERROR INTS OF INCOMPATIBLE DIM"); return 0; } } func int_ltoe { if ($1[3] == $2[3]) { return ($1[4] == @ || $2[4] == @) ? 0 : ($1[4] <= $2[4]); } else { writeln("ERROR INTS OF INCOMPATIBLE DIM"); return 0; } } func int_gtoe { if ($1[3] == $2[3]) { return ($1[4] == @ || $2[4] == @) ? 0 : ($1[4] >= $2[4]); } else { writeln("ERROR INTS OF INCOMPATIBLE DIM"); return 0; } } func int_ne { if ($1[3] == $2[3]) { return ($1[4] == @ || $2[4] == @) ? 0 : ($1[4] != $2[4]); } else { writeln("ERROR INTS OF INCOMPATIBLE DIM"); return 0; } } func i_actval {return @;} /*replaces symbolic expressions with values */ func find_min { auto min, count; min = @; for(count=1; count<=$1#; count++) if ($1[count]!=@ && $2[count]) min = (min==@ || $1[count]<$1[min]) ? count : min; return min; } func col_dist{ para start, end; auto count, ncols, at, dists, useable; useable = []; dists = []; ncols = $# ; for(count = 1; count<=$3[3]; count++) { useable = useable//[1]; dists = dists//[@]; } if (start == 0 || end == 0) return UNDEF; if (start > $3[3] || end > $3[3]) { writeln( "START OR END POINT OUT OF RANGE OF PERM"); return UNDEF; } dists[start] = 0; for (at = find_min(dists,useable); at!=end && at!=@; at = find_min(dists,useable)) { for (count=3; count<=ncols; count++){ if ($[count][4][at][4]!=@ && $[count][4][at][4] && (dists[$[count][4][at][4]]==@ || dists[$[count][4][at][4]]>dists[at]+1)) dists[$[count][4][at][4]]=dists[at]+1; }; useable[at]=0; } return(one_int(dists[end])); } func col_mult { auto count, permsize, result; permsize = $1[4]#; result = []; if (($1[4]# != $2[4]#)) { writeln("ERROR INCOMPATIBLE PERMS"); return UNDEF_COL; } for (count = 1; count <= permsize; count= count+1) result = ($2[4][count][4]!=@ && $2[4][count][4] && $1[4][$2[4][count][4]][4]) ? result // [$1[4][$2[4][count][4]]] : result // [UNDEF]; return [COL,EXPL,permsize,result]; } func vert_col { return [COL, $1[2], $1[3], $1[4]]; } func join_cols { auto count, size, result; if ($1[3] == 0 || $2[3] == 0) return UNDEF_COL; if ($1[3] > $2[3]) { size = $1[3]; result = $1[4]; for (count = 1; count <= $2[3]; count++) if (result[count][4] == @) result[count] = $2[4][count]; } else { size = $2[3]; result = $2[4]; for (count = 1; count <= $1[3]; count++) if ($1[4][count][4] != @ && $1[4][count][4]) result[count] = $1[4][count]; }; return [COL, EXPL, size, result]; } func col_size { auto length, count, largest; length = $1#; largest = length; for (count = 1; count <= length; count++) if ($1[count][4] != @ && $1[count][4] > largest) largest = $1[count][4]; return largest; } func list_undef { para length; auto count, result; result = []; for (count = 1; count < length; count ++) append result, UNDEF; return result; } func check_col { auto ERROR, count, undef; ERROR = 0; if ($2[3] != 0){ undef = list_undef($2[3]); if ($1[4]# != $2[3]) { writeln("ERROR COLS OF INCOMPATIBLE SIZE"); ERROR = 1; } else for (count = 1; count <= $1[4]#; count++) { if ($1[4][count][4] != @ && $1[4][count][4] > $2[3]){ writeln("INT OUT OF RANGE IN COL"); ERROR = 1; }; }; } else undef = list_undef($1[4]#); return (ERROR==1) ? [COL,$2[2],$2[3], undef] : [COL,$2[2],$1[3],$1[4]]; } func c_make { auto size, count, result ; result = []; size = col_size($1); for (count = 1; count <= size; count++) append result, UNDEF; for (count = 1; count <= $1# - 1; count++) { if ($1[count][4] != @ && $1[count][4]) result[$1[count][4]] = $1[count+1]; if ($1[count+1][4] == @ && $1[count][4] == 0) result[$1[count][4]]= UNDEF; }; if ($1[$1#][4] != @ && $1[$1#][4]) result[$1[$1#][4]] = $1[1]; return [COL,EXPL,size,result]; } func col_exp { auto count, result, size; size = $2[4]; result = $1; if ($2[4] != @){ if ($2[4] < 0) size = - $2[4]; for (count = 1; count <= size-1; count++) result = col_mult(result ,$1); }; if ($2[4]==0){ result = []; for (count= 1; count<= $1[4]#; count++) append result, one_int(count); result = [COL,EXPL,$1[3]]//[result]; }; return ($2[4] != @) ? (($2[4] > -1) ? result : col_inv(result)) : UNDEF_COL; } func cactval {return @;} func col_inv { /*inverse of a perm*/ auto result, count; result = []; if ($1[3] != $1[4]# || $1[3]==@ || $1[4]==@) return UNDEF_COL; for (count = 1; count<= $1[3]; count++) append result, UNDEF; for (count = 1; count<= $1[3]; count++) if (($1[4][count][4]==@)||($1[4][count][4]==0)); /* writeln("WARNING-PERM NOT COMPLETELY DEFINED - INV");*/ else result[$1[4][count][4]] = one_int(count); return [$1[1], $1[2], $1[3], result]; } func cat_cols { auto count, size, result; size = $1[3] + $2[3]; result = $1[4] // $2[4]; for (count = $1[3]+1; count <= size; count++) if (result[count][4] != @) result[count][4] += $1[3]; return [COL, EXPL, size, result]; } func colisize {return [INT,EXPL,0,$1[3]];} /*degree of the perm*/ proc c_bin_fns { /*works for binary functions*/ auto ERROR, count, undef; ERROR = 0; if ($1[3] != 0){ undef = list_undef($1[3]); if ($2[4]# != $1[3]){ writeln("ERROR COLS OF INCOMPATIBLE SIZE"); ERROR = 1; }; for (count = 1; ERROR == 0 && count <= $1[3]; count++){ if ($2[4][count][4] != @ && $2[4][count][4] > $1[3]){ writeln("INT OUT OF RANGE IN COL"); ERROR = 1; }; }; }; } proc v_make { return [VERT,EXPL,$1#,$1]; } func check_vert { auto vert; vert = ($#==2) ? $1 : $1[$3]; if (vert[3] != $2[3] && $2[3]!=0){ writeln("ERROR VERTS OF INCOMPATIBLE DIM"); return UNDEF_VERT; } else return [vert[1], $2[2], vert[3], vert[4]]; } proc v_bin_fns { /*works for binary functions*/ if ($1[3]!=$2[3] && $1[2]!=ABST) writeln("ERROR VERTS OF INCOMPATIBLE DIM"); } func vert_add { auto result, count; if ($1[4]==@ || $2[4]==@) return UNDEF_VERT; if($1[3]!=$2[3]) writeln("ERROR VERTS INCOMPATIBLE DIM (RHS)"); result =[]; for (count = 1; count <= $1[3]; count++) append result, int_add($1[4][count],$2[4][count]); return [$1[1],$1[2],$1[3],result]; } func vert_sub { auto result, count; if ($1[4]==@ || $2[4]==@) return UNDEF_VERT; if($1[3]!=$2[3]) writeln("ERROR VERTS INCOMPATIBLE DIM (RHS)"); result =[]; for (count = 1; count <= $1[3]; count++) append result, int_sub($1[4][count],$2[4][count]); return [$1[1],$1[2],$1[3],result]; } proc vert_mult { auto result, count; if ($1[4]==@ || $2[4]==@) return UNDEF_VERT; result =[]; for (count = 1; count <= $2[3]; count++) append result, int_mult($1,$2[4][count]); return [$2[1],$2[2],$2[3],result]; } func vert_rot { para vert, other; auto xc, yc, xr, yr, angle, plane1, plane2; angle = other[4][1][4] * PI / 180; plane1 = other[4][2][4]; plane2 = other[4][3][4]; xc = vert[4][plane1][4]; yc = vert[4][plane2][4]; if ((angle * plane1 * plane2 * xc * yc) == @) return UNDEF_VERT; xr = int(xc * cos(angle) - yc * sin(angle)); yr = int(xc * sin(angle) + yc * cos(angle)); vert[4][plane1] = one_int(xr); vert[4][plane2] = one_int(yr); return vert; } func v_ref {return @;} /*reflection*/ func vert_smash { /*cat vertices dim N ,M -> N+M*/ return [$1[1],$2[2],$1[3]+$2[3], $1[4]//$2[4]]; } func v_actval {return @;} func vert_size {return [INT,EXPL,0,$1[3]];} func vneq { auto count, result; result = 0; if ($1[3] != $2[3]) writeln("ERROR VERTS Of INCOMPATIBLE DIM (IF)"); else for (count = 1; count <= $1[3]; count++) if ($1[4][count] == $2[4][count]) result++; return result!=$1[3]; } func veq { auto count, result; if ($1[3] != $2[3]) writeln("ERROR VERTS Of INCOMPATIBLE DIM (IF)"); else for (count = 1; count <= $1[3]; count++) if ($1[4][count] == $2[4][count]) result++; return result==$1[3]; } proc d_bin_fns{ if ($1[3]!=$2[3] && $1[3]!=0) writeln("ERROR DIAGS OF INCOMPATIBLE SIZE"); } func check_diag { if ($2[3]==0 || $1[3]==$2[3]) return $1[4][2]; } func diag_join { return [DIAG, EXPL, $2[3]+$1[3], [EXPL, $1[4][2]//$2[4][2]]]; } func sub_diag { auto subsize, result, count; subsize = $# - 1; result = []; for (count = 1; count <= subsize; count++) { if ($[count+1][4] != @) append result, $1[4][2][$[count+1][4]]; else append result, UNDEF_VERT; } return [DIAG, EXPL, $#-1, [EXPL, result]]; } func diag_mult { auto result, count; result = []; for (count = 1;count <= $2[3]; count++) append result, vert_mult($1,$2[4][2][count]); return [DIAG, EXPL, $2[3], [EXPL, result]]; } func diag_rot { auto result, count; result = []; for (count = 1;count <= $1[3]; count++) append result, vert_rot($1[4][2][count], $2); return [DIAG, EXPL, $1[3], [EXPL, result]]; } func v_trans { auto count, verts, result; result = []; verts = $2[4][2]#; for (count=1; count <= verts; count++) append result, vert_add( $1, $2[4][2][count]); return [$2[1],$2[2],$2[3], [$2[4][1], result], $2[5]]; } func diag_smash { auto count, result; result = []; for (count = 1; count <= $1[3]; count++) result = result//v_trans($1[4][2][count],$2)[4][2]; return [$2[1],$2[2],$2[3]*$1[3], [$1[4][1], result]]; } func diag_size {return [INT,EXPL,0,$1[2][2]];} /*number of verts*/ func nd_2d { para vert; auto count, count2, dim; dim = vert#; for (count = dim; count>=3; count--) for (count2 = dim-1; count2 >= 1; count2--) if (vert[count2][4] > 0) { vert[count2][4] = vert[count2][4] - 0.1*vert[count][4]; if (vert[count2][4] < 0) vert[count2][4] = 0; } else if (vert[count2][4] < 0 ) { vert[count2][4] = vert[count2][4] + 0.1*vert[count][4]; if (vert[count2][4] > 0)vert[count2][4] = 0; }; return [vert[1],vert[2]]; } func inColList { para list, item; auto i; if (list == []) return 0; for (i = 1; i <= list#; i++) if (list[i] == item) return i; return 0; } /*** Functions for manipulating assocative memory ***/ func searchKey { para map, key; auto start, mid, end; start = 1; end = (*map)#; mid = (start + end) / 2; while ( start <= mid && mid <= end ) { if ((*map)[mid][1] > key) end = mid - 1; else if ((*map)[mid][1] < key) start = mid + 1; else /* match */ return [ mid, (*map)[mid][2] ]; mid = (start + end) / 2; } return [mid < start ? start : mid, @]; } func putKey { para map, key, data; auto ans; ans = searchKey(map, key); if (ans[2] == @) { insert *map, ans[1], [key, data]; return ans[1]; } else /* already there */ return 0; /* fail */ } func deleteKey { para map, key; auto ans; ans = searchKey(map, key); if (ans[2] == @) { return 0; /* fail */ } else { /* found */ delete *map, ans[1]; return ans[1]; } } func replaceKey { para map, key, data; auto ans; ans = searchKey(map, key); if (ans[1] > (*map)# || (*map)[ans[1]][1] != key) /* not there */ insert *map, ans[1], [key, data]; else /* found */ (*map)[ans[1]][2] = data; return ans[1]; } proc dispNoLabels { auto diag, dname, oldDiagCols, cols, window, j, vertex; auto collist, pos; diag = *($[$#-1]); dname = nameof($[$#-1]); oldDiagCols = "old_"//dname//"_cols"; if (`oldDiagCols` == @) `oldDiagCols` = []; collist = []; cols = $#-2; window = $[$#]; for (j = cols; j >= 2; j -= 2) { append collist, $[j-1]; if (pos = inColList(`oldDiagCols`, $[j-1])) { delete `oldDiagCols`, pos; } delete_shape(&`$[j-1]//"__"`); draw_col($[j-1],$[j][4],diag[4][2],window); } while (`oldDiagCols` != []) { delete_shape(&``oldDiagCols`[1]//"__"`); shift `oldDiagCols`; } vertex = "L_"//dname; delete_shape(&`vertex`); `oldDiagCols` = collist; } proc dispWithLabels { auto diag, dname, oldDiagCols, cols, window, i, j, vertex; /* auto collist, pos; */ auto collist, pos, _p1, x1, y1, _L_attr; auto var, viewport_name; diag = *($[$#-1]); dname = nameof($[$#-1]); oldDiagCols = "old_"//dname//"_cols"; if (`oldDiagCols` == @) `oldDiagCols` = []; collist = []; cols = $#-2; window = $[$#]; for (j = cols; j >= 2; j -= 2) { append collist, $[j-1]; if (pos = inColList(`oldDiagCols`, $[j-1])) { delete `oldDiagCols`, pos; } delete_shape(&`$[j-1]//"__"`); draw_col($[j-1],$[j][4],diag[4][2],window); } while (`oldDiagCols` != []) { delete_shape(&``oldDiagCols`[1]//"__"`); shift `oldDiagCols`; } vertex = "L_"//dname; delete_shape(&`vertex`); `oldDiagCols` = collist; for(i = 1; i<=diag[4][2]#; i++){ x1 = nd_2d(diag[4][2][i][4])[1][4]; y1 = nd_2d(diag[4][2][i][4])[2][4]; _p1 = cart(x1,y1); _L_attr = "color=gray1"; `vertex` = label(str(i),_p1); PLOT_label(`window`, &`vertex`, &_L_attr); } } proc draw_col { para c_nm,cols,verts,window; auto k1,x1,y1,x2,y2,li,vert; /* auto colour, style, _L_attr; */ auto colour, style, _L_attr, _p1, _p2; auto var, viewport_name; colour = c_nm[c_nm#]-'a'+1; colour = colour ? colour : _line_colour#; style = (displayDepth > 1) ? "solid,color="//_line_colour[colour] : (colour == 1) ? "solid,color=gray1" : "dashed,dash="//str(colour*20+2); _L_attr = "linestyle="//style ; for (k1=1;k1<=cols#;k1++){ vert = nd_2d(verts[k1][4]); x1=vert[1][4]; y1=vert[2][4]; _p1 = cart(x1,y1); if ((cols[k1][4] != @ && cols[k1][4])&& (k1!=cols[cols[k1][4]][4] || k1 bl_writeln("l"); proc bl_writeln { auto i; write("["); for (i=1; i<=`str($1)//"l"`; i++) { write(`str($1)//str(i)`); if (i < `str($1)//"l"`) write(","); } writeln("]"); } wholeproc = " %eden0 proc ?1_constructwhole : ?1l { auto i, s; s = \"%eden0\n?1 is [\"; for (i = 1; i <= ?1l; i++) { if (i != 1) s = s // \", \"; s = s // \"?1\" // str(i); } s = s // \"];\"; execute(s); } "; proc edensl_constructwhole { para l; execute(macro(wholeproc, l)); } proc edensl_assignconstruct { para l, v; auto i; `str(l)//"l"` = v#; for (i=1; i<=v#; i++) edensl_assignelement(l, i, v[i]); edensl_constructwhole(l); } proc edensl_defineconstruct { para l, sv; auto i; `str(l)//"l"` = sv#; for (i=1; i<=sv#; i++) edensl_defineelement(l, i, sv[i]); edensl_constructwhole(l); } proc edensl_assignelement { para l, i, v; if (i > `str(l)//"l"`) error("index out of range"); `str(l)//str(i)` = v; } proc edensl_defineelement { para l, i, sv; if (i > `str(l)//"l"`) error("index out of range"); execute("%eden0\n"//str(l)//str(i)//" is "//sv//";"); } proc edensl_append { para l, v; `str(l)//str((++`str(l)//"l"`))` = v; } proc edensl_delete { para l, i; auto j; if ((i < 1) || (i > `str(l)//"l"`)) error("index out of range"); for (j=i; j<=`str(l)//"l"`-1; j++) `str(l)//str(j)` = `str(l)//str(j+1)`; `str(l)//"l"`--; } proc edensl_insert { para l, i, v; auto j; if ((i < 1) || (i > `str(l)//"l"`)) error("index out of range"); for (j=`str(l)//"l"`; j>=i; j--) `str(l)//str(j+1)` = `str(l)//str(j)`; `str(l)//str(i)` = v; `str(l)//"l"`++; } proc edensl_shift { edensl_delete($1, 1); } proc edensl_assign { para l, v; if (type(v) == "list") edensl_assignconstruct(l, v); else `str(l)` = v; } edenslbuf = ""; proc edenslTransSwitch { edenslbuf = ""; } edenSymRE = "([[:alpha:]][[:alnum:]]*)"; listRefRE = "\\[([^]]*)\\]"; func edenslTransStatement { para s; auto q, l; ## l = [a, b, 42]; -> edensl_assignconstruct("l", [a, b, 42...]); s = regreplace(edenSymRE // "\\s*=\\s*" // listRefRE // "\\s*;$", "edensl_assignconstruct(\"$1\", [$2]);", s); ## l is [a, b, 42]; -> edensl_defineconstruct("l", ["a", "b", "42"...]); /* !@!@ need to escape quotes etc inside the string result */ /* !@!@ easier to quote the entire list? "[a, b, 42]" */ q = regmatch(edenSymRE // "\\s*is\\s*" // listRefRE // "\\s*;$", s); if (q != []) { /* place quotes around elements in the list */ l = regmatch(listRefRE, q[1]); /* !@!@ FIXED? "([^,]*)(,|$)" causes a crash here - whoops */ l = regreplace("\\s*([^,]*),", "\"$1\",", l[2]); l = regreplace(",\\s*([^,]*)$", ",\"$1\"", l); /* !@!@ this assumes s is only one statement */ /* now translate to procedure call */ s = "edensl_defineconstruct(\"" // q[2] // "\", [" // l // "]);"; } ## l[4] = a; -> edensl_assignelement("l", 4, a); s = regreplace(edenSymRE // "\\s*" // listRefRE // "\\s*=\\s*(.*);$", "edensl_assignelement(\"$1\", $2, $3);", s); /* note this one can't be done in standard %eden */ /* !@!@ need to escape quotes etc inside the string result */ ## l[4] is a; -> edensl_defineelement("l", 4, "a"); s = regreplace(edenSymRE // "\\s*" // listRefRE // "\\s*is\\s*(.*);$", "edensl_defineelement(\"$1\", $2, \"$3\");", s); ## l# -> ll s = regreplace(edenSymRE // "\\s*#", "$1l", s); ## l[i] on RHS (LHS catered for above) -> li s = regreplace(edenSymRE // "\\s*" // listRefRE, "$1$2", s); ## append l, v; -> edensl_append("l", v); s = regreplace("append\\s+" // edenSymRE // ",\\s*(.*)\\s*;$", "edensl_append(\"$1\", $2);", s); ## delete l, i; -> edensl_delete("l", i); s = regreplace("delete\\s+" // edenSymRE // ",\\s*(.*)\\s*;$", "edensl_delete(\"$1\", $2);", s); ## insert l, i, v; -> -> edensl_insert("l", i, v); s = regreplace("insert\\s+" // edenSymRE // ",\\s*(.*)\\s*;$", "edensl_insert(\"$1\", $2);", s); ## shift l; -> edensl_shift("l"); s = regreplace("shift\\s+" // edenSymRE // "\\s*;$", "edensl_shift(\"$1\");", s); ## l = ... -> edensl_assign("l", ...); ## "..." could be result of a func, an expression involving concatenation s = regreplace(edenSymRE // "\\s*=\\s*(.*);$", "edensl_assign(\"$1\", $2);", s); ## l is ... -> leave unchanged. Expressions involving concatenation ## etc will be handled as normal. return s; } proc edenslParseChar { para c; auto t, q, l; edenslbuf = edenslbuf // c; if (c == ';') { t = edenslTransStatement(edenslbuf); t = "%eden0\n" // t; if (eden_debug_notations) writeln(""); execute(t); edenslbuf = ""; } } /* The notation name can actually be %eden, so that this translator replaces the built-in Eden. The built-in Eden would still be accessible with %eden0. Probably need to make sure that execute, include etc all do a "%eden\n" before they run to make sure this fully works. Leave as %edensl for the time being. */ newNotation("%edensl", &edenslTransSwitch, &edenslParseChar); EDEN-1.66/lib-tkeden-1.66/edenio.tcl0000644000175000017500000015245510322545624016507 0ustar rboyattrboyatt# $Id: edenio.tcl,v 1.24 2002/07/10 19:31:18 cssbz Exp $ # # [Ben] Only use focusfollowsmouse on Unix, as on Win32 this is non-standard # behaviour and will confuse users # [Ash] Also Mac (although it doesn't seem to make much difference) if {$_tkeden_win32_version == "0.0"} { if {[expr !$_tkeden_apple]} { tk_focusFollowsMouse } } if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { set variantversion "dtkeden $_tkeden_version (server)" } else { set variantversion "dtkeden $_tkeden_version (client)" } } else { # tkeden set variantversion "tkeden $_tkeden_version" } wm title . "$variantversion: Input" set radiosBg grey60 set radiosButtonBg grey50 frame .radios -background $radiosBg -borderwidth 0 button .radios.accept -text "Accept" -underline 0 \ -background $radiosButtonBg -command {accept} pack .radios.accept -side left if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { button .radios.send -text "Send" -underline 0 \ -background $radiosButtonBg -command {selectClients} } else { button .radios.send -text "Send" -underline 0 \ -background $radiosButtonBg -command { set text [.text get 1.0 end] set text [string trim $text] if {$text != ""} { set errCode [catch {.menu.accept invoke} string] sendServer $text } } } pack .radios.send -side left } set notation "%eden" proc addNotationRadioButton {notation} { global radiosBg # Tk widgets must start with a lowercase letter set widget ".radios.[string tolower $notation]" # Ignore errors that occur if the radiobutton is already defined catch { radiobutton $widget -variable notation \ -highlightbackground $radiosBg -background $radiosBg \ -value "%$notation" -text "%$notation" \ -command { # the % at the start doesn't seem to be required here appendHist "$notation\n"; evaluate "$notation\n" } } pack $widget -side left } # provided so people can customise the tkeden interface a little proc removeNotationRadioButton {notation} { set widget ".radios.[string tolower $notation]" destroy $widget } addNotationRadioButton eden addNotationRadioButton donald addNotationRadioButton scout if {$_tkeden_sasamiAvail == "1"} { addNotationRadioButton sasami } if {$_tkeden_variant == "dtkeden"} { addNotationRadioButton lsd } button .radios.interrupt -text "Interrupt" \ -background $radiosButtonBg -command {interrupt} pack .radios.interrupt -side right menu .menu . config -menu .menu # This is similar to the background colour used for the menus on Solaris # but not quite (unfortunately) set bg grey60 frame .labelframe -borderwidth 0 -background $bg # The prompt shows the current notation [Ash] label .prompt -anchor w -text "Enter EDEN statements:" -background $bg # The labelframe also contains the current virtual agent [Ash] label .agentName -anchor e -text "" -background $bg pack .prompt -side left -fill x -in .labelframe pack .agentName -side right -fill x -in .labelframe # ideally we should use this font whereever Eden code is displayed font create edencode -family courier -size 10 text .text -width 80 -height 15 -yscrollcommand ".scroll set" \ -background white -foreground black -insertbackground blue \ -insertofftime 80 -insertontime 1000 -insertwidth 2p \ -font edencode # set tabs to width of two characters (have to set it in pixels) [Ash] .text configure -tabs [font measure [.text cget -font] 00] scrollbar .scroll -command ".text yview" pack .radios -side top -fill x pack .labelframe -side top -fill x pack .scroll -side right -fill y pack .text -side right -fill both -expand 1 set m [menu .menu.file -tearoff 0] .menu add cascade -label "File" -underline 0 -menu .menu.file if {$_tkeden_apple} { $m add command -label "Open..." -command {include Open} -accelerator Command-O } else { $m add command -label "Open..." -command {include Open} -underline 0 } $m add command -label "Execute..." -command {include Execute} -underline 0 $m add separator set saveAsReusable 1 $m add checkbutton -label "Save as reusable definitions" \ -variable saveAsReusable -offvalue 0 -onvalue 1 if {$_tkeden_apple} { $m add command -label "Save all definitions..." \ -command {save all} -accelerator Command-S } else { $m add command -label "Save all definitions..." \ -command {save all} -underline 5 } $m add command -label "Save Scout definitions..." \ -command {save scout} -underline 5 $m add command -label "Save DoNaLD definitions..." \ -command {save donald} -underline 5 $m add command -label "Save Eden definitions..." \ -command {save eden} -underline 5 if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { $m add command -label "Save LSD description..." \ -command {save lsd} -underline 5 } } $m add command -label "Save history..." \ -command {save hist} -underline 5 if {$_tkeden_apple} { # The Application menu (left-most, next to the Apple menu) set mapp [menu .menu.apple -tearoff 0] .menu add cascade -menu .menu.apple # Strangely, the 91 option doesn't seem to have an ellipsis in # other Apple apps, despite it leading to a dialogue... $mapp add command -label "91 $_tkeden_variant" -command about # add a Preferences item for conformity with other apps, but don't # put anything here (perhaps we will in the distant future!) $mapp add separator $mapp add command -label "Preferences..." -state disabled $mapp add command -label "Restart" -command { close $histfile; restart; } # "Quit tkeden" appears in the Apple menu automatically } else { # If we aren't on the Mac, add File->Restart and File->Quit -- on the Mac, # we put these in the Apple menu... $m add separator $m add command -label "Restart" -command { close $histfile; restart; } -underline 0 $m add separator $m add command -label "Quit" -command { close $histfile; quit; } -underline 0 } # don't use tearoffs on the Apple platform set m [menu .menu.edit -tearoff [expr !$_tkeden_apple]] .menu add cascade -label "Edit" -underline 0 -menu .menu.edit if {$_tkeden_apple} { $m add command -label "Accept" \ -accelerator "Command-Return" \ -command { acccept } $m add separator # copying ordering of options from TextEdit menu... $m add command -label "Cut" \ -accelerator "Command-X" \ -command {event generate .text <>} $m add command -label "Copy" \ -accelerator "Command-C" \ -command {event generate .text <>} $m add command -label "Paste" \ -accelerator "Command-V" \ -command {event generate .text <>} $m add command -label "Select all" \ -accelerator "Command-A" \ -command {.text tag add sel 1.0 end} # $m add command -label "Select none" \ # -accelerator "Control-\\" \ # -command {.text tag add sel} # -command {.text tag delete sel} # -command {event generate .text } $m add separator $m add command -label "Previous" \ -accelerator "Command-Up" \ -command {previous} $m add command \ -label "Next" \ -accelerator "Command-Down" \ -command {next} } else { # (I found the keysym names using xmodmap -pk as I don't know the # virtual event names for select all and select none). $m add command -label "Select all" -underline 7 \ -accelerator "Control-/" \ -command {event generate .text } $m add command -label "Select none" \ -accelerator "Control-\\" \ -command {event generate .text } $m add command -label "Copy" -underline 0 \ -command {event generate .text <>} $m add command -label "Cut" -underline 2 \ -command {event generate .text <>} $m add command -label "Paste" -underline 0 \ -command {event generate .text <>} $m add separator $m add command -label "Previous" \ -accelerator "Control-Alt-Up or Meta-Up" \ -command {previous} -underline 1 $m add command \ -label "Next" \ -accelerator "Control-Alt-Down or Meta-Down" \ -command {next} -underline 0 } $m add separator $m add command -label "Clear" \ -accelerator "Control-Alt-0 or Meta-0" \ -command {clearInputWindow} -underline 1 set m [menu .menu.show -tearoff [expr !$_tkeden_apple]] if {$_tkeden_apple} { .menu add cascade -label "Window" -underline 0 -menu .menu.show # need to figure out how to implement the following... -- disabled for now $m add command -label "Close Window" -accelerator "Command-W" -state disabled $m add command -label "Minimise" -accelerator "Command-M" -state disabled $m add command -label "Zoom" -state disabled $m add separator $m add command -label "Bring All to Front" -command { bringToTop } $m add separator } else { .menu add cascade -label "View" -underline 0 -menu .menu.show } $m add checkbutton -label "View history..." \ -variable showhist -command {show hist $showhist} -underline 5 $m add checkbutton -label "View errors..." \ -variable showerr -command {show err $showerr} -underline 6 $m add checkbutton -label "View Scout definitions..." \ -variable showscout -command {show scout $showscout} -underline 5 $m add checkbutton -label "View DoNaLD definitions..." \ -variable showdonald -command {show donald $showdonald} -underline 5 $m add checkbutton -label "View Eden definitions..." \ -variable showeden -command {show eden $showeden} -underline 5 if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { $m add checkbutton -label "View LSD descriptions..." \ -variable showlsd -command {show lsd $showlsd} -underline 5 $m add checkbutton -label "View client connections..." \ -variable showclient -command {show client $showclient} \ -underline 5 set m2 [menu .menu.type] .menu add cascade -label "Type" -menu .menu.type -underline 0 set proType 0 $m2 add radiobutton -label "Normal mode" \ -variable proType -value 0 $m2 add radiobutton -label "Interference mode" \ -variable proType -value 1 $m2 add radiobutton -label "Broadcast mode" \ -variable proType -value 2 \ -command { appendHist ">>\n"; evaluate ">>\n" } $m2 add radiobutton -label "Private mode" \ -variable proType -value 3 } } set m [menu .menu.help -tearoff 0] .menu add cascade -label "Help" -underline 0 -menu .menu.help # 91 is in the Apple menu on the Apple platform if {$_tkeden_apple == "0"} { $m add command -label "91 $_tkeden_variant..." -command about \ -underline 0 } $m add command -label "Credits..." -command credits \ -underline 0 $m add command -label "Key shortcuts..." -command keys \ -underline 0 $m add command -label "Eden quick reference..." \ -command edenQuickRef -underline 0 $m add command -label "Scout quick reference..." \ -command scoutQuickRef -underline 0 $m add command -label "Donald quick reference..." \ -command donaldQuickRef -underline 0 $m add command -label "Sasami quick reference..." \ -command sasamiQuickRef -underline 4 $m add command -label "Aop quick reference..." \ -command aopQuickRef -underline 2 $m add command -label "Colour names..." \ -command colourNames -underline 7 $m add command -label "ChangeLog..." -command changeLog \ -underline 1 if {$_tkeden_apple} { # the following useful for debugging... #bind . { puts "Key %K" } # seems that Alt/Meta may not be accepted in bindings on the Mac... bind all { exit } bind all { exit } bind .text { .text tag add sel 1.0 end } bind .text { .text tag add sel 1.0 end } bind .text { previous } bind .text { next } bind .text { controlU } bind .text { controlU } bind .text { .text mark set insert {insert linestart} } bind .text { .text mark set insert {insert lineend} } # on the Mac, Command-A is Select All as standard, and I don't want # to conflict with that, so using this for Accept instead... bind .text { accept; # now stop the return from also having effect on the text... break; } bind all {include Open} bind all {include Open} bind all {save all} bind all {save all} # still need to figure out # - command-w for closing current window # - command-h for hiding the application (this is in the app menu) # - alt-command-h for hiding other apps (this is in the app menu) } else { bind .text { accept } bind .text { accept } bind .text { previous } bind .text { previous } bind .text { previous } bind .text { previous } bind .text { next } bind .text { next } bind .text { next } bind .text { next } bind .text { clearInputWindow } bind .text { clearInputWindow } bind .text { controlU } bind .text { controlU } } proc bringToTop {} { set wins "[winfo children .] ."; foreach w $wins { set tlw [winfo toplevel $w]; if {[wm state $tlw] == "iconic"} { wm deiconify $tlw; } if {$w != ".menu"} { raise $w } } } # bring all our windows to the top if this combination of keys is pressed bind all { bringToTop } bindtags .text {all .text Text} update # History window toplevel .hist wm title .hist "$variantversion: Command History" frame .hist.menu -relief raised -borderwidth 2 pack .hist.menu -side top -fill x button .hist.menu.save -text "Save" -underline 0 -command {save hist} \ -relief flat -highlightthickness 0 bind .hist { .hist.menu.save invoke } bind .hist { .hist.menu.save invoke } button .hist.menu.find -text "Find" -underline 0 -command {find hist} \ -relief flat -highlightthickness 0 bind .hist { .hist.menu.find invoke } bind .hist { .hist.menu.find invoke } button .hist.menu.close -text "Close" -underline 0 \ -command {global showhist; set showhist 0; show hist 0} \ -relief flat -highlightthickness 0 bind .hist { .hist.menu.close invoke } bind .hist { .hist.menu.close invoke } pack .hist.menu.save .hist.menu.find .hist.menu.close -side left frame .hist.t pack .hist.t -fill both -expand 1 text .hist.t.text -state disabled -width 80 -height 10 \ -yscrollcommand ".hist.t.scroll set" -font edencode scrollbar .hist.t.scroll -command ".hist.t.text yview" pack .hist.t.scroll -side right -fill y pack .hist.t.text -side right -fill both -expand 1 wm withdraw .hist wm protocol .hist WM_DELETE_WINDOW ".hist.menu.close invoke;" update # Error window toplevel .err wm title .err "$variantversion: Errors" frame .err.menu -relief raised -borderwidth 2 pack .err.menu -side top -fill x button .err.menu.save -text "Save" -underline 0 -command {save err} \ -relief flat -highlightthickness 0 bind .err { .err.menu.save invoke } bind .err { .err.menu.save invoke } button .err.menu.find -text "Find" -underline 0 -command {find err} \ -relief flat -highlightthickness 0 bind .err { .err.menu.find invoke } bind .err { .err.menu.find invoke } button .err.menu.close -text "Close" -underline 0 \ -command {global showerr; set showerr 0; show err 0} \ -relief flat -highlightthickness 0 bind .err { .err.menu.close invoke } bind .err { .err.menu.close invoke } pack .err.menu.save .err.menu.find .err.menu.close -side left frame .err.t pack .err.t -fill both -expand 1 text .err.t.text -state disabled -width 80 -height 10 \ -yscrollcommand ".err.t.scroll set" -font edencode scrollbar .err.t.scroll -command ".err.t.text yview" pack .err.t.scroll -side right -fill y pack .err.t.text -side right -fill both -expand 1 wm withdraw .err wm protocol .err WM_DELETE_WINDOW ".err.menu.close invoke;" update if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { toplevel .client wm title .client "$variantversion: Client Connections" frame .client.menu -relief raised -borderwidth 2 pack .client.menu -side top -fill x button .client.menu.close -text "Close" -underline 0 \ -relief flat -highlightthickness 0 \ -command {global showclient; set showclient 0; show client 0;} bind .client { .client.menu.close invoke } bind .client { .client.menu.close invoke } pack .client.menu.close -side left frame .client.t pack .client.t -fill both -expand 1 text .client.t.text -state disabled -width 80 -height 10 \ -yscrollcommand ".client.t.scroll set" scrollbar .client.t.scroll -command ".client.t.text yview" pack .client.t.scroll -side right -fill y pack .client.t.text -side right -fill both -expand 1 wm withdraw .client wm protocol .client WM_DELETE_WINDOW ".client.menu.close invoke;" update } } toplevel .scout wm title .scout "$variantversion: Scout Definitions" frame .scout.menu -relief raised -borderwidth 2 pack .scout.menu -side top -fill x button .scout.menu.save -text "Save" -underline 0 -command {save scout} \ -relief flat -highlightthickness 0 bind .scout { .scout.menu.save invoke } bind .scout { .scout.menu.save invoke } button .scout.menu.find -text "Find" -underline 0 -command {find scout} \ -relief flat -highlightthickness 0 bind .scout { .scout.menu.find invoke } bind .scout { .scout.menu.find invoke } button .scout.menu.rebuild -text "Rebuild" -underline 0 \ -command {dumpscout} \ -relief flat -highlightthickness 0 bind .scout { .scout.menu.rebuild invoke } bind .scout { .scout.menu.rebuild invoke } button .scout.menu.close -text "Close" -underline 0 \ -command {global showscout; set showscout 0; show scout 0} \ -relief flat -highlightthickness 0 bind .scout { .scout.menu.close invoke } bind .scout { .scout.menu.close invoke } pack .scout.menu.save .scout.menu.find .scout.menu.rebuild .scout.menu.close \ -side left frame .scout.t pack .scout.t -fill both -expand 1 text .scout.t.text -state disabled -width 80 -height 20 \ -yscrollcommand ".scout.t.scroll set" -font edencode scrollbar .scout.t.scroll -command ".scout.t.text yview" pack .scout.t.scroll -side right -fill y pack .scout.t.text -side right -fill both -expand 1 wm withdraw .scout wm protocol .scout WM_DELETE_WINDOW ".scout.menu.close invoke;" update toplevel .donald wm title .donald "$variantversion: DoNaLD Definitions" frame .donald.menu -relief raised -borderwidth 2 pack .donald.menu -side top -fill x button .donald.menu.save -text "Save" -underline 0 -command {save donald} \ -relief flat -highlightthickness 0 bind .donald { .donald.menu.save invoke } bind .donald { .donald.menu.save invoke } button .donald.menu.find -text "Find" -underline 0 -command {find donald} \ -relief flat -highlightthickness 0 bind .donald { .donald.menu.find invoke } bind .donald { .donald.menu.find invoke } button .donald.menu.rebuild -text "Rebuild" -underline 0 \ -command {dumpdonald} \ -relief flat -highlightthickness 0 bind .donald { .donald.menu.rebuild invoke } bind .donald { .donald.menu.rebuild invoke } button .donald.menu.close -text "Close" -underline 0 \ -command {global showdonald; set showdonald 0; show donald 0} \ -relief flat -highlightthickness 0 bind .donald { .donald.menu.close invoke } bind .donald { .donald.menu.close invoke } pack .donald.menu.save .donald.menu.find .donald.menu.rebuild \ .donald.menu.close -side left frame .donald.t pack .donald.t -fill both -expand 1 text .donald.t.text -state disabled -width 80 -height 20 \ -yscrollcommand ".donald.t.scroll set" -font edencode .donald.t.text tag config viewport -background #efd4b4 .donald.t.text tag config master -background #efd4b4 scrollbar .donald.t.scroll -command ".donald.t.text yview" pack .donald.t.scroll -side right -fill y pack .donald.t.text -side right -fill both -expand 1 wm withdraw .donald wm protocol .donald WM_DELETE_WINDOW ".donald.menu.close invoke;" update if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { toplevel .lsd wm title .lsd "$variantversion: LSD Descriptions" frame .lsd.menu -relief raised -borderwidth 2 pack .lsd.menu -side top -fill x button .lsd.menu.save -text "Save" -underline 0 -command {save lsd} \ -relief flat -highlightthickness 0 bind .lsd { .lsd.menu.save invoke } bind .lsd { .lsd.menu.save invoke } button .lsd.menu.find -text "Find" -underline 0 -command {find lsd} \ -relief flat -highlightthickness 0 bind .lsd { .lsd.menu.find invoke } bind .lsd { .lsd.menu.find invoke } button .lsd.menu.rebuild -text "Rebuild" -underline 0 \ -command {dumpLSD} \ -relief flat -highlightthickness 0 bind .lsd { .lsd.menu.rebuild invoke } bind .lsd { .lsd.menu.rebuild invoke } button .lsd.menu.close -text "Close" -underline 0 \ -command {global showlsd; set showlsd 0; show lsd 0} \ -relief flat -highlightthickness 0 bind .lsd { .lsd.menu.close invoke } bind .lsd { .lsd.menu.close invoke } pack .lsd.menu.save .lsd.menu.find .lsd.menu.rebuild .lsd.menu.close \ -side left frame .lsd.t pack .lsd.t -fill both -expand 1 text .lsd.t.text -state disabled -width 80 -height 20 \ -yscrollcommand ".lsd.t.scroll set" scrollbar .lsd.t.scroll -command ".lsd.t.text yview" pack .lsd.t.scroll -side right -fill y pack .lsd.t.text -side right -fill both -expand 1 wm withdraw .lsd wm protocol .lsd WM_DELETE_WINDOW ".lsd.menu.close invoke;" update } } toplevel .eden wm title .eden "$variantversion: Eden Definitions" menu .eden.menu .eden config -menu .eden.menu set m [menu .eden.menu.edit -tearoff [expr !$_tkeden_apple]] .eden.menu add cascade -label "Edit" -underline 0 -menu .eden.menu.edit $m add command -label "Copy" -underline 0 \ -command {event generate .eden.t.text <>} $m add command -label "Cut" -underline 2 \ -command {event generate .eden.t.text <>} $m add command -label "Paste" -underline 0 \ -command {event generate .eden.t.text <>} .eden.menu add command -label "Save" -underline 0 -command {save eden} .eden.menu add command -label "Find" -underline 0 -command {find eden} .eden.menu add command -label "Rebuild" -underline 0 -command {viewOption} .eden.menu add command -label "Update" -underline 0 -command {edenUpdate} .eden.menu add command -label "Close" -underline 0 \ -command {global showeden; set showeden 0; show eden 0} frame .eden.t pack .eden.t -fill both -expand 1 text .eden.t.text -state disabled -width 80 -height 20 \ -yscrollcommand ".eden.t.scroll set" -font edencode .eden.t.text tag config masteragent -background #efd4b4 .eden.t.text tag config scout -foreground red .eden.t.text tag config donald -foreground blue scrollbar .eden.t.scroll -command ".eden.t.text yview" pack .eden.t.scroll -side right -fill y pack .eden.t.text -side right -fill both -expand 1 wm withdraw .eden wm protocol .eden WM_DELETE_WINDOW "set showeden 0; show eden 0" update if {$_tkeden_win32_version == "0.0"} { # we're on UNIX set histfilename $env(HOME)/.tkeden-history } else { # cygwin seems to require filenames in DOS (C:\blah) format set histfilename \ [cygwin_conv_to_full_win32_path "$env(HOME)/.tkeden-history"] } # Keep a few backups around as people don't seem to look for the # history file until they've restarted tkeden once or twice. Ideally # this would preserve file dates to make it easier to find data when # grubbing around in the history files, but there isn't an option for # this in Tcl file copy. We could use file rename, but this causes # problems with multiple concurrent instances of tkeden running in the # same user account with an NFS mounted home directory (machine 1 # shifts history files, starts to use tkeden-history, machine 2 shifts # history files, machine 1 gives stale NFS handle error). [Ash] catch {file copy -force ${histfilename}.2 ${histfilename}.3} catch {file copy -force ${histfilename}.1 ${histfilename}.2} catch {file copy -force $histfilename ${histfilename}.1} set histfile [open $histfilename w] proc appendHist {text} { global histfile .hist.t.text config -state normal .hist.t.text insert end $text puts $histfile $text nonewline flush $histfile .hist.t.text see end .hist.t.text config -state disabled } set errorNo 0 set errorAppendNo 0 set error "" proc appendErr {text} { global errorNo errorAppendNo error .err.t.text config -state normal if {$errorAppendNo == 0} { .err.t.text insert end "## ERROR number [incr errorNo]:\n" } incr errorAppendNo append error $text .err.t.text insert end $text .err.t.text see end .err.t.text config -state disabled } proc errorComplete {beep} { global errorNo errorAppendNo error set errorInitialText [string range $error 0 55] if {[string length $error] > 55} {append errorInitialText "..."} appendHist "## ERROR number $errorNo: $errorInitialText\n" set errorAppendNo 0 set error "" set showerr 1 show err 1 raise .err if {$beep} {bell} # Force .err to refresh, meaning the new error information is # shown on the screen even if we are in a tight loop. This call # causes any events on windows to trigger, which may then # cause some Eden to execute - this was the cause of "bug42". update idletasks } # Previous text set pentries "" # Number of entries of previous text to keep set pmax 20 # Current (per-entry session) position in history set ppos 0 proc accept {} { global pentries pmax ppos set text [.text get 1.0 end] appendHist $text # 1) remove the spurious \n that comes from Tcl's text widget # 2) append this entry to the list we are keeping # 3) remove an old entry from the front of the list if necessary # 3) if {[llength $pentries] >= $pmax} { set pentries [lrange $pentries 1 end] } # 2), 1) lappend pentries [string range $text 0 [expr [string length $text]-2]] evaluate $text clearInputWindow set ppos [llength $pentries]; } proc previous {} { global pentries pmax ppos set text [.text get 1.0 end] clearInputWindow set ppos [expr $ppos - 1] if {$ppos < 0} { set ppos 0 bell } .text insert end [lindex $pentries $ppos] } proc next {} { global pentries pmax ppos set text [.text get 1.0 end] clearInputWindow incr ppos if {$ppos > [llength $pentries]} { set ppos [llength $pentries] bell } .text insert end [lindex $pentries $ppos] } proc clearInputWindow {} { .text delete 1.0 end } proc controlU {} { # delete the text to the left of the cursor .text delete {insert linestart} insert } proc interface {statement} { global _tkeden_variant _dtkeden_isServer appendHist $statement if {$_tkeden_variant == "dtkeden"} { if {! ($_dtkeden_isServer)} { # Patrick's change to client only - dunno why [Ash] set statement "$statement\n" } } todo $statement } # This is used in scout.init.e for TEXTBOX [Ash] proc interfaceTEXT {statement} { todo $statement } proc cleanup {w} { .$w.t.text config -state normal .$w.t.text delete 1.0 end .$w.t.text config -state disabled } proc Review {} { global viewToBeDefined viewOption viewScout viewDoNaLD viewSasami set viewOption 0 if {$viewScout} { set viewOption [expr $viewOption + 1] } if {$viewDoNaLD} { set viewOption [expr $viewOption + 2] } if {$viewSasami} { set viewOption [expr $viewOption + 4] } dumpeden $viewOption $viewToBeDefined } proc edenDefn {v n d} { set r [.eden.t.text tag ranges eden%$v] .eden.t.text config -state normal if [llength $r] { .eden.t.text delete eden%$v.first eden%$v.last .eden.t.text insert [lindex $r 0] $d [list $n eden%$v] } else { .eden.t.text insert end $d [list $n eden%$v] } .eden.t.text config -state disabled } proc scoutDefn {v d} { set r [.scout.t.text tag ranges scout%$v] .scout.t.text config -state normal if [llength $r] { .scout.t.text delete scout%$v.first scout%$v.last .scout.t.text insert [lindex $r 0] $d scout%$v } else { .scout.t.text insert end $d scout%$v } .scout.t.text config -state disabled } # This based on mkDialogue below... [Ash] proc fileDialogue {fileName w winTitle} { global variantversion env catch {destroy $w} toplevel $w -class Dialog wm title $w "$variantversion: $winTitle" wm iconname $w "$winTitle" # Create two frames in the main window. The top frame will hold the # message and the bottom one will hold the buttons. Arrange them # one above the other, with any extra vertical space split between # them. # Change $w.top to $w.t so that generic find diagloue can be used. # The find dialogue refences $w.t.text. [Charlie] frame $w.t -relief raised -border 1 frame $w.bot -relief raised -border 1 pack $w.t $w.bot -side top -fill both -expand yes text $w.t.text -state disabled -width 78 -height 31 \ -yscrollcommand "$w.t.scroll set" -background white \ -foreground black -font edencode scrollbar $w.t.scroll -command "$w.t.text yview" pack $w.t.scroll -side right -fill y pack $w.t.text -side top -expand yes -padx 3 -pady 3 if [catch {open "$env(TKEDEN_LIB)/$fileName" r} fileId] { puts stderr "Cannot open $env(TKEDEN_LIB)/$fileName: $fileId" } else { $w.t.text config -state normal $w.t.text insert end [read $fileId] close $fileId $w.t.text config -state disabled } # Create as many buttons as needed and arrange them from left to right # in the bottom frame. Embed the left button in an additional sunken # frame to indicate that it is the default button, and arrange for that # button to be invoked as the default action for clicks and returns in # the dialog. set windowName [string range $w 1 [string length $w]] set args "OK {Find {find $windowName}}" if {[llength $args] > 0} { set arg [lindex $args 0] frame $w.bot.0 -relief sunken -border 1 pack $w.bot.0 -side left -expand yes -padx 10 -pady 10 button $w.bot.0.button -text [lindex $arg 0] \ -command "[lindex $arg 1]; destroy $w" pack $w.bot.0.button -expand yes -padx 6 -pady 6 bind $w "[lindex $arg 1]; destroy $w" focus $w set i 1 foreach arg [lrange $args 1 end] { # Changed the following to stop every button destroying # the window [Charlie] # button $w.bot.$i -text [lindex $arg 0] \ # -command "[lindex $arg 1]; destroy $w" button $w.bot.$i -text [lindex $arg 0] \ -command "[lindex $arg 1]" pack $w.bot.$i -side left -expand yes -padx 10 set i [expr $i+1] } } bind $w [list focus $w] focus $w } # Create the 91 key shortcuts dialogue box containing info... [Ash] # See the Tcl text(n) man page for some of the information in the file proc keys {} { fileDialogue "keys.txt" .keys "Key shortcuts" } proc changeLog {} { fileDialogue "change.log" .changeLog "ChangeLog" } proc credits {} { fileDialogue "credits.txt" .credits "Credits" } # this from Ousterhout "Tcl and the Tk toolkit" page 219 proc forAllMatches {w pattern script} { scan [$w index end] %d numLines for {set i 1} {$i < $numLines} {incr i} { $w mark set last $i.0 while {[regexp -indices $pattern \ [$w get last "last lineend"] indices]} { $w mark set first \ "last + [lindex $indices 0] chars" $w mark set last "last + 1 chars \ + [lindex $indices 1] chars" uplevel $script } } } # Translate text file markup into formatted text by adding appropriate tags # [Ash] proc setTags {w} { $w.t.text config -state normal # Surround text denoting optional stuff with !@O and !@P. See # Ousterhout "Tcl and the Tk toolkit" page 91 for information # about Tcl regular expressions forAllMatches $w.t.text {!@O[^!@]*!@P} { $w.t.text delete first "first + 3 char" $w.t.text delete "last - 3 char" last $w.t.text tag add optional first last } $w.t.text tag configure optional -foreground blue $w.t.text config -state disabled } proc edenQuickRef {} { fileDialogue "eden.txt" .edenQuickRef "Eden Quick Reference" setTags .edenQuickRef } proc scoutQuickRef {} { fileDialogue "scout.txt" .scoutQuickRef "Scout Quick Reference" } proc donaldQuickRef {} { fileDialogue "donald.txt" .donaldQuickRef "DoNaLD Quick Reference" } proc sasamiQuickRef {} { fileDialogue "sasami.txt" .sasamiQuickRef "Sasami Quick Reference" } proc aopQuickRef {} { fileDialogue "aop.txt" .aopQuickRef "Aop Quick Reference" } proc colourNames {} { fileDialogue "rgb.txt" .colourNames "Colour Names" } proc reinit {} { global env #set wins "[winfo children .] ."; #foreach w $wins { destroy $w; } destroy . # This almost works: $_tkeden_win32_version is undefined tho :( source $env(TKEDEN_LIB)/edenio.tcl } # Create the 91 dialogue box containing version and other information [Ash] proc about {} { global _tkeden_variant _tkeden_version _eden_svnversion _tkeden_web_site \ _dtkeden_isServer tcl_patchLevel tk_patchLevel \ _tkeden_win32_version env variantversion haveImg toplevel .about -class Dialog wm title .about "$variantversion: 91" label .about.variant -text "This is $_tkeden_variant, version $_tkeden_version ($_eden_svnversion)" if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { label .about.isserver -text "Invoked in super-agent (server) mode" } else { label .about.isserver -text "Invoked in agent (client) mode" } } label .about.copyright -text "Copyright (C) The 91. All rights reserved" label .about.separator1 -text "--------------------------------" label .about.usage -text "Invoke $_tkeden_variant with the -u option for details of command line options usage" label .about.website -text "See $_tkeden_web_site for more information" label .about.separator2 -text "--------------------------------" label .about.diagnosis -text "This information may be useful when diagnosing problems:" if {$_tkeden_win32_version != "0.0"} { label .about.win32version -text "Win32 version V$_tkeden_win32_version" } else { label .about.win32version -text "Unix version" } label .about.libfiles -text "Library files are located in \n$env(TKEDEN_LIB)" label .about.tclversion -text "Tcl is version $tcl_patchLevel, Tk is version $tk_patchLevel\nTk Img package (PNG, JPEG...) is [expr {$haveImg ? {available} : {not available}}]" button .about.ok -text OK -command {destroy .about} if {$_tkeden_variant == "dtkeden"} { pack .about.variant .about.isserver .about.copyright \ .about.separator1 .about.usage .about.website \ .about.separator2 .about.diagnosis .about.win32version \ .about.libfiles .about.tclversion \ .about.ok -pady 5 } else { pack .about.variant .about.copyright \ .about.separator1 .about.usage .about.website \ .about.separator2 .about.diagnosis .about.win32version \ .about.libfiles .about.tclversion \ .about.ok -pady 5 } } # These long extensions have been re-thought from the original .e, .d, # .s practice. [Ash] set fileTypes { {{All files} *} {{Eden files} {.eden}} {{DoNaLD files} {.donald}} {{Scout files} {.scout}} {{Sasami files} {.sasami}} {{Eddi files} {.eddi}} {{Script (multi-notation) files} {.script}} } proc include style { global variantversion fileTypes notation _tkeden_win32_version if {$_tkeden_win32_version == "0.0"} { # tk_getOpenFile -multiple true isn't possible until 8.4a2 on UNIX # and I can't find where to download that version (and it's alpha) set fileNames [tk_getOpenFile \ -filetypes $fileTypes -parent . \ -title "$variantversion: $style" ] } else { # we're on Windows: -multiple is possible set fileNames [tk_getOpenFile \ -filetypes $fileTypes -parent . \ -multiple true \ -title "$variantversion: $style"] } foreach file $fileNames { # Change directory so that Eden include(...) is more likely to # work. 'cd [file dirname $file]' is the Tcl version, but # I've rewritten it in Eden so that the cwd() function will be # correctly re-evaluated eden "cd(dirname(\"$file\"));" if {$style == "Open"} { set errCode [catch {set incFile [open $file r]} string] if {$errCode == 0} { while {[gets $incFile line] >= 0} { .text insert end "$line\n" } .text see end close $incFile } else { tk_dialog .message "$variantversion: Warning" \ "Cannot open file \"$file\"" warning 0 OK } } elseif {$style == "Execute"} { appendHist "%eden\n" appendHist "include(\"$file\");\n" # want to do this: todo "include(\"$file\");" # but at evaluation level 0 (so that global variables such as # $radiosBg can be found). $file needs to be evaluated # now, but the rest must not be. # Using todo and not eden, as the Tcl eden command restores # the currently active notation after use, and that isn't the # semantics of include(). set cmd {todo "include(\"} append cmd "$file" append cmd {\");"} uplevel #0 $cmd # now switch back to current notation appendHist "$notation\n" } else { error {internal error: include style unknown} } } } proc save w { global variantversion saveAsReusable fileTypes set fileName [tk_getSaveFile -initialfile untitled.$w -parent . \ -title "$variantversion: Save $w As" -defaultextension $w \ -filetypes $fileTypes] if {$fileName != ""} { SaveToFile $w $fileName $saveAsReusable } } proc SaveToFile {w file executable} { global viewOption viewToBeDefined _tkeden_variant _dtkeden_isServer if {[catch {open $file w} fid]} { mkDialog .error "-aspect 300 -text \{$fid\}" {OK {}} tkwait visibility .error grab .error } else { case $w { all { dumpeden 63 0 dumpscout dumpdonald if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { dumpLSD } } if {$executable} { edenDefn autocalc eden "" puts $fid {autocalc = 0;} eden {tcl("set vp_in_use {"//vp_in_use(DFscreen)//"}");} global vp_in_use foreach vp $vp_in_use { edenDefn $vp eden "" } puts $fid %scout SaveScout $fid $executable if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { puts $fid %lsd Savelsd $fid $executable } } puts $fid %donald SaveDonald $fid $executable puts $fid %eden SaveEden $fid $executable -omit masteragent scout donald system } else { puts $fid %scout SaveScout $fid $executable if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { puts $fid %lsd Savelsd $fid $executable } } puts $fid %donald SaveDonald $fid $executable puts $fid %eden SaveEden $fid $executable } if {$executable} { puts $fid {autocalc = 1;} } dumpeden $viewOption $viewToBeDefined } hist { puts $fid [.hist.t.text get 1.0 end] nonewline } eden { if {$executable} { dumpeden 63 0 edenDefn autocalc eden "" puts $fid {autocalc = 0;} eden {tcl("set vp_in_use {"//vp_in_use(DFscreen)//"}");} global vp_in_use foreach vp $vp_in_use { edenDefn $vp eden "" } SaveEden $fid $executable -omit masteragent system } else { dumpeden $viewOption $viewToBeDefined SaveEden $fid $executable } if {$executable} { puts $fid {autocalc = 1;} dumpeden $viewOption $viewToBeDefined } } scout { dumpscout puts $fid "%scout" SaveScout $fid $executable } lsd { # This code should never happen in client and plain tkeden dumpLSD puts $fid "%lsd" Savelsd $fid $executable } donald { dumpdonald puts $fid "%donald" SaveDonald $fid $executable } } close $fid } } proc SaveEden {fid executable args} { if {[lsearch $args -omit] == 0} { set args [lrange $args 1 end] } set lastline [lindex [split [.eden.t.text index end] "."] 0] for {set i 1} {$i <= $lastline} {incr i} { set in 1 set tags [.eden.t.text tag names $i.0] foreach filter $args { if {[lsearch $tags $filter] != -1} { set in 0 break } } if {$in} { puts $fid [.eden.t.text get $i.0linestart $i.0lineend] } } } proc SaveScout {fid executable} { if $executable { foreach t [.scout.t.text tag names] { if [string match scout%* $t] { set text [.scout.t.text get $t.first $t.last] set eq [string first = $text] if {$eq == -1} { puts $fid $text nonewline } else { puts $fid [string range $text 0 [expr $eq - 2]] nonewline puts $fid {;} } } } foreach t [.scout.t.text tag names] { if [string match scout%* $t] { set text [.scout.t.text get $t.first $t.last] set eq [string first = $text] if {$eq != -1} { puts $fid $text nonewline } } } } else { puts $fid [.scout.t.text get 1.0 end] nonewline } } proc SaveDonald {fid executable} { for {set i 1} {$i <= [.donald.t.text index end]} {incr i} { set line [.donald.t.text get $i.0 "$i.0 lineend"] if {![string match AGENT* $line]} { puts $fid $line } } } if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { proc Savelsd {fid executable} { for {set i 1} {$i <= [.lsd.t.text index end]} {incr i} { set line [.lsd.t.text get $i.0 "$i.0 lineend"] puts $fid $line } } } } proc TextSearch {w direction caseSensitive string} { if {[expr [string compare [.$w.t.text tag nextrange found 1.0] ""] \ && [string compare $direction -forwards] == 0]} { if {[expr [string compare [.$w.t.text index insert] \ [.$w.t.text index found.first]] == 0]} { .$w.t.text mark set insert [.$w.t.text index found.last] } } .$w.t.text tag remove found 1.0 end if {$caseSensitive} { set caseSwitch "-exact" } else { set caseSwitch "-nocase" } set index [.$w.t.text search $direction $caseSwitch -regexp \ -count len -- $string insert] if {[string length $index] > 0} { .$w.t.text mark set insert $index .$w.t.text see $index # This doesn't work on Linux as \c is an escape - rewritten [Ash] #.$w.t.text tag add found $index $index+$len\chars .$w.t.text mark set first $index .$w.t.text mark set last "$index + $len chars" .$w.t.text tag add found first last .$w.t.text tag configure found -background blue } else { bell } } proc find w { global variantversion catch {destroy .find} toplevel .find -class Dialog wm title .find "$variantversion: Find in $w" frame .find.top pack .find.top -fill both entry .find.top.e -relief sunken -textvariable searchString checkbutton .find.top.case -variable caseSensitive -text "case sensitive" pack .find.top.e .find.top.case -side left -padx 5 frame .find.bot pack .find.bot -fill both button .find.bot.forward -text "Forward" -underline 0 -width 8 \ -command "TextSearch $w -forwards \$caseSensitive \$searchString" button .find.bot.backward -text "Backward" -underline 0 -width 8 \ -command "TextSearch $w -backwards \$caseSensitive \$searchString" button .find.bot.cancel -text Cancel -command "destroy .find" -width 8 bind .find { .find.bot.forward invoke } bind .find { .find.bot.forward invoke } bind .find { .find.bot.backward invoke } bind .find { .find.bot.backward invoke } pack .find.bot.forward -side left -expand yes -padx 5 -pady 5 pack .find.bot.backward -side left -expand yes -padx 5 -pady 5 pack .find.bot.cancel -side left -expand yes -padx 5 -pady 5 tkwait visibility .find grab .find } set viewOption 0 set viewToBeDefined 0 set viewScout 0 set viewDoNaLD 0 set viewSasami 0 proc edenUpdate {} { global viewOption viewToBeDefined # save the position of the vertical scrollbar set yscroll [lindex [.eden.t.text yview] 0] # dumpeden is a tkeden Tcl command created in EX/ex.c dumpeden [expr $viewOption + 8] $viewToBeDefined .eden.t.text yview moveto $yscroll } # viewOption is called when the Rebuild button is pressed [Ash] proc viewOption {} { global variantversion _tkeden_sasamiAvail catch {destroy .view} toplevel .view -class Dialog wm title .view "$variantversion: View Options" wm transient .view .eden frame .view.left pack .view.left -fill both -side left -expand yes label .view.left.name -justify left \ -text "Highlight to view:\ncontrol-click: individual items,\nshift-click: a range:" pack .view.left.name -side top -fill none -anchor nw scrollbar .view.left.scroll -command ".view.left.list yview" pack .view.left.scroll -side right -fill y listbox .view.left.list -yscroll ".view.left.scroll set" \ -selectmode extended -relief sunken -width 20 -height 20 -setgrid yes pack .view.left.list -side left -fill both -expand yes frame .view.right pack .view.right -side right checkbutton .view.right.yet \ -text "with yet-to-be-defined variables" \ -variable viewToBeDefined checkbutton .view.right.scout \ -text "with translated Scout definitions" \ -variable viewScout checkbutton .view.right.donald \ -text "with translated DoNaLD definitions" \ -variable viewDoNaLD if {$_tkeden_sasamiAvail == "1"} { checkbutton .view.right.sasami \ -text "with translated Sasami definitions" \ -variable viewSasami } button .view.right.all -text "Select All" -width 12 -underline 0 \ -command { .view.left.list selection set 0 end } button .view.right.none -text "Clear All" -width 12 \ -command { .view.left.list selection clear 0 end } frame .view.right.ok -relief sunken -border 1 button .view.right.ok.button -text OK -width 12 \ -command { Review; destroy .view; raise .eden } pack .view.right.ok.button -padx 10 -pady 10 button .view.right.cancel -text Cancel -command "destroy .view" -width 12 pack .view.right.all .view.right.none -side top -padx 5 -pady 5 pack .view.right.yet .view.right.scout .view.right.donald \ -side top -anchor sw if {$_tkeden_sasamiAvail == "1"} { pack .view.right.yet .view.right.sasami -side top -anchor sw } pack .view.right.ok .view.right.cancel -side top -padx 5 -pady 5 bind .view { .view.right.ok.button invoke } bind .view { .view.right.all invoke } bind .view { .view.right.all invoke } # setupViewOptions is a tkeden Tcl command created in EX/ex.c setupViewOptions tkwait visibility .view grab .view } if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { proc selectClients {} { global clientSock sockName clientName variantversion if {[llength $clientSock] <= 0} { tk_dialog .message "$variantversion: Message" "No connected client" warning -1 OK return } else { catch {destroy .select} toplevel .select -class Dialog wm title .select "$variantversion: Select Clients" frame .select.left pack .select.left -fill both -side left -expand yes label .select.left.name -text "Select clients to receive:" pack .select.left.name -side top -fill none -anchor nw scrollbar .select.left.scroll -command ".select.left.list yview" pack .select.left.scroll -side right -fill y listbox .select.left.list -yscroll ".select.left.scroll set" \ -selectmode multiple -relief sunken -width 20 -height 10 -setgrid yes pack .select.left.list -side left -fill both -expand yes frame .select.right pack .select.right -side right # Something may be wrong here - emacs gets the formatting # wrong [Ash] button .select.right.all -text "Select All" -command { .select.left.list selection set 0 end } -width 12 button .select.right.none -text "Clear All" -command { .select.left.list selection clear 0 end } -width 12 button .select.right.ok -text OK -command { global sockName set text [.text get 1.0 end] set selectedClients {} foreach i [.select.left.list curselection] { set currClient [.select.left.list get $i] lappend selectedClients $sockName($currClient) } sendClientsSock $selectedClients $text .text delete 1.0 end destroy .select } -width 12 button .select.right.cancel -text Cancel -command "destroy .select" -width 12 pack .select.right.all .select.right.none -side top -padx 5 -pady 5 pack .select.right.ok .select.right.cancel -side top -padx 5 -pady 5 .select.left.list insert end "Own" foreach wsock $clientSock { # puts $clientName($wsock) .select.left.list insert end $clientName($wsock) } tkwait visibility .select grab .select } } } } # mkDialog w msgArgs list list ... # # Create a dialog box with a message and any number of buttons at # the bottom. # # Arguments: # w - Name to use for new top-level window. # msgArgs - List of arguments to use when creating the message of the # dialog box (e.g. text, justifcation, etc.) # list - A two-element list that describes one of the buttons that # will appear at the bottom of the dialog. The first element # gives the text to be displayed in the button and the second # gives the command to be invoked when the button is invoked. # # @(#) mkDialog.tcl 1.1 94/08/10 15:35:00 proc mkDialog {w msgArgs args} { global variantversion catch {destroy $w} toplevel $w -class Dialog wm title $w "$variantversion: Dialog Box" wm iconname $w "Dialog" # Create two frames in the main window. The top frame will hold the # message and the bottom one will hold the buttons. Arrange them # one above the other, with any extra vertical space split between # them. frame $w.top -relief raised -border 1 frame $w.bot -relief raised -border 1 pack $w.top $w.bot -side top -fill both -expand yes # Create the message widget and arrange for it to be centered in the # top frame. eval message $w.top.msg -justify center $msgArgs pack $w.top.msg -side top -expand yes -padx 3 -pady 3 # Create as many buttons as needed and arrange them from left to right # in the bottom frame. Embed the left button in an additional sunken # frame to indicate that it is the default button, and arrange for that # button to be invoked as the default action for clicks and returns in # the dialog. if {[llength $args] > 0} { set arg [lindex $args 0] frame $w.bot.0 -relief sunken -border 1 pack $w.bot.0 -side left -expand yes -padx 10 -pady 10 button $w.bot.0.button -text [lindex $arg 0] \ -command "[lindex $arg 1]; destroy $w" pack $w.bot.0.button -expand yes -padx 6 -pady 6 bind $w "[lindex $arg 1]; destroy $w" focus $w set i 1 foreach arg [lrange $args 1 end] { button $w.bot.$i -text [lindex $arg 0] \ -command "[lindex $arg 1]; destroy $w" pack $w.bot.$i -side left -expand yes -padx 10 set i [expr $i+1] } } bind $w [list focus $w] focus $w } proc show {w yes} { if $yes { wm deiconify .$w raise .$w case $w { scout {dumpscout} donald {dumpdonald} eden {viewOption} lsd {dumpLSD} } # the lsd above should never be matched in client # or plain tkeden [Ash] } else { wm withdraw .$w } } # Called when the user does %sasami open_display: called from Sasami render.c proc sasamiWindow {width height} { global variantversion toplevel .sasami -width $width -height $height wm title .sasami "$variantversion: Sasami" frame .sasami.f togl .sasami.f.togl -width $width -height $height -double true \ -privatecmap false -depth true -rgba true pack .sasami.f.togl -fill both -expand t pack .sasami.f -fill both -expand t bind .sasami.f.togl {sasamiB %x %y} bind .sasami.f.togl {sasamiB1Motion %x %y} bind .sasami.f.togl {sasamiB %x %y} bind .sasami.f.togl {sasamiB2Motion %x %y} # also allow control-drag: by default, Apple machines have only # one button bind .sasami.f.togl {sasamiB2Motion %x %y} bind .sasami.f.togl {sasamiB %x %y} bind .sasami.f.togl {sasamiB3Motion %x %y} # also allow Apple-drag (Mod1 seems to be the Apple/Command key) bind .sasami.f.togl {sasamiB3Motion %x %y} eden "~sasami_display_open = 1;" } set sasamiOldX 0 set sasamiOldY 0 proc sasamiB { x y } { global sasamiOldX sasamiOldY set sasamiOldX $x set sasamiOldY $y } # This is called when mouse button 1 is pressed and moved in the Sasami # window: rotate about the X & Y axes. proc sasamiB1Motion { x y } { global sasamiOldX sasamiOldY set diffX [expr $x - $sasamiOldX] set diffY [expr $y - $sasamiOldY] #.sasami.f.togl setXrot [expr [sasami_getXrot] - $diffY] #.sasami.f.togl setYrot [expr [sasami_getYrot] - $diffX] #.sasami.f.togl render eden "~sasami_change_camera_rot(-($diffY), -($diffX), 0);" set sasamiOldX $x set sasamiOldY $y } # This is called when mouse button 3 is pressed and moved in the Sasami # window: zoom in and out on the Z axis. proc sasamiB3Motion { x y } { global sasamiOldY set diffY [expr $y - $sasamiOldY] #.sasami.f.togl setZpos [expr [sasami_getZpos] - $diffY] #.sasami.f.togl render eden "~sasami_change_camera_pos(0, 0, -($diffY));" set sasamiOldX $x set sasamiOldY $y } # This is called when mouse button 2 is pressed and moved in the Sasami # window: move camera position X and Y proc sasamiB2Motion { x y } { global sasamiOldX sasamiOldY set diffX [expr $x - $sasamiOldX] set diffY [expr $y - $sasamiOldY] eden "~sasami_change_camera_pos($diffX * 0.01, -($diffY) * 0.01, 0);" set sasamiOldX $x set sasamiOldY $y } proc sasamiWindowClose {} { eden "~sasami_display_open = 0;" destroy .sasami } # If the Img package (PNG etc) is available then load it set haveImg [expr ! [catch {package require Img}]] if {$_tkeden_variant == "dtkeden"} { if {$_dtkeden_isServer} { source $env(TKEDEN_LIB)/server.tcl } else { source $env(TKEDEN_LIB)/client.tcl } } # This causes the text field in the input window to get focus when the # application is double-clicked on the Mac. Unfortunately I can't seem # to get it to grab focus when the app is run from the Terminal. # other things tried... #wm focusmodel . active #raise . #grab set -global . focus .text EDEN-1.66/lib-tkeden-1.66/eden.eden0000644000175000017500000011607010316222110016262 0ustar rboyattrboyatt/* * $Id: eden.eden,v 1.3 2002/07/10 19:29:38 cssbz Exp $ */ /*--------------------------------------------------------------------------- function macro(macro_str, para_str1, para_str2, .., para_strN) Expands 'macro_str' by substituting 'para_strI' for "?I" and returns the resultant string (ref.: Edward Yung, M.Sc. thesis, `89, vol.2). ---------------------------------------------------------------------------*/ func macro { auto i, j, l, m, n, c, s; s = ""; l = (m = $1)#; shift; i = 1; while (i <= l) { for (j = i; j <= l && m[j] != '?'; j++); if (i != j) s = s // substr(m, i, j - 1); if (j <= l) { j++; n = (c = (j > l) ? '?' : m[j]) - '0'; s = s // ((1 <= n && n <= $#) ? $[n] : c); } i = j + 1; } return s; } proc installeddi { include(getenv("TKEDEN_LIB")//"/eddi.eden"); } /* symboldefinition returns the Eden definition of a symbol s in a form that can be given to the Eden parser (via execute(), todo() etc), whatever the type of symbol s. It will return a blank string when asked for the definition of a builtin function (since there is no meaningful Eden code representation of the function). This function is intended to fix problems with the data returned by symboldetail() etc. Pass symboldefinition a string naming the symbol or a pointer to the symbol. [by Ash] */ func symboldefinition { para s; auto sd, ret; /* need to avoid evaluating s if it is a formula -- if we do, then the definition s is symboldefinition("s"); (and other larger examples that include this dependency) will cause "nested too deeply" evaluation loop as the evaluation will cause Eden to evaluate s on demand when it is already being evaluated. Therefore we use 's' as a string reference throughout and avoid using functions that will initiate evaluation if s is a formula. */ /* convert s to a string if it is not already */ if (type(s) == "pointer") s = nameof(s); else if (type(s) != "string") error("address or symbol name needed (got "//type(s)//")"); sd = symboldetail(s); switch (sd[2]) { case "var": /* the `` evaluation that follows is safe because we have determined that s is a RWV, and Eden does not evaluate RWVs on demand */ if (type(`s`) == "string") ret = s // "=\"" // str(`s`) // "\";"; else ret = s // "=" // str(`s`) // ";"; break; case "formula": ret = s // " is" // sd[3]; break; case "proc": ret = "proc " // s // " " // sd[3] // ";"; break; case "procmacro": ret = "procmacro " // s // " " // sd[3] // ";"; break; case "func": ret = "func " // s // " " // sd[3] // ";"; break; case "builtin": case "Real-func": case "C-func": ret = ""; break; } return ret; } /* this copies a proc to a new name. copyproc("rot", "rotnew"); copies the definition of proc rot to proc rotnew. */ proc copyproc { para old, new; execute("proc " // new // " " // symboltext(old) // ";"); } /* this adjusts the definition of a proc so that, when called, the parameters and, optionally, return result are printed. showpara("rot", 1) causes proc rot to show its parameters when called. */ proc showpara { para p, showret; copyproc(p, p // "_preshowpara"); execute(macro(" proc ?1 { auto ret; write(\"?1: \", $, \"...\"); ret=apply(?1_preshowpara, $); if (?2) writeln(ret); else writeln(); return ret; }; ", str(p), str(showret))); } /* Make a real value into an integer with rounding. (by Chris Roe) */ func round { para r; if (r-int(r)>=0.5) return int(r)+1; else return int(r); } /* The following are some eden primitive functions */ /* Chris Roe - May 2002 */ /* Each function has a header comment to explain its usage and an example */ /* max returns the maximum of the parameters it is passed. e.g max(1,2)=2, max(1,2,3,4,5,6) = 6. */ func max { auto result,i,data; if (type($[1])=="list") {data= $[1];} else {data = $;} result = data[1]; for (i=1; i<=data#; i++) { if (data[i]>result) {result = data[i];} } return result; } /* min returns the minimum of the parameters it is passed. e.g min(1,2)=1, min(3,4,5,6) = 3 */ func min { auto result,i,data; if (type($[1])=="list") {data= $[1];} else {data = $;} result = data[1]; for (i=1; i<=data#; i++) { if (data[i]=0) {return num;} else {return -num;} } /* nthroot returns the nth root of the number it is passed and the root it is asked for. e.g nthroot(4,2)=2, nthroot(81,4)=3 */ /* there may be some problems with this .. e.g nthroot(1028,10) should = 2 but actually comes out as 2.0000789 etc */ func nthroot { para num, root; return pow(num,1.0/root); } /* factorial returns the factorial of the number it is passed. Only works with integers.. e.g factorial(4)=24, */ func factorial { para num; auto i,result; if ((type(num)!="int")||(num<0)) {return @;} if (num==0) {return 1;} result = 1; for (i=1; i<=num; i++) { result = result * i; } return result; } /* product returns the product of the parameters it is passed. Only works with numbers... e.g product(2,3)=6, product(4,7,2)= 56 */ func product { auto i,result,data; if (type($[1])=="list") {data= $[1];} else {data = $;} result = 1; for (i=1; i<=data#; i++) { if ((type(data[i])!="int")&&(type(data[i])!="float")) {return @;} result = result * data[i]; } return result; } /* sign returns -1 if the number passed is -ve, 0 if it is 0 and 1 if it is +ve e.g sign(4)=1, sign(-230.2323)= -1 */ func sign { para num; if (num<0) {return -1;} if (num>0) {return 1;} return 0; } /* even returns the nearest even number to the number given. negative numbers are adjusted away from zero. e.g even(4.5)=4, even(5.5)=6*/ func even { para num; /* e.g 4.5 .. int(4.5) = 4, 4%2=0.. so 4 closest even number */ if (int(num) % 2 == 0) {return int(num);} /* otherwise got to be odd and closer to the next even number which will be +1 */ /* use sign for -ve numbers which will have % result of -1.. try writeln(int(-3.2)%2); */ return int(num)+sign(num); } /* even returns the nearest odd number to the number given. negative numbers are adjusted away from zero. e.g odd(4.5)=5, odd(3.5)=3*/ func odd { para num; /* if its closest to an even number, return num+sign(num), i.e the nearest odd */ if (int(num) % 2 == 0) { return int(num)+sign(num); } /* otherwise int is already odd so return that.. */ return int(num); } /* mround returns the number rounded to the nearest multiple.. e.g mround(62,6)=60 */ func mround { para num,multiple; /* need to force floating point division */ return sign(num)*round(float(abs(num))/multiple)*multiple; } /* sumsq returns the sum of the squares of the parameters passed to it, e.g sumsq(2,3,4) = 29 */ func sumsq { auto i, result,data; if (type($[1])=="list") {data= $[1];} else {data = $;} result = 0; for (i=1; i<=data#; i++) { if ((type(data[i])!="int")&&(type(data[i])!="float")) {return @;} result = result + (data[i]*data[i]); } return result; } /* trunc returns the number with the fractional part removed. this is the same as the int function in eden - included for completeness.. e.g trunc(4.56)=4 */ func trunc { return int($[1]); } /* combin returns the number of ways n items can be picked from a total number of items. the n cannot be more than the total.. e.g combin(4,2)=6 */ func combin { para total,n; if (n>total) {return @;} return factorial(total)/(factorial(n)*factorial(total-n)); } /* ceiling returns the number rounded *up* to the nearest multiple of significance, e.g ceiling(62,6)=66 */ func ceiling { para num, multiple; /* i.e the case that matches mround() */ if (mround(num,multiple)>=((float(num)/multiple)*multiple)) { return mround(num,multiple); } /* otherwise if mround rounds down, add the multiple to it */ return mround(num,multiple)+multiple; } /* floor returns the number rounded *down* to the nearest multiple of significance, e.g floor(64,6)=60 */ func floor { para num, multiple; /* i.e the case that matches mround() */ if (mround(num,multiple)<=((num/multiple)*multiple)) { return mround(num,multiple); } /* otherwise if mround rounds down, add the multiple to it */ return mround(num,multiple)-multiple; } /* degrees takes an angle in radians and converts it to degrees, e.g degrees(PI)=180 */ func degrees { para angleinradians; return (angleinradians * (180/PI)) - (trunc((angleinradians * (180/PI))/360)*360) ; } /* radians takes an angle in degrees and converts it to radians, e.g radians(180)=3.14 etc */ /*NOTE - see degrees for implementational issue */ func radians { para angleindegrees; return (angleindegrees / (180/PI)) - (trunc((angleindegrees / ((180/PI))/(2*PI)))*(2*PI)); } /* rounddigits takes a number and rounds it to the number of digits specified.. e.g round(123,2) = 120, round(123,1) = 100, round(123.232,4)=123.2 */ func rounddigits { para num,digits; auto intpart,fracpart,numdigits; auto negative; negative = sign(num); if (sign(num)==-1) {num = -num;} intpart = int(num); fracpart = num-int(num); numintdigits = ceiling(log10(num),1); /* no fractional part - and more digits specified than in num, e.g round(123,4)=123 */ if ((fracpart==0)&&(pow(10,digits-1)>num)) {return num*negative;} /* if the number has a fractional part but the number of digits required is less than this, i.e rounddigits(123.56767,2) we can ignore the fraction. Note that we cannot ignore the fraction if the same.. e.g rounddigits(123.8,3)=129... */ if (ceiling(log10(num),1)>digits) {num = int(num);} if ((pow(10,digits-1) <= num) ) { /*i.e we are returning an integer */ if ((num % (int(pow(10,numintdigits-digits)))) < (pow(10,numintdigits-digits)/2)) { /* pow and % used to return the values */ return (num - num % (int(pow(10,numintdigits-digits))))*negative; } else { return (num - num % (int(pow(10,numintdigits-digits))) + pow(10,numintdigits-digits))*negative; } } /* otherwise we've got a real number to deal with */ /* sorts out case when e.g rounddigits(123.8,3) or rounddigits(1234.4,4).. */ if (ceiling(log10(num),1)==digits) {return round(num)*negative;} /* otherwise the answer will also be a real number and we have a real number.. */ return (intpart +round(fracpart*pow(10,digits-numintdigits))* (pow(10,-(digits-numintdigits))))*negative; } /* more eden primitive functions - 2nd may 2002, chris roe */ /* gcd takes numeric parameters and returns their greatest common divisor. any number of numbers can be passed.. e.g gcd(2,6)=2, gcd(6,9,24)=3, gcd(3,7,24,28)=1 */ func gcd { auto n1,n2,data,temp; if (type($[1])=="list") {data = $[1];} else {data = $;} while (data#>2) { temp = gcd(data[1],data[2]); data[2] = temp; delete data,1; } n1 = data[1]; n2 = data[2]; /* now have 2 numbers.. n1 & n2.. can compute gcd directly */ /* use euclid's algorithm.. */ r = 1; while (r>0) { /* ensure n1>n2 by swapping if neccessary */ if (n2>n1) {temp = n2; n2 = n1; n1 = temp;} r = n1 % n2; if (r==0) {return n2;} n1 = r; } return min(n1,n2); } /* lcm takes numeric parameters and returns the lowest common multiple of them.. e.g lcm(8,12)=24, lcm(4,6,8)=24. Note - use the fact that gcd(a,b)*lcm(a,b)=a*b for all a and b integers... see maths textbook for a proof!! */ func lcm { auto n1,n2,data,temp; if (type($[1])=="list") {data = $[1];} else {data = $;} while (data#>2) { temp = lcm(data[1],data[2]); data[2] = temp; delete data,1; } n1 = data[1]; n2 = data[2]; /* now assume have 2 numbers, n1 & n2.. can compute lcm directly */ return (n1*n2)/gcd(n1,n2); } /* variance takes and calculates the variance, i.e the sum of the deviations between each element and the mean divided by the number of data points. It can cope with either a number of numeric parameters passed to it, or a list containing numbers... e.g variance(23,34,46,2343) or variance(b) where b=[432,43,56,78] etc */ func variance { auto avg,data,i,result; if (type($[1])=="list") {data = $[1];} else {data = $;} /* data now contains a list of numbers */ avg = average(data); result = 0; for (i=1; i<=data#; i++) { result = result + ((data[i]-avg)*(data[i]-avg)); } return float(result) / data#; } /* stdev takes a list of numbers or numeric parameters and returns the standard deviation, or the square root of the variance... e.g stdev(23,45,67) or stdev(b) where b=[3,4,5,9] */ func stdev { auto data; if (type($[1])=="list") {data = $[1];} else {data = $;} return sqrt(variance(data)); } /* given a list of numbers, sorts them into ascending or descending order... */ /* uses bubble sort! improve sorting algorithm... */ /* 1 = ascending, 2 = descending */ func sort { para l,dir; auto i,j,result,temp,swap,ascending,descending; ascending = 1; descending = 2; swap = 1; while (swap>0) { swap = 0; for (i=1; i<=l#-1; i++) { if ( ((dir==ascending)&&(l[i]>l[i+1])) || ((dir==descending)&&(l[i]255)||(greenval>255)||(blueval>255)) error("colour out of range"); /* round to nearest integer - need to have each component as a strict 2 +character length hex number - can't deal with real numbers directly, and don't need to? */ redval = round(redval); greenval = round(greenval); blueval = round(blueval); /* use the c func to get the string back */ s = ""; sprintf(s,"#%02x%02x%02x",redval,greenval,blueval); return s; } /* English spelling of rgb2color */ func rgb2colour { return apply(rgb2color, $); } /* Install the Arca notation */ proc installarca { include(getenv("TKEDEN_LIB")//"/arca.eden"); /* I haven't decided the best way to set this up to distribute it to the PC platform etc. [Ash, August 2002] */ installIPTrans("%arca", "/dcs/emp/empublic/bin/arca.trans"); } /* Install the Eden Symbol Lists notation */ proc installedensl { include(getenv("TKEDEN_LIB")//"/edensl.eden"); } /* Install the Denota notation */ proc installdenota { auto d; d = cwd(); /* store the current working directory so we can restore it */ cd("/dcs/emp/empublic/projects/denotaMeziani1987/lib"); include("init.e"); cd(d); installIPTrans("%denota", "/dcs/emp/empublic/bin/denota"); } /* notations is a list of lists holding parameters required to implement any notations using translators. notations holds one list per notation. Each sublist contains three elements: 1: name of the notation (including initial '%' character) 2: pointer to the procedure to call when the user switches to this notation. No arguments are provided when this procedure is called, but it may use the value of currentNotation to determine which notation is in effect if this procedure is serving more than one notation, for example. 3: pointer to the procedure to call when the user provides input in this notation. This "parseChar" procedure is called once for each character provided, with the char as the sole argument. This procedure is called one character at a time so that it can implement any necessary form of blocking (eg parse one line at a time, or parse one statement at a time, where statements are ended with a ';'). currentNotation is an index into notations, or -1 meaning that the current notation is implemented in some other way. */ notations = []; eden_debug_notations = 0; /* newNotation: call this with three parameters to install a new notation or redefine an existing one. Parameters are: name: name of the new or existing notation, starting with the '%' character switchProcPtr: a pointer to the procedure to call when the user switches to this notation. transProcPtr: a pointer to the procedure to call when the user provides input in this notation. (see the comment for the "notations" list for more detail). Returns the index into the notations list for this notation. */ proc newNotation { para name, switchProcPtr, transProcPtr; auto i, si; if (name[1] != '%') error("notation names must start with %"); si = -1; /* searching index */ for (i = 1; i <= notations#; i++) { if (name == notations[i][1]) { si = i; break; } } if (si == -1) { /* a new notation: add a dummy entry which will be overwritten below */ append notations, [1, 2, 3]; si = notations#; /* add a radio button for the new notation, but not in ttyeden */ if (tcl != @) tcl("addNotationRadioButton " // substr(name, 2, name#)); } notations[si][1] = name; notations[si][2] = switchProcPtr; notations[si][3] = transProcPtr; return si; } currentNotation = -1; /* notationSwitch: is called when the current notation is changed using the % notation. This is passed the string starting % which describes the new notation. It should return 1 if the new notation is recognised and can be interpreted, 0 otherwise. This is called on every notation change, so the end of a block of script in a certain notation can be detected by the call to notationSwitch into the next notation at the end. */ proc notationSwitch { para name; auto found, i; currentNotation = -1; for (i = 1; i <= notations#; i++) { if (name == notations[i][1]) { currentNotation = i; /* call setup procedure */ (*(notations[i][2]))(); break; } } if (eden_debug_notations) writeln("notationSwitch " // name // " = " // str(currentNotation)); return (currentNotation != -1); } /* notationStack: Eden's execute() and include() commands cause the Eden interpreter to interpret a string. The string may contain a notation switch command, but after the string has been interpreted, the notation context is expected to be restored. I originally thought that the C "entryStack" structure in main.c was handling this, but that code seems to be doing something more complex. So, here, I represent the stack of interpreter notation contexts in an Eden list. Each element is an index into the notations list. The buffers of the current parser are not stored and restored. This means that: 1) a parser cannot reenter itself during a call to its "parseChar" function by using execute("%self\nstuff") or by include()-ing a file which contains code written in the notation implemented by the parser. 2) buffers should not be shared between notations. Note the implementation of the IP translator below, which holds a list of buffers, one for each notation implemented. Note the AOP translator will probably not cope with a reentrant call as it uses only one buffer (meaning that AOP-implemented notations cannot be used within the implementation of another AOP notation). */ notationStack = []; /* notationPushPop: is called just before and just after another instance of the Eden interpreter is started during a call to execute() or include(). The procedure needs to push the current notation context onto the notationStack just before the call, and pop it off just after, and notationPushPop is passed "1" or "-1" to indicate whether we are just before or just after respectively. */ proc notationPushPop { para direction; switch (direction) { case "1": insert notationStack, 1, currentNotation; if (eden_debug_notations) writeln("notationPushPop: PUSH " // str(currentNotation) // " NOW " // str(notationStack)); break; case "-1": if (notationStack# <= 0) error("can't pop an empty notationStack"); currentNotation = notationStack[1]; delete notationStack, 1; if (eden_debug_notations) writeln("notationPushPop: POP " // str(currentNotation) // " NOW " // str(notationStack)); break; default: error("bad direction " // direction // " passed to notationPushPop"); } } /* notationGet: called to obtain the name (including %) of the current notation, for use in the prompt. */ func notationGet { if ((currentNotation == -1) || (currentNotation > notations#)) error("notationGet called when currentNotation is not set sensibly (" // str(currentNotation) // ")"); return notations[currentNotation][1]; } /* notationChar: when a recognised notation is being interpreted (after notationSwitch has returned 1), this is given the script text, one character at a time. It should interpret the text, possibly maintain internal state, and use "execute" to create Eden state. */ proc notationChar { para c; auto i; if (eden_debug_notations) writeln("notationChar " // c // " (currentNotation = " // str(currentNotation) // ")"); if ((currentNotation == -1) || (currentNotation > notations#)) error("notationChar called when currentNotation is not set sensibly (" // str(currentNotation) // ")"); /* call the current notation's parseChar procedure */ (*(notations[currentNotation][3]))(c); } /* IP (Interactive Process) -based translators */ /* the indexes in iptfds and iptbufs should correspond to the notations list, so blank entries will be required if there are non-IP notations present. */ iptfds = []; iptbufs = []; proc ipTransSwitch { /* this should actually be unnecessary as it isn't possible to change notations without using a line feed, and so the previous ipParseChar should have cleared the buffer already. We'll do it for safety anyway. */ iptbufs[currentNotation] = ""; } proc ipTransParseChar { para c; auto l, r, w, e; if ((currentNotation < 1) || (currentNotation > iptfds#)) error("ipParseChar called when a non-IP notation is in effect"); l = iptfds[currentNotation]; if (l# != 3) error("wrong number of fds in iptfds for " // notations[currentNotation] // " notation " // "- was the IP translator opened?"); r = l[1]; w = l[2]; e = l[3]; iptbufs[currentNotation] = iptbufs[currentNotation] // c; if (c == '\n') { rawwrite(w, iptbufs[currentNotation]); out = ""; /* have to pause for a short while even if there appears to be no input as the concurrent translator might just be being slow -- there is no way of telling when the current input has finished (hand shaking) in this simple scheme */ while (fdready(r, 'r', [1, 0])) { out = out // rawread(r, 255); } if (fdready(e, 'r', [0, 0])) { error("<" // rawread(e, 255) // ">"); } if (eden_debug_notations) writeln("<" // notations[currentNotation][1] // ": " // out // ">"); execute(out); iptbufs[currentNotation] = ""; } } /* installIPTrans: call this to install an Interactive Process -based translator. Two arguments are required: name: name of the new notation, starting with the '%' character. This procedure should be able to cope with a change to an existing ip-based translator, but I doubt it does correctly at present. path: complete path to the external translator program which will be started up as a concurrent interactive process. User input in this new notation will be given to stdin of the process. Output from the process on stdout should be Eden code, which will be execute()'d. Output from the process on stderr is assumed to be an error message, which will have the same effect as normal errors. */ proc installIPTrans { para name, path; auto ni; ni = newNotation(name, &ipTransSwitch, &ipTransParseChar); while (ni > iptfds#) append iptfds, ""; while (ni > iptbufs#) append iptbufs, ""; iptfds[ni] = ipopen(path, basename(path)); iptbufs[ni] = ""; } /* Agent-oriented parser (AOP) */ include(getenv("TKEDEN_LIB")//"/aop.eden"); /* remove a radio button for the new notation, but not in ttyeden. Pass the name of a notation, including the initial % character. */ proc removeNotationRadioButton { para name; if (name[1] != '%') error("removeNotationRadioButton should be passed a string starting with %"); if (tcl != @) tcl("removeNotationRadioButton " // substr(name, 2, name#)); } /* FALSE and TRUE were originally part of donald.eden, but people expect them to be a part of Eden... */ FALSE = 0; TRUE = 1; /* Public */ eden_debug_edenclocks = 0; /* Private: list of tokens returned from createtimer. A token with index i in this list is associated with edenclocks[i]. */ edenclocktokens = []; /* Private: list of absolute real times when each edenclock was called. Only used if eden_debug_edenclocks=1, in order to show real clock times */ edenclockftimes = []; /* Private: this is called to start timer events for a particular edenclock and it schedules itself to be called again at the appropriate time (when it will then reschedule itself again). clockPtr parameter is a pointer to an edenclock variable, the timing details of which should exist in the edenclocks list. Eg if this is passed &b, edenclocks should contain (eg) the tuple [&b, 200]. The parameter is the name rather than an index into the edenclocks list as the edenclocks list may have had additions/deletions (changing indices) by the time this proc gets to see it. */ proc edenclock { para clockPtr; auto i, fi, ft, millis, t; if (($# != 1) || (type($1) != "pointer")) error("edenclock (internal) requires a single, pointer argument"); fi = 0; /* "found index" */ for (i = 1; i <= edenclocks#; i++) { if (edenclocks[i][1] == clockPtr) fi = i; } if (fi == 0) { /* can't locate the clockPtr in the edenclocks list: just silently ignore this since presumably it was just removed. */ return; } millis = edenclocks[fi][2]; if (millis == @) { /* This is the @ 'pause' case. Don't increment the edenclock variable and don't reschedule this proc. */ return; } /* increment the edenclock variable */ t = type(*clockPtr); if (t != "int") { edenclocks[fi][2] = @; error("edenclock variable " // nameof(clockPtr) // " must be type int," // "but is type " // t // "." // " Paused " // nameof(clockPtr) // " edenclock."); } else { (*clockPtr)++; } if (eden_debug_edenclocks) { ft = ftime(); write("edenclock: inc " // str(clockPtr) // ": now " // str(*clockPtr) // " after " // str((ft[1] - edenclockftimes[fi][1]) * 1000 + (ft[2] - edenclockftimes[fi][2])) // " millis," // " scheduling in " // str(millis)); edenclockftimes[fi] = ft; } /* Arrange for this proc to be called again. */ if (millis == 0) { /* This is the 0 'as fast as possible' case. The Tcl timers don't seem to produce the behaviour we want when a timing of 0 is given (and thus the C builtin prevents us from choosing this case). Instead, reschedule this proc to be called as soon as possible (ie timing not related to real time) using todo(). */ todo("edenclock(&" // nameof(clockPtr) // ");"); if (eden_debug_edenclocks) writeln(" token n/a"); } else { /* Reschedule this proc to be called after 'millis' milliseconds. Record the timer token so that the timer event can be cancelled by edenclocksUpdateTimers if necessary. */ if (createtimer == @) error("createtimer is not defined (expecting a built-in): if this" // " is ttyeden, edenclocks are not available there presently"); edenclocktokens[fi] = createtimer("edenclock(&" // nameof(clockPtr) // ");", millis); if (eden_debug_edenclocks) writeln(" token " // str(edenclocktokens[fi])); } } /* Private: previous value of edenclocks -- used to detect specific changes to edenclocks */ edenclocksold = @; /* Public: List of tuples describing integer variables that should be automatically incremented at a given time interval. Each element in the edenclocks list is itself a list, in the form [clockPtr, millis]. 'clockPtr' should be a pointer to an integer variable which will then be incremented every 'millis' milliseconds. There are two possible special values for 'millis': @ - "pause" this clock: don't increment. Enables a record of a clock variable to be left in the edenclocks list but temporarily disabled. 0 - increment this clock as fast as possible. This enables the commonly used pattern 'proc p { foo(); todo("p();"); }' to become 'proc p : tick { foo(); }; startedenclock(&tick, 0);'. Eg: 'edenclocks=[[&a, 1000], [&b, 2500], [&tick, 0]];' causes 'a' to be incremented once per second, 'b' to be incremented every 2.5 seconds, and 'tick' to be incremented as fast as possible. The edenclocks list can be changed manually or by using the startedenclock and stopedenclock helper procs provided. */ edenclocks = @; /* Private: implement the automated timed changes required by the edenclocks list. This procedure must look for /changes/ to the edenclocks list and set up and remove timers appropriately. */ proc edenclocksUpdateTimers : edenclocks { auto newi, oldi, exists; if ($# != 0) error("edenclocksUpdateTimers (internal) requires zero arguments"); if (edenclocks == @) return; /* Iterate through sorted versions of new and old edenclocks lists to determine additions and deletions of tuples and changes to 'millis' values (NB a change to a clockPtr value constitutes a deletion and an addition). There might be a cleverer, more efficient way to do this that doesn't involve iterating through the old and new lists twice, but I don't have the brains for that right now... and this is only called quite rarely -- only when someone changes the timer setup, not on each timer event. */ /* Look for additions by looking for each current item in the old list. */ for (newi = 1; newi <= edenclocks#; newi++) { /* does new[i] exist in old? */ exists = 0; for (oldi = 1; oldi <= edenclocksold#; oldi++) { if (edenclocks[newi][1] == edenclocksold[oldi][1]) { exists = 1; break; } } if (exists) { /* new[i] exists in old -- NO ADDITION OR DELETION to this tuple (but possibly a move of index): deal with possible change to 'millis' value */ if (eden_debug_edenclocks) write("no addition/deletion of " // str(edenclocks[newi][1]) // ":"); if (edenclocks[newi][2] == edenclocksold[oldi][2]) { /* The value of 'millis' has not changed -- do nothing */ if (eden_debug_edenclocks) writeln(" 'millis' remain at " // str(edenclocks[newi][2])); } else { /* CHANGE to 'millis': remove old timer, then start a new timer with the new 'millis' value. The @ 'pause' and 0 'as fast as possible' cases will be handled by the edenclock proc. */ if (eden_debug_edenclocks) writeln(" 'millis' changed to " // str(edenclocks[newi][2])); if (edenclocksold[oldi][2] == 0) { /* 'millis' was 0: there is no timer event scheduled for this eden clock at the moment, but there is still an edenclock(thisClockPtr) on the todo queue. Don't call edenclock again here because this will start another instance of it and we'll end up with two instances of edenclock(thisClockPtr) running together. Instead, let the existing instance in the todo() queue reschedule itself with the new value of 'millis' when it executes in the next RunSet. Ie, do nothing. */ if (eden_debug_edenclocks) writeln("millis was 0"); } else { if (eden_debug_edenclocks) writeln("removing timer token " // str(edenclocktokens[oldi])); deletetimer(edenclocktokens[oldi]); edenclock(edenclocks[newi][1]); } } } else { /* new[i] does not exist in old -- ADDITION of new[i] */ if (eden_debug_edenclocks) writeln("addition of " // str(edenclocks[newi][1])); /* insert placeholders for the token and (only used when eden_debug_edenclocks=1) ftime value so that the indices of these lists correspond with the edenclocks list: edenclock will overwrite with values */ insert edenclocktokens, newi, @; insert edenclockftimes, newi, ftime(); /* initialise the clock value to 0 if it hasn't been given a value yet */ if ((*(edenclocks[newi][1])) == @) (*(edenclocks[newi][1])) = 0; /* Start timer. The @ 'pause' and 0 'as fast as possible' cases will be handled by the edenclock proc. */ edenclock(edenclocks[newi][1]); } } /* Look for deletions by looking for each old item in the current list. Must look from end of list towards beginning as we are using the 'delete' command below, which causes indexes of elements /after/ the deletion to be invalid... this is important if more than one edenclock is removed simultaneously, eg a change from edenclocks=[[&a,1000],[&b,2000]]; to edenclocks=[]; */ for (oldi = edenclocksold#; oldi >= 1; oldi--) { /* does old[i] exist in new? */ exists = 0; for (newi = 1; newi <= edenclocks#; newi++) { if (edenclocksold[oldi][1] == edenclocks[newi][1]) { exists = 1; break; } } if (exists) { /* old[i] exists in new -- NO ADDITION OR DELETION: but this case is dealt with above: do nothing*/ } else { /* old[i] does not exist in new -- DELETION of old[i] */ if (eden_debug_edenclocks) writeln("deletion of " // str(edenclocksold[oldi][1])); /* stop timer */ deletetimer(edenclocktokens[oldi]); /* keep edenclocktokens and edenftimes lists consistent with edenclocks list */ delete edenclocktokens, oldi; delete edenclockftimes, oldi; } } edenclocksold = edenclocks; } /* Public: A helper procedure for introducing a new edenclock or modifying an existing one. */ proc setedenclock { para clockPtr, millis; auto i, fi; if ($# != 2) error("two arguments required for setedenclock: got " // str($#)); if (type(clockPtr) != "pointer") error("first argument for setedenclock must be a pointer: got " // type(clockPtr)); if ((type(millis) != "int") && (millis != @)) error("second argument for setedenclock must be an integer or undefined:" // " got " // type(millis)); if (edenclocks == @) edenclocks = []; fi = 0; /* "found index" */ for (i = 1; i <= edenclocks#; i++) { if (edenclocks[i][1] == clockPtr) fi = i; } if (fi == 0) { /* this edenclock doesn't exist already: add it */ append edenclocks, [clockPtr, millis]; } else { /* this edenclock already exists: modify it */ edenclocks[fi] = [clockPtr, millis]; } } /* Public: A helper procedure for removing an existing edenclock */ proc removeedenclock { para clockPtr; auto i, fi; if ($# != 1) error("single argument for removeedenclock required: got " // str($#)); if (type(clockPtr) != "pointer") error("first argument for removeedenclock must be a pointer: got " // type(clockPtr)); fi = 0; /* "found index" */ for (i = 1; i <= edenclocks#; i++) { if (edenclocks[i][1] == clockPtr) fi = i; } if (fi == 0) error("can't locate " // str(clockPtr) // " in edenclocks list"); delete edenclocks, fi; } /* Private */ edenclocksprepause = []; /* Public: Temporarily pause all edenclocks */ proc pauseedenclocks { auto i; if ($# != 0) error("zero arguments required for pauseedenclocks: got " // str($#)); edenclocksprepause = edenclocks; for (i = 1; i <= edenclocks#; i++) { edenclocks[i][2] = @; } } /* Public: Continue after having paused edenclocks. (Note that each clock will be restarted at roughly the same instant so the phase relationships between each will not be the same as before the pause.) */ proc unpauseedenclocks { if ($# != 0) error("zero arguments required for unpauseedenclocks: got " // str($#)); edenclocks = edenclocksprepause; } /* Private: This is called after the Interrupt button / ctrl-c is pressed. */ proc edeninterrupted { /* Could just say 'edenclocks=[];' but want to handle this without invoking edenclocksUpdateTimers to simplify things as much as possible. */ writeln("edeninterrupted: deleting all timers -- use unpauseedenclocks() to restore"); deletealltimers(); edenclocksprepause = edenclocks; edenclocksold = @; edenclocks = @; if (type(edeninterruptedhook) == "proc") edeninterruptedhook(); } /* Public: If you are writing a model and want something to happen after the Interrupt button / ctrl-c are pressed, write a procedure named 'edeninterruptedhook' and it will be called by 'edeninterrupted' (which should not be modified by models) in this case. */ ##proc edeninterruptedhook { ##} /* ** An observable that controls the text size in the input window. [Karl] */ tkeden_textsize=10; proc tkeden_textsize_trigger : tkeden_textsize { tcl("font configure edencode -size "//str(tkeden_textsize)); } EDEN-1.66/lib-tkeden-1.66/sasami.eden0000644000175000017500000000652510243105157016641 0ustar rboyattrboyatt/* * $Id$ */ /* sasami.eden */ sasami_display_open = 0; sasami_camera_rotthentrans = 0; proc sasami_camera_reset { /* stored as lists to enable simultaneous atomic access to all 3 elements */ sasami_camera_pos = [0, 0, -30]; sasami_camera_rot = [0, 0, 0]; sasami_camera_scale = [10, 10, 10]; sasami_camera_frustum_left = -1; sasami_camera_frustum_right = 1; /* hack: I haven't exposed the viewport size as Eden variables yet */ sasami_camera_frustum_bottom = -(640/480); /* don't know why in integer */ sasami_camera_frustum_top = 640/480; /* apparently this mustn't be set too small or the Z buffer resolution starts to go */ sasami_camera_frustum_near = 10.0; sasami_camera_frustum_far = 40000.0; } sasami_camera_reset(); proc sasami_propagate_camera_pos : sasami_camera_pos { if (~sasami_display_open) { tcl(".sasami.f.togl setXpos " // str(sasami_camera_pos[1])); tcl(".sasami.f.togl setYpos " // str(sasami_camera_pos[2])); tcl(".sasami.f.togl setZpos " // str(sasami_camera_pos[3])); } } proc sasami_propagate_camera_rot : sasami_camera_rot { if (~sasami_display_open) { tcl(".sasami.f.togl setXrot " // str(sasami_camera_rot[1])); tcl(".sasami.f.togl setYrot " // str(sasami_camera_rot[2])); tcl(".sasami.f.togl setZrot " // str(sasami_camera_rot[3])); } } proc sasami_progagate_camera_scale : sasami_camera_scale { if (~sasami_display_open) { tcl(".sasami.f.togl setXscale " // str(sasami_camera_scale[1])); tcl(".sasami.f.togl setYscale " // str(sasami_camera_scale[2])); tcl(".sasami.f.togl setZscale " // str(sasami_camera_scale[3])); } } proc sasami_propagate_camera_rotthentrans : sasami_camera_rotthentrans { if (~sasami_display_open) { tcl(".sasami.f.togl setRotThenTrans " // str(sasami_camera_rotthentrans)); } } sasami_camera is [sasami_camera_pos, sasami_camera_rot, sasami_camera_scale, sasami_camera_rotthentrans]; proc sasami_render : sasami_camera { if (~sasami_display_open) tcl(".sasami.f.togl render"); } sasami_camera_frustum is [sasami_camera_frustum_left, sasami_camera_frustum_right, sasami_camera_frustum_bottom, sasami_camera_frustum_top, sasami_camera_frustum_near, sasami_camera_frustum_far]; proc sasami_propagate_camera_frustum : sasami_camera_frustum { if (~sasami_display_open) { tcl(".sasami.f.togl setFrustumLeft " // str(sasami_camera_frustum_left)); tcl(".sasami.f.togl setFrustumRight " // str(sasami_camera_frustum_right)); tcl(".sasami.f.togl setFrustumBottom " // str(sasami_camera_frustum_bottom)); tcl(".sasami.f.togl setFrustumTop " // str(sasami_camera_frustum_top)); tcl(".sasami.f.togl setFrustumNear " // str(sasami_camera_frustum_near)); tcl(".sasami.f.togl setFrustumFar " // str(sasami_camera_frustum_far)); tcl(".sasami.f.togl render"); } } /* Convenience procedures for use by Tcl */ proc sasami_change_camera_pos { ~sasami_camera_pos = [sasami_camera_pos[1] + $1, sasami_camera_pos[2] + $2, sasami_camera_pos[3] + $3]; } proc sasami_change_camera_rot { ~sasami_camera_rot = [sasami_camera_rot[1] + $1, sasami_camera_rot[2] + $2, sasami_camera_rot[3] + $3]; } EDEN-1.66/lib-tkeden-1.66/server.tcl0000644000175000017500000002057510256063274016551 0ustar rboyattrboyatt# # $Id: server.tcl,v 1.5 2001/08/01 18:00:40 cssbz Exp $ # # Just the server specific bits of tcl. This is sourced when appropriate # from edenio.tcl [Ash] set dtkedendebugtcl 0 # Client-Server & Socket # display the message of client connection on client window proc appendWindows {win text} { $win config -state normal $win insert end $text $win see end $win config -state disabled } # display the scripts sent by client on client window # send scripts to each client proc sendClientsSock {wsock msg} { global EOF clientsReply EOS synchronize dtkedendebugtcl if ($dtkedendebugtcl) { puts "server sendClientsSock msg $msg\n" } foreach sock $wsock { if {$sock == "Own"} { appendHist "$msg\n" evaluate "$msg\n" } else { # puts "test$sock" #if {$synchronize > 0} { # comment it due to the possibility of dead-lock # don't change the name of synchronize which comes from Eden/main.server.c # incr clientsReply -1 # puts $sock "$msg\n$EOS" puts $sock "$msg\n$EOF" #} else {puts $sock "$msg\n$EOF"} } } #if {$synchronize > 0} { # comment it due to the possibility of dead-lock # while {$clientsReply < 0} { # vwait clientsReply # } #} } proc sendOtherClients {exceptUsr msg} { #Don't change procedure's name which is connected to C programs of Eden. global clientSock sockName dtkedendebugtcl if ($dtkedendebugtcl) { puts "server sendOtherClients msg $msg\n" } if {[llength $clientSock] != 0 } { set otherClients $clientSock if {[llength $exceptUsr] != 0 && [info exists sockName($exceptUsr)]} { set exceptClient [lsearch $clientSock $sockName($exceptUsr)] if {$exceptClient >= 0 } { set otherClients [lreplace $clientSock $exceptClient $exceptClient] } } sendClientsSock $otherClients $msg } } proc sendClient {wusr msg} { #Don't change procedure's name which is connected to C programs of Eden. global sockName dtkedendebugtcl if ($dtkedendebugtcl) { puts "server sendClient msg $msg\n" } if {[info exists sockName($wusr)]} { sendClientsSock \{$sockName($wusr)\} $msg } } # read scripts from tkeden input window and send them to each client proc sendScripts {} { global clientSock dtkedendebugtcl set text [.text get 1.0 end] # .menu.accept invoke # puts "send $text" if ($dtkedendebugtcl) { puts "server sendScripts text $text\n" } sendClientsSock $clientSock $text } # read each definition into send window until EOF is found and then # send all to each client proc doService {sock addr msg} { global EOF EOU clientSock proType clientName sockName receivedMessage global oldNotation oldAgentName oldAgentType global EOS clientsReply synchronize ECS serverJobID JOBID set msg [string trimright $msg] if {$msg == "" || $msg == "\n"} return set msg1 [string rang $msg 0 10] if {$msg1 == $EOS} { #if {$synchronize > 0} {incr clientsReply} return } if {$msg1 != $EOF && $msg1 !=$EOU && $msg1 != $ECS} { append receivedMessage($sock) "$msg\n" return } if {$msg1 == $EOU} { ;# agent's name input by a client set loginClientName [string rang $msg 11 end] # getOldNotation # if {[llength $clientSock] == 0} { # evaluate ">>\n%eden\nCLIENT_LIST = \[\];\n$oldAgentType$oldAgentName\n$oldNotation\n" # } CLIENT_LIST has been declared in Scout.init.e */ evaluate ">>\n%eden\nappend CLIENT_LIST, \"$loginClientName\";\n$oldAgentType$oldAgentName\n$oldNotation\n" lappend clientSock $sock set clientName($sock) $loginClientName set sockName($loginClientName) $sock set receivedMessage($sock) "" return } set text $receivedMessage($sock) set sendClientName $clientName($sock) if {$msg1 == $EOF || $msg1 == $ECS} { if {$proType == "2" || $proType == "0"} { # getOldNotation incr JOBID appendHist ">~$sendClientName\n" appendHist $text appendHist "$oldAgentType$oldAgentName\n" appendHist "$oldNotation\n" # cannot change oldNotation, oldAgentType & oldAgentName. it comes from EX/EXinit(). # puts ">~$sendClientName\n$text\n%eden\ntcl(\"setServerJobID $JOBID\");\n$oldAgentType$oldAgentName\n$oldNotation\n" evaluate ">~$sendClientName\n$text\n%eden\ntcl(\"setServerJobID $JOBID\");\n$oldAgentType$oldAgentName\n$oldNotation\n" if {$proType == "2"} { set otherClients $clientSock set delClient [lsearch $clientSock $sock] if {$delClient >= 0 } { set otherClients [lreplace $clientSock $delClient $delClient] } sendClientsSock $otherClients $text } } elseif {$proType == "1" } { set text ">>$sendClientName\n$text\n>>\n" .text insert end $text } elseif {$proType == "3" } { set text ">>$sendClientName\n$text\n>>\n" # puts $text # getOldNotation appendHist $text evaluate "$text\n$oldAgentType$oldAgentName\n$oldNotation\n"; # cannot change oldNotation. it comes from EX/EXinit(). } if {$msg1 == $ECS} { #puts "5000" #after 50000 # slow down client's speed to let server do service #puts "$serverJobID $JOBID" while {$serverJobID != $JOBID} { vwait serverJobID } puts $sockName($sendClientName) $ECS } set receivedMessage($sock) "" return } } # Handles the input from the client and client shutdown proc svcHandler {sock addr} { global clientSock clientName sockName receivedMessage global oldNotation oldAgentName oldAgentType set msg [gets $sock] ;# get the client packet if {[eof $sock]} { ;# client gone or finished appendWindows .client.t.text "[fconfigure $sock -peername] disconnected \ at [clock format [clock seconds]]\n" close $sock ;# release the servers client channel set delClient [lsearch $clientSock $sock] if {$delClient >= 0 } { set clientSock [lreplace $clientSock $delClient $delClient] # getOldNotation evaluate ">>\n%eden\ndelete CLIENT_LIST, $delClient+1;\ \n$oldAgentType$oldAgentName\n$oldNotation\n" unset sockName($clientName($sock)) unset clientName($sock) unset receivedMessage($sock) } } else { doService $sock $addr $msg } } proc setServerJobID { value } { global serverJobID set serverJobID $value } # Accept-Connection handler for Server. # called When client makes a connection to the server # Its passed the channel we're to communicate with the client on, # The address of the client and the port we're using # # Setup a handler for (incoming) communication on # the client channel - send connection Reply and log connection proc connect {sock addr port} { # if {[badConnect $addr]} { # close $sock # return # } # Setup handler for future communication on client socket global clientSock set sockPeerName [fconfigure $sock -peername] # lappend clientSock $sock # evaluate "append CLIENT_LIST, \"$sock\";" fileevent $sock readable [list svcHandler $sock $addr] # Note we've accepted a connection (show how get peer info fm socket) appendWindows .client.t.text "Accept from $sockPeerName\n\ Accepted connection from $addr at [clock format [clock seconds]]\n" # Read client input in lines, disable blocking I/O fconfigure $sock -buffering line -blocking 0 # Send Acceptance string to client # puts $sock "$addr:$port, You are connected to the echo server." # puts $sock "It is now [clock format [clock seconds]]" } # Create a server socket on port $svcPort. # Call proc connect when a client attempts a connection. set clientSock {} set sockName(Own) "Own" set EOF "@#$%EOF%$#@" set EOU "@#$%EOU%$#@" set EOS "@#$%EOS%$#@" set ECS "@#$%ECS%$#@" set clientsReply 0 set JOBID 0 set serverJobID 0 socket -server connect $svcPort ;# cannot change the name of svcPort as it comes from EXinit() in EX/ex.c puts "$variantversion: server socket setup: channel <[expr $svcPort-9000]> on host <$eshost>" #puts "so far so good..." #update #vwait events ;# handle events till variable events is set EDEN-1.66/lib-tkeden-1.66/rgb.txt0000644000175000017500000003704010243105157016036 0ustar rboyattrboyattThis is a list of all the colours that are predefined. You can use the colour name as a string to define DoNaLD attributes and SCOUT window properties. The Red, Grn (Green) and Blu (Blue) columns show you the red, green and blue components of the colour, in a range from 0 (none) to 255 (maximum). These values can be used in the rgb2color (or rgb2colour) function if you prefer. This example below shows you how to use the rgb2color (rgb2colour) function. The colour being used in this example has the predefined name of CornflowerBlue. ------------------------------------------------------------------ %donald line l l=[{10,10}, {200,200}] %scout string g; window ash = { type: TEXT string: "Ash" frame: ([{10, 10}, {100, 100}]) bgcolor : g }; screen=; %eden g is rgb2colour(ri,gi,bi); A_l is strcat("linewidth=5,color=", g); ri=100;gi=149;bi=237; ------------------------------------------------------------------- =========== COLOUR LIST =========== Red Grn Blu Colour Name --- --- --- ----------- 255 250 250 snow 248 248 255 GhostWhite 245 245 245 WhiteSmoke 220 220 220 gainsboro 255 250 240 FloralWhite 253 245 230 OldLace 250 240 230 linen 250 235 215 AntiqueWhite 255 239 213 PapayaWhip 255 235 205 BlanchedAlmond 255 228 196 bisque 255 218 185 PeachPuff 255 222 173 NavajoWhite 255 228 181 moccasin 255 248 220 cornsilk 255 255 240 ivory 255 250 205 LemonChiffon 255 245 238 seashell 240 255 240 honeydew 245 255 250 MintCream 240 255 255 azure 240 248 255 AliceBlue 230 230 250 lavender 255 240 245 LavenderBlush 255 228 225 MistyRose 255 255 255 white 0 0 0 black 47 79 79 DarkSlateGray 47 79 79 DarkSlateGrey 105 105 105 DimGray 105 105 105 DimGrey 112 128 144 SlateGray 112 128 144 SlateGrey 119 136 153 LightSlateGray 119 136 153 LightSlateGrey 190 190 190 gray 190 190 190 grey 211 211 211 LightGrey 211 211 211 LightGray 25 25 112 MidnightBlue 0 0 128 navy 0 0 128 NavyBlue 100 149 237 CornflowerBlue 72 61 139 DarkSlateBlue 106 90 205 SlateBlue 123 104 238 MediumSlateBlue 132 112 255 LightSlateBlue 0 0 205 MediumBlue 65 105 225 RoyalBlue 0 0 255 blue 30 144 255 DodgerBlue 0 191 255 DeepSkyBlue 135 206 235 SkyBlue 135 206 250 LightSkyBlue 70 130 180 SteelBlue 176 196 222 LightSteelBlue 173 216 230 LightBlue 176 224 230 PowderBlue 175 238 238 PaleTurquoise 0 206 209 DarkTurquoise 72 209 204 MediumTurquoise 64 224 208 turquoise 0 255 255 cyan 224 255 255 LightCyan 95 158 160 CadetBlue 102 205 170 MediumAquamarine 127 255 212 aquamarine 0 100 0 DarkGreen 85 107 47 DarkOliveGreen 143 188 143 DarkSeaGreen 46 139 87 SeaGreen 60 179 113 MediumSeaGreen 32 178 170 LightSeaGreen 152 251 152 PaleGreen 0 255 127 SpringGreen 124 252 0 LawnGreen 0 255 0 green 127 255 0 chartreuse 0 250 154 MediumSpringGreen 173 255 47 GreenYellow 50 205 50 LimeGreen 154 205 50 YellowGreen 34 139 34 ForestGreen 107 142 35 OliveDrab 189 183 107 DarkKhaki 240 230 140 khaki 238 232 170 PaleGoldenrod 250 250 210 LightGoldenrodYellow 255 255 224 LightYellow 255 255 0 yellow 255 215 0 gold 238 221 130 LightGoldenrod 218 165 32 goldenrod 184 134 11 DarkGoldenrod 188 143 143 RosyBrown 205 92 92 IndianRed 139 69 19 SaddleBrown 160 82 45 sienna 205 133 63 peru 222 184 135 burlywood 245 245 220 beige 245 222 179 wheat 244 164 96 SandyBrown 210 180 140 tan 210 105 30 chocolate 178 34 34 firebrick 165 42 42 brown 233 150 122 DarkSalmon 250 128 114 salmon 255 160 122 LightSalmon 255 165 0 orange 255 140 0 DarkOrange 255 127 80 coral 240 128 128 LightCoral 255 99 71 tomato 255 69 0 OrangeRed 255 0 0 red 255 105 180 HotPink 255 20 147 DeepPink 255 192 203 pink 255 182 193 LightPink 219 112 147 PaleVioletRed 176 48 96 maroon 199 21 133 MediumVioletRed 208 32 144 VioletRed 255 0 255 magenta 238 130 238 violet 221 160 221 plum 218 112 214 orchid 186 85 211 MediumOrchid 153 50 204 DarkOrchid 148 0 211 DarkViolet 138 43 226 BlueViolet 160 32 240 purple 147 112 219 MediumPurple 216 191 216 thistle 255 250 250 snow1 238 233 233 snow2 205 201 201 snow3 139 137 137 snow4 255 245 238 seashell1 238 229 222 seashell2 205 197 191 seashell3 139 134 130 seashell4 255 239 219 AntiqueWhite1 238 223 204 AntiqueWhite2 205 192 176 AntiqueWhite3 139 131 120 AntiqueWhite4 255 228 196 bisque1 238 213 183 bisque2 205 183 158 bisque3 139 125 107 bisque4 255 218 185 PeachPuff1 238 203 173 PeachPuff2 205 175 149 PeachPuff3 139 119 101 PeachPuff4 255 222 173 NavajoWhite1 238 207 161 NavajoWhite2 205 179 139 NavajoWhite3 139 121 94 NavajoWhite4 255 250 205 LemonChiffon1 238 233 191 LemonChiffon2 205 201 165 LemonChiffon3 139 137 112 LemonChiffon4 255 248 220 cornsilk1 238 232 205 cornsilk2 205 200 177 cornsilk3 139 136 120 cornsilk4 255 255 240 ivory1 238 238 224 ivory2 205 205 193 ivory3 139 139 131 ivory4 240 255 240 honeydew1 224 238 224 honeydew2 193 205 193 honeydew3 131 139 131 honeydew4 255 240 245 LavenderBlush1 238 224 229 LavenderBlush2 205 193 197 LavenderBlush3 139 131 134 LavenderBlush4 255 228 225 MistyRose1 238 213 210 MistyRose2 205 183 181 MistyRose3 139 125 123 MistyRose4 240 255 255 azure1 224 238 238 azure2 193 205 205 azure3 131 139 139 azure4 131 111 255 SlateBlue1 122 103 238 SlateBlue2 105 89 205 SlateBlue3 71 60 139 SlateBlue4 72 118 255 RoyalBlue1 67 110 238 RoyalBlue2 58 95 205 RoyalBlue3 39 64 139 RoyalBlue4 0 0 255 blue1 0 0 238 blue2 0 0 205 blue3 0 0 139 blue4 30 144 255 DodgerBlue1 28 134 238 DodgerBlue2 24 116 205 DodgerBlue3 16 78 139 DodgerBlue4 99 184 255 SteelBlue1 92 172 238 SteelBlue2 79 148 205 SteelBlue3 54 100 139 SteelBlue4 0 191 255 DeepSkyBlue1 0 178 238 DeepSkyBlue2 0 154 205 DeepSkyBlue3 0 104 139 DeepSkyBlue4 135 206 255 SkyBlue1 126 192 238 SkyBlue2 108 166 205 SkyBlue3 74 112 139 SkyBlue4 176 226 255 LightSkyBlue1 164 211 238 LightSkyBlue2 141 182 205 LightSkyBlue3 96 123 139 LightSkyBlue4 198 226 255 SlateGray1 185 211 238 SlateGray2 159 182 205 SlateGray3 108 123 139 SlateGray4 202 225 255 LightSteelBlue1 188 210 238 LightSteelBlue2 162 181 205 LightSteelBlue3 110 123 139 LightSteelBlue4 191 239 255 LightBlue1 178 223 238 LightBlue2 154 192 205 LightBlue3 104 131 139 LightBlue4 224 255 255 LightCyan1 209 238 238 LightCyan2 180 205 205 LightCyan3 122 139 139 LightCyan4 187 255 255 PaleTurquoise1 174 238 238 PaleTurquoise2 150 205 205 PaleTurquoise3 102 139 139 PaleTurquoise4 152 245 255 CadetBlue1 142 229 238 CadetBlue2 122 197 205 CadetBlue3 83 134 139 CadetBlue4 0 245 255 turquoise1 0 229 238 turquoise2 0 197 205 turquoise3 0 134 139 turquoise4 0 255 255 cyan1 0 238 238 cyan2 0 205 205 cyan3 0 139 139 cyan4 151 255 255 DarkSlateGray1 141 238 238 DarkSlateGray2 121 205 205 DarkSlateGray3 82 139 139 DarkSlateGray4 127 255 212 aquamarine1 118 238 198 aquamarine2 102 205 170 aquamarine3 69 139 116 aquamarine4 193 255 193 DarkSeaGreen1 180 238 180 DarkSeaGreen2 155 205 155 DarkSeaGreen3 105 139 105 DarkSeaGreen4 84 255 159 SeaGreen1 78 238 148 SeaGreen2 67 205 128 SeaGreen3 46 139 87 SeaGreen4 154 255 154 PaleGreen1 144 238 144 PaleGreen2 124 205 124 PaleGreen3 84 139 84 PaleGreen4 0 255 127 SpringGreen1 0 238 118 SpringGreen2 0 205 102 SpringGreen3 0 139 69 SpringGreen4 0 255 0 green1 0 238 0 green2 0 205 0 green3 0 139 0 green4 127 255 0 chartreuse1 118 238 0 chartreuse2 102 205 0 chartreuse3 69 139 0 chartreuse4 192 255 62 OliveDrab1 179 238 58 OliveDrab2 154 205 50 OliveDrab3 105 139 34 OliveDrab4 202 255 112 DarkOliveGreen1 188 238 104 DarkOliveGreen2 162 205 90 DarkOliveGreen3 110 139 61 DarkOliveGreen4 255 246 143 khaki1 238 230 133 khaki2 205 198 115 khaki3 139 134 78 khaki4 255 236 139 LightGoldenrod1 238 220 130 LightGoldenrod2 205 190 112 LightGoldenrod3 139 129 76 LightGoldenrod4 255 255 224 LightYellow1 238 238 209 LightYellow2 205 205 180 LightYellow3 139 139 122 LightYellow4 255 255 0 yellow1 238 238 0 yellow2 205 205 0 yellow3 139 139 0 yellow4 255 215 0 gold1 238 201 0 gold2 205 173 0 gold3 139 117 0 gold4 255 193 37 goldenrod1 238 180 34 goldenrod2 205 155 29 goldenrod3 139 105 20 goldenrod4 255 185 15 DarkGoldenrod1 238 173 14 DarkGoldenrod2 205 149 12 DarkGoldenrod3 139 101 8 DarkGoldenrod4 255 193 193 RosyBrown1 238 180 180 RosyBrown2 205 155 155 RosyBrown3 139 105 105 RosyBrown4 255 106 106 IndianRed1 238 99 99 IndianRed2 205 85 85 IndianRed3 139 58 58 IndianRed4 255 130 71 sienna1 238 121 66 sienna2 205 104 57 sienna3 139 71 38 sienna4 255 211 155 burlywood1 238 197 145 burlywood2 205 170 125 burlywood3 139 115 85 burlywood4 255 231 186 wheat1 238 216 174 wheat2 205 186 150 wheat3 139 126 102 wheat4 255 165 79 tan1 238 154 73 tan2 205 133 63 tan3 139 90 43 tan4 255 127 36 chocolate1 238 118 33 chocolate2 205 102 29 chocolate3 139 69 19 chocolate4 255 48 48 firebrick1 238 44 44 firebrick2 205 38 38 firebrick3 139 26 26 firebrick4 255 64 64 brown1 238 59 59 brown2 205 51 51 brown3 139 35 35 brown4 255 140 105 salmon1 238 130 98 salmon2 205 112 84 salmon3 139 76 57 salmon4 255 160 122 LightSalmon1 238 149 114 LightSalmon2 205 129 98 LightSalmon3 139 87 66 LightSalmon4 255 165 0 orange1 238 154 0 orange2 205 133 0 orange3 139 90 0 orange4 255 127 0 DarkOrange1 238 118 0 DarkOrange2 205 102 0 DarkOrange3 139 69 0 DarkOrange4 255 114 86 coral1 238 106 80 coral2 205 91 69 coral3 139 62 47 coral4 255 99 71 tomato1 238 92 66 tomato2 205 79 57 tomato3 139 54 38 tomato4 255 69 0 OrangeRed1 238 64 0 OrangeRed2 205 55 0 OrangeRed3 139 37 0 OrangeRed4 255 0 0 red1 238 0 0 red2 205 0 0 red3 139 0 0 red4 255 20 147 DeepPink1 238 18 137 DeepPink2 205 16 118 DeepPink3 139 10 80 DeepPink4 255 110 180 HotPink1 238 106 167 HotPink2 205 96 144 HotPink3 139 58 98 HotPink4 255 181 197 pink1 238 169 184 pink2 205 145 158 pink3 139 99 108 pink4 255 174 185 LightPink1 238 162 173 LightPink2 205 140 149 LightPink3 139 95 101 LightPink4 255 130 171 PaleVioletRed1 238 121 159 PaleVioletRed2 205 104 137 PaleVioletRed3 139 71 93 PaleVioletRed4 255 52 179 maroon1 238 48 167 maroon2 205 41 144 maroon3 139 28 98 maroon4 255 62 150 VioletRed1 238 58 140 VioletRed2 205 50 120 VioletRed3 139 34 82 VioletRed4 255 0 255 magenta1 238 0 238 magenta2 205 0 205 magenta3 139 0 139 magenta4 255 131 250 orchid1 238 122 233 orchid2 205 105 201 orchid3 139 71 137 orchid4 255 187 255 plum1 238 174 238 plum2 205 150 205 plum3 139 102 139 plum4 224 102 255 MediumOrchid1 209 95 238 MediumOrchid2 180 82 205 MediumOrchid3 122 55 139 MediumOrchid4 191 62 255 DarkOrchid1 178 58 238 DarkOrchid2 154 50 205 DarkOrchid3 104 34 139 DarkOrchid4 155 48 255 purple1 145 44 238 purple2 125 38 205 purple3 85 26 139 purple4 171 130 255 MediumPurple1 159 121 238 MediumPurple2 137 104 205 MediumPurple3 93 71 139 MediumPurple4 255 225 255 thistle1 238 210 238 thistle2 205 181 205 thistle3 139 123 139 thistle4 0 0 0 gray0 0 0 0 grey0 3 3 3 gray1 3 3 3 grey1 5 5 5 gray2 5 5 5 grey2 8 8 8 gray3 8 8 8 grey3 10 10 10 gray4 10 10 10 grey4 13 13 13 gray5 13 13 13 grey5 15 15 15 gray6 15 15 15 grey6 18 18 18 gray7 18 18 18 grey7 20 20 20 gray8 20 20 20 grey8 23 23 23 gray9 23 23 23 grey9 26 26 26 gray10 26 26 26 grey10 28 28 28 gray11 28 28 28 grey11 31 31 31 gray12 31 31 31 grey12 33 33 33 gray13 33 33 33 grey13 36 36 36 gray14 36 36 36 grey14 38 38 38 gray15 38 38 38 grey15 41 41 41 gray16 41 41 41 grey16 43 43 43 gray17 43 43 43 grey17 46 46 46 gray18 46 46 46 grey18 48 48 48 gray19 48 48 48 grey19 51 51 51 gray20 51 51 51 grey20 54 54 54 gray21 54 54 54 grey21 56 56 56 gray22 56 56 56 grey22 59 59 59 gray23 59 59 59 grey23 61 61 61 gray24 61 61 61 grey24 64 64 64 gray25 64 64 64 grey25 66 66 66 gray26 66 66 66 grey26 69 69 69 gray27 69 69 69 grey27 71 71 71 gray28 71 71 71 grey28 74 74 74 gray29 74 74 74 grey29 77 77 77 gray30 77 77 77 grey30 79 79 79 gray31 79 79 79 grey31 82 82 82 gray32 82 82 82 grey32 84 84 84 gray33 84 84 84 grey33 87 87 87 gray34 87 87 87 grey34 89 89 89 gray35 89 89 89 grey35 92 92 92 gray36 92 92 92 grey36 94 94 94 gray37 94 94 94 grey37 97 97 97 gray38 97 97 97 grey38 99 99 99 gray39 99 99 99 grey39 102 102 102 gray40 102 102 102 grey40 105 105 105 gray41 105 105 105 grey41 107 107 107 gray42 107 107 107 grey42 110 110 110 gray43 110 110 110 grey43 112 112 112 gray44 112 112 112 grey44 115 115 115 gray45 115 115 115 grey45 117 117 117 gray46 117 117 117 grey46 120 120 120 gray47 120 120 120 grey47 122 122 122 gray48 122 122 122 grey48 125 125 125 gray49 125 125 125 grey49 127 127 127 gray50 127 127 127 grey50 130 130 130 gray51 130 130 130 grey51 133 133 133 gray52 133 133 133 grey52 135 135 135 gray53 135 135 135 grey53 138 138 138 gray54 138 138 138 grey54 140 140 140 gray55 140 140 140 grey55 143 143 143 gray56 143 143 143 grey56 145 145 145 gray57 145 145 145 grey57 148 148 148 gray58 148 148 148 grey58 150 150 150 gray59 150 150 150 grey59 153 153 153 gray60 153 153 153 grey60 156 156 156 gray61 156 156 156 grey61 158 158 158 gray62 158 158 158 grey62 161 161 161 gray63 161 161 161 grey63 163 163 163 gray64 163 163 163 grey64 166 166 166 gray65 166 166 166 grey65 168 168 168 gray66 168 168 168 grey66 171 171 171 gray67 171 171 171 grey67 173 173 173 gray68 173 173 173 grey68 176 176 176 gray69 176 176 176 grey69 179 179 179 gray70 179 179 179 grey70 181 181 181 gray71 181 181 181 grey71 184 184 184 gray72 184 184 184 grey72 186 186 186 gray73 186 186 186 grey73 189 189 189 gray74 189 189 189 grey74 191 191 191 gray75 191 191 191 grey75 194 194 194 gray76 194 194 194 grey76 196 196 196 gray77 196 196 196 grey77 199 199 199 gray78 199 199 199 grey78 201 201 201 gray79 201 201 201 grey79 204 204 204 gray80 204 204 204 grey80 207 207 207 gray81 207 207 207 grey81 209 209 209 gray82 209 209 209 grey82 212 212 212 gray83 212 212 212 grey83 214 214 214 gray84 214 214 214 grey84 217 217 217 gray85 217 217 217 grey85 219 219 219 gray86 219 219 219 grey86 222 222 222 gray87 222 222 222 grey87 224 224 224 gray88 224 224 224 grey88 227 227 227 gray89 227 227 227 grey89 229 229 229 gray90 229 229 229 grey90 232 232 232 gray91 232 232 232 grey91 235 235 235 gray92 235 235 235 grey92 237 237 237 gray93 237 237 237 grey93 240 240 240 gray94 240 240 240 grey94 242 242 242 gray95 242 242 242 grey95 245 245 245 gray96 245 245 245 grey96 247 247 247 gray97 247 247 247 grey97 250 250 250 gray98 250 250 250 grey98 252 252 252 gray99 252 252 252 grey99 255 255 255 gray100 255 255 255 grey100 169 169 169 DarkGrey 169 169 169 DarkGray 0 0 139 DarkBlue 0 139 139 DarkCyan 139 0 139 DarkMagenta 139 0 0 DarkRed 144 238 144 LightGreen (end colours) EDEN-1.66/lib-tkeden-1.66/aop.eden0000644000175000017500000002650710271160766016155 0ustar rboyattrboyatt/* * Ant's AOP (v2.11) * (integrated with tkeden) */ include(getenv("TKEDEN_LIB")//"/aop/action.e"); include(getenv("TKEDEN_LIB")//"/aop/agent.e"); include(getenv("TKEDEN_LIB")//"/aop/error.e"); include(getenv("TKEDEN_LIB")//"/aop/operations.e"); include(getenv("TKEDEN_LIB")//"/aop/parse.e"); include(getenv("TKEDEN_LIB")//"/aop/parserbuf.e"); /* utils.e - contains utility functions */ aop_varcount = 0; func makevarname { return "aop_var_" // str (aop_varcount++); } func getvar { para instr; aop_tempvr = "ERROR"; execute ("aop_tempvr = " // instr // ";"); return aop_tempvr; } func isdefined { para x; auto i; if (x == @) return 0; if (type (x) == "list") for (i = 1; i <= x#; i++) if (!isdefined (x [i])) return 0; return 1; } func make_str { para data; auto outstr, i; if (type (data) != "list") return str (data); if (data# < 1) return "[]"; if (type (data [1]) == "string") outstr = "[\"" // str (data [1]) // "\""; else outstr = "[" // make_str (data [1]); for (i = 2; i <= data#; i++) if (type (data [i]) == "string") outstr = outstr // ", \"" // str(data [i]) // "\""; else outstr = outstr // ", " // make_str (data [i]); return outstr // "]"; } func stripspace { para instr; auto begin, end; if (instr == "") return ""; begin = 1; while (begin <= instr# && issp (instr[begin])) begin++; end = instr#; while (end >= 0 && issp (instr[end])) end--; return substr (instr, begin, end); } func isspace { para instr; auto i; for (i = 1; i <= instr#; i++) if (!issp (instr [i])) return 0; return 1; } func issp { para c; return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); } func escapequotes { para instr; auto i, outstr; outstr = ""; for (i = 1; i <= instr#; i++) { if (instr [i] == '"') outstr = outstr // str('\\'); outstr = outstr // str(instr [i]); } return outstr; } func issuffix { para instr, suffix; auto i; if (instr# < suffix#) return 0; for (i = 0; i < suffix#; i++) if (instr [instr# - i] != suffix [suffix# - i]) return 0; return 1; } func tail { para inlist; auto ret, i; ret = []; for (i = 2; i <= inlist#; i++) ret = ret // [inlist [i]]; return ret; } func cutquotes { para instr; auto i, outstr; outstr = ""; for (i = 1; i <= instr#; i++) if (instr [i] != '"') outstr = outstr // str(instr [i]); return outstr; } func applytoeach { para f, l; auto i, result; result = []; for (i = 1; i <= l#; i++) result = result // [f (l [i])]; return result; } func getline { auto result, c; result = ""; while ((c = getchar ()) != 10) result = result // char (c); return result; } func _str { return "\"" // $1 // "\""; } func isdigit { para sym; return ('0' <= sym && sym <= '9'); } func ischar { para sym; return (('A' <= sym && sym <= 'Z') || ('a' <= sym && sym <= 'z')); } func isalphanum { para c; return (ischar (c) || isdigit (c) || (c == '_')); } func converttonum { para instr; auto i, radix, sum; i = instr#; radix = 1; sum = 0; while (i >= 1) { if (!isdigit(instr [i]) && (instr [i] != ' ')) return instr; if (isdigit (instr [i])) { sum += ((instr [i] - '0') * radix); radix = radix * 10; } i--; } return sum; } /* blocks.e - contains functions for string searching while ignoring blocks */ /* list of all registered blocks */ scope_blocks = []; /* function to register blocks */ proc addblocks { scope_blocks = scope_blocks // $; } /* some built-in blocks */ bras = [["(", ")"], ["bras"]]; sq_bras = [["[", "]"], ["sq_bras"]]; addblocks ("bras", "sq_bras"); /* find instr: a string str: a string start: an index into instr returns: the index of the first occurrence of str in instr after start */ func find { para instr, str, start; auto i, j, flag; for (i = start; i <= instr# - str# + 1; i++) { flag = 1; for (j = 1; j <= str# && flag == 1; j++) if (str[j] != instr[i + j - 1]) flag = 0; if (flag == 1) return i; } return 0; } /* findfirst instr: a string strings: a list of strings start: an index into instr returns: the element of strings that first occurs (after index start) in instr together with its index */ func findfirst { para instr, strings, start; auto i, j, string, position; string = ""; position = 0; for (i = 1; i <= strings#; i++) { j = find (instr, strings [i], start); if (j == 0) continue; if (j < position || position == 0) { position = j; string = strings [i]; } } return [string, position]; } /* to search while ignoring blocks, a stack is maintained of the symbols that we are looking for thestack = [";", ["var"]], [..], .. [symbol to find, [symbols to ignore]] */ proc emptystack { thestack = []; pointer = 0; } proc push { para item; pointer++; if (pointer > thestack#) thestack = thestack // [item]; else thestack [pointer] = item; } func pop { if (pointer < 1) return []; pointer--; return thestack [pointer + 1]; } /* getblockfromstartsym instr: the starting symbol of a block returns: the block with this starting symbol */ func getblockfromstartsym { para instr; auto i, b; for (i = 1; i <= scope_blocks#; i++) { b = getvar (scope_blocks [i]); if (b [1][1] == instr) return b; } writeln ("unknown block \"" // instr // "\""); return []; } /* getblockfromname name: the name of a block returns: the block, if it is a block, otherwise [] */ func getblockfromname { para name; auto b; b = getvar (name); if (b# != 2 || b[1]# < 2) { writeln ("unknown block \"" // name // "\""); return []; } else return b; } /* getstartsyms blocks: a list of block names returns: a list containing the start symbol for each block */ func getstartsyms { para blocks; auto i, b, out; out = []; for (i = 1; i <= blocks#; i++) { b = getblockfromname (blocks [i]); if (b != []) out = out // [b [1][1]]; } return out; } /* extract - major export instr: a string match: a string ignore: a list of block names start: an index into instr returns: the first occurrence in instr after start of match that is not within any of the blocks in ignore */ func extract { para instr, match, ignore, start; auto pos, first, new_symbol, old_symbol, cur_match, cur_ignore, i; /* cur_match stores the string we are looking for cur_ignore stores the strings that mark the start of the blocks that we want to ignore */ pos = start; cur_match = match; cur_ignore = getstartsyms (ignore); emptystack (); while (1) { /* search for the string we are looking for and also the symbols to ignore */ first = findfirst (instr, [cur_match] // cur_ignore, pos); /* nothing found */ if (first == ["", 0]) return 0; /* position to start from is set to after that which we have just read */ pos = first [2] + first [1]#; /* if we encountered a block we are ignoring */ if (first [1] != cur_match) { /* save what we were looking for */ push ([cur_match, cur_ignore]); /* find the block's end symbol and start looking for it*/ new_symbol = getblockfromstartsym (first [1]); if (new_symbol == []) return 0; /* might have to match more than 2 symbols, e.g proc ; ; not just proc ; */ cur_match = new_symbol [1][2]; cur_ignore = getstartsyms (new_symbol [2]); /* save the additional symbols to be found later */ for (i = new_symbol[1]#; i > 2; i--) push ([new_symbol [1][i], cur_ignore]); } else { /* we found what we were looking for */ /* find out the last thing we were looking for, before we were interrupted */ old_symbol = pop (); if (old_symbol == []) { /* this is what we started off looking for, and it is found*/ return (first [2]); } else { /* there is more to find, continue looking */ cur_match = old_symbol [1]; cur_ignore = old_symbol [2]; } } } } /* ops.e - implements the string operations that an agent can perform */ /* charmatch c: a character charset: a list of lists, each representing characters to match returns: whether c matches any of the lists in charset */ func charmatch { para c, charset; /* one element lists simply contain a character to match */ if (charset# == 1 && char (c) == char (charset [1])) return 1; /* two element lists contain an interval of characters */ if (charset# == 2 && char (c) >= char (charset [1]) && char (c) <= char (charset [2])) return 1; return 0; } /* chars_finite_begin instr: a string chars: a list of character matches as accepted by charmatch count: a number returns: the first count characters if they match chars else [] */ func chars_finite_begin { para instr, chars, count; auto i, j, match; if (count > instr#) return []; for (i = 1; i <= count; i++) { match = 0; for (j = 1; j <= chars#; j++) if (charmatch (instr [i], chars [j])) match = 1; if (!match) return []; } return [substr (instr, 1, count), substr (instr, count + 1, instr#)]; } /* chars_finite_end instr: a string chars: a list of character matches as accepted by charmatch count: a number returns: the last count characters if they match chars else [] */ func chars_finite_end { para instr, chars, count; auto i, j, match; if (count > instr#) return []; for (i = instr#; i >= instr# - count; i--) { match = 0; for (j = 1; j <= chars#; j++) if (charmatch (instr [i], chars [j])) match = 1; if (!match) return []; } return [substr (instr, 1, instr# - count), substr (instr, instr# - count + 1, instr#)]; } /* chars_begin instr: a string chars: a list of character matches as accepted by charmatch returns: the biggest prefix of instr s.t. all its character match chars */ func chars_begin { para instr, chars; auto i, j; i = 1; while (i <= instr#) { match = 0; for (j = 1; j <= chars#; j++) if (charmatch (instr [i], chars [j])) match = 1; if (!match) break; i++; } return [substr (instr, 1, i - 1), substr (instr, i, instr#)]; } /* chars_end instr: a string chars: a list of character matches as accepted by charmatch returns: the biggest suffix of instr s.t. all its character match chars */ func chars_end { para instr, chars; auto i, j, match; i = instr#; while (i >= 1) { match = 0; for (j = 1; j <= chars#; j++) if (charmatch (instr [i], chars [j])) match = 1; if (!match) break; i--; } return [substr (instr, 1, i), substr (instr, i + 1, instr#)]; } func removehead { para listptr; auto temp, i, item; if (*listptr == []) return []; temp = []; item = (*listptr) [1]; for (i = 2; i <= (*listptr)#; i++) temp = temp // [(*listptr) [i]]; *listptr = temp; return item; } /* general agent templates */ nothing = ["literal", ""]; anything = ["read_all", []]; alphanum = ["literal_re", "[a-zA-Z0-9_]+"]; number = ["literal_re", "[0-9]+"]; float_num = ["pivot", ".", ["number","number"], ["fail","number"] ]; ident = ["literal_re", "[a-zA-Z_][a-zA-Z0-9_]*"]; /* %aop notation */ include(getenv("TKEDEN_LIB")//"/aop/aop_notation.eden"); EDEN-1.66/lib-tkeden-1.66/eden.txt0000644000175000017500000005272410316222110016173 0ustar rboyattrboyatt---------- EDEN (Evaluator of DEfinitive Notations) QUICK REFERENCE ---------- Parts of syntax which are !@Ooptional are shown like this!@P CONTENTS OF THIS QUICK REFERENCE: 1. C-like syntax 2. Data types 3. Operators 4. Procedural statements 5. User-defined functions, procedures, actions... 6. Pre-defined variables 7. Pre-defined functions and procedures 8. C-library functions and procedures 9. More information -- 1. C-LIKE SYNTAX ---------------------------------------------------------- Statements are followed by the semi-colon; /* Multi-line C-style comments /* ...although note they may nest in Eden */ */ ## one-line comments start with two hash characters Assignment: v = 1; Definition: a is f(b, c); Function: func square { return $1*$1; } Procedure: proc inc_a { a++; } Action: proc print : q { writeln("q is ", q); } Name space: can access Scout variables directly. to access Donald variables, prepend an underscore _ Variable declaration is not required or possible. Redeclaration of type is automatic. -- 2. DATA TYPES ------------------------------------------------------------- Undefined: @ Integer: 123, 018 (octal), 0xAB (hex) Character: 'A', '\n', '\009' Floating point: 1.23e-15 String: s = "this is a string" s[1] is the first character of the string s. Pointer: ip = &int_variable * dereferences a pointer: *ip == int_variable List: L = [ 100, 'a', "string", [1,2,3] ] L[1] is the first item of L. L[4][2] is the second item in the fourth item of L. L# is the length of list L. L // M is the concatenation of L and M. See also append, insert, delete and shift. -- 3. OPERATORS -------------------------------------------------------------- Strict: Returns @ if an operand is @ Lazy: Leaves the second operand unevaluated if it is unnecessary Eager: Always evaluates both operands Arithmetic (strict): + - (difference and unary) * / % (remainder) Relational: < > <= >= Equality: == != Logical (lazy): && || ! Logical (eager): and or not Bitwise (eager): bitand bitor Conditional: cond ? iftrue : iffalseor@ Assignment: = += -= Prefix assignment: ++lvalue --lvalue Postfix assignment: lvalue++ lvalue-- Indirection: a=1; r="a"; v=`r`; Now v == 1 (note: there are problems with use of indirection on the RHS of a definition). Type casting is implemented through functions: see int(), char() etc below. -- 4. PROCEDURAL STATEMENTS -------------------------------------------------- Compound statements: { statement; !@Ostatements...!@P } insert list, position, value; (note: - no brackets - these are not functions append list, value; - they operate only only lists, not delete list, position; strings) shift !@Olist!@P; (shift with no argument deletes the first item from $) if (expression) statement !@Oelse statement!@P while (expression) statement do statement while (expression); for (!@Oinitialisation!@P; !@Opre-iteration-test!@P; !@Opost-statement!@P) statement switch (expression) { case constant: statement; !@Odefault statement;!@P } break; causes termination of the smallest enclosing while, do, for, switch continue; causes continuation of smallest enclosing while, do, for return !@Oexpression!@P; Null statement: ; Dependency link: identifier ~> [ !@Oidentifier_list!@P ]; Query: ?lvalue; Value freezing: eval(sym): takes the value of sym at definition entry time (note this is at proc definition time if eval is used within a proc). -- 5. USER-DEFINED FUNCTIONS, PROCEDURES, ACTIONS... ------------------------- func identifier { !@Opara id_list;!@P !@Oauto id_list;!@P !@Ostatements...!@P } proc identifier !@O: id_list!@P { !@Opara id_list;!@P !@Oauto id_list;!@P !@Ostatements...!@P } procmacro identifier { !@Opara id_list;!@P !@Oauto id_list;!@P !@Ostatements...!@P } $ is the argument list of a function. $3 is the third argument. $[n] is the n-th argument. Function call: four = square(2); -- 6. PRE-DEFINED VARIABLES -------------------------------------------------- stdin: standard input. stdout: standard output. stderr: standard error. autocalc: whether Eden automatically recalculates formula definitions. tkeden_vbfeatures: whether to implement "VB-like features" in Scout (eg mouseClick observables). These features are not recommended for use in new models. tkeden_textsize: an integer that controls the point size of the text in the input window and other parts of the interface (defaults to 10). eden_notice_undef_reference: whether to give notices about references to undefined values. eden_error_index_range: whether to generate an error or @ when referencing outside an array. _tkeden_showxoutput: whether to show info sent to Tcl for debugging purposes (see also debug(128)). eden_debug_notations: whether the notation-handling Eden code should give debugging output eden_debug_edenclocks: whether the edenclocks Eden code should give debugging output PI: ratio of circle circumference to diameter (note lower case pi in DoNaLD). edenclocks: list of tuples describing integer variables that should be automatically incremented at a given time interval. Each element in the edenclocks list is itself a list, in the form [clockPtr, millis]. 'clockPtr' should be a pointer to an integer variable which will then be incremented every 'millis' milliseconds. There are two possible special values for 'millis': @ - "pause" this clock: don't increment. Enables a record of a clock variable to be left in the edenclocks list but temporarily disabled. 0 - increment this clock as fast as possible. This enables the commonly used pattern 'proc p { foo(); todo("p();"); }' to become 'proc p : tick { foo(); }; startedenclock(&tick, 0);'. Eg: 'edenclocks=[[&a, 1000], [&b, 2500], [&tick, 0]];' causes 'a' to be incremented once per second, 'b' to be incremented every 2.5 seconds, and 'tick' to be incremented as fast as possible. The edenclocks list can be changed manually or by using the startedenclock and stopedenclock helper procs provided. -- 7. PRE-DEFINED FUNCTIONS AND PROCEDURES ----------------------------------- write(args...): print arguments on stdout. writeln(args...): print arguments on stdout, appending a newline (\n). type(data): returns the type of data as a string: one of "@", "int", "char", "string", "float", "list", "func", "proc", "procmacro", "builtin", "C-func", "Real-func". int(data): returns data after cast to integer type. char(data): returns data after cast to character type. str(data): returns data after cast to character type. float(data): returns data after cast to floating point type. substr(string, from, to): returns a substring of string. strcat(strings...): returns the string concatenation of its arguments. nameof(pointer): returns the name of the symbol to which the pointer points. sublist(list, from, to): returns a sublist of list. listcat(lists...): returns the list concatenation of its arguments. array(size, data): returns a list constructed from data items, of length size. time(): returns the current time in seconds since Jan 1, 1970. ftime(): returns the current time in [second, milli] form. gettime(): returns the current time in [second, minute, hour, day of month, month of year, year, day of week] form. apply(function, list): calls function with list as argument. execute(string): executes string as Eden statements. todo(string): will execute string as Eden statements after current evaluation terminates. Consider using a solution using edenclocks instead. include(string!@O, string...!@P): executes the contents of the named file(s) as Eden statements. cd(string): changes the current working directory. cwd(): returns the current working directory. dirname(string): returns the containing directory of a given filepath. basename(string): returns the filename (leafname) of a given filepath. exit(status): terminates the program, returning status as exit status. forget(string): attempts to remove the named variable from the symbol table. Returns 0 for OK, 1 for not found, 2 for failure. forget(pointer): attempts to remove the pointed-to variable from the symbol table. Returns 0 for OK, 2 for failure (1 is not possible). eager(): evaluate all out of date formula variables and actions now, update the screen, whatever the state of autocalc. touch(pointers...): put the targets of the pointed to variables on the evaluation queue. formula_list(): returns list of pointers to queued formula variables. action_list(): returns list of pointers to queued actions. symboltable(): returns the current symbol table as a list of lists. symbols(string): returns a list of symbols from the symbol table which are of the specified type ("@", "int", "char", "string", "float", "list", "var", "formula", "proc", "procmacro", "func", "builtin", "Real-func", "C-func" or "any"). symboldetail(string): returns a list of information about the named symbol: [name, type, text, targets, sources, master] type is one of "var", "formula", "proc", "procmacro", "func", "builtin", "Real-func", "C-func". symboldetail(pointer): returns a list of information about the named symbol. symboltext(string): returns the original text used when defining a symbol. symboltext(pointer): returns the original text used when defining a symbol. symboldefinition(string): returns a symbol in Eden-interpretable form. symboldefinition(pointer): returns a symbol in Eden-interpretable form. getenv(env): returns the string contents of the environment variable env. putenv(env): set environment variable: env should have the form "name=value". error(message): generate an Eden error. error_no(): returns the last system (not Eden) error number. backgnd(path, cmd, arg1, arg2...): executes a process in the background. pipe(path, cmd, arg1, arg2...): pipes stdout to the process given by path. get_msgq(key flag): gets a message queue. remove_msgq(msgqid): removes a message from the message queue msgqid. send_msg(msgid, [msg_type, msg_text], flag): send a message on a message queue. receive_msg(msgqid, msg_type, flag): receive a message from a message queue. installAOP(notation, agentname): install a new Agent-Oriented Parser notation. notation string must include the initial % character. This function replaces the old "notation" built-in: replace notation("eddi", "eddi_notation"); with installAOP("%eddi", "eddi_notation"); newNotation(name, switchProcPtr, transProcPtr): install a new notation. installIPTrans(name, path): install a new Interactive Process -based translator. removeNotationRadioButton(notation): removes a notation radio button from the tkeden interface. Pass the name of a notation, including the initial % character. installeddi(): install the EDDI notation. installarca(): install the ARCA notation. installdenota(): install the DENOTA notation. installedensl(): install the EdenSL notation. macro(s, para1, para2, ..., paraN): substitute ?1 in s with para1, ?2 with para2 etc and return the result. copyproc(oldname, newname): copy a proc to a new name. showpara(procname, showret): adjust the definition of a proc so that, when called, the parameters and, optionally, return result are printed. (Superseded for most purposes by debug(512)). round(r): make a real value into an integer with rounding. max(number, ...) or max([list of numbers]) : returns the maximum of the numbers. min(number, ...) or min([list of numbers]) : returns the minimum of the numbers. sum(number, ...) or sum([list of numbers]) : returns the sum of the numbers. abs(number) : returns number if > 0, otherwise returns -number (e.g abs(-7)=7). average(number, ...) or average([list of numbers]) : returns the average of the numbers. nthroot(number, n) : returns the n'th root of the number given. factorial(number) : returns the factorial of the number given. product(number, ... ) : returns the numbers passed multiplied together. sign(number) : returns -1 if number is < 0, 0 if number = 0, 1 if number > 0. even(number) : returns the nearest even number to the number given. odd(number) : returns the nearest odd number to the number given. mround(number, multiple) : returns the number rounded to the nearest multiple of the given multiple (e.g mround(62,6)=60). sumsq(number, .. ) or sumsq([list of numbers]) : returns the sum of the squares of the numbers passed. trunc(number) : returns the integer part of the number given. combin(total, n) : returns the number of ways n numbers can be picked from total number of items. ceiling(number, multiple) : returns the number rounded to the nearest multiple of the given multiple that is greater than the number. floor(number, multiple) : returns the number rounded to the nearest multiple of the given multiple that is lower than the number. degrees(angle) : returns an angle given in radians with its equivalent in degrees in a range 0-360. radians(angle) : returns an angle given in degrees with its equivalent in radians in a range 0-2*PI. rounddigits(number, digits) : returns the number rounded to the specified number of digits (e.g rounddigits(123.45,2)=120). gcd(number, ...) or gcd([list of numbers]) : returns the largest number which will divide exactly into all the numbers passed. lcm(number, ...) or lcm([list of numbers]) : returns the smallest number that all the numbers passed will divide exactly into it. variance(number, ...) or variance([list of numbers]) : returns the variance of the numbers passed or the list of numbers passed to it. stdev(number, ...) or stdev([list of numbers]) : returns the standard deviation of the numbers passed or the list of numbers passed to it. sort([list of numbers], direction) : returns the list of numbers sorted. the direction parameter should be 1 to return an ascending list, 2 to return a descending list. median([list of numbers]) : returns the median element of a list of elements, those elements do not need to be in any sorted order. randomise() : seeds the random number generator with a random number. rnd(number) : returns a random number between 0 and the number. Note that both 0 and number are included in the range. realrand() : returns a real random number between 0.0 and 1.0, including 0 but excluding 1. rgb2color(r, g, b): takes values in range 0-255 and returns a colour reference (which should be treated as opaque) to be used in SCOUT/DoNaLD. rgb2colour(r, g, b): same as rgb2color. ipopen(path, cmd, arg1, arg2...): creates a concurrent interactive process, returning a list [rfd, wfd, efd] of stdin, stdout, stderr file descriptors. ipclose([rfd, wfd, efd]): terminates the process created with ipopen. fdready(fd, type, [sec, milli]): returns non-zero if the file descriptor can be read from, written to, or has an exception, depending on the second argument, which should be 'r', 'w' or 'e'. Will block for the time stated in third argument (which can be zero), or indefinately until the necessary condition is achieved if the third argument is @. rawread(fd, maxbytes): returns a string, maximum maxbytes long, read from the file descriptor fd, with no file buffering. rawwrite(fd, string): writes string to the file descriptor, with no file buffering. regmatch(pattern, subject): returns a list of subpatterns in the first match found by the (Perl-compatible) regular expression pattern in subject. The first subpattern is the entire match. regreplace(pattern, replacement, subject!@O, limit!@P): replaces the matches found by pattern in subject with replacement. The optional limit sets the number of replacements that are made. replacement can contain references to parenthesised subpatterns in pattern, in the form "$n" (0<=n<=99). A literal $ can be achieved by escaping it: "\\$" (note the need to escape the backslash in an Eden string). usbhidopen(filename): opens a file (eg /dev/input/event0) as a Universal Serial Bus Human Input Device (eg a joystick or steering wheel), returning the fileid. Available on Linux only at present. usbhidread(fileid): returns a packet of information read from the device in the form [time, type, code, value]. time is returned in the same form as the ftime() routine. If there were no packets to read, empty list is returned. usbhidclose(fileid): closes the fileid. rawserialopen(filename): opens a file (eg /dev/ttyS0) and sets it in raw mode, returning the fileid. This is intended to be used for communication with hardware. Use with rawwrite() and rawserialread(). Available on Linux only at present. rawserialread(fd, maxbytes): returns a string, maximum maxbytes long, read from the file descriptor fd, with no file buffering. rawserialclose(fileid): closes the fileid. inpdevlineno(): returns an integer -- the current line number in the Eden (or other?) code. inpdevname(): returns a string -- the name of the current input device. (NB: for the above, use eg eval(inpdevlineno()) to evaluate and obtain values from parse time rather than run time.) debug(status): sets the interpreter debugging mode. Add these values to form the parameter: 1: various 2: RunSet (inc todo()) debugging 4: Eden parser debugging (=yydebug) 8: Sasami 16: Donald 32: Scout parser debugging (=st_debug) 64: malloc debugging (emalloc macro) 128: Tcl_Eval debugging 256: execute debugging 512: func / proc / procmacro call debugging 1024: VMWRIT debugging (in 1 also) 2048: Donald parser debugging (=dd_debug) 4096: Print errors on stderr as well as the error window. 8192: regular expression debugging 16384: notation debugging 32768: timers C code debugging trace(): prints a stack trace of proc/func calls made on stderr. pack(data...): stores data in a newly allocated memory space on the heap. createtimer(cmdstring, millis): adds cmdstring to the todo() queue in 'millis' milliseconds (which must be an integer >= 1). The timing of this event is only approximate and may be more (or less...?!) than specified. Returns a token which can be passed to deletetcltimerhandler(). This is a relatively low- level function: recommend you write procedures triggered by 'edenclock' variables instead if possible (see 'edenclocks' variable and 'setedenclock' and other helper procedures). deletetimer(token): must be passed a token previously returned from createtcltimerhandler. Stops the particular timer from activating. deletealltimers(): stops all timers from activating. setedenclock(clockPtr, millis): cause the integer variable pointed to by clockPtr to increment every 'millis' milliseconds. For details of '@' and '0' special cases for 'millis', see description of 'edenclocks' list. Eg: 'setedenclock(&a, 1000);' causes variable 'a' to increment every sec. removeedenclock(clockPtr): removes edenclock variable from edenclocks list. pauseedenclocks(): temporarily pause all edenclocks. unpauseedenclocks(): continue after having paused edenclocks. (Note that each clock will be restarted at roughly the same instant so the phase relationships between each will not be the same as before the pause.) edeninterruptedhook(): define this procedure to cause statements to happen after the Interrupt button / ctrl-c are pressed. ... there may be more built-in functions and procedures, depending upon the Eden variant you are using. -- 8. C-LIBRARY FUNCTIONS AND PROCEDURES ------------------------------------- (see their man pages for more detail) fopen(filename, mode): opens a file, returning the fileid or 0 on error. fclose(fileid): closes a file stream. fgetc(fileid): gets and returns a character from a file stream. fgets(n, fileid): returns a string (max n characters) read from a file stream and @ when end of file has been reached. fscanf(fileid, format, &out1, &out2...): formatted read from the input stream. gets(): returns a string read from stdin. ungetc(c, fileid): pushes the character back onto the input stream fileid. fprintf(fileid, format, args...): prints a formatted string to a file stream. fputc(char, fileid): prints a character to a file stream. pclose(fileid): close a pipe. popen(command, mode): open a pipe, returning fileid. putw(w, fileid): puts a machine word to a file stream. setbuf(fileid, buf): set the buffer size of a file. sprintf(&s, format, args...): formatted print to a string (warning: s must first be initialised to a string of appropriate length). sscanf(&s, format, &out1, &out2...): formatted read from string s. system(string): execute command in a sub-shell. stat(filename): returns a list of information about the named file: UID, GID, size, times of last access, data modification, file status change. srand(seed): seed the random number generator. rand(): return a random number (range is system dependent). sin(float): returns the sine of its (radians) argument. cos(float): returns the cosine of its (radians) argument. tan(float): returns the tangent of its (radians) argument. asin(float): returns the principle arcsine of its (radians) argument. acos(float): returns the principle arccosine of its (radians) argument. atan(float): returns the principle arctangent of its (radians) argument. atan2(y, x): returns the principle value of the arctangent of y/x (floats). sqrt(float): returns the square root of its argument. pow(x, y): returns the value of x raised to the power y (floats). log(float): returns the natural logarithm of its argument (which must be +ve). log10(float): returns the logarithm to base 10 of its argument. exp(float): returns the exponential (pow(e,x)) of its argument. ... the above always return a float, even if all arguments are ints -- 9. MORE INFORMATION ------------------------------------------------------- See the full manual available at http://go.warwick.ac.uk/EDEN/ for more detail. EDEN-1.66/lib-tkeden-1.66/keys.txt0000644000175000017500000000433610243105157016241 0ustar rboyattrboyattSome menus and buttons have key shortcuts. These are shown with an underlined letter, and can be activated by pressing Alt and that letter. For example: Accept the current input: Alt-a View the Eden Definitions window: Alt-v Alt-e Valid throughout Eden: Bring all Eden windows to the front: Shift-Control-Tab (in any window) Using the mouse in the input window: Select text: drag Select word: double-click Select words: drag after a double-click Select line: triple-click Select lines: drag after a triple-click Adjust ends of selection: Shift + drag button 1 Reposition cursor without affecting selection: Control + click Insert text at mouse cursor: click button 2 Scroll view: drag button 2 Using the keyboard in the input window: Move backwards in input history: Meta-Up or Control-Alt-Up or Alt-p Move forwards in input history: Meta-Down or Control-Alt-Down or Alt-n Cursor left: Left or Control-b Cursor right: Right or Control-f Move cursor by words: as above, with Control or Meta Move cursor to start of line: Home or Control-a Move cursor to end of line: End or Control-e Cursor up: Up or Control-p Cursor down: Down or Control-n Move cursor by paragraphs: as above, with Control Move cursor up one screenful: Prior (Page up) Move cursor down one screenful: Next (Page down) or Control-v Move cursor to start of text: Control-Home or Meta-< Move cursor to end of text: Control-End or Meta-> Select text: as above, with Shift Select all text: Control-/ Select no text: Control-\\ Copy selection to clipboard: Copy (F16) or Meta-w Cut selection to clipboard: Cut (F20) or Control-w Insert clipboard at cursor: Paste (F18) or Control-y Delete to left of cursor: Backspace or Control-h Delete to right of cursor: Delete or Control-d Delete word to right of cursor: Meta-d Delete word to left of cursor: Meta-Backspace or Meta-Delete Delete to end of line: Control-k Delete to beginning of line: Control-u Delete selection: Control-x Clear all text in input window: Meta-0 or Control-Alt-0 Open new line (insert newline): Control-o Reverse order of two characters to right of cursor: Control-t Indent: tab stops (use the Tab key) are set to two character widths EDEN-1.66/lib-tkeden-1.66/sasami.txt0000644000175000017500000000604210256231706016543 0ustar rboyattrboyatt------------------------- Sasami QUICK REFERENCE ----------------------------- CONTENTS OF THIS QUICK REFERENCE: 1. Controlling the Sasami window 2. Syntax 3. Commands 4. Variables 5. More information NB Syntax elements in (parentheses) are required, in [square brackets] are optional. (Parentheses are used rather than the angle brackets usual in BNF due to problems with using angle brackets in HTML). -- 1. CONTROLLING THE SASAMI WINDOW ------------------------------------------ Hold down a mouse button and drag the contents of the Sasami window: Rotate about X & Y axes: - left (or only) mouse button drag Move camera position in XY plane: - middle mouse button (no 2) drag, or - hold Control key and drag with left (only?) mouse button Zoom in and out on Z axis: - right mouse button (no 3) drag, or - hold Command/Apple/Mod1 key and drag with left (only?) mouse button -- 2. SYNTAX ----------------------------------------------------------------- No semi-colons: line feeds are terminators # UNIX shell style one-line comments Whitespace and commas are command / parameter separators Escaping to Eden: ` (back-tick) is a one-line escape to Eden. -- 3. COMMANDS --------------------------------------------------------------- open_display close_display vertex (vertex name) (x) (y) [z] polygon (polygon name) poly_geom_vertex (polygon name) (vertex names) poly_tex_vertex (polygon name) (vertex names) poly_colour (polygon name) (r) (g) (b) [a] poly_material (polygon name) (material name) material (material name) material_ambient (material name) (r) (g) (b) [a] (ambient = in darkness) material_diffuse (material name) (r) (g) (b) [a] (diffuse = in normal light) material_specular (material name) (r) (g) (b) [a] (specular = in direct light) material_texture (material name) (texture name) object (object name) object_poly (object name) (polygon names) object_pos (object name) (x) (y) (z) object_rot (object name) (x) (y) (z) object_scale (object name) (x) (y) (z) light (light name) light_pos (light name) (x) (y) (z) light_enabled (light name) (light state) light_directional (light name) (light state) light_attenuation (light name) (attenuation factor) light_ambient (light name) (r) (g) (b) [a] light_diffuse (light name) (r) (g) (b) [a] light_specular (light name) (r) (g) (b) [a] load_full_obj (name prefix) (filename) load_obj (name prefix) (filename) (loads only objects and materials into Eden) bgcolour (r) (g) (b) viewport (x size) (y size) -- 4. VARIABLES -------------------------------------------------------------- sasami_viewport_xsize sasami_viewport_ysize sasami_viewport_bpp sasami_bgcolour_r sasami_bgcolour_g sasami_bgcolour_b sasami_show_axes sasami_camera_scale sasami_camera_rotthentrans sasami_camera_frustum_left sasami_camera_frustum_right sasami_camera_frustum_bottom sasami_camera_frustum_top sasami_camera_frustum_near sasami_camera_frustum_far sasami_camera_reset() -- 5. MORE INFORMATION ------------------------------------------------------- See http://go.warwick.ac.uk/EDEN/ for more detail. EDEN-1.66/lib-tkeden-1.66/client.tcl0000644000175000017500000001636010256056641016516 0ustar rboyattrboyatt# # $Id: client.tcl,v 1.6 2001/08/01 17:59:47 cssbz Exp $ # # Just the client specific bits of tcl. This is sourced when appropriate # from edenio.tcl [Ash] # Client-Server & Socket # display the message of client connection on client window # read script line-by-line sent by the server from socket and # evoke eden evaluation proc read_sock {sock} { global receiveScripts EOF esvrSock global EOS ECS serverReply variantversion set lineScript [gets $sock] set lineScript [string trimright $lineScript] if {[eof $sock]} { close $sock set esvrSock "" # tk_dialog .message "$variantversion: Network Message" \ # "The dtkeden server has been shut down and the connection has been closed." \ # warning 0 OK set choice [tk_dialog .message "$variantversion: Network Message" \ "The dtkeden server has been shut down and the connection has been closed." \ warning 1 "Stop" "Restart"] if {$choice == 0} { quit } else { if {$choice == 1} { restart } else { puts "Internal error - choice unknown - stopping" quit } } } else { if {$lineScript == $ECS} { incr serverReply return } if {$lineScript == $EOF || $lineScript == $EOS} { appendHist $receiveScripts # set receiveScripts "ScoutWinTrigged = 0;\n$receiveScripts\n" set receiveScripts "$receiveScripts\n" evaluate $receiveScripts if {$lineScript == $EOS} { #puts $esvrSock $EOS sendServer $EOS } set receiveScripts "" } else { set receiveScripts "$receiveScripts\n$lineScript" } } } proc sendUsrName {} { global usrName EOU getUsrName variantversion _tkeden_version set getUsrName 1 sendServer1 "$EOU" set variantversion "dtkeden $_tkeden_version (client:$usrName)" wm title . "$variantversion: Input" } proc loginUsrName {} { global esport eshost variantversion usrName toplevel .login wm title .login "$variantversion: Login" label .login.mess -text "You have connected to the dtkeden server \n\ with channel <[expr $esport-9000]>\ on host <$eshost>.\n\ Please login with your agent name" entry .login.usrName -relief sunken -textvariable usrName pack .login.mess .login.usrName -side top -padx 1m -pady 2m button .login.ok -text "OK" -command { if {[string trim $usrName] != ""} { sendUsrName; destroy .login } else { bell } } # button .login.cancel -text "Cancel" -command { notLogin; destroy .login } button .login.clear -text "Clear" -command { set usrName ""; focus .login.usrName } pack .login.ok .login.clear -side left -expand 1 bind .login.usrName { sendUsrName; destroy .login } focus .login.usrName grab .login } proc setupSocket {} { global usrName getUsrName global esvrSock eshost esport variantversion dtkedenloginname puts "$variantversion: connecting to dtkeden server channel <[expr $esport-9000]> on host <$eshost>..." # this is a synchronous connection: # The command does not return until the server responds to the # connection request set errCode [catch {set esvrSock [socket $eshost $esport]} string] # puts $errCode # Setup monitoring on the socket so that when there is data to be # read the proc "read_sock" is called if {$errCode == 0 } { # puts "You are connected to tkServer in 'gem'...\n" fileevent $esvrSock readable [list read_sock $esvrSock] # configure channel modes # ensure the socket is line buffered so we can get a line of text # at a time (Cos thats what the server expects)... # Depending on your needs you may also want this unbuffered so # you don't block in reading a chunk larger than has been fed # into the socket # i.e fconfigure $esvrSock -blocking off fconfigure $esvrSock -buffering line -translation {crlf crlf} # set up our keyboard read event handler: # Vector stdin data to the socket #fileevent stdin readable [list read_stdin $esvrSock] # message indicating connection accepted and we're ready to go # wait for and handle either socket or stdin events... #vwait eventLoop if {$dtkedenloginname != ""} { # login name was set using an EDEN command line argument set usrName $dtkedenloginname #after 3000 sendUsrName } else { # need to ask the user what the login name should be loginUsrName vwait getUsrName } } else { puts "Fail to connect dtkeden server channel <[expr $esport-9000]> on host <$eshost>." puts "Using dtkeden as a stand-alone environment" .radios.send config -state disabled bell } } # read scripts from tkeden input window and send them to server set sendServerDebug 0 proc sendServer { text } { global EOF ECS synchronize serverReply sendServerDebug # don't change synchronize which comes from ../Eden/main.client.c if ($sendServerDebug) { puts "sendServerDebug: sendServer1" } if {$synchronize > 0} { while {$serverReply < 0} { vwait serverReply } } if ($sendServerDebug) { puts "sendServerDebug: sendServer2" } if {$synchronize > 0} { set text "$text\n$ECS" } else { set text "$text\n$EOF" } if ($sendServerDebug) { puts "sendServerDebug: sendServer3" } sendServer1 $text } proc sendServer1 {text} { global esvrSock usrName EOF currentNotation global synchronize serverReply sendServerDebug if ($sendServerDebug) { puts "sendServerDebug: sendServer4" } set isCancel -1 set text "$text$usrName" if {$esvrSock == "" } { set isCancel [connectServer] } if {$isCancel == "0"} return if {$esvrSock != ""} { # set errCode [catch {.menu.accept invoke} string] ; # may need to handle error control??? # puts "text $text" set errCode -1 while {$errCode !=0} { getCurrentNotation # cannot change currentNotation below. It comes from EX/Exinit() set errCode [catch {puts $esvrSock "$currentNotation\n$text"} string] if {$errCode != 0} { set isCancel [connectServer] if {$isCancel == "0"} break } } if {$synchronize > 0} { incr serverReply -1 while {$serverReply < 0} { vwait serverReply } } } } proc connectServer {} { global esvrSock variantversion set selectButton -1 while { $selectButton != 0 } { set selectButton [tk_dialog .message "$variantversion: Connection Failed" \ "Cannot connect to server" warning 0 Cancel Retry ] if {$selectButton == "1"} { set esvrSock "" setupSocket if {$esvrSock != ""} break } } return $selectButton } set EOF "@#$%EOF%$#@" set EOU "@#$%EOU%$#@" set EOS "@#$%EOS%$#@" set ECS "@#$%ECS%$#@" set serverReply 0 set receiveScripts "" set usrName "" set getUsrName 0 #set eshost "gem" #set esport 7000 #puts "eshost $eshost esport $esport" set esvrSock "" setupSocket EDEN-1.66/lib-tkeden-1.66/change.log0000644000175000017500000036104210325731011016450 0ustar rboyattrboyatt-*-text-*- **** EDEN CHANGELOG FILE **** The most recent changes are listed first. Within each version section, most recent changes go at the end. ** 1.66 [Ant] Thu Oct 20 15:59:14 BST 2005 ** Added DoNaLD function 'scalexy'. Adding the --with-bison option to the configure script. [Russell] Added a search button to the help windows. This calls up the standard 'find' dialogue. [Charlie] Fixed problem with opening multiple help windows. [Charlie] Added observable 'tkeden_textsize' to change the size of the text in the input window. Changed scout 'screen' behaviour to be hidden until used. ** 1.65 [Ant] Mon Jul 25 14:06:18 BST 2005 ** Added the latest agent-oriented parser (AOP) and removed traces of the existing AOP. Updated the Eddi notation to make use of the new AOP. ** 1.64 [Ashley] Fri Jul 8 16:25:47 BST 2005 ** Error message fix: Tcl todo command previously described itself as the 'eden' command. Major changes to RunSet (todo()) handling to simplify code. Bug fix: mouse motion in a sensitive:MOTION Scout window previously caused large callstacks due to reentrant calls, which would blow a Tcl stack in some circumstances. Added a new icon (an eye) on Mac. Bug fixes to handling of Interrupt button and ctrl-c press. Added createtimer, deletetimer, deletealltimers C built-ins, higher-level Eden edenclocks list and setedenclock, removeedenclock, pauseedenclocks, unpauseedenclocks helper procedures. These should allow simplified models which have previously used a common case of 'todo()' and also allow model simulations to be related to real time without hogging the CPU. Added edeninterruptedhook hook possibility. Bug fix: previously 'execute("writeln(42);");' would cause ttyeden to crash if the -l argument was not given. ** 1.63 [Ashley] Mon Jun 27 16:37:43 GMTST 2005 ** Minor changes to Sasami and Scout Quick Reference guides to make more compatible with HTML, so they can be displayed in the new (currently unreleased) EM web site. Bug fix: the new 'restart' command didn't prove reliable on Windows: it left behind a process attempting to take 100% CPU. Hopefully now fixed. ** 1.62 [Ashley] Tue Jun 21 20:15:43 GMTST 2005 ** dtkeden on Mac OS X (unfortunately requiring use of command line to run it at present). Bug fix: fixed a segmentation fault that could occur in some cases when a func/proc/procmacro was not found. [ant/ashley] Implemented single-line # comments in %lsd. Now (hopefully), the double-hash ## single-line comment facility works in all notations. Added a -w command line argument for dtkeden login name. (w for "who" as the number of single-letter possibilities is short!). Changed EDEN web site location to use the go.warwick redirect. Added a Restart command, available as a menu and also when a dtkeden client shows the "dtkeden server has shut down" message. Bug fix: previously dtkeden didn't work correctly on Windows without cygwin installed due to use of the UNIX 'date' command. Fixed. ** 1.61 [Ashley] Mon Jun 13 14:50:11 BST 2005 ** Fixed small build configuration error. Added builtin 'realrand()'. [ant] Modified eden function 'rnd(int)' to use more random 'realrand()'. [ant] ** 1.60 [Ashley] Wed Jun 8 18:18:42 BST 2005 ** Minor code configuration changes. The full EDEN distribution (tkeden, ttyeden, dtkeden) seems to build OK for Windows. ** 1.59 [Ashley] Wed Jun 8 13:19:39 BST 2005 ** Bug fix: showpara() procedure was not working -- fixed. arca.eden can now be included without a working IPTrans setup. Bug fix: opening two windows using the procedure involving OpenDisplay documented in the EDEN FAQ caused display "corruption" (incorrect aspect ratio etc) in some cases. This is now fixed. Bug fix: EDDI was writing to the Eden global variables p1 and p2, which conflicted with (eg) some people's DoNaLD models -- fixed. ** 1.58 [Ashley] Thu Jun 2 20:06:22 BST 2005 ** Minor code configuration changes to enable experimental Windows build. ** 1.57 [Ashley] Thu Jun 2 11:51:24 BST 2005 ** Automated creation of Mac distribution ("make macdist"). Separated make's Windows targets into "make winapp" and "make windist". Implemented several key shortcuts on Mac OS X. Changed some menu structures for consistency with Mac OS X. Found and fixed possible memory reallocation bug in Eden regular expression facility. Greatly increased Sasami performance by changing data structures used for vertices and polygons. Sasami now prints rendering performance timing information out if "debug(8);" is executed in Eden. ** 1.56 [Ashley] Wed May 25 13:47:36 BST 2005 ** Experimental hack change to Sasami vertex data structure which seems to vastly improve the speed of Sasami rendering. ** 1.55 [Ashley] Tue May 24 12:06:47 BST 2005 ** Sasami now works on the Mac. As part of this, the Togl code (used in Sasami) was updated, which might lead to other minor changes. Source code is now hosted in Subversion. The -v argument and the 91 tkeden menu show the repository revision number from which the binary was built. Sasami window can now be controlled by dragging with mouse and using keyboard modifier keys (to make control with a single mouse button possible -- multi-button mice operate in the original way on Mac). Added documentation to Sasami Quick Reference. ** 1.54 [Ashley] Thursday January 20 17:35:21 GMT 2005 ** Added new Eden 'inpdevlineno()' built-in function, which returns the current line number in the Eden (or other?) code. Also 'inpdevname()', which returns the name of the current input device. See mentions in eden.txt for usage. Added information about who made each release to this file -- mostly [Ashley] at this point... Updated credits.txt a little. Removed line about reporting bugs at SourceForge at the top of this file. ** 1.53 [Ashley] Tue Mar 9 12:57:13 GMT 2004 ** Added rawserialopen, rawserialread and rawserialclose functions for use with the train system. ** 1.52 [Ashley] Monday March 1 09:28:28 GMT 2004 ** Added Son V Truong, Meurig Beynon to credits.txt. Also added approximate years of contribution to credits.txt and ordered chronologically. Added another curses possibility to configure script required on Mac OS X with Fink. ttyeden would previously not compile if the readline library was not available -- fixed. Added timing instrumentation of scheduling and graph cycle checking. The Eden functions insReset() and insPrint(); are available when compiled with -DINSTRUMENT Remembered and added credit to Carlos Fischer in this file for a bug in 1.13. Added thanks to unnamed contributers in credits.txt. Added symbol types to description of symbols(), type() and symboldetail() functions in eden.txt. Fixed a bug in symboldefinition() function which previously caused a "nested too deeply" evaluation loop if the definition s is symboldefinition("s") (and other larger examples which include this dependency) was created. Improved error message "list or string required ... when trying to find 1th item" to "... item with index 1". Fixed bug in str() function which caused a segmentation fault when given a long list -- for example 'writeln(str(symboltable()));'. ** 1.51 [Ashley] Wednesday January 14 19:42:04 GMT 2004 ** Scout windows background colour now explicitly set to what it used to be in older versions of tkeden. (This will probably appear a bit dark on the Mac). Added WMB's fix for the EDDI garbage collector. Before, eden variables that were dependent upon values in an eddi table would have been automatically removed during garbage collection. Now, a definition is only removed if the definition name starts with "var_". Got compiling on Windows again (the last time was 1.46). Using an up to date cygwin, with Tcl/Tk 8.4 rather than 8.0. This might possibly bring some associated interface improvements. Sasami is unfortunately broken at the moment (an assertion in togl.c fails when the Sasami window is opened), so this won't be a public release. ** 1.50 [Ashley] Mon Mar 31 20:04:30 BST 2003 ** Fixes for Mac OS X 10.2.4 with Tcl/Tk 8.4.2. This latest version of Tcl seems to have fixed the following bugs that were present in 1.43. Many other issues remain on this platform however. - Window close / minimise / max buttons now show indicators on mouse over - Paste from elsewhere in OS now works (Apple-c, Apple-v etc to copy and paste, although it seems you can't currently select text from any tkeden window except the input window). - tkeden -> Hide tkeden now works (although Apple-h key shortcut doesn't seem to) - Apple-q no longer gives a bus error (although it doesn't work) - Open dialogue doesn't seem to give "tkwin == NULL, 224" errors Middle and right mouse buttons now emulated on Mac OS X. Hold down the Option (Alt) key when pressing the mouse button for a middle mouse button click, or Command (Apple) for a right click. This only works for Scout windows (and probably not TEXTBOXES). Fixed background colour for Scout windows to a light grey colour rather than read the system default (which on Mac OS X is white). ** 1.49 [Ashley] Tuesday March 18 16:27:44 GMT 2003 ** Added Eden sasami_camera_scale list variable. Added ability to move the camera position in X and Y by using the middle mouse button (this will probably need rethinking for Windows). Added Eden sasami_reset_camera() proc which can be used if you get lost. Added Eden sasami_camera_rotthentrans variable, initially set to 0, when the Sasami code first translates then rotates the camera, making it easy to view an object centred on the origin. If this flag is set to 1, the rotation is done first, making it easier to simulate an observer in the world, standing at a position and looking in a particular direction. Added Eden sasami_camera_frustum_left, right, bottom, top, near and far variables in order to allow the field of view of the camera to be adjusted. In order to preserve the aspect ratio, top and bottom are initially set to the viewport x size / y size (but integer division for some reason). This is currently a hack: these variables should be linked using dependency to sasami_view_xsize and ysize, but sasami_view_xsize/ysize do not currently update when the Sasami window is resized using the mouse. Eden sasami_reset_camera() proc renamed to sasami_camera_reset() to follow the existing scheme. ** 1.48 [Ashley] Tuesday February 18 17:44:33 GMT 2003 ** Added usbhidopen, usbhidread, usbclose Eden functions (documented in eden.txt) on Linux. The following code implements control of a Sasami axis by a USB steering wheel: %eden wheelfd = usbhidopen("/dev/input/event0"); proc readwheel { auto l; l = usbhidread(wheelfd); if (l != []) wheel = l; todo("readwheel();"); } readwheel(); %sasami open_display %eden sasami_camera_rot is [0, 0, wheel[4]]; The following commands may be required to configure the Linux USB system appropriately: modprobe hid ; modprobe uhci ; modprobe evdev mount -t usbdevfs usbdevfs /proc/bus/usb (to test): cat /dev/input/event0 | od -h If event0 is not there: mknod /dev/input/event0 c 13 64 chown csXYZ /dev/input/event0 ** 1.47 [Ashley] Sunday February 16 17:26:44 GMT 2003 ** The Scout "bordercolour" attribute, although documented, was previously unimplemented as Tk doesn't provide a way to control the border colour. However Tk does provide a way to control the highlight colour, so now this is used instead of the border when a coloured (non-"black") border is requested. Fixed numerous bugs in Scout ImageScale function. Added ImageSized Eden function, which will scale an image to the requested pixel size (preserving the aspect ratio). This function is only currently accessible from Donald (Scout would require further work). Eg: %donald image img char filename int iconSize iconSize = 250 img = I!ImageSized("gif", filename, iconSize) o label lbl lbl = label(img, {500, 250}) Added sasami.eden. Camera position and axes rotation are now defined as Eden variables (sasami_camera_pos and sasami_camera_rot respectively). Each is an Eden list specifying x, y and z. This new facility should allow the Sasami display to be controlled by Eden code. Modified the Tcl mouse button handling code to use this new scheme. FALSE and TRUE now a part of eden.eden, not donald.eden. ** 1.46 [Ashley] Friday October 25 11:34:45 BST 2002 ** File -> Execute caused "notationGet called when currentNotation is not set sensibly" errors when the executed file contained a notation change. (An error introduced around 1.43). Fixed. Notation changes in files introduced by File -> Execute didn't persist, although the interface showed them persisting. This bug has existed since at least 1.30. Fixed. ** 1.45 [Ashley] Thursday October 24 21:33:17 BST 2002 ** DCS Linux now needs -I to compile, as readline libraries #include . Created dcs-linux-i686.configure, dcs-solaris-i386.configure, dcs-solaris-sparc.configure. Notations with names of length multiple 8 characters (including the % and terminating character, eg %sqlzero) previously failed to work. Now fixed. The reason is something I don't quite understand, to do with getheap(). Tcl procedure removeNotationRadioButton now given an Eden procedure, which works also in ttyeden (where it silently does nothing). Now, if you want to hide a notation radio button to hide the notation's existence (note that the notation itself is not actually removed), use the Eden removeNotationRadioButton procedure, passing the name of the notation, including the % character. For example: %eden removeNotationRadioButton("%eden"); 'notation' command reinstated as a quick workaround to get existing models which use AOP to work. This function will be removed in the future once we've fixed the existing models to use the new installAOP procedure. symboltable() and symboldetail() now include the symbol's "master" information, which describes the last agent to change the symbol, as the last item in the list (inner list for symboltable()) returned. This may possibly break existing models which use these functions. Making attempts to debug sqleddi (mainly within the model). Added more output to debug(2), showing when todo() is actually called. The new notations framework now understands the ## comment syntax, so all parsers (including AOP) should now automatically ignore ## single line comments. Fixed bugs in ttyeden's handling of todo(), hopefully now allowing sqleddiBeynon2002 to function correctly in ttyeden. The "currently active notation at the end of an included file doesn't persist" bug (an attempt was made to fix this in version 1.31 below) still persists, but the prompt faithfully reflects the currently active notation. ** 1.44 [Ashley] Fri Aug 30 18:51:19 2002 ** Compiled dtkeden on Windows, fixing minor problems along the way. A major problem remains: the server is killed with signal 11 when a client logs in. When run under a debugger, this problem does not occur. ** 1.43 [Ashley] Monday August 19 20:56:44 BST 2002 ** Implemented ipopen on Mac OS X also (pseudo-terminals on BSD require a different approach to SVR4). Added regmatch() and regreplace() regular expression functions to Eden, using the PCRE (Perl Compatibile Regular Expressions) library. regmatch needs some rethinking to return more than one match. Added documentation to eden.txt. Examples: writeln(regreplace("a", "z", "123a4567a89a0")); writeln(regreplace("(.)\\[(.)\\]", "ashfunc($1,$2)", "l[1] is l[2];")); writeln(regmatch("(?U)(.*)a(.*)$", "hallo chrisababe")); Added PCRE and Chris Roe to credits.txt. Added more detail about authors of libraries. Periods at ends of sentences in eden.txt. Added debug(8192) for debugging the regular expression code (including the string memory allocation code). Generic framework for new notations implemented. Call newNotation(name, switchProcPtr, transProcPtr) to install a new notation, which is implemented in raw Eden. Agent-oriented parsers will be worked into this framework soon. Added %edensl notation: Eden Symbol Lists, where each element in a list resides in its own symbol, and can therefore trigger other items and have its own independent definition. The notation is the same as normal Eden. Call installedensl(); to install it, then use %edensl to switch to it. It is incomplete: at present, list concatenation is not implemented and there is no way to reference the entire contents of a list. Implemented dirname and basename functions when missing (on Mac OS X) in Eden using the new regular expression functions. This will fix an error that occurs when doing File -> Open on Mac OS X. Generic code for Interactive Process -based translators (ones that run in an external concurrent process, eg current arca and denota) implemented. Call installIPTrans(name, path) to install a new IP-based notation. Got edensl working in tkeden (newNotation now adds a radio button etc). Made it possible for new notations to override the built-in ones (eg %donald, %scout). Test with: proc p {} newNotation("%scout", &p, &p); Fitted Chris Brown's agent-oriented parser (AOP) into the new framework. The 'notation' builtin command has been removed, and is replaced by the new installAOP(); Eden command, which has the same arguments as the old notation command, except that the first argument (the notation name) must now start with the '%' character. Example modification required: change notation("eddi", "eddi_notation"); to installAOP("%eddi", "eddi_notation");. No further modification should be necessary. Added %donald0 as an alias for %donald, making it possible to define a new notation overwriting the built-in %donald but still be able to use it. Added eden_debug_notations Eden variable, and documented in eden.txt. Added a notationStack. This is used when a non-builtin notation is active and execute() or include() are called. These commands cause arbitrary text to be interpreted by Eden, and the currently active notation is expected to be restored afterwards. The notationStack handles this. Note that parsers cannot reenter themselves (ie, during a call to their "parseChar" function, invoke a call to execute() or include() which includes a notation switch to their own notation). Parsers can use other non-builtin parsers, but only if buffers are not shared between notations. Note that the IP translators do not share buffers, but AOP translators do currently, and so AOP-implemented notations cannot be used within the implementation of another AOP notation. ipopen() now returns a sensible error message if the command passed cannot be executed or doesn't exist. installarca() now starts Arca as an IP translator (the version in arcaWard2002). So Arca is now "integrated" into tkeden... but it runs slowly due to the one-second delay translator sychronisation problem. %edensl now makes a "whole" definition for each symbol list, which is defined to be the composite of the components, which were previously only accessible individually. A triggered procedure is automatically introduced for each list which updates the "whole" list definition if the list length changes. Concatenation is now handled in the standard Eden domain, using the "whole" value. %edensl has problems remaining when translating procs and with quoted parameters. Merged in Meurig's changes to arca.eden (a few variables were not declared as auto). Integrated Arca and Denota translators with a new empublic installation for these. In the DCS installation, these translators can be installed into ttyeden or tkeden by using installarca(); or installdenota(); Documented the above new commands roughly in eden.txt. ** 1.42 [Ashley] Wed Jul 10 20:34:37 BST 2002 ** Minor coding style improvements in eden.eden. arca.lib moved to arca.eden. Added installarca() function to eden.eden. Models using Arca should call installarca() once, before any Arca code is interpreted (rather like installeddi() and eddi code). The Arca translator will hopefully eventually be integrated into tkeden in a similar fashion to eddi, but for now we only have an external translator (arcaBird1991), which must be used to preprocess files with arca code before tkeden can load it. Improved Donald openshape example in donald.txt. Figured out what arc parameters [p1, p2, a] are and documented in donald.txt. Added information about trace() to eden.txt. Added info about errors from fopen to eden.txt. Added Eden ipopen(), ipclose(), fdready(), rawread() and rawwrite() functions in order to implement external translators in Eden. Documented in eden.txt. Removed traces of (commented out) kbhit() implementation, as fdready() does this job and actually works. Removed "ghost white" from rgb.txt. Checked into CVS. ** 1.41 [Ashley] Friday May 24 16:55:49 BST 2002 ** Fixed Scout image scaling for attributeexplorernnRoe2000: scaling by an integer size is now handled by Tk, which should work on all platforms. Non-integer scaling is handled by the external pnmscale utility, which might not exist on all platforms. Added note to Donald Quick Reference about arc's strange syntax (which doesn't match circle, rectangle etc. Added section numbering and contents information to quick reference guides. Eden modulus operator (%) now works on real numbers as well as integers. Added note to Eden Quick Reference about math functions returning floats. Added 26 new functions defined by Chris Roe to eden.eden. They are: max, min, sum, average, abs, nthroot, factorial, product, sign, even, odd, mround, sumsq, trunc, combin, ceiling, floor, degrees, radians, rounddigits, gcd, lcm, variance, stdev, sort, median. Each is listed below with the parameters that should be passed and some examples of how they can be used. In all the examples the list a = [3,4,5,6]; max(number, ...) or max([list of numbers]) : returns the maximum of the numbers e.g max(1,2)=2, max(a)=6. min(number, ...) or min([list of numbers]) : returns the minimum of the numbers e.g min(1,2)=1, min(a)=3. sum(number, ...) or sum([list of numbers]) : returns the sum of the numbers e.g sum(a)=18, sum(2,3,4)=9. average(number, ...) or average([list of numbers]) : returns the average of the numbers e.g average(a)=4.5, average(7,9,11)=9. abs(number) : returns number if > 0, otherwise returns -number e.g abs(-7)=7, abs(2)=2. nthroot(number,n) : returns the n'th root of the number given e.g nthroot(4,2)=2, nthroot(81,4)=3. **There may be some problems with precision of the answer with large n due to the C library function used. ** factorial(number) : returns the factorial of the number given e.g factorial(4)=24, factorial(-2)=@. product(number, ... ) : returns the numbers passed multiplied together e.g product(2,3)=6, product(a)=360. sign(number) : returns -1 if number is < 0, 0 if number = 0, 1 if number > 0 e.g sign(4)=1, sign(-230.2323)=-1. even(number) : returns the nearest even number to the number given e.g even(4.5)=4, even(5.5)=6. odd(number) : returns the nearest odd number to the number given e.g odd(4.5)=5, odd(3.5)=3. mround(number,multiple) : returns the number rounded to the nearest multiple of the given multiple e.g mround(62,6)=60. sumsq(number, .. ) or sumsq([list of numbers]) : returns the sum of the squares of the numbers passed e.g sumsq(2,3,4)=29, sumsq(a)=86. trunc(number) : returns the integer part of the number given e.g trunc(4.56)=4. combin(total,n) : returns the number of ways n numbers can be picked from total number of items e.g combin(4,2)=6. ceiling(number,multiple) : returns the number rounded to the nearest multiple of the given multiple that is greater than the number e.g ceiling(62,6)=66. floor(number,multiple) : returns the number rounded to the nearest multiple of the given multiple that is lower than the number e.g floor(64,6)=60. degrees(angle) : returns an angle given in radians with its equivalent in degrees in a range 0-360 e.g degrees(PI)=180. radians(angle) : returns an angle given in degrees with its equivalent in radians in a range 0-2*PI e.g radians(180)=3.14... rounddigits(number,digits) : returns the number rounded to the specified number of digits e.g round(123,2)=120, round(123,1)=100, round(123.232,4)=123.2. gcd(number, ...) or gcd([list of numbers]) : returns the largest number which will divide exactly into all the numbers passed e.g gcd(2,6)=2, gcd(6,9,24)=3, gcd(3,7,24,28)=1, gcd(a)=1. lcm(number, ...) or lcm([list of numbers]) : returns the smallest number that all the numbers passed will divide exactly into it e.g lcm(8,12)=24, lcm(4,6,8)=24, lcm(a)=60. variance(number, ...) or variance([list of numbers]) : returns the variance of the numbers passed or the list of numbers passed to it e.g variance(23,34,46,43)=80.5, variance(a) = 1.5. stdev(number, ...) or stdev([list of numbers]) : returns the standard deviation of the numbers passed or the list of numbers passed to it e.g stdev(23,45,67)=17.96..., stdev(a)=1.22... sort([list of numbers], direction) : returns the list of numbers sorted. the direction parameter should be 1 to return an ascending list, 2 to return a descending list e.g sort(a,2)=[6,5,4,3]. median([list of numbers]) : returns the median element of a list of elements, those elements do not need to be in any sorted order e.g median(a)=4.5. These functions have been tested, but there may still be some bugs in some of the routines. Please email croe@dcs if you find any problems with the routines. Most of the functions do not perform any error checking, they assume you are providing a valid list of parameters. Added two more functions from Chris Roe, inspired by functions from complexGardner1999: randomise() : seeds the random number generator with a random number rnd(number) : returns a random number between 0 and the number. Note that both 0 and number are included in the range. e.g rnd(1234)=567, rnd(9)=4. Lack of specification about rand() range documented in eden.txt. Added rgb2color and rgb2colour functions to eden.eden. Examples of use: %donald line l l=[{10,10}, {200,200}] %scout string g; window ash = { type: TEXT string: "Ash" frame: ([{10, 10}, {100, 100}]) bgcolor : g }; screen=; %eden g is rgb2colour(ri,gi,bi); A_l is strcat("linewidth=5,color=", g); ri=0;gi=10;bi=255; Added Help->Colour names, which contains the information from the file /usr/openwin/lib/X11/rgb.txt and some help about how to use colours in Donald and Scout. Added small amount of detail about EOF to Eden fgets file function in eden.txt. ** 1.40 [Ashley] Wed Apr 17 11:47:12 BST 2002 ** A few silly mistakes in the reimplementation of mouseClick observables (in 1.39) fixed. The multiple backups of the ~/.tkeden-history file added in 1.12 caused problems with multiple concurrent instances of tkeden running in the same user account with an NFS mounted home directory: machine 1 shifts history files, starts to use tkeden-history, machine 2 shifts history files, machine 1 gives stale NFS handle error. Changed from renaming files to shift them to copying instead. This means all the tkeden-history files will have the same file date, making it more difficult to find the relevant data when grubbing around in the history files, but it is possible to run multiple tkedens from the same account without problem. ** 1.39 [Ashley] Mon Apr 15 20:19:51 BST 2002 ** Reorganised descriptions of file handling functions in eden.txt slightly. The fix added in 1.37 which gives an error message on an attempt to eval() a local variable is now extended to attempts to reference the local variable $. The new builtin Donald reflect function was not working when given an openshape and a line: the parser was expecting it to return an openshape due to a missing break in Donald/check.c, whereas it actually (and should) return a shape. Fixed. Also added an extra test and error message to open2shape, and fixed donald.txt, which implied that rot, scale, reflect etc only take shapes, whereas in fact they take any Donald type. Optionally reinstated the "VB-like" feature of mouseClick observables removed in scout.init.e 1.11 (Eden version 1.17). To turn this old feature back on again, do "tkeden_vbfeatures=1;" in Eden. This is for use in getting old models to work only: new models should not use mouseClick and other "VB-like" features as they have been found in general to create more problems than they solve currently. ** 1.38 [Ashley] Fri Mar 1 23:31:32 GMT 2002 ** Fixed an inconsistency: query (?) previously ommitted the semi-colon after a procedural variable. Now the output from ?a; will show a semi-colon after both procedural and formulae variables. Added Eden stat() function, which provides access to meta-data about files (modification times etc). Updated fgets() documentation in eden.txt. Changed filenames in lib-tkeden to use the new extension names: .eden etc. Renamed macro.e to eden.eden, which is now loaded at startup (if it can be found). Removed eddipf.e file -- the text of this is now included at the start of eddi.eden. Added Eden symboldefinition function, which is intended to fix problems with the data returned by symboldetail() and relatives, as it returns the definition of an Eden symbol in a form that can be fed back to Eden using execute(), todo() etc. Bug fixed in agent-based parser: characters can now be escaped in strings: TEST << ["oh \"quote\""]; is now valid. Changed occurrances of "definitive parser" in this text to the more correct "observation-oriented parser", as the parser makes little use of definitions. Added copyproc() and showpara() procs to eden.eden. Introduced an optimisation that will allow the use of a particular list append idiom on long lists. The list concatenation operator is limited in the resultant size of list that it can produce, meaning that 'l=l//[q]' would fail with a stack overflow error if l was larger than 1023 items. This particular operation is now optimised (by additions to the parser and virtual machine) to the effect that 'l=l//[q]' is effectively translated internally to 'append l, q'. Note that the value of the expression 'l=l//[q]' is now @, not the value of the new list as previously, due to space limitations. A variation on the problem, 'l=[q]//l', is not optimised as it is a less common idiom. The optimisation also copes with strings, although the concatenation is not done in-place in this case. This change should allow EDDI to cope with much larger results (eg large joins). Added some more possibilities to debug(). debug(256): prints calls to execute, debug(512): prints calls to func / proc / procmacros with their arguments and return results (including indentation to show level of nesting), debug(1024): prints VMWRIT output (when opcodes are created in the VM for later execution). This last is also a part of the debug(1) output, which is generally far too detailed to be useful. Modularised tkeden notation radio button code. Added a Tcl proc named "removeNotationRadioButton" to allow scripts to remove the radio button for a notation in order to hide the notation's existence (note the notation itself is not actually removed). An example of use: %eden tcl("removeNotationRadioButton donald"); Added printstdout C function for use from gdb. Fixed commas within strings in EDDI: T << ["h,w"]; is now possible (previously the comma would have caused this to be recognised as two attributes). Fixed bug in EX/script.c: a textual script store was not being resized correctly when given a large amount of script. A fix was introduced in the last version to cope with the fact that TEXTBOXes are a different kind of Tk widget to the other types (TEXT, DONALD, ARCA, IMAGE). The previous fix was not correct: the code which was enabled was actually handling frames (lists of boxes). The obtuse and lengthy DisplayScreen procedure is now more understood and some comments have been added, as well as a more reasonable fix for this problem. Previously, Eden floating point values that were very close to their integer equivalent would be printed out as integers by query (?), writeln etc. 169.9999 would be shown as 170, for example. Now, floating point values are printed out at the precision available on the machine. Added Chris Brown to credits.txt. dtkeden bug fixed, which was introduced in release 1.21 (builtin.c 1.39) with the introduction of the 'procmacro' facility. When defining a procedure or function on the server, the redefinition sent to the client was corrupted: func definitions had 'proc procmacro' appended, procs had 'procmacro', due to some missing break statements in a switch. PI was previously undefined in ttyeden (as it was part of Donald), and defined to only 7 significant figures. Made PI a standard Eden definition, set from the more precise value available on the system from . Added information to Eden and Donald quick reference guides (eg note that in Donald, it is referred to as lower case pi). Added Chris Roe's round() function to eden.eden. Added documentation for macro, copyproc, showpara, round and eval to the Eden quick reference. Added documentation about ~/x, /x etc to Donald quick reference. Added debug(2048) to debug the Donald parser. Added debug(4096), which causes tkeden to print errors on stderr as well as in the error window. Donald parser was having problems on UNIX when reading files with DOS line feeds. In particular, within x NEWLINE { } was failing, because DOS line feeds are CR (\r), LF (\n), which was being treated as two NEWLINEs. The Donald lexer now ignores a \n which follows a \r. Optionally reinstated some code to do with back-ticks which appears to make the project timetable model work. Enable this hack by setting the Eden variable eden_backticks_dependency_hack to 1. Exactly what the hack does is not yet well understood, so it is optional for the moment. ** 1.37 [Ashley] Tue Feb 19 17:29:00 GMT 2002 ** Sync'd code with CVS. Attempts to eval() a local variable now give an error message instead of a crash. Eg 'func t { auto i; i=2; writeln(eval(i)); }'. eval is defined to give the value of a variable at point of definition. This is at the entry of the function in this case, when the function is not being evaluated, and so any local variables as yet have no value (although we do know that they are local variables). Hence an error is appropriate. Mac OS X tkeden port is progressing. Now automatically locates lib-tkeden, which is situated within the Resources directory of the application bundle. Bug fixed in call_float (which is where real-valued C library functions are called) on Mac OS X. sin(3.14159/2.0) would return 0.909297, not 1. In 1.19, a change was made: all values passed to a C library functions declared as SameReal (which are functions that return a real value, eg sin, cos) are passed double values -- integer parameters are cast to double type before passing. Now a more subtle internal change has been added to this: the C library is now given an array of doubles, not ints. Added debug(128) option for debugging calls to Tcl_EvalEC and Tcl_GlobalEvalEC. Added information about arguments to debug to eden.txt. Added an additional example to scout.txt. Fixed a bug where redefining the Scout screen to one that included TEXTBOXes might fail. When the screen variable is changed, the corresponding Tk widgets are modified in place if possible, not destroyed and recreated from scratch. Scout windows of type TEXT, DONALD, IMAGE and ARCA all seem to use the Tk canvas widget. TEXTBOX however uses the Tk text widget, and so when a window changes type to and from TEXTBOX, the corresponding Tk widget must be destroyed and recreated, else various Tk error messages occur when the widget attributes are changed. DisplayScreen is now nearly unmaintainable, being 400 lines of obtuse C code. It seems to contain some code which appears to try to manage the above situation. It seems to have been failing due to two erronous "+1"s, which are now commented out. Further use may reveal the original intention of these "+1"s and require a different solution. ** 1.36 [Ashley] Thursday November 29 19:26:19 GMT 2001 ** Using the system's close window button on the View Eden Definitions window previously caused a Tcl/Tk error, as I'd changed the menu code for this window, but not the close window code which relies on it. Updated EDDI files from Meurig's current version a little: new version of deps.e and new file newaddvals.e. Also cleaned up my modifications a little. ** 1.35 [Ashley] Tue Nov 20 13:22:19 GMT 2001 ** Merged in Chris Roe's Donald reflect primitive as a new Donald built-in. Added one line giving the syntax to the Donald Quick Reference on the Help menu. Fixed ttyeden on Darwin (Mac OS X). Now compiles and works OK (were problems with header files etc). No dirname and basename functions. Fixed implementation of Eden str() function when dealing with lists. Previously it had the same fault that was corrected in printing (writeln etc) in 1.29: strings and chars in lists were converted by str and were not given surrounding quotes. Now this example functions correctly: 1|> l=["hi",'h',5,[6]]; 2|> writeln(l); ["hi",'h',5,[6]] 3|> writeln(str(l)); ["hi",'h',5,[6]] ** 1.34 [Ashley] Thursday November 15 20:03:13 GMT 2001 ** EDDI in dtkeden server previously printed "Unrecognised EDDI statement" on stdout if the server's notation was set to EDDI and a client started or finished or if broadcast mode was selected. This problem was narrowed down to the EDDI parser not understanding virtual agent commands: a line containing '>>' is executed in the these scenarios. The EDDI parser is now fixed so that it ignores statements that begin with the virtual agent >>, <>, ><, << and >~ prefixes. ** 1.33 [Ashley] Thursday November 15 16:52:38 GMT 2001 ** Improved MAKING.A.RELEASE checklist. The scale function in donald.init.e previously ignored arcs. Chris Roe fixed this for his COG model. This improvement is now merged into tkeden, so Donald should now scale arcs. However, Chris' fix may be a slight fudge as it apparently doesn't scale the arc's "bend". ** 1.32 [Ashley] Fri Nov 2 12:24:37 GMT 2001 ** Typo fix in builtin.h and builtinf.h ** 1.31 [Ashley] Fri Nov 2 11:58:24 GMT 2001 ** Change to Meurig's newpivctn.e EDDI file. The prompt in ttyeden was previously incorrect after including a script file with a change of notation (or providing a -e option with a change of notation). The machine would actually revert to accepting Eden (incorrect) but the prompt would still show the other notation (actually correct). Given the time limitations today, I have made the easier fix, which is to fix the prompt to correctly show the state of the machine. As the semantics of an include() (or mention of a script file on the command line) is direct inclusion of that file in the input stream (rather than a "procedure call"), the machine should actually stay in the new notation (ie notation changes should persist across EOF). This will however require some restructuring of the lexer. This problem does not occur when typing input directly, as stdin never gives EOF. tkeden does not have this problem as notation changes are handled by functions in EX (which is not in ttyeden). ** 1.30 [Ashley] Thu Nov 1 19:31:37 GMT 2001 ** When using eager() in a tight Eden loop to modify a Sasami display, this previously caused a Segmentation fault. The crash no longer occurs, but the Sasami display is corrupted. Improved debug(2) output (RunSet debugging). Test with (eg): writeln(1); todo("writeln(2);"); todo("todo(\"writeln(3);\");"); Eden include() now stores number of parameters (file names) in a C stack variable, rather than relying on being able to read it from the Eden stack after each include. This should stop a few crashes due to nonsense values being read from the Eden stack. tkeden now correctly appends information to the history about the files stated for execution on the command line on UNIX. (On Windows, "cd(dirname(filename))" is done for each file before execution of "include(basename(filename)", which appears in the history). Both platforms now have a comment appended in the history which states the files were invoked from the command line. It was previously possible for the tkeden prompt (eg "Enter Eden Statements") and radio buttons to get out of synch with the actual current notation. Specifically, the Eden include() function, invocation of files mentioned on the command line and observation-oriented parser generator may have had this problem. This problem was not observed on Windows (for some reason). Added installeddi() Eden procedure, which adds the eddi parser to the environment when invoked. Added this info to the Eden Quick Reference. The Update button in the View Eden Definitions window now keeps the vertical scrollbar position instead of resetting it to the top of the document each time it is pressed. Added an Edit menu with Copy, Cut, Paste options to the View Eden Definitions window. This required reworking of the Eden Definitions menubar. Added information about return codes of forget() and type casting to the Eden Quick Reference. Tcl now sets the prompt label using the correct case of "statements" (which is later overwritten by C code anyway..., but which can be observed when running on a slow machine). The Eden forget() function can now take a pointer. However it will never return 1 (for "not found") as use of a pointer reference causes Eden to create the pointed-to item (as @) if it does not already exist. Added slightly more detail to Eden quick ref about nested comments. There was a bug in the one-line comment (##) code, which caused the next line to be ignored if the comment characters were followed immediately by a newline. "Merged in" Meurig's eddi changes by concatenating them into one long eddi.e file. ** 1.29 [Ashley] Tuesday October 16 19:22:15 BST 2001 ** Fixed bug introduced into ttyeden in 1.27. The fix was introduced as ttyeden didn't seem to deal with items in the todo() list correctly. The "fix" caused clearGarbage to be called at incorrect points, meaning Datums that were actually in use were freed: writeln("what the ****"); would print "(type=-14907, val=-976894523)" (as the string Datum was corrupted). checkRunSet and the associated clearGarbage, incGarbageLevel are now only done in one instance of print_prompt_if_necessary. This may reinstate the problems with todo() that the "fix" was introduced to solve, but there was no clean test case for it, and I no longer have Michael's ttyeden model code to test. Changed printing of strings and chars. Strings are now output with surrounding double quotes, chars are output with single quotes, unless their output was caused by writeln (in which case the contents of the string is usually required). This should help debugging (the ? query operator now shows the type more clearly) and reflection (when Eden code observes Eden code, perhaps re-executing it). writeln on a list always shows quotes, as it is also surrounded with list constructors and is therefore a "reflection" type of output. Fixed a bug introduced when improving the Donald error output. If Donald was "within" a context, this was not reset (an oversight introduced when adding this improvement). There was no way to return to the root context (as the Donald parser looks for "within { ... }" and will not accept "}" without the preceeding tokens). The context is now correctly reset and notice is given of this in the Donald error message. For example: %donald openshape ash within ash { error ** 1.28 [Ashley] Monday October 15 16:23:30 BST 2001 ** Fixed 'invalid command name: "tcl_wordBreakAfter"' error on Windows after Michael found how to reproduce it (double click in the input window). The problem was caused by the ommission of the tclIndex file from the Windows distribution (quite a few of the Tcl/Tk files are ommitted in order to save space). Files using DOS line-feeds (CR, LF: \r\n) in non-Eden notations (Donald, Scout, LSD, Sasami, custom) were causing errors when interpreted with the include() function (interpreting the code via the input window: File -> Open was OK as Tcl reads the file and seems to correct the line feeds). This is a very old bug: a problem even in tkeden-dec151997. Now fixed. ** 1.27 [Ashley] Thu Sep 27 18:44:13 2001 ** Now guessing location of library files directory on Windows in ttyeden (previously was only doing this for tkeden). eddi.e now tries to find eddipf.e in TKEDEN_LIB, not the current directory, so the command given below for starting tk/ttyeden with the eddi parser should now work even if eddipf.e is not in the current directory. File -> Execute -> eddi.e now works. Previously any Tcl code which required access to a global Tcl variable would fail when run from File -> Execute (as the Tcl 'eden' command was run within the access scope of the Tcl 'include' procedure). Moved checkRunSet into print_prompt_if_necessary (ttyeden only). This fixes a bug where ttyeden didn't seem to deal with items in the todo() list correctly. ** 1.26 [Ashley] Thursday September 27 12:49:42 BST 2001 ** Chris Brown's fix for strings containing single-quotes ttyeden now shows -l setting on -v. Fixed bug where %eddiarrgh would be a valid notation change. Other built-in notation changes with additional postfixes (eg %lsdarrgh) should still be valid, but notations in the observation-oriented parser now require an exact match. Fixed bug where a notation starting with an uppercase letter would cause an error in tkeden (as Tk doesn't seem to allow window names that start with uppercase letters). Including the eddi observation-oriented parser into the standard distribution. Load it with the Eden code 'include(getenv("TKEDEN_LIB")//"/eddi.e");'. This can be done from the command line: tkeden -l lib-tkeden -e 'include(getenv("TKEDEN_LIB")//"/eddi.e");' (this also works with ttyeden). ** 1.25 [Ashley] Friday September 14 17:11:49 BST 2001 ** Fixed minor bug preventing tkeden compiling without Sasami. Made it possible to use the observation-oriented parser within ttyeden. The observation-oriented parser requires the file trans.e within the library files directory, and so the -l argument now applies to ttyeden. If the -l argument is not given, ttyeden still operates, but the observation-oriented parser is not available (functions defined in trans.e are not available - likely error messages include "...'ident_ex' needed..."). The ttyeden prompt now includes the name of the current notation if this is not Eden, for example: "%eddi 4|>". Fixed many input-reading bugs to allow this to happen correctly (to do with EOF handling, prompt printing, line termination etc). There may still be some more bugs as the code is messy (Eden/lex.c really needs a rewrite in many places) and it is difficult to test all possible conditions. Fixed a memory bug in tkeden's prompt ("Enter xx statements:") setting code. ** 1.24 [Ashley] Wed Aug 15 16:15:34 2001 ** Eden "system" command now defined as a built-in, meaning that it should now work in a non-root virtual agent context (previously, the tilde "root virtual agent" specifier would have needed to be appended, ie "~system"). The cd(dirname(fileToInclude)) hack introduced in 1.17 which makes it possible to drag a model start-up file onto the tkeden icon on Windows (the hack sets the working directory such that the other model files can be found) was causing problems on UNIX when people start the tool with a command line including relative pathnames, so this hack is now only used on Windows. Chris's observation-oriented parser is now not compiled into ttyeden. It could be, but the executable then needs to be able to find trans.e and the -l option would then become mandatory for ttyeden, meaning it wouldn't be just a simple stand-alone executable. Since the current notation development using the parser seems to be proceeding using tkeden functionality, ommitting the parser from ttyeden shouldn't cause too much of a problem for now. ** 1.23 [Ashley] Monday August 13 18:18:58 BST 2001 ** Chris's updates to his observation-oriented parser: some functionality has been moved into Eden - particularly the decision about when to start parsing a complete 'chunk', meaning that a parser for a language with definitions spread across several lines is now possible. ** 1.22 [Ashley] Friday August 3 16:49:31 BST 2001 ** Merged in Chris Brown's observation-oriented parser. This may cause problems with some models as the additional Eden code which implements the observation-oriented parser may use namespace that is already used by some other models. Made installnot create a new radio button on the interface for a newly installed notation. Added 'notation' to eden.txt quick reference guide. ** 1.21 [Ashley] Thursday August 2 18:02:12 BST 2001 ** Fixed CVS/Root files which contained cssbz@127.0.0.1... instead of the correct cssbz@cvs.eden.sourceforge.net... Undoing a change I made in 1.19 which was to rename all upper-case filenames, as this will cause too much hassle with CVS. Compiled Tk Img package at DCS and made edenio.tcl load it if it is available. This gives Scout the ability to load images in the formats BMP, XBM, XPM, GIF (with transparency, but without LZW), PNG, JPEG, TIFF and postscript (previously it could only handle the Tk default of PPM/PGM and GIF). Updated various documentation with credits, installation and usage information. Help -> 91 tkeden now shows patch level of Tcl and Tk (eg 8.3.3 instead of 8.3), and also whether the Img package is available. Sync'd all the code with CVS again. Added 'setcvstag' target to Makefile to enable recording of releases in CVS. ** 1.20 [Ashley] Wed Jul 18 18:26:59 2001 ** Added ENTSTK to possible debug() output reset_stack and reset_compiler_status now give debug output Fixed "bug42": introducing the screen_width etc definitions in 1.19 caused a segv after an error in some circumstances (in particular, when the user made an error in a file that they included from a file after a %scout line). I had previously worked around this problem by leaving out a Tk "update" after adding text to the error window. If an "update" is not performed at that point, the error window appears to freeze during a series of repeated errors. Adding this update is in fact a new feature, but adding it revealed the above problem - that the error handling code was causing some Eden code to run with the intent of updating the screen_width definitions, and this foobarred the stack state (which is actually above the current stack pointer and so supposedly "discarded", but is still required after an error condition). Now the machine state is reset after the call to the error handling code, meaning the error handling code uses stack space above the state that must be left undisturbed. Limited testing so far seems to show that this fixes the problem. Now error messages should be visible in the error window even if Eden is in a tight loop (which is especially important now that complete error messages are not logged to a file). Added 'tkwait visibility' to OpenDisplay procedure, which means that any Scout screens should be shown even if Eden goes straight into a tight loop when starting up. Added to debug(2) output Fixed bug in error line buffer implementation. The 'rtos' function in donald.init.e had a bug causing memory to be overwritten. The first argument to sprintf must first be initialised to a string of length the same size or longer than the string to be written into it. Added warnings to eden.txt documentation. Proper error message if scoutScreenInitOpen can't be found (ie we are using the wrong -l settings). Character number reported on error now starts at 1, not 0. Donald dashed and dotted lines will now appear solid if your Tk version is less than 8.3 (the old dash_bitmap hack was removed in 1.19, which caused these lines to not appear at all). So we now have a dashed/dotted lines solution which should work reliably on all platforms and fail safe to solid if the platform cannot cope. (Note that the current Windows distribution uses Tk 8.0 and so dotted lines will not appear there). ** 1.19 [Ashley] Sat, 14 Jul 2001 21:35:52 ** Previously, calling touch() with a non-pointer (eg touch(me)) caused a Segmentation Fault and crash. Now it gives an error. Removed code from scout.init.e which fudges heights and widths to work with "buggy Tk" (version 4.0b3? - very old now). Added warningf C function (using varargs) to enable more complex warning output. Made warning use it. Improved error messages in the C-implemented Tcl commands, eg eden, todo, evaluate etc (see EX/ex.c). Scout now 'knows' the size of each display. Implemented some Tcl / Eden which defines Scout integers, named displayname_width and displayname_height which are the width and height of the display window. These observables are redefined when the window is resized by the user. This should make it possible to centre things within Scout windows, etc. This particular interface doesn't fit cleanly with the rest of Scout - perhaps this information should be obtained from Scout using displayname.width etc, but this would require more work. This hack will do for the moment - beware of future changes if you use it. Defined the new functions cd, cwd, dirname, basename as built-in functions so that when we are not in the root VA, the agent name does not get prepended. Unfortunately this means that the user cannot redefine the initial versions of these functions. Added Scout DFwidth and DFheight parameters describing the width and height of the screen to be opened (meaning we can redefine these before screen is opened...) Calling the Eden tcl() function with @ now results in an error message, not a Segmentation Fault. Control-C twice to kill tkeden on Linux now works correctly and doesn't go into a loop. Figured out Donald {distance @ angle} operator and added to (the previously extremely poor) documentation (also documented that Eden sin and cos require radians...) Fixed a bug involving passing strings with " characters in text boxes to Scout (a Tcl problem). Find... didn't work on Linux as \c was being interpreted as an escape sequence there (not sure what it is supposed to be interpreted as). Quickly fixed by using marks instead - not sure if this is a good solution. Made a separate Errors window and separated out history entries from errors. Now no longer a need to surround errors with comment characters. Errors from all notations should now appear in a uniform and more helpful way. Adding the startup stuff provided on the command line (eg -e, filenames...) to the history. Fixed (well, avoiding) a bug which caused tkeden to fail with Seg fault after encountering an error during initial startup (specifically, it seems to appear when the user makes an error in a file that they have included from a file included from a file, after a %scout line, all of which appears to be causing the errorf longjmp to jump to the include() C function (which it shouldn't) which then dereferences paracount and gets a nonsense value since there is nothing on the stack at that point). Somewhat obscurely, removing the Tcl "update" call after the error (which I inserted to get the display of error messages working OK during an error loop) causes this to work OK - eh?! The Tcl "raise" procedure (which brings a window to the front) appears to be causing problems on Linux, so I've redefined it to blank for the moment. Added what was encountered to the information given on a parse error (previously just printed what was expected) from translators using bison.simple (Eden, Donald, Scout). The error location indicator (^) now takes account of tabs in the input line, so points to the correct place if tabs are used. Fixed a bug where the heap was not freed when a empty statement list was used. Eg 'while (f()) {}' would cause heap overflow if f() did not return false fairly quickly, as the arguments to f() (a list of length 0) were added to heap on every call. The heap space would normally be reclaimed after execution of the first statement in the loop, but not in this circumstance. Added debugging output to internal C malloc function. Enable with debug(64); Circle colouring in Donald has been reported previously as not working. It is still working - at some point in the past, the attribute name required changed from 'color' to 'outlinecolor'. The -e command line option didn't work correctly on Linux when it followed a filename (eg ttyeden errortest/args.e -e "writeln('n');"), as getopt on that platform permutes the contents of argv as it scans so that eventually all non-options are at the end. Turned this behaviour off and -e now works correctly on Linux. ttyeden -u output was incorrect. C-lib "illegally typed" error message improved. Stack trace given for error messages now says "in ..." for first func/proc... rather than "called by". This should help to understand where the error occurred, for example in the case where a proc/func etc tries to reference outside the parameter list - the location of the error was likely to be construed as the caller in the old error message style. Code that would have probably caused "called by action " fixed. Error message formatting improved where 'stack pointer was inconsistent' is mixed with an error message. Decided to remove 'stack pointer was inconsistent' notice as most of the time it simply seems to just add more noise to error messages - the pointer was inconsistent because an error occurred, I believe probably in all circumstances. Added an 'error number' identifier which shows up in the history and error windows, allowing us to reconcile the two together if need be, and as a reminder in the history file that the input caused an error. In 1.13 C-lib real-valued functions were modified to give an error when called with non-real parameters (before, they used to silently return strange values). Now any integer values passed to one of these functions (eg sin, sqrt...) are internally cast to floating point before calling the C function, so that meaningful results are now obtained when calling these functions with integer values. Improved 'not read/write variable' error message (which happens in eg 'writeln++' where writeln is not a local variable). Now giving the name and type of the offending variable. arca.lib now uses a modern-style font name declaration, so has more hope of working on multiple platforms. Added '##' as a one-line comment to Eden. The character sequence '##' now causes Eden to ignore input until after the end of the line is encountered. The single '#' character cannot be used as a one-line comment token in Eden as '#' is already used to denote list/string length (and the C++ one-line comment '//' is also already used in Eden for list/string concatenation). '##' comments can already be used in Donald, Scout and Sasami as those notations already implement the '#' one-line comment syntax. '##' can therefore be used in any notation currently built-in to tkeden. 'Error number' identifiers now inserted into history are now commented with '##', so that history can be re-run in tkeden with no modification. Turned filename completion (a function provided by readline when you press Tab) off in ttyeden. Readline now knows that the application name is ttyeden, so conditionals using this information are possible in ~/.inputrc (but this is currently untested). Fixed a bug in and improved the ttyeden prompt. Previously, a comment would cause the prompt to fail to reset from the "waiting" prompt ("+> ") to the usual prompt (":> "). Now the prompt correctly resets, and there are multiple possible "waiting" prompts. The usual prompt has been modified to make the difference between it and the "waiting for semi-colon" prompt clearer. The new prompts are: |> - the usual prompt ;> - prompt when waiting for a semi-colon |> - prompt when waiting for a close-quote *> - prompt when waiting for a close-comment Reworked the tkeden previous/next history implementation added in 1.13, which used a cyclic buffer to represent history. This implementation wasn't the same as other implementations of history (eg in various shells) and caused the history to be overwritten after using Previous to "go back in time" and then continuing to make entries (overwriting history). On inspection, other implementations of history seem to be simpler than this and "go back in time" only for the duration of the current entry. tkeden now follows this scheme, retaining twenty items of history, and beeping if the user attempts to go beyond the recorded limits. Added Alt-p and Alt-n key shortcuts to tkeden for previous / next in history, as some configurations have no Meta key and Alt-Control-Up/Down is used by the window manager. Shift-Control-Tab was causing the entire menu bar to tear itself off. Fixed. Donald dashed and dotted attribute support reworked using the third party Tk "dash patch" which was finally merged into Tk in version 8.3. These attributes will not function if you are using earlier versions of Tk, but if you are, they are likely to function correctly (unlike the previous hack which involved 'stippling' the geometry with a dotty bitmap, which failed to function at certain angles on certain platforms). This version of Tk does not seem to be easily available in cygwin and hence the PC port, but the previously hacked version didn't work on the PC anyway. It seems that the attribute "linestyle=dotted" was not supported at all in the previous version (despite existing in the documentation) - it should work now. Renamed files with all upper-case names as they cause problems when they exist on a vfat (Windows) partition mounted from Linux. Checked out memory leak bug in COMICAL/ROADSYS, which was mostly fixed in 1.1 ("bug5"). There is still a small leak, but it looks like this is probably attributable to Tcl (specifically TclpAlloc). Added eden_prompt variable to ttyeden Eden which specifies whether the prompt will be displayed: 1 (default) means the prompt will be displayed, 0 means don't show the prompt. The value can be modified directly or via the -n and -i command line options (which do correctly trigger any actions triggered by eden_prompt as they should). Had to work around a bug in libreadline4 (reported to Debian as bug #105231) to get this to work. Bug fix: ttyeden previously would quit after two control-C presses, no matter how length a time interval between them. Bug fix: ttyeden does not now use readline if the current input file is a pipe (technically, ISFIFO), meaning that the 'old-style' pipeline translators still behave as they did. Removed some dead code relating to storage about input. Reworked my line buffer (added for error handling) so that it resizes dynamically, meaning Eden once again has no line length limit (I unwittingly introduced one probably around version 1.13). ** 1.18 [Ashley] Fri Jun 29 2001 5:30am :( ** Changed Scout "parse error" to something more informative. The 'sensitive' functionality added for Chris in 1.13 below is still not right, despite some more fixes in 1.17. When 'sensitive' is used in a window in a virtual agent context, the ON, MOTION etc values were being prepended with an agent name, meaning their value was unknown, meaning that the parser moaned. Changed these values back into items in the constants table, meaning that the VA name translation is not done. Had to hack the values of these constants, given that Scout lacks a proper 'integer' type (they are actually 'double' - see below). Now added an 'integerhonest' type, the tree constructor function of which actually takes an integer. The internal value is still stored as a double, as per Simon's original hack (which was added before the start of version control on this source). In summary: 'sensitive' now works in VAs, but Scout still needs un-hacking wrt the integer type. Renamed 'dummy.c' to 'nothing.c' as the configure script seems to keep removing it on Linux. Got dtkeden to compile on Linux (need different headers for MAXHOSTNAMELEN) Bug fixed: previously trying to File -> Open a file without an extension would lead to an attempt to load the filename with a .e extension. Documented font specifications in Help -> 91 Donald, Scout Updated Eden Quick Reference with a few more of the additions I've made. Changed default file extension in File -> Open etc to *, as none of our existing models use the .eden, .donald... extensions yet. Fixed a bug introduced in 1.17 where Scout windows always seemed to have a border. This was actually due to yet another bug in my 'sensitive' reimplementation, which caused screen[n][14] (the sensitive attribute) to be defined as @ if it wasn't specified by the modeller. Previously it would have been defined as 0 in this case. Now it is defined as DFsensitive, which is zero by default. ** 1.17 [Ashley] Wed Jun 27 2001 4am :( ** The Scout 'integer' type is actually more subtle than described below. Actually Scout has another type, 'real' (which is only mentioned in an example in the documentation). Both 'real' and 'integer' are stored as C doubles, and have the parser identifier INTEGER. When a Scout number is output to Eden, tests are performed to see if the decimal part is zero - if it is, then the number is output (mostly) as an integer. We still need the 'real' type, particularly when scaling images, and replacing this hack with a proper implementation of real and integer separate types would take more time than is available at present, so moving back to the previous (hacked) implementation. This implementation causes problems when feeding numbers from Scout to some Eden functions, but this can be worked around in the models by casting to (int) when required. The 'sensitive' functionality added for Chris in 1.13 below was actually buggy (it was untested until now): the functions in scout.init.e were being passed the value of the pointer to the sensitive attribute, not the actual value. This is now fixed, and the mouse / key Tcl bindings are now set up by one procedure in scout.init.e instead of two. MOTION, ENTER and LEAVE will not work within TEXTBOXes for now, as some more work needs to be done on TEXTBOX first. _mouseClick ("VB-like"?) functionality removed from scout.init.e at the same time as above, as the use of this feature in models seems to cause more problems than it solves. (Note: this will break some existing models). Minor bug fixed: errors from keyboard input in ttyeden would be reported as from file '@': now correctly from file "stdin". Added Eden cwd() function and cd() procedure. The cwd() function is marked as out-of-date whenever cd is called, so the procedure 'proc pcwd : cwd { writeln("cwd now ", cwd()); }', giving a UNIX shell-like prompt is possible. Added Eden dirname() and basename() functions, which give the containing directory and filename of a file path respectively. Now, for each initial file to load specified on the command line, cd-ing into the containing directory of each file before attempting to execute it. This will leave the cwd set to the containing directory of the last file on the command line. This is intended to make Eden include(...) calls in a script more effective if the tool doesn't have a sensible initial cwd (which is true on Windows most of the time). Some of the code for this trick is implemented in Eden, so that the cwd() function will be correctly re-evaluated when the cds are performed. Note that it is possible to make Eden appear in the Send To right-button menu in Windows by setting up a short-cut to it in the C:\WINDOWS\SHORTCUTS folder. This cd hack should make this short-cut trick work in more situations (note that it is also possible to select multiple files to Send To Eden). Note that the include() Eden function does not itself do a cd() - if you are using include(), you may do a cd() in the script yourself. Rewritten the File -> Open / Execute cd trick introduced in 1.15 from Tcl into Eden, meaning the cwd() function will be correctly re-evaluated when including files via this interface-driven route. Removed traces of 'tkusage', which apparently was an external application intended to keep track of the use of tkeden. Now storing the last twenty items of tkeden previous/next history. Deleted some stuff from edenio.tcl that was no longer needed (some comments and the old file browser things). Set the colours for the radio button bar to something other than grey to distinguish it from the menu bar on Windows. Removed code from edenio.tcl which fudges the text search to work with "buggy Tk" (version 4.0b3? - very old now). Added key shortcuts Alt-s and to View Options dialog. Find dialog: added case sensitivity option, "find in...", key short-cuts. Improved display of found text: previously it used the selection (sel) to highlight the text, which was not visible unless the window has focus on windows. It is worth noting that the Find dialog can take regular expressions (eg "ash.ey", '.' meaning any character or "^start", '^' meaning start of line etc etc) as the search string. Added Help -> Scout, DoNaLD and Sasami quick references, but they aren't really finished yet. ** 1.16 [Ashley] Mon Jun 25 2001 10pm ** Eden include() can now take multiple filenames: eg 'include("one.e", "two.e");'. This should assist us with replacing our many 'run' UNIX shell scripts (of the form 'tkeden stuff.e blurb.s') with 'run.e' Eden scripts (of the form 'include("stuff.e", "blurb.s");'). "multiplePossible" trivial Windows bug introduced in 1.15 fixed. File menu now has File -> Open and File -> Execute, as the meaning of Include was a little unclear (although it is technically correct, referring to the Eden function). Changed file types used: now using .eden, .donald, .scout, .sasami and .script. The single character file-types were inadequate in many ways (we now have >1 notation as a candidate for .s, .s is also used for assembler files etc). '.script' is intended to be used for the circumstance where a text file contains a script which uses mixed notations: Eden and Donald, for instance. Hopefully this won't cause problems with Windows 8.3 filename limitations. Adjusted keys.txt slightly - moved previous / next up as they are quite a common need. Eden's IPC functions (send_msg...) are now an optional compile (enable with ./configure --enable-ipc) as I can't get them to compile on Linux. Rewrote Eden gets() function to actually use fgets() as use of gets() results in the compiler warning "the `gets' function is dangerous and should not be used." Reworked the curses stuff a bit to make it compile on Solaris and Linux more easily. Rethought the declaration of the 'rand' function to make it compile on Solaris and Linux more easily. Also 'srand'. Sasami had some source files where the end of the file was missing a newline - the compiler on Linux warns about this, so corrected. (Probably) fixed a bug where Tcl would give 'invalid command name "tcl_wordBreakAfter"' when clicking in the input window after an error. This was introduced in the previous version when the Windows distribution was optimised to fit onto a floppy disk, missing out the file tcl8.0/word.tcl. Previously, the Scout 'integer' type was actually stored internally as a double and passed to Eden as a floating point number. This caused problems in the jugs model as the value was then passed to an Eden function which expected an integer type. Scout now holds 'integer' values as integer, and attempting to define a non-integer Scout value will result in "failed assertion" error at runtime. Previously redefining the type of a variable in Scout would cause a segmentation fault and a crash. It seems that 'extern char *scoutErrorStr' and 'extern char scoutErrorStr[]' are not equivalent and this is where the problem stems from (the area of memory designated for the error message was in read-only memory). So now Scout gives a nicer error message and doesn't crash. ** 1.15 [Ashley] Mon Jun 25 2001 ** Ancient history added to this file. Improved window creation on Windows: hopefully they should mostly be created on top now. Fixed bug in View Eden Definitions that caused some agents not to be displayed (bug due to me forgetting that malloc doesn't zero memory). Now specifying font for input window as courier - so we get fixed width characters on Windows. Tcl_Init was falling over with "couldn't stat "": no such file or directory" - fixed by inserting a call to Tcl_FindExecutable in main.c Changed many #include <...> to #include "..." to denote that they are not system header files. Removed -I., -I.. and -I../Eden from CC Make rule, so the location of all header files should now be explicitly stated. Ported the new Sasami implementation (using Togl) back onto Windows. Changed right mouse button being used to button 3 so it works on Windows (this will cause the button used to be changed on UNIX). now deiconifies and raises windows that were iconified (eg minimised on the Windows taskbar) Changed method of specifying ~/.tkeden-history, meaning this should now work on Windows (but assuming the $HOME variable is set...). Auto-detecting where the Eden library files and Tcl init files (ie the setting of the TCL_LIBRARY environment variable) are from the current working directory on Windows, meaning we can do away with needing the run.bat hack to start tkeden (which previously required some manual user configuration). Things even seem to work when we install into a directory with spaces in the path (eg "My Documents", "Program Files" etc), although I'd guess that not all models will handle this situation well. Updated the make windist implementation. DOS line feed versions of the text files are now created using a unix2dos.sh script I created, so that Windows users attempting to read the documentation with Notepad are not stuck. Previously we needed the binary cygpath to be installed along with tkeden, as we need the functionality to convert from UNIX style paths to Windows style paths in edenio.tcl. Now a new Tcl command cygwin_conv_to_full_win32_path is implemented which calls the CYGWIN DLL to give this functionality instead, so we no longer need the cygpath binary. Updated credits.txt to show libraries used. Rewritten some font and display handling functions (StringWidth, FontWidth, FontHeight, DisplayDepth) that were previously in C in Eden, using Tcl functions. Removed EX/disp.c and EX/disp.h as the functions are no longer needed. Fonts should now work on Windows as they do on UNIX (the jugs demo seems to work correctly, for example). The default Scout font is now specified in a platform- independent manner, and seems to be a good size on Windows at least. Note that now that the font handling is mainly Eden code, some dynamic configuration can be achieved - eg the value of DFfont can be changed (eg 'DFfont = "{courier 18}";') and the screen will update automatically etc. As the DOS tkeden stdout/stderr window now disappears as soon as tkeden exits, which gives the user very little time to view any error messages, tkeden now includes a signal handler which asks for the return key to be pressed in the window before the signal takes effect. This won't work in all potential cases, but it should do some. Reworked the menu bar in order to get the key shortcuts working correctly on Windows. Unfortunately the changes required mean it is no longer possible to show the Accept and Interrupt menu entries differently from the others. To solve this, Accept and Interrupt are now buttons in the radio buttons frame. Reworked the file save / open dialogs, using functionality that Tk provides. The result will look the same on Windows, but a better dialog will be provided on UNIX. Removed win32ex.c, win32ex.h as no longer needed. It is now possible to File -> Include multiple files simultaneously (but on Windows only - this has only recently been implemented in Tk 8.4a2 on UNIX). Use Control or Shift to select multiple files on Windows. Previously, File -> Include always inserted the text of the given file into the input window, and then into the history window when the accept button was pressed. This fills up the history rather quickly. Now we have File -> Open, which gives this behaviour, and File -> Include, which does an Eden include(...) to read the contents of the file into the tool without filling the history too much. Changed default value of undef_reference_notice to 0 as we have too many existing models which reference undefined values as they load. If you are debugging a model and suspect that problems may be being caused by undefined values, try setting undef_reference_notice=1; Checked: I've heard reports previously that running models with intensive continuous computation may cause the tkeden interface to have problems (eg allegedly it was difficult to do File -> Quit whilst the VCCS was running). I've checked this problem again now and it seems to have been fixed. Now cd'ing into the directory containing the file when doing File -> Open or File -> Include, which helps Eden include(...)'s in the model to work. Added code to main.c which makes the library location path an absolute path if it was specified as relative (by prepending the current working directory) to make the Help items work in this circumstance. Decided on size of 10 points for the edencode default font, which seems to give our customary size on UNIX (although it may be a little large on Windows). ** 1.14 [Ashley] Thu Jun 14 2001 ** Added Help -> CHANGELOG Merged Ben's Windows Changelog information into this file. Added Help -> Credits Fixed bug in errorf that caused Tcl errors (eg from Tcl_EvalEC) to come up with no information. Fixed sasami_viewport_bpp (I don't see how it could have worked before). Debugging facility getting still more functionality. Call the Eden function debug() with a sum from these values to set what you want to see: 1: various 2: RunSet debugging 4: Eden parser debugging (=yydebug) 8: Sasami 16: Donald 32: Scout parser debugging (=st_debug) Improved the input window text insert cursor: it is now coloured, bigger and the flashing is hopefully a bit better (it spends little time being off, meaning you shouldn't lose sight of it). Added Help -> Eden Quick Reference, with formatted (blue) "optional" syntax text. Added ellipsis (...) where appropriate on menu entries to show that they lead to dialogue boxes... Added a -e argument, which enables the passing of some code to execute from the command line. Any occurrances of \n are translated to newline characters (as the shell passes them literally) before execution of the string, to enable notations to be switched etc. Examples of use: tkeden one.e -e "writeln(1);" two.e tkeden -e "%sasami\nopen_display" Note this might cause problems if you actually want to use a \n as you normally would (eg in an Eden writeln). Fixed some bugs in command line handling (I think -n, -i would not have worked on ttyeden in combination with files since I changed option handling to use getopt...). Figured out how to work around a bug which causes Sasami to use false colours on a Solaris machine with a cheap graphics card. There is a bug somewhere (Sasami, Togl, Tk, X, OpenGL?) which causes Eden to use the wrong visual and colormap when running using Solaris 8 X and OpenGL on a machine with an 8-bit (old, low end) graphics card. The easiest way to solve this problem currently seems to be to link Eden using Mesa (which is most simply described as an open-source OpenGL)... so I've added the necessary tests and options to configure to allow Mesa to be used instead of the Solaris OpenGL. Sasami seems to work now even on an XDM terminal (albeit extremely slowwwly). ** 1.13 [Ashley] Mon Jun 4 2001 ** Attempting to add a 'procmacro' feature, similar to 'proc' but with a screen update and user input phase (ie tcl "update") - basically, a call to eager() between each statement as they are executed. Eden procs appear to have two optimisations compared to entering statements line by line in the input window: screen update is delayed during RunSet evaluation, and the formula queue is not updated unless it is necessary (eg writeln on a changed variable). This optimisation is useful and necessary as we quite often want state change to be indivisible. 'procmacro' was named thus due to the existing definition of a procedure named 'macro', which does string substitution and is used by Donald and some of the older models I should think. Defined YYERROR_VERBOSE to get more information during parse errors. Added errorf function which operates like printf. This has allowed me to improve many of the error messages, giving extra detail of the problem (typically, I'm printing out the value that causes a problem and what was expected). Added information to the UNDEF (@) Datum which allows me to give an error message stating /which/ func/proc/procmacro could not be found in that event. Made Eden use bison.simple, meaning we should get more helpful parse error messages and possibly fairer input input / calculation balance. Added to debug() functionality - it now controls yydebug as well. Now giving decent location information on errors, in the form: error blah while blah near line x, char x: original line ^ (char indicator) Added %expect definitions to parsers to prevent shift/reduce conflict errors on parsing expect when the number of conflicts changes. Added an Update button to the View Eden Definitions window which rebuilds using the options that the user chose last time (avoiding having to select them again using the View Options window). Fixed a bug which shows when a triggered action combined with an internal formula redefinition use the same triggers, eg proc xx : b { a is b+1; }. In this example, b was previously given the trigger [xx] when it should really be given [xx, a]. The lack of triggering means that the definitions involved suffered from lack of reevaluation and their value could get out of date. Credit is due to Carlos Fischer who created clear test cases that showed this problem. Fixed a bug which occurred when the frame overflowed. For example proc p { p(); }; p(); would give an error with "called by action ^A^CX" or even seg fault. Now not attempting to print out nonsense frame information. Improved information (giving type of item called) given in this error message as well. Internal documentation improved a lot whereever I can. C-lib real-valued functions (eg sin, cos, pow...) used to give strange results when called with non-real parameters. All of these functions seem to require real-valued parameters, so Eden now gives an informative error message when the wrong type is encountered. Put more information into the int-valued C-lib error message as well. Fixed a bug involving use of query which would in some circumstances cause a seg fault. Eg proc p { para q; ?q; }; p(42);. Changed query operator. When it encountered values, previously it would simply display them: 4:> a=42; 5:> ?a; 42 a ~> []; Now the query operator prints "a=42" for consistency with its other outputs. It also now prints out the identity of the agent who changed the symbol last. Improving debug() output a lot. Categorising each output: CALSTK call stack (changes call stack) SYMTBL symbol table modification DEFNET definition network (changes definition network structure in SYMTBL) VMREAD reads data from prog array VMWRIT writes data to prog array VMEXEC virtual machine execute change progp DATSTK data stack operation MCSTAT use of other machine state HEAPAL involves some heap allocation VMOPER virtual machine op (in inst.h + probably invoked via func ptr deref) FQUEUE formula queue AQUEUE action queue PARSER parser use | (bitwise OR) to form combinations, in the order that it occurs procedurally. Added a disassembler function disAss and using this in execute and other places to display the symbolic name of the opcode about to be executed etc. Rewrote push and pop as functions for DEBUG, which will slow performance in DEBUG mode but lets me print out valuable stack debugging information. Added a notice if you attempt to get the value of a variable which is actually undefined (this should be useful as people frequently mis-type variable names, I'm told!). You can turn this on and off with using the variable undef_reference_notice - required as this isn't an error and can be intended behaviour in some models. The default is for these warnings to be on - might need to reconsider this later. Added a Next item to the Edit menu. Now have Previous / Next. The input window now stores ten previous items entered and you can cycle through them with Edit -> Previous and Next. As well as the Alt-E, [r|n] shortcuts for these (can't use Alt-E, p as this might be used in the future for paste), I've implemented Control-Alt-[up|down]: use the cursor keys. Had to use the two modifiers together as CDE uses Alt-[up|down] and Tcl seems to give a simple up/down through the text with Control-[up|down]. Also added Control-Alt-0 key shortcut for clear for completeness. The key shortcuts are marked in the Edit menu. Also added Meta- shortcuts for those with meta keys. Changed Accept into a raised button, to show it is different to File etc which are menus. Giving current value in a comment for formula on ? query to save people having to writeln formulae to get values as well as ? query to find the definition. Previously tkeden beeped every time an error occurred. If you were unlucky and got a series of errors or even a loop, you had an embarrassing stream of beeps. Now tkeden only beeps if it hasn't beeped in the last three seconds. Scout screen window does not now appear when tkeden is initially started (it always used to previously, usually causing the input window to be obscured). The screen window is created on the first occurrance of '%scout', when we can assume that the window is going to be used. Made the default input window a bit bigger. Made tabs in the input window the width of two characters to try and help people format their code there more easily. Control-U in the input window now deletes any text to the left of the cursor on the current line (as per many UNIX shells etc) - an easy way to quickly undo something you just typed which was wrong. Added a few more items to the Edit menu: Select all, Select non, Copy, Cut, Paste. The title of all windows created by tkeden now include the tkeden version number, and for dtkeden, whether dtkeden is running in server or client mode. This should help to identify whether the history window that has just popped up in dtkeden is from the server or the client. Now when you attempt to close the History window, Eden definitions etc using the window manager (clicking on the window's close box), it works. (Hopefully including windows created by scout here). Added help to the Eden Redefinitions window which reminds us that control-click can be used to select individual items. Now, if Shift-Control-Tab is pressed in any tkeden (input window, View Definitions, scout windows...), all the tkeden windows are brought to the top, with the Input window top-most. This should help with window management when there are many windows on the screen. Additions to Eden built-ins specifying behaviour now changed to eden_error_index_range and eden_notice_undef_reference - more sensible and hopefully avoids most clashes with user code. Made it possible to do related by statements with a LHS that is evaluated at run-time, eg r="c";`r`~>[q]; Fixed a bug which prevented the use of related by statements within procs eg proc q : w { a ~> [q]; } (before, note that ?q would have shown the lack of identification of the w trigger). Removed some code added by Patrick to yacc.y 1.8 (Rel1.0) which looks like it was attempting to fix the problem of referential dependency. It actually makes this problem (if indeed it was attempting to fix it) worse. Moved Edit menu next to File menu (so order is now File, Edit, View...) Added source code Makefile dependency checking, using the preprocessor options to get this information. Enable with --enable-depend to ./configure: see INSTALL.TXT. Made dtkeden View -> Client connections window consistent with the other View windows in the interface. Also, the dtkeden client Send button is now raised, whereas on the server it is normal, in an attempt to show whether the button is a menu heading or an action button. Improved usage information (-u) for dtkeden. Made Tcl aware if Sasami is available or not, and hide the relevant options if it is not. Added radio buttons above the tkeden prompt which emphasise the currently selected notation (ie which interpreter we are talking to) and which can be used to set the currently selected notation without needing to type %donald etc at the top of the input text. Gave the text input window a white background to make the interface look less mono coloured and to make text there more readable, both on the screen and in printed screen shots. Added a Help -> 91 key shortcuts dialogue giving lots of information about possible key presses in the input window and elsewhere. Ported Sasami to UNIX. Replaced Ben's Windows-specific Sasami window-creation code - using an implementation of an OpenGL Tk widget named Togl (http://togl.sourceforge.net/ - had to get the most recent development version from SourceForge CVS) instead. Sasami also uses GLpng for loading PNG images as texture maps (http://www.wyatt100.freeserve.co.uk/download.htm) - luckily this compiles OK on Solaris. Now the Sasami window creation code is mainly Tcl/Tk, in edenio.tcl. The mouse movement code is also now in Tcl. Sasami errors now use the Eden (not Windows) facilities. These changes should allow portability of Sasami across UNIX / PC / Mac (in the future) and should allow extensions: 1) feedback of which polygons the mouse is currently positioned over to Eden, 2) wrapping of (multiple?) Sasami windows in Scout. Sasami is now always included in tkeden, unless you specify not using a configure option. The Sasami window now seems to be resizable (I assume Tcl is passing events through to the togl widget), so if a model is running slowly on your particular machine, you can make the window smaller. Now when Eden changes some Sasami state, the renderer is not immediately invoked - rendering is delayed until the next Tcl update (until a change of RunSet) and so rendering a change to the Rubiks cube etc is now much, much faster. I've changed the default camera position too, to be further away from the origin as most models seem to be quite large. LICENSE files added to Docs for Togl, GLpng. Major re-implementation of the Makefiles as the make 'include' directive seems to be fairly globally available, so all the Makefiles now include ../generic.mk. Control-C now just causes the error message to occur on stderr, as the reentrant call into Tcl when interrupted in Sasami causes Tcl to crash. Also now using a timer (like the beep timer) for control-c: previously, control-c could only be pressed once during a session - the second interrupt killed tkeden. Now tkeden can be killed by interrupting twice within three seconds - if the interval is longer than three seconds, the warning message appears again. main.c: checkRunSet unified multiple TTYEDEN, DISTRIB etc versions into one piece of code. Run time behaviour of the versions may change slightly as a result - hopefully for the better. Pressing the interrupt button now gives a visual indication of the press. The VMEXEC machine now stops executing if the interrupt button was pressed (so it should be easier to stop tkeden if it is stuck in a tight loop). Wrote a Tcl_EvalEC function to evaluate Tcl code and do an error check on the result. Actually uses Tcl_EvalEx which should speed things up slightly. Bug fixed: definition of a TEXTBOX in Scout would show up as UNKNOWN in the View Scout window and in a Scout query ? operation. Added 'bitand' and 'bitor' infix operators to Eden: same syntax as the eager 'and' and 'or' operators, but they give the bitwise result. Added sensitive: ENTER and sensitive: LEAVE functionality for Chris. OFF, ON, MOTION, ENTER and LEAVE are now pre-defined Scout symbols: combine them by adding, eg: 'sensitive: ON + ENTER'. ** 1.12 [Ashley] ** Fixed a bug with back-ticks ``. A change that Patrick introduced made back-ticks evaluate at first definition, even if autocalc was off, causing possible undefined function errors etc (unfortunate as the View Eden Definitions etc show definitions first, then functions). Also the code had a confusing and unnecessary * pointer dereference - fixed. Got Tcl to sort the list given in File -> Include (finally). Added index_range_error Eden integer value. It works in a similar way to `autocalc'. If the value is 1 (as it is by default), then Eden's behaviour is as previously: it gives an error "index error: out of range" when asked to evaluate a reference into a string or list which is out of range. Setting index_range_error to 0 causes Eden to simply return @ and give no error instead. Added an Edit menu with Previous and Clear options. Added key short cuts for windows opened with OpenDisplay (so you can now remove the annoying default scout window using the keyboard only if you don't want it). Now keeping three backups of ~/.tkeden-history (as people don't seem to look at this file after a crash until they've restarted tkeden a few times). ** 1.11 [Ashley] ** Added GPL license and changed existing CHANGES.TXT to add this Removed 'doubling stack allocation' experiment which never should have really found it's way into a release 'cos it didn't work. Added changes required to tkeden/Makefile.in and configure.in in order to be able to build on my Sparc 2 at home (Solaris 7 + some GNU things). Improved build documentation - removed very outdated INSTALL document, replaced with a document describing requirements and build process. ** 1.10 [Ashley] Wed Nov 15 16:40:41 GMT 2000 ** 91 to create a tarball for import into SourceForge. Will leave the RCS information around in the hope that they can import it into CVS, but remove all generated files and also the stuff in the Windows dir that isn't part of Eden source. Also it looks like it is difficult to rename directories etc in CVS so lib-tkeden1.9 will become lib-tkeden. Reworked this CHANGE.LOG into reverse chronological order. ** 1.9 [Ashley] Wednesday October 11 17:55:40 BST 2000 ** Minor changes to documentation in Windows/run.bat and TODO Had been experimenting to try and get something like cat - | arca.trans | tkeden to work (ie tkeden reads commands from stdin whilst running all other stuff simultaneously). Ran into problems with buffering in pipes, so the kbhit() function I added is now ifdef'd out. ** 1.8 [Ashley] Sunday September 3 21:49:19 BST 2000 ** Added comment to scout.init.e about using Tcl to do trivial ImageScale-ing. Copied $PUBLIC/lib/tkeden/nArca.init.e into the lib directory as arca.lib, and added revision control header as arca seems to be considered more "mainstream" than I thought. Sorted out Docs/TODO a lot. windist target strips the executable now - this makes it all fit onto one floppy :) ** 1.7 [Ashley] Thursday August 31 18:57:44 BST 2000 ** Found a copy of config.guess and config.sub from /dcs/rap/mp3/cdparanoia/cdparanoia-III-alpha9.7/ as the GNU CVS site is down. This seems to be required now that locally, autoconf seems to have been "upgraded" to 2.14a (and the older version has been removed). Directory structure cleaned up a little: Docs and Windows subdirectories introduced, README.TXT in the main directory. (Rel1.7 released, but again in a minute) config.sub wasn't recent enough to work on Cygwin. Found more recent copies in /package/gap4r2/cnf. Copied some of Ben C's support files into the Windows subdirectory... Glpng etc. Fixing bugs to do with configur-ating Sasami Merging in Ben C's changes to the Tcl code Put some of the info from Ben C's Readme into the Windows directory. (Rel1.7 released, but again in a minute) Added a windist target to the main Makefile and wrote a run.bat script that detects whether tkeden is in the current directory or not. Added more directories to the setrcsstate target in main Makefile.in Removed guessLibLocation as it just doesn't work in too many circumstances. We'll have to rely on wrapper scripts etc using the -l argument. Merged in changes from BenC's Sasami version 0.6 (previously I had his version 0.3, and I'd simply left out all of the actual Sasami notation, just keeping the changes necessary to get tkeden to run on Windows. It now looks like Sasami will be considered a "standard" part of tkeden (a nicer solution would be a plug-in style thing, but we don't have the time to do this), and so I've made it optionally compiled when WANT_SASAMI is defined. Sasami only works on Windoz at present). Windows version 0.4 -> 0.6 changes: --Win32-V0.4---------------------------------------------------------------- Added support for materials (which gives full control over lighting parameters and texturing) through the "material" object type. Linked in the glPNG library for loading PNG files as textures. This means that Sasami now needs the glPNG libraries compiled and installed to compile correctly. glPNG can be found in the Sasami distribution (hopefully) or at http://www.wyatt100.freeserve.co.uk/download.htm . Commented out the glBindTexture/glGenTextures calls in glpng.c to avoid needing to link it with the non-existant OpenGL 1.1 library for CygWin. (note : this hack is no longer needed - see below) Added texture-mapping support, with auto-generation of texture co-ordinates if they aren't provided, and support for using texture binding to prevent texture-thrashing. Built the "Rubik's cube" example script. Increased the default ambient lighting a bit so objects no longer appear 100% black when not facing the light source. Built a new libopengl32.a based on MSVCs one, which includes the 1.1 functions - most notably glGenTextures and glBindTexture, which are used by the texture-mapping code. This fixes the problems with OpenGL implementations which don't export these via wglGetProcAddress (such as the MS and SGI software implementations), and means that a custom build of glPNG is no longer required. Packaged up the Sasami examples in a slightly more convienient directory. First "public" release version --Win32-V0.5---------------------------------------------------------------- Rewrote the Sasami parser to cope with variable number of parameters in notations, and altered various functions to take advantage of this - mainly by allowing multiple vertices/polys/etc to be specified in one call. Added commas to the list of things the parser considers seperators, allowing for scripts to use (easier to read in some circumstances) comma seperated notation. Fixed a stupid bug where the whole parsed string was converted to lowercase, including variable names - effectively preventing Sasami from reading Eden variables whose names contained uppercase characters! Fixed a *very* nasty bug where texture loading and rendering could take place before OpenGL was initialised, resulting in an instant crash...! Implemented a parser for Lightwave format .OBJ and .MTL files, converting them to Sasami code on-the-fly (and hence into Sasami objects). Reenginnered billiards model to give a 3D display. --Win32-V0.6---------------------------------------------------------------- Added better Windows message handling - Sasami now responds correctly to window actions when Eden is blocking the main thread (eg : "while (1) eager();"). Built animation sample (animate.s) to demonstation time-delta-based animation loops. Fixed a bug that caused textures to be lost when the viewport was resized. Added support for user-definable lighting. Fixed user-definable lighting to work properly, and added sa_r_maxlights to reflect the number of OpenGL-accelerated lights available. Finished up support for alpha-transparency, and wrote glass.s sample to demonstrate it. Altered default lighting so that models are reasonably evenly lit. Altered "load_obj" command so that by default it only loads the object and material definations as Eden declarations, and added "load_full_obj" command which loads everything (the previous behaviour). Fixed a stupid glFrustrum typo that was causing the far clip plane to be ridiculously close, and objects to appear to be microscopic in size (perspective-wise)! Fixed a bug in the OBJ loader that prevented objects with co-ordinates specified with exponents from being loaded correctly. Edited animate.s sample to use todo() instead of eager() so that it doesn't block Eden from executing user input. Added visible flag to objects. ** 1.6 [Ashley] Monday April 3 20:18:06 BST 2000 Rel1.6: onto new Dell PC, Windoz again, with merged in changes (and again a few mins later) And into $PUBLIC/bin ** Fixed silly bug in Scout/Makefile.in that caused Scout to fail to recover from parse errors. (bug15) Increased size of a buffer that was being overwritten by Patrick's code (bug16) in the SIT! model. Fixes made on the new PC for Windoz: o -X11 doesn't work on Windoz: need -lGDI32 -lUSER32 -lCOMDLG32 -lOPENGL32 -lKERNEL32 instead o Eden/main.c libgen.h not on Windoz. dirname does not exist. Commented out - will have to manually provide the location with -l. o Misc/custom.h needs the __WIN32__ declaration o EX/disp.c different fontHeight etc required on Windoz - replaced Ben's nominal values libLocation error message added if not set. winportextras files (.dlls, run.bat etc) added to the distribution. ** 1.5 [Ashley] Thursday March 23 16:18:11 GMT 2000 Rel1.5: onto new Dell PC, Windoz ** tkeden prompt changed to show the current VA. Installed at DCS. Version number not updated. bug10 (railway accident server seg fault) fixed in my copy scout.init.e updated: Tcl bound events now all redefine symbols with a "~" prepended in an attempt to avoid problems with the current VA setting. Need to update DCS copy bug11 (timetable @ screen seg fault) fixed in my copy Added a new function, symboltext() for Chris. Need to document. Attempted to make stack resize dynamically. Fixed readline prompt problem by making readline print the prompt (previously it was done by Eden and would fail to be reprinted for example on a Ctrl-U). ** 1.4 [Ashley] Fri Jan 14 15:27:40 GMT 2000 Rel1.4: into $PUBLIC ** o A copyright notice in the about dialogue o Get rid of HOSTNAME env variable o Change use of CHAR to something else to prevent clashes with Windoz header files (says Ben) o `@` now gives @, not an "expecting string" error. o Get ttyeden to use GNU readline to enable decent editing. o Merged in Ben's changes, as follows: You need to set up the PUBLIC variable with something like "export PUBLIC=/programs/eden". Also, set TCL_LIBRARY=/cygwin/cygwin-b20/share/tcl8.0. --Win32-V0.1---------------------------------------------------------------- Modified : configure makefile.in eden\builtin.c eden\eden.h ex\disp.c ex\disp.h misc\customlib.h donald\tree.h Initial Win32 port. Not much works! --Win32-V0.2----------------------------------------------------------------- Modified : tkeden\configure tkeden\ex\disp.c tkeden\ex\ex.c tkeden\version.h lib\tkeden\edenio.tcl tkeden\ex\win32ex.c tkeden\ex\win32ex.h tkeden\ex\makefile.in Implemented "hacked" versions of FontWidth & FontHeight. Altered configure script to link in Windows GDI functions. Implemented native DisplayDepth() function. Implemented slightly dodgy version of StringWidth. RoomViewer now works (FontWidth/FontHeight problems), albeit with misaligned text. Added Win32 version numbering to version.h. Added Win32 version number message to Help->91 window. Removed the focus-follows-mouse flag when running on Windows, as this is not normal Windows behaviour and will only confuse/annoy users! Added win32ex files to EX to hold Windows GUI functions. Rewrote the File->Include code to use a standard Windows dialog. Rewrote the File->Save code to use a standard Windows dialog. --Win32-V0.3----------------------------------------------------------------- Modified : tkeden\version.h tkeden\ex\parser.c tkeden\eden\notation.h tkeden\ex\lex.c tkeden\ex\script.c tkeden\sasami\* tkeden\makefile.in tkeden\configure tkeden\* , pretty much! :-( Added hooks to allow Sasami code to be entered and parsed. Created modified lexer/parser based on Donald code. Dumped Donald lexer/parser as it's way too complex. Wrote parser for Sasami code. Added Sasami OpenGL rendering code. Added Sasami functions to builtin.c for reading back changes to data. Sasami vertex rendering now works. Fixed up some structural bugs and implemented polygon rendering. Added auto-normal generation so OpenGL lighting works. Fixed crash-on-shutdown bug due to not destroying WGL context correctly. Fixed support for comments in Sasami Added object handling code, and modelview matrix logic for objects Moved variables like background colour to be "true" Eden variables rather than function calls. Fixed lazy-creation of certain objects causing crashes if the object was used before any parameters set. Added "`" notation for passing code to Eden. Added the ability to change viewport resolution from Eden, and to toggle the axes indicators. Created a simple morphing object demo. ** 1.3 [Ashley] Mon Nov 8 21:54:31 GMT 1999 Rel1.3: to take home with me! ** o Investigated with tcl/tk 8.2.0 (was previously using tcl/tk 8.0). Fixed environment variable handling. Now OK. o Makefile should mark lib files with version number o configure: don't stop compilation if we don't have tcl/tk o Error message "unexpected end-of-file in chararcter constant" !! ** 1.2 [Ashley] Wed Nov 3 16:16:12 GMT 1999 Rel1.2: bug fixes to 1.1. Ooops - didn't mean to increment the version no. ** o Bug fix: myttyeden, s=0;s=1l; - seg fault. Not in ttyeden Investigated, and found only in wierd set of circumstances - ignore. o Error message "type clash: expectingint" !! o Error message "no such variable ash ...called by" o Error message "func/proc needed ...while executing" o bug7 at ITS Same as above - found it happened lots at ITS. Worked around. ** 1.1 [Ashley] Wed Nov 3 13:51:59 GMT 1999 Rel1.1: installed at ITS under ~cssbz for CS233 experiments with Eddi ** o $PUBLIC. Could eliminate by using dirname(argv[0]) or similar. However, Eden support code uses it. Could rewrite Eden support code, but other Eden code might assume it. Perhaps could detect with this procedure, then set the variable once the tkeden process has started. However - this looses us flexibility - cannot set PUBLIC to somewhere else deliberately. Perhaps could allow an override with a command line option. Would this solve more problems than it causes (esp wrt the Windoz port?). Perhaps change to EM_PUBLIC whilst about it. Or set EM_PUBLIC in a wrapper around tkeden etc... then users don't need to keep modifying their setup. Or maybe EM_LIB would be more appropriate. Wrapper script should set the variable if it is not already set to allow overriding. Or perhaps lib files should be in a subdirectory of dirname, including the tkeden version number to allow installation of multiple versions. o Provide a way to override the library files detection result o Rewrote emalloc etc as macros and other stuff to enable dmalloc to give sensible reports o Fix the Scout memory leak that Simon found: bug5 o Redid COPYING file. Couldn't reproduce: o Fix the Tcl bug that Simon found: OXO demo "Tcl errors occur when you shut the model down with the clock (animation) still running." o Copy and paste problems on UNIX. A Tcl problem. Don't move the mouse whilst you click the middle button. ** 1.0 [Ashley] Fri Oct 8 20:13:02 1999 (about) Rel1.0: to Ben Carter for OpenGL expts ** o These changes made by Ashley Ward. o Throw away Imake stuff, start again with autoconf. o Merge in Patrick's dtkeden changes o Put unused code in Attic. Also their RCS files o Fix ttyeden on Linux (rethink linking to curses?) o Remove -R and -ldl from linking on Linux. Also need -I/usr/include/ncurses. Also need -lncurses, not -lcurses o Move Attic directories into one directory, possibly out of the source distribution o Fix curses stuff - try with ncurses_g? o Check through error messages etc output from tkeden - fix for good English :) o Check for PUBLIC being set - if unset, crashes with seg fault on ARML. o Check what happens when DISPLAY is not set or xhost problem - falls over nicely? o "...near line " could do with some more description of the line. o Compile with optimisation (gcc -O2, cc -xO2 + change the number) o Move Imakefiles into Attic o Remove unnecessary gunk from start of Makefile.ins - install eg o Can ttyeden do donald and scout? If not, remove the code from the link... o Remove UNIX command dependencies: 'ls' in file handling o dtkeden has a new TEXTBOX functionality - document! o Need a dynamic buf in type.c, t_str to prevent overflow and Seg fault when converting long lists to strings. o Do we have a Y2K problem, with the results from gettime(), time(), ftime()? o Eden gettime() uses C-lib time() and C-lib localtime(), the year result of which is years since 1900. So applications, currently receiving the number 99, will receive the number 100 next year. So OK. o Eden time() is basically a call to C-lib time(), so OK. o Eden ftime() is basically a call to C-lib gettimeofday(), so OK. o A -v option to show the current version (of tk and tty eden) o Help -> 91 Tkeden to show version number. Perhaps also print it on stdout when started up. (no!). Perhaps also show $tcl_version. o Remove RCS Log header o Make sure all the code has a static RCS Id header so we can use strings on the executable. o Move lib/bison into the source directory. Remove the sym links. o Fixed the Segmentation fault found when running the dtkeden railway demo o Tcl error messages seem to be swallowed and replaced with less helpful ones. See especially the definition of tcl() - whereever that is... o Rewrote curses linkage to remove SunOS dependencies o Added a new hook: _tkeden_showxoutput = 1; shows xoutput tcl output And now some ancient history... ** September 3 1999 [Patrick Sun?] ** o tkeden.S and tkeden.C merged into one dtkeden version with a command argument -s(superagent)|-a(agent). o -h command argument added ** December 15 1997 [?] ** o Unknown changes ** December 9 1997 [Patrick Sun] ** o tkeden.S and tkeden.C (server and client) variants created by Patrick Sun, later to be called dtkeden, created from the tkeden source. o -c command argument added. o This version must be run on gem (as gem is hard-coded as the host). ** September 26 1997 [Richard Cartwright?] ** o Two versions of tkeden compiled for DCS, possibly by Richard Cartwright, it looks like one for 'sun5' (tkeden-sep2619972) and one other (tkeden-sep261997). ** October 28 1996 [Simon Yung?] ** o A version of tkeden compiled for DCS (by Simon Yung?). ** June 20 1996 [Simon Yung?] ** o A version of ttyeden compiled for DCS (by Simon Yung?) on SunOS? ** February 27 1996 [Simon Yung?] ** o Last RCS check-in made by Simon Yung? ** July 7 1995 [Simon Yung?] ** o First RCS check-in made by Simon Yung? EDEN-1.66/lib-tkeden-1.66/scout.eden0000644000175000017500000006232310276120146016520 0ustar rboyattrboyatt/* * $Id: scout.eden,v 1.2 2002/07/10 19:33:21 cssbz Exp $ */ /**** * * * This file is the function library of the SCOUT system * * It contains definitions of attributes, EDEN version of * * some SCOUT functions, screen updating functions and * * its sub-functions and initialization procedures * * * ****/ /** Initialise EX **/ /* luckily these first two are the same as required by donald in donald.init.e. These must be the same values as are defined in the Scout namespace in Scout/lex.c (init_scout). Also define these in builtinf.h [Ash] */ OFF = 0; ON = 1; MOTION = 2; ENTER = 4; LEAVE = 8; CLIENT_LIST = []; /* declare a list for server end to list all connected clients */ DFfont = "{courier 10}"; DFscreen = "screen"; /* should not change this */ DFalign = 0; /* 0 - no, 1 - left, 2 - right, 3 - centre, 4 - left & right */ ##DFbgcolor = tcl(". cget -background"); ##DFbgcolor = "grey90"; ## the default Scout screen window background colour seemed good on ## Solaris, grey90 seemed good on Mac OS X, but now I think we need to ## set it explicitly to what it used to be in older versions of tkeden ## on Solaris (as some models will assume that the colour will be ## exactly this). This number determined by measurement from such ## versions. [Ash, 14 January 2004] DFbgcolor = "#859397"; DFfgcolor = "black"; DFbdcolor = "black"; DFborder = 0; DFrelief = "raise"; DFxmin = 0; DFymin = 0; DFxmax = 1000; DFymax = 1000; DFhighlight = 1; DFsensitive = OFF; DFwidth = 500; DFheight = 500; proc HandleDisplayResizeEvent { para widget, name, width, height; /* Ignore messages about child widgets */ if (widget == "." // name) { /* Don't redefine if the values haven't changed. This will cause "reference to undefined variable" notices if they are enabled the first time this is done. */ if ((`name//"_width"` != width) || (`name//"_height"` != height)) { execute("%scout\ninteger "//name//"_width="//str(width)// "; integer "//name//"_height="//str(height)//";"); } } } proc OpenDisplay { para name, width, height; if (name[1] >= 'A' && name[1] <= 'Z') name = "_"//name; tcl("toplevel ."//name//" -background "//DFbgcolor// " -width "//str(width)//" -height "//str(height)); tcl("wm protocol ."//name//" WM_DELETE_WINDOW { set show_"//name// " 0; show "//name//" 0;}"); tcl("wm title ."//name//" \""//name//" ($variantversion)\""); tcl("uplevel #0 {set show_"//name//" 1}"); /* the -underline here should really look through the other items in the * menu and find the first unique character to use as a key shortcut * [Ash], April 2001 */ tcl(".menu.show add checkbutton -label "//name// " -variable show_"//name//" -command {show "//name// " $show_"//name//"} -underline 1"); tcl("bind ."//name//" { " // "eden {~HandleDisplayResizeEvent(\"%W\", \""//name//"\", %w, %h);}" // " }"); HandleDisplayResizeEvent("."//name, name, width, height); execute("%scout\ndisplay ~" // name // ";\n%eden\n"); tcl("tkwait visibility ."//name); } proc DestroyDisplay { para name; if (name[1] >= 'A' && name[1] <= 'Z') name = "_"//name; tcl("destroy ."//name); tcl(".menu.show delete "//name); tcl("unset show_"//name); } func StringWidth { para win, font, string; if ((win == @) || (font == @) || (string == @)) return @; return int(tcl("font measure " // font // " -displayof ." // win // " " // "{" // string // "}")); } func FontWidth { para win, font; /* Measuring the width of the (wide) character 'W' */ return StringWidth(win, font, "W"); } func FontHeight { para win, font; return int(tcl("font metrics " // font // " -displayof ." // win // " -linespace")); } func DisplayDepth { para win; return int(tcl("winfo depth ." // win)); } /* This gets called when '%scout' is done for the first time */ proc scoutScreenInitOpen { OpenDisplay(DFscreen, DFwidth, DFheight); tcl(".menu.show invoke screen"); /* default to hidden [Ant][09/08/2005] */ fontWidth is FontWidth(DFscreen, DFfont); fontHeight is FontHeight(DFscreen, DFfont); displayDepth is DisplayDepth(DFscreen); } /* Only show the scout window when it gets used [Ant][09/08/2005] */ proc scoutScreenShowHide : screen { if (screen == @) { if (tcl("expr $show_screen")=="1") tcl(".menu.show invoke screen"); } else { if (tcl("expr $show_screen")=="0") tcl(".menu.show invoke screen"); } } /**** * SCOUT functions * ****/ func pt_add /* ( point, point) */ /* + (point addition) */ { return [$1[1] + $2[1], $1[2] + $2[2]]; } func pt_subtract /* ( point, point) */ /* - (point subtraction) */ { return [$1[1] - $2[1], $1[2] - $2[2]]; } func row { return $1 * fontHeight; } func column { return $1 * fontWidth; } proc update_row : fontHeight { touch(&row); } proc update_column : fontWidth { touch(&column); } func dotint /* ( list, int ) */ /* .1 (i.e. dotint(point, 1)) .2 (i.e. dotint(point, 2)) .type (i.e. dotint(window, 1)) .frame (i.e. dotint(window, 2)) .string (i.e. dotint(window, 3)) .box (i.e. dotint(window, 4)) .pict (i.e. dotint(window, 5)) .xmin (i.e. dotint(window, 6)) .ymin (i.e. dotint(window, 7)) .xmax (i.e. dotint(window, 8)) .ymax (i.e. dotint(window, 9)) .bg (i.e. dotint(window, 10)) .fg (i.e. dotint(window, 11)) .border (i.e. dotint(window, 12)) .align (i.e. dotint(window, 13)) .sensitive (i.e. dotint(window, 14)) .bordercolor (i.e. dotint(window, 15)) .font (i.e. dotint(window, 16)) .relief (i.e. dotint(window, 17)) .(int) (for frame and display) */ { return $1[int($2)]; } func dotne /* ( box ) */ /* .ne */ { return [$1[3], $1[2]]; } func dotnw /* ( box ) */ /* .nw */ { return [$1[1], $1[2]]; } func dotse /* ( box ) */ /* .se */ { return [$1[3], $1[4]]; } func dotsw /* ( box ) */ /* .sw */ { return [$1[1], $1[4]]; } func dotn /* ( box ) */ /* .n */ { return [($1[1] + $1[3]) / 2, $1[2]]; } func dote /* ( box ) */ /* .e */ { return [$1[3], ($1[2] + $1[4]) / 2]; } func dots /* ( box ) */ /* .s */ { return [($1[1] + $1[3]) / 2, $1[4]]; } func dotw /* ( box ) */ /* .w */ { return [$1[1], ($1[2] + $1[4]) / 2]; } func boxshift /* ( box, x, y ) */ { para box, x, y; return [box[1] + x, box[2] + y, box[3] + x, box[4] + y]; } func app /* ( list, position, element ) */ /* append (for both frame and display) */ { insert $1, int($2) + 1, $3; return $1; } func del /* ( list, position ) */ /* delete (for both frame and display) */ { delete $1, $2; return $1; } func list_append /* ( list, list ) */ /* & (for both frame and display) */ { return $1 // $2; } func formbox /* ( point, point ) */ /* constructor of box : < P1, P2 > */ { return [$1[1], $1[2], $2[1], $2[2]]; } proc update_textbox : column, row { touch(&textbox); } func textbox { return [$1[1], $1[2], $1[1] + column($3) + 1, $1[2] + row($2) - 1]; } func box_width /* ( box ) */ /* return the width of the box in pixel */ { return $1[3] - $1[1] + 1; } func box_height /* ( box ) */ /* return the height of the box in pixel */ { return $1[4] - $1[2] + 1; } func capacity /* ( box ) */ /* return [r, c], no of row and no of col the box can hold */ { return [($1[4] - $1[2] - 1) / fontHeight, ($1[3] - $1[1] - 1) / fontWidth]; } /*** * string manipulating functions * ***/ /* this doesn't seem to be used anywhere [Ash] */ func Quote { para s; auto ret, i; if (type(s) != "string") { return str(s); } ret = "\""; for (i = 1; i <= s#; i++) { switch (s[i]) { case '"': ret = ret // "\\\""; break; case '\\': ret = ret // "\\\\"; break; default: ret = ret // s[i]; break; } } return ret // "\""; } /** * image related functions * **/ /* return the height of an image */ func ImageHeight { return tcl("image height "//$1); } /* return the width of an image */ func ImageWidth { return tcl("image width "//$1); } /* read, name and return the image from file image format currently available are ppm and gif */ func ImageFile { para imageName, type, filename; xoutput("image create photo", imageName, "-format", type, "-file", filename); return imageName; } func isInteger { return ($1 == int($1)); } /* scale the srcImage, name and return the scaled image as imageName */ func ImageScale { para imageName, srcImage, xscale, yscale; auto subX, subY; xoutput("image create photo ", imageName); subX = 1 / float(xscale); subY = 1 / float(yscale); if ((xscale > 1) && (yscale > 1) && (isInteger(xscale)) && (isInteger(yscale))) { /* zoom can only handle positive integer non-zero amounts: see man -s n photo */ xoutput(imageName, "copy", srcImage, "-zoom", int(xscale), int(yscale)); } else if (isInteger(subX) && isInteger(subY)) { /* subsample can only handle integer amounts: see man -s n photo */ xoutput(imageName, "copy", srcImage, "-subsample", int(subX), int(subY)); } else { /* can't do requested scaling with Tk built-ins: use pnmscale external utility (not available on Windows) */ xoutput(srcImage, "write /tmp/1"//imageName, "-format ppm"); xoutput("exec pnmscale -xscale", xscale, "-yscale", yscale, "/tmp/1"//imageName, "> /tmp/2"//imageName); xoutput(imageName, "read /tmp/2"//imageName); xoutput("exec rm /tmp/1"//imageName, "/tmp/2"//imageName); } return imageName; } /* ImageSized produces an image where the longest edge is 'size' pixels */ func ImageSized { para imageName, type, filename, size; auto img1, h, w, scale; img1 = ImageFile(imageName, type, filename); h = int(ImageHeight(img1)); w = int(ImageWidth(img1)); /* preserve aspect ratio */ if (h > w) { scale = float(size) / h; } else { scale = float(size) / w; } return ImageScale("s" // img1, img1, scale, scale); } /* cut a rectangle out of the srcImage, name and return result as imageName */ func ImageCut { para imageName, srcImage, x, y, width, height; tcl("image create photo "//imageName); xoutput(srcImage, "write /tmp/1"//imageName); xoutput("exec pnmcut", x, y, width, height, "/tmp/1"//imageName, "> /tmp/2"//imageName); xoutput(imageName, "read /tmp/2"//imageName); xoutput("exec rm /tmp/1"//imageName, "/tmp/2"//imageName); return imageName; } /* create pattern using ppmpat */ /* ppmpat generates ascii PPM which cannot be recognised by Tk */ func ImagePat { para imageName, form, width, height; tcl("image create photo "//imageName); xoutput("exec ppmpat -"//form, width, height, "> /tmp/1"//imageName); xoutput(imageName, "read /tmp/1"//imageName); xoutput("exec rm /tmp/1"//imageName); return imageName; } /* procedure for displaying an image */ proc ShowImage { para I_source, source; auto command, i, width, height; for (i = 1; i <= (*source)#; i++) { command = "."//(*source)[i][1]//"."//(*source)[i][2]; width = int(tcl(command//" cget -width")); height = int(tcl(command//" cget -height")); xoutput(command, "create image", width / 2, height / 2, "-tags image -image", *I_source); } } / screen updating actions / func Position { para bd, width, just; auto x, j, anchor; switch (int(just)) { case 1: x = 0; j = "left"; anchor = "nw"; break; case 2: x = width; j = "right"; anchor = "ne"; break; case 3: x = width / 2; j = "center"; anchor = "n"; break; case 0: case 4: /* not supported by Tk */ default: x = 0; j = "left"; anchor = "nw"; break; } return str(int(bd + x))//" "//str(int(bd))//" -anchor "//anchor //" -justify "//j; } proc scout_show_2D /* display a DoNaLD/ARCA picture */ { para screen, winNo, boxName; /* writeln("scout_show_2D: ", $); */ scout_show_2D_window(`screen`[winNo], "."//screen//"."//boxName//"_1", boxName//"_1"); } proc dobinding { para sensitive, widget, windowName, tclVarNameStart, boxNumber; auto mouseName, keyName, mousePosName, mouseEnterName, mouseLeaveName, xCoord, yCoord, mouseClickName, mouseClickStuff; sensitive = int(sensitive); /* yuk - integerhonest hack [Ash] */ if (boxNumber > 0) { /* TEXT - have the boxNumber within the frame to deal with */ mouseName = "~"//windowName//"_mouse_"//str(boxNumber); keyName = "~"//windowName//"_key_"//str(boxNumber); mousePosName = "~"//windowName//"_mousePos_"//str(boxNumber); mouseEnterName = "~"//windowName//"_mouseEnter_"//str(boxNumber); mouseLeaveName = "~"//windowName//"_mouseLeave_"//str(boxNumber); mouseClickName = "~"//windowName//"_mouseClick"; xCoord = "%x"; yCoord = "%y"; } else { /* not TEXT - no boxNumber but must correct for window coordinate system */ mouseName = "~"//windowName//"_mouse"; keyName = "~"//windowName//"_key"; mousePosName = "~"//windowName//"_mousePos"; mouseEnterName = "~"//windowName//"_mouseEnter"; mouseLeaveName = "~"//windowName//"_mouseLeave"; mouseClickName = "~"//windowName//"_mouseClick"; xCoord = "[expr (%x-${"//tclVarNameStart//"_xOrigin})/${"//tclVarNameStart//"_xScale}]"; yCoord = "[expr (%y-${"//tclVarNameStart//"_yOrigin})/${"//tclVarNameStart//"_yScale}]"; } if (sensitive bitand ON) { /* the window is interested in mouse actions and key strokes */ /* implement some old, deprecated features if required */ if (tkeden_vbfeatures == 1) { mouseClickStuff = mouseClickName // " = TRUE;\\n"; } else { mouseClickStuff = ""; } xoutput("bind", widget, "