ࡱ> `!GfR(v 'elAUXRdP*x;eI|3#f8CÁ A6P( Ղ,YBZ4ʦQbe* vReIWƼ[N\}yxK/kEÃ?>!Zy\sLOy=z p|>g29M?MY0j9~I[m,av߮ټ91LF +d]a8ٳv4, +7C1q LCo-h%,\ɞ'oox]0 ǧ_nK<{tYT?#iٞՃ\XʗMOT}.SqgXc=QiUov-g70pV[F;s=&I6Ҟeq^ԜEuMr]7g$ח_M^>e8^lؚٚ/,˵g߁2-Q5Vn~t=k{-,g"?r%Y\X.}b={G,%ϛڍ_g߹tQG [0J/}UJWzt\ڞXnS;rr/cגL_U58W9%:@$[$GtmO̯e5[ Uf _&9X{ #]+^~|zS\sבug틈:Wϯ%%D:@.o?U~/꛾M\w,{ܒ d 7zGMVҽ(-ٿKt |l(9]0g)?hU8.[_^һQ,_]u92ұFWNR FݱFSZaƽE*RSs(GR%˥iDsqùFjɌGCaIP_/C+E}늒]K6]t:FEkh̯=־,u!&:WE]J7K_n ˯YUtq5_'sua "wlw̽}k/Sޑ[rϱ!y_^Wt-),-;/99=ޏ\:>\XS+:/\}Rnm'QW=WP]ůdwݶ3( %otқ4-=Fmּ,v-wU]PnDZMV*?:uzSrlxGҕ-TwQȭthot) w4(p#wvO|.w^Jzd-rPob~d&ɍ%fkz:`,cONtT.sFgCs o֍mw^X<]KvM&! W\tO{sSQ2FύK.g?Sh92<ϡKU+|]&ۮW ueԾnm(҃(ߟ+*_V7&wƯE9rnҰ*:ɒ|͝KP[Xs~\8tNs39]s̭ΗC\_W*=xqm֡;pk\R)0:m۞qӞqM]Yc"۲= zt7ѯ k\NX#*oWZ arɫߪspGz9fe$> dg_km`ιuK7035"_u),M ?{st 촴dFO#{a&۞cNaԹ?b+pW?`+pWc+pWa+pW 7Ç^^^}ׯoG۷~_|y{||,6{ϟ?w+?~|=ش_3gk]/ m6N&BbvMg&`~0gp>̎i_|v_F[k#1zD[C̆@wDؚ `>rQlNuosW1{9 ϪG{?5v CJ°k=gi0ڽ7W[׷Of噥4?=u`U2_?{_2=o~xŸ30mZ8n̏8#\s1zK64)={V8,Z6/vOmVԮ[m>W}^Z+#mVe?ՑNūU#Bo X8_#r9ަ$7h,}dOz5c/7}"\@71[>6o Uݞ0^hcu]/RpsRYeyAZczXCXcomx[o]{Xme<-ɟRYRVrJcyϜ[cyʨUkw$ory;!ڷ5Su_ayxtt6h˸7}6t||{xMk.@r~ⵤ _S=ڥoƯ%{\eDZ*[e>1/)2HkPrik'9jal#i2o}|ZKOVDvr\NޡrUF՟{{+/z=_/wioXj-h[˻UF=z2z|أǨkz/oٷld;FwޱMgkKկƯ%{;=Z{_=zKyjm6>UےJ)-=t-ϖ{k[+~j7:hNO9?o^w{hmהCv^o㞑s(#uax[7o[^Zc>Gf_MfY;N:J8VGi~/Y1>4.5%K(%do[[}jo=澎,ik@rs#:H[K(:ʚWƈmcVx,;z|+;Gs-i^_w-]ޱۯ:GMY;w x̚ ß zꛖdus{su~ndsERoX#6Y.wio2^v͹9l= z}NcMX7>dIyi97k=zHZrڱA;~A~k4e+C}ڥOl~u^KS;G~Ƴ>dKӊc~E SN#˨G~-~MvV:^mn^nܾi_m5uϘ[Q|~LrmcMۇcDGi>$k?%:ʒ3{˷_oIP>>ۊך2G.~T7~䐵c: ܃ǽN TWZZѹ:"GF߮oHYVڿo}y[Z[YND3|O3(#o*]Zܕ}vM$8־!qQKg[ǼO]}*'ӟ-ߚ? ?uޜH[-wֺUKwL|Ys]ʆm^ތRz1j_O|-WIH>hJDV`qۖ9r>dܚdOj2qJ~>+ȼp.g~=w͗|F~#rRYގXdL8Rxk-#)?*{v-zӣHcz<|/h͵s-z~-#)?ע?p ޒaSk?[F{sU3Vol_h#mُ\Kz*[K1n?6Jy s d-+BoGhseҳw;poG2l3w{Wִ_Kٿ{:nk1h|^=̒]:5{{7:p.[_iVnVlVglV'lVGlVlÇO~ϟ3zx}}}K.|[/š:ׇ_>|`L1;P?~,ʀG8momsݻwos}.?uCm\2_5uK䝕;z&cc0}`֎/?k W|9<6e+}( X]zHR[Z?s~j\2_5uɓl̉s֦/6fY{;[XYlC<3$]2~UjoM|%9Wmm?w?z=MuǬ3?#oǕl)Y62˘|1mY^`+;O;\k!Ls"V׭̒Zooc鵾 n{\X=Zq |4R{+z:.wsV>KmZܒ:/@K{}HrOcrws%*{T{~C?C?ӚMRb6a׭F'[v)';%L-~6-|rv,j5{ʞkқ]O=(:|/p}Ci$ĺfn>{O0%(dg{ _+~He0SV>nst毯_^WXV_'=Rc5V>0ޑ_XmAoqLsɲY"%c5O.=~7<=;*nS;mUG{DAQ}yږ{ZsjS2²q 良Ywj=7L)Nya÷_UNkݺ.OdBe'Vc|[PW}򦵖"?U.:dee-N"?%O)͖w~씝s-=Zu(^gyP}PG7P><Z{UИ,$G?|jd[gCzF|$O?]zd}NԔg{R{2nv{cV=&=cHi V~Hu.WߗOoo\̷|SjG?\=ƾV-Jkkˍ-B{JO|{Ӵ_gFBzOamu]zM-y9dWKO~d1-HGy~,J?٪赙R#uj$.mF9Mm/wZν_\jՙ^Acg4޶n$k}ގS)\/2wJcO:F5F{No#c5֌ҹ>#\x/;Q~zM;{|mA:_k^g1؏w9]gPuo|;tZ絑{ORm+w2Z]6V%yLs<Ш᯷dL,-YPt3MU@rV~r=emj^}ArI#qO=Ywx96'*n=;=u>Z>\zH>9d9|Xw=%k$7&c έ5.}He+˟l\X3o${Q85X_$ž_p4/QGR:J<~/}=sڱQx6*z^}AMGʽrt쩣,](8(9#(k;٭(9uk#:{DeL1:uoX[:dw3ޙ]imgWW[uŵLܼZ#>dRnLVΥwS|[-#o`[#V9Y[Ⱥis&7aj)nw{Fc*[s;J筿 =nk:;' 6kQM_s:w9?vKs:G6{qVzڣӖY߫/Q'1ᅩe+s,Q>w,r=CGe,\Tbt\Y8w.%g:7ja(1.kr7~cVǺQjuUj<ߪo}.;G\z]oq蛏\^;¯_ɼ`y9yq3]:sğLhZʩ#~c96J|-l j6$ssg֓Z^cX_GgwrkEnwx$wZo>W~knO}oU>c},T?bN_oV>hYkO1֌ӌ5~Y{b;d[\lM#TuvLߋUs ljgL:Uk>VzWF&?6aiW{# =?#Kg ~{Ø|c6اélM'לmˮmh[h};~ ϸu_u{kGW;RF8F盓>.G_^>}˗m·÷oť/b[8W0}Fl3%.%q ceݯu jz{d\ٵkE-,[ WͶw޽i2mH~$CQxݳg̙҅캞7?amL)]e+cPح"kym'L=ב, 7zhߐ|卥՞S|瞺 Zb_wL[t}/v5+z>j_>RўX=V˦\5&㘫Ȓj1=8J64L,.Ʌ'4_M6Td֣Zxg~[|e3W'Cr_R/o;wzD+zڛ롕]V֞WR+Jl?2ֵo>=Hޏu7֙|c}~ dͽ֞iWid={eܵe2dv:AIvkxGUMojcKr7/=A&;Wu"tƺtͯ)XKQ*gps~\G0$K]hTG(R^i 'g^tlgZvP>L%۸^K:dtoTQ>D{(:HQF7-r#Y_%_zo'T39wmdG&,~;5efz$%[;VbUȭsz|MKhwpM*]k/&i7GM}+ܛkGyߒ!YW?e+ZGQz7-:pNwC͟8k|ڷ5C?Us٭o[;#j+U;9bZU[uLk}9'_zX+w\w+߫sK.DFKzL9&Y^u^Vk zޞ7]{Mn6-8}pεdMKO}C{e7i]igkv_uFeyB:kMz[{5Q_}?Y|}ѧI_[kʗ8Z*o=dAB29̝i{SW+l~/A7=c8wSGG9cD=-ϥQeHuߧ7 mwp0e_[vEϟŶ m~M[-19Qw~2_.O[]շgf[<gqCG{Agn!{g^LeEB[9Wl~Vl~Vl~VlVlVl~[{[[ [[[[[~޿rׯχ-Çj\ ///or/_~wǏo׍ת?ϟwVl-<~>`:OvM0#qza<~2K}P;.ljgڽƳl~V7ZO3{;mִZl׾&wI7ֽCo\RӽT[}'O|\p?}G;~5{mMozȹΔjA=yZZh+9W{oAG1V $s#TZuԖiml}E5wW%[>bk6/_Z0yĦȞ7YxѸӓd6Z#}^JVe+wud+ we+3we+we+u ׯ_[Çm/_ k^^^8&~ZǞ.qي-%^zwO>z\O_ p8hxn9Ⱦ6?G\^c;O-,Vai2$<>>e}X{k ϵ>ڱsoVˍ߾}{KzL6_jCTÞvNH4~a:ayYl޵2}z׀1Wp.[q[2=6J&3+tPo\y`k:gs~}6+;v|=\iN`y#ه%ؘ%9ۮ9~ wKcťw}Ak5y” hkqq&X[iűV~[PWvOѯ٤۬ ?>Vl !1ϩZ~Sv#::=QHkߏckL׽\sf.~v_1mjLՇ<bG5:Dc`Yi땇tM՞%}hO\OEQӣ|_v_ ߣ JYzNY~KfV_fh~ķ-9w͛t>R!K}{&dW&[[~.n/{״ˍ&|Rx\zuFf56K -hkq.#gCMϳi,8>4relK>_pjGkudG/y\Dzd?/ےޑ˷\_JZ#n.sוXZVV;@GHch 7ȍ3[흰x6d d;/ ?Z*=׺}oG5'eҾ8]k}[z(ktUQt=FS[BGQ|]X|emam$F={޶Wv"Az4҃zA{׍g9*srJ}섶;BkS}вՊw(fwQKSp zG&IcZeﴷu^l_[ٖ g l~Kl` WWdw-kfs%[ӜmUkE_hDiuKGQTvO(=(p/:8?__Z?^^kk3mc&Mc: geYr-3%3zs5ܽx6z۴.R=vFd?\ϭod"wQEk#[ۋ}gշ4`o\Fڷ-}o!\o$ ۺ/k[[W9>u cvˆGV?(NϚ3raEⷘZ㼒)RZ|J^-ɒJ֯1`+uz՞}5slK>v-3Cmtl ޣ3賜=W**~[f}.w{ZcZiCMl͐}ܞmt-<~yKG{}kiS}t۾ܼ]Ou?^Snei#-~О}S;KG0}G; 27Tv@ZɹFHKg!ԷOm=OߊvM^I|o*xG)-Oݳ0Xuz}cg}O4꛶K`+Rm3um#ͫG8[i~7c+3%[-ھ=]{&= ׊?kZF޿-޸s3[ct[9ͰpYvT{G_7:ߵzǼ| ##Zo}Ж$#q)oXϝ!-='OKu>vhY|+[ʭzV/>LR86r^FB%F_ԽZqgc-J.g>S?{eOz>Yl (ch߈~sbЗ.]׉g-5}8n}߆`_ӡGt2sC*=t=y V+sV;lV׿Vv Ç^^^d|=>>.Ǐ?<>[E{x}}} ³Ky۷o>}˥Vׯ_v~{xzzz h2y\[y=wṣuwM?wߦ{%[zg2c3ͷ^=Q%9:d0&K=όUH^HPz}˭CoVZ [si@6';D_cY[}4|]ral잽=렽>"^Wzyq9Ocף\zGKZ# }y56o[<= *Lf^Ϲ1@ck܋mzRcz.ecO^)?sK}kiimS/0G虚̨_8ҮɢQ.=gx9'\kG_<1czM:FyLl-qO^>Nv{ZVYl/{uIPuI:t8;O󶢥]6q^#YiVTxt/x^(;#f#ɍGkZ٪1<'>[=_#y!,__(#9gʭ9 J}VI՞t8`}T7}cGHڽuЯ_X8xy)^v-#IzB 71.Jc_z5 %;(s{kOkܹq^rBoN6Qrbsy"ސˋ#l֡`=\<֢s~̟+1Fv,6#DN`y[ک([hnc}ԗt]toבxAGuj3vgr{x-gCUZ[ړʭ%>EalM.ޏQE-ןI%c>Q鑭X՚Ö|35ۃ9[:F￯1.wUN2YO/[[͋[-.z%j.&}¯ʭ'l+U*g!u}Ƈ][6|zW{c}CammZƦ Wg=vKiu.oIr#z^ԓQXoG͋uzdOjV5{)_~j0="ZUorv^1O|ڊ]zTo_{rv]ʣR!=/ɵ.[@jkv 4h܌c[q3:[Gle4sS˿X ҃ZOTZu,X?O5 _GLϻG3^JpٶnOk;g,?oCQ_s6ώCGɥ}P#ѽs,N\gTzFc{urj?ݣ~ļ3^|NV)eh-=B}_O>CgK'йy|5_yHQ_M7t6t-r:,~#aazCrAZs]gkn?;tT-˩V)Ӎr]yQ]jW:ߋ_Kʭh][:_SV}GGjׇogHm^6[hf5rc\NG}yQ:vSKΧ38Md}(H\~f\*7YWMyYxz(loYg݉s~s\@a{y{ ] ] }3'_e+域o&=v}G{|{0[0k.[o?===|qx>`Kdh{>6Zj<=_ k=FX>t4'ŽkTޯ_΀7ڢB?7z 1./oid`s%YگEXMk6hK閗zhrfcya+7kqJv@iL2d[z`\mf\Sµ05ǣ3+)Pz| p`[_,^K{+s kڏ8oظZi3!^S']g(1|h]TGuF:O0?zo4;_u}u8س^aXڒ^ќވ͐^KvX&Kp- wH}LI5>=%ڈ]f)>=cޖ//(M׽k3<v^M{~x$}%{e K(u ]/V`޶Q^zɜWgJ:JuK{bͬ?<)Q+0⼇7zϏJgʉ~ \rcޑj.:V:ʒ2\W]BGk]{wmH0}w Ľ#~4׮}~HKʅ)9/8>67[KdcZ9ڹ^W{B콞6<(sw,)#%8ϩ֚9#;5 I/U~T~:׈n0t?3O[yq@cVhoe12{-iI!Yt\JGzlr2_u5 VYKn#D=ڞO8!=Eyw~SZ/9{q^‡=k%G:+soKLRk嵟[;'exɺ9Yp wCk [߯z`~o}]S.k_ޥ=ܜIn}ls9ɝ סH/PϯS,~\rYR\;&窞B/={F:ˡ{V%u/;K}3rӷxt]{/徑ǾuFV>[xKm7$#綶͏y(_ӚX\zX7[:O?ޟrFhwsۼG . ipvޑ_}֍hmg.%nx6n[G'Ĺ8nzie\ '^{3°ؓpc?#_1^VexMuiϽCpu%Al~8ך _^w. @]lV{lV;lV?Vl~Vl~Vŗ/_>}Ǐ///7 Çny_A^ ϟ??<>>Ʒo߮>}?loYX>-^{q+^__ZCzcc}OtOOO77cy[6/p8q.[c+`ϋ嚚=c"q o'4or=9j`23YҮ[n4m,kqpXזqcMtVy{j}{,Vg?lrɢ^5ԏvoLl2Ɏ{Ωɖ6NZ~ZI~{klZڪƱ,YS{jP3p1 +İ-Y6VGer'{9jfNsQݭ_*ǚ&۸`aZ?hڇdKEK۽Bx}Jq\\.vR[~bVߖ>[k*7_8J϶^3{꛽1{'WZ'cif3+orΗңVN;(<gy9GGgR{K{ˀ5WsWևٽ%{[^5@MA>gK1ui{s^:QK8RoYj<0(N,h~_Lo}?$AlsȭuB[h R~[ 6ţs?=]#yׯļy3?,>qJp=b0J(7k,8(wC_/GI}埡|oE:>_i5䢽/d%zGnL k}o{ZP̮ 9{ *_ץ8ƔdoՙҚ8MV Wǖ)޽rnyOnDq _s}dZKiSο0^:CL(6. Ñ/>8g3U9?XJ-[\xyEOCG"5 RY>c %{oy3cyotŒDŽ^58?VʏX,7kj\3{QqNAbɦ%5xgkQִǔzˮ}9CкK敤+5oOyR_O[6gpl#汧ޡmoɲklָ*qG\=e8M~^l {= zE[j:wxS|b=s<59Mk{Ǖz#GqEϭwzG]Տt~H]~dn]]^Gɍ&Kqt+= (OYWtS/^i}w'tON_kvk{ŗUk߶QoQk#q/YW/ZghmFa.Qnh~\^ktLj"K b}&xs{$]vi%J. 8!9*ʺVzGɾTgiNlE?g|_Z}l=>Uo[wAk;jg _<.%ǫ59_wDr;r;z×]mZ_Mk&~zrk!ޟxg1>Ÿ}KCߟΝYgR-؏k]eNl]V\jKV:kM{_<+lV`"Mu3SN6enNN}⒛M;ykt_~+_s?^ J]Ν~\JGYQEIVϣ뒟 [7z}C>E_q2vQZ6.->+^ZuvcT?o)ΊTfܭ+[5'jB{{ږ]mٹ>`+pes#v!\z+M~0W09'-ӐM,m^fW잹sʘ׭ `<]=uڬ%]S/zB}_kړ֏Ҷna}l;Fd!1>;d.#85mq37joj^d( OnvW^6|9ޑ[Zr濕 zt-=~ezÞ߽H]גzmϵlz'^#ykK9ۖxߕڂ⭼کOl⻹p`urg p֣h~1k6Z\45|rdp--v/WKF|i[ף#me/"Kȼ垫VNVVG]\nLOF۠t?ߏ ܪz=[:ۇvc鐳?ҙ}~v 6g4X#ٸ.;"%{o2 9Y*'ց,nksKrc$(,.[=h޿Ȝ-uu9-6| da$SMH[Qkn2b2ߚ2ZG٣%/ni[GRαƻg:2cg뜫LׄZrdܭ3ɴQU|ޡ9h{kd=}y.IWohWG;\U|E#!;ޱY{B4:r aޡ3tZ_ԓ~Do.w(\RdQGAݹ3nWmu V`4u5t8ڃ>2mέd{&ͥ}8|M/{JB&MjNyZMGdQK9bիwx} W5;e[^9bv/FΚ,[/O֟~sF?ч;.]{=5f[U;tFO췥SGWi7D.YNm+wjŲQ|}5߲LXn~JV֞۵k m9'mgPE9J~{Ļ%>[5=uu=bmۊJg,}VΡ)Xrhlٚ_ۚGbmY-z޿f1^sV?ƹ%}`Ȗnd8yt l[-Ft~~i,̝Gm6K;䀭^FS9B]-Jl9uVytK{Dȋ-ۖl;b+ 8s\>FMׯɶ;\ڶ:W[sKwoB4Q^yjӈrߪ>oUnyulbMyy]My<09s俗=m.iK6旭M~{}u]:6/h[V_%s:t#ۤt |_0dQYJ߀P֥[ݿ4/h[t3sw+p+lf'`[>fD?<_ݱ?Wh?o7''p8![p8![p8![}R???ۗ?߾ӧb*-![> /Çҡb20![p{|||ݑP1ī#^p8nAu>~ӧkC_~烤>uz؜?Z 0UZ![YLC4LMNϺGݻ4tL$GLקӭi0$$nz>$oӻWޫo.-c[K] oOsާLOLNOLoMWBӓ9]@m92SMOI9g*)-͠%hLB)K OoUR:T星d Ts4| }YII90]#6*FJ'3y;?0Wzpa*OU5yytJrWڧH~&*;ӕ30^qo$y<ƦQ4jz[79JG9+A/+SLt~& t)ɳmw(1ݝL?hvs#p8]ld4̃IEI4RyIaB /^IZ~"8t A~pKUEVJvR&W M֜΃̲,΄(I%)SB\M?f-Oל,lgKm |L҄w 1LWB(SLRH<ڹzvCp 4"ᐭ"O5*wX|4Re.1$̝WVA<CE?csBJZDqH,{|%In3I b2y5O-9Pٱld+֛¥?-sq8jk٪>ed^S>ѶUvt7:QV0 )sI ā5gTx ΂O2b^S;UҤ?5U2f qmR7L;JKIpWBfa(`,9?CLi ٙ0WunV'HΧ,pOp8j*Vkzlz)Q[mx(xi$YQMbB?}?~+X'Y"%t#ArCKE&Jӗiz+YN<&g)0,rI]Bg#,d$} Cp8dMe- ̃ةlGnXmIX=h/M4VV%oK[o]mkϴG/9$*\,DjIaM3o:`ޯ]8|w>ؠ?zt 4'j[>Y:́ɇtB|H u:1?`8luTjuoKWl5=(Px7LZ5c.m6ǂ9xpI,Bj:i%s|*irY:$p[DZ L %Yegs[O.74HV*7ѕIVp!oZDpvwS>vSݻϟɫp?~|p=??wqV8B󛛆ӻI"nMbTx۷tec45зajd;#[ݰ$///^]i EBpV$F}s?~ĞJ[(ձչnNL=T[0uBSSۛozi0ɫdkxpɫon|v2y26mdNQ^>Nϧ1vzfz݇#3 ^OKOСY+ob0q;JC~Nw}E9'T9SV8x8eoh|lS|n'Wd:wOm;!ig)Rv%(3Թ992sCEjsY<pӓR/z5]ݬ$JL]|ӕRzlӻ󓧑9ͺNZL?}gV :;-)wlY/J?Lͣ[D;R;FBS){K$[eF;1> veܛj閍Qd0[;K4u|5OgLn?;XUOX /f ֤MWsr~RҜW%]CKGJْLunJB_O<˛sWTCz|*IH1߭TEaa('7*^vY=)xY+F̶( 4ʌvnͼ![ZIOgtKSHݛkz5=D TOxh4i9g Im.t/-R襰fBΧe^@*UtkN/c?jN f<>T੠5dJ AEdU~U:eAvwƼ)[̲Uğx5PUϋ|jH'@J]d34N٪ROll w;,%?olx<ЦlUhll̕hv֐UZ{5oowIJ,55eM=Ĭ󯷷JM +pigeqᴆl.[ e׷7+[T+Ea)N٪RK3HV|:Sʍ0Ҵl{B+U3(3ڹ![![ߧ7þM$ˆZuT5wjgX,miv)!+w$`>V :[L~!&u94(V|zyRSæ-{3wuP"H,|W`!^CVszˢ3BL|j&Y )[5$q$P-矝U>z>[D:ܘmvP{u>[i{ zQfsCBi%s"[TJ k?ssj)yߴ߷$N9Ag)vyR,$ '$,S f.jw>Nܜ)3l鑭SO;48ϻ恺R튁LҁVi>ٕ;P(ӞvlPUڧU¹|l<x8JYӾ-"tY)dJ`jFB#ƦWR#R!-2CUMk^NL2==h1I'et4bWp3uM3sy~ c>*=3ogXcR37L9ORs[fOt8SҽI5^8毆?i? D=r/͟TG;A\o^7T(wH2q*BwS }zz. .}'s1aܲ{>$OOW䆊^ރܔw"]i,gh,GzwS&7>gNr:濧L4E?4\/{7FޝBwon"7Tn|z-?+1UҪ8IL5eYꢧw7Oi,Rl4$С89ɧᜄNdg.m~@mkni0i:lT}C iDtz' &ٜMYM NR=e=Li]#LCYL_JhRi*3UQ;~U5˛c>5XKMd(h} NTS1elS||~^?;\gUmV7ʐ$][]:I ^ɛ>w\4VSHS8mSj#ӕSﴬiɦsɆF&&Чa'UجN%B$`VoeLHLBMe+cz=ՊTʩnĦp=?=Z|wJ̜)gNBBRZ>R1l zz8'SRSdmym&r8ӭɐNLKJOBIO|HR~[v׿49V:ԟ YGN/uZp.1Gwqk&@}SMWfcZ*4K(j8wo޽s/@6T < TnU&JwNIȔǚkJ)z~{Ӏf*9IHiK v)z{)QzʱdY3s7e<,GB(zRm2ƭ^:٪X*&vz<&[hr"TϣjTӋIh4S$GB9ͷ4zԦxţ0ØRK?POE֫9CN,,'E^]/Uw='UT.:u)bX}N8]O8uZ|[5ViTX{V)cy d XF* "TC=z^,IHZOOLU.}m1)ly'MNSߧCeROz& VB}.@-4K/T'^ع@:ΑJԛRKtKmFʜ ԝ9W39,f-r2  @ [my);̐Kʓq9[/sHrSԛʳ3Öٴ"d)a7Nu&sgQ[iy:VN[3/VCXdvMX:v/t+/,<{cMt4@]ƕnJF)RȋҲV[ *ˍۭ4AiNx4Oڪdo+e=7{u2"I[،+Q+e9WFo ac8W"EY1ȝImtmK<Ƌ.sZ]¨Fqs+QVX>*Ul |W*(ҲJ[+-k+<:Ȋcm9ܗ^yeȕhϯ^]}>mwaq+q\\ͧ_ڪPcY˝CռɻpUa%Z[geQ[+ky袶r/jajCW* ryfW[V_G,:okK`@r]wͥjLgQ`&"נVb0V[+.׊pEgқG>yأa@"4 ݠ΢*&LZ))غ0;fcWs3*OEfm7HV.{nJkbޠzƵǖN$Şz8w~~mz\C86"qU>B՜t]qm(?;m>}EhM L?izˎϯanc!lN5bXu9&wj,TsJcWsNB[V$EuR[smVX4h*fv6џbޜ,A-ty~븲ܸ:IR40 a:m9HQano#lș ήUy߇((6 \Knω}%%oS~WLqD3iˎ8Jwh΋|kȾ &7%^<Ƿ6\6kyMlGםN[[yj bN\v+i/Mt]w{gr)CJ7o%f<Άqgd1ث,-dxo6dP|-ڼvwN(7|rJ>@zN,߳ #eP*z#I1VߟX>(uFg66s7xeq \$>)'5ira ,v-~oBИw6`q0C58zVN:vLRt:G,s2%Eg#6!"L`겗>^]1WJJx7亴xQđn7`4+OV5nN{6IZ% O_j˅o68?8/m_,;+e~iZ[M!+V^Sy,@pw{$~_(蝥98cm50 3kLToyy1fNO=nVIzNoL/[rÞ͔H]a bOE8d'dbٱGNse嵕}Fh+:UV֓;\%1-*uF^(y$,꒝(b_%# R_o&ɔsTؖtW4{|>ijhצ )4פ܂@[ m@[ m m:n^^^O<==[}~ޗ ?K[G{=??7߿'=j𳴕đ$>===>> ٤GM~ ^^^>>>wuiՒ" ֛Upy$$y2M >>>zް,U%XCjvdBVvvM6{n^?_N( =zBOoyZSݞNN WZѭlSkͼM; CvDUp;I=P麂Y#l$ By%Nj91{KyOBmuVO^ӬV_^[֋R*fcEXZe p;B[wY΁z@Os9T> E\/Xz!໊%`GtelJ"!w4geNցw1IsL#]zra4fGY!ڇ:z}6RVr>p&wſuwp/,D#TbJrr ܇؅Gjql*2+ҤHjRڜAm0!Y, U9@h"kUbi0]iޚVM@[ݟhZ X[9TRo.Pk+kkg9䲡(mUd-Ske좶Z8`ue:Bo-浕o=nUOMZ[OZXz8<6vViyQ/y9. `Z8`uFJfXkJ)V͵]myk+]{MЌZ+Ejme3VF נEkF[ b4X:~EJB6q$:FfSJC߱ rV:k1K1P>="L`օ%dDд[9l#{ΡwM+>5P$uAn<Π־UT*:E| IJ2^D~",x[>7N I\5LZVާS/8:]l깠&'29xni])M2i6V(6?)6h-8!Q؅)M?dtQO_~m.Vz@GWlC)$w=Gf^$ki#Ƕ$*A\<讏A^6\PbIEAn_E;1=2h:h^ɚD^.w\,|WJxfjbbA\BiInj[Y/$=, g9WnkAlOmWtسu^C$|#XSs^͞tXˠz^rsM[Yf]oi6VpYjmu><3d#B-v{;ٶg=K UlsﮭY򃶂k%ϜlCwVX|݋87 G)xXGg(=Z8s۟mɩn^^Ozmp}3}h`ƞɯE`q4_AVw|j|>Z͋%h7l"F[bq/өq#d_ @ Wyf(?x<>f: XjtC*_qV?T۩F6*lm3JZ9ٻp.YyD0ZV}oBVW1wWVU^DRmG+ mh+ Vh+ |#u@[>>>$v'_|yyy{{f6x=߿rMn*`}V}}}-btkeu@[[}ab_{XuE6DC-QSLj#сrVڹx@:I{mpHM.};Z'wjv+)W~m9ʯ DDVʝ#:*'K+^N\k u@['rJ]5unNXw!iU^HIeS^/[Y6HdY9/H:ғjE=9V@yzMzlLٌZHs5 I$-SrYO.-&S sjn&_lz +s!- I&~,kfBS|KSɑNЌJ^PJS. =Xj+.WEݕK^(#HrMW#[\ɹ挳2BetN=OGZd$]Oig~2V[r#cr!:p7P[ d;U7׉u.j_ՔH[3/-Fā1HQpWÓ,A|ͱB`}!8V"9!$-VRC$Zz֯8%nmX@],vMlvMqOp3K.6/_V:CW tmub_< pfAߊ'ۍʼVrk:G!{__ k׊neϯm7u1"mEm5kۭm/.F>˖:L: 7׿wyM]bNIz֊ހw{׿Q[5KNZVĿn fuqM м" yS$B$T~2B+YVyi>bAsaX +͛;phыQ\<3V^/",|b<`1"ݐIyf bRc7yeS^!>v܉s%T3yZMk`Au,e &gDQYb66< NZTt&gVSoaygyvLDǛ[ÑVm+!S] h1uj[g5V7LyvF[)&e9vjpy ƣ>?"(I64PkN.j7HSɿťQ>ފrUڈe2*%y+ +"%0+bJbʵo-K׊kuUii~PL#:juS[Yo捇|ar ?rOrS[Dkz-2f:0z$u4|D~wߞ6>3 4Y0lY=$O,^a>,4Qa$.<<]k1;pc^ϻ3Y1Nf$S[tF9Kݣ&O6ɾrcg~zD}s1z9Ǜ'XG,:ۺɕ"C&>Ă;RblaKwtz0Z^e%Lz,0BB2D:>٩PVi(4z(;G^2nԷɫ_Ǧޠt*| ) G*e,χU q1bMWXl erqg7V|vXh+n?O(4?\ǍC^\w0ԛIq>F#RF0'wM=yQۭ.5Vs֙[qO26UGu1ЯNuԋS>/hy|D%gBWV9Z[y^m07D/Lqxebضk$bün5©E\>ۅ#2>VP\z)JGik=pUqL{0th+% ; PgYqw*H\G!us"]S~s}\$/P{bc I[e[}R~Eajmu_l>NJj<-Gc.ٹwzNYdXsh+.G5qµE7*cVGabMҒ `>ſ@['|h+# Vh+Vh+~}}}m~'wc*3n\S>8 MGf 2XH8>\JgAa~xxBU%h+9vꨯv0)pW\8lI d}:є0ϓK(PicM6qDkˉ ӃRp`]U6xN\qŽ+V]Jh%\:"*W(Q ZnM)PSBٮW :Q™׆* 03h+[3k!CGnU;-*L2a<+W5pYX^JsMڤ I?@]\5O7E^_55UXxW"dxmX^u'\sW^ZM;.6ܛi+==qiwSF5,/rYN;n1t77޶YKR>ClY Xl},泧&t9$㼹k8 tXg9BhJF(y'=*Y iQY@Y^9:~8Xm<␕aq `7jۼJqK?VNN h<OūC)m&rjo LYP)V5Wqd|; }lGynYx)_m aU{fbqƦOUk,늓x{6jZh+K]3M7Scͷ[&r^UoC+'!!R1>貼pV'Ύs0ywe_דqNR Ai+.ƸI3nO VgU<#Qer[+߻gLWgN\&S"?o˧G b2c͚{֙z@[$,XyR^Cq7`|{ӸxCאqy155b>0vs~VKY#@˫ߞqfT 4B:艚82@ mEVh+@[V@[V?///Wf{iOh+kBJ~߿/KIHnxW1R.N? n(\wkEKJnlq&**,OWhP܀%}uE nI KI5-CC]1Վ e.#Р(ꮺn;Civt_*^0J2qp PW-hVMV, ~'BŨՠ?(]\%(ɫ>d7iSKWť0ZqANMZuQO6-6kRR _ 3UEh+Vl}JQ{B_]m"+/n_K&ɑ+l K#H!E 7uf=l墐؈cӌ~s>MSHS{SFyn" Hި׋tJ蕢PiN3`AA]w9׏hLT4'JMGoS:0("^1u$# ~؎_ĭPL2ҧ~2G57Z3O|J=@ݾ)֒ѰrF#q7ao~箧% YΨJk-WW2z]T@z2:a+ k=*ræ\H>kY7-wË l.ish+qmF)W.^Oؼ_!g/wZ;D[CX\ 1ByXeۂɜ0-cZy|]eQk"*KKW׼Q&Uer?P[gufbf@d&3_h{{sh+YmUXVn/4!1Wѓ U2Sܮ؊Tdhjρ{=E@`;*"607O:O#UI}lvsG#U*ۜ,M͕eFԛ-x }i2\r.bCt́['PɊR|L$h+mm"vS^%靾i ;x`—6Jݣ>(61Mb6!9>ߠ%[RX[e Ci".H^KaacJcmL !dWrtTS;% {hfI-Ŏc\4&;j|+Np:G cU,lTiWm&N'm ˵!hOn=0_}{l[3Ѽa qp6Ft[ >)gE@řG_+$ؗ< C 7(k!^d=o,#xN:o*/kbY3}n-:&me6ߵ^Wuq"Ӊ=___QtHUPrzT =+ʆrDeOo)9L::BVj!x grv^1ute[Gu%Q?.QS_N3Ll(ʣz]S~T @TC^ʑ$ *i|f~0١.1?AW4|"hG2~ϙɺ[E=yx_m0U TC[.*!.;.SVw-rShESh+Oa<9XXj]gȐzffm\Q@ 3~D냘*^k,ui Q"dbvsgz8Ǯ5b>Nͯm5q1"EB[C~Fu.H#e{nֳ5i)v+|nƇ(RӘvb0Vk<;ulq]xv]L`1?NKZ9 {bSqǻgeuG@ʢfCYg;Ͳqcm5.!m>Δ@˨t am2{&r(H U_Odnάf9TMT1JDϫC[I|6yi  ~xX>ЌwvkɛU[emhAؐY63n%dpwۭň(kzʣ a>.uWbK ~мŜױǽWiT`az2w,!ݗ6 eV3(sgk??+գE/ƞ,[Пz,շC6^`R &|]9"B!@[-*Hmm ƴ9mj}fe( / 0LDArialܖS 0ܖ0tt; 0@ .  @n?" dd@  @@`` T L X$  rY*%*+++,),++$$$$$$%$$(.$&'ABCD]^ghklqruv">.??$$2$GfR(v 'el 0AA 33@ʚ;ʚ;g4ldldH 0tppp@ <4dddd@k 0t; <4KdKd@l 0tA9___PPT10 6?4+  Bern CHOOSE 2007O  =RM More Flexible Software By Favoring Implicit Calls and Implicit CommunicationN(Mby Karl Lieberherr Northeastern University, CCIS/PRL Joint work with Bryan Chadwick, Ahmed Abdelmeged and Therapon SkotiniotisP[OverviewWhy is traversal abstraction important? generalized data abstraction: What is AP? expression problem AP-F and AP-P by example Container capacity checking Translation tasks Implementation: Demeter-F for AP-F and Demeter-P for AP-P Conclusions j(Z=ZZ.ZGZ(=.GLFImportant Flexible Software Topics To Which We Contribute with DemeterGG(}Generalizing the Data Abstraction Problem Contributing to Solving the Expression Problem Better Abstractions for Traversals Z-Generalizing Data Abstraction5Data Abstraction Principle: the implementation of objects can be changed without affecting clients provided the interface holds. Adaptive Programming (AP) Principle: the interface of objects can be changed without affecting clients provided the Demeter interface holds. 6533# 433KExpression Problem}Expression Problem (named by Phil Wadler), which separates structure from computations performed on that structure, while still enabling modular extensions to both the structure and the computations. We address the Expression Problem by practicing structure-shy programming: loosely couple structure and computations. Supports modular extensions to both structure and computations.~Z~"VMTraversal AbstractionTraversal of an object is fundamental to any computation on the object. Express WhereToGo using a domain-specific language for navigation control (a-la XPath). But traversals perform diverse computations: Interpretation and Translation. ,P ?QNLack of Traversal Abstractionleads to tight coupling between structure and computations. hinders using the adaptive programming principle hinders solving the expression problem 6<X<XOTraversal Abstraction-A new way of thinking about traversal abstraction. Explain with Law of Demeter: Talk only to your friends. New: Listen only to your friends. Your friends satisfy all your needs! Two ways: AP-F: F for Functional: communicate through arguments. AP-P: P for interPosition: communicate through variables. n3ZZqZZ3=Fq "\hWhat happens if you don t use traversal abstraction?55($You write a lot of boiler plate code! Related work: Scrap Your Boilerplate (SYB) started by Laemmel and Peyton-Jones. You tightly couple structure (changes frequently) and computation (more stable). That is against common sense. You always deal with the worst-case scenario of AP-F or AP-P. %Z%\jRelated work in Bern=Magritte Project (Lukas Renggli (Diplomarbeit), Stephane Ducasse, Adrian Kuhn) Magritte supports end-user customization of meta models. Facilitates creation of infrastructure for changed meta models (editors, views, persistency tools). AP supports customization of meta models including the application-specific code.>Z>P bA Quick Intro to AP-FAn AP-F program is defined by three sets of functions which adapt behavior of a predefined traversal with a multiple dispatch function. The three sets of functions: transformers builders augmentors&!! f Intro to AP-FThink of object computation as moving information down (augmentors) and pushing up (builders and transformers). Allow transformation at each node (transformers). Send information down as needed (augmentors). Default behavior: copy object.,8  "dMotto of AP-FLaw of Demeter: Talk only to your friends. Law of AP-F: Listen only to your friends and selectively receive information from your superiors. You might not need all the information you get from your friends. You only take what you need and what the communication protocol requires.:33$33e Motto of AP-F kDemeterF implements AP-F<Terminology map: AP-F to Java transformers -- apply methods take one argument default: identity builders  combine methods several arguments (from your friends) default: copy augmentors  update methods two arguments (where, what to pass down) default: identity (return second argument)ZZ$ZZ4ZZTZ$4 T fS6Class Diagram Nested Container Capacity Checking (CCC)77( 9Illustration of combine for capacity constraint violation::( 9Illustration of combine for capacity constraint violation::( UContainer-specific code for CCCPair check(){ Pair p = items.check(); return p.add(0,(p.w > cap)?1:0); } Pair combine(Container c, Integer i, Pair wv) { return wv.add(0,(wv.w > c.cap)?1:0); } void after(Container c) { myWeight += c.myWeight; totalViolations+= ((c.capc.cap)?1:0); } } Z)R5)133333 G41  -a+]Calling the Function ObjectUPair check(Item i) { return new Traversal(new Check()).traverse(i); } VV>  X Class Diagram with Noise for CCC!!( _Any program change?(class Check extends IDb{ // generic combines for passing up pairs Pair combine(Object o, Pair f, Pair r) // pair addition {return f.add(r.w, r.v);} Pair combine(Object o, Pair f) {return f;} // pass it up Pair combine(Object o) { return Pair.make(0,0); } // container capacity checking specific combines Pair combine(Element e) {return Pair.make(e.weight,0);} Pair combine(Container c, Integer i, Pair wv) { return wv.add(0, (wv.w>c.cap)?1:0); } }P 41  -Z+^!Any Change needed to CCC program?""( ` Benefit of Traversal Abstraction5NO CHANGE! although meta model changed significantly.66aQuick Intro to AP-PCAP-P is concerned about achieving the most structure-shy yet reusable form of communication among different pieces of traversal advice. The approach proposed by AP-P for structuring communication is to assign a set of interposition variables in the visitor class to store information related to a specific type of objects. 8DZ+ gQuick Intro to AP-PCPieces of traversal advice communicate through interposition variables which give access to the innermost enclosing object of a given class. An important benefit: communication can take place even across different visitors. An interposition variable is a context sensitive variable. Its context is defined by the traversal.8DZl6 Intro to AP-PThink of computation as traversing the object and collecting information in a visitor object. Use both regular visitor variables as well as interposition variables. Interposition variables facilitate implicit communication. Default behavior: traverse object.TCCC for AP-P in DemeterPclass Checker extends Visitor{ public int totalViolations = 0; @Interposition (className = "Container") public int myWeight = 0; public void after(Element e) { myWeight += e.weight; } public void after(Container c) { myWeight += c.myWeight; totalViolations+=((c.cap#semantics: apply-combine expression$$( apply(combine(this, apply(combine(left,& )), apply(combine(right,& )) )) Translate tree object into apply-combine expression. 6 ?HStill follow the grammar?Might have to write customized methods for every node. Extreme case. Encode local information about structure in personalized methods.:)Simple application Program transformation**(Old E : Num | Var | Op | Call & Op : Plus | Equals. Equals =  = . New E : & | Bool. Bool : True | False. `>$>$>=; de Bruijn indices AOld Var : Sym. Sym = Ident. New Var : Sym | Addr. Addr = Integer.L""b  i Related WorkModularity First: A Case for Mixing AOP and Attribute Grammars, Pavel Avgustinov, Torbjorn Ekman, Julian Tibble, Programming Tools Group, University of Oxford, AOSD 2008 SYB home page AP home page@b@  Vh Conclusions(Rely more on your friends. Listen to them on the agreed upon communication channels like your Facebook wall. Don t tightly couple structure (volatile) and computation (more stable). Use AP-F and AP-P ideas as your design notations. To execute your designs: DemeterF home page.,^ cOperation of AP-F l AP-F for SDGAAP-F: think of generic propagation first add specific processing&;;mgeneric propagation in SDGpush down predicate, retrieve an object satisfying predicate. push down assignment, combine integer or formula. push down predicate. n#Design space for Demeter-F programs$$(omanaging software development(Learn by evolving a software product: an algorithmic financial derivative trading game Learn by working in a small team using pair programming Learn by integrating software from the teams (p SDG Featuresoutcome determined by owner/buyer type outcome raw material (owner) finished product (buyer) pay (quality) outcome determined by environment type outcome pay"/""/"q SDG Featuresoutcome determined by owner/buyer type T set of relations of rank k exactly rank k, at most rank k. size of set, e.g., 2. use a predicate to constrain permitted relations, e.g. only OR relations -> CNF outcome raw material (owner) CSP(T) formula finished product (buyer) assignment to variables of CSP(T) formula. pay (quality) satisfaction_ratio all-or-nothing: satisfaction_ratio > price:1:0 outcome determined by environment type outcome pay6"PPPP PPPP+PPBP"PP"   +   B$$"((,,,I@s SDG Featuressynchronous: rounds in fixed order: p1 p2 p3 p1 p2 p3 & Can buy and offer when it is your turn. On each turn, must buy derivative or re-offer all existing derivatives at lower price. asynchronous: Can buy and offer at any time. Time interval RV. In every RV, must buy derivative or re-offer all existing derivatives at lower price. <MZmHNHr?Five Deep Questions in Computing Jeannette Wing, CACM Jan. 2008@@(lP=NP What is computable? What is intelligence? What is information? How can we build complex systems simply?tDeep?Speak to the foundations of the field. Understanding and expanding the frontiers of computing. P=NP: would have profound practical consequences, shaking the foundations of cryptography. P!=NP: profound theoretical consequences.u SDG and P=NP|Is there an assignment that satisfies at least k clauses: is in NP and P=NP if this problem has a polynomial time algorithm.vWhat is intelligence?Can a computer learn to play SDG well without being programmed explicitly? What are the algorithms that the computer would invent? Does it require intelligence to play the game well? w)How can we build complex systems simply? **(Can we build systems with simple and elegant designs that are easy to understand, modify and evolve yet still provide the functionality we want today and dream of for tomorrow?&;w;w/ @A c-h2j4n7r9?HIJLNORSTUVZ[\_abcdefghiklmnopqrstuvwxyz{|}~   0` 33` Sf3f` 33g` f` www3PP` ZXdbmo` \ғ3y`Ӣ` 3f3ff` 3f3FKf` hk]wwwfܹ` ff>>\`Y{ff` R>&- {p_/̴>?" dd@,|?" dd@   " @ ` n?" dd@   @@``PR    @ ` ` p>> f(    6}  `}  T Click to edit Master title style! !  0  `  RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  0  ^ `  >*  0 ^   @*  0< ^ `  @*H  0޽h ? 3380___PPT10.( 0 Default Design 0 zr0  (     0 P%   P*    0  %  R*  d  c $ ?(K    0  0)  RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  6Ȏ P   P*    6    R*  H  0޽h ? 3380___PPT10.(  _/} 0  $(  r  S LM~  r  S $NP   H  0޽h ? 33___PPT10i.( P+D=' = @B +} b 0  ,$(  ,r , S — `}   r , S — `  H , 0޽h ? 33___PPT10i.UAP+D=' = @B +} S 0  $(  r  S ח   r  S ؗP  H  0޽h ? 33___PPT10i.?Е+D=' = @B + - 0 )!t(  tr t S $ `}   r t S  `   t <40@* ! well-acceptedH t 0޽h ? 33___PPT10i.!40Z9+D=' = @B +} R 0 p $(  r  S h `}   r  S @ `  H  0޽h ? 33___PPT10i.?0@ӻ+D=' = @B +} T 0  $(  r  S  `}   r  S 8ԗ `  H  0޽h ? 33___PPT10i.?2+D=' = @B +} U 0  $(  r  S ~ `}  ~ r  S ~ ` ~ H  0޽h ? 33___PPT10i.? a+D=' = @B +} V 0  $(  r  S (~ `}  ~ r  S `)~ ` ~ H  0޽h ? 33___PPT10i.)@pk+D=' = @B +} c 0  4$(  4r 4 S <~ `}  ~ r 4 S X=~ ` ~ H 4 0޽h ? 33___PPT10i.XAP+D=' = @B +} r 0 $(  r  S Q~ `}   r  S |Q~ ` ~ H  0޽h ? 33___PPT10i.0BW+D=' = @B +} i 0 p d$(  dr d S Td~ `}   r d S d~ ` ~ H d 0޽h ? 33___PPT10i.`AP <+D=' = @B + n 0 0(  x  c $Pr~ `}   x  c $s~ ` ~ H  0޽h ? 33___PPT10i.W5 +D=' = @B + l 0  |0(  |x | c $|~ `}   x | c $T}~ ` ~ H | 0޽h ? 33___PPT10i.=вt"+D=' = @B + m 0 6. (  x  c $(~ `}   RB  s *D RB @ s *D RB  s *D p   <X~7V *  A  <~7V *  B  <~p ` < W  C   <`~0 @  D   <m~33pB  4 Listen to C and D Receive from ARB   s *D  `   <~33  "Receive from A   <ԧ~F   E  <~L  object graph  s BCDEF)hP@ S"  @"  S BC0DE4F) 0Hph  @ ` 0@Xp @    S" @ p " @ S BC@DE4F) @X H8PH 0 @    S" @  @ S B`CDEF)$X0H`@  S" @ `   S BCDEF33)0@ S"  P  S BC`DEF33)X@`@  S" @ "  S BCDE4F33) lh@80pP0D @    S" @ 0  <į~p W  IDoes NOT Receive from A33  < ~33p B]  "Receive from A  <4~ 8 augmentors   S BCDEF33)0@ S" PQ  s BCDEF)hP@ S"     <p~\t  *builders/ transformersH  0޽h ? 33___PPT10i.16+D=' = @B +} s 0 $(  r  S $~ `}   r  S ~ ` ~ H  0޽h ? 33___PPT10i.2BpL+D=' = @B +n  Z 0 }p (  x  c $T~ `   ]8      <D~@R- Item  <~W  IElement weight: int  <~@  HContainer cap: intTB  c $D``TB  c $D`0 `TB   c $D0 TB  B c $D@TB  c $D0pTB  c $D0TB  c $DpTB  c $D@  # BCDE4FAA p8XHX  XLx @    @X(@  <(~W > items  <~f~ *H  0޽h ? 33___PPT10i.`W+D=' = @B +9  0 PHp))(  x  c $J `}     <b   ::C  <4b&  =:Cons  < b ::E  <0bp ]  =:Cons  <bP  =  ::E  <bP 0j=  >:Empty   <b@J  ::C   <!b pb  =:Cons   < &b   =:Cons   <*b pr  ::E   </bp] ::E  <5bP 7  (w1,0)  <\9bW> (w2,0)  <=b   (w3,0)  < ?b (w4,0)  <pDb7 b  (0,0)  <(HbpW  (w1,0)  <Jbp ] >:Empty  <`Obp@ W (0,0)  <Sb  (w2,0)  <Wb v   (w2+w3,0)  <4[b` p   (w2+w3,1)  <~,w  (w1+w2+w3,1)  <H`b m =:Cons  <Dfb Hg #(w1+w2+w3+w4,1)  <Ljb 8 #(w1+w2+w3+w4,2)RB  s *D  pRB @ s *D 0pRB  s *D ` RB  @ s *D ` RB !@ s *D` ` P RB " s *D`  P RB # s *D pRB $@ s *D` 0 RB %@ s *D`@ RB & s *Dp0 RB '@ s *DRB (@ s *D   ) <qbG fp  E1both containers (C) violate capacity constraintsH  0޽h ? 33___PPT10i.) `+D=' = @B +1  0 00PVX?0(  r  S @b `}  b   <xb   ::C  <b&  =:Cons  <b ::E  <bp ]  =:Cons  <bP  =  ::E   <bP 0j=  >:Empty   <b@J  ::C   <b pb  =:Cons   <Lb   =:Cons   < b pr  ::E  <Xbp] ::E  <HbP 7  (w1,0)  < (w2,0)  <ȶb   (w3,0)  <`b (w4,0)  < b7 b  (0,0)  <lbpW  (w1,0)  <bp ] >:Empty  <bp@ W (0,0)  <b  (w2,0)  <b v   (w2+w3,0)  <b` p   (w2+w3,1)  <b,w  (w1+w2+w3,1)  <Lb m =:Cons  <b Hg #(w1+w2+w3+w4,1)  <b 8 #(w1+w2+w3+w4,2)RB  s *D  pRB @ s *D 0pRB   s *D ` RB !@ s *D ` RB "@ s *D` ` P RB # s *D`  P RB $ s *D pRB %@ s *D` 0 RB &@ s *D`@ RB ' s *Dp0 RB (@ s *DRB )@ s *D   * <bG fp  E1both containers (C) violate capacity constraints + <bT 31 , <|bWj> 32 - <Dc0 33 . <8c0  34XB / 0D) 0 <,ct  35 1 <db D  36 2 <c00D 43a 3 <c tw  37XB 4 0D) P  5 <c@ p'  47a 6 <|c` G  38 7 <c0t 39XB 8 0D) @@ 9 <t"c  49a : <&cp w 410XB ; 0D33)P 0 @ < <X*cP T 7 510a33 = <.cp W  41133XB > 0D33) P  ? <<2c t g  511a33 @ <6c0 Pd  41233XB A 0D33)0  B <:c 512a33 C <D>c0 D  41333XB D 0D) p P E <Bc0`  513a33 F <Fc  414 G <Jc@  $ '  415XB H 0D) pP  I <c t  515a J <dQc@ @T'  416XB K 0D33)   L <Vc0   516a33 M <Yc 41733XB N 0D33)@0@ O <_cP47 517a33 P <lac$ 41833 Q <Tfcp W 518a33XB R 0D33)p `  S <4jc w 41933XB T 0D33)p  U <8oc0 D  519a33 V <hc 42033 W <qcVH  q/after blue arrow combine is active (like after)&0 33H  0޽h ? 33___PPT10i.) `+D=' = @B +  \ 0    k (    s *c33 "6 ? `}  c   S ċc ` c "P@08X  <\c337 @$ FTALK TO YOUR FRIENDS33  <8c33   \LISTEN TO YOUR FRIENDS*3333  C BCDE4FA33) @,(x x0  @    S" 8   C B`CDE4FA33) `@ hH(0pH, @    S" H (   c B`CDE4FA33) `0P@ `` @  @    S"  0p   C BpCDEFA33)plPh@ S"      <t^` ^Manual Traversal23333 33   <c0Y 8AP-F33   <(c" 0dB  8AP-P33  <8cV S?AP-F: Listen through arguments | AP-P: Listen through variablesH  0޽h ? 33___PPT10i.@(9+D=' = @B + a 0 P V(  r  S c `}  c   s *c S"  ` c H  0޽h ? 33___PPT10i.MA+D=' = @B +} d 0  <$(  <r < S c `}  c r < S (c ` c H < 0޽h ? 33___PPT10i.ZA@+D=' = @B +S _ 0 jb -=  (   x   c $|cP `   c 8 @D < @D   BcI V 6  Item   Hc) D IElement weight: int   H,)  D HContainer cap: intZB   s *Ddi  ZB   s *Dd9 $i ZB   s *D9 $ ZB  B s *D @ T  Y0  3 # 9 p TB   c $D Y TB   c $D Y  TB   c $D   TB   c $Dp 0    C BCDE4F p8XHX  XLx @    D a     Bcz @F '  items   B,cj   *   HcԔ@ F?  Noise1   Hd)p >  Noise2   HxdԔ 7 6  Noise3`B  B 0D0  `B   0D ` Z `B   0D     B dC"?   noise3   BT d , w  noise2   B`dG .  noise1   Bd* F  noise5`B  B 0D0     Bd   noise0 !  BdZp ]  5OptItem #  H5) ' Noise4 $  H"d)' 7 EmptyItem ZB %  s *Dd  ZB &  s *Dd` $ ZB '  s *D` $ ZB ( B s *DJ  .  C BCDEFAA `(l@  : ZB 5  s *D` : ZB 6  s *D`  ZB 7  s *D : ZB 8  s *D j`B 9  0D Zp  :  B)d g  noise4W =  <(d' Noise is very common because the objects are used for several purposes. 0 outgoing has-a edges 1 outgoing has-a edge 2 outgoing has-a edgesDHH   0޽h ? 33___PPT10i.`W+D=' = @B +Y  f 0 ph =>L(  Lx L c $l>d0`  d F @D L @D L <AdI V 6  Item L BEd) D IElement weight: int L BKd)  D HContainer cap: intTB L c $Ddi  TB L c $Dd9 $i TB  L c $D9 $ TB  LB c $D @ T  Y0   L# 9 p TB  L c $D Y TB  L c $D Y  TB L c $D   TB L c $Dp 0  L C BCDE4F p8XHX  XLx @    D a   L <pQdz @F '  items L <DUdj   * L BYdԔ@ F?  Noise1 L B\d)p >  Noise2 L Bp`dԔ 7 6  Noise3ZB LB s *D0  ZB L s *D ` Z ZB L s *D   L <ddC"?   noise3 L <gd , w  noise2 L < ddG .  noise1 L <pnd* F  noise5ZB LB s *D0   L <qd   noise0 L <XudZp ]  5OptItem  L B0yd) ' Noise4 !L B|d)' 7 EmptyItem TB "L c $Dd  TB #L c $Dd` $ TB $L c $D` $ TB %LB c $DJ  &L C BCDEF `(l@  : TB 'L c $D` : TB (L c $D`  TB )L c $D : TB *L c $D jZB +L s *D Zp  ,L <pd g  noise4qF   .L `| * /L <d@R- Item 0L <\dW  IElement weight: int 1L <td@  HContainer cap: intTB 2L c $D``TB 3L c $D`0 `TB 4L c $D0 TB 5LB c $D@TB 6L c $D0pTB 7L c $D0TB 8L c $DpTB 9L c $D@ :L 3 BCDE4F p8XHX  XLx @    @X(@ ;L <dW > items L C B@CDEFAA)T`8t@@  pP H L 0޽h ? 33___PPT10i.`W+D=' = @B +Q e 0 h` --D(  Dx D c $ dP `   d # D 0ld default operation: 1: send up: Pair combine(Object o, Pair f) { return f; } 2: add: Pair combine(Object o, Pair f, Pair r) { return f.add(r.w, r.v); } 3: init: Pair combine(Object o) { return Pair.make(0,0); } 4: problem specificX-C 233b$' 3F @D D @D D <dI V 6  Item D BHd33) D IElement weight: int D B0d33)  D HContainer cap: intTB D c $Ddi  TB  D c $Dd9 $i TB  D c $D9 $ TB  DB c $D @ T  Y0   D# 9 p TB  D c $D Y TB D c $D Y  TB D c $D   TB D c $Dp 0  D C BCDE4F p8XHX  XLx @    D a   D <dz @F '  items D <dj   * D BdԔ@ F?  Noise1 D B8d)p >  Noise2 D BdԔ 7 6  Noise3ZB DB s *D0  ZB D s *D ` Z ZB D s *D   D <dC"?   noise3 D <4d , w  noise2 D <dG .  noise1 D <d* F  noise5ZB DB s *D0   D <Hd   noise0  D <dZp ]  5OptItem !D Bd) ' Noise4 "D BPd)' 7 EmptyItem TB #D c $Dd  TB $D c $Dd` $ TB %D c $D` $ TB &DB c $DJ  'D C BCDEF `(l@  : TB (D c $D` : TB )D c $D`  TB *D c $D : TB +D c $D jZB ,D s *D Zp  -D <$f g  noise4H D 0޽h ? 33___PPT10i.`W+D=' = @B +} g 0 0 T$(  Tr T S tf `}  f r T S f ` f H T 0޽h ? 33___PPT10i.]A_+D=' = @B +} h 0 P \$(  \r \ S f `}  f r \ S f ` f H \ 0޽h ? 33___PPT10i.]AC +D=' = @B +} o 0 0$(  r  S 2f `}  f r  S 2f ` f H  0޽h ? 33___PPT10i.eA@_+D=' = @B +} 7 0 $(  r  S TFf `}  f r  S ,Gf ` f H  0޽h ? 33___PPT10i.[5 +D=' = @B +} [ 0  $(  r  S |Rf `}  f r  S Uf ` f H  0޽h ? 33___PPT10i.@P:+D=' = @B +} 9 0 P$(  r  S kf `}  f r  S kf ` f H  0޽h ? 33___PPT10i.58+D=' = @B +7  2 0 N F p (    0P{f  p  = faceM1 mentM1 2  0f   GfaceM2 mentM2 AdapConM1 2  <fv  module M2  <@fP   module M1  0f p  LfaceM1 mentM1  2  0f p  NfaceM1 mentM1   2   0 f  m  NfaceM1 mentM12 2   0ܖf  }  P faceM1  mentM13 2RB   s *D` `   <Df  "uses (imports)RB   s *D LB  c $D  RB  s *D    < Node [ Tree] [ Tree]. Node = [IdentityApply] Object. ||S H  0޽h ? 33___PPT10i.6,+D=' = @B +} O 0  $(  r  S i `}  i r  S Xi ` i H  0޽h ? 33___PPT10i.]7v2+D=' = @B +  0 &(  r  S i `}  i r  S i ` i   < iP X  `class BoolTrans extends IDf { static E newtrue = Call.parse( (= 1 1) ), static E newfalse= Call.parse( (= 1 0)  ); E apply(True t) {return newtrue; } E apply(False t) {return newfalse; } }          <D-iWf> J6apply for transformation of result returned by builderH  0޽h ? 33___PPT10i.  +D=' = @B +   0 0 3(   r   S >i `}  i r   S t?i ` i v   <\Fi   class AddrTrans extends IDf { Var apply(Var var, SymList senv) { return new Addr(senv.lookup(var));} } class SymExtender extends IDa { SymList update(Lambda l, SymList senv) { return senv.push(l.formals); } }          <LQiG.  for laterH   0޽h ? 33___PPT10i. pp+D=' = @B +} q 0 p$(  r  S _i `}  i r  S `i ` i H  0޽h ? 33___PPT10i.kA+D=' = @B +} p 0 P$(  r  S ni `}  i r  S oi ` i H  0޽h ? 33___PPT10i.kAt)+D=' = @B + k 0  tF(  tr t S wi `}  i  t TA ?0 iH t 0޽h ? 33___PPT10i.aA !Y+D=' = @B +$ t 0 $(  r  S i `}  i r  S xi ` i H  0޽h ? 3380___PPT10.Gb$ u 0 $(  r  S D `}   r  S E `  H  0޽h ? 3380___PPT10.GS&A  v 0 0 A(  r  S  i `}  i   `   c"N ?  z)*z)*;1z)*OuOuVTlOuyGyGԗb^yG  `  iT  c $X99? ` 2  `>_s250888" - S    NМi_s250889" - gS p OIDb 2   `>_s250890"  8^    Npi_s250891"    OIDa 2   `>_s250892" 7 ]    Nxi_s250893"    OIDf   <i&* ID   <,i 1use builders and transformersRB  s *D H  0޽h ? 3380___PPT10.GPeQ$ w 0 P$(  r  S Hi `}  i r  S  i ` i H  0޽h ? 3380___PPT10.Kߤx$ x 0 p$(  r  S K `}  K r  S HK ` K H  0޽h ? 3380___PPT10.S7 0 y 0 0(  x  c $1 `}  1 x  c $K ` 1 H  0޽h ? 3380___PPT10.S7 $ { 0 $(  r  S x) `}   r  S 2 `  H  0޽h ? 3380___PPT10.SY$ z 0 $(  r  S 1 `}  1 r  S 1 ` 1 H  0޽h ? 3380___PPT10.S@3$ | 0 $(  r  S ҥ `}   r  S ֥ `  H  0޽h ? 3380___PPT10.S@=d$ } 0 $(  r  S   `}   r  S  `  H  0޽h ? 3380___PPT10.S`R$ ~ 0 0$(  r  S ` `}   r  S , `  H  0޽h ? 3380___PPT10.S $  0 P $(   r   S \- `   r   S 0 `  H   0޽h ? 3380___PPT10.S 0 @((  ^  S  (K     c $̟  0)    H  0޽h ? 3380___PPT10.( @7 0 `((  ^  S  (K   c  c $c  0)  c  H  0޽h ? 3380___PPT10.) @C$ 0  4(   d  c $ (K   b  s *|b  0)  b  H  0޽h ? 3380___PPT10.) @C 0  ((  ^  S  (K   i  c $;i  0)  i  H  0޽h ? 3380___PPT10. (  0 @((  ^  S  (K   i  c $\i  0)  i  H  0޽h ? 3380___PPT10. - 0 x((  x^ x S  (K    x c $T  0)    H x 0޽h ? 3380___PPT10.!4p9$2 0 4(  d  c $ (K   f  s *f  0)  f  H  0޽h ? 3380___PPT10.5@,4 0 ((  ^  S  (K   f  c $,f  0)  f  H  0޽h ? 3380___PPT10.U5 J6 0  ((  ^  S  (K   f  c $hOf  0)  f  H  0޽h ? 3380___PPT10.[5 8 0 `((  ^  S  (K   f  c $wf  0)  f  H  0޽h ? 3380___PPT10.5U$> 0  4(  d  c $ (K   i  s *l i  0)  i  H  0޽h ? 3380___PPT10.6S=$A 0 @ P4(  Pd P c $ (K   g P s * g  0)  g  H P 0޽h ? 3380___PPT10.16$B 0 ` X4(  Xd X c $ (K   g X s *  0)  g  H X 0޽h ? 3380___PPT10.16$C 0  `4(  `d ` c $ (K   g ` s *zg  0)  g  H ` 0޽h ? 3380___PPT10.16$E 0  p4(  pd p c $ (K   g p s *g  0)  g  H p 0޽h ? 3380___PPT10.16$G 0  4(  d  c $ (K   g  s *tg  0)  g  H  0޽h ? 3380___PPT10.16 H 0  (  X  C  (K   i  S i  0)  i  H  0޽h ? 3380___PPT10.]7`N K 0  (  X  C  (K     S  ~  0)    H  0޽h ? 3380___PPT10.?0@ӻ L 0  (  X  C  (K     S ,  0)    H  0޽h ? 3380___PPT10.?Е M 0  (  X  C  (K   ~  S 0~  0)  ~  H  0޽h ? 3380___PPT10.?з5 N 0  (  X  C  (K   ~  S %~  0)  ~  H  0޽h ? 3380___PPT10.? O 0  (  X  C  (K   ~  S :~  0)  ~  H  0޽h ? 3380___PPT10.)@`*rk$S 0  4(  d  c $ (K   ~  s *T~  0)  ~  H  0޽h ? 3380___PPT10.dW T 0  (  X  C  (K   f  S hf  0)  f  H  0޽h ? 3380___PPT10.@b U 0  (  X  C  (K   c  S c  0)  c  H  0޽h ? 3380___PPT10.@0T*9$X 0  4(  d  c $ (K   d  s *X;d  0)  d  H  0޽h ? 3380___PPT10.dW Z 0 `  (   X   C  (K   c   S |c  0)  c  H   0޽h ? 3380___PPT10.MAPL [ 0  0(  0X 0 C  (K    0 S ӗ  0)    H 0 0޽h ? 3380___PPT10.UAP \ 0  8(  8X 8 C  (K   ~ 8 S D;~  0)  ~  H 8 0޽h ? 3380___PPT10.XAP ] 0  @(  @X @ C  (K   c @ S `c  0)  c  H @ 0޽h ? 3380___PPT10.ZAF$^ 0  H4(  Hd H c $ (K   f H s * f  0)  f  H H 0޽h ? 3380___PPT10.dW$_ 0  P4(  Pd P c $ (K   d P s * d  0)  d  H P 0޽h ? 3380___PPT10.dW ` 0 @ X(  XX X C  (K   f X S f  0)  f  H X 0޽h ? 3380___PPT10.]Aw_ a 0 ` `(  `X ` C  (K   f ` S f  0)  f  H ` 0޽h ? 3380___PPT10.]A`  b 0  h(  hX h C  (K   ~ h S (m~  0)  ~  H h 0޽h ? 3380___PPT10.`AP < c 0  x(  xX x C  (K   i x S i  0)  i  H x 0޽h ? 3380___PPT10.aAYd 0  ((  ^  S  (K   ~  c $ ~  0)  ~  H  0޽h ? 3380___PPT10.="$e 0 4(  d  c $ (K     s *~  0)    H  0޽h ? 3380___PPT10.16$f 0  4(  d  c $ (K     s *0z~  0)    H  0޽h ? 3380___PPT10.W5  g 0 @(  X  C  (K   f  S @Cf  0)  f  H  0޽h ? 3380___PPT10.eAa h 0 `(  X  C  (K   i  S {i  0)  i  H  0޽h ? 3380___PPT10.kAt) i 0 (  X  C  (K   i  S ki  0)  i  H  0޽h ? 3380___PPT10.kA0 j 0 (  X  C  (K   ~  S a~  0)  ~  H  0޽h ? 3380___PPT10.0B k 0 (  X  C  (K   ~  S ~  0)  ~  H  0޽h ? 3380___PPT10.2Bӊ l 0 (  X  C  (K   i  S i  0)  i  H  0޽h ? 3380___PPT10.GPpb m 0  (  X  C  (K   i  S Xi  0)  i  H  0޽h ? 3380___PPT10.G@' n 0 @(  X  C  (K   i  S 4i  0)  i  H  0޽h ? 3380___PPT10.GQ o 0 `(  X  C  (K   i  S @i  0)  i  H  0޽h ? 3380___PPT10.Kx p 0 (  X  C  (K   K  S ȇK  0)  K  H  0޽h ? 3380___PPT10.S q 0 ((  ^  S  (K   1  c $81  0)  1  H  0޽h ? 3380___PPT10.S  r 0 (  X  C  (K   1  S (1  0)  1  H  0޽h ? 3380___PPT10.S@3 s 0 (  X  C  (K     S *  0)    H  0޽h ? 3380___PPT10.S t 0  (   X   C  (K      S P  0)    H   0޽h ? 3380___PPT10.S@=d u 0  (  X  C  (K     S ذ  0)    H  0޽h ? 3380___PPT10.S`R v 0 @(  X  C  (K     S   0)    H  0޽h ? 3380___PPT10.S  w 0 `$(  $X $ C  (K    $ S 8'  0)    H $ 0޽h ? 3380___PPT10.Sr4poneua: @  Z|_ rc h-jYl9knypCpruP7޷~@=i!0#G%@&z')6pmJτT+.%0@92e4y68wىY )QJc/f:<>@ C5EaGuIhhwKMOQS)V=XQZ^e\y^(T`bdfh!Y 5jm%o9qMsauuwsy1Oh+'0 `h|   DemeterF Karl J. Lieberherr Karl J. Lieberherr32Microsoft Office PowerPoint@y@ T/ @Я%NSAGg  G@  y--$xx--'@Arial-. 2 q 1/10/2008."System7-@Arial-. 2 qABern CHOOSE 2007.-@Arial-.  2 q1.-@Arial-. .2 More Flexible Software By .-@Arial-. *2 # Favoring Implicit Calls.-@Arial-. .2 /and Implicit Communication.-@Arial-. "2 O7by Karl Lieberherr.-@Arial-. :2 W "Northeastern University, CCIS/PRL .-@Arial-. @2 ^&Joint work with Bryan Chadwick, Ahmed .-@Arial-. <2 d#Abdelmeged and Therapon Skotiniotise.-՜.+,0    $ tOn-screen Show Northeastern University<.88 :ArialDefault DesignN More Flexible Software By Favoring Implicit Calls and Implicit Communication OverviewGImportant Flexible Software Topics To Which We Contribute with DemeterGeneralizing Data AbstractionExpression ProblemTraversal AbstractionLack of Traversal AbstractionTraversal Abstraction5What happens if you dont use traversal abstraction?Related work in BernA Quick Intro to AP-FIntro to AP-FMotto of AP-FMotto of AP-FDemeterF implements AP-F7Class Diagram Nested Container Capacity Checking (CCC):Illustration of combine for capacity constraint violation:Illustration of combine for capacity constraint violation Container-specific code for CCCAP-F for CCC in DemeterFCalling the Function Object!Class Diagram with Noise for CCCAny program change?"Any Change needed to CCC program?!Benefit of Traversal AbstractionQuick Intro to AP-PQuick Intro to AP-PIntro to AP-PCCC for AP-P in DemeterP*Current Traversal Abstraction Restriction Slide 31+What Hinders Creation of Flexible Software Type Unifying: information flow Type Unifying: information flow Type Unifying: information flow Type Unifying: information flow Type Unifying: information flow$semantics: apply-combine expressionStill follow the grammar?*Simple application Program transformationde Bruijn indices Related Work ConclusionsOperation of AP-F AP-F for SDGgeneric propagation in SDG$Design space for Demeter-F programsmanaging software development SDG Features SDG Features SDG Features@Five Deep Questions in Computing Jeannette Wing, CACM Jan. 2008Deep? SDG and P=NPWhat is intelligence?*How can we build complex systems simply?  Fonts UsedDesign Template Slide Titles8+_{0 Karl J. Lieberherr Karl J. Lieberherr  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root EntrydO)PicturesCurrent UserSummaryInformation(PowerPoint Document(a{DocumentSummaryInformation8Root EntrydO)ywZTPicturesCurrent UserSummaryInformation(C_{+College of Computer and Information ScienceCollege of Computer and Information Science