From a69e69e6638577bf0c72f2ae079194f0350cced1 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Fri, 27 Feb 2026 22:31:29 +0100 Subject: [PATCH] feat(perception): ground vision cone in human sensory physiology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Visible half-angle 150° → 100° (200° arc), matching average human binocular field. Blind spot widens from 60° to 160° — genuine vulnerability behind the character. - Forward half-angle stays at 60° (120° arc) — binocular overlap zone. - Peripheral zone represents combined sensory awareness: visual periphery + subconscious sound/motion tracking, not just eyes. - Per-character VisionConeConfig allows implants and perception modes (D-017) to widen beyond the unaugmented baseline. - Fog shader: smooth back-edge gradient via smoothstep blend between Layer 2 (peripheral) and Layer 3 (deep fog), eliminating blocky stair-stepped tiles at the rear of the vision cone. - D-015 updated with physiological basis and per-character config. - D-017 updated with vision cone modification by perception modes. - D-020 updated with protocol versioning policy: PROTOCOL_VERSION gates wire format, not gameplay parameters. - DB backup after sprint 21 close. Co-Authored-By: Claude Opus 4.6 --- client/shaders/fog.gdshader | 51 ++++++++++++++------------- decisions/architecture.md | 1 + decisions/perception.md | 13 ++++--- docs/backups/settledreach.db.backup | Bin 491520 -> 552960 bytes server/src/perception/vision_cone.rs | 41 +++++++++++++++------ 5 files changed, 67 insertions(+), 39 deletions(-) diff --git a/client/shaders/fog.gdshader b/client/shaders/fog.gdshader index c64bb31f9..dbcda4abd 100644 --- a/client/shaders/fog.gdshader +++ b/client/shaders/fog.gdshader @@ -73,33 +73,36 @@ void fragment() { vis = 0.0; } - if (vis > PERIPHERAL_LOW) { - // In or near vision cone - if (vis > CLEAR_THRESHOLD) { - // Layer 1: Clear — soft edge gradient - // Alpha matches Layer 2 at boundary (coverage=1.0 → 0.25) for continuity - float edge = smoothstep(CLEAR_THRESHOLD, 1.0, vis); - COLOR = vec4(DARK_OVERLAY, 0.25 * (1.0 - edge)); - } else { - // Layer 2: Light fog (peripheral + forward edge) - // D-059: animated Perlin noise, 8-10s cycle - float noise_val = texture(noise_tex, tile * 0.03 + vec2(time * 0.11, time * 0.07)).r; - float coverage = smoothstep(PERIPHERAL_LOW, CLEAR_THRESHOLD, vis); - // Blend from heavy fog (alpha ~0.38) to lighter fog near clear edge - // Taper noise to zero near the clear boundary — preserves breathing in deep - // peripheral but keeps the Layer 1/2 transition clean (no curly edge) - float noise_weight = 1.0 - smoothstep(0.5, 1.0, coverage); - float alpha = mix(0.38, 0.25, coverage) + noise_val * 0.05 * noise_weight; - COLOR = vec4(DARK_OVERLAY, alpha); - } - } else if (explored > 0.3) { - // Layer 3: Deep fog (previously explored, no longer in LOS) + if (vis > CLEAR_THRESHOLD) { + // Layer 1: Clear — soft edge gradient + // Alpha matches Layer 2 at boundary (coverage=1.0 → 0.25) for continuity + float edge = smoothstep(CLEAR_THRESHOLD, 1.0, vis); + COLOR = vec4(DARK_OVERLAY, 0.25 * (1.0 - edge)); + } else if (vis > PERIPHERAL_LOW || explored > 0.3) { + // Layers 2-3: smooth blend between peripheral fog and deep fog. + // Same gradient approach as the forward cone — smoothstep over the + // blur radius eliminates stair-stepped tile edges at the back of + // the vision cone. + + // Layer 2: peripheral fog + float noise_val = texture(noise_tex, tile * 0.03 + vec2(time * 0.11, time * 0.07)).r; + float coverage = smoothstep(PERIPHERAL_LOW, CLEAR_THRESHOLD, vis); + float noise_weight = 1.0 - smoothstep(0.5, 1.0, coverage); + float l2_alpha = mix(0.38, 0.25, coverage) + noise_val * 0.05 * noise_weight; + + // Layer 3: deep fog (explored, no longer in LOS) // D-059: near-monochrome, ~10% zone temperature tint, 15-20s breathing cycle vec3 zone_tint = texture(zone_tint_tex, tex_uv).rgb; - float noise_val = texture(noise_tex, tile * 0.015 + vec2(time * 0.06, time * 0.045)).r; + float noise_deep = texture(noise_tex, tile * 0.015 + vec2(time * 0.06, time * 0.045)).r; vec3 tint_color = mix(vec3(0.04), zone_tint, 0.1); - float alpha = mix(0.62, 0.76, noise_val); // Fog breathes - COLOR = vec4(tint_color, alpha); + float l3_alpha = mix(0.62, 0.76, noise_deep); + + // Back-edge gradient: blend Layer 2 → Layer 3 over the blur radius. + // PERIPHERAL_LOW * 3.0 ≈ 0.24 — matches the 3-4 tile Gaussian tail. + float back_edge = smoothstep(0.0, PERIPHERAL_LOW * 3.0, vis); + float alpha = mix(l3_alpha, l2_alpha, back_edge); + vec3 color = mix(tint_color, DARK_OVERLAY, back_edge); + COLOR = vec4(color, alpha); } else { // Layer 5: Unexplored, no maps — information zero COLOR = vec4(UNEXPLORED_COLOR, 1.0); diff --git a/decisions/architecture.md b/decisions/architecture.md index eb9040693..693920e1f 100644 --- a/decisions/architecture.md +++ b/decisions/architecture.md @@ -69,6 +69,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser - `ObserverSnapshot`: the only data structure crossing the boundary. Contains visible entities, fog state, sound events, monologue triggers, HUD widget data. Variable shape per character build. - `PlayerInput`: semantic actions (MoveNorth, Interact, UsePerceptionMode), not raw key events. Timestamped for deterministic processing. - `SimBridge` trait: abstracts transport. `LocalBridge` (subprocess, channels) and `NetworkBridge` (TCP, MessagePack) implement the same interface. +- **Protocol versioning policy:** `PROTOCOL_VERSION` gates **wire format compatibility** — field names, types, message structure. Bump when deserialization would fail (added/removed/renamed fields, new enum variants, changed types). Do NOT bump for gameplay parameter changes that affect what data flows through the same format (vision cone angles, NPC behavior, map layout, balance tuning). Per-character variation (D-015 cone config, D-017 perception modes) means these parameters differ between entities on the same server simultaneously — they are game state, not protocol. The client renders whatever `ObserverSnapshot` the server sends; it has no awareness of cone angles or perception mode configuration. - **Kill switch:** If no working prototype (character + fog + one NPC) exists by week 8 of development, pivot to pure Godot. If bridge/sync code exceeds game logic for 3 consecutive sprints, the architecture tax is too high. - **Development sequence:** 1. Build Rust simulation as standalone binary (testable via terminal/logs) diff --git a/decisions/perception.md b/decisions/perception.md index aab16a5de..fe54c84a4 100644 --- a/decisions/perception.md +++ b/decisions/perception.md @@ -19,13 +19,16 @@ How the player observes and interacts with the world: camera, fog, line-of-sight - **Date:** 2026-02-09 - **Decision:** Camera is locked to the character at all times. No panning. Optionally rotates to character facing direction (player option, later version). - **Rationale:** Pannable camera breaks the information model - you become a surveillance drone, not a character. Locked camera reinforces "you ARE this person." Rotation with facing direction restores directional audio mapping (binaural becomes viable again) and creates a natural vision cone (front = detailed, peripheral = reduced, behind = blind). -- **Vision cone model:** - - Forward: full LOS, full detail - - Peripheral: reduced range, dimmer - - Behind: fog / blind spot. You can be snuck up on. +- **Vision cone model (physiological basis):** + - Forward: 120° arc (60° half-angle) — binocular overlap zone where both eyes converge, providing stereoscopic depth and high acuity. Full LOS range, full detail. + - Peripheral: extends to 200° arc (100° half-angle) — combined sensory awareness envelope. Beyond pure visual acuity (~120°), this represents the character's subconscious tracking of sound cues, movement in the corner of the eye, and ambient sensory input. Nothing supernatural — just the human awareness envelope. Reduced range, dimmer. The fog shader gradient (D-059) is aligned to this outer edge. + - Behind: ~160° blind arc — no sensory awareness without explicit cues. Fog / blind spot. You can be snuck up on. The monologue system (D-016) bridges this gap when the character's senses fire ("Footsteps behind me"). + - Physiological reference: human binocular field ~200° horizontal, binocular overlap ~120°, far peripheral limit ~100-105° per eye (NCBI Visual Fields NBK220). +- **Per-character cone configuration:** The physiological baseline (120° forward / 200° total / 160° blind) is the unaugmented human floor. Bionic implants, perception modes (D-017), and equipment modify these angles upward. A back-of-head optical implant might widen to 320° visible (tiny blind spot); an ANA-touched character might approach 360°. The `VisionConeConfig` struct is per-entity, not global — different characters can have different awareness envelopes simultaneously. This is gameplay parameter variation, not a protocol change: the wire format (D-020) carries the *result* of cone classification (which tiles are Forward/Peripheral), not the cone angles themselves. - **Reference:** Hotline Miami's camera made that game terrifying with the same principle. - **v0.1:** Locked camera, no rotation. Vision cone still works on fixed-north map. Rotation deferred as player option. - **Raised by:** Team Leader (Jeroen). +- **Updated:** 2026-02-27 — cone angles grounded in human sensory physiology; per-character config documented. ### D-016: Internal monologue as core perception/atmosphere system - **Date:** 2026-02-09 @@ -54,9 +57,11 @@ How the player observes and interacts with the world: camera, fog, line-of-sight - Higher: biononic thermal, enhanced spectrum, passive scanning - ANA-touched: pattern recognition across all feeds, predictive awareness - **Playstyle implications (Nigel):** Low-tech Guardian playthrough = survival horror (blind, relying on contacts and paranoia). Senator playthrough = information overload (cameras and tracking but drowning in data). Perception modes are playstyle selectors. +- **Vision cone modification:** Perception modes and bionic equipment can widen the vision cone beyond the unaugmented human baseline (D-015: 120° forward / 200° total). Examples: back-of-head optical implant → 320° visible arc; thermal overlay → omnidirectional heat signatures through walls; ANA-touched awareness → near-360° pattern recognition. Each mode modifies `VisionConeConfig` per-entity. The fog shader renders whatever the server classifies — no client-side awareness of cone angles. - **v0.1:** Natural vision cone + basic audio indicators + insert minimap only. Additional modes are milestone features, each self-contained and modular. - **Engine implication:** Each perception mode is an observer query against the information boundary system ([D-010](architecture.md#d-010-multiplayer-ready-architectural-baseline) principle 2). Engine doesn't distinguish between eyes/thermal/camera - all are "given this sensor, what state is visible?" - **Raised by:** Team Leader (Jeroen) proposed thermal and camera hacking. Full team developed into perception mode framework. +- **Updated:** 2026-02-27 — vision cone modification by perception modes documented. ### D-018: Three-range sound model - **Date:** 2026-02-09 diff --git a/docs/backups/settledreach.db.backup b/docs/backups/settledreach.db.backup index 6a567e64a102279334de24ae91aaa6a678a1ef0c..4602899e248ec5d1b64e08642177d4b818d041d4 100644 GIT binary patch delta 56628 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 Z?_s>E@zen}EY__b9y~_~C@CI2{sQ{OM1ueT delta 18667 zcmc(HcX(7q+xI!MdwNSHB!Of>keaZ4lK?{Ky^4s`lqCexNTCX0>4GAlFbEb9#Eu}y z(iHT0d>*iXfPx@J5K*xg^eHOeJ!kivE$VfB@B97n!FBEY&dhz^)8{vH<~~{Qaf<~D zvQ}p@{V0l>wZ_(s?zd~wHjU3$cR>U-^C3B*c6XxPtM1;DH87EOFSPHq(`8& zvKM$f!TCMtElT1E{!8&*>Q440bV^`pl}UmOPtrkp1f6KHN<*mi4<*{y2A>&4_p~Sh zS0%~873iFqPT`$n=oDN(mM$`L*g1~AEjouSW9S!YE0iSwM(5E>GeNsu9j?rmce8$^Ngq;^CCa+d@(=Va-C1;SUqK__?eIoKjUwQpK+-qnbxkrFXh*+fPpjGZKWAZT3QRbSB~A|BR_ey{>lDYe^rUU zZlVZ+8@b(>>yG}0Kktqv1P2wOam;R;y%QbW-4_kv8+D1Ll=hu=Sv#)1s=c6X(pG4* zl{}@5(nMk8pX5*EQzFHG!N0}t9q8B=@n_agr()uY-y@ARvILAm2#zQd53ydeOo=O?ozj^>(piHY;~GC zULC3ysxGxPzAy|qo!m+84Q@BLja$bpRhz1k^1JfAa!om_yrsOV>{PZYk0=i+OO(0F zbfruguZ&ds2Zs$u|FJ@gOrr71(P)03L`!Q_R9iBoyxw0@-%#tP*8U-8%^zY`$H(BI zccXC$e~8_CH|jIUl8H*HtLpt#_0(cH>S0mz!@}r?K=i``$&yKj4KxP(jX`JWV281& zIjyOd7Icljw!~jkUtV2x2Oc;MmB>W8rnVY}LtP3!G7de6r;SI$1i_L<*OgS)`0>HP zXc6u@0d0>KZGyAMq6|z=M7J6>OKTyzMf6c6z?k`2`%?Q@`#^h3JFM-|p4A@L9@3U; z^R!y6OdF>S*ZOFkHM`bY%g{9FuoY^fTCbL?6V#DvKeemsRNJV{)I{ZT<)U&*`KNM7 z*`;h(HYuy2gXSpJN~tnN8KU%5aP=fKfL@3XOhUF|_224u>SyXD^(YL4XVuMeGdWrM zP5MkaDIJv#OM9gkrEStCX|0qXapLddP4O%76Y;!wQamai7WaxTh);?e#8tvRVTZ6y z*eI+PmTE{nslF_;(s$B%6)8W$tQx@M)#b=RugCk!(OX?5OFAklsV|@5rxpvAR0NGy zMJ+PXLK6i{w1Bsy(nPKiAD)U%XBv;?2AE=ivfzu;PzJ*9RHAcucNH2V7%5G$T#bHe z6fEgND0kBC2l<(l&`%gCbk%-QdTU<`PN9v`S^Gpgr~Vwo7|j9jQ2! zHfn#ho9a{f0cGLOS6iAkDkq_DUsZN1&nizS>y(vBK$*#J;2(f>WTyIsdRhGdCiUxT zQ1Zi6A1?KU$?j5Lgem@r`k>TK%9c_kNur=9Z-|%0_r+u4YvOM48Syc3t+-5GqRv&P zE0szKjFq9{baApcRvaew77N5qVkfiH)lE1%jGfjdP@qn@)X zk9x_7&ZBlj;EQ4C^ieN_p~FQzAA!$>q1{V8Yd|OUi~&8=(*%ylu{-S4_Amt5rwrKW zp|%;=Lv1ynn|hMK;W>7vm)a76n+@ouo`}H5Bk(Z;I;ck@aFYS;)W$G$8p$J?XhW31FjRC#XY6H5c2My??RvFOINIgI>^uF6p z-5-WNC$%yHS47}_26Rx%BXC&+E{(t?2DDR)BXCg!E+nuKa`xG&KqPtrS(?dc%!j!j zM)OTH&qVhc$T!zSb4)bbM6*mZ(?l~2bqq-$^(xjchR zG|)r?4CLx>qJClI@bxv2qfZ$5+`UcI%S1iHsL|){5r$rOp^3VisGEUYcbKTFiMp7m zvw@riCdxNaUKn}oJ`;HfBIDm<_k<%|KDUWn2J$*hxOZlX>Ga_5>T$3z_szLwYmH%diw&D&}j1ONMP7z+AeXJ_BAl;o4}5(mEKBc;jHjFp$~q8B1oSJ z|I!kLtJ*<%zc^V~q5h~iq%D$5e4j9}YLQ=(P6OFY5S&VhbWy^1sFm zU9C|auOtia06(V*U4e%eYK_xiW7GlY@(D3r*sGmTJwVEj$!EphLK~p(XMv2b01H0_ ztUFKoFYJ+r1KD-bij+3OX8uzxQ~d(y4yaxE2&nL0RRMZ^k&vV07uRZ|g>^u~0l82* z4D{Jb_*!_Le?WbkKQFHVJ|833i8mX8+INeO$rI&t^>uj^Y|1t1m{bh}|973%gTTPA zsh5H5_sc%{HhG}>f%H7E_4m?P;P;u*1IkKiws=`tCoO`V!~m8FDFcrhr0jA; zNZCgjqzu+fQuahh*%=~bl7%ls$^_a&q^!fn5GjWwbW$cTOv(UZ8=;djfo@7CWq{B= zIw=Em=21E+0|di5DU(=lh?GOIIw=$A43RQGus}#zXC;RtM9L8D@`Ok^1a(pd2zltF z9MaQCnFzQ-qzn*RO($g%>j;rDK;UPcltZ#QDFcMc>7)$MX{Ql%XC5DZ`%4AZ2epWstJNYm&0pMH!?FvN|dEYJ{fnn4}DP1}Xd8#)9q5 zGf3IzFi6>FH%QsxHAvZ$uah#_<+u$}cDYPawi~4E$}>pWo!?+);xb9uZIZInAZ16M zLCOxVLCT(dgOpt^gOuG4gOuI*1}Qsy1}Qu83{rMD!lZ0(^x6$lcDW2v_IeFccIO+U z?9MYu*=LZlJKrQ_uR+Rghe^tL6T{1|JKrE>cb-AYUN0eKofX_3gOpt^law6>DZAYU zDZ5+-DZ5+-DLZ@yDLY&SDZ5+-DLdT;DZ3m7DZ5+-DSN#`g~rgv%jGgi+3Ph(+2Jrq z+3D3uS>L~!r0h0G+2J)w*=~}u-5_O`*C1uL#~@`#oQC$lW}QT%KlOYV>7=o^JoY;wNt1FTY z&rcyK1bLGUl%Ir0cVe?dy?fC-U)rsu`2mCYvH0_SPo6+tB$&qKX=NGu0 z1#S<1Z6}%<6XDv0=EOwo+lA)GL=?Upr?U5DG$lr&-EK5KCSuKQG%qG1eNSA(mOZE} zMk4tYv>_&9?<;ZHcGw$NuswUx${3XaL3CeC#HAow8xt{iADR^t@%uisJ|^Oc{b*@S zg#7>t#6%oA5Lb@g2hqY9iBkvBnwW^HLvcoL9YQ-}Bo4e9SB|l-p#?D#*Iz@cVj>z3 zqZvt2eXGFRn`YE1%pF0UM05gmg}Z{=sZ|dp+K1rwucHTIl;3zA-5V3p{|&SxCgR*1 zXjw{>`9S)eQd)M40E6cpLAh*kb$xwxCAL4rrQ>TyQ0ExkX@5gAVj{l!TU`E&|Bh;7 zBKG@*B)=a8#k869FH4i*N>y+ zF*atOi0#w8?;)0skw`p=9*K!~Y{Rd>>7Z ziQqnnv+>9WXkv_n$uYV7b{>_-L`?rEZk@XRQJlm*7vf6#-Uak*jE%(?QE^Pf_ZQLFn26Dr z;yUW&B{U{R!gCpojEQ*YGAfQ=AF`<>nEMztZz;6mU*NlNFLORN$o6D*FgEK#%T3D^ z^cz}2U!pTXuCRvd&L_{5(wb)n((uLcoV%m#>Vk)DURy~~y}zuww%lLW(N3%53%J{#skTzp|zRGJ-s2RF{|dZEzzo1FkgS;sK&6{UuY1s>(}> zDoA`?eQi;BRXxPl`pZB7V#^xJOZ|EolB3GdszEP9KHfQjb9dDdlQQ4uSGwzu<0Uc^lEYu!FIr zslB3f=p?+2u@oXUJ(SibDvkO%D6^Io$SO#b8+J=}yo#~#_!MvHs6~ry7Y1RPg==^? z80@9niMOao&g2d>T)fICTp>-Pnyx8K30cgREN@tvQCVvWGw|<{MM#U19A(s$lZWcL zU=QToq%>5~=wdvf4i5>;lPwiWbjp_C&$8u7gtV85Kogdxp;;8XSF;SU-eI{7-Vr8P zx+f_qa536eJEB0t!NB-R&B7BBEKPzl5-iCmb(Mt<{YT%yoo-nzT)tg z8mA*ZtU=?f&$jsR2-%XYKL&rwwj?Z|3xdpM%S^;yBmGxjR2N+Qq@|BYmxG!= z(emC8mNu+6$ZfXvrty$1)*pg>p0pmbfLBAOpm)3Vop$V9bT>{BF#n!)OWNJ=#&QU} z!t52gRD>6ZH{fmJ$N0c|)^6HAHE`UqA0b(!l z4lz%(i5YmoN$V7Rce77D@Wu${M#OVh>F%bOrUzM%`*1~X0ZjSJSF@vuj&Dfp+0))ergz~UwA z5PbAet1tNAC2Ipse}|cmt`M<+m=ZpLnejR@w zx`CfU&Q;F)i% zxwIu!=!m)RtSf^Xzq4+pc_Bkc7G!}57W`m6&q6~t#UDS;ScCR|TTk}k#Evv2+9=F- zXEq{rF5cFiX=_z^)q>ya&WsS16a`-NDoDP8I~Fptlc!3h(gf*laGB^Mb(adjZK5sS zSIA@`@r~ezh0L8iBR&p|f*k{xN>)6sx6gcRO-pa5w`+2!x%J;f$*m`^-(a1@N+Wdq z>jrC6R{D>QGaj*y#Lo|8MhLPo!7)3C8Owa9Cr`Vd$->(=S}T%Ng-S9cLLqLo$$A*y z++^*NQfIYLbS?R*BtI1(AmYR!%v91fYVf`x%v{>iiTx_b4P(~Oc=K@PIJD(bE4B@Q zHu~-^Cb6AWoK3e3G7Ff;X#8A&dBMt`;m-s|EM(g7tawf@OydgX9#$SnaPaa9rk-vp zPb3edqR1uRN10U!Lb)GtJq=Y(XrD~&qu{l=R~aPll75mDv8~XPU(DOM(d;VbY3sX| z>*y9*NIypH!!2s)m8du$=l{-Kqw{dqE$*s3*T;fmPGBf-y$7oUSuft$lkZA2`SDK>mwh-f`wA zol926WU8Fh&aDiVr$~#$$A$g;``ovj$hKy>TgO=H(S!7J^n5y-A`3)kOTaY>yORAD*}mg1)%-ehB*D4hOhT`QqNBpo^O0BR8R-Sp(Tr zY+K54_@y7Y9ds`|;U^I7iF@9Jpa*XIGX#ZL`Gvd2br0(e{{Zx=JA+=AU$|H3ZusoK zK~d23-3)g{zlU`7Yf=JLq|LKHlYIo8tp7aBt9~@cb9Kg+2T@c-wa(`5|(K3AxPM_fJ8C= zbqgdEg%j40gkPV8gh}}5R>*83-m%TB^4dQPUH%#FZ|o)JCX-<8VCjP<(X*(vFmNYZ z1K?GMyDs8BrD=TIV(v4V!qO73*NDF-!F+snDFpNItIHs`7jIq8eNNBC58MY&b8y`X z?h|@8zI!DM^;vl7N{F0^EAEG21|IPM1PwTE6$JG->p||S5GbwFi{Anloq^)tTFc#u zyNinhpfyO_J9Ast`RW$f*clPMjF4s1wXm)i&eE}Xa!qW5(p!6Cz%=pR4 zO+VEX`zxwvcC=OaC)ei`RlwQJUz%$hT$G!e8z`*}5}BMZexg}wYOKAl_5e$G0Wfz~6|-j>(U8B|6G zs7=rx(@1|b!CEi&8Xrgv_w~maYzo$Tv&T>%1)uNDR-r&L9?*xqjsi*8*_T~HC*pm5 z*|}T-Q3#abVVR&Xq#s*DYxrlv2`H39DG_&oaa7;6^*Q> z-SClLp-WDD#63z2xZ(ng2Of{O2my!lE{!Xc%R3hc@ z3~!T?#9#Q%;sx<_al5$E8nm9aerw%iZKMm-^XfLW3Y^()!d@y*y-&5O&6O{e_qZF} z32qNJpL>KW;c~dfB(5L(3-~pS5^Jm_)(+Ob>;?99cDv=Qh1%#1ECapS2?0CmQJzSU$}pA}WZpPcs>a+KW3wh@U;n z$hl+~dz?|Kdoqc8E4hyK=tDf(>~8#^Zs2A7JTZ{|AtQBi<%6ix7iD3mX~C5TX^tod zS?VQxOSiBCXTHy56i_dkvQFYmYxmYQfI}rrU4I?*f|=$Z=XaMQDv#%JHRvPiIlL0W zvDCAstldfMc%o#ViKKZ*nlmbor(>OY-T4u{;!qMM3!|+lPA;k}llUW4=9w++$;tTrS)l=(*fO>gS2de@sM5L z})(t*)QcZHJhcjuXu#8DABy))tM0+hn#CJ)g{BO`L8Bb`yD7!kHdc((8G zh#cvRXcNOCNp47rZlQrY85hxVgH1UXvF?a!ra_@3{QX`orTxIBFvyz| zPb8Oz+$q5jt*fq>;jbGIF`$n*H{N`aNyQD9n1q)7%rpn7qQf3(&Awsdjssi@(?>c% z&w)+z3_8=)@WfA1AHMfIlL4F4A`*D8co8PlfGk!_a_PpSCKPl$B*I>GED0QVH3{ta zc@lKOze6x0*UZR8nl8HabK;Vs40ntqk&)w!ny4MHe3{9xwKpZ4#I7Ss8NBG}iBQY2 zG+ug+X^k7sF`4-Jb4)h=l%TiHG0o(t7HWdu`iODk^b1T|tXyDZJop0B3;**1uxHl` zaB{hN0hC@KKfhgInk2c&+7mtFMf~I?rVYM!iAlq6UIMZIk{`!q_$j;0bi^+KYD_0f zmp}??*YEox9YkD>ikXF!_9-||zob2^&DJJ>(`{Q#0jK!0>LGQDx)i+Ihk@&EhH?u$ z*pDeYl!ugA;IrNX9P?%Qd*%%DIJ1yBAfJ&B%A4gS@>F@K?3UA|-=$B$75XLVVX163 zoCSMIZQJ(Yn z58}Wn7(QdpK)XJDib=?#_M2;-SDy$`JpreuZ&F!UJGW!82@7lRQz2P!S+)N`c3WIp z)BvEi;t8PNNIe;nffjd?<;@kfhEiMN(xR3HYI7uw3@&%nWTl>nO^Y6y)Z;N}TFgYG z9>f1hCzX0MB1DE#^kk(rMbgN$bVSqNMm!{g&1gkEV#+x5buYSb8$xL~(36EX8yLR^ z8i-nt&qK&l>%yrY_hwUg>f!Lyus&=`7WGiXs=mZUH|JWMo5^OkCoT(oH=WNh9;t5#6Y(@Z+G~>;ZG)`t-Jq;+0EWn+9hD;XWfe_$FVI3UiBYhK1h*ThAPVcuU9;FtW_3#ot^F_5uV<-u~{xg%} zn-?b+H8JjuP4Y%9hx4)a3scc(vWC}3SOfA1vBvC(CRx0_QATIRCV8SJ$DG(CS5$s8 z;*vtW-$MV$XjW{RBdQhV;>$ll^ZoV{(=EwM=3?}I#)dDy&kTb@z5N5|{z5zuf@a+# z#&j-?YPLIYfCzTRk3!(<5-S)zA-hJB$Z+&VO_c)tH7FDjOX)hrRQHe}7F~jhxTL5is0^DRhxNP5V&$SsFf}eIYH64jmlS2a zJZzmD>q|=_a%9blE}%ayDQc{h>My6@-MChvVl_+2lSfGRitB})@cxG7Y-|B@r?twm z96gDK!8rtul&8hO?SXdsA+I%F^FAE%?4XRZ}Moydlk(;e88Gw#&i~s=jR-Wu zxf*+lypqYpMcrALlNq>gA^Qmmq~ne~*jXsh6mRdro<`sRF}EkXI{ZHLSm=e+tMXa! zO_#*mg+hJ|H=RAlTA04pBFkK~j(&+c1}n#7#B^u;vxQ9e0(`;BUsD44p_YV^;q~B2 zo#8F0#PF}6KpuXEC2~HziX)*H*Yi9$pLwud;NM39H)chCJqoz+<021luAF$OL_!Cy zl6fey9gkE<*a_#UL_Zg2Y5Y|YN{|!E5w{>~*Cz=)yawxtcO>#NP@n_8J&6dn$8s`% zb#D#JcDH^&F&_lQo$OJDe3ZPn^Fo?@Q|(&T-~811(^uGkMLu}o!dvEY=}pS~Rj?w~SJ&putgf9_H>J8JXL^p4xDB*U0?$bJ zfZyXP38Wf21MmGS9fz)yVdzW?q<~XLYhT#o!eP(XJuXuJBtM56AD_s#PbR9q0+(}I zAlXpG)8}!`{#3`M>*(2qbdn4m;^5)1`~EsRr>>eF$u2Qg6&IdDP5v}fM|`FUv6`O0 z&eR^OIyImXRgc*`Ze2CyPnst`UQ>(qc^XyW6;xn_TsnJ->NHdV%s z_;VF+yozM1T=)wWPrQm~s@y;F&vOZl5wpLi1_VPzcj(CvIrRKlmEuOq)Bqo=85${n zrWrd>98&{atfoFt{!B46PEx}o%n@iFV090s9O6=RY!sJ01l*)_?$L>c&=X;q+9Gh) zYS2G?*KaH8YKp30{n!1xrhre`93Y_ZBiY>yss?J)R|(xADh)i8U@CYD>>kLF(H)-B zNrsc|;#zkBTlM9zJ(>dkW8{1C*?JBoQyQwKb+i>%z<#GAurB0J7_X|R(jdV)@bkj& zPUPE#&AVYe2uJ~|ULS#&mqv4r_J(<2U$T85^l4hFudbuss;oJovbw?T8upJC za6HQl^akfQ4{?5TyQeq!>qzs2KeWe(Mswq=;gPFA>P8;tY!?kqO`5_v7 z^N8ae^kq(6y}zc0H1CYMTpM`m!F~kxQ?=!##J|t1WJjZ%4tJngqn?q&%*Y;}(eQh? z5s^A38M=0FfSFI0?s@paJ)FxH+ANJMDuJC%r(w0#lZ#+46y+mGmhjt5PdBFzcNxn~ zkMmgR<%Bu9&NICVVN zHcc;69_-V=$5A)oub*Axufy#HHscSfS+jK296WtIm*>(|^KG#IC!4(z8_XEkCBmL; z7Wj2eZm80Ci%=AD)R+;PzPiO`k?NA;6GInSloRST_**q|teb(}htk3IQ@L&yWyxKO z-3jn#T>>qZmt_WL7IBM_`8QE+m2l4Jzv$ArlpD(izp3JqV21&Jy`|}52kbPchK1cS z@s&#MoT>O)6=%zi{K1xz3fQLClX6(qDU`NRbF0VIV2c{-KN0+$jkQvKNgyLk<{?i* zk2#o(K~?uBBs4w8OX?cECrCH;1XpJN)t= 10); assert!( !has_direct_south_far,