From 46631b6a7159fb00d6b18e08de7a21cdc77c56cf Mon Sep 17 00:00:00 2001 From: Xusheng Date: Wed, 19 Jun 2024 14:39:24 +0800 Subject: [PATCH] Update the debugger docs for the memory region API change --- docs/guide/index.md | 33 ++++++++--------------------- docs/img/debugger/debuggerview.png | Bin 14746 -> 0 bytes 2 files changed, 9 insertions(+), 24 deletions(-) delete mode 100644 docs/img/debugger/debuggerview.png diff --git a/docs/guide/index.md b/docs/guide/index.md index d4713c70..574aed13 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -226,26 +226,19 @@ Right now, the debugger comes with two debug adapters. The `LLDBAdapter` uses [L New debug adapters can be created by subclassing `DebugAdapter` to support other targets. -Remote debugging is a planned feature. Specifically, the capacity to connect to a target via [RSP protocol](https://sourceware.org/gdb/current/onlinedocs/gdb/Remote-Protocol.html) is already baked into the LLDBAdapter, though not tested. +### The Debugger Memory Region -### The Debugger BinaryView +Starting from 4.1.5542-dev (0ad6b08b), the debugger no longer involves two binary views during debugging. Instead, +it always uses the incoming binary view (e.g., PE view) that is used to create the controller. Memory regions +that are not present in the original binary view are represented using the new Memory Map/Region API. -To represent the memory space of the target, the debugger creates a specialized `BinaryView` called `DebugProcessView`. Throughout this document, it is also called the `Debugger` BinaryView. +These regions get added automatically when the target is launched, and gets removed after debugging. Analysis is no longer lost after debugging. -[//]: # (On the other hand, there is a `base` BinaryView that is the BinaryView used to create the debugger. The base binaryView gets rebased to the correct location when the target launches. ) +During debugging, the binary view reads and writes its memory from the connected `DebugAdapter` backend. +Writing to it will also cause the target's memory to change. -The Debugger BinaryView reads and writes its memory from the connected `DebugAdapter`. To save on data transfer, the debugger caches all read operations from the adapter. Whenever the debugger executes instructions or writes data, the cached data is cleared. - -When the target is launched, the debugger automatically switches the view to the Debugger BinaryView. - -![](../../img/debugger/debuggerview.png) - -The debugger automatically applies all analysis data to the Debugger BinaryView, including functions and types, etc. This means the user can conveniently use types that are present in the static analysis. - -The Debugger BinaryView can be accessed by `dbg.live_view` once the target is launched. You can read/write to it in the normal way. Writing to it will also cause the target's memory to change. - -Right now, the Debugger BinaryView is discarded once the target exits. It cannot be easily reused due to ASLR, which makes the base of the program different in each run. As a result, any changes the user made to the Debugger BinaryView will be discarded after the target exits. +The binary view can be accessed by the ``data`` property of the controller. ## API @@ -304,7 +297,7 @@ There are several ways to launch the target: ### View/Edit Memory - Switch to Linear or hex view of the Debugger BinaryView, and view/edit in the normal way -- Get the Debugger BinaryView by `dbg.live_view`, and read/write it in the normal way +- Get the BinaryView by `dbg.data`, and read/write it in the normal way ### Navigating the binary @@ -363,14 +356,6 @@ If the target contains self-modifying code (SMC), when the target stops, the cod To avoid the need to manually force an update frequently, set `debugger.aggressiveAnalysisUpdate` to true. Then the debugger will explicitly refresh the memory cache and re-analyze all functions every time the target stops. This is very helpful for obfuscated code with lots of SMC. However, it could cause lag in response if the target is large and has a lot of functions. -### Changes made to the debugger binary view are lost after debugging - -Any changes, e.g., annotations, comments, are lost after the target exits. This is because the debugger binary view is a separate binary view, and edits to it would not carry over to the original binary view. -As a temporary workaround, try to apply changes to the original binary view, whose changes will always be carried over to the debugger binary view when the target launches. - -We are also working on [an issue](https://github.com/Vector35/debugger/issues/213) which will resolve the problem by offering a viable way to selectively carry over some changes made to the debugger binary view to the original binary view. - - ## Troubleshooting While we have tested the debugger in many scenarios, it may still malfunction in certain cases. Here are some basic steps to troubleshoot the situation. diff --git a/docs/img/debugger/debuggerview.png b/docs/img/debugger/debuggerview.png deleted file mode 100644 index c2446a6b5fe1cb44af1b1d1e1a9353e2f787a6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14746 zcmZ{L1y~%Pfi>_6;Xn>?&Q z+D1l34Jac+tL6-{w6U{*gJbz>W^9Zv&(1PnVq$DOFv|7@-PuF^%a>?%WB{ynXjK$ASy*90mEfuqhZWH!4~c2@@=^C#XuXlYWMG?Az*j+N4-t(8=%mIZuZd{& zXy4NFyc+OBFh5|RizuS6%DE1L3)icxipYx-g)jPst)R}PAX)3;CuQ-$(n~fXh@Lw{ zod|I8?aGxf8Z$bYlvHv9>%-F>K$wz@@f)tG?inWLP6H`v$}@eBx+*vKVe?=|hX(>( zVSQ|1;9PRxhVdsU(+{tg;iK1dBB!HcXzi%qAS2HrzP$L~k9TxnV{WzYKEJ$(ZN0p- zPs7Bt!$jO5!jbJ5j~799f5QgV)ItYnsjLjg3Zqfs5a99Q5MdNN>8p` zh}nG9an(^)5-|hWbDEfgOf5LU_Kts9-~eC|7-?_eYC;RPw{vh20gJu;0Je=HI|1UOI8_WL>+uxdhvHfG$ zztjQ#3KLPY0bAJVzO%81jVi2b;yk=>0spA^Up4>k=)X8MT`ZhsK=v?3SMh&O%YQNd zXXXFR_>W4Rf2-sb=KfEW|55WFoPSLaQFXR~X*2mdhT=Q`uK!i`U+n>0e+T$K2K-;M z`A;cqI>pfeT>s-5;^+rwLO5`60{XyrQXj$aM;R#Dn!R;5Bvc8kI+B4=uUXI|QIX!m z;}P}X_GaGle~xC104kmP>_o}>_Tl^1`^Ykmf1ej1&#QX(p74F;Bs+_;Bpxo(zWVCp z&Zz|EmiTTa2FXTx4a!(Xs%BxSZq4=g1@G~4r!F++(mMWpe0j!r1!H;!HSa&aiZjdJ zM-fwWW>)_#RvW|rp*xnL`jDwWo7hnZ%yu7H-FjIe3!d@`LXv&C!6C?g!;&cJ38cM} z6zm397_`h@Mn$2N;}*UuVJD8;Wbksl@4b!ZQtEeYI^X<|{tiW@os{N0bU%f2lq4Lf zZ6lCSu0{yN_Ti9R;Pd>VfNiPl=yyNfMv0w(M~~AhS=wU8(=fVp7CKI)lCcz3{w|2N zNIur|CSGa6pCZ-7E2Afstx>MPY9U(Nxl(s^cY;+4l<2-c(PfTd^ky8hWDv~67ri{o zK1plS&+2^oO-vwE9A-%!eX$)j|u1jaDv;@v4n zzKr0IDji6t$l4S%W_N~iPloYNd?iuwoD6wfN2Rk*iM9D#`14T7rdPN9Ub@tES$o~d zXl9pxl^-o31EspplXR6|xWM^SA`h`j7?_$Ahma%Bam=yu^O+)Pw0xM~=wh@K9@S>D zv%&|N_sA8r(DNR;veTeY@Ww~&F9b^bnGoq z70@BZFfDK*#bzkRFd?Q$(D^0_#~nk;pAp9*e<4`}3lqsM3k78>2EtiW%vt3~@-YIF zal{g-j|APF64z2t1d-@G6AMUAuv>R4?i+LbbP>pDZUJ@yQB-&eu4+&`HsG$3(imxy zaU&Gt4hh2(2r9b@KT;PdZe5oK@FNW}LKI)L-Xo;>qSg4ENqb+#N-R!swf|6P`I$&O zj(~!&J$UG34n^HH1aC_Pax;M`Laq$^MPxRi5P=eH&sBkv4P~u&VBK@`Aw7^j%u~&l z99lT`4!;dp1xak=V|C~TXY;-C!5Jp{9Fm(7?dWpNu=m*9hoK5 zt%E0@p_wjuzP~zHiWNO3%`0hr`G{MuXw$piU5}uRx`9Q`UzrytF2W`^$+BwSuu|&( z@;p>{CW1!zJJ7MW)l=R|B4XWkB0p6CRMT=Ld`4+IeH8%h(%-@CPm6o(6}fynRd2Hh z;Igly|KNlE-e%Tbd)=lo`U7?7Pu-HFgS6ncjdK-sobDc<=Gl9JgQUb$q;Ud$%B0Hg z-q3BwYh`}M5!s_XSg0vFf?kYi4bN18&rBcIgK-XzTTaHNBDkVAG;z}bHm?dO1nsQD zsl9%*-tDAa&uAN249Dybl=wQOcD&MPqHDirpuBsz%X&F8B;RLLOq#dK^0gcne<=06 z-3ZT29Gq?O0JWTUVQ7A=o2fvUvD}83*1hdPBfh3UjHc|5CfnL3oq`72PM{jXu~gxH=KN(fi&*(CW6)zwB8R# z4M&5_S(lI^S~&ED9EU4k-U$Gv((7dNY|d#u-E z8a>-AXXaMFsKphz0Mr$50_Hj$*Ki~r9lek0<_t@C-7R=(r z4zK2ngpx!a4r}6!j+Ih*d!O&d{qKSEwKf_L+g$$p702Eutqtwxd_WrC%MT}L8(36s zzdqDYtB8_qE2nUGQu{wTWfh7&c17d}h8upAr-v@GQeLu#ds&Wt-xgyvuFVpxPWL(} zYrsry*K2SPbXXS7lBMn-=G5Pd8SBQ8uv>dry(v{p=4@++Lau&ksNOxl4ku6rOp3Vf zty}QgFYJ0Ka-6wL@y26i1p1b2Hr*_oG9jm-}QPc6JSJyO-yi_SQ4e%`fym zE42{6%H{kR(l(fr-0>h31vr`7d0p;pNa?d%bM>)fA1yW9*yo4=AEbDEd3H*E2lh~v zwkTVgIo^GHFKF=#L#v^)e)hQoKGW{};H5s!(6>*7(lun( zK7H5OT>m%nUFz2A=^baV>a_)E&Py9a`$y=rX^jM>)u_9J)sfd_9r2Nf$d+3PeAdO; zJH2MdwyXO%Bb{k2d%Lq`)uW^SlX@;or7=UX8_|1y(Y@#wR{}1VgCx@JP8M;Gr}tw^ zgDf(0CvTgl{Vht)0Lu(RUetC$jku}|%9TeAYpbe1?k;w{$&)y(GTf55f+O7Twv)a6 zn8Y9Gri)Z>T)~uewsZAK9D4U`Jbj_OIa}d@;Im#5F|Np19^+I=(Mjf*T8_x2UW05o-v#?#1lM_IbFy>DqUjh|-^-OSYBvD(2{zm7t_Ry=? zs$3r?VeT%8=QA9MLA|=q+Yf=^(#D$_G!UBcFdEM!iAUndSH%|nti4lH^kXN%`( z*(!GIMN3t+T`Lz(+S5kEBW8>$1}yd57RSA@RSnMgY-^uX1U=3lW}iZ8#Qb*0R*o|I zk84RB+U7mcHOf?;?3b(eB^yG#2DXe^x5#N~YJWD^)9dk`xY*A7c;ndaCaEpr=ssO3 z;F$R%%1l|D-W<)mwD#GT&eo41sygsc!H&vJ8w-!A6V}J`K85^{Yd9EBK1Rm|T>!*BYIj_dz z7;)T!wtkM7tEuUwGE8VTx>uUhs>0!jZL@G>au?cdYjW{8B50ePUqa~ zHL~n|$x67^N*^LA@EIg_* zJ%~y@jXkuk(RX6dQ65~YeX4bl9exvk&AlVa6%tS-r90c)!r^E3>y2n%H@w{myv)&2 zc)0G;6Hav)hr273j2yFnu@3xNp!Gwb5dpKt>^++hK?Yg~Ms&%j0XoMAZdxR83O9NO z8!PLh2>GkOYYM34xVfY#7DV9o;4pXQP~ zsxR|gVvU>a7ddXXDSS_;LvvYRfWt`q{DGHMC-R-R8EFbP8RO6G za`W)VL*9nR;#1^Tss)8*B#`#Rw5D~-#8_wkLHWE9JBCea7Ym=86^~Z@nnPn5l_7=F zh$xhx>aD_>&T!MPNY$p&x-(90YIYYjwIS5ukXSV7ra#O)fr7ascJiNPw6B6O5Kk*r z*FRF*oU%vEE7J9W*PT|J`l%M0_i+MC__eJuF{(SwjPJ5V<{`!q0suVVJVngA{)T!_ z$O689xRZ86Q;pNtLb@hm1eud!fZdmS4DA0a=UJnEG523e%x(`rj>`FPE<8Y%(NxO{5hf3=Yhs{@-R)E29;o0a`w(3%4`*k<1j@0tp#){y$1tXcQ^e zNlB&>0yjGB`xBXQs4N_}Ut6kY?@i#9P!3rhs(Gz&7+>I%56#XbN~!BT1(ZDyH0TL; z5@D2+(#vL3P2gUnN0lD~vZRfy5yL{;rkMOl(HDngdBYGgE89s)Zi%>&!DJm*lGMUb zP5}J9yzZ|eUwp??S_*S{D)zTJ3Y%9--}whg#xK~H2RmDuZa1S^i-OMzDX&Gsuqbw7 z@C_H*jVs}5< zSM2guIM!Tfe3w3ds7MQ0p3D(ruS!QeP)3A&v3hq3P-n z$LY(Nooipt*QFQZwN05DO4Lkr4>xWGj+?{JbqBu$jxSHG?{dej=HKnUul=!SU3W0! z(OcT~Q_L_yEk-Od5^Eii z>V(ZE;%lQ?LPGnd-WdnUpBe#AW34@_ZWMK(X5~?lF+Q7_;u1HHxbcSLscGcLO$CaV zkzm2|a@(gGx(t-e-O2AjTGC&2>siKT50);}wKz>&?Z^wO;GU3Swu-V3a*E0(INpOHEEW(rOA3L|! zb~S&gTC6BZEjK@2dMuoM%1g>i&f}ZHb>lio9zSAib0Ef?XVXwT1M=iTBvS8ol6n;!{^!X3x=Z>b$!~4F{M$+6UbKK~y~Du3I25uJ=^vy) z+PnB+PlOIfXN2_I7w5!rRTtD>sHe5`rf!##;Z$4BKYq4mPl(;BbenoJ8Pe#iYK0|V zg&q{~6TT3K7gGU)q-#do80ffBLass57kt4Ac1xcdihH|5nzi$>n%~Y7%^E6WhFj=T zSBd*wA6kIP^@kA?vAZLeunAc>>+3*oO)=tFlwmr~S#tYhuY_aIh9Ht5eEV*u_hVY2 zw!TxSKOR;^=nV(BC86ViJRPr#4uG_3OE*qNV>8c>7P7^WF<3y;fi_j4T+-y)6g3-Q z9Z-OJh8udS=9EnU8qrv}b3aUznDysb#5s*cbYY;kCPnX%OaKv+hp?(IAP*c z{#kxOJ$RXn^E01?G=OK2tqxFS=jeR5Ja0X8z|;Dd_0BWDrOP-Kx`hlC@U`{TXeeR+0{M`V@6qpv%1UW6DYcX23+v7!(>%Olje0j0N&9M1J?}XPYqfi<*RUK}p5+)Ek>9a$M|y2vuaRkF^`L z{X>#uJk;cVK?H0D))|@wX5EC{j$?0k!8pN;1d60%_rE5?5{fnIxcSo^LT>``ihuk# zHN*^mRg~k!(2=5u;~e8(s%l~gh%716?A0407NGSR4h98tJN+c@k_v681}Gw_^lb{3 zNRQCp_Vuw44HIV!_1frDvW!p>9*;QU@(z=Tcl6k3Pq3~#;r>o_3}XdDA(v$Mz+x{` zWxqa}*7aNIq!b`LIj8e7*49UX{pd}GO!eTIa*d^ob_mqqJEn3x9EA_+H=3@kp&_J& z1j*D8M|JH203p0kRz&K7F$s3xcJzmg&cS?hM2HK2fxKoh9}NdJvSK3lX&|#-$VPX# zH+|ovf6f^k$<$Z5dMDkEX*DtY_1s=&GGTXoUs;relFe&T5;)`Zr_L1~s=P04*;YQu zR%QszLz5BufcoozPGPW`#FFm`cD-KFiv8gak3*2q+Ea`riMgb3NljPNbmN-IdZ~iL zhp?ik@Y|s&pNQzdrFk}XZKN^i<7O1sW56&iOW_LT^|1MN56|MDRMRr?dnv&=gA|{q z)sJ~;6^De{DM*cu`-*OqUD2KEq9TVvXLu~Gp?tcYekdzF#vR>n?oQ8Au`|9H>BQ`e z+rHP1+KxE6$NHmp(v5R{5z^F!aSY5+M+~BE;*+EUd>_s0Q1U821k+PW4r?TrE@7Zy zDu9hS0gXo+J)63yf&^#Itmzv;nay{rtbIWM4;J%@TY#iBp)iobEXVAS#RyT{VkqJB z4FG-LL!oAyF`#YJDZ9j{CKLmegv2$iJN1rMIGm5*6hB9bD<>S8)T_TgHy?%&M4qp2 zn98kR169*cq9k$Q;ngQ*xw-m5Ysbs;Z?1bcUGun-VF`C;y$EvgA zJ7`(f=_9^^I zoQsuX{08^<9md&QNSta&oMC(9BovoSk6`V`LoDcCJlGdL@i9kfpEdt9%tf;K6Of16 z_cw5@?#b%}#8>2F3TlcloXp8^J6Kt<^gl1gdfAQ247-L0EfgkZJt~rL)x|OS>|u>1 zUl4=88-`!kcZXru>P}lOrg6p98zN%Y+EWPBMu1`(JhQZqG8(b09DZSx3ZyBz3iDH= zW`L@ubP%ZFgR_C-neWQ8N2O1F{Njz&jVpPGFn(nXIswTC4V z_qEeZY7HH0kJT$(Q5%B;rP+$wZ%DTF_Pg?vakZ80ui7dD@Y6}DOPp^F^1JPgx5l`~ zP0z6)_8HM*$lZ^n7ekjc->U*W&5@_B*q5_GLBC5K?}NmVo1~8_7EXqUU48U)`iAjx zUz8l7I0#)9slnM7WH_q&>oia#EW+*0_r|r{)+`9{!tKJ`dy70M<9$TPh;iXoJZeY@ zp+0VPLJl(D*Sr`5RI=&!@Qk1`IE}(pgtFs0JNV{+MpCCGD*BF0;GUFETB|;{M_b)N zW7^fz3|;+jxqWFBA1x9zMtCIiE_LOm$h*x1kgZq6Ub9lEagekca5%wQlW%IME$~}_ zmX+JkR1FP+Z##DWN^0x-S*r%q^A760wYrYr6+WpkR{d$I-bUxvdJ;?E6NRr6riHO* zeU<2+pUg2)st8jQu1LX>nW7v%KXYI)*ymUBSLl@9q|0?1e903a1+^6ljlM|X2Co2>N;~b2n&Xw0hBXN@GzsV5 z1MkELeA{$fWQPCv)HXR9c)4GtrOiF>DCk|)Jc1gTO(*gt@Il!j5*1vzQ7-I5UXUQZAMXxiQm8={vp z+V>KeF7&R@5eDcr+1=+d=mTL0mBM1^8os^i!Q(Y!hk@wzL1Xr*BaKmV_m^xr_Bh?@ zJZAl99fZH((Y2NC?rqZ^Z{T|EC9v6g`wtO7-)>T3pOwTgY4(g*s+`waE~DA)5Uv4j zC>h1;^1wp0c9G5-g^|Pv6IB1?PR;K>26!0pWG&b5+e)+;PuESQ7r!}~p0M9xvk>dLPe}Rt?%p((a%slrkX)w<1FE*@e59WLajYQszUEkmI+}IGMaDYQsxV zGx2D0W_MVR`sSs^?Tx|wx2O3z0EPhAZsT;)L2%0R8j(I1PJh_odU1ZsY$`VnP##b& z4>~n0@e&H_#|6KW62d<9o0yTt8i4pewNypF{gaUAn^x%0KU%2#$y8Lk)c;%B^`xQ0 z(hj)?#c5(z;!ae@vWiMIQVxfAiZ&Vr| z9~EzS(16%pA!nEi}Sxl>2;kv)pp&rapXx@o$%g}0Wx&z96Oo}5$Rm7H-!W`PrNtf?E54g%6~WI zb})0*U{2E1!VExBpHZ75>r-3_-<5D_@bj!rU{vC`A?-cR5MAVv0F14Adk3v}9#sZK zmHk4@VPGduD?~!$&CI55di6X(z4#4er4Kfp1O*lrYC62akAI#bybO$ryk-u8Wd3N% z8T*1vi4)>>ko3@f2qvzA|H}FE@MoW0^ic2*R<26{+Zk8nyd;6oQv>9JHhWk=$kF#t zOV>ng!kJjb3M>NwA+KHslyUUfM_!nCUu;M>^Ba7}H-6+nxSv$)?4s_koN)XS`$RxR z%$Q<&yKpnVh+sJUgT$~VGyJkTOaDH~?!pnj57WQf(C6`vy)^z^B9=T|s9zfYh9rc^ zx-wDQd(%gr?K?lG0b0+NYNmw}X55uDct4S$=Uhh7v@?>Jx=E8TA zXB|NL(GcvTyzzqlZW5IFCW$;#v-eFS)mPqX@-YV>Px$t~B zCnbWw2-RDTiOaJ3q1-D;{vY4$gd6Ep_Hnr~|HKvt7m;{gwi~r$om9D`V8TB(;Q2ir z7%kC-Q*PoowXFwX9R7jrb8$Wxz`!=mYty!vYX@aFc`IwkRMj(Tn?RknVr_x7SiBD+ zx(aNU-p&DE^AOuP0W=3B^k~Fvlmm8?)BT_Cp3#gjv2n;Ya!!q@Re_nFJE_kL6q!Wp z-5L-kPs#ZPG)#wB$@YaW4e7vlzo)@aSdD7ZzG~ z7ZPD`-y96-5r;uV;&B!eAioQWmkw&9`Ypax!1oHtR8l4t9~uDIag*fWN1CK)R|h1C z^!0{}ep7)3f0v&bp*d+jjg#SNd`0@SE)K(5u#R3{z&Ao#8^>3Qk%3MxEzO8=G8gwZ z0q}^AQi{-RwCMf=qIjXT2$Nt)cPx1KOaIS^1(sG=phieIKY}?B%||N^*K2)QdOPvpGI)|qo&EUw=BaUs7pM?=vc7Y~4btr=1JXvu;miRXzf;8a zwH%TfZc4k_%|wRKe3WE|mLtLTtgcLS#Y~%n)!3craqiPuUXNgBvZDC)9ix3-Uep>XloU|Qa zVXO|q(i#55s5PSCC*|-P%I?{$n>fZ_0+};@KlD4r*)3+eFWNl6;xuGs>yKB&K}zOi zk(FH^VB?f)+CFfZ^rj{E={2zu*vpabxn*dJFJ!eDGQG?3C4%AxnI;LYqu~Hf10+U| zzT1|c4daY`qFaw}EDD+H*S&sx+?BY=B2Y_>%qd_`loQ9CGw{e*vlhGG%ZuS}aCrCE-cMn}-Ca6~RzDgFEHYG6S9 zPppfKN>jAq(zxQ$p(ynNNSHF;&a&-mtD2*|njF3}#Z+C=^@PgO_w7z4rf{-Xq))wX z37I644kp?Sv^^#2ujSFd<>ypJvz}7a?m8o3FW&w4<99#^A^~gAI%XxZZk1!COJ}I+ z)>J~k<@+s~-EKn}dLLBPX)?5g5colX0U#n*!C)_hRrXGvb{1!wh(3bbK>XVqXc41{ zT zi1EZ%5<@}B;uH=la*{=0G?P5Xa^&olLb|(EXMAIiHsBZ{A}KN^!@M|^BtPS=UEAQa zRsKhTPFNvZD$a>6W~%?iqFYG&mFm`Ja)*r7^-?y$RFs8n_cUF(l_bJv=ZJ3q$NG8c-u2??8dqGkZT{5fx+{d8ZXX7)&YFr7N zAza#?uvpJ$#BU%qGBB3k8yw@shMz!MAoDk4Rw61zH{jH*rT#Bu2FhFRGKU>L?p)v| z0cVV&BEp``4}#EG-vNzJ_zRb-gmv&a59Ip2_-LMQiOetuhe6$+(~0X~s}{B$MY34p@i>{}ch@^Rk^apN(TpaxT_jZ%Cwn|x zn{1mrdBlYllNOPR^~)5Gez3vHP}MBeqW4AoSiR*HtI_*lrqNQ*w3V{{h+Unua+Dv7 zJ>XP6N|5+D$-%^~{8FLK#k=o>jW+lL7O43sK=8f_zQgn<4f5spCxHX<+>|EY0l}G| z^#aNXEjh}svT4?#@hzpa`a=%-0~e;+1Ab+oH$r2>d^GVyDvKPnq-Yo+{=eB?H- z=Doh#zwpIG`%}MoFecabRr{(rL6&b1S#s~};v|;v3y$u!c9?<1g;nzwRtE3MVolbS z*sh0GiHgBV#t6AYUzomET9LtH@9y=)E9S+ClH)oUgkTC<_K)&Cor2WwU8If$FN{rJ z3ZLoQ&b7wHKp(u)L>9$t4#qzG+!`}2`;b?d;rP@o2>OE}xOvTXG(29YH=Sf(w&s~U z&za#ppZhjzvAbP-K?DcT+4piFRbtSPnIUqxU`L_I80gmnyTbNufA9fs)xY-lUFPkH z;fiGBqc(-$Q6vgyMd55!@#I*JewwwI0M?s7Q|dJvXO2=zEXqopS}i?g2hQ5>r3$(n zQV1UJKh(S*cY}DH(8t!ScwIH1jf4zIjH zwXMjMX2G1$)g=GA0j>=96W@^5ryEiGd%cSJ4HA7b1LQ1oqtOie2P&85nWg%#Vh{aB zdabg`haJ;?+cCdRC5(=Tjar?X@*YMETXvCc{X5_eF1DhouaeYrS^MA?e@-NSOFzFV z*uxqqB#&b#_!9FzeVloML4U=bm&W;1oB3B|va6sO`^vI93CDn=se*6;n}t4cud7sc zy@nhsoeG-A5$wCcg8FWUjK3KQ)s6ZQf3p*Qz_JtE!*A=v*zb4U%@)5**2_Gov~iH;-tiTgm+bFgDreEW%(7meKtdDM zU+-_?bx*{RYANu}|7uIP#Al*@%=h7h|J;O69w(i|1>D{rLr=@&TQ;{c`aL*2c9qX! zmEna|Z8y5)u9H>1XI!)9FO-HuP||Mrb+rCZZPttFx3BbLm)$yXYzJnv?&#$$b(i+FEvgIB6Q8a>0_}ymi1g^;EVe7(UNxv5(BTZHYJ6L!eft!Dlj%QF z7)y5S^q9IXsLdP$iwOaIT8u1fk7k#)J{>h>aioiNZ!M6JJ^b?3&9uNE5nfhmAY2$G z3l_6W^LC56#mlYIbJ zJz&d0v(E1+2t%Xs=2e%{i#elOEw#K)fpPW)R`n^+NsC+xAuq>532rRSb;(YvM$2B} zZq3I$#eT_0&UPb-?r$RCKVW9VLA-|jhE-N$3&qXSJoAY~)LJw49ZtI{yi^{s=wf^M zbHNG5cx4I!M}@m-pj3!7`{`6ZoyfK1R%rqj*v zn7jq%K%@WaE*1(!(_uK~-IKlhJXb|^GN`5N83u;7i68H{ie4)W7 zq0gzk=g3e9>gPU7(9p-HNiyxo$0T>`?CL}!*}5_*ZuL7Wig&Fk@|?H(3;U_&2DU4c zYYk9GTr)@u?-MDuoj*|7^{_5`digJ{+Bag~S5Pd6=i1)IOn8rxTeqsbU0cg|d!9=X zBg%{9Ko{rU;4|)hXi#EM(H8!JNj8E}>kTqC;bymboWygZ=Esk>oS)BkBk2&Beep7^ zRQ?XJdNL`psLezH(&Z;`XMKXHqnj1i>o*~NbbU3GWZ|+7FJ{ltgV#CU*yb~l+t20L zVfovc24(f$Vdk*hBzK&~GAG4iGQqPZxeV=JJhlK9w&Ib-SoHzh(k)@_wS3j}M6L9w zqUH7XwvwBH(OALA_#)DjySXGrJiY${?;bcn;(!q`mijWiRoA-X3};`!pYJ8lz_Tp6U~2S#Ga z2v4Yor7#tz6KZ|OpO|Ok%umk2CXzN%;fHN)_y;1%dbpLT3*ec+Dacu2=a2wbI_+@_ zYr@@JHf``EMZBZ&hcIp$oX@4~6FYfvchf%m@{-MJ3%5}!PW$rNUS8^#$RUA=_$=5c zdX)@Lp{~GNLM<vu@!(S657E?eJB13#%Iz+hPj z+;~6;-LDK>>H{RS4`Uz9pMU+pM2Ku1RR#S}iF$UhY-p_MKQxuHF}&jw@l4#A3Q^43hTHjPVfZYc5b@pVfq2r; z1Q~8Jg!R!hp__JGW*=0IPfkkoV9I{C@LN)n-5lkhP>YXAWBoK+n~$?v?Td1h;V_Jy z@SB#Aro#^nlTWw&WAZTUMxJwfP-svlGet%CO$4D@WWLVrkZB@GGGdl7D}BCZiz)de zF?qN}7eT!Qr)d7l)K!VU2}O79X=JDdCN#eGc1t)xBUai`E^DZ4R7 znP+H{(h5fv`T|0N-@N*YfJ(CaDqOq|t+4uCiEvoI=j0n=@z_qpr~?wHn&0GhW zwwRvxUqQ+vaqbwz(=1u<==JeI;$CM3e>b`olKiKUTT)3~Xw*9e@~5n*g+7!~TCTvW zKK=x}F8OdDI?htAe6(TOj9)lsOo=40B8zb0L@CNC7OuyJ5AA;<%?1rmg>fiT7D+cD z#(&yxKRS>zD`w|o%KxBLzg44?F2L0XI8lGt&q0tbsSaUQ2?|wAA*I>X)WT#Q z=hAL%x(y&Pd-@Z%sY4wU?j%nz1auA-%t!M~#J)pP+`7VNK|{pHc1|xW$>|ChCz2L9 z!z&qKFg#;;le;IQkI!Bj?AnHVk*xQ0XAV&$&UxHO#?;grK;g{Cna)-HA9i(-k14oW z7;T1t)C4dgB9`Zc!Q@tT7uJ-%MTd+5ouOO5qxEpH-@RhI9YZpvYpWbyw;Ak}fCQo; z&AWIeWtdGcUs$fwX_DSXwSlYyBa6;WSA9Gkffn0a5&K(EFl0Tn>m#z$h=#5ql*d3_ zw+ZGSXf(+byBB9+!c#!mfb(zbbiNk1jj-4c2;5%zEjj{=6Xn#K42A<-;=jmbmRB>p}Zzq}g4;-6K8=5a*pil6uGx zLyGmL&aE)^eh7vMa6cv12UBqqMqL6cYa7&! zYUWo-l3XB27;_rv0|Y0&r`#IEC=_NF3Mo#<%__uzNa~Ws>qp|V5}49+kvff#u-VCH z_0Vj+CrC!rmje7WvZqy5D|IagI6eWknk70Eik}-nzZv;9Hlgb|hp;QFi$RSz?Fat* zA1rrFaeMFS#e2JUhZH|_mSBRV?{PCr0Fxm;xiP~S7dB68mn<@O@kw^TB9kq~Q-5j# WO>1K~da=K+