From 2e7b30fd159ee0442bba6006650501d24c4fc427 Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Fri, 18 Sep 2026 09:06:40 +0200 Subject: [PATCH] fix(world): Gehwegtextur aus Poly Haven statt Kit-Platzhalter Die Fixwelle hat loadSet() so geaendert, dass eine Textur auch ohne Normal- und ARM-Karte laedt (Befund 2) - richtig fuer sich, aber dadurch laedt public/textures/sidewalk_Diffuse.jpg jetzt tatsaechlich. Die Datei ist keine Betontextur, sondern das Platzhalterbild aus modular_sidewalk_curb_kit: dunkler Grund, roter Schriftzug "Tru-planar Sidewalk texture", im Browser geprueft. Vorher fiel das nie auf, weil loadSet() an der fehlenden Normal-/ARM-Karte scheiterte und auf den einfarbigen Ersatz zurueckfiel. TEXTURES.sidewalk zeigt jetzt auf concrete_pavement (Poly Haven, CC0), denselben Belag wie die Parkwege (curb_Diffuse.jpg ist dagegen eine echte Betontextur mit Fugen und bleibt beim Kit). uvScale wechselt von 4 auf 1,8, wie paths schon vormacht - Poly Haven misst die Kachel mit 1,8 x 1,8 m. Der Kopierschritt fuer sidewalk_baseColor.jpeg entfaellt in tools/assets/textures.mjs, die Namensnennung in run.py und im Entwurf nennt fuer den Kit nur noch den Bordstein, und die committete Platzhalter-Kachel ist aus dem Repository entfernt (der Kit-Ordner des Nutzers bleibt unangetastet). tests/materials.test.js prueft jetzt die neue Quelle, nicht mehr den Kit-Slug. Sichtgeprueft im Browser: Gehwege zeigen helle Betonplatten statt rotem Schriftzug, keine "Textur ... fehlt"-Warnung in der Konsole. Co-Authored-By: Claude Sonnet 5 --- .../specs/2026-09-16-strassen-design.md | 6 ++++-- public/textures/sidewalk_Diffuse.jpg | Bin 52868 -> 0 bytes src/world/geometry.js | 5 ++++- src/world/materials.js | 8 ++++++-- tests/materials.test.js | 8 ++++++-- tools/assets/textures.mjs | 15 +++++++++------ tools/extract/run.py | 2 +- 7 files changed, 30 insertions(+), 14 deletions(-) delete mode 100644 public/textures/sidewalk_Diffuse.jpg diff --git a/docs/superpowers/specs/2026-09-16-strassen-design.md b/docs/superpowers/specs/2026-09-16-strassen-design.md index 6f034de..4be01ec 100644 --- a/docs/superpowers/specs/2026-09-16-strassen-design.md +++ b/docs/superpowers/specs/2026-09-16-strassen-design.md @@ -90,6 +90,8 @@ Ein 15-cm-Bordstein hält den Spieler also nicht auf, er ist eine Stufe. Fahrzeu Zwei Dinge liegen damit fest. Erstens: Das Straßen-Kit taugt nicht für die Fahrbahn — 4,2 m gegen 13,4 m gemessene Korridorbreite, und seine Markierungen sind europäisch (gelbe Randlinien, weiße gestrichelte Mitte), also das Gegenteil des amerikanischen Schemas. Zweitens: Das Bordstein-Kit besteht aus 16 Kästen mit zusammen 351 Punkten; seine Substanz sind die Texturen, nicht die Geometrie. 177 km Bordsteinkante wären in 3-m-Modulen rund 59.000 Einzelteile. +**Korrektur (Gehwegtextur-Korrektur, 2026-09-18):** Die Zeile „Brauchbar als: Profil und Texturen für Bordstein und Gehweg" gilt nur noch für den Bordstein. `sidewalk_Diffuse.jpg` aus `modular_sidewalk_curb_kit` ist kein Betonbild, sondern das Platzhalterbild des Kits — dunkler Grund, roter Schriftzug „Tru-planar Sidewalk texture", im Browser geprüft. Solange `loadSet()` an der fehlenden Normal- und ARM-Karte scheiterte, fiel der Gehweg auf den einfarbigen Ersatz zurück und niemand bemerkte es; sobald `loadSet()` auch ohne die beiden Beiwerke lädt (s. Abschnitt „Texturen aus dem Kit" unten), kachelt der Schriftzug über die ganze Stadt. Der Gehweg benutzt deshalb `concrete_pavement` von Poly Haven (CC0), dieselbe Textur wie die Parkwege (`TEXTURES.paths`). Der Bordstein bleibt beim Kit — `curb_Diffuse.jpg` ist eine echte Betontextur mit Fugen, im Browser geprüft. + ## Entscheidungen des Nutzers | Frage | Entscheidung | @@ -203,7 +205,7 @@ Der Schritt überspringt still, was schon da ist, und meldet verständlich, wenn `sidewalk_metallicRoughness.png` ist eine 605 Byte große Einfarbfläche und wird nicht übernommen; eine Normal-Map für den Gehweg liefert das Kit nicht. -**Namensnennung:** `manifest.json` und die Zeile im Spiel bekommen „Bordstein und Gehweg: Just8 (Sketchfab, CC BY 4.0)". Das Straßen-Kit wird in dieser Arbeit nicht benutzt und deshalb auch nicht genannt. +**Namensnennung:** `manifest.json` und die Zeile im Spiel bekommen „Bordstein: Just8 (Sketchfab, CC BY 4.0)". Das Straßen-Kit wird in dieser Arbeit nicht benutzt und deshalb auch nicht genannt. Der Gehweg kommt seit der Korrektur oben (Abschnitt „Die beiden Kits") von Poly Haven (CC0) und bleibt deshalb wie die übrigen Poly-Haven-Texturen ohne eigene Namensnennung. ## Chunk-Format @@ -239,7 +241,7 @@ Die Ausgabe bleibt normalisiert und sortiert (Fixrunde 3 aus Teil 1): `shapely.n |---|---| | `carriageway` | `asphalt_02` mit `ROAD_TINT`, wie die heutige Straße | | `curb` | `curb` aus dem Kit, mit Normal- und ARM-Karte | - | `sidewalk` | `sidewalk` aus dem Kit | + | `sidewalk` | `concrete_pavement` von Poly Haven, s. Korrektur oben („Die beiden Kits") | | `markings` | unbeleuchtet, Vertexfarben, ohne Textur | - **Tiefenpuffer:** `POLYGON_OFFSET_ORDER` bekommt `sidewalk` und `lots` zwischen den Belägen und `markings` ganz vorn. `carriageway` und `curb` brauchen keinen Versatz — sie liegen 15 cm tiefer und sind echte Geometrie, keine Auflage. diff --git a/public/textures/sidewalk_Diffuse.jpg b/public/textures/sidewalk_Diffuse.jpg deleted file mode 100644 index 1e01b20fea93cf841bd3f15db7785405184fac7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52868 zcmeFYcT`(h(l08vQ#(hnjS17nWCM-KLE>`&30wjV7LLhPy8Lqn5ow@hDb^mzZ{rAmYXD!t^I=gD`I<;%p`Bk0c z;bS)73E<=pKm2(J+9|a`m;g@lAIUb%H!_~z~FH-&Eg$>hXIL7!8n&z(Mf?&hTnmu~*I+wngE*M2+&I0ZO) z;vV3KYbQ=#J8|3w5Cxn7oD^I-0r+=2edeq{*bhGn{)JpU0r=s>4?mnbd*R%lmj$<- z_(3p(GuN*Fr1I$O4U6ag6@54FJ+ux8{O!ZX$}d8~YU&z~Et8TZtz2Jzy|4NtCTH^2 zQyaIS)io&tX#qnq0SAF5{&#U_&Yu49Mhro{cHEtbH3V0S-UZwJgqur z0WO{tNV|6O8bBX#aQol$`w#IS4g5y~|IxsIH1Hn{{6_-<4V-K-$nCE6u9#o7BjN6^ zzdP{k*-c5YN~x1fOO;RM8K%nCnLy4dA)AfGP6hLW_e9JYU&1dnr&fm>R_S9Zjhe6q zn8ML871wuVde(Vpg=eqKoBO`Ks)0Z1Zu#)p(dCIq{-BiY-jo{jFiTr~y8Xe9=9HW2 z;QU=-9}(xLy?V8)9PWNisfW$j!f#|&R!HaX*g((3S}J`UN}COUE}cG~WKn$U;?{-{ z*mmx%bycqX9wuzmcO!Pgea->iyhs{J)|Wv0yPSbecRCc9m@)?m!?>@OnF!gBoI8(d zJD>l4&KdVs9nYzoB*lHX(KS*&XupZ}{5D-|d()L`F)7*L_B^<7)R5VW&*F4S;f?`f zrK`>_Ea>GpP>bX<_KpOy-&RK5(=JKZ^Zt7I`d7r|w`K+J;vIeLb98mIru0w2s{7bq zrc#`mh(p7$%+Mzy?L9YF5MR^6YdgzDpNHdB<`c~&%d1MsW(q1R#W%#m-oCZ_ytK!o zC-zO%=#Q7`sBX2sxeGRH0VRX$xT_ECfak^ymA?;Fq%=s~lJE}Lz9U<|+ z^+04>4>Vm$m$?vqc8;HIJC-~)z<}x}q?ad<4eA0Cdt1QEJdUH~dSzVHS?GWDc_X&F zI#TT!NX?8!B{7HT_AMcCBWV)s4olgd5+o8~8!@F#Ev3&kGuAFjbb|&kOJeokCzU;? zpsRCk4w;q-G-+aF3(Gz7P2p}i`4}+2qo0N;ItJWAvTfrKHFXv6HSb(0w=~^|W#>bu zu{dNv0_|D%%^>@i=5AK7e3HV?forhU}(iAL8qdCg;EW}UM}JDg_Hz?Hy0VH zv{f{_OxRiR@BDqZdsR?w1V3=EiqdQAsQ8o zxn_z?mEESo{A1BnaMs4-`(*i|&1s7Vp4jUj1{S3XV1t!e1KAo(w|2dd&=V6M`#eU2 z?KgK67~N>jwJ~uAqUsY?t?Hwi>5^HhNYCMRr}*|r_0+-_q)-J zV`#K}Rl5flS|MAIawz}^3^8CH8grzUFKiOGpSD|xD; z4mFR1I+S6QM4QohfqT=X?-TnOsNTG_>BDn}uvfl=di_mtIJX$^5N`S5iO_MaGs)l= z>~eK-@J@WyASf=vx^XxFUgaX}2o*PhDA@LOxmrTOyjvCHxynY4a=_n5kaivjdB=nY zGF{+!_wPsCx1*8k{;Jp5DiS7Z-xqG06P=SHR!k0)^=W8_w@h*RI)bnbQ~jf(gF^IT-;)lQ+oZf-!dq7G zi?ZBuSY&pTf)~7?0N#BKBt6Q-$t`o|0v!?7%SDEnBq>63t{7SDj`N&wsxNQcD(PkK zijd6rj9&sf6~7LX(KWFQ=i4O6)DoQvk>B79G)+w|;q(Hjx&1R(MH%AMB8*2~^sLj; zY}Iy(*XUUkn;n4a;t{ca8(E<*#O*O5o(7orc_m7V_QimxC)4a{yiWrR!Fw^>$V^An_pRP(3>1-Tt|hhsU& z?v^H2^^ol7K!Vm|r%3%9CrdV6KFx&$qm+E%u7U-x$W6@4vULETkd*re000ybJChqQ zU?`@c;NA)B6RZrvTx6HU%YfvsM(QH!O7eyYxBuLrq|zo_pKT-$vIm-$qOPpEmZHkL zwaX93hTRDSb$mhWVY6w+$yLUpAP?3(_x}VA%L_M9yvL z)rI3u&!d+gf~;ozSgxt>cqIY5%Aj1|euRPw9vr6@9VZIT7t4={3YNi2%o!JLO8VbE zirrIkPQ0Y-n7n;^_1m`6$#1-3)qDy$LpPUblDr9V!ko8VsO0gT#+9wGxi?k=?8>S) zA>aSuzzZ2_ldBmGiek1RwIsxAB-akNxHqWi|q$NEb@G8=oC z)>hG><33ohPCiD}(+N2e^WFGAP(0RWJPU8knU#oA5V9OcQBu--6bEm1MTJu;jNihY{97>|aRUUiu zHlHRerXjnXK8@3VuuW$uZ9xlpH=0W(7R$gZYnt@u{KpgS*1@?KMm7p02kIYs@OUBt&jT|F4Vhd3ZX(vtbUs(;AsQ%9eF7Y z0UHamPJDA1PNk;zcK%t3lq#zrcYyTY7Cn#{n_to{C-8cnuB@a-=15ZdlHy3!6`ofk>; z9?(h}nXf<~Ng45d*dhe`+C=xtN>u$$`;gPk?U4YZAhaZ1F4gh#$Fr8XUk$5=?VY?strwSmYO+L~ zi^hQQ81Q?~RdgOb&Zv+MPiM@K4Ru0IsmR=cYLMS#0r8TGYl)TEJq1VVizmf?Lz8T^ zj9~4hKI*gOrHtiw8(p~#r3(8Q*0IwvUm~u}MbYQUA&@8ea2N@1qS$4&x{yK?2P;n3 zuA|t?VsXaP%7+DrV7GR98DsGcqRw}(iTz;0Ds$*P!T%Yr6m!*=O+ZdKCtGEPFAX|U z-4SC~*GkM(!6bJx6R>LJglB*n+c#u(!CQ%A@+u4Ix^{bg{1~9t0Odh&iO>*0Z>mM` zYG_WmkzGmpd$Or(-mWfp)oGA;cA_va^5BqF(nWN@XK$Hq=?TWFY{(=pRXfr$o(k)W(O1+>%V_Ql%jrvX11 zyv}ETO~_XlqDdd>nd!2dY`In}g*qF&_l=Z$RbOPA2C=p-5sG>OPo(BhOd4{pHdCz6 zmEvYs(5HXwl^zXZmn|h*6i~e_UGE`L6X}P`&SQUkpqY0hD7+0k{a!tB#Uj3*m2JNN z>`h!CaPOD2byPg=qEzD^PW(u#SL;;bm+C0HvCr^QdV9}irD^oVV0zWOk>dE}&zqF` z9)`rpo3=6xeZKnn<#A@d{Ra4L?cT_xhlGl9NBcpCR|S;~mK&Ly`7gIj?8FpIY!ytX zvLzu;(V{Opo$QyA__3BBH1LoYPebc$!}eWtkR)+JRafvWj=r=GcWI`mR93h9UH=~B z$ZVf=$u_NbUTEt~ttIw!r)HNzokssp+le}Z-Va%sceXWtTx^lWv+1)2(^I7rVtW?l z-5^9j`d-~VgJLj*l6&b7hW(0z+U0!&W$7_z%%(9j8Qu0`3ilH7W7DEuptG&X_tAT` z<-SF;Ejux-#zM?+B3V<*z|hm^X)pecs4GQ?$exuhUnkB6Y4T)!-3u&_vl(& z#_gUp{z%eBp=GCmjnK}NHSy`>fUzyjrrDi^qyZ`nV^ac=or&jkZf72;YJmA>r5byj z)mm9bg1rAL+v`SInF(Xy{jM6Dyit-g8?&ez#LBAI8|;pes(4Yd5od|kd8=St0x~km zHtx^N)?hege(x*uVeO9cn>31C?~Tay_K7hUiIm01em3<^+WFY~)xhcR02^KuE&leNbHmp;5Cj`UC4t{9 zF($Up9RtQI)qO@R6BNAtW2vW?^>$eitf9TZvGDbPC`)6{LOHdhW$-zGSpUy}6ALW< zD7(5w9DgceA%qp7Ahw}s1ZS!3Yoz@=ztG*hO?-`B?~?hA|Lz;ozpx4IIk3NCpqsm9 zpITP)scWkEquK5Ue#^>-2IpHoNHIyso8sV$qc#o>hwqw=Lo{k@=&{a^ET%4NC4j*5 z{G)^w2aXRvF&LXHc7#KTuB7$NFMMo;mpS#(rE<67GkX}5lTEqstA(cn{VIu4+m#Ca zF3)fpcGvrY(90(J;)qNX-)(pZ${nb96QK_6Xn>-dkuXG$z(`y{pMqQmJ-+y+>5Zt+ z(`wR#&wVBRSUM;aW6Og%4Hj~|ZIW>aWD6|7zPe0vXs+Cmr?}h$T#J4y{+?eptS)j{ zie1{BOFX?-4mOf2**!?+zF6^PG;=3~t(*Q<}*4cgsaMo++z zKBQ+unJ=18mT1EIBk$*PP2^T535aUtzL=r5NMQ2w!KY7q%{0uTl<)I*ry^J1M$}-Y zEgE?wjRRm8BvoHskJ0+srXDP+6{HxV5O4<}8V(+^UCD`<#AaA;eJT#0qo1wToOjrsoxX-!lCC-+hKK~JOe?d@ zJa<8hl2Fa{LX1n(Eju$8zPv=ci|Y&73!?q2m43pB>URe?>D=2Yv}p#=Vy75U6O$FS z?ULNBR$gYG0L#sHvjkU(H=mB{<7A<#bGlNPmdUtv8L6dbb$WM?>O+?Bb^@2QMUtoQ zkcxn)@EYofG+qoLhNIaNbEKnBdy@KX$_l@%Bkwj*h8PU;-R>gP^#twb+mzQ!9w9$W z>y7?TUEJ3&<7x=PjL4|H;PHGpO)me#h4y}o7Y7*&buY1bUmBFPv zK~Wrs$de{c*SX{S(H|@E3ZHdCdd7#Ef8Wm6ob}}Y?HJ%5(zwNc9>P%-dY?hCNvz9Q z_Gq+gQ*A=%!4x31YmmlcfT#cusZi-SFzA~{)+2)H`}@?;9ZZX5Qj(XWXL4+PQEjtx zcTK+~Mt-TLRlfTXgS)5I(yzX6=~6W*-aPajV48pg0KPR!MCH>2kGy8AsHbEHbO^>D z13sV{Y%(l(6H3KX;gWsZG=xOqcGb_*S6F7Kf|ii0orIqc^O$>x?dKQC51PSXUb%lx zgxN75viV36LjLFFNs$XRF_}GXql#my&$bE`=rP1T$}vERQ1~mQ<{0ou->6Br#-I;^ zP*gpNuDCb;apx(me>5n){%}^VW(c*f9KV7s@1Mxge|t%CNYXfu7 zRY;`dyQLzo*<;m0wBK=+#KMbvfl7$B^~`>Tgmqz1wy_kGZdzn6oFb)GYv6gILQ;Mr zm^m7Xu|*U7H8Y23_B^cBKc8;ABkbOC){^&&m+X8X{(Riox~Z-(*k;x$Ie88B05GHT z>wn+9{MF;c?>oRlGorwv^g~K^|F@G*%Ps47!g6Nkuv|0cLVbTv4?XvNoDoxT;hbi$5I>|>~_@K6x6d+(bag9@YxUkB)Mgs4;?O2?fSJHIu;yk ziNMZ4)ve2B65Be_Glk2}fBhE0cc~I%`YxO5*n>Nzg5|_GvfD}DHqoot%9dTHGKVqU zxkp^cL8_#29--&9%#kysSLk1<7&t;4+g&((BX`tWC1%$c zx+lqeHKGxZXHJ>{wVA{VQpbQdO&g2e^%xLPnkarzEk3M*YDh_(GYF;`ecwE~Vz%4Q z9c?MZY(gtq(op&eFzV(_VkU8khUuH#huwk?&kc3t1UXED)e|6(Bc0e)_yxP7_K%Di zdgjHEJRBD@)|%6<~CM3J?U?_^AT!Og@dXTns;$yxpy$KTl(S!_30=6aSs3xxfQcA zP}j06yiajR{p%GYdR=kbyGkAiVOWn3Wd=Js*`^Kf4L(5<9sCGz@GbhZV z7Jo{6jq8MCY?jp^@Rk+aM0+7W{luu`BlK$Uo<;*_Xi)y)#&_-}GPIji_}dWZFF!~( zAnGbc%JA<)N9f{F-zH`&_VRO833`VgTWD@uCNfnm529`M`#xhH9*n+Sb6fu4e8OGC z5OAV&kyuEUP=Q#DjVWL5+`~WGxVZ%!>(5_^%z-J7hkNEnk1QPn-bz%)!y?>UGnQ}{ zvIF#baTJX#P|W)DQ!{pG}t+Dm*mFOLChPZo34 zrk(Y^PbofK=iE_n`mjlr+xi<0@?)kPH;?%=ICzSDSg})x&;%D1J1}q|K&MOMY#PYX zw|~43agNp*2I<{jn*%(|J0-1UBojBKc#E*%QYL+M`S5Z#7-O}=yRgqV*~$vzp~$av*O#mVE(m_j7XO&n+uDPM*)mO##YwE_k`)G z^4x>+HI?zm_6=;1jt|uK!N3=+xQm!joaKib-6bBYaq&F7Omy%($V z6?G^E8cArd=zjW%iF<$h@B82XExaqdtH*=hooUu}d@d8Q42f{RsW; z?dK%b<_9cFeZn!oCRrE@atfJSZ&K-L+aF#r(g^W?J&;Avn`pXaWSX{B7Nm1E_pA)Z z?*7Cg{c|Z6HDgAd5+Tk*hj-|dg`i=Qw6k=i{dDyjp2vV ziiUT%SgCM}MfFU3=G?|Sw@Oi(=p-8{)|Sdz-%qykb#zMZts(A&@WGFH>D(K=GJh1V zEb`z(x1Fj|=#N4ma7B%7qw!>z)m@4t6K@~&J`mDJQx)k3fA5S8Pun?>WrLN^{j*zW5VHSS5f9@7u{nJ229pv0@d65MV z(MPY~h;9%c)Ww-Xtm(|%a6YZvqJg(SVhm-ICLJT>#2rGovQ}|f@z%amY;Nvz%`H+f8OSx~XaNDGNl9sVQNcB9LZRYEZ4iy8uF!YG}xMh#xBZvExbFDI}nRl_`|^>*mKUg zq{pYD*BJ@Qy>K`9b+08aKAgRegMK$#9j7{DQLzxYftl?Ql(>sb&h@gZqtHgE7t6yR zVg!P(1raBC3&b3tccFZJLa)Rf<6}V7D-_KbzAu(jXQ)f|GD@0VTM3A&?xNpaIa(Ts zcze3#b1N#^YmqX&igm1tQ(Sc~Fb&Ckk=I`Awed2tve0t;u8)wi<1DzU% zDDs)vZH>EnB~e{YNvlVVG{{>`7OGx6tIf{B+@|~4`mP&I9(&u5JJa-(N8UOHyy*6= zryl5{fj7psBx@0Voi!*O1S6|`<@SpGA+JY}5^VW45G)cIUUKJWkGvPuusK%M#E2+#{fG}`AXHNkp$_V=fNIQ$cV4YW0Q~;(Ywn@_DM?)iz*+L+w_2V*8#d#Rwk6r zM@OIA*y}q-6Zuwt+7jR8QOwf`W~K(~>i(f+9n%UKZ?NKFeibj#wXLyAeCXQm*_{}n zXd0-Z4_>y47k;rC?DehGU$N`w0L**MWo7XzEta##fEnoWpod-UT`Nh{s82mwt^8!@eEHa`htzhc zZH+|>Z{4+z+nvaO*%fG~6C=dth=1U*ZR+~{H5Kk7%)HVYmhH1Kjdkym|*sDyY*#di0X6YgmTZhaQnO!0X^gu>QG=5peBOJ?W3xIb1!)%j9Z zysG}a$$||%_0aoIqBE(y6sTvE{Za9D&cQrxc1Ax=A}Dt5f^7fKkYD!-bZ49Vr{7an zR2j0h3Sj|Kht>Thow=nLKa_r9Dj{sN3Y$tEvpZ)aQ2Z*Dwmv_-9OQv$HZ09!GM zm?pEzp)toS>-LG;bu7m0VxoCM`yr)xtW=HY=^)>)VdXgFS_J3!XWi}CmgSZ!u6}pW z0^gjP9J>i^u0oZ0SoW&87F@KZCN_y!-lLR+J_Y4ycjeU#okz4ny00yv3rdtF8Yz_*YPLnnVI$M&Zw9{IWtSln2{hPFlD6XoN){6 zVjDE9>ec6^OqUR^J)3ricb%~eIu7(HooJHR#Tv70Byr%NQ)gk{P}Koj!!GS|`KfPH z7&DATwXzFiZvHIz8|D$)>@Yhg!lR`@|Lr%z3%2wM&V7hsft|3c+~lqKXhvu0U58GG&9M&P}|_&8#^N;91kvioohuDBEny&?FnY{DJQ9wD_eFRTyr62 zWt!>fLA9N-5QpF4Ixz9Y#FOmTezfk%$?{0#1wWV6hj zD$C(@OSEHJqSd)KAJ7+yy{Mp|F!k+BPQMau)Jufs*roi3ZE}i)owyQ^rnkEIWvw@| zk}Kf3H=$f)Iil>ytU@@V4P3Q*=owkxV@tJ-^QzLI2jZUHNb@SuaYn2PbLK{NFEPgz-9+2OSOT6+(2gFz=WAHV( zm{ib1_)!;-d(Djf1i%96w$(Nd?_m^se zZltO3;2PUCy!k)^#%f3LfkVJ#)I$miYgFr!@32j#`wp)gG<{Mk&FQRj`i7)(mv4i(G-DsWlvWG65H2KX`w%Ta|H>bg))T>wy@l?M9TX97^?Oq+ z%U%)c#m>K9cm2nOD_7RuSU`}v<$^te z8sbEJ71yqH*DF8AQy99wTgchMrw>`gj+CNE?!vV^Euc>%gC8E9Mc`{{Q(v2L#n-6zOFdw`vC^dPA{NA?>+%O=! zWej+{YfkP&qBiSju9T7S>0~}A^oz$ zO~-%)(8NEBLmKjcVDH>jA9-ul?6wU8jXRXsBQ-|&Y2st6NVYHWQh{sTL)&B(c9&=J zM;cO{Y--v@buxvxY2IhS1LgND~2(g|e;FR^1 z+J+1xlc+7S-p%U7y)-^CMcqY&b_kC6rHduh-a20Dg5ECY`7~$rcO>Lm1qB@{bhdAd zB{{5Z1RP4Y_7U$lvJ(eMW8@zMM11!gf zZfb;-YRi4C7Fj+bg)bB!F0dZf)G@LqrQT#Q%tA~15plH`lGh;5&iqYjvn(oToWMuepY%>=P1a%YYg=nR%vs zg&L-M{jwe`lQFrr9i9+AfZE(Ig-)hbcV%CiYmv!XwI6pl253mwIgpT9Kh-Ru7YOO= z?lcE3ltaMW*)VeT%mo>{P5es}kU!_*DVWPA3i8a<6m$^55vasP#}ljrN-+4w*esV3 z-gwvfpm}I^ElRot4>2=TaO+Nd=td66gf&jt&{}^BVY|_AVu8PAGMTZ=gM~rS{V8kx zf3Yo-aVbns&o+m@U&7u&Au`zpbrf{I%Z2io1JjVIevh|h4F9HnYtEbG00&t1=$^LN zHN7dBo^N3?;r(pnm*2CRE}2P>7Dkofv@>|?{3@=BUV%*Ib7D*7>q7}C%|yzSHC~Q9 zbXV?E@qU;bM~l2S#X?;vT(yskyp(0R;}T!0S%CFxF_9Ucru&X#`cU3;#VDVm;eqvF zyBMCwu1_yx7->fQx=2*I9=Fqn!7fK;NEA&eHaz*%d~vVdtsC;%fjh|8Y0=dnV%_#g z!#Qhjm!xYLE)74v_&VXaRBZ9uNX|WPum12%9q&+S!7(H^(9`6#j7VULt##GA>a@t^ zsonO-M>Pw4(_ytefr~-dx>np6>cX4{UG&FU#3rj=Lolnl>3Z3|t{&3TIt98?_o^yi zr^=WlN5aBVI{KD?y#wA?2b2rjwem%c7A%$+t(68%SP{H{U!P^@Sbf{{s-536ArT@f zjazOt;N~^N<9DU9{AU8D?jA7ptv^Qpi%ET@doyBl9X6sk(of#Np-lTY&!OGg+&9|S z#;WI~6PfcLK9juXDe4dEWIEO3pN9|uQm1d4`w=>0BAK)8pRztUh3)xIadFz*?mwEA z8dYnS93-WQW``vqFFI8bM!7^cg?7C31=H!y$UvaeJUlVls%HI7@wC983sK(s(WKFF zvt`?{INs3+YLPJP)u4+!?Oz~InPRUelx$4Kw@-_G8V*;TAr{i*-VqA-(pUbyKp6r) zxOwfCLKNamwKtsGRc^PXD7QI=)T%xB!6~}8g%t$xsXetiz+YdF;5$z%b(Ulsidab% zR2i4Y&+R)>*wTckCLIIPSfy4ZGX1(19GQ*BF-f3y_+u_;YJ81Gb1Sk zQz5ggoN+jBAagtDg zYo}A~(ug-i3&)V?TNWv8K2+4ml|HvJ2Tg%|OC~%Vn{AQ^-VWeSEzk#E502EcCvq|o zEpHp7d*%-{;OjZf5(q8&K{|ZLy}cau-gg=krKm*3oi5Pxjk3wt-3{bEq-ED<+d6x| zyNObjGXypa-Cg*AQDXD@id0thIt{}HeoABV68AfoA4%OVL!GN>=T}d>{o6lAwwr7_ zi5>8j70=1(nlCLR7WU5hlu28q8xE%L9AQrOb_ukSQJGsQj8;QDdF@S1P$?o}AE$Q= zXzkX^!Q2>;6N?(m9fP|B!`EgxBk;u9P1E4YTjj>}3u-Fj+(GyDYhzHla&g7Y(%)t2 zU5?g%(GxBYj{%H&=TvC)Z%e1Md?lGot(|s~@PW#A7th~9GPoJiPpDQ|mW)eKzdU%}n;X12r zx!m7^-bYJzic=7vT&04;2P3GoaVX1^x$wd#NXNF)Mjkk?Z241zT|XhWye~C1OYij^ zzsNv2rH-BFATo{wIF+9J&;LGtCFpU|;CnWYo%nLkXK0?wSbvwXMA0S9E$*e7KNRGj zqLY`uDwq}1ayzGgc5lAB&gsvugUH<3m>J+yn~o^rq#96Y?!&Lp`6AYO=+BY&>q0p% zswfF$LRD1=OR)!9Xy`CO*UG<-^RpjWGRe0-4R;)2lV|oabcUBc6<20vpAY^Au@y4zvR@oW zPO|`k>A(LU$M>I$|9{lLiD7`)pNXZw_bc!JU-Q5GC+vOCHA4En;EzAERi6QYo&Wsv zrc*seKI?xavHm>!vq_^xry_R${wEpuZe=FqFG@fQpzUA(yeK-|En)vB@!xKz=&~8> zXO%FpUk<^_r}1Im=h*yMgr7$l?@Pv=U4al>t*KPNUyQI>#aeck$GBhU+?*ZoHNY`JM84Zb77^Vo;O2axYrqqZQNNcD^)Yp0|=%wO`vb zgTa1s^sdLw%hLmti*Xeg?&*$iKH?oMFNYnAw%llW`PAlsW5AFsqpAI+{`yV}$;GW) zV9@xM<1>Tn@gY1_2Qsj7 z9Z^oGRW|2iz+F~cX2T^w*Jct8v85YsSVJ%izn8eXmf&%!q@ZylRS;r&#LKZ)!Z_{THT)Lf^e5 zGWLzyiVygFV#dDyU&N<|TUU7@7#o=m$2~Z~LB(_<(RoAM*xN!y<%R&uFOvccJjak| zGLB{-i1M1ohMO-R>VxF!I3neP<)*`xu14;vZQEM4@|-NL>=LUEOj_tD_%4wg`6uD+ zNx}QuUFD8yUL028P}I^()k+ogaz-0G&>>sRYFn63)_w^dNwe#{y~A{OKB!Amoy@Yz z8kZFM@d2g1dUX{SGyC3GZkS(shK`fQ3+s5_8+^w}@`woEt1FaIYQ{``sjA7Q06S?k zE?#ZhixP+NU2}#yc8tr*`L^EvJ|TY2AHB%CjJSa?K-|#C;9L`1x2=M|dxv-QOnDm8 zL-xHj>5bGX{xo2#TuKhz+9_81Yw2+=dq9UO)4W@587qgd{umce`?NwMWD#dPm z!g7K8N6g616;P1^&Kcc5P3Q?u3?)K>6h+L1SY!(^F|mixs(kzeojs6B$w|dKx>8C4 zGYFgu(bGPAS=FsI<9@%sPtU4YE$3qIV?NpFuo5dQI3L zP0=n&O0IK@OvK-;XMy{>TWU84-eChLOVE1Gn8YT-zK?@;Y0lyoKa30|0{uE4dUmFb zDaSXtO^5Q`N3a@BIPv>$E?v&tb5cQS+*))Z`#!b0+^ zenrjCJ9>Oj*kADKQkzW6a-BHc9XmU5^_jDr>hD&5-rQsbtn1qoUr&rPe>a&>6NwT%~3wl{yM_{Wwc47M<80^|kHYbjg_u z66z>Q^)B=a~KSqofcK}XeiQa6>{Vvcx&t~uXr}D zwGDDgHmlb&l;y3}l6dSTH9@xv&>RtGK!{o3>fJKMjJF0 zG4TDlq`w%HZ>N`TV!;3b|F5CEl#{9;k z`$OedDyF{;2{Cb5XMQaM02HIH@Oix8%mi~2+s*c8`L2DvI#$O3uYJp`P%=Y$#LQMS zIR7(rVpHK-Z`Is7M5ZMs2sAb9*F#m{W_0UAJV&nL27WClhv3dU6XaAq(l$*f^#kr= zX3V$^*R?q(iE-cYn2Hp{qFxa1vq`C!HdoX-pKCNYOZx8iq`@J-InE9bNuHc)?2meD z@<)71Qql}fw%9z#Q{F~cN|@oC;P|J!9WA#wGH*ZcP8HXbD9~+ApDk5Xms2$AHr}la+XTVN&MYJL zZBjy4VKa#g83KI{$ z<;Ism`_W(NuC1tV_4LcwH`TO@Pu=>aDY@J0RCCXT2$@F(nVX(wZ`?Yk78XNI+g&{b zuK!Ped@F2vbek3#5osqbORz{AFI0jH-#_5B@1*lP(qLF(6ZTq?4!zH(}7J1z! zAhtvl+3>tmxH_Cu0{PM;nQ{n@YHiy?9;JN=Hv}3PhT9{Dpwwt(<&Qtb4s7PPSnNJi ziVVcM+_c(~`n(@4gFu``1S`jGTZa$M|)A#J0YcDO+fh5B#H`GVQuASWn!_9z&2ZBkTC2X0pv*_5mxj78V~bXWgh- zC`9~9s@(`R*N>soUECVtLW>vK?#MT;>UWUe^47V1D;a_;SE|96w*4~VeOUcs%>uWt z(>K+Vas4~Pr@Yu|$3Uc^DFgLBg^ei~an@K_2j#nQU^kLuWBut5Kv%S;zm(;+_>Sa) z+iHV!Qx(2(fl479sF55;1!T~hB~v+*7}Vdt#wi0srhZ?+cbIKB>%^zVKDAYF@*ffs zr25d^oumOy|BLwafC-`LGDTyKoO*l0;HaCv{Nw|FuonGeN+Omba``t{Qzc_M_|br` zYG&dd_7v`RbI(>FPpzfrkT_*?6cGXW7vZ#8wuM~qiO)cX9fYi*wSxnBJYvE1IiZL+ zws&Q|PG#4M#|T^p)PvBlE?@G2YgrqY_fbJt-m2|@)+ILdJ$F*03FAYCRc|z$K^GZ1 zkwHyxcp}VZ-G>WbK!VMT6jMa)UiIB zg%~KmPn1gA3GaI16GHM-19#Qi5Ry#-vFD6CRE#N|=+efJ)hQFdYMfcw*ybS0S+DxyDyf4R<$oTjzg!Kl0;T0!)Hn%a^__>Gj%MLrCp8jKiDnI(Y-R{zo{=W#!YVR6y z!Mn^St1(#Ge}=U*yE=5WT>a&Efg=%AP3Yv!bZF>VvSLOrK<|v^{=&YsUiCYXKbHJIX)9 z#M5<6S&`KX&lVq`eCOpEwJBDdcJ8<(8%lwyS8Z=FkU_CFo>$^We@#MqUZ5eT%W*e` zKDNgxt;7gFd;i5}O;CIyJGa@`{3ga+czB(ismDn_K!N< z{jcZF_!lwIv(>EXQGma+&LLa8YKuhc(&tHtvobB;>AqTtgS7(eY1W} z+PtQpu`fWuX8sJ>b9Q0`dv}CkxwNQ#;ir6UMw$aYkSjL&E%H%2D|<+>;(HT$?-{|u zk*?rEhaU(X6%u;MtZuWW4ewDqL~;jo6C_=}1Y#{RY)XQ%m9mm8u_|RVp>B! zWZp!9*{|Mhq+s%)qY;dF(JA;OtLwvH<`$t&@SUG#s@Ft~awpU_*Xl;snrPuVsYri+ z_60)~o{_;-9a06(iU0Ooq(4+$*cvVPIQogto)fF9KKMtkw1BZxgA5AoNfLIC5I9=F z^!wq9+5rI2umc)XOv>22Ril*`))VE$9TG3J6gEE*XTGm0apq@sK0jdJ9s|qrcCa4j zIlyEq>h+q+-N{VfxSjP;MD@e(hfarQVtcjNUI`6BYr_kDt%dJfWEbP2Hly^xhIV1w zkUQ0~o!!|L?xl6Rq@w6kSDw}eDc`Hl|8h9a@Y#d(&3iX!JLbYL5+LO&iMvCh`??or zPJi73wyjFbK&-2!g0S_LYTSVYxc*wIoR?A=Sl8ZO3CnC1*N_~qba_;`I z)G zx#E#vTei1I;bKp%Q*TT}EBA?0w(hou%d+`EX(gvpwfPB#FF7f1&^LQrF%!RVV-EEZ|+Yh3f6n_ zDKTpMrrk}W9Bn%LVT^saS$$2_%Y{gnJVw+%g5NLb8U$K2cHsT60dZ6cXYao*esMk% z_fK{gD9@|F8cvkTi-ULy?fZgh2>RS8dZ;69m{LhYqx0#jr$m#azsME!L zi6lD+3la8cmlAkRX|znd@V-l`@{iT&-{x|=(*)&&Cah0k21LH|#pq?|;E&P?>w8he zK#hjH4rb@L`iMl$_4pr#^$tL5)73sH)MxXs4WSaFNV=Qj2*1l`KT1pk)Epm3X^92;qW3IU5v`$z8A7G)8Dh}ypT`V=!F34u zsK}-wq<3%~)S;;cQ}-|xyt5V>^|dssh&&_Q|?DcfAcYl=yYAEtC(^( zHwS>Tdc=Tt{b647GkZZ4?I$jnnBJ_ZWMXXhk%@m%^*Ps~*cIkyzRdIA|3n-=_L@Uj zO!n(JD^u<XY!8i zE|%XtQx2R&+3_ZB!ipks61p>sW`Uq~HeZbH)cadgj<}Kka9Y zwR^|YBb5qnRTkhF30tRtXE!kO&rB~)On2p`N=Yqkz^%+0kXTTj1 zk+#SXz~jYXpL)>r!*iA-ap{^JQnHl`LN7ZykZTA*#Wvv?=BD}wAockqwML66DN@ze z$*eC}E*y`9%KD*`t`0$VX1hdJQmf63(e@fF(&8A0O!tc4ZwhHqEE}nRd{`ZlU#DY8 z%H>{~LKAy%Au#-{NrlNyZu zf!1+tPT7@yN6BFb@~Kko`&0UC;|+#RiFn7o*5ML(@$he$ZWl7LL>r8UTXU1^N%eV> zT?XQp;+KazeRoFGM4()(I6z%s3eHUzm#4>`8IuZe5RK-oyOWx;v-V`x;Llu#b->x! zM!bC9Pi~#4ms5SWR|GAhY@)|`MNO8kzRHqIWzEd(ewvV>PVE-$>~bniUE`3?32f_a zX93&VmbKML{g2a?iMN>VL+e(jj{;R=bTHBP()to!@5!y4Xz~jBc4SunChx5KJWr{# zsT0k5mRpm+Ynh_5?tJs(y`Gl1+_X9J1q994aV;L%8epv_8tQKdOznepr4<2gC%D3i zWZrVUg`+eCyUVM)J|fP5we*5LpA6h&WduB)Z()dH)xlPmKqWopgYK;_(xU66GoWH? zm%zRn4|8V7cD3|mLed&bo&96Aw5^F`-{Gi<*pbCZPWUh#^g?H;as<;o((G9Z8;=nq z7$ZSX8>3wmg|xXa*m*;u5WJ3TBL=3=9}Hc#1~W9 zX3tHO7|=ayt{j21#q9ms4I2KxNHqAqS|1~2u|+CTmYE7#+a8Gya-vJ9?0JbRPw_%$ z1HIiCjV$PgIc#T~m5U5hFhzE*!hloI5eIT2z3QU3BoP!hDnIk-R9-v}^$krQl66XI zuB(`W@vjp$89@-m^XJcJe*YEY4xboT|6<{jzH7u$c+RbTD_won3BYv8mW{dGW14Kb z`w;)28~oJ7v*p`hHG|V*aI(*4Db>CNcHh{jdfXulfoQRwe|aD+{**lkEveh3I0qOz z%NW@2P)CVBI`k9H(L#qeWY_#iQF@LC(?P-%5yh zBs^Ix#KI~}dHPC6(f}NDChEESMeGCneY%0h_QI=GBpEx{3Q@~*WI#gnxV4!rzi6`A zyzIt2Gzkmq2WyEz)1-Y{?7ChdN_g8ijXiKL)wkwUH(rCi?L!LO%-eC0d9>TR@Ihbi6G3e!sjO|7jJx^8sRWLsDOTwf|~` zTCIUXJ(9LaVNAar-h+M61XY7e>JON4A%qTTb1Kl|cyV(d@23Eyfb-=0uI zTRmQ2>_MKxq)o7}9yjM$^kEK_HqosXl?hT@K{~5aB?Aw7z^Ggfr6PFi@3jZX4T71~ zo4ezA&7j!Lo>lL4%-?-7%1c4fG2$t%@uyaTd}JSv_}Gt|Nt`lu(kat@~)DrhOR$>@>FM6 zJb(RmVd%*hmkkyd?M+|Ejew3RuVUqOPWKiR<$AnNaj^0I6)#LIn!nvxf)R#Rs2YtP z(9P-|1o%ckLR5!F40d)GF`M^`$uKOaai!6sAonn2fOGH=E3cx~Oz+U)6=pzCl*h;e z`^dSQebZ->`=8AkD!40*DH2+9uH>`J&L_gV8mx_btWw)j%@ktMdf0@v4L|PGft_Qu z!wC9-ry1%OFt$_JF!;jf$XjGteFBg1HqMN!^H?k58I1TdKj`|iTt!lvm%99GdvHt| z8Q?{Anc0>34e8&_Nn|;-w0wg@(1u=+&$_H5CVVN_w6u0qARPHL)z$tFmy2GA@ye7< z0ej|&C)0U0MtIOqm}m3eqr^{JxdRf(0YBXT&>p`gfFEhdFa^sLZ)lt@MCfdqj4^D( z1}6YgVRx+kJZ+SAZ!4ZlG1*n!&rq-aAiX9g-AkQ%ID9c}N7&^Qmi>IURg1trzOt2F5|eU2THA!4CL74!Z1Lus|EkemuUSZceoF5I%42z zP1`Wyu^o3UMtHIQ55P$W-ipn;gn`|zOj5%1rResskx|YTiocVF+c%1&G^kL#;faJa zI@63EOz&R;a>?aYIftnmv5```O_!_}EAvA{9x=er!ox{}jTd2t9%{n%Ea&{1sG%#6 z@8nZ)9Io3 z#kL`pa3A|iyy&XH3)rEr_s17)l0uxHtU3eS&%Zmcu>+@D-Sy9#Vpk;2rMkXvPCyVU zIEtc&Pri=!{oDU$&Hr-ESNkt7f{YyIJInxI8m7arc5lx%G1H!Ntvk>%p~t&zgv@fN z7?Hkb_H@ik7ba$dG~c^BR<$Jtby%Fh75h&I4MY|)!LbE`$6CrORd#~%!2n@DqbTqd z_p;e!OorgBKN$j?_OW!h}_Hf%S2ZH(TV-p z$T=|DFZU5a3OQ}qErBY`nMn%KWhk^czQImvtD z*pO#b`Yf`+HPC5%OH#99=~P!??iel)SDJOmnTp2ld)D(pVLf&zYs{p4wsh{!I`Wn= znm=^*?F2`Iito}^0i)jQ(ZoLOmN%)IKYylj(6<{Ks21xVIyVoky!vCV!p!j~hs-XX zPBBY$uJhyT7x2M!*1hNWaV4^FlP`?naRx6s-r(-t!x7R1+)uLZX=I!vpf|m`**7J) zM`NG)QsqXZ55$HKt}JIN>%Sjk{WE>&sMagx8tk^vU#_Wr<~s*K65=VJEchKY_{lcH zlP#dP@k{f{!_#2J7Sghf);GaP3_Y|6wWUop5>T0sbHEi)Yx3U4@M17}ZFc5R{Iy?7 z6@S?Mnx?p(08{4yr&~?XK~E>MxQU~^<~&4%7mZ3C0d$GeXB?yFMt&Q%ZQfOg6vS>D zdylO?%*@2v+mUdVp-K)jef$ibMx)Ek@7JgO>tyUR>)3!`>*JfT zwV$HPxcN{1tLeJjqJ&%7SA|Df9O5EQkmMgyz8(Q^J9($GWyu;x*ML17R+PTNLOvvV zX%`Pp8{<2$qB~tFv`Fsb%H@!(eSUET3z;SJj1}XYKDKEyL)Tlls@4fjDHcI|Y9^hl z5nyMx803-x&{h5&M(XjTD=9`H)=_1Jmxi2UZl zxoKY8-iajWM1G~^Sj`Y^cv9_foJii~eFNgj9$osF6Wb2l7NIK5PQ$bp6zC$QJ2x;; zt7M&H^KP!$FSEy|sZ6kO7h|b!?vjtQdsobiZa|5K5E?Olp$v$l-CKSAl|M@MovIhR zo=`5ui_@nMh2RG-P+Xh6+qv)p`f^xw2z{00^^cSY+VQ&zVtriNW2xn2-ugi&L zL7Za2e%!vViyctmfv{WL<4aR0dG?V4#vUp+nC~=n^lR)Gp3ImRP5NW*7 zlv8YFcBOn`I&N0t*eWKK1f)}!iSA#FPIvCdW_~dRq6)eg42Sa;Yi}SnE(C}+?v5Bf zCFU#->OD_a?RP@Nej4geC4swhK!NmL$Q&B5yEHt`MY_-lHDk3a92-D|?2}`h*_0+> z{fPQfu*D=gbpIg88t_Cj53TA)>I!LF4%q=Z~EwbFV{t4 zlC_^U^^)`|T5A4o-Tb+(E@?*QttRCoX+5!OSD#NyNkdGml;i!~6Jd_=$cUk7c!Xwh zG%U&mXRS}fH62MX2+DPVk<0d4>F*wedrlt>U{1HAjMu@TP6Ah>oL| zO#Xen;fVP*UWP#mAj1*p{qow)Udw($eruI{&aznCK-TVOwLzFjYnPXYg_SKy2s!KzENn(7%t)5+=|W)pvn!)!pLJeC^{_tkhjJaQKH!lDZuYHjWyshUW^Q(+bGX!52{6e zIJT~dF`Ejqs_GF0vjVu%4a*pxX9LNPMsUJa3&SAKK|eW2ScYF&xkYZSYd-Jz)3=mM zTf>NxeYDG+8H!#-CXGtyx;$lDVew4N6nU24(4t|;|FO3xsK2OAk~iyK(fqAe?V6t0 z0_7>ZWT?}RloF%JUS{LEuJnPk(7o;L?UaY@`&tTw+b&YeJz6K+-V$OXWZX#Pd1z(Rh%{`HT} z(f@{3@R*Cbni7Yxt4>3|ca&{}x#?q(b75S> z?VdQxM~GbgPVyjQd@_x3#N9gy(YC=H>lBf(rDk~En9{M$2jw~t2d%ZdimN<0dLJb{ z{KliWYHF~_i(I~gW@ww6J(%^EsoYFaW8^$gCn4{9Amt;D`}=RrIynw0U@yr#jHZ-@ zJ~$rUtEzEGcGkiDW3x^XT)piw2PZa&J+9G+&CQXg=hpUP<(r!&stty^okoNxYGU?;2FS!SQ2lA}lBva&N60~`e5rge&frEwh$cacJ~DNTU*!b3e$s!_ zg2uMWG>aj4Q>RAR_ugylkdJ2?QrP3Zn21}o+TrB%hC4@p`$=<3e!!2eRdzxzMIP8- zN{{gy>>C<;9Dm%xGDUtg+3``;Csy86zRlh9WI~-HZ2v|ORIZCRz8E z`dwo?o##dnaJGC+ft0!8nJPLhT;=l=e z>k~{CqGN@Yk&-LazbiLvTeO5PnJsKA@`9&wMkCJZkI8Y|~Oo^qtzRIivMs3BrhPK!3C#9a7*1 z_j}##rT1E_Lb|M8`zCwBxCSbHq#t@cdxKQ3x>qC<2~@YUngHFvlM0e^zm2ffAMDVb5;efldPub1Fjx9!MWH7c^^#x@m&x$G#n%GH|`d8I!xv|m|p!a$$~ zB8|u|ii?~mJr5q6p`putL7)&l&rnq{VFUlK8Jl`**SAAEdFZEi#}r+jblSRXkamHBs*@>go9;`%3w#r`LXbzons`)ZA}n5S4WL9Fx6 zb%;_P?^(|92=RxlOj-q(26~0vANFUT=SDtHuhNP{uYrLX(}r@2cIArbe0n=)_ql3v zc#xEN=0xyd&MuOLf3$Y!GUyHH9T5d`ae5YoW@472JdVCNTxGvzQ&@laHB2LN0mBV- z(7!`yz7$q4vO{yEu~wli@5YzcMDzz@G7fc`z>#zCETtDP^ z&8ET;hKXJJH68kAvEZOKA?$>d;Oh9+d#om0VS z?QN>Bfui33%GMD*N-0Gn^ra5r`j%o-5j*$n7<*h+R4CTWWa-*kH;jonC5qp=pxK>gt+bL#UD)t48p- zv#~WnLJp|v%_$@Gq_%UL;V*BcvbYoKqkEHr&KCAe^8hMcpC+DZTsk;ykMF_C?{=lq zqre!e+z0L1VG~2;wgHd;s*d~8h$<7Sb6u9kUUCO@<0z=AP(WD6eqHl~kvRHmHGGC$ z{gPdD*dvx_)_{Bzx)MC5UZ4Bu&Ik@ASwMQWd2Xv;>_{*=yV`?ttwMmAa+8o7F#^K9 zRC848+j7tG%wlQ>f^`Fr4PLVLs_*u7qkGV+C%FD@HnbFW)n}^jts`hVGkP(tt=-P` zRPD^3PjLDtpLdWI@m+x%7_4q1Q(E$|c3oGu(^yj|TZTbDJ2DU5C8drxFN@Y6 zhAD{YJ|x%untuTg7|37FKXQME?u@sZx2~Pc5YpIBuRR=?O+Q#dihIbm0=a3eW~n=I zrvr}^GL+l*UR&kb><=laHNorw^M-!uE`alUW`dR>6H?GbBk9y@6yE!_upgLetrnZ) zXp%mUzVfe!0gjB=3@CWZvqpI9ZrvV@_1RLg4Bw#zR_!b)}YtF%*kf zqz932v(Ny$Kz^3Ev$}4h^)imAKCnuv^_If0ix#$nnV+)RVTen4LblJZmHAFow;pgr zC#Bf20eHL2x{`TW!=l9S{?&t?GOb6@y5HUqExu|}sA7-~Li+qsL!!-{p_#LNCr1}6 z;k4~6mB6H|`I_i7@o-ahNBc=ecb-8s@4@wV!o22wD3PED7$ndW5ed#QFO&8?2D8b+ ztf`r)9gm6#_d(-if?_`+^9TXmn`~I#cM3pgL{3Enp+g;-v!da;irA=ugWTgabxd%V z>vMa6A`|#c$wZHNeV@lb^!1tsXo2N;@_Av{FZ}_&Paq{Z3&WA`v4ra?mH~j7VO4At zfugoEF1pJps%id)w)}oXu~3qPA~@N)7h1%mu%}AMo@X{?n0vSST;4A?_$ro_sw*7l z26b8ii}!)XbiP>br5eYdi57mZl>s*ztPCrmJrLO$lkuFYSXmtQ>VSM|Ea4z{q!Q-G zxo=lld%SDls?w55D0SAptLMQxf5P90vojl2IF~1a##-4du52QHa$4AYHGFB z)31O2_pkch5^;Z(9C>C1sG0d$C=V#>SS^=ws3`czBibqo5Ra$JEs(Dp>;%I^ zxV4w)wc-d$aF;AhUudeg&Dyys+`&uklQv64FKqXaKe^ftzRcr^kHd#CO$i_LOs}vbgNLL2MLs!p|xsh z7OPufqP8D^;q(RlGIQ$wi{Jk@3AJmqn04lKIoZy|2U*&(?=bk8@3ei{T*zo_Y_TIx zv_$ATaD^11)VpB<`L}vi{J9(%@4CSvY|8O_+uEL2n>B8gX(0a;oMZ%JdpxBXu2&6k zewOru#`~=%95ctl6P*Wm;~h6?m(M(pD|Yz67#1l@G$GIVUYvrC=q%PfSu@$NPR~EX zkrYaCCR~Sa{KD6hF^T|)qGK{C894y=rNX`0`@Mvm#5b_Cim98HK1+!pF>UNNxE1Nd zyGZH_ff?Bp54OzoEu)>C;a2%Lt0gOwa7FU6eaur`*S7H&V{sJU;9aDUsocPdZR8T| z_VDxBQxi2#mQ1Py_+j;knR!DVtG>eW*3RJ%&UIr)&e_9~I0p->gd`WwBbG#kFlnvXAW>AoJ-^h16#ADnU-cR~_fn zRy1a>R*!~Nl0q4s2q5o;agPx2jA%i<7VjI!K>D?o|LMiCdCkL z@vLYN?p$IhM13l>qH;rii3uy!GOJO*t=&H{(3-@H0VmW@{eE4gcIwuIXYJc1#-D7w zb|szDDg7|4B%6--<&TGqrkHZQ+|5!Fhk1~f4X6t}a+qCyC_wT$!PNdo3-M92|4A|8 z@r)}&G*&a#8u_b<{gBymb=7;7^u5#%RuTT?+B^@R)!1k7ec?+Pu@4o`{kthwA;e_! z3>N*vOs3TcdOz*WS^mRe2|L4gTAeuH232)5_Mkw2H?)Q@f2jArJsDipjh@JSwb9kR zz1I|r)g{`Yk~&tlE&E)>WX2r&79Y+{KfN`41g>;w>!LN435??8qq>rg9UFXQXf^K# zk-XXj?rZzNY4ycJCFoQX46>whAUe2gRmiO^o_XiCscy!5u(;E>ihyWGjegbde#t1u z6;JCZ1i$Thp`f>@JO%BWJPZmrI4R`5-%61-&Bb_Lo&NhYE;h{Q+|@NxnGhMZCVTy9 zRG1QSHMUHeIoUJMMXvUIFo=GxRM7Ox!ZAMf=n!xqZ@Kc<$Kbf{cUMEQIhl#xeQD}t zq6L8tUT$JHSJm=QXLU%=1lTm!6U4eno|2;rjJ7GOrsoy&uSf^?gR zq87ku`oE$k=F4-$e|e6(AFa6O2a(g=!1+)u*j=-KK1N@|GNm)xH_x=q6{S=_OZT;Q zIHFZO3N7JZ?S=fW=5Q%3>yS!%<9t_Y#N#e;rCWzLqNJBGpa+RcqBlFzYjk`<#&k3Z zO&yu^A?0IL1J_&mjJ-VB6{i7vD0+jXVOW5u&M)qEkjhsW1ugy%osK;%G>W|t;;ml< z7h{p>{>`fiK>WRZwYKAMGo4auli5*0`)xvPgubfWX>P}g=TK6kS6$|3_ASl&i1sTe z34>BkOmgAMI=1Sl7B9)VXj%taqb|b%;LCk=CZ19d2~9$IXX>xVK(;-|pY+*xzrS zhlE~ngY6lH?%Ludp4;rYy{{5I=?&@!S5#J>f8kge{(yJ_rj67Gfeo3zj>MiB$)dc$ z1vB=JZZe7_9fUic=^O0*ijWzcW;A4szG>Nd^%X|;H&$y&Un$x6q8yVL=3YKNc=XAK z1vth*$^eLV+aksS!Ggj+&5WxJ(pRcF^+HlM#=)730Lj54gJuunrivJ zbo#N*sDlcDIQ)G=zpV5!QfU1F2cW*3%>TSYSbg65U(JYu<7O;wqOWsBcQJ2?YcOG| zb>3+gU`YR8UVs%aRN47MR0%{PBG9H$96~_)4SEs-E1jD6qN^_VV26pN2rpB+A>oa^ zTajmJ#bN^>Fh{*P7gr=W@eS+^ ztTb=lr*>{tYUAz9^jTuK)gne=UPtW0XJxsTU!5@KL6*RzYg=6=Z_f?pg@gq--bL;*=vu$ zkvs?K=1S)@q6;L}Q}n%rhFg3eY%2u-5M`tJj6HynsR>Gfk}Ca%qP$u$#n` zGrcNP|8OQXX8MP+mJtrfVncHT^+Vn-jV03^(1b~+ObNI9BR>RO4fu|@drkUVx5N+- z*XeL)H{y>s3x!64>>*j`SuuSxD?p#P6cwevn%3#^L;nwEPd_aDelh4;WKEOz0;>mv zXZ9<5B$^vXhw+l(rvTGMwZ0eIX=3wvFtM#pOy8;PigE2uly#bbcO~@75XaQ8bj3AY z)AOvG8Iinq8ZP)zho~r{O?yk9O=e2A$?1vPskfmBj|Nu*e29mti;eCbDcX#Ik0dUB zc#R|+pJI)YB=mIkJJ<8Z9qZVLA$%8FZp;z<5OGOl-xR2VO5;rfd$F|#&}puGrP$m_G^Tqy#jk%~cPjJ?Qv{u9sX;OTEfrMH;H~ zN(L$5AK3n(eoOoPt9NJ0V=w9_fI~h|4t7Lf=@0(4U2qA^bXz! z9Z8CHG~O$oege4(zJ6nr1tEG66h~j$nbQ?n@W(puW~wQG*-;p*X5O1KnO$E~RcBF@ z9w3|IXaA^nBSgNF_*H11)*r=-1ld&!Mm0peF<{Ch-2&{klSaP6EWom>^t@#fiO& zd9@A$qO6`BpK^d|0kw-{B2fv$i?34F9E&BOVsGu8C(I(JYE~(Vauen?#*ms=qx^*s zn7Uo&Zqz{{nTSfR6uWP{ZC7aM zW(S(R^4+0Pp>ZS_B``^1q?AS`dXU})i!@3wD1 z;C5}r0Krt7Vt8*ZY8)Aa(F)JYalKJSKQM~M*zRd>ET!mfe*_HSXZPlLdpU;{>xNrL z0VhWwpd@F&p8B4XPKu7fUUUd!YY*G$6M|YBmRH`ks?sp{cvks-d%k8^Jt=jnG*j2I zxtT8b2NS(ULX43pBat`F?(<>menMY+7X-y6Py-wtpJ&9RknagMH& zv_;xv{L=7TK)iV%j&aRTK*W^D4zmRa1)hx?OLBT!hu&`!zq%pw>Ho9mT^FuB=%5OH z7qnmPu)tivM5hmxwX*8`>tF2v?5l@&xQ!3XeV3{?A0TN%_Lht?X`y~lq^N^ZH{gN! zpsbiS6TeSxBIq^JE{l`uOtz8@$9--#6h<69{)%>^I2NpbvIrxXsuvr3D(1SV);3)X z=mLEO6+ZR|4=%oJ`O*m4 z_$BP6LwQ#2^1dx2Q5xZ?bsMjB*oVtV`PfWX7KSgnP`6D0ufEDymA%*mN5Ijr-Y_>5 zYvfXVkV@Es`m{ut9TuOoDGP^vxza4wYKp$A!!tV&)5+$b7?noub>wDLW4#2q`qy%0en$)CZq{hL%TAhvRGI-Zig2RNP0h|t=M9c z4AksL)Eaciq*dz)oRD<9nUyJJGL6a*v_y)$5)7?mv?J7Y1?%$0VZwCsO%Xl8(*OZz>F`a!Ikta-{}0Fq_ECJ?kXT z?@*15HOd9)cB)a{A*%Y=Di#lzntW*hT_e3Xo+ENqI7;nRpZQuV3V2MVMby!S|EX`_ ze|F9IKYNy_DeT8pCEb@$4CX<3E%rC6t>!}y~iw-ERrLtFCvzaP>b zb50h0&KW<052#7pIH`3WB%IMAVC~876f>8-ih@7=NS^$@9IfVrvLP>uagkX#rizssM(0buSVI9N0ObNm?nRQQow{_1Eax+<~Lyn1Lkn<7|Ts zmuhFVnD`K$MQVj>=rh-cyG_S1fZ`xx@^hmFe`GeMZrKh1cGsZjAOtefU_w<YZysh86AP_YBf5WuE&!PP_t-rsZUMXvPbX>c zxA=|+cn-{MN5C@W3{Jeu()Y~|^GC_UtV&;_^qca{%!4eLYXJ{>zp5-Y#0tYy&rHX- zJ`Hf$!JJJIpDjPyGa-WG=~fYr@)Uy>N%v;^`XT&y>)_k1*Y*$wY^oyYysoT&h-8=2 z=2^v>gBzm0!iwKBh&IT*N7QiMF@0c(9jc%99=0pm)K+qmVHwYotPf8Tae2zFS+;vr z1~P5x&@!v;kC{;NGEaikPhDV;GWKh|L9ugfdd>YEs)$)<+pa5VWtJr;+}AyYU%1^} z4p2dI>O^9DgT%yLjhBTLVcrnkgikgyih*(6E;2KW1k9~{KG_K ztV;J_r0{SBL?@G!Z&O*R3~$rZhh6{3-f#>>;B3;sZwbbdk@F}g^Dy%W6zkHNb#AiM z`2*y2s8zMUy*C+!wvVbXN-nx-W$)`$)m};DPadp!x=PA8EgT{f?Wr-ho9mu7SJmEs z>VKFU68<$eU}NJP9~^bN_9^XMfAv@FdT$j%gSW@9pFTM zl?>ccOiX|S;(8=%4)K}qKkm6X;L-(_V+^gdFY$sq)iemFS53ugZDd<(tUub_5cZ3R z+;&xf#xy%y>-%+7aCGaf%Dx?NE)F92krt`0bovJFtOZ1EZrn_vQlU7-DLhcG4MaG# zJ`8A1gA04E!weI#|5^eby(HQu#(nt}Hd!;3!qDeI;L_8{8#^NHk3#Acx4Y>aLogd3h#qq;wmt`I&g4L zHLSvM(&phCjB6O@P9)XHq5rwN)yW3n(IHPP+Bqn0)hgeW{Tp_+|4L7jF|sS7wJ4rR zXKoSGe=!yam`^{{hBjeLPp~vdm2l%qV!2OXf(KYI^ z@B=Z3C*?A76l*+JB%*wk0B_$RGQ(De2HU4aBKOOoSkY z)`L2#{duGDyQ0B?VVXm5U4vV-zASkD0*F7q2Cu+)9k96=e}ezCNcJ=tBI3`DuG%Lx zU7z9kP+x|YnV|0Bn=i0)BOv~^1|olSw{X&R>ot@Xg692kE&=IWP-r&#B+V$z+KY*WqtOp>xw zyh$H^wM72TXZYWmYY!-SI}wy8O{8sp}EO&Y%SKGbJogd8>K zHFuQbGPl_#>WQ*0EkU}f6BjVas`mpi2$}&_cCHf=LGhic?jFLVn@2o;@76W{jxOzO zQ3bCQSZwjMn0iuX^4LtI)?k((}nd$RM+idv^L4 z9abmRM;)#pE~`-}G`eue6%3eq0Ikgl9GUW#s$`d+EXpj~8WhC?GR z%k-kEGsQE>ry2&~@RC($+w}28rW9}e&r+didvB;YCI9iP;*WzXn)1Sa*)ZS~0Gdhh z64uDORLUSDWICTncP=4@n0w-6fTEQS>fvLTqB3|tpYr>kZaxHVsAcRXBg7ItHDmd0msqHffM>9sGX4ynH z)uOikrPf_5msd4j4Botb9kT{x6g6I~$Gr?m80q_dJG2gUzTo?0^@i`BMdSs9xa<^G z1ZZj-D3CLGznvZ%zEnCjn1yCQm8Y+C?HCFJLeIo*&xW{Kl%>vkq?m<$U!qb|F+q>z z7-npEgZ;547b6`^n|?2cP6PH->MJSMvhzN$S))ep?~<964w2$d8`U9rhz+Z-Y&_FI)}8gjPQN^}-;tg!?P8{+bzijv;kJ=6)QmFqSDSEJNbB5%6=Mdg+S<)~ zsjiN{gOY!PHUGx<7cBiX4LCrvKQ;^7WaI3!6~$dL>;+GiT`7xxLHPS`ey95rFA?@t z{}ye56(9*v)#7^``s5;5uP{?!V%YZ^)30mF>l51lBx@OV81xU>+!c@=e7LfUx@6xH zNgAq1&NJ)jjnFZRV0zDO&rXj`g&!m)Y^}eZ3uyNqHV;Y&S|wnnIwYLiqf%xex%G`1 zge`Z>bNA(EF-~M^=9r2DJeA%*Oyu-73ua`Z;NIW0nmWUHlP_MdjHZ0YjRT~a&N_zG zXKFHa$W_}||M1XTkpUYHjT(v8HkizmgDyEm3dO$4qf((WI#dSZqH{B&Y-Q&|fo_=K zL&bu5E4fY1Yn}*%13Onw@N_W~of{88^ch?_Y9(3?HOcuh6wHjZvevV9^0m@lD8s`m z(nRe9YpON_|0EIb-w6LEJU63xJku*uS+hfRVUsY=sg&&|%0VeKnDwTDs2N zv4g?7l3b~(+ni1)M#9>Oz78dJRzL2-^+el401ZEyQNxOlR-8ao-yg`yl-`OJxVQ8Ag6 z%>A}2oA0J3)_jgHr?`_CcvFFbSxZmV)1I**INRioV&k(NOtme)T2(viIB{RFjz_tR z{uR+_#M|a;jnglQS5*6>9~uv-q-8Tj=Sd(t+`^hEdKDH0HVrNtb6FuOdG|j_!j{Nn zw_FX7!a3J^wq5+_8DFWYj;pFJ1x0~2p_31$Sb5diPvxs3HvllcTcgQxVU6* zVk=UY3D-FFQ4Tkt*X2~HUHu{g^@~w7{$l(s{Jk2N z(>@f89RRkO{SrhheazmC1dQ#z!FwIHBQjvzLhy92G8cC3+t2dG|oEW43?filxOgzY!)co)WbuW7_dmFLhVg_DFu)1s)fgxT3# zVtsW=fn5B4j$eZllX6*m(}#k@dVo>O&#wpx`5(N0z#EU+!5~E1&B3%T?O73}=1*=* zL*4sX+(JfiNxeeGX)m1B**b4DTbMH7MPGfwFwGn$|A0FuD|5Sxl4uHQR7X+7pIX1t z?Ac^=dy({PAiq>V#(R493L&YZB~qDa^H7j?+JcG9!1LR(PaY+#$~g8M<=tHkBdZ4D zH8Z)pyuH9xwTq{wb~m)DS4i3lnFnqPX5%$beW#MBLxl^#MxRp$*DmaN8pBrm?r{a} zxyaaUd8sr_Tmj2y-fFDWx-KXE4O6sP>Fid|2Kc+MWODAfOPrv-{*t)UUe*f5&-Nw( zg{{0kWsd5BkT#*c`wTDJ%`+oQ_)qkDnJ7e+#8V8~C;0LC+aN_H1#X|mim_E~0|T0H zCFcpQ;ad5Yi!c18qC(^EKYU$aub7T2 zX%t_IL2tnnZhPwgw0GuFO`Utcr#)?LYr&%^6l7>cKxBx>JcUygkTC^h3V~FRAqj}g z1PJt~fC?m)06_wz0wH1u2qDZv6(I!-5duWQJQE#n=*e`o)} z+B<8nCwo6Ud4A9E`+mN=BzuBH3MAuQA%fG1gs2r@9<%QFA4Zz)rKl36%$-z!?M?Dz zn+1GD|0&j^UrSe%m-q!SwbZbk@p5vOQE+&3_pegbV`!c~U~@J%A(e0`uqe2RUi$?_ zKYKmiDCAM^kZyIG{bVp#Wxd*23o)OYofn;hh0U1&B6?^`jB$0(IIWC*!w>6tbRz&> z^cB=NJ=8vQM>^$NY<|1=)1+MDMx@gD=>i#Bv}sgX__F3BH~Em!o=DNek=vG(J$SFf!< z)TfUp6|8)wNi!%2*U|a-@cx$qhlAH|F7z&K%YHM^O<~2mVLQvVG1_CBxK2wQ_lz#1 zz(ML2Bw5C=Gt}NxmlcQPTF%z+8L$SO?8iFr^Sh!7C&|0>oL1gE>ai;=7K|N5c`7bIrQ%0@}9_w;d7KArc5$ zKWsW*9$(?VYNk2t35Ib=2jpqbsLY#J?tlL|_V@^TzS=mwhw>Z-gRwg6yNNSZYXl$L zyTD?(#u9^vF^dZuQ)6>9~Kq^=%gU7y=!Q>kGNCTbzxdwf@+=gw1Xi010JzZ+5O-7_Ly9Z$UYSkVB^) z&dP+j< zHe9u_yj3)Y(@K=2jR zb)1Q2tgi7$V^oC{MZCdCn{BuO$&K&p84KJ}f7zfOhQhW4ODk0L7bkiXwJS0 zCFQN{SC4xela6)E`!ymb>v=IPS$nZD%=mW|=5A`6OmnB1g}00AE3&4tWufwNnS3ko zyA8l>BOber!Gycc6>f~ns-JipeAKxRWvooLpqTd2RGq-5Y>zi<+*$c9rVZ0c53J-u zv}N-++Magd3)iC9rI5b$}1`Jpdg(!$#ED0oJVo zBGfNrEj>h_dj=pQ?Yzn%e(2u}Sy~|QrhBY&|H|!}?B?o4v#z-3>Y(E+`?cBZ;VH4} zHWB|imjSM&0Qgx@tVFW}X^y&k6YDv_ep(r5{x?qi0ALgwXM51#4H^k*y<)D}eDGqI zUY{2_vN?5p-_*qns1v6ApH8q3hQ_napNkeM8*c5_pO|8fo@@HFTlWD_{9kIV54=z0 zQE2@ufRf?fy!ukg>mzj&srO>#DUWuE@*juv5TQw3{F{SGRkNz}DX9I9_$$WJe6pWC zFTMomXD{y-;Db-Ys%>A_H#iG5x&jz&Pwv#Sb^j(NHfQp;=)hLnmz&kXx9@0cls;wz zoIJ75!z={3?m6@SRzsY2T1yPA!5oVRV4@ug{FA0`LX(R9y6ra2f z9unM&3YnoFjE8+c3J9&o0cGy}mVT_5tvKc{1NTsa$j}ZuW4obHwjUqsugb?9T^mXG zzVs-o87mFVjS2Ine=iQ+D84aiX%A)qKA_(V4pZw6uR4p=<4*kE_@|-Z{wyD(yks># z)4e(Z+4uV&cYQfzAOpBDBNNFXH~+Y8{-3wKc|GW_Vq^zo5Z{^CX6dfI`acZl&EK8K zmr{hU`2S3av1Dnd{*b!s&uu#JIcF{dyMg<1Q`B_gPFD#mfK^@d?A7T?=tMcoQSegB1qlu{Z0wPayrz71 z8RXsFU_HHNo5K0_*h-Q8i-jv24q1Xc(r1&(Qyj<$mKKF=5J_Roit@wy5ZgPLrW_I9 zP@q>G#t6tf@HFsMo%#l>6wmE5QPOKP-DI!pBdKGhw$yt<9F|zUhc;2)YFh3((RQCe zJuzrikL61EGEDTY_s2kXqOWeKa@A0WGF#{Vc?AfxZ1NiS{UBwc`QkW}%_#QXCE=GH zsz7rAY=s|&nT`?kWfQ+%jTqBkY^NO!B%iBCje~75;F_NR?gw4K`v>=9T)}#y?M$h= zu+6mZmDt$v}ein_R*O*mKNc$Ex3*aK|{s}%)w>vrm1}FjB#5LG(SeIFWZpxJVmdc+sKG6|E4jbz|U1sGgRt;nk*vqI&fG5KgtZUP#k33e@~}wHWg_y{pCW{OEBHOwP|T8TA@tC*F&B&F-hh zPCnHcKL-5JHxApI@4U^*etSrNn?AD;H`jG^{%GoBkKNMM#`)849MUM?km2PEbf_Aj)}`%wsx|VO_n~}3 zQu#hlGD}XCf71Y=1t5a~eKdV%@1(jN0cKV;J@L;!n7*$9 zrtiuBFnzBR`-|-aX=p_8A^^)ZlYem+xOnsN!bJWBg`t@3a=;#oHLFb2Up7xVQI&Qt zT;x{kzv5AWt z<`>XUW}B@*6UCeH!{6jD^LD)~d!MHr#BBu+>5=XQZrEuirGp~|t6Q0i&b4mD4b5E6zDDSe|_$|Ohb0cSC zU&XYqcL%KAyLyJE0)W#KBhi9=o$;mU)jac(@jI{m9+n`PP2JwS{igM~Yg>d>Ph%7^$E51FFVgFBj}WB&-k-k1c%hy^|OSU@h*j@(91d8fv! zZ9V1{PpW=Zs#U}hKKgp@{(@~L9@6*1r}v%N@EkTuH10;pnLXX91IL?%?%2L+;InSr z%|q+q->5ethDL7GJg>Z9AU##^?I*uS{v}6nM{Kn>fpBjgvHP^ra}q+v1#jgMld~(w zvmfuY-K_N@f65EN*}fEY@U|34FDu6PpRPQX{O=(e3G)yd{a5g|@;|aQr|q7T=0HR{ z<9oJ(Hxr+|;7;3508{6q5c`daU9u4?Z}~8Q5HP&XN0Ce1i{EUOY|8Dk4Qk(uoutQG zNpCB|yaTyeG>Ed zmZap$H}HPK>Wun(v8Mv~!@UEyA)tqo-&T0&9Sy!(v8io0w{hl98so zdE#WC#m)09$qHrTs!X*0E6&7@`B6*Joa*Y8vYHr^3bSrEu$}hq)6{{Mt8Tv)M8wk> z`at0KTfYt<+br+Rz`4g8vL+Q;fZ0cFHb|lP*p>ZwGw@t6#ilpJPb;*4a%aj}44QoZ zXECF2;0G3Dc_hUTY`= zbBxy=b-*t_5vJbTG~O(Cxm=|h{vi6RhYxY`mj;4k$biFxOIbMSs{FvB8JEf~hzq;L zII5qU9(o?!U+PT#3TS2%D_f({p9cgWNJd>wTgo^QmY~g>d=o|KD9Xisb=0$vaP44L zGvx2!hu79f%PT1}kaDLFe4H#Jz#)_5A!J|QiJk-8Aa3rQ1oYW;;bv8np;}hNzPaB{ zaAs6$3N*L^(^47JgfHKVB@rqJg>g5(HbnMPyiKxva#t_MCQ#yv2i>If{2Wl_AcdBJ zkv&<5p^nCc$*v~>BToXTMT80Vesg)WgZOZ*VP2i@NWCUkx~;p&+$x}-9~9`n z7xQN$Ij!;yeDiBXk-CVtgv=MuCWOYVt#Sl2igkn@)TSGyF&%n>aypZnU>JH(uFOu_ zLpfL8HYWNpE>E@?KAI`sVT1QpJbp3NZkHOT5v1%+rs^A8lnm4wv*Dnprb&ypCr8Ya zG$1KT{yXOia1g7M88su%T9sOQ=I|7dy#SUApXvhrBPP?vPA1yFJsfD+D6EV~{KaW4 zVF!_Nz14WNrAnwRrlTC@(WH3P*u5#W-F78l>_n@V--kf`D^>I9e#q0aoo{zpNr%>= zcIj6jegi1CcI<{5=*zwRTW@c@7ZYFFd3|&d8Bk>U&Us5XRMvd{hc@JD_~4Z2&Vx^K z)qiZ*Gr~I7L86;*O=OU_1ghJryq2Ksdz5_~7W0BsG?of4d{-arM_nFI+`C?@lVAjZ zKsO_{b(4dclI#a`bm?{BNwd6rDqGfF5kJ!5Cww@vV)+lfgvPWEgxlVGC}i z+ulqnY|J#&YJv0T6wzTh+Bb|MJAdgHiL9}>pUqH{cM8f(N@z^6yY`Q?yf@QxasJJ zXfGC)|NT1>uZ|6`jX-3KEww4uXJfXka>x3`mIiCdq4Hgo_A(e9x7J=NH62`C+RXqb zsN=oZe=iXW}{!Yj6Gj0}yK!--|gre~h+Q*P`Wi9d^Te+j`KF8@D=VY4_(kbJ`eznf&Mr$peKupDiROJ2IGgIKeu zv@dBkYPuGV9VkkUG0-2SmC!wr5$l`lF_moF%zc0N)X^(rNk$aCCj4Z9k%n3BJCUzz zb4{LRajA{t?O;9mk&-d^v9@fZY<@vFh&WcqNAY?;(B0VKnGh+zb(l$cK`Z7u#jU{S zj90U{rmJoX-gYpghZeVQ0I7&e+c&gv7mV6Zzq_)2#5O25Ym-NBDYehe&a9By79Dx; zuUEg_9W9U8--m;Z_nN9}SGiTH{B5d``N`sod1Bx>orx!lWZFsOeuL0iq`wdK?+~oi zZG_Zz81_W=g{Qgt$!r7gZ-rA#RYGUh4`IWmir(9RB z=6VPbY>$Trn+Z4-T3MH`h4EeHn1%g*3tPJTA$`lU*Z>lcUcfN^#pT={xT?C2vm&^S z^cXA|xUQeu0Y$Y5F;)qk-r1W^v14fdQgZD@)i2jN%86Lb+f?xvK5ab%v;!I{Y;kb| zWV0K1TWzr7OAdO}aw@{4*o)ub63dMkF)ia*m+5EBr}PiUoU5bngu^#Omy$irXtt^5 z0eXNRl0uyyo!1jI-WjmnGUI~z#~Q;(53t6N@JC|=uixw>DThvxtGq`Yp-dyv)4ef6 z`l5C?QrjbF4+c<%Fx>K1P~5jma)*brpQNPJn(oZnf02;j>4Z{*RphBw!f*9@>xAuE zqAV)TEIoQ1Wo2HmWTi)K(5}wXJ3p(T0g@xQS$dk3y71KFx-ykzZ_rg$r3mea^Sr4I z?&nkXR2ZhHrYMkEP{|(IH)4a%Z^!Oyl$Z6UILk!T1Mo8E@#!Z^3v9Q5!HP0!BkIAR ztx3xYJ*0+cn_OGW2yNeJXQcHEkE(>FT>RW+5CCuZzHyzU=x5L6|=b*9q{fT z|2ii%Z|szzW-w}OFr85?H?Mj>qdTZzLcA(`MMkftVkbsjuZ)eE9|F+)bHn<}o(?Gr z#1r5olldCX_+`NdJ;d5AR_+I1r+k`OSCL~wY!WBWP2&0%pc=Rs_x;l=yeVtjv_;dk zvG~0mi}Uo+4C!=(>%%*7Q?z=2Kyw`6zPfORE>fS-Z_0`vOT==xS(RVpPkJ zz_QHjV)uk=*Qq^r>X9(ra9BY0gwPzOQbpgG{vM+hB7%V0jz2T{xQdaZe$R2zd}#E< z?<5$R2B7{f6iABl-yS~P?t+egiaA9Afjyj;%+Y*>p2Jc4(Kp~%+7AT;iGUiImh$hL zv9Nd6%W+>&5?HY}b2;)x5gX%GMmtsoj_Jo<&QeV*3za52(DR3tov8y_lmOJlYOccZ zK}e1C6$Z~NDl2IkNpuR4JNv3fXPi4?iENTz)Sh6xK=O&_t<0s75$FTeTr!dstPLCh z>8VDUPRAM!H@7!?YWilI*~j0CFYk^^$Ub2?@EpLuqMBMz)VEMGNW^+4CcLQ?1c)koZJ!5CV4AiLQQ;*?<&ZKEhebx6Vyia*5c-LJ`5Q> z>_qRWQ-fi=y@$4`-N$V2QT%K`^zql6(Z>3uF%I0NWTTdMbfZx8>@SNs6&Yx!?CO1W zk8H>4`d{2ToMIkz2CShy@`oJ*m&?C;co3}6E^?m;Cg_h-*rolxH5yO$U8|eIa>}CF zB^X;{>fmArV>wU3>6O8Jp$OcPPuIN}E-eH2p2jPjoos79|2tTRC#VnFsWE0%@#i}R zm0FDA77iMYlKlr?00~gT<&=;o3rOv-oQI?oxx(0HIpG!&q~! z!OxaOGl}&Dy&(zTWRcm#0_~7i;lvG*$})Sl-t5=jR@?d3=s$ zeFrypB_)WUr}D;q-Qb9l*@ZOd?(dsFzp($|`0l-~h$t2?v`RGqJ+BlvzTk%=L(a6N zsCe3K%-YyhuSoMM=*xRAX0ce5-At!~b-`+((K+D{(3900=qcWzEvHcP@>I=Rbry4m z-{BE6nf)R=E@orp*7N+yV<^T_%AMlyM^=wI=dcMon9yx4NA3kyV|ZVv6dnvtgPsde zfaw=tVEf@)kgTsb)Ef-yT8>7C>7h(D;HWo*8a#2W!to02)~KoI!p+&3fJgJmYkueA z9>h31(r0SyTxu|Kz@~6HVy>3)DdU+NCH!+Ie3$>v$XxrC)JS!cgWHn05O^#Gv90%; z{N3=RDD@R#5(vqz4~1%GaO7QQhu~zPceN(Jt8DzU1Vn6bPi34#N1q9YXdNBhGRxYP z{i3^MSE0A?rCD{mJIRh|wB1~3N+CUNYi~gn-R9{*v7u7sMvnk=7!I26$#vNa$M4en zzG^U*B4i(SofiFq+q#@?F|AUhIbFqN6!D)#-d(Uge(VXISZZJ}D0%k8H^}If{B>U4 z9VfJd?Pfvv%!Add)h%DQg9cD0(d%vK+a)LUd}qC3HKj_(gEd@D9|$W-Bb9Ha(}{9d_ZMh}4&VBbMPl*j##H zqsPql*wax(4;Rjke@~L%!`t<~O9slz{^3k6KV+mnUQQPWt;?QjzJ-bwc`cb;bRE;8 zE7&kWa9x|87xySA8&Ii|m45l0bndnwHbgtidUDrqLIUN{Tv*A~(f(_G`^&Q}*0Vw1 zuJ5mAn@ikAa!&^))F6!nG1{>SxMzz!Hm}AaqtPqvO##`V-KOZBQ{EB?ol-7**C(@r z(-W}feKOvt(z5;6Jm;9s+)Ykr47Rjj0jH~c#+w>?oLb+XqGkIweea#P!t|A)r8pDv zqdXYFHbx!3Tiq6wRXnI61`U_MfPQ{`I4=pi*Gi7P5))P+j0K*M^R1Tp4(94m~gk6R?%uQ98ziq>g1LlG^FCf zJG}%La?9wUjxFO=Q&qMPNzmTz7rPg&CpW31Atf{6HK+#$wNK?H#!V{~351e7&@rCI zjrU>*7Qr!b4RWP&VbxY0xpTwmHkutE36B`V?hu@*7eg5l{pk9AYHtDPZSI9nh4p*p z95^H{FzgmHw^HYH=j}{S*4&Q*kFqy*VL1iPk|P3-@gG}KvjB();yzC^Ye3(-ObvO- z7UQpJO2Nj*x%s~QO=AD#A48`<{w7R+_aW!$f9zpt568=F>1!TakPXSL7`+cdB)ZwQ z3)2Y;Rd_kF_*cRtrU>penj0Z?BL_)X3SF+BOa|C z*Xa8Wm?H?sJYwR~l>B--2rAiOeIQiCQi3ygE(>qZH1RGXIPB{JJa~#5S8nLVOW497 z!8!7LE`AAeWDBw2g93GpPYVKjbjY74$ynU6rK+Fc1<3}pt!eMYLQC5SEYH{M{^aR5 zEufUS=1`-{eM;Y1f9)7fjLV*RIqB0rO!CyPc!fXW*qr-ush=H2}yqRb631} zid*;i&FY=~C9}2ek=JkR?Cf4MZ?$PAmh`sb@?Y8FkM^_XI)ht^s$Af|Y%X*IYG@39 z8+_DK&C2ta)dG!1+*ojPoJO7OQqqfswG?opDCxi=v{A7iGldjf>6|GFj2r5vEvson z5fvqJbycq>L?G2fau)0BV>{DtW8=R=R?d&!nJRugE}@maA8p45TaOac^t%>xdGQUY zH#>3i2s2~0R;XN~$0$wz3DJ%R;DO$3ci%6MwU@2w7d$tZ+b-|>xrTq-@x|Z@gK87% z&^RrlGAOMKD00Fv{x2yb)v!sNJDDqz(N&2e6}3sp;V-U zw6a~gf7Ph?UH^-si;=RyO>1iwE`3t{9s=(o%bl*vX}+IJ6=$Hw@QWeUAE3}5+o^(p z0JpD*;4D^ndglmq^eTe3?Gk`xmb^394Q=rgQ8Zw3GU8lcxPC!Td8)vzx^HVFgn zv8VZbRwq-@;QWw*~_Rg7I1NtYQVql^Y4+(|0ykx~Q5w1pxo>UM7MEBA8s z=+0m)Sd^SIZo%1ZFt29icO1@;<@CC%XL#kA&w`~gXn~ITvWuY^NNaM#=F2t2fw;8a zl&18_pYjZ7h+N;St$iaq&)!)agF^)jQJm2XHN3sf@V6DK38izaDgT<(Yj5nL?4n-z zTD1$yv6b%qdpzbX|1wX3;Nrsef_=}c@Zd zU8nGlW^M@G`c$ZllYmvr^QT+q_C*2Q$(PZ$#Co!R43{sLV+M*_-3KNW5$5MGVcE66 zk**c~%T8v~zwcz$z>Erp?$i;KSp4vtnr*~wV4rrpX!_EvSs68Xx`O-WtMj3*4d#uIovDEfc&d@X5Hr>1K!K(kgvzVI>M;GT3N64Ii5_fKr(bzAT3a!<$Jir?OZ-w}?wH`|-j_ig z?EhYOJasgonswY7AdYKWn(52MsLd3I&GVz7y*4bGHk1hiT(Ofw@z`3=*RSE?V22Bb zj>e;0kGdl~z%MXQ9^7qp^DPxGsHd7OZh8-PinHyY%ITlm+5!@wiQKev&Gy1nbE$QI zGl$~~5eEFeQIBu{1+~VUz8I*Iot;@$ioOWnKOQeFSZ5H z+`w8*t@yk{Z__MBy_M1IsSSz#DT=i8;7STE&2jd#7e6s>T3V-VdY9mU`FsLtm9#KM2Gk3is@6g~a<-RZLFG3$roSWYaeiTq$u z>T#~%UT6ZPsrlJEJsDF6k``o=OykZyyag3+0}q#$6hY9;3~(v#JTv~hQmTPb-|S1g z<818>Y z>Yu71^_26kH;*{VC6eD(`T|zl>wR^6?`LGC%&R693bz>#9@d#uEPoGtsQO)k%JSA#{b7rTpTseRwgQii(3MY4BN6F_mRx)@7}6i&Qqt`p`y zUBfN-v1hO1VXLNJx!g&;KA(b6odE-q1{42#QvXt9X}q+2k-8lduDah0k*%sR%#`f1JWD~~kC0LW|=$tKO$_)7m8(@KLrzk;X-f-*qZ zm2l~<+?fUE`V#&P54&yzlsuM-b~x&aV|?E!6aUDh%t?OTw*Wg3jGs~iqJL@`qJkxcBeZhL8$vlB_z{^1@xl6Ck80?*% zLA3f55n+TPy5L8n%QhcH#OglWivCpz7kyo@4rty%M=P34BBRhpGr37PE$vBnO{PP& zB#NC@CUq7-fHGi{XA;Fbnp)<7Ua+J3DjSAV2FY7=DmUtDT)jZc!s{zwYM_gm&)7T6k zbsJ_K^>+re=1o@^=i*A~G+H+|rpKs!xBH8tk|_bjMf)VR+$2!~%5tg;_w9Ehrz&4& zW@kV2g^f&i#_RKan=6OAJ!UU#dl3r(TCZb;g8AP=5hA@s-4_*to8Y}#X~CHH)Jx`* zcz=NPaI|_xeTmf0X@fxsKAncEk_0RCd=O@vq>0I2h#%TOhB?^PYvRxE@HTq__>skb zt)i^C^9DSueGjre@8EdRV#^zSRUN{J8B4E1@QWxp*%?;K4|RxLc~gImUpW+luQBDw z_w1OE2Ls;DrZvRZwgC+Qa(+z9crqiRzlM1Q@X z_{x3qwb(D23;eYK2Or=*Q2o}sDh=bsK+#E#v&1el!AuX*~vea$q?H#_Hh_~N19 zb1R3_{td-JC$8x~ZmH|noWYNgv1T4I!Z)~@W36$#Rr-oYH5V5r*+*`DL>~fu>gZ66 zeCcpPEz^FKj5_-$yY}R0-dX!7z2C%UjPH(rfe}yr;ouA6$Lz%6|3h|S<;U#AKeHjA zCWg}$yt9Xc<~J(OntaUtkutC&8GL`}E-ZHY*~9;_m`MP&JpSkT-|F{_IqkIaZe&DJ zmYSqC|H+|(1eg(k0r)8qcetbr8*jQsUp0EwnUYY})QAOv z5M^xjF4@D?&A8dRea(8h_kK`IA3v-&)}*SICU+xqYPJoR->P9Qas2Jy#Gd5-7X{*z zA>0>sy*fDgjcZX`D4p)b1bu=O=G7_U=-qB(rjDdX4sa~yiwu2??yQV&Ixc1Ae}I=ecr}gof5~?Kv&pqo}{tLKNVMyv3 z#BCQWY|04jh>7JfSQjp8ciT0`s&aKlB@PzL$sW#Wzh;EcRwacUoh9R!EKRp(k%!+f z_FT5mOUrt|a3AYJy zVarNCHAU`b8%{2=UH#0%jSZ~L{Ly#8e>_~dx%tlO3d6ipVNhkKpfoYbHTx8xSj=b} zLN(tT0;#E=-ByFhgrQ?#gfEMmEuOecwMh1_@ZJsZLD<0s3r*~1@A7gEA><$LnDAe( zT}~sHko}yy`bswZcTxhQR1szQN!we|mq}l6?86Y#V~?8a45G`99VkOYu~neg z$CFC7cW7{uFnSkCn!%xPY*FnWul?O#RE01}bYS!FzrAcLWx}4T%XG+jVU@jq&L8|> zjvfS)DdB~=fl+Z(NAHF=%!_^Ty|bI$l+E{Iw~v;b4<8Hu@y1-sxpI2A^fCKlA;2eF zsPU3rU=)QPuj|i?q3Dk(B5l+H=xP&m9R=-L@cBV>gZ6tdJ59;Szud;{K}oYXWL7f@ zQMb}Sb1YZf zEi4`$$G&;2-BUuI8`7O!{b+IBHN@`mfc`93kEEfaLT_DhuVGOg3FnzM1G!Fg;b6{e zC;nR41Dui$okLYes~z6h!_1;M^36%&K54WJ7r$@V3SbmQ5YSvEcB<;{|NbMK^_z5% z<%Bc@JJ?%n42Ir%#7xb>t|VAce|Tl$Kb~8UNDiAR+bo-H1vZR*OujwdjO6u&ku~Z; zt51T1-iukr4!-qtYAK$S)iWNRzR!z46(5u6JWNN-TURfv@r?CLF1}`Fpd*{3fE=4& zK6E5hHT(YOa|dJgGeEbjeqs1(=DEV=<6me4i8g?OK54LC;bu2c%pCH|zd!5$>nF+) zdCm=ip_UrZMtk*vlQF4bIPz)3=S~z4pJHdP`2_ZlO`MWNkHIV>uuNJWyt0T>KEm+K zhRZx>#dBBqkQ=c|^>fEYe81IvSEfXRGCXs!G=!1$X7FsQ)ZWjER$u c.poly), { y: -CARRIAGEWAY_DEPTH, uvScale: 8 }), curb: kerbGeometry(chunk.curb ?? [], (chunk.carriageway ?? []).map((c) => c.poly)), - sidewalk: flatPolygons((chunk.sidewalk ?? []).map((s) => s.poly), { y: SURFACE_OFFSET, uvScale: 4 }), + // Korrektur: derselbe Belag wie paths (concrete_pavement), also auch dasselbe uvScale — + // Poly Haven misst die Kachel mit 1,8 × 1,8 m (s. Kommentar bei paths unten); mit 4 wären + // die Platten um mehr als das Doppelte gestreckt. + sidewalk: flatPolygons((chunk.sidewalk ?? []).map((s) => s.poly), { y: SURFACE_OFFSET, uvScale: 1.8 }), markings: markingGeometry(chunk.markings ?? [], (chunk.bridges ?? []).map((b) => b.poly)), lots: flatPolygons((chunk.lots ?? []).map((l) => l.poly), { y: SURFACE_OFFSET, uvScale: 8 }), bridges: extrudePolygons((chunk.bridges ?? []).map((b) => b.poly), diff --git a/src/world/materials.js b/src/world/materials.js index 19d2c1a..43a5600 100644 --- a/src/world/materials.js +++ b/src/world/materials.js @@ -13,11 +13,15 @@ export const TEXTURES = { // Parkplatz im Asphalt der Straßen. Beide lädt createMaterials nicht neu, sondern klont park und carriageway. field: "leafy_grass", parking: "asphalt_02", - paths: "concrete_pavement", // helle Betonplatten, auch für die Gehwege aus Teil 2 gedacht + paths: "concrete_pavement", // helle Betonplatten, seit Teil 2 auch für den Gehweg (sidewalk unten) carriageway: "asphalt_02", lots: "asphalt_02", // Parkplätze und Vorplätze: derselbe Asphalt wie die Fahrbahn curb: "curb", // modular_sidewalk_curb_kit (Just8, CC BY 4.0), s. tools/assets/textures.mjs - sidewalk: "sidewalk", + // Korrektur: sidewalk_Diffuse.jpg aus modular_sidewalk_curb_kit ist keine Betontextur, sondern + // das Platzhalterbild des Kits (roter Schriftzug "Tru-planar Sidewalk texture" auf dunklem + // Grund, im Browser geprüft) - das Kit taugt deshalb nur für den Bordstein. Derselbe Wert wie + // TEXTURES.paths, s. Entwurf Abschnitt "Die beiden Kits". + sidewalk: "concrete_pavement", // Ruling 56: eine Brücke ist in den Daten dasselbe Straßenstück, nur über Wasser — dieselbe // Textur wie die Fahrbahn, sonst zeigt jeder Straße-Brücke-Übergang eine Farbnaht. bridges: "asphalt_02", diff --git a/tests/materials.test.js b/tests/materials.test.js index f5ea8e3..2f40bb6 100644 --- a/tests/materials.test.js +++ b/tests/materials.test.js @@ -105,9 +105,13 @@ describe("Schichten aus Teil 2", () => { expect(MATERIAL_KEYS).not.toContain("roads"); }); - it("nimmt Bordstein und Gehweg aus dem Kit", () => { + it("nimmt den Bordstein aus dem Kit, den Gehweg aus den Betonplatten von Poly Haven", () => { + // Korrektur: sidewalk_Diffuse.jpg aus dem Kit ist ein Platzhalterbild (roter Schriftzug), + // keine Betontextur (im Browser geprüft) - der Gehweg benutzt deshalb denselben Belag wie + // die Parkwege, nicht den Kit-Slug. expect(TEXTURES.curb).toBe("curb"); - expect(TEXTURES.sidewalk).toBe("sidewalk"); + expect(TEXTURES.sidewalk).toBe("concrete_pavement"); + expect(TEXTURES.sidewalk).toBe(TEXTURES.paths); expect(TEXTURES.carriageway).toBe("asphalt_02"); expect(TEXTURES.lots).toBe("asphalt_02"); }); diff --git a/tools/assets/textures.mjs b/tools/assets/textures.mjs index 8b77d40..a0b144c 100644 --- a/tools/assets/textures.mjs +++ b/tools/assets/textures.mjs @@ -24,10 +24,14 @@ for (const slug of SLUGS) { } } -// Bordstein und Gehweg kommen aus modular_sidewalk_curb_kit (Just8, CC BY 4.0). Der Ordner -// gehört dem Nutzer und liegt nicht im Repo — das Skript darf deshalb nicht von ihm abhängen, -// sondern überspringt den Schritt mit einer verständlichen Meldung, wenn er fehlt. Die vier -// erzeugten Dateien sind versioniert, danach braucht niemand mehr den Ordner. +// Der Bordstein kommt aus modular_sidewalk_curb_kit (Just8, CC BY 4.0). Der Ordner gehört dem +// Nutzer und liegt nicht im Repo — das Skript darf deshalb nicht von ihm abhängen, sondern +// überspringt den Schritt mit einer verständlichen Meldung, wenn er fehlt. Die drei erzeugten +// Dateien sind versioniert, danach braucht niemand mehr den Ordner. +// Korrektur: sidewalk_baseColor.jpeg (-> sidewalk_Diffuse.jpg) ist raus. Die Datei war das +// Platzhalterbild des Kits, keine Betontextur (roter Schriftzug "Tru-planar Sidewalk texture", +// im Browser geprüft) - der Gehweg benutzt jetzt concrete_pavement von Poly Haven, s. +// src/world/materials.js. // Über CURB_KIT umstellbar, damit der Fall "Kit fehlt" geprüft werden kann, ohne den Ordner // des Nutzers zu verschieben. const KIT = `${process.env.CURB_KIT ?? "modular_sidewalk_curb_kit"}/textures`; @@ -37,7 +41,6 @@ const KIT_MAPS = [ { from: "CurbMat_baseColor.jpeg", to: "curb_Diffuse.jpg" }, { from: "CurbMat_normal.png", to: "curb_nor_gl.jpg" }, { from: "CurbMat_metallicRoughness.png", to: "curb_arm.jpg" }, - { from: "sidewalk_baseColor.jpeg", to: "sidewalk_Diffuse.jpg" }, ]; async function importCurbKit() { @@ -53,7 +56,7 @@ async function importCurbKit() { continue; } // 1024 wie alle übrigen Texturen: die 2048er des Kits wären für ein 15 cm hohes - // Wandband und einen Gehwegbelag Verschwendung. + // Wandband Verschwendung. await sharp(`${KIT}/${from}`).resize(1024, 1024).jpeg({ quality: 90 }).toFile(target); console.log(`${to} erzeugt`); } diff --git a/tools/extract/run.py b/tools/extract/run.py index da8b520..31b5a7e 100644 --- a/tools/extract/run.py +++ b/tools/extract/run.py @@ -170,7 +170,7 @@ def main() -> None: "attribution": "Kartenkacheln: GTA VI Map (CC BY 4.0) — https://map.gtadb.org, YANIS v15. " "Wahrzeichen: rolux/gtamaplib-vc (Unlicense). " "Flamingo Park: © OpenStreetMap-Mitwirkende (ODbL). " - "Bordstein und Gehweg: Just8 (Sketchfab, CC BY 4.0).", + "Bordstein: Just8 (Sketchfab, CC BY 4.0).", }) print(render_map(OUT, OUT), "->", OUT)