From 7d040dff37d98ba759303a23ab29aeac65384576 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Fri, 22 May 2020 07:13:27 -0700 Subject: [PATCH] Bit magic for backdrop accumulation Use bit counting rather than iterating backdrop increments one by one. A nice if not huge speedup. --- piet-gpu/shader/coarse.comp | 38 +++++++++++++++++++----------------- piet-gpu/shader/coarse.spv | Bin 43040 -> 43268 bytes 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 03c4535..c77c6b8 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -80,6 +80,14 @@ void alloc_chunk(inout uint chunk_n_segs, inout SegChunkRef seg_chunk_ref, } } +// Accumulate delta to backdrop. +// +// Each bit for which bd_bitmap is 1 and bd_sign is 1 counts as +1, and each +// bit for which bd_bitmap is 1 and bd_sign is 0 counts as -1. +int count_backdrop(uint bd_bitmap, uint bd_sign) { + return bitCount(bd_bitmap & bd_sign) - bitCount(bd_bitmap & ~bd_sign); +} + void main() { // Could use either linear or 2d layouts for both dispatch and // invocations within the workgroup. We'll use variables to abstract. @@ -275,33 +283,31 @@ void main() { uint slice_ix = 0; uint bitmap = sh_bitmaps[0][th_ix]; uint bd_bitmap = sh_backdrop[0][th_ix]; - uint combined = bitmap | bd_bitmap; + uint bd_sign = sh_bd_sign[0]; while (true) { - if (combined == 0) { + if (bitmap == 0) { + backdrop += count_backdrop(bd_bitmap, bd_sign); slice_ix++; if (slice_ix == N_SLICE) { break; } bitmap = sh_bitmaps[slice_ix][th_ix]; bd_bitmap = sh_backdrop[slice_ix][th_ix]; - combined = bitmap | bd_bitmap; - if (combined == 0) { + bd_sign = sh_bd_sign[slice_ix]; + if (bitmap == 0) { continue; } } - uint element_ref_ix = slice_ix * 32 + findLSB(combined); + uint element_ref_ix = slice_ix * 32 + findLSB(bitmap); uint element_ix = sh_elements[(rd_ix + element_ref_ix) % N_RINGBUF]; - // TODO: use bit magic to aggregate this calculation. - if ((bd_bitmap & (1 << (element_ref_ix & 31))) != 0) { - if ((sh_bd_sign[slice_ix] & (1 << (element_ref_ix & 31))) != 0) { - backdrop += 1; - } else { - backdrop -= 1; - } - } + // Bits up to and including the lsb + uint bd_mask = (bitmap - 1) ^ bitmap; + backdrop += count_backdrop(bd_bitmap & bd_mask, bd_sign); + // Clear bits that have been consumed. + bd_bitmap &= ~bd_mask; + bitmap &= ~bd_mask; - if ((bitmap & (1 << (element_ref_ix & 31))) != 0) { // At this point, we read the element again from global memory. // If that turns out to be expensive, maybe we can pack it into // shared memory (or perhaps just the tag). @@ -378,10 +384,6 @@ void main() { } break; } - } - - // clear LSB - combined &= combined - 1; } barrier(); diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index 3d3f3ff34e9f936435e516410382d85c0fb9e92a..f74d0a003e966fa7050ab07d9a61957a6364f762 100644 GIT binary patch literal 43268 zcma)_2e@5TwS_m_dqeNN6G}pt-dkuP^xh$)b0Lisnv~Fc6)93hdItpoDF%U11O-Jf zQWX_Y1VN?P-v6Jo$IZ$P?|X0Sa*Z+OTyxD;_CEWplf;ghm!GAoW~yf8KcDrgTGxEl z%qUegN7buU_upyHoz@sXVdxs`uD7NRb5|WLKYiw@W~sWUJ1L_Eb&uBY*34D)DP>;T ztIwy1v;LM2{)4%C64F`CUiIH;VE;=t|=!jGH)Q!s;{Tu=>Qc z*4l)&9o1a49Y<1KjBnmL&Yly-jX7dinQ=R3?OxMzo~4=}Zv5%mpqZyOujDOH-p+yC zbs$apb1d^#3&CfIH^XSA>y0^`Hl77(-yTm_wMZSy`FG;&Q_XAI7`m#(;h7_Cz4(us z*SHab2MruDX5^T0?Kx0)41))cIYxU|HD|RHb=uF6YTbD|L;X9dCGl_P*sEHmZrdJ_ zS+@I8_bT)34WBkQ?L5`Int7_1c{(OF=i9w~bobB+hk?7;0V_~Xi#x*zdQvOLusm%t zhCX%s34U1Yp&J3rj23FY8AMBwR{Io7&M~XqzO=Wc{PbG~{JXYJ|YOxsKUS0wY{maFrbyITKi;{1PNtXIU?c)A#l>Hmt*9?wQSF?v;- zg171(Jz(_s34=xt8P-|>_qw{*wE3UA+6rFy4(uL1bl5RjgTg?N)+$V_pA%csuDuSO zRX=d69d#G~*@n7k+PZ(#yoQY&Hfq@D2?M*iTik={?#prABMzG|aM;iht^0nisy|v0 zW4cKw^rS_v9o2TmX+68TssZixTOT%Y^bt6<_Me*9wDEUUJHmo7oc=@aS>f6NY8gdt~OVHH7i)kBuH3 zarNPAwMXZ??`{0nymwUlfX7qZ2m81C$m6z^yPDUuF?Lo5!3nNk%SY~2j!(_;4IVV) zh@s=gjMeV=)Mp&u{M8`zI_3S~l{0)iS4*O`N_Se_@IPRmBeGc2n8`$3)lj|I2qX#VP?I(GZU{C`Am zJJMy(?a*3-6N>mJ_QapJIxX?Pc7bP1zPYxi6md^2;+|c{b(a4hSx;LG+BqL*7IDw& ziQ8433+5fw=XKATsCi9Wlg{dVco%^ z`M*eY6+G=`7(jY$jG!gETj~dD+Se=J8kA$YlGqv3cfjp2&0bv(9yD^~m>~m)jOuxr z=VqweZ_@s3?yRoG50CnO?W(S;`N-~3-L8kv|68WT@*{F3+J1dj|C?-QtysOP?@38)u@9B5#Ht*?ogEp`G?Wi_`r=MNG>1U6&Ur#^#ws}uK2eo-mKZDx5r=Q_%-ZQ=< z+Pr6cN5b3vc2*aG#||1dXjDBHS2Xzb4Swr%yrX&mp1dChPunY<)sNu3^Nn|#_}M7; z8jNP`{&=j`+#jANOxqtF)wA%-&&%NS^J?3#XMUzO+Pzb>`=Ds|7w~QqhKx);a<8#y z*5>m`t%+yiMXB9qN40Q)m+8Ts)tcaP{?=;nO&ff(1|QJiJ2d#-4ZhEGyrbG5o*XCk z;LhqCuzE z)o1J3mgiSz_1tuRoz)8s{u?-ZqV*leXN>1hBSsF~cg(mW`i~nkaqNI?+H3O%^ka@) zvz6Ol!4nQ^HG$9CIf&|wS0Xs zuhZJvc)k-4;iSZLTfV2a^-*l0!G0pSe&?c%I(8tMyjOKi+o%3IJ-+9&{s#3Tpnczh z=DSN~(s&P`mGk%zeA+yAR?jr}^YJH3W4;XMu{WXKCMccNuWPM6C!N*QMvONa{O##@ zSM@HOJu+-$dt0>nc^{2Eka42*sy=RO<&gn;NA(3dCrGV!UxG^qbDp`gwdbabKMPtN zyw$65=GL$EeYUe&06cA8x~hfYti$+`-9uVm;~e+mZEe(`@kh{0XSE{SGqub^pXp+B zRx87gX{}^?ZP#w`L4GZ1wciAOY+>J~#bfWNc7_ja-S-{Up5oR$-&Gv}?jC*A_>p7A z)_r$W$D$2s#qFq01rM(A>EJ(Ca)_5RV&Vla}opJvPpFz^z5- z*(;sZ4rqB1biH?xH{K2RXlwPmVP|y+eA-w$t3#*by{hBk*&pnQdXIEfrxtoX$In5d zzn*<_om}r)tzwHq4i@!JqLG9=hIo;3vWO7k7b0N)kE-Ow{0Dp!Mm!D z;hv)TYTceUe$nVP{TSzL@VOg&-UeT~!IznicU3FETX`3Kt}>lZXSG^`uhHOZHu&ZZ zzD0v?3oq}n?WVJLR0H6q;~eceovpLly}|cv@Vy&+NP`b;@X_${{u$G-PiXL?rsG}J zNpL@#%NS=(=fnF?gJ0O-7dQB|@G{`yfK zs_j{MzuS2&->x`Q?r3RzG=RBx zsF&-pwR!J?Kf=3n887eqWjwXS^WDFUC+|%>s#bp=0m^uJUoYdSC7$o@WjuLrVrh4L zz5{!e?bXuWci*zT-1bzhe0(pR1MF{D&WFE|%9jWyS@~j=1!!fv-b6RPcp=(2o@FUs zOJkXZx~=&OY1QIt3uBv&dRfXMw40q;Zk(mz_M>L$4WE-*%^1d=mpXCh0~=FqY35;m z>awY|UdrTwB{+pC$2<1-icjk!1<`l_3Y^Py%tV=Y6SSj&QqrDiV9Z`vBu z_RF>E_SkLTr}kMETVJs4)%0DdwyDckqjny``G{?eE8H)|_8Gn**j(lIwJCLS-3&Yn zMa{l9uetW#L~&fz-=VW}?`Kza8kSo;C-A zZKKUT4xzRWV`;OGA=L373f5mu+pxkmytb(sYXr5iY@@GYey>Y4iI)Y-4Jh znz6=G8_PD@^!L0x{zrk0rKbPU)cUJC4z=S8&G}P1xzNl}?TkW8U+1Ewuk*n6rRKVy zPo4YGeRe@@S2x~;)aGJ4ZRUO{b>e*+Y&eAD}j8^M8<9Zhk+c)<4e*%?H%n=cD$qHSb;XNj3N0O}_V_`7C$d^114~`S~d~&ZE?h zQO$Xi`x&aHeG1sTeE!JauDQyqnY4o@KX!yXfXRjGP9=_5Mqjw2E9?sP-{Nxs&w3*!d>Ls{)JN7<4Y^rLD z@Hbn0Qmeglb1DC`AoXg@l=s4?aMy1#nq_^SR?ya%sap5R7bu2tPJD)Y4(oj__nGK< zYq)mLTubhmYRNrQExBi^;eM{nQE=mVrW(7SEuN>A+;h}${XIV|xo4*(_sq29o|%^1 zGt+RNg{v3bcP!6FW4FJ41>X$bzu-OtJ=ZM#J<}}txee}FV`;yo;O65QW9;VR8DqHp zKT~k?^Ng{yd&U^TUKl=!_?{Vt>+gAC$vrC! z?~C1Y!jgMd7;byd3QO)eVYtr*&k4i(;_o?OxcPWaSaQz^OYS*g$vr15x#xr>_pGqw zo)?yUY=e7tSlT^5EV*Zh;l3kyju_sT@pz6H?*8%|vE-g5mfZ8il6$6Da?cgRogdE@ z!&~dy;GQv-cF!40?pb5F@jPz~H=gH>CHKs+40k>}TMYL--Lu7T=f`u!aG!Uc zE0)}I#c=&SR}A;v-*d%q<1f?To-4*~d(RZZ?awpCl6$5YuD@rB;r8d5Vz~WnQE=}^ z&lF?ti`_HDaQ!_~3^%^#is9ztxnjvZR}9zRbH#A;@mw+7_?|0 z=ec6I-+Me)3_lotQo;Sa@=P&y^YKhET)StA;kNfoG2DDSQw;Bm{knqN-ZRD6jqjOa zxOUGJ!-vB?Qw;YzglCH3eX)C{818tVD7fSGOfh!9zj~$^ZhxL9hMSM)iQ(EkPYk!c z=ZW%uyhXgt^XeUn@7R;kHsc)vbM- z`sTd7_^zUs81I9dF+M<3Pv0MceJ4^MOMbqm{Rym|IDZB=$M6xFdgA;AY#jB(`53Ie z8~OS@@)NMJ)y>y;DYf+T8QAX^<(U5lSJ&TnEqVO^0d9`(b2Rnj^#$0uRZqJw!OecY zLQ_Axp4)$d)oh#j{ukJI+RVpyJ+;LB54br`|3y_De6YTKb+9t~N{IGaJ}(WQ?=J^;0*d@2hHwIVV^xG3NrS`8{HB8fR4Ts=9=4^}hgDfRdlfU94FW?bKs)x^Fd`@K`_ z`*E=E#_lC`-;0BNCl2;~xZH0`z};u}(y!nDmV~Rd_7HKF277(QShX!hQS*C)IAdBC z?ERQ|>J3*jPJEVw+gHZDJX}BZv|ACZ?)PZN;rqH;Vyp}{M))dleVp%AsaK<{MA6Uo za(&{z23UXBZUE!@23SpB-~Htq5zF(DwZOYjt84eWf?8s&12&he^}29<%C%k(uAcnX z2d_=Btuf{LB<6VZZciy+b zwmrB%wfgR8er5~+t9#j|A6V^6`Zh0fFqhbNY}oWkemj9}pSjx^>^X{aWP7wi+6ff-u)pl!hI+%KYihi~e8}ktA^f$1!SsQZ@^w&6#Bb00W2BPrb!{j`~{n)#;9Xm}Z847`jn7Cwri zpEhHtWz3GxysQ)RNU$-pm&bwCrqXZbOwD=DoH;)EcxvNWJBJggkD_>KKf1PCr@v#s zixvD>@ZywwE*uBeNB#c#KK&+G-S-jaSw4YcfA%j<{Nusp-aP@Xb{}osyC;FYjHB&D zikfl6i8BdooZIUhPKK*Fm&Q32>}4Enr%=?4BX;giqt;)1I(SEl^AbO6dHT10hj>$H zV>tt!e9i=y<2nnjmT{c}_A(!BXH(S7N1Qn4fsK=A!};({DeCdL0IY7_=TggKyAZ7Q z5pTslw=M!ZHs6OGt9HkfzODbaF!Ti@E5Nq7qh8-D!D>5FZmG5JfNiVIHNToV`DnX}qGmqg#J(0>&hd5dl_=`* zxgM;Z`|i77HJ>HU`!!&-_dEghuxn~tW6JeO%*Vm)nC*9`C*a1MO8heJkI}Rx?qsm* zX?x?!^-0_(!R5UD1nxX!Z$1T9E8lOPhN~Oz8ESdnZ>E6zlaqShZ=MCKdnK>u;I6Oz z8%M5RxxTKm{Ay~~+ghIIfc5|Oe0c$zd)?U2Q_C~vpMur$jCc{OmOcA3u$RvsZ7)&O z%t34p6Kk%XxUYb{ck>?j3$U6wyi6^R?=QjSyuS)Jr@UYM3apR1&!5++lasdBC~D>; zHm>iUzX98qeNLs8r_VRR_Nna+uzVw)EpS{r*L&+en$N_%EuJj8dI*1dm-y!oj(2!c0I%Y0d{UO z7oUUG^fR6|HRByc?Ydga$Jcx!b#uSl_6v0PuJ}vvSCsVoPjI=<{smv0l05zm)<->U z{sT6j?8X0r^;35*&eTa~T;3nrs9KsiixZ~@Nz$N!Szwke&_{O&wlVX7q!Hg z6|9!Eo(=3;tH)<{u)6c%Z#44Q<^ZR?>pCagbye5LwVw;Dp81rg{XAe}<~#j-U^Ra~ z^}g>z`}x7@w)Zz7x$U(r2v*bP??ZC$FW;vY0^N7fV`xu|Z-DK~KPObiSQAa#spM?mYk`fUZqEMJrDne+PS z+LH4IU~~4*pBO`XVr&Thx|}yc*LHH9^TuG~sGGCDN2(>xrr_i}nSL_Qo1trq-{!TS zIhTH0pleIcTY@vs#?YP^{lLk&jIotIl+5$iVB@HpvwKc0akd42UC!H~Yl~n1+OL`O z_UPJ@^8m0pJI}_@o)|lTzb@w;(Y0lscLEzn-JHEQ)DmYGuyLAezAKux`0ZBvHTV7Q z=-M(zdw^}LZht#dt0m4};Ph9{_1@^(;<{)C zllQd);A+P7xpNTM%g-Zi2U660W{9)z4h9?hA@;B5!H0m=eC8PEP;laC8%P;OF^)L- z3<57q$!E}D@Lt4FkIxYB;*`JgjPRK^6s(^)KSI&&v&}w@Z$D`}99+g90XM#Sd=3K} z|5?Ut{BE$?Cv|^^gKd}ow3q$auRQZ)ZET-KBf-wooJ5w70?$NE)v{&&#vo`LO>zFl z>A>YWXgiWJf#UeYuI*Ur@f7>kUzU#vWJhtP&Y8mG@!5OEv?Bf%_?suQz&S%=6h^8&~=}F+@De9-!`Az~GS6j4G!0IPc z%#30TB`O4%l|;iGMCQ z@yoHEhpsJc&j+hH-t>6^*gng47ow@B-9=#Aswc0DwNo-bmw@$a>GeE*3vRyJ;&&-n zJ@a@vSk1k#0=0W^;c z6`D5NtV}IWo2$WTGlg~;?=|S!Y_m4CJZ-K8r%gGJ*P&~(%_h|Hw7DLfHvT!_^z&VG zZMNBlS}t~;@}A|q2fGh*Z)X0i6YplQW6XNr0&ecHThY|B-nW5mr=E4Y9jxxU<=(pk z%(iX)nPBasSu@{9?*wZz@0+OQ$>(mc^Otelh1=-zkem4AHtjYJcOp6d>#hdPCfZN0#+~c`4K$%Xiq+mg0-2? z1Jv^5^ElYOl6;;3H}B6Mqp2sK$za>5C!Z(5>SaDZfoHw6C!eRl+RW!MYI*W`2D}X= z`Ah*f^LZ9cJ^4Hbww-$Nc^<4@=JNtP^P@fa{1mLse4eJ3n~!_zMX-BnPIjIAXJBKj zUfX=ezJz95{j{g;&%v&L_{-oj)+_MD(pP(8*-m@f{sQdUC68Z%(^gxVhkn}A_EoU+ zoVLFLr>(ZKt$y0m_BF6`68<{4jP+}HV(F_rW3Zie+j@`u27G$K-vIk;N$fYl#vW7q zzXevyn!XLTjrz&;Gyfg1akaSyQ>oPw^S5AQ=6mYzz-s!wOD*@a;5}+T3#|RE>JQX^ zqG1^*k^{g(alcW~C!w)*Rnas30Vk8}7D zwLE!#0WS0Y5^mmEudl%Rs3-4#g6+?7Yfs+)0&7d&{|1+N{|8>?{a<+Uwypm9ByYA% zrH^@kPAxaKYdJI6v1s$pc*OdQ{7v^#F+z+A1TGGODVKgwL6f$y?l``6|;lb`k9`QD{ZZ?O40cKyxW@hwm7<@oejj-uxH#2Md; z;PM{p3->vi=j2Lo|E@$!Cokt@Ww`CMxfUx>t0m?tV71(ntAcY+YRf&j8d#fW7k(bD zUi*0_sm;%l+;3~ZwcDTfmOS&lCOG$-e`Z?le62<8c&)wP)}daP;-!7P+HRd#>w}FU zH>VB2571xo*buIk`)?z#ZPcA>`PvlwvTt!>ZwxN)zfIufKG_tmR^ES`!ObW4-{xTb z)N}uB0UpKuXMFAHZ%c4_|Mi3GoBL0@^WdDAt99CL1upyD8m^Z6Pn%jf&yHE1eP(Su z_sllnd_K#!g}d*v|F?sy>E{}2Q!}2Qo#tnq{Q6^a?lLdi!_|_XHZ|Ml^VrYEcgV-@ zMwT;}Gy58VpU?>`xX(BDqqg|%4Ay3h9jN88?Fueq>;`v@jG--lyMwhE zV;5?9KkhT1t9ybyhp|ok_d-+Ge-G^x$GA7Ob7bva-p-xYbL6w-V6c~Qv>ilIGmbcM27(=vxgJ6-k8Kdx{IwlQE%&!U@43O? zJE?7>%{J;o!26Q7Yc3xOSJU4(+SJm=FtBTzJu)1umOY|PE&e0GY8m%oV72^Nw8Oz( zj$2zdMa^-Go#)J_dg6`*8#jCuxZE3~;qEW}w8d`>Ses*WJ>;>C1(z|8gqJbL!QF5A zX-m8DU~R^9ZRD{{02?#=Zz9K1juS^2_88m>REzk3l!P>G%P5~QF z-7y|dt(Lf_ffr{^!cT|mllEtT^-<4njAw$?{f#kmdluZ^5w#`O*+qq!J zlRvw59$3w1d3?^VeV*a|@LlZ!xPI!!Jcn8>{uhGX1K}5e^~vvb7lZXtxBVs5YVp4m z>>kkeEoyo0;ctVzhi#+HHm<{E;PM{69ImFnakQzWk1N3Dlym1R!D_L82kaP<^HpFq z{fwtgE&f-7%Xrto)ndOEyaOfit^=#-XFP3c@xLDIT4gVO7pyifdojPy-T+s({oLqs z+xKBUZUn1o`yN=H-)CbsGLe-Gq`VB@Hp$Gy~QIh%YK+{z8#+#9}cJc6z*em|=H{46N_ z9!1yYeL9H=d<<+KKEur0SdYWi6YB|Z`Yio^jIJ%;vnPXXtDd$`f^BOaW!s;iX^Y=e zwV&?-rQg%&+S11}VB4zaH;gG@`_|_7a>wv2*!|&}Iya76Kj-uzYVGO!Iq=tw?|F1> z@q3~6YmVio=-Tod<%?kZUXfx9?V0bFz|Hyo8Jc>22l_eK80x-{yh82e=d!k!DQfO- zan|h@V8@oeehId(a{XV0t3S^A`~B)yVB4wtd6c-;`409P*nYj2^tVs*`Zaa((&u%G znt6$n*Hmzs*Kgp>yxu@lKbgE-zqi0@Z&ETZZ-b4c&0N!$b#i?NY%b=nzj>JJZ>f{3 zKJQZ0%vGE<{vG)1_QHGU+T!>7+ON46{(!FSk$Qgr2)3=dd3->fJhZ(}`HEs5;;h|= zVCSg37yblS&%FK_?7ZgL@ex=bb>sMVPX7XSJm%@%m+Ke%CxzX(K7;;>rXHV9!5>q+ zH;p0JC%JwGZsz(oH1+uWz4j^h;y=*TPbOE_{By9HYo0NE0XCMl_wOgmwfXOx%mrSsw)uCJ<+05JUbwdT_m<^}IUjhD+UDP3mT$y!+|Tv-!M9M` zmoaUtPuea3)@DBDB~PCVf^DPCyyUSh1U8m7^O7g#!eIN*W?pjV%Reu<2-sNVch*JG z)bozK7+B5kRf)N{8twA_ums%q0QIz65^P&-zFVD3e@lVY&BedZEjOnB*3+_J*G}6q zV7c$7&RcKrCDgXjmOPdNn@9Rw9GMpXZ}>_REUcntQ4bntFWt);`9xU!N%} zp{aXcoBPUO+o_xX3e;-Jb5*dpXj=s=*XBN39h`l(8dx6NH^A9vYk=j6xfVG4%)h%X z&pull>^`$EW7<}qv|R_R&3w#Do<7$F+eVvt$zxj&Y%Fc&B~Q%t!S}3KH%)py}|PA(S5=0QTsBcZS_gp{lMDH)x6~CbAPaHw3(MYwgbS% z(q>-r#5@peAKJ`Io;`XHxVc9UMpMta9|Be@_vk=)xknF$yGPa2ZV=eE+OkIngVoJt z2({ci-J`?6u8+2%)bi}n;b8ZuZM0=S$DJFrK< z)gHm-yWS|BxO{KdHj;8B#l0>zk3QJPg0t7hfaUpfG)ICr#z)<;jiy%17{-Ck!99B! ze&gY43!&-bUYrQeUYr1y8|x@){WDKTgRjD0A8qO57;w2>$HHAN^{m%%VAoh%_QyBD z&HZsantIxu09Lbo+MNhaJM)z57yBfz`!x4Av^tspQIF3l;FBnMXO-*Ym^`OB6}&Go z^!MM+ISsCV)?Thp;++n5?#n*UfUC#nOt3NTC%$>h^|4R??*G}~Ip|Z{SzvkQ_+0Qj zwe1|RJnM2E_Y4^}gtapj430a#yc#+9etMd0LdAy}^MAo{oj>=Uk+Bgl#+H=fYZ+YH2*K z?E2;J99{)iGY9XzYrtOKd)lt1s2N9WoIcpE2j||q4lK{T_g%2}p1L_*ORbi9{2n;- zcmr6jjjFnd|H*pZ2$p9aZw6nFk8QLi-YsA?`!cRP@ooj{tIfFb%;Rlfb1UcncDTCF z&SCU*2UsnA-33nWcY@`{zMER#&Qq^Z54SdHeu=<@5MKxSIROJ@F9O%RQm(hZHsUgxGQP!Tuv~ z_QWG#xqG5FwnxG1Q>&ZP!_;b-gU7(-^Z0SNTKPQwF+9)XC%|%JO{UgAbN?jR=dnK8 z(#KE0<@5L{xX)wt%>C0~pU2v=X3v20TurPgXzFSAELhF}R8UIrU?Y8_XuU;2Fo zY~1qR_yt@&KEDJTBhPKQKIY+b`&Z!HE3bm(nZMV;xzAq%%d>vJ247Em+h|L?sbDqd z!MO6o`wduMZN`*5y6x`@VcXYVSR3`QA0(m%8~ocJlipvHX21`MnQU z^WQVDe{E{<|Dg5{{}Arq#k-q*=lSQK;QFY?=g(mOeVY8v_YqueN7~(7xBCm+w%UBQ zd_wKzvqjs-6g9^uc6| z7sYtR<2@2C6V>Q9m@L#w_|QOo^g zPHLIohrw!D!ykdwd`^45`Y82dl!qwxqdjdO2WxY!9h*G1AA`%dPr}tEQxf+l;KbFQ zwoiez8P_?I$My`kjQcEHZ3-oEp93eZ_OyK-tj)O2wLG?;g3Gus!PQ=*B<|0^iK{(r ze-74WT-Qt<+b_V*jlTi=9Q`FlE%sNzjxqLMfz@*6`Wo0a>aP3i)W4><7hDhflt{^wiFYa5|HC~X&iyh!cp-|{ z0u=9;`KTA9c)u)6o%`iIaCyJH-{2oL_@@p2d4vC}!Dr^PE%E&~5dHrOl;?i>J=naQ z*UZ%)!0Nf5{s>mPpW@t`vs(N=0ITJG`Vg#E-cNsmXCG-#+dqS~8P~DPWBUuZjQcTM zZ89bM^Am95YERq0g0&gfIh4ot8Muu5H@MmqO5*+^v3&t9<9-QO zEAOYT;EAg}ZT|_@W?a`)9^1dcW!(S5)&4_CzC5aX;%ZOZnb5Tv*S#T+tpi-f?SiXy zQWCcpIQeQ%+gZTcj5{;6Jhs`vu4V4EIpAus&k1%-VxJ4HmV0q-ux-?HFU|vY@8zA1Gf?bcqoDZ%R`}|<%HTDJIYUy)9ux-@S=R#on%>6IdFEJMeJEw`c2wW}pMZwNZ z?2Ccb(&yq}+o-3{CBXKXdrhvNG3TeRC2PCS9C4mGi(^}g;xy(J&53CmZ zR$%8O_N~Ecv2O!*Y_V?(R*QW*usO!wAFQ?;J9shHW_z%G8rQbk&3yp%4it0G^FXe@ zvAzFxtnJ>L;@q3Pv8_PyT8`qqxh(ba6z|OysdF#xLc82co1^d1;QKcCK@C2r!G|~a z5d|L$KCamnLRch?7qu0K(0^xCxBg}+@ll0YOx;$ zcCKST8mt!kF<|E`_G7_nu^$I^?6H3ntd?iM@nHKju5GpF8E^vF-17{O>z~*sf*pTi zp9EI3{Uqv>DYnnOBiG0Fz1hd7fVKM!5$74w3)?Cbuazi1L;6y$Oz|1ADs|@fblRzx z_wX5L>bZx{1gn`x*7huT)>eDQbT(L=^NBO*Jh=@h;}~L zlH+-B{mLBAM^n#p;{vdn``UA4+g}J*cb^$k?%AlhTnwI@THRdb$#s78wJBa}Qj+Uh zU~^rE+Fbpfb_MOqTrY*|SLXU{H1*_q8CWg3&Wr!$aCLJvrrcc3my%r91Dopx)aJS@_4TwXbG;g_UzzJQXzI!JTCiGjT?YT_;OgdTOnJ_nzYAWW z?#o=|$<@!jjVWFmQj+UNU~}Ds+FTc4s3qgQ#-Hb`~dBo z*YJlM{KJ%eYU$)g~8lpN1!{_OyKltj)O2fjqY7!1k3ncpmJ$n4A7` zed7ND*cf@P{}ild`$^OS+&AEAlgT&x=S_IxYERp@z}k%K9LQsP7i?ddgWrOkm#ni~ zpZNa{Yz*(u0rdSISk3mX%kROq&pONXvAt{ghuZEsi?hx%W80VFwHL*8-ko~y8t+NH z55+a#k2-7q0Wr#F=7(_Glxz4WH1(|EpTTNbLu06AjDH2IWeqW#9jXt4$$Z_QQYR_U&Ay-G9;4(-%w9)0Z*qOHIG>cM{il5XI{d zifeoT^}re*OnoTDH6BczHJ*uvcnw@o?s9cb!V<4&+z*4P+o8ABIXEo6gCe1DAcz4_7PKcmcS5mutKrntJ+L2%Nr*VP9(cHP`rXVtI|AxW+@N z53BKT>TZf_d<1pYcwyp{YrF{DHs#zeil&}5UJR_3H8zG?#=baMEo;04Sgl;+CE?~% z_Ole4dd9vqIAb@4V^`C!Irj0y@)}EV?4ziUtnnD?aTLcsfjVPfhB)QemxbG=%&9k; zdd9vSSS@2WhFZqHJXkGbUjeLEj(tVA`IPos-{hDJxj#yqtQylwI z)W_7=d;3_5WB(?#V?Tg;P2xCqxjt*vJkOt%;KnF(Tp3M0bFm6o&ACY4tHP7FcJo$y zvE|c#hOY*1#$FvwJ@d8(SS|0@`_uj#aCKvvzub902;16V$EnS+$n!h@I$)oFw$av{ zzmu?e9Z$*pols*x|4yVhf0L-4FFzkQB~Io~pUrBX`CAumjB@_gLsQTEtq)c!=Whde z=1;rhQF9&=dqa3L_C{#xnZJ#}YMH;?XukkflKDHO#y)pWr8s}5Q#*e{sRs}z^QX@aHP0Bggd3xrzkX=ynZK>TYUTWG z1JC?vcRXraQxbby@F|Vh+o7pv{`!N}GJiwx-yW`RO!JpJf5Wit2zH#>9E&{jw-eZB zvu(6B=kIK6UT07;e`nTs4E0$Q=kFY9=g()`-o(lL>9bGGGsd0a#wh1+7c}+E->zV_ za{hLMXa2N19yPx&Cid>|X6!xC)H8p3g4HsABgthixVkaTU+(;k#tbB{ zSJN;34*{3`4~46>-*?*m4}+(F_4Gd+U0eDe0ai=@hk?_-aqVACzx3Y?F8e`~)K}K{a_a9;+>cjNXFpCPPPreCg4?Ft zk4K}aXFnbTR?B`ghFa$1Sg>05<8fd$=RN!Wn{e|f`#By>J!3xsoUt3jv8(BqzD@*} zeVqhX%ii;zn*_J7sg3?lM%R}9P64Ms*SjQ1a}&w#N2(9mTo+E_LSm z9O5|F@-fsG7uqTm)BlZe7a@!OoH6(v}=90jqgt;4}7HU^RUmvs~Ya z*uD*ROxhg3T$}AK2kWoRxsd1Cdd&HZr;eqJ|F+#l|V@737*^2P$+RAYT^rnnZjQfJ>h zLHz6++dfxt@9P(8o^f3Vx3Bzp$?M^2u9OW#n>u^&c5rhK-ifB3J$Og$@7&!5 zPQI>{T>p&c?!um2??F?~c_2ez5v|6yrKJHTOXBwl?Oa*uD=o4}D!*xxUW3 zV|1>Q(*w0{ImZv8sVAo&g4KK%O5P8_UE`duKMXfN^|X5gY+G$<_akt*Hjl#fQ+I71 zr}lDfv^_>qGjDO$=EvaX+Dt}MFW1I7aQ|vc4o`yBlIKsrYUP|i1y?WUTrDx420Q-n zXW+*4nd2Hv0jv3Ei!Osd3$~5AZS;8_oOOB*EH_{8C;juR`6<}XR(-Uk&lkb=nYDZg zY&_S}IC6c&=IZ_DKFEApm;1u~Q9egJ6S|Y)bsHtmk=qM=2iUc_i#mDzj5zv){~WGg z{*9TJ;rgh*$XwXZD`54s`31O)@k_Wd^6%oj3Rg?aUx96-o|vzJ)xD4G<8`q8sCynP I_dNK20E7kjt^fc4 literal 43040 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 D@a*Ai