From 99eca4b9ad6a8f0ea519cedd6c9415a24b057694 Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Wed, 11 Dec 2024 13:43:21 -0800 Subject: [PATCH] fix(result): Update to respect changed E+ output name --- .../icon/HB Color Rooms.png | Bin 1149 -> 1148 bytes .../json/HB_Color_Rooms.json | 4 ++-- .../src/HB Color Rooms.py | 6 +++--- .../user_objects/HB Color Rooms.ghuser | Bin 7197 -> 7195 bytes 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/honeybee_grasshopper_energy/icon/HB Color Rooms.png b/honeybee_grasshopper_energy/icon/HB Color Rooms.png index 66271ddbcaffabf72cbfc918170220fd98b6c914..17c8857396bb87d612c7bcbe31efa124c48e7e01 100644 GIT binary patch delta 1077 zcmV-51j_sU2>b|;R(}ymL_t(YOU>0=Y!p=-2Jq?5US_W|v+c6%cH7x5-F7K71tg-> z#9JSHs0o1pwnm~5QEMv!3o+P2@e)nF6bKM~F%Sf4s3G8$s_}+3lv@N%j2cKx0E1O) zku+5F^ZU>4RzMqx^5B>JlIfXq{^#tOGgIaN7K;+u%d49k>3)6=xi^(IM)kxs*>Q$-R7Tr`_}!bx{?KnR0rDj?z}TjxLX^ zz9V~iNhXp^AQSDPTj-L^AdnP~NW&PB307t=$IN27K(eidG)NlgF!j)DG?V@=PtwNh z(4#(Hkniooe@&W(8gXAEDX*K1y zr;a3YI3{N=6=fmGF}yfS=_}eCR@LJx%px3#mjTHP4i=Z8#_N+UmHVeiR($#U(MR%Z z>?|TV+xb+`ni98rs4-+9rD<4OG#=+lE3hY;z}%pYn|}fUbg`{H96?%DzhVDpsYV9p z@(GPja4&74>C|1NX&2UU@ad9rz{=PwuMdP!=JDWKpC21|Z=fU%lvdiL-^NG`)4be1 zMcG63Boj;^J9B8Hh8^CHm13AHm4QQvGzJpo7-6xqY@6uS@FllL?hUeC?uj9?C*$_@ z#w}Fv7k{(fuOvHRr;$!faJf#&&psn7=YXGc1*F(%n(p)ASUicdocIU+Eq>v(Jz;4Y z-Q$Wei@!9es>7@&pOyR}QJQH3ne@Enc7MOFFp9z4M6$w@bPXpsnwwx)w#cf)@k9zw z2SccGs=ssW7qo_CYvePMBs(pXKc*5nRp%!=9e>!O8yMm0WZPtd6UC|QbBS4K@p@1w zFK8qMMGMN7NS%BR(C7q9XcJXak2_jD9Guq)XX9EZ))droqMhMF)cXC{S`rdoS;g6qa{IKJRwq6rJ}Zr~MXc=;DBnVYKhhdbAJ9?8l*u zFMo%pfJL2dC{=avFW3aLt&e^Bp|5xkIwvt#9YARIV{rOngRD0|Q7JBw58Xbk@&*`9 z-7q^2*#q>}ckIE&>Vwdiy#-g1h2Wj*dH*oyGAA@~E^E=^+B;}X9 zPMQ?IIP(e=<(PL${ht$YuoN;L-V3c{5`XmOS95LeW>+nRm+VI1)+V?LV z*>TZB4yXU5zjgtPrEkFKI0B=!7g})!`U5+lv#7bMAI5zz!#`s_RFC-+$E>H(H}^`y z1EM_T4Cvl30=Y!p=-2Jq?b?Cxy$GBevQWiQ>`F5Px1GzBE0 z)WlmKe5i?m0JcWrC8E|=0v1BBh2kZedMOYf`eGmm(pW+OZ&ZyptfAZ@XkyerVgeYf zT8pHipr7A=X14;`NR$V^=hQ`2G-k@_IXXg{={mYR zvic7D@{&v>nLsAmLATH)nL!{a9+rkNA`>jPFUQORxEtUHxNmhLM`_V`8 zY^>Z*a<=oSpj8RCd#EvJAgyUwT|6FV6BXE1633i?j(?l{esr;|JrqVpRljBb=cz^p z=kh6yPVfM2qUqFKrD+$|aPX43Ma_NWb;r2&Q?t zeTuS+>PaS;KvrhcNDVu@6G>p0E0uvm@eBsyUG9k?vL@s9 z^+uDZ;D0Y>z4IhHVWp9dPjIB!08-jJ^8HU4~f!D>&T=RQ*QSUYl=!Rn43sec!I9s1V?fc49gZJD{(BI z#4%(@?a4Y>Cv#XFrWju#h%THTAfo)x&|golqNBLrG3SEhl26_MW|JDZFqe{I@p2RTLXxjjc4+ zx6F!*9(Aa`6TaH{Fc!TDqvJ4))?R3_EcA!BL1$5OML&!OUxjbRJUBJ;XO3A*qi^n& zga<@8l>z@Y@_aVBxvwrG0xx$o w3)x1t$yYZh9j;ccCwW)oe}_{V{yB>B2O#{dEq9vVz5oCK07*qoM6N<$f=yu@NdN!< diff --git a/honeybee_grasshopper_energy/json/HB_Color_Rooms.json b/honeybee_grasshopper_energy/json/HB_Color_Rooms.json index a2bac7b7..6c51fa8d 100644 --- a/honeybee_grasshopper_energy/json/HB_Color_Rooms.json +++ b/honeybee_grasshopper_energy/json/HB_Color_Rooms.json @@ -1,5 +1,5 @@ { - "version": "1.8.0", + "version": "1.8.1", "nickname": "ColorRooms", "outputs": [ [ @@ -113,7 +113,7 @@ } ], "subcategory": "6 :: Result", - "code": "\n\ntry:\n from honeybee.model import Model\n from honeybee.room import Room\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.colorobj import ColorRoom\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.togeometry import to_point3d\n from ladybug_{{cad}}.fromgeometry import from_face3ds_to_colored_mesh, \\\n from_polyface3d_to_wireframe\n from ladybug_{{cad}}.text import text_objects\n from ladybug_{{cad}}.fromobjects import legend_objects\n from ladybug_{{cad}}.color import color_to_color\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs\n from ladybug_{{cad}}.config import units_abbreviation\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef split_solar_enclosure_data(data_to_split, rooms):\n \"\"\"Split solar enclosure data according to exterior aperture area.\"\"\"\n # figure out the ratios of exterior aperture area in each room\n enclosures = Room.group_by_air_boundary_adjacency(rooms)\n encl_ratios = {}\n for encl in enclosures:\n if len(encl) != 1:\n ap_areas = [rm.exterior_aperture_area for rm in encl]\n total_a = sum(ap_areas)\n if total_a != 0:\n rat_dict = {rm.identifier: ap / total_a\n for rm, ap in zip(encl, ap_areas)}\n else:\n rat_dict = {rm.identifier: 0 for rm in encl}\n encl_ratios[encl[0].identifier] = rat_dict\n encl_ratios = [x for _, x in sorted(zip(encl_ratios.keys(), encl_ratios.values()))]\n\n # create the list of split data collections\n split_data, enc_count = [], 0\n for dat in data_to_split:\n if 'Solar Enclosure' in dat.header.metadata['Zone']:\n rm_ratios = encl_ratios[enc_count]\n for rm_id, rm_rat in rm_ratios.items():\n new_data = dat.duplicate()\n new_data.header.metadata['Zone'] = rm_id.upper()\n new_data.values = [val * rm_rat for val in dat.values]\n split_data.append(new_data)\n enc_count += 1\n else:\n split_data.append(dat)\n return split_data\n\n\nif all_required_inputs(ghenv.Component):\n # extract any rooms from input Models\n rooms = []\n for hb_obj in _rooms_model:\n if isinstance(hb_obj, Model):\n rooms.extend(hb_obj.rooms)\n else:\n rooms.append(hb_obj)\n\n # apply analysis period to the data if connected\n if period_ is not None:\n _data = [coll.filter_by_analysis_period(period_) for coll in _data]\n\n # set default norm_by_floor value\n norm_by_flr_ = True if norm_by_flr_ is None else norm_by_flr_\n\n # sense if the conneccted data is for a solar enclosure and split the data if so\n space_based = False\n zone_solar = 'Zone Windows Total Transmitted Solar Radiation Energy'\n if 'type' in _data[0].header.metadata and _data[0].header.metadata['type'] == zone_solar:\n space_based = True\n if isinstance(_rooms_model[0], Model):\n _data = split_solar_enclosure_data(_data, rooms)\n\n # create the ColorRoom visualization object and output geometry\n color_obj = ColorRoom(_data, rooms, legend_par_, sim_step_, norm_by_flr_,\n units_abbreviation(), space_based=space_based)\n graphic = color_obj.graphic_container\n mesh = [from_face3ds_to_colored_mesh(flrs, col) for flrs, col in\n zip(color_obj.matched_floor_faces, graphic.value_colors)]\n wire_frame = []\n for room in rooms:\n wire_frame.extend(from_polyface3d_to_wireframe(room.geometry))\n legend = legend_objects(graphic.legend)\n title = text_objects(color_obj.title_text, graphic.lower_title_location,\n graphic.legend_parameters.text_height,\n graphic.legend_parameters.font)\n rooms = color_obj.matched_rooms\n colors = [color_to_color(col, 125) for col in graphic.value_colors]\n values = graphic.values\n vis_set = color_obj\n", + "code": "\n\ntry:\n from honeybee.model import Model\n from honeybee.room import Room\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.colorobj import ColorRoom\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.togeometry import to_point3d\n from ladybug_{{cad}}.fromgeometry import from_face3ds_to_colored_mesh, \\\n from_polyface3d_to_wireframe\n from ladybug_{{cad}}.text import text_objects\n from ladybug_{{cad}}.fromobjects import legend_objects\n from ladybug_{{cad}}.color import color_to_color\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs\n from ladybug_{{cad}}.config import units_abbreviation\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef split_solar_enclosure_data(data_to_split, rooms):\n \"\"\"Split solar enclosure data according to exterior aperture area.\"\"\"\n # figure out the ratios of exterior aperture area in each room\n enclosures = Room.group_by_air_boundary_adjacency(rooms)\n encl_ratios = {}\n for encl in enclosures:\n if len(encl) != 1:\n ap_areas = [rm.exterior_aperture_area for rm in encl]\n total_a = sum(ap_areas)\n if total_a != 0:\n rat_dict = {rm.identifier: ap / total_a\n for rm, ap in zip(encl, ap_areas)}\n else:\n rat_dict = {rm.identifier: 0 for rm in encl}\n encl_ratios[encl[0].identifier] = rat_dict\n encl_ratios = [x for _, x in sorted(zip(encl_ratios.keys(), encl_ratios.values()))]\n\n # create the list of split data collections\n split_data, enc_count = [], 0\n for dat in data_to_split:\n if 'Solar Enclosure' in dat.header.metadata['Zone']:\n rm_ratios = encl_ratios[enc_count]\n for rm_id, rm_rat in rm_ratios.items():\n new_data = dat.duplicate()\n new_data.header.metadata['Zone'] = rm_id.upper()\n new_data.values = [val * rm_rat for val in dat.values]\n split_data.append(new_data)\n enc_count += 1\n else:\n split_data.append(dat)\n return split_data\n\n\nif all_required_inputs(ghenv.Component):\n # extract any rooms from input Models\n rooms = []\n for hb_obj in _rooms_model:\n if isinstance(hb_obj, Model):\n rooms.extend(hb_obj.rooms)\n else:\n rooms.append(hb_obj)\n\n # apply analysis period to the data if connected\n if period_ is not None:\n _data = [coll.filter_by_analysis_period(period_) for coll in _data]\n\n # set default norm_by_floor value\n norm_by_flr_ = True if norm_by_flr_ is None else norm_by_flr_\n\n # sense if the conneccted data is for a solar enclosure and split the data if so\n space_based = False\n zone_solar = 'Windows Total Transmitted Solar Radiation Energy'\n if 'type' in _data[0].header.metadata and zone_solar in _data[0].header.metadata['type']:\n space_based = True\n if isinstance(_rooms_model[0], Model):\n _data = split_solar_enclosure_data(_data, rooms)\n\n # create the ColorRoom visualization object and output geometry\n color_obj = ColorRoom(_data, rooms, legend_par_, sim_step_, norm_by_flr_,\n units_abbreviation(), space_based=space_based)\n graphic = color_obj.graphic_container\n mesh = [from_face3ds_to_colored_mesh(flrs, col) for flrs, col in\n zip(color_obj.matched_floor_faces, graphic.value_colors)]\n wire_frame = []\n for room in rooms:\n wire_frame.extend(from_polyface3d_to_wireframe(room.geometry))\n legend = legend_objects(graphic.legend)\n title = text_objects(color_obj.title_text, graphic.lower_title_location,\n graphic.legend_parameters.text_height,\n graphic.legend_parameters.font)\n rooms = color_obj.matched_rooms\n colors = [color_to_color(col, 125) for col in graphic.value_colors]\n values = graphic.values\n vis_set = color_obj\n", "category": "HB-Energy", "name": "HB Color Rooms", "description": "Visualize Room-level energy simulation results as colored Room geometry.\n-" diff --git a/honeybee_grasshopper_energy/src/HB Color Rooms.py b/honeybee_grasshopper_energy/src/HB Color Rooms.py index 1a1641f3..a04fb2dc 100644 --- a/honeybee_grasshopper_energy/src/HB Color Rooms.py +++ b/honeybee_grasshopper_energy/src/HB Color Rooms.py @@ -62,7 +62,7 @@ ghenv.Component.Name = "HB Color Rooms" ghenv.Component.NickName = 'ColorRooms' -ghenv.Component.Message = '1.8.0' +ghenv.Component.Message = '1.8.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '6 :: Result' ghenv.Component.AdditionalHelpFromDocStrings = '2' @@ -143,8 +143,8 @@ def split_solar_enclosure_data(data_to_split, rooms): # sense if the conneccted data is for a solar enclosure and split the data if so space_based = False - zone_solar = 'Zone Windows Total Transmitted Solar Radiation Energy' - if 'type' in _data[0].header.metadata and _data[0].header.metadata['type'] == zone_solar: + zone_solar = 'Windows Total Transmitted Solar Radiation Energy' + if 'type' in _data[0].header.metadata and zone_solar in _data[0].header.metadata['type']: space_based = True if isinstance(_rooms_model[0], Model): _data = split_solar_enclosure_data(_data, rooms) diff --git a/honeybee_grasshopper_energy/user_objects/HB Color Rooms.ghuser b/honeybee_grasshopper_energy/user_objects/HB Color Rooms.ghuser index 4421e3e7d8d87140e0675caafa404f64ae0108da..930fe66879285690fdd16235f6a3fc6a0b15dc8b 100644 GIT binary patch literal 7195 zcmV+$9OUC&d1Xu-P_s5(Y;o7c-Q9It+@VM*x-5&s;#!Kk`vS$?-Jv+NxRl}rinh2z z`P%p9&3AK8GG{V!=9&5P+t{u@;_fWka1 z9H72nppLV%BbNi%6YKy4|0f>^gF1RRSo})|x`AOH4(>3Z1q^8A?BMJMw*F5(5CV2~ z1iQQWa04*8&_UiV&M*%*@W0~7e~Y916J@LaK_mKW`2Y1pX=%IxU{d@82Pi8k>ipGY z{{$WF@4e+Eb@x{x!gSuqBh*e&9sa8TkyDrZJ7@ydlLhL(fn1b~UeodR2O@ncw6nvh_cnC`O}`pXJXcq^*FD(;Q5g#thD>Pv%Q1oxT3;99 zY1?xkV)1>GKPOP{AwtIs;KM_KmeXyeRi1|nrJA6q$5JS%A%y7LCkg6ZT|Q3#Hjt%^ zy4cEiN5fV|QZ-q|d;Fcs*00Dtw29-g+dnUmFkgue<+ z4wAnB6NwU(2Fa2z3~YEtzgTw4Hr9j-Dp4HpUeDMIru^a7oEtgWGa~@{&^RYMta_!= zN!-q;uBbj*1ZqgIG67=qNvd#0mlv~1Re~=NUwT7!fuT^Ly|%J=MmJGr2oEusZk(@M zRP~VKJC(uW4#yXIs;CUaacmrtjDnHl6t1+#G9?55`^VWg7Y-+!^kS>`dNbJsZGPo^ z*1!^|p@|^Pz6wV@OLqU-r}!KsME8aoDJnT*{XUBqNX2Wk{R@mZ4Hq8Ag2M&V5-91C z>)BzlTmQs2jyl{>t)J&x#`(0A-p-#G0jUPxi#JDh_PYYf zj1pX_GNlA!`ui*r)ZYpz$+nNISFJx14p*GOqKs_MeYIG5Y#C8OSQF_=x&Ama2Pmqx zg!;M(62?+g@MR3hjxp;J(SloH?za5G!}B*|B2dUAVggZX>1Tm`j7*N(0o&if>3M8^ zJf{gn>0Th|Q_o$Z+*`)7XA--EA0HAdnop;Fn{g*jMhjwjBFa91a-CT9J-!h6-KS-=C?-aEM*i}0ik2~fC{*p6o0%jnj~Ch8Nt#3b6w^ip}wCv>eR z;-}fbs<9@x`uP^-cxv;OD=g#W_0|$|JEj#wbwlpRL;8yAtO8EiOL3nkVr+?X|A8n{ zQ46WDE7}9H#HXh6j!N2*0G>e^D`~xid&1G`vRRQ^mCwk9l6%+(`$%nE3hf>|-QyL! zCZ2MAk05WB#eo9xK5)Kg^yG&iN+0Q*^|iMd_#qN`!43?oyH%9QIBz+YQ@S}W`V`W_ zgW?OH5O0QSsP(-%{?QJCGDt(QR^I$0wz3n<-NMNV{Kf-n{a*%6#bgr3ro+*wH)>)X zbI{I5(Xem?|Cb+el;nX5{|N6tbO%G%fLhuA?>GY5|7YlbP!JLXghdk!f5OEjO(SFU zX7mSbqoD%g9CM0Rc4HbP(obPdtqybYnanBH*8GGv%v^}6`ggL3Y&lqs4AL%E_@OMH ze(0je4FN(mT|tP%C<`oF8y&Y(i~`Epm|TAX%>w(H$9wkk{HE^nVZS>>ykZp?UvqK> zMK(;n-6nSCC8Ox?f~IeoyZO}Nwow%9g*~QJPz6Jt_OMelz*->q^zcQhE?z~TKPm@i zcf>Y0yNKUA`%<-9F$;}oFKZ`me8F7AAJ#~vFc8GUHIcf7eb$JCNSA{*%7Ui z(M_q>p^lLe)Z<*b3fS4{V%@z^f}5Npf7+`;nTGgKdQwPVGZWJ=Wkh3g!q0E#*!rC4d3x~`=AxJt+ZVb7$LEM*9A}@pc6Y3!3Ylhd z2^H&+3d`QbZdq8*I)kuvcjAb;`4ux#HKYqOzRFDsA|+WdVWU07x4Uei^_%Db*k);-XxQ zD*S^p*5NW7yfa8}L&uOT_SEkui5+M#$3wLc={G{5239;a{8haWdZ&6HppFE=mZ7@G)y{d%!$!7e+(Qk&CM>$SAw?ox&f6huM_T8~C2CVu?B zF&r4FNY}l^v+y)%Eo@%M|H&BHkC}bRC)ek;eZ`DyERCTTs!gMXTw*a$u}_)^wDkER3|@DnP-fU3cm(xZ_PcLs zcpS1chWu6oC5c$>LPdQ9Aw#p1O1jAz4NV$`Z}1>BOP%E)g5*1T8X~0ZJSc)(tQ+D` z1u9H`-W$PAXnZF%jFo;Twlq~t`785wVyHMnqct8aqqrI#POD{5aWe&JlHuX@Qh$ix zeE$wu(ZB`hf>b40LxNMR8TJ1A@t$FFoNX#0JUcdWnGc|g^J$M-n3YdnYkH6x)Qo;i zj$}H{Z`*-%XNo-=lGaT{o$Q)=-=>{s%ud7ni-d&BPpHT z|DcOoBC#0%gGmX)In|6l53x3U;?-p1`|>J0U3CLIe|~=43x%kP{%g(hlyL9XaC6E<(usp$quHMH*^8DzhfO<*(?(ttYf>J+mL(BZg@0Ax<;NetAu22X`uC38bMr4U?T@T7c4J za-sGsHs(3jXcPDBWP0^7I6D{Q0GaBXT5R(g*Ii}BPiMYD0m1~pFI)4EfUj93EAQg{xA z#4TrX;n9XE6^Eh+j-4xp?V^5&<3_I3QY0wN9g9#B4bOb zw4k3oS%;i~T1?Gbhu2 z{L6w`Bn2eP?dk~}=8Xe40sk-|)jdb9zyH#WZ}UwbDMO3VL$^*bT~&AwOG62ND&Q4f zqaSn{owj(YVib)bk(nYf5(CG_)qX{IA>fOq-A%L<-)bEmCaxtFfq+vkqK1v-yS(r= znG^0tRKF-rq8_VxkP#^=0oIbmv_4@E22SVs$a| zzQ0a(uZ$fqLpoXz9Vt=Xo=__9bD&=s=j2Cvzfq_@E@6}*J~!IbXk9cpsZH})tSGP> zBmx2S5;(i_YLu^u8MG=Ry=tKwToseMkn;&4fe>;h4bWr`$uD6v(W4bN5iF=}C+V3p zR+QOxQKxghtL%Rbg~uKl%pj>TGf*_+H~$EYG-T2>$6Me`Ou^E^#|};~rpEgo*1GB>5rHzHq2;wu8Lef0$ zely)A`7GS70Ky{yU1~qw^|@pxw6bTtcrq> z9n96)6<|uiTi7$fM5YSGKn;dfDo)OcPt;1E#kJ@Tt;zYQLyJ4h2M1r-nJH>vQ6PSf zhx8c2RAtpK2OrL{PbTZs(`)HQ(7|M(6+{8tzr=L}{26)meBOL)ai{v})TFgDCYFXC z7ObqVP|#F3$d*pEwOQ!!Ln4UZFo5;=_1-5q>j#T% z!bKxuiVE#uO|g2xP&;eUe4v`aH?u(kOC7PCL4WOmGj8-Jb2F4O+uq$aTMC$o+_-8JRm^oFDs< zWRDRfD zMR(G>?ve+G#1a{35H29)@Y02`MvrgE(RAK(ekYVtJyTjPyd+m`zLxC1P@K#giSH50 zPdf;kTRyh=1vHRVteUgYZGDW@5#5=WjI6aaK_x`TsFWp)s_lP^V8$bEToR(o9-+$k znHNS@Iwq$hk@cFN!-(74k~H~2agQh%?hO+Ep$ju=&c&`}s$mbe88)0iG(Ao1iBu*| z733JYL&vdgd8CdTXBV({*A7Ybt6cC&aQ{t#LSHyqNvS+cS!rFll6Jtk;w1O~)_kUWG4!)Sob}4f{ zNolV<;@&Nfr6uKC@H)VkPx#l#)@{yyO0tq;V>lOheR;`5(?HA4fi(%B?PH6dDYJP^ zCf+naf+R&JR*ubjglU`p3_1JVlnv%FWibV$p#AI%JpY=dx%u7tDpTS$lhp2^V5gNs z1$3b@h#QL6RH=HhFw`27ef6&S&suC3X}a)4P`9H-p2hb>zRP(uGtr>K5CMh9)|~6( zD5i|6K!24=X`i1JG)$YOj?acwA)8#{F6Z(OX>bo2oE5&l&fRu+V^jV1sE;X5exJ*{ zX4U>Po|WX6c8cx??U9PbRZ<)ke`g4J-%S~oqd$|^w9klW;Q5-u6tzG#?ESav*_&l` zEVtkOmP<>xmwT_^HEuSzhN?X4tF|vqkE2e3KemvZLd1G2gM4qMxUk@~f%mySLpWVZ>#`5Acrpv#g(C)iB2Pv0i ztAqdIMqS=hXZ2<8hF7=W4c8=$r|Z{>!p{<6)u-=|zK>L8Uc=cpbq1P}#@zurX*-*$ zp6h{o@wgje?Uy)j>zI(=V2gS173>%J*w6hC5%hC7St2#Q&R#zn_k?b6+VS@-X7sQ_ z1}pL)wXHAKn;5mz6LIQ6?{o8o9iJY$f;!iP3#JqC`36_j?zjUd)E{Yn>)xD9-mC^j znLVwgs^{i+X#H)%cl5&QSgj{7|3{|yOJrtef7HC+3#v} z&K8f7>Ja5(2Lj zFo_NdblYkR$q)E>jOmML+UqiiH2tv@mQiiw+qn2sp)AmB#cP4C&DHZbtm1OME#IiE z0eXyUwOmKV6f2duL!IU=88kSt&4k-6aUAo~0|pI1DBJqxtTiHrqK4n(#Xq}2RVKB& z2y#O@9Xia##0O-cUpeYFud9MgE;?z`Jv&Y(TIv0!+oQgUtY!o?o#W5{+)Ig>v~-}R zS#4;teLhSxjaR$TXn)bU6bXM>D)5o3(x!Aa^KswEBi+p9d*^L=lfB&dI7ay1G|2Z# zs!wWv-6X%2b`~EmS^zREL+TXlCfxgts1MzzyH~UTgs<&ecnu% zTTS59ld*9)W79V%X#Dfy;!AA4-q}sgupf)Kv4hyt`(=ES+|k}MfO>%7tiaaL?Ud`t z#Uc;fUSj`t;p=8KTr9bdKVU)lFT#u2@_Vium$EWIO}5)_#bXmL$2T4V@H(2-A0Z`N z(#q9&;FqhjBnb1`t^OC}N%kKbo028&d>-ER@2=aR^Qvt<_umgSf{OiHA;03+zg&c_ zJhEuo?Vrv&?Vnp*epfs0aKOy)KUoF*sw4>a_*0Fk)*@j)8>ny7 zMc%vN7z<>BT`ky%8ttionopLBSxROowydbjTi66i0Pl}Ai_mqui|A=kr| zG-fOB5Xsq0srVHzi+vW)aN`Oj8N(#pe-V3Diuih;5FoUDCp%iGZx^J-^$f5(bT(8C zDl&ecT%OsCt(Fw;!80YCqtUD0n&o*&?e^o~4nR?-muUqg1YvX{e!XMkeqh~M3%03}=0dN4j<6|QHXSgMm%G$ay z*fB6qY4r^HSh*3e{9C4F zoJm?+DL*M$p}p7`m)B|`+YYal z<|O%;S9yKx)0t5$kN8k(M;5jX%mUVSs~&&#bgqAkIf$fQy79C90#6BB-MlYQ-@K-N z*CK8S`(>e&DRboaV%D)&Tkdr4Tw_8nJ#u_L-~*^T^|h8VjjB$tPrP=yZji2(Sehpu zjpS<>eVClMp)Ivmr)@H**SvO^dF;Ds=3IO6=vm%+3HLpJiD8SA3AkU}#I*5ojHwb3 zm-6QN69lY$397z+312>b$rmY~yq@*#;y0#URy;nov+Xf`6?ZT(x|yFO`o2B0$7br( zwKQ0h@%UW_bPHSbOM;MTP!}POnq(?$x5x}lI&H?T+RsksrbYDpyj<_C4<{E&Un9qDDl2$B{{-q`Ved+h`g9wu)e}=Hf11u&v%%MLASF{uQ(M10+H$?6 ze;vuYCRnf~27SSOP8ZyClA85WL#D=#n+dfbOI)J-*nd-welkZl^N9q7zwVfz_xFzg z#TXyjgpN)gt_qj!_|*rvU8`~521SSremJeH-Gfu)^^Ic7#{1lBiY3dQyyg2yImHyf zbMr&g+f0w=JehjWiytkzFC_v-oZF-{M=Fm1zQy43Qt@g5{UT$vv?tQM!bn?^KMNUc zn_hcueI13&Yp$`p`bn}_|63P@dzf+3+Zljm0EJ7>xP9b#8Ujg{U&K|mX42-QAt`iwv zxJS(N^*Puxrg4u#pUcUeKNUAw>U_yAnUk2h8qT;nj98;W*Od9&Y4D-DUgp%1d2|(O zX;I1~#;##&)WN{XEiWHZ{ZGj>M7FgWf-QC^YDN-m7ZE5l1?!}$r z#lH63IrH7QnaP_;@+6tOKb}9q)N+A4tD0EDOeZPY@S zP@thyDn;+*evmoz2S~wO;T8_gUjMDZfJm~**u$MIys)IY?_W#W)YFoLu z!ECL(;UEnM2Rk-fxI5ey1pf~nPb{c)Yv&YY<&DZ2&fl0lRZLbPm>c%fI94?mB! z#ot8z-pF`NKFD%;-aF3X(cF00-%sax_<7#`R+q;-jAPk97 zt&_^G>gI%yXt^?2?jXuY-iT9k;&_T}4Hzd`R!F+LCB=MleFv;}X7Egpn7ntvFx2WN zN802f(0y#Mgm>w(Bnh@McGauwFff|8^k?!KMt^*8PY%H^N=seN_f8(%%-k|y9)3sn zDhNtqdg$mY#^hD>WS{>_wjBz3*ig}J*~rQ zT!Ap9QeK=ItQe=(T0-Gy!pt|kj#8jN`&KvUVo1%Q!0`+D?C^%IXi+1^X^Ap#h<7#L z$s-xAsFoh$ds3eroFM#RKT(6c22+YNob>XbCgz+geX2NEN5OIhlW=8_S#Xq@1#aA2 z)7Rxj?pVh%ZpXJt-;IlrN?6^)?NT1edbV!{yQy18-f=12n632md=681Hko@!Gh;mF zoxF&m{3(CGSOMQ5KX+*jBo>z8`F-icoBxeehB25kE4??gA5q8m1-Sc>((FAjH zUD8iT@^OpCX{N$9G%sh%9hL$!Nv%n-OTmcGD9zm?Y@Rs0EfP1Ju*8feNo7kCYCo=M z#2}eOt1dEha2kU+8Uk08Yl_}$s{e>uizF^onQv_W2#BKu`f4m>qpjyM5*YRX%@sLX zu2>g+yaGx;cCq~SYNM^#&*cz&YEv^6K=;LNHZAzo=+D$#5U62*Xha#)(XCc}RK&3m z=;$N%fZg~0h7wza(6EuJXffey-H-714vEpFpQS}zeLhtm8S~$QR=g%Cja#}+@%VKp z0~@#5JTci&&fbqaL>RXOV48xlIN$|xVl5Au$8WONQB`@ty=FiwjmIyeBbuot&s8`9 zD&P7w27S%&TBe3L^;*rB*W9$(!hm*i8@uM7m?kB)7i4j_Y|X!lB0ktZg&MXY>~5`c z3gdmXJqpoI4!YPNdCf{@$c1qEtW)?i7jG8$9A!E;wUFZ@xQVEq?~Xp&9HgHPnrcOV z-sTO}Z|nbjM1RLP|Fx{67hZrHJrWr3#!K`~_liyeX^236kS*=exRW-f4SuZIMs3^v%NA-Qndk=myB zmSFQFXkgkvUZ;7Fk55$yMU=_c*<|*$Fn3Q`rLzk|3+UzOHCi&;9nEqXf63*sU}%mq zrITf?>&j>x%GgXJe)Z}V@)S*D!S? zRMco78tKg3Gi$e!Jb%}hkVQS5050>r^c&Q=1*=E!eSFbIZv+Wk!ST*3D+q}|7bQW} zERQ{ldm$G3GWy(>T}iWaT5}~-H5uF|Zw?~k@B|OhdkPBg6xX~~Ftf$hA6NiqH}!jd z({bmTiA?5##((XPMB)qHBqbk!{*?!l*}gbWYiiPX76PUsggt=z-o$0 zejVO1O+S)f8ykCgXx*H0n~ge|)t_{s@g1K|AZ+bxDnB#&l`@s_xDxQ2YkWFsl4D|E z*mk4pYyuuNWpZj}YG!hBa_Zakv@YHsDyEg{!5b=jnatrOiDW8N^o{l$iOooO9g2o3 z=}dY^tAY|JEFkaUA%MLsiJ$p5&UfIXV4e8=)TTkXtEMHZELo6qZD_yvIsp)O1;JCX znwoxTEKy}~52ghD6!WRQ&zxLNiyP5@ey zYUbip;n89}Z;H9peMDC7i<;$sU8T?vD}7b<3<|vbDDqz8=TGWjdE+Uy2YJo6!-1O~ zTrCt6NHvqvIzYCN0D0&VieoJAJ1GfX^^IG?*Q70oOv+HbcGYB353*~W?~J5l8)w*` zk^dBDD}0L2Ps>T~&mJ82)Z2&_wHZUbkyd8Klveo0KU*02rq(_Zircph)+4qeM`j-= zz`zDM7nZ$NSJb1s<_@ZT&x%yeoTEicJeRQbdJUtT)}N+|XAzYFpc=_QSly@G(2&ju zLb)vBrQU!_A2Xcis{R~f;11-}Dw75%qm__{+DRmq$e?9+iOh-5M(pH~Ow`%{X z#Z_rBS8q==e0@#;LU$tlh=VK{{S43)!G2%l^p^KTLi-Z-i98pfxbLxrO#Cg4t{j3H zv7B{+7lCwUUfLKF8%~8F2F=Il-7clRhTON^LxJf!NUvb2Z)U`;-aGE! z-_rv!Kfuh(6%ywb++QPa*)t({2AO~okU+Mk$6vtP5ou{3kr%q?4*PJ#72Z%|OY*;G zE~XjNn#Pwc1m7h>geBBN`ALXms7hadmq1p~ow1x8u>^%f+9aXgwQqS*@Jw*bVP08I zNUdm$?)2X<6VcO0i5aEFcrRo^Ga+~mFJaZ>gxf!b#>4=k!Eu_=2H$tQ%FeLl6j}ub0f6q4xfm98nU&9nW2WN*a)w9EdT%BzqIx<*xgRl(488c1Q~ zmJIzePVWgyt|E@nNtT%4PO37=vX0~S4rf*PT8VoJOcHwfXr{0`xi70xqb;y@RBtAo z97ejdi^pFZt#=2K3acBMaV0Loptd9hk z0uQXEWi{O^d11oD+XDENgnBQ*n(^7gauNi{SVXp<*WFT9Tma=2uuOaP$u*${$RyDQ z3{I?Vh!%le7S$t3A(?EB4&yR_Cl5^Sn44vG?ARsVMA;r6r1zmw(_>TLbxP)vKsv07 zLI?0eE#Dz^`0omjW?4}alLStJ#WfI0VbD7UM#-P< z&hjfYxS~CYE|1yt9M~%q7w=@P@tK?OkfR3R#vKzIn9){VzD-f9NpY~FtJ^e{md1p) znM*+GFgdmu*+56XM2ZeQC1=s64+>dI+_cLDc@=d@#55yj3>xDpna~`CsuLhj=?Yqx zpF@Vll4mqq#?TZ=*tLvHc(r8RSS%44QV4LC0NGBG(zP03PJlJZ;1FshAiPhGZ8M^{ zB^t;{AP3yqETGyUBX&hd*|;vOV;zg0Q)oFVleshL1&SoK-D6AV^jX$$+wk*s%Oa|R zyf+UXANk;HsrMh31qwxJ-CX!*ITU;8CMa15ffu#-tL9pyHPzUs^f|6=LPMn+$r!EN z+GKD0(B=xcdC^`0aK$JfNu+eBPGpPL7BF?R6LG@1cuaZpkw{$-U0M+?9z~@efrPRp z3P3pS+IURapD&K@&jt4JNP|-PD999r2fGg%B&uVkGKF1$f~~c-X?mG?}^IHALmIuQ*$>LIG-lob4kbPO+C}}t)5|P4 zTAqQKXTw1}Fmzfbf9==Quv6bo4Q^KXM9vT_PxoDI4amYZB^V!n6)^^7F=dc=I}in* z#YO-uHR2#$h$*oQk2A^dHq#=GTLy>9xv5U2?SbclI%Tgi*t(uKpnGnt zwjK0YyLPcbi8+8}yu{gf0+NUJo%@ zs;g+sdB2p%@Fjd7CJYODaHt@ z#dF7NQiYb9wK88*j8JpAje%H_iIySrC3#p+<;CP&1a%iA5wC-fEB6!Oq^_Dy+ zcWQuX5khkK_?M~28>s_frj5qTI5+LYi$t6zK4&Y?tWD7IaweV)1%OKU4?LZ{znlOko;)?r5anC2lET$-rvXJ&V81jB)X6wyJji|QV zSRH59-PeY4&h%0OZIBxuX|mJ!Ynt{fQV&U~4kRM^J{fTaCKh7yCgEQOpo&e##HSzj zr4C~dVepKShl8CHA63eeVil^f$d^%f#MA{9KtBvO$M0uC=Vsi|fT`xMq)JR!cT(Af zEu~DmHAHydIZE@_=~;%dpky zm%F0dmPG+kO_zEjcf;}Cgh#*GzS`hP?5ZEP+XV8^cs$?0>bkc-+3iYZZ@1QbLG`NO1LWn8 z(N9j=1Vd&6=kDt%zdh@-Q^4VVDGk@c9|F9R%`1U6mFfBLQxj{r*%xWxZ+b>`9CmTUq2KMQLNklsw zXD@*~m&hkzJ*_`2m#^uKMupd|sUMBCOel-V|_Uj9m^`;2cs~$hn zes^~WSU4L~*n1A@EO=_==)F_(c(92O((Pecx}T1cL7($W+4Ov}ZRn5CnHPl~devQp ze2|)Y@E05D;PSur|0R|#*6peFVTCcDR^Wr@&b*x1i`gkzN!RDI@%-MpA=2sTBtO`b z#|iKlEOfCpY<9bKwzp1Fu)b50Z0L73dcVTMcrBiTo*5>#Hfsu7vSN3!FW6dtnQyhb z&NO^gr8@r|$D}}T=4|pdf26~&OIl1)XZ&f8_Ec_3BsG`cSm(?~r~A_H`M8e7+Q)62 zA6n`;fLvB1l%>rW$3AX&Ds*;nZpCr7qJLB3v^v=Z+-qYKzKBsS7Iqgl%kS7NJ3i_a zQtL4N@@5FP>TCO-V&rK*9-ZEnPiLe?Zo|!DtexHKstu{S$@*iFi%`?mdpqSU+D;rE z(+TZ@1F!YyNgogFJkn18%fuJ*93zkV@{y)C#+lWt(Yq;_-KAa}(EQzJZ^boyuRr&A z9jcW3en)o{Vl5-N=br>Nt9mF}*Dsg*q%P6MtJWN^JQR2Psc+}U@^0@GJNelS`M1+w zL?<@TVpRd1=%YP zYpDjQI`rpYZZ(*{{2Eq!%3jOBP_-I!2|R=09XM^@cG{N zCQ5L8_5`bp+~-wsQ_10o*k>s&HU;+Vkkp89#b@c)5%ImVuB(Ot#%p@-D0Lo)kS(^O z1e;i!(hRfuyC&G!uM`GlA|yY9UkTWb#zimTofV~5RtmFTz-`k4c}|r-xAg_D$v+n; zOyW?^EE7bGb)Hz$*?Bk*A3dH*z}FPm^O; zKX|99mX!hwc%CleuG;8X5>z;(=d)YTiCMC4XA^&WsAA_lY>qVR6|mRc5>;l$we{Yr zUA6Liy@+NR3LEMvU>uvmBD_{Q_`-AKOg zljD%Kh1B{z@VUaG#$@Ri%&UUL_ybbR5B>JUt}@;XW+3mQ=tLvA55i4}+PploN6;R^ zASx?|4S9vZc{IN)uxmf9GMQwz>bD1(md|pXX|;=m!-2nLyX#B7ST?VK)E5zyv$}K9 zG@?{q3%B4>FD@M-q)7toppi+o&r86lBVV@OFY`?{J}`=lU*pK_ZeqAhhM%_L6;#0^h%!y0@KGnYcOdSEfuFwoA~-L#YSkjarHA!7qc#a+!n z)&8Lad&HVHZp^~*$}-SR@VD2q$>kQ-OBY3eb;r0EMLQQyK%Q9Hmce+) z4~KdqGPcnk!tGt&u$5X=k{y)3-VkNALaYe2+C}oUj~4D8*{SOs_S>2mMr)VbH>h=2 zMF=%v-I?uz-zqV-w>%@?m5}j`QO)?|h8^pf_xZ>~u4zs9FzeKKxbk?<%gSv~`p})$ zqo3A9guxgB+MgXx81V{jx9*+vJ9=)bal_y8!T@Nc*V!O^Q!C6MccGs#R%k&hH62k6 zoqkkvCT>8g+PmLzxH2p~_ZFuU+BItvx~yF1M6i9t((<$H_h;b@b#e!_z~$I$``+O_ z>@V4)-6uV7Zhpwi9GUowEypS97xL&LZ34*-6(0Dwv zBXZ9le;ph@0-G{`s)nA8&;YVf^zeMNq+J`6RBC0iGI0yy7PB_%FHFlNw7)+>6shp7 z`lYBbP-|Dm&z}bbSVL7s29*UoPPBO$yCYzGWexL()Wlz(@r!tkhyZeY7@N`*p%`O# z*WdR^#88Qn7>(+;tuj7>PVzQ~;}<{8G!1P+Du)Ffl?wa^$ATuVN?MGFGRc*{Y)|&j zRFh^7>-`o{{cPd+Wy$et2kETt5haHqG{F1&!XNgOYks=UGqpF&C-dLJr?Xo&$@6gZ z1x&v-PbPUQfF)HKWOl7e%L~LYV=mJp%ylwWC)gaG;&pK@uq^CnGIoYnvnD92mz