36L9?SCrGxL~UF=1G<{6YgfmNCO?z-wX&*h_O?1Mf1^YLuiQD~ z8pyN}EF$8mzT1n4h(y9PpX=$dUJX?c0d|)BYb*{2mdTs=mngAqydIU-6|XT;9$0f+ z;@=VZReMW*GG9HTTL$G6@5$5idlYI92iRGiW`q%(pn-9~u`)l2q8{8{O#NFQK`zz@fbc`u&u^$)GtN6|+ zv)HG6EYLJHjtRi!zjc55`t?39j>0MtjW9`o$HQy?!-dsf9v8L?w;osk4j~;LAXd*E z38gxG=cigcsTL9%icz-$gqIQFV4(*cr|B56?H-PHrUX(SWF$ItL0AS}zrZQ6mQA18 zhqIt~b7R`hC}hZAPWSEKDhpY*%^5xf5N~F=+c#AGpqOSaHY~Im;vP+Bh;}!^&U#|m zFOL~c%(sZG8XhC|qC;bb>>5?FvA^#!MOIwASx#Lc#0R$I`7`FOr826_-)Z6rA?#Zr z&CBUW*GwcTHx2-7%}-03qBHqc`Q-5AJ7*<}${KO}h%7w4dBQzlmNa=ZRsu7R0xxAw zCFhf P{O_U|R9I`;C%G1(^ #f ze^oH!-Oro$lx@MxKHGc*kv-&^XrY*?OZS#`E@vmI!bT=qRjC2FKTPJR9Vgn3WtXMw z*0(_e&T^~0SmE{~nO-xF&q78PigfT~^!xzsR>3IMKvu5@QY~W%a@t!r3%Fr->!qL* z!Gjih -KWDk1J3;+FXj xWG^G0w2}hn4D2|Yd zN>jNcs}`1UVlP>^T2=CE%m0RDLMEVM>GzNCs&O@ZegJ@bST_* TgX^5*ZI#GQM+qv&XY@2Qk9j%DoQG@8Py|kgRrJ^ zycnOE7lC0xGA9JXIzK3ECNq0(AF*PViaSBSt1Ip$*_AA*ZT*l{QnErvc%bD|7lMp8 zU3%w*;0Jjvw)p)+;x^=Y{BMoBI13KFV!3xYGNYi*9(D{vf7_p_AvaECXj{*pUAfv8 z`Bdq;A!Fc8Qd8l*qayYq6vv~M5A(7VC6&Kv{6#$1-z4=SB$F-Nu|83~T_>4y-7GB# zqt7Cs%!lr)5MbQwNGh16H8eb|G^m~1f*QGU>kDOkXu}zvb}L*ofNVNn@W<>Rk2KjR z_CwhR(Yg6hVaoa!3=fm1ogjp1{5%0z&Q*l8%gt5pUi=cY|8RZu*n3@1i %|*8? zm{uFt=K$4J0bYK}CNIS!BO|eAjGoU!!^;=@+$Dy(-z3gytOf9G4+NZ;FfN5ol0PxRFT1XqZpWW%I5Ii8+`z{br=Bu4nQaOu3Gex^kLqg zm`3_! F`0%^C zx0f6P1LK2q@KYS(Gu*EGPE5LrimM2Do-)4WBNzP&Vg`pRR9WQ(hJfNb_$|hd71!wo zJk~X&z`@@_wRRo%Cj}+wA~lP;COY`|aeHWFB+B9y{@1SunL)}RN!4Kx$=DC2BaLzW z%*8mHP}$ZFcF>?K^JD$l@BGFj0(}V0)2oOW1Q9Qwt=}xj>-X#I%-8#1PS-sQj@DTP z0x{4V2RU9-CfDNdC& |M~3tNMkj|y#bQ9*JZsWy-s?voc$e!_0YnFr!CXK zgLoV!MT+#|4B#VXO{0Gg-s(QsSN`$K#N(pYVd=o~I|a4O+LnS#OGYj)9`Ry(J9-cd zfBo8fV~bA5+&t-MY02y_FT7Ex>2m`Ha0dm;0kHZdRe;}qJ``c0u3oPU@3`mxxJY=t zU&$hGS{=WlG9WFGsyVeIY5xIyobR?>oviYL>#|D@-Gqb;E%|KT3rquMHKy##egW+4 zsc591qQX6slcXH_f_wCINTHzML62T)KR8&h^GjYs+l1R+9X*?6Hf`sa@V0Z^th1o2 zP==(H`%O%vGWi(D6LhhZEc$Hb5zL>LTa@<0Xhc);K9f|OPrgho%b)$}joLXh4+@f4 zZNlKGN!6%dii=W_HQWkXt4eQ>sodGoO;oQ{U69s gT lF1&kwz(@GUix0Sy6>_X~+*Ec(k8c2=uB@$uP_T;p EAFFIXC;$Ke literal 5137 zcmWkyWmr^Q5WaNR65`Szg7DEG-QBfxgT#V_%my`;EbPLkmEJ#Rv z*B|H1xp$s3@0@vO=DFv_=x8Yu;Y0BO03cFTQP2aW4mf0RvB5e1`^j@q%m%=Wy%p@e z>^$Kf-f(v}06=8LkJmb5@DXCKT;EbKXP7~8m)xE``av`(&fWx#TS!d`(ro=SO1fj{ zjl^V-zMY_#(#l0)m7orSRcO@1$P%jE-CDeM$dp7n+L<8Bwjtb~?bxVol+%6Pa4U(F zL|RtW`6j*Y1-`)g6^upP2b^OB=JygZRW%>MVzakcbt)p3ODgp`o%oiBlG9$+^>aGU z4OmveYul~k=cqN)ij~PN(tH}LqX+Ao>k;ykhN3SKF3Ax;oF4Ld4yEg(C+*+tO0?tD zjjb9wr6b<~0OUedK^BI{I?VEiQ5Y?J%jFMkQIMe^6Xw;`RryG*xi;ha&Q?(DgB@(a z4n29C-Az)7PMR4i7sU(BeqOM4hWCvny&v^8r9~rQDenpQK!K8Zl-nb!d0Cm>wYz)v zqr>vOa!bOIEYXbZEHMMWinfdW%g*D@W*U)B%fyGh-DzS#s#>4iX6u6mN)c|h`NdIm zuqVc<23hE6wy7qZLq@9stelkTXPqn %YHLXdR!W;(s$S(c#X%yf}GEw%~tzV|m z^jB*gf92jX!+GXRtwW?-T(W7dfHKmFTedA2&oTn*7e z jVB#bj-2Jt)3zouQ`xJkD?c2(q0?{cG*GK4ic*e%W z)Yd5Y)Wz-yVH5NAxunnF&f0MU!=#ZHK;F`VRzTHNH-L=;bZq~25KiSZ(hIO>4NtQ) zi2)5As8m;C0-%Sv@rj;#71Iicor{2xRG|fo O=nceebbt+(sv7f5?BN;VnZEFzzpZtUXzlE^ol`Fm%ZVt< zyvvp)W@AOyX+mOL;DbSbYvLpG#8$?Y#-9JaT#Neo(w!_=x6pfqc`@*mCL2_09~O}` ze4lt3(@Vak`_{7#E5?*rlc2inLNy;q&5I~7EY&h30}nZ@SZ&o37Gf!Y24tBcT>fqg zkylx@poRL`gGxeMBvumNQd{jlcu-d#v!qf^^)NjXj1rhpHJ^vGAf&sSae}XgwU=&W zB_AI{wXZ>G>{U&+x0bR+dQS1Cnpbz1RY?3RIDF^t#Vj%7s{Qfp5xhj``SHASn4GTh z1R%%S(Cr(#E-P=$u(BjDu*^VTRfT(YnHFE?odtv9z-wyGs$xC+&q_6(l0PgOs%P># zl brGs n(<=wEjjo-xN*4K-EZ=dWYbS4p(Ch;9-)`l?+?>@2v`}ImTo|r)x1MBya&Y zOl2G4>9g?!XV|dyXUbbau4evg$vBt&yY8aXbvz& fmu^07g|gs8t5mE_b?hiEG^!fmKkCFpFLDILDT zV|>$;nl#$gSppg2*l8a>R<*UWYaJL+;eR>Dt1I^W`Jb|HjDeve9d$GoZf$wBt@J)z zf5%pn)jk?7qh|(UXa)fEK-GyOO>nYZIeM__Ci#~l=I^jbM)8}nrDEBuqC;GD7089~ ze@rn1x&0y3*n=DfQ bY1`IPXocmMt< zov%rnYLxozR{^W9YdS)|gOrIJx3_CHf`qmz31Gp#71K;8NN$op-V`)tL1$=!OGT+* zB&`^ZtQ6r=ow}B5W;B5@kOD>T>+0*ts73Jn{WEq#j+oER`2Ri4&(GIj>*BM*ZxOa! z#wydlca6Ng*H*@B>9GC1*ekYC1TI%zquXI6B~;!7Sj54;npEgM77jtMFGX+K>au8@ z8;=HJCqLu~i4kX{rMK&)FIYesQIIz?J1rpoxbx3n<^^z#7cZXR5oSeLtS`%SZ@at- zI@~_!SUJ#c@jVoL*;)$`G;{0te8LJLU7!pC5KUVt7%e=ds1*kxvE^6c+?FJF&;*R( znY`&X @`P+`_ll9MLFqeM=-w?%4&|j`pps=2dvdpwgb+htO>U|` z*Rk^ZL)*7QPRl5Oog*EBzB3)Ez1TJ~vOSs`ibU26VKeLKy>HqIT@K2Q+wv4rYd21% zoB^aPyL0;gb4n{!w5O1}>g7fEcD#;3xnZDY ?rAo`2P6*Y) zi8#iAY^OB+{tn3j{d=Q?a(&$WHO`1E#Tk=c>NW0b bK*K@xFdJBEPF6FzWa?A%AypfG=Y;+C`IkPaH7) zEKc|yzy!iqA+T~Xb`FkS8qVmx HcI>0lP%NIgFYxjg*FFsI^tpZg)a73yBl}t4b7fL@6<+9Cs}BAe%-B(m)Zj6z)MMXa&7%l Z|W^|8J)vn=h;7i@3Y`CPoWDf`}bDZ35-p=jh&Da6cU>6 zO0uTEf 9tlZE$sJXE*!cLP!TSx5QcKYny01b!MYiCO!J7+~&k3^4 zUluj8vNIL^yB4O26U`0@h)LZUcqksFuFP6`(K%O>5N(E7u&P$*>m77y>*;;KeQj)< z{?crm`f4o?C
_kJ)}Ld#loki znKu=n6^ zt=#y*IE~+j})J$zzP4mCtxzK=X6NGJ67bV8GA6$8xCqcHC^S zgs`R(FlQ(pQ360Y!*pRwO@Gd%gWjhi4{@yBY>(lajo{7V^ZHg_fY-(Zx1f;c!^OU` zXKNaREf|(?r6sY;Gx iEzI8E)4rHPf z5Aho#ZFfNCIH&U@uM{ZiAk1neQBN~UEiA5uH3>w~k-b<5bnoS~rheCaMZzd9Kwyd1 z$9vc*d>G}#pD~ciWo8^Ol*+}Mp)vX-T?9=Au7vH$hfkgwx$?a_6vX4bO+=yrQJidf zAe}ciqnMFKnMr6Gw1aMXe@mgW?iR{J$!t4!y)qQgjg> 3FZNTSAGPvRMUEQ$SrdNBvQ<$1pyACRgwOM3A>3rKvqK(tIT!$VzZJ>^ zt2@m@{s3~g*j;mY7m54hV^ic+BZ?>c>p1H{EbmINH8kez?lpZ;qPpL^=Cj|;qlDOf zp?&_sxh#TQu-Zv#U51U7$MH&l0|CX>kO?!^d2LUq#c>A lLyOqN~|%dnUQ1K=(Ip9+vJK3!rQ_L*dt&U244Y0 zoEcpwrXK^WhCh>Prk1sE{O#sY8pevne5SoxqiS*Q_wR{j8-s&;!j;|&XAPO@HPP+C z;W)CZs`g-xau?;i*md`1TR#fNKi^-X1jefUj244*!rXn4ms_B=0jd*m0$5+4Z4N^} zt2&t=VI1R3MmRNfG^n!*$@eXnq+nslZdoEn4X64eBo{LxLzsITY8IP~j5-9JsjD1b z^uct(z>u`O4}hfeKlVUBk}B u&}Is3gD7&ZY@K<0C8?L_PZpczQjH z@0FC5z0}t8DCqNQXjm*rE-!NN%+y<&K7z!a9!^u ZQV8`WmTNKd>aCL9h$-Nyls^dPN ? z$(A?o_g=qZ+P680oCbqu@c_IAHp(_?+q)_!(0*%qwLW(-y=Y#C7=#c5O<%t!zqact z&9WpY#?&&c!u0gL(lJN2XB1 mi#0vX>X5K3^Y3_buLHN3fk7cv|y63 zS@_CH;Wi&4yF`N0HHL+OwxfUl%v9ihz3Sk|Z(oU{H_4g%10sEozzVEwyZMewNd3m9 z?@f)@_6R;t^^pbqainT7=J5{O?bFbJ#yE4nCO4~|qvYEj+OrW<6_rndv~zb`Zgs&? z^mQryAK@1J2dwPhzkfDu23HW68CyFCu$H{L@ECwhPE4e4j$;67>gq|^*^ye=;(jTq z ^r9uqrj93l~ zwKISQWhVUQ(@V}8;4$E(x2Pf-hl7Jt*Wl{|tDe6 G16KZS!29}m2W%iX6 z6<^8iSCnn})m_j)6<0tc>#JeRX)&ufN3;6g^+agRmeZ59lJB-lqef^ayq6KB)F;mg zm?vR5w2{VouOEftbaebhD>ZN)qM)SwYH7P#poj^8IH7U% iVRei3vz5V6ClEY2e}mV}6uVa<&1Q?ip%d z)^Ftpo*c~epvinnpgZX$;IX~EI^CJ74KLN;U`5;z#q+*)06#8-gsEbctbk$s+{pjF z$-qxmK95Ve#wD_y=ZYizFJyFdNF9D=Ml#8x11D8lEJBo#Y;0BeV@Hnq@IQ1L5ho?i ze*j+jm+Jc%FJ^i>Xi(C8>Y6ycziFbT&ed!=IX)E^C%rDbel&M+;ls|(E~E6#Um|!| zd9s`%_#G@$ML<2dg|k!3B$%Mw2jeh+4_^x*Ia8IIFo?b)n8LPQ`l|%o&!S9Rf9eW` zsHmxl%I|2gCz*|looloC1n$4@txU!2qo3cdhsZZO2>%2YPT;Kf+gty_>tEeps-ZYW z%Ned+Pg0gf0$g>tE*J7ltBS6;X$U^=I=fY|i=3aG%IfQrmzQ%S<+>}lx^e|vU)9|F ztA?trEp$?4U4R);?$gDLcsAr-8(?qGO63}P^X1~!VPM%Pp1k;%sbPqDzqXAt8p60y zC4b)y44Z*LiqlKysQP*VFf+&IriOp)oN3J|vF|le*xLBB)OU<=Vdxq ={^k=AzE`3UPHsM5(xcfy@gay#3j-yeI#tr52fP59N)Ab8P++LCTa)OLFdG z(9Xr5p6|*3P(Lzz(8mgkl+>hKh0bOc&toKVT!)MHn{K$)$24%wzrkT|FYfdyWsMp! iWpO!72>olc`+$bv``L)+uJG?yAE2tJrBEej{pNphCc@PK diff --git a/shiptest.dme b/shiptest.dme index 0c6c3c3f9e83..04ae78d03737 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2592,6 +2592,7 @@ #include "code\modules\language\language.dm" #include "code\modules\language\language_holder.dm" #include "code\modules\language\language_menu.dm" +#include "code\modules\language\league_kalixcian.dm" #include "code\modules\language\machine.dm" #include "code\modules\language\moffic.dm" #include "code\modules\language\monkey.dm" From 9b259b02839558df6eb542a839a775d0199dcb08 Mon Sep 17 00:00:00 2001 From: Sarah C <93578146+SapphicOverload@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:52:29 -0500 Subject: [PATCH 02/55] Returns Zohilan as a selectable language (#5912) ## About The Pull Request Zohilan can be selected as a language in character settings once again. ## Why It's Good For The Game Zohil still exists as a place that characters can be from, it didn't make sense to remove the language as an option in the first place. ## Changelog :cl: add: Returns Zohilan as a selectable language spellcheck: Zohilan /:cl: --- code/modules/language/league_kalixcian.dm | 4 ++-- code/modules/language/zohilan.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/language/league_kalixcian.dm b/code/modules/language/league_kalixcian.dm index bd59e744175e..60bc4996c760 100644 --- a/code/modules/language/league_kalixcian.dm +++ b/code/modules/language/league_kalixcian.dm @@ -1,6 +1,6 @@ /datum/language/league_kalixcian - name = "League Zohilian" - desc = "A variation of Zohilian spoken in the former colonies of the URFZ, primarily in the Maxin system, emerging after around a century of drift." + name = "League Zohilan" + desc = "A variation of Zohilan spoken in the former colonies of the URFZ, primarily in the Maxin system, emerging after around a century of drift." speech_verb = "hisses" ask_verb = "questions" exclaim_verb = "bellows" diff --git a/code/modules/language/zohilan.dm b/code/modules/language/zohilan.dm index e1d54a559698..e2abde0f2e47 100644 --- a/code/modules/language/zohilan.dm +++ b/code/modules/language/zohilan.dm @@ -6,7 +6,7 @@ exclaim_verb = "roars" sing_verb = "sings" key = "z" - flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | NO_HISS + flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | ROUNDSTART_LANGUAGE | NO_HISS space_chance = 12 sentence_chance = 0 between_word_sentence_chance = 10 From cb2f80ab7ea6dabd8616df71b20ac276e51104f7 Mon Sep 17 00:00:00 2001 From: Sarah C <93578146+SapphicOverload@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:52:48 -0500 Subject: [PATCH 03/55] Fixes cloak discount (#5914) `0.3` -> `30` :cl: fix: Fixed Gorlex Hardliners receiving a 0.3% discount on cloaking devices instead of 30% /:cl: --- code/modules/cargo/packs/ship_hardware.dm | 95 +++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 code/modules/cargo/packs/ship_hardware.dm diff --git a/code/modules/cargo/packs/ship_hardware.dm b/code/modules/cargo/packs/ship_hardware.dm new file mode 100644 index 000000000000..421fc07f97b8 --- /dev/null +++ b/code/modules/cargo/packs/ship_hardware.dm @@ -0,0 +1,95 @@ +/* [CELADON-DELETE] - Убираем инициализацию офовских предметов. + Разносим ресурсы по разным фракциям: "mod_celadon\outpost_console\code\supply_pack" + +/datum/supply_pack/ship_hardware + category = "Ship Hardware" + crate_type = /obj/structure/closet/crate/engineering + +/* + Miscellaneous +*/ + +/datum/supply_pack/ship_hardware/gravgen + name = "Ship-Portable Gravity Generator Crate" + desc = "For those tired of their tools floating away from them. Contains a single gravity generator." + cost = 2000 + contains = list(/obj/machinery/power/ship_gravity/unanchored) + crate_name = "gravity generator crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + no_bundle = TRUE + +/datum/supply_pack/ship_hardware/breach_shield_gen + name = "Anti-breach Shield Projector Crate" + desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains one shield projector." + cost = 1250 + contains = list(/obj/machinery/shieldgen) + crate_name = "anti-breach shield projector crate" + crate_type = /obj/structure/closet/crate/secure/plasma + no_bundle = TRUE + +/datum/supply_pack/ship_hardware/holofield_generator + name = "Holofield Generator Crate" + desc = "Contains the electronics you need to set up a new (or replacement) holofield! Buttons not included." + cost = 1000 + contains = list(/obj/item/circuitboard/machine/shieldwallgen/atmos, + /obj/item/circuitboard/machine/shieldwallgen/atmos) + crate_name = "holofield generator crate" + crate_type = /obj/structure/closet/crate/engineering + +/* + Thrusters +*/ + +/datum/supply_pack/ship_hardware/ion_thruster + name = "Ion Thruster Crate" + desc = "A crate containing an ion thruster and its precharger's electronics. For when you need a little extra thrust." + cost = 1500 + contains = list(/obj/item/circuitboard/machine/shuttle/smes, + /obj/item/circuitboard/machine/shuttle/engine/electric) + crate_name = "ion thruster crate" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/ship_hardware/plasma_thruster + name = "Plasma Thruster Crate" + desc = "A crate containing a plasma thruster and its heater's electronics. For when you need a lot of extra thrust." + cost = 1500 + contains = list(/obj/item/circuitboard/machine/shuttle/heater, + /obj/item/circuitboard/machine/shuttle/engine/plasma) + crate_name = "plasma thruster crate" + crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/ship_hardware/combustion_thruster + name = "Combustion Thruster Crate" + desc = "A crate containing a combustion thruster and its heater's electronics. For when you need complicated thrust." + cost = 2000 + contains = list(/obj/item/circuitboard/machine/shuttle/fire_heater, + /obj/item/circuitboard/machine/shuttle/engine/fire) + crate_name = "combustion thruster crate" + crate_type = /obj/structure/closet/crate/engineering + +/* + Military hardware +*/ + +/datum/supply_pack/ship_hardware/cloaking_device + name = "Ship Cloaking System" + desc = "A crate containing a cloaking system for hiding a ship from long-range scanners. Very high power consumption." + cost = 10000 + contains = list(/obj/item/circuitboard/machine/cloak) + crate_name = "cloaking system crate" + crate_type = /obj/structure/closet/crate/engineering + faction = /datum/faction/syndicate/hardliners + faction_discount = 30 + +/datum/supply_pack/ship_hardware/advanced_cloaking_device + name = "BFRD-3A Advanced Cloaking System" + desc = "A crate containing an advanced cloaking system capable of partially shifting an entire ship into bluespace." + cost = 6000 + contains = list(/obj/item/circuitboard/machine/cloak) + crate_name = "advanced cloaking system crate" + crate_type = /obj/structure/closet/crate/engineering + // currently unobtainable until someone adds a ship for zohil + faction = /datum/faction/zohil + faction_locked = TRUE + +[/CELADON-DELETE] */ From a0b9a3a421b1d1d2d45c51db8d683a3d8ed1f911 Mon Sep 17 00:00:00 2001 From: OnlineGirlfriend <50865623+OnlineGirlfriend@users.noreply.github.com> Date: Sun, 22 Feb 2026 21:45:32 -0600 Subject: [PATCH 04/55] Update pavement name and description (#5923) ## About The Pull Request A small tweak to the name/description of pavement for spelling and grammar reasons. Previously it appeared like this in game: ## Why It's Good For The Game Just a tiny change for readability. ## Changelog :cl: spellcheck: pavement /:cl: --- code/game/turfs/open/floor/conc_floor.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/open/floor/conc_floor.dm b/code/game/turfs/open/floor/conc_floor.dm index f2b09b649cb6..415ee8c94e71 100644 --- a/code/game/turfs/open/floor/conc_floor.dm +++ b/code/game/turfs/open/floor/conc_floor.dm @@ -288,8 +288,8 @@ return ..() /turf/open/floor/concrete/pavement - name = "pavement" - desc = "The hot, coarse, and somewhat pavement. Vehicles driven on this are generally quiter than on traditional concrete, and is prefered for roadways." + name = "strip of pavement" + desc = "Hot, coarse pavement. Preferred for roadways, as vehicles are generally quieter driven on this than on traditional concrete." icon_state = "pavement_1" base_icon_state = "pavement" broken_states = null From edacd077a749fc2b26aa4afeb107de6ebccefb1d Mon Sep 17 00:00:00 2001 From: Erika Fox <94164348+Erikafox@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:43:42 -0500 Subject: [PATCH 05/55] fixes some trifuge maint walls (#5916) ## About The Pull Request some falsewalls in trifuge maint were broken ## Changelog :cl: fix: trifuge falsewalls /:cl: --- _maps/outpost/indie_space.dmm | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/_maps/outpost/indie_space.dmm b/_maps/outpost/indie_space.dmm index 750e2fe54600..6c9917ae5ffc 100644 --- a/_maps/outpost/indie_space.dmm +++ b/_maps/outpost/indie_space.dmm @@ -588,8 +588,7 @@ /turf/open/floor/plating, /area/outpost/maintenance/starboard) "cH" = ( -/obj/structure/falsewall/reinforced, -/turf/closed/indestructible/reinforced/rust, +/turf/closed/wall/r_wall/rust, /area/outpost/vacant_rooms/office) "cI" = ( /obj/structure/disposalpipe/segment{ @@ -4289,6 +4288,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/plasteel/patterned, /area/outpost/cargo) +"qm" = ( +/obj/structure/falsewall/reinforced, +/turf/open/floor/plating/rust, +/area/outpost/maintenance/central) "qn" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -5024,6 +5027,10 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/rust, /area/outpost/maintenance/central) +"tl" = ( +/obj/structure/falsewall/reinforced, +/turf/open/floor/plating, +/area/outpost/vacant_rooms/office) "tq" = ( /obj/machinery/mineral/electrolyzer_unloader, /turf/open/floor/plasteel/patterned/grid, @@ -6718,7 +6725,7 @@ /area/outpost/maintenance/fore) "Ac" = ( /obj/structure/falsewall/reinforced, -/turf/closed/wall/r_wall/rust, +/turf/open/floor/plating/asteroid, /area/outpost/maintenance/starboard) "Ad" = ( /obj/effect/decal/cleanable/glass/strange, @@ -20859,7 +20866,7 @@ iy lK oA uR -Az +qm zd lO zS @@ -21965,7 +21972,7 @@ yj Km Km Km -Km +tl cH Az Az @@ -22805,7 +22812,7 @@ ay Wo dq vw -Ac +EF Kp hf ay From e570b408c6d40225f7bc8294bf300cffe8a15bb7 Mon Sep 17 00:00:00 2001 From: rye-rice <58402542+rye-rice@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:09:08 -0800 Subject: [PATCH 06/55] Various Overmap Fixes and QOL (#5887) ## About The Pull Request Meant to fix the various docking issues ive noticed over the past few uptimes, along with making some player facing docking stuff easier to comprehend. Meant to be a minor PR, you know the old song and dance In no particular order: - Makes docking error messages less fucking vauge and weird. This isn't even because they're player facing, this is because i geniuely couldnt figure out wtf they meant without looking up the code. This means an admin might actually figure out what is causing a particular docking issue - - Some more docking errors for for adjustable docks since those handle docking different from regular docks. - Fixes improperly mapped docking ports on some ships - - Firefly docking port is no longer extremely dangerous due to missing `disable_on_owner_ship_dock` - - June's Docking port now can dock to other ships - Fixes slimegirl that occurs due to ships sometimes stealing the mobile or even transit docking port from other ships. This should in theory make ship to ship docking a lot less fucked up, but also long rounds (>4 hours) should be a lot more stable - - Should make docking ports a lot less prone to random breakages and errors - Adds edgecase handling for a fair bit of ship code - - Makes Very Big ships have less janky transit zones - - Checking if a ship can dock to an adjustable dock doesn't actually said dock anymore, saving perf and making adjust. docking port bugs less common - Quick dock is now Actually Quick. it should search all docking ports on an overmap object (barring outposts, those have their own handling) to find one that you can actually dock to - Uploading shuttle map templates no longer breaks the overmap sprite due to missing faction datum Needs TM During an early round due to it touching pretty vital code. Otherwise, it shouldn't be noticable too much. ## Why It's Good For The Game Working shipcode that works better is good. ## Changelog :cl: add: Quick dock now searches for docking ports your ship can land at, rather than picking the first option and failing. Quicker! add: Makes docking port messages less vauge. add: Adjusts transit vlevel sizes for larger ships add: In case you are unable to dock to something, you should be given more feedback fix: Shuttle errors due to docking ports being stolen fix: Edgecase handling for docking ports, should fix very rare shuttle bugs fix: Kali, Corona, Dwayne, Firefly, Scarab, Venetia, Typhoon, June, and especially the Quasar have either proper docking ports or fixed docking ports fix: Firefly is now not extremely dangerous to dock to fix: Shuttle code should be less prone to breaking in general /:cl: --------- Signed-off-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> Co-authored-by: Sarah C <93578146+SapphicOverload@users.noreply.github.com> --- .../independent/independent_corona.dmm | 1 - .../independent/independent_dwayne.dmm | 24 +++++--- .../independent/independent_firefly.dmm | 10 ++-- .../independent/independent_scarab.dmm | 60 +++++++++++-------- .../independent/independent_venetia.dmm | 13 +++- _maps/shuttles/minutemen/minutemen_typhon.dmm | 8 ++- _maps/shuttles/pgf/pgf_mercurial_quasar.dmm | 6 +- .../shuttles/subshuttles/independent_june.dmm | 34 +++++++---- .../syndicate/syndicate_ngr_kaliandhi.dmm | 43 ++++++------- code/__DEFINES/shuttles.dm | 24 ++++---- code/controllers/subsystem/shuttle.dm | 12 ++-- code/game/objects/effects/landmarks.dm | 2 + .../admin/verbs/map_template_loadverb.dm | 1 + code/modules/overmap/_overmap_datum.dm | 8 +-- code/modules/overmap/objects/dynamic_datum.dm | 8 +++ code/modules/overmap/objects/static_datum.dm | 8 +++ .../overmap/ships/controlled_ship_datum.dm | 4 +- code/modules/shuttle/on_move.dm | 33 ++++++++-- code/modules/shuttle/shuttle.dm | 42 ++++++++----- 19 files changed, 222 insertions(+), 119 deletions(-) diff --git a/_maps/shuttles/independent/independent_corona.dmm b/_maps/shuttles/independent/independent_corona.dmm index 9ef5fecfd62c..eb1e917e6dfb 100644 --- a/_maps/shuttles/independent/independent_corona.dmm +++ b/_maps/shuttles/independent/independent_corona.dmm @@ -4374,7 +4374,6 @@ /obj/docking_port/stationary{ dheight = 1; dir = 8; - disable_on_owner_ship_dock = 1; dwidth = 15; height = 31; name = "Corona Stern Dock"; diff --git a/_maps/shuttles/independent/independent_dwayne.dmm b/_maps/shuttles/independent/independent_dwayne.dmm index 6621cfa03fc8..280928431188 100644 --- a/_maps/shuttles/independent/independent_dwayne.dmm +++ b/_maps/shuttles/independent/independent_dwayne.dmm @@ -994,13 +994,6 @@ /obj/machinery/door/airlock/external{ dir = 4 }, -/obj/docking_port/mobile{ - can_move_docking_ports = 1; - dir = 4; - name = "mining_ship_all"; - port_direction = 2; - preferred_direction = 4 - }, /turf/open/floor/plating, /area/ship/hallway/central) "ki" = ( @@ -5376,6 +5369,21 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ship/crew/canteen) +"Wb" = ( +/obj/effect/turf_decal/industrial/warning/fulltile, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor{ + id = "dwayne_port" + }, +/obj/docking_port/mobile{ + dir = 2; + name = "mining_ship_all"; + launch_status = 0; + port_direction = 8; + preferred_direction = 4 + }, +/turf/open/floor/plating, +/area/ship/cargo/port) "Wg" = ( /obj/structure/table/wood, /obj/structure/cable/cyan{ @@ -6210,7 +6218,7 @@ Dv "} (19,1,1) = {" wh -AB +Wb DT Ip px diff --git a/_maps/shuttles/independent/independent_firefly.dmm b/_maps/shuttles/independent/independent_firefly.dmm index 3ac2dbb723c2..6b68b1860993 100644 --- a/_maps/shuttles/independent/independent_firefly.dmm +++ b/_maps/shuttles/independent/independent_firefly.dmm @@ -1933,10 +1933,12 @@ /area/ship/hallway/aft) "vA" = ( /obj/docking_port/stationary{ - dwidth = 15; - height = 15; - width = 30; - dir = 2 + dwidth = 20; + height = 31; + width = 41; + dir = 2; + disable_on_owner_ship_dock = 1; + dheight = 1 }, /turf/template_noop, /area/template_noop) diff --git a/_maps/shuttles/independent/independent_scarab.dmm b/_maps/shuttles/independent/independent_scarab.dmm index 348052a75bd7..2d83e0c9a931 100644 --- a/_maps/shuttles/independent/independent_scarab.dmm +++ b/_maps/shuttles/independent/independent_scarab.dmm @@ -752,8 +752,9 @@ "jt" = ( /obj/docking_port/stationary{ dwidth = 7; - height = 15; - width = 14 + height = 30; + width = 14; + name = "Scarab Port Bow Dock" }, /turf/template_noop, /area/template_noop) @@ -2039,17 +2040,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plasteel/tech/grid, /area/ship/hallway/central) -"ye" = ( -/obj/structure/catwalk/over, -/obj/docking_port/mobile{ - dir = 2; - launch_status = 0; - name = "drilling ship"; - port_direction = 8; - preferred_direction = 4 - }, -/turf/open/floor/plating/airless, -/area/ship/external/dark) "yi" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/engineering) @@ -3063,11 +3053,19 @@ /obj/docking_port/stationary{ dir = 8; dwidth = 3; - height = 15; - width = 5 + height = 30; + width = 5; + name = "Scarab Stern Dock" }, -/turf/template_noop, -/area/template_noop) +/obj/docking_port/mobile{ + can_move_docking_ports = 1; + dir = 4; + port_direction = 2; + preferred_direction = 4 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating/airless, +/area/ship/external/dark) "JW" = ( /obj/effect/turf_decal/corner/transparent/bar/diagonal, /obj/structure/cable/green{ @@ -3479,6 +3477,16 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ship/engineering) +"OM" = ( +/obj/docking_port/stationary{ + dwidth = 5; + height = 30; + width = 10; + name = "Scarab Forward Bow Dock"; + dir = 4 + }, +/turf/template_noop, +/area/template_noop) "OS" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/hallway/fore) @@ -3672,10 +3680,10 @@ /turf/open/floor/plasteel/dark, /area/ship/hallway/central) "RX" = ( -/obj/structure/catwalk/over, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 }, +/obj/structure/catwalk/over, /turf/open/floor/plating/airless, /area/ship/external/dark) "Sa" = ( @@ -4181,11 +4189,11 @@ dY dY Ei LJ -wW -wW +IE +Ku JT -wW -wW +Ku +IE JB nn jZ @@ -4208,11 +4216,11 @@ jG jG kz yi -IE +Ku xI RX Ku -IE +Ku ee lG Bd @@ -4414,7 +4422,7 @@ wW Ku "} (10,1,1) = {" -ye +Ku yX yX pQ @@ -4750,7 +4758,7 @@ wW wW wW wW -wW +OM wW wW wW diff --git a/_maps/shuttles/independent/independent_venetia.dmm b/_maps/shuttles/independent/independent_venetia.dmm index 00852d4ab131..ff4eb6298965 100644 --- a/_maps/shuttles/independent/independent_venetia.dmm +++ b/_maps/shuttles/independent/independent_venetia.dmm @@ -1427,11 +1427,18 @@ /area/ship/crew/dorm/dormtwo) "od" = ( /obj/docking_port/stationary{ - dwidth = 15; - width = 30; - height = 15; + dwidth = 20; + width = 40; + height = 35; dir = 8 }, +/obj/docking_port/stationary{ + dwidth = 20; + width = 40; + height = 35; + dir = 8; + name = "Venetia Port Quarter Dock" + }, /turf/template_noop, /area/template_noop) "os" = ( diff --git a/_maps/shuttles/minutemen/minutemen_typhon.dmm b/_maps/shuttles/minutemen/minutemen_typhon.dmm index c14b6d026685..63a600616b2e 100644 --- a/_maps/shuttles/minutemen/minutemen_typhon.dmm +++ b/_maps/shuttles/minutemen/minutemen_typhon.dmm @@ -1436,10 +1436,11 @@ /obj/docking_port/stationary{ width = 40; height = 40; - dwidth = 7; + dwidth = 36; name = "Typhon Starboard Quarter Dock"; dir = 8; - disable_on_owner_ship_dock = 1 + disable_on_owner_ship_dock = 1; + dheight = 1 }, /turf/open/floor/pod/light/external, /area/ship/external/dark) @@ -4212,7 +4213,8 @@ height = 40; dwidth = 7; name = "Typhon Quarter Dock"; - dir = 8 + dir = 8; + dheight = 1 }, /turf/open/floor/pod/light/external, /area/ship/external/dark) diff --git a/_maps/shuttles/pgf/pgf_mercurial_quasar.dmm b/_maps/shuttles/pgf/pgf_mercurial_quasar.dmm index 21b31fc65e0a..a7b6864c185b 100644 --- a/_maps/shuttles/pgf/pgf_mercurial_quasar.dmm +++ b/_maps/shuttles/pgf/pgf_mercurial_quasar.dmm @@ -3306,10 +3306,8 @@ disable_on_owner_ship_dock = 1 }, /obj/docking_port/mobile{ - can_move_docking_ports = 1; - port_direction = 8; - preferred_direction = 4; - dir = 2 + port_direction = 4; + preferred_direction = 4 }, /turf/open/floor/engine/hull/reinforced, /area/ship/external/dark) diff --git a/_maps/shuttles/subshuttles/independent_june.dmm b/_maps/shuttles/subshuttles/independent_june.dmm index a81dcf8c9018..7bcb428a3344 100644 --- a/_maps/shuttles/subshuttles/independent_june.dmm +++ b/_maps/shuttles/subshuttles/independent_june.dmm @@ -161,6 +161,28 @@ }, /turf/open/floor/plating, /area/ship/bridge) +"k" = ( +/obj/effect/turf_decal/techfloor{ + dir = 1 + }, +/obj/effect/turf_decal/steeldecal/steel_decals_central4, +/obj/effect/turf_decal/techfloor/hole/right{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/effect/turf_decal/techfloor/corner{ + dir = 1 + }, +/obj/docking_port/mobile{ + dir = 4; + name = "June-class Dropship"; + preferred_direction = 4; + port_direction = 2 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/bridge) "l" = ( /obj/effect/turf_decal/techfloor{ dir = 1 @@ -205,22 +227,12 @@ /obj/effect/turf_decal/techfloor{ dir = 1 }, -/obj/effect/turf_decal/steeldecal/steel_decals_central4, -/obj/effect/turf_decal/techfloor/hole/right{ - dir = 1 - }, /obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 8 }, /obj/effect/turf_decal/techfloor/corner{ dir = 1 }, -/obj/docking_port/mobile{ - dir = 8; - name = "June-class Dropship"; - preferred_direction = 8; - port_direction = 2 - }, /turf/open/floor/plasteel/tech/grid, /area/ship/bridge) "q" = ( @@ -607,7 +619,7 @@ g W g -r +k r r r diff --git a/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm b/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm index cb9547b6ff29..23d7574b1d10 100644 --- a/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm +++ b/_maps/shuttles/syndicate/syndicate_ngr_kaliandhi.dmm @@ -694,6 +694,17 @@ /obj/structure/grille, /turf/open/floor/plating, /area/ship/bridge) +"dF" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 22; + height = 31; + width = 40; + name = "Starboard Airlock"; + dheight = 1 + }, +/turf/template_noop, +/area/template_noop) "dG" = ( /obj/effect/turf_decal/corner/opaque/red/half, /obj/effect/turf_decal/techfloor{ @@ -6049,15 +6060,13 @@ /turf/open/floor/plasteel/tech, /area/ship/security/armory) "FI" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 15; - height = 15; - width = 30; - name = "Starboard Airlock" +/obj/docking_port/mobile{ + launch_status = 0; + preferred_direction = 4; + port_direction = 4 }, -/turf/template_noop, -/area/template_noop) +/turf/open/floor/engine/hull/reinforced, +/area/ship/external/dark) "FJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7003,12 +7012,6 @@ /obj/effect/turf_decal/borderfloorblack{ dir = 1 }, -/obj/docking_port/mobile{ - dir = 4; - launch_status = 0; - port_direction = 2; - preferred_direction = 4 - }, /turf/open/floor/plasteel/dark, /area/ship/cargo) "KX" = ( @@ -9576,8 +9579,8 @@ /area/ship/engineering/atmospherics) "Xv" = ( /obj/docking_port/stationary{ - dwidth = 10; - height = 15; + dwidth = 11; + height = 30; width = 30; name = "Portside Airlock" }, @@ -10421,7 +10424,7 @@ Dp Dp Dp Dp -CN +Wo CN CN "} @@ -10453,7 +10456,7 @@ zS Qx CH FI -CN +dF CN "} (13,1,1) = {" @@ -10483,7 +10486,7 @@ Rx lj pb Lm -CN +Wo CN CN "} @@ -10543,7 +10546,7 @@ Dp WP Dp Dp -CN +Wo CN CN CN diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 357f352f893d..885bcbe7215d 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -23,17 +23,19 @@ // Shuttle return values #define SHUTTLE_CAN_DOCK "can_dock" #define SHUTTLE_NOT_A_DOCKING_PORT "not a docking port" -#define SHUTTLE_DWIDTH_TOO_LARGE "docking width too large" -#define SHUTTLE_WIDTH_TOO_LARGE "width too large" -#define SHUTTLE_DHEIGHT_TOO_LARGE "docking height too large" -#define SHUTTLE_HEIGHT_TOO_LARGE "height too large" -#define SHUTTLE_ALREADY_DOCKED "we are already docked" -#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone else docked" -#define SHUTTLE_PORT_DISABLED "port is disabled" -#define SHUTTLE_TOUCHES_EDGE "landing area overlaps with map border" -#define SHUTTLE_OUR_MOBILEDOCK_FORBIDS_DOCKING "our mobile docking port is docked, forbidding docking" -#define SHUTTLE_TARGET_MOBILEDOCK_FORBIDS_DOCKING "target's mobile docking port is docked forbidding docking" -#define SHUTTLE_PORT_IS_ADJUSTING "port is in the middle of adjusting another ship to land" +#define SHUTTLE_DWIDTH_TOO_LARGE "our vessel's width offset (dwidth) is too large for this port's bounds" +#define SHUTTLE_WIDTH_TOO_LARGE "our vessel's width is too large for this port's bounds" +#define SHUTTLE_DHEIGHT_TOO_LARGE "our vessel's height offset (dheight) is too large for this port's bounds" +#define SHUTTLE_HEIGHT_TOO_LARGE "our vessel's height is too large for this port's bounds" +#define SHUTTLE_ALREADY_DOCKED "vessel is already docked on this port" +#define SHUTTLE_SOMEONE_ELSE_DOCKED "another vessel is already docked on this port" +#define SHUTTLE_PORT_DISABLED "docking port is disabled" +#define SHUTTLE_TOUCHES_EDGE "the landing area overlaps with map border" +#define SHUTTLE_OUR_MOBILEDOCK_FORBIDS_DOCKING "our mobile docking port is docked with something; forbidding docking" +#define SHUTTLE_TARGET_MOBILEDOCK_FORBIDS_DOCKING "target's mobile docking port is docked with something; forbidding docking on this particular port" +#define SHUTTLE_PORT_IS_ADJUSTING "adjustable port is in the middle of adjusting itself for another vessel to land" +#define SHUTTLE_ADJUSTABLE_OUR_HEIGHT_TOO_LARGE "adjustable port's zone height is not large enough for our vessel" +#define SHUTTLE_ADJUSTABLE_OUR_WIDTH_TOO_LARGE "adjustable port's zone width is not large enough for our vessel" //Launching Shuttles to CentCom diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 2be41654fcb0..6cc4c55f95bf 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -127,17 +127,21 @@ SUBSYSTEM_DEF(shuttle) ///attempt at making transit levels bigger to allow for better ship to ship docking if(transit_width <= 32) ///32 x 3 = 96 - small sized ships shouldnt be bigger than this transit_width *= 3 - else if(transit_width <= 63) // 63 x 2 = 127 - 127 is the defialt size of planets, ideally we dont go higher than this + else if(transit_width <= 63) // 63 x 2 = 127 - 127 is the default size of planets, ideally we dont go higher than this transit_width *= 2 + else if(transit_width <= 127) // fuckhuge ships should prbobaly max out here, + transit_width = 127 // ditto else - transit_width = 127 // fuckhuge ships should prbobaly max out here + transit_width = 255 //...however, for the sake of edgecase handling, if a mapper decides to break all mapping conventions (map size larger than 127), we assume this is intentional, if(transit_height <= 32) ///32 x 3 = 96 - small sized ships shouldnt be bigger than this transit_height *= 3 - else if(transit_height <= 63) // 63 x 2 = 127 - 127 is the defialt size of planets, ideally we dont go higher than this + else if(transit_height <= 63) // 63 x 2 = 127 - 127 is the default size of planets, ideally we dont go higher than this transit_height *= 2 + else if(transit_height <= 127) // fuckhuge ships should prbobaly max out here, + transit_height = 127 // ditto else - transit_height = 127 // fuckhuge ships should prbobaly max out here + transit_height = 255 //...however, for the sake of edgecase handling, if a mapper decides to break all mapping conventions (map size larger than 127), we assume this is intentional, var/transit_path = /turf/open/space/transit switch(travel_dir) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 37da0a0c4b48..5fdba5e352d2 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -463,6 +463,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) dock_x = template.height - template.port_y_offset dock_y = template.port_x_offset - 1 var/obj/docking_port/stationary/dock = new(locate(x + offset_x + dock_x, y + offset_y + dock_y, z), dock_holder) + if(name != "subship dock") //if you bothered to name it + dock.name = name dock.roundstart_template = subship_template dock.outpost_special_dock_perms = outpost_docker dock.load_template_on_initialize = load_on_init diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index 4527241e5292..2a0154b7a0d4 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -73,6 +73,7 @@ SSmapping.map_templates[map] = new_map if(template_type == "Shuttle") var/datum/map_template/shuttle/shuttle_template = new_map + shuttle_template.faction = SSfactions.factions[/datum/faction/independent] //as factions were moved to map templates from datum/overmap/ship, uploading shuttle templates was broken for a while shuttle_template.file_name = "[map]" shuttle_template.category = "uploaded" SSmapping.shuttle_templates["[map]"] = shuttle_template diff --git a/code/modules/overmap/_overmap_datum.dm b/code/modules/overmap/_overmap_datum.dm index 50bc2b331130..dc0fb9d6cebe 100644 --- a/code/modules/overmap/_overmap_datum.dm +++ b/code/modules/overmap/_overmap_datum.dm @@ -356,7 +356,7 @@ return if(INTERACTION_OVERMAP_DOCK) if(docked_to || docking) - return "ERROR: Unable to do this currently! Reduce speed or undock!" + return "ERROR: Unable to do this while docked! Undock first!" var/list/dockables = interact_target.get_dockable_locations(src) if(!dockables.len) @@ -367,15 +367,15 @@ return Dock(interact_target, choice) if(INTERACTION_OVERMAP_QUICKDOCK) if(docked_to || docking) - return "ERROR: Unable to do this currently! Undock first!" + return "ERROR: Unable to do this while docked! Undock first!" return Dock(interact_target) if(INTERACTION_OVERMAP_HAIL) return do_hail(user, interact_target) if(INTERACTION_OVERMAP_INTERDICTION) if(docked_to || docking) - return "ERROR: Unable to do this currently! Reduce speed or undock!" + return "ERROR: Unable to do this while docked! Undock first!" if(interact_target.docked_to || interact_target.docking) - return "ERROR: Unable to do this currently! Target is docked or docking!" + return "ERROR: Unable to do this while target is docked or docking!" var/list/dockables = get_dockable_locations(src) if(!dockables.len) diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index b0d76eaba22f..a5b5fe6e1d14 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -103,13 +103,21 @@ return new /datum/docking_ticket(_docking_error = "[src] cannot be docked to.") else var/dock_to_use = override_dock + //if true, we say that we do in fact have free docks, just you cant fit in any of them for whatever reason. hopefully this is less vauge than "X Cannot be docked to." + var/alt_message = FALSE if(!override_dock) for(var/obj/docking_port/stationary/dock as anything in reserve_docks) + //meant for quick dock, as such we check if we can actually dock here before checking all other docking ports. + //This means you can name a docking port with a leading ! like '!Ship Starboard Stern Docking Port' to have priority over other docking ports if(!dock.docked) + alt_message = TRUE + if(!dock.docked && dock_requester.shuttle_port.check_dock(dock, TRUE, FALSE)) dock_to_use = dock break if(!dock_to_use) + if(alt_message) + return new /datum/docking_ticket(_docking_error = "[src] has free docks, however vessel is unable to fit in any. Attempt manual docking for more information. Aborting docking.") return new /datum/docking_ticket(_docking_error = "[src] does not have any free docks. Aborting docking.") return new /datum/docking_ticket(dock_to_use, src, dock_requester) diff --git a/code/modules/overmap/objects/static_datum.dm b/code/modules/overmap/objects/static_datum.dm index 31be4dc6eb2e..d153845a4215 100644 --- a/code/modules/overmap/objects/static_datum.dm +++ b/code/modules/overmap/objects/static_datum.dm @@ -69,13 +69,21 @@ return new /datum/docking_ticket(_docking_error = "[src] cannot be docked to.") else var/dock_to_use = override_dock + //if true, we say that we do in fact have free docks, just you cant fit in any of them for whatever reason. hopefully this is less vauge than "X Cannot be docked to." + var/alt_message = FALSE if(!override_dock) for(var/obj/docking_port/stationary/dock as anything in reserve_docks) + //meant for quick dock, as such we check if we can actually dock here before checking all other docking ports. + //This means you can name a docking port with a leading ! like '!Ship Starboard Stern Docking Port' to have priority over other docking ports if(!dock.docked) + alt_message = TRUE + if(!dock.docked && dock_requester.shuttle_port.check_dock(dock, TRUE, FALSE)) dock_to_use = dock break if(!dock_to_use) + if(alt_message) + return new /datum/docking_ticket(_docking_error = "[src] has free docks, however vessel is unable to fit in any. Attempt manual docking for more information. Aborting docking.") return new /datum/docking_ticket(_docking_error = "[src] does not have any free docks. Aborting docking.") return new /datum/docking_ticket(dock_to_use, src, dock_requester) diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index 3a96d04063c1..0d38aebed372 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -279,8 +279,10 @@ return new /datum/docking_ticket(override_dock, src, dock_requester) for(var/obj/docking_port/stationary/docking_port in shuttle_port.docking_points) - if(dock_requester.shuttle_port.check_dock(docking_port)) + if(dock_requester.shuttle_port.check_dock(docking_port, TRUE, FALSE)) return new /datum/docking_ticket(docking_port, src, dock_requester) + if(shuttle_port.docking_points.len) + return new /datum/docking_ticket(_docking_error = "ERROR: [src] has docking ports, however vessel is unable to dock to any. Attempt manual docking for more information. Aborting docking.") return ..() /datum/overmap/ship/controlled/get_dockable_locations(datum/overmap/requesting_interactor) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 00064dbc5150..8d8a468a94df 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -405,13 +405,36 @@ All ShuttleMove procs go here . |= MOVE_CONTENTS /obj/docking_port/mobile/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, list/obj/docking_port/mobile/towed_shuttles) - if(!towed_shuttles[src] && !moving_dock.can_move_docking_ports) + //while im sure this thing has never ever been set to false, we check for it anyways + if(!moving_dock.can_move_docking_ports) + return FALSE + //are we not being towed by another ship or are we not the ship thats moving? if neither, ignore + if(!(towed_shuttles[src] || moving_dock == src)) return FALSE - . = ..() + + return ..() /obj/docking_port/stationary/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, list/obj/docking_port/mobile/towed_shuttles) - if(old_dock == src) //Never take our old port + //while im sure this thing has never ever been set to false, we check for it anyways + if(!moving_dock.can_move_docking_ports) return FALSE - if((!(src in moving_dock.docking_points) || !towed_shuttles[docked]) && !moving_dock.can_move_docking_ports) + //Never take our old port + if(old_dock == src) return FALSE - . = ..() + //Don't take the docking port from the ship we undocked from, either + if(old_dock && old_dock.owner_ship && old_dock.owner_ship.docked == src) + return FALSE + //are we a stationary docking port of the main docking port? if not, we get ignored + if(!(src in moving_dock.docking_points)) + return FALSE + //check if we are a docking port of a towed shuttle, if we are, we get towed along when the mainship moves, if not, we get ignored + for(var/obj/docking_port/mobile/checked_port as anything in towed_shuttles) + var/port_in_towed_ports = FALSE + if(src in checked_port.docking_points) + port_in_towed_ports = TRUE + break + //towed_shuttles[docked]: are we towing a docked ship? If so, let us load. The point of this appears to be to let pre-spawned subshuttles work. + //Basically, if we are not in the towed ports OR towing a ship, dont move us. + if(!port_in_towed_ports && !towed_shuttles[docked]) + return FALSE + return ..() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 674ed536f6a4..d29377bbb5ca 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -635,25 +635,37 @@ // attempt to move us where we currently are, it will get weird. return SHUTTLE_ALREADY_DOCKED - if(S.adjust_dock_for_landing && intention_to_dock) + if(S.adjust_dock_for_landing) if(S.is_adjusting_now) return SHUTTLE_PORT_IS_ADJUSTING - S.adjust_dock_to_shuttle(src) + //since we width/height is more like a box where the ship can land IN, we can easily check if we can land here + if(height > S.height) + if (width > S.height && height > S.width) + return SHUTTLE_ADJUSTABLE_OUR_HEIGHT_TOO_LARGE + if(width > S.width) + if (height > S.width && width > S.height) + return SHUTTLE_ADJUSTABLE_OUR_WIDTH_TOO_LARGE + //hopefully that reduces the amount of procesing nesaary before running this proc's math + if(intention_to_dock) + S.adjust_dock_to_shuttle(src) + if(istype(S, /obj/docking_port/stationary/transit)) return SHUTTLE_CAN_DOCK - if(tow_dwidth > S.dwidth) - return SHUTTLE_DWIDTH_TOO_LARGE + //if we are trying to dock to an adjustable port, but we are only checking if we can even land, dont actually check since it hasn't adjusted yet + if(!S.adjust_dock_for_landing || S.adjust_dock_for_landing && intention_to_dock) + if(tow_dwidth > S.dwidth) + return SHUTTLE_DWIDTH_TOO_LARGE - if(tow_rwidth > S.width-S.dwidth) - return SHUTTLE_WIDTH_TOO_LARGE + if(tow_rwidth > S.width-S.dwidth) + return SHUTTLE_WIDTH_TOO_LARGE - if(tow_dheight > S.dheight) - return SHUTTLE_DHEIGHT_TOO_LARGE + if(tow_dheight > S.dheight) + return SHUTTLE_DHEIGHT_TOO_LARGE - if(tow_rheight > S.height-S.dheight) - return SHUTTLE_HEIGHT_TOO_LARGE + if(tow_rheight > S.height-S.dheight) + return SHUTTLE_HEIGHT_TOO_LARGE for(var/obj/docking_port/stationary/current_port as anything in docking_points) //if any of our docks has disable_on_owner_ship_dock set, has something docked to us, and we aren't going to a transit zone or an adjustable dock(usually planetary), don't land @@ -664,10 +676,12 @@ if(S.disable_on_owner_ship_dock && (!istype(S.owner_ship.docked, /obj/docking_port/stationary/transit))) return SHUTTLE_TARGET_MOBILEDOCK_FORBIDS_DOCKING - for(var/turf/closed/indestructible/edgeturf as anything in return_ordered_turfs(S.x, S.y, S.z, S.dir)) - if(!istype(edgeturf)) - continue - return SHUTTLE_TOUCHES_EDGE + //see above; adjustable port will not have adjusted and thus this reading will be wrong + if(!S.adjust_dock_for_landing || S.adjust_dock_for_landing && intention_to_dock) + for(var/turf/closed/indestructible/edgeturf as anything in return_ordered_turfs(S.x, S.y, S.z, S.dir)) + if(!istype(edgeturf)) + continue + return SHUTTLE_TOUCHES_EDGE return SHUTTLE_CAN_DOCK From d24e8c27fe08774070b29ba0420a7af0bcca6256 Mon Sep 17 00:00:00 2001 From: Sarah C <93578146+SapphicOverload@users.noreply.github.com> Date: Mon, 23 Feb 2026 21:15:19 -0500 Subject: [PATCH 07/55] Fixes language preferences (#5922) :cl: fix: Fixed new languages added to the game not showing up in character preferences /:cl: --- code/__HELPERS/sanitize_values.dm | 5 +++++ code/modules/client/preferences.dm | 20 ++++++++++++------- code/modules/client/preferences_savefile.dm | 3 ++- .../mob/living/carbon/human/human_defines.dm | 3 +++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 510502dc943c..e34bd8059570 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -37,6 +37,11 @@ return pick(possible_genders) return gender +/proc/sanitize_pronouns(pronouns, default="He") + if(pronouns == "He" || pronouns == "She" || pronouns == "They" || pronouns == "It") + return pronouns + return default + /proc/sanitize_hexcolor(color, desired_format = 6, include_crunch = FALSE, default) var/crunch = include_crunch ? "#" : "" if(!istext(color)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6ef2b74a5641..053bdb9197a7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -66,6 +66,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/slot_randomized //keeps track of round-to-round randomization of the character slot, prevents overwriting var/real_name //our character's name var/gender = MALE //gender of character (well duh) + var/pronouns = "He" //pronouns of character var/age = 30 //age of character var/underwear = "Nude" //Type of underwear var/underwear_color = "000" //Greyscale color of underwear @@ -403,7 +404,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" dat += " [get_language_point_balance()] points left. " if(!learned_languages?.len) - init_learned_languages() + learned_languages = sanitize_learned_languages() for(var/datum/language/lang_type as anything in learned_languages) if(lang_type == native_language) continue @@ -1863,11 +1864,16 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(SSquirks.quirk_points[q] > 0) .++ -/datum/preferences/proc/init_learned_languages() - learned_languages = list() +/datum/preferences/proc/sanitize_learned_languages(list/language_list) + var/list/new_language_list = list() for(var/datum/language/lang_type as anything in subtypesof(/datum/language)) - if(initial(lang_type.flags) & ROUNDSTART_LANGUAGE) - learned_languages[lang_type] = LANGUAGE_UNKNOWN + if(!(initial(lang_type.flags) & ROUNDSTART_LANGUAGE)) + continue + if(!(lang_type in language_list)) + new_language_list[lang_type] = LANGUAGE_UNKNOWN + continue + new_language_list[lang_type] = language_list[lang_type] + return new_language_list /datum/preferences/proc/get_language_point_balance() var/points_balance = MAX_LANGUAGE_POINTS @@ -2595,7 +2601,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) to_chat(usr, span_warning("You don't have enough language points!")) if("reset_languages") - init_learned_languages() + learned_languages = sanitize_learned_languages() if ("clientfps") var/desiredfps = input(user, "Choose your desired fps. (0 = default, 60 FPS))", "Character Preference", clientfps) as null|num //WS Edit - Client FPS Tweak - @@ -3118,7 +3124,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.set_mob_height(GLOB.height_filters[height_filter]) if(!character_setup && get_language_point_balance() < 0) - init_learned_languages() // no exploits allowed + learned_languages = sanitize_learned_languages() // no exploits allowed character.grant_language(native_language) character.get_language_holder().selected_language = native_language for(var/datum/language/lang_type as anything in learned_languages) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a9a57ce037f3..d2e4bdff8dbf 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -452,7 +452,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!prosthetic_limbs[zone]) prosthetic_limbs[zone] = PROSTHETIC_NORMAL // necessary to prevent old savefiles from breaking the interface READ_FILE(S["learned_languages"], learned_languages) - if(!learned_languages?.len) init_learned_languages() READ_FILE(S["native_language"], native_language) native_language ||= /datum/language/galactic_common READ_FILE(S["feature_mcolor"], features["mcolor"]) @@ -578,6 +577,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize real_name = reject_bad_name(real_name) gender = sanitize_gender(gender) + pronouns = sanitize_pronouns(pronouns) + learned_languages = sanitize_learned_languages(learned_languages) if(!real_name) real_name = random_unique_name(gender) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index c8bb18f91701..27c17cab3d02 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -86,6 +86,9 @@ /// Height of the mob VAR_PROTECTED/mob_height = HUMAN_HEIGHT_MEDIUM + /// Pronouns of the mob + var/pronouns = null // all pronoun stuff is for players and will read gender for pronouns if this is null + // [CELADON-ADD] - CELADON_EMOTES /mob/living/carbon/human/proc/get_age_pitch(species_pitch = 85) return 1.0 + 0.5 * ((species_pitch * 0.35) - age) / (0.94 * species_pitch) From 0253607d71718961222187302815152e93a0e74b Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:17:08 -0800 Subject: [PATCH 08/55] Extremely Minor Nimbus / Cirrus changes (#5921) ## About The Pull Request Adjusts ingredient diversity in the fridges so you can make like 3 or 4 recipes about Added two oxygen closets along the main hallway in the Cirrus Added bathroom lock to the crew bathroom and made the command bathroom not lock the crew bathroom Removes a duplicate recharger on Nimbus ## Why It's Good For The Game Just some minor quality of life ## Changelog :cl: add: Added more ingredients to Cirrus / Nimbus add: Oxygen closets in Cirrus fix: Cirrus command bathroom no longer locks crew bathroom, lock to crew bathroom fix: Removed duplicate recharger on Nimbus /:cl: --- _maps/shuttles/cybersun/cybersun_cirrus.dmm | 73 +++++++++++++-------- _maps/shuttles/cybersun/cybersun_nimbus.dmm | 61 +++++++++-------- 2 files changed, 82 insertions(+), 52 deletions(-) diff --git a/_maps/shuttles/cybersun/cybersun_cirrus.dmm b/_maps/shuttles/cybersun/cybersun_cirrus.dmm index 0eb198aceaf3..193ea1179bad 100644 --- a/_maps/shuttles/cybersun/cybersun_cirrus.dmm +++ b/_maps/shuttles/cybersun/cybersun_cirrus.dmm @@ -72,14 +72,6 @@ pixel_y = -11; pixel_x = -4 }, -/obj/item/food/meat/slab/chicken{ - pixel_y = -11; - pixel_x = -4 - }, -/obj/item/food/grown/refa_li{ - pixel_x = 6; - pixel_y = -5 - }, /obj/item/food/grown/refa_li{ pixel_x = 6; pixel_y = -5 @@ -104,14 +96,6 @@ pixel_y = -5; pixel_x = -5 }, -/obj/item/food/meat/slab/remes{ - pixel_y = -5; - pixel_x = -5 - }, -/obj/item/food/meat/slab/remes{ - pixel_y = -5; - pixel_x = -5 - }, /obj/item/food/grown/dotu_fime{ pixel_y = 4; pixel_x = 4 @@ -120,14 +104,6 @@ pixel_y = 5; pixel_x = 4 }, -/obj/item/food/grown/dotu_fime{ - pixel_y = 4; - pixel_x = 4 - }, -/obj/item/food/mirasegg{ - pixel_x = -6; - pixel_y = 4 - }, /obj/item/food/mirasegg{ pixel_x = -6; pixel_y = 4 @@ -137,6 +113,33 @@ pixel_y = 4 }, /obj/effect/turf_decal/siding/black/end, +/obj/item/food/grown/sososi, +/obj/item/food/grown/sososi, +/obj/item/food/grown/sososi, +/obj/item/food/grown/dote_berries{ + pixel_x = 0; + pixel_y = -8 + }, +/obj/item/food/grown/dote_berries{ + pixel_x = 1; + pixel_y = -9 + }, +/obj/item/food/grown/dote_berries{ + pixel_x = 2; + pixel_y = -10 + }, +/obj/item/food/meat/slab/tiris{ + pixel_x = -1; + pixel_y = -4 + }, +/obj/item/food/meat/slab/tiris{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/food/meat/slab/tiris{ + pixel_x = -2; + pixel_y = -2 + }, /turf/open/floor/plasteel/patterned/brushed, /area/ship/crew/ccommons) "aE" = ( @@ -1059,6 +1062,15 @@ /obj/effect/turf_decal/siding/black/end{ dir = 8 }, +/obj/machinery/button/door{ + dir = 8; + pixel_x = 22; + pixel_y = -9; + name = "bathroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4; + id = "ccrlock" + }, /turf/open/floor/carpet/black, /area/ship/crew/dorm) "gD" = ( @@ -1815,6 +1827,14 @@ }, /turf/open/floor/suns/hatch/maple, /area/ship/bridge) +"kM" = ( +/obj/effect/turf_decal/corner/opaque/cybersunteal/border, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 5 + }, +/obj/structure/closet/emcloset/wall/directional/south, +/turf/open/floor/plasteel/dark, +/area/ship/medical) "kO" = ( /obj/machinery/atmospherics/pipe/layer_manifold, /turf/closed/wall/mineral/titanium, @@ -3513,7 +3533,7 @@ /obj/machinery/door/airlock{ name = "Restroom"; dir = 4; - id_tag = "cpiss" + id_tag = "ccrlock" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -5781,6 +5801,7 @@ /obj/effect/turf_decal/corner/opaque/white{ dir = 10 }, +/obj/structure/closet/emcloset/wall/directional/north, /turf/open/floor/plasteel/dark, /area/ship/hallway/central) "Te" = ( @@ -7103,7 +7124,7 @@ ep Kk ja ak -vq +kM Vn PH lN diff --git a/_maps/shuttles/cybersun/cybersun_nimbus.dmm b/_maps/shuttles/cybersun/cybersun_nimbus.dmm index 17e346f9efbb..0d90cf473860 100644 --- a/_maps/shuttles/cybersun/cybersun_nimbus.dmm +++ b/_maps/shuttles/cybersun/cybersun_nimbus.dmm @@ -1726,9 +1726,12 @@ name = "weapons closet"; req_access_txt = "48" }, -/obj/item/storage/guncase/pistol/rattlesnake, -/obj/item/storage/guncase/pistol/rattlesnake{ - pixel_y = 6 +/obj/effect/turf_decal/corner/transparent/cybersunteal/half{ + dir = 8 + }, +/obj/machinery/recharger{ + pixel_x = -2; + pixel_y = 4 }, /obj/item/storage/box/ammo/c9mm{ pixel_x = -5; @@ -1738,24 +1741,17 @@ pixel_x = -5; pixel_y = -1 }, -/obj/effect/turf_decal/corner/transparent/cybersunteal/half{ - dir = 8 - }, -/obj/item/melee/energy/flyssa{ - pixel_x = 7; - pixel_y = -4 +/obj/item/storage/guncase/pistol/rattlesnake, +/obj/item/storage/guncase/pistol/rattlesnake{ + pixel_y = 6 }, /obj/item/melee/energy/flyssa{ pixel_x = 4; pixel_y = -1 }, -/obj/machinery/recharger{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/machinery/recharger{ - pixel_x = -5; - pixel_y = 4 +/obj/item/melee/energy/flyssa{ + pixel_x = 7; + pixel_y = -4 }, /turf/open/floor/plasteel/dark, /area/ship/security/armory) @@ -1815,14 +1811,6 @@ pixel_x = -6; pixel_y = 5 }, -/obj/item/food/grown/sososi{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/food/grown/sososi{ - pixel_x = -6; - pixel_y = 5 - }, /obj/item/food/grown/dote_berries{ pixel_x = 5 }, @@ -1832,8 +1820,29 @@ /obj/item/food/grown/dote_berries{ pixel_x = 5 }, -/obj/item/food/grown/dote_berries{ - pixel_x = 5 +/obj/item/food/grown/refa_li{ + pixel_x = -11; + pixel_y = -6 + }, +/obj/item/food/grown/refa_li{ + pixel_x = -11; + pixel_y = -6 + }, +/obj/item/food/grown/refa_li{ + pixel_x = -11; + pixel_y = -7 + }, +/obj/item/food/grown/siti{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/food/grown/siti{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/food/grown/siti{ + pixel_x = -9; + pixel_y = 6 }, /turf/open/floor/plasteel/patterned/brushed, /area/ship/crew/ccommons) From f209f28c17abf5ff1dfbb44777768ac2b75d8490 Mon Sep 17 00:00:00 2001 From: moffball19 Native Language: [initial(native_language.name)] Date: Wed, 25 Feb 2026 10:29:56 -0800 Subject: [PATCH 09/55] replaces a missing console on the kiwi (#5929) ## About The Pull Request replaces a missing console on the kiwi ## Why It's Good For The Game replaces a missing console on the kiwi ## Changelog :cl: fix: replaces a missing console on the kiwi /:cl: --- _maps/shuttles/nanotrasen/nanotrasen_kiwi.dmm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_maps/shuttles/nanotrasen/nanotrasen_kiwi.dmm b/_maps/shuttles/nanotrasen/nanotrasen_kiwi.dmm index 8d388b6d7c67..78f6b4bfa516 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_kiwi.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_kiwi.dmm @@ -4545,6 +4545,9 @@ /obj/effect/turf_decal/siding/thinplating/dark, /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, +/obj/structure/table/emptycomputer{ + icon_state = "emptycomputer-left" + }, /turf/open/floor/plasteel/tech/grid, /area/ship/bridge) "Ge" = ( From bab6a5074be07fce5d50aecc8fbed24f8e13313e Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Wed, 25 Feb 2026 11:29:03 -0800 Subject: [PATCH 10/55] Removes Phobia Quirk (#5896) I feel like this is better to be in the hands of your own agency rather than being a gamey quirk you, the player, has no control over :cl: del: Removed phobia trait /:cl: --- code/datums/traits/negative/phobia.dm | 14 ------------- code/modules/client/preferences.dm | 23 --------------------- code/modules/client/preferences_savefile.dm | 2 -- shiptest.dme | 1 - 4 files changed, 40 deletions(-) delete mode 100644 code/datums/traits/negative/phobia.dm diff --git a/code/datums/traits/negative/phobia.dm b/code/datums/traits/negative/phobia.dm deleted file mode 100644 index a0cd808c6ef7..000000000000 --- a/code/datums/traits/negative/phobia.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/quirk/phobia - name = "Phobia" - desc = "You are irrationally afraid of something." - value = -1 - medical_record_text = "Patient has an irrational fear of something." - -/datum/quirk/phobia/post_add() - var/mob/living/carbon/human/H = quirk_holder - H.gain_trauma(new /datum/brain_trauma/mild/phobia(H.client?.prefs.phobia), TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/quirk/phobia/remove() - var/mob/living/carbon/human/H = quirk_holder - if(H) - H.cure_trauma_type(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 053bdb9197a7..55effde10b21 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -176,7 +176,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) BODY_ZONE_R_LEG = PROSTHETIC_NORMAL, ) var/fbp = FALSE - var/phobia = "spiders" var/list/alt_titles_preferences = list() var/list/custom_names = list() var/preferred_ai_core_display = "Blue" @@ -1134,23 +1133,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) mutant_category = 0 // [/CELADON-ADD] - //Adds a thing to select which phobia because I can't be assed to put that in the quirks window - if("Phobia" in all_quirks) - if(!mutant_category) - dat += APPEARANCE_CATEGORY_COLUMN - dat += "
Phobia
" - - dat += "[phobia]
" - - mutant_category++ - if(mutant_category >= MAX_MUTANT_ROWS) - dat += "" - mutant_category = 0 - - if(generic_adjective) - if(!mutant_category) - dat += APPEARANCE_CATEGORY_COLUMN - // begin generic adjective if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -2623,11 +2605,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(pickedPDAColor) pda_color = pickedPDAColor - if("phobia") - var/phobiaType = input(user, "What is your character scared of?", "Quirk Preference", phobia) as null|anything in SStraumas.phobia_types - if(phobiaType) - phobia = phobiaType - if("generic_adjective") var/selectAdj if(istype(pref_species, /datum/species/ipc)) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d2e4bdff8dbf..2181b3618ad9 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -442,7 +442,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["socks_color"], socks_color) READ_FILE(S["backpack"], backpack) READ_FILE(S["jumpsuit_style"], jumpsuit_style) - READ_FILE(S["phobia"], phobia) READ_FILE(S["generic_adjective"], generic_adjective) READ_FILE(S["randomise"], randomise) READ_FILE(S["height_filter"], height_filter) @@ -753,7 +752,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["backpack"] , backpack) WRITE_FILE(S["randomise"] , randomise) WRITE_FILE(S["species"] , pref_species.id) - WRITE_FILE(S["phobia"] , phobia) WRITE_FILE(S["generic_adjective"] , generic_adjective) WRITE_FILE(S["height_filter"] , height_filter) WRITE_FILE(S["prosthetic_limbs"] , prosthetic_limbs) diff --git a/shiptest.dme b/shiptest.dme index 04ae78d03737..7b3fde585d24 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -952,7 +952,6 @@ #include "code\datums\traits\negative\mute.dm" #include "code\datums\traits\negative\nearsighted.dm" #include "code\datums\traits\negative\paraplegic.dm" -#include "code\datums\traits\negative\phobia.dm" #include "code\datums\traits\negative\prosopagnosia.dm" #include "code\datums\traits\negative\pushover.dm" #include "code\datums\traits\neutral\ageusia.dm" From 59ef0cb4f87a52baa61c44228e15e07d430acc13 Mon Sep 17 00:00:00 2001 From: OnlineGirlfriend <50865623+OnlineGirlfriend@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:25:56 -0600 Subject: [PATCH 11/55] Tweak Woeful Cthonian description (#5931) ## About The Pull Request Minor changes to the description of the Woeful Cthonian for spelling/grammar. ## Why It's Good For The Game clarity and ease of reading ## Changelog :cl: spellcheck: cthonian-class description /:cl: --------- Signed-off-by: OnlineGirlfriend <50865623+OnlineGirlfriend@users.noreply.github.com> Co-authored-by: Erika Fox <94164348+Erikafox@users.noreply.github.com> --- _maps/configs/pgf_woeful_cthonian.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/configs/pgf_woeful_cthonian.json b/_maps/configs/pgf_woeful_cthonian.json index f917dc178002..bdb0175e3dbe 100644 --- a/_maps/configs/pgf_woeful_cthonian.json +++ b/_maps/configs/pgf_woeful_cthonian.json @@ -8,7 +8,7 @@ "PGF" ], "map_short_name": "Cthonian-class", - "description": "A new design of patrol ship designed by Etherbor's Lihmona Navy Shipyards and manufactured by Axilai Orbital Works, the Woeful Cthonian is a small ship with average maneuverability and firepower designed for sustained operations in contested space. While it is not able to hold its own in a firefight with proper warships, it's strength comes in it's incredibly valuable support characteristics. With a state of the art on board medical bay and integrated telecommunications array, the Woeful Cthonian-class is a welcome sight for Gezenan servicemen everywhere.", + "description": "A new class of patrol ship designed by engineers at Etherbor's Lihoma Navy Shipyards, with the manufacturing contract awarded to Axilai Orbital Works in 504 FSC. The Woeful Cthonian is a compact vessel with average maneuverability and light firepower, designed for sustained operations in contested space such as the Frontier. It is unable to hold its own in sustained combat against proper warships; combat is not its true purpose. The Cthonian is a versatile support vessel built with a full state-of-the-art medical bay and integrated subspace telecommunications array. The Woeful Cthonian offers the technology of the Pan-Gezenan Federation to whatever post it's deployed to, creature comforts included.", "tags": [ "RP Focus", "Medical", From bf950760b469f59e51dc5b7e94a4baa06dbcf6c0 Mon Sep 17 00:00:00 2001 From: rye-rice <58402542+rye-rice@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:16:41 -0800 Subject: [PATCH 12/55] Proper outpost baseturfs (#5936) ## About The Pull Request outposts now have proper baseturfs minus Trifuge, since that would require actual map changes and i just want to ping someone and have this merged resolves #2526 ## Why It's Good For The Game Any kind of situation where a turf on an outpost gets destroyed for any reasons reveals that every outpost doesn't have a proper baseturf set up ## Changelog :cl: fix: Outposts now have proper baseturfs /:cl: Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> --- .../overmap/objects/outpost/outpost_types.dm | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/code/modules/overmap/objects/outpost/outpost_types.dm b/code/modules/overmap/objects/outpost/outpost_types.dm index f3db9a14cf2a..1183ca9fd596 100644 --- a/code/modules/overmap/objects/outpost/outpost_types.dm +++ b/code/modules/overmap/objects/outpost/outpost_types.dm @@ -236,6 +236,19 @@ ) faction = /datum/faction/nt + main_level_ztraits = list( + ZTRAIT_STATION = TRUE, + ZTRAIT_SUN_TYPE = AZIMUTH, + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/floor/plating/asteroid/icerock/temperate/lit + ) + hangar_ztraits = list( + ZTRAIT_GAS_GIANT = TRUE, + ZTRAIT_SUN_TYPE = STATIC_EXPOSED, + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/floor/plating/asteroid/icerock/temperate/lit + ) + /datum/overmap/outpost/ngr_rock token_icon_state = "station_asteroid" main_template = /datum/map_template/outpost/ngr_rock @@ -249,6 +262,19 @@ /datum/map_template/outpost/hangar/ngr_rock_56x40 ) + main_level_ztraits = list( + ZTRAIT_STATION = TRUE, + ZTRAIT_SUN_TYPE = AZIMUTH, + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/floor/plating/asteroid/rockplanet/safe/lit + ) + hangar_ztraits = list( + ZTRAIT_GAS_GIANT = TRUE, + ZTRAIT_SUN_TYPE = STATIC_EXPOSED, + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/floor/plating/asteroid/rockplanet/safe/lit + ) + /datum/overmap/outpost/clip_ocean token_icon_state = "station_planet" main_template = /datum/map_template/outpost/clip_ocean @@ -262,6 +288,19 @@ /datum/map_template/outpost/hangar/clip_ocean_56x40 ) + main_level_ztraits = list( + ZTRAIT_STATION = TRUE, + ZTRAIT_SUN_TYPE = AZIMUTH, + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/water/beach/deep/outpost + ) + hangar_ztraits = list( + ZTRAIT_GAS_GIANT = TRUE, + ZTRAIT_SUN_TYPE = STATIC_EXPOSED, + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/water/beach/deep/outpost + ) + /datum/overmap/outpost/cybersun_gas_giant token_icon_state = "gas_giant_outpost" //icon = 'icons/misc/overmap_larger.dmi' @@ -279,12 +318,14 @@ ZTRAIT_GAS_GIANT = TRUE, ZTRAIT_STATION = TRUE, ZTRAIT_SUN_TYPE = AZIMUTH, - ZTRAIT_GRAVITY = STANDARD_GRAVITY + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/cybersun_outpost_exterior ) hangar_ztraits = list( ZTRAIT_GAS_GIANT = TRUE, ZTRAIT_SUN_TYPE = STATIC_EXPOSED, - ZTRAIT_GRAVITY = STANDARD_GRAVITY + ZTRAIT_GRAVITY = STANDARD_GRAVITY, + ZTRAIT_BASETURF = /turf/open/cybersun_outpost_exterior ) From 68e306ff9ee24969db78221a824b7344738f7da8 Mon Sep 17 00:00:00 2001 From: OnlineGirlfriend <50865623+OnlineGirlfriend@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:23:26 -0600 Subject: [PATCH 13/55] Adds missing directionals for SUNS bedsheet (#5930) ## About The Pull Request Adds missing directionals for SUNS bedsheet. ## Why It's Good For The Game This was the only bedsheet that didn't have directionals, now you will be able to enjoy a cozy SUNS bedsheet facing east and south as well ## Changelog :cl: fix: add directionals for SUNS bedsheet /:cl: --- icons/obj/bedsheets.dmi | Bin 62174 -> 64667 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 4954f0954d95edad65353dc69479c4eb70ed698d..c801f5fd00d5673abb337c9e1f68a2c97eb1f5f1 100644 GIT binary patch literal 64667 zcmce;bwE^GxHmks3WBJFQVI$vLr6EG2nZ4?(p@UujRPnkARwZI#E5{1#0W^o(1?_D z2}4MCGce5l*5Enkp8MVV-oM`W{^54duC>?ND}M1jglVcPoj!H(6buGCeOFoG0Srcb ziSX|PIXF@k*24^g5oP&k>AERcxmvh9b#i;^=m3LxCBKWiq0u04CV1|*PVxxdWo|kH za!sDTG^2oWmnn`Cr)5*A$a>Uc?pq#Y+m902{kzJgq}IIEqnENeqO?cVyiM7@6=`*E z9(;l;@}_?bU!}K7(=ENuYI5s*O!h}T&30!k$<17N#%|zs{kWzi1{R7h^Sh+>G8&8v zdgdRt>Psf(xI~*HowDt2d=n+ny(zap9$>dJc7oy3drznQTca0KS3c!G*_sFy2g{m) ;m_PgSzFs!4FWZSRGs zTTAAFQT!l%U7m4jJLB>Dw(wiguAhjc*{At2D9oUIr_1%)&EE>nvhasQQ~DAJe2bcQ zBl-dB>0m7qU6b(V3rLk(D)p-YZ5iV43leAjIIYE E~&N$%#Q#{C70jqmKsJr;)YFWh-!rE>nN$_s_F=jC5F2E(iaF2J_%L>(u@ z-jKAz9v4brx?0#0qRG8dx1{FUnTcIbjD7!pg8Tfb;9F^$BVnm-u;V>$wBJv%6NF>j zZ%b}7T>9%gwNZfP@wHE-+=vJ#&!5U%`M-6cqKL7jpPwN& ;FNMLUv(+Bd~BB~w{W1Lt}eRbSTy`{7oCunc;Gl%qUH?c zOlnl%D-d$ oS`h7v9$H5HJx9O&3 ~iXc!c19#7;k^-+7mU$SQ;S*SU rl#Z{*>91CnrE<4IUzsk{agcxusd7f0bPSIMTATW4< EGdrXaRq z9|o6h+_({FD)2Ha?Bx7TrhBW8&!sb(%r~zE-u#f(-d{nFyE}+6FEF*UqXJ*n!ouRK zF1*k!ZyUk!S6$HKHqGscC%5 S8tXWf28koB>D}`{8$zH^H+Od;SVcueMnnp;5vA~Zy}sfp&@6N6_;2RP zVShg&!?ux7-BeKBGgRa}ji9pAEzxZQ#W&Lv`yHO2MfB{T=7c0AuNx4a?r`UH(hlg_ zHGz>LavG^#4@>gNE_UR4FuetZBC4HtXA#o;f39r8IS%~& MtIsG zPv9=vjehGR+?09fD+>POt ;kgR5T+GGkP9 zeravS7&6btSPVX(NvqLM{dvTLO4Ghg@KRSR1(f&Xjvsywg$^=e%s52;=40%~og75| z#wvC5F{Y@8+KEP33hHf` wO5*)lC68>38`rg=g%DUWm1$DSx)cv#QP&F#z%#m#T{ z0$nN@85z2+8%Z7FF27HZlapU}i)adBF!8(J^Dz6oc>!bnq*Ie^A)IH_gb&^}u-|BY zW8O{jM382zn!15`K>{c4?tomX@`v;W9p@>5#CziS-odYFT_$Ns9oETSJ0f=TOSc6R z6(nP`myoTNmWORuV_W<35ZB)YX~G9A4N$zCu_reah+Q0K?B2=2KJJ)AHFb}TJ=e{3 z!BubK tVlHa%l{w<}YTnzt%|F#) z9vd5@o2%d4(kM56h7W5p*S%X1-X*7)I!7C+IJx6 ps=rt&1kasd;#K==k5OWLi?ZR=xi2%f_TQ^{`!ugQ$f4HRvPD8~l}}E@x)z$B(=F z`-A;tY0|r2W@cV>^YCD2rXHMUVPWanNW4eR+|m#C(%&%96imz|JR$MkC&CjZ#nsP& z2Oy_iUc%wEb2}e(;kQtO@$^@XHH^mQHcVyD26ipo;fv=Ohsq79InxU`lafn*mn9!J zaQyTcYB4dqZrtT@2;Np}Cnziexk#w*5@$TZ!(I*`XEX Up9r6N zUKaqirK6{F`YZBNyXKaR8@I52EId|yzG|s+F T)!@ApqW@$tC`zA05hZeqE O7NH$ZIks_ z%@cf~l(5&;o1!){DP~1Z5{3x|FVCz&<-sQmsTmkWE3Id3Wa5;sryj4^axHU7tcW6^ z-*eFNs~~KP*lvVA510YuT28)!vNtr1ARD7?wAa(S1!xCLOHvJ4y#xJucbb7m&s+;G z^&v*aJlmk~B}HA{tY3!x!taX+bwI37$m`+zpY?kyP&14Fe1kXnPiJu`eD1=A=d udZ# z`VW?fN8;7INlJdO{j|7-h-XIt 90bZZHyxouz_39|3xfvL=@KG;elnPt zUnW1(AXNSvRCF#9;JT%?kxzf&I!6RHR?P%4j(~Jt?m|V;(tV&nsHc>*Uu2saOwrl< z!%I6KN6U$h0*znXx=eNY^yIH{*AwK=O&Q5OD*e@DobjHdYXgvyN18rBZTY|E-Y!j+ zlUeqRzc-9rM=h^Wc2Wy@kd~TWEj>}1$@DOda!96(;_)Z--0ZH7;K|5qTaGV$cGebM zInK<-r<5B)gF|bS(C}`2_<>2b9PD*2M1z>6lN|H;^{pdF*x*I)r %?g1pGEOigoe5cGY9Q5Wvf-WB?j zjq#S(>aX_)J)6vS#!*k8B3YpdNfH7^C0y;W{}o4R^#`M}9n`mwW%Y)sC5Z-3izjqg zE3ng2QB#9y6_qVSMS_Z7#$mpikt};uF1ODd+&0-S`!LUXrgDrrr~kT90+A^I#%Y?L zr-G^hR)7?d9E- 9H~r+?%BVFwz8O-j(nxJNw!@ zeWG9ARz#C8NJS)-jBy&!q@Xk2BZ^*hn%Ho=${fEN+B5025|`fcn00Jkw8os)mSfz; zg5mANr3C^yhD@Cp_>80@O`YQHjyA1!I^{ZCu$x-{aa!Qz!opM1=kmh`_4PqE_>RJ_ zUw;y+y+M5C%n1Sn1q&<8v_MxtR5Zj?fLnDi2$9}JyL0o>2NkB|5I*J<=^%WXI{1$` zD@`?SyfRzHu{!V08mGqJwMX}7G|XR#U}55AOtCZ*S+HD?N8bflmGtP-KM=mCDM<4P zl|NI^iQs0_8kbZ(jkQJXIb8aS{MDQPJZIQWk^B5D6BD*uX=mE4i{N8(TiH`6Qe@Zh zXL@H}_6%)OaWgtHvTkj!t*8H1Hi82T?*57S-?VNNDhx%dwf&S|{*77FW8vf#;6z}4 z4ujUeq3`Xq8*XlIJGod`o-LSj{R;pizzZlTwa_7{7l?WPI)1YWO>&ls{D!2Y{+@k& zznjSYDa?1*#RZiMR1Vo#Z2!4Xt0nyp-R(A|@?ivGG4uo+#f<;>{% z-u%kD{|3T;A>idgH^SZb2g5<}5n__WuN}OYnSb%B{s*u}d%1E3gr{)0{JD}sOE=*4 zFS7JF^c#SNKUgx5KUH20x=(=0@BW36!CA(P%jJ}cyab5q!SITn{&I)qr%F=*f%`uI z;2XHj_sTl$KkcjrJtYn?dr5ejNh=>?h}rql+pT<5BDkbrGscg9z%o?qVZba`S~kl^ z)pLX%;CnkgM{iK^rx=|=%I9uSEaBxqZBWIomNqsv9Yz8fhlo5Qfrk$tF0KaM<&33+ ztcvvJ-6~2}f}Xwu0NK<{lBICiPAy;YsSiVl3f?7K2QmK-yf(2dy<<{}%9s6V6-0e$ z9IAL!NOaSrRHOe7o`$SF&E{`D!!LcX9sL8jA$=(&NhztN#i !J%vQOwynE#}T%Cl5((dU}@T&T0AP zX6QDW7rZxw^FY7fhp(^Of8{7hjuB3O6g_9+LoQ>$LRZoHsbz~_?)f;6WYR>M&OCp7 z{~}UdfI9%yTH;`ktC+!l!Bof$5%A +9WJBJCM`*k2A2j>=2>@F=ox0mn{uq0zw@mEpUP=j9ec$?|dBZ~KXRnZE zT9O)lvN--@hLGJUz4|T8k9nB<=T^=v-flN4m#3L>tpsog2#go*OLU!SZEGyo <36fA5>XHRj$+zub{^}|1H3?B7~KnQ6XNQ4;wy>ww5wp6*I63`1d`lz_4UE{ zqWC|dXE+xcmbZ=CbIg&+`t{t5(TQ0nHYes0cRcSU$#)@HT|vYqFX}RsTx2OqF+ok& zK54HNU-C)ID0)h*9gKI;%fs8fe?I=|y`9TQz156Kfc}C;As%kh*hd^Ki=_244ru+{ z;3rLk9t_Zo>`ZU5sKt6y`^$3l46~OJ592i$!Ud9Eyti8_y-E|upFcHVjCixtH75b* z>#Sc{y_J>_D(~3% (08li1CFHZBtV8Xy|D}d+6S?@ zh&0XGA3shdt7o~T=;`SNjyWi?$9(R#7iF5-5KmU;aw%utz<15KxEJLO#<@vG-b%X! zaWF>Zu)qQE$NI5OIx)&3X{bX P6*jk!>DzF@UwfC1v{U9{K?o^K)L*>RB|Zs%DJailEMuZU?5tk^}ve z*OL*JbB6Z#nXS`Se1j4-G2T5F!R7q)5nqSxfTkvJF%oRSJ`gsR7K1LGSwqO5A-n@a z#GM(+*Aek?6B} |D?(Y)Q4?Eyy_nWP^L-DbBe1=ajuik!VpZV4HN zIac`tI_whb64 #Fl9SqK*C1C{ z2{-Yb2l@SA*$3B3$eL`uU)cq8JHOV<%IX4jD20&F;|Zs?okGKQ3%G|GT{Dd0%&ZFZ zSz&t!OXrK=d^vLwU=IG^VncZ>u|hVO!8|=YfOL>>k5eK2KG 4*czD&(3ty^S1FUU%)d88gv<=#;#x36(}>=foY zL;&@PJZbvKOq`L35{tOghcu6)mG4J|I5MLdGfDZ-)cHK{;UA#z-Kp^eLNK={^YJeb zit%R_Y%$qsJGD=@CErAtCLw5oy07DED7w6KHcSD~8fc=_X7mwFnyv_bThi2G#d&2J z(VqWCm7JpHmuZUrZy*LC_BW({L!8D gePfe63&`x==BN)IcmdfW+bJo#EyQ2nE7(TYV z0~Gm!;mSosMvKH#sQ*$*L?@!~b?2Qq#MZo`qM~Ke8U~HNCFQp-km~>YGA!Vaik$vk z{~*3*=QA~|=4eLalne4<9vZ@ xC;xqJtEWpbofhk7>|>}3)l$d?BstcU zPwf~Zj@ Rh{IxcauRts2jI2y~#+vxY;;g6D|v8BQW!Ppi5vHKdfPRDjYDQ(~rq z7wWdIqT?~1#GFN}(mF3%bCo8RTh2$zN#u$`vn7z`k9yZTRfkv^ox*s*q+Oh96SI#E z_9`r(DWd@}mf;Hq3*hr*v>=)1agIhu53{u%4zk5r#VB8S*@-xoy$AYs24`HZr9vu4 zOg rFo`^lqLJG4#oB**eg!;KKF#XA%K4X~OgTfOm3gA5eJ+doXm3(pg;ZT)5M;tq4 z*=jRO!YQNL)jAn*A@^Gw`?fE9wj5iZzAaon;UM4ACG~S=tqIo-FIi@6v^t~(a5!7- z;bop=Q5k^x*Bg-D!O_(mmn$KINgCLdC5<_Ve-9VkWM03!GRo8Zg!_E`&!1-iH!b}n zD<&4&-F^S#7UI8%?dLmy5+1%vR4}>%KKe@q_W89n3K-CEInIVDQ- g?f|=c; z(&+9v7_7RwTG!Y(j@;YP5e2W- *gp;+H3}UK{9VMVl4b zGsj=vqzH&G>PI;(pT$=Pdh@h-Hn5Jx`alNCi`~`nJGWS0PaITd8cYuWuZ#?@f#a+M zkf?z?rZTNcN=yVg0N4)u!08`$p!LiPbpPQQ)uVRelC9>0`9=hF9I%^58*2n9-P@X8 z%)U}hM5DO;>8O2~v`|DKO9P#ccT$vk;ZSAACke1_nAj#Cbt+kiZ#GJ8>|ub`r=JWV zpbl7+^oBaFQ)#A4l_2m#>+1sQNZH8A$;pdHOBlI8ozBtq?;4+YwgHdo$0b?W*nDB% z;*d*h=9#nKKiJdgvsbMaeFKzW*ap@QI8y>i9WYqY@GDL37d17qdOkv3wC>2REMeJz zp2rccuCDWoi}k;LF~3qwhmXy;5U59dTmRn-(NSbU0MxHVk+QkD8A#qYL`BIXnuuXP z4LTAegaT7jS^rQZN?3-{o41c8B)v(2rV36GRTm5Ez~g?1t_(e?o4-Ptb2laW^Rdyh z)2!#t%G(8P`otzc9iWD2V^j-}>x1epadL737lFqO=y6R=R{_pFWz-RDSVT%37~U?K zLLCvIx{md8AAK;U*n|J_sy-@;8Vm{0tHBniy5D>5T=Z5iuPH42sOZ<;(Qy~)=q=3( zb}pYek(-m%`}7g+U61mt%duoG2Ws`9jTE+ic+@jJG{kt2$5#8t2Dn^a7_=Hdp~MwE z@yWh)640#W`r ~s$MV69 zz%UppwjF%8{G87F+5XBK`~=iDfP<#0!wTCoFUsNvpSzE4mdgb$ZkZ6slg7P!TCXaB zZ32v&={lw8yL<8CDe7=OzRAiiVo>XS90diCydQ1ogk#oPo=3CZ_Vi?+XNb>e?}}bn z??W&*u=#H`SJ?Ljp=}Tp3V!#y6{3vSpd@eJOrX#X;QSVPt_~l2AS3pg1Y1K&RDW?1 z^zc}&aRp3m^C^FUGBQ-E_^Y}J`bVz94K{iQ qy (uGju#BW1jY*j$%R^z HOT4qEaL7K=hN zmh?N??TD-34Enu>G;3(9me1o(OTo*m(dnqJXfJ8??b%)%!u(OP*q+n>fD#|>TQE-j z4rst=3_AbW?(%R5@?n0C$O&LL6ny;}(AnAfzA|sH=k7QWzqw!{0oa*TxZOSXmyn`v z+z!TxYEz5f?c2ANS$J0JPlSFlb*;4VFq Kkx@z+M3Mxvs|UwMN{&2u8;!VW{5}eE zv0_ht{q_w=+@S`c5>%((ZTr}tN1?AAE$}7q{M-IXBX?uCx0Nf>xj56kiDR%;w!w={ zgKlHH5)`JGKEJy9rMtL{k{ni1S$QT>F>E>LX`e|q@e8vA5zo4NYHHWU$%I5iif0Kt z_^mKe?TDutkh4WR%`A)bn(!U$_{*vNtD-ca4ZPKq#srcL*zfH~;A2uXoEiIz0gK^l zc1Xk=D(6n)cE5(|_Wd0Tz{ab^jB3I{qlj+-qpRK|n1jHi?>NV1&=!NEWLr(qb}hUH zdVaH=9dy8byd(?dc%~74m09sb@ISNkZS$=AJc-c^Cm2%5A?y@2owM1cRl|kl<=mXM zVKNR`r7HQSBGGoD2C+H!7gtKoP?QfY<>f@QxH5;jNg5rSSd-!o9d^d3(){t|zj| zKx2f7jt+yHWXd sp?4v}h}$Qp+=JoNd(0o_i%SOo`_>%7 zcG1K!G{mdUP<3#@t#J;mo@LAJS`KW?;WpDaD_ZJMo^QHv@;EDkb0d6lW5B?%Zf@(5 zorWMImALn&Wn?~hG*NEvf~8E>$n$COf5`TaEosoPo8pXt6Vlpxw`^?n;t>wJ 8F{3 z@cjdaumtR)SCKAUd}Gsg=;vUlrC^vF=krDva>X3hF7!5)Pl+S|WaR*m{V2K;C#0PD z;7s@(AZH#MVO3*6y3006jUM`uk_xe8pws8dr9i(4B`{N`mzI`VtFH8F$el)GOk6u8 z-R56s0Kf!R-DFAkFQ52qV()R<`mx8H;4`i|k<+gqYhPUg%PfgNe~;aauZDq_7vZmU zW(M5yl_H0>wl)A@XQEps-6S)?KrSpKt{jU}V85RRRsax%aqj1jAK?UX; &x-|ex&licL(?UHyk^oE3aWv z04xK!qD)l|V(i^yzqh>qq3KRL33SnNSc#=B^d>yw@~7>wd);JSV-C9ZqWgX|;i8GJ zB=6nva;rQ&A&x!55X|C#hD_I%^e+dokKNo< LIxt5PBr|8e1yolbYWSR;lzV5Kjj16qHyd`|`-7d*s?}ZTg$B(&y;8iE^DtGRs zk7!abIC=fu13%(TFKJ+l0zwZQik{P&Q?`A*5>d~)pD1twGq*qg+?f{V@0Nn#{2$&7 zoYFLVOM>MGF(Z|(+`k$6FxrAaB~d+6L$$cI5Y8w{8Q%~Ld^Tp5Oy>l(cbr!i$dtY5 zl|oOtQqq<&^9k6|5A(3yd0V ^@v;m2NHjIuC}){qD1&cVS^c$-<; z>#KDu4p7#%XU{~AIV)^Elns3w|DY;-Yz +_V8ee+JN7{#z^vaup)93wN2;{D*`BI$CxZgS#*MwVj5W5k zwR-3GV^yoM3@hH*Q*)kp=}Z2P$zTG{`O|U6TUmlS(NL0aw`S+RYH52v9lz7;F7pL* z<2u{i%r{p&$)@Y0-Y1>f`(oezvg&T#C+V-D4EYmPb%*bN=D`08fml^jhhCnmzlPtS zI5=1S8}IH36np0`9|tVs!8PF3-4#x}H{lIfu^Lbf!xV@Q_tsEe-3_5Ml#wsImd_zB zTT 5iYuUcw-cUXp$NrngHEjTSbTvw2pOuHin`4e%FMK z4 GL&Ft_~*=>G8T0|QzVjoo7opep>-Ny*9|-3gFykJZjY(CkfNv&`uiAYi01qr z`XT^5NMw!g*v6iV=^1n!#DVMEzvLi^AX4{Tn7Lgp$1wuQw?Qyi#swm!QimA98ea#S z{*sp!&b_h6PUD*$v1aodW{0~ge_MSlAWj1yCvnh}?+*YWQB+a_X7}%bf)FKH{OPnd z^M A~3^=vTZ0pvD;JnvvCJ^6_P z0|-{zaM9ynz%cF{q523HKuUYh?#&l7ZbY%th(|piwrf^^hb4)*O=t;oE(}t6n&V9x z%CI9W3DBUbmr^vv(~#hpbsW0eBDB|m$ExPd%BM;DubzB_HiWvX+0Mys@6*uj0KE}* zNe{7GA4(eCQZy?rB_|TP QkSKBZFqysx7x zYDp1QykBWS>n%*}mDDz0Jeq317uh)z@nv5uV$6Xeo`1lyMqH@K+Th1=Y#CxloGI~J zf4_kU{(X}}X@gDikM}|xu_YD9p jBdJjUUMw3%cG8hf9d*&Yc;7zv zcy7Q>m4IXb&vi`JgVWy&=2NaHn;7W9(U1~9m<5zw7f!FY1z`7;CH}D&lG4(zfK6!O z qJDmCRcwpPZP~95-QV XTQXR26QxMID2a|yi}j{?vVSSWO^voXkf)9 z$d@eZf05vDc4uWhcIqt|wQ hOJ;CuuMNCVAm5Zg-nL0BwGoiz}HF(~Ej2Lu#&CQC%7pq{|tgArt~ zbA5oXHf&jB#zyrnG)_&OtvOt#V)ffjaI3m#ctY*+#0C+Jm=) q$|2%U;9k?l-cST3;OhX&_YQ1iokwG$DcEE})?}rg1GNAUW?1c( zg{1WU{0-3HzY5=FKbdZ9d|^$P@4Upr BwGBmQ9?q(P0w16g`E+0 zLR_96_`ami>rUNZq?+2_m|n+T=NAMYH=e(1a9-uY{LUcG&t>zT(a{`N)Zo0nX|bJc z@f`wLWuqeB0M!wfcvok^&-cwAmtFU7&I|(nph;?tjxOlg)0%wzfkBpy8}C>BlH!q% zgttU_9$jEz$;(0eObOud#*dErYuDDAa=56)`snijxJI)ExRIQKEhxSP(+3A@w5sC@ z(AyiQows+e1R (3YL zur7Ku-)~R*C(P1j5a}{zzreRJIQBx>Qr>k-?yO$z>XO4P?(;#TJ-q)kDFkSw^m>>~ znR`O4y6j(ccD ~lI&l^_c&^Et^Nr;FmhRd zL0pJ`KmK26D6Bys{B~|JrG?94{rgIRzI8|X5VL__!GaR*X_ FqAc12#s-N2|de~u;ccx zsLOOh!Re*jB^Vn*(ebLq8Xz3 ?Xac|Q*c`B%YJ{W^=eAj#}=CwoXV}9dp TTFOexJ_CB}*xPd3`5jyT75c4l0m9GS8a+4-?X#d3>J>9-nGJH4= zAe7UCUxJ FHGQR1-iszV=^zB@}n*QwUt9D%GA^pR-ntAtwkO-BMeuk zOhsTXRCQV2g44ICTvx^89Pi%Zo&~gI9oN=1K{<#4Wcnhw_=c*zL4HYhkS?649C0`O z_#H6`UH@|oC!l-GEx@kJoVxQc`|UE!upq!&G}s}6q}-f{zM5#OoJtZd`XZ6;Zr6rH zyY< $s`Ea?5LzeIPN z96l>JaZ#M8xCdzoA_^USa3Bz&X &!k}c_7 zb_ylBFCL*<{GyaltpS>GvD?6x4z?pYG~|0_={hgO6w}Tyc}W_I#Xgu_FjW6h5+-Jv zc`0{ M5m2gc$s$9$pEUOLoCUNE=p%$^RJ%C&s8$P6 zSxQe7nd-v`Cy8xS#<+bf68Mj5#Bp)-lj8%?Anx}!+}pB yRI78c9iqI?x5JQ+LY`YCG1IO)xOmj%4*!WwjhlZ(gKGRC zr!OhJ%0VuHBK@Uf%2=hT5Pv^9LXTS8f1#l5bLi-k+@Fsb;(uE8H9Rd+@u3AORzv^+ zhF6w-vo=tW;XiL1IkF6fpJD#?o>l#%0FXVv7Eod*`(@UcP|_x)sbjTFUM)L%51 z0p5Kang!Zx(oNjV{emh&M7*)~gBY+1yqU^J=I!@@-75oRp(|&d#F>F-0JgA8{x!N9 zfTI92ers#XUE^jXDWjX@nYMzjOdaC!`awrO20Gnpwl98Mb$N@gun4hwJ>@+VX$`mR zZKRmEC3?ED`_=g_j)pjg@6Hm*wk1st!W?lHAb|P|p|Bp%b&h#@dskP(q*H*^u@f9w zL()T_`WUk!(?I^(?7`_gDw4T(Ok>*laC3z*dwy)zF#If*J=sU59t09#**a$?`j%q8 zGsIY{inxxlfKsvtEdu#XL)Gw+FOS<6P66lVZ jTyzx-Z?HYM>%X1LwYxhM<2ypXwYx<> 8$pcr!od>o zM4bphtmtscN9ckG%<20bfg}{a(WRslwru!n_ao0Szmpay^yx~6nwJHGVkZ4GRYnD9 z!^Qrm%M)E~f^mgmdV|wl$b*~^ml8tIJJN6SuHH1tr|MC(QcUGqP36@iw7zjf;P8F)9IN(coS6njeVXSn|P*KZJ7s zij+mMRJa>KV*bzP^~&h(L#jh8QiwbK(}D=JIq0N05P2^LOl8fodbog2CdPnv#s6gG z^pc~X*Ps#qACfp=A|@!vzNh;q688L~OHdZ+p9or9kNp2mp3{HF>@BpW?*Q`4Q`7m! z)0X`0fql}C5cxaf36SmJzY?KT!_c%a{C;N8>n?`;a7B_$Y|!=z7~Al=z_as5#Ik)` zEI951vb)d|$a@)>+*5aG*ks|Kjb3bQIH#p{$%T}vBsSTxEn=zhdox{m1m4zbaJo>a zq{oDE2kKjs<3GRYz3}*X_e+XZZ!#0a6us6G=D?AEx(!;Zy#IY}V@AV)a|FWpY@4fb zO4#p@o7AAv{PK1IWIXJX1A}biOQ?MG*EL{oC)RFNWkkqDM1u^5809l7e>`dJ*gQ#B z1kOZrOwoG1^n4ef?!}sr&$NamuMy9diTZ$x(Fztt2=U&NDbdh{xF`A!-O6^o<$e72 zn?vcaOl)3(=a@Yx$w`bYUGM1f`n+K19jYlHVPMd{a#UekGBrH-s%+!HOj^pk(X=+= z2|ER_!a=%}vO&@(LSj{YyvxTHTY0Y=yjGQ~@ADXW547zgKFh7&Qr|!D?I@J`LI*ON zD)8u?%*SLo4I~IBm>(ZSY*Wxo`31Y7C!wuVpS$y{vod_E6+a%a4SCofw?ZDj3=giM z6odJB#r_>23ltm}y5wqgab}P6r^py{jV%SK#^d&hdNzbbe{I1TLkJN>{}|DsAm66E zT;f$!)Y%oN+INrr%!xkBb3!K1rjDE>Qv`Nt;zknGYE1<$#hSg2^3yqimCJjA=h>lv z0TODD3)_EA!stC^yj(fAaq&+JYIh#{L(nhRL(=8)&FANCUJRhSS+aPO%c+Bi>x|mn zXcd&4B5df_Qgc%<-L|I`t?@kzR}@qKL1to`NJXzTcs<7v!)qRuEY|5YoLk^%PjHp7 zfx^*t(;c;a+cbQ2Qjl%}b()Ys0BDwNhg0 _v#{54eUpX}gt7QtH>l)!oihrTW_8tD7MbQsvC zf=I2RVb+RU0d(Ogxt>Fb+eBi`e9d2NT`9_P*7lVT=Em6?5mk?}A)Fy8qt80`BMd0azL*rU-0dA4=n9WZ6?Ot-Qy3hVF3Cd#DMqujOU&!IXe cSM{iFgy$L9I7r|O5!~_`y1+D bze)sKSLi L931rGlMAt0;?4#5?mZPU hpw6~DyAN`uk@m<($k$oY$s zZoQic|LlpC{_KzZRPBb9eqeoLbfM@nX~n8xG4D(Z$fC16a>VwxkbXF4T|`?n$JKq| zg!wM+im1a_h>Wj`*KGSE|3P2op|buHDc#ptXkH(lJ`wQtQTw+gnTC0)?fen)`wXM_ zA31y14s!Lg5etvL_ahO9&%f{OTt=!lfE3CU^@atvdK)@mMgec6&Iq~`SEy%~2pRm^ zS$WEQuy|VcZl+nW6-*DwTuPnO5l&Y}8Q&3BS>wzcTJ!BB!+|W#k~L467c)>7Y*Y_a zm|V++H^ux}a5!lJDb)eCOZrg%ER-FC8esNasd3aY-2NsEwIPgoeR<{(Mfgm_RRbvW zBkUmXp^PNevWWRbQ9H>FZ9{!GL=v%P@%q>6C49U$J3I0|v>EyEWVYGI^99ZLIC@fa zvX}%~W!>-5(S5d~ GR%3%7DkK7lKJQc>eaozf#8#a`pUjy611bj$w1~0E zHGjs#Rc~gdQis^)d@tswKjzM9`skQqWTGv8hxryj4>gEx8q6ZL@UVpgL?(sTiQ3}( zM7` -LpfgO!?o+?0(h808 lpRsZ}n2P-O5VRpnj!jZ>UL=wvB;Rwd*hF#N_5S4fY@M7jA5C|- z3Yp(w`Vvi%Uy_mmP!Ch2B9ISYuUS_-q~5e a;jVy! 7tJ(0TjN<3>ZqT_=3R$O>H9eqI>jT9BN+vEbE%B+_|2vXvG+V1JuuHAtrysdco4 zm98?D5=^9WlawM239u;6S?8Ve-Z_DR z)vxY#(|`;V!YSkZ5rI$Ek0+hPff0Ir U3)e%XxFItyUt4 VPK3*=t2~#obtKZTZq0J#4LPh z8?0R9d)w;7JbK{IJ4(nepa;G_Lt%un8KY3`Em}esV30mT;OqD|VA^ARR<((ANo2 zS$Bon2)dI84LL`gCK-M8fN62%R`(l%fa)fBUJ;^V%^@4Mqvnf0$4T^k4S$Lqa-+!A zrnI)8Ei+U z{i~&lZx0>__&z(Ex>|GU2=`V)GSv+l1ff>ocerR@C8ZIeAbw*3B1%vlFmax0y_V5A zPPAr3LG-p$4kYY0G&BH}H2|{)V#japVxW{K5Ch@}QNOe^U>Pe2^|CmXCkuFyqrTC8 zy(pgXK%#>HwECxMxQ&FHkg*$<9Yg&+IQ}lJ)SVH3Of6WHO8oFVJHSI1!;sbpchz5= z9vapo$`}7Y$vELd`UEAE0yOXVa6Livw{^;Rc}~T-{LpN+fXc_!{69i zsY31eB6Q&)PU40eAK^LpImN$Hg1^Ek)3~)PBd+#5SOqD@u-Lkn!m*^LoXa#*J99 ne`dpX-aEd`#gH7RGJLqB6g)r06%?Q|!rH?JY3{Ppx=^ JI-Ca|Eq& zpYe*XvgndY3Y7BLxnZ4CjTfGB{4LI^8b(*f;&DEljB%Sh*OIX;Sri_>00R3X3a TTHX2?l%aHjElh~(Y zq8aAg=Pw>IUC-MFU%j`&pmu~D 4v2K2i%&QA{_Q-007 z2EiYG;!(GOP@0tYk=K}?FSn{x5!s_QsaOw^jt3FN8*`w!SP<$asM%SB_b2z!pFyB? zAcizNdwu{}Lc2;dbJp@f`Wz*h_%c1b`Jur4Y28;@6JHHXMGUTQmt(Jj!$T{gcll4< z`R!8dXywAJ)1q==$5<%7EsgtpX1jSwIW|)Si12=Cnl0JYgppOC`=V)8QL+a1y!(Zl z9}#^eQ} t1k2 z-=C;nRob| }U3!s3m%YuQwE-pkd8z#ok+F3D7J&S5!T? zwdZ9v6T4J1eh&Go?>L?z7ve=9B)m3YZK_qPw85`H6-UJQL05x;KDm8alMXb-e{YO; z0pddX6@F6JkYhu&YIWKiw0GaomE8LnvljFu7^J3xzY*cle>*G3Z+Mem>ERT}jdJ )f#o><|*1-#`+Vg*cPZf~nak zrNa`GD@%$@9I|Dc1xfp=$h#j8-{3#B=HjpN-BH+lyB$)>82cy(!wC)`Kc1e)Wo;pf zW;`a%S0x_dnEZMFBmMc?Rxsb6OzLM(Km6}xO8-aUuOgYHWo3;wQmUmqSM8R>_G5Ml zIn$}WtL3MlQAc$3Rs70k_ZP_Kb*KCGlh5_gr=%d>4afL@|ACw(1}u*MaMTH;Mg$)n z?&&-UrD1EHi}I(=8qaDd?xO5TXI5NgddlsWb1bY3oXe?Zt=TZ^YwMq9|BdzE#I0d5 zlF}Qr@;>KlHtBx(ZFSJKRN)VnzR=XqrTVIWo=f+gPkVpQ#S5csafGn}hzN?5lI8VA ztQkrAEf(*jzijc}u|)(_uMLGwvdF_~8xzkcB1H2K?yk>wzt#jPv cs7KN zM>9yP%7+G5kK(H24ML@AoEW wKS&bT{b(&h?;W_I}Au z?v655o+$nSmCx;-9CDq}-C*31m=VvZ`gje5oPmVvO`w##xEZZ8P%y~MZQ6hkQjX@~ zV*u%1?1*x$Ly+Q7=36C_`1|KQsPqSbxQOW}4NBuKa@b8r$odzK2W86rjFP^d;i_7O zVI@|_IB>7;W>YIoz&3Oz&|dPPjP}-skLbj#Nn%V&Ij#&-Hr*Ta>yB~`u4zzrB|&=- zvfX>8>eY36jSTieT}dUny!30_?m{Vo39)_@&HmOm!V7{JL(hCO3`OrZ%1u?uL1$qT zm?(6>hZ#xO&Gn1Wmk~lkUh<>`GBeC}pn_!wv3y8Fx#rihqkKhsVyEJ2^>~+9xm^M{ zFtodgo}Sk{V;HlHMfaY|ZT)7 zPw)NPd;fMemXZKKZ_ENyM-aMYh-Ds={)!}&pnoobVo@*4d&B>Up!l9%P8Cdi_1R4w z5jSg$f5HH;l^ThJwmwe-i~IYd+q{p{!c?7ZS|y!lJO{3a9Odt)eyz-fl?%HXih - -M)d)HIB-IR2y*M9rAuUvE*Z}`<`tb1Q8A6i=i`T+4~PtEUfn6 zwb?Rb!6+WrYc`Y>y~)Q3--hm#5_io!{hgy9Wv%+}EvgNRooC$hI3e6e-Ube!0zOY@ z1>CVEr<{BtdKrn2v2
3BGJ5$(ff`~qW BO!cDxJJl<)awb%C$($yi@JA~tU_I#W12{OAS?lSUwM@0aYL za#ar-LKgeQ(PTnG3%93xd)&KbPl4}{qmK_8ORiYsE@7g_2H)seWg@;s{`WhMfw74x z)JJdZZ)g;?m#u{D=$D&sJ8U7di`J?>KeXX0?#duMrf!opkt(ig+CNW^UpI0aT*#m{ z>6uTwGPUko$-h~5h(kY0t6?QqeeEe)$pIy}uz3%44C&Vm;PLl_?83{I^7aYe@9@i% zSQb;!86G8kK#i-L7|pGQc*;LL8)_=}>M$r#bEJ95-&~(_%WbdD-LS&{ZfX6;DDnWR zW%$`t=68p=(5j)mn-J{~F7Z9hJPe5ExUl?P5w@Fe8D@18iXUG+wNW0Jbt#DnBqtz# zf;Du_nvUcWclcm2wAJ`49BaEsSY+m=8btF-_px0ks* q{8y4I)Hyx^*R`Ni5L)oW*5AbN$uabx(teR%wLMt={n>UHK9$DTl-J4$bcJ z5xmhq<3|a@3)k(r`qmXWSK*2zw?n_5eA{)dH`f32(_`dNeGso{iGgOC9!o=(m$DUn z1w|_xRwVolRe$J%p)n}fQq>$Ze7TdZclFp>ghrkxqjnnRPv!4dZEHDjK?frc_up!m zKYQlEx<2X;IXGV~;p#Ld |DwqPvdi%2NA+%T4I(Lm!=d}+i|kS*<>?dC!S3hhIoCp%wc9LjJg)o3i}ZM+ zsRH5;7p~W@5GW)0nrkW8+6L$9^r%11(v@5xo!04rJK<6uRP?=`RO*1;+Pcw&Xc&_N z|KS)hbmo`CX28*-rmn@|WSp|IZ@W_yR-VgXf2s3?7e|Op7SmPWmVle2b0fo?rZ^rr zy?G&kHc(+Z@cp_O{fjt!4k#oL)30ORxA;yZg DlJe|sq8%cbU;W`1MheQ5H$v&h!XOhZ^g$9N5 zm|PdiU9jzSoMt_r8k6H1EC- ry@gvWJBZ zlb*JEGhkV}=~3$`KWC+ZyzC?XKx!WY>%KE9Tu=twuvfyS7*SO8b#tSwS(tm!_V%O( zS~p1VniOyd5MJ^Ttj!`@lE8N<2y!ND{W9k=kE}EOK+zETCHvzm!*`OPu_oLJmFf_m zS4<1ySF>tQ3);s&84dUlv?R7kC9DiNU($P8cT~GmLk`@S-|gdvy;719K54y=IhH0u z=en@*NtLVfoctpHvHFDw<%T-wF)d>Oiyji)eT&d(BC{+rLfrCuk3f&g@!iB48 y1d8ov5%7Pk>( zIz~}FJcW+d8Wj~ay+k41WXWCljv4fiq4d}(gIU3itQSky-)}WNc+-!+#1eF7aeB$E zesS}Qfa=uz=XbEs3pa_I)x|Then*c+?9TJ_&J$t|+h}ILE3)RKzALAv@mb=(C9v^l zxrx8O{mEF~WZsXwkVe9dnWs}KbJ $A7Cp)+aLs&Bp{6{TRexO97)dQo`Hq9%XB9%sK;QUD_#CFk2X``XV8#{Tun` z)1h|dudSUpvG>2=V#|7W%?{&(j!D&;P2tG; >%!<;-z5m0^DunYAl}U(H_7%m) zj5nY(fEB;*;7_~t0$bQoLp6ZB_oQ&RdMSxghpGrO=PnqCDL#xaFb3-b`1DTNHQZ|8 zMgxW==%0En#&~b(5KJ;XJ4MeS&6Zd<69hxr$Y&3Atgr~NWW89@q;qGmP?S>(sHqAg z@HOyyR7q)1EY+)R6ydz&JUz(7MCw54-Cm zcR0>q) Zpn{-(e#bwk#$95w4h8dKAp7ZG&S8;$RFhu zc)=^0q`(;0+%C5_TKb1Rg(XhueWmlX%2Ef9?&8jZ;@uRu3Ftqt!c}b41#{r3_g#~{ zSNc=OdpNPi$SGX1W$l8xSrsGA0G&fA3gO5XPS-Dxlab5~-m9n;77djt#|G|j?iY8? z;Foj-mr2qQVPiu!@wqU}d>Fsf)&*>zx><}Uz+yV~{p(37M$s@a56wIh&GxdQ)(B0+ z1EnvDW*Vl-XayIq_>042|LaZ z&5gaL7u@wt2(XuiQkZwIGkQH(CT |2Ui`D1wgTq zN4NrVup=*EUnNOT>m6gl34>`rNBSHkL`&7QpF5)r8a%5AMlOUk=(eS;%{lkQ_1ZWg z&A$6H&a0~!l{_yX^!3jKAeE>pe8_i?Vh? qVCPsL0$Ww~6{*P;Q^d-7a}4g|hwDO?-U~Q~9uJ6aN FbNCs#0s|hO#5&=>F-8#}>Vq^~E{nTLg7M)cR%wqpX?Cm^r&bL4VSBqAttMaU zJ7bvyTKa*ZCovapNrvF9)0fX#4wC53Y0m?!0hSPIFm +yMb5=1Pi8 ACYD-Xv=QDtTHmIJO75?OWv53tRu$3Fy> z(a*X&=D<-;ZmH+_5!3cL1}aq*0OA9k6#lg)TY|>RBqNs9i27yk{gkmA_jO_?1~SDG zRob%phm8(&k=(XXGU9|` zk2RmN(QzAn+ L@*Q?nAaJs-=b9PIG5<*&)0~g{T=sR{8^^P8rWT8zIK1dl zpa!=kYP?kLkP?;*#ER5|Kn62?h~7erZhVKl&dui)#Op7B<4ISO(ojoa(c4iYR?>w% zZAqQrN$`8iGfuk`4fx32nlshu-VwhJU7^--Ui^)rZdiB`3z!U~cJ8+)9e2P|Vy+Za zr;#=mLXvxcO$T%h)2}Gla}QNpF3a2?Fx~1sn|#E}8$3NtrKZt|M_c+mZA9o^n_uC* zOw0$?8R_slC2??68)=%#rPd2Ei5VRa%+*1$eg4LSR{T_>D{CI&CSr=l-j<#&wOZB` zBP(P=Osex~b;Ao)#uU4Tmo&a-J0zKI`;F)9)0P1nbn0FQwBB@S2O(sCmhT~}9+I}; z(D~7eZp10lYPa*?5J{ZG+H^(V_kQv_lI57cr)5xzodYUysoW`*l+|4KbpNnxztL%h zLllyO3aLJyhwXLtUz7MD!b|N;kTFt+?qg$`*Y)PkNw(_<^%qBaA0M`8@*#&V*CF0+ zlxs63S*q2D@!#-pUMUFsGD`Ve1kybG{X*~2xt9lfl;)42mMoRm))$Pnvr*`2A(Us` zhJEer!Q>l&O-wP8Pdg1|MD35a*SYTHQJ~g-r~INXK6d4TVq=GD@>urn$Iy!26_BR< zcdHEi!ja9#`_I;mVHf!CE+yeF$V=e91~y)rB8=ANznht`KIXfizgvs*cWhih{sOkQ zOJ)SbfIAVrwY5;u1J*+H7W($TkGYNWf4y;$ipG4sXQ{Q=Jka4YBaEe#w}1csO?t>< z+GIo#kn3f=#&dJ@hyG;(mW^={q9?eL`#Ew=)&tWV#HgfFJ2gBSTBkc|sq-buNf$gS zbv>xUp(P1lI7LLOWxIuRucZMYK9M^wDwYSjA5(q-Jzapm=bAZNnd%ZW>#M%@LhLtA z)@tt@XG!?-8A63Yh%cXxxF!lNY0_5_ C=qe8HJ~Yq1Y`#a1_+wH zD>~nUt9_^T0+a*w$dS}xSeF- i{PL2Azlt5nw#aS%dW?KBVS&UNrm} zQMJr+4@D8xSE`RA`+1 sk?(7Mf0k!WPX#st|($NXHB|J9jA zqM*zPy80H7 #xoJL z3-^jlDzWKKX$Fwkq@1V`TaMDa@p{S%$&8RcUleXy;AqB5!ZDlzzpC#}8}6(965U6OyZcYtfz$3)H6&O+@3m%%Ff{4Zamm zm7FP_V%g}f4C^bsl^aBnb0G^*JB&T=A9tXBepq`~Q{GH6Zw*RVN^u~w=M~3@I^ZTx zUXP!Yq^*9@_r${DA*TmRX~@{wl@k{PGFx?83JJuU$Piz!2FoX^lgeT&8^CzO`mYrV z%60A_U9}7h!aJ!Rms&6%k5NHEINwDcN}_OZy|L*Cn!p8RQ>S@1ZN&~JIdpol*?d^> zsB*BTZR5BF`1WiZFYzeuTx`#X0gFX8anW7DlO`yJ-9)L}HsdGv5h{J0?quk8j(tp9 z-L+-I#aongpV?!baHawyZU~O^^~Mh5i~lk^syc+Q!TnXdFuVX8H`YOTR(C~CC=mIK z%Hv6C$ai3Vw1drsSM-qmnl2KqdV*-@@GAwX ^DK^-V~x6aVnP}m`3J|(Lm3x#TeWp>fgnFjf0?R}01;xEso zi4dp}2&Bby?&EoYtSn~mk1`Hf2ChA*R}2(&5|c8>8bGzeb9ysiQM$B+UB!-6@CG+a zfW!*i@!K7ztdH%+&>GU+-Cbdi9~g>aVFx&z7?6+R$0YanFl|d)C}K`u4V4B(5mni= z7L)r1_|xRa5G*!M+XarTI16&iTiW75oS_>y-}Tdp!{5A``{8~u2UT#{E?{quUn9u0 z87Tcz7H&t6*8f+F0%vwxNAs&6P~LvI^>jwQ3uucGAt_Xpb;M09?p&UJ2^GQnPe=%d zzJ_${kxF>8$h<`)h(nMl`wm4GVTZaOBG6g|$i#~$ccj!0=?L>NATY!UHkfJ;?ry0C zU(wCCH8(>fFSiIl%cR{xFs%UIZoDSF9UB-~qBZ+EH5Y M)eJsCl4Dp7lWT`sq;XKzmyn{PcV#)*tTik zYD0S|EkWqRlLr8t*a*c!m+)}`$uctR{2~I@KK$W1C>Km4AD #OP&}O(x3}8u-crx=bv^^*aAMj zr d&l57U|yn148k2~1AgJ2)5!8#SJ^t5~Yra0L&!89Lq@)k2(e1|EL z`z07l9`#INPvbQulRb$BnZ;A;lj|uUK)(i{$uMkmukYkw!|D))5BpJ<@4Tmp>&P02 zy=qHhyS}dN>_I34Q$8M}1*7{hSVHAA4`&Y`1jM%Y2=jr^V`kkZ>l9$PEH&mUZ7B*j zF)BVj-XJOYVM|WyoLc5miMjpUgv+P2RX40< C z&dw1+@kPGZ v$71ahY$2tws@*o$$%;Ph{T;y2VsVKjKoj-MHDI$%wRc zJ7XDf{f3_^hHYs=r1Z$tdX0qy74v8LtB0jGJCC~Uyeo>)?<&Y}_RX$<^}cX8Me%Wk z52x;heRmkOql0YB{s(4+?eL1&Tkx&TN>=hCmo6j_oHR1;LMmkJOVD&J%~d@M$8D~3 znw8U{x}c1>+xH(|0D)A@R)R3+wg PD-GAain5B_@``SDapi^PPnk9 zko|$10PJWaHd2Tn2}tbIR7KR~pIa TuoVHEDfsw?C)-fneF~ycnvajqQsv)huyW%@qE5 zzoR#aV`OS7Jc&auV!rf%pI(Hdb!Xc9r#T$A>@Zufza%qkRSx$qt;_zW;e6RS?V=Y2 z_5=4NE_MBLUzbtNI#SGsGvg6<;Krm#R^7*Uc+Tl>>pS20ZeQ8B@4lNX&%WFpfENOW zKwG257K@k8N%Rn8kMRZ5p!>Dk-Iq+HBk$le&a=xue{N;rl&}O s zM-?({#Rpcql-}U2&CS3$$F2f-lUb{Kt@netXSXu~Uz@xe3iww2^9~O*o4l(5ch6k| zJss>-+ !ZNhNiDH|1p*;6c9h z*=Q*}K*3ObVPmLsg7@>Xj9H#so;z7853=4{iCm*~b|6PFlJC?%o3h|gb*v41dm$|L znb-I1ROuZuLZ34V_!#RVT;uxgM0Uubmp3|^&wi0uS6`RFGQZ?(=puxQ55@K))p$T2 zNx}t=q)p`9T)S-t#+fMc?c2BLAha9Oe8j|X^75FN2N=XWDCHpXsc9BwUSZ+)cR8MG zwSW_K40zSm)i*acrMv2UcJQ7x|E|69wCARy ( zXZ-`!Uk3m~a)eq|i5w%twh7IvpyT&p*yfo)u`+0v#YAjR>SO)6x{}|J%bhNbrixNH z_Cm7>5j{NO?|H)ciL+Q2(13v@P5q_t=b{_pF3UGVWo>SDcD_%BGAFKAv9>r{M^J$? zfcq=D;H1(rOWTx7M=(xVHxQt= =#n1WwF>90y7!Q`E>?QGU3uCT1bVvMAVywC3Mz@1V* zn3-RgK^tc-XYyQ0SNCpw+#{qw+{X}UdU{bs07qP0c+qMy#u3{rnVbgB19XAz1A8F^ z@Ulf#tlQsKN``l2jJxV*2TTLiACO{zhJQ&W-Po!(x+Y~5y8cIB%>`3V6O=QCd2I8Z z#;fSA2y^zg`kWEZ*s%b479i)U^e*jCSTLC6V2{mE$@WgAejq_oo3=x_75*v6`4Yd1 zpU3U>7>n%p)S~w+q}IniBNLvKr>Cb4nk#Yq_RsHNW3tI59Kqdu4$-hh)W*XEWnmhP z5C032;PMZ|a3jdYOS~$+t8Q_S&E0`pkHJ`hfp$pKN@p7L0gldj;_@&2&zJZuUoR5Y z0pv4^2x;zJpp0GTxmk6n$;4;vY%u&du|0>G8uW-qPV?gEY!8DOA{R&MLT1NR4wSU_ zgWC3*w y1N{nMf&VDO>Og@A)S@>aR%~5%~{vpr!q?OFC%9h)hh+E2D2*SP058 z>q %1pJS72$e5z*etCW&o(v6iES;J9g6U^(Ud(hFCQe@Kx@G&4i{h1l-c zQVAuwz!Wc8hKx~*?Xu5dI^ayFf6*R&U+l=^yU2BqqQ3VYr)Y_OH@vrFD4?nBCS>8y z`h#-M&Ym^H@*;u#3`JURxe>Aj9{=6?@=NIDPoYD&)S(;llmnUq!w)#0^R%lN4j?q~ zJM0k8gkKHidZ(=}57h_cDCL`g@}uT(Bul-lzQDv$*iBc>8)fTfVb6~HLY^UF_O1m= z<=Fy`5Yz?0tqcs!g(^F}DKR&Z%uBW?g=BczCAR6+^u)6iI63-8#S1|j@WS8ZEn+s$ z&g>UsfQO=F?OyQa^c3<%EdGPO1*t2pkwXGH!8Y@>FEO0cL@?RTIVl@jQo?G1B%D zKo UNziqLE9$4;nM z#ZX4R%NRu|=e9{qz)9SzsK3~&O@N5m8jR>UvIybU(hKL;zqERZ75FcHfCBizg%BWE zjaNkB+Y55U_mDx%P!!Rv&tEF=#f28PepruzM*v+q!tn>lkMkj3q5JIDFSY#xUZj5q zo?m0doi1oCCIOCVvghF#PwuWLks%fJh?w|?6*}zI(c}=LlJgXv6!*FAKLgfREe{%E zz-vEV^TRzw!?wG{#i?@(UZm++QxV`(N3uo%p`zu82(rKDEV-Oo9GVP$gzg>l(`nkv zVZRV6pO}%1Z`|*hAVbi$D}FfX_oJbp-ivhTm7eDppmVGDag 7-M zN=izqwH;>%PClH*0e3CO2U-j4Uc4-=ezohqZB|;{y6cf!UH$w-kC5AbGO*OsW4Sey zpf> l7MP8Pjp0Y=>D+!1T}~?a6eCEBNL(4>wKD>>QFU zVXkW$ZU=JgbBOi-ySB_OaK{Z1CN}(OYHstU4PE46!Y>aIAxYubvocDl;%TLAcAU@t zz+zLmE< UKf}>NmQfukz>U22)9a zyw3vndYo?RmF06bW-*R``pEnsYqDxR{}J-RwotA&Dxi{IFb90F`^YHS@x_}GaX*F# z+cQ^sDvkhE4iH}e5{(A$#XE==BO(Y|V!f$g=Kh>PGyuCa)zJCRB&2}rv;d1trc7n< zcwKVNt55!sy27(b!(%W#mZ|K8Siwd!P1z!B_;Ol*rJ+T(OO=p-MWx#>lVunHI-VT| zfL&Dq*V>n>^Gh#nLw~PXk5;sNp@3^2*4&Wx^(4dp?Ene<@`V`^STP#jJxR>YskaPd zHQ?G606S?mT$6r-xNTo0ApEnDh{L7ImPF@MS)4Yv(v=ROl+6IYAYU(*jcM-^%eT6v z#XezVTdK%OJpO1?Vw C{X@ z9fQ=&XFt}E@)u{ARkd5wcEdo6;W6B>;`#n;se*ydv9^jpqUmwkEjFytW5UG1%I6Xn z%2#qe(IKR 6Am`&zb)6(^lT7XCiKOlEy zsPx^B{~b5cuW`H&EF92RA^8|1OOj}f0iY#YjG;jo^b3Jwn4kT1S~U%~)okrSgTN9G zDlVm_gDW*vE~0)J^5TEV&BX*RG==2eE-(vR&znD-OWkfndy`0B 4P?3ejD(mXrwiz~a-bf0M-p0QKFgB4S7uW#ROfjl&u!g?{rL3sN2 z^~~5)n+G-|TY+A$Uw HEA=nBI;xjhbxkTvM^6 m{7&cF6Diy;BT%BUr1fl@<`uz z#eWy=_qr~g``Gvy52Uq18|3ErsiN4)b?mwR#GR(&*Yq}>J~bP>Yh6Ex2@ytaybkmX zdKF+mDIQkMQ#^R&M+w0mTDo2fN#WuC70+4N?7j--)>nvut8)t4x1TE!k+z}8wbDei z3kM=kvfk&Quk{n+VuNvlrLoVH4cHJ9)>A^BJV$zK-GjRErz#9Nlg7zm1G(;187nh$ z>-&zJ&FyX3^ohu*IJa6iTS)qs(BX#usJJX#BXy4tCvw2*M~r(@4r=Qw_by>^Rqc~a z{ordaj*s}YWS{x%L~dz2fvVYHZgJt*zrKpNE3Y@7`wf9_^UIYqXC44eJR8T!SF{9c zrYfb$3B;%1<)I>oIs;n%MCi99>r-xM@kLZLTp+IdQ;WqDAg)EG*@HUjYVbZDURa0` zaa&*P6PgPgn5cf~_2wpFJ!Yw?8<{`_$KuzXLDML@n2kC9IHkmgp>Lf@GcuGPWgIK` z;jTF=+x)V91tS6C#gKY%UrEC`UsJ%=t%gNfL9!$$!+@ds&f{P(?X3CDyDsErBUHD> z!RctZn {qC|U2e#}UBJxzXYsRNbuK&7qkxWq2;zg{1%|eJ zdj&t_4?L)nB*uy}LHq(yNj?3K7JC#|cgLLPf&=>tG~qtj+AN6B*C^TjW1}&5h>8&*(uR6^dMWRrmq%+q4yZe1IiL)&zw$z1XakMp z+QqsMJXJYQ2T?X|E6<*^Y#KSWU%Ns$>$MV b9t3k2mNpgWKej?$ z4netJ ~H$=N5X!#R{IScfcWN>B{%E;8dDTm9G?}X zRxC6!)Bk&A>4G;e;PtzF4Nz-yz8*Mv1@v$UP@Gl(!%|y5<-$d$5a03oKwse|VEua! z1gD%cpp*an`Sa6{AJfFeb>cLh?(S9gAV;21(_vKq<00_}S7C-k0TB9sYy)*Rb$9NJ zoK(Uz9uvANmU-B?Tv@Z;s%eXwo}MnhOrlTe+Vyzd)E4ZMqF!y8eO&_`FmLkl*YddB zZUJP-E2tBp{UJ`12K_`~9c}HP`FWGd%1W}TFd2s0x!)H97N$MT&CUjk%N>#54J(Ei zjUG-+PO|pxISaqvTCWARy`9Q~glM?4(1~sSJ-XA5L!siN@}1eeEv9A{j`98}8?>UI zoz3v<*)vGDARovE_}zLWC;kjf KS8@dxBYzQ57SwgEoN*2bp{NtK81q0 zH9aluC|Wa9^x;ei_P j`2#$asA&3*=FX`;s?N$g;& z7G^S5F74+E-k*UMEnji^f`Rpv9&gluaxEBKfcf8@WGn#EOW*wOiCdhv1P(S?CVjXIvZ<^o{i0Ff$KUqB2KEgbC~ob-XU>1}eS!U-YK%0(E)cuoXEN}>Inv2m&^I|GnRy5M9ev -a1XEIofPK0~*_)29j6LloRI4?TH4%6JG66SVN}FYtKlFo+G%@2ZL*J_|s<6mkp+ zmIpkZ4miM7_~j%h_m-UXi$SlV;e|3t aPCT;h<6TvRbJLn?9^a&1xfTviQixj65_GFc6=YHAV4d3G~T7`24r|9<$?z zcCx%0P5ZFQvIHa+KWF-41J!^Behir*+T7q&LGZADc0O_Af6>BHT)E@IrtYKn%LkN5 zN}WKhihegTd94&j$?D}-jJ{xPBGB-*&7iBi?QJxR&~@e)01CmcLIJ4(WIuoGnf&(A z1l8wrMs57+zxfv<<+vtIcz;XJnegUiHCbmQ8mc7BYbF{VjnP6MFuSs2*{CZV*$v41 z@Q`vfp9Qngfon%@*z D9;61eWb69cjb-iK$X zF#LR`BDIT9==wh^uXiAL B)F z*Kn~i7t186Mj+#u+7FQc!?(@G86yCgLU(T^^tEx}7+a&rYG#VJOn80Ju+WHvB9-{) znGZF0Xgol@De36+I(R7R!~u!XmmAX%GmW>3V~u9Od=1{gx5@cV7XB`X7KAwkvZhWl zPp2=xkiuFw3aZ{N4-)+=BtDr6j(BxIGu>1v+IRdC0_4T>6sN%nCQOU##qDk|4XIqD zpYOx6a8;ErBl&v*f31}!!=51kRLRc4Ay2IeX!qWDdbX{(u1#qI3VGlW00L*25|ls0 z#I)_7NA7(amn5k>?_aw|N2e%Gt0 c@c7fuO9!<0O`td`CAw1b3lC$1$gk)G&C49 zH6Em@q5snm0!A5n8p4gKU61 ZZ*f51dFPRhL!RH(Jq^aRM0j>O8aI;?5C{RRX>UY*OF@PkKv@A6bwE-dCqazc zy!8ffRsbpnz{ys)o?;)En8unarW}2B_&A3&emVZJi)Nt+L;*cPG9YCV%$1Yjv*GnV zNpM }AIlsC9?~#P3(&AZCBs!(E-;F@{AXEM)rHbJ!rEVVR-|G0w6~IV& zyVbS|{U7iKIM$?8TJhZ*N64=SCdzn3xBe^gdKKfXI)}R#!d9L{fXO!LsK!VX_T|Xw z(JRUK8eoz&eenXsOkx*~_ew26#-tc^&OrNvZ$nSIL$uL0g&@FA{Y+0U@=f>QL-I&A zL-l8WF>aQplz191pI6-r8*2Z)IeIj|q&m~6I@LD9Z>gK^QZ5uxCtyxZ5Bt#R;vShW z@j}V1#Gh3-#0&IVTXe658XMmSbkX*L)F20NK|z7n0z_#V7_7hnne5o#*zdQRgD}fA zEzQho5eMU?0lLUsGs0iRFH)?0SK|~br>q~~h Iybb1fKgtwKBDQ*z_m^_DZ zPM*WXyBz~Teqswj$640$-Kh$e<7qcd% ZGn7rL0Y)wD*|{ zWON08DSaUk5qKwOXE}L!^8B~*K3;D*&BMGA8}PXMtP&R(W{1li<)tJ*#vz_{todDB zhMK7{?c?WZq*88qN1HxJh}y)lJ~BzNqQh@$n_=n1OtWUi`ZlTegIddYyJw84D-3nE zJHdw dI(IQ^gsFFhhhPtK6=J1hwSCfdbk^we?g7VVA z5v~#}!o`Y_q5uYAQ{jc!Qv>A(f6YU5)YN@I|0>(uD2)XZ&Zox4%*}Hsa7;PyihvH` zO`Y#dC1_Wrs{>afutwb7|I{@#F2jLz^~7AgsA}%O-*{PJRbx;+wOi}8BwljxTxEJg zP)yFFn4cA+%K*5((g9DTdr;U=*Fx?;&Q|DZnKC{LE%F~X1j#!i2U)PPL$kAA7MWC$ z179p|UreWzqmYWRR!v<*U2j4mqM&1+OP|HdvY`@ouV-KCrtc3feXF~A$PAA`3WAid zktmon(Atp^Q_4@GEcdSReZ(4{vFCZ=NMvVXqu*04Z#CZ~N#=EAO6gB-6XBRna-P|$ zTQ*X>Gym}gP_FMW EdS_x2wqfu2JQ;wy~^Sn@^bKk%=9ovTGwW6inv zFYZRJq4}|~+*>tNAQAeijR^p=PR_DYPUL$Pfj-y)Lm}=`39<$r?|vJ-`+dIl83xRW z=ZKzJSK0JPclR9FXAGC2 8r&-ykElxdyZ~J)bCN zA?d1*qR72GU&9g4AJpyxCMTJD3i2U$@eS4DJv5E6oJzCCKO4%{ea#wY`lcLBB(tD= z1cGD$#r{8#G04Nx9AIM|Rv{!Hunerr9|xvN3xRi|qGH&WnckGh^>s`1DVBZQiROao zE?<4=fK>9(zvna#8#EHn#eG)oGSD9$&Ri@K_uWfob&e+c8Gx!<1o0~%$zZ-lX7I#z z$G4~X7efYY|CHl+$MF54NAC*z`fTPY-c(hvVZg(Q)#>r&xr0)5$S^2H$sYwsU||!9 ze}4VQgjIYc4klY%CKDcToW rab~acLR)%gBw;VteBa06SB>+{=UjOrUUwR0u2-M z^V~MjjZIp9fjB3x^_*|tNcL&wa=R&j+S7$PoC %VVEU? mbR8{Y8sg`+rJH_+ zO{mtQWp2ZDo!-!j(z!5UR*AU*Z>2?xnjLFqNZHY^!mmTY2HxAc