From fe36315ca50c5abe4493e33484bdc4dd4132ff9b Mon Sep 17 00:00:00 2001 From: Matthias Felleisen Date: Thu, 15 Jan 2009 02:59:47 +0000 Subject: [PATCH 1/4] a few typos in universe.scrbl fixed svn: r13138 --- .../2htdp/scribblings/universe.scrbl | 24 ++++++++++-------- collects/teachpack/nuworld.png | Bin 15606 -> 16965 bytes collects/teachpack/nuworld.ss | 5 ++-- collects/teachpack/world.ss | 1 + 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/collects/teachpack/2htdp/scribblings/universe.scrbl b/collects/teachpack/2htdp/scribblings/universe.scrbl index b0f3ec8363..137629680e 100644 --- a/collects/teachpack/2htdp/scribblings/universe.scrbl +++ b/collects/teachpack/2htdp/scribblings/universe.scrbl @@ -126,7 +126,7 @@ Your program may deal with such events via the @emph{designation} of installation of three event handlers: @scheme[on-tick], @scheme[on-key], and @scheme[on-mouse]. In addition, a @tech{world} program may specify a @scheme[draw] function, which is called every time your program should - visualize the current world, and a @scheme[_stop?] predicate, which is used + visualize the current world, and a @scheme[done] predicate, which is used to determine when the @tech{world} program should shut down. Each handler function consumes the current state of the @tech{world} and @@ -835,7 +835,7 @@ The @scheme[on-receive] clause of a @scheme[big-bang] specifies the event handle The diagram below summarizes the extensions of this section in graphical form. -@image["world.png"] +@image["universe.png"] A registered world program may send a message to the universe server at any time by returning a @tech{Package} from an event handler. The @@ -964,7 +964,7 @@ A @tech{server} keeps track of information about the @tech{universe} that a server tracks and how the information is represented depends on the situation and the programmer, just as with @tech{world} programs. -@deftech{UniverseState} @scheme[any/c] represents the server's state For running +@deftech{UniverseState} @scheme[any/c] represents the server's state. For running @tech{universe}s, the teachpack demands that you come up with a data definition for (your state of the) @tech{server}. Any piece of data can represent the state. We just assume that you introduce a data definition @@ -1368,7 +1368,7 @@ The second step of the design recipe calls for functional examples: ;; an example for receiving a message from the active world: (check-expect - (switch (list world1 world2) '* world1 'it-is-your-turn) + (switch (list world1 world2) '* world1 'done) (make-bundle (list world2 world1) '* (list (make-mail world2 'it-is-your-turn)))) @@ -1421,16 +1421,20 @@ Similarly, the protocol says that when @emph{switch} is invoked because a that there is at least this one world on this list. It is therefore acceptable to create a mail for this world. +Start the server now. + + @schemeblock[(universe '* (on-new add-world) (on-msg switch))] + Exercise: The function definition simply assumes that @emph{wrld} is @scheme[world=?] to @scheme[(first univ)] and that the received message - @emph{m} is @scheme['it-is-your-turn]. Modify the function definition so that it + @emph{m} is @scheme['done]. Modify the function definition so that it checks these assumptions and raises an error signal if either of them is wrong. Start with functional examples. If stuck, re-read the section on checked functions from HtDP. (Note: in a @tech{universe} it is quite possible that a program registers with a @tech{server} but fails to stick to the agreed-upon protocol. How to deal with such situations properly - depends on the context. For now, stop the @tech{universe} at this point, - but consider alternative solutions, too.) + depends on the context. For now, stop the @tech{universe} at this point by + returning an empty list of worlds. Consider alternative solutions, too.) Exercise: An alternative state representation would equate @tech{UniverseState} with @emph{world} structures, keeping track of the @@ -1533,7 +1537,7 @@ the scene every time @scheme['it-is-your-turn] is received. Design this function (define (receive w m) (cond - [(symbol=? 'resting w) HEIGHT] + [(symbol? w) HEIGHT] ;; meaning: @scheme[(symbol=? w 'resting)] [else w])) )) @@ -1573,7 +1577,7 @@ the scene every time @scheme['it-is-your-turn] is received. Design this function [(number? x) (if (<= x 0) (make-package 'resting 'done) (sub1 x))])) )) - Exercise: what could happen if we had designed @emph{receive} so that it +Exercise: what could happen if we had designed @emph{receive} so that it produces @scheme['resting] when the state of the world is @scheme[0]? Use your answer to explain why you think it is better to leave this kind of state change to the tick event handler instead of the message receipt @@ -1591,7 +1595,7 @@ Finally, here is the third function, which renders the state as a scene: (check-expect (render 'resting) (place-image (text "resting" 11 'red) 10 10 MT)) -(define (render name) +(define (render w) (place-image (text name 11 'black) 5 85 (cond diff --git a/collects/teachpack/nuworld.png b/collects/teachpack/nuworld.png index 2b215663af7eec24a24618fc866879ec02c4e92b..4e6d56a352ee3d7330f653a28ccd9cf3581df61c 100644 GIT binary patch literal 16965 zcmdsfXFS&Z-}ey>G;B#pin2n8%IrvyoxMuR-YaC65hW2)l#yg-MI;o8Y}vC^N_NU# z_xm`{v;Xz~-}j^Y!F9b}_kBF6bo3kF?`OQn=Ua%HirjW87AgXPu>GvOtU7@}_JKgy z5KcjcpKNoW*+L-fBb=2zsp>E62y*HjM9~tP&F+H&H6aAVKS$kO2)Mi33qm;V~6Y-Et z_K%+fcrHQxT`BG@T`fcjnw` zZ*MQM?aR;Ed01b>Yr$b|wl?Abn}mC!Pfyhi>h;z6k98VCLPGcW&+890Y-QqO7PB+F zc=6M-^QEKxR)iLx;uMBN72>H=-y7p}h75SMvl9E6RWh}+Z{EClq0Gbd@@41MrP&+Q zY;;8CpsNehNw;p@dRjDtCoV8=e)sn6dlMleqmMto)L2_J5)!i=ipUe^6ciN`Bt5@P zPByK%udOV)PV{ctv`NzAcQ6gzu3hir$%~za6_)2F&YwRoy*ys<_SR0FBGKr#Qv;=4 zsj6%`I$f0X2XlqDv7T`GSnh3SXLsSkh2{iloeDGDs6IwOc$)mzUS~rbn!M_Ph&Y<&Avb{q)S4GaeouYror6`&sbz9`lnEBO|(cJ}+G-^l?>A zx{&mAOT6WUSMKMQPf-$HZpg!fPkyZU_~b18WKF5t)L^k=vgiCHEiG+8I5w-l-;h|l zviPg(*?G^2-om?g?>00v)O9}1FD@*c#cJT`-M%-miUvPPO`Yn_`_fz1LYE&OYVNQprhGVcV@ICyK#BABH~w1= zsXVOBHXiHDmXeY>d-m+!y?Ysb3>HQ^GCMmv$E~fc$9Q#~wa>|r`8|^vC#03(N`)4! z*Owi8pIdI7m+X;~$}+0(nX3q671tj6tQ;p= zn47!st65r6QL)E)cR+Y;tvoKhgZ0EK_n(g|k2({ll!OMBMxoSMoqd!&?%D;X2B0Oz`olkT4 ziM!2@bqO3glzJ}tOn+%mP|(+pHCkH5W?`kJo=#3qN=n;yi+}$78C%i&!agA(!T#dK z*ZihdR!ew5S08V0@93jXo;(q;>(_0Z^z`&}E?r-mwYImnKPpU4psC*B_j05?y$yFM zVKXZCI!jUFwdjP z!=Ay##l^Sp-q8^?%eyOov?kYJ$0^v6AnEDpNb0Q4bL0fpAp3kmd;GO)*KXfdc5)J0 zw(amcGZV$zonDT>SUQ#s!n*bwVTcS`oaz`)I$H=|B)2K1M@*|(>i>*?wF_U&6h z_yM^vU48wfg$0+%{t~%6dwo}Dce0!O{QTC(#|Je5{|djsN8D}lp_KPh>{09Pqp7K> znTAy!%X8W3>D=>QzP^tXv+b3ocp&BNfhy1wJw8|#*T>Ipg7VYU)YO)$y8g+Z+Q!!Q z!YJzZTOYh>WAc*!Se8%*e&^PtVSlq0SULe);_63$oq5 zzj)}|w|9~|qrXf{cz>>@B+9$ExTvYASy_$VodGm~#H5^@W+@r%(}A}U%PJNYBk_`+R$UwfwV(o4 z0*foUo#U5xw8Z@U{OkVy28C9`V`Fi5?-D6OLPHH-*qy(4@nW2)ZBx9Y!O-VnIbuZp z@cB~L+c$4Ixw#4O^Y1<3Vv(xyXk~R3S$cJ}J$>=lcX}cnJ-xWg$ZM&=%iX!gbq89h zQ8RvhYeeFyoIU%#wsxc~_0EkOHOQ0K*;f%Ib8~aaXKr8mUg0{yBHmR0K-j$aV6@Rq zTk02#b4h6d;l;(p8^|~J7d!gX;L;jBG4|wSWG_)Ydrr1wCHO3*qr}>L+ZVvh!g9}7 zG?ry@auO9)<5#0OAx)}!2VuMC%EFOl!&ckAqAMdUL+>LGeW|%)E-dTnI@eohjZ|XY zwW|cHK($jqnvSYU&~37x`|#nitG}Mc#}8ty?LU@J3=RFnp1J+_Fg((l91t#S-t@|6 zb*VGkz<%)6`{rgHA0;afk0rc5>B}P{#aR9DaMF{bk~1c(SgLp#dTa0muAQ2zbE)= z&rK$sx&c&x4_41$?R+4Sb}8r9P64O3^@T5Y^a{)z4@u~v`Y}FDsMA)z5P47;%`?Yr zGa>Dup~;4pCwS$f7A=0>-YW|~XUDq6#>VdKmGpRjmvdZhA#|58Dvb%sby%0j%-6GX zCldl_3=H~k)zflva;Hz{9Z0encp2?o-{0>w`0DDoHL4cg^Y?ETVc`O^#@MqdA8`G* z)zt`lUQyA`4E;~Cr zMLqr2t$LJvO}lY5T2|KV6^5&f2;qsgRO-GbGgG5uV+B)mM4#1J9lMveZYeI-l)bPU zSZa76Y~(%5xJ&{$NE56quff@?yLRpB7are`$nOxbNhT8QM*oFfqmQTPv19ioulO#` znELvzQzZ;{JXPLp=fET&AfVnM&$VU8o{^q{@2GdXk6Km7^H5Mw=oVUOA-4wl`w>y= z<2}Mh*}{Qjn;ROoQIS6Rg@uQu{gaa~TUuILS@Bc}es505`KHb%EnQ*cvzUS$2%rI2 zK_X;?up&&9m6RSzTy-)PwrG)K^L81oiv}vt&ly5g)`{g4WU|>^2^P9)YAq25Y8n>3wY60>Ug8G=OkG`l zeQg!667cxWojbA7s<9$Ju=i-&tj8SoxjD+6c6WD|k&!_b6z`VJC}3cJg6KfIv>6{k ziX*DKldPi7mpHv`Zq7l|7#bQfZ;rR^%zChtd`=@y%-*bG;ibb6(e5$I8g^{y_YYyO zg=svqs6`8aRN~T@(%G|ld3kT>FK!SaYwjga+kUh;-Gtc;-vp|^n3Jn%J`y=&t+to) z^d`@{r+A{ZMb#9e(KK$~zTM#!mzdRwJmSuOAy2czV%VceD}Je5f+; z-o1PM3=$vK=st6Qi&4{e#x;-M*=xjebgmC(*|f?CG*lfPU{(h{LC$WxpklCyH3 zFZRmUTG~n4heX{wEX*w%2~nigzHt7X$vG~Deu{l)gY%OEywc4XTA4g6`rPawJ4Q)r zn$8ARoo(qFhp4Hkw`{pVd*BQM6O&V$PL{5*y?ygqj_>c0b8~CTz!U(e3yX`&2~w*Q zeJ`*%|_wLN+x3@m}u0M(^MpwUkmu~LXn^QsCLa;oyZx+pMa7MWVI^~}$o zKT+scQGKyu2CL*kpplV>RJDD52rZXDF68AOwTdl4GW`4q#9)7a@G=8@v$3^xDR?ij7U&U0 zG&YL#Ayp&kwFUp>ceg!&|Hq$gARv`2bXjXmc1gHTqe^Q9MH`hk4Fg21uC8JQo0a>Y zTWWZCoNz1UvPQf(e{1LgJHw8qD#vwV4FMTuM_T<^-)Ak24cYV;|BSOQFG1HpWH%0u zC{Q>$IE?fbX3lKiU-#9iFsKmMwMIbi1tH739&(eF)$b4rj&A~xN* zb#G0D9%%BIsy>TC9f*!j5B1V+oVBRNZsV4FnV8O)JG*@1PC?=~k*n=yj!cQIqqcaw z3CU-*{n3_0(djqI^=jUJ`t+a0^orwFxT`)!#1d0@lGV6w-nwPIny6mB=eQFIG}Ik< zm6z|mFJgvsZ>fM-t2 z>^RZVTD^nuD}{(FAy@}1IP@ql&(ZWtRr-BFW1_C^eMA17se>E*IzgFRa$knNuWb4? z@#5ng?ge2bhW~u5#MS&qj|S#H`Zkwm3N*{3_p57Y04o0&8L8!G zMl=ppZVEDf`0ycqTwhn$Z63I3<3_~RCuClEd3oJ#9v&X6_B7g3`E%!Js{}z%Q2ns^ zpukpU5R3ZJoqD3Zel?0=uX9!%84lG|1ib8TeNN7krWE`l$|{_g2y>OZ$2p_B)gx6GJ9i$6kOy*$+PS_omhm45-k2ZhjPBXw{lzDx9y~cV=E|vMGcMitB)$Y6^Ny(O5+}zye{1j8v z@pf~wVjsP#?o|Oyym?~`5+n2=^wCFXN+rdJ4`YGWo6o(7(tSUn*7+_B-Qb~j8}DvK zMR_Fd2AH8;^a-giW`yj z^g%@ss*I8u;DXb)n4+ViM#jdBiXDtm8V(*jXtPl4{JkkfF{b$V_l5_*pel`wSU?v+ zS40h5URX%W%JyAfOYolS0V%ezvEk`A3>0p_f}+X*=wCXeWMyS#N?v)=TSl&p3{=M0 z$Yr$MvJL`Js*0&ER#jjN^vI(BoSdA;j~|ED6+nX~yLIcR>_nd!FYhgbI0$^2nwmh@%d=xIpqS3YW!h}E z+ZF@KXt$W1!+ZjnfJ;%bWgfz;2#HwsJR@+SyyOX)VdnV61g;kWa)nQH^jj6fLaUC2 zpCslyF+Sd1->|L95Db+@-Ow=WRXo(GUAuRKQb)uIdCu7g2;_Y9Sw>;;xpn(?wnMU- z_e(?Wqm5j=yvxnLYmqTAHEUdv??p;~phbW>OK<}4n8qXL(v{x7f1hq+3r+XiHtZh? zW9H+M-ryO5Bz`xM3ALU#E^cn%`@-{I#(N6nLYX7t;!4pVp^5+==C?IAG^ivzdldWU|7hWyQb{PQ=bZyfg{vwuP7*DXn>V)*p(Nli33CZ-ET zpR4dfOrm;S=wF`&yVGTD9olm)^!Dx9xjC~#;4;qhpJ||Cx3(>R zFHB`ets0$(Kbo;>gHwvKECmsinYfdWER+1bE1ezTwGjf z1NkKS=r$E^)~9g*QW90*^_tBxvp?MB+N4nIAv0j-sHmxZ7pB?8Ti?AqvzX)sT?n$R z#8EZ!0H2~$dM8i5!K2%O(|a4|KoS6RyUf;=w*UC?2Q(jwYz>I=(6)eQ-rgHMp~)j5 zu>x%NY#<*Jd{IGx^OY+dHjx>ckiX;N`qIuFAj-SDF91Aqi4m-*Sd|U%OxsaHKUasK zqkZV=nxCDOyfWJEyY?#qg%>jPx8Y%}^)Y)gj;95z$kOrl^vIc0WM}T|MR9EOP9i~t z@va#B0m{KBK3~7K=UuLW$eNbMG07Bs`(M>(j;=1SL*v&BZq;T0XW$MAO!aI z^w@&APcfZjba{o1hem-aZ-L$z5Wc=PUvc{MX*6w;@angLT-2uf;-yQKO$X~{etN4~ zZxZRqKyuV3KE2LYVfmzY_!hToK`@aZa{)-p$KYyN8Q88mS>&Vdh=siCG z(PRqEZt&KHK@d_go9@?w4bLsxpkr4HHXt>~$jBf!JojF94KfB0bNumvGsw8Et`6F1 z_KNZYH2-Ygs9~X{+7Yhc2DyJEx(Z-VQ#m7`RVYUppOI zOF;||s!k^$Er>!Wn{>S76c)S;HvyHDJ97r=>$ye+pOv3A5EXMkan?%|8~jvG0hc||2QGWdz`uck zkrCwB)WjtBR=tT3XrO_C0UH||gdnEF`p1qRe9a2%!_SZC7Pr=#1vQ-V$f<21)D^ERjp1%#gLeqOyN^mmn-GT;J4WX0(%m z;n=Zb4$YehgGtFDtUR@}pA({A_GhZcyj>i$|9LWn=Sjp7y?3aqVC!fV(f97D{D(B) zdD;vP3bc&joLnvqy*i}q?;mZ@kVOOqgTumnppQXOh3^F>17;F&@7_BpI>*{@cK8T# zVS6a4s4}XK5R{2>^x~Ro4`g!>XKvzGv1(JXcXq4#xZsF-y5_-1$9YB+i3blJI5J*^Af1#nMDo3|4Q{MA^CUlA zy8d_*t8$H{>87`>S2ND?@;-@vo~S-5?cObZoTt>FU=o36XKMQPc1*V3)vH$lU-TWS zyjD++6HYwOzy5hdq9bW0;X&tk%v@`jLddZHmQjDMj2u>0NF^lsO@C|o&J%1V{=Y*%R9oS7y&_C;W=|P6$ixzSfpToVgGS%e%{U1br6;ZfOe5h&&+_^NAKx3 zTLQut78a0u;>V7K!dE*ONlV;+-~gn?FVH+ECrMOwCX-Zxv51uHAt519sxMaD6M{ol zV%YSorLnQGzJ3f~JRlrx41NHb9f@EE(3BXG?uPc<+t+u8<*0&bBYKbZ$MUkwOkS}7 zT|K=X2yv{etdAZ(1m! z`Ob~&Sz4xlqvj_B?;&Xxj+gUEdIi`AEZ(8}M=t+wI>NW+go=MRDk0_<6i~BCy#j1U ztL2s6721}fxO48*Djo@Spd57{l^5btPtHRU9)yVeYi4E%ut>hd*pN907^Mjm0Iumg zfK@=i#^Iv^P^`bayNy^p3U#G<_yX)Ua1SiK6f89)5Cyx?gK>z{lQ7M|C3Ld&we_nH zQ(IfqL*L=6cusmcy6e}kqi&)@`~(s4f({W7j?Rb0$48OlE*Khgx%6#a`=b?%$~+k9 z>4mL3v!Es^D%PW+=L^f8Iiqi2P;j6*!ihW|L4kJoOt0XKs%j2MBjD6Xe~EBuq9MPk zlG1orPJ--yl5ptdCBgm`OYr8+8<nni?#FO$nANO_}XoT6xLYvbkP1BNkWKDdAX zeu(r(jzpZ_Ep}J&7Smxk6;Me>7v0JIYDu!e-I@D*@TVMs(WMr@Mq-Wgzi-n;vLgw{ zlWUZfl|PnwrsmVlcLBX65w#8uf~DgCmK5xW9Z?aH=Y@rw z0cqR1=xAsJVSd0>eOXeHm)xN<*ZNFopQ5p`vFUbK7Z<+6hw)B@FJ4Idu1Un%!(4(g zwwr}TAC@S^QuFT#k zrHlffnNvR6_aXJO7lyX z=n?t*XjBx#?%i=zH_G7(AG&Tn(GkoQzn4OGB|78VeLmDzpw|8x zS0uC2!7qDbpGg?j!yYad?#W!2=-dZ57{qm#;6Qc}Xi!~~?+ zFV7F3`a-b-$pxN>j55}|J?P%*`UZl`mUwm2Fi#YM7az`l&B@>oYS+6r{I~p7u#oH5;bDmK zepA{q9ctVJD#%7EsXSbD-LReWTz;sR8*I=zl|tZ>K}&spFA-Et0wgX=5GK)Yin!R9k4;$kL8k8f&ny;xItn-kUrGa zWgyUUbI~!f6B922mi+qO{N3}A3mMNQnGGjmyMLH%dh1ej;KT_Jc%qQPAu317a|DD# zRfP}}2jB`(p`l?Mu^JGLMuUU|3Lw=dh&2Zf1{vRnr4Ne_=ssfVQ43`n17XvM#ii6Z z#;BPAKNk73XD$1S^Jb#{l!3qN3B+&_5tGzht*HMf2N{Puwf^e@3~fC-;Lo5~5^G69 zqzdJZ9cBd=PM$moB>`QjPM`z86tV8>yAE9g;I_>sw~6@ACJbaHV)4=1U~&U!!ho(- z`2m9$1_iuh2L}gP*?{;9n@TVL$)ID9EHRSQW}6@OZ`TMgW-jkjBi~k4JM07=JRIUw z(vSHQ@52$AFXjHuiP=HfeF4}eP0}{)&{i|aOIEPr*?9fB!Ui?Ju!FA1izDYvNP&3{ zA05yFfsnW{j~u^n0qfxN|Mp*TY^$0c2)cQegDy6Xe%z5pN|P#aO>NSM zk(k=X5Zl3E)A7VhERoE{n2Sy5f+&w`8iS1FkW@mzbS8h=yI@*@Eo!-1^qoCB2Bpur z+xzKG`y{&C6J)$;#^p9CerlxO$G(z6N8BAn$>l1~L9`5Y(BH3Ad0eW}l2T?MWMp1X zR(bf`VzTVSe#OO6id2*9mNzbjQ7BqW(C$cL-IY|hCDB!OK929@W{sy#UR()IX%5b0 z+z$j<*h4QT5$|VzjuE^QB51Hl&3peUE0bjbx0;lY#DymmS=Q*Yl=vZ_c25 z8BdjDxE>b>`vOK z%*YKZA}N+ywq4tz!2aaae?^%e&$abahStOdRh9ti{|BP(lnI6cNo?cq;#y4>{Xu~% z^Ws_Npds@rxZrxck7;k=yBq_hsa z?BCGiz0=3BglVQjGy6oJqS9n+Lk{mRf9c)q!7UPrS?6Yv}b3wnv<#n*%fO4?OH)~_Ku3_F#;m_=18_}`~oz`vRv z9>-`GNrod0o}@sZp5^ zByq@!wIypWuNAC?!E=i|_n)6Vdc#=&S44$`US1i~1}=K>?;?cH+nbDk4Z>g|iZrh1 zvvO?TKELy%=~IYgKqgSi6Z`ecc}`R860vB3uInz*!T!(l)<{K1L>z$>JlfoB&&F_0 z?=%DF4|;|15kOoF>anA9eZ}HH`h%H8#r_qe48Xu_>>P&=+rk~V&2rSq(eb$Z^uE$| zJRA13;NlxH=&jL=QdeiHySlod9zxTyYBI(uN^)>icX!{X5i+g}0Ao+`nag<@#wIOg z)y@S!5F{?)#Fd-I_u+touUEf$bBzYr_I1!)g zW-tX9abKjYP?wlX2jquCCkBKXtIVjv#^CNn}Yj;BV0q(|hkk9O>){K44 zWo9$*ap+p^zeidjhGBZseXR2^DdtGlFh&B@INejloa&K!hvoj=@`ELF2+qZ9l^Pt#h#;0awDJ7|q7;y~Kj23qi ztxt*{=ZeD5?o?c*3>tS!i&`M@T+VWuBbh*E@M8{dVhAfVN$6Xc9jF|xk0~oF1MBh` zu44=&I{rPA0da|wgM-hoI2URO_I|Q6yAMy@vkC7=ntT`?&3IMx`0-=tHVp~V70@uy zwh^#&Ax|nNFmlw?-X7)MSdMAa^qSSI08Hii_(-vHVC-Y{K;>jH5O6sAskMbK)WcgN zF_Vki!z^3-S;O{2EILPlG9Z{I<%_H)x6g8WjFAuYvm%dKtKks98_z`9#V3*#)#}=^ zXO9NZiBqrx9UVDx1gh5z%T+NRWUOD{Iej(qJ8C63eyA&E6s0 zFy&|rjW46$0yedivvW_E&8OU=qRxi3_UaloUkQg#ufYjG{NqntvBDhDxpU`8<1OqY zJ94UQ{sQg?snC0*h27OhL!%A&#d~pP*e3C5Xbc{|m?x#aT8n${aunVa9u!y_#M0uB z_0=igLp+NRC&!9>Sq|LGrxH}4x`7Gt6<_#X^-D&_-ieGb++==xxR-F z_rPe9lq`c!#mK~z|00ft_(UBRNIT@qC+gguZ|;^!*LHT!Aq{`WDY$1u$pmMrzf>}e z{`^7}mf*JCqBcVLkL% z;pbp#C+4uB7Cv*TIBUHOGs3*#zOkhx44yvF z={mDt^Yd)NW=arZa3QQWY4+%iB%Q#Vo@ewd*9FwZACNT=yp-(NCqVzgo+H`GKxy_lt^{d^mJ4fLsew2?Gk=Q75F$-xZWfmyEs|%n{p6s9foH)z#0T>p*_MJEEbPAL56FifZ2fxlY=y_xV|#XlU>b@FOvYgWdlG)wxc#BG=JHE$K`8@TZdotIsHRv-N#opmSc&$)D#*5MuUYm$rS zRu4>Lhz{-B>H;GVA0Hn-|F`(KyLcUD=GwBcuU}oDuUZv7cypgGF{|zxefsUJ+JhQY zyXm+!75LP+v!84-EzHYHUwg!bC#`F?vc}WgylZ8)gZ*_+m{n4bzTGD%>XjIa!F;`r zDEXtgMD=J|{ggx@VrEqFlIHCZr!CbK&pQGNSSw9!Yz)f}Tq7i@U%IAX$r+_(NF%<{ z7%}&MnDo&WUutiD4pa!)#FG-OrfsXH`XWO+q(-@mSXNX7`54i@li%>75fo^=T99$^ zPLzbd=i^j&1!00|{5SFv#S+4JyHS;H8iU-YXtJ=^|AH!KOYHM0=!cf$_>T3xsrWBX zJAmfYsj3-a3M-S-=Y#&-e!{Q&O~nlPA?@SjL88N(csQBTqO^&6h2)pEtS`+^`C_aD zx7QN&PduaDZkiUQo2af&Y1*+Pm~}r zbs4PF{aD79UX0?G7}{A`>Gy2I{6v54O_3yZo{a|F%01=Yp11)r1ONtp=n0SCBUtU~ zckeEgIGF;#c)fVG8DDgq{cF#Izq@MEH@Q*-!U2p8lN|}m3Ql_4-m;{SZB(&_LAii% z*wuV+dO*Vh!r?Cu=kVRU-l?M?mXvkrMgeQb{%4(58~Yx~(hf$4WEQf#(YiSmB*Q4% zn`$L{%Pm`o$CPo6_S34(ji|MQrxnCBvYF@gLv5dlw+2!V@X@zkW9?dE%?h`hyfU%R zRWl}dEwSrST4{Kbwt}HJ|Fh1{M`_Cl2~E>0saY%m-5a7mt5p9Sph>%~vYNE>=x^@q zfc#DhJ8s4oD5>yZe|F^G$?aIMy0Yufng^2So$AMEfD79Ae;`(eeXi4xd5`e$)C~+g zqRIbHi4`X|Fl>*(?{c`^ z$ojAGn)8KL(Xbi$_%J8R%f;0VZ3d$8t{}KwP0h_1fJ82HYS9%Sr@Fr#TZpicZMfojlhoO>{m4&l46ewhvc(t!s73Jr*0}dOP_|Jc% ze?7*TFO<1SmOHbeGk^7l_j$}yqVHgRC(mOD1TxyIR}#=Nki$4ta^^Nmnb+doIQC=5 z7TVJ_X4^%Xc;3?e4Q4_zRXc+D-DIxc;_L7?P}l@3jRQSZP|yLY2BeHb0i=^bz>JuD z+I8eo^-V_JI_lTQV3}cxhBPKWRW!!*cTow*zsd5>B%P@)8zMW-x*(BL|Xe~RPlNQtY^z0_}gq^M+4kStr* zVl~Wqb%(aR*!)XZ8u1K8S>Kj1mG<-U=BO8}e_cLBy;7RdXsdpS#%RcrDyI>Rc%pj$ ztaSNqGOd=vidmE@OU{+_EZXWFX@s?7H~&>5tT()fA|tfCyI?+4${72^Uq@Hdp{pst zP;ao}9nn3Ml`QAB5bKl*1Q~(_6^URHEJ81?Yth$An|Zz4@uu_41DVlk0Zl5IFS4!K z8I)yrIPb;I7zjL^AP_#?(3MJQKlP1E)i0V+<$-$`D_PcUp`rE=w}0ov&l0a^WF^Ko zHm~>WIN5P#*Hj@b3lsw>iXw9@%JVryqT=4`b$etf^86{Diq-|F?cM-kX4IeHsU6)i z+fJi0L!D1+BVbz}aIpa>ovDNE4@BmAaLdE}`xtzgax6_atw{>7ghk zu8E73L&X$H+ba(RBy$9a5-gZjn^Re6-G6PAA8uwS6lUYuMAvSlxZ!Bv+pe6WFEx~t z)Cse4Y8BtFTZN8HyZ;W*JND-7jvd2e#@8ixRNhe7(9Xu*|LdAcD(!DY?uJTAG1vC6 zL>10!EPpgCZ$^e{9IL=NzMcP*YUTgry)2x^QF87W@_#R7R6D9kU7Vr5+t_B*DY>;X?Jl&@1^QU4M&=d{$~nn_XRmq;P$T01<08HqEePnVRI(i4m9 zKTdxA%0NeV_ujoT|HqM!dVV?hWBKE48OoS!cg@1}a|A4Qgxhih2ux8{wKl0~TJ6zqVom;cRg@pgk3 z^XSACAwfZ~=uP6Ls6LpZ0%ihl#d!g6lHr(G9H+w62AgMc;~!DEhL`JlcT(zn1@B3r z2Mxe-H8nTzqI8uiIP=62AkRT(w}y!;UV#fk>dldn>C9 zvm&Sws&IC|PxbWlI*h19D5A*{37C;|DY$;=CM%u^RUShL&=N4v0{<+-p$MW&Dwy!# z;GhjL>zjJw$v+Vt$H*}3EDk<&n2(Rg>(=T`XCU=O<}@?zv_pTsqru2vI<9tV@jcHz zlRrO0CM-FVR8JY}|HP%y!D9cJr`k*TPn4^jBvKf=YnhS*KLF&va{O|}t_} z)lpM(z zkafT%LFdN0B?hkjdH;*i0ei)fweUt^`NI1>ud7=t7>bi878YqU5;z+`vNZwHFqaPU zj5B|Af}xR-8YU(j;{KSR5DftQVe{JRd>262JXE?r%83o)H zgjM$RX<8yy0s77O9baFnU$JML0coBbUDF;VK zO#e25hNVy3a{X88g;T7Qum*&GrBrGn5H|cK{l5SRPk2l)(dp^whkwBG37{Fam)Oa~ z^zHk1oVR>lcN??qWj?Dfp@eyOXg%R)_j;?h@1MG`gE8wama<~wphWCOA1?gjXGOPQ zpZ_}U&_*(8S)xTerjbcKQ1rjq|Ka|)eIH#&z|=vR!hc0kTKr$`7H&^CvEi@E^8cYH e^?z9^7kz1t{1|+l9WO^(mb0f-WS?$%cAzf{fC40ON!zRz<%*L{V%1CzNioGUOd(Pze zYu(~uzqRvG27kVKeM?G9!#oD=~-*4 zVw{4<($8-x@^P|p=XrT~MMR26dbhn}rWLutC8MZlSmK^TYx3>G9YMPSLzM zH+_XVRlR32Ub{}|tp1v6@60aWSQ%?hZtuKW9eU2|SJtvw`O;u;g73;FXIV$b*%FUA z*(V-&>mNt2P*75?E)9icez78Sgz3uOkdcBY`AIq$boLTl2TBuNswv2_Qv=xoj5ry_0}b%q;! z77b5YIy6jYuo5%}&c1RQZ3sUquVS%J$npEJ1ngx>&ug)_Z{7MeJ&?^I ztD&J`Y;24t8*fb&ar?pJf7Wx}a`8vsxpU_dJW1*G^;ZhggBf^d7Z*2wex$i?eOW=_ z;7Ow!j~{DZTOMzEcJcOhD!zTYj~_p7+mrvscinTChMmxRVUoZ#T_1D${(eD$4foma zpAJih&X2bqJ9<=#;$dv;%GdW>*(ySqPDdTr_r%Vvt*zn4q6!NS1s4|=XB(DpkYB9u zMCo=7uF&yPe|0GA{I4Hl_KBK@htIFix8B&YwT(FP zInM3dhiyA{+~d_POq16yvg^aIjw#05=zYvk&-`uc))NLLW22**gGF~}4vLQb`0=vL z)y?hv^{*GqXpRtc#mRS$Pv_OiKe@5=f$~IKw&CV@YJxzi;2~b#Dg5Qzw{I>J9aEjz z2`e@C%<7^_XN$ATRx&Co5JZ)YtIN+V!u=&NQ(Zka- z_T`b|$L-qElz;vD_3`o)Dy>kjJdFT2xF zgpZHw_mp}SF^k~-jvJIL)f^6co|@X3p)RLiTUj~0vA#-L!yQO=Jcy3&dS!g^bTKO} ztb1Pw&#u=QzPTw5yBLtY<7AIGE&_fBy32OWEp= z;^)twhl#CRUN4z$&+L3R;DQ3EsMO5TnyKZ^4mo(P=ly%O^XJQ#IXWq8zD6{rvLx@WlbYO;l0U#L)~I zv86wc9<4GuxqIJ96k1|_0ll_29vAn&LdwiW0WqF15H+oNFc=(d=%l2ipULpVoO;}jCDnB_Z+24`JJ zYIp#=cw;2aK4Z~BEjU*9bp4+|C8^OZT**nSqCrV*O|OXjMdlHAySAt?7e)NmenL=C z@bKY}&a&)}ZZ1Dm%E%pY6b4#(%B8ozcA3!7(b187tWy1DixO`D%Y}uwb6&3PnkME) z=!AYv^)BL&MLCU}-Qt|w@dy88=`aR5x&uOv6`h@(OL}U_ zH*Vap?JeBNHaIx=;p4|_{bB((Gytd3{t}NoxyQ$=!nvzMSu*ubldD8NE~QK$bj%Ac zKw)oG1pa}y(o1|F8R_Zm&7^t2n^aNt^w^c?Km9Mu z$OHxiShl9fqclxSlK$!x(`Bo6T3TAgu2Zg4J?evlmC_QQ8XA6d=ULd;*q}V-W@n{B z4|HQ)A3S&vCuna6JgEv{k_b>uRlxGd_>@$qDJNf%PGUtTsg30BEwqh`j*fovL=>=z zvx+nG?)3;zvB0j+^UG@o(%L<07L{s`?l(@UIWm=xReG;}30hH7W4k0F@c}&}?10cA z|E^Lmw`+!FR8&+`*xzeAo_YE#eY@wgGOv949&HkCv@+qoxfJd$+o05HB(9NA8-_Z| zqhvgu)<~~k>gkfI@btK0nW)3yCH{-gQ&NuWzjdA&tOVwIPM0pq>Xj^A<_Jo{S|ueW zetm4{o0FFphu(?)P8uCuTh9Z-aI_RLpOp`HC`m$hV@_L?E%tlupgHL5 z?5wt5X;8(=D@1qZ*RL|H$@=Od4U6zR`ZreZl5zwd0NpFXHE}!5!8J6C$G?6=@#-f1 z^^>BQV6fH)oJ<>->MQO%yB=p>=CM5d`2I0bwZOnY_LPJc4Hdnis{4&kgsz%zCk$6e zG9(K3y>-b{cq&YqurFVC?anm=NDozqC5X7aT-mcR7<|HYqT>YskmUYiz-RI4N}?j$ zC6u+H@AB~L*RQ*}v|NrvsAp=V+qY+GP8W0ukUYDZNIp=v5wd44639|DKqW9iz5OqgHIfy@msp>SwO_OFb`Gt_4N%@ zG*riD^YZbjP&h39&>!+(JnZG=wV=;d;kUVJI5dx)yLb04gP&c{?T?$Ax{EW_thjPd zy=;(mb5bSRhPRK;=lZRQqQD#%wByE4pOg&;iro}_0-}wU@Ivt zy?;uwbTg;op;Aafa!gFjmMvRQ1m1HapW8W~J$okNI?2Jo;XavDjVIMbRiI7h)eKfy z@4{6fsZD|Ot(b>Q>xo!SI*K?c_ z9-tNtXV1z__m@g)AAV-jlb>!_?%OD~Y6A|}rn(K!huWM3vB}P!MoGUUpS!J&^JC3! z)BRL5$rHgr1PduZb9P#}55lzj`!OmCpUc-@^=AUER)07Vn(Z#Fm zQe!4}>^W9Z($fP~7V6@iL1Aw$g16pp*s8XjRkSdKv^BD-6djgZ?5NyA571#|&l4T3 zFs9v>zrCXaNAp!@3TGD->^%G1WiV0@|KP^F>)$@?E!W`kzpSX(`1v#MXkmR;DufG) zIzB%BYE{Um+FCvZ!&gS)0F(C3h4QsoxrGgR3yaZ%=RAMku|x5x@Irs77odkU-_+EE zU4*}4+klf^}N9wdBz+7enmwE zTEE}=LT6RrenGqX#zxKZeWE560YIFkC3hN{Fz`kWF|mz4w*h*Iv%2S9A5syqAHlo1^D9mm$(9+0fxUpbXe5uw{4;^o@MNh1i%F zCI$xAn5_9Zh?c6L8ds($E&P=$);*UxZrrmsyX13hgv z)|Nri`NS5T@LEODnTkIYMRPpn%omjwC0&w~jO=&>y7314MtYTbdk4+NuU>nI z-tk>8Mq3rnpK}ZE8|t^G{7p zUGljQo*TwO*bgO`q1s+;%6VKwq_?5rWlihH+`K%r^w{w5t9m6ALmhW$As!c@MaMiD zcy*kYXNNTneHOsRNf(t_Mctc<>j;K06ehpYX-%QpS31d|;~pEJ%Lt;5=(>gx`D ztSw*Y(8Wqo?cB-4XByxz7(~x)_vN*5iM|>?_}{hGloy8OWxnexCrW;PK)VAk_=2Z! zIg&S9J$021L^Pju#lx-ap)D96`ma7_g7?h+!{Pg+r z=eoMg`P;I*W;p6VS3#C(IJRF|T$Q<$sP?d-#VbowE#ng4r1Dl9 zn@(zCvHA9)us8wR!J7vho0{iCcQIc(<4RajuRNvA)9~q2dj8C}py)H#RKS%` zgz|zrZ?xl{{yMa2b0u>PB4|fettp?Ol;eGVY2(=Ytxp(|iY4!A%P1&N@7$?85G(4D zyRv&$QEd4+dJ}vRrD`Xc%a_M`3amja+V2HK_n-s8qW}+u{I_@#{q$)cR`~Skebv_; zoSi3|lcinmi|%-LwC4Pr>e1kQ*|>WWLpESxf=1XTMCy3kWh9^QpQ&TTEWEB)bQ&UHW z>mCE$eSCaC`(5Wo4+^83-jpefH>YpMA7@#9$^6x8(gCusHr%{R%79tx9 z*?#AMxspdgeF}m8cp6GdN^aZtr!5+?^xn*(4qm=|sjaPDCH@wVOZE+!ZE{{Dsc;QN z^8n;X(LCrQBh{wYplXCP4>B`6b8SF1T+)0@An>WAp)pefZ_Ijt8vTf<2l~3V!g^q zsByABg#AeFDAzWpcCyXR&9%0)z!~E3zYe#_#U-*!io*C~WX51Lk2xKyd1ZUM3vLjM z0bOCDzqD954pa$y1G$&f-~HC;{VmYtxt!{Q`_EV^$;t*f*kVy~a&mCqnc+*pFATPS zna>n*_4W7RVHW6T_f1Zo59T7V^kjnz^tW9uQ=_Iu@NvYut_-Zp39VOOVVZ&S$;rql zA3Lu1`Z`zu`qROK2T5k;lFHO9!bkjT>grDGH=QuZy><2?PDgNJ8r!fOJGw@XDkz2yL1#*82XD&AmO2(s|TGmU`63OT9NOOGDh*C4A=f(P#i!hUNXu%`@oF z%Bip=+;G!X-EU#9fTM7m*IAe+Go&u$u~>IxErWUBylo1Ji5Wbdg|(p&FWL>Y4u8a; z$nI&38QHKRi+~elOM@T)#@_kwU@x8r%O-Pq*k$~E?r{>tklouqqN7C)uy(38JAAD* zwYN7kwJaKJq~P>bl)ARr2SXvwuOc9ZsVbCZVtU$8%1QYJ&c+lpr-PGI+*t<`Jv}{0 zsoE!oVZ*H}r7SSEQW*KrsuQB4U!%fUeV5ocImsq4fNKgn5m?8(`!1>mdMp(F2Rw|w zI&2aa8~xx>o2RY>@rn@aC-kPb^!yDgRqm}~!m%#J<7tS}W574nOU1p9*z z`zz5^HvI5Q-94`*_99`5!vtt~@$T+)-J+Ml!E#tbA8+saR4=wm*RNl9cAlp>zxF5b z<`V1vY&APOJ1Hrt;iz*+20(B#i_XzMf)^MUmswWkHXXlB_ZDBbyL6sdXlN)-hCz-= zCD=jZQ;}2!n~toQ@r%nUs;ZznylwBS60t8Se0+T1RP&H;`^sN+zB2xZQdafRySfL2 zY_CMV{eS_51F4NuQBg6Fx4=cs>epm9namAGtwVr|ii!%m{m?6w=TbE`{svHGK4bZ( ze>8dk{DV8Ra#1`nLQW|&y2VX&!m$OrXvqD03C`EzRIi1-Ju5^HT&{B95B51MEDW}> z@pAb_inyn6FX-P0M0$+a5u>%Gne_DZsuO2$uJzVea)ICA9`N)hr>6QKsNu4c#eO^t zC8qLWQHzEHl#_RwTTW}7`SzhPq?|dYFM+mqKKiJ?4ymoNq zmmIZ}CrVzK)iFpaqoDp^X70g;!M^1PA|EX*3}=vvmeyILcZ62^S{`5k0-jRO1)XA7 z+lNF)CnxEUeb1;H9EYl?3OvY;9=M*c^VoyfSQ2U;L=>wB{R~6k1P{*@eG4O_#FYmw z`(!rQ^M^ytSu%W20^|Ka*wBv5%*V3)U`O>9 zHKO$9oKOtGJm7|cej96se(UXxjng2A3=-Zy-|qm4LhvKxG;#$@_A!t4 z-UA1`Q48S9f|gAeSfmsvnt^`kQEgq#w?s8Mnr(vK8(D%rV0&JCHE=oC*Sp2iups0U zS?U8#nRbNq{jYWoy4~{X>Io2kdrZRNyK{WM|vEuyPR!1EBj;(b7#qIIDht0FLzN(W56%vW~~c#Eg%Q zcIKMZ!9rqXO+bygdwEUw6mW})`C_3YnT_o2v&%Sg)y&P!FI;#BlWw5I!^vg)+|^tt z=ra)VCrP_*SP`4MludurP)gscUKh;+p86f1S$%&$BE6sW zryHN3mp3Jf!@*U}u0alV6dG@do3Oo?x zGpG71{V40v_#I^=DHd?tIl4N7cq;>N>tf? zG2I7&0DOw$TCXmYUV0Q6sm|Ld4X|=^bW~BaUt28SWI^ZzxZuu@5Z?Xv_U(%Z6=upl zfIZ=qc4|GuxkV7^1y>km^2_%|?*H*5k~4}1Vx!Z`QnbXS^Bgp^#eJOP9dm1UX|r>u zMJ&@CTu=yY`O%T}c6n~J_{|%p>bjQ(z_%>*%qY)~-j0rZiWg3Vc5M;L%DuHRCOWMA zy*8$O^6^4WsO<9i`TL^?BZ2xV3-E21L{&z^t)3+<)zU-F0 z5J?RwTxoS(;QFHW{i1S3znLYg-1r?8m6yJY#7DmMb1kZq|A}5ZAy3*k@7%d_qICYz zK|si~=o$|JK_yQ^t*e{Mm6*yP^| z@~uZnA;yL<26iK&3{T=fR!6gQrw3fSPvOT{Jt|YS?I92jK-sDOQeEW;L=0$4aGg6_M2!FV z_vZ6%VLaf%wj)Q63fOctIoIMPII=IwTpb+V_-&T`6&;Z13WDIsf&>6mB?4+{E~oPr zs{fZ;qoAgS55*|4Hs7j9iU4eGbseA@z@2!s@{b`T-%k1s+lwRi%3ef^IgJ{&r92=AMmlmSMwcv8*)Oz@k1c9T%NHaLO3U;}Mh&(%D||ZBO8xo3p2&`#WELF} zJ{@ZsC84*g@*VoO*|{CPk0dy9I5;tL#t1M!yMI;LUqIJPyGQhBj}5(&ukboc$F)56 zljrytN~)B-TXi^Mw(BI`Ojcs%Es_`GWu@XRqB^PASzh|q&YOz!kr0oscTj>`j!ihv z+865J>2i;tB+GBT);br6H)0cK;?Zm8`F-YEEPvx88Rk{y;d`{#V}6EbG1(cIr5%lrJ|e~?q<+8XPiZ0iTV zmL{?P{PO>MIK9_EM@Q!k4nnTIY9pe!x2fv9j3`@CyVK>kLv2xiwUWQENkzUOBaa1qdF^|+ zVvwTY8^>W7B=tPeQBkg7JRFa8Ujd z*X7PsZ;_p}?0nhBXz2Z{EFKv*63GyI4|n%9SgOO?GTz>6h-ZQnHvv3~K!qL^7%M+| zi>Bc$!LEWMt^NM4=52@;3k!?Y%9`wg5W zA~PIOq|qv*A!TN%A3H5u`#iF1&)&VWpj4UJ;2LfqpGYCtDj@0bpSn&v$+9&8#0d5o zR7PX$&YX~#WBWkk>p!W-y)Wqf;^qRUvOO5qj5$XufY7->jaJ(ov|Y*^cr zwO#1ghg)SQ#|Fwb(HZX0qJe3?)Efu80uS}4#URHzEY~}@QE^F1N?1r}CmT$w`S&|m+v+zWJBtQ< zMeM$ug}aT%Lvzqqj(~w;1zHGiO(FmT0O@(_2)`gDf6dK>4@k(V%ThF_Dzd`-itS35 zZSo~1w)hfxx>DmYPz6?ARbBl!FTH2{HuH(h(4^=X z^z*Cuj90ZPof$rfOrAmg!SatP#)I8E{8fK263E>j^7;^W2tIvbLH^2>0|*MRs@G;j zPo2tv)+1RX(LrlZeg3@dduY@*q%_D=|H@Bb{*4X~pYvXN1rI1?j*fw0WMm}%ykGwz z-h4G;zSL^uE!kD_9$57jPQji@PD+BHvUX<8d|FkPk<7uFpkX3SRw((`P{Z-?iZKWT z**1!9h-LkoPYC(0ErHRJ1FZaOtyn_1lGcc<%${>Bmzr4vC?}4EN$$T0?6U-q0 zd-qmXR^TPjvOHyoCp9ZckiC;D_+E%V{GFsR4=3=sD694;XqxT+|xV|lfMRQ;tWoo z7RDF^oCz$0>WCC7j6C1AP{4flOJ856g&)^onBUqE2oN=^*a3R_0!UWlk9RApsy5cA z{TLj3)}M+H31Gm<8?DU<}UBJ1_7&VM63oa{b$_m6f&S zIn2~>IX#U1iR(Ql5+QUO8yf5|MF6*xG<8&h0%>MfR~Jl?*7xtlOO4X|S=%7tV2jt- zXS`A(o{_*=HUkcst*TjCj=^e<_xd3;wAoapDE^{ZS-YLX18Y7uX6fd(i0DSjF=97d z5J5Y=f=RiBmX7XF2q7K^cr^^AOQ@&}6vT7%_`9#R3Z(B6s%Juj8j= zGn@=c+?&_5U9U#)_eIGO#Aj9}mjCTD*BnV~S8iFv+L&SOeLx}4CMGBP8&)^+)+>3rHNO4?eLL8i)4 zVrmQ;frri0#njoN#9lI_tPO+}qAisF{6I;XfY`vp%Y2yDEz>E>g*L>^~kruSfD zx|$miT&APzBKe^>^jBXLx0$NQOOcf+ReF;;7Ns@c+2l3pueb?N{oxX>h{(vu$B!+% z?P}q7efaPpWZKiq%a0t-+T?wR<~gZ8@-DDNN<%F?-JfclF0zG^i>!~cKF9KNZ$9O~ z2}xqv=f`5K%)3+cOZ zhN){P@`o$Bsi$z)T>TFd#nog_q(!JFWvxg|Hu(ebJv}@y1Y?YWuc|Mf}Vff4@Rdd5!37t{@VL0RB#tUZn8-F55Wyq@ zog_j!_0;pgZB#$nTjra)>1h!UtGKrvzON~3=#wE~^JZ(1$$)9|QR8v@-0OuOXI-cJ zF_rn(iJ(wMWHNZ#(#lj)_h0H{#S*|0rRn{(g3rRpQZ+bH#Z#P^wb!hGx`MiHKc8vM ziSji^0DX&jQ(H|?VTkPbw#Z!Bh<0IG5uV1%N_GJOS2S8^mUtm2^BJZy{JBZI$^W^A zXi>7>k^I8M#6OV%S5^}9nGh6)9OkaQL=0-OA!gLUE{a8_wr9`7M~`w5xS>fDS$7^s z(vL=hQMNqi39buyku91D8ML}TZs2-P&h|c|$FPC9@S_JJxrZ(W#~3d}Licv#^sxEA z#+VEUkS{sz|7*BLlfmUZiQ6oWBeUP3Fj;TDy~paA>oI+QH`Ns@+k%rCwJlWQOwK*2 zToplXFV0BTW~?7Jn#p6Ko)t`2EsU{Rc-`q~#-D2Pb^EkYpp8>D_q{G< z1L2k11}<-ZNC@b1`b@nhm+IRes7}?$f~UC}hfQ|Knu+eQ7{8miTVUayLFbq%wp)Xu zD1xNx>FJ58Ey&jJ@wY9=?uh!g7_4^WTpT#)HJO7PPWLT6$Nst9^w<wl($4=b*0r6B z$f#D!rK~ZbTza@JGGUt_h;nBS0x#eAiL4#CS5; z77n#a5Y@Xh4%y3>Yru`I(rmf7h~PG4ely>W<%<$YH2S?~_FI%n9gcOsb$01d|0PUh z(My81%E-%~g9AvLgeVmAx&1iqfVjE2xw->4_V5S&m!g8}|M)HPZVba=J)6Iku5q9v&i^(JMYfc*3&{l z%iliUL;pj+8Xq60Vm?E5F&yp&1Oy<=>{RMiQKYmtxRa6+PDUH%G4Ie~nEe1OWUv{mPaa~e!L271kjVDrUjxJ!IrrL9{<~!_PaTze zbJ=d{Z#m!IiNg8lZelhI`RXq( z6Z8GJ%JybCrq;JEB*@CKxhASrP54FGQPdh)`%NqaLuPHLX;9>BW&awMj8FO-zBGQr z^zRKDk_&@eQIc@?SNf}Y9q}Y^*D031nxO{`=B(zKAZDw5i z&UzZE_H##7gcQkC8=Bws?U=^!rD@f1VoKBtMhg+bJHGi@PP2nC$!DoFG(^mDuTM4^ z*ZYo&{@p zw+s%hZEXkS*W;}-PQAVQJ~{RChik`O_sNtUO!?RA(0M(2TS1fe`(u^3JFRw;X$Rz= z%HCr7$FJ(p6qm=iF@eza+kYbk{(s9_wGL&0aahyPQ0UC9B=E0$m6nLF{>T+Q6K2}I z=@$kQ&j$enVhi0u8IC>w7-b9UO|gw+b4$M2a}pQ$A4AJ`Xc3lT#x@j#xw5i*C3tl5 z$1oU1MM(*8>_Y_GCW&!E`1FSlA4W%Q=i}hu6So7CH$i*o;500=)isYt=HA-SVw_pj>xvZ>RT1Tk3z7^}eRkj+~E{ zH4oSjYhjKFBL=5V>%y8y*qBenY;(%<=MjFKYKQ;Xs@|-`c$0hhlEIZLSG2UEi;KNL zYtL^i4ehm9o%Y-81>3rDgTT)g<@8_Pb3CDU22uz*c<+Ep`QVd>50yo?$7=85_y3<= zZ{xe;;p&NI|D)PpoG;o+AZStj|D)O~JWcMsH{zJ#&%gW6Q|WM9BDZd_O%tg4pw+6N z&Hm3SW@aTWU|63(V75@tx%l~ZN5rld^#5##x<=CnM(upR(%M>*{ zcWfswu9jcm`^SJ*7N5%^9ik)lRI+w@DSXJprp0cfz5-MLBNQO$3FiY? zBB>132q?NT%5=)40;(8;)tDS^CXYMN(fu_AR%+RN$Ynb~2iN2X%7s0E)BpsEJemCG zpGJ_z>NfFHiT^&8nd1XLU!nvCJTSC?p=R(A^00GJzvl$ZDlgcg@}tY-$&shR1)d95 zZ17X6@!fz9EG(Np1_*>NJ{5Lp`?wAy!u0N$Lx&`u#z#aPak0o^{<|Dm=-WIemGCV( zX=!P)e8L!q29OVS54fP z0H1~*QjwS4EU*4;hH6TdqOJ!--N|2W?C#%WKG`etIs3udZ^QmB$e=@h^TM|Q!Q?wG_M@R96 zMNfD4vmzpK3VuJo-lY97zrXQs28p3IPN!rpur<@=sH`Wr9`1d1P5oDJ~{{4n4fpGc% z`LB_V-2n7Q+5J{~=Wjp?-4$!`7a-x21a1cN{I`up|F7|6xt^WgbiL Date: Thu, 15 Jan 2009 03:24:04 +0000 Subject: [PATCH 2/4] another tweak to the error message svn: r13139 --- collects/scheme/help.ss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/collects/scheme/help.ss b/collects/scheme/help.ss index a890451d4d..60154ee771 100644 --- a/collects/scheme/help.ss +++ b/collects/scheme/help.ss @@ -36,8 +36,9 @@ [_ (raise-syntax-error #f - (string-append "expects a single identifer, any number of literal" - " strings, or #:search clauses;" + (string-append "expects any number of literal strings, a single" + " identifier, an identifier followed by a #:from clause," + " or a #:search clause;" " try `(help help)' for more information") stx)]))) From 10297fa579183682a62dfa3684a7b9af3c571098 Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Thu, 15 Jan 2009 07:30:08 +0000 Subject: [PATCH 3/4] macro stepper: added "factor common context" option svn: r13143 --- collects/macro-debugger/model/steps.ss | 12 +++-- .../macro-debugger/syntax-browser/widget.ss | 23 ++++++--- collects/macro-debugger/view/frame.ss | 3 ++ collects/macro-debugger/view/interfaces.ss | 3 +- collects/macro-debugger/view/prefs.ss | 5 ++ collects/macro-debugger/view/step-display.ss | 50 +++++++++++++++++-- collects/macro-debugger/view/stepper.ss | 2 + 7 files changed, 81 insertions(+), 17 deletions(-) diff --git a/collects/macro-debugger/model/steps.ss b/collects/macro-debugger/model/steps.ss index 6dd12fd170..a1fe495801 100644 --- a/collects/macro-debugger/model/steps.ss +++ b/collects/macro-debugger/model/steps.ss @@ -40,11 +40,13 @@ ;; context-fill : Context Syntax -> Syntax (define (context-fill ctx stx) - (let loop ([ctx ctx] [stx stx]) - (if (null? ctx) - stx - (let ([frame0 (car ctx)]) - (loop (cdr ctx) (frame0 stx)))))) + (datum->syntax + #f + (let loop ([ctx ctx] [stx stx]) + (if (null? ctx) + stx + (let ([frame0 (car ctx)]) + (loop (cdr ctx) (frame0 stx))))))) (define (state-term s) (context-fill (state-ctx s) (state-e s))) diff --git a/collects/macro-debugger/syntax-browser/widget.ss b/collects/macro-debugger/syntax-browser/widget.ss index 6d90770437..07d21b917e 100644 --- a/collects/macro-debugger/syntax-browser/widget.ss +++ b/collects/macro-debugger/syntax-browser/widget.ss @@ -111,7 +111,8 @@ #:shift-table [shift-table #f] #:definites [definites null] #:hi-colors [hi-colors null] - #:hi-stxss [hi-stxss null]) + #:hi-stxss [hi-stxss null] + #:substitutions [substitutions null]) (define (get-binders id) (define binder (module-identifier-mapping-get alpha-table id (lambda () #f))) @@ -120,11 +121,21 @@ (list binder))) (let ([display (internal-add-syntax stx)] [definite-table (make-hasheq)]) - (for-each (lambda (hi-stxs hi-color) - (send: display display<%> - highlight-syntaxes hi-stxs hi-color)) - hi-stxss - hi-colors) + (let ([range (send: display display<%> get-range)] + [offset (send: display display<%> get-start-position)]) + (for ([subst substitutions]) + (for ([r (send: range range<%> get-ranges (car subst))]) + (with-unlock -text + (send -text insert (cdr subst) + (+ offset (car r)) + (+ offset (cdr r)) + #f) + (send -text change-style + (code-style -text (send: config config<%> get-syntax-font-size)) + (+ offset (car r)) + (+ offset (cdr r))))))) + (for ([hi-stxs hi-stxss] [hi-color hi-colors]) + (send: display display<%> highlight-syntaxes hi-stxs hi-color)) (for ([definite definites]) (hash-set! definite-table definite #t) (when shift-table diff --git a/collects/macro-debugger/view/frame.ss b/collects/macro-debugger/view/frame.ss index 07221aad5d..d57308e1b4 100644 --- a/collects/macro-debugger/view/frame.ss +++ b/collects/macro-debugger/view/frame.ss @@ -183,6 +183,9 @@ 'always 'over-limit)) (send: widget widget<%> update/preserve-view)))) + (menu-option/notify-box extras-menu + "Factor out common context?" + (get-field split-context? config)) (menu-option/notify-box extras-menu "Highlight redex/contractum" (get-field highlight-foci? config)) diff --git a/collects/macro-debugger/view/interfaces.ss b/collects/macro-debugger/view/interfaces.ss index 7e146436f3..d5d75aad3f 100644 --- a/collects/macro-debugger/view/interfaces.ss +++ b/collects/macro-debugger/view/interfaces.ss @@ -16,7 +16,8 @@ one-by-one? extra-navigation? debug-catch-errors? - force-letrec-transformation?))) + force-letrec-transformation? + split-context?))) (define-interface widget<%> () (get-config diff --git a/collects/macro-debugger/view/prefs.ss b/collects/macro-debugger/view/prefs.ss index 73eb46d71a..5d9f1b9191 100644 --- a/collects/macro-debugger/view/prefs.ss +++ b/collects/macro-debugger/view/prefs.ss @@ -26,6 +26,7 @@ (preferences:set-default 'MacroStepper:ExtraNavigation? #f boolean?) (preferences:set-default 'MacroStepper:DebugCatchErrors? #t boolean?) (preferences:set-default 'MacroStepper:ForceLetrecTransformation? #f boolean?) +(preferences:set-default 'MacroStepper:SplitContext? #f boolean?) (pref:get/set pref:width MacroStepper:Frame:Width) (pref:get/set pref:height MacroStepper:Frame:Height) @@ -42,6 +43,7 @@ (pref:get/set pref:extra-navigation? MacroStepper:ExtraNavigation?) (pref:get/set pref:debug-catch-errors? MacroStepper:DebugCatchErrors?) (pref:get/set pref:force-letrec-transformation? MacroStepper:ForceLetrecTransformation?) +(pref:get/set pref:split-context? MacroStepper:SplitContext?) (define macro-stepper-config-base% (class* syntax-prefs-base% (config<%>) @@ -56,6 +58,7 @@ (notify-methods extra-navigation?) (notify-methods debug-catch-errors?) (notify-methods force-letrec-transformation?) + (notify-methods split-context?) (super-new))) (define macro-stepper-config/prefs% @@ -75,6 +78,7 @@ (connect-to-pref extra-navigation? pref:extra-navigation?) (connect-to-pref debug-catch-errors? pref:debug-catch-errors?) (connect-to-pref force-letrec-transformation? pref:force-letrec-transformation?) + (connect-to-pref split-context? pref:split-context?) (super-new))) (define macro-stepper-config/prefs/readonly% @@ -93,4 +97,5 @@ (connect-to-pref/readonly extra-navigation? pref:extra-navigation?) (connect-to-pref/readonly debug-catch-errors? pref:debug-catch-errors?) (connect-to-pref/readonly force-letrec-transformation? pref:force-letrec-transformation?) + (connect-to-pref/readonly split-context? pref:split-context?) (super-new))) diff --git a/collects/macro-debugger/view/step-display.ss b/collects/macro-debugger/view/step-display.ss index 733e5362de..ad1d941547 100644 --- a/collects/macro-debugger/view/step-display.ss +++ b/collects/macro-debugger/view/step-display.ss @@ -139,13 +139,53 @@ (define/private (separator/small step) (insert-step-separator/small (step-type->string (protostep-type step)))) - + ;; show-step : Step -> void (define/private (show-step step binders shift-table) - (show-state/redex (protostep-s1 step) binders shift-table) - (separator step) - (show-state/contractum (step-s2 step) binders shift-table) - (show-lctx step binders shift-table)) + (let-values ([(common-context state1 state2) + (factor-common-context (protostep-s1 step) + (step-s2 step))]) + (show-state/redex state1 binders shift-table) + (separator step) + (show-state/contractum state2 binders shift-table) + (show-common-context common-context state1 binders shift-table) + (show-lctx step binders shift-table))) + + (define/private (factor-common-context state1 state2) + (if (send: config config<%> get-split-context?) + (factor-common-context* state1 state2) + (values null state1 state2))) + + (define/private (factor-common-context* state1 state2) + (match-define + (struct state (e1 foci1 ctx1 lctx1 binders1 uses1 frontier1 seq1)) state1) + (match-define + (struct state (e2 foci2 ctx2 lctx2 binders2 uses2 frontier2 seq2)) state2) + (define (common xs ys acc) + (if (and (pair? xs) (pair? ys) (eq? (car xs) (car ys))) + (common (cdr xs) (cdr ys) (cons (car xs) acc)) + (values (reverse xs) (reverse ys) acc))) + (define-values (ctx1z ctx2z common-ctx) + (common (reverse ctx1) (reverse ctx2) null)) + (define state1z + (make-state e1 foci1 ctx1z lctx1 binders1 uses1 frontier1 seq1)) + (define state2z + (make-state e2 foci2 ctx2z lctx2 binders2 uses2 frontier2 seq2)) + (values common-ctx state1z state2z)) + + (define/private (show-common-context ctx state1 binders shift-table) + (match-define + (struct state (_ _ _ _ _ uses1 frontier1 _)) state1) + (when (pair? ctx) + (let* ([hole-stx #'~~HOLE~~] + [the-syntax (context-fill ctx hole-stx)]) + (send*: sbview sb:syntax-browser<%> + (add-text "\nin context:\n") + (add-syntax the-syntax + #:binder-table binders + #:shift-table shift-table + #:definites uses1 + #:substitutions (list (cons hole-stx "[ HOLE ]"))))))) (define/private (show-state/redex state binders shift-table) (insert-syntax/redex (state-term state) diff --git a/collects/macro-debugger/view/stepper.ss b/collects/macro-debugger/view/stepper.ss index 8f72e06a8f..28138be6e5 100644 --- a/collects/macro-debugger/view/stepper.ss +++ b/collects/macro-debugger/view/stepper.ss @@ -153,6 +153,8 @@ (send*: config config<%> (listen-show-hiding-panel? (lambda (show?) (show-macro-hiding-panel show?))) + (listen-split-context? + (lambda (_) (update/preserve-view))) (listen-highlight-foci? (lambda (_) (update/preserve-view))) (listen-highlight-frontier? From 8308cf0b73604495a0a326d12bb765cae0a4d792 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 15 Jan 2009 08:50:27 +0000 Subject: [PATCH 4/4] Welcome to a new PLT day. svn: r13144 --- collects/repos-time-stamp/stamp.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index 40d6058f42..5c20816fe8 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "14jan2009") +#lang scheme/base (provide stamp) (define stamp "15jan2009")