From c7b1bc7958ddc65cf57dd19d88c52106f4ce5e9d Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 10 Feb 2025 16:20:55 +0700 Subject: [PATCH] Ausweis Verbrauchsausweis Gewerbe + Skala + Berechnung --- .../skala-verbrauchsausweis-gewerbe.png | Bin 0 -> 19816 bytes ...png => skala-verbrauchsausweis-wohnen.png} | Bin src/astro-typesafe-api-caller.ts | 4 +- src/components/AnsichtsausweisButton.svelte | 5 +- .../Ausweis/AusweisPreviewContainer.svelte | 5 +- .../Ausweis/PerformanceScore.svelte | 23 +- .../VerbrauchsausweisGewerbe_2016.ts | 281 +++++++++++++ .../bauwerkskatalog.json | 54 +++ src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 374 +++++++++++++++++- .../pdf/templates/GEG24_Nichtwohngebaeude.pdf | Bin 0 -> 53757 bytes .../BedarfsausweisWohnenModule.svelte | 1 + .../VerbrauchsausweisGewerbeModule.svelte | 36 +- .../VerbrauchsausweisWohnenModule.svelte | 2 + src/pages/pdf/ansichtsausweis.ts | 18 +- 14 files changed, 789 insertions(+), 14 deletions(-) create mode 100644 public/images/formular/skala-verbrauchsausweis-gewerbe.png rename public/images/formular/{SKALA-910.png => skala-verbrauchsausweis-wohnen.png} (100%) create mode 100644 src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts create mode 100644 src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json create mode 100644 src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf diff --git a/public/images/formular/skala-verbrauchsausweis-gewerbe.png b/public/images/formular/skala-verbrauchsausweis-gewerbe.png new file mode 100644 index 0000000000000000000000000000000000000000..686e54f8c976623fbff7ae868707861956d738a9 GIT binary patch literal 19816 zcmeFZWmH^C)GgY$yF0-pXb7$e4nYD00zrbi1qp5^xJw8S+}+(HXs{668Ye*GuCMx> z?~eC=-|>FjA9s(D&_M6qwX4>eYtFf96QQA|fP+bi34uUxloVxOLm)`8;PoOpD)?XO z?c+K4g8boyk~TUxe9_Ir!S@)>if=zaAhF7aa6C%-FOU)+pPFrNyF^4LU zos*k}2a2D_Nof(jRToTB^N0+VwwNKwRF~Vr*?Q^G1$~zCiq79iBh+3pKO0R;RS=Ib zgSJZSS89?FPjZhOud$oN&?p&?Q!-UruAX1mo=##pU8Vyarp(-jO}VhwWxVq4B)HL7ff>boXFW8;>-8Y9(sEcTGA z&G8aMZLS(?}%N}l^uLVL#Kot>@f9q&kf z(a&m3Z8#%aKNTG*Py-R8F=H)E7rydFu%b*dl)75*9ygg@{;lm$c+@?%dEb8eJ~ibw z0!2YTk70OtEDBFryNTg+I+wZGt9Dr1>v~YF{!@)u!8hNVglpMg8-~Cy&@XtcKdsp- zh!l<5@o^GNa#t;-kp;&%+ER!HQ-}f+?DH5-MH2j89MOE*d!EpN%#)z_kSE0x($N;{ zNLRPubnEwbK>WQ=xZ?tIQx@-@hYwZxqw{@26F$4AqlBo?s~=l3OuFIk-ZFN_IUByO zbC%HGzodHbPae@VH=MI!K-5Il_|&eGqij@T|8}4SxK*AGA@5t zQ0iz7!&_WgbzBaJnsaG+ehQPbs)#{OZagmu`Y1qM)-@AX`wiID}hUpK-l` z{?o{8G*2xlXAS0XEoJ%fL)+z1?KQbU4MEldvd*f^N~ku-#E@P+%carOoA z6`4$i7NLlx$~}CvCgR~9Cht&IU{|+M%7nt09pB{2p}!mWP?ZJToNWj=e5m5W1k#CU z^=nY}Y7w(niJqzj{G*;h_MYp_nu;gabX$46T0zbtb_3Dk5C$Z|9FaltZvWge2Fg(E zDqw=F-_Xe=ZQ&%6yzlUjtZc)&Fn3+EpBMgdjy7iNJ=)j-0fFWWE5w(z1xw3RzMUqr9NRRr~7C$4TH49Wd|^@WTMYe-8ULNpIA>cBr^mF_i($g$jR z7Y}>(u_-;)JT1&R*UnHxBWLE{Gqk@sVu)WWmJ)BR8$KO++QW)Nw|e@Ap<;q_{L3u1 z4y>0c9ZLVvNFK@x6Qt>Xu;o-3yuFqjxhPg$uPe$p_M-8`7n^{3TF>Q&uo$s(-GL83_>+#V+Zj`lfQ$l}aTAu< zv$D>`;%hszMq-AH)Q}-j32ce#(K9gYa=hlUkw(D4*-5wW=T$}+l4&cYh*it;Op8+A zdZZc_ta@Q#D^X^FHSWZ#-AqaU7Gpj6B?U_VhUnCuV&Pxveig{LOz~Te9X`&*rM>;< zFWEvGY~@4hDKcs>sE(N*V4abdg594QcU217te`p;@h>R)&jHS zpXXEaScdJiehv?}wkkkYRK)*|+gCPSmv zQ3TcZl68(=1xXDh8Fi5m#-KtZoGz;YA@M+gl{7M;ZC#iU#jM;(oRZa(V$ z+^ScVYGPK+li=!SPDnw1rGc-_La32NpF5nB99)gV?}*xkiTHZP1s0>h(Q<)ai5(4@ z=WDI-V zO_qm~=~L;I>g;ew1v)&> zjoyKtPhYT;m*qtJF;E|ge00VLScSeaLWFy4D|!_^(tQvd{ninBS)=-yev>C-u7g->2A#W9w2G%Z_S3g@=o(Jbcz=2r{V+8n4q9;Hu^& zB+w)y{Yxt!Pje}@5D-OlfLb3^h(!MvVF{Y=GH6hvjLH@2}-6(dGFwmM)F#oKh>KCT#)w%>w8iHUtkBSwFf{ z|BDMm9WBH>6v6B0Bqx~FqK*^u4Jm4>2evjzbi!ZGtauiN`Py#@S>GL+8cq<&1;D^` zS>BKDK-R3uail5O$c5KXXabc5auDC;Yo_s)Jfr=Zl5Msm=7dP~=A{>x#u}rUsQ=2_ z^i|>HV77?E-Fi=!=YLr$`t>{JPDGa-y@^zaRG{aI2vflVzia(3gP)D`judublICb% z1hcq$3Zb~eNJdo3bt&hD#RxQ6BOTos#iVXM6{5!#!)&020;w6~iy|w!X#4(74W$DaLko)yw5KO1``(ybgpj~J zc*mw|`k%`UQ=1U|t|4|OIA|l&qB7P;* zj!whhBOWKEk`+lv5H}x5bG1^~zu`w~x~$YXQm|PV6UAC(A@&q9F4S3xDV9Uu-1r+_4q%h9ol3j1h*e#xIl$PzeJE z1#+sjV&jUJ!g|^1Hj_r>+~wkM$E=hP`-ve}!I)(DW>6bCV^fK(Rf#*hr6@g}Q;H6A zOm?DwoG=i?Aw$RYsl+dPQ-1O;5?SEGkQE{@`_X( z_7B-;FmU~(H)+N2Zv}jA*&)u~mQjNF=tCC#gVj2pyFM}=N+2mRFw7GKYqHfHV=}yt zM1+_fYU6MhS%}4az=oi8p|uQR3N#AjcKCC>=@z2$iIKwISt|a1`Zk?2meRQ~n2+LW zUV*U*`ph@z9WzwQa>35lQq3SOi0`AU_!h=>di2oNI$I)?gMiaJ8>##x zmqu8*cU77~_TK}>ibx(*{+zHYu83#G^t!`K`lVS|b(z3KIvxaZ?7WtO>X==!_ts!* z?ZeZ)EprL|MN(;q0z2CmXd)-t0H`G3uodEhL>jzNY`oEd zQG6T#JPx;dUFVnHBh#|Wc3xo>0hcwRiH7C7@Q+7~FWqg5iCdrid!1cx0b(cxJ%XDq zsze6mc*{qGqu*FGT~%-bKrD`?7h8ChbL{stg=bu&m4dy%#01I^j-N6lxj}Je9KR>> zKcaDd%en_0dK;K3(|W~r`nu=tQp{HeZ>0f9sHqQ7jZz53F7r?Svna!_s=h#}}uTQ=cw zL~SPOFK&!?svq7eR9DGmR+eMt2$*|r}O8fy&X zBMJWvtVv#5*r;>VDDX6%7nMOR?2=Y1(MV^;j7IXiX~)zRuHc*L?;mh{S6()1)34e= z`Yv+I2%<-J&|b#l6TlD6c5|MeO8Dw1d~Z;t%f8QOCvwK(l=SOYyzI0MbP0iu2ZgR% zn-`$Sqp3d&b;+xS6pB!z{deXqa%U7re!aSlb@)lW%xBm9I7hdCz_Mi2QW%>)?~p|u zmvJi9N9Zenib#sjgveBBQERgJG)_p@8tDAHw0V`USI0w9HAD$Hc4OmCm0insE&rG~ zOzK}@1hJy_AtRU$6~wzp6c7+AGm=MsM}sOj8Z-ZQrl8`+<35Q3gcp;UVy#AYOxQo- z+>$HV4jL5}jS>7kneL8f0QWmV>=HV!HPgSR%#*%9DuHmJ7EYGWJ z>m zYQvBeFWIM*#U@sLdVv$7;1Txn-*+^eawtJtDEB6yMJ5esmGzti^dA%Xb}sr$_Cqq> zmT9N`mkN20ib|%9&mX)6c38-1-o1B&^q>hKQ=+CDuKu@}Fn;CVBBNxMB(Dd#N;G7e zg(z2#s1T9Hiik=~#QPPUr2iXF!v}UH=ohsD;57(fBlqG{TUZ1-`Lb;_ z<9nQ9;fqXjA8Q=%$q1vbzYg74MFR}T_%h%8F7If~3;3(Iyl(UDIh$C;!!`D@%0=dnqH>1QpQ$`^W09VB3)7`RdbifkV>o`5CkBh^RBrKz z*2_+p>W^eca!E5dH1Kv`!x$gD-e=lZ#(Y9L+DI*j`I3&A)%tF3ck-?@_w7ZclL zTsstgY4T6{xhtUC_in*{>`qI}cfTGc~}jS?(X0-2!9$^scJ5|3iNF z3M|S^*`>{K&%OTH(6mF_34+rW^ZJ%zCv2@k zO&s(3#>>$hq(|kjTM^kA*4Mri35U<`coqdqg53gb)jQGmJqhQcn-j)5ybRvHvFCMG ze2{N+TzhtTCS_JiQ-~x>-res8laG^K{!}QAZF|3IC@pE*mj!AUR3k$!f&IW zx@v6NGofvWC!p6YLfy%|^XEx5=HzDcr5=@5?LQnR2}5I66Bm^1#`bR~Y$h5wB*BZa zqs|fiFYK~i#)B&5k*Y)`(@lQYD{>Wv3d4yrw6cu}Xh}=BWY@SsYe<6&uG=#o5?160 zhJMuRHMG2Dl3MUN`MvQdS(i?kcy$R|XdPb@^;PF#V1)S2P7MD~LVD<(w`$&Bcr<0z z+$+1RU9&Rl0VV`L8pC$4c;oQM0R)0WGlN|CfB)6u>uQs~zYD+cnW4U^)c+*ucLPn< zQtLJHf$8i{9W+?}`V#cE-ZIzc^5E)vEWk)$WOu6kcq2*O6r5C2Uj7|}^=qKt#ayxV zJeNTebdWXs2Wz%(@X(Mlwbw=hxsc;K_NbcgT!wAL)g338pP#-BJ~?rv{s;{cK4@8o z3V$;DDkvzp20!iFCoD}PquA3ca8Or*0aE^H!Rb>HchO?N|)o$BQ|ueAt4f=o-mrX%U6u(nLLpay0tpY)BW`3 zt%U_MuGHPpY{Qt;BelB3Iq{onqnIwgThp~45#++oCKJ~))y8rCbOF@a0S_X!c6P@x zPQFNt3bFe~{QLHnV_7lq$*!#>_#TS${YM0mrjCwId{t{J#WTxaJ$Kiqns45O9NuY^;O#T{Q=%#Sw;(BAkxAL`tJ>5XpJ>tDl6=$K2>9qeks0+A zy~^OV9;a7L7r2Gqwz#Z2|KjVHX4i>-BYX5)g=cj{Xyu=6FLFLp zWHoR-rli49wrSj2%MnWWS;oG{DByNoz{jiwBH>y;zXuZ*Jy&nVn5kygeSh)q%^DdQ z2{<(19CltVe-W@D^uE}CTb8#^DCoEtPUYBw06EG$^erA~8*R3kWD$S3TGy*H$7plk z3pIJ5nfc}we}kI~7?lc^^r*--wNl~hLT49@+UQ{*^~}$Ar!wFEQmeI|V4&bLm6h@G zT=Da~p6PzjiGN79t0L%kF}303ysvRW_5_V}Y4ibe}Oq8O{{>P~>*FEb;jbJ984NI;oke6-l*LrD6M< zSjn56VDJ5z>g>mMyFx>9ftIN!Ts2l(>ZECZ(w-?oP{{DODU~#tpe45<8 zfL5_uN@QeYFh9t$Yn1)~92^|iyW@Vc0vZ8pjb4`|K6&o0tF_?6(x#?2Sw07?qfgh= zwppdFBP!$mP8K)&bfp^mzx6)f)zNsAx?9EjdD@{juP$}34W>yy{$eLT?(@yfjo$pL z48g&FFo-aJ9{>=l`*^%YKT*cxyT8vwB|Mt;te@7JB}s`w%D=;5Lz&&{d`kDR-pQHl z^m;qHUoiM5V*e*BGG#BXRtWx#`zBb@RL7;ZIWJnT4T200Fkf~3v_7+AeX%s0?T20M z_qPEL+X15WA2Zj;y07G(TEnk1pmS#MZ7H8FE>*(qZ zuZGb%;>`{Z4Q+hKlWMRbulE0oGH+@a?bsee*kYRO;l zR0=0|m)9`DUQ-GZmSj?pjXb4_Yz~$kJv7poP;@nTp(xM_37sF=5p!M?V zE?Yc%4h|0UyQ||1row4aQav8yuEi#q%0_CB+4mR7w2Kb%*4mP&U>1ex)t zC2wt65)fQZWSuNN&I5_MxZP-tSz!;-}EDiH}+n4T0rRD3MT;ZQ!BoItGB<)C%D@3Y^-_4dNp#o~vtS&Whp zTv0{-G*v6I=7KCxIc6`M7F%3uu|QE+#WVXGaF$OuH-?H!Odn zzeaREhh{IymCMc4?mLTp&z0pK7f{)Lw|hEK-BNq+l>K;K9Y8{m04m2E9UPzR=Xc_66IHkg z2olcsW>gFfGnaUUoLZz z4=1U?NZBA;=AgB8b-!spj%A7oc^n;hWnFdA861EL+-ZhsggCLXibD3z1n=zOw)=5G zt^4+%-QfmQyM-8|mI*&-5Ssn`VZh_9AWV+T(7brX=dhE3;iMOhZdTBDTn5eENJeZ< z?65=2`JA3o*dL_3$IX*4YKAmb`Dngc&gAOuhqmx=0U@CUPIGw3``>#L5VUS2s@Ttq z9kiH*CD&^&`<}isXo}+L(gSt%de&~b;;kSI%#-zG*U1nk1EEx}OCN>RY=hL}^%(5z z$T9V26xqU|?Gd!skYg5H3_jqrG09tdpEtKB!#q5~M`@CN-n~w(xw*ZxC9H%PZ<`%6 z!;x8qzBi!J`PLLn+VJ%axb)Ll6?+yYeFJ3=+=4HNrp?=x$1a>B0B$S{y(#HINNDr- zDj(0!+xDvJ-B0(7ALqGm0ZFT!H1__>On^}p9X84GD*eyjO|HUcW8(ED0lT0Y0Q%+O zO|B<(`s*1=_vYu%q;pQ)_xoMI4C%rrNFd>SGkZVme+#n;x!U2|iKckwAswN@id{z2 zUwgX&?yDa$`H0*GMBBwbi{rU3VKm4S?Qg$D5%!T&m1t{g5Bx4vkz?|I;ilX5fepI> zWG18MlDls267kQDi+MZOtJSdni@gch_Vha+SffXlT~({RY;aQA`<#_#C*yX%2Y~7} zlUeT5Zy5-wvHnq~ZY}y>djVL#G)`X(-PKtP+qct!nC`SDl$d)Cs<$Dl^O?9h2PY>= z;Mu{F*qey=`KnBW7ih~VpTx-Nh3!abD~PeEzh}nowbdH1=UXiUdiR9kICB(4h1sN$ zb1%xV{G?pPyVln%s$b~8hvB6H*cQ8(JD)Lj8m3-eBU-YN9b1$~$^iWAovf_?W%~-r zFCIdvtD6xg|4EF(eQHkKs$@_gh5<>nYySY?1b~zMu+RPZOq8NCKZAI^2td^g!KA@i z9OE+~+J`Qh{)qc7Jc%=n_Wddku?$7$9GYcK{LWWGl)?|IcmXw&#j0th#VY}i_Z~NZ zT(UDTj7eO6&AjM5^cyR>2gtd920%Rb6mu2>@MTf-NbC8YdsCY zYRqQ3ob7s(Ln6X`*Qr)&CZ%q6@_&=qqX`2BXg{|c@aQK7=Ud5uTn>VH-PZ}-dAqj* zOHMWPNXw*MPL#A5A{K)cWjNN^C`H9Yl)qSx#`Psgi`r81_;83Cstpl`vX=p<|?&k%OWljw?A&JyxEF*lHUp95z^ z3pR0*HzlupMxM_Q@0aJ_R_-uLOb{uN8GU@uno@VBudi?4!|Sm>J8LzOWIki)nHe5_ z2Wm+DWL3)=W`dqjuv!(}-j=$8T)}x>8pB>?*?flF?y3%IyztsHr`mw70fWzDO<_D4b z>|d$tL3Plw`&^(q1%f}nv=jrvYd>2vYqh$PrizM1`jqYGt|tcrT)o_NKVCi_O&d5h z-t_DOl2vOz#}DZNf{DZ@M@&Bq&W|C``^y!c8?V|1Lz$H>zheLfW)FAQUjQ2H*I%D* zFI)oB!5VlmH3o2C+;ZMJO!obJRSu|W!hqWxXRO@yefFHIv$$G$yf=nOzkN#q@*A1n z`XvJ*y^&DWo+&8xkU;mn>Gyy*mQ+{wgKR`VUU_+zds{Wn{SuJ1J|L$iK%KZdN$q}` zZfP+8wxLsQ5|>8wk0kxd)b8<;=St%tfU$rzfYE&bE;Dhm?5k*6{{ zHjOB;^!UUukOT>8#W4RO&%>5g^H_sb&N5Pr$8-I<~B$!fT5# zG!Ti`qzAH)Fw)d8Ts_~!pM7|Hb>P_@6&i{PzoxFSU*mm6%YX!e5&U3sJKDZ)}u?C)3nK|1v>jitPd47V}-{2NW+7(0gJCT%2K(^FpLM zGUfKH4Cc*i{rq&t|NKEV!-mXykVJZjQ#h(O7y9eleFt#g^r1LT>Vdqg`_%Xc#}=T} zy;Hiz4wpn3f)3vRNeRt;8MX%3y}#0)IV>U8^h@R|#Pv}*bp!!+G(OolGxgiDb2^CuLoh;gJs=F^z&vx890L)L?!lLlL zLSkVEuqylIj%!Y@Xt!PzGLw^yL1#lU5P$M=awu?_T&R+23YT|)NZPAM*1l@00#3rt zL_QkCWcAypT6)KcJh_YeGM#crgOQX2jc({(1mA2Y~|G1s$$qNh%2P0!MGe$~EN(eHH zZ=Q3vY5%ghaLKdpBA+S9>|-N=w2bb+M0d0O-0R4xLv8r%|CyR{c)ry1CvDs7!rsDv zen%&(%BUMa$5R%yuhw|jaFiaVn=S^0)f*TGV| z*IcwL@qsBEm?xvj};{7gD9Rk`hDZDVtd z=h}U$Sor#)!j2)KC*Xc2U=D?735dz#{bj#RaVF{Q*M*@bo66eD zWuJvylW+He_=_k+5+#mfO|Ethb+aCgoa6fIz(+yF$G&%)vq*gpkmuuC1gkTE;W;;; z<{(W0-IFQJsmkopbW*gS6bQksBA_LmWZ63QfO@WzS7xws-Uu}Co`c;Gou-LvG#i9Hs!>Oxv0MLTIQqbTz;b zzuri?n66gg=_JKl#cVi2fJ(4S<+KY&WC zdH)?1LNm!CF;;)ruAk9y(6+a4DAT;?ight-h6h|3_BT@RArlj~G&y?>!=PBAci&7^ zJ6~_6!rd$nZ#y#%r*i9dJ9R(#Jt^v$$1Yh&7+P0g|#_R$diZh_R<78?Rire`b0Kb`5)B0b%&)7;( zpzQ_JB?4r+qn4N*S7rEYcX@ev6mEJar>h~ES%2(Lu%txo%!=%vlGG*V9_|5UuX*Jt z=l}NGb_xO%6uTlnx@A|2%6#igX9J4M9wa;nI_^NeJEg6Sk82P!|b{H1HnnHrht>CT)1YGo0wNWRp&xO5emN>=BP;41cV4T5v^j8Uo zj(za_;g80)*mO`P=rI2e5Y<%1xAQZ+t{aMrZj-Mr4x-@3T5cF^ox{15j-jE0I&b5) zXIFW{Eoi`mpy4$g>Q?9x+&j{--WLeS3t3HF+azh{BDbHBBzoQce)ir1!Uxlp2JQ3avzlr^X2KBu z03+8-_eq;+26A9o8HW!ddU$pWt`iZmiF%3qkES|3ssm;IG;Cmxh(LOPNYOnDd^*pa ze?I&Bx9P$etl3#zi+LP*sz zi=CYvAK;iz^&8O3-&B5s8+Nz8Kf(zhO)#Ma{m$Y^n+2JyeofnJ+gWJl0R`34M=L|j zvr6K$5iGgS=Y#l{xH5p_HB6I>c~lrq!`(~z77I4}@4%;>1*%Q7IEQ&UUjYxBQlJD% z;#bsKRfQXZiu1zD%d36l6(kTi5c9Z9-`Z4*CqDw~4}z>K{q2&3goIqe+YLiy=K7n} z%b=XFd5s37JZHM4tfnTeg`uiH+%Ky;FVbQ71&w~av$bY0rC6cmkKZL3;FkFURH7oo z|NdqUX$Y{b+2y=ept2W|cEbr6$Lp=e2vbTv07HAO?HWYCsV9P*PuTuayHKEmUDAYE zZuPe&LUhO5OyKY*RaNE%aE$&GWlH!o(HJ{{ zJ5L0RUBe&1&3uCbt(Q6L=d!bCK7Q{rYlALxes;6IX!eg1SI`jPOu*;khC)FY)u@CVzZzbE2-r8-0~75E2+I%vT(fmzK>>mNl046r=4J2USR@_bJZlxHCfH0C z4FaRx{yyu&sEDAS+x~Fn85Dq-W!axR-{O-0iVmDQ#95sT{}5`*}$GF-pAp7l%k?&pu)n40u47x$rAftHT1>9n`=6%y5PxoD2csR)D6!leZpUO;7b}yTU9jvY6+uB6Ms^%)2mpK9+PP1Vb^+iSUfx4`X)3R5 zZt5eK0JYf6tVH7O=zFb;Y&HNZpcT6%K_lefVSWWX#$%rD;V5jBO}{u|dIazx7Es56 z7XiLDNj%}tS^`9Zd(iy%K|Yu>qgG&N!>%epa@Cp1fQE+{YSX%~E8q=7#*a6;?Uj`! zB{l2Do+RA>Ar=E^I$}89ICTJVjaQ z@!=i?y-&XLZ&AhunB*j*PVYI`1K`@q{IOea$& z=i$jbCbh&^5&-EY>r5O<0mbQRV>%T&iIT`JTU%T6>l>w0`BrN zw<9^L*wTyI+S;Hwx4@-qm(YmpYMADCm~R;6b{xD10b$pOs}Ms;VrK_h1N9*b+ugv0 z!KeB)ciJ(F;Ct2x*l9ni$zhp37PXu#+y!@`F3xdGe(eh2_UCVSko*RkEYDrU>tti} z>FeT;N4;oK(>M^|$HYC=tLZ6P>hSuoZ^CjT3et}`MR~5F@5`*o@Pux+|Ghb=(qefn z%w!TRzXA+h2bpUdDjo3P#xtPVwGD9+7hfde2c5n@UIskQz#9muM&6}d+n}4M|LXE@ zarQjY$=wXFR;g6lErv-&K&(d<(EzM&XlO`o)63iiK2nmz#cckRpcmk4{l6cN;{u+h zR{#l6d6x!VJ5$Yayje)=*jRx zKfrVxa?&2#?k^TXWZPdu*$C~)1CFDNfj)m(0JdNQV~z*zc$!*Gb=$(5U?PBeZUU9} zW@5}hUw>oXt~zD)dzgxjP6|-g(*D4$9t11_>o=v@1_M(LY6f1|GY*{sZZqKaH0YQy1MTe!Ow$24Y`W3FZknUKRN4>Ts(W z2=*ZzT|=ESWDVdq-#uJ*$2G13@ZlA{JtsK=YG(dIZ-0Lu?(VaGbq+q;pVI=ty8*~q zG8|6iQqMuFY5+9E9N+<@t)nvtRH?=8pV9^QCO2JPt5IqZV8y`E>b0RE7vPc!+4uWa zpiz<@+yLaVD_G~@9GMXKv;w`s1R6%IKnSL0N9SI~le(+nIQ+rNt=WeHIUIrva7zPT(GV z-V;#U3c&aj$Fd|g0m>zV8lP|dZ_g7RH-DGfo3%ls=<0agz|c{*#`GuVHLx?;0B$A% zu%`emDZs$rPFEQk2;2jv%?a=sb{YTA$9~x(+^35Ci^sa3)l5*LSYyzH_7dIhlRnpU?Z=+K%ao zA1PUH-fjf6k9LefdJuBrn{)Q-8egOQb?}dT%K3FnP3!%J@@5vfFpMJ2RBo#yKe*H%pt_LZZeRP2YHAu;RNL?#|^>4dTZJ+T6`)D^EV?wfO32 z^wpR~1$bUxM?Ww-G`uQ~xt>pVoG};|e1DoY>{EM3swAEdxadE-qA$;b1OD=GnQMKr*O(nsA4O{m+8dgi6@E83!SYz}Wvm?u+pZgTrZBT0g(RM3mOyp$649K6j zcH3{J<_g*98XoYyo`euj8x%;|x9%Ok&r>! z_=tPq`Mz)0Yu)V~jI)XhHtv_SgXvetc_b2{LWvobdbIim{(SzNA6N)u9JpM4>~EK? zIAzVN3z7p+EpniY3HR45(MbK%vC=jxwExJ31lH(pFT;wIP~hf!rr5I*7u`3lovXfp9;m|MeAEx6_1 zWVo$=;T@P-3~bf&hV!BX<;Pb1&*O6D-NkFYVM)5nY|S)5`5{-HRZjv5z_SuV)%&9Q zIMj0X8Ehqo)_y;Rtf0gg)DBcpzJ!KO&ZggpGkG32WX0KjJd}X8+p0_CLxT7ai?aQlRxISY%ji4tJPS=By`)608>IvqC zD%OnaL9Ow67!7C=^dJ^Y86^Y0YG-a0icETf$Ml*fi2XZb!}Qfv`3qtD7YqKzqWtQ! zw0R325tXdJ+Lo64cBS406mV^z#j>=kQN4>82~n)VZ>^K}r(13NX1?m(Fnc(I8Y^g= z;QlEnA6*uOEbhcJMHwHDnwd~o**ug1_GG4SZ7<}?0WH?wD9vmWw>#S!`sLD~{&d#< z`^V#_q_jRy9&Uv`{l#oJPt)~nXOGyBmuN4vqWa)ik1It`k$fZmSH$`Lh@R)_H%&e) z_6M6;_gG$v(tlek7y8HCt{7AZ%bA}kC3{8eUuPZt`DZk9YUgP0>woXi<^a2fFRK=@ zbczTmF)8rImA_y5ktenPCSM#O=_E)D4=-tuRlOitM6^^r_zXvKTSKM1Cec5+b)|?H zEgG2kUxKYdz7{5!x-d-$PT1nlAfY*`(Z=RlY0p8pJUB~iVQae$2Ht&&f5 zq3wVjoZzqyWB=()EsPwNi;!_#*i0OY^%31W^sLdz=evt9TCB_a|(hh5i4t2X?Vc{}bjPk(!CyuDi zvV*`z-(BnL?~Xr2@3s!Yz>|JYx)3#TC;otk<6JbhSXXapRbS*Z?x9GGxP67YFXJ>m zraahOD`+h1`FyPyz*GM_0oH4MYTTJ{xQj+4bMuWWph$`LDgg3GlQ6q607v> zcsNHDF%MhZfqp2NLF~WzF;qwG%_pUlei2WAH_{a}fzh3>tCRj<9sL3&kz8AZ9O+!z zO~o@L!-XF4O0zAbq~BIA{if+``;8on z*wWR<`y4xDI4pN`fyUymtF;t5z68xXKWxlWhcpWD|7b^J$m{VcR1MTINFUcr<<#E2 zX)5oy_cUGbE2v@4Pmo8x|MCZh{k86v3EPG;au;W_Bsc^+FghcM3AyV6dL5cM2lj!Y zY0i<+GvE`D6Lo+%Y9m~+zGA1Vn&vGdq+*JgB9RDMSA&7a1z4O_k!hgXIhdWAVV!3t z`-Xzp5|f>)0<9$w==YbH>{t5n&cd<(P4Gk$c#wh((v?%oj?!I$*ccKD@w;)qYEvdG zzvfj`qTDQz=Gx^YzJ&&+Bh?mDMxVq?l?X1;gI}Qr#vxO;h!d#(JHdY>5y{7pphyhX z_Qz1Sy`TrQeY`*C2S-yWY|hwB&>ZT`SscHbY%$E+nP{Ar74R1Yut(s37ohLJC_wwU zdk8{~PJGZ&5yMaDf1C76Xppn;q>(i!N7M)hmu|kzSqWcYh|Ic>$3uPvJ?2Qs){*)z6J`*PsD1A=Z zI+8;3_f&LgAEg#Y3ROx)=_d(Q(sa#IeS2o(e$7T-VrFV9yhPGFV(@1|E)cE|Qy^l4 z|LrE9$IM4CG>lC~6DZ@~mweFslXb(DGq!xhStjc12eQr(qe}3mOFGrUr^#-jq@toP zi#(XiS~fdWQtuO~;wvmd3_5m)928!TcahRh$n##ll+kv^sz5@%Y~V1LO0iF`!Rr)% z?N(+8o)$=X|82M|mZIPSNbw>GWF$CF3uJ^z=?-A+v63o3=i1pR$ zBQ|4UM@9%2<=-vhbREKxl%)xu9YvF)F33CkQMWtku)Jzv;9#3#G% zhjx*F3UO9FA>U7;3_Uql`Z$7W!A&oz5sN&O^FF%gG-QH?h6##vL;~dus>b%c!dJA% zRun_EEcmGWjx8yWAA|meaHc4(^CLt?_D?Q9zB&C7f;l7P(GKOF z%yy!Lyn%=!OfpEzBW*6NQj!f-zVMUdVe0p#DJext)M3W3Rd)T!$AbL|WgM05C53IK zesq~AI?l5EM=qNRMZZ|mW(rJ6)h4@4{>mrleM`y!8aS{%n|*gQs}{h-Zxy9@Tf0;F z&V`8~@3+>)0Rda)QgnawtOzAOlC)gYCC6a^J?UR1&d28M52(@LY1Jfrl2-a62rJb_ ziGXXfZc(SbE!hBhgD{4Dp!`pxmq7?Vh(n*MNo*4>XtKINR#VQkjErUNqG(?TGVn|y zZbE#-zSk655p`%I))i86?n=FEDr)}$aq5S#Xyu-?1d|_#ezzzYfR(WL zusrWzo*H|F$KvJ-e+)-?U}rIFOaal94#ta*-hc|F3U|%r99oUa={>E@{UuYTPJ>Fv zk6BXsLf+R}$0$+!GmG=DEMn4>_D=#|idH}C^oEB?{6RnK)u8?=PCA@fc*T24n^h5j zUjC~%Fe6CqBQHmYKzagSpc=BeL>cs}`voa83L5SZw1;m13!4!Qm&2bo_f*}Kh(L3Y zjq1oo`g#rx@4I@vOm=4p`4X=JQlH{D`d~W>t5hJUMDy-!2+3&Ru_%NpLhyV{Hbu!l zSV_t+u}!`r3kns{t0Bg8-sYNq)11Bik`&~Ji%m;X!G`px2)V8O`3`J4uQm^1j5~llqw`$4nRt8zg<2-+qXy;Clkub6RcWg+ zV=;8Z-lKOO^x{dGol8n?2Y%RN%0vVyMjs8zFh<$>1b@y2@;ZH>UaTT|WqtAx$1-a0 zrd9x+ef3976~wRnny0b znRY~nd-22)JSBhR!K(X?>BlFtch-F4qBuR$U;+np#^`xuG#g9yXoh<$xO?$6w|D*0cEEJS`8hM*=wQp=>z5dT| zQY2P6FbCM^VRw%g2b&79`GH7B)ooUmo(|O!F4UZS7^pvy3FXAUy%hfk8rkB!k-hmN z2I+lN|Jqs>7N{iI6s1M?+bmdRk70SQ37>6La4zYEJ{ePR;LpB< zxhptiJS>Uliw?qE#k###n_JrhI0LTF)UOxv+pk+VZTQt#&_t-|E@HIoCZ#MY4AbWe zVWBqSq!x)x{e_WTfv;75kA`vSWvqJfLLLpuQ#x32_B-c4o9|q^sK3~sOx0|>8JpXHQMdbhs#essk^jhEO*RoL(m5=e@ z(&Dcrw1AQJxD}^DaUIPB4*#n4;1o&`?nzaqZvO=RbIUeeRwQ_hMg|)FRRWfrOxcQbV-APfLIX3|sn-KIcHwXIJ+BJqI}x zye!+HIzo(l$b5Vftv-gMVW0qKt6c$>w0GBY!X*XbNo+qN{HW(bH!B-*cE_fk07cV| z3KSg1bgtSais{Oc74}y{WPy1*-Nl#+Jj3km%atxv)VXs>1(ed14e4-0 z@Z$0!D=r`ojvQ{OjxdkUx=wXC5v!O4axoOV72!(UDybje^zWny`x|%dyI%W3vJ8#4 zDz6yxLyFP?HK};0nVs2XSp}O=_&R-EDoVrRKF1g!L748-RxijV-njyr;zd<9P!eB` zw-vEjgt!HFjBN2~m{p@S=A-f|kC+CU-{1hzo6h-7(~L4qsNkoHj{-tcV~E$(f9K{^ zVAV8-)9*QA`-JzD%M{i@H3%FV-#>fT76k`#eCp$lV*=hS#|fLfDbqG?QfK99$NQ|q ze4UKZtdlYtE9q%uyK}ImOvv)xqhAOBkClZf9vLU&?2hWZiU z(+8J4>-^R!BhG_IqVdFpXE5PzW9;Wu4YS+5k>WBCO9g|&!+NI{Hp5kKiCD7J&vOzR z5BxgKD+yo2Q0In7Yl7lJ8fz z)~ATpJVIu+ohA$2!?gu|j5fqxvZeyawt8Fyv$MC#!GM=&%^#slGtBEf-D_*kCEb|C zpsMf*3%`7T!oe;NWC9koYu+2>2c&zpNgxx7k_Pip^{E+Ye`Hk-2A42zXsEN>gLBGf z#<9dhwTQ{bir0psHK6Kri=UCw3W zY0$9;{GL@|ha)|on86wCAb)R4#tA2NI&JLx_ptxX7}%|_i+AvBNMt$XKPcdvtgoeC HUH;`?*fpl! literal 0 HcmV?d00001 diff --git a/public/images/formular/SKALA-910.png b/public/images/formular/skala-verbrauchsausweis-wohnen.png similarity index 100% rename from public/images/formular/SKALA-910.png rename to public/images/formular/skala-verbrauchsausweis-wohnen.png diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 6cc46fc7..81eb88cc 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -8,8 +8,8 @@ export const createCaller = createCallerFactory({ "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), + "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "objekt": await import("../src/pages/api/objekt/index.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"), @@ -17,9 +17,9 @@ export const createCaller = createCallerFactory({ "user/self": await import("../src/pages/api/user/self.ts"), "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), - "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), + "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"), "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), }) \ No newline at end of file diff --git a/src/components/AnsichtsausweisButton.svelte b/src/components/AnsichtsausweisButton.svelte index a111aa9a..831c8dc7 100644 --- a/src/components/AnsichtsausweisButton.svelte +++ b/src/components/AnsichtsausweisButton.svelte @@ -1,11 +1,13 @@
@@ -60,8 +61,8 @@
- - + +
diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte index 164d236a..8487f6c3 100644 --- a/src/components/Ausweis/PerformanceScore.svelte +++ b/src/components/Ausweis/PerformanceScore.svelte @@ -9,12 +9,20 @@ VerbrauchsausweisWohnenClient, } from "./types.js"; import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; + import { Enums } from "@ibcornelsen/database/client"; + import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let aufnahme: AufnahmeClient; export let objekt: ObjektClient; + export let ausweisart: Enums.Ausweisart; - let maxPerformance = 250; + let maxPerformance = { + [Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000, + [Enums.Ausweisart.VerbrauchsausweisWohnen]: 250, + [Enums.Ausweisart.BedarfsausweisWohnen]: 250, + [Enums.Ausweisart.BedarfsausweisGewerbe]: 250 + }[ausweisart]; /** * We use linear interpolation to scale the value between the given boundaries. @@ -54,7 +62,12 @@ let translation_2 = 0; $: { (async () => { - const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + let result; + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + } if (!result) { return; @@ -71,7 +84,11 @@ }
- Energieeffizienz Skala + {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen} + Energieeffizienz Skala + {:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe} + Energieeffizienz Skala + {/if} 500 && aufnahme.nutzflaeche <= 50000) { + faktorHeizung = 4.53 * (aufnahme.nutzflaeche ** -0.215) + 0.27; + } else { + faktorHeizung = 0.71; + } + + let tekHeizung = tekWerte[0] * faktorHeizung; + let tekWarmwasser = tekWerte[1] * faktorWarmwasser; + let tekLueftung = ausweis.stromverbrauch_enthaelt_lueftung ? tekWerte[2] : 0; + + let tekEingebauteBeleuchtung = ausweis.stromverbrauch_enthaelt_beleuchtung ? tekWerte[3] : 0; + let tekKaelte = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[4] : 0; + + let tekHilfsenergieKuehlung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[5] : 0; + let tekBeEntfeuchtung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[6] : 0; + + // TODO: let tekAufzug = ausweis.nwaufzug ? 2 : 0; + let tekAufzug = 0; + + let tekSonstiges = (ausweis.stromverbrauch_enthaelt_sonstige != null && ausweis.stromverbrauch_enthaelt_sonstige.length > 0) ? tekWerte[7] : 0; + + let vergleichsWertWaerme = tekHeizung + tekKaelte + tekBeEntfeuchtung; + let vergleichsWertStrom = tekWarmwasser + tekLueftung + tekEingebauteBeleuchtung + tekHilfsenergieKuehlung + tekAufzug + tekSonstiges; + + return [vergleichsWertWaerme, vergleichsWertStrom]; +} + +/** + * Gibt einen array bestehend aus + * [0]: Endenergieverbrauch + * [1]: Primärenergiebedarf + * zurück. + * + * @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll + * @return VerbrauchsausweisGewerbeCalculationResult + */ +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) { + if (!aufnahme || !objekt || !ausweis) { + return null; + } + + const nutzflaeche = aufnahme.nutzflaeche || 0; + + let startdatum = moment(ausweis.startdatum); + + let klimafaktoren: Awaited> = [{ + month: startdatum.month(), + year: startdatum.year(), + klimafaktor: 1 + }, + { + month: startdatum.month(), + year: startdatum.year() + 1, + klimafaktor: 1 + }, + { + month: startdatum.month(), + year: startdatum.year() + 2, + klimafaktor: 1 + }]; + + try { + const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) + + if (response) { + klimafaktoren = response + } + } catch (e) { + // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. + // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. + // return null + } + + // Endenergieverbrauch + // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. + let umrechnungsfaktor = 1, primaerfaktor = 1, coe = 1; + let umrechnungsfaktor_1 = 1, primaerfaktor_1 = 1, coe_1 = 1; + if (ausweis.brennstoff_1 && ausweis.einheit_1) { + let result = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1); + umrechnungsfaktor = result.umrechnungsfaktor + primaerfaktor = result.primaerenergiefaktor + coe = result.coe + } + + if (ausweis.brennstoff_2 && ausweis.einheit_2) { + let result = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2); + umrechnungsfaktor_1 = result.umrechnungsfaktor + primaerfaktor_1 = result.primaerenergiefaktor + coe_1 = result.coe + } + + let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * umrechnungsfaktor; + let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * umrechnungsfaktor_1; + + let energieVerbrauchWarmwasser_1 = 0; + let energieVerbrauchWarmwasser_2 = 0; + + if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) { + + // Wenn Warmwasser enthalten und Anteil bekannt + energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100); + energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); + + } else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){ + if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") { + energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5; + energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); + + } else { + energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.05; + energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); + + } + } else + { + energieVerbrauchWarmwasser_1 = 0; + energieVerbrauchWarmwasser_2 = 0; + } + + let kuehlungsZuschlag_1: number; + let kuehlungsZuschlag_2: number; + if (ausweis.wird_gekuehlt) { + kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100); + kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100); + } else { + kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0; + } + + // Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden. + let leerstand = (aufnahme.leerstand || 0) / 100; + + let energieVerbrauchHeizung_1 = energieVerbrauchGesamt_1 - energieVerbrauchWarmwasser_1 - kuehlungsZuschlag_1; + let energieVerbrauchHeizung_2 = energieVerbrauchGesamt_2 - energieVerbrauchWarmwasser_2 - kuehlungsZuschlag_2; + + let durchschnittsKlimafaktor = klimafaktoren.reduce((acc, c) => acc + c.klimafaktor, 0) / klimafaktoren.length; + + let energieVerbrauchHeizungBereinigt_1 = energieVerbrauchHeizung_1 * durchschnittsKlimafaktor; + let energieVerbrauchHeizungBereinigt_2 = energieVerbrauchHeizung_2 * durchschnittsKlimafaktor; + + let durchschnittsEnergieVerbrauchHeizungBereingt = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2) / (3 * nutzflaeche); + + let faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = -0.0028 * durchschnittsEnergieVerbrauchHeizungBereingt + 0.9147; + + if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt <= 0.25) { + faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 0.25; + } else if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt >= 1.0) { + faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 1.0; + } + + let leerstandsZuschlagHeizung = faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * leerstand * (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2); + let leerstandsZuschlagWarmwasser = leerstand * (energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2); + let leerstandsZuschlagKuehlung = leerstand * (kuehlungsZuschlag_1 + kuehlungsZuschlag_2); + + + let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche); + let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche); + + let energieVerbrauchStrom = ausweis.strom_1 + ausweis.strom_2 + ausweis.strom_3; + let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom; + + let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche); + let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8; + + let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560; + + let endEnergieVerbrauchLeerstandsZuschlag = (leerstandsZuschlagHeizung + leerstandsZuschlagWarmwasser + leerstandsZuschlagKuehlung) / (3 * nutzflaeche); + let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche); + let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche); + + let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * primaerfaktor; + let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * primaerfaktor_1; + + let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * primaerfaktor; + let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * primaerfaktor; + let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * primaerfaktor_1; + + let co2Emissionen_1 = endEnergieVerbrauch_1 * coe; + let co2Emissionen_2 = endEnergieVerbrauch_2 * coe_1; + + let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * coe; + let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * coe; + let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * coe_1; + + let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag; + let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom; + let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom; + + let [vergleichsWertWaerme, vergleichsWertStrom] = vergleichsWertNichtWohngebaeude(ausweis, aufnahme); + + // Return all the steps that this function includes for debugging as a json object + return { + umrechnungsfaktor : umrechnungsfaktor, + primaerfaktor : primaerfaktor, + coe : coe, + umrechnungsfaktor_1 : umrechnungsfaktor_1, + primaerfaktor_1 : primaerfaktor_1, + coe_1 : coe_1, + kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1), + kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2), + durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor,2), + Klimafaktor_1 : klimafaktoren[0], + Klimafaktor_2 : klimafaktoren[1], + Klimafaktor_3 : klimafaktoren[2], + anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100), + anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100), + verbrauch_1_kwh: ausweis.verbrauch_1 * umrechnungsfaktor, + verbrauch_2_kwh: ausweis.verbrauch_2 * umrechnungsfaktor, + verbrauch_3_kwh: ausweis.verbrauch_3 * umrechnungsfaktor, + verbrauch_4_kwh: ausweis.verbrauch_4 * umrechnungsfaktor_1, + verbrauch_5_kwh: ausweis.verbrauch_5 * umrechnungsfaktor_1, + verbrauch_6_kwh: ausweis.verbrauch_6 * umrechnungsfaktor_1, + klimafaktoren : klimafaktoren, + nutzflaeche : Math.round(nutzflaeche), + leerstand : leerstand, + leerstandsZuschlagHeizung: Math.round(leerstandsZuschlagHeizung), + leerstandsZuschlagWarmwasser: Math.round(leerstandsZuschlagWarmwasser), + leerstandsZuschlagKuehlung: Math.round(leerstandsZuschlagKuehlung), + endEnergieVerbrauchLeerstandsZuschlag: Math.round(endEnergieVerbrauchLeerstandsZuschlag), + endEnergieVerbrauchKuehlungsZuschlag_1: Math.round(endEnergieVerbrauchKuehlungsZuschlag_1), + endEnergieVerbrauchKuehlungsZuschlag_2: Math.round(endEnergieVerbrauchKuehlungsZuschlag_2), + coeeffkg : co2EmissionenGesamt, + energieVerbrauchGesamt_1: Math.round(energieVerbrauchGesamt_1), + energieVerbrauchGesamt_2: Math.round(energieVerbrauchGesamt_2), + energieVerbrauchWarmwasser_1: Math.round(energieVerbrauchWarmwasser_1), + energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2), + energieVerbrauchHeizung_1: energieVerbrauchHeizung_1, + energieVerbrauchHeizung_2: energieVerbrauchHeizung_2, + anteil_warmwasser_1: ausweis.anteil_warmwasser_1 / 100, + anteil_warmwasser_2: ausweis.anteil_warmwasser_2 / 100, + energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1), + energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2), + durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt), + faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt,3), + endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1), + endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2), + energieVerbrauchStrom: energieVerbrauchStrom, + leerstandsZuschlagStrom: leerstandsZuschlagStrom, + endEnergieVerbrauchStrom: Math.round(endEnergieVerbrauchStrom), + primaerEnergieVerbrauchStrom: Math.round(primaerEnergieVerbrauchStrom), + primaerEnergieVerbrauch_1: Math.round(primaerEnergieVerbrauch_1), + primaerEnergieVerbrauch_2: Math.round(primaerEnergieVerbrauch_2), + primaerEnergieVerbrauchLeerstandsZuschlag: Math.round(primaerEnergieVerbrauchLeerstandsZuschlag), + primaerEnergieVerbrauchKuehlungsZuschlag_1: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_1), + primaerEnergieVerbrauchKuehlungsZuschlag_2: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_2), + co2Emissionen_1: co2Emissionen_1, + co2Emissionen_2: co2Emissionen_2, + co2EmissionenLeerstandsZuschlag: co2EmissionenLeerstandsZuschlag, + co2EmissionenKuehlungsZuschlag_1: co2EmissionenKuehlungsZuschlag_1, + co2EmissionenKuehlungsZuschlag_2: co2EmissionenKuehlungsZuschlag_2, + co2EmissionenGesamt: Math.round(co2EmissionenGesamt), + endEnergieVerbrauchGesamt: Math.round(endEnergieVerbrauchGesamt), + primaerEnergieVerbrauchGesamt: Math.round(primaerEnergieVerbrauchGesamt), + vergleichsWertWaerme: vergleichsWertWaerme, + vergleichsWertStrom: vergleichsWertStrom, + } +} \ No newline at end of file diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json new file mode 100644 index 00000000..18fff39d --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json @@ -0,0 +1,54 @@ +{ + "Verwaltungsgebäude (allgemein)": [48.5, 6.9, 3.2, 10.7, 2.6, 3.1, 0.1, 2.8], + "Parlaments- und Gerichtsgebäude": [49.9, 6.8, 3, 9.5, 1.2, 0.9, 1.7, 0.6], + "Ministerien u. Ämter u. Behörden": [48.3, 7.4, 3.7, 10.8, 1.5, 1.2, 1, 0.7], + "Polizeidienstgebäude": [52.4, 7.4, 2.5, 10.4, 0.5, 0.4, 0, 0.7], + "Gebäude für öffentliche Bereitschaftsdienste": [51.6, 10.2, 3, 7.8, 0.3, 0.2, 0, 4], + "Feuerwehrdienstgebäude": [50.8, 7.1, 3.2, 6.7, 0.3, 0.2, 0, 3.7], + "Bürogebäude": [49, 8.1, 4.7, 12.9, 2.9, 2.2, 0, 2.8], + "Bürogebäude - überwiegend Großraumbüros": [47.4, 12.8, 7.3, 16.6, 6, 4.3, 0, 0.9], + "Bankgebäude": [48, 6.4, 1.6, 10.7, 1.5, 1.1, 0, 0.6], + "Hochschule und Forschung (allgemein)": [66.5, 6.7, 13.3, 11, 3.4, 2.2, 3.8, 1.2], + "Gebäude für Lehre": [57.2, 5.6, 8.7, 8.5, 2.5, 1.5, 0.4, 1.1], + "Institute für Lehre und Forschung": [65, 7.6, 13.8, 11.7, 3.5, 2.4, 14.7, 2.1], + "Gebäude für Forschung ohne Lehre": [87.8, 7.4, 14.9, 14.8, 3.5, 2.4, 0, 1.2], + "Laborgebäude": [82.8, 8, 20.3, 13.5, 4.2, 2.9, 1.7, 1.3], + "Gesundheitswesen (allgemein)": [55.7, 15.3, 4.9, 17.4, 1.6, 1.3, 0, 1.1], + "Krankenhäuser (ohne Forschung und Lehre)": [64.1, 40.8, 10.4, 15.8, 1.7, 1.6, 0, 1.2], + "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung": [61.7, 33.6, 9.2, 15.9, 1.7, 1.6, 0, 0.9], + "Medizinische Einrichtungen für nicht stationäre Versorgung": [51.2, 8.6, 2.2, 18.3, 1.4, 1, 0, 1.3], + "Gebäude für Reha": [null, 59.4, 22.1, 6, 14.6, 0.9, 0.7, 0, 3.5], + "Bildungseinrichtungen (allgemein)": [49.7, 19.5, 4.1, 5.5, 0.2, 0.2, 0, 0.6], + "Schulen": [49.3, 22.4, 3.9, 5.5, 0.3, 0.2, 0, 0.6], + "Kinderbetreuungseinrichtungen": [50.4, 17.3, 4.2, 5.5, 0.1, 0.1, 0, 0.6], + "Kultureinrichtungen (allgemein)": [55.9, 7.5, 6.7, 9, 1.6, 1.2, 0.1, 0.3], + "Bibliotheken/Archive": [49, 5, 2.1, 14.3, 0.5, 0.4, 0, 0.3], + "Ausstellungsgebäude": [57.6, 7.7, 6.3, 7.8, 1.7, 1.3, 0.3, 0.2], + "Veranstaltungsgebäude": [58.4, 9.1, 7, 8.9, 1.3, 0.9, 0.1, 0.3], + "Gemeinschafts-/Gemeindehäuser": [63.6, 10, 5.6, 10.8, 0.8, 0.6, 0.1, 6], + "Opern/Theater": [58.8, 7.6, 9.1, 8.6, 2, 1.3, 0, 0.9], + "Sporteinrichtungen (allgemein)": [65.5, 27.3, 6.4, 14.5, 0.6, 0.6, 0, 1.9], + "Sporthallen": [68.6, 22, 4.6, 14.3, 0.2, 0.2, 0, 0.1], + "Fitnessstudios": [60.6, 62.2, 11.9, 24.5, 4, 4.2, 0, 8.9], + "Schwimmhallen": [63.8, 24.7, 8.3, 13.4, 1.1, 1.1, 30, 7.3], + "Gebäude für Sportaußenanlagen": [75.2, 22.5, 5.7, 10.2, 0, 0, 0, 5.5], + "Verpflegungseinrichtungen (allgemein)": [75.9, 77.7, 16.6, 18.1, 3.5, 3, 0, 24.8], + "Beherbergungsstätten (allgemein)": [52.1, 86, 9.1, 9.1, 3.3, 2.7, 0, 7], + "Hotels/Pensionen": [51.2, 89.1, 9.1, 8.6, 3.5, 2.9, 0, 6.8], + "Jugendherbergen u. Ferienhäuser": [63.4, 50.9, 1.9, 12.6, 0, 0, 0, 8.8], + "Gaststätten": [77.8, 79, 13.7, 19.7, 3.8, 3.3, 0, 25.2], + "Mensen u. Kantinen": [67, 67.3, 21, 11.4, 0.7, 0.5, 0, 22.7], + "Gewerbliche und industrielle Gebäude (allgemein)": [38.7, 12.6, 2.1, 9.6, 0.8, 0.5, 0, 12.2], + "Gewerbliche und industrielle Gebäude - schwere Arbeit": [null, 37.8, 20, 3.1, 11.8, 1, 0.6, 0, 22.6], + "Gewerbliche und industrielle Gebäude - Mischung aus leichter u. schwerer Arbeit": [36, 24.2, 3.8, 13, 2.1, 1.2, 0, 24.9], + "Gewerbliche und industrielle Gebäude - leichte Arbeit": [null, 38.1, 19.8, 3.3, 15.2, 1.9, 1.1, 0, 22.3], + "Gebäude für Lagerung": [38.1, 19.3, 3.3, 13.2, 1.7, 1, 0, 21.6], + "Verkaufsstätten (allgemein)": [47.9, 7.6, 5.6, 16.3, 2.6, 2, 0, 6.9], + "Kaufhäuser": [45.9, 6.4, 6, 16.6, 1.1, 0.9, 0, 2.7], + "Kaufhauszentren/Einkaufszentren": [47.3, 11.1, 7.4, 16.6, 4.6, 3.5, 0.1, 5.5], + "Märkte": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 10.5], + "Märkte mit sehr hohem Anteil von Kühlung für Lebensmittel": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 72.5], + "Läden": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 2.1], + "Läden mit sehr hohem Anteil von Kühlung für Lebensmittel": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 54.1], + "Fernmeldetechnik": [38.4, 4, 3.4, 16, 0, 0, 0, 53.7] +} \ No newline at end of file diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 241733c9..bd8f6f6a 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -1,5 +1,375 @@ -import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; +import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; +import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js"; +import { Enums } from "@ibcornelsen/database/server"; +import * as fs from "fs" +import moment from "moment"; +import { PDFDocument, PDFFont, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib"; -export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) { +export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) { + const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64"); + const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) + const pages = pdf.getPages() + + // const template = VerbrauchsausweisWohnen2016Template as Template; + + const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + console.log(berechnungen); + + const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) + + const height = pages[0].getHeight() + + const font = await pdf.embedFont(StandardFonts.Helvetica) + const bold = await pdf.embedFont(StandardFonts.HelveticaBold) + + const form = pdf.getForm() + form.updateFieldAppearances(font) + + const fillFormField = (name: string, value: string, fontSize: number = 8, alignment: TextAlignment = TextAlignment.Left) => { + const field = form.getTextField(name) + field.setFontSize(fontSize) + field.setText(value) + field.setAlignment(alignment) + } + + const toggleCheck = (name: string, checked: boolean = true) => { + const field = form.getCheckBox(name) + + if (checked) { + field.check() + } else { + field.uncheck() + } + } + + // const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "") + + // const adresse = fillFormField("adresse", objekt.adresse) + + + // const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "") + + // const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString()) + + // const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString()) + + // const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString()) + + // const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`) + + // fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`) + + // if (ausweis.warmwasser_enthalten) { + // fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`) + // } + + // toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung) + // toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung) + // toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) + // toggleCheck("lueftungsanlage_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) + + // toggleCheck("anlass_neubau", ausweis.ausstellgrund == "Neubau") + // toggleCheck("anlass_vermietung", ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf") + // toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung") + // toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges") + + + // const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude"); + + + // /* -------------------------------- Seite 2 -------------------------------- */ + + // const co2Emissionen = fillFormField("co2emissionen", berechnungen?.co2EmissionenGesamt.toString(), 8, TextAlignment.Center) + + const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => { + const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64")) + const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.png", import.meta.url), "base64")) + + // Wir müssen den berechneten Wert zwischen 0 und 1000 als Wert zwischen 0 und 1 festlegen + const endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000 + const primaerenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt || 0)) / 1000 + + const minTranslation = 120 + const maxTranslation = 457 + const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage; + const primaerenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * primaerenergieverbrauchTranslationPercentage; + + const pfeilWidth = 20 + const margin = 5; + + page.drawImage(pfeilNachUnten, { + x: endenergieverbrauchTranslationX, + y: height - 215, + width: pfeilWidth, + height: 30 + }) + + const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; + const primaerEnergieVerbrauchGesamtText = `${berechnungen?.primaerEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; + + if (endenergieverbrauchTranslationPercentage > 0.5) { + page.drawText("Endenergieverbrauch", { + x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10), + y: height - 193, + size: 10 + }) + + page.drawText(endEnergieVerbrauchGesamtText, { + x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10), + y: height - 207, + size: 10, + font: bold + }) + } else { + page.drawText("Endenergieverbrauch", { + x: endenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 193, + size: 10 + }) + page.drawText(endEnergieVerbrauchGesamtText, { + x: endenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 207, + size: 10, + font: bold + }) + } + + page.drawImage(pfeilNachOben, { + x: primaerenergieverbrauchTranslationX, + y: height - 298, + width: pfeilWidth, + height: 30 + }) + + if (endenergieverbrauchTranslationPercentage > 0.5) { + page.drawText("Primärenergieverbrauch", { + x: primaerenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), + y: height - 280, + size: 10 + }) + + page.drawText(primaerEnergieVerbrauchGesamtText, { + x: primaerenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(primaerEnergieVerbrauchGesamtText, 10), + y: height - 294, + size: 10, + font: bold + }) + } else { + page.drawText("Primärenergieverbrauch", { + x: primaerenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 280, + size: 10 + }) + page.drawText(primaerEnergieVerbrauchGesamtText, { + x: primaerenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 294, + size: 10, + font: bold + }) + } + } + + addEnergieverbrauchSkalaPfeile(pages[1]) + addEnergieverbrauchSkalaPfeile(pages[2]) + + // const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString()) + + + /* -------------------------------- Seite 3 -------------------------------- */ + + // Verbräuche + + const addVerbrauchGenerator = () => { + let i = 0; + let yOffset = 14.6; + const initialHeight = 435 + const initialXOffset = 36; + return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_heizung?: string, klimafaktor?: string) => { + pages[2].drawText(zeitraum_von || "", { + x: initialXOffset, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(zeitraum_bis || "", { + x: initialXOffset + 47, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(energietraeger || "", { + x: initialXOffset + 94, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(primaerfaktor || "", { + x: initialXOffset + 317, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(energieverbrauch || "", { + x: initialXOffset + 351, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(anteil_warmwasser || "", { + x: initialXOffset + 402, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(anteil_heizung || "", { + x: initialXOffset + 453, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(klimafaktor || "", { + x: initialXOffset + 504, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + i++; + } + } + + const addVerbrauch = addVerbrauchGenerator(); + + addVerbrauch( + moment(ausweis.startdatum).format("MM.YYYY"), + moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"), + aufnahme.brennstoff_1, + berechnungen?.primaerfaktor.toString(), + Math.round(berechnungen?.verbrauch_1_kwh).toString(), + Math.round( + berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_1_kwh + ).toString(), + Math.round( + berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_1_kwh + ).toString(), + berechnungen?.klimafaktoren[0].klimafaktor.toString() + ); + + addVerbrauch( + moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"), + moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"), + aufnahme.brennstoff_1, + berechnungen?.primaerfaktor.toString(), + Math.round(berechnungen?.verbrauch_2_kwh).toString(), + Math.round( + berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_2_kwh + ).toString(), + Math.round( + berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_2_kwh + ).toString(), + berechnungen?.klimafaktoren[0].klimafaktor.toString() + ); + + addVerbrauch( + moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"), + moment(ausweis.startdatum).add(3, "year").format("MM.YYYY"), + aufnahme.brennstoff_1, + berechnungen?.primaerfaktor.toString(), + Math.round(berechnungen?.verbrauch_3_kwh).toString(), + Math.round( + berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_3_kwh + ).toString(), + Math.round( + berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_3_kwh + ).toString(), + berechnungen?.klimafaktoren[0].klimafaktor.toString() + ); + + /* -------------------------------- Seite 4 -------------------------------- */ + + const splitToSize = (text: string, size: number, font: PDFFont, fontSize: number) => { + const lines = [] + + let currentLine = "" + for (const char of text) { + if (font.widthOfTextAtSize(currentLine + char, fontSize) <= size) { + currentLine += char; + } else { + lines.push(currentLine) + currentLine = char; + } + } + + lines.push(currentLine) + + return lines.join("\n") + } + + const addEmpfehlungenGenerator = () => { + let i = 0; + let yOffset = 43; + const initialHeight = 568 + const initialXOffset = 36; + return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => { + pages[3].drawText((i + 1).toString(), { + x: initialXOffset, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[3].drawText(splitToSize(bauteil || "", 70, font, 8), { + x: initialXOffset + 25, + y: initialHeight - (i * yOffset), + size: 8, + font, + lineHeight: 10 + }) + + pages[3].drawText(splitToSize(beschreibung || "", 230, font, 8), { + x: initialXOffset + 98, + y: initialHeight - (i * yOffset), + size: 8, + font, + lineHeight: 10 + }) + + + + pages[3].drawText(amortisationszeit || "", { + x: initialXOffset + 403, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[3].drawText(kosten || "", { + x: initialXOffset + 451, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + i++; + } + } + + const addEmpfehlung = addEmpfehlungenGenerator() + + for (const empfehlung of empfehlungen) { + addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten) + } + + + + // pdf.getForm().flatten() + + return pdf.save(); } \ No newline at end of file diff --git a/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf b/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a1ed6ed718343a0fab538b325eec9022e59f0085 GIT binary patch literal 53757 zcmeFY1yo$iwkV2ga7jpz4(<(&ySuv+8fe^IgC$rJ+&wrXKyZfy4el-p?iwuUYm%KU z=brn{+3(*s#(!fRV6ke=nl-(uYp$L}r7SMV#LCQxLAAUxG=_l&VgaxK?2WB3`1yef z5Erm1*aZw=<$?lLfy!WWh%pF_K)c!Ry9EU?AaTgd^IrUK+z911K74q^}sOKC4Bh?c3WOKhz6S%z0Y6Y&tOdwL?mGb53d#U6dnX8hotcHngbk`8J3BLo zgN+Bo$_P+%wF4-bxBysK0U#C@PN*?>S=o8nc*q6O0002Llc^c6s<`BDyr544|R(CXw10SJN*NNd$MW}$G<}V5LZyv#NNpc8nzI-|D6bbrSL<9 ze_;1>^q>6qi{lTw{0aWA{OSRA_}#H~&dfgom)XSL76|QtI+f+GPK5$_#qJe{h(j+y zs43Z*SU8wKEb6R0ydX|qRyGC}5HAZ0|NZbkWB$p}zxUWXsoUGz2r8@nh(Qi!QyUwA zCdA44J{mcgLCl~(QTYw`AIK=!n_8NA{u5EyK)kFhe-`CWnEy!Qw?*gQqVi|l-{}00 zc>+2${<$Zh9Z*lO{nZmtAg{8My{W4S#7R)Z#L3;e$Cbat_{v4J=NxS6581JG(& zLKj7MXFC4-iT4No|Fq~(mntaybK#*~Kf=h?_OJ5)7{V)VZ{m8te#nRmy1H7L@)|=- zKrB4QEKD3=kO>nzCmV!`n}?f?$(W4|1TtkYGd5v|{D=w#g+Gt|t4pDMGIq``U^^4Y zFS=%CTx`%kb|!8xH#-x%iLoh@F%KsT6C0QvWX#QG!phCg@r&-C#{O^Z^waUsr5O4V z0Q~(k;MY9-eFgi!()dH+|10Ew68#U8zh&J2nCn00`db$GTgd;3uK$?pZ&~1PA^#`3 z{>RMqrz{ehkqVHzLvut7G-&g;Eb~{IdY{$)mZpl?yV|(`IDV$3KayUcoTaI=9*Ffm zwFUhA|0B%>{78%etoKQ?s==R<-uvF)s42SII_t3jSULU?=N|AYF$RkNG580YU!pkK zJBZqQK*zHHIC!ADa1el-9b^DaxSgQev|qWnn7y6LebxtHWBnlUboS}KXn7xg?lNvPDhTK1>u>e3nWEB(yN7^LN~l7Y7iGaAoL{yP#xmoVgQuzaFJ5GXAT`Ebx(@>ewZNi=MQuKq3XS~|7V)A zbNsOR-_%rF$=C{Fa<7t%Ez~7HRDw$OKW6|aUFb^^vA=7FKZT3f-}5*J`~Qi@|Nm-- z`|0$577v_kpda!1|4iin={?)ubU7#Y&#CzTimE^5{mrevz4qhcVq*nLTH3fkoPd%x z(B(oLVq$L!`QzQ6bXc0!T+AFNuJ4rAR~%W12aZpL1!v29>vt7-NU1zO@4{1oDQ9qL z@@! zWaTK-Q^`MsUad`MUSWaO7joqqnykTk(Vtka_NrZc$bS9c%Pqg(>D6B5w@mwjS6Hz` zVTH1|A`J7oKAK&oi{jmFm({O4HHCGf*EDl)@(vF4Pf8kQN@^lA3)o_JLToE#`uH|( zEYtJvbgo6aQeKsJous^{P|#TKeWasOi=TrYo7}|a6^luEI9OjeS)}4VDRo&UuY7)< zoWfPKu&X-D(cQXpre;Mp>*{R9xve;q`kl;O?R0A?>+?)neC%S>8iWedP0sw=d&al* zpN+|w#S+)iwGG!$_BIp0E!ljQeY9husRMCJjPIRh)Sbxhxmo34j)>vv2oSZi*@Rbl zxd9LBF0;#x?`NrIwv80+cDXd>vhI|QIhO3|m8{EOtvfT%9l_Usd(a_`rm@ufp0>C+ zT%@zt{AK$rPc<*f;PWP`R!7BtKf!gbDK`4NO)GY9)$Mpr?h`8t=1asSVdFz%!w2y;p(Ti_;)y&B4ByAd0?Z{`Il+&>bP}9@z$4W-h0M^7N)#Ou^Q#>R^QgZ-Q@0 zM5^{P4Ht0X-rGc0J$3!+rBN1cJ0hkpv$uLw!U&RxV`L}EW; z#%2U!GZJAf;(B?=868Uy1_u>Rj=IA&yfIRqWQ$9R)vKUUx}ZfDDTgF4-O;x(2mX>)zRVWm9~Q?D|wQ9mO&?!TvypJg{VhgWikjD2jxlh5R*AC2X}q zluM0vw2R)1QYl|*R!Hfcsbt9P4EF83%ol{`!~N0zTrB6;$zlzc(jeRS!?dY*-MjK$ z=s9aJ>Q(7$km1Ia9LCAql%_(Xfh~_Xi-U7%ej?>fSKgSC`u)c?zP#Zd7s~zEtOh9b zc=lf%7%is+s^Gu8J>R0et*Nlzo*;au3`-7USXssuw)lwTsGG1saAB-X1fhwcX~KS{ z1;+#MMpWzLtsuIKb8^HxTe9S5SHHEw#j(C3(6c6e$ z&1K)_N~@)y8ms^}x+$d6KK5_o2|026-t`PVqjilcCZ znc}DzvSrGLl35lR32hu@F6_83B!!;|1cpkWyr7lLm(`2cr`oD|zlOvXohN_jCiij1 z-PA=6Dc3;CoA{xe2L~-)+blyD8LIG6x{^S`hG+<7kpLyq>cR=#%rJcttliF~k1G5= z-?B{c*dhM~66+Dq?n~<|COlQIFF8#5!|MT@R|vMu4(G1?d(ScK_U9ZbFQ`!j<`-FJ zMIUWwGVZ(`kA**Oh0JE5d$KyfkTnjTgB5`!bQdQkJvF=(4t-nsp`=C@1Q7%rP(cb!5yr$ak>B6%>f6#S2 zrcI;ZHhS?b#>FM7Sc-J46WJ>G(ewdd;A+J|ouG_{0X=0avn+i)v4TytZ5QS#Dz?H3 zLRBNh1{s~4QC9b-C!F99Mw^_YR8|N$VEOq*6g6De8e`fWfC62Z!T3d8eC&JINUhT4 z1aG&>gh{167mvFJ!8Z%EA(9^3%EO~npo^VQIKVDRwGSmo@mX!9`PGS+J3c2FKEb1^MUyZ&e_mx;6AmnP z_sg^q6(nQHpx0yU-kYyd7y|f7ZyLUkY`bneP~xJRU|DgTdJxj>@T9+SD_;!h`4uXg zWpg5?OrYpE2;R_o9fw3DD3MlfjwESUBb zy}-E>PNQFg+o5yM@Q@+A>q3GC^5I+><56mTE5FfR&SI7=_{ka#CBID0)6w zy<(oQlH5B#3U{SbL$pBCVK|a-sU`owCeqM|f_Fp$528yG=Py$R>?nqDh*gx@Lp{f; zwY)fc+hHCDwa{$#Gu#wOk!gj9BsHmlw;l%| z2_LQ;e>g!@Nvk393|xAh-R6+__zD-s4Uszi%#sY^;g7|OKm2gcPV7=eT*0`h-U-H@ zCq>{hyF6OK1Pc9VO5X#r7=cP#8A2b}O@vAjvZBiI3)5Ty-6$Vsottj4D^>x){C)VM z*Zi}_XD!ydBphdySrQK~ha zeJ#PVd=#>EHJNkhLCu>F9^Kfw!42cSyj*o~1X|DmpTy`U74H}!y0VC|?~3L5Wn%>{ ze8+U0t)xj)jSTDGrZ{~!zoQp@>W~Fbpwhl+l6MhuVzuLl*VE?L31k>iwSm>}_uO6N zp0RKP%~%e+uG)S$Pt7^zPhkOy@w-VoNK@-M6zP(ro{bIqcrO-plLdM%NzZ-y!3w#|Dk%s9rzQGP(@nl|Zn%J| zYKBsCVu>M3Op$zwC%TA@Y;}-pH1I+H7E8H8Ow^ zi7c(yoISUVhtTj1{4FU_fDI*Yxu_&YiJpiy_F}V%VX5`&FawAYEx}p0697K9F9Q+N zgwB^=mFuqm@ynK~`6t|hgGF!E#}P7Fr0>5ik1%v2McRPf_K7btp7q}x(gBlM5eXAw-fFJ&i^@d-jRKO8*lmpE01nM?iP zZ(HyIP^^L50p`-lm)B zZkWtIfJHU;6joA;>@}1;>bRO9h*e!vxiEs>^w&zqy%hwh$L~t1*B>QKfZvA(-hM~7 zf3)o77Mr`PDta!>jT(S&K0>`1-uBkZDG<1B`m8T|+BCH!PlxhL6SM9?O7X$FN_{}g zSH|sNf-Fb0;o$F#FbDP9KG<5Bz8rA`QTU>iF z*lA0gE_NcqV?41O{2ZQ=#_qy#NNv_7d8R`K6Y&~^1ao7nrI|T17ISHoYL2%9 zLz^;!yWG|S*M8c#$;$=~y-G;rGszw9vDtn^R(2aJUYRW=rI~^Qd6wS0qj}D82Z#%P zt}lQXjiGg?Jzyn^K%biPx>>#=tZg1*^b&sM!#lDxJS}}x3L_v2y-oQCmK;2}8SWC- z+M<`=S0Z{zWx5C+F9wQt9C{^tB=B)^Z*ke66D))`^mg5qnTI)TTkHtDQsc>>loq2D zOX32N zR#H7L*3Qi{S99SY;C6#uDTIj0eizabNVdb>@pcOP8f8g|U3VZea=pfAt`d z30y{bIvwtRQ!|` zHN~nl52?}|V?|!?6LrrWmh7`YsKe+~W8_DXznOZmu88$@=b+xyTlNlaM5)r3ewwNt zuR@FB#(8EQ*uAAk&uo^%7J+`qf&?p|VTV8;mQK`?klmlPQ6S!6Xv|B(ZRAE3s9R&s zyOB7|Ma{B4Mxuw@7ydQ=5dxgeDUs#A<_fbZkNz`TuDNNk9^`EZ-eKmqmg09RSQ4ax zs=6evNsPKl?T!o%Z?gB`M z(w7ZH^B3U-dGihEaVdCOLkaNonG(rwKNr%b)<3)yoqQ0&hN|V@ySIX1)cqH zgRYPtebK8hmgLKZPvs9afiS8Gx#3BVc-u{M=psjFjsb>N`plEkwDL7ij$V-r_0C(d zJZbFFiRhsu&SBKCm5B*SPIK>Wz#Fw_?mScZDz1!cfgX3QFv#UZ=GZ}9`Hp>n%dByh z`r=5a*8dsfd~P|-$CoDz8{0(Wd!Zit&m@v~u#jb_mqLi+X1xWg`*{jK@nb%x;?S)H z#Q`ugjSfOdC0R6gj>R2qN7{{`YphU z0uc(U4D9gB&~cvbybe>KE!wpZj|=@=Y@slO(liGjs5ZHlbt5=T%jos${oNZjA5E%Q zq}^6>a(EmR{P&q39(fPw3aZjPw2<3v72`#*9e+OB*FQQ=*C#C_dwS9J~E^DcodT@VQWfGCyP}`8A07NiK#R9TaTC+Mrk7hfO0`BD0oBtLz#d& zFi_o`r&4Cc2#t+Xow5U;PGHcyC+I@S_33VhN~JWHa#&x8{)Oy3hx=3Nd}K#*bs706 z4YAzURF@Sv&%OnXM%H+VoeArnsiZWF>P3bu(Tl_8Y1+L6zxMq+;Z3u+V7d01xhQQU zEnXWs?&s$X=+bhe|0ybfKH6ne@_|0d9E^NQ>ERG2LM^myKS z0YXpq#K>LTg~yD1=`-c4&nzuLa6(_}ZF#<(RD4%;LlnZC-!Y>32;bH^U^e{G+^vp< z{PamtSkPQ^9*();$e1EubKm5~S7lad9O^~5kZEdWx%U@lUxVCQM9DHFNIE$YcjaUJ z@Y{^F+HAiTPQDbxG=#|yMb-VNU36`w%iTqGnKwx-%l44e@WE9S+V(pWxtdQC6brEJ zdJnjAr5j`qDXK9As9w{#Rt6Qs1$xkOS8h$OY71g0Zm4-yX1G%*Q^MZiWYujc*zVVP zrW(Hba>Zu?7vJ=-^z}M3x@O}7+2Y}_J!ODb5{Uopwm#iKcrjjV_%LOPV(ZX^Q2sXM zAg3p9;yYHk6eQcnh}^}MfK{Qz6}ByYDHiqC-Ts)b6tV`kisaML=w>+|#doN!bVeAp zKSyP*z_4`^Lu6;F*Oc9M=0qpxKKhQp&MEMBx?v-vpMw0c3Ii9H<%fX!16`tw*%_!W z6Kbs9gvn-Uf1~j!rh+XMP_siS&Zg^jOn(AW5|ss|Hnt?EeMy|;LmodBSw6-OaZ?|~ zzv%P-oOCGp74I?0lLwXb{yE}2n45iY1nF=SE8xkZH!Z7m&*CQ5@KY%5crkgiXBQEY z(j!?|#6MD^EeKLyjHUx+1H@Dkmkqy5%Zh5eDPkSc_J<89R}fhBOL;<8jYi*Sg~N_w zP~Q50W8s~vsa)nO!_AF!sp58~&2BrjO({Y*1K?L*%WxVKP?y^wgh6FUfs&RnCG3Td zu;B_V?UK@YF-u0QCU(CaooPJ@#8xq4wPj6b@U{@!DM$SUqwGclY4&(tMKPqT7#UUh zD2)gDuISm2D^p2GSZ>NN$-8cAwzX3JW`<56*4^S3j}lcPA8+HdY=UQ`k~l1rp9 zhEGSKOtF6eIkh00O+KWkU?E)f+M@lAOTY8JhyO?i_mcQYs?(XGga9rd(sB0-%HFo| zX>sOo#fscCduh4%3N3OR@pt2_A-9BI*9Dk8?* zXFK_(-b#gIU)?a_iz^k8GU*~Bf>Sv^E2xxK4eITuuqQ)kER!#+g zr-gT`K%o4v#8UWPnl;Kjj_T-`&#R<`_l?qwA59MJgo*d6fZB{@N3_l*jNU*$q3Kd&qnl6R|`+-Hngn}Rj&7A$t2e>em z=0noBX2I7+UH#q!24VCPl}Ai@XiurLS3YJf<1?2EcmePFrZ?GFR-@J7gBm1n#M{Pb zUJhCMA8C4$xGcF{KW2T-Om&?5C9^}sO5@w7%&JdvxO{4SG$yjx2Afpi;q_zjeZ%=Y zoE1#YQ5`$qH-#6XSc=kQmjUhk6kzqVDNuv!qhHMIvSHG!9Wi}{BhxWWpsfzVwc zL?ry*9%X#WsW62}F=P&iYdM#bpPH$YYmxUo`k)=@C+iRUfpRh4J+v?`TZ&knQMTVM zcn_all-!uVuKQ-I?qEK**#SE@S+JnIE6i9+uwCKp$Q!*WG{g}?kA?6YbE^=|BP6{( zs~ASqgqr>Yp_+lW>(6!sT89RE_z0*8^*RMfXI;Zdqz{&_^=$e~KAoKI4AU+H#OWQ6_Ce z5*(Ah9+aHh!`4^m5{c;vcEK7KXy z7~n$dLH(DJ%T30N24V#Rp21*QlIUWOoZPx&Q49H{c8HOvfZ3UO}LrY5Wqpy&u zyt>2#o!1rxsGa&f09!e$gz!V+uqqF(nPVDcDZy~RLAF+`id^)e0rt$z+EF2(biGpH z!^lvD+fVp`nMu0t*%vm2Ft+@u6yDp-!}v`p>%#e+r6$!>7E_W~a;s=qq^SL$V773r zjj9f0+Sa*YE|+`ZVFxN56UP+E^O+J_N4uZ!d>Dyi46tLw62F;y0%{yZ?W!x3fWu+y zG-y4qHeQTja_migBp4=Hy&Fizx7=aC#3Ug&?wz7_;@fM}Ud0xXgr#lWRnY2a`wrob z26NxB!RyKLWK``sN42V2ZsxfDU>C{vs0hsZV_Hv!7DWwvbL8qEW+UY=?4TZU>TS1T zD+xik?X!7QtdHWMlJ z@G1)WL#>pO_58I_%x&Z2o=kmN|6W%2%5UGM#Rr@NBZ<~RYT;4P@=ncAYq{V|qMp-6 zvQ}_-{(y*+ZFq*fIHn`$a=8}ds!D++VKi6wbaGO7{9U~=8(~tU7Vj;>n0au42dDpJHJ&ktn{OT53Gog6REW*H&DnG5pl(Sm9%W^z2!s^uL ze^Xi5|5{;E1#F`)&Wc7BAGS5Wys~@>&oqenY7EcVkk;rCK%4b;E03&SbA*?Ii4Pn6 zAtK?cO#Y{J7Ttpjd>KTyi1#lPdQQ%cCnibOtB@22`#^OKMZq(oD3$pKYF|b>5@#ns zc<*}$PpdbhNmL8ZniNHtR7)TkPrk?LZ(~R#lC?F2@?$G@d>baWcpHKPPg$hf0CzQJ zP_CPo)!>~`LQxytCL;I+2i}**wZkeNs}AE+comHD%EOMy*7FI&f$V)*n$&55na(a- zYg`m`6V^vasa9WN5~z2@6I4H#D>~Fu))~ir{kYglHccK?hSxLmjYcejq0|0ic}Vs; zJh(r2I#yfd!A{Y|2}e(A@5e<2a~SnTI(6^%!1=yc4+TuQIhkLj!4cre8*!G7nUb$3 zR?BeUWnEf>i3lfG=^oRS6&Ewgm)AshLNwIZw?15~5BSyHT11{m4S1ms$G8mOUL?FIXUn z+=sG+YZB$_aNCe*$*k7wKmt5X9bKn>m&xs7P2+2i;;l83Jme4o3m z&wb0Z)FoBQBq4;kQ8DIv6*82nP9e!*4IDGPZ*$Pli$)fJ$ z3i(0czEb8_nZLag0QB>aj6B%cMa%*WedYiGwJc3tETC0HT=yk0>|FOXAHROt*w_H~ z*U#ts)=w-B4o<+obNw-vgZn34E@-9D{l)U*KPM*_fD>99#0BMj5B*8~XFoTT+t1cL z)-R0v_8((;*nd*Jr}0bX`}@6Y_pm?T?`64%-Cuubao^(R=J~znCnYv0_qIGEq{OhJxc!+(0?jB`j-LyqtXrd-v=}s$9>Tl z%MT~t-|t=eD=hDwf8V~p-(UCY|2x+&{67r+BarXI^tbT-XMxQD4V-)UJ%?YxeIHc! zus?_Qy+iKl+{6DI;P+gig=;_l-*f(5QYhVD?LTV)x}Q+c>z?oZ{hsG9y!-o4Tm0z# zr8^Y!=ajpL-e3Rq_m}PdYtK)}zv};E+)o+)c>dM;_bA+3=hujT@BULWs1Km_{Waph zli^qY&--7opilo8^8X)V{a%Y-i?<8JRudYiKgt^w!M2c}^XbQ<8uaX;i-`qL@&2rw z%@2?k#M0ct1;Eb2a$l-s4z02T0q>Xk`vOcR5G%Bf2|6W3?~5#%I5{~0Ol;8dN$5#I zXni5{xS#=0N%3&#&cNwBS@jVJAo8B7N~K)+7}`a#OX#>M$dFIMiqrI+?^I&!f7 zR#f|M>iDZdRu3p6CU(F0nF82;tV0IBPM7|8{A+0$h=T`ei2qVr22=#F0ikCJAx?JC zaxCrX{$mt4|Sz3^luZy&Yf~CGv`8X7N8^29O}AJTgOi)C<%8 zK*1)oP*@xX2Ua2~%O5u9t@Qg)4(z4*D|du-(SU6kQOl3~d} zS>+BV;|RUgyi8xh8I}HBQ&PQ-W$2fVJvOZ8p&s7BQ541BeazhxwHwB5=k*GtjW(|w#ml>A(! z@UG#4i)w$5ycz9co-K6pJY=uzT6G)7s6X7QatBMV|2YhA4IIGz4l8y2DGa5AuXXED zr>DiTXV^m&RomBZpi9-8I^u-rx~$e6Ki+E$-y;EvBe&MXkp12;2wE(Hi{pYeoeZ6* zpnyPp&+;(F9e>9i_hH#L?Z=Hi(JSj^Yt&(X7)n@z&+r6Uur2{lS>QE45^}?FeSo_NFv7;1gd+?^?(xS0 zi7-z;KoiE9Mm!6YRfgXdp|F6Z5k}_5VD|6(%3FuJ?~iPR@H%M22&oD78#V&?DM&nE z^{Iw5I>^5tfMkkQFCwT6z{ivjbHv8N6|Em8EJUGyN&i;25a*JR7tz4KR1|(#zyd!d z@cGNdb`<%*q7R_=7*ESO-@c6!~fI5b=W72bnY=v%L~U zI1~j#MeG3%(sJO%Qygi=HYrZPOKBd}kSc(IG|&m1NF+bno%TU^V0O*}l^R+lb(HXz zvSPNv1Ud97QYw3eq~lEEv{p!`s0xw{Z!v~BEr2KVF2uZe2L8-aTv>C&iNo&0E1O)8 z9s~!Ee9{KXS34s_RPQ&d!-(}t9*#)=} zUlB@m6fO5V?AM_XVowrvW&0OI62(+O4!3#xX(n#aE zpt!v-5`_b^y$u`|trPc<_K={&od}!kfFVz;3)2?iS8Ng`rfQ++i8_&C&Xtads)}`a z;gaDJc@i#9Z5>O}gJTNoNmC!~6Mda@trlrT-JLN&t7N_!-V3oN4AqO8{h zNmb|{=dNP(Skg7c)x^ERSF;LIj~}Ni0vG96hF29;Wx79Xl%(4y?qYA|>-n4x*0zrAj>C={ z*Z5Y+=(6xn2;lHR1eo;ts!5u;^t1F8_~-;mw2NAS@h9cHU&`4p1z+tiqC$qPvUkC-Hb#~oIk=5j zKHxWxd(qijE{uZ3V&2ArgTa+cg*XGByJ?3C+c#g9=R3YQvRg4+QKBZKmZ3hS#*&A~ zYbC8GyCvUR<=c0G-hmoz6*=9xzE~_;-Z~|J0u5FK_3i5_Gx{*q=(y{1>eXl~ z>R9SZ=xOL-uoXV=lVn{9=a`+H@ya>1+;Qhj;Dk%X<7}ONJWD;xIitutr8B5w*y_`- zxDa8fWzA)*R2x|%WGb|rwf@ni(Ai_TaOty~jYFElsI#mC@A^sGOh@v;{5t=J@k+(w zS`)+a_LA=A>;d%(;j-q|*|foez+m%?Z&!PpNqV=ZQdL3ihTRYt2mvN&NA@%AAr9oOyAn^{7>Zn{3Z5ICMXQu=l$2!r>POqt-2 zeVCnv>jPIPE-}h#geL>cZU5@t)nrH2$dg^j&EP!wctj zK8g=GZ*eeiD&H+=9vBFaTH@$n^HfQiD@>-mvnH6NE)l?^BIkSSJ^*}s+ zJS*IF+#B3TN@mKJRMpfgF*&hHN2VTOO&R#{aqr^-)Pu$Y$D`R(tC}s@eC(f#@y4}K zH>(K~+{mAzy1vwVnL~6&q(NlQCdQ^@CS!h7aanO%>29jDTDRfTj9DE~UCO7$bWXK^Zi<)Ry-Y9XyOLv+!`yG% zUEX^pB036IxOvQy4O>O%G>y~b;%ET`hhx`+q4ud4*BTF$Mz zrruznVMt(*MIJ`HCdS~O9kZC2p3WUtAAP`uo>~wgLE8BJ%??*OQ!rC?N!4Wb%GbKX zi%R>PRubMN-|Q>O71KU<-7gxoDzj*FZ_jqmk|Qo6q6ZHL1JoE4UEOEgs(tNGZlcGm z3f>KV&Y9ZO-)u9+=N(`hD1XdI?^lD3V%>j3=GCDLgmX30?b~ ztTHvyLL;I?`ntR;<1X%YEad3AV6|WkuNd!5tXXV9!F++8px%wmwdeM??^}VHd48qO z-(D>@J|p(qO4Z?DyN$VXTAEtcIxdT7GCXVWp7c9AN?qmp=KRur?F*@Ix5w0#;OfXWpJz}0VHe874ow&S%P#bf-KKO{ zm6n0?TpfY$RM|(02_5naa_L>Yv{TBN^xU!8g+ccHAR7^oI~6@uo@rNW%LW`kLQfUf zd+#W;1rUJ#b-v7bh?%BrQ6I%^j1}ir+kH&lu(|Ucgv-;_lP<|L@m1JY(a=DHMHVJc zI&=c+^9rVV<2;Ueb*wDG^ ztW9-W+)bfs>>W(~_N6R;x6f=~vx3}4@k*DO{vj|)yab_)epmmnB1CR9`XB;sq!M8)8zV81{l@@6V(*zSw>L40e&Tq<+l#oK@XAPG zUGr4nnEtE&vV!{2nQHqZO^7^d5&S;)*&Q_~C5oV7Sz;-Tfr%k~>1FVHjz%3RA#Z1q zbNUZLz^$I?&eTY}fpjLK`GA{%FJ+AS=5J{BKRb2C8wW=ut>{P`nZ=}zI+-s!NQiZp zY|&`OXmOS*RiIdBr#Ap7(qw70F*)^BLzJ0y6o)8Rc4ePtjXuYf6-sXE?~nFTA1Dt8c&Z`P%!-C(#2Iu?n_Fh5|B=%KPLYuoC@Gn_BTc$$#AKDtGo zoxCcNC#IZd0isKh{EWVukNX+EQ`OQ=Mstnpkjyh{q0y+?{S*B~kjkn6SbESD%`PM? zbh4Kc(GuI2rI$xkzFWglo(oki2p8drmWaYMIR-M>>-JB`E6OLb;-k;mbbQ*0H7Vc` zH~q85SBYYr4!8zzV$dK5QR=y>G!@q4Z*p6PmN#~WURfGKZruo+P@vG=dH3DZ(w&+m zwQJl=QX(3$21lJK^AtR;ky3yb;}Ss%kxb9=qQX8;P)#8_(y4s1gD}m~18tE(?Dxz8 zp_C>iUaamfw$Z+LTf%DREN3s*7*EpAHi*-|RO18bO!F@rsSGfV;s~z5=k0GJD-()U zSJAwKl(n{%cX1=Xwhg?nOL;hBM~~W1ZsKRxP-35;u9j-2H^!fG3T8V8iv}ex*&?%v z_r#8$S*5H+_uJPaMhrHDA|4XxF3MdWWyiH4G-;6Kv&eQSB7Tica*`K*4jg^)%EJF@ z!cP6{4drKg<~;N(NxDxOw05}qGa*C-*Jf^w)VXeZVjd_dUwpmy8V76D_X1S2;Naik z__Cvr?B=4`;Tx+LgI^k_rT)-OTtNA3>DpQT-O=6{T?WHLrG9?S6(PA1(HhS`zYh}vQ zbbH_CV`OaU)owwv%+~=gOp@qTLudsbzkDh<>_I99tKPkU4A%dooNs5R_w1QkUU91L zo5!=lB(uW9-Zb6QS?`*^y+i8UheO+DlKl!Ro7n!PzdBxq>sliAY( zR6~`kx@Xm;wKg-Vs5EllIWMgb@+R|`)RV5Cu2+|0x~vSNVAkv~6yzdtJYH3i#2&99 zg}->3C5itOHR8s$X8TMz0ks#IOAu>64(pqIpmh7Y?vDsl3rcDls$BiAk`SQDZJWi> z)EJ=!=Tr}gj8_%c^AM-UCPj$EjjIK_^m+j4R>i!&?FlsE*k-$gO6xEB3SwciVo%b= zo%Up%q?q1GGtdo|Rk6-BmVD8paD7l5)2tx6sAoTGyD$JZ2sY%cOfZS6J^3gjB}{^!>#Z3r&ixwi^<2P?Ykjy5_ zFduPJAgwGamlhSngHbgRpHdIXx3BuwqsSxU8RC?(D;?_0wd_7h(Jw2_Hv1n}z)%nb zDD$^EozVM!Ilk_Vf5IELp~WoA?G=}4z%!rL>W^pjDuIdWVnaocydipBh$)(m<)P;^ zd<4%bdLh}jvP5MeV?toobN!NMqBn(-0;yib%Agwka@L7Zzp6&W#HI5rrd*!Y28}e@ z9)c5!_BZ1(U-Fr3vdDrC#rCq;;i*`=X=TEU-q7IZn^Ok7x+v=3X1bu`L$*AtWx!Te zADpo(FSGG(5G&53)F4-93a+RZSrc8-udJM~@s_6SDz}xj%Y+*anvPHx-7N!_@XU}= zQdqreoBwicATW^En^HE`Bz}Yyw7=o7bl_4*$gA-vQ7XxMqx%tasf(p9XQu0JNh>v6 zWvX`#4W%9Q3$7D$T+LJs?&Gv+;ZUPjeT}m~co};lSrU0gg z)#e5Z{WF=3XPBIN{k(@1XQfDRvM>RIl_b7MIK~^$veU)Wg6=1ElBU#CE$IORjGn^V zx$$``^e;P})gGIq@h3k{Gt@rTaOkdWN#6V1h&N;A&L=!G@9q}3E>iI5kP*p{C<>wM z#1@eK&h|r3b=kAM#|T41$cAO%ff1|37YDJhZ^vKUil-xpKQJhq?1oW6#OC1kU#*Z0 zZ4xrE=d@kXO1FP*+&Z4A#qWoeTJg+xY)|Nve|md7~9QKh2SQXjzV7`;mVBKcGqP&xuYAjv|!((1M1)*{{x^hR~7zu5> zHT@uy4vltnm?1B!dbdq(`pJWlNEvvNw`5`>+y+8~&EzBYj%@W9rT%(%ncuBuY_X97 zTibA$qnneYA_c01qD-7+Ue1w^h|`BhU7jZEJb|~0uc;*!-l4H}b2A%|4{#N37 zjc%RUh(t%#I+*9m?JDp-eQI6WHKn}=1_bY|{SGy5R~bHf5E#L5Wpg9{lRf;;bM$}R z!?SU4vi*xa{I1rV-IE?1-wmyk6_$@xSDXt1K-fvcPH)uLl&Us>Q9D83nn5R^* zx0h+#ef`7abUo4JLW~H}3+)-(4Qa({r)Q=o>kH*ZV;p!(ktGH1MpDl`T&hW%d3bQ- zD`NYiq5Jsobou0j`5xJq?Vh$ITKzihZyu(kGfH)igyi@&-F@E-@gw!)z5MRsb9_}u ziBnC3Q`M$N<1R02mpdk+ZD>v7foMtakY1LLiFv4sjp>RdbCA=0MKyfctERzfaHxuv z>*2sfZR|5?of!rONQ;bRL(%#y-$Q2EzCstOdVHC!cV;qhLsf3O**fKH5aJs)%b7JQ zbE$Xv%_&?1KGnD9xy`n-J7>nOl?}$`og>?uD>F$8hCm`BhPE}AvbDCUk&jj5vJMB1 z&YcEsiMfdpidmjaUuQp=hlXe-c+*-Fml4E@IuGS8E0)&~8AL2DcZwYH3PtthRm|X2 zFYKWt$r*=~ax>*_?85VxyxN&_ERq;u?9LnQ^c-6*qEEtAMQ#<_yL)Z=;OV=n4GoQ{ z>dO9!V6Dg2B{MEWj%WKxyTuMd?k7FdM~zq%1J*l_zJ7e(eFtPrs_dY#G0j_+Wfh}O zxHxg-A&KwOF-)y97_M2LTn#dGvR}EfWNPDcGjIJ*vQFS6ya>4l zL&Uv#Qv8k4v9*|S{mF*#Mfn{?(>J-YGr4M<82muxRAPQCAa7oMUbPeQwUBVu-qTHQ zluLi)925btoDqnic0t7S9hZ#otoVa2*D(CCqmnurxwa7iLQj_lHeRXp9A=Q?9GJyU zf{;AsWNY(SnESmXB3fw>a$cE-L?_}0{zs9@8m|>KBzk?xt3IDORDNpavDBo*OSO)KIg;Aj7{BoAmKT%=&s?H-Zw=0&BXvmkR&TRIa*z$ z_Whh_XiXLwe2f}3t$`c>!5&)_4xe(Kk}mL76Qi}$DO~Hu1eFg7qE?395F;%Pm=zO| zP`QjQYUyl~7#&TtI=UjTPgLX_tI;qE;EGxvBp7QERmhV3TFa8?ZwdM{kWkLR z*rMu^phsCuQ#M8VTBY;_jT{rlnTdfn9vIGHR;J@@Y27LZg`_cGmF>m_6CN-3ASE2@ z_ZCX(L&B=JU-K{_czm{c=Kn4<+Dfgku0rE&V|>`VUIGnmqPJ*s0?rFOUu25fWi_)e zDpvzm{DU8q2PBVtBJd)^mjf_fBcpq>j}Xzb3X;8`tsMv)Ay6M$qA5F=a>kXj=+nX; zKIRe-iZGh%yB3x;dv1WI+j3S44=-_Jx-qX5>*mRo@VT~}adIagGGN7)%E&pe%`&5R zXwfxtE_r65QiK8wRuV1WxiHj>plzhMt~w~TopoR1+>@Y@aj8A2y8Ap1(skfFoDUcW zbwyo%iP1HF2*+DqXnuQo%m9+zSIa}mf#o0=#&{P0aohoR;5h=Z5Qptoj5aFYAwVTS zRQp9a;8t?r%2B&!s*ja4NHNsPc+Vuj-y%E9eXf}<0v-?%!p5H##3b5x=N^23Wh-x| zsz80obn9A~Vbju|^8H~yV;D^EBY1Pz2;>q>bClYz(^{;2+O}>^FZ1@jEm(?Yrn94- zcF8gBcgY5m#8;DuAnU6LW2PucITg1UkH0fGGf~7iV_+wx`|3ya`k9@Zq~64)0BNWj zzZi9c7Q0rjyouz#XaiwJs%Q&Y^DNhsa z?6aSg6cH^{+-ad*+mz3lDFdXxeHdx6_kV`7VfSzlBjppq{NUos&V(0RYn!-({o#`; zS^~*zeuU@lOyL0;b0p!by_kIX18>OOXu(38%5Bew-@a(xqzvOiE6y$hV50bmn-I0cmE{qWa1-2Z$_*@zQQi{j_fJyQ6Y>xIua1T9Zjp6 zXfSAqasE|=YUZ=L&XkxbK~_&PDq@T>5i;61PuL}CeF>9TAJojdr`K3ZAur{Y>iV0p z-pDA$zOve}zIJ)WOf4l>of}jB`MKQx;_j})s@VF#(bEl*0t!l(2<)P}yF;a0q#FcL zQd&}!R2m5tkW>()1woLI5~Ujy2?e~fjq@H4>)!kC@8119=jdL0X3zSr`poQE&hpW{ zNK1#i8Dm7Wo1Ym-xLwSdWt46Hd?d-(>grecrx!O=7U}ZpdINW`J~?{fg}IY2R7K%i z-kkCdUnZI<^2sn$eSO8#BSSI3a*2dAr7sXW-i#8~DTsP*tlJqIAk5OO$*0)9{xv#Y zxSE-b@{VTA7x$8w1JPc~Z8L?<+=l{7yLF`e=gQM}uT49RBb<8;hTxQ}OALj^jyDGQ zFQ&?0pwcz4J5qmq?}Ky7puDBAVbP(Queyt>K9dsHyN(u zN_ShP&V;Dh(73gRg+^<|uhcilZ_97UjDM(LT-;`Mnpx5Kxt77prA^n!mRs|^Bh=WU zkMQJTW%C~6$*E87{r)e8SJ}%~{92^Wpquq=yBTCCxC zf_=l@Vy@F(na(QeHml5uL3DbQDV1Ykc&ybf4^2YjE=)a3y?HrdZn^BTMonWr7p)3s ztelZ$v2*Le9j?h3JISo_&2*n3h85Xo((>fAOLj@j4MPo%cjT|$@p+a`mIImE@Fj zW0~!7_g8Dv=fv6Y-<+$&$KHv&v$Cd)e zR=kfaEcroseXVvR!5}{dyDh6^@mqt(3w<>sa`;b84R!cOh7>}YchlG&CcDudgcRg8 zkzW6>DxDd17@2}ac<{!HZYShm)gr$C5qBe%DX%`Gt>`*wn%pTFMfB!>b%3!Ug z)_t9VUW@Cs-~23&nu#N%Y59coTFB2vtz-!)Vybrz!SBXYXO=1)-{d`g5K(ez4*yvC zX`SG_MS?Ek!DYu63Otqkuc~z88Xp8xsGqv{ z-Ngy&NxYnK=MHeb8cx=h)wMux%QYE11}A> zyhS3_PXikxkoT8zlqN1UqqNAmxhF+Akv}YO4F`T7kW8>sxV?#l+Y*1qVyf8_L ziAl*w$;rsbsmV@}QB#vsP>@qIQd84VQ!}!kp@m*&*qK<*ojb?M#KpzV&cy|X3&7$3 z>@W7?B?bin#trNxZ0M;ySQMDp6qrBSFr}dU;bQ)LL0Lt=urV;PaB%VP2?&XZG5`A^ zCI%MvpAX3~FmW)kv2d_(@$m?7u}KinhZNX2%#<)(868V17WZH{9(Cfwr?RYUG`cNT z2&6~ITRD98B)zSV+t!|_)47$Q9P-KfHVUnIUV^lP2A^y{SB1SA@}B*o$eEHKUY*+Z zZf>XGS^Mz(S3^6Wh`WU~9U}|7LP|#VzPHngYCA_4_b4#1u%O)H{LB+R9xm!<7MNj_ zI8YAUS*UQ~!HLx99JJ`Z-9oTgee?)PlGCHH_C#*8Yvg5N}qij0a5WzNP#FI^q%ywgR^(2pQ9r_b!a z#i(MjP+u0Lgh|jO}{B|q}Lk)j3#)rK;C{vGroRy%tDpD>^qW@lw zPS{N!QSpVFk&C@r#jO&ojFKY??Hww~pAyuwbT|&LyxgZ-U@$lYTVE!)GR%9YQn$H|>&a$1K+m0g&Rm@Ac?GScKU z54&=4%1j+^u6~NDn+aV?caM$iOdEQyOj_(@S?Q}L>Og;9mM`H-k)5fG(nY_!R9r$sEj#m6J+n~LgszZ#h+6k7 zU6z^@Y0KECXx-YW+KmfkOE*p42Ta7hldkBzIuQ}a+27)>lA6izMqOU#>GvYL$EdAC zhF;|q=`@vK-P$os9OZY^X&1jD%9~m8hCVYkjEB9O?Y_GHS;g^a;aq>?(C)7Pot+@p z7e}KzkApI$p09dOKX8Zn2(;HMePEufP_^kEzUsY}d{f6S$2sWj-nFXM#U{>PhWa`F zA?#Na2Wb)eIdD%;IPFr0AB%V`Z;0DHPNGoV3q?@PC&2%y;RL=+4oz~X%BeUBOVM?% z^7F%M`xQ`~(_<~S+I+647PgPiwc+lRu6dG&eC<30H0cx>6K=)z|M9zzo$_Dod_j z$e-%7Lbn;>P)hV(Q1hT}7g2{kY(sCPL)_XfUqVBfO^e5lZYNN)`L*v>JJbk^a9g5& zHW%C$TgrTBBr`$@P~XKK0PjYT(y^}HLXj;8qQS3roxt8_<;bY>ptU~ zqLnUALa4gBX`mjL{R5U@CVD~F=cWPwvs%BTJLgM zaFSQ|ud(pY7}?-dp`(~kL*wqCNq&+FPDO$WQ<6T^_b8!vY$Z@exS?`Y(S`n(k_hz;bSbO0 zvqdYH*g&6`C8@BW$I_Hao8?5+U*qMkp%Wcmv{hyyG+yTB=SIt-8!FAuHvGF+aD_u{ zSU>ttHJ}?h)Q`|53hf1rcoyga)`a>DdLwy$Vj6VG`awf0)OU1#Cuc;ht%3M&{SH;X|Fa2!rp}c62 z9GTE^{nRFu$y8W9lj%8nh@vt=`;+|h!{KdoNy2f5!n#|DThS$sC;ii}e~m>y$E=X8 zhCg*k9D*KrW*VU4n?Wa#%!PbP<)32`P6<@pJWxhd(PfSvsS4O2 zq<)I^|MkHM>a+@c`?>`6)#)DV#mA1Zfn*N}ctlvNx#c%0Wxh!gSXgpPqyGjcY_-Vb z8b!D7!b&{!u>P}X{}ee|1r$1E8IJx?!yG+Q{Zm`$a|jz^ba(i5&hWbu2#0WfJMnWc ztK&u!L7bnY!uKycw4u`w6%VM;DH~+iLR8S5<0lKyX-9qmR59#Oov7+6u(h+HtLei3 z9|oX3^UF_3{YksACoDn&TRVvB-?TkO(CaU<#{Kh2LFN_&>D1Z06xVM=(QfHeCfZbT!&QBLFmb zu@#`lVSO~8s@>>uxeUVIh!;KdC@|a7uv6=v=1xxOs`z=D_rKxg=UDW6lto@X0DPZ>dbtcgI>trzUj}T@*&*A=@6aI7B@bjb(dZ(`+9SxmC6l&^m^8KWR zn;1GRrRi~G*o&xE%aq3M&3|_MXlFKKxRj5|P-^*Hfbut~Xw{o`X8rZ$rZ>)f2)I4n zv~IO8-28N>AZJ+A;PP5do@Y?Z4~!RA*=nj{bvqQVk&A7opTh4|qJElqFBrR-;^FRd zK}`-t_Ux>+i>#qzheYJ2HTGjith?n+IiJ&DcSS|~zl)Wf#|!z;{<6aN{@hdfGlq@8>D|pL06& zX@B}pqwZs~LEZduG@7G7r-SIu3djAAUHt#;)V~MOK^3+%TxbONeRaSET{Gm@LmidS zlqpFDZP*gJ+oC)3pl3 z!v8NDXJVqB`FcVTL3&qs3EveS6Fq&;gv@$_^l;%_M^4-GAcg58v!n3co1aZ?@&)DW zHkMuzkd>#O3uB#ScII=<>W-wijb~D|)ya4M8Nc+>@J=SoFuwlV_zw)Kk6VNnQ~3YBYmP#q|7G3((*PXVY~j zAPIJPz+a@*EY2u?)0<_?=C%Ac`-$%BTZbsKzM9a*qM{HLA5lgEzOW~2Uai%0W>->A zk3Rik0^1}JlDX>Ba0Z#@o0ntWO#foPvztFpi1XEuIsV0{$YA*af<{d#1b2O+8KTb{?z+J4o8LHBql--Y^0iD%YN*4+-0RiNtfqojJyVtiW$7s# z8i}hjH+1zQ4h9T8xO*PjPetQoJFLG~sI{~2@%tvQJm%H&{_2#oT}*{>S?!N=u9Dsv zulw4+U6-)7@4G5-{idKz4xdph--RTP!PPnfnE4ZuXO!YNS8FDXJXOY#qV3&zw;cAe zyU$+{Ip=n1)?Z(ps1G|iI-p%}%0kpHDlXv7>bf*XT91L8yzdx!9beRxQ2T8~yf@P= zgAMhENT+AeQ)ZqRG>B{p`jwt3413oN&3$#nzHi!9Mm9N4m*?B7^s2n$lB3||dEo$W z*}ckvehCSBG5@bF5B$BdnHk0&??1O)7QG`9h^}B_{GgDg4U4*5s73hw2Vu%lvvynw%H(bZjDd0^#>g zY2rySBI3i`yLbig8A6LHZK$ndXwO?-yz}HL<7hl|yZoZWYdU-AcDX^2POxL@=%OWD z^IXk=_Z3t5$-~y3{CstVY38KZgPHmBZi}pGmFU~$wApI9j|Z0z6S*n|h8CgQ<%-T# zsMmG0^ojcH8T#FY60eCZl5fvjDm+H|A`Oqvecx1gFcEGs7H*-uZ9%P|m98s5|Jt;f z{QVhq3T+M%yf1YM(aX;-^e=NbI8cVz%<@F3@bpyQX%Szy7SK|lVTs=9wzz&rEE5ll zeW)b_es!FiFmUs$k}Qoi@grr2J1-qilj(nG*?;}eS@fkcHc6C*(EZ1arIxFE)9kSY zEl!yC5;c6MO=E{*xG&=Hy1rjMw^vJZE8av~NsVHKf)|?pN_TxWNXSZFjG8GFUZgJS zlM+d>_JB^Mg~^gjMbc!%@@%(_+M$_}-X$^On&8Hl4ACqM*5XX3JL2Yg@+C4l9}-}? zRugdR(Y*NnXghpUEkndmKE^La*YeTVA5E9bBDk__o@=BzUWRX`tRF}4AdlwWuQE?o zGZr};*{TU;@ip-_d`+{j?Qs#!7{1Z)NfTbEH%~zpLe!OsvRTZ0^!RurO^tYq@IAfl zRW{NmGVZgxo{dum`(mo(dt1Gv?CV#bjk(aKIlkNZ{;tI+_zi7cNs9E|N}Hwk+o`6Z z+Y7U62bZg4%W}AjI_zJ);F8dvBBjVqsED${o>7>5pq=vRctZMY3-{@~*Xfu9G_UhN z-%xm3Y#QCcF`T;SY8Z0l7Ujpb*Hy+--Z@xYuM>;27(H_?;qx0txHSJ;*7Zl2IG^7y z58ToucZe+1@tt4PXg0k;6rTP^&LBXij2qehh5r?H;+JiMm5&qYq)zt;I(c}3E=dDLCnby#ep zZ}-s=?lzO^ku*1~UM>Hd5(hI}Gl@nehl{UQ(RZOyh)c3iexCLH^N!hN-z5V~ji^9sV%Z~f;h^1mL!zlZs;D+D*azM#T4{QOa9 zkLgk29%ua=qt^zXRl8*~k8LpzCtbN)-0`)MzD_l`+WFl=p@3_PkvXC>mKW*^nijA| zr0Us-A76)_u3bCk?BXXw!|%lTWwn%lY2r;I?l{Ac*XZKxDx)r~&@D;_wtPeCk-Y|H zx{$5gbX{&YN2@6SbNnBY}_SzaV z;guxSNfLcN6}T}%+vXf4`E-xkVn=ZOOutZL;OJHLfeUw&n6bb0y-0sbd)1qHDNgLP zy+7&uo`vvkna=?o_c=6;2qV32Xa`znK2&CiMUXa+C5hZQ{bBmXIRKheyebm~;J#G2Y*`a`!J9 ze0&|_QXg1@z0-JFaOPz(PFS5z>HeoUP9xxu>+>Jm2ZIYABbFvU|ajVlMu1Wl~Sx-&S7<6o`uFMj??Jx_`Bk<#!Ld?LDY zBaOJywSU+7Wr+;--66z;>=!?R92|ZBPl+?vBgRZ(?7LodKR`|EnBOZ@OIO@bHzk;A znLo1S9n2QTOT|recQF3ZK|yW^yNB=LKdigR7D}eGn2_+sXfZd9?fS*!7V!g8A$;~% zR5UbuN@D2@ku`Xv!B4{md;LyX3(zlXbH5~-uT1AV4ITYQfsy&9x*Ck%dr}$4+Cz`t zs5@TvSy&svJU!#vC(rtvxMapBKJDpGEql8pxhQ0bGk7yorqIPn7he|cIT{&`h+HH| zkB42Jx47HIwg{w!o%+vp-+ZBdK6$lv%wc6?E7kPJg+=*iqspOvezw&i)3 zX_xDZJ_jC##x=%!4Pu-|=H_c_?5D<8<*?VQT*NqB&8Naym#JkX_I$Woh>$m^*jN)K zo_@o&`LILsitcOO6@q2qd_ms={7X4k8C?!{2A@T}KxLaXV7B3e1Ti+>_HwOz6u#SC zK*fMfk{j|qbzS99h>)KvsP^I*E!o^QwS@9k5iK9J?F9j5$ro;|$x81JWm-#)&smT* z%k7`zguU^UOP7{B{vfO(@b1Hg4kgAdLNUbIkT4JlMQ|hsU2qw ziGce#u9!-K*Iv@9gfovn=nd2A-nDrxMkY9hZ`^0>?QN==^+lNet>LG#erDEtP2HPS z@Pgo$!xR^>n(JM9Ht*D=K&5hbbYP@|-`Okc!Z=Rf< zzBsNi;pOf7p?c;`&hx9%`r8LPQuu9L8kS#LQj_eKk#z()-}e*SuBv5csmE4~6&CjQ z_p7s+`X9*KktoX_l=Utl{hQ}w8tF?Sp=ZOre15TeBCYRs%yLN}13uTAk1?{VI1juY z!r^??hZ`8GYLERsk&^dNvxugPU=){*n=|eaP9l7Ss23# z?~x$^>%E%VJSi-dTYj98frEsP>j)a>vaeY9W|){9N?xFg(>_qRKJi=wi(kT>i(TC= z(O(CqcAHMEr+17>^7cj)Z(|ql%IJ`{8D8j|PlD;)Zsptq5=X;v3%EGZ5cu zyqvmGJX~AlpZaNx$Ch!xx36NE*1LZ^HjLhEkUQLNl=Jbnfv2~eD_;g?caCAggq?@X0%ou7+{76eUB(lmU%W#bTFtPZ2g&;c zJHQP_T-mqIZY|yNnkO1-HO7z2=Z@sc(pvKDcBtREn{-YR=i@RkJSiDh6*y}MiXPrz zvO2>c{V0W)kj$(w@Zd?dUES#O@ar)n!%Lz{1kZaFmWFw0UCt%hCLV|V5P2kYBW|GH zhQxa@8--BdiWg|GI7V`hTVq^Vm<$myx?-zyHHsIGfix<=8O?#;m3=*0EWs9Et7VOl z<$=Xo(UpT zWyI32PPI>P=PPT^!Qdhc%IKt`e7C=#K7cjo&HL&lBcjcAC~wDo?iTirZ+<8tBIz;d zbZ2Sf@wF`87gJ9UyxNKbqjd(oXB4#hVsFhNRI)VQQR8(CRHd1cPNelvt6<*IxX(vW zvMVX4KOOvTV+r%-ykr*a<1>d`zpWHZuC@I`XD>sd7k8*B)V9w(v`nnv^R^_1o|T&s z9`e9MHSO~Gjpq+~7w^wWRoqJK8xWIE?b%}KioKYvl-k9+o&TgAZ|{}sjMg13#hvit z_)+y>EB7WDhkM!xJd|fb4DMH=+tYRTeZ^iM+^Kij%#%zrC}#LE=lr=~`F1JlgQ;^y zymhyxLdS)Bb{K+@a%CHV24v=WU!6m-);sw<&uL=a(yw1mv3g?`s2p*cwcJ7H?dtW= z7x0yQ|FKqQ4o@N92NgZhx{rfp#r-7LM8-M4H_?4oXi2*y->Md|bols&+M*pXY5xtW z(3~^OmDKcMBmxa2(q!k#&MBq%3&*9AF8Ia6`lHkn&+y1&M4Zi6jq*C0wY?rt!ld9R zrFiGGh(?0vwajTT*|BElIK6XoVOZJ4?)!!sZf{40Q|?#zy{~7#W)aLH+vA>PT;X<| zPAjkZge}i!hw=Mig?#1AkG*%Pwy7##Q-7zC_Rs170->No$pvuF~lpZvJ>BX$(NhStu7Y}1p zFN+3$pDqvo9x=LK9y#v9;j29QInBvVGmP1(g?2x^c9Hm7!sI7nissXAKM$LakdPGR zvlVA6M25K?Hr~@!C%t@WKu%+-5cPHyAySya>M5*<%v%ne>%KYZeJ>!MTnnyp?wT~` zQw#n3p9Q}0F6D>fMv7ZDJV?(o3*g|%u^c}Wmg3x8w`^j27b`crJME1CscA}coemy> zJQn-bVBy>O!N=y~)l3%q{Fj!0Bs<9J#9&^UAAE(|mtbE=QK!F+ar5fb9Q?KCCH}SA zCuaA@Ci!g{m-Z~O38^}(B_;c-wev&uaeL#jl_FBuQ)r!S@x|A?NZ=w;SAWfF5PB}wG}bq z((vFjm}PX>k1rIP!7U+-5$AQfM18K5Q~eUL+N=`G^fzi6pH1?<&-}+)bx)$J%Y+jz z3`ovJiz8u1I*!j~E@`wH_;@`+To@nPwp2#m3J7%6L4(`jO+7K ziv_GK&okAYkoNBP&Eb7|=@q6i)6i3`(MtAFG>PIS<3S`;B}tJPnMx{b%&p2QyL3^# zFda4ZIffWI3IG;X~Z*`nzb9G*a_cP->&o%ZG8nEHXNXLx%LR_C@nDK+ciVTHOGHjQ&USSz();&?14o3W5 zp%?YZLA2Chgd_C1Snx=%LIAa~{N`heiT z!<0kSf@aJaxAQ%xWZz{;qPy(srrz*pFg# z*Gk`sxK_Wu)RVp=B)UFK+WPDvP3~+}opC+wT_@ts$&rZ`jaLV+9+AHlA+jJ4y}zvx zLwR}U>&CS#5hYWtW#s;gvlSVSPdSDy-yw5%%4o?Uw%@P+`0bboVbjVO&r6E%(yjG6 zH`Knk&}91TOXxk(iJ^EIf>LOLFmFw#$9gD&k^4!X9=(+A*0g-Fs--HRJr_jI$LlNL^!V0%;>Y_yh>u#NhOF z_2G@#Ib%_8g4>hCNYJ=!l5)D?L4Hzs)8qO}J!Qz`r=KUoPpmzr;7I?3L!u z(xCRyInqK*{gs4d_hFw+{WEr@*Zk#$D)tv*afLF((_$QEQYAF665(pvU0mju8XY*8 zNpkf`yFxoPRnszkwR-Nx(C0Ika`xk8)MDS+za$ysynj2JN4R9y)L^mkQ8X6S4|nt7 zn1gE`S@U-NMup8^2sx-qggUcOhKW4){4y%O6&{Vd2(Ei$U-5&^-9!M}jKtAWSYnrP5bsEG=z?__D|g!Gx0lXme%%b4 z$)K^Uv}VWY(&CuLl~7tW-i(QpsfEEgs~Pa8Zq21@=if9k6wD2jHPfI zgZXP1af;B{FN!ST0eQx{n$45me2MM%l)iZ=mCJo-UmnPt;^UiSW0BsRO|F&MI<&{& zucQzIOkMl6PV9evw?#ltAp3v&-B!bMLYVT!s?m&cK?Fe)!L9mvxny;p5d(ThPW%9} zN*on+Hc>SdcY~lKA8aP>Zpw>}&$sn?kkY|%8+&ISpLLCRk>(2h!=T3mUw(95Gubt3 zx@}ZtusQG6MZo#W;f_wnCB+D977>&qA9%y39Ai^Sq)Go@z+Hiv`S7MoEqj zNsc*9l9yAGWR@RY{%E38(G>S+v!bD#W4Jzh9$k_Of(n1y1? zz6q}g?)qxU#AJeOByETO**`n&t!j0b<~_Y`%G$LeSq`C!kXjbz5cg$w{MsKAv%#{^ zT&61Ce$Tw9Zkj%}*aEg$+penGG&&=^?|PwHvV0%RcG&u!F(;7C5g-0g4ir}NlZ|Dg z(I?0qXs6B=B?ia@U5Pl1r<|f5mRf>_@5AiukhPK8Z$8-4nc&XZ~l3BTh`$cf!g%Cf}0;`N| zh+bi&WrWA1ncrq_B5y@Ok%*d!ZuV>52lSnB-3(;I(+=aZ*};PJ(&x01vbu5BmZDo9 zdZeccA2{m`d<)dZs_N8&-Pc$2t|HegHFztX8OA^|OC5iY#5`O?@l)D$R=2U@ExW_h z?&EV7_XI`g3d;mrbHBQ~j?3J>`#>5aD_54Hgu9lBaO-Pm?k5A5$mpGwYut(iZN&j;P^uF<&89va;`9s^>^#n z_3yN`srQLm=(+er@ZVTo^w{X0x5#GYjJbaA+ZOFsfJ8dh_4@_ml%(^dOon)El!Jmw zx`*-1hNSa2!<+zWSyy_3~ZHy)5ER%w$M6HJ8E=FBim!m&caJ?ACbac=Wel{dCf z>67Cnc6}#eVfqqiYyM77o%10U%Q`u&iBG0Sf>ds*{D$yC9@EDOi4bT81HWfh&ZbB8 zrU=O^mo%}ehIM*ssqEo1M81YTkIi1=BBCJ0dERwZaCAN_ulvO>FUucZTAJ-)~6HKNXGY>E*%kPwVMdwt41N z@$I7^!pL9tg-+JPw}qb=*@Qx`llVOSQc`~uUhHyRqNd+h8g5{R*TN>rD9c>=b!(yg;| zL+@$`@n~t;hnv1O{K4C}1QpY(^)IlSjoiq-)B&$8g4U$b7ccE=J?5|LFx?CtG^lDV zzraR4e=T~i{Sn2*Y?SJ~hX)^HrVT!~&@^pFs59j#4S%la|6+r4#8^CK{_4)uSK^A> z1JrgrMY1`D&Eo6=5g8xzwC}ow_G0(A@6YJGcXa(CH$^ka&t(FGcQgC09M@cFZlDe8 z#px57t~gdCpTr7=8MJOu$lwsIKjdOFDT*DB`owcEWbm>;!$br#$lM>!oc{)!6`5VD zhr8)SmtCzlq@lYSkEqhvdcZT)VIY+ENCaWac1R$qs{CB-T}Z3#nmse=-WK5nx$loq zUKn_u9g>tx&B2|WcLwW>UKTNK8eZTS=QHN&**vJ}%d$T+sekiF6a6lc$0*79;+aL4 zo6>lqwVQV*3K1!$SKFRgS}x53o2-`5eB)%(RTmQhio* zZ|Tgb_>oE+W5<2D`X9|o_Lss8%6Jtj! zJ;UP$F?bEL?g;GicifiW!=*$lrfCF(*;XCf=KUnk^pBci5W)+f8BZTi zl2Bhx7FF5_z<)tpTTkyCZ^(^%@wqN%`-%}u=!!jU>2pirO`@|5PA+b4?w49G!gmA( z4n)V*H$$0p?7W3O1Zm(cb}ZR{%qYzZRC9Tn`r+gE54CREJyr&F*A`ROEQJFxZ_kR> z-&IegYNmEOqrZ-M`Fq;vk=(V5md!2$he=!`KR5?!gse4C+9Hnd-Lbp(1@~&JsVmHm z-9H3s(i@(0=@-h`nAm*d=b7SJz&0O%Re!lpX?|_OOGmoMN9r}Jc^2o5+fNq7mQU&5 zraK&wX;$TPeaOmh_u$KDceO{msri%qOT5wLb5lH#gMvkujk&0win?^FeCf4#+HN0d zG2kB8@B?UOL1d>6s7&7&A8Av0i8Z>2%$>}M1BmZ()fH)O`S%<%8(301Uy=xXElZcCNq5A1j!Si3xrH_&cp zFC3ipz}0Ql3Y9JPxy1ElgSujjRb1bCx`pHRx#?V!>6y|#HbI)(0Uhx^N_0ILVL?W9 zLFt}b)lPe-TqT{;*FWOU)n8B@Lp&Sj*fd?m;l0~Es&lzD^1V%ENr&g5GzXPy=Js4% z>7?Jr_w6TzUvFfv&fmbtefKi)P6y6aSv_3pTU0_W@JEH&w?ns$t1YdrqfQIXpNZ=Pot{+Zgeo``9(N7mYyp0hE^zA zPUv}6aiQ=YJswU}%blcXpSfqQ^+g(AD~+AcZzT|V{hV0jD zlGxcVL`0vCU&`JPxsI!T3jb)^di1gX>xiNALe2T}+anp*CQj`o*L+-&W<`z6QDv!3 z8A>tT!Y;2~&kpim^4m{mkmFA6Q%vLN)8`+Em#Mc!o7%ckm% z&`4P`KU2#?%=B)|lBf+v96maZ)r?VPj#ACC?}Z6#rRDwcedb2pX+VB_4dDkWf&oE+4^eL?wD!4l!Rltb45$wE=8BI zKcih-@CN+xt@ja4WCMg$`xw`qf*DucrLgl^A3Mh7!P?*YYsyVp1^7KLF2ApH@4l?t zFr($bBjZnNPV~<*{C4))*;mvf<9&^41eZQLM4pdq4c?b`Fklh&X0U+fp%|p--MjUQ z{3Zi;J>ipMKWyeFws!-WReA+Az8>vpBNh%zulr4lU+g&ce}ILne`LESugFW9K=JfW zqD6$mECI}VOcIhSUD6YC~hBH8zTuh}f6o}r}Xsp1t& ztgC#?>^O3G)x`&vmyOg^^Y=8qHcecl6{{X5!a2i9R{!Y8o{v1l78@F%omtVmaQl z%74tQv3*8VzIiGYKmM~_pI^&0H}%A*dROO=8UyAw@H0%DG>hd$>_ZczIRM` zuB0*E3Fr>NhJV6PrWHH)q=R7LeaAK#wxh@oo;~RsNX+e&o{})AOVV{-kSvnqZ#r#=d5P#-m9oLGG+5Px!qj!Zo(mmwz7IXURX2r*v z?nEE`3^N~%jE+C;8_mdJoM?_0-^djmCXFr;epV5+uQ&Cz_*i&!S{zeBbEWV_`ILQ6 zhoi2A`7x5IHI&J`Ly%Ky%gpz`Q1N$4W7NAu=@JpUK&2dyxf#v zK%qaSy@(MybwKbd9lCTk?hEayy~9U^!20OF6Txvp`3O zYQd`0c}+T&(<`0LyRTe(^9LSWeG-Qe(}w>_qK~uwV{D)EP)dzRVpaE>r~8o!T>P?D zpNXT~Zb$cKEF>}IVPd5RG3mH?J=@s$PLoAHX_XlpZT9{V!-I_brP=uDh-x*@h(gO- z=@}gu1*O?+&7aeJNwhKeZ*)@LiU@O_JmqrAP#1Wz{O$SC-mr<`bI{U6^?)WHz|oA&Fnl?sm3ayjn3~ zZ^!SG>jM||{;VyQDAUEyG?AWbN?{qD`%XS-EOg91bVk=Jqp02|UW|3MG={uTJtkQd zk#*D@D&R=K!$FQ$S0E$6de51@4t}eBBE)>V=B3ed=gLHmjQ$x^s%9k@VmV_xu?-`X zNrIN#C5fgXJuRE3mZ(jlX;KRz+Tg?3BR~g9IBhOmx__fOiVH1&B;wQ7XW@k*K%vZx{aBEXBJWgtgW+j$dsetg$lt&9z^H;C^{nwlX(^iU8D%QxHmghC%^yXO)G!osa7yb#q(SY9 z^!(J;lS_|lIb#+YV0Dw)vO(*D{Tbge)5^M+z8AMeM~KF~mX>-ODN3lWV^PJR6-)9= z{Oo<5U~L;p2tBYh>r361Hg<2EfGK$~x8`)p4oj=#MEkfJ*ARAEZ$W-$ z3;n<#-l#mdGy@pZ^KN-~xL<>#hr$1nUQ*H+uysd&Hnz?U9~Jrm^O)8}e` z#t73FKa~^5nHz_Dby3dYX6Hkjx~KX09>~o`_dqjDwvF?b2<1jS^1ia)DNIK<@~pY3o^gIJkMC_-ve#}z_B3xS;2SLA2fU;Cn$7WvPC;Z4KJ)PoDq1-Jd-FNrU1= z{I^`t$M}=>XFDhj`74gU+6(em9Dk<)+7%MeKhW!DL9f5}{T0XGX}{w5JMCAU|DEps=#DQM$>A$g|mpeL<28aU%hyw+PLl96Of`B-F z_shTH6$Hc~2#5n(v*$#f1p#rO7ee}PY`^=*-^T^SAq0p+2oQ%5pgx2EaiCX^`)^)^ z0CD{8(|_ep2oMK)v8xl`2Z%!$5Qi`z4q-qX!hkq_kBNWfPZ$u#Z&Uu>4iJYhAP#7a zxf8L80OAk<#32HRLj(|q2%tVh0C9)_+SP9>{)$Zm5XbMa{omU`4+uFC8w?t4{u?h$ z;A9*yfakE^F8qCrlX1WVPR0QfI9VSsfs=8-1Wwim3iXh{T!D6v|SkN zWPQM3fH;0z`}Z*baiC8TPaFdf$8T%@`aU?IK7Jee_jZ6d;D9*bC-Vno?Pvb}G8B*o zLobN=-#AX3M?hZv_WZB>{r3FtG(fw8mcKi3jNhLBy)U3XetZ7+b|>S7&T0V10MrM- za~QyL7!nW%z;hVDbLcGTWL}Vf{(%I<@%!BIuXvGwH~^l*0G`7Dp2Gm1Lsz*c^9=AD z2Jjq)0>lCE90u?l2JjpP@Eiv490u?l2JjpP@Eiv490u?l2Jjpv2&fN$=P-chFo5SU zfafrP=P-chFo5SUfafrP=dj<`IDfS@fafrP=P-chFo5SUfafrP=P-chu;14>f9DU- z&jFsp0G`7Doi;Q-I!0MFq7&*1>ip>i;Q-I!0MFq7&*1>i;Q-I!0MFq7&*1>i;Q-I!0MFq7&*1>i;Q-HnE=K*| zJ_GO^4)7cf@Ei{C91idt4)7cf@Ei{C91idt4!Ayt13ZTVJck23hXXu^13ZTVJck23 zhXXu^13ZTVJck23M*uuW06d3&R6WsW5CG2+0M8Ks&k+F65dhB-0MDTxkx%9Y;5p)i z-3a8Lau)d4eFFr*a|FP11i*6yz;gt^b7<;1AkTm}0G>m)R8H;-xIRY!JVyXLM=$^V zU*8bF?{pllcR9jsSR$0C*1Fbp?Fi$?FdUz;gt^b0olXB*1edz;h(Pb0olX zXuiRTJR<>~Lu)$&wmaz{65u%!;5ia-eU3a~Jamf`;5icDITGMG65u%!;5icDITCPv z4n1N0WElWFhbA-twmaz{65u%!;5icDITGMG65u&>l5{dJ0MC&C&yfJnkpRz;0MC&C z&yj%Zb7(RIAb)^%1@IgR@Ei&790~9o3Gf^V@Ei&790~9o3Gf`6oN_WYfak~)c0*S) zzsvOB=e9_I=SYC(NPy=^falPJi<9{Sc#Z^kjs$p)1bB`Fc#Z^kjs$p)1bB`Fc#Z^k zjs$p)1bB`Fc#Z^kjs$p)1bB`Fc#Z^kjs$p)1b7ZjlsQ>P0MC(t>vJT)b0olXB*1ed zz;h(Pb0pyU{Lh@Mf1g_*0iHvTZaf(qz;h(Pb0olXB*1edz;h(Pb0olXB*1ed;QAa1 z@Ei&79GVDqB3=~0a}>aHXi^bi-;?K8D1hfEfafTH=P1DSISSx83g9^k;5iE5ISSx8 z3g9^k;5iE5ISSx83g9^k;5jtY@?@C;JVyaMM**(SQ2@_T0MAhX&rtx+Q2@_T0MAhX z&rtx+Q2@`OWmry@0l;(gjLrZ4&VT}Vjskd&0$iV?0G^`&o}*6K4c#gF?exEGL;*ZU z0X#23;>>^0N3ZJ6UIZ+<^Y~UQ)5pa1K>Fd;5iE5ISSx83g9^k z;5iE5ISSx83g9`knC;0p0G^`&o}&PsqX3@&nJ@ZpXHWpoQ2@_T0MAhX&rtx+Q2@_T z0MAhX&rtx+Q2@_T0MAhX&rtx+Q2@_T0MAhX&rtx+QGn}n6u@&7z;hJ9a}>aH6u|TU zt8KekX&4H^FuV`+9=hqeY3g~S5DH073a*5@6c=46bYq}q<<&d!2gJO)TtH@?GsApI zJWt|z63>%(p2YJco+t4f=5zi6N5zi6N5zi6N5zi6N5zi6N5zi6N5zpf-{{MeTzc)o+ zwLe|Ymxy|;il*5Nn`&GP8=j-$x{fedb O?sipdHp9blReS;iE1CKL literal 0 HcmV?d00001 diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 58d200b1..65c06117 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -1001,6 +1001,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc bind:ausweis bind:gebaeude bind:aufnahme + {ausweisart} /> diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index 7aad51ab..e1d2bfc1 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -20,6 +20,7 @@ import { BenutzerClient } from "#components/Ausweis/types.js"; import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; import { Enums } from "@ibcornelsen/database/client"; + import moment from "moment"; export let ausweis: VerbrauchsausweisGewerbeClient; export let user: BenutzerClient = {} as BenutzerClient; @@ -28,7 +29,38 @@ export let bilder: UploadedGebaeudeBild[] = []; export let ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe; - function automatischAusfüllen() {} + function automatischAusfüllen() { + aufnahme.baujahr_gebaeude = [1952]; + aufnahme.baujahr_heizung = [1952]; + aufnahme.saniert = true; + aufnahme.einheiten = 1; + aufnahme.gebaeudetyp = "Polizeidienstgebäude"; + aufnahme.keller = + Enums.Heizungsstatus.NICHT_VORHANDEN; + aufnahme.dachgeschoss = + Enums.Heizungsstatus.NICHT_VORHANDEN; + aufnahme.lueftung = "Fensterlueftung"; + aufnahme.kuehlung = "1"; + ausweis.ausstellgrund = "Vermietung"; + ausweis.verbrauch_1 = 15000; + ausweis.verbrauch_2 = 14000; + ausweis.verbrauch_3 = 16000; + aufnahme.flaeche = 152; + aufnahme.nutzflaeche = 172; + ausweis.keller_beheizt = true; + + aufnahme.brennstoff_1 = "Erdgas H"; + ausweis.einheit_1 = "kWh"; + ausweis.anteil_warmwasser_1 = 18; + ausweis.startdatum = moment("01.01.2021").toDate(); + objekt.plz = "21039"; + objekt.ort = "Hamburg"; + objekt.adresse = "Curslacker Deich 170"; + aufnahme.gebaeudeteil = "Gesamtgebäude"; + + objekt = objekt; + ausweis = ausweis; + } async function spaeterWeitermachen() { } @@ -45,6 +77,7 @@ bind:ausweis bind:aufnahme={aufnahme} bind:objekt={objekt} + {ausweisart} />
@@ -162,6 +195,7 @@ bind:ausweis bind:objekt bind:aufnahme + {ausweisart} /> diff --git a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte index 90c771aa..ff0a0e4b 100644 --- a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte +++ b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte @@ -185,6 +185,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen" bind:ausweis bind:aufnahme={aufnahme} bind:objekt={objekt} + {ausweisart} /> @@ -291,6 +292,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen" bind:ausweis bind:objekt={objekt} bind:aufnahme + {ausweisart} /> diff --git a/src/pages/pdf/ansichtsausweis.ts b/src/pages/pdf/ansichtsausweis.ts index dc5cdc7e..f71add4a 100644 --- a/src/pages/pdf/ansichtsausweis.ts +++ b/src/pages/pdf/ansichtsausweis.ts @@ -1,5 +1,6 @@ -import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; +import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; +import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js"; import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js"; import { Enums } from "@ibcornelsen/database/client"; import { APIRoute } from "astro"; @@ -71,7 +72,12 @@ export const GET: APIRoute = async (Astro) => { } }); - const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + let pdf: Uint8Array | null = null; + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user); + } return new Response(pdf, { headers: { @@ -90,6 +96,7 @@ export const POST: APIRoute = async (Astro) => { const aufnahme = JSON.parse(params.get("aufnahme")); const objekt = JSON.parse(params.get("objekt")); const bilder = JSON.parse(params.get("bilder")); + const ausweisart: Enums.Ausweisart = params.get("ausweisart") let user: BenutzerClient = {}; @@ -103,7 +110,12 @@ export const POST: APIRoute = async (Astro) => { } - const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + let pdf: Uint8Array | null = null; + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user); + } return new Response(pdf, { headers: {