From 2413bc87dae44564e92ce3cab02fbb544448c19e Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 10 Jun 2026 08:27:07 +0000 Subject: [PATCH] feat(modelling): solid-fuel(coal)->gas boiler upgrade + boiler_flue_type end-state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pin the coal-boiler-with-cylinder upgrade and add the `boiler_flue_type` end-state field. A solid-fuel (coal) boiler (fuel 11, SAP code 153) on a mains-gas street converts to a gas condensing boiler (fuel 11->26, code 102) — the non-gas->gas path for a solid-fuel system, eligible because code 153 is in the wet-boiler solid-fuel range 151-161 and mains gas is present. New `boiler_flue_type` HeatingOverlay field, routed to main_heating_details[0] and set to 2 (room-sealed/balanced) on both boiler shapes: every relodged after lodges flue type 2, but coal's before lodged none. The field is SAP-inert (the cascade score is unchanged by it), so it is written purely for end-state fidelity — the overlay now represents the installed condensing boiler's flue. Validated via the overlay-equality unit tests. The coal after predates the user-locked "always add a cylinder thermostat when absent" rule, so it stale-lodged thermostat 'N'; the pin corrects it to the rule's end-state 'Y' in-test (the gas with-cylinder after got the same correction by re-lodging). The cylinder is already 80 mm insulated, so the jacket is skipped and only the thermostat is added; controls (2106) are unchanged. Cascade-pinned delta 0 (SAP/CO2/PE). Co-Authored-By: Claude Opus 4.8 --- .../generators/heating_recommendation.py | 5 +++ .../modelling/scoring/overlay_applicator.py | 1 + domain/modelling/simulation.py | 4 +++ .../fixtures/boiler_cyl_coal_001431_after.pdf | Bin 0 -> 77977 bytes .../boiler_cyl_coal_001431_before.pdf | Bin 0 -> 78622 bytes .../modelling/test_elmhurst_cascade_pins.py | 31 ++++++++++++++++++ .../modelling/test_heating_recommendation.py | 2 ++ 7 files changed, 43 insertions(+) create mode 100644 tests/domain/modelling/fixtures/boiler_cyl_coal_001431_after.pdf create mode 100644 tests/domain/modelling/fixtures/boiler_cyl_coal_001431_before.pdf diff --git a/domain/modelling/generators/heating_recommendation.py b/domain/modelling/generators/heating_recommendation.py index fcbe0e0c..c6eb0247 100644 --- a/domain/modelling/generators/heating_recommendation.py +++ b/domain/modelling/generators/heating_recommendation.py @@ -132,6 +132,9 @@ _REGULAR_GAS_BOILER_SAP_CODE = 102 _COMBI_GAS_BOILER_SAP_CODE = 104 # Water-heating code 901 — hot water from the main heating system. _WATER_FROM_MAIN_SYSTEM_CODE = 901 +# Elmhurst boiler flue type for the new condensing boiler (room-sealed/balanced); +# every relodged after lodges type 2. SAP-inert, written for end-state fidelity. +_CONDENSING_BOILER_FLUE_TYPE = 2 # Controls upgrade (SAP 10.2 Table 4e Group 1, PDF p.172): bring an inadequate # boiler control up to full programmer + room thermostat + TRVs (code 2106). @@ -328,6 +331,7 @@ def _boiler_combi_overlay(epc: EpcPropertyData) -> HeatingOverlay: heat_emitter_type=_RADIATOR_EMITTER, sap_main_heating_code=_COMBI_GAS_BOILER_SAP_CODE, fan_flue_present=True, + boiler_flue_type=_CONDENSING_BOILER_FLUE_TYPE, main_heating_control=_upgraded_boiler_control(main), water_heating_code=_WATER_FROM_MAIN_SYSTEM_CODE, water_heating_fuel=_MAINS_GAS_FUEL, @@ -356,6 +360,7 @@ def _boiler_cylinder_overlay(epc: EpcPropertyData) -> HeatingOverlay: heat_emitter_type=_RADIATOR_EMITTER, sap_main_heating_code=_REGULAR_GAS_BOILER_SAP_CODE, fan_flue_present=True, + boiler_flue_type=_CONDENSING_BOILER_FLUE_TYPE, main_heating_control=_upgraded_boiler_control(main), water_heating_code=_WATER_FROM_MAIN_SYSTEM_CODE, water_heating_fuel=_MAINS_GAS_FUEL, diff --git a/domain/modelling/scoring/overlay_applicator.py b/domain/modelling/scoring/overlay_applicator.py index 2696d7ab..f15ff102 100644 --- a/domain/modelling/scoring/overlay_applicator.py +++ b/domain/modelling/scoring/overlay_applicator.py @@ -71,6 +71,7 @@ _MAIN_HEATING_FIELDS: tuple[str, ...] = ( "main_heating_index_number", "main_heating_category", "fan_flue_present", + "boiler_flue_type", ) _SAP_HEATING_FIELDS: tuple[str, ...] = ( "water_heating_code", diff --git a/domain/modelling/simulation.py b/domain/modelling/simulation.py index 40d6fc95..abf192e9 100644 --- a/domain/modelling/simulation.py +++ b/domain/modelling/simulation.py @@ -122,6 +122,10 @@ class HeatingOverlay: # upgrade sets this True (SAP 10.2 Table 4f flue-fan electricity + the # Table 4b condensing-boiler seasonal-efficiency basis depend on it). fan_flue_present: Optional[bool] = None + # The boiler's flue type (Elmhurst enum) — a new condensing boiler lodges + # type 2 (room-sealed/balanced). SAP-inert, but written for fidelity so the + # end-state matches the installed boiler. + boiler_flue_type: Optional[int] = None # sap_heating (top-level) water_heating_code: Optional[int] = None water_heating_fuel: Optional[int] = None diff --git a/tests/domain/modelling/fixtures/boiler_cyl_coal_001431_after.pdf b/tests/domain/modelling/fixtures/boiler_cyl_coal_001431_after.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53e1c8d41c024376e42e289b13123a2bf0d3f8f6 GIT binary patch literal 77977 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 Chn5Zi literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/fixtures/boiler_cyl_coal_001431_before.pdf b/tests/domain/modelling/fixtures/boiler_cyl_coal_001431_before.pdf new file mode 100644 index 0000000000000000000000000000000000000000..de84ab54c3145628b17649487b17f5173fdc2d84 GIT binary patch literal 78622 zcmeF)1ymf(z9{+#1ec(J;0YewgS$(x2{yR9I|L8z?!ki$kl+?PxCM82*Pw6sww!(T zzHh&~_gnX@yUuB{I^8o}U0pr%ukPw0W=BX1IX0C!GwgFk&!{d z(A3z(frN>L6}n3cYda+yU426a5kn_aeM3cYAqF8+2YUrWJ7H@}8*3{=XpuM>8 zgL2Vd&i-xBCD0Mw0)5qXFO0Cit7Ffl`=gG4kWeM60U?2&!xJH#ptnebS?`20Z5Y-1YtpmLYwp->OCNA(GrdO_*?{5pM-D^zr!mAV}XMk_rG!xsP?yjqw5^bQv1Yn zALzV)9dslJlYC;#Lz^*B)T*EL4Z@UWSPyDxwlQ?|T(tyEEZZ!t&&-z}7 zoq6AQ^D(mXUO}0{{<*zoIYxCgBU&%HLqzyyZW(G2OsQWxGcg}snS{p7FGt?^&};kg za7#HR`>W2?*3*~C2x&pq&jc3N2;a)O(N&>PM0Y#Qx;;-^9XgC&3v*gfs04buE^+)Il4 z`2K(4TQtIZ6d0)$Q#%_*1}yaz*rA69&HMOGm@dy75ye$syWMbicPZs(1Q*?J*Bu{? zwn-V78&ig!GwIqmp|;#um<1}{Y`yZD-{?I5xYv3b-J(2?Y`Tmgm#DhnGRjhSX2#(c zML_a()bxtWTN^@=C7l^2`5cR4T7+#Ih9)Af1d`$-$np+~AiehH#yOs6`v zK=<8s8}_>RgQjEqL+N>GDZ^K5HTLZMoKQ#dbPS76Xt`N@y#kSFL%6w<53mEJ5RTEa zeum%F_)-uU9JOU^a*ylp8k=ZGI~7{V!7FX2vK63#EMV>|L^aZ?}d zfVNLUMi+PSomPA(om-1XgZ7i$$X=(?Hk&e4*4x`WvFct8jb`IQ>&2Tz8;#?FP^}Bu zz^(o5}LP;b8}g~D=23jzI|LT`m9&7mG_?{>^GD_o#>$>9ujI2sW z_7;Ao3{hCK!`>{dg7d?T`*|rQEO}D88hC#9H8Mm*$L%vKYt1k(lgjLLDNJJ&rkIas zV*Y`>IXGK-`r5;x0=|B1bVr@Fx(P3InV50tY+zkd(Rh92 z;WfMU@!{;9C}d({J+uAcy7A{p zuQoQEDFdmtUOqNn2 zq5oum>M**BeWaold%u#CJ!0|Q2rZ#eZ{WvoY+AQ&XXodgoMQu2g>WuqpdX6kGO3^+ z9N`1khpJW1GaTJ75Fv8$n&0NWNu+{G>a@m247E2)(+N#%S3{*08r!2)46#0*?40^V z<4~{baX&fdQd2IwMW^%M!67@Qb4qby3M{2_CT7ufJ~3 ziDM9w>{`p~@cD8Ejkt+c-LH*okh0x%0qGixX5Op|+LmVxpWM_E^`WQYskmeW$jY%+ z)3QQE#e5Mvff`Q-ups}WHX8n6|BL$k57$}Y z_qj@gibh6lv`bg(#n*>M&Q(F`>623gXPw_&JInCrJx29=Bl&JCyPP&rw{NNkA878t zu7#()BFfU(eHi86B23#bF>VU-$z!9w_iEqd8!O@59GoKh;!@b)Gvp7@Ix+mfnm{KE zn4Zp1Cbh;B57r$xq0w7VGN}UZ%LH@DarWWwg;VnOYFk>2mJIokcsp$hZZ&O}YUOqp zHy!uU4b!~_m$;;D^MwY31a$j^mAuYa*2Fdl@8-Q=SfhK1tNQS!iWu`!5)mNz+Vs0E z@JM8Ssz#XG$5O-@q}H@P13YzSy+Jez=k65wFN`+di*-NLl#!xyj@s;=~bMNpBhoq+HIyf(9%pl7~K8H4T|Ftjo}g zXr|qLSuzHnyUm_@#Slp^8Dybf7RTM7jdsi|{z+RVGX?-&lsLaINeZcBgnzak%F z%RHysz{(s-M!B8qPW)BXd!50T$!-(?@<9!4#xrOuMv}d}Ln2Pm7+$R8M}`n5L$BWQ zE$Zyk&q%E`!qaEAH1lGhVZw2CG3ns2U36^vV125BdXskMu5n4R@Z=*ndr^nU2Rly3 zavVMm2A(Vpe9q9q%%FkRbbZ+mP70&k052*dvOatz(wSOmz?vP|*t;j_I- zNY|zHF_r0TBWWIOlXW8KN0;i}XWb=QF5P9L0Amc+ZczEBrFR;767cXDfo!_f9h zuMv1Nc*y+hIAq=nC0U;PoALJpzSreNuNuUn>C97_^dOq&zVj(`;DCz*!Xs&L1c>i9 zQi{fOe+h5=2|bTblWH0rxT2uipg3e+obQ9eiJIv7_NdgYpX}9G@(E2sR7v=%3wf62 z#Y^h`qWnE|pGc3`))_qtu;4Cw!JfqtUX39&!_x|L?F(nQhs~~*vq?wMU&m5`WpZyk z)$BtD`lSM6l)I&}cL>H&wUb@2BfF_jwIPcaOk^-Jl@cDZPMjah=%TWsJ&FDNH5SEmyoWCD(`U|0XfP_v3JwL z?)@(2$BN%3Y|B{6>&V#jhuybFl-^W%VAZz^Y}D8K*4H;Obs=BFh=FkXdZNC_!1a6; zzXn9~^Z40OWW87udMB$*qvDT)lOSa0Alb_t;e~38o1d@No^RwIA1SK17f@676|Xy< ze<{p}@Uq9#mf|0MNBJB664kl+l0UT1&&#}eymzN~H6HcCgZqrYQ-d^mqK)k;D-+>^ zOJ_!{^qU?rIQM$CaQmb^<-)Wx`^M1+ZXBez9DGy~+DBJL|SlMdhs=DXY*EGgr-KjdpO5zppII z#f?%59nX!saIJa-<9Q<=`( z^a*^^B1fLJ>ruuT@TS9VWU>w^B1sTd>3|261XWT zvT(>|+zs-HsvB(V55E!u8-}Oo@;H!^5(>k%2*UJ^)EunaG(K=?XizeHeDEwTU)P=C z-+ZE0^GXfYUWY@M`B}O}<01?VF$OaG#YK*6*ukUMwa_-N zr9>Oc=Z+?66Wds6hC{yB0&HE0;A<*Jgu~v4(lW5a)oL_u$*ww2oclKPZfb3mHc#Zt zpnHq+YtRCYr|$wfLz!sJEre$YQj+7yDs`EBAqZ}^(+^n34v3Yo0|!TFy_-8Gu+4I; zKmAB<^6ogKF;Xb}12Zv~Gr~aPX=dqsgQxy=b0Low4(8SOTA`wXqjR4JFD>tG2L=T1 z@f>n5mu8YY{K)$4gE(RJ@=w?d4p^pEo|+^G6L*8~&XhHp4IrUO(%1z`oJ$YGL#m}* z#h<~q7|4<*Mgp!hvlj$NNivStHuVg+w$w!JQZD`IFVof`JtsRduH)i~AzrTt5M2dJ zvKGIzf3UaX_OlIo$oqn$N``RAg23-p`RmJ$pxB6ZA5m2f|LQSki0>`3X{$gFZWJ11 zIQ%45iF}d|QbK-yV*=(AEByRkuocOQXIpTSvhl{m!SO>a4wm!n!-q+DpE>puvOG+$ zmsN27FXOQyHrAHq8}ZZ9bB5icHlqiq*wX0ZcWbV;Ul6<(QNUsoj||8y{0y@)o}pwi zlzjj_kxNRx0GpUy&{NG9lyz;oyad1BaU{H>H_XX0%?}ki%RX=LS&LHDj{lOH`%u#I zCZoKOtj-69`fHp`Wg)>LuAi23r}77rPVHNmV+J%kPk=jF0o z0Zc%bk+J>t@WY3rbQd8jT8GQYD1R5etbqM1>GOdoF7>Cfl6vSBjbzxqD276ODqrh# zRyt12V{&v>;dSgKXI`-FWs`&i@p=OA}E1BD9KK!e5>D_SVoDQP5TNlS51&t?R9Vi$yiL4x5b-m`rudpjao`b#Oh=`pV>1Gxo`6WiG#DN4)=|si0khVAX zjR0HG{$Ai(jqx-==#xHVb%3Bz)fclt?gKYR`xH8I*7Xeh2w^$B^1GyNYd|nc_08 z{}DGYN{kueF@a}N>q%CW4(5d+xPQl2SKc8)=|i{;Bo2N z^GZ0!0t42}6urwmH^Qq_zvnD<5bIcMdF^4W--!f`A|CAwi0BZbl6CCk5S1pGM&{C* z-Nx&Jnw1W*Akv}lA<=q0w9f{XDxtY`%8Y$~HrnsmHrPwDk@PmZjdsPaM?Vr36Cy#D zEJPVQ;&ywYvd$&zvH!+>=H|$Q(;$LKXb}lxHa|vivo-DH>zqcJF5zU<5h!gHc11-o zmg{v!qh6^yp@@a_5Tg(D1`zb5gLMZD6B5(B=Dp|2els6`c*ftF#g~#8DMwl$z!%!C zEYIGLBNkLb7)_d!)NUOLGO$1$prhi_xM(t>_8aM-Jwu+!yF{(KxSj^Z8zb!vG~$#s z`ZRVK#Xj@fR+&J7w!i&fAk(YD32^kz#Gyet+-fUfNGEtdf}?YmJgn9Fy>W>MMd?FH zFS11y+lJ3of1LYQ4n@a#tym62Vw?em@qZ` zGrl0}@FE3<-y&YYbCmauZ9I9Wh(D-?rBPj%H4WWcGeMFJ;INgz2n$SgHbZS_*Mc5@ zA0=-qyl_rGx836{3#*@SPtY-$ua$7_5T4Lyy`{*YM3>ls*r`fN#qWgr)8B>6uW9+{ za}m3!caSH7w~4CSp2XQ7@E#*Lrbr09EZyGneF00`Bfh>6-2DNQ>L}qU`3M3!i9^)$ z@4uX#1pHd3xyHz7+=ezGNVL({3w&|NvBXuQ4Q@kq1RQ<4EtUA;2mAX6{H;8WGT-13 zu$UAU?d)uh;7VD_-R&i}VM6_cNwyj)p0S$Wz-c(U3_aD?=3f-LNb#VNWDn`Ntq8VW zKU(mOJB_5r!Dg)ys=;FNJknGh&uVU~4saC4Df4n`Z54dc|1?RbTt0y5%5Z>g9ubqf zV0dkM9{hI=oS?boho=NnlEUEF`}2L5wrH|xLGJq_)t{@1#vnf^)lGzTjiE6f{>^#}TEth5x89Sx8$7vNaN8Xn}rxwt3iKtrc`~j;0u}G+b zqui$n^X%FKL5DT<`q3QIG|dCCS# zX{Y-4SVZV^8I8PbZ)pyL>sudKGrWD-uqqqt%g5rsly5RIGc)s&t(@V^ZC%w%EXDoc zPaZdCZyv51JO5H1R8d~e$jQn1o|%uCHKT)NaBHk@w?=w@RBA1AMSf%7VV`PGMMh2z z5yp3UIXlnx1N#t1%B5}er;J(gzCEV!ea=Cmy4o@9+;U2$_wQ-25QBn(HoHVncwuoh z_-Tk7j4sqRFQ!*m%2rdqJe};s{)*(=Mp0f{3s1@U?uF*^)RD4sU(XtmW37-;CW@jJ zKV8Ks>)OQG=&&3pp)I5J?Ckp#LYc0Ki;1I9hsi0t`JMT67F;XsTbp-z(!8Y_n-d=0 za+8T|3qPi&k~+Zi_5lH#oYtSUvcp-cM(Z77-VdP;upc_aQ|~#IK!1{pvPlsjV&YvC z;<#;G;`&$JAulFA(AF$QjFe{nJ}OBG(4z+Fy54s?`Vanvx?QUrU<9y5Rk!kM!f{V zhy_{?LhB$jJpM82nMvk^s=Jyepyu*& zo6SK_j>O?Fr>CdV($bd=Sxph^>+1;{8|v&0&1Dfon~U|1NEOT1g*Fbhnphv*KZ9?u zuHMMgOjYdtGR(pte+2OSC%mr3aP3_~Cjmw62Jme^B=d_9Ri-*3=;?TGe5VHOj4jZrplZyX3 z7$(9NAK$Ih4yihH_|zuAvkmpMQoK!r?~_~NS<~j3daEzFvzZ2nXXl4oSKT%2Tk(l+ zGXXbK?Ho1xI6sPie6k;mkbBeq=CYwAVFL$Kcs1!Y$APop;+rG&fiT%`%q%tEhDo!_ z^Xt{yiu3a+jt~PwCl^pl*(h*M{b`ZSIgM1#GXtK>`Mbe2guptu2qdN?W;N@Sz=KE3 z!OXNbb#Hd->ehqz>tI7by&w9@c-?m#6!k`(a1iU7BS4oJh2wL--lD^I@Y%j9E6+Wx z6dP%VX{PwaEdlG)>IBQyOn32#;bksajPwA64e^5fM7DYphYCy$haAvcM)ZcxlN)J& z`yk=MZxn&=Wl=*hl9ZR#id;*SwaR^=cDuP@TNP7!FKNr}zP3i(LtD``m#Jd#Sm^iO zZk?(ZMx3)YNLY|KeQ}q7SLm%-LSWLDdd=Z|0W4Uuq4XSH#oE`A3Wsd%n_~?qmNXBO zWjm6=aL@_^o}iw=oxj+3E_w|^NfVV8hlNM<(vI}%dfYq!HUJZ|@*qA8RQ~XjpT*vJ zg>}x&Np)g9G|{GNDk(J{JDyn)2Q)a;7uk$~{SwD(b>>{th#o&qM(w0=XJ@BZ$3QbY zq#4VVY2!LvlS1jfz@G67JoHl+Pz< zUbNlZTo+}2U}0iCIlg#dzh_}Fl=j}zSh^TeoH!`iMe7XWkaa}a621-R&?~ggD#{mh zcCd4@`87T|GByz&_BkoDh5N$ay`!Dq{W|RVz+k+bxDg?pB}YB&g6|nyo@-TOBQn{x ziCH#QN)?KnzuJ#@t!?_-2**>?v9VG9_YRy|MV$i0zt3_a`}%sx#Rcx=`ECmvODsy~ z5^#*+D8s**5fiipAKnw1ii4e$UiNeFwkrN5Bt~pGF1}pXIOia^wm3 z35Mg2SkD~K!cfAR@2+zpi9;LUE{cl!`k9&0XT}9-Aar$<^K(lSEgr98rGZl-M@X7E zr;f^TA%@~h3h81SZOz1M9GVxHAz4}a#WY15v4`AD!4oQCEMRu#% z{xjsC6Jztwk)BAoySpu8^{^p;^YU|-tgYp(tHz9v6LihGtiol(NTI_Ya9E{3{h zsHmEC9@9U6luMTdDk&-94#F)LSB^6Gw9=jS_IF^3)5E}K`}~CeG`xha|GXWaEAU6% z<;8`NkVJ&?x39V#ueOoN^SoPrynd>iwX3|WqV%Sq#Wm#vu}Rl;wEg*MuVj@G#4PjD z)OCX+Vdys{cu~3Z2iz5jstUGRV1F2L__rM{F0Pmcg`c$WL{liV_DF41JQhaHC{NqDh_=aE%oANDYt~Kq)kXD*t^FCHW+pA%I&6KMxM42RhfzP^}tNRY_Cev z(}P#d6!h$Jb})@Xf;N&;V9eU5?yz)pT$OBKLm!Y6s)DCsULJEYsm@>~lK;AhX3km) zOm!y6c|X3l(ah9hodX4?f}hFw&f$&zd7AOqSmtl9+Qq%T#pDCy(_N0T@K>&NuIl(H z(`wUX6^!5*KZ(X*|DaTEi`6#;2K^B28_)Js4!xgpl5#SmV-rln zV?n~=Z^=rFaw~4`NEAV164aFAf#=fQI|V&1>#7eW?(HnZ?p`Me>&Jd)Z(3NmY}h5_ zJ83$*JAD|VKDwyF>#kvzpo6EYwoG7d#`NICyJ$I;zB_;ZSXpT|=^w=|^tKWi9?~CX z=o;X1)a7UxVr$+gB`Y~TITE{!Z4#TA2w8h~)w-00REs3b=J>JN_trzwI~`_rh?bFH zz*VWy%+g|&%@MAAvC7~MuBc+iMTYx6oI^&=OMw5x=QNtb60K?VsAs8GDi#F;6XTeX zmX?Nn&<)L?F(mBs_loa3yZdjrUp5MTQczTuN$?2+_1?_ZbQMD{NP%uIm>b*FRN~{M z2Facby(WGgB$n&7Q9?Tp>m_);@hyYFQWjfzO)p8~hzNB_0D>{s+xf#YOEtRE zP3FzUldy5Y>rEI4Gz45#H_@`E6P1hPJ+;y+vOl<(yb@^$sVRqZQBimjNb;7HJ7DaG z&t*-)v?nh3<3Dad2=3VPS>| z)1B!cG`+M-bC@fbKjrFd_&yuy@2)Lf&AXCgA!?;<6O|oct~%%ZoJdf8#U!E1tn1DH zFONxKA{y|_Ep?0D zL!gb(wqi#|N1rcV3(Yav@&<1<#_aI%Jt3s8~uK50h)p5X-P?+V0ax@a?cp)eMLSme2-J!PHPAPxpX!!@G;_}Z;pzsPHdSNxO8mC zF0PoaR`hlI88rIR1d0T`jZJ>TOlv<}D?A+KfUTv*@J>n(a_bW5?Y_N#XV-hYjOpG z#j}O<4xbkAaTP5^8?DsgQL=&FA8|BO)!owleikc~6NhFIm73E=~V+$Wf zA{~X>-PsXfmk_r`8}hHcTFYH4A7*^6&eswapB*n9EFMNtdo zUJv>;ko=8&b`_3n8!9@sf$p)s-nll3#UCBR@Hoh-g$Y`;ke!!BE3(O{N%4!XkDBo8 z$Hv-~NJt3J>FKERrbj<2LKI(UrEAeU;5M@Lyd;X;+*=D%r!Hb2w6nL31u3}%Mvd9H zmb*xxI$c0ppQvYO=!-a5SW{zrsd+24ZEZp+;d{9xrr&L6ZD8SFe5a;@v&U2-X0UE- z?hFw9-JhjOmx@BWbFdSrbie`m)Eg3l{6aVdB;q?xHl?DjDD-Z;HMS0yy-c#CKMhzU)J(|z^cn?L!Lh|9;Ra}h42A8=+| z>>TNmo~E74{=)Th`Sx#MHAbGG?^Zs-^ht$ z$C%L(v3lREaSd>jnQ24?A)%n46s;`0P$?wW1*v!`fen4dXBiw~9*%HBAw3cSXJ31s zrk7i)Ux?~n>KGWj<)uSWloAEc$Ah_G1Evi(cNbY{AFzL(mNi+_#J_FIeGtESRg>N< zjmZ7!=VrwHJL6M`|SIra#|GtlA+x>G`BXsN3Mt&&S3#J~lr#KF!9%;~_pm)qZkP84`W} z^%c#8vGbRb?^r(BJ2Xf|ZxcKF^{=XV^poyZv`bqQspc=CK@sKUVBt2FitFg?92Dq} zv5R%Z^*YkAS$V&B-Fnk3UJu?{o7UAK2-f;CgEI{G+XRNU~*VkNJxl}PlM;i zc!`-MO6lh#c)mEb!NO3mVVpc zKTY*?Xh2U349xB57)UD7RF!jAPA<~wYav27hz?!(O;CP<%jNz1hNZA#~?#5n(OEp&83fsvtu;^G>lzI@o-|6PFXz}Zx;kz75Wbyq{LYVgD-(qi(z|iiX zPouS1TXeB__XpQ(qf;FFZw07Zkqpp0EwVZmg<00}Xbv1kZ19h%fg`dl9>@it>Z(l-hVL8h@gj3gY4WPF% z2#_bl42M^>oB_$pQKl2souaws?=Q%PYtdh?7#4|@-bxwSiwq~gUa?C`?9`$!`ydkAGtt&@mvagVr^y@5|CVX;z<&U82aq?mi%GEVDm?j1W6bL##T7>!1(Z8$_!lZ#b zY18lz5-Nf%ttE+wqYklY;%QnT9-g;7h9UXBgvpVMBh(h=%XxSqJ~Vf=>NVDYv0L7U zD{pqk9`&-mNC@c!Y0uI$!|K4w0oNH96o5d}+1Z1qn`j_~?BE_Z*G0(u1d^*yE0W?s zX{;$LDR|YpFhNgydN8=0^;C|U=3QKi%O~w8GKD9I0u}8OJ^gT)p;QdXX&nm`qwc!A zI<>q^t^GYd%j&y|B*q|Ju&u3?q0N{V@5ZWkmD+CS`z?<%XuD>ilADLQuC5940Y{l> zVF`L>eT!ff%Ac41!9h9h%tALHY8l%ClwYe9S`z0TFrOe}=4%DVWcC$%Z!3V-Ivm6a zkLXykDD-ycWF5&Tq=w8@2YU5U9?&DFcuS>nV%~%@@{aH{CDUW;VtUa;o5+dlB6q|3 z*{C0f20{OuUwcMFGtVICt8eCJm8oGMQx?^?AYD?@*IoF$yu5O#5hto!w{@qZvCFN7 zB1I^#9W8lZeVX%KCR072G5}$JW6Pczs`yRW?YrRJcal2!ZozBvc&ukyRzA4IaB@a{ znrd!a2%-8%v45?LNr7zq7k|)kh3#whAm~ZZT$=WGR4%mRZ%2#SlQpr&zh+*!^MaMc zXr^{Unn{c zw0kRgO?cE<6$I@r!kO50Vg~zQ;G69jB(T4Gixt64_Rd3L!N=HJ+gsCOFYjk) zul1Vl<25Zx;pe&?ZEs&+e)y0dcQsy!c**M9Ryb*OX1gX$aVzsd;IvOsY#+xo1oSs%2{?YbJv$Et>qwj$3B-IAC zf{I#RQNAq`vz>^P$octsD^4q8+vfG}tC&*m(C|8h71*omsv3Uy=e~W07{rzp&bwALMgz?(ux-lcO4!DHw-G}dIQi-dcb64KXI8`b)h*XPWa*S=XE^vh19LMR7`-cm4OzkT?z5I|sH|)&Gb%nQ z#z99|H(ZBLD^@G%ao<42R%k1(k^_kwujhK!R(y#+rhV88qEb|SNk~Yzgsp~)Sp2oO zr`6WV2~z`w$3o)JF3ZrPd8}&6@n>(p?;hn1&H@YReJcU_Z8M|0IJ&wn6BBu{Ke5p} zI=boU;ZaF;r=@DU0oj4-WoNF-_ndy@zQGykWu4V}&?h@R)-gg|Z_G$ihYt>RaES7E z5=PKi5>#;#K}2Q5lSD-LPLHm)pZy&|ce}ye#{wEJ_0b2yvqW`1Z2(U$fEdp#2V2c1-1lS_L76G;hutk6^0&Edr zivU{$*do9d0k#ORMSv{=Y|;OXwut@T>z@9XZ4t{q>7E8`5nzh|TLjo5z!m|v2(U$f zEdp#2V2c1-1lS_L76G;hutk6^0&EdrivU{$*do9d0k#ORMSv{=Y!P6K09ypuqW|%> z=y4dM{|Z~g`cEF-0=5XSMSv{=#w`NIEwTs3Eds_Z0>&)@#w`NIEds_Z0>&)@#x450 zzwrO~5*W7#7`F%*w+I-w2pG2r7`F%*w+I-w=)d*2MV$X$_w>JPi`f22_cUOO09ypu zBES{_wg|9AfGq-S5nzh|TLjo5z!m|v2(U$fEdp#2V2c1-1lS_L76G;hutk6^0&Edr zivU{$*do9d{g1arT>sv~TNYLZVQUL(J0%-keM1HjLnl*xLq%~R1|d@idj&%~VQWhp zYb!%52NF&OIbBOb21)jR^6(b0MSv{=Y!P6K09ypuqA!3g0&EdrivU{$*do9d0k#OR zMF@wz52a;bhpW|S+>%{&o;deyz!m|v2(U$fEdp#2V2c1-^xxVRF){vo{nP(4F5>tn z{nG$00&o$4ivU~%;35DQ0k{ajMF1`Wa1nru09*v%A^;ZwxCp>S04@S>5rB&TTm;}E z02cwc2*5=EE&^~7fQtZJ^gkXKF){snPjCNaUBvlMp56kw2+&1DA-;ev0(23eivV2&=psND z{rA>I%>Q2h^uMf&xc*81G@y$BT?FVNKobP=G709^#=B0v`bx`^d}|LH9g8-s+Qsj-Oz2^0Ij zIC2pa<6j=$Dmq%p7+M)Sn1~qaTN@ZM{OJV=J0~X}pS^>fp{^z3{oVcj{T=S@-R;i# z>exgkba8#!v0N72VP{>Y1WFfHNfXe`lk#sgD4&eq zIGw-0ySk@1yFRX+P1i4w5R2xLh<>k<$_Gm0S4`%Wh~|QB5#DCDdAe}_aDV?meSLfN zZ6ZS_S3)$BLnW18J4e{4P|T!A+_*?wH&<9GnNK>FJEp^a`)uX@!Fz6Z)a9F&cqFG% zGOt#)5HzI~M9QvG#9SK>zh-vEylTMCRSHF;5ogy&_Yb%$ z`^!F+&I*a#+F25fQx)o&LJEoe5p|#M?~rcpZdzt5Q@eeSF7}|uGqO5lUt$3L0Ob?7 z!P#QfW5tHKAE3u96D?RfR&{xOdG`Bc<9PY{_Ih$-+@@GZEd!brk3tfUZjN;8OubK~ z12l8ta1P}JNoacL_Xa)epYt8&1)8d9{2!8dq@uZ0(*%rim8Lewp$W7yrIb?m_=DM0 z5@jj|Ar(VHWjdLP3h|G}EfK{j8N;QWBN9~Yd3k-Yce>|PVx^NSDjv+V$N>OTIQL4Oq0;g5!22U)yfgkEf81F5Y@}nDC#MMCcJ?r zd`yhLbFvHRhj^B`tEZ@_B*~lQ8m0V5nOL8IW^(m_XlP~d=g@^NS?if0GO_+!wTkUu ztyN5asa0YYx(gF4(jI$6X zVuRAW6-rklZ`LS5Y}^a(bnaT;MaB%6s`{JF@<9Q!r48n?CzuvZlHT_{eo zhA0hFg{cKizZQL@pO##_CwEn{He#choAr0srJWFNNZ+cE5bhPO`lZ0f8L7Q%woPV$ z!iL*=H*`hcJr?NL=ToZu6aU;n2a>ka-jqMKucI-L`7)MtTs=w}G+mg8QfF|NKjS*o z_tH1p0i%W2`CZhf()X%2Fh%Nhq~^F+Nr|{arn^y^ip1tTi^b}p5wTxN!LmgS1vcz& zk@7v5pG3lm^mYf{nt8s=8&)jbH-yQLSMFm<CMC6GzFjR@*Qc3~>= z;fB^>)GG7JR~=I52pI^`M$?)K4a6eHtayET^z3#7s+F~47~c|g$Vj9G-@z5Js6NxH zC-(NpUR|1I#G@VMquth%6kcnSqrxQ2q$SltLAVC@#j?oJPmuE9`-dUG`Wbs*Ax1}W zC?_wGgr!zSm%H99T1?Gc!-l^d%FJ_B2p}nnCr4x=p}1K#lnc!{uprT^>8QIuNYKpm z3Hrd~9gtzCAK{>Pd4~EMH>CV>?tc;5Z2vj5#jLFyL=5fq?M!VPtnC;cU;Z&zouHkm zuEjecYYPJgXmA?aldv%Vu~JCL+C_tom4l0fj)Q}hgo%}vk%WnnkzI?A?=O{y{U7(h zpya6M;A&&Ypls)8sQkF_$4R{wXc=y}xYtmu>#P=6_8O&EqkjKPKq@m>8MZ{@B^$4mp^a|Ck<^*`W-W z16r`h_Z~N9V`Tgz-Q$ipp#}IOE%g0Aw)=CszitQJ=5d*emG!TAKj!zBLOjk{*`Wsn z&Fk?1|5|wHKK`=&$3Fl3fiORo0XjXF;c@=B|G%XB%lwag9@jsX^>I7s@?#kv=YO8G z{)mVFh#eB>p)-;w{zn{e{9_#aN9wa8O|8Brg z1zlr91_fQa$FV*if16T~LDtZ~RQK^r`B+{yE;f2*4runAtW5OKvk|8jw4Gq(08MRA z!u*&(kwMYW-rCVl-_V|i=Z}imy7uws&nMwO@`W~K9y2nva4>|P+5fSL!NkeN`ZsNibhSRG*Blu0r?lk` zgTd-9=d`J5TiE7eimVtcV42EK5>b1#(@`U`w6_^*1KM&v^LzACZ=Y^YZBALOPLv8| z(|^sf&hf{%lpg(zDJYrJ{UKo;FZrE3gu0F~$2+_^ymFt6Z0zldY1$sW!G4=le0rom ziD^vr192#7>vGGP$waB!m1D=xzRzNkDUw1t$P+(^c?vxApK3~OgOQALzA?SRo6R^p z3&Ei1abaKa6-_Hx0;h=iDqV5joz<$-$7{vzni=gWvIP`*y?S7)Cpct_ZTNA+lT8_?h$BSh8rh&EO(+&9fYxb{y%#t4HD7HD_arMtQmx+z zY$f-GV$`C0s@6oR1xe_@XJO{2I5qXGaFMiKjXIy{1D|wqQ|B0Kz}UMy66PLZb^_Es ztH2(=4AbIb$)$}q&!hCIZ%q$s@CB_G+qw4$DvyQ&XhPQ|b9VFF53!O%DT9_O(rjtZ9k8EKtUi>{Rf?_!OgMX&su$f@<> zV?7B18h_5zrQwH35)!uGt4j9u6TSDxev<(%ndD+`68*cB8>$b=VGS=)Qby1R9TcL${z57)!lB4# zHS>~L_|JHGAP^nOwrB!_lA`?cH+Uo1jqE*V`eI=eJuQh)U0!*r)yp6+YP-k0_&LWHTl2}yV) zU%$vO{Q6o$usrHya*ZMk|EViZTU^$CafLdEE)V=g^p#$Sl=ri*BPH!FFB$#Ck*^uq z8GH)FbhN(a3&u+I!`X6j6w|O0!650jhEH8Mz1}r5d@fJX_HdzS>aIr-J8qvX9QRHP z_iF0vS5-`ouIS@yt|&shT9u1ptFyRYUw=JaVeH4Lf8Ndh18daK)YF1c#7On17>*NukdpM zx)E>gvqDw6B+!xJEu|;wrIlAb(3su?U3;;^o;^1bqv)MsJFD#|NlPcoRZ8@r(nEps zY^L~HM(SGD13&u=>%$ZdaG&?EG zD&w``bsx@-`@F$seWTw% zf`r+UzMrqBui#<{}<9M!LnbrYY2+vVTtq79JoL{$^ zJ7FYUM0jp<5Tu?%m8v#29!egU!!|Cw`8uol?-0Od>cd|Rlw~n{w50U7#oiVq;sH)e z;^p)pZhd9wx`)P=vi%MX{p{#lX;sl}?M7%+Va?He&1qNBJ3YKxytvyi*}SrO3f*p* z_ru~l)ci&|=dND_J@O*%lAElW+iMK#3583#@=zfqXZ`lWH|LlHBQYghZB+&Ynr4C} zaD*Xal*3F}(Z&)LLTaHU%RRN6F0tNfRB7mxZD}+oj~2k597H{yv*FEEAsG)S+gDRC z_1OE!k2eQUbzG61Sr5aQ$&G5o>Kt{szKpvQ88OMNV~Y0>Hj zRZqq*$lJhF%g^wVwvWQ+7uqg6Oe=Liamh}b3TcZL7_k_PEx*^KED&+Af3ervWZ<9H zi%&h~kBr1t+(0ZB-nj%ueGJnt;O00^MT@*RlyNGyLfd<4Qyk!L(E!Cb%nC@Yt~6nf zd(}U+etDC_AV>bM8!gbabASE~NcbI8{1cFHh1h=w34DN`VB#l6_zy_<2PD7* zfPVrB+1fhp(_k{cab!dH(ROA6sDh;Cpm&^KXZ%pw&HE@W9uP$r=>YGFJVTuFxIfTZ zZUA8^!#tl!?x)!U`Q`~9Ece5uBEFLk1zcf-^ezB=D5PhcQOwyXm-RB`90ot)i37&m zVCe4fQ`y#^sZ|$I3;{Ua+V$gU@j+lHu9ZOOomo6ixm2xB_qrJCBeBP?or9-gr zNPfQ5K@?Vx!*s0Pe*86+j57XgC4_*|fg#x2@iwj^3bpuZxYsK~ooCs(a%5D{+DY$X z>%u=F@9daJ#kgZnu5Jm3-0?vtqn65u7`-@)w_%6i0#ZvqzWR|^?nh5YqdRrHN%Th- zD{vx-3F4;8=ao<ng~ zNRiHaa~h))43oQQ6p{R?T#w&=bk*N^u6Y{jggAO+pk#9Jab!n}H-+Je*1fke0_cgp zgI*iiMQkrv^SBl_*b)m{+GZ3w_2zn>SbYr~3H9shmH|ESME5`YT)d1qTPg}zej#sb z7GG_9ht=XdhWsMcVpbfi+w~>Ils1C}UoxUGgKbXZoqVhKL%05P3U=}sj`);F-Eoqc zGJb#Btmt9Mt{;35(~&g+EK*%6?I-#iu^>?`EVABQI+5c7iD)4v^K3hfk9VW;Ii^7A zxf1ri>ksGcxko|Mw}?FRad>!0(y?C<#Pe1-^YB1<6)8<7kdsc!ucg&!dZ@HgCQjam zZN;=|yv(3?MnqMHp5=F`Ph#2$On>hF)ajSLsUYC~UNG7MkY6DT#USef%3|GaRDK*& zz9<5WxIr1(v*^qU2$}RCd-aa%nW2=9Pm+3>r>=ma2HZ0?m7Jx|7t2`h{)}x%V_-Z% z)G;x*O$%?sg)a(f_*io*qX0}~lb=B}=_1S?^lUfP6d*~}bRZm!n@wO;rH@!Zr{WH= z^a2GcmsnSh&^hZS=bGg`#$$EGEkcBnfJGhj!7N2i=+M5IefGAxxgUNg;n`&FF(wNV zHP(A&vOQy6DJ*8<1$E+fa>-{p&=6Q*;mV!$8m&s8ZFmFs%QWVLHHGXjp#ui|aBgTb zt6N_#AIF{B@cBhRYO_v)uSnBe#2~b#;*!H0)g6mtG=0x&BA+{BT9S#H6q|GjMct}N zBGw6bhBT9+ea1#M&qV7?mKbsSKJ9Wo(u$--2aLOvPZvVNbDOYl69tb6HHLXcI(-^J z#Kq7Lkxq#>s4R*@4Gw`c4e)7iFX}^05>#}!3IYqRiX6%bjOD*zID8;X9y?%h2(b4Z z4F=3@ic{Mk0(v|S4L>8jxLB1`Zi0Y{B5txWA8^oRa&b_?qfA3=v3N^NBgT?7SNHh{ zhPU~hduPOlxXul0h17Wr+xa)Ju5`(KPuC1lzd`)1Bla!9>xj{b{kMc{mvD zA8?jpKIUA8VX1uKu<<-0RMKTWh1E{pU^|7A;cL--U8+?$%N`Q{<90p07t-g@N32;~xx?|+JULSLM{SVwY zbRG$3Nl%kFMsKfp0R=NVjh@lrngN0Hk{-@uB8{iR9+jpAytd`Uz8~%+EHp_|n7rR_ zx<5QdZZg?T?wkU9LE4=$+kTYTMXRI~Ys#qP(KYV{;ygI#{ET3S+q6Z2jqEM=i)!6% zX!m^|`dV{XB$%Wm`ki-VQu)ize-krx%@E`KMtJU*-VsKXBR|hs-=rHNX6CAM zOXWBLL2jMXy>mN#(VJLoZS=^bY0D`!>g09){Q9KLNfv(bozIu8{8T9M@ZC(9knq|K zcMoYl^?h}XRp$x%*JiuLE@Re4??_!l5c!02K2BcHkt*{(=Hd}rtMv30iXQzBG837x z-mWIz!$?Xu?+j9mzzP9Qk#k>)=XQj(qePvVe7Gbg-iD=IFnNdLp4usDX3YlN`p!3O zKi-3*PEEG$j=OfMY|Gfq^pk8RaOo~2LN%GK;_2smN11tbzD8})U3$CNY)*s`$A!BD z)Bqj#bsV7ulAz4GW=l%Jpag_Gn3A!l(yg=PgwZvJg*(T zXl*BxPn-o9=!5Qib=nc_B$k*$P}W?TqIh z_`a>7G2^R7gS&=VQVsbY+iXoH{91qxiE$tMei{cl%DlMGCz`l7%hx=O<$$_AC!Te3 z@yhiLrd6tfc>A*1^;{P;y_D^Nn&^-Bgr4>zNM;!LPN=2Xb!9PS$Imf?4A2Ze38#&t zL5AJe9FSR>Ruzeyxu#VwYN>q?jX%J+7~~pJqu4I(z_ebYj|@GUcpWB!0&i9t9jCtA zLsm;LLxf)9-QTy43L-75HX%SwMaNJRwB1*xT?8gg1xygtxH)n9=Wz6vM)D;PDU-Zi zuB!7E?xL`cGi5Tn!JpA1|3Sn&z>C4|`3F2@mD_S$#3bpJ<_>R1wZq|e4{0p2$vPma ztQ_6Eg+`}nQPcIOOOMJnr@qX{s~06&Qm%d!D|HEPnd7=2GfMKP_Jw5(Gp?07cIUHr zfJ56tPOyp`SN>vUbECX;jCX9S*L{XwCAm~!-?5_;S_o4z8Eox-#8& zRpIDpl@SU0bStym(F)J*SL-!wIh-hdn{xA)W13tVf{jd#cwgOL~1y*aY zoYz>6%!N-v_Q{e{%hja0)?ccWf;FYx2G|(gKWEo)Rz2Swp}u`<+Ft6DsWlh;7HV;) zEo9i)8~U{g@}3!h&bN_iJHGKoWWIAklYy-#bjp;BN&VHU@yXKJ0`4*E=1Es*FLyXW zA|puHH{$I<)NXENxHThzLM~7S+e~?pA z!_c*>T%V51pqr}12dj20Pmten>8UNU_HKz|Gow0&rp4Jmo zkly>qTu7c}JYkQnl+!1C@v&I*A$O%rYGNCz^wUK+@aAr_&F9U~`L+WZ;~f2fksbW; zoSn$aPCX}GzvODn;@wz+_MH*mE1x-TVo^Kf8~bsu2cq?z!>CS037g&rB?uEHNDOye z5r{Em&V)OvktD#CW1IIP3p`NqPm@G^R9?1Z<-N;EwQM|@C{2Hz&TmpSGU&Dtx}jeZ zT(;3*G;6<`_`J}dLSbiV!SnML(qPUehIS$OM4ADcqN7WKn$VOg%YJBChDE_n*wRVR z@>H{E?W>{$@0ib9MQ4y;Dj1pTcuVqQN-pJY!r(Z}J1 zbe$7c+R96Ov>_X1%=qzycb`-?C-*f_HI;;X`sY0K zTuskD4S37<7+HZx8zG$zAW}-m8Z1>SK}d{-Ti)d6ZRBLkb$t9a;fTi@4^N@2BXSBBt?c0!u5g>wXH*Amfoc|ANngEA|4U_fly*#E`C$Xf^VRAv)8 zZ+qGwVGsECcsXc3N4&DMPP7DUjU&}2WlaZpkH_Zn$_bTz_y{_dY0O$sjA^)6IWqQJ z`2fC^&ho~vfbTWC7w5y-j@FC}@?=k6>85yeCK?xPXs=1DJLFPmkIiZ|zd=Re(n(pV zt1}Mis?!#nX5045%C|J$i+?QWKDOL;_<87gS=R>hxlaYBd9B9LI1ELtU78>G&p&57#BTkd_iJ zfkd~reO3%3f0NwqZ~XY0rulFD_$L(lM|cVf_<5-Gl_SFdyuWip@GFPr{XaeEN-z2w zMd%O3^uN0|3<~}e%*s!icT0nkwC#FER@(Gg>V0M8USgRwQ7Y?goBN_*cPsXJ)eTrY z?qS_v-AYVDfbZrz_MNYxM6&hYSB=dY5Q3_mEk2JVY}l{P96BY>w1Be@F~eO^#_d{KPt+78ls`Ke1s+$(4OtkXt^U z4Vs>-maqA}R+_PS^G4$K)Bez>{PR-@*gQq&uFD|@%b~Y~#cpI~K_1CCXFm>qptnUd z=k>C=OTR`ejryMaDd0&(^_wvEjSf+K@N9J`hJ%7Ce4}W3h(ygMoAh<7G z*oNOmbj0>%^Gl`9dLwGRjxctS%BM|+$s|-o(!QT54-C?Uh};5f6w%I_O)7R)2_>A< zO;4q&Yu5*M6z)9tiEmQQYz)(oUypcS-Hdh;)ES&Rih-PvqNYi`JhJbA&57)*($%%# ztNJ4jA3QJ21`;I_=AW*-mJjdbN3F(^G7_CQ2cF=glnDJU)LC%DU)G(E1+};%X3L_A zceMOBhoQI~#lZ5E4wti_EqPhaU755H@%9c=AJ`27#HqcpbW( ziPR;UP%$y2hOqJ8lUAaNK^;x%6FthrFwf`xa$(F7JD2;Ec2+`Yw7K$uIE2TV0o)Z& z9h^7XuHss?$psEEsssMlxaQ$xYKDJR?E%9F{^tUK1qAp60A_$cY**>?w+mqRhfUxr z{#>*1@?9m@Uu^=g-{|mPY`lB|SNi@n8;lQhg%o~i2Li+Ru0q!@Ha-vpbbT)TKtBHK zbKwW`UMc#&_7&iR@LxsoU!HfR(DPk?9vH$aaJ?@W3Ity73x-1eGQX>8SiUPX@yi%j zuW?lZaNWkwe|=mC5D2~A4gv)IwH=5Ta(zu9pxoghf31_17vxx(*OVf literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/test_elmhurst_cascade_pins.py b/tests/domain/modelling/test_elmhurst_cascade_pins.py index a5cec154..a83a7c89 100644 --- a/tests/domain/modelling/test_elmhurst_cascade_pins.py +++ b/tests/domain/modelling/test_elmhurst_cascade_pins.py @@ -856,6 +856,37 @@ def test_boiler_with_already_insulated_cylinder_overlay_reproduces_the_relodged_ _assert_overlay_reproduces_after(before, after, option.overlay) +def test_coal_boiler_with_cylinder_overlay_reproduces_the_relodged_after() -> None: + # Arrange — a SOLID-FUEL (coal) boiler (fuel 11, SAP code 153) heating a + # cylinder, on a mains-gas street, re-lodged as a gas condensing boiler + # (fuel 11->26, code 102, fanned flue + boiler flue type 2). Exercises the + # non-gas -> gas conversion for a solid-fuel boiler AND the new + # `boiler_flue_type` end-state (coal's before lodged none; every other cert + # already lodged flue type 2). The cylinder is already 80 mm insulated so the + # jacket is skipped; only the thermostat is added. + # + # The relodged after predates the user-locked "always add a cylinder + # thermostat when absent" rule, so it stale-lodged thermostat 'N'; the test + # corrects it to the rule's end-state 'Y' (the same correction the gas + # with-cylinder after received by re-lodging). Controls are already adequate + # (2106), so they are unchanged. + before: EpcPropertyData = parse_recommendation_summary( + "boiler_cyl_coal_001431_before.pdf" + ) + after: EpcPropertyData = parse_recommendation_summary( + "boiler_cyl_coal_001431_after.pdf" + ) + after.sap_heating.cylinder_thermostat = "Y" + recommendation: Recommendation | None = recommend_heating(before, _AnyProduct()) + assert recommendation is not None + option = next( + o for o in recommendation.options if o.measure_type == "gas_boiler_upgrade" + ) + + # Act / Assert + _assert_overlay_reproduces_after(before, after, option.overlay) + + # --- Solar PV cascade pins (ADR-0026) ------------------------------------- # # The solar before/after Summaries lodge *synthetic* PV arrays (each 1.00 kWp, diff --git a/tests/domain/modelling/test_heating_recommendation.py b/tests/domain/modelling/test_heating_recommendation.py index 9b011437..297b1f8e 100644 --- a/tests/domain/modelling/test_heating_recommendation.py +++ b/tests/domain/modelling/test_heating_recommendation.py @@ -280,6 +280,7 @@ def test_gas_boiler_with_cylinder_dwelling_yields_a_boiler_upgrade_bundle() -> N heat_emitter_type=1, sap_main_heating_code=102, fan_flue_present=True, + boiler_flue_type=2, water_heating_code=901, water_heating_fuel=26, cylinder_insulation_type=2, @@ -386,6 +387,7 @@ def test_gas_combi_dwelling_yields_a_combi_boiler_upgrade_bundle() -> None: heat_emitter_type=1, sap_main_heating_code=104, fan_flue_present=True, + boiler_flue_type=2, main_heating_control=2106, water_heating_code=901, water_heating_fuel=26,