From 69668ec634134fd3de7089a7db302eb217b21321 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 27 May 2026 22:44:02 +0000 Subject: [PATCH] =?UTF-8?q?Slice=20S0380.16:=20add=20'Normal'=20=E2=86=92?= =?UTF-8?q?=20cylinder=5Fsize=3D2=20(110=20L)=20for=20cohort=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unblocks two 38-cert-cohort certs that previously raised `UnmappedElmhurstLabel("cylinder_size", 'Normal')` at extraction: cert 2536-2525-0600-0788-2292 ws SAP=79.7264 cert 9421-3045-3205-1646-6200 ws SAP=87.4495 Both Summary §15.1 lodgements read "Cylinder Size: Normal"; both dr87 worksheets lodge line ref (47) "Store volume = 110.0000" L (extracted from `Hot Water Cylinder → Cylinder Volume 110.00`). RdSAP 10 §10.5 Table 28 documents the "Normal (90-130 litres)" descriptor whose midpoint is 110 L — the canonical Elmhurst label string in `datatypes/epc/surveys/elmhurst_site_notes.py` is "Normal (90-130 litres)", and the worksheet's exact 110 L matches the midpoint. Two-line fix: + "Normal": 2, in `_ELMHURST_CYLINDER_SIZE_LABEL_TO_SAP10` + 2: 110.0, in `_CYLINDER_SIZE_CODE_TO_LITRES` The cascade enum 2 is consistent with the existing `cert_to_inputs.py` docstring's documented (but not-yet-observed) code 2 → Normal slot, alongside code 3 (Medium / 160 L) and code 4 (Large / 210 L) added in earlier slices. Slice keeps tight: two mapping unit tests pinning `cylinder_size == 2` for both certs at extraction. Post-fix the first-attempt cascade deltas vs worksheet are: cert 2536 Δ +0.0244 (was: RAISES) cert 9421 Δ +0.0296 (was: RAISES) Both deltas now sit in the same systematic +0.02..+0.07 small-gap band as ~12 other first-attempt certs in cohort 2 — chain test + ±0.07 pin would just paper over a known systematic residual that the user has explicitly asked to drive towards 1e-4, not toward ±0.07. Following slice will investigate the shared systematic offset and close cert 2536 / 9421 along with the rest of the +0.04 band on the chain. Pyright net-zero per file: - datatypes/epc/domain/mapper.py: 32 (baseline 32) - domain/sap10_calculator/rdsap/cert_to_inputs.py: 35 (baseline 35) - backend/documents_parser/tests/test_summary_pdf_mapper_chain.py: 0 Regression baseline: 691 pass + 10 fail (= prior 689 + 10 + 2 new GREEN). Spec refs: - RdSAP 10 §10.5 Table 28 — "Cylinder Volume" Normal band 90-130 L, midpoint 110 L (also the canonical Elmhurst label suffix). - Cert 2536 worksheet `dr87-0001-000889.pdf` line ref (47) = 110.0000. - Cert 9421 worksheet `dr87-0001-000884.pdf` line ref (47) = 110.0000. Co-Authored-By: Claude Opus 4.7 --- .../tests/fixtures/Summary_000884.pdf | Bin 0 -> 78647 bytes .../tests/fixtures/Summary_000889.pdf | Bin 0 -> 79071 bytes .../tests/test_summary_pdf_mapper_chain.py | 35 ++++++++++++++++++ datatypes/epc/domain/mapper.py | 11 +++--- .../sap10_calculator/rdsap/cert_to_inputs.py | 11 ++++-- 5 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 backend/documents_parser/tests/fixtures/Summary_000884.pdf create mode 100644 backend/documents_parser/tests/fixtures/Summary_000889.pdf diff --git a/backend/documents_parser/tests/fixtures/Summary_000884.pdf b/backend/documents_parser/tests/fixtures/Summary_000884.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92551a6f37f9a6a34830b15da05db20d9bd7f0a2 GIT binary patch literal 78647 zcmeF)1y~%-qA=(P65J&O4^D6o?oJ3c!3KAS!7X@jhY&QugA5Q{g9o?Z7TjHf?(iMC z=iamX?SIbh-e;ft_vGnxPj_`y!BkgQSMg3!D@#Z*u`zQZvyros+ZkF42(YNR+ncb6 z8$b-K?aWw|4a`iO$k|~BRfL30Y>i<-kRRUtL(o5hu!!3^+d{~>SmZ5?owV6_A5I`= zXZ_3SkJHK7IsfvG`(dT~_t-dKZ~q~-cW(?WO^hHcs?LUxhm6SDz;eI>vM`32!{TFQ zkuk9_Gl!6~ad5(tw6=3pwKp&_VUaL#u`n`GkrrbSvw%1$n>dQw+1T6Jn!vKe%c5jp z1B-{1Mase&V&cdmWo-a4kuWi`Gd5vSFtIg*Ma;#`&MPG31aUMmut9zow5N;Yq$VAA zmyLGbU&j4y*Dcr?(;9QdVK;)LzpG={t^1w6h?rOfx-ki{A>@%5eh3u`N!C-6&1S79 zpC`sG3&)!>!CGr7>JvL2-jCSNB!iv`j~A7Gy-?RMB}wVY3HXOs`%;&Zz@7WrnVBkw zT>~Y03von9ve*Xm+j=i3SFB9q9uXh0?RznTgUV+rp}64C#=Wn6#2WoA;Mh9IX=ENdYx&Gshl-YYhsi6#4AYcn&5?!Vc6gE!ij zp|eMqnG9BIEeqS*-r-fwytoB>yGeW}lRGslN3|Ix-VlXBmoHhy-c~yUlM_qx-P`Ny zM}3{_+8(rd-pA5Lv-vI8;6Y!g-C^YT#FBE>kwr^?jIhSf4i`eU+-wtl8J{CHS?bHA zotf8-*YBb`@08VOoSr)Alwns_vtsm8L!u%#a!S!d;7S78*~x^MN@cWXemV;#hF>|2 zN7^W{IbC+Hw4Pw4Ae}XNKgX|atY&@@*Uh3gASXzIP7tW%ygS>L7&%a!kRn4Pe@@V> zY^~7?;nk_VwtoL?cxywld^fEU~}gxP5M+`iHA2T>aAKX_s&vE$=z#t@zFN4*pT z5BvWccQJ_X(qN~SPi?Q88gtZ_De3=!l^-op=+KzT+_ z`&oX|6Ujm0@HLn4sJ*T#wKp&hw|N%7Hu^t1cF%3jXNjcYyg)p`BAH*{#&Z_V;-^2{ z25lXOjV|sGxh(t9y0#XLhU|UxpnQ?a*lfX8QSW5`$hLbWJeG?OqxbnN#%KZ`lx|JT z9)3+7ywX&;bKjFVN@CSI&d+D_D!+_#_~zlbtd}6m@bwP32peeAdPjh=|=)Zs_O-avT z77LQu+G6Mus#zbuY>g4I$VqB7=+kPYJY?DSFmrv+Z5j{q_gCphV zot(GtWCi{#KYir|DSuW!HoC3FS>5zJe2I*8`t+QX&$S0E>CVf!eD5vXtY&OiT;6zf z=;brJ`R@Mo)viQrJuMA?H_cc6`nx^D&s+JkQs60HMCWN2l7@F5Lyt_o9(J}OPtf5PBpvsg;1nzkL$-E zW?}x|ehe91!8=sfjlWyY{ybt`X^N55XgKiwHy)!$x2x;ZPTsKrx&lPEQqXsmafMXS zcb>?Bs{@TH*BPE}1Z1dEqRzLuZ!)Q%;yT^25fiDo*gUTgv;hy;@6}(m zXD6_T$#$*gcKCfcg_XF8R)epNT+q^;H4*t5>t?~MbH-`gCe*zkNB9^=XMi-XvxD%Kp zLDSP2Y7}y6G06XcHcmF)lbDU}1&de}*@qvQ4(wXl` zUr}#08Jo9$?ORK-=K-u1&k2vGbGY|B#e7Xqu6KtF;{??mnJ}So3zi=-DAphq1v&+D z+;p|~BJ_{P>NA)c+pJHoGf(BCK^LgkyyiYht`6)X)q@H=V-G+gJvFsAuZ5KUE^Q@v8XCj5JwP*T$sUiDQGuy-N`?zdap8sGPzBIKz``q&CiY7icl0UZc)fSX%8<}2%|#DQeb!Q zH!WJ+(@!Yuv?J4JHg$62V8w*z^n4Nm*(yA;xVJk|N54)x_0+zgS$Omg{CQEI%?~d@ z-~44debK1X)j>zO8R@Rgl8Ox%yEs$ZMsIt3Ig((DV;IX`Wf``?PCOFya7m$P_~6Oz zB(&?o?ugD}wvi&2vB@qO^u0@C_k+PNMm~cj(;zj9_IioY??o8L#|Dxv5&QGbiK;ul z4%%jx|Cr4rPK4>X#_`jJ|?hCyrDif^4UqydZWVCL^yA3m=!p=WtqZl!nbs&v26)p9!NEcx?DF1S?b zrMIS2_&~p0aGYAV+~;lLadf>DH@xU>`V&3q;yD{7oI-_+m!b>rJLV1SckL(BKO^D> zU?*-3vJ{Cmvc8MG>!#P_{^XXsivs(Eu8AeX_c}DOv}n@v4aa5Vt76J}oJT;;igMiD zjPSd^i-d6#w@BJDe&u##Yy`sZIU&n$sNZuMIR-Zx>3-|$8<{$PQ^Sglbn{}OzR=kH zY=x)>MEc|C$zgQ8R1;<=r+uT!_xH9(_go``HD$Yx9M0cwc~zRrPr9cF{^A`nebXDY3UUMeIZy*JV~F z(p$IAj9U4ZJyM9C^<0roA9vLX(oUTkN6U?PZ~HQM4KcVc^S@2n5pWi1B?)0L+vjgR z$&DIus1unW&>NPGdBiWqBG+uN=hpefW)=QA_si_8$9ff=uUfRCa!=e`HJ2U6{(jz` znj#-RS_yc_>BiB)BUy)aXDhd-lwgqu{JS9w>%G$5h-6pwRs9lksxWEvtPVwovFNql z)x1ci^GIT(qK44N(fm%lD|RB|tKTV zbmoR%@XHn@>Z~2FQr@7KMZOK1Lq1kFmDb6v69LVU{Rv9=iOD35y17pg;3I_29h+nb zK7CR|M788^c$2KL&c%KIGby-Xc#0{P2jyc@LBu9;gyEqk#I8;IEuXeFExXrS@1n9b zgBjtCN18Q+n($8gJO=Df(ybd8;TXuUQMuQ@6{hTm(xZ~ycybZl!hd*z_~)3%7BJuVQr9D|8g@SLz)pKCz`b-d(LRCSkOV2T~WurYY z;;oUJ&(bzVG^|R&7z)92HoiMU&LF53=zwnKN8y3@Xs}n7a`WL_Eb z#Hn%jChymf1$=M+1x%Jw$(kFez%OWVwlk;PMasD-xY^MtXbmqYUd9m|8m0Sc?ughS z%ensK9kuzZqp-$kvB{Idc%eJW0h+ZFQRkrZT5pS6P4XQ<}NDn~_ z26Q;`I9`={QV3d1eRgdQ7LqFX@LIGL#a3WTbc43>+8pBiwiX}P_2&NV+^F@{r8kX4Y3bR+o-rG-19V(z%!xZSms<$LuO*amxum0matc1cEstlY znh$;6hgIaVvIt;v%X4PB`TWwZ4L2uqO}TV|8&EQ`EwvD43I4SuUJ8hVLeQgiN$ zTV7_AHB#33!O?$Bu&*c}UL*+6b&XyWdL0ZpjO@T!#{1+O*r2CyLA(~bGsJir(Z(3F zJyjEwiJQbQ!c13;-BG0?wwxtENpD8x8RdVn&B3M1AhFhovpjx)B0q9CZKCcv-a@2% zWGX%uCycLI7GstHYg4~TEbuekwA!Y4IYL2|>Fb)SCXll*F)uPwbuq;7HF1NJQXxA! zFy~{fCODSInmZ@Yexy*rpvU`L)8`8_2Il>STVs-0q0~=EB#F6eZk;o!Ir5hctH>RUaWAgSDI-{zd)h?pzNUQe@N?#EvW8d5Z&8xaP&hmdt?Ox;q;$ zx_@{yT_Qx2W*sO7QgcLD#ydl*$DL_jDEf#vvZOpn&%xGRx%~AoY?ppY`b^MUt_Ke+ zw&X|_$06=5M7cKobCxRI$GKU=M<(gR?)zlo;SwhyoDZO+Yw#=Rk6V`1mf00NtISVs z<3{fYa$}^}pYNuiOw zq-Lk_D!*pALn?$~s4^_pu!r%ax^rL8Cmx&%w`K`_N{&{d$QKa` zZ&!Q6-H$I7QcMy{k^QmVE*xZRjXuCc$ESVXWJ(_}(!qF&I+J^WUUz;q4N5da*&S%a zFKzT|>@tmi60oH{fd*@T2O^*{Yaoj7^v)z;Ks!8YE8r+51mA&UvwwNnY4-aPkdjC; zhf|z?mQ;T8g$9=k$uf9T`%2OaIzFIy#7Yfqb7@3ITuq#cqIjEj=)z#Z_BdrEQyP7u zx1;E}o!_Q{=J?z(vMlW>hpa&7C?%g{jXP42FhS+ z>NoE5O(?eZ~}+8N!2`|foz2a8sln+mCB_-cVE&m@odcm$+CbWmV=|LakRKh^k7{J zhQfWcg00WQv-|lSA0Ama1H^kmjwtTGjR_!D(Oc2+8@Aj0jfA)}}uKJY$da+CpgeTO7K>q{q}FNSNf1 zn5UILU0p;1TBrHOC>cD4HlQesu~!R138?X8Rih0aLv_SFeLF1`M3MV@d;7wz0?rEG z5Rq`%louTx?GF)4ILbVoWVhhL1H{QU8_J(>T3sV*ySfcMHqsMb6g&Uq#URTa)^k%H zYPWW{;Gb|3&5V!7StC}1%jSKkqcNV<+*TdrERJ95_)#-Wge`(-^%q`tNmO*cLgbeHA{%bezUpu=WI<5bW?rB(0^}p6V&GskV(>$D9 ztpBNd8WHkhGI2b^W;#K!!n2Vt)OE6nUn$KvI(|xJm)ACKj=C?2Ni(SF0$HQX^(}4# za-mo`Pnlm64%NHw2-tA^qGca)rW(qU36UN@MtwGlAI^Dk6CjR$*MHC9bnkg_ixB(a z2|O|`opP3l-#>4(1%#&LYKIqb@av)=V-WG)PHPHkpfIlR>tZ2eplc*cJbfx&ZeuAs zPuoB%?^6F7mlSg@qfwBHis2x%zV)6n!`Gh+x1zDWY%K9h*#;XsJG&s|@+tn@=4HLi zuY~WyDdSe$&BIk=XJ5)f%FD`Fd3kwXvkS3vW^`~2ZjSZs)X49R%B^NDzggdd?9uJ2 zD<~-;!}%{Qea>}w%RR*N>B1rQea5VG-!5C^9`7J&UF{fNP8luR>(>mp$RQyi8(k7; zg75^|!VIJk({s&@^XX-d(v{RNk0(3vzM}ZI(UjHJKBMJ*g`l%Eb*QG+*Rx9MTq|ap ziKb#J%v65DxjJz=I;;drYRhOnJ*}KVDm5^7Gj|s2Fh6-_b!#=9h1kkSW&bKyUa&-a zW5TOjX)?KO;rrCo#}4qkQ&7+buiXdT&yk!}qxF!u*F)$7+y{_E`dyb|*ej**GX)Y< zO1g_inxKtO+UT-73}NCeW6fgJNJ-`oVWy9T^IKu6Q{x{qGn2VB0vU1V@pG%|FS(nw z_*PTL%$Vd$NZTdu3Pr=TaDO;JLkvhvyCnv^P4=sxtk)&f+qz*|oKiKdpTyI$i7DYb zW3WJQQo(iu(V_m^LJ_OYAnwf`9lMHWMTrw7$)mY!)x&jTt|A7L2F}jvQaUA0K{^Dq z=SFK{EYDSB3le8?6Gx1Azi~E>U5FaEiq>z)A#l{}A0iU%YQD*VSP>v?A{W9Fq|6lt z3nzg#T(30fb}9P@26|o;HN5>ig?BaCys~)dizi0r4sx5cJR4D||0xf*P~_@zWlFb8 zgo+I3-PE+QvU1$$&)CR8(QA28Rea?>^8Q<+M~hj7d2RqHcVaZv@qp`ss6m&81O88;kYMDCJ961@;gJ9o%=G zAHdhRmoMKiOqKgTmY)2iH^z|3%5+`$bf<87%_hAaRV4@^#I4>lA}V6xprTf%v?^C! zOy}m7*&J%*Vu}!9xoRJ?ZE2;gt(8@!Un?agm7{AwA>3BBo5|tXZ+x{7%Mjw#o{Eu@ zeD4pwrJTyutUW-!=x|wh;s&pxsrl~9`bEPl0ctd^Gsa}*#RLClX;`@t5wrUi2_N(e zE|us-C|r~S5s^oyBT9An@QHnpcN_Xig>;*?(0h;M)25A6tyX_(S4(Y>!1i~KuDUCD zD(Q)DGeOr=?L0Mm_}`1ZzjqppQhM3`@}i+QX&oO&eC6W{o_$x*#g~U#0}+bf*g0yx z4O4tB%d6LFE6U5GIYbT)pIksM;iADm31mdI;x$!2%M5y|6zGB25C#u%6G{G*oYkyf z{0ux|1!iZwu6wytSGN|rR|g*k>V4Z+D(JZlQ865K!AGuZjsjg^7mUySq{4jGA>=?< zT9$KCAvMwr*G%)1Uk2W#)dilbnd$sJ3sw$gocsWk3;CS-Sh0EopAJlqh#J&fO8Sz? zn;&IwYd`5cU=&FRtFWO6Mb5`|S*az)PW`SxuieU|t%@zZm!f57Pft7HzOC?z&q5`1 zEWEO}TfYjyly}x11s9rNB<&VNh}oJY2ByF=Y>w;;;=ol5XXf!K(z}XQKHzHK7;8YY zVYr_x-IfhSgk3P;3Hlj=`SU&3!WVF~3^8d5xX($k94RiZ#;tnTZk;p%x3_!s zjddc!nsMFP)~_OUXjJct_xJZBPEoxW>ZZ@D&-)`3ma>!`a{?y)7%`9$LVamzY31eR zFvE^#+~WkE6*)S6ocsd)GFZU(V{B%W;kS#IHR=e+K-4d{PI7KwY9uzcd0|0GNROAd zActlVWoCBfJ25+0){8P^tc>-Q;n|`xHYH)Q;i+d_@IU3sb+2k{ zM5Wv^xBQIzsR~UgQ1g4D?iTY+l=F$j*x0D>YY4AyVW&vZ@6+t)zP?^+X_31(LN^7C z#nvTrN%&@nw2|K|$w*(n+FBDaeId_S#bIVsQY@%5ziZ*5wM|s;J?K064^v~A4{t7a zv)_>H5f3LEa-KS$MxaGB-(KZFlZV#9T{PwO^)oZ0Pt5YuK$u!+XJ1+hpaH! zBDd{q|0(K^iLv>oD39bkJw29id$^Fmxp_Ii?CjpyRgIY)B^g+D*+wcxyg76ezzwtX zba(rL+oQ>vTEHQcIOpi0^{F|^R@Wwd^;ti`kLYvw(4vyh7B&_^AJHcYi=1rEpEU&A zWEF)pAROuUDw}zIp(#uIfl5k=@k(3Nmh^IK^_Sb)=vr9C@p9Xj-TqhAKgSx#-f4nq zc(c<$7hZ-&X6^RIdr0lQz7-{2I(&sOY42F-Iqy_Ljubqh`l?m_p{yL-e!APcYOJ?; z+1c$~y)&(Yq&|_nVqJ`wPrH`}hh>&fj7y)QzyFf;IHdit?=J~sb_GQx1o({ZI{oxj zayJtLOLTOdI-Jdiy(YrJ3R2Kl}Z7_I~&mrqR=O zBEI17brb8~B5 zh^^W7+0(A!p>B*wl%>WvE9?T(^6C_jydk*I92#?}=x?bMD}JVWKK{nqyx41&jK{R` z+`kJ^?=e7iiz6G%7JleAA7)f@7K22**QZ>6MKB7QKLW?P@+lU512 zTk-`vd5*19&qL%kLTL0WasG(>&_YzGy&|<5)u32Lf#PvkYzFfX<4f=MR35`0O0r4{ zqhk|n!($=h(o~csg*oNdx8y3IF&TQ=@!&K0?(O^@w>6FXV$XICGEbl5q_v}f)0ZtA zeD>TjZ#o$|yF2|@W8S%GJTq9uDaHg(S8bZZU5^<}X>@qoK(qos}Y3YRlt*M zY#i((Rz^k!?m-U>6+>1op-@ zP4&b?xk1WDLodi)gh=K1tQRxR!}~~H&F*dBRXTWTr*8WkW-z8j7G<~My=HU_+D|jn znHnN<{Jm?F3Ke0dM|HqT=J@ z55mI@lcc*cK^b}(f6d`6vG%EOlI)%`Nb44Z`tMU&~#InNzYk*kJ! zF!rT~@TAA21 zH+JjTieFr|SSj!84lr)?X9$)Ep^8s=$>x5|y&G2@Y`T3V9h>nfFTZ4GZ7Fn88p6AH zz(vEFx@BSU+udEF*Mz;bv~g}O?AUQQH9~hUQa3UZZJ(>9#^hGc5PIVl?d!RNE45VZffwqR;>PVBb$Q);-??m#NvG~e?G)Wh!4{+r#xvB%9m<{#tw z3%;h5BUwLLNbm4NK!95|aB+2x$7_`_@^aecosvv?{A!dpoAfz8g>KADAxAQ0qJ^XY z8xvRLFbc&e;?DNA2)B&19mY^#?d59DYS}RBQ(bQxG$wyOdRcnfXkS&`&bYL=w2wDu z7>Q9DHc&9;b1PY>c;? zh*}u4Q08-QR0GXh&*N6-`D{PaVAXvd==*+N1O-7;}2eN&f3HX-VqVb~(Vq8MTHn8`y zi_oOePTG)jy9E zGYUF2D{_r?OHb3w;YM)(P*zzP$co8qCvHiBWng3=`nc$;W0rf=$g0)s4TjVfw8`S= z>{>}0FV2#Ql+*Wmm2ZHb(o#Dn1O*KZt#Ek(LA`+50Hp4t3O4bVo@If=-5(N!LwjU` zPQUg%PA{|3I+rxK&^I=w5@bSCk&^_^CxZFlgQiV3b{07q@9}<|lr~w{BvLiy+)G~* z)}%MfBlEvMK6VUNlTHdNWXNZ#5F4o8(u>aEze!qi2+E<%)7R~7sdk{I6R_VrH~?Ye z#T|$BL^2&aEZr*aUHLsVrNuqo7R-Mb)|BFNbz0HE?(gqEg}AyNz77s-8&_BN+)YkS zf_wTj-OI;UZ_yulq()|L`ooRPiX+OSp7;7B1`S^QLR?(qWAkI<(_8`qUeY6U?Z?Lz zVX=2#2^l8LT)z}o;`)8wW+8X6kPmy}YSPCAa{3{rmnHIwFz!6&_9GvMnmN_ zGc->~PZXphOw;?QcU>;fs;^^RoK%lM8U$JY{o7sMDO~G(Ch5$8;d*Kp z|N8B8_c+xX(tw#39Guh9G4QciM?=X|Eu~PmuZ0xl^<`eJwc0azcn9ZPeJA-Q+pdny zolSb34mbiMQ^T-HD(^!}HO`kzBrJU*pq6(dyzDQq;x#iL7H5(=-s*T9 zk5gO`ys>H_0+sGM_ho(ihO_6`fky9RB3yhWdWpc;kDa z%{wyKoeq-xeR%KCB1cvTfHg<65%eWLXK*t6aO1#$w_y6x_HW9SxPR4e}LB zvPa+RR@}czmCSujJDd4AKJvvQkt5-Y6P?DWA0qB>?YEVdOj_+hxgvz}k( zktq6D;GyF2l))l-OQPQMUg=Muk+&lh1pX8~Kji$*rR+m6AMu5%Die3SvySj*V#cZw z!(o6vYSRu35i5i*sU?p}pbxWe5@=c`8=iMKf+Mf|g~OABFV+^}&wFq#Jv4W@;xpEO zy;Igl@W%3%I|i%1Pz>c5W!J_c!*<^mLf}dO3PNJ&?Cg1NkZdf63h_*s>mp%)1kEvG zl=uXpHPca)6}{|Tm|$i+*&kfWdaOjx@G7Cj?Y-V3g@R*bk@EJ5o_<7}a5|Qhw2lRu zQBMOw{aQh`*8U#9C9NG5ax;(t*ulZp#D2_2aDBzMN^__4^`_S;tX;EE!7spGSJwo6 zi?7DE@C#P6QX$!f3+JZ4g{UQ*S{nq#Ea6#$@@iGXixWJ9=93gG{cRE1EWhIIZU!;h zMS^&rAv+f@icxJJuc7#b)ljlP08a*6z%DVanWI#djqKimSP*4dy>R4m*rtV}k zeyP<&q7dzcvyC9(`#Jw5N{xLwV-VgquFq3L<-cjW{TF=uj#DRJE%;0xjrB|`z6mWh znViv@rkmRmL#qB>6j-Jx*sZC2h~V?oUZ=xexyxO3SGiN>8E7oDat_#-V|q)SH~v zXN1ydX=%;L%}GRlAQTsZ4d!y>&Fi8Gkh|DZcq3oKsXaMF{#Xo8c2P(|m*%$y6$V3= z7p%7o83kD-K3-K-MZb9;ZF4o5gD*C%-NQY)IqNLR_G4#K_=o85Z`EZg4rL#|2+ww4*M^-?(Uki5PcVn{kgh; zYE3;*a&jt)OD+|y8S7{thc;A$=(*aBe#>4%6^V^@^X2yT*Yrr6_nDb-0#9#mM`zJt zA1I~(ta~eEReaP{0|e_X!k^f2VF&wR6IpH>Cvm@`!i{35eC4G)az&1by9RydP$`RG^ zDKI$?)X%g;&q?Zr#x0P&p^%fGIMc)W#c6L}csN`({d~G~aC%yE_oIuugzUo$@^Omo618&DvTi)7*z<>@{;UyEotBNzoAo5fKm& zb(MWYP0?{A5{07(_V%{m*8)I8GG?nAYi6wM`ru-wS8pp%r!H=88Vh4XPlGFuH@CJB z1g%So9R^?>;0vS~hgK2=ye>OQ;T*cGSsy{-;^JKh!7mm%#l!0hfANT2bmH0?W>Zj$ zw1>m827aVOg0c)89$1D@C=CP_N=O4ZO{=2l-_zN5qcdf*jH_fb`(wJHXY;4p; zfn=tyn3$%gheu_(U4B(N4k!*(FS+tvyygv{_7BZSFYT;0gpKU<*u{x;y|g4x9p2yH z#wX3&P8z}BNYcPh29cJMO_Gulxm36|65-9at|%%g4G#9hx|mRc+F<=!*0C?9Cs?$rP8X8`UN6gf)*=ebZr2mwluC z#HN-uc7l3~Zza5iIt*9$*6Pw&juj>X-G2o z9+5I7Gw`1WZ@K=x!P|e?7P0@y;4NT_09*9`DK`Ra5nzh|TLjo5z!m|v2(U$fEdp#2 zV2c1-1lS_L76G;hutk6^0&EdrivU~n|3_Q&@J(3%9kz($Pr9c8TLjo5z!m|v2(U$f zEdp#2V2c1-1lS_L76G;hutk6^0&EdrivU{$*do9d0k#ORMSv{=Y!P6K09ypuBES{_ zw&;I*Tg3D44c`9Cwutjj25$jd1lS_L76J1X0rM6)0rM6C^A-W~76J1X0rM6C^A-W~ z76J1X{g-d}e|QVbTLjEo1k76m%v%J^TLjEo1k76m%vrc9; z0b2yvBES{_wg|9AfGq-S5nzh|TLjo5z!m|v2(U$fEdp#2V2c1-1lS_L76G;hutk6^ z0&EdrivU{$*do9d0k-IWdt1c!?+xDm%eIL7PX=!RTLjo5z!m|v2(U$fE&2l3BES{_ zwg|9AfGq-S5nzh|TZDAbdtXuthFq@15)|)f2_$%K0k#ORMSv{=Y!P6K09ypuqW{sh zh>i8%>!1FYaS_j-^iKo02*5=EE&^~7fQtZJ1mGe77Xi2kz(oKq0&o$4ivU~%;35DQ z0k{ajMF1`Wa1nru09*v%A^;ZwxCp>S04@S>(f{_ih>h*v8@>IPbrJ8MjNSse2+&1< zE&_BBpo;)q1n43#po;)q1n43_7Xi8m&_#eQ0(6m2#m_I>qEaJzeWX>{!YfC-Vg7(F z0(23eivV2&=psND{m<4#?EhZ>^uMf&`2M7S8qh_6E&_BBpo;)q1n43_7Xi8m&_#eQ z0(23eivV2&=psND0lEm#MSv~>bP=G709^#=B0v`bx(LukfGz@b5ul3zUBvOfK6=Z> z#Uf*3VP*~?hi!@5S=%|P+8Y>|ut=D=SQwe8NQ<$ESwNhWO&rDTZ0zl9O>80Lyevuv zHYO~xY^;AWc+17jCnV$qaWpZoL4Fq`88`F>M-;dFp8CqF!RAb#oXt`&CgZH&$XGz; zbo8kQrnZG&WkPjjkOosA8JE;cYW1I(Kgs1H6XCePnAlIhjHajXoS1sgcJZd{+E!#< ztn)7(jA_lz2dNzJ?7e|+@*v3sPZYiNEV3rEwn&)2um84b^X;kU%hL5W%9V|mwi%~k zY-GkydC5iwDw%xlL#CU-;bL9g%gjmkCkfgS*W???e8M@XDLi{M4%#;k%J7#o%w1?M zvnFT_Qw6E{O+Od?+%Z%E%Pml5w3ullJh#2c-*W4T3X zjK)RKdOLK<+&vcT+~-%K_JimQq7O~mZg0vP+tb$`$i#}L7}tuC2Td0wqtzMT=FPYd z^^Qj>3xI@?$c=ki|}njtZHTz+#bBcvSqC60l-nL%uyX z6-u5L`=e+?iQewu8%uAj++mf1JrlURM72J)G@;M?WMgmyisqXtWQZUFZv3xkVE5% zVLh3z*XNaA)2z=KM}-)-3}wYv+mz^VNHQ5IbkUHmzUbx7y zF+6H1zsMs}D`LysuNSSSX0G5PsfIFh-IasL3lpi4*~n?GmrRtxv-hpZ4Qo2;?)H;( zGW|l{viSyOI2uJk3@=X6e-nh2UCbey*c$(}48gYS3@wq_IRA6ema?;jNSHVoIa=65 z>>ODh-u_WIMI9{+tY3-QSsSxRSsR!+k#n&BaZpUm&P|(%lZTI-iHC=ioQ;!{m7I;0 zm0MRx=x-@-{c{Q|s?LTGcY6~SHAiO?wTF#A5|LtM5i@Wyc}SGy9}<+bHL^3dur*@= zS=fr&I$8Yvy_AKc6GYtH!0{nB3I>1OW@BfEg*1kkJ884?@RC0)99&%FTwL6LEWEsY zxcCJ7VdBBKjL{f{*c#) z^I+Q#d3;#^bhFNKWd z@8#)#v3&7x1Lf<#zkI>UGVB87X8mLRaDhF1Ve|j9e-EYkKV2bzyCPtzJe2Z>V>}!@ zeiw{%s!@7dts8E9*a(`iElv52cuobBOKfMtN?-5Wzo6QhUYvany;ABSbx$p3m#3c+4~tDyg5 zW=1IsYlsP~*0(l*m`IqwYF!f+1ru8{h&e2AcFuojf23>nInHw9&hIdmDVP!wu{76j zy{mrFVAN1rqLeoVc`P5(5lBTGQ<;6R_0@M8MTIhJQ*>%L)6ZxlV>ZX#{+W>1^#K6uTe6P6i->md2o>@Gv3BRm< z-2I%uS8o$0&1bDS7_Tc3#kav3*&cI6Na$}go4pAh%uQPRIW`sb$lfx}-dCJ|ICb(+ ztAP)DBCAA!oghcnHHR>0gys#;;_*nk!%j?XvhRfXaH$kVzN?IQTLOykH7{isU1&(L z_;c;WfyWDlLbeXm9c5Y-p_^~l#Ii#_6-fN#(=$z=;x zSBN9rw|U}eFaCs=a8MH5-0JE@i!&JZN8X69D4HX@L5aAY1JJ1R7iOK?U5Ci_K&ul;ij7jW39m( zLJ}-rcN3cq?C$U3$d~vF%+6&5Ym@|Q{UNchJGb{yb;BJ;J_O~<>ar@Ej*o`KO`Tqy z?B7j9_dZTH>~H^ov(AAc$qV`VR{hO*|A`~|;V!4t>G4bevqIgDsNP0hnRf0D^%WIk z!PJ5eDvq`iv%0FN))l%BGj8u#iiUbn>E{uV@^gczt?2&V=*h=dhZ2MR>Q?kt!uW{X z8fPl&LOK*KalQ=4#o*uNK~M&Eif?#^U%&!JosYfiuXumoPK1QcY}@C38odxg?+@ur zZ{}9Cq3o0L4E_?(65_#V#>%5^iTt!<<3i|0X(Pk@t%jlHg1LEx$FbUXEc+t4(4WMj z{p3dl8Mz@(1ga!gz7}T~cl$D13i}Ye*+fErLzfqjolK!rYxTP@kT}Er+iU$ca68fL zs6%za81&gfXG!boMe*0!Bas1bILT`K57?r#$EtHn7dvGFm21CrdXSy1)0<^}O1YD< z&8`2A@6~62FOq^>0#fFTwTwvXmnXA~*Gy7j(U4KYa~q0y;lpijyK3=tS?T!~|3}`M zPwXsuv!&9BgdEETG>SMGa?{igRYaqOl8g%nYV*=WJ2CZg^(Y_*txq5`UmqPMC#sjE z78a6bb;fIaLs(XRZ^%*tO{J|Z50)LQoT}4+_pq+;n()|%XZC&K$Jl$-QMsVA^&I*b^iJ-VqN)jy#*TvqA0A(n93KVRg8uN?G8H z2|;7N80x{NfEUm~0xa@&{ApqO(%$?$A$*lvr{JI?gzZMtuZ4pd+u7nVI7k9BAIKj| zHGQ0^apQjyys6SMX0?QCM?#kEpvo*!3idL8cgaBHdGq))qNXuff3|&nf{-eCwpT!& ze%ro@OYxJ2iEr;Rt)|B?Fh?AnS4XzNLv08luI*w|>zBE1{gy``Vp9gU2&X1t6GzI-a1-I`}7 zgEMzM-1xRxyskLPrcGBRe4cs_)1_4`n|Uqmws(E(mq$>rH>rcsMDb?A=}d|8g0uw& zF`c*-YiP|dh_!87`X4GG=Wqq?$H7x(w7(-tj~Ka z#QDP^2!5=^4x4x%3`sHjUp~EQU}YtgTqaaxaKaZFTCAFdG~O8wAKX3Hp=y)qAf(ae zVgJp8sxaZfM^K+IZK#RC!s7nj{fAHOXjv%|lFFEeuCC(IdqfBqZ}{8IpAP+(No|=D z8QJ`W6o=$)2$DH=s%Z{Seo`!|+$eqYvBD(`?iM9Z350OAB&~fRU3e5^H%7=F{+*v% zA^YsxO=pCiO%BEz#J4kbJ&BL-C|@@^&*3sjJ(Y8-2nswDo@?U%Zj3<04f?@vSFhzqOcc*vO;X_UxV*$%GR(<(+S0f_ycTd&%V7s+Wk?{ zjr4@*?6Rm=z`oL*OOb@F1@#)DJ-AdPHa%Upy`EaP9sTHXk`LK;#tvh&IvvYk7_WUl z#7B8W7!pg+Cso5Zeja;U_SI5TZSyrFJI7XvE|b^DVN1)<#`8vk`&ZwHuvchLm9rOr zRut>MDykTLrIDrNbBmI($wG}|7%O=ADS9}#QT>l{z+4Vmz(z=ni?fqv#_QH zruQW1S1v~nr>H$*3J-rXRpCx;tYFIEYEUd)IGW^ZDwE0E>^l?D?KVm4Q2DPbA-tUE z=w%HXubypn|6o-;$9`FX7;*Ym79uKRjln`ha$ zd4YFVZ%CQQ2MO)Dk|e~s4!17mRGdwoT`r}AK2SDh#)PbC<8CJ*coTyf!^Wvs*DXjX z--?7wE+NI3e6UDA^tOmG@8^EQ>_tveoip(yf4Lcvk_!+QV?!vs=^2ND zE)&ylOpvlv`6*C=%K^HNr{bwT!=I~U%CHAIX<4GMf@VVO+_wknUazr#%UmaUC)HuV z=R#=L;W3iCg=U!J(KPxBW3i2IPuc+x;BgM%@9u7kC5 zak}zjJo3N)fbG4wZN#f21BAf3reDc;> zBs$KF?`wuNCd}CH)oLzIpvw|j&1pU_q%a^c?6(IM=S`%`*A0)2dj2qY*suFAP)x~Z z=$Q8FA30t|yS~F@bSJXW%?BO5#`LdB-o6>gm}zh0%+OsuQb~O4ba}eYL#D!B>zxiQ zyexfKDi^35ah~O^0=RtTGmudAA*BR;&^de-GGRs>k(f<4=XkdVPBg6(j!s|gP_LzU zQ_3_!cZV=v2TPQtj*MyJtFs!L)nyY6h=6o>64OQm&1-xXg2p2GmgWMCJg5e9S!Kb- z&kPE|pGMFSpKHOqil3tk>fY6haawX_soQ6{X<^%0Nh3lL)|u3t!mr&g(h@O=Hkh-r z$w{0x*IGU%&%Sqfm0L`n=bdy7dNUdk#&ULCIfD|H>&_|eAdX)00Xinab7H2_d)m{0>Gtv$U-q{E z!S8Kz!VHCE&WdewW|-WFR?@j&m{Y7AG=-uvOdjGMcURR9i}D&BOktX+S*&4N&Ylj@ z2z0bWYC1O>`$Q4M59=mmyW_IYeis^zKLXrSuXEl0>J)|x0j1;05*p5r`WnmBJ7x6+ zI;vvLzf!XA;%HpBzdgVvjPeedrcP538e~)_O4$yeE9%;KQD@tdv~+Q9vRZc7!$|2g zfrTec;+!e>gLQWIW}dw+qTVg%rMA7jP~=lmatg(1Stijk2O?5qLZFR0@2CN!s42$a zk-u7+XSO5nte5L_M8*B_%IYbu$UblFQ%ZBhqSLlzV|BlsqpoLznk*TDayO}xL@c6s z>l9{6l`y2uvpNKV8{3OwRUwwpf-2+UdF+&gsRkP^wG=`N%#l*91@Wl@YC zxx?M6Y}lXD2)-{^T#?8^W+2dbMcm|NzZ}AmNaj9c(dN|r{B#9}_SMU(;?H|j>SCGB z%~ZDX8_mx}93b3d{ATm;vFdeM^}TLM5Yw! zracFf?+pr=j22*%N$fbt@VJNvB-X|`N$_#+ygBaBON7$h5@z5g(5D+>3 zZejP)J$=jty}ERfU^vyGebkavZB9~2hg#EDLQ7xrQ}9rJHrRHKei~Md|M{#{|CyPh z`ecI)LG!@5&ow&5Dtw!e+NQQz%7PUG7$g`xN*M6ShPMFqB7cm=E5)WEKakj!e=?vp z*AheE=^~o4|4P7?@dlQz2=Jb%#ari=GNMHaLlesa4>O}J)|HbcD?hn zfJ4vJeHI2u5{Yh%fYxpd$47^lkzWI%7z&{QQi{E+QW;Z0FBOX}AABe>-G7nj8?tIg zRCpJyvkzO!y965(o1YGVSNgQYj%Xx0`G_I@5FDUK*l|iq7{GLD0hyHBJ|*(mZ0!Gn zl+Hf+?BdFRvu%jbK2m3VOMTAH;Anrfg*4(+8C%h2;H@2MF7=fQ3qFu~nsQFic{3W^-|b5>{du#XK2dO1c{$@`eY099 z*nxH432Pw2dP>8eQuckD%J$SDzlaL;v89H8OCl1v%R(!eq|?IrNw(_I*Z!m7L%YwJ z6noQZ)dqqQpHz~xL(=q~7{7|U6zBPLSf%{NLCZuId9JsX+X(l1x6HiYZxL3+!MUkG znh>SMfqr`9S$qBijd#|c@!y0DzkQbWKd=*me=!XIO~?QN{z+NzD?oui*^*oC;-4YI z-?f+j5HbjX1pg5-d45n{MKj>C-z55Ui*>qJ~?p=P)fN{K9(T4V^gR$W|kOmWwznOKfVXSqyb-xvL zKn81@rf%DYn!0-M?=AHuOK^3bUoX1o?Rnt(y!DRyZbZWP{9fks(*4Uoj8aCF*o8b{ z$_#Th=l$p8D^(sMvM;UShZ&||6tOb31e2F3E+g{zdm9BI^=7-OkTu-~{{ffLmN-$r zKB8Ua$6ic<0|p4=$%RSfsyr^=6=7R(X>`J_-vw5vA%|0)cpwE0P#nCxLOGJL7Yq-8 zmk{Raq+5N>hv9d60GOXz2;dh!ad75~kI5x9L}Pt;A6B&Hr9xtE5IU+jm@@%jYwA#o zg6XkV{y`V7|A!~9u2CpDZv^u*ZFDd_2RDa;1(O!*A@+?^6r_7}U2(la(_A5;TaI0U z%=0~4Dx0Xc%-MOvTO#S))5Yl;r%>(!Cj*Nofma$E=Gq^a2cBM2Wo92dAF{o1)2BF0 z2;x{PbTXu2%`mx4`o>nwX+}$BR9{GHB*kh`s0yDxB!TQcp_eNL+s?kG>dq)|>=TtY zSzobgGQMAvof%M<6mbtxKB3+ww!d?h&?)4R`c4^QV zHWq(HW$J*ViQMsK~_MWt( zK{y7x(Md#+pSWSW^*c(oG%b1DJ;M1xLH|*g-F9CZ7T2Y@*&Ac!bOldvX;qj8@LA)S z+fhX;jfk*vJZF!ZDG6SiJMkS)hQ>_H!4$Q%H=HPvd-J+-UAIvU^r|DB1Sc2YVWdSZ z(bW24if<^&kK1TG(nVqA+NAs{%Mq0(#ja&X6$`E&%SLd54W%m<k&GqzF9KLkAo(epldDDqBgwzW?s9{CRJH65-&u6HAM?2J@2h?AsEtG7vJNA=KZkt4x|9m{#duTsQ%Aa9CKp5CYml_z zG@0ZV`7>mX6My`!dxfFchHT=?+;UZN$}i9C?SsFjurkENIETwRbX3mmZKExOr78{` zD4d1x=*J!i3$FtT=NDmWkt%x`0BSIffdv6BmV|pvi-exG?c$w28L(8CsEROcQg?9o z=KKf0!ahWXB-sRY@EjAdqE<$xhTHmNsin>z-`V-uS+GTtFuFxF9wGGSI)MVYfNtT_-uX-%>aZ zx~>{}!`St?&@2DhaozQ!y50zzviZ2u66L+mu*1P8;nFke%*dv|XFF`0kh?1z^Adpx zMjkOLLmsT`cb{}{CXmmqZ&{$O^AcIua(4K*z0b$uig*KZP%syty!AH+)U%z*sr$^zMWcQuPHv-&rMRNSSQt8iHy3Yn+@=fq6 zVfeN{zGDOmnw;8QPy+KFn26w;E2tGP#^#EcZt^Krb+f_th{0eQd`%@|*O&Coxp22F z47%D@rWyeCMsx4(74bBBpq%UCvD}w)?}x?R*X2T98hiZFW=EPRPlFDa>SG8?-9kT& zp7Zs^COX0d%d|pGs$D!-0k3^qN4I0WAbfD;F;AjoW~b+4dtikVr`|=}2MO$KePm4-(Wc;M>1(nZFfG{}-3}SEl^mxJ)77U&R20+dAgYwEs7s`FF|nKln_L z5cD5DGeh4I%mOo!5Eez9hYxV&E8-PFv-#1p=_Si0=gd}&Yw+%LI zlJFm0S@N6?}C$Tw?}BYBpGT28}^9RwyBtLk3Z^^D+x)IdcQvWc!Ieu zr-;_wFUS_73(oUcI#SF_`42Z@q!7ZY@-4Mtti`5=M&yzfNVL+2G6gcu>lYuRz87W^ zZjYZb{GPF}LN^!Sg{MHgu84|r=GAWeZW+yZ72-iQgo?XnOHR8Em%l~{T<@livfST) z@#C)dnmD%}mdqu30Z$`oG0iG^d(?t*k_Ntq&RGawV*eY5*EmJRYxAf+Z7ovu5R)ZJ{*{U07$E#AtEdwhLWcYiUjgIup<`NGwq!Pq*#K&6j?={oOX?fJtUr zWPztarB4vb2YEL{6zoy5{dn)~LpK+YstKcr=Hkc1Mqau)?igdh??(sPzG98M97lf(5;IT8z> zRV{8HdEwa>9OJ9YwYB@Zy2!ko2Q@6@ijDI~s=GT3`caaU`<@Tu9M{Nk9Y~Y$+|gRi z%jJnv%)%u_&5S=!C3|BONPvlHI9v_Mqqi(!on;QXMTM-wR$_|X$_|I%9PN<)y-)cC z9Pi^Ybk&}M1=*X0K3NmYx7L-K&U;QZnC?G2e-zs^br_5>U5Bum_BJ`88E@AvlTAm# zeO?$T=Brw%%LlDb#jC5t%UWMq)5+^gOwYd%h1W>Lt(?tJq5O)*i9Q>wJ(O+wJTA^v0@dM5EaqzJQn2WO1`IA)3y{s+NiJp%})?=?K;2XI!Zp zqxZ?fA-(|u^6(;caxoWFIdRUfT6BLfo^^q1{*BT7O*`*#d(8%zS=LTK<+J{09RpAPD}40WQ;1ak=F=TaWd2K$!{@2WjGlb(+nq z1+n=MYEvK?#jBtY!T_rY{|WzDEG~_)ZflCZykJbSZ)dv}%ND0=GMGCYKynfvbSFC1 zcvcl)$1TEBHM%pEy+4 z^7?zFkkx$zyNr)(e*5jxPrI?R-*Kk76 z*({x+ziH5AZ`Yz|P4M06IA?LVEKg&n_u*K=ii`Anl)f8Q7`$>hd0uH12#D`Jvq&Pm@qNl4V_{^SW zm&U3}ND-fCMkm`6TQHR5U4V1*1BV*($y9kI>_FAV(sxr8uZ_*r^ArV@ajfBqHSo&7 z(pN&+>63Hiy4s9-O5f93vCFm|f0J}&>U?OCJS*eoIZi z>1m?Kl9ey;8c|UIB}W7_2Vb|FZJE*4u0ijn>IjD4-0*)CVMwPfX#t*+R3uH%7-2o` zB8-2~YZ}Y#`c$z!RQc@VXn+qFpiyoCf!%(;409#>c($JSk&j22``FM`^Yy~K5bj43 zF}6i{!8$vvCE%K*X9276;zCxexbp}hF7d1rDmDdzL3UoS_-=OlER$RL1UjAivPokH zVa|dfseqFbN49wO$TrFq{>(4L4j6e&T6w84mNv&c=wg&u7($kdJ{nkS_?ocdVak;L zIQCt-adjmzO+@aeLzC9Ppvrp)Jpt{*+!2_p*^lxq?4%u3_%6~~v3ysmrst+2b!W`^ zLb$hyLtVtYCWcb)Lu&g+;VK^!Mi;8HA6_r_+XcvVW;yN5rbrZT%g`f^y*&16Yk_63 z`x+O=!?`Hh;9;mRO3uOD9_3*$MOQ$yv_VtN8`8e~!Q^q8I!_{(Q|Cwz`c^y-wg*@^ z6lFDsbIf>ly!Y&1O`fN-r4|0I;0lH>@c#`c1cid3Kr7(i*lig2vjOe@#%_fvzhfZq zZIJkDKd8vhV$3fX2n@ZI*!+fxfCX=($zS>j3W^BCy}r6@ozp{tYJb``Ls< zeoBmfn@MM8*c&s3It6VrvZB1?A!0-|YIwF3e(f&bAOTPG&g^V<&A^-iHIo z*d7vv&Dj4mpwO27=VFou|uv9Yi) zOPg4jnM24}**RcYTH86Q+8Y>|FpHbGSQwe8NQp9wT0oqXO&rDSZ0zl9O<+ahVOBJ- zfu+O3ENNj4F>z#;v^Id4h?^MM8JjT6o7kGc66WM$;}H~ef;gHO*r2=%+|xyNQj?0k z%SJ!%FXQ^Q>lWmUWsSAsup3U?-`T$F*7Z(bSX8tE!*jh zBWx5|oi008T27uNBcC;Ty}++&sA75<+r_LmAS*zOK@gzmygS<(A2Cq;DOs9I?wp`W z*;=C)!lP4jZT;ct@UMIRunt?B10HbW5LScb3;PDgZo*X9e+WcSBFD#F^uanmj(W)n z9@hUCuA&p$rNT}rpW0qGHD<3X#|t~yZ`vbl#BqabK#|gT`Tm-(t5Y>EJ*4n%tM=${ zv{lyF%8WYfjMc#21*7@e+A>Jxdh@yW+au{#YByHw^8=mQ%i3D zXd<$&qZXIEK6+59Ou3A3g^yfU`Au8X1WUPzR#q=Maoph=-b~tq4m?vJdBrGRu^n2p z!d)XN zS7P42lNC5iZu-g-QvS4VY;;?TqpI;m*b*tr^yxVXuWJuj!kvd>`QA&YNzK@)Kt9W@nS7u8q3y1PBYtgZZ6N$`|QDW|RTnaUD#YZ!E5VlAWX{;Hw- zxK|Gk$$8p^xc*&I$WiH!Sddd6y|u}?p9i6AkPhA)rQ{dNJIJ1}a8Vqnuem@2#BN%w z{v-jEB!0tpCQUf=`@su-t`19P6T zeQjN^oycb(#Yg{XZCpjb{M@z|GtJJ@n}h!=e?W!VZ0C2k_+Q%7DQ4F`5c1URas6nd zOssCM$B@w#yhC-}xVz=-tP$()rkDv0h66u-wNq5O*#csT&p`aVxqTEl16Oquo5Px+|U-IZi4&nc>BaZ z2A_7#knhnMuclh*4Hjd-Ha^7>qjU0$Lra(6mGkxm1Id*tf&KIao97h*HsAsKy}GNm z>`%<1GM%fr?Y>`5VG%dcV(_(r6I!~nCM;KN-6W8CPT%~b{=<9CL?c*LJoPCV8M=I= z+qk4$Uh$F*e2DT@BGYkfJsw-@vx>ux(S7wN7L`14N8xHO2v|gDQV)~xpdYa=@9kA) z#9fZ+po*z!EB)f-TG7>kscU7hR@&qg(P_tb_l{D+InPm}-YCJFicXgejIHac!F#$} zuzSHtueh2VULSVZw@8at9PI1-Jj%G}@4b50d1k8k*ZU_ZegstZgv@yZ^e)Ula3`>c z1E;6c)yVB$NQD>-9Mc)jtD0AW_vAx(6?ysycO$3;di89qM~jF2$$VTkL^d0@N_2C& ziW-ml7>5~Of{Wc!w*zuP!A=2itV5&>~M?eiyQN z^~_O*S$P^0K}@hoEoW7x_E9=A^zOhV4oqJlwpGcx^R#Y0Qjx0%X{@D6NJH)0@1wCR zL=+AeUC_~n`Y4}yVyu?5-Z-a78T{Utk-#$WC$N)ldDqVaJ;#}b?TmDjmmkTAzB}_i z=_~53B4zc`uX$@p`of>Z;>Gjh=^U;-4^bb}lk43f!&m`zM@B4Y?7U?XCixnqqCltM z7Z**x@&mD9{DkHIKP>f~y0YaMd7tv1GRO?_yKus`DzJl8Ndn zzvEDQsNHZyD~r>Y*+MhPVRau@&lp~e0mZ;O>RYtyL4=_^(@p|CjKRS$4*q5q7IvhU znnGgqDhI}Ikg}WtiVrPWD|+zp8G zjqy*&^hqOk^D>skAL^Mp?N1R8YPc%?G9yJA*_rgJK3~@D3@l>I{#oY0SGT%8V}@f1 zb`i~Ryemz{7WA;+)hZt%>!pCs_bcFg7`M`oS;jvq($Sn@*!_+TQ4`hpF?Cb&yZ<@m z7-z;A<2r7}P%`?>udc+OmAzN#f*D+KNClryklDRP&GCfwLC$S$*+7 z>6^bwqb(YBx;khtHzV1#SyHj#WD{d--RNzLD@PV+b_`|S`(B1^uoH(2JzSD68a{Zk zI|=Q)usfo$m~9}>rEj!L1pVmL*!^g*NY87qWE!YO-c~0*`lAT*_}DRTizi*>PDkHc&zsk5MbWTd}t@5#^#M#!U?2W&|f%Jr!Jd-Z5=pziT_0{uv%S z06TDNkhw^-f#qGyT^Fq;*JrofT~yd_=$c3(Y_DDOnHE)AzTvpETxE1wkMjt~SwWVo ziymS3caaco{1$O*`eJT-`bGf4o)e1PhWb5+kz-JUk?yy?zLBYOrD_&zE*Cx=mWl8sm$9QF+=KlYD<(OiQSF0#eutE{iPpRdBL=N%oYsC(qoQuh_D zIiGzgNRRY(dZ8yPG|E8z`{@OSYtw~LSf9VQRn>U!cF{^a#{o#^cuNWJ(5Tsb(|4SNxNzVsi#g2qvb|Cw|(h6hL~KJ`QIk(2snzg5(F`s?DMyt z59Do#7h{r$W> zH3eQi^b+up(~YCU`$Qd8u7jV{ zr!zKugI+Z&QfBUWmhuF?D)On<9P+lh`EH%qGU4A8(f>&iKR%JTK{po;5g}ag+_6!b z;PYn%Bs5FDdZk2-bxyAPp9w+r!&8j8+^9(j1>u`S;f9Br5W80Gx4hcg)NGz_y^6}# z3}%Ej9%)uT*F^w`w4&j^#S$>1osoS^!YkXKM zJJQ_ee#0MZNWK@JLFv$t%x4?K){AZ?q{uTOWQ4P}q%Y`gy*wMgdDtc&ed#$yv23s> zLb^3_^IqDwIb)oty664NUCfX58MwXpTlAw!&JSQx(4kz-j;VCmr4xveolnq zE>fJi@TKjolOvzML-2j>7kmv0f|$8oBZlY-D<%Cl>8u%KkY$2TG^sJ8rDA{*2V*X9uCw>9{l_`Fw`f>}A=#98CE~ivfU{1kD_~r3* zRr8^&eON^)Q}naeNj+;DpaezWaNe9L5#ooSI5CVHB6R`0tSt)UnHB_-#+ zxcOCjSp!9_FFftnPxciBL<BQGMaF)jpP~}Drr%lvd$D0Xt zk4(kJVukQE%c9NFVQp%q_yS+kO{;D4S0m)FGkjcg)%bJfC+37lDldlUzQ%8GP{?OT z1>_{vXo6$7t+{gY>_-aa4SKx3HD+Cy(J}4U-x?Fo3Z{HUCWZv!egds7nhb3XwEU*u zKkMgh)1Aqnmw#Um(Vj-arQawgPbZKt*IEGGYn+SGRHTDOX0!Zl)4FMiX6@^sjHvj} zmK5{h13OL4oUVrN-yWv9iQ3XbE+(S`+ypZN_b%nm2BLYj9xKQgVwE>g;Q67OhzhEI zt<_&{Ke39<)?bd_l4KtstFWp#b?cZ($&tIPUqxxBk9~P%P7%(`)YBI1MoC4CuuAr} zI3;G((6J0nxaiYM#bpdQogPVBC$fPl(T^FVdUbT^A3VvG)-)VN?^bH}?ZaP_yv#ZN zxWS@FBEam&Y7P(CoR{0{jf>$h5mHYa}#1%!vUE+lEx`Z{Mr&yR-B;IiR zNVwrkdFMHu7jZ2p1T=}J7E^h(>Mf+aBTt!)x9p69mlO5gGE(MCtZXra?1k#FxXA?tVxl8ZL1X#Q6wHxCS#oyKk9OnrBz=tTH~k zjT^lq$c>g{gL+Q9Ft72VC`J^uPjyVQVqGWrmdx`ME* zt`f)lGQGjD#DiGeT5gEN7j^>(deqLbjfn$|ZCdr&b?3UCi$6FOYRMG*oEW7@o-ZsI z)~2S!)sHV3TudB8o}JWY7X~u6#u#9v;nhBGG^O<)X{SF$o5{Vvs6D@$2F079?hZ8I zmp1q|behIJ@!wLPK!>%z0}#=eG?0Y3duKjjLfhZhRKSx@2)qNwWG{N!Y4-aNkPu5S zg^{0UNhm9Qp~B@vwhY?TzLM~Sjt?jtu~0%=T^dl3R^z84$={|Py3kp$K29FVkiwYg zZ7+IZ=esGdIsWSyMTYv6U53A7l$5ev#p|fijqq zQt87c)3SW4YKH}$+Ii$oTT#yUJ50VO3D2$~CMflbMI1&!c(Li*l=5#$na$wCHMK@T z*a7Jkg3SEZVbjA>cKMh~ZS?L!efK&UgGH-NjfJmgcyD3XgQfT>(x1K#`HB9_Up789 zp5>hi2HQmxDl`8U_YV0*eb>;+pL>GxgJxI`!+lA|#G@qxB*P32Uk-}2#?j(5(Svm@ z7z*`K3$#2H%kJlMe7I%d@E7X|KBDlm70VfVA^Op9F)BFGEp8xgs)AbOJF(I9cTuY= zdO@Zflup`hw26={lFHUcpPcpuj*y){OA9|M+1m6&M4<1HTAL5)dW%DInDCf#1R0AA z5)JqLr>l#wf6FxQ7zN$?p$#Z1eazLo;3u>=(#p~L_d~Tr+`5oX720!C z9%8q4IPdrAB#H?ikE2?&8kg1UP)B1tv#GTz&{+(>)cbu)iwI)><0Snur9jq8lL5v# z6db<%;nnFm@ZU9Xf`2XDKbFR*e}n?-;{J0t@Si)oIsU!wX;@G7zt%m?`cJy2xj8sl z{!{lf66ED%{CK*}^e2T1j|Scl*U3gc#Z=>{xG9xg9^2Solzj<|nt_cMC>mw1Z*l8U z3PsDg%X}MgUcdW+hz-vtQuZ-ts=h4oIr8JjXirD+!#FN({KYWt`tRAD?maGU5o10+ zK|sN!QO*?h{l|q?|B&Qd?XV(tK3!B4OhTU9X-xqQRQeS@-DfD67#fMEqf;DR z0D(YTh>iqedak)~KE2Fdx{~tc@ni?yS5&`Nsky_|q+cV_K36yAW zOn7!FPA0a_|CpLeY6s6b1qN>L*nQN^ir}amt%JnA8NwLgI)KE}?z$AiUde@7f>vHBqsy*P#EG}`)eDg$B^lj9j7f!aTcN5`<4GAAiCh{1^tf~Qxm9(STuoZM zt0`kUuof4-&9Rlie zqcu_H7b-FZ@iV#cBSt*mI2y(-L=0R->NaE%*{k;tkqCD+m2x0f1jw5xg$M-6zY2qd z54L((DqV zp}>1JHmYYFS?T3q!_rIAA$3w6$@>DV$!jNozw>2}BHbtMdqt44*%!sL?5{%vBfF zxw&OBhZ?ziP=o*juzU0yU(LtR1$(xoU?wNt z`+;vMrgAlF4p1)IUFM&-A*g6-zWcI%QP03niOzXOpUAXu;MXJtiyL84yKfN)fs61d zgfBzjBOM3{-*-5oR)r0p*av#GVw_Y+wQ37~c%OLMxN)l0;z#LfsSV=a{_(!E_6p&( z)Wo-$!0V|t?&>}KA4NYtI1NTBzG{1QQD2;}j*la@lJt^$-&JJc)uGlvxWYF!_UdoL z$T8o{N-1%b1P@%#hxvmA<8xdA9A$~on+Le&O74VV@QEwHJS!kr>0L!BA8@v9jMbyt z(A`g#Zp(xq!A=>` z*qvOLIexu&(U@2ZOSG??N=k{xi)T~82MrGOMKxjLJ;V22nK{!jWg`3}uX)_Cy}jM5 zZ>$p$+Jx)Qx_%X*L#29GyuZI6ev0NvS37-Pb>1H?zm%!$nBza`OOJ_y7~(@sO)V!U zixql2;~vZZw8+sZY4Qv7%U}U-_t?xR-ES99YqSxNfrxKzt;DZ^sganNrulhAK|LOx zf*h&^)S20tA4F_m8BdDfu`(70!?Oit`gzyvTk-K|((qX44j(avp14ryb9JT933nbt zYG)I4h^^PxSA`jG*;zS`kIoUDcCD?4Qs3B^$rVA15(i~E>0LqG3eM=8VmA@oh6Q$+ zg?S>b5JwmLpW~w=V-peKACoeg`OX78+S`OYuEOC42ICc_Oo<}*ceVQHB*VjuaC48qOcvH|& zY+dpz0pARXI^vrpDajj#tu}ED4#R58WyB025+k^!_0)LQon;J`hRJz>F zRwCXb8vb<1aq4^;jvn50dzAxC99jo=QkB=$&CHBGG0RT{VQHbCo!Ox4@_QGl4xErU zLsPAI^wp0FuvMN>$rah_=_Fp^(;?!7x*8iA_xJaRypttLO-n2KTAVXIwQX)WsWvIi z7I#F)&k?@A%FoBAt@iG6Z<6{8lit?emPC8RD}@M!$KH2!S~EQ|J>8mb!4BK)GD4&a zT(-0Qr)b?1V{>q*k7PYO-Y?9OFtmIjBVmr#vM;V?dY$$T8#_Sk1p+?Y*XK@kxly{lF~ZI#T; z#J~~*L#Nhry8B0&TxpQ1sw%-C(o#{yC|gep<4JFSJFXNHJVKUl_tOud; za4;x{AfE+}Js4RqCpS+v@&m~Hn#Hhcf{SfX(U0GhX+9g0ag*S_W`2P69BXrHU68fO z_9ltQB^FX?ayLNX`&kXbz3ORPeJ@j1fCiJs(%HHZS&^CFM44IQQ#B z(z{AkZ_*n6bE3R5Zk=#|2xD*}X8$?CyWn{rPHIF?I7#VphIKd{qAQuc}FO%F{wq$bs!3@-ZHF2Hn z)z9!%86ela_}&If3+pv*bog>1R{+*?H}` zq?J18I=VW1S)$*$X*@Mp#VN)DPgic5!(WdXB1v`9^QeAz{rIk;!f`SnnoIO`1=>?+ zf4GTzpxa@mvq`9fRfDX8%=qL;+!CI7Tt*^vmEp2wF%z{0Re{s_U6tRBr;JY;{Ok}t z3(%p-(3W^yrQ?T(6R4H47Uwto@Q>fizi;pCz2bY;Ao@XBMNK}zHyqS^JzL#b1iK&wy+>qgXw_7Y zkCz>!cr^5q^kuMQj`w;o{Tza~#MSKH2HtlE5ABp~@56NZ)QF<&7Q8p~j)D8BW;#jILZBn4ZbU7Dkg7=k68K{IZdKny8@D^5cyJk6w!&h&O zn2PuEuht)hkBeMwz(Zjn;I6TOnKhlLR;c8qn^vCn*3JC6cztMf8Iqg2@}nTK*W`SG zV?TT^s`ID42*A&}hX&ZWSWwV0Vu%V03rEIA=GK3s(Qw4I6cm;sLVqwFdWwM^Ub>e= z>Hv8w$Vp*=8KeEq($BgoXh#CiNBv-RN|UURWHPp#$Mcr;?b44k4MAD#~(z1 zA0|$7WrWi8(l7qPS;pyBthE>XXlk^xx_CL~PKk@6o4Q3(x{tHsn%zB-pz)klT7%8N zN9fTTN=mAAW3z09mS_H4bY)g0{->5DP1b7N?^~iSrjj?Sb0Y9!yv>dY2C$6qiUKU3 zZ*PsIrN&F!g8A%jz@Q~U=nWi^xr>+A4$XHDw?O@Y)_$VBwe!8%cx2N z9}RP+ zz7@ByY_U?_*X3{A;71oE9{f5k`4y}CHP>!zRgmfSl~hdn=e+!qowcQqNht`=!T~20 zOUjmo#cy|a@m>?QmePh_ze0~4hf~6J_aby7BGC6ao2yN3WeuS>Zc#oSTYI;TohVz* zMHhk>{H)bH)eeFCSv3VyqrXINi$AA?S?vy_@J{o-2uC~Y8tuQ?EgXB?PqbV7!%&{-#flIdzI(@ zONb2HH&--PS+14IGa)`fRN6^fJ7z+)2zgte;yj0TX8{ZEO*#0`);(6^7{wTGHy*7p zdcMs2-l!Uyx1PtP&YfjX!^k<%HP+Yrt5tg8NBi(od^C-M1YLUQ_Orreh2)f^_=T5; zjW3+W#@bZL$cWFF7-@5-N8hPHRSO9?Ai_hlyS48tRbOH*F7{;V zytbBi9Ij`tYrA(w<2g%Kqd=qTvPi)}Wb)RQ@13^}4x_n)!OFn-vllJQc5Pa6-=9e{ zxPxV;5Y#dKHB@x^OACE-sNYb&A-tYWW!t1D+;Je?$C*HAzAYL*x*)=RPTvalT6Xb# zuXuFH9EgMs`$IpA!b0PQ*w_~zxwRX9sf)u5aiK6j}SEq zJT)tFjdDv%)yv^RbpKfP{d)il7L%QrCHXT0BLk7gMPD5=-6KaAZ)zY z~Ty{r#s9SJ%TgK>@Af>gpc5iHQmD zaByj!-adK@ekdc=(!ZuZ-bk-FqCV>RpigX2@7XWN$vHkYH#R=a$hd*gMxsW>Q|OIZ=uD6!m=ko@9B`-0QAZz0Gbisz9`ii2PhFi*$C43&RORt}kq zLIkur>RUFBU<}dj?h$R{P27*s<>ijr3Vbi_7xVL7`MsR1~i$Bs-jRG}YB>eg^%tw6dzV7c~ED?0pA*tfrwQE6WrI ztEW+pQTmc92`m@bq3>78ZoBzhP+m{aOG0;ol5MNlXnSbuX5LIf!8_Z#0X?F_Z(MdX z91LQz(!JfxljPSIQCr$Yk~mRSoyxwHmfAufxYUZ_N^0sFTU(pprULy#ghX^S9y3Gp zPigT2G|yA@lJu_2`CIgLtcw%s5J>_d>%V`y%Q=Nw{hUVvRD*&#{R@=z{)?kMiPg zr@O}~UXXgM)S#f8_V$6KVjT@d54Ge%-M(fL)Hj!Txz=h=9%8f`nopVkBnn69zTE8{uK=w#Y1^Zhqepzwh_GAty7esj&RnPl|Wq zk3RYPF1tc989Y7{^JhZtxR^ky3cB8V;nMuflYMPtLtWe)JZcpxB>YG=xC_nCGmC0N zEIhR9WBEN0?AOS~^BN2gzR~6$e&IXV*k*W$Jt<|Y8WaC(i&Z@+~ct(lw*yIrJxy`zMj zlb4g8Sb^Cl)@It7hrXI!M{zVnIi;oPM7XcT`@G;|nY|MZ`|qs_*extisi#=VYK}4N zHU=5`h?M!@vW6!xc`4drqN+n8$Lh^F#c&PQ%Vm>7$&wpcQz!9(MAPC7631Je_s8Sp zR|HB{&4i%RUFW{cZ{KkC-nWgMqanh{f{*Pi9YX_?YmdFi!cfAV+}u#!uN!atD71M; z3cJ!l5`PTu9hzj`rv98qg0l}h$2qiUSk)LQo?HlmyLIyyc31R#zyBdW^bjW07vVZwn!CB>)8?({*(8yf8>KmPLbjeEQW%%=QSHV?;0h z8A5HQqaY)4**ibMM1QhBxRm)=k(Q3(Q?uI#y+`r|$0)+(Z4*8HNH}3M%*moPlklro= z#Pbxzxp+bJ_4e@^s&8mDg}XlN>Z3MbNJ;gYM*Y~T5q*S#_~dhj=jQqJg1H`v3-5W( zy4{mee{OA}{#QSDO^0TlK(SU{{hC#yg@;aASKWXN$jM)J5()?iC}Kn&Yi!=so{YvV zwU~$(qQ7*u5qSRLm){bF#y*WP2=5zb*3?k>Z|W|;d7r-Hlu3qp@5!UFo@oW8kYba` z8LerWUt6NcRX>UXYTV5872>}HfR4%?UUCJ)DnTnb`rpwxu#UfNT{bU{#GZiaIkk>+ z4l>i3nqRxc#jEY&o9?xb)96e|+A^;DlT(`S!+wWQbLfT8lIt?%!?TaEYv3pJCZ_fo zp*C1rT61u55Rx4T#s*`9IURZOI;s3+FZSe>n%e;MNx^1Q&m;bZ`w!STuo%>jY(~L?;h2Zd6roq6VkrJwg}(VRect$?}EAitJc3t zQxBAwn1bq(`&J0LhVMsd9S{b*hahQa(nx0T7=DqjEq=*xZB&&Sq#`O z6pJ6$y_LKwHtMPYf^`?+Pwcp`fqk(FEw_ymxENmJMzT>bcq)%vkzpbGn)&GY=veRO zc8B%atr|RB)1sBT*Bt44`}!(g8h-ODo)&tud!Jv&HJaP|_0iA^mG+iFa0QwyVJ)vb zqw_%BOmoyP3Ehy`c~T{ES-FWby=RLY_V$H`!)4Pirb`E>r!|LvwEonoD1P4HH()SH zvyP{%u9;hy=fKM5C@w30c6Qc+-@?+marOH$wuCP%q851>;qt1oTIea9-@+>me2K9Y zRDu~j0sDQV7i$Y=uG<9b1Xz^GFH#nDUsF@9t(7wV`q+fMW^QJu^ev7A191=u5fMpO z*;~XE14lewD3V}rZwq0~A2cLwwz{!q#=@o#E@otS`~7t4;^wBIFectgdj8TlAs>*VZtboKmP z(Qy$z7V?_O+SAk`&Eg)9bqqY^)}l&9kd)b4j#o|jm-r+4``us~6^&=a#Kenungl3C zUweC69Bf^1w9)ykr4Jl4O+1^%DyN*gd;9%%sjuBQUWw=}xs~iUu2C9}^c`x4Z_*43Yq^Fg3R2jma?DW{higv!TBug3I-`~b3 z$=gmC!DLU+z)u8`l#))8kPy05xHb^t&9$s3C@KyP_QSfEPy<_G{aV&BFXv2DEVH9V zV^#32Y)D_WC;8rOV4e3W3FiunygrARn3%NNO$%p;$<~hQl6AnEN2@+*u)E8?(S9OR zOB*`@y@j_DX@|Hp(nc;WRdEZ`Goz!OHgPvRpZKXdsdouc$)I~A zisX!de|&iRAddbkY!TZ(d3X!hBES~?f69#jTLjo5z!m|v2(U$fEdp#2V2c1-1lS_L z76G;hutk6^0&EdrivU{$*do9d{r}Mxas7MU)Bmz9V*e-I(||1kY!P6K09ypuBES{_ zwg|9AfGq-S5nzh|TLjo5z!m|v2(U$fEdp#2V2c1-1lS_L76G;hutk6^0&EdrivU~n zKi(ES3}f_PVT(Ba$-`T~76G;hutmVQMZma4PQbWDz_>-gxJAIYMZma4z_>-gxJAIY zMSu4V{||40af^U)i-2*9fN_g}af^U)i-2*9fN_idTaR1B^Y3*}|I4)R_=U^7Iv$k_owKp&_VHP)Wu`n`GkrHJVwSYJ&n>dQu z+1T6Jn%F|fc$gIpY)qJCxcS04@S>5rB&TTm;}E02cwc2*5=EE&^~7 zfQtZJ1mGe77Xi2kz(oKq0&vm)cwEHF`tLox{g-tS&p&y33+N(17Xi8m&_#eQ0(23e zi@<;`0(23eivV2&=psND0lEm#Mcx%Zzif+0j_CD~RAvjU9Pxzu0lEm#MSv~>bP=G7 z0A2LoTNknYd;Qb@vM%ENC;iiaE&_BBpo;)q1n43_7Xi8m&_#eQ0(23eivV2&=psND z0lEm#MSv~>bP=G709^#=B0v`bx(LukfGz@b5ul3zT?FVN_W$#zx2&AZ(k2#W<`6R2 z(!Vxx5i83-d3ejo#VaW21aUMmut9kjC=olPgd>96bx(O^Rc~{qPsVB~5S@NjaAeFc zeL4#F9!uN8_xq=+?|~YO0i>LguPD`jV*MnOjfjWm1Y=>teHl$l<~}j?n(gFC-nFgB zxLD^~I2hBKoeNYs;NDY0Xnaqc0iGy&>rrG)YHjgp?!NBZrp-4vk5{GZtrRO8uWZv# zLs?0U;dn?#2EH?T-v>`Ofx|>QyOx;}>`y*vhhLLzB=QR7pe1wfRXb?kI4C1rQZaR+ zyUd!P*H0CsgUDeK%lkV4SfQJG7gjjvrX1TOjuUO?zWkH@Oy&cOf z3S)Fmf|lE%OQx=|Am={c618r^Gl)Jkb-S%GZ){Irdm!Uk9Qn9bv>a%r5Uls(rS-_Pc`a{VZjcfQqty*#`g3F{tf+35YXdM+&EB=Kdt+2?rFC}1w!uouB zuGgq}o@|ezki>htf^ICmp5+d!6zrM6=f$h_v8D=U?URnd6DXLYweAqfC*4E_cc8hk z7W(r2zPZ7uw5oXCE{lbnjvQk;t)pB|Dt^TAqR)_t%aKT z6T>=EAJ43n#c7ro^rM3GTZS@XtF4MOIK&zBqaAX93Gf!NU zm}qXbA%+*H7{3WZ%PxMQnAjTsIfh_Mc7~QHtQ`L}q0I_}HW1qX#i7ml zpF>;H&K4qW;$-A#VGpr$WPW)2$B1zvjur;i45D_{#>|q|24+rV>}-E*6cx2|(`Mx0 z<|Sj~=H?({<=|i;V`X9C(iIf^%gMv_k2x@_IvYaV?M;}~9Gy+n9v1${M3RMB)WFH) zAyekR$xy=9$j;cp){GfsVJl+mWbxPck`|6m5HWKD$A{9$8~k~hm5mLyr!mCbNt=zE zhwNcu=j0^g1gP;K6-sM1}kXGZ%R8O4|3mA6>7n8tfQ zTs~6{b^kO!uj5zwR@(a`r53@s?t=M;_ILYPgH9F`t99?pDks(tJRFKUSj*8Bo!gf9#b&HNL8Nmn${RbCyKf zp?zqfWwMgfH1+t_x`9Q8 zhCw>kU5~8kZbJ3Uk*J}f*z;<0|5?m6XagBdyX z7|BiDpDi_4)1|$F@9cJn~Y{&W+O0py#A0h{@C+Q?9^nw4V~U9#z#Hz*h# zV@0H4e}n6X-ly`cpqXFX=3Ji*6W9p@vL}g)ce%bt`rZj&f4~*~5PUkB16^|Y@ti5< zw9W3+v(Pa`^kUm1jgYg8^$pcsVDHRuR2l*};YYQ&U7>#?Lqamc`g6(skK=Q^wJ{wP z3398kb^4j|eRx5!=v!xN`*-+KYabM8(cQ7$M)H0YBjmAE(_j~nQXG7oo*@}<&nq#E z5Mu9&RqxKUtC3NgJyT9~$%bMTBBUZqIT7yo9YMs=rx6j=fPC(E-QXw6QJN)ZgQyx&|o z*mQ+n5!<8v+7^A*NQP$|;Q5moW$A-7;z$isui5yqUN=hD!Lp{Os6US4Z}TOi5Tm8i z8~J$39w3w$)jA)43h4JAPDNvvq&k5w03> zFg)7o$1ggu1guOb{URfW{CxBTdN}bLTK>~O-^ z$R}<#O=UGwxhQO7zt`U&;gb!&6?|i*RzlW9!VPvw4As>wI*Lrd^gZbEG&gTaqs_E; zot_=HoaBQy9wxiCYI8o)0R^|_HCJ4U{1i!hDaXsc<>Xv8?BJpukcPbeb~L51?8)Bq z=h<@h+1#DHbA;ZAOKJ=zd3vlI-uAcyEH}Q6) zjlV2QvOv!!rK3TfL}JR@KSi7}|2A5|(){vHMldhlvmdv1@{Lplx;<%|r29}_4kL?q z2&9Zn7Dc-gX96>r@!Pm?wgwWs_u5@@$*B$Zox z-`VS=vggo9&XZs5qNxs#YXE0Df`3IwC#l+v)<)azQ1phyFFn|v z_%yI9Q{M8ue6pZD;i>d`%NZFJ(eW$e2KOv`%TGiIqBgIEtB}ony9%B%9xl`dw)Bun z7;DXxAG#ft);=2>zzOrd$QWrNRwHXtnw|)^rVEE#iO?Gi5G;h$e(m%KY{j8C^!Yqm z17$tI_CTp?n&GG7t|Maf;vxF{b~TJKxVe|%m20o?qR3(RXKC*N2R)WdjP`^T*HIF$ z310`dRf#MG>8_KP>I_9kL2`#yBx0t%`feiFwze(MD)JHWt4k4Lsy(h+eDTG=>y+*^ z^WVQ#Ag_18R+ihmK_w)$|{YwXCSTV#&qlw9a(|OXc}a;`Lf zuH&6!bcxE+OTvr{BC{&<|-8f?Gd2GRp z$R~SuRX(|oy>Fv*On-mnQV?p`ismowlU<{%l{xvDa9A~hp@epG)n)iN(JM(t%Xj@o zl7#M9sgX{$pn7T0ZUqg0Ym3`a74*ohvc%;w)7t-$U}6z2)yAFA{4>zN zKlXvJ{oR)b{ogcX{?zdKcN#LVJB~j!WZ236Xz={!hRlEXk^g-|hLx9_{cjpFxmweX zvs}0j4Vm0D7b=4?EV60tdhq9;&U0E8dF)v`VwzSp{* zb~r8sEqE`S|$txLw1Mjzr{E z3vb@_hz+LpQ*E{n2lXxgoCKr!~+vVPMgW$ah53Q{6I&U4T+LDWt3sU*_ z8irbLAzaY?X)6dnn!g!XcvFH^OpGVwOj10psPH!1eLf?0t`!-`xk1ZpV?KgZidR?Q zUWC>#&*{ocm#~BI&svbG(SYgq;wg?Iq3}XAr*g(hX8Ec+8{4|#brMF=*;Ja*MRz(a zWU`Udg=b3?7FrKV zYsIErg4Z{Iia*WM`)Z0;_n~6#fe%8+E4L1`7oDMHK5Skamrc9n;+?Z@lQ?0nzire& zpb{M64eEW6A;3=}evAL*U?bm77W{+3LwVWOTS-4db&{*I3XBrWG~UB&?WX&w!3zw# zdlZaI;&01=`&st-_tbnZ+PmZFohEfor``yR;NN@e3}Q~P_P&*xGx>RK`{mu#+?}>) zDFF$Kj(#z(1O6Vb><}eAG|z-5Z_%zqZD(5;PMpMTw{JmQk+`)3BhM?A1DWkqTEcyH6G=4xVI``fAd2Kj>)EvtA1Z@W&hNeFWry zsqEHd%V6?1{4#xMn8ojBktD>?QmXz0L|6M#Sl0Next`IpGLtQYcDZlS{G6<11F+qt z#9j>!2wn|#Y}zASk?f3i_>$kSY9>YXnkAhSflysjq$FUUn&^3dZ*5-=bDW6IUys8p z62HYf{~>N|ns-kMFRZ6arTyAZz#`x$08^hQl^pk4z?!MAyXv`SDVCL)QQpy>Ezf9xz z=ySbCZ9etv=6#ld2oV+ypsPHcXz@L(Aby`uA$_Ufm#da1jFb4uTtX`{eW=t*-RlAZ z6?OK;kG=uj2<;O3M^JHWQ~R}UR9l8kpPCgu@cE3cQXZef5TtCcy->!tn;XtI+NJf1 z`{tt!yDvR25{$d8-j1_l-} zZ=elid@>t-zM#NAoD?W=%f z2ACJ$u6BK3y8H}( zoabxa$Kf=%#I*lFfY?wRCeo1iFr}eE`wZZst<>sfsO+b=|H@#?qdQfr!@OKaYpw!W zXoR)ML>k&`1ibff)cXe33j=#`1A>aJG8#c@5J9e^&sxQ)v`L)&-h+wHC&(Ga zc$X%O*Y`DW*seXsNlzPOwu3M7ly@*C$&o21|l*^Y4l%5h2HSJ;mZw=`hl1K>dI4qc{#wJt6hWrQ~#D$RTGM;gB+~mX2ef%B4%bYW8wZ#ML+DS%m=hC}io=*b2_Sops2%}xHOC@arYpeCY2^wH1Kk!Jjr zuOqecM~QlX8Y77DOZKv@ruz%YV;+d;b;}uE5j54%2awzJHKuFPB1kKCGDOQcz)3|?V z^P6384=ypdd}|VcTFj22&Zs)*)S9d}k4z3~cW6E5=2d}wkh`-B5ok`I46-3vAmxHO z9%2>1H%YlBs`c{2)7vw7Dc$BN)H@EQxwAPH1)f4sV{@dTBNnnSW3`vI@ez+wZt6Uc zwKf)RngN}zoX#J-I3J$OI4}ktp*PnY-~BjzA^X_|Vw=p+;al6O}CI8npe1CRVf)u8G0aEa(xAXT>`uh0B2zK`0h zQu&#QCy5YM>F2{nQIWg#sF--yWXJ=bUa1=N zE3=!7s{3|v^dy3P#$t5Uw7c553!l`U*NRX$-B1@-s+7s2U9||%U{qP`XgA>9maMM` zCKogSj#S}*xBRUR_prG)l6yFEuFQX`t1Hny zGee|#h$KbRHgHD5cjXd^>!KMDYeHGn)7c-B;L-wV`GrFuv5Ugbu@4pTcvKpF-FW)u zVI}<)T!uT%Mu;b={HfnR1{_6>^B{M}>*N|HVT$It zj+k3W05ea*h0Gi8u_;jOvX((3=s0+9D`>Z$-2}z5Nc7ER>9Aq4%)W)H#UgVw{i7(J zKxz4x86r+9%lySuP5b#{wcc1 z=1Y|=#a|8V;j8ko#y8bn>zyt6gxk=h0(@k2 zr(%JtM}>Gu%6fxs@1ul*NszjVxbwQfjqlLG*b}!qnl7Pi20I1 zcn?3JT+ajP7QcwpzW3H|({&7m(zKjhjWJ>@dhC0yO>=YNdj*6nttMc!HPzCv8nmM) zreH_BknC3zAhRC-ee`j4XXwKLz+g$tSeaZ}$l_D+?F*px5>3tDP-9n=?f<5c|3Hra z5&VP!{`h}yOeezug8yXLmSZ$jG1Qx~vaaZ(Dmh zb6_1($0P8?13j5z6U;Lt_57QZ7xhG+!&Ftu=WwK$V;W%5WYF09m^pzeS6{Z}Tif&D z7oDg!o&FwZJ*&Tyfi<(xi)F5BLJE%L{$6IwRRnU}H)Sbr4w%ORT*gjM&q4#3TEslW z7FfKDqJJ!VuKM86SCCiK@fYZ|*(ED#skd3U30`h1t#>uPZXu~yaa#4qr!+< z%e$g90EnM>d&Ktx6NDt%&-q9P#}vLN3E=)=&0CGmOVI_i!)Hkaw+)>M?@$?( zQ1@0}7qP*n;`-=!l=TD+a;oRa;b{Z-Vp72*yCH#c8B?Z2gy;;!*=Zz)9Nb4c}>$J~|NY5g) z+tSdL-6lP##~BdvsytDwnw8~X}V0}Se<$aC1Fu2 zrfV?8u2AqETDZhz>C|o=1O>mH*sTsG+DaduiSHqUe?tIqIdmdU z`xm!Hlqe2GUtd@UwyRFq-`=XM-~61(8Whkl$@^6xA;<3acW?H~P7Us*Z(lB4R|A8s zB^?RkusvG1Zp7Ds?PP~ks*f~Ha!YGfLPx7iOG9Hw&dg`qe3Lhj(t5gY_f7XXZLuG% zl1F@sOBfiXvq_mM6yr{!pp76a8f$nGK#QvEd?DV zSg-Bm#X9wnpD26cBWnv((QvfG&!s&KKd??uId7I4zZW=6_(r+tm@8xIQ4?Zq^CYdJ z>{KJx(%9pBMHs-jiGu)m(?35P-3pdvk|D z1-p>0G&}aQbIR?fGa)w$lmf{~?Dzu&YD^uWZe|4bHw{6T*ZanPxc}>I=;>@>NrZ6< z!HGcsw*U|k5wHlr67XjXGj)G0fc>8_jHBXeOc0Ej$-n1`z<)^*zr_T>A{cMTl^7f> zgaH`8y`(6<+R2Xyj|8^e6!2!N{9t0{V za&<2R3j5_@`E4%*2Ki;0x)Ou_y25{t!G->%7R;*&VZh3jJUGVW_InJ9v7}vnF2>1) zvF%;S!-TFr7b=WdSM!7+psU{i3K9P0Liw#0C`1Hy^_xO5ul6tXLBW6B>*{P`V{73| wBql}#)Uffk_|;cHbq5EGbNm- N EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) +def test_summary_2536_normal_cylinder_routes_to_code_2() -> None: + # Arrange — cert 2536-2525-0600-0788-2292's Summary §15.1 lodges + # "Cylinder Size: Normal". The dr87 worksheet lodges "Cylinder + # Volume 110.00" L on line ref (47); the cascade lookup + # `_CYLINDER_SIZE_CODE_TO_LITRES` now maps code 2 → 110 L per + # RdSAP 10 §10.5 Table 28's Normal (90-130 L) band midpoint. + # First cohort cert to exercise the "Normal" cylinder lodging. + pages = _summary_pdf_to_textract_style_pages(_SUMMARY_000889_PDF) + site_notes = ElmhurstSiteNotesExtractor(pages).extract() + + # Act + epc = EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) + + # Assert + assert epc.sap_heating.cylinder_size == 2 + + +def test_summary_9421_normal_cylinder_routes_to_code_2() -> None: + # Arrange — cert 9421-3045-3205-1646-6200's Summary §15.1 also + # lodges "Cylinder Size: Normal" (same 110 L cylinder as cert + # 2536). Second cohort cert exercising the "Normal" mapping — + # pinned to guard against silent regression of either the mapper + # dict entry OR the cascade volume default. + pages = _summary_pdf_to_textract_style_pages(_SUMMARY_000884_PDF) + site_notes = ElmhurstSiteNotesExtractor(pages).extract() + + # Act + epc = EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) + + # Assert + assert epc.sap_heating.cylinder_size == 2 + + def test_summary_9418_large_cylinder_routes_to_code_4() -> None: # Arrange — cert 9418-3062-8205-3566-7200's Summary §15.1 lodges # "Cylinder Size: Large". The dr87 worksheet lodges "Cylinder diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index 0a0d5e81..fdcb2c8a 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -3401,12 +3401,13 @@ class UnmappedElmhurstLabel(ValueError): # Elmhurst Summary §15.1 "Cylinder Size" labels mapped to the SAP10 # cascade enum that `domain/sap10_calculator/rdsap/cert_to_inputs.py` -# `_CYLINDER_SIZE_CODE_TO_LITRES` keys ({3: 160.0, 4: 210.0}). Exercised -# by the cohort: "Medium" (cert 0380 et al — 160 L) and "Large" (cert -# 9418 — 210 L). "Small" and "Very Large" labels are deferred until a -# fixture exercises them — when encountered they raise -# `UnmappedElmhurstLabel` rather than silently returning None. +# `_CYLINDER_SIZE_CODE_TO_LITRES` keys. Exercised by the cohort: +# "Normal" (certs 2536, 9421 — 110 L), "Medium" (cert 0380 et al — +# 160 L) and "Large" (cert 9418 — 210 L). "Small" and "Very Large" +# labels are deferred until a fixture exercises them — when encountered +# they raise `UnmappedElmhurstLabel` rather than silently returning None. _ELMHURST_CYLINDER_SIZE_LABEL_TO_SAP10: Dict[str, int] = { + "Normal": 2, "Medium": 3, "Large": 4, } diff --git a/domain/sap10_calculator/rdsap/cert_to_inputs.py b/domain/sap10_calculator/rdsap/cert_to_inputs.py index 3fb0817e..a4346f4a 100644 --- a/domain/sap10_calculator/rdsap/cert_to_inputs.py +++ b/domain/sap10_calculator/rdsap/cert_to_inputs.py @@ -1869,13 +1869,18 @@ _TABLE_3A_COMBI_LOSS_MAIN_HEATING_CATEGORIES: Final[frozenset[int]] = frozenset( # RdSAP 10 §10.5 Table 28: lodged "Cylinder size" descriptors → SAP # calculation litres. The Open EPC API encodes the descriptor as an # integer per the cohort below (ground-truthed against worksheet (47) -# line refs in /sap worksheets/Additional data with api//dr87-*.pdf): +# line refs in /sap worksheets/Additional data with api//dr87-*.pdf +# and /sap worksheets/additional with api 2//dr87-*.pdf): # code 1 → no cylinder (gated via `has_hot_water_cylinder`) +# code 2 → Normal (110 litres) (certs 2536, 9421 — worksheet (47) +# lodges 110.0) # code 3 → Medium (160 litres) (certs 0350, 0380, 2225, 2636, # 3800, 9285) # code 4 → Large (210 litres) (cert 9418) -# Codes 2 / 5 / 6 (Normal / Inaccessible / Exact) not yet observed. -_CYLINDER_SIZE_CODE_TO_LITRES: Final[dict[int, float]] = {3: 160.0, 4: 210.0} +# Codes 5 / 6 (Inaccessible / Exact) not yet observed. +_CYLINDER_SIZE_CODE_TO_LITRES: Final[dict[int, float]] = { + 2: 110.0, 3: 160.0, 4: 210.0 +} # RdSAP 10 §10.5 code 7-11: cylinder insulation type. Empirical mapping # from the ASHP cohort (all 7 certs lodge code 1, worksheet shows