From e532c5efb62eb015fbbfe85b38a4198bb4fc9b95 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 05:27:50 +0000 Subject: [PATCH] wip(mobile): checkpoint the app shell and vision mockup in progress Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VVYRAqiQj9Y1V9ZfG1RcDH --- mobile/capture/camera.js | 109 + mobile/capture/db.js | 93 + mobile/capture/provenance.js | 384 ++ mobile/capture/sensors.js | 371 ++ mobile/index.html | 90 + mobile/main.js | 363 ++ mobile/styles/capture.css | 783 ++++ mobile/styles/feed.css | 467 +++ mobile/styles/globe-ui.css | 748 ++++ mobile/styles/layout.css | 190 + mobile/styles/sheet.css | 508 +++ mobile/styles/shell.css | 1000 +++++ mobile/styles/threads.css | 1387 +++++++ mobile/styles/tokens.css | 365 ++ mobile/ui/capture.js | 957 +++++ mobile/ui/dom.js | 308 ++ mobile/ui/feed.js | 350 ++ mobile/ui/globeChrome.js | 549 +++ mobile/ui/globeHost.js | 171 + mobile/ui/globeStub.js | 1855 ++++++++++ mobile/ui/icons.js | 122 + mobile/ui/inspector.js | 114 + mobile/ui/narrative.js | 142 + mobile/ui/search.js | 139 + mobile/ui/sheet.js | 292 ++ mobile/ui/tabbar.js | 153 + mobile/ui/threads.js | 769 ++++ mobile/ui/timeRibbon.js | 412 +++ mobile/ui/world.js | 553 +++ mobile/ui/you.js | 163 + mobile/vision/assets/clouds.webp | Bin 0 -> 250882 bytes mobile/vision/assets/day.webp | Bin 0 -> 472636 bytes mobile/vision/assets/night.webp | Bin 0 -> 188988 bytes mobile/vision/assets/topo.webp | Bin 0 -> 38946 bytes mobile/vision/assets/water.webp | Bin 0 -> 76748 bytes mobile/vision/build.mjs | 49 + mobile/vision/index.html | 4851 +++++++++++++++++++++++++ mobile/vision/prep-textures.mjs | 25 + mobile/vision/src/app.css | 567 +++ mobile/vision/src/app.html | 165 + mobile/vision/src/js/00-util.js | 240 ++ mobile/vision/src/js/10-data.js | 281 ++ mobile/vision/src/js/20-gl.js | 870 +++++ mobile/vision/src/js/30-world.js | 578 +++ mobile/vision/src/js/35-scenes.js | 240 ++ mobile/vision/src/js/40-camera.js | 189 + mobile/vision/src/js/50-situations.js | 227 ++ mobile/vision/src/js/60-shell.js | 147 + mobile/vision/src/js/61-now.js | 162 + mobile/vision/src/js/62-sheet.js | 196 + mobile/vision/src/js/63-globe-ui.js | 221 ++ mobile/vision/src/js/64-ride.js | 93 + mobile/vision/src/js/65-capture.js | 178 + mobile/vision/src/js/66-threads.js | 288 ++ mobile/vision/src/js/67-you.js | 68 + mobile/vision/src/js/90-main.js | 103 + 56 files changed, 23645 insertions(+) create mode 100644 mobile/capture/camera.js create mode 100644 mobile/capture/db.js create mode 100644 mobile/capture/provenance.js create mode 100644 mobile/capture/sensors.js create mode 100644 mobile/index.html create mode 100644 mobile/main.js create mode 100644 mobile/styles/capture.css create mode 100644 mobile/styles/feed.css create mode 100644 mobile/styles/globe-ui.css create mode 100644 mobile/styles/layout.css create mode 100644 mobile/styles/sheet.css create mode 100644 mobile/styles/shell.css create mode 100644 mobile/styles/threads.css create mode 100644 mobile/styles/tokens.css create mode 100644 mobile/ui/capture.js create mode 100644 mobile/ui/dom.js create mode 100644 mobile/ui/feed.js create mode 100644 mobile/ui/globeChrome.js create mode 100644 mobile/ui/globeHost.js create mode 100644 mobile/ui/globeStub.js create mode 100644 mobile/ui/icons.js create mode 100644 mobile/ui/inspector.js create mode 100644 mobile/ui/narrative.js create mode 100644 mobile/ui/search.js create mode 100644 mobile/ui/sheet.js create mode 100644 mobile/ui/tabbar.js create mode 100644 mobile/ui/threads.js create mode 100644 mobile/ui/timeRibbon.js create mode 100644 mobile/ui/world.js create mode 100644 mobile/ui/you.js create mode 100644 mobile/vision/assets/clouds.webp create mode 100644 mobile/vision/assets/day.webp create mode 100644 mobile/vision/assets/night.webp create mode 100644 mobile/vision/assets/topo.webp create mode 100644 mobile/vision/assets/water.webp create mode 100644 mobile/vision/build.mjs create mode 100644 mobile/vision/index.html create mode 100644 mobile/vision/prep-textures.mjs create mode 100644 mobile/vision/src/app.css create mode 100644 mobile/vision/src/app.html create mode 100644 mobile/vision/src/js/00-util.js create mode 100644 mobile/vision/src/js/10-data.js create mode 100644 mobile/vision/src/js/20-gl.js create mode 100644 mobile/vision/src/js/30-world.js create mode 100644 mobile/vision/src/js/35-scenes.js create mode 100644 mobile/vision/src/js/40-camera.js create mode 100644 mobile/vision/src/js/50-situations.js create mode 100644 mobile/vision/src/js/60-shell.js create mode 100644 mobile/vision/src/js/61-now.js create mode 100644 mobile/vision/src/js/62-sheet.js create mode 100644 mobile/vision/src/js/63-globe-ui.js create mode 100644 mobile/vision/src/js/64-ride.js create mode 100644 mobile/vision/src/js/65-capture.js create mode 100644 mobile/vision/src/js/66-threads.js create mode 100644 mobile/vision/src/js/67-you.js create mode 100644 mobile/vision/src/js/90-main.js diff --git a/mobile/capture/camera.js b/mobile/capture/camera.js new file mode 100644 index 000000000..206d373b1 --- /dev/null +++ b/mobile/capture/camera.js @@ -0,0 +1,109 @@ +/** Rear camera: preview, still photo (JPEG) and short video (MediaRecorder). */ + +export function createCamera(video) { + let stream = null; + let recorder = null; + let chunks = []; + + async function start() { + if (stream) return stream; + if (!navigator.mediaDevices?.getUserMedia) + throw new Error('Camera API unavailable (needs https)'); + stream = await navigator.mediaDevices.getUserMedia({ + audio: false, + video: { + facingMode: { ideal: 'environment' }, + width: { ideal: 1920 }, + height: { ideal: 1440 }, + }, + }); + video.srcObject = stream; + video.muted = true; + video.playsInline = true; + await video.play().catch(() => {}); + return stream; + } + + function stop() { + if (recorder && recorder.state !== 'inactive') recorder.stop(); + stream?.getTracks().forEach((t) => t.stop()); + stream = null; + video.srcObject = null; + } + + function info() { + const t = stream?.getVideoTracks()[0]; + if (!t) return null; + const s = t.getSettings?.() || {}; + return { + label: t.label || 'camera', + width: s.width, + height: s.height, + facingMode: s.facingMode || null, + frameRate: s.frameRate ? Math.round(s.frameRate) : null, + }; + } + + /** Grab the current frame as a JPEG blob at the sensor's resolution. */ + async function photo() { + const w = video.videoWidth; + const h = video.videoHeight; + if (!w || !h) throw new Error('Camera not ready'); + const c = document.createElement('canvas'); + c.width = w; + c.height = h; + c.getContext('2d').drawImage(video, 0, 0, w, h); + return new Promise((resolve, reject) => + c.toBlob( + (b) => (b ? resolve(b) : reject(new Error('Encode failed'))), + 'image/jpeg', + 0.92, + ), + ); + } + + function canRecord() { + return !!stream && typeof MediaRecorder !== 'undefined'; + } + + function startVideo() { + if (!canRecord()) throw new Error('Video recording unavailable'); + const types = [ + 'video/mp4;codecs=avc1', + 'video/webm;codecs=vp9', + 'video/webm;codecs=vp8', + 'video/webm', + 'video/mp4', + ]; + const mimeType = types.find((t) => MediaRecorder.isTypeSupported?.(t)); + chunks = []; + recorder = new MediaRecorder( + stream, + mimeType ? { mimeType, videoBitsPerSecond: 4e6 } : undefined, + ); + recorder.ondataavailable = (e) => e.data.size && chunks.push(e.data); + recorder.start(250); + } + + function stopVideo() { + return new Promise((resolve) => { + if (!recorder || recorder.state === 'inactive') return resolve(null); + recorder.onstop = () => + resolve(new Blob(chunks, { type: recorder.mimeType || 'video/webm' })); + recorder.stop(); + }); + } + + return { + start, + stop, + info, + photo, + startVideo, + stopVideo, + canRecord, + get active() { + return !!stream; + }, + }; +} diff --git a/mobile/capture/db.js b/mobile/capture/db.js new file mode 100644 index 000000000..b3f9677fa --- /dev/null +++ b/mobile/capture/db.js @@ -0,0 +1,93 @@ +/** Minimal promise wrapper over the device's IndexedDB for keys and captures. */ + +const DB_NAME = 'gev-mobile'; +const DB_VERSION = 1; +let dbp = null; + +export function openDb() { + if (dbp) return dbp; + dbp = new Promise((resolve, reject) => { + if (!('indexedDB' in globalThis)) { + reject(new Error('IndexedDB is unavailable')); + return; + } + const req = indexedDB.open(DB_NAME, DB_VERSION); + req.onupgradeneeded = () => { + const db = req.result; + if (!db.objectStoreNames.contains('keys')) + db.createObjectStore('keys', { keyPath: 'id' }); + if (!db.objectStoreNames.contains('captures')) { + const s = db.createObjectStore('captures', { keyPath: 'id' }); + s.createIndex('seq', 'seq'); + } + if (!db.objectStoreNames.contains('media')) + db.createObjectStore('media', { keyPath: 'id' }); + }; + req.onsuccess = () => resolve(req.result); + req.onerror = () => reject(req.error); + }); + dbp.catch(() => (dbp = null)); + return dbp; +} + +function wrap(req) { + return new Promise((resolve, reject) => { + req.onsuccess = () => resolve(req.result); + req.onerror = () => reject(req.error); + }); +} + +export async function get(store, key) { + const db = await openDb(); + return wrap(db.transaction(store).objectStore(store).get(key)); +} + +export async function put(store, value) { + const db = await openDb(); + return wrap(db.transaction(store, 'readwrite').objectStore(store).put(value)); +} + +export async function del(store, key) { + const db = await openDb(); + return wrap( + db.transaction(store, 'readwrite').objectStore(store).delete(key), + ); +} + +export async function all(store) { + const db = await openDb(); + return wrap(db.transaction(store).objectStore(store).getAll()); +} + +/** Write a capture bundle and its media atomically. */ +export async function putCapture(bundle, mediaBlob) { + const db = await openDb(); + return new Promise((resolve, reject) => { + const tx = db.transaction(['captures', 'media'], 'readwrite'); + tx.objectStore('captures').put(bundle); + tx.objectStore('media').put({ id: bundle.id, blob: mediaBlob }); + tx.oncomplete = () => resolve(bundle); + tx.onerror = () => reject(tx.error); + tx.onabort = () => reject(tx.error); + }); +} + +export async function lastCapture() { + const db = await openDb(); + return new Promise((resolve, reject) => { + const req = db + .transaction('captures') + .objectStore('captures') + .index('seq') + .openCursor(null, 'prev'); + req.onsuccess = () => resolve(req.result?.value || null); + req.onerror = () => reject(req.error); + }); +} + +export async function captureBySeq(seq) { + const db = await openDb(); + return wrap( + db.transaction('captures').objectStore('captures').index('seq').get(seq), + ); +} diff --git a/mobile/capture/provenance.js b/mobile/capture/provenance.js new file mode 100644 index 000000000..73f39ba07 --- /dev/null +++ b/mobile/capture/provenance.js @@ -0,0 +1,384 @@ +/** + * Witness provenance (DESIGN.md §6), the browser equivalent of a Secure + * Enclave + C2PA flow: + * + * media → sha256 + * session { start, end, imu:[{t,α,β,γ,ax,ay,az}], gps:[{t,lat,lon,acc,alt}], heading } + * context { device, ua, screen, timezone, network-time-offset, … } + * prev hash of this device's previous bundle (hash chain) + * hash sha256(canonical(core)) core = everything above + seq, key id, public key, sealedAt + * signature ECDSA P-256 / SHA-256 over the hash bytes, with a device key that + * is generated non-extractable and kept in IndexedDB. + * + * None of this proves truth. It raises the cost of lying. + */ + +import { get, put, putCapture, lastCapture, captureBySeq } from './db.js'; + +const subtle = globalThis.crypto?.subtle; +const enc = new TextEncoder(); +const ALG = { name: 'ECDSA', namedCurve: 'P-256' }; +const SIGN = { name: 'ECDSA', hash: 'SHA-256' }; + +/** Deterministic JSON: sorted keys, no whitespace, JSON number semantics. */ +export function canonical(value) { + if (value === null || typeof value !== 'object') { + if (typeof value === 'number' && !Number.isFinite(value)) return 'null'; + return JSON.stringify(value ?? null); + } + if (Array.isArray(value)) + return `[${value.map((v) => (v === undefined ? 'null' : canonical(v))).join(',')}]`; + const keys = Object.keys(value) + .filter((k) => value[k] !== undefined && typeof value[k] !== 'function') + .sort(); + return `{${keys.map((k) => `${JSON.stringify(k)}:${canonical(value[k])}`).join(',')}}`; +} + +const normalize = (v) => JSON.parse(canonical(v)); + +export const toHex = (buf) => + [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, '0')).join(''); +const fromHex = (hex) => + new Uint8Array(hex.match(/../g).map((b) => parseInt(b, 16))); +const b64url = (buf) => + btoa(String.fromCharCode(...new Uint8Array(buf))) + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/, ''); +const fromB64url = (s) => { + const b = atob( + s.replace(/-/g, '+').replace(/_/g, '/') + '==='.slice((s.length + 3) % 4), + ); + return Uint8Array.from(b, (c) => c.charCodeAt(0)); +}; + +export async function sha256Hex(data) { + const bytes = + typeof data === 'string' + ? enc.encode(data) + : data instanceof Blob + ? await data.arrayBuffer() + : data; + return toHex(await subtle.digest('SHA-256', bytes)); +} + +function assertCrypto() { + if (!subtle) + throw new Error('WebCrypto needs a secure context (https or localhost)'); +} + +/** The device signing key: generated once, private half non-extractable. */ +export async function deviceKey() { + assertCrypto(); + const stored = await get('keys', 'device').catch(() => null); + if (stored?.privateKey && stored?.publicJwk) return stored; + const pair = await subtle.generateKey(ALG, false, ['sign', 'verify']); + const jwk = await subtle.exportKey('jwk', pair.publicKey); + const publicJwk = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y }; + const keyId = (await sha256Hex(canonical(publicJwk))).slice(0, 16); + const rec = { + id: 'device', + privateKey: pair.privateKey, + publicKey: pair.publicKey, + publicJwk, + keyId, + createdAt: new Date().toISOString(), + extractable: pair.privateKey.extractable, + }; + await put('keys', rec); + return rec; +} + +/** Estimate the device clock's offset from the server's Date header (±1 s). */ +export async function networkTimeOffset() { + try { + const t0 = Date.now(); + const r = await fetch(location.pathname, { + method: 'HEAD', + cache: 'no-store', + }); + const t1 = Date.now(); + const d = Date.parse(r.headers.get('date') || ''); + if (!Number.isFinite(d)) return null; + return Math.round(d + 500 - (t0 + t1) / 2); + } catch { + return null; + } +} + +/** + * Seal a capture. + * @param {{ media: Blob, session: object, context: object }} input + * @returns {Promise} the stored bundle + */ +export async function seal({ media, session, context }) { + assertCrypto(); + const key = await deviceKey(); + const mediaHash = await sha256Hex(media); + const last = await lastCapture().catch(() => null); + const seq = (last?.seq || 0) + 1; + const core = normalize({ + v: 1, + seq, + media: { + sha256: mediaHash, + type: media.type || 'application/octet-stream', + bytes: media.size, + }, + session, + context, + prev: last?.hash || null, + keyId: key.keyId, + publicKey: key.publicJwk, + sealedAt: new Date().toISOString(), + }); + const hash = await sha256Hex(canonical(core)); + const sig = await subtle.sign(SIGN, key.privateKey, fromHex(hash)); + const bundle = { + ...core, + id: `cap-${String(seq).padStart(4, '0')}-${hash.slice(0, 8)}`, + hash, + alg: 'ES256', + signature: b64url(sig), + }; + await putCapture(bundle, media); + return bundle; +} + +const median = (a) => { + if (!a.length) return NaN; + const s = [...a].sort((x, y) => x - y); + return s[Math.floor(s.length / 2)]; +}; + +/** Core fields covered by the hash (everything but the outputs). */ +function coreOf(bundle) { + const { id, hash, alg, signature, ...core } = bundle; + void id; + void hash; + void alg; + void signature; + return core; +} + +/** + * Verify a bundle: hash, signature, chain, sensor plausibility. + * @returns {Promise<{ ok: boolean, checks: Array<{id,label,status,detail}> }>} + */ +export async function verify(bundle, mediaBlob) { + assertCrypto(); + const checks = []; + const add = (id, label, status, detail) => + checks.push({ id, label, status, detail }); + + // 1. Media hash + if (mediaBlob) { + const h = await sha256Hex(mediaBlob); + add( + 'media', + 'Media hash', + h === bundle.media?.sha256 ? 'pass' : 'fail', + h === bundle.media?.sha256 + ? `sha256 ${h.slice(0, 16)}… matches ${bundle.media.bytes.toLocaleString()} bytes` + : `recomputed ${h.slice(0, 16)}… ≠ sealed ${String(bundle.media?.sha256).slice(0, 16)}…`, + ); + } else + add('media', 'Media hash', 'warn', 'Media not available on this device'); + + // 2. Bundle hash + const recomputed = await sha256Hex(canonical(coreOf(bundle))); + const hashOk = recomputed === bundle.hash; + add( + 'hash', + 'Bundle hash', + hashOk ? 'pass' : 'fail', + hashOk + ? `sha256(canonical(bundle)) = ${recomputed.slice(0, 16)}…` + : 'Bundle was modified after sealing', + ); + + // 3. Signature + try { + const pub = await subtle.importKey( + 'jwk', + { ...bundle.publicKey, ext: true }, + ALG, + true, + ['verify'], + ); + const ok = await subtle.verify( + SIGN, + pub, + fromB64url(bundle.signature), + fromHex(bundle.hash), + ); + const mine = await deviceKey().catch(() => null); + const same = mine?.keyId === bundle.keyId; + add( + 'signature', + 'Signature', + ok ? (same ? 'pass' : 'warn') : 'fail', + ok + ? `ECDSA P-256 valid · key ${bundle.keyId}${same ? ' (this device)' : ' (another device)'}` + : 'Signature does not verify against the embedded public key', + ); + } catch (err) { + add('signature', 'Signature', 'fail', `Could not verify: ${err.message}`); + } + + // 4. Chain + if (bundle.seq === 1) + add( + 'chain', + 'Hash chain', + bundle.prev === null ? 'pass' : 'fail', + bundle.prev === null + ? 'Genesis capture for this device key' + : 'First capture claims a predecessor', + ); + else { + const prev = await captureBySeq(bundle.seq - 1).catch(() => null); + if (!prev) + add( + 'chain', + 'Hash chain', + 'warn', + `Capture #${bundle.seq - 1} is not on this device`, + ); + else if (prev.hash === bundle.prev && prev.keyId === bundle.keyId) + add( + 'chain', + 'Hash chain', + 'pass', + `#${bundle.seq} ← #${prev.seq} ${prev.hash.slice(0, 12)}…`, + ); + else add('chain', 'Hash chain', 'fail', `Link to #${prev.seq} is broken`); + } + + // 5. IMU plausibility + const imu = bundle.session?.imu || []; + if (imu.length < 5) + add( + 'imu', + 'Motion trace', + 'warn', + imu.length + ? `Only ${imu.length} samples` + : 'No motion sensors were available', + ); + else { + const dur = (imu[imu.length - 1].t - imu[0].t) / 1000; + const rate = imu.length / Math.max(0.001, dur); + let mono = true; + for (let i = 1; i < imu.length; i += 1) + if (imu[i].t < imu[i - 1].t) mono = false; + const mags = imu + .filter((s) => Number.isFinite(s.ax)) + .map((s) => Math.hypot(s.ax, s.ay, s.az)); + const g = median(mags); + const mean = mags.reduce((a, b) => a + b, 0) / Math.max(1, mags.length); + const sd = Math.sqrt( + mags.reduce((a, b) => a + (b - mean) ** 2, 0) / Math.max(1, mags.length), + ); + const gravityOk = Number.isFinite(g) ? Math.abs(g - 9.81) < 1.6 : null; + const alive = sd > 0.004; + // Pitch from gravity should agree with the orientation β. + let tiltAgree = null; + const withBoth = imu.filter( + (s) => + Number.isFinite(s.β) && Number.isFinite(s.ay) && Number.isFinite(s.az), + ); + if (withBoth.length > 4) { + // iOS reports gravity with the opposite sign to the W3C spec; accept either. + const d = (a, b) => Math.abs(((a - b + 540) % 360) - 180); + const diffs = withBoth.map((s) => { + const pitchG = (Math.atan2(s.ay, s.az) * 180) / Math.PI; + const flipped = (Math.atan2(-s.ay, -s.az) * 180) / Math.PI; + return Math.min(d(pitchG, s.β), d(flipped, s.β)); + }); + tiltAgree = median(diffs) < 20; + } + const status = + !mono || gravityOk === false + ? 'fail' + : alive && tiltAgree !== false + ? 'pass' + : 'warn'; + add( + 'imu', + 'Motion trace', + status, + `${imu.length} samples · ${rate.toFixed(0)} Hz · ${dur.toFixed(1)} s · |g| ${Number.isFinite(g) ? g.toFixed(2) : '—'} m/s²${alive ? ' · hand tremor present' : ' · suspiciously still'}${tiltAgree === null ? '' : tiltAgree ? ' · tilt agrees with gravity' : ' · tilt disagrees with gravity'}`, + ); + } + + // 6. GPS plausibility + const gps = bundle.session?.gps || []; + if (!gps.length) add('gps', 'Location', 'warn', 'No GPS fix during capture'); + else { + const s0 = Date.parse(bundle.session.start); + const s1 = Date.parse(bundle.session.end); + const inWindow = gps.every((f) => f.t >= s0 - 120e3 && f.t <= s1 + 120e3); + let maxSpeed = 0; + for (let i = 1; i < gps.length; i += 1) { + const a = gps[i - 1]; + const b = gps[i]; + const dt = (b.t - a.t) / 1000; + if (dt > 0.5) { + const R = 6371e3; + const dLat = ((b.lat - a.lat) * Math.PI) / 180; + const dLon = ((b.lon - a.lon) * Math.PI) / 180; + const x = + Math.sin(dLat / 2) ** 2 + + Math.cos((a.lat * Math.PI) / 180) * + Math.cos((b.lat * Math.PI) / 180) * + Math.sin(dLon / 2) ** 2; + maxSpeed = Math.max(maxSpeed, (2 * R * Math.asin(Math.sqrt(x))) / dt); + } + } + const acc = median(gps.map((f) => f.acc).filter(Number.isFinite)); + const last = gps[gps.length - 1]; + // The clock's timezone should be roughly where the fix says we are. + const tzH = -(bundle.context?.tzOffsetMin ?? 0) / 60; + const solarH = last.lon / 15; + const tzOk = Math.abs(((tzH - solarH + 36) % 24) - 12) < 3.5; + const speedOk = maxSpeed < 300; + const status = + !inWindow || !speedOk ? 'fail' : tzOk && acc < 500 ? 'pass' : 'warn'; + add( + 'gps', + 'Location', + status, + `${gps.length} fix${gps.length > 1 ? 'es' : ''} · ±${Number.isFinite(acc) ? Math.round(acc) : '—'} m · max ${maxSpeed.toFixed(1)} m/s${inWindow ? ' · within session' : ' · outside session window'}${tzOk ? ' · clock zone agrees with longitude' : ' · clock zone disagrees with longitude'}`, + ); + } + + // 7. Heading + const hd = bundle.session?.heading; + if (hd && Number.isFinite(hd.deg)) + add( + 'heading', + 'Heading', + hd.source === 'compass' || hd.source === 'absolute' ? 'pass' : 'warn', + `${Math.round(hd.deg)}° (${hd.source})${Number.isFinite(hd.pitch) ? ` · camera pitch ${hd.pitch.toFixed(0)}°` : ''}`, + ); + else add('heading', 'Heading', 'warn', 'No compass heading recorded'); + + // 8. Clock + const off = bundle.context?.networkTimeOffsetMs; + const sealedVsEnd = + Date.parse(bundle.sealedAt) - Date.parse(bundle.session?.end); + const clockOk = Number.isFinite(off) ? Math.abs(off) < 5000 : null; + add( + 'clock', + 'Clock', + clockOk === false || sealedVsEnd > 60e3 || sealedVsEnd < -2000 + ? 'warn' + : clockOk + ? 'pass' + : 'warn', + `${Number.isFinite(off) ? `device vs network ${off >= 0 ? '+' : ''}${(off / 1000).toFixed(1)} s` : 'network time unavailable'} · sealed ${(sealedVsEnd / 1000).toFixed(1)} s after capture`, + ); + + return { ok: !checks.some((c) => c.status === 'fail'), checks }; +} diff --git a/mobile/capture/sensors.js b/mobile/capture/sensors.js new file mode 100644 index 000000000..9ca2e8785 --- /dev/null +++ b/mobile/capture/sensors.js @@ -0,0 +1,371 @@ +/** + * Device sensors for Look and Witness: motion/orientation (with iOS + * permission on a user gesture), compass heading, camera pose, GPS watch, + * and a session recorder for the sealed IMU trace. + */ + +const D2R = Math.PI / 180; +const R2D = 180 / Math.PI; + +/** iOS 13+: must be called from a user gesture. */ +export async function requestMotionPermission() { + const asks = []; + if ( + typeof DeviceOrientationEvent !== 'undefined' && + typeof DeviceOrientationEvent.requestPermission === 'function' + ) + asks.push(DeviceOrientationEvent.requestPermission()); + if ( + typeof DeviceMotionEvent !== 'undefined' && + typeof DeviceMotionEvent.requestPermission === 'function' + ) + asks.push(DeviceMotionEvent.requestPermission()); + if (!asks.length) + return typeof DeviceOrientationEvent === 'undefined' + ? 'unsupported' + : 'granted'; + try { + const res = await Promise.all(asks); + return res.every((r) => r === 'granted') ? 'granted' : 'denied'; + } catch { + return 'denied'; + } +} + +/** W3C Z-X'-Y'' rotation matrix (device → East-North-Up). */ +export function rotation(alpha, beta, gamma) { + const a = alpha * D2R; + const b = beta * D2R; + const g = gamma * D2R; + const cA = Math.cos(a); + const sA = Math.sin(a); + const cB = Math.cos(b); + const sB = Math.sin(b); + const cG = Math.cos(g); + const sG = Math.sin(g); + return [ + [cA * cG - sA * sB * sG, -cB * sA, cA * sG + cG * sA * sB], + [cG * sA + cA * sB * sG, cA * cB, sA * sG - cA * cG * sB], + [-cB * sG, sB, cB * cG], + ]; +} + +/** Back-camera pose in ENU: forward / right / up unit vectors + azimuth/elevation. */ +export function cameraPose(alpha, beta, gamma, screenAngle = 0) { + const R = rotation(alpha, beta, gamma); + const col = (i) => [R[0][i], R[1][i], R[2][i]]; + const fwd = col(2).map((v) => -v); + let right = col(0); + let up = col(1); + if (screenAngle) { + // Landscape: rotate the screen basis about the forward axis. + const s = screenAngle * D2R; + const r2 = right.map((v, i) => v * Math.cos(s) + up[i] * Math.sin(s)); + const u2 = up.map((v, i) => v * Math.cos(s) - right[i] * Math.sin(s)); + right = r2; + up = u2; + } + const az = (Math.atan2(fwd[0], fwd[1]) * R2D + 360) % 360; + const el = Math.asin(Math.max(-1, Math.min(1, fwd[2]))) * R2D; + const roll = Math.atan2(right[2], up[2]) * R2D; + return { fwd, right, up, az, el, roll }; +} + +/** Pose from a simulated yaw/pitch (desktop drag-to-look). */ +export function poseFromAzEl(az, el) { + const a = az * D2R; + const e = el * D2R; + const fwd = [ + Math.cos(e) * Math.sin(a), + Math.cos(e) * Math.cos(a), + Math.sin(e), + ]; + const right = [Math.cos(a), -Math.sin(a), 0]; + const up = [ + right[1] * fwd[2] - right[2] * fwd[1], + right[2] * fwd[0] - right[0] * fwd[2], + right[0] * fwd[1] - right[1] * fwd[0], + ]; + return { fwd, right, up, az: ((az % 360) + 360) % 360, el, roll: 0 }; +} + +export function createSensors() { + const state = { + orientation: null, // {alpha,beta,gamma,absolute} + motion: null, // {ax,ay,az,lx,ly,lz,rr} + compass: null, // degrees, iOS webkitCompassHeading + compassAccuracy: null, + fix: null, // {t,lat,lon,acc,alt,heading,speed} + geoError: null, + hasMotion: false, + hasOrientation: false, + absolute: false, + }; + const trace = []; // live |a| for the HUD + let rec = null; + let geoWatch = null; + let alphaOffset = 0; + let listeners = []; + + function onOrient(e) { + if (e.alpha == null && e.beta == null) return; + state.hasOrientation = true; + const absolute = + e.absolute === true || e.type === 'deviceorientationabsolute'; + if (absolute) state.absolute = true; + if ( + !absolute && + state.absolute && + e.type === 'deviceorientation' && + e.webkitCompassHeading == null + ) + return; + state.orientation = { + alpha: e.alpha ?? 0, + beta: e.beta ?? 0, + gamma: e.gamma ?? 0, + absolute, + }; + if (e.webkitCompassHeading != null) { + state.compass = e.webkitCompassHeading; + state.compassAccuracy = e.webkitCompassAccuracy; + // Align the arbitrary iOS alpha with magnetic north, smoothly. + // az = −α for an upright camera, so α + (raw − compass) points at north. + const raw = cameraPose(e.alpha, e.beta, e.gamma).az; + const target = ((raw - e.webkitCompassHeading + 540) % 360) - 180; + alphaOffset += (((target - alphaOffset + 540) % 360) - 180) * 0.15; + } + if (rec) sample(); + } + function onMotion(e) { + const g = e.accelerationIncludingGravity; + const l = e.acceleration; + if (!g || g.x == null) return; + state.hasMotion = true; + state.motion = { + ax: g.x, + ay: g.y, + az: g.z, + lx: l?.x, + ly: l?.y, + lz: l?.z, + rr: e.rotationRate + ? [e.rotationRate.alpha, e.rotationRate.beta, e.rotationRate.gamma] + : null, + }; + const mag = Math.hypot(g.x, g.y, g.z); + trace.push({ t: performance.now(), v: mag }); + while (trace.length && performance.now() - trace[0].t > 5000) trace.shift(); + if (rec) sample(); + } + + let lastSampleT = 0; + function sample() { + const now = performance.now(); + if (now - lastSampleT < 15) return; // ≤ ~66 Hz + lastSampleT = now; + const o = state.orientation || {}; + const m = state.motion || {}; + rec.imu.push({ + t: Date.now() - rec.t0Wall, + α: round(o.alpha), + β: round(o.beta), + γ: round(o.gamma), + ax: round(m.ax, 3), + ay: round(m.ay, 3), + az: round(m.az, 3), + }); + if (rec.imu.length > 4000) rec.imu.shift(); + } + + function round(v, d = 2) { + return Number.isFinite(v) ? Math.round(v * 10 ** d) / 10 ** d : null; + } + + function on(target, type, fn) { + target.addEventListener(type, fn, { passive: true }); + listeners.push(() => target.removeEventListener(type, fn)); + } + + function start() { + stop(); + if ('ondeviceorientationabsolute' in window) + on(window, 'deviceorientationabsolute', onOrient); + on(window, 'deviceorientation', onOrient); + on(window, 'devicemotion', onMotion); + if ('geolocation' in navigator) { + geoWatch = navigator.geolocation.watchPosition( + (p) => { + state.geoError = null; + state.fix = { + t: p.timestamp || Date.now(), + lat: p.coords.latitude, + lon: p.coords.longitude, + acc: p.coords.accuracy, + alt: p.coords.altitude, + heading: p.coords.heading, + speed: p.coords.speed, + }; + if (rec) + rec.gps.push({ + t: state.fix.t, + lat: round(state.fix.lat, 6), + lon: round(state.fix.lon, 6), + acc: round(state.fix.acc, 1), + alt: round(state.fix.alt, 1), + }); + }, + (err) => (state.geoError = err.message || 'Location unavailable'), + { enableHighAccuracy: true, maximumAge: 2000, timeout: 20000 }, + ); + } + } + + function stop() { + listeners.forEach((f) => f()); + listeners = []; + if (geoWatch != null) navigator.geolocation.clearWatch(geoWatch); + geoWatch = null; + } + + /** Current back-camera pose, or null without orientation sensors. */ + function pose(screenAngle = screenOrientationAngle()) { + const o = state.orientation; + if (!o) return null; + const alpha = state.compass != null ? o.alpha + alphaOffset : o.alpha; + return cameraPose(alpha, o.beta, o.gamma, screenAngle); + } + + function headingInfo() { + const p = pose(); + if (!p) return null; + return { + deg: Math.round(p.az * 10) / 10, + pitch: Math.round(p.el * 10) / 10, + roll: Math.round(p.roll * 10) / 10, + source: + state.compass != null + ? 'compass' + : state.absolute + ? 'absolute' + : 'relative', + }; + } + + return { + state, + trace, + start, + stop, + pose, + headingInfo, + /** Begin recording a session (IMU + GPS). Keeps a pre-roll of what's already live. */ + beginSession() { + rec = { + t0Wall: Date.now(), + start: new Date().toISOString(), + imu: [], + gps: [], + }; + if (state.fix) + rec.gps.push({ + t: state.fix.t, + lat: round(state.fix.lat, 6), + lon: round(state.fix.lon, 6), + acc: round(state.fix.acc, 1), + alt: round(state.fix.alt, 1), + }); + return rec; + }, + endSession() { + if (!rec) return null; + const r = rec; + rec = null; + // Keep the last 20 s of motion before the shutter. + const cutoff = Date.now() - r.t0Wall - 20000; + const imu = r.imu.filter((s) => s.t >= cutoff); + if (!r.gps.length && state.fix) + r.gps.push({ + t: state.fix.t, + lat: round(state.fix.lat, 6), + lon: round(state.fix.lon, 6), + acc: round(state.fix.acc, 1), + alt: round(state.fix.alt, 1), + }); + return { + start: r.start, + end: new Date().toISOString(), + imu, + gps: r.gps, + heading: headingInfo(), + }; + }, + get recording() { + return !!rec; + }, + }; +} + +export function screenOrientationAngle() { + const a = screen.orientation?.angle ?? window.orientation ?? 0; + return Number(a) || 0; +} + +/* ---------- AR geometry ---------- */ + +const A = 6378137; +const E2 = 6.69437999014e-3; + +function ecef(lat, lon, h) { + const la = lat * D2R; + const lo = lon * D2R; + const N = A / Math.sqrt(1 - E2 * Math.sin(la) ** 2); + return [ + (N + h) * Math.cos(la) * Math.cos(lo), + (N + h) * Math.cos(la) * Math.sin(lo), + (N * (1 - E2) + h) * Math.sin(la), + ]; +} + +/** Azimuth, elevation (deg) and slant range (m) from an observer to a target. */ +export function lookAngles(obs, tgt) { + const o = ecef(obs.lat, obs.lon, obs.alt || 0); + const t = ecef(tgt.lat, tgt.lon, tgt.altM || 0); + const d = [t[0] - o[0], t[1] - o[1], t[2] - o[2]]; + const la = obs.lat * D2R; + const lo = obs.lon * D2R; + const e = -Math.sin(lo) * d[0] + Math.cos(lo) * d[1]; + const n = + -Math.sin(la) * Math.cos(lo) * d[0] - + Math.sin(la) * Math.sin(lo) * d[1] + + Math.cos(la) * d[2]; + const u = + Math.cos(la) * Math.cos(lo) * d[0] + + Math.cos(la) * Math.sin(lo) * d[1] + + Math.sin(la) * d[2]; + const range = Math.hypot(e, n, u); + return { + az: (Math.atan2(e, n) * R2D + 360) % 360, + el: Math.asin(u / range) * R2D, + range, + enu: [e / range, n / range, u / range], + }; +} + +/** Project an ENU unit direction into screen pixels for a pinhole camera. */ +export function projectDir(dir, pose, W, H, vfovDeg) { + const x = + dir[0] * pose.right[0] + dir[1] * pose.right[1] + dir[2] * pose.right[2]; + const y = dir[0] * pose.up[0] + dir[1] * pose.up[1] + dir[2] * pose.up[2]; + const z = dir[0] * pose.fwd[0] + dir[1] * pose.fwd[1] + dir[2] * pose.fwd[2]; + const fy = H / 2 / Math.tan((vfovDeg / 2) * D2R); + if (z <= 0.01) + return { behind: true, x: W / 2 + x * 1e4, y: H / 2 - y * 1e4 }; + return { behind: false, x: W / 2 + (x / z) * fy, y: H / 2 - (y / z) * fy, z }; +} + +export function dirFromAzEl(az, el) { + const a = az * D2R; + const e = el * D2R; + return [Math.cos(e) * Math.sin(a), Math.cos(e) * Math.cos(a), Math.sin(e)]; +} diff --git a/mobile/index.html b/mobile/index.html new file mode 100644 index 000000000..1c2120579 --- /dev/null +++ b/mobile/index.html @@ -0,0 +1,90 @@ + + + + + + God's Eye + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + +
+ +
+ + + diff --git a/mobile/main.js b/mobile/main.js new file mode 100644 index 000000000..1d8a731b2 --- /dev/null +++ b/mobile/main.js @@ -0,0 +1,363 @@ +/** + * God's Eye — mobile shell. + * Boots the five tabs, mounts the one persistent globe (lazy), and wires + * the feed, the card → world transition, the globe chrome, Capture, + * Threads and You together. + */ + +import { + $, + store, + applyMotionPref, + reducedMotion, + toast, + haptic, +} from './ui/dom.js'; +import { icon } from './ui/icons.js'; +import { createTabBar } from './ui/tabbar.js'; +import { mountGlobe, contractReport } from './ui/globeHost.js'; +import { createFeed } from './ui/feed.js'; +import { createWorld } from './ui/world.js'; +import { createGlobeChrome } from './ui/globeChrome.js'; +import { createThreads } from './ui/threads.js'; +import { createYou } from './ui/you.js'; +import { createSearch } from './ui/search.js'; +import { createInspector } from './ui/inspector.js'; +import { createNarrative } from './ui/narrative.js'; + +const app = $('#app'); +const stage = $('#stage'); +const views = { + now: $('#view-now'), + globe: $('#view-globe'), + threads: $('#view-threads'), + you: $('#view-you'), + capture: $('#view-capture'), +}; + +applyMotionPref(); +const isTwoPane = () => + getComputedStyle(app).getPropertyValue('--two-pane').trim() === '1'; + +/* ---------------- Globe (lazy, persistent) ---------------- */ +let globe = null; +let situationsCache = null; +const globeReady = mountGlobe($('#globe'), { quality: store.get('quality') }) + .then((g) => { + globe = g; + app.dataset.engine = g.kind; + delete app.dataset.booting; + return g; + }) + .catch((err) => { + console.error('Globe failed to mount', err); + throw err; + }); + +async function getSituations({ fresh = false } = {}) { + const g = await globeReady; + if (!situationsCache || fresh) situationsCache = await g.situations(); + return situationsCache; +} +const situationById = (id) => + situationsCache?.find((s) => String(s.id) === String(id)) || null; + +/* ---------------- Tabs ---------------- */ +let current = 'now'; +const tabbar = createTabBar($('#tabbar'), { + onSelect: (tab, { reselect }) => { + if (reselect) { + const v = views[tab]; + if (v?.scrollTop > 0) + v.scrollTo({ top: 0, behavior: reducedMotion() ? 'auto' : 'smooth' }); + else if (tab === 'globe') globe?.home(); + return; + } + selectTab(tab); + }, + onSearch: () => search?.open(), + onAccessory: (s) => openSituation(s), +}); + +let capture = null; +let you = null; +let world = null; +let chrome = null; +let threads = null; +let search = null; +let inspector = null; +let narrative = null; + +function applyTab(tab) { + const prev = current; + current = tab; + app.dataset.tab = tab; + const two = isTwoPane(); + for (const [id, el] of Object.entries(views)) { + if (id === 'capture') el.hidden = tab !== 'capture'; + else if (id === 'globe') el.hidden = !(two && tab === 'globe'); + else el.hidden = id !== tab && !(two && tab === 'capture' && id === prev); + } + tabbar.select(tab); + if (tab === 'capture') { + globe?.pause(); + capture?.enter(); + } else { + if (prev === 'capture') capture?.leave(); + updateGlobeActivity(); + } + if (tab === 'you') you?.render(); + if (tab === 'globe' && two) chrome?.renderLeadView(); + if (tab !== 'globe') chrome?.hidePick(); +} + +function selectTab(tab) { + if (tab === current) return; + if (world?.current && !isTwoPane()) world.close(); + if (narrative?.active) narrative.stop(); + const vt = document.startViewTransition && !reducedMotion(); + if (vt) document.startViewTransition(() => applyTab(tab)); + else { + applyTab(tab); + const v = views[tab]; + if (v && !v.hidden) { + v.classList.remove('view-enter'); + void v.offsetWidth; + v.classList.add('view-enter'); + } + } +} + +/** Keep the globe rendering only when someone can see it. */ +let pauseTimer = 0; +function updateGlobeActivity() { + if (!globe) return; + clearTimeout(pauseTimer); + const visible = + document.visibilityState === 'visible' && + current !== 'capture' && + (isTwoPane() || current === 'globe' || app.classList.contains('is-world')); + if (visible) globe.resume(); + else pauseTimer = setTimeout(() => globe.pause(), 700); +} +document.addEventListener('visibilitychange', updateGlobeActivity); +new MutationObserver(updateGlobeActivity).observe(app, { + attributes: true, + attributeFilter: ['class'], +}); + +/* ---------------- Feed ---------------- */ +const feed = createFeed(views.now, { + getSituations: () => getSituations({ fresh: true }), + onOpen: (s, card) => openSituation(s, card), + onLocate: () => + new Promise((resolve) => { + if (!navigator.geolocation) return resolve(null); + navigator.geolocation.getCurrentPosition( + (p) => resolve({ lat: p.coords.latitude, lon: p.coords.longitude }), + () => { + toast('Location unavailable — sorting from San Francisco', { + icon: icon('location'), + }); + resolve(null); + }, + { maximumAge: 600000, timeout: 10000 }, + ); + }), + bindScroll: (el) => tabbar.bindScroll(el), +}); + +function openSituation(s, card = null) { + if (!world) return; + if (current === 'capture') applyTab('now'); + if (narrative?.active) narrative.stop(); + world.open(s, card); +} + +function refreshAccessory() { + const followed = store.get('followed') || []; + const s = followed.map((id) => situationById(id)).find(Boolean) || null; + tabbar.setAccessory(s); +} + +/* ---------------- Boot dependent modules ---------------- */ +globeReady + .then(async (g) => { + world = createWorld({ + app, + stage, + globe: g, + getCard: (id) => feed.cardFor(id), + isTwoPane, + onThread: (s) => openThreadFor(s), + onFollowChange: refreshAccessory, + }); + world.on('open', (s) => feed.select(s.id)); + world.on('close', () => feed.select(null)); + chrome = createGlobeChrome({ + chrome: $('#globe-chrome'), + stage, + leadView: views.globe, + globe: g, + onOpenSituation: (s) => openSituation(s), + onThread: (s) => openThreadFor(s), + getSituations, + isTwoPane, + }); + narrative = createNarrative({ + app, + chrome: $('#globe-chrome'), + globe: g, + ribbon: chrome.ribbon, + getSituation: situationById, + }); + threads = createThreads(views.threads, { + bindScroll: (el) => tabbar.bindScroll(el), + onPlay: (thread) => { + if (world.current) world.close(); + narrative.play(thread); + }, + onShowOnGlobe: async (thread, o) => { + const s = situationById(thread.id); + if (s) await world.open(s); + else { + app.classList.add('is-world'); + g.resume(); + } + world.sheet.setDetent?.('peek'); + g.flyTo({ + lon: o.lon, + lat: o.lat, + height: 7000, + pitch: -40, + duration: 2, + }); + }, + }); + inspector = createInspector(); + you = createYou(views.you, { + bindScroll: (el) => tabbar.bindScroll(el), + getSituations, + onOpenSituation: (s) => openSituation(s), + onVerify: (b) => inspector.open(b), + onCredits: () => chrome.openCredits(), + }); + search = createSearch({ + getSituations, + globe: g, + onOpenSituation: (s) => openSituation(s), + onPlace: (p) => { + selectTab('globe'); + g.flyTo({ lon: p.lon, lat: p.lat, height: 40e3 }); + }, + onLayer: (id) => { + g.setLayer(id, true); + chrome.refreshDock(); + selectTab('globe'); + toast('Lens on', { icon: icon('layers') }); + }, + }); + const { createCapture } = await import('./ui/capture.js'); + capture = createCapture(views.capture, { + globe: g, + onSealed: () => { + if (current === 'you') you.render(); + }, + onVerify: (b) => inspector.open(b), + }); + + // The back chevron also stops a playing narrative. + $('.world-back').addEventListener( + 'click', + (e) => { + if (narrative.active) { + e.stopImmediatePropagation(); + narrative.stop(); + haptic('tick'); + } + }, + true, + ); + + await feed.load(); + const sits = await getSituations(); + chrome.setPips( + sits.flatMap((s) => + (s.events || []).map((ev) => ({ + at: +new Date(ev.at), + label: ev.label, + color: { + sky: '#7CC4FF', + sea: '#38E1C6', + orbit: '#C9A7FF', + hazards: '#FF6A3D', + eyes: '#FFD166', + ground: '#9BE15D', + weather: '#8AB4F8', + infra: '#B8C0CC', + }[s.family], + })), + ), + ); + refreshAccessory(); + store.on((k) => k === 'followed' && refreshAccessory()); + applyTab(current); + + // Deep link: #s= + const m = /#s=([^&]+)/.exec(location.hash); + if (m) { + const s = situationById(decodeURIComponent(m[1])); + if (s) openSituation(s, feed.cardFor(s.id)); + } + if (g.isStub) + console.info( + '[mobile] running on the offline stub engine', + contractReport, + ); + }) + .catch((err) => { + console.error(err); + toast('The globe could not start on this device'); + }); + +async function openThreadFor(s) { + if (!threads) return; + if (world?.current) await world.close(); + const id = + s.thread || (s.kind === 'reconstruction' ? s.id : threads.startDraft(s)); + selectTab('threads'); + await threads.openById(id); + if (!s.thread && s.kind !== 'reconstruction') + toast('Draft thread started · observation recorded', { + icon: icon('threads'), + }); +} + +applyTab('now'); + +// Keyboard: Escape closes the world. +document.addEventListener('keydown', (e) => { + if (e.key === 'Escape' && world?.current) world.close(); +}); + +window.__gev = { + app, + get globe() { + return globe; + }, + get world() { + return world; + }, + get chrome() { + return chrome; + }, + get threads() { + return threads; + }, + get capture() { + return capture; + }, + selectTab, + openSituation, + contractReport, +}; diff --git a/mobile/styles/capture.css b/mobile/styles/capture.css new file mode 100644 index 000000000..7bf56f9ba --- /dev/null +++ b/mobile/styles/capture.css @@ -0,0 +1,783 @@ +/* ------------------------------------------------------------------ */ +/* Capture */ +/* ------------------------------------------------------------------ */ + +.capture { + position: absolute; + inset: 0; + z-index: 30; + background: #000; +} + +.cap { + position: absolute; + inset: 0; + overflow: hidden; + background: #000; + -webkit-user-select: none; + user-select: none; +} + +.cap-video { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0; + transition: opacity 400ms linear; +} + +.cap.has-camera .cap-video { + opacity: 1; +} + +.cap-ar { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.cap-flash { + position: absolute; + inset: 0; + background: #fff; + pointer-events: none; + z-index: 8; +} + +.cap-top { + position: absolute; + z-index: 3; + top: calc(var(--safe-t) + 8px); + left: calc(12px + var(--safe-l)); + right: calc(12px + var(--safe-r)); + display: flex; + flex-direction: column; + align-items: center; + pointer-events: none; +} + +.cap-tape { + position: relative; + width: min(340px, 100%); + height: 46px; + border-radius: 23px; + overflow: hidden; +} + +.cap-tape canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.cap-caret { + position: absolute; + left: 50%; + top: 0; + width: 0; + height: 0; + margin-left: -5px; + border: 5px solid transparent; + border-top: 6px solid var(--eyes); +} + +.cap-caret::after { + content: attr(data-deg); + position: absolute; + top: 26px; + left: 0; + transform: translateX(-50%); + display: none; +} + +.hud { + display: none; + width: 100%; + max-width: 460px; + margin-top: 8px; + padding: 10px 14px 10px; + border-radius: 22px; + font-size: var(--t-cap); +} + +.cap[data-mode='witness'] .hud { + display: block; +} + +.cap[data-mode='witness'] .cap-tape { + height: 36px; +} + +.hud-grid { + display: grid; + grid-template-columns: auto 1fr auto 1fr auto 1fr; + gap: 3px 8px; + align-items: baseline; +} + +.hud-grid span { + font-size: 0.5625rem; + font-weight: 700; + letter-spacing: 0.08em; + color: var(--ink-3); +} + +.hud-grid b { + font-family: var(--mono); + font-size: 0.75rem; + font-weight: 600; + white-space: nowrap; +} + +.hud-trace { + position: relative; + height: 28px; + margin-top: 8px; + border-radius: 8px; + background: rgba(255, 255, 255, 0.04); +} + +.hud-trace canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.hud-trace span { + position: absolute; + left: 6px; + top: 3px; + padding: 0 4px; + border-radius: 4px; + background: rgba(10, 14, 20, 0.6); + font-size: 0.5625rem; + font-weight: 700; + letter-spacing: 0.06em; + color: var(--eyes); + opacity: 0.8; +} + +.hud-rec { + display: flex; + align-items: center; + gap: 6px; + margin-top: 7px; + font-size: 0.6875rem; + color: var(--ink-3); +} + +.rec-dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--ink-4); +} + +.hud-rec.on { + color: var(--ink-2); +} + +.hud-rec.on .rec-dot { + background: var(--seal); + animation: breathe 1.4s ease-in-out infinite; +} + +.cap-level { + position: absolute; + z-index: 2; + left: 50%; + top: 50%; + width: 150px; + height: 0; + margin-left: -75px; + display: none; + pointer-events: none; +} + +.cap[data-mode='witness'] .cap-level { + display: block; +} + +.cap-level i { + position: absolute; + inset: -0.75px 0; + height: 1.5px; + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0.8) 0 38%, + transparent 38% 62%, + rgba(255, 255, 255, 0.8) 62% + ); +} + +.cap-level.level i { + background: linear-gradient( + 90deg, + var(--eyes) 0 38%, + transparent 38% 62%, + var(--eyes) 62% + ); +} + +.cap-status { + position: absolute; + z-index: 6; + left: 50%; + top: calc(var(--safe-t) + 64px); + transform: translateX(-50%); + max-width: calc(100% - 32px); + padding: 10px 16px; + border-radius: 18px; + font-size: var(--t-foot); + font-weight: 600; + text-align: center; +} + +.cap-status[hidden] { + display: none; +} + +.cap-bottom { + position: absolute; + z-index: 3; + left: 0; + right: 0; + bottom: calc(var(--chrome-bottom) - 2px); + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + pointer-events: none; +} + +.cap-bottom > * { + pointer-events: auto; +} + +.cap-modes { + display: flex; + gap: 6px; + padding: 4px; + border-radius: var(--r-pill); + background: rgba(0, 0, 0, 0.35); + -webkit-backdrop-filter: blur(12px); + backdrop-filter: blur(12px); +} + +.cap-modes button { + min-height: 34px; + padding: 0 14px; + border-radius: var(--r-pill); + font-size: var(--t-cap); + font-weight: 750; + letter-spacing: 0.1em; + text-transform: uppercase; + color: rgba(255, 255, 255, 0.75); + transition: + color var(--dur-1) linear, + background var(--dur-2) linear; +} + +.cap-modes button[aria-selected='true'] { + color: var(--eyes); + background: rgba(255, 209, 102, 0.14); +} + +.cap-controls { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + width: min(420px, 100%); + padding: 0 24px; +} + +.cap-thumb { + justify-self: start; + width: 52px; + height: 52px; + border-radius: 14px; + overflow: hidden; + display: grid; + place-items: center; + color: var(--seal); + font-size: 1.4rem; + background: rgba(0, 0, 0, 0.35); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25); + position: relative; +} + +.cap-thumb img, +.cap-thumb video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.cap-thumb.has::after { + content: ''; + position: absolute; + right: 3px; + bottom: 3px; + width: 14px; + height: 14px; + border-radius: 50%; + background: radial-gradient(circle, #ffe3a3, #c8913a); + box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.5); +} + +.cap-side { + justify-self: end; +} + +.shutter { + position: relative; + width: 80px; + height: 80px; + border-radius: 50%; + display: grid; + place-items: center; + touch-action: none; +} + +.shutter-ring { + position: absolute; + inset: 0; + border-radius: 50%; + border: 4px solid #fff; + box-shadow: 0 0 24px rgba(0, 0, 0, 0.35); +} + +.shutter-core { + width: 64px; + height: 64px; + border-radius: 50%; + background: #fff; + transition: + transform var(--dur-2) var(--spring), + border-radius var(--dur-2) var(--ease-out), + background var(--dur-2) linear; +} + +.shutter:active .shutter-core { + transform: scale(0.88); +} + +.cap.recording .shutter-core { + transform: scale(0.5); + border-radius: 10px; + background: var(--live); +} + +.cap.recording .shutter-ring { + border-color: rgba(255, 255, 255, 0.5); + animation: rec-ring 15s linear; +} + +@keyframes rec-ring { + from { + box-shadow: inset 0 0 0 0 var(--live); + } + to { + box-shadow: inset 0 0 0 4px var(--live); + } +} + +.cap[data-mode='look'] .shutter { + visibility: hidden; +} + +.cap-legend { + display: none; + flex-wrap: wrap; + justify-content: center; + gap: 6px 12px; + padding: 0 16px; + font-size: var(--t-cap); + font-weight: 600; + text-shadow: 0 1px 6px rgba(0, 0, 0, 0.8); +} + +.cap[data-mode='look'] .cap-legend { + display: flex; +} + +.cap-legend span { + display: inline-flex; + align-items: center; + gap: 5px; +} + +.cap-legend i { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--c); +} + +.cap-legend em { + flex-basis: 100%; + text-align: center; + font-style: normal; + font-weight: 500; + color: var(--ink-3); + font-size: var(--t-cap2); +} + +.cap[data-mode='look'] .cap-controls { + margin-top: -80px; +} + +/* Permission explainer */ +.cap-gate { + position: absolute; + inset: 0; + z-index: 9; + display: flex; + align-items: flex-end; + justify-content: center; + padding: calc(var(--safe-t) + 20px) calc(12px + var(--safe-r)) + var(--chrome-bottom) calc(12px + var(--safe-l)); + background: + radial-gradient( + 90% 60% at 50% 20%, + rgba(255, 209, 102, 0.12), + transparent 70% + ), + rgba(3, 5, 9, 0.86); +} + +.cap-gate[hidden] { + display: none; +} + +.gate-card { + width: min(460px, 100%); + max-height: 100%; + overflow-y: auto; + padding: 24px 20px 16px; + border-radius: 30px; + display: flex; + flex-direction: column; + gap: 4px; + animation: view-in var(--dur-3) var(--spring) both; +} + +.gate-ic { + width: 56px; + height: 56px; + border-radius: 16px; + display: grid; + place-items: center; + font-size: 1.8rem; + color: #1b1300; + background: linear-gradient(160deg, #ffe08f, #e8a93c); + margin-bottom: 10px; +} + +.gate-card h2 { + margin: 0; + font-family: var(--font-display); + font-size: var(--t-title2); + letter-spacing: -0.025em; +} + +.gate-card > p { + margin: 0 0 8px; + color: var(--ink-2); + font-size: var(--t-sub); +} + +.gate-card ul { + list-style: none; + margin: 6px 0 8px; + padding: 0; + display: flex; + flex-direction: column; + gap: 14px; +} + +.gate-card li { + display: flex; + gap: 14px; + align-items: flex-start; +} + +.gate-card li > .i { + font-size: 1.4rem; + color: var(--eyes); + margin-top: 2px; +} + +.gate-card li div { + display: flex; + flex-direction: column; + gap: 2px; + font-size: var(--t-foot); + color: var(--ink-3); + line-height: 1.35; +} + +.gate-card li b { + color: var(--ink); + font-size: var(--t-sub); +} + +.gate-card .gate-fine { + display: flex; + gap: 8px; + align-items: flex-start; + font-size: var(--t-cap); + color: var(--ink-3); + margin: 4px 0 10px; +} + +.gate-fine .i { + flex: none; + color: var(--seal); + margin-top: 1px; +} + +.gate-card .pill-btn { + width: 100%; + min-height: 50px; + font-size: var(--t-callout); +} + +.gate-skip { + margin-top: 6px; + background: transparent !important; + color: var(--ink-2); + font-weight: 500 !important; +} + +/* Seal ceremony */ +.cap-seal { + position: absolute; + inset: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: center; + padding: calc(var(--safe-t) + 12px) calc(14px + var(--safe-r)) + calc(var(--safe-b) + 12px) calc(14px + var(--safe-l)); + background: rgba(3, 5, 8, 0.72); + -webkit-backdrop-filter: blur(18px); + backdrop-filter: blur(18px); + animation: view-in 260ms var(--ease-out) both; +} + +.cap-seal[hidden] { + display: none; +} + +.seal-card { + position: relative; + width: min(420px, 100%); + max-height: 100%; + overflow-y: auto; + padding: 14px 16px 16px; + border-radius: 30px; + display: flex; + flex-direction: column; + align-items: center; + scrollbar-width: none; +} + +.seal-media { + position: relative; + width: 100%; + border-radius: 20px; + overflow: hidden; + background: #000; + max-height: 30vh; + aspect-ratio: 4 / 3; +} + +.seal-media img, +.seal-media video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.seal-media .badge-example { + position: absolute; + top: 10px; + left: 10px; +} + +.seal-glyph { + width: 96px; + height: 96px; + margin-top: -48px; + position: relative; + z-index: 2; + filter: drop-shadow(0 6px 18px rgba(232, 183, 92, 0.35)); +} + +.seal-glyph svg { + width: 100%; + height: 100%; +} + +.seal-ring { + fill: rgba(232, 183, 92, 0); + stroke: var(--seal); + stroke-width: 3; + stroke-dasharray: 300; + stroke-dashoffset: 300; + animation: seal-draw 1.6s var(--ease-in-out) infinite alternate; +} + +.seal-check { + fill: none; + stroke: #2a1a00; + stroke-width: 6; + stroke-linecap: round; + stroke-linejoin: round; + stroke-dasharray: 60; + stroke-dashoffset: 60; +} + +.seal-card.sealed .seal-ring { + animation: + seal-draw 700ms var(--ease-out) forwards, + seal-fill 500ms 500ms var(--ease-out) forwards; +} + +.seal-card.sealed .seal-check { + animation: check-draw 420ms 850ms var(--ease-out) forwards; +} + +.seal-card.sealed .seal-glyph { + animation: seal-pop 700ms 600ms var(--spring) both; +} + +@keyframes seal-draw { + to { + stroke-dashoffset: 0; + } +} + +@keyframes seal-fill { + to { + fill: var(--seal); + stroke: #ffe3a3; + } +} + +@keyframes check-draw { + to { + stroke-dashoffset: 0; + } +} + +@keyframes seal-pop { + 0% { + transform: scale(1); + } + 40% { + transform: scale(1.14); + } + 100% { + transform: scale(1); + } +} + +.seal-state { + margin-top: 6px; + font-size: var(--t-sub); + color: var(--ink-2); +} + +.seal-state b { + color: var(--seal-2); + font-weight: 750; +} + +.seal-hash { + margin: 10px 0 4px; + display: grid; + grid-template-columns: repeat(2, auto); + gap: 2px 12px; + font-size: 0.75rem; + color: var(--seal-2); + letter-spacing: 0.02em; + min-height: 2.6em; +} + +.seal-spark { + width: 100%; + margin-top: 10px; + padding: 8px 10px; + border-radius: 12px; + background: rgba(255, 255, 255, 0.05); + display: flex; + flex-direction: column; + gap: 4px; + font-size: var(--t-cap2); + color: var(--ink-3); + animation: view-in 400ms 900ms var(--ease-out) both; +} + +.seal-spark svg { + width: 100%; + height: 34px; +} + +.seal-spark path { + fill: none; + stroke: var(--eyes); + stroke-width: 1.3; + vector-effect: non-scaling-stroke; +} + +.seal-nospark { + height: 22px; + display: grid; + place-items: center; + border: 1px dashed rgba(255, 255, 255, 0.15); + border-radius: 8px; +} + +.seal-facts { + width: 100%; + display: grid; + grid-template-columns: auto 1fr; + gap: 6px 14px; + margin: 12px 0 4px; + font-size: var(--t-foot); + animation: view-in 400ms 1000ms var(--ease-out) both; +} + +.seal-facts dt { + color: var(--ink-3); +} + +.seal-facts dd { + margin: 0; + min-width: 0; + overflow-wrap: anywhere; +} + +.seal-facts .mono { + font-size: 0.75rem; +} + +.seal-actions { + display: flex; + gap: 10px; + width: 100%; + margin-top: 12px; + animation: view-in 400ms 1100ms var(--ease-out) both; +} + +.seal-actions .pill-btn { + flex: 1; + min-height: 48px; +} diff --git a/mobile/styles/feed.css b/mobile/styles/feed.css new file mode 100644 index 000000000..03e709172 --- /dev/null +++ b/mobile/styles/feed.css @@ -0,0 +1,467 @@ +/* ------------------------------------------------------------------ */ +/* Now feed */ +/* ------------------------------------------------------------------ */ + +#view-now { + background: + radial-gradient( + 140% 50% at 50% -10%, + rgba(60, 110, 190, 0.16), + rgba(5, 7, 11, 0) 60% + ), + var(--ground); +} + +.feed-inner { + will-change: transform; +} + +.feed-tabs { + position: sticky; + top: calc(var(--safe-t) + 52px); + z-index: 4; + display: flex; + gap: 0; + margin-top: 12px; + padding: 0 calc(6px + var(--safe-r)) 0 calc(6px + var(--safe-l)); + overflow-x: auto; + scrollbar-width: none; + white-space: nowrap; +} + +.feed-tabs::-webkit-scrollbar { + display: none; +} + +.feed-tabs::before { + content: ''; + position: absolute; + inset: 0; + z-index: -1; + background: rgba(8, 11, 17, 0.62); + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); + border-bottom: 0.5px solid var(--hairline); + opacity: 0; + transition: opacity var(--dur-1) linear; +} + +#view-now.is-scrolled .feed-tabs::before { + opacity: 1; +} + +#view-now.is-scrolled .navbar::before { + border-bottom-color: transparent; +} + +.feed-tabs button { + position: relative; + flex: none; + height: 44px; + padding: 0 10px; + font-size: var(--t-sub); + font-weight: 600; + color: var(--ink-3); + transition: + color var(--dur-1) linear, + transform var(--dur-1) var(--ease-out); +} + +.feed-tabs button[aria-selected='true'] { + color: var(--ink); + font-weight: 700; +} + +.feed-tabs-ink { + position: absolute; + left: 0; + bottom: 6px; + height: 3px; + border-radius: 2px; + background: var(--ink); + transition: + transform var(--dur-3) var(--spring), + width var(--dur-3) var(--spring); +} + +.feed-note { + padding: 8px calc(8px + var(--safe-r)) 0 calc(8px + var(--safe-l)); +} + +.near-prompt { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 12px 12px 14px; + border-radius: 20px; + font-size: var(--t-foot); +} + +.near-prompt > .i { + font-size: 1.3rem; + color: var(--tint); +} + +.near-prompt div { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; +} + +.near-prompt span { + color: var(--ink-3); + font-size: var(--t-cap); + line-height: 1.3; +} + +.near-prompt .pill-btn { + min-height: 36px; + padding: 0 14px; + font-size: var(--t-foot); +} + +.masonry { + display: flex; + align-items: flex-start; + gap: 7px; + padding: 10px calc(7px + var(--safe-r)) 0 calc(7px + var(--safe-l)); +} + +.masonry.swap { + animation: view-in 320ms var(--ease-out) both; +} + +.mcol { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 7px; +} + +.card { + position: relative; + border-radius: 18px; + background: var(--ground-2); + overflow: hidden; + content-visibility: auto; + contain-intrinsic-size: auto 300px; + transition: transform var(--dur-2) var(--spring); + box-shadow: inset 0 0 0 0.5px var(--hairline); +} + +.card:has(.card-hit:active) { + transform: scale(0.965); +} + +.card.is-selected { + box-shadow: + inset 0 0 0 2px var(--fam), + 0 0 0 4px color-mix(in srgb, var(--fam) 25%, transparent); +} + +.card:has(.card-hit:focus-visible) { + outline: 2.5px solid var(--tint); + outline-offset: 2px; +} + +.card-hit { + position: absolute; + inset: 0; + z-index: 3; + border-radius: inherit; +} + +.card-hit:focus-visible { + outline: none; +} + +.card-media { + position: relative; + overflow: hidden; + background: radial-gradient( + 120% 90% at 30% 20%, + color-mix(in srgb, var(--fam, #345) 26%, #0e1520), + #0b1019 + ); +} + +.card-media img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0; + transform: scale(1.03); + transition: + opacity 500ms var(--ease-out), + transform 900ms var(--ease-out); +} + +.card-media img.loaded { + opacity: 1; + transform: none; +} + +.card-media img.failed { + display: none; +} + +.card-media::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient( + to top, + rgba(4, 6, 10, 0.78) 0%, + rgba(4, 6, 10, 0.25) 32%, + rgba(4, 6, 10, 0) 52% + ); + pointer-events: none; +} + +.card.is-stale .card-media img { + filter: saturate(0.25) brightness(0.8); +} + +.card.is-stale { + box-shadow: inset 0 0 0 1px transparent; + outline: 1.25px dotted var(--ink-4); + outline-offset: -1.25px; +} + +.card-badges { + position: absolute; + z-index: 2; + top: 8px; + left: 8px; + right: 8px; + display: flex; + justify-content: space-between; + align-items: center; + gap: 6px; +} + +.glass-tag { + background: rgba(6, 9, 14, 0.5); + -webkit-backdrop-filter: blur(12px) saturate(1.5); + backdrop-filter: blur(12px) saturate(1.5); + box-shadow: inset 0 0.5px 0 rgba(255, 255, 255, 0.2); + font-size: 0.625rem; + height: 22px; + min-width: 0; + overflow: hidden; +} + +.live-pill { + display: inline-flex; + align-items: center; + gap: 5px; + height: 20px; + padding: 0 7px; + border-radius: var(--r-pill); + background: rgba(255, 69, 58, 0.92); + color: #fff; + font-size: 0.5625rem; + font-weight: 800; + letter-spacing: 0.08em; + flex: none; +} + +.live-pill .live-dot { + --fam: #fff; + width: 5px; + height: 5px; +} + +.live-pill.recon { + background: rgba(201, 167, 255, 0.92); + color: #1a1030; +} + +.live-pill.recon .i { + font-size: 0.75rem; +} + +.card-metric { + position: absolute; + z-index: 2; + left: 10px; + right: 10px; + bottom: 9px; + display: flex; + align-items: baseline; + flex-wrap: wrap; + column-gap: 3px; + color: #fff; + text-shadow: 0 1px 8px rgba(0, 0, 0, 0.5); +} + +.card-metric b { + font-family: var(--font-display); + font-size: 1.375rem; + font-weight: 750; + letter-spacing: -0.03em; + line-height: 1; +} + +.card-metric small { + font-size: 0.75rem; + font-weight: 650; + opacity: 0.85; +} + +.card-metric span { + flex-basis: 100%; + font-size: 0.5625rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--fam); + margin-top: 3px; +} + +.card-body { + padding: 9px 11px 11px; +} + +.card-title { + margin: 0; + font-size: 0.875rem; + font-weight: 650; + line-height: 1.28; + letter-spacing: -0.012em; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.card-place { + display: flex; + align-items: center; + gap: 3px; + margin-top: 4px; + font-size: 0.6875rem; + color: var(--ink-3); + white-space: nowrap; + overflow: hidden; +} + +.card-place span { + overflow: hidden; + text-overflow: ellipsis; +} + +.card-place .i { + flex: none; + font-size: 0.75rem; +} + +.card-foot { + display: flex; + justify-content: space-between; + gap: 6px; + margin-top: 7px; + font-size: 0.625rem; + color: var(--ink-4); +} + +.card-foot .src { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.card-foot .ago { + flex: none; +} + +.card.pulse { + animation: card-pulse 1.6s var(--ease-out); +} + +@keyframes card-pulse { + 0% { + box-shadow: inset 0 0 0 1.5px var(--fam); + } + 100% { + box-shadow: inset 0 0 0 0.5px var(--hairline); + } +} + +/* Skeleton */ +.card.skel .card-media, +.sk-line { + background: linear-gradient( + 100deg, + rgba(255, 255, 255, 0) 30%, + rgba(255, 255, 255, 0.07) 50%, + rgba(255, 255, 255, 0) 70% + ) + var(--ground-3); + background-size: 200% 100%; + animation: shimmer 1.4s linear infinite; +} + +.sk-line { + height: 11px; + border-radius: 6px; + margin: 3px 0 8px; +} + +.sk-line.short { + width: 55%; + margin-bottom: 2px; +} + +.feed-end { + text-align: center; + color: var(--ink-4); + font-size: var(--t-foot); + padding: 26px 0 0; +} + +/* Pull to refresh */ +.ptr { + position: absolute; + z-index: 3; + left: 0; + right: 0; + top: calc(var(--safe-t) + 62px); + height: 40px; + display: grid; + place-items: center; + opacity: 0; + pointer-events: none; + --p: 0; +} + +.ptr-spinner { + position: relative; + width: 30px; + height: 30px; + transform: rotate(calc(var(--p) * 200deg)); +} + +.ptr-spinner i { + position: absolute; + left: 12.5px; + top: 12.5px; + width: 5px; + height: 5px; + border-radius: 50%; + background: var(--c); + transform: rotate(calc(var(--i) * 45deg)) translateY(-12px); + opacity: clamp(0, calc((var(--p) * 8 - var(--i)) * 1), 1); +} + +.ptr.spinning .ptr-spinner { + animation: spin 900ms linear infinite; +} + +.ptr.spinning .ptr-spinner i { + opacity: 1; +} diff --git a/mobile/styles/globe-ui.css b/mobile/styles/globe-ui.css new file mode 100644 index 000000000..0418cf879 --- /dev/null +++ b/mobile/styles/globe-ui.css @@ -0,0 +1,748 @@ +/* ------------------------------------------------------------------ */ +/* Globe chrome */ +/* ------------------------------------------------------------------ */ + +.gc-top { + position: absolute; + top: calc(var(--safe-t) + 8px); + left: calc(12px + var(--safe-l)); + right: calc(12px + var(--safe-r)); + display: flex; + justify-content: space-between; + align-items: flex-start; + pointer-events: none; + transition: opacity var(--dur-2) linear; +} + +.gc-top > * { + pointer-events: auto; +} + +.gc-readout { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + height: 44px; + padding: 0 14px; + border-radius: 22px; + line-height: 1.15; +} + +.gc-alt { + font-size: var(--t-foot); + font-weight: 700; +} + +.gc-ll { + font-size: 0.625rem; + color: var(--ink-3); +} + +.gc-buttons { + display: flex; + flex-direction: column; + gap: 10px; +} + +.gc-buttons .icon-btn, +.world-back { + position: relative; +} + +.gc-compass .compass-n { + display: grid; + place-items: center; + color: #ff5b4f; + transition: transform 200ms linear; +} + +.gc-attr { + position: absolute; + top: calc(var(--safe-t) + 58px); + left: calc(16px + var(--safe-l)); + font-size: 0.625rem; + color: var(--ink-4); + letter-spacing: 0.01em; + min-height: 24px; + padding: 0 2px; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6); +} + +.world-back { + position: absolute; + top: calc(var(--safe-t) + 8px); + left: calc(12px + var(--safe-l)); + font-size: 1.2rem; + display: none; +} + +.app.is-world .world-back { + display: grid; + animation: view-in var(--dur-3) var(--spring) both; +} + +.app.is-world .gc-readout, +.app.is-world .gc-attr { + visibility: hidden; +} + +/* Lens popover */ +.lens-pop { + position: absolute; + z-index: 5; + top: calc(var(--safe-t) + 8px); + right: calc(66px + var(--safe-r)); + padding: 6px; + border-radius: 24px; + display: flex; + flex-direction: column; + min-width: 190px; + transform-origin: top right; + animation: pop-in 320ms var(--spring) both; +} + +.lens-pop[hidden] { + display: none; +} + +@keyframes pop-in { + from { + opacity: 0; + transform: scale(0.6); + } +} + +.lens-pop button { + display: flex; + align-items: center; + gap: 12px; + height: 46px; + padding: 0 10px; + border-radius: 18px; + font-size: var(--t-sub); + font-weight: 600; + text-align: left; +} + +.lens-pop button[aria-checked='true'] { + background: rgba(255, 255, 255, 0.1); +} + +.lens-sw { + width: 30px; + height: 30px; + border-radius: 50%; + flex: none; + box-shadow: + inset 0 0 0 0.5px rgba(255, 255, 255, 0.35), + 0 2px 6px rgba(0, 0, 0, 0.35); +} + +.lens-pop button[aria-checked='true'] .lens-sw { + box-shadow: + 0 0 0 2px var(--ground), + 0 0 0 4px var(--tint); +} + +/* Bottom stack: lens dock + time ribbon */ +.gc-bottom { + position: absolute; + left: 0; + right: 0; + bottom: var(--chrome-bottom); + display: flex; + flex-direction: column; + gap: 10px; + pointer-events: none; + transition: + transform var(--dur-3) var(--spring), + opacity var(--dur-2) linear; +} + +.gc-bottom > * { + pointer-events: auto; +} + +.lens-dock { + display: flex; + gap: 8px; + overflow-x: auto; + padding: 2px calc(12px + var(--safe-r)) 2px calc(12px + var(--safe-l)); + scrollbar-width: none; + scroll-padding: 0 12px; +} + +.lens-dock::-webkit-scrollbar { + display: none; +} + +.fam-chip { + position: relative; + flex: none; + height: 38px; + padding: 0 13px 0 10px; + color: var(--ink-2); + background: rgba(14, 18, 26, 0.55); + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); + box-shadow: var(--glass-edge); + font-size: var(--t-foot); +} + +.fam-chip .i { + font-size: 1.05rem; + color: var(--fam); + opacity: 0.6; +} + +.fam-chip.on { + color: var(--ink); + background: color-mix(in srgb, var(--fam) 24%, rgba(14, 18, 26, 0.6)); + box-shadow: + var(--glass-edge), + inset 0 0 0 1px color-mix(in srgb, var(--fam) 40%, transparent); +} + +.fam-chip.on .i { + opacity: 1; +} + +.fam-count { + font-size: var(--t-cap2); + font-weight: 700; + color: var(--fam); +} + +.fam-count:empty { + display: none; +} + +.lens-dock[data-solo]:not([data-solo='']) .fam-chip:not(.on) { + opacity: 0.45; +} + +/* Time ribbon */ +.ribbon { + position: relative; + display: flex; + align-items: center; + gap: 4px; + height: 56px; + margin: 0 calc(12px + var(--safe-r)) 0 calc(12px + var(--safe-l)); + padding: 0 6px; + border-radius: 28px; + touch-action: none; +} + +.rb-live { + flex: none; + height: 40px; + padding: 0 11px; + border-radius: 20px; + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 0.6875rem; + font-weight: 800; + letter-spacing: 0.08em; + color: var(--ink-2); + background: rgba(255, 255, 255, 0.08); + transition: + background var(--dur-2) linear, + color var(--dur-2) linear, + transform var(--dur-1) var(--ease-out); +} + +.rb-live .live-dot { + --fam: var(--ink-3); + width: 6px; + height: 6px; +} + +.rb-live .live-dot::after { + animation: none; +} + +.rb-live.is-live { + background: rgba(255, 69, 58, 0.18); + color: #ff6b61; +} + +.rb-live.is-live .live-dot { + --fam: #ff453a; +} + +.rb-live.is-live .live-dot::after { + animation: pulse-ring 1.8s var(--ease-out) infinite; +} + +.rb-live:active { + transform: scale(0.93); +} + +.rb-track { + position: relative; + flex: 1; + min-width: 0; + height: 100%; + cursor: ew-resize; + touch-action: none; +} + +.rb-track canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.rb-head { + position: absolute; + left: 50%; + top: 9px; + bottom: 9px; + width: 2px; + margin-left: -1px; + border-radius: 1px; + background: var(--tint); + box-shadow: 0 0 10px rgba(124, 196, 255, 0.8); +} + +.ribbon.is-live .rb-head { + background: #ff453a; + box-shadow: 0 0 10px rgba(255, 69, 58, 0.8); + animation: breathe 2.6s ease-in-out infinite; +} + +.ribbon.scrubbing .rb-head { + width: 3px; + margin-left: -1.5px; +} + +.rb-read { + flex: none; + width: 84px; + display: flex; + flex-direction: column; + align-items: flex-end; + padding-right: 8px; + line-height: 1.15; +} + +.rb-read b { + font-size: var(--t-foot); + font-weight: 750; + white-space: nowrap; +} + +.rb-read span { + font-size: 0.625rem; + color: var(--ink-3); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} + +.ribbon.custom .rb-head { + background: var(--eyes); + box-shadow: 0 0 10px rgba(255, 209, 102, 0.7); +} + +/* World mode (an open situation) on compact widths */ +.app.is-world .lens-dock { + display: none; +} + +.app.is-world .gc-bottom { + bottom: calc(var(--sheet-h, 120px) + 10px); +} + +.app.is-world:not([data-sheet='peek']) .gc-bottom { + opacity: 0; + transform: translateY(20px); + pointer-events: none; +} + +.app.is-world:not([data-sheet='peek']) .gc-bottom > * { + pointer-events: none; +} + +.app.is-world .pick-card { + display: none; +} + +/* Pick card */ +.pick-card { + position: absolute; + left: calc(12px + var(--safe-l)); + right: calc(12px + var(--safe-r)); + bottom: calc(var(--chrome-bottom) + 118px); + padding: 12px 12px 12px 14px; + border-radius: 26px; + z-index: 4; +} + +.pick-card[hidden] { + display: none; +} + +.pick-top { + display: flex; + align-items: center; + gap: 12px; +} + +.pick-ic { + width: 40px; + height: 40px; + border-radius: 50%; + display: grid; + place-items: center; + flex: none; + background: color-mix(in srgb, var(--fam) 22%, transparent); + color: var(--fam); + font-size: 1.25rem; +} + +.pick-titles { + flex: 1; + min-width: 0; +} + +.pick-title { + font-family: var(--mono); + font-weight: 700; + font-size: var(--t-headline); + letter-spacing: 0.01em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.pick-sub { + font-size: var(--t-foot); + color: var(--ink-3); +} + +.pick-close { + width: 36px; + height: 36px; + font-size: 0.9rem; + color: var(--ink-3); + background: rgba(255, 255, 255, 0.08); +} + +.pick-meta { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 8px; + margin: 12px 0 2px; +} + +.pick-meta div { + display: flex; + flex-direction: column; + min-width: 0; +} + +.pick-meta span { + font-size: 0.625rem; + font-weight: 650; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--ink-3); +} + +.pick-meta b { + font-size: var(--t-callout); + font-weight: 700; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.pick-src { + margin-top: 8px; + font-size: 0.6875rem; + color: var(--ink-4); +} + +.pick-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.pick-actions .pill-btn { + min-height: 40px; + padding: 0 13px; + font-size: var(--t-foot); + flex: none; +} + +/* Control-Center-style layer grid */ +.grid-head { + display: flex; + align-items: center; + gap: 12px; + padding: 2px 52px 12px 0; +} + +.grid-head > div { + flex: 1; + min-width: 0; +} + +.grid-ic { + width: 46px; + height: 46px; + border-radius: 50%; + display: grid; + place-items: center; + flex: none; + font-size: 1.4rem; + color: #05070b; + background: var(--fam); + box-shadow: 0 0 24px color-mix(in srgb, var(--fam) 45%, transparent); +} + +.tiles { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; +} + +.tile { + position: relative; + display: grid; + grid-template-rows: auto 1fr auto; + gap: 8px; + min-height: 104px; + padding: 12px; + border-radius: 24px; + text-align: left; + background: rgba(255, 255, 255, 0.07); + box-shadow: inset 0 0.5px 0 rgba(255, 255, 255, 0.12); + transition: + transform var(--dur-2) var(--spring), + background var(--dur-2) linear; +} + +.tile-ic { + width: 36px; + height: 36px; + border-radius: 50%; + display: grid; + place-items: center; + font-size: 1.1rem; + color: var(--ink-2); + background: rgba(255, 255, 255, 0.12); + transition: + background var(--dur-2) linear, + color var(--dur-2) linear; +} + +.tile-name { + font-size: var(--t-sub); + font-weight: 650; + line-height: 1.2; + align-self: end; +} + +.tile-meta { + display: flex; + justify-content: space-between; + align-items: center; + font-size: var(--t-cap); + color: var(--ink-3); +} + +.tile-meta b { + color: var(--ink-2); + font-weight: 700; +} + +.tile-status { + display: inline-flex; + align-items: center; + gap: 5px; +} + +.tile-status i { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--ink-4); +} + +.tile.on { + background: color-mix(in srgb, var(--fam) 22%, rgba(255, 255, 255, 0.06)); +} + +.tile.on .tile-ic { + background: var(--fam); + color: #05070b; +} + +.tile.on .tile-meta b { + color: var(--fam); +} + +.tile[data-status='live'].on .tile-status i { + background: var(--ok); + box-shadow: 0 0 6px var(--ok); +} + +.tile[data-status='stale'] .tile-status i { + background: transparent; + outline: 1.25px dotted var(--ink-3); +} + +.tile[data-status='error'] .tile-status i { + background: var(--bad); +} + +.tile[data-status='error'] .tile-status { + color: var(--bad); +} + +/* Credits */ +.credit-list { + display: flex; + flex-direction: column; + gap: 2px; +} + +.credit { + display: flex; + flex-direction: column; + gap: 3px; + padding: 12px 0; + border-bottom: 0.5px solid var(--hairline); + font-size: var(--t-foot); +} + +.credit span { + color: var(--ink-2); + line-height: 1.4; +} + +.credit a { + color: var(--tint); + text-decoration: none; + font-size: var(--t-cap); +} + +/* Leading pane Globe view (regular widths) */ +.lens-row { + display: flex; + gap: 10px; + overflow-x: auto; + padding: 0 calc(var(--gutter) + var(--safe-r)) 4px + calc(var(--gutter) + var(--safe-l)); + scrollbar-width: none; +} + +.lens-card { + flex: none; + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + width: 72px; + font-size: var(--t-cap); + font-weight: 600; + color: var(--ink-2); +} + +.lens-card .lens-sw { + width: 56px; + height: 56px; +} + +.lens-card.on { + color: var(--ink); +} + +.lens-card.on .lens-sw { + box-shadow: + 0 0 0 2px var(--ground), + 0 0 0 4px var(--tint); +} + +.lead-fam { + display: inline-flex; + align-items: center; + gap: 8px; +} + +.lead-fam .i { + color: var(--fam); +} + +.lead-tiles { + margin: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); +} + +.lead-tiles .tile { + min-height: 92px; +} + +.link-btn { + color: var(--tint); + font-weight: 600; + min-height: 44px; +} + +/* Hero morph */ +.hero { + position: fixed; + z-index: 80; + overflow: hidden; + pointer-events: none; + contain: strict; +} + +.hero img { + position: absolute; + max-width: none; + transform-origin: center center; + will-change: transform; +} + +.hero-scrim { + position: fixed; + inset: 0; + z-index: 79; + background: rgba(3, 5, 8, 0.55); + pointer-events: none; +} + +.card.hero-source .card-media { + visibility: hidden; +} + +.peek-metric { + flex: none; + font-family: var(--font-display); + font-size: var(--t-title2); + font-weight: 750; + letter-spacing: -0.03em; + color: var(--fam); +} + +.peek-metric small { + font-size: 0.75rem; + font-weight: 650; + color: var(--ink-3); + margin-left: 2px; + letter-spacing: 0; +} + +.brief-sheet .sheet-head { + padding-bottom: 4px; +} diff --git a/mobile/styles/layout.css b/mobile/styles/layout.css new file mode 100644 index 000000000..b4a1d19cc --- /dev/null +++ b/mobile/styles/layout.css @@ -0,0 +1,190 @@ +/* ------------------------------------------------------------------ */ +/* Adaptive layout: phone → two-pane → hinge-aware foldables */ +/* ------------------------------------------------------------------ */ + +.app { + --two-pane: 0; +} + +.search-row { + display: flex; + align-items: center; + gap: 8px; + padding: 2px 0 10px; +} + +.search-row .search-field { + flex: 1; +} + +.search-cancel { + min-height: 40px; + padding: 0 10px; + background: transparent !important; + color: var(--tint); + font-weight: 500; +} + +/* Regular width (foldable inner screens, iPhone Fold, tablets). + iPadOS 26-style: the leading pane holds the content column and keeps + the floating tab bar at its foot (thumb reach on a handheld foldable); + the trailing pane is the always-live globe. */ +@media (min-width: 600px) { + .app { + --two-pane: 1; + --lead-w: clamp(360px, 44vw, 420px); + --stage-left: var(--lead-w); + } + + .lead { + right: auto; + width: var(--lead-w); + border-right: 0.5px solid var(--hairline-strong); + visibility: visible !important; + } + + .lead .view { + pointer-events: auto !important; + } + + .stage { + left: var(--stage-left); + } + + #view-globe { + display: block; + } + + .app .globe-chrome { + visibility: visible !important; + } + + .tabbar { + left: calc(12px + var(--safe-l)); + right: auto; + width: calc(var(--lead-w) - 24px); + } + + .app.is-world:not(.is-narrative) .tabbar { + transform: none; + opacity: 1; + } + + .gc-bottom { + bottom: calc(var(--safe-b) + 14px); + } + + .app.is-world .gc-bottom { + bottom: calc(var(--sheet-h, 120px) + 12px); + } + + .pick-card { + left: auto; + width: min(400px, calc(100% - 24px)); + bottom: calc(var(--safe-b) + 140px); + } + + .narr-hud { + left: auto; + width: min(420px, calc(100% - 24px)); + } + + .stage .sheet { + left: 10px; + right: 10px; + max-width: 520px; + } + + /* Modal sheets float centred instead of spanning a wide screen. */ + .sheets .sheet { + left: 0; + right: 0; + margin: 0 auto; + width: min(560px, calc(100% - 24px)); + } + + .tb-accessory { + right: calc(var(--tabbar-h) + 10px); + } + + .capture .cap-bottom, + .capture .cap-top { + left: var(--lead-w); + } + + .hero { + border-radius: 0; + } +} + +/* Vertical hinge (book posture): split exactly at the fold. */ +@media (horizontal-viewport-segments: 2) { + .app { + --lead-w: env(viewport-segment-width 0 0, 50vw); + --stage-left: env(viewport-segment-left 1 0, 50vw); + } + + .lead { + width: var(--lead-w); + } + + .stage { + left: var(--stage-left); + } + + .capture .cap-bottom, + .capture .cap-top { + left: var(--stage-left); + } +} + +/* Tabletop (horizontal fold): globe on top, controls and timeline below. */ +@media (vertical-viewport-segments: 2) { + .app { + --two-pane: 1; + --stage-h: env(viewport-segment-height 0 0, 50vh); + --lead-top: env(viewport-segment-top 0 1, 50vh); + } + + .stage { + left: 0; + right: 0; + top: 0; + bottom: auto; + height: var(--stage-h); + } + + .lead { + top: var(--lead-top); + left: 0; + right: 0; + width: auto; + border-right: 0; + border-top: 0.5px solid var(--hairline-strong); + } + + .lead .view .navbar { + --safe-t: 0px; + } + + .tabbar { + left: max(calc(12px + var(--safe-l)), calc(50% - 300px)); + right: max(calc(12px + var(--safe-r)), calc(50% - 300px)); + width: auto; + } + + .gc-bottom { + bottom: 12px; + } + + .gc-top { + top: 12px; + } +} + +/* Short landscape phones keep a single pane but tighter chrome. */ +@media (max-height: 520px) and (orientation: landscape) and (max-width: 599px) { + .lens-dock { + display: none; + } +} diff --git a/mobile/styles/sheet.css b/mobile/styles/sheet.css new file mode 100644 index 000000000..d0b652452 --- /dev/null +++ b/mobile/styles/sheet.css @@ -0,0 +1,508 @@ +/* ------------------------------------------------------------------ */ +/* Sheets */ +/* ------------------------------------------------------------------ */ + +.sheets { + position: absolute; + inset: 0; + z-index: 60; + pointer-events: none; +} + +.sheet-layer { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 10; +} + +.sheet-layer[hidden] { + display: none; +} + +.sheet-scrim { + position: absolute; + inset: 0; + background: #000; + opacity: 0; + pointer-events: auto; +} + +.sheet { + position: absolute; + left: calc(6px + var(--safe-l)); + right: calc(6px + var(--safe-r)); + bottom: 0; + display: flex; + flex-direction: column; + border-radius: 30px 30px 0 0; + background: var(--glass-specular), rgba(16, 20, 28, 0.78); + -webkit-backdrop-filter: blur(30px) saturate(1.7); + backdrop-filter: blur(30px) saturate(1.7); + box-shadow: + inset 0 0.5px 0 rgba(255, 255, 255, 0.3), + inset 0 0 0 0.5px rgba(255, 255, 255, 0.08), + 0 -12px 40px rgba(0, 0, 0, 0.35); + pointer-events: auto; + will-change: transform; + transform: translate3d(0, 110%, 0); + overflow: hidden; + contain: layout paint; +} + +.sheet.opaque { + background: var(--ground-1); +} + +.sheet-grabber { + flex: none; + height: 22px; + display: grid; + place-items: center; + cursor: grab; + touch-action: none; +} + +.sheet-grabber span { + width: 38px; + height: 5px; + border-radius: 3px; + background: rgba(255, 255, 255, 0.3); +} + +.sheet-close { + position: absolute; + z-index: 2; + top: 12px; + right: 12px; + width: 32px; + height: 32px; + font-size: 0.95rem; + color: var(--ink-2); + background: rgba(255, 255, 255, 0.1); +} + +.sheet-close::before { + /* 44pt hit area around a 32pt glyph. */ + content: ''; + position: absolute; + inset: -6px; +} + +.sheet-head { + flex: none; + padding: 0 20px; + touch-action: none; +} + +.sheet-body { + flex: 1; + min-height: 0; + overflow: hidden; + padding: 0 20px calc(var(--safe-b) + 28px); + overscroll-behavior: contain; +} + +.brief-sheet .sheet-body { + transition: opacity var(--dur-2) linear; +} + +.brief-sheet[data-detent='peek'] .sheet-body { + opacity: 0; + pointer-events: none; +} + +.sheet-body.scrollable { + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.sheet-layer.dragging .sheet-body { + overflow: hidden; +} + +.sheet-title { + font-family: var(--font-display); + font-size: var(--t-title2); + font-weight: 700; + letter-spacing: -0.025em; + line-height: 1.15; + margin: 2px 0 2px; +} + +.sheet-sub { + font-size: var(--t-foot); + color: var(--ink-3); +} + +/* ------------------------------------------------------------------ */ +/* Situation brief */ +/* ------------------------------------------------------------------ */ + +.brief-top { + display: flex; + align-items: center; + gap: 8px; + height: 22px; + font-size: var(--t-cap); + font-weight: 650; + color: var(--ink-3); + letter-spacing: 0.02em; + padding-right: 40px; +} + +.fam-tag { + display: inline-flex; + align-items: center; + gap: 5px; + height: 22px; + padding: 0 9px 0 7px; + border-radius: var(--r-pill); + color: var(--fam); + background: color-mix(in srgb, var(--fam) 16%, transparent); + font-size: var(--t-cap); + font-weight: 700; + letter-spacing: 0.02em; + text-transform: uppercase; +} + +.fam-tag .i { + font-size: 0.85rem; +} + +.live-tag { + display: inline-flex; + align-items: center; + gap: 6px; + color: var(--ink-2); +} + +.live-tag .live-dot { + --fam: var(--live); + width: 6px; + height: 6px; +} + +.brief-title-row { + display: flex; + align-items: baseline; + gap: 10px; +} + +.brief-title-row .sheet-title { + flex: 1; + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.metrics { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + margin: 12px 0 4px; +} + +.metric { + min-width: 0; +} + +.metric-v { + font-family: var(--font-display); + font-size: 1.5rem; + font-weight: 700; + letter-spacing: -0.03em; + line-height: 1.05; + font-variant-numeric: tabular-nums; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.metric-v small { + font-size: 0.8125rem; + font-weight: 600; + color: var(--ink-3); + letter-spacing: 0; + margin-left: 2px; +} + +.metric-l { + font-size: var(--t-cap2); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--ink-3); + margin-top: 3px; +} + +.metric.long .metric-v { + font-size: 1.125rem; + line-height: 1.33; +} + +.metric:first-child .metric-v { + color: var(--fam); +} + +.actions { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 8px; + margin: 14px 0 6px; +} + +.action { + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + padding: 10px 0 9px; + border-radius: 16px; + background: rgba(255, 255, 255, 0.07); + font-size: var(--t-cap2); + font-weight: 600; + color: var(--ink-2); + transition: + transform var(--dur-1) var(--ease-out), + background var(--dur-1) linear; +} + +.action .i { + font-size: 1.35rem; + color: var(--tint); +} + +.action:active { + transform: scale(0.94); +} + +.action[aria-pressed='true'] { + background: color-mix(in srgb, var(--fam, var(--tint)) 20%, transparent); + color: var(--ink); +} + +.action[aria-pressed='true'] .i { + color: var(--fam, var(--tint)); +} + +.action[aria-pressed='true'] .i .f { + fill: currentColor; + stroke: none; +} + +.action .i .f { + fill: none; + stroke: none; +} + +.block { + margin-top: 18px; +} + +.block-h { + display: flex; + justify-content: space-between; + align-items: baseline; + font-size: var(--t-foot); + font-weight: 650; + color: var(--ink-2); + margin-bottom: 8px; +} + +.block-h small { + color: var(--ink-4); + font-weight: 500; + font-size: var(--t-cap2); +} + +.spark-row { + display: flex; + align-items: center; + gap: 14px; + padding: 12px 14px; + border-radius: 16px; + background: rgba(255, 255, 255, 0.05); +} + +.spark-row svg { + color: var(--fam); + flex: 1; + height: 42px; + min-width: 0; +} + +.spark-row .spark-line { + fill: none; + stroke: var(--fam); + stroke-width: 1.8; + stroke-linejoin: round; + stroke-linecap: round; +} + +.spark-row .spark-area { + fill: url(#spark-grad); + opacity: 0.35; +} + +.spark-row .spark-end { + fill: var(--fam); +} + +.spark-label { + flex: none; + text-align: right; + font-size: var(--t-cap); + color: var(--ink-3); + line-height: 1.3; +} + +.spark-label b { + display: block; + font-size: var(--t-headline); + color: var(--ink); + font-variant-numeric: tabular-nums; +} + +.evidence { + display: flex; + gap: 10px; + overflow-x: auto; + scroll-snap-type: x mandatory; + margin: 0 -20px; + padding: 0 20px 4px; + scrollbar-width: none; +} + +.evidence::-webkit-scrollbar { + display: none; +} + +.ev { + position: relative; + flex: none; + color: inherit; + text-decoration: none; + width: 116px; + scroll-snap-align: start; + text-align: left; +} + +.ev-img { + width: 116px; + height: 140px; + border-radius: 14px; + object-fit: cover; + background: var(--ground-3); +} + +.ev-seq { + position: absolute; + top: 6px; + left: 6px; + min-width: 20px; + height: 20px; + padding: 0 6px; + border-radius: 10px; + background: rgba(5, 7, 11, 0.7); + font-size: 0.6875rem; + font-weight: 700; + display: grid; + place-items: center; +} + +.ev-t { + margin-top: 6px; + font-size: var(--t-cap); + font-weight: 600; + line-height: 1.25; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.ev-s { + font-size: var(--t-cap2); + color: var(--ink-3); + margin-top: 1px; +} + +.facts { + display: grid; + grid-template-columns: auto 1fr; + gap: 8px 14px; + font-size: var(--t-foot); +} + +.facts dt { + color: var(--ink-3); +} + +.facts dd { + margin: 0; + color: var(--ink); + min-width: 0; + overflow-wrap: anywhere; +} + +.metric-table { + width: 100%; + border-collapse: collapse; + font-size: var(--t-foot); +} + +.metric-table td { + padding: 8px 0; + border-bottom: 0.5px solid var(--hairline); + vertical-align: baseline; +} + +.metric-table td:nth-child(2) { + text-align: right; + font-variant-numeric: tabular-nums; + font-weight: 650; + padding-left: 8px; +} + +.metric-table td:nth-child(3) { + text-align: right; + color: var(--ink-3); + font-size: var(--t-cap2); + padding-left: 12px; + width: 40%; +} + +.layer-chips { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.layer-chip { + height: 28px; + padding: 0 10px; + font-size: var(--t-cap); + color: var(--fam); + background: color-mix(in srgb, var(--fam) 12%, transparent); +} + +.caveat { + margin-top: 14px; + padding: 12px 14px; + border-radius: 14px; + border: 0.5px dashed rgba(255, 209, 102, 0.45); + color: var(--ink-2); + font-size: var(--t-foot); + line-height: 1.4; +} + +.caveat b { + color: var(--eyes); + font-size: var(--t-cap2); + letter-spacing: 0.06em; + text-transform: uppercase; + display: block; + margin-bottom: 4px; +} diff --git a/mobile/styles/shell.css b/mobile/styles/shell.css new file mode 100644 index 000000000..eb5ec939c --- /dev/null +++ b/mobile/styles/shell.css @@ -0,0 +1,1000 @@ +/* ------------------------------------------------------------------ */ +/* App frame */ +/* ------------------------------------------------------------------ */ + +.app { + position: fixed; + inset: 0; + overflow: hidden; + isolation: isolate; +} + +.stage { + position: absolute; + inset: 0; + z-index: 0; + overflow: hidden; + background: radial-gradient( + 120% 70% at 50% 40%, + #0b1424 0%, + var(--ground) 70% + ) + var(--ground); +} + +.globe-host { + position: absolute; + inset: 0; +} + +.globe-host > * { + position: absolute; + inset: 0; +} + +.globe-veil { + position: absolute; + inset: 0; + pointer-events: none; + background: + linear-gradient( + to bottom, + rgba(5, 7, 11, 0.55) 0, + rgba(5, 7, 11, 0) calc(var(--safe-t) + 110px) + ), + linear-gradient(to top, rgba(5, 7, 11, 0.7) 0, rgba(5, 7, 11, 0) 260px); + opacity: 1; + transition: opacity var(--dur-3) var(--ease-out); +} + +.globe-chrome { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 3; +} + +.globe-chrome > * { + pointer-events: auto; +} + +.lead { + position: absolute; + inset: 0; + z-index: 2; + pointer-events: none; +} + +.view { + position: absolute; + inset: 0; + background: var(--ground); + pointer-events: auto; +} + +.view[hidden], +.capture[hidden] { + display: none !important; +} + +.view--scroll { + overflow-y: auto; + overflow-x: hidden; + overscroll-behavior-y: contain; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + padding-bottom: calc(var(--chrome-bottom) + 72px); +} + +.view--scroll::-webkit-scrollbar { + display: none; +} + +/* The Globe tab's leading view only exists on regular widths. */ +#view-globe { + display: none; +} + +/* Phone: the Globe tab and an open situation reveal the stage. */ +.app[data-tab='globe'] .lead, +.app.is-world .lead { + visibility: hidden; +} + +.app[data-tab='globe'] .lead .view, +.app.is-world .lead .view { + pointer-events: none; +} + +.app:not([data-tab='globe']):not(.is-world) .globe-chrome { + visibility: hidden; +} + +.view-enter { + animation: view-in var(--dur-2) var(--ease-out) both; +} + +@keyframes view-in { + from { + opacity: 0; + transform: translateY(10px) scale(0.995); + } + to { + opacity: 1; + transform: none; + } +} + +::view-transition-old(root), +::view-transition-new(root) { + animation-duration: 260ms; + animation-timing-function: var(--ease-out); +} + +::view-transition-old(root) { + animation-name: vt-out; +} + +::view-transition-new(root) { + animation-name: vt-in; +} + +@keyframes vt-out { + to { + opacity: 0; + transform: scale(0.985); + } +} + +@keyframes vt-in { + from { + opacity: 0; + transform: scale(1.012); + } +} + +.tabbar { + view-transition-name: tabbar; +} + +::view-transition-group(tabbar) { + animation-duration: 0s; +} + +/* ------------------------------------------------------------------ */ +/* Navigation bar + large title */ +/* ------------------------------------------------------------------ */ + +.navbar { + position: sticky; + top: 0; + z-index: 5; + height: calc(var(--safe-t) + 52px); + padding: var(--safe-t) calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); + display: flex; + align-items: center; + justify-content: center; + pointer-events: none; +} + +.navbar::before { + content: ''; + position: absolute; + inset: 0; + background: rgba(8, 11, 17, 0.62); + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); + border-bottom: 0.5px solid var(--hairline); + opacity: 0; + transition: opacity var(--dur-1) linear; +} + +.navbar > * { + position: relative; + pointer-events: auto; +} + +.navbar .nav-title { + font-family: var(--font-display); + font-weight: 650; + font-size: var(--t-headline); + letter-spacing: -0.02em; + opacity: 0; + transform: translateY(6px); + transition: + opacity var(--dur-1) linear, + transform var(--dur-2) var(--ease-out); +} + +.navbar .nav-leading, +.navbar .nav-trailing { + position: absolute; + top: var(--safe-t); + height: 52px; + display: flex; + align-items: center; + gap: 6px; +} + +.navbar .nav-leading { + left: calc(8px + var(--safe-l)); +} + +.navbar .nav-trailing { + right: calc(12px + var(--safe-r)); +} + +.view.is-scrolled .navbar::before { + opacity: 1; +} + +.view.is-scrolled .navbar .nav-title { + opacity: 1; + transform: none; +} + +.large-title { + margin: -6px 0 0; + padding: 0 calc(var(--gutter) + var(--safe-r)) 2px + calc(var(--gutter) + var(--safe-l)); + font-family: var(--font-display); + font-size: var(--t-large); + font-weight: 750; + letter-spacing: -0.035em; + line-height: 1.12; + transform-origin: left center; + will-change: transform; +} + +.title-sub { + padding: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); + color: var(--ink-3); + font-size: var(--t-foot); + font-weight: 500; + letter-spacing: 0; + display: flex; + align-items: center; + gap: 8px; +} + +.title-sub .live-dot { + --fam: var(--live); +} + +/* ------------------------------------------------------------------ */ +/* Buttons & controls */ +/* ------------------------------------------------------------------ */ + +.icon-btn { + width: var(--touch); + height: var(--touch); + border-radius: 50%; + display: inline-grid; + place-items: center; + font-size: 1.25rem; + color: var(--ink); + transition: + transform var(--dur-1) var(--ease-out), + background var(--dur-1) linear; +} + +.icon-btn.glass, +.icon-btn.glass-strong { + font-size: 1.15rem; +} + +.icon-btn:active, +.pill-btn:active, +.chip:active, +.tile:active { + transform: scale(0.94); +} + +.pill-btn { + min-height: var(--touch); + padding: 0 18px; + border-radius: var(--r-pill); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + font-size: var(--t-sub); + font-weight: 600; + letter-spacing: -0.01em; + transition: transform var(--dur-1) var(--ease-out); + white-space: nowrap; +} + +.pill-btn .i { + font-size: 1.1em; +} + +.pill-btn.primary { + background: var(--ink); + color: #05070b; +} + +.pill-btn.tinted { + background: color-mix(in srgb, var(--fam, var(--tint)) 22%, transparent); + color: var(--fam, var(--tint)); +} + +.pill-btn.plain { + background: rgba(255, 255, 255, 0.08); +} + +.pill-btn.seal { + background: linear-gradient(180deg, #f3cd7f, #c8913a); + color: #2a1a00; +} + +.chip { + display: inline-flex; + align-items: center; + gap: 6px; + height: 32px; + padding: 0 12px; + border-radius: var(--r-pill); + font-size: var(--t-foot); + font-weight: 600; + white-space: nowrap; + transition: + transform var(--dur-1) var(--ease-out), + background var(--dur-1) linear, + color var(--dur-1) linear; +} + +.segmented { + position: relative; + display: grid; + grid-auto-flow: column; + grid-auto-columns: 1fr; + padding: 3px; + border-radius: var(--r-pill); + background: rgba(118, 128, 150, 0.16); + gap: 0; +} + +.segmented button { + position: relative; + z-index: 1; + min-height: 34px; + padding: 0 10px; + font-size: var(--t-foot); + font-weight: 600; + color: var(--ink-2); + border-radius: var(--r-pill); + white-space: nowrap; + transition: color var(--dur-1) linear; +} + +.segmented button[aria-pressed='true'], +.segmented button[aria-selected='true'] { + color: var(--ink); +} + +.segmented .seg-thumb { + position: absolute; + z-index: 0; + top: 3px; + bottom: 3px; + left: 0; + border-radius: var(--r-pill); + background: rgba(255, 255, 255, 0.14); + box-shadow: + inset 0 0.5px 0 rgba(255, 255, 255, 0.3), + 0 3px 10px rgba(0, 0, 0, 0.25); + transition: + transform var(--dur-3) var(--spring), + width var(--dur-3) var(--spring); +} + +/* ------------------------------------------------------------------ */ +/* Tab bar (iOS 26 floating glass) */ +/* ------------------------------------------------------------------ */ + +.tabbar { + position: absolute; + z-index: 40; + left: calc(12px + var(--safe-l)); + right: calc(12px + var(--safe-r)); + bottom: var(--tabbar-gap); + height: var(--tabbar-h); + pointer-events: none; + transition: + transform var(--dur-3) var(--spring-soft), + opacity var(--dur-2) linear; +} + +.app.is-world .tabbar, +.app.hide-tabbar .tabbar { + transform: translateY(calc(100% + var(--tabbar-gap) + 80px)); + opacity: 0; +} + +.tb-full, +.tb-mini { + position: absolute; + inset: 0; + display: flex; + align-items: stretch; + gap: 10px; + transition: + transform var(--dur-3) var(--spring), + opacity var(--dur-2) var(--ease-out); +} + +.tb-full { + pointer-events: auto; +} + +.tb-mini { + pointer-events: none; + opacity: 0; + transform: translateY(8px) scale(1.04); +} + +.tabbar.min .tb-full { + opacity: 0; + transform: translateY(10px) scale(0.92); + pointer-events: none; +} + +.tabbar.min .tb-full .tb-accessory { + transform: translateY(30px); +} + +.tabbar.min .tb-mini { + opacity: 1; + transform: none; + pointer-events: auto; +} + +.tb-tabs, +.tabbar .tb-search, +.tb-accessory, +.tb-mini-tab, +.tb-mini-acc { + background: var(--glass-specular), rgba(16, 20, 28, 0.82); + -webkit-backdrop-filter: blur(26px) saturate(1.8); + backdrop-filter: blur(26px) saturate(1.8); + box-shadow: + inset 0 0.5px 0 rgba(255, 255, 255, 0.34), + inset 0 0 0 0.5px rgba(255, 255, 255, 0.12); +} + +.tb-tabs { + position: relative; + flex: 1; + display: grid; + grid-auto-flow: column; + grid-auto-columns: 1fr; + border-radius: var(--r-pill); + padding: 4px; + overflow: hidden; +} + +.tb-tabs::after, +.tb-search::after, +.tb-accessory::after, +.tb-mini-tab::after, +.liquid::after { + /* Liquid-glass specular edge. */ + content: ''; + position: absolute; + inset: 0; + border-radius: inherit; + pointer-events: none; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.16), + rgba(255, 255, 255, 0) 40%, + rgba(255, 255, 255, 0) 70%, + rgba(255, 255, 255, 0.06) + ); + mix-blend-mode: screen; +} + +.tb-lens { + position: absolute; + top: 4px; + bottom: 4px; + left: 4px; + border-radius: var(--r-pill); + background: rgba(255, 255, 255, 0.13); + box-shadow: + inset 0 0.5px 0 rgba(255, 255, 255, 0.35), + inset 0 -0.5px 0 rgba(255, 255, 255, 0.08); + transition: + transform var(--dur-3) var(--spring), + width var(--dur-3) var(--spring); + pointer-events: none; +} + +.tb-tab { + position: relative; + z-index: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 2px; + min-width: 0; + color: var(--ink-2); + border-radius: var(--r-pill); + transition: color var(--dur-1) linear; +} + +.tb-tab .i { + font-size: 1.5rem; + transition: transform var(--dur-2) var(--spring); +} + +.tb-tab .i .f { + fill: currentColor; + fill-opacity: 0; + stroke: none; + transition: fill-opacity var(--dur-1) linear; +} + +.tb-tab[aria-selected='true'] { + color: var(--tint); +} + +.tb-tab[aria-selected='true'] .i .f { + fill-opacity: 0.22; +} + +.tb-tab:active .i { + transform: scale(0.86); +} + +.tb-label { + font-size: 0.625rem; + font-weight: 600; + letter-spacing: 0.01em; + line-height: 1; + white-space: nowrap; +} + +.tb-search { + position: relative; + flex: none; + width: var(--tabbar-h); + height: var(--tabbar-h); + border-radius: 50%; + display: grid; + place-items: center; + font-size: 1.4rem; + color: var(--ink); +} + +.tb-accessory { + position: absolute; + left: 0; + right: calc(var(--tabbar-h) + 10px); + bottom: calc(100% + 8px); + height: 48px; + border-radius: var(--r-pill); + display: flex; + align-items: center; + gap: 10px; + padding: 0 8px 0 14px; + text-align: left; + transition: + transform var(--dur-3) var(--spring), + opacity var(--dur-2) linear; +} + +.tb-accessory[hidden] { + display: none; +} + +.acc-glyph { + width: 30px; + height: 30px; + border-radius: 50%; + flex: none; + display: grid; + place-items: center; + color: #05070b; + background: var(--fam); + font-size: 1rem; + position: relative; +} + +.acc-glyph::before { + content: ''; + position: absolute; + inset: -3px; + border-radius: 50%; + border: 1.5px solid var(--fam); + opacity: 0.6; + animation: acc-ring 2.2s var(--ease-out) infinite; +} + +.acc-text { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + line-height: 1.15; +} + +.acc-title { + font-size: var(--t-foot); + font-weight: 650; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.acc-meta { + font-size: var(--t-cap2); + color: var(--ink-3); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.acc-metric { + font-size: var(--t-foot); + font-weight: 700; + color: var(--fam); + padding-right: 4px; +} + +.tb-mini-tab { + position: relative; + flex: none; + width: var(--tabbar-h); + height: var(--tabbar-h); + border-radius: 50%; + display: grid; + place-items: center; + font-size: 1.5rem; + color: var(--tint); +} + +.tb-mini-tab .i .f { + fill: currentColor; + fill-opacity: 0.22; + stroke: none; +} + +.tb-mini-acc { + position: relative; + flex: 1; + min-width: 0; + height: var(--tabbar-h); + border-radius: var(--r-pill); + display: flex; + align-items: center; + gap: 10px; + padding: 0 14px; + text-align: left; +} + +.tb-mini-acc[hidden] { + visibility: hidden; +} + +/* ------------------------------------------------------------------ */ +/* Toast */ +/* ------------------------------------------------------------------ */ + +.toast { + position: fixed; + z-index: 100; + left: 50%; + top: calc(var(--safe-t) + 10px); + transform: translate(-50%, -140%); + padding: 10px 16px; + border-radius: var(--r-pill); + display: flex; + gap: 8px; + align-items: center; + font-size: var(--t-foot); + font-weight: 600; + max-width: calc(100vw - 32px); + transition: transform var(--dur-3) var(--spring); + pointer-events: none; +} + +.toast .i { + font-size: 1.1rem; +} + +.toast.show { + transform: translate(-50%, 0); +} + +/* ------------------------------------------------------------------ */ +/* Inset grouped lists (Settings-style) */ +/* ------------------------------------------------------------------ */ + +.section-h { + display: flex; + align-items: baseline; + justify-content: space-between; + padding: 22px calc(var(--gutter) + 4px + var(--safe-r)) 8px + calc(var(--gutter) + 4px + var(--safe-l)); + font-size: var(--t-title3); + font-weight: 700; + letter-spacing: -0.02em; +} + +.section-h small { + font-size: var(--t-foot); + font-weight: 500; + color: var(--ink-3); + letter-spacing: 0; +} + +.group { + margin: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); + border-radius: var(--r-md); + background: var(--ground-2); + overflow: hidden; +} + +.row { + position: relative; + display: flex; + align-items: center; + gap: 12px; + min-height: 52px; + padding: 10px 16px; + width: 100%; + text-align: left; +} + +.row + .row::before { + content: ''; + position: absolute; + top: 0; + left: 58px; + right: 0; + border-top: 0.5px solid var(--hairline); +} + +.row-icon { + width: 30px; + height: 30px; + flex: none; + border-radius: 8px; + display: grid; + place-items: center; + font-size: 1.05rem; + color: #05070b; + background: var(--fam, var(--tint)); +} + +.row-main { + flex: 1; + min-width: 0; +} + +.row-title, +.row-sub { + display: block; +} + +.row-title { + font-size: var(--t-callout); + font-weight: 500; +} + +.row-sub { + font-size: var(--t-foot); + color: var(--ink-3); + margin-top: 1px; +} + +.row-value { + color: var(--ink-3); + font-size: var(--t-callout); +} + +.row .chev { + color: var(--ink-4); + font-size: 0.9rem; +} + +.footnote { + padding: 8px calc(var(--gutter) + 4px + var(--safe-r)) 0 + calc(var(--gutter) + 4px + var(--safe-l)); + font-size: var(--t-foot); + color: var(--ink-3); + line-height: 1.4; +} + +/* iOS switch */ +.switch { + position: relative; + width: 51px; + height: 31px; + flex: none; + border-radius: 16px; + background: rgba(120, 120, 128, 0.32); + transition: background var(--dur-2) linear; +} + +.switch::after { + content: ''; + position: absolute; + top: 2px; + left: 2px; + width: 27px; + height: 27px; + border-radius: 50%; + background: #fff; + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); + transition: transform var(--dur-3) var(--spring); +} + +.switch[aria-checked='true'] { + background: var(--fam, var(--ok)); +} + +.switch[aria-checked='true']::after { + transform: translateX(20px); +} + +input[type='range'].slider { + -webkit-appearance: none; + appearance: none; + width: 100%; + height: 28px; + background: transparent; +} + +input[type='range'].slider::-webkit-slider-runnable-track { + height: 4px; + border-radius: 2px; + background: linear-gradient( + 90deg, + var(--tint) var(--p, 50%), + rgba(120, 120, 128, 0.32) var(--p, 50%) + ); +} + +input[type='range'].slider::-webkit-slider-thumb { + -webkit-appearance: none; + width: 26px; + height: 26px; + margin-top: -11px; + border-radius: 50%; + background: #fff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35); +} + +input[type='range'].slider::-moz-range-track { + height: 4px; + border-radius: 2px; + background: rgba(120, 120, 128, 0.32); +} + +input[type='range'].slider::-moz-range-thumb { + width: 26px; + height: 26px; + border: 0; + border-radius: 50%; + background: #fff; +} + +.badge-example { + display: inline-flex; + align-items: center; + height: 18px; + padding: 0 7px; + border-radius: 5px; + font-size: 0.625rem; + font-weight: 750; + letter-spacing: 0.06em; + text-transform: uppercase; + color: #1b1300; + background: var(--eyes); + white-space: nowrap; +} + +.badge-sim { + color: var(--ink-2); + background: rgba(255, 255, 255, 0.1); +} + +.noscript { + padding: 40px 20px; + text-align: center; +} + +/* Search */ +.search-field { + display: flex; + align-items: center; + gap: 8px; + height: 44px; + padding: 0 12px; + border-radius: 14px; + background: rgba(118, 128, 150, 0.2); + color: var(--ink-3); + font-size: 1.1rem; +} + +.search-field input { + flex: 1; + min-width: 0; + border: 0; + background: transparent; + font-size: var(--t-body); + color: var(--ink); + outline: none; +} + +.search-field input::placeholder { + color: var(--ink-3); +} + +.result { + display: flex; + align-items: center; + gap: 12px; + width: 100%; + padding: 10px 4px; + text-align: left; + border-bottom: 0.5px solid var(--hairline); +} + +.result-thumb { + width: 44px; + height: 44px; + border-radius: 10px; + object-fit: cover; + background: var(--ground-3); + flex: none; +} + +.result-icon { + width: 44px; + height: 44px; + border-radius: 10px; + flex: none; + display: grid; + place-items: center; + font-size: 1.2rem; + color: var(--fam, var(--ink-2)); + background: color-mix(in srgb, var(--fam, #fff) 14%, transparent); +} + +.result-title { + font-weight: 600; + font-size: var(--t-callout); +} + +.result-sub { + font-size: var(--t-foot); + color: var(--ink-3); +} + +.results-h { + margin: 18px 4px 4px; + font-size: var(--t-foot); + font-weight: 650; + color: var(--ink-3); + text-transform: uppercase; + letter-spacing: 0.04em; +} + +@keyframes acc-ring { + 0% { + transform: scale(0.9); + opacity: 0.7; + } + 100% { + transform: scale(1.35); + opacity: 0; + } +} diff --git a/mobile/styles/threads.css b/mobile/styles/threads.css new file mode 100644 index 000000000..daa4ad80e --- /dev/null +++ b/mobile/styles/threads.css @@ -0,0 +1,1387 @@ +/* ------------------------------------------------------------------ */ +/* Threads */ +/* ------------------------------------------------------------------ */ + +.th-cards { + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); +} + +.th-cards .section-h, +.th-cards .footnote { + padding-left: 4px; + padding-right: 4px; +} + +.th-card { + display: block; + width: 100%; + text-align: left; + border-radius: 24px; + overflow: hidden; + background: var(--ground-2); + box-shadow: inset 0 0 0 0.5px var(--hairline); + transition: transform var(--dur-2) var(--spring); +} + +.th-card:active { + transform: scale(0.975); +} + +.th-ba { + position: relative; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 100%; + gap: 2px; + height: 180px; + overflow: hidden; + background: #000; +} + +.th-ba img { + width: 100%; + height: 100%; + min-height: 0; + object-fit: cover; + object-position: 50% 18%; +} + +.th-ba-l, +.th-ba-r { + position: absolute; + bottom: 8px; + padding: 3px 8px; + border-radius: 8px; + background: rgba(5, 7, 11, 0.65); + font-size: var(--t-cap2); + font-weight: 700; + letter-spacing: 0.04em; +} + +.th-ba-l { + left: 8px; +} + +.th-ba-r { + left: calc(50% + 8px); + color: var(--hazards); +} + +.th-card-body { + padding: 12px 16px 14px; + min-width: 0; +} + +.th-kicker { + display: flex; + align-items: center; + gap: 8px; + font-size: var(--t-cap); + color: var(--ink-3); + font-weight: 600; +} + +.th-card h3 { + margin: 6px 0 2px; + font-family: var(--font-display); + font-size: var(--t-title3); + font-weight: 700; + letter-spacing: -0.02em; +} + +.th-place { + font-size: var(--t-foot); + color: var(--ink-3); +} + +.th-stats { + display: flex; + flex-wrap: wrap; + gap: 4px 14px; + margin-top: 10px; + font-size: var(--t-foot); + color: var(--ink-2); +} + +.th-stats b { + color: var(--ink); +} + +.th-lic { + margin-top: 8px; + font-size: var(--t-cap2); + color: var(--ink-4); +} + +.th-small { + display: flex; + align-items: center; + gap: 4px; + padding-left: 14px; + padding-right: 14px; +} + +.th-small .th-card-body { + flex: 1; + padding: 12px 8px; +} + +.th-small h3 { + font-size: var(--t-callout); + margin-top: 4px; +} + +.th-small-ic { + width: 44px; + height: 44px; + flex: none; + border-radius: 14px; + display: grid; + place-items: center; + font-size: 1.3rem; + color: var(--fam, var(--orbit)); + background: color-mix(in srgb, var(--fam, var(--orbit)) 15%, transparent); +} + +.th-small .chev { + color: var(--ink-4); + font-size: 0.9rem; +} + +.th-small.example { + opacity: 0.8; + background: transparent; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08); + border: 1px dashed transparent; +} + +/* Detail */ +.th-detail { + min-height: 100%; + background: var(--ground); +} + +.th-detail[hidden], +.th-list[hidden] { + display: none; +} + +.back-btn { + width: auto; + padding: 0 10px 0 2px; + gap: 2px; + display: inline-flex; + align-items: center; + border-radius: 22px; + font-size: var(--t-body); + color: var(--tint); +} + +.back-btn .i { + font-size: 1.3rem; +} + +.view.in-detail .navbar .nav-title { + max-width: calc(100% - 240px); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.th-hero { + padding: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); +} + +.th-ba.big { + height: auto; + aspect-ratio: 16 / 10; + border-radius: 20px; + overflow: hidden; + margin: 4px 0 14px; +} + +.th-ba.big figure { + position: relative; + margin: 0; + min-height: 0; + overflow: hidden; +} + +.th-ba.big figcaption { + position: absolute; + left: 8px; + bottom: 8px; + padding: 3px 8px; + border-radius: 8px; + background: rgba(5, 7, 11, 0.7); + font-size: var(--t-cap2); + font-weight: 650; +} + +.th-title { + margin: 0 0 2px; + font-family: var(--font-display); + font-size: 1.75rem; + font-weight: 750; + letter-spacing: -0.03em; + line-height: 1.12; +} + +.strata-nav { + position: sticky; + top: calc(var(--safe-t) + 52px); + z-index: 4; + padding: 10px calc(var(--gutter) + var(--safe-r)) 10px + calc(var(--gutter) + var(--safe-l)); + background: rgba(5, 7, 11, 0.72); + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); + border-bottom: 0.5px solid var(--hairline); + margin-top: 8px; +} + +.strata-nav .segmented button { + font-size: var(--t-cap); + padding: 0 4px; +} + +.stratum { + padding: 14px calc(var(--gutter) + var(--safe-r)) 10px + calc(var(--gutter) + var(--safe-l)); +} + +.stratum-h { + display: flex; + gap: 12px; + align-items: flex-start; + margin-bottom: 12px; +} + +.st-n { + width: 28px; + height: 28px; + border-radius: 50%; + flex: none; + display: grid; + place-items: center; + font-size: var(--t-foot); + font-weight: 800; + color: #05070b; + background: var(--ink); +} + +#st-hyp .st-n { + background: var(--orbit); +} + +#st-nar .st-n { + background: var(--eyes); +} + +#st-led .st-n { + background: var(--seal); +} + +.stratum-h h2 { + margin: 0; + font-family: var(--font-display); + font-size: var(--t-title3); + letter-spacing: -0.02em; +} + +.stratum-h p { + margin: 2px 0 0; + font-size: var(--t-foot); + color: var(--ink-3); + line-height: 1.35; +} + +.obs-list, +.narr-steps, +.ledger, +.checks { + list-style: none; + margin: 0; + padding: 0; +} + +.obs-list { + border-radius: 18px; + background: var(--ground-2); + overflow: hidden; +} + +.obs + .obs { + border-top: 0.5px solid var(--hairline); +} + +.obs.flash { + animation: obs-flash 1.4s var(--ease-out); +} + +@keyframes obs-flash { + from { + background: rgba(201, 167, 255, 0.22); + } +} + +.obs-row { + display: flex; + align-items: center; + gap: 12px; + width: 100%; + min-height: 56px; + padding: 9px 14px; + text-align: left; +} + +.obs-id { + width: 32px; + flex: none; + font-size: var(--t-cap); + font-weight: 800; + color: var(--ink-2); + font-variant-numeric: tabular-nums; +} + +.obs-main { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; +} + +.obs-main b { + font-size: var(--t-sub); + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.obs-main span { + font-size: var(--t-cap); + color: var(--ink-3); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.obs-hash { + flex: none; + display: inline-flex; + align-items: center; + gap: 3px; + font-size: 0.625rem; + color: var(--ink-3); +} + +.obs-hash .i { + font-size: 0.7rem; + color: var(--ink-4); +} + +.obs-more { + padding: 0 14px 14px 58px; + font-size: var(--t-foot); + color: var(--ink-2); +} + +.obs-more p { + margin: 0 0 10px; +} + +.obs-more .facts { + font-size: var(--t-cap); +} + +.obs-more .facts .mono { + font-size: 0.625rem; +} + +.obs-actions { + display: flex; + gap: 8px; + margin-top: 12px; + flex-wrap: wrap; +} + +.obs-actions .pill-btn { + min-height: 38px; + font-size: var(--t-foot); + padding: 0 14px; + text-decoration: none; + color: var(--ink); +} + +.obs-actions .pill-btn.tinted { + --fam: var(--tint); + color: var(--tint); +} + +.example-note { + margin-bottom: 12px; + padding: 10px 12px; + border-radius: 14px; + background: rgba(255, 209, 102, 0.08); + border: 0.5px solid rgba(255, 209, 102, 0.3); + font-size: var(--t-cap); + color: var(--ink-2); + line-height: 1.4; +} + +.hyps { + display: flex; + flex-direction: column; + gap: 10px; +} + +.hyp { + padding: 12px 14px; + border-radius: 18px; + background: var(--ground-2); + box-shadow: inset 3px 0 0 var(--orbit); +} + +.hyp.proposed { + background: + repeating-linear-gradient( + 135deg, + rgba(201, 167, 255, 0.05) 0 8px, + transparent 8px 16px + ), + var(--ground-2); + box-shadow: + inset 3px 0 0 var(--orbit), + inset 0 0 0 1px rgba(201, 167, 255, 0.25); +} + +.hyp-top { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 6px 8px; + font-size: var(--t-cap); +} + +.hyp-id { + font-weight: 800; + color: var(--orbit); +} + +.hyp-author { + display: inline-flex; + align-items: center; + gap: 4px; + font-weight: 650; +} + +.hyp-author.ai { + color: var(--orbit); +} + +.hyp-ago { + margin-left: auto; + color: var(--ink-4); +} + +.hyp-text { + margin: 8px 0; + font-size: var(--t-sub); + line-height: 1.4; +} + +.hyp-cites { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.cite { + min-height: 28px; + padding: 0 9px; + border-radius: 8px; + font-size: var(--t-cap); + font-weight: 700; + font-family: var(--mono); + color: var(--ink-2); + background: rgba(255, 255, 255, 0.08); +} + +.cite::before { + content: '↗ '; + color: var(--ink-4); +} + +.hyp-prov { + display: grid; + grid-template-columns: auto 1fr; + gap: 4px 10px; + margin: 10px 0 0; + padding: 8px 10px; + border-radius: 10px; + background: rgba(0, 0, 0, 0.25); + font-size: var(--t-cap2); +} + +.hyp-prov dt { + color: var(--ink-4); +} + +.hyp-prov dd { + margin: 0; + color: var(--ink-2); + overflow-wrap: anywhere; +} + +.hyp-foot { + display: flex; + align-items: center; + gap: 14px; + margin-top: 10px; +} + +.conf { + flex: 1; + display: flex; + align-items: center; + gap: 8px; + font-size: var(--t-cap2); + color: var(--ink-3); + min-width: 0; +} + +.conf i { + position: relative; + flex: 1; + height: 4px; + border-radius: 2px; + background: rgba(255, 255, 255, 0.1); + overflow: hidden; + max-width: 90px; +} + +.conf i::after { + content: ''; + position: absolute; + inset: 0; + width: calc(var(--v) * 100%); + background: var(--orbit); + border-radius: 2px; +} + +.conf b { + color: var(--ink-2); +} + +.votes { + display: flex; + align-items: center; + gap: 4px; +} + +.vote-bar { + width: 40px; + height: 4px; + border-radius: 2px; + background: rgba(255, 106, 61, 0.55); + overflow: hidden; + margin-right: 4px; +} + +.vote-bar i { + display: block; + height: 100%; + background: var(--ok); +} + +.vote { + display: inline-flex; + align-items: center; + gap: 4px; + min-height: 36px; + min-width: 44px; + padding: 0 8px; + border-radius: 18px; + font-size: var(--t-cap); + font-weight: 700; + color: var(--ink-2); + background: rgba(255, 255, 255, 0.06); +} + +.vote .i { + font-size: 1rem; +} + +.vote.on { + color: var(--ok); + background: rgba(48, 209, 88, 0.15); +} + +.vote.dis.on { + color: var(--hazards); + background: rgba(255, 106, 61, 0.15); +} + +.composer { + margin-top: 14px; + padding: 12px; + border-radius: 18px; + background: + linear-gradient( + 160deg, + rgba(201, 167, 255, 0.12), + rgba(124, 196, 255, 0.05) + ), + var(--ground-2); + box-shadow: inset 0 0 0 0.5px rgba(201, 167, 255, 0.3); +} + +.composer label { + display: flex; + align-items: center; + gap: 6px; + font-size: var(--t-foot); + font-weight: 700; + color: var(--orbit); +} + +.composer textarea { + width: 100%; + margin: 8px 0; + padding: 10px 12px; + border-radius: 12px; + border: 0; + background: rgba(0, 0, 0, 0.3); + font-size: var(--t-sub); + resize: none; + outline: none; + color: var(--ink); +} + +.composer textarea:focus { + box-shadow: 0 0 0 1.5px var(--orbit); +} + +.composer-row { + display: flex; + align-items: center; + gap: 12px; + font-size: var(--t-cap2); + color: var(--ink-3); + line-height: 1.35; +} + +.composer-row .pill-btn { + flex: none; +} + +.narr-card { + display: flex; + align-items: center; + gap: 14px; + padding: 12px; + border-radius: 20px; + background: + linear-gradient(120deg, rgba(255, 209, 102, 0.14), transparent), + var(--ground-2); +} + +.narr-card div { + display: flex; + flex-direction: column; + gap: 2px; + font-size: var(--t-foot); + color: var(--ink-3); +} + +.narr-card b { + color: var(--ink); + font-size: var(--t-sub); +} + +.narr-play { + width: 56px; + height: 56px; + flex: none; + border-radius: 50%; + display: grid; + place-items: center; + font-size: 1.5rem; + color: #1b1300; + background: var(--eyes); + box-shadow: 0 8px 24px rgba(255, 209, 102, 0.3); + transition: transform var(--dur-2) var(--spring); +} + +.narr-play:active { + transform: scale(0.9); +} + +.narr-steps { + margin-top: 10px; + columns: 2; + column-gap: 16px; + font-size: var(--t-cap); +} + +.narr-steps li { + display: grid; + grid-template-columns: 22px 1fr; + column-gap: 6px; + break-inside: avoid; + padding: 5px 0; + border-bottom: 0.5px solid var(--hairline); +} + +.narr-steps span { + color: var(--eyes); + font-weight: 700; +} + +.narr-steps b { + font-weight: 600; +} + +.narr-steps em { + grid-column: 2; + font-style: normal; + color: var(--ink-4); + font-size: var(--t-cap2); +} + +.ledger-actions { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 10px; +} + +.ledger-actions .pill-btn { + min-height: 38px; + font-size: var(--t-foot); + padding: 0 14px; +} + +.led-status { + font-size: var(--t-cap); + font-weight: 650; +} + +.led-status.ok { + color: var(--ok); +} + +.led-status.bad { + color: var(--bad); +} + +.ledger { + position: relative; + border-radius: 18px; + background: var(--ground-1); + box-shadow: inset 0 0 0 0.5px var(--hairline); + padding: 4px 0; +} + +.ledger::before { + content: ''; + position: absolute; + left: 27px; + top: 20px; + bottom: 20px; + border-left: 1px dashed rgba(232, 183, 92, 0.35); +} + +.led-row { + position: relative; + display: flex; + align-items: center; + gap: 12px; + width: 100%; + min-height: 46px; + padding: 6px 12px; + text-align: left; +} + +.led-seq { + position: relative; + z-index: 1; + width: 30px; + height: 22px; + flex: none; + border-radius: 11px; + display: grid; + place-items: center; + font-size: 0.625rem; + font-weight: 800; + background: var(--ground-3); + color: var(--ink-2); +} + +.led.observation .led-seq { + background: #2a3240; +} + +.led.hypothesis .led-seq { + background: rgba(201, 167, 255, 0.3); +} + +.led.ai .led-seq { + background: var(--orbit); + color: #160b2a; +} + +.led.vote .led-seq { + background: rgba(48, 209, 88, 0.3); +} + +.led.thread .led-seq { + background: var(--seal); + color: #2a1a00; +} + +.led-main { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + font-size: var(--t-cap); +} + +.led-main b { + font-family: var(--mono); + font-weight: 600; + font-size: 0.6875rem; +} + +.led-main span { + color: var(--ink-3); + font-size: var(--t-cap2); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.led-hash { + flex: none; + font-size: 0.625rem; + color: var(--seal-2); +} + +.led-json { + margin: 0 12px 10px 54px; + padding: 10px; + border-radius: 10px; + background: rgba(0, 0, 0, 0.35); + font-size: 0.625rem; + line-height: 1.45; + white-space: pre-wrap; + overflow-wrap: anywhere; + color: var(--ink-2); + max-height: 260px; + overflow: auto; +} + +/* Narrative player (in the world) */ +.narr-hud { + position: absolute; + z-index: 5; + left: calc(12px + var(--safe-l)); + right: calc(12px + var(--safe-r)); + bottom: calc(var(--safe-b) + 84px); + padding: 14px 14px 12px; + border-radius: 26px; + display: none; +} + +.app.is-narrative .narr-hud { + display: block; + animation: view-in var(--dur-3) var(--spring) both; +} + +.app.is-world.is-narrative .gc-bottom { + bottom: calc(var(--safe-b) + 12px); + opacity: 1; + transform: none; + pointer-events: auto; +} + +.app.is-world.is-narrative .gc-bottom > * { + pointer-events: auto; +} + +.narr-top { + display: flex; + align-items: center; + gap: 10px; +} + +.narr-top .narr-play { + width: 44px; + height: 44px; + font-size: 1.15rem; +} + +.narr-titles { + flex: 1; + min-width: 0; +} + +.narr-step { + font-size: var(--t-cap2); + font-weight: 750; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--eyes); +} + +.narr-name { + font-family: var(--font-display); + font-size: var(--t-headline); + font-weight: 700; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.narr-prog { + display: flex; + gap: 3px; + margin-top: 12px; +} + +.narr-prog i { + flex: 1; + height: 3px; + border-radius: 2px; + background: rgba(255, 255, 255, 0.15); + transition: background var(--dur-2) linear; +} + +.narr-prog i.done { + background: var(--eyes); +} + +.narr-cav { + margin-top: 8px; + font-size: 0.625rem; + font-weight: 650; + letter-spacing: 0.04em; + color: var(--ink-3); +} + +/* ------------------------------------------------------------------ */ +/* You */ +/* ------------------------------------------------------------------ */ + +.you-id { + display: flex; + align-items: center; + gap: 14px; + padding: 8px calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); +} + +.avatar { + width: 60px; + height: 60px; + border-radius: 50%; + flex: none; + display: grid; + place-items: center; + font-size: 1.6rem; + color: #05070b; + background: conic-gradient( + from 200deg, + var(--sky), + var(--orbit), + var(--hazards), + var(--eyes), + var(--ground-sig), + var(--sea), + var(--sky) + ); +} + +.you-id b { + font-size: var(--t-headline); +} + +.you-id div > span { + display: block; + font-size: var(--t-cap); + color: var(--ink-3); +} + +.captures { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 4px; + margin: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); + border-radius: 18px; + overflow: hidden; +} + +.capture-tile { + position: relative; + aspect-ratio: 1; + background: var(--ground-3); + overflow: hidden; +} + +.capture-tile img, +.capture-tile video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.capture-tile .ct-seal { + position: absolute; + right: 5px; + bottom: 5px; + font-size: 1.15rem; + color: var(--seal); + --seal-ink: #2a1a00; + filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.6)); +} + +.capture-tile .ct-n { + position: absolute; + left: 6px; + top: 6px; + font-size: 0.625rem; + font-weight: 800; + padding: 2px 6px; + border-radius: 6px; + background: rgba(5, 7, 11, 0.6); +} + +.empty { + margin: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); + padding: 22px 18px; + border-radius: 18px; + border: 1px dashed rgba(255, 255, 255, 0.12); + text-align: center; + color: var(--ink-3); + font-size: var(--t-foot); +} + +.empty .i { + font-size: 1.8rem; + color: var(--seal); + margin-bottom: 6px; +} + +.holo { + margin: 0 calc(var(--gutter) + var(--safe-r)) 0 + calc(var(--gutter) + var(--safe-l)); + padding: 16px; + border-radius: 18px; + display: flex; + gap: 14px; + align-items: center; + background: + radial-gradient( + 80% 120% at 0% 0%, + rgba(56, 225, 198, 0.18), + transparent 60% + ), + var(--ground-2); + font-size: var(--t-foot); + color: var(--ink-3); +} + +.holo .i { + font-size: 2rem; + color: var(--sea); + flex: none; +} + +.holo b { + display: block; + color: var(--ink); + font-size: var(--t-sub); +} + +.seg-row { + padding: 8px 16px 12px; +} + +.slider-row { + display: flex; + align-items: center; + gap: 12px; + padding: 4px 16px 14px; +} + +/* Inspector */ +.inspector .sheet-body { + padding-top: 4px; +} + +.insp-head { + display: flex; + align-items: center; + gap: 14px; + padding: 4px 48px 12px 0; +} + +.insp-thumb { + position: relative; + width: 64px; + height: 64px; + flex: none; + border-radius: 14px; + overflow: hidden; + background: var(--ground-3); +} + +.insp-thumb img, +.insp-thumb video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.insp-thumb span { + position: absolute; + right: 3px; + bottom: 3px; + font-size: 1.2rem; + color: var(--seal); + --seal-ink: #2a1a00; +} + +.insp-banner { + display: flex; + gap: 12px; + align-items: flex-start; + padding: 14px; + border-radius: 18px; + font-size: var(--t-cap); + color: var(--ink-3); + line-height: 1.4; +} + +.insp-banner > .i { + font-size: 1.8rem; + flex: none; +} + +.insp-banner b { + display: block; + font-size: var(--t-headline); + color: var(--ink); + margin-bottom: 2px; +} + +.insp-banner.pass { + background: linear-gradient( + 135deg, + rgba(232, 183, 92, 0.2), + rgba(232, 183, 92, 0.04) + ); +} + +.insp-banner.pass > .i { + color: var(--seal); +} + +.insp-banner.warn { + background: rgba(255, 214, 10, 0.1); +} + +.insp-banner.warn > .i { + color: var(--seal); +} + +.insp-banner.fail { + background: rgba(255, 69, 58, 0.14); +} + +.insp-banner.fail > .i { + color: var(--bad); +} + +.insp-banner.running { + align-items: center; + background: var(--ground-2); +} + +.spinner { + width: 20px; + height: 20px; + border-radius: 50%; + border: 2.5px solid rgba(255, 255, 255, 0.15); + border-top-color: var(--seal); + animation: spin 800ms linear infinite; +} + +.checks { + margin-top: 14px; +} + +.check { + display: flex; + gap: 12px; + padding: 10px 0; + border-bottom: 0.5px solid var(--hairline); +} + +.check .ck { + width: 24px; + height: 24px; + border-radius: 50%; + flex: none; + display: grid; + place-items: center; + font-size: 0.8rem; + color: #05070b; +} + +.check.pass .ck { + background: var(--ok); +} + +.check.warn .ck { + background: var(--warn); +} + +.check.fail .ck { + background: var(--bad); + color: #fff; +} + +.check.na .ck { + background: var(--ink-4); +} + +.check div { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.check b { + font-size: var(--t-sub); + font-weight: 650; +} + +.check span { + font-size: var(--t-cap); + color: var(--ink-3); + line-height: 1.35; + font-variant-numeric: tabular-nums; +} + +.smalls { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px 16px; +} + +.sm { + display: grid; + grid-template-columns: 22px 1fr; + grid-template-rows: auto auto; + align-items: center; + column-gap: 6px; +} + +.sm span { + grid-row: span 2; + font-family: var(--mono); + font-size: var(--t-foot); + color: var(--ink-2); +} + +.sm svg { + width: 100%; + height: 26px; +} + +.sm path { + fill: none; + stroke: var(--eyes); + stroke-width: 1.2; + vector-effect: non-scaling-stroke; +} + +.sm em { + font-style: normal; + font-size: 0.625rem; + color: var(--ink-4); +} + +.insp-map { + position: relative; + border-radius: 14px; + overflow: hidden; + aspect-ratio: 2 / 1; + background: var(--ground-3); +} + +.insp-map img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.insp-map i { + position: absolute; + left: 50%; + top: 50%; + width: 14px; + height: 14px; + margin: -7px 0 0 -7px; + border-radius: 50%; + background: var(--seal); + box-shadow: + 0 0 0 3px rgba(5, 7, 11, 0.7), + 0 0 0 14px rgba(232, 183, 92, 0.2); +} + +.insp-map span { + position: absolute; + left: 8px; + bottom: 8px; + padding: 3px 8px; + border-radius: 8px; + background: rgba(5, 7, 11, 0.7); + font-size: 0.625rem; +} + +.mono-facts { + font-size: var(--t-cap); +} + +.mono-facts dt { + font-family: var(--mono); +} + +.mono-facts .mono { + font-size: 0.625rem; + color: var(--ink-2); +} + +.insp-actions { + display: flex; + gap: 8px; + margin-top: 16px; +} + +.insp-actions .pill-btn { + flex: 1; + font-size: var(--t-foot); +} diff --git a/mobile/styles/tokens.css b/mobile/styles/tokens.css new file mode 100644 index 000000000..2f4c3f817 --- /dev/null +++ b/mobile/styles/tokens.css @@ -0,0 +1,365 @@ +/* + * God's Eye — mobile design tokens. + * One ground, one light source (the globe), glass over it. + * Signal colours are reserved for meaning (DESIGN.md §4). + */ + +:root { + color-scheme: dark; + + /* Ground */ + --ground: #05070b; + --ground-1: #0a0e15; + --ground-2: #10151e; + --ground-3: #171d28; + --hairline: rgba(255, 255, 255, 0.08); + --hairline-strong: rgba(255, 255, 255, 0.14); + + /* Ink */ + --ink: #f4f7fb; + --ink-2: rgba(235, 241, 250, 0.72); + --ink-3: rgba(235, 241, 250, 0.5); + --ink-4: rgba(235, 241, 250, 0.3); + + /* Signals (reserved) */ + --sky: #7cc4ff; + --sea: #38e1c6; + --orbit: #c9a7ff; + --hazards: #ff6a3d; + --eyes: #ffd166; + --ground-sig: #9be15d; + --weather: #8ab4f8; + --infra: #b8c0cc; + --seal: #e8b75c; + --seal-2: #ffdf9e; + --live: #ff453a; + --ok: #30d158; + --warn: #ffd60a; + --bad: #ff453a; + --tint: #7cc4ff; + + /* Glass */ + --glass-bg: rgba(22, 27, 37, 0.52); + --glass-bg-strong: rgba(18, 22, 31, 0.74); + --glass-blur: blur(24px) saturate(1.6); + --glass-edge: + inset 0 0.5px 0 0 rgba(255, 255, 255, 0.32), + inset 0 0 0 0.5px rgba(255, 255, 255, 0.1); + --glass-specular: radial-gradient( + 120% 80% at 30% -20%, + rgba(255, 255, 255, 0.18), + rgba(255, 255, 255, 0) 60% + ); + + /* Geometry */ + --r-xs: 8px; + --r-sm: 12px; + --r-md: 18px; + --r-lg: 24px; + --r-xl: 28px; + --r-pill: 999px; + --touch: 44px; + --gutter: 16px; + + /* Safe areas */ + --safe-t: env(safe-area-inset-top, 0px); + --safe-b: env(safe-area-inset-bottom, 0px); + --safe-l: env(safe-area-inset-left, 0px); + --safe-r: env(safe-area-inset-right, 0px); + --tabbar-h: 62px; + --tabbar-gap: max(10px, calc(var(--safe-b) - 8px)); + --chrome-bottom: calc(var(--tabbar-h) + var(--tabbar-gap) + 10px); + + /* Type (rem-based so Dynamic Type / browser zoom scales it) */ + --font: + system-ui, -apple-system, 'SF Pro Text', 'Roboto Flex', Roboto, 'Segoe UI', + sans-serif; + --font-display: + system-ui, -apple-system, 'SF Pro Display', 'Roboto Flex', Roboto, + 'Segoe UI', sans-serif; + --font-rounded: ui-rounded, 'SF Pro Rounded', system-ui, sans-serif; + --mono: + ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, 'Roboto Mono', monospace; + --t-large: 2.125rem; /* 34 pt */ + --t-title2: 1.375rem; + --t-title3: 1.25rem; + --t-headline: 1.0625rem; + --t-body: 1.0625rem; + --t-callout: 1rem; + --t-sub: 0.9375rem; + --t-foot: 0.8125rem; + --t-cap: 0.75rem; + --t-cap2: 0.6875rem; + + /* Motion. Springs are sampled with linear() where supported. */ + --ease-out: cubic-bezier(0.22, 1, 0.36, 1); + --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); + --spring: cubic-bezier(0.32, 1.25, 0.4, 1); + --spring-soft: cubic-bezier(0.25, 1.1, 0.4, 1); + --dur-1: 160ms; + --dur-2: 280ms; + --dur-3: 460ms; + + /* Layout */ + --lead-w: 100vw; +} + +@supports (transition-timing-function: linear(0, 1)) { + :root { + /* Critically-damped-ish spring (response 0.42, damping 0.82). */ + --spring: linear( + 0, + 0.009, + 0.035 2.1%, + 0.141 4.4%, + 0.723 12.9%, + 0.938 16.7%, + 1.017 19.8%, + 1.067, + 1.089 25.9%, + 1.085 29.1%, + 1.05 35.4%, + 1.016 42.4%, + 0.999 51.8%, + 0.996 58.3%, + 1 + ); + --spring-soft: linear( + 0, + 0.06 3%, + 0.25 7.5%, + 0.6 15%, + 0.84 22%, + 0.96 30%, + 1.012 38%, + 1.02 46%, + 1.006 60%, + 1 + ); + } +} + +@media (prefers-reduced-motion: reduce) { + :root { + --dur-1: 1ms; + --dur-2: 120ms; + --dur-3: 160ms; + } +} + +:root[data-reduce-motion='on'] { + --dur-1: 1ms; + --dur-2: 120ms; + --dur-3: 160ms; +} + +/* Base */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + background: var(--ground); + color: var(--ink); + font-family: var(--font); + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; + height: 100%; + overscroll-behavior: none; +} + +body { + margin: 0; + min-height: 100%; + height: 100%; + overflow: hidden; + background: var(--ground); + font-size: var(--t-body); + line-height: 1.32; + letter-spacing: -0.012em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-feature-settings: 'kern', 'ss01'; + overscroll-behavior: none; + touch-action: manipulation; +} + +button { + font: inherit; + color: inherit; + background: none; + border: 0; + padding: 0; + margin: 0; + cursor: pointer; + -webkit-user-select: none; + user-select: none; + touch-action: manipulation; +} + +input, +textarea, +select { + font: inherit; + color: inherit; +} + +img { + display: block; + max-width: 100%; +} + +svg.i { + width: 1em; + height: 1em; + display: inline-block; + flex: none; + overflow: visible; +} + +:focus { + outline: none; +} + +:focus-visible { + outline: 2.5px solid var(--tint); + outline-offset: 2px; + border-radius: 10px; +} + +.tnum, +.num { + font-variant-numeric: tabular-nums; + font-feature-settings: 'tnum'; +} + +.mono { + font-family: var(--mono); + font-variant-numeric: tabular-nums; + letter-spacing: 0; +} + +.sr-only { + position: absolute !important; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Glass primitive */ +.glass { + background: var(--glass-specular), var(--glass-bg); + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); + box-shadow: var(--glass-edge); +} + +.glass-strong { + background: var(--glass-specular), var(--glass-bg-strong); + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); + box-shadow: var(--glass-edge); +} + +/* Family colour binding */ +[data-family='sky'] { + --fam: var(--sky); +} +[data-family='sea'] { + --fam: var(--sea); +} +[data-family='orbit'] { + --fam: var(--orbit); +} +[data-family='hazards'] { + --fam: var(--hazards); +} +[data-family='eyes'] { + --fam: var(--eyes); +} +[data-family='ground'] { + --fam: var(--ground-sig); +} +[data-family='weather'] { + --fam: var(--weather); +} +[data-family='infra'] { + --fam: var(--infra); +} + +@keyframes pulse-ring { + 0% { + transform: scale(0.6); + opacity: 0.85; + } + 100% { + transform: scale(2.4); + opacity: 0; + } +} + +@keyframes shimmer { + 0% { + background-position: -180% 0; + } + 100% { + background-position: 180% 0; + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +@keyframes breathe { + 0%, + 100% { + opacity: 0.55; + } + 50% { + opacity: 1; + } +} + +.live-dot { + position: relative; + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--fam, var(--live)); + flex: none; +} + +.live-dot::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 50%; + background: inherit; + animation: pulse-ring 1.8s var(--ease-out) infinite; +} + +.live-dot.stale { + background: transparent; + outline: 1.25px dotted var(--ink-3); +} + +.live-dot.stale::after { + display: none; +} + +@media (prefers-reduced-motion: reduce) { + .live-dot::after { + animation: none; + } +} diff --git a/mobile/ui/capture.js b/mobile/ui/capture.js new file mode 100644 index 000000000..304c0ef3c --- /dev/null +++ b/mobile/ui/capture.js @@ -0,0 +1,957 @@ +/** + * Capture tab: one dial, two modes. + * Look — the God's-eye view projected around you (aircraft, satellites, + * ships) on the camera, aligned by compass + gyro. Drag to look on + * devices without motion sensors. + * Witness — signed photo/video with IMU, GPS, heading and a hash chain. + */ + +import { icon } from './icons.js'; +import { + $, + h, + esc, + clamp, + haptic, + toast, + fmtDist, + fmtAlt, + sparkPath, + reducedMotion, +} from './dom.js'; +import { createCamera } from '../capture/camera.js'; +import { + createSensors, + requestMotionPermission, + poseFromAzEl, + lookAngles, + projectDir, + dirFromAzEl, +} from '../capture/sensors.js'; +import { seal, networkTimeOffset } from '../capture/provenance.js'; + +const KIND_COLOR = { + aircraft: '#7CC4FF', + helicopter: '#7CC4FF', + military: '#7CC4FF', + ship: '#38E1C6', + vessel: '#38E1C6', + satellite: '#C9A7FF', + station: '#FFFFFF', + quake: '#FF6A3D', + fire: '#FF6A3D', +}; +const KIND_LABEL = { + aircraft: ['aircraft', 'aircraft'], + military: ['military', 'military'], + helicopter: ['helicopter', 'helicopters'], + ship: ['ship', 'ships'], + vessel: ['ship', 'ships'], + satellite: ['satellite', 'satellites'], + station: ['space station', 'space stations'], +}; +const FALLBACK_POS = { lat: 37.7749, lon: -122.4194, alt: 16, simulated: true }; +const GATE_KEY = 'gev.mobile.capture.gate'; + +export function createCapture(view, { globe, onSealed, onVerify }) { + view.innerHTML = ` +
+ + + +
+
+
+
+ LAT—LON— + ±—HDG— + PITCH—ROLL— +
+
IMU |a|
+
Session idle
+
+
+ +
+
+ + +
+
+ + + +
+
+
+ + +
`; + + const root = $('.cap', view); + const video = $('.cap-video', view); + const ar = $('.cap-ar', view); + const actx = ar.getContext('2d'); + const tape = $('.cap-tape canvas', view); + const tctx = tape.getContext('2d'); + const traceC = $('.hud-trace canvas', view); + const trctx = traceC.getContext('2d'); + const gate = $('.cap-gate', view); + const sealEl = $('.cap-seal', view); + const status = $('.cap-status', view); + const shutter = $('.shutter', view); + const level = $('.cap-level i', view); + const camera = createCamera(video); + const sensors = createSensors(); + + let mode = 'look'; + let active = false; + let started = false; + let camOk = false; + let raf = 0; + let sim = { az: 250, el: 14 }; + let contacts = []; + let contactsAt = 0; + let W = 0; + let H = 0; + let dpr = 1; + let lastCapture = null; + let netOffset = null; + const VFOV = 62; + + /* ---------- lifecycle ---------- */ + function resize() { + const r = root.getBoundingClientRect(); + dpr = Math.min(2, devicePixelRatio || 1); + W = r.width; + H = r.height; + ar.width = Math.round(W * dpr); + ar.height = Math.round(H * dpr); + const tr = tape.getBoundingClientRect(); + tape.width = Math.round(tr.width * dpr); + tape.height = Math.round(tr.height * dpr); + const hr = traceC.getBoundingClientRect(); + traceC.width = Math.round(hr.width * dpr); + traceC.height = Math.round(hr.height * dpr); + } + new ResizeObserver(resize).observe(root); + + async function begin({ withSensors }) { + gate.hidden = true; + try { + sessionStorage.setItem(GATE_KEY, '1'); + } catch { + /* ignore */ + } + started = true; + if (withSensors) { + const perm = await requestMotionPermission(); + if (perm === 'denied') + showStatus('Motion access denied — drag to look around', 4000); + sensors.start(); + try { + await camera.start(); + camOk = true; + root.classList.add('has-camera'); + } catch (err) { + camOk = false; + root.classList.remove('has-camera'); + showStatus( + err?.name === 'NotAllowedError' + ? 'Camera access was declined — showing a simulated sky' + : 'No camera here — showing a simulated sky', + 4500, + ); + } + } + networkTimeOffset().then((o) => (netOffset = o)); + if (mode === 'witness') sensors.beginSession(); + loop(); + } + + function enter() { + active = true; + resize(); + let seen = false; + try { + seen = sessionStorage.getItem(GATE_KEY) === '1'; + } catch { + /* ignore */ + } + if (!started && !seen) gate.hidden = false; + else if (!started) begin({ withSensors: true }); + else { + if (camOk) camera.start().catch(() => {}); + sensors.start(); + if (mode === 'witness' && !sensors.recording) sensors.beginSession(); + loop(); + } + } + + function leave() { + active = false; + cancelAnimationFrame(raf); + raf = 0; + camera.stop(); + sensors.endSession(); + sensors.stop(); + } + + $('.gate-go', view).addEventListener('click', () => + begin({ withSensors: true }), + ); + $('.gate-skip', view).addEventListener('click', () => + begin({ withSensors: false }), + ); + + function showStatus(text, ms = 2500) { + status.textContent = text; + status.hidden = false; + clearTimeout(showStatus.t); + showStatus.t = setTimeout(() => (status.hidden = true), ms); + } + + /* ---------- mode dial ---------- */ + function setMode(m) { + if (m === mode) return; + mode = m; + root.dataset.mode = m; + view + .querySelectorAll('.cap-modes [data-mode]') + .forEach((b) => + b.setAttribute('aria-selected', String(b.dataset.mode === m)), + ); + haptic('tick'); + if (m === 'witness' && started) sensors.beginSession(); + if (m === 'look') sensors.endSession(); + } + $('.cap-modes', view).addEventListener('click', (e) => { + const b = e.target.closest('[data-mode]'); + if (b) setMode(b.dataset.mode); + }); + // Swipe the viewfinder sideways to change mode, like Camera. + let swipe = null; + root.addEventListener( + 'touchstart', + (e) => + (swipe = e.target.closest('.cap-bottom, .cap-seal, .cap-gate') + ? null + : { x: e.touches[0].clientX, y: e.touches[0].clientY }), + { passive: true }, + ); + root.addEventListener( + 'touchend', + (e) => { + if (!swipe || mode === 'look') return (swipe = null); + const t = e.changedTouches[0]; + const dx = t.clientX - swipe.x; + if (Math.abs(dx) > 70 && Math.abs(t.clientY - swipe.y) < 50) + setMode(dx > 0 ? 'look' : 'witness'); + swipe = null; + }, + { passive: true }, + ); + + /* ---------- drag to look (no sensors) ---------- */ + let look = null; + ar.addEventListener('pointerdown', (e) => { + if (sensors.state.hasOrientation) return; + look = { x: e.clientX, y: e.clientY, az: sim.az, el: sim.el }; + ar.setPointerCapture(e.pointerId); + }); + ar.addEventListener('pointermove', (e) => { + if (!look) return; + const degPerPx = VFOV / H; + sim.az = (look.az - (e.clientX - look.x) * degPerPx + 360) % 360; + sim.el = clamp(look.el + (e.clientY - look.y) * degPerPx, -30, 85); + }); + ar.addEventListener('pointerup', () => (look = null)); + ar.addEventListener('pointercancel', () => (look = null)); + ar.style.touchAction = 'none'; + + function observer() { + const f = sensors.state.fix; + return f + ? { lat: f.lat, lon: f.lon, alt: f.alt || 0, acc: f.acc } + : FALLBACK_POS; + } + + function pose() { + return sensors.pose() || poseFromAzEl(sim.az, sim.el); + } + + /* ---------- render loop ---------- */ + function loop() { + if (!active || raf) return; + const frame = () => { + raf = 0; + if (!active) return; + const p = pose(); + if (mode === 'look') drawLook(p); + else drawWitness(p); + drawTape(p); + raf = requestAnimationFrame(frame); + }; + raf = requestAnimationFrame(frame); + } + + const stars = (() => { + let s = 11; + const r = () => (s = (s * 16807) % 2147483647) / 2147483647; + return Array.from({ length: 260 }, () => ({ + az: r() * 360, + el: Math.asin(r()) * 57.3, + m: r(), + })); + })(); + + function drawSky(p) { + // Horizon position at the screen centre column. + const hz = projectDir(dirFromAzEl(p.az, 0), p, W, H, VFOV); + const hy = hz.behind ? (p.el > 0 ? H * 2 : -H) : hz.y; + const g = actx.createLinearGradient(0, hy - H, 0, hy); + g.addColorStop(0, '#03060f'); + g.addColorStop(0.55, '#0a1630'); + g.addColorStop(0.9, '#1b3557'); + g.addColorStop(1, '#3b5f80'); + actx.fillStyle = g; + actx.fillRect(0, 0, W, H); + actx.fillStyle = '#05080d'; + actx.save(); + // Ground polygon below the horizon line, honouring roll. + const l = projectDir(dirFromAzEl(p.az - 80, 0), p, W, H, VFOV); + const r = projectDir(dirFromAzEl(p.az + 80, 0), p, W, H, VFOV); + if (!l.behind && !r.behind) { + const k = (r.y - l.y) / (r.x - l.x || 1); + const yAt = (x) => l.y + k * (x - l.x); + actx.beginPath(); + actx.moveTo(-10, yAt(-10)); + actx.lineTo(W + 10, yAt(W + 10)); + actx.lineTo(W + 10, H + 10); + actx.lineTo(-10, H + 10); + actx.closePath(); + const gg = actx.createLinearGradient(0, hy, 0, hy + H * 0.6); + gg.addColorStop(0, '#1a2633'); + gg.addColorStop(1, '#04060a'); + actx.fillStyle = gg; + actx.fill(); + } else if (p.el < 0) actx.fillRect(0, 0, W, H); + actx.restore(); + for (const s of stars) { + if (s.el < 2) continue; + const q = projectDir(dirFromAzEl(s.az, s.el), p, W, H, VFOV); + if (q.behind || q.x < 0 || q.y < 0 || q.x > W || q.y > H) continue; + actx.fillStyle = `rgba(255,255,255,${0.25 + s.m * 0.6})`; + actx.fillRect(q.x, q.y, s.m > 0.9 ? 1.8 : 1.1, s.m > 0.9 ? 1.8 : 1.1); + } + } + + function drawHorizon(p) { + actx.lineWidth = 1; + for (const el of [-20, -10, 0, 10, 20, 30, 45, 60]) { + const pts = []; + for (let d = -70; d <= 70; d += 5) { + const q = projectDir(dirFromAzEl(p.az + d, el), p, W, H, VFOV); + if (!q.behind) pts.push(q); + } + if (pts.length < 2) continue; + actx.strokeStyle = + el === 0 ? 'rgba(255,255,255,0.55)' : 'rgba(255,255,255,0.12)'; + actx.setLineDash(el === 0 ? [] : [3, 6]); + actx.beginPath(); + pts.forEach((q, i) => + i ? actx.lineTo(q.x, q.y) : actx.moveTo(q.x, q.y), + ); + actx.stroke(); + actx.setLineDash([]); + if (el && pts.length) { + const mid = pts[Math.floor(pts.length / 2)]; + actx.fillStyle = 'rgba(255,255,255,0.35)'; + actx.font = '600 10px ui-rounded, system-ui'; + actx.fillText(`${el > 0 ? '+' : ''}${el}°`, mid.x + 6, mid.y - 3); + } + } + // Cardinal labels on the horizon. + const card = [ + ['N', 0], + ['E', 90], + ['S', 180], + ['W', 270], + ]; + actx.font = '700 13px ui-rounded, system-ui'; + actx.textAlign = 'center'; + for (const [n, az] of card) { + const q = projectDir(dirFromAzEl(az, 0), p, W, H, VFOV); + if (q.behind || q.x < -20 || q.x > W + 20) continue; + actx.fillStyle = n === 'N' ? '#ff6b61' : 'rgba(255,255,255,0.8)'; + actx.fillText(n, q.x, q.y + 18); + } + actx.textAlign = 'left'; + } + + function refreshContacts() { + const now = performance.now(); + if (now - contactsAt < 1000) return; + contactsAt = now; + const o = observer(); + contacts = globe.contactsNear(o.lon, o.lat, 150); + } + + function rrect(x, y, w, hh, r) { + actx.beginPath(); + actx.moveTo(x + r, y); + actx.arcTo(x + w, y, x + w, y + hh, r); + actx.arcTo(x + w, y + hh, x, y + hh, r); + actx.arcTo(x, y + hh, x, y, r); + actx.arcTo(x, y, x + w, y, r); + actx.closePath(); + } + + function drawLook(p) { + actx.setTransform(dpr, 0, 0, dpr, 0, 0); + actx.clearRect(0, 0, W, H); + if (!camOk) drawSky(p); + drawHorizon(p); + refreshContacts(); + const o = observer(); + const items = []; + const offscreen = []; + for (const c of contacts) { + const la = lookAngles(o, c); + if (la.el < -2) continue; + const q = projectDir(la.enu, p, W, H, VFOV); + const vis = !q.behind && q.x > 0 && q.x < W && q.y > 60 && q.y < H - 40; + (vis ? items : offscreen).push({ c, la, q }); + } + items.sort((a, b) => a.la.range - b.la.range); + const placed = []; + let shown = 0; + for (const it of items.slice(0, 24)) { + const { c, la, q } = it; + const col = KIND_COLOR[c.kind] || '#fff'; + const near = la.range < 40e3; + // Marker + actx.strokeStyle = col; + actx.lineWidth = 1.6; + actx.beginPath(); + if (c.kind === 'satellite' || c.kind === 'station') { + actx.moveTo(q.x, q.y - 7); + actx.lineTo(q.x + 7, q.y); + actx.lineTo(q.x, q.y + 7); + actx.lineTo(q.x - 7, q.y); + actx.closePath(); + } else if (c.kind === 'ship' || c.kind === 'vessel') { + actx.rect(q.x - 6, q.y - 6, 12, 12); + } else actx.arc(q.x, q.y, near ? 9 : 6.5, 0, Math.PI * 2); + actx.stroke(); + actx.fillStyle = col; + actx.beginPath(); + actx.arc(q.x, q.y, 1.8, 0, Math.PI * 2); + actx.fill(); + if (shown >= 12) continue; + // Callout with simple de-cluttering. + const title = c.title || c.id; + const sub = + c.kind === 'satellite' || c.kind === 'station' + ? `${Math.round(c.altM / 1000)} km · ${fmtDist(la.range)}` + : `${c.altM > 50 ? fmtAlt(c.altM) + ' · ' : ''}${fmtDist(la.range)}`; + actx.font = '700 12px ui-monospace, SFMono-Regular, Menlo, monospace'; + const tw = Math.max( + actx.measureText(title).width, + ((actx.font = '500 10.5px ui-rounded, system-ui'), + actx.measureText(sub).width), + ); + const bw = tw + 18; + const bh = 36; + let bx = q.x + 16; + let by = q.y - bh - 12; + if (bx + bw > W - 8) bx = q.x - 16 - bw; + for ( + let k = 0; + k < 6 && + placed.some( + (r) => + !( + bx + bw < r.x || + bx > r.x + r.w || + by + bh < r.y || + by > r.y + r.h + ), + ); + k += 1 + ) + by -= bh + 4; + if (by < 64) continue; + placed.push({ x: bx, y: by, w: bw, h: bh }); + shown += 1; + actx.strokeStyle = 'rgba(255,255,255,0.45)'; + actx.lineWidth = 1; + actx.beginPath(); + actx.moveTo(q.x + (bx > q.x ? 6 : -6), q.y - 6); + actx.lineTo(bx > q.x ? bx : bx + bw, by + bh); + actx.stroke(); + rrect(bx, by, bw, bh, 10); + actx.fillStyle = 'rgba(8,11,17,0.72)'; + actx.fill(); + actx.strokeStyle = 'rgba(255,255,255,0.14)'; + actx.stroke(); + actx.fillStyle = col; + actx.fillRect(bx, by + 8, 2.5, bh - 16); + actx.fillStyle = '#fff'; + actx.font = '700 12px ui-monospace, SFMono-Regular, Menlo, monospace'; + actx.fillText(title, bx + 10, by + 15); + actx.fillStyle = 'rgba(235,241,250,0.65)'; + actx.font = '500 10.5px ui-rounded, system-ui'; + actx.fillText(sub, bx + 10, by + 29); + } + // Edge arrows for the nearest contacts outside the view. + offscreen.sort((a, b) => a.la.range - b.la.range); + for (const it of offscreen.slice(0, 5)) { + const d = ((it.la.az - p.az + 540) % 360) - 180; + const x = d < 0 ? 18 : W - 18; + const y = clamp(H / 2 - (it.la.el - p.el) * (H / VFOV), 90, H - 200); + actx.fillStyle = KIND_COLOR[it.c.kind] || '#fff'; + actx.globalAlpha = 0.85; + actx.beginPath(); + actx.moveTo(x + (d < 0 ? -7 : 7), y); + actx.lineTo(x + (d < 0 ? 5 : -5), y - 7); + actx.lineTo(x + (d < 0 ? 5 : -5), y + 7); + actx.closePath(); + actx.fill(); + actx.globalAlpha = 1; + } + const counts = {}; + for (const c of contacts) counts[c.kind] = (counts[c.kind] || 0) + 1; + const legend = Object.entries(counts) + .map( + ([k, n]) => + `${n} ${(KIND_LABEL[k] || [k, `${k}s`])[n > 1 ? 1 : 0]}`, + ) + .join(''); + const lg = $('.cap-legend', view); + const key = `${legend}|${o.simulated}|${sensors.state.hasOrientation}`; + if (lg.dataset.key !== key) { + lg.dataset.key = key; + lg.innerHTML = `${legend}${o.simulated ? 'simulated position · ' : ''}${sensors.state.hasOrientation ? 'compass-aligned' : 'drag to look'}`; + } + } + + let hudT = 0; + function drawWitness(p) { + actx.setTransform(dpr, 0, 0, dpr, 0, 0); + actx.clearRect(0, 0, W, H); + if (!camOk) { + drawSky(p); + actx.fillStyle = 'rgba(255,255,255,0.5)'; + actx.font = '600 12px ui-rounded, system-ui'; + actx.textAlign = 'center'; + actx.fillText('NO CAMERA · TEST FRAME', W / 2, H / 2 + 60); + actx.textAlign = 'left'; + } + // Thirds grid + actx.strokeStyle = 'rgba(255,255,255,0.14)'; + actx.lineWidth = 0.75; + actx.beginPath(); + for (const k of [1 / 3, 2 / 3]) { + actx.moveTo(W * k, 0); + actx.lineTo(W * k, H); + actx.moveTo(0, H * k); + actx.lineTo(W, H * k); + } + actx.stroke(); + level.style.transform = `rotate(${(-p.roll).toFixed(1)}deg)`; + level.parentElement.classList.toggle('level', Math.abs(p.roll) < 1.5); + const now = performance.now(); + if (now - hudT > 100) { + hudT = now; + updateHud(p); + } + } + + function updateHud(p) { + const f = sensors.state.fix; + const set = (k, v) => { + const el = view.querySelector(`[data-h="${k}"]`); + if (el && el.textContent !== v) el.textContent = v; + }; + set('lat', f ? f.lat.toFixed(5) : '—'); + set('lon', f ? f.lon.toFixed(5) : '—'); + set( + 'acc', + f ? `${Math.round(f.acc)} m` : sensors.state.geoError ? 'denied' : '…', + ); + set('hdg', `${Math.round(p.az)}°`); + set('pitch', `${p.el >= 0 ? '+' : ''}${p.el.toFixed(0)}°`); + set('roll', `${p.roll >= 0 ? '+' : ''}${p.roll.toFixed(0)}°`); + const s = sensors.recording; + set( + 'session', + s + ? `Recording session · ${sensors.state.hasMotion ? 'IMU live' : 'no IMU'} · ${f ? 'GPS fix' : 'no GPS'}` + : 'Session idle', + ); + $('.hud-rec', view).classList.toggle('on', s); + // IMU trace (sized lazily: the HUD is hidden in Look). + const hr = traceC.getBoundingClientRect(); + if (Math.round(hr.width * dpr) !== traceC.width) { + traceC.width = Math.round(hr.width * dpr); + traceC.height = Math.round(hr.height * dpr); + } + const tw = traceC.width / dpr; + const th = traceC.height / dpr; + trctx.setTransform(dpr, 0, 0, dpr, 0, 0); + trctx.clearRect(0, 0, tw, th); + const tr = sensors.trace; + if (tr.length > 2) { + const vals = tr.map((x) => x.v); + const d = sparkPath(vals, tw, th, 2); + trctx.strokeStyle = '#FFD166'; + trctx.lineWidth = 1.4; + trctx.stroke(new Path2D(d)); + } else { + trctx.strokeStyle = 'rgba(255,255,255,0.25)'; + trctx.setLineDash([2, 3]); + trctx.beginPath(); + trctx.moveTo(0, th / 2); + trctx.lineTo(tw, th / 2); + trctx.stroke(); + trctx.setLineDash([]); + } + } + + function drawTape(p) { + const tr = tape.getBoundingClientRect(); + if ( + Math.round(tr.width * dpr) !== tape.width || + Math.round(tr.height * dpr) !== tape.height + ) { + tape.width = Math.round(tr.width * dpr); + tape.height = Math.round(tr.height * dpr); + } + const w = tape.width / dpr; + const hh = tape.height / dpr; + if (!w) return; + tctx.setTransform(dpr, 0, 0, dpr, 0, 0); + tctx.clearRect(0, 0, w, hh); + const pxPerDeg = w / 90; + tctx.textAlign = 'center'; + for (let d = Math.floor(p.az - 50); d <= p.az + 50; d += 1) { + const deg = ((d % 360) + 360) % 360; + if (deg % 5) continue; + const x = w / 2 + (d - p.az) * pxPerDeg; + const major = deg % 15 === 0; + tctx.strokeStyle = major + ? 'rgba(255,255,255,0.7)' + : 'rgba(255,255,255,0.28)'; + tctx.beginPath(); + tctx.moveTo(x, hh - 4); + tctx.lineTo(x, hh - (major ? 12 : 7)); + tctx.stroke(); + if (deg % 45 === 0) { + const n = { + 0: 'N', + 45: 'NE', + 90: 'E', + 135: 'SE', + 180: 'S', + 225: 'SW', + 270: 'W', + 315: 'NW', + }[deg]; + tctx.font = '700 11px ui-rounded, system-ui'; + tctx.fillStyle = deg === 0 ? '#ff6b61' : '#fff'; + tctx.fillText(n, x, hh - 16); + } else if (deg % 15 === 0) { + tctx.font = '500 9px ui-rounded, system-ui'; + tctx.fillStyle = 'rgba(255,255,255,0.5)'; + tctx.fillText(String(deg), x, hh - 16); + } + } + const fade = (x0, x1) => { + const g = tctx.createLinearGradient(x0, 0, x1, 0); + g.addColorStop(0, 'rgba(0,0,0,1)'); + g.addColorStop(1, 'rgba(0,0,0,0)'); + tctx.globalCompositeOperation = 'destination-out'; + tctx.fillStyle = g; + tctx.fillRect(Math.min(x0, x1), 0, Math.abs(x1 - x0), hh); + tctx.globalCompositeOperation = 'source-over'; + }; + fade(0, 30); + fade(w, w - 30); + $('.cap-caret', view).dataset.deg = `${Math.round(p.az)}°`; + } + + /* ---------- shutter ---------- */ + let hold = null; + let recording = null; + shutter.addEventListener('pointerdown', (e) => { + if (mode === 'look') return; + e.preventDefault(); + hold = setTimeout(startVideo, 380); + }); + const release = async () => { + if (mode === 'look') return; + if (hold) { + clearTimeout(hold); + hold = null; + if (!recording) await takePhoto(); + } + if (recording) await stopVideo(); + }; + shutter.addEventListener('pointerup', release); + shutter.addEventListener('pointerleave', () => recording && release()); + shutter.addEventListener('click', (e) => { + if (mode === 'look') { + setMode('witness'); + return; + } + if (e.detail === 0) takePhoto(); + }); + + async function startVideo() { + hold = null; + if (!camOk || !camera.canRecord()) { + showStatus('Video needs a camera — sealing a still instead'); + return takePhoto(); + } + try { + camera.startVideo(); + } catch (err) { + showStatus(err.message); + return; + } + recording = { + t0: performance.now(), + timer: setTimeout(() => stopVideo(), 15000), + }; + root.classList.add('recording'); + haptic('medium'); + } + async function stopVideo() { + const r = recording; + recording = null; + clearTimeout(r?.timer); + root.classList.remove('recording'); + const blob = await camera.stopVideo(); + if (blob?.size) await sealMedia(blob, 'video'); + } + + async function takePhoto() { + flash(); + haptic('light'); + let blob; + let test = false; + try { + blob = await camera.photo(); + } catch { + test = true; + blob = await new Promise((resolve) => { + const c = document.createElement('canvas'); + c.width = Math.round(W * dpr); + c.height = Math.round(H * dpr); + const x = c.getContext('2d'); + x.drawImage(ar, 0, 0); + x.fillStyle = 'rgba(255,209,102,0.9)'; + x.font = `${Math.round(16 * dpr)}px ui-monospace, monospace`; + x.fillText( + `TEST FRAME ${new Date().toISOString()}`, + 16 * dpr, + c.height - 24 * dpr, + ); + c.toBlob(resolve, 'image/jpeg', 0.9); + }); + } + await sealMedia(blob, 'photo', test); + } + + function flash() { + const f = h('
'); + root.appendChild(f); + f.animate([{ opacity: 0.85 }, { opacity: 0 }], { + duration: reducedMotion() ? 80 : 320, + easing: 'ease-out', + }).finished.then(() => f.remove()); + } + + async function sealMedia(blob, kind, test = false) { + const session = sensors.endSession() || { + start: new Date().toISOString(), + end: new Date().toISOString(), + imu: [], + gps: [], + heading: null, + }; + if (!session.heading) { + const p = pose(); + session.heading = { + deg: Math.round(p.az * 10) / 10, + pitch: Math.round(p.el * 10) / 10, + roll: 0, + source: 'simulated', + }; + } + session.mode = kind; + const tz = Intl.DateTimeFormat().resolvedOptions().timeZone; + const context = { + app: 'gods-eye-mobile-prototype/0.1', + device: + navigator.userAgentData?.platform || navigator.platform || 'unknown', + mobile: + navigator.userAgentData?.mobile ?? /Mobi/i.test(navigator.userAgent), + ua: navigator.userAgent, + screen: { + w: screen.width, + h: screen.height, + dpr: devicePixelRatio, + orientation: screen.orientation?.type || null, + }, + timezone: tz, + tzOffsetMin: new Date().getTimezoneOffset(), + networkTimeOffsetMs: netOffset, + camera: camera.info(), + sensors: { + motion: sensors.state.hasMotion, + orientation: sensors.state.hasOrientation, + absoluteHeading: + sensors.state.absolute || sensors.state.compass != null, + }, + testFrame: test || undefined, + }; + const url = URL.createObjectURL(blob); + showSealing(url, kind, test); + try { + const bundle = await seal({ media: blob, session, context }); + lastCapture = { bundle, url }; + setThumb(url, kind); + showSealed(bundle, url, kind, test); + onSealed?.(bundle); + } catch (err) { + console.error(err); + sealEl.hidden = true; + toast(`Could not seal: ${err.message}`); + } + if (active && mode === 'witness') sensors.beginSession(); + } + + function setThumb(url, kind) { + const t = $('.cap-thumb', view); + t.innerHTML = + kind === 'video' + ? `` + : `Last sealed capture`; + t.classList.add('has'); + } + + /* ---------- seal ceremony ---------- */ + const SEAL_D = (() => { + let d = ''; + for (let i = 0; i <= 96; i += 1) { + const a = (i / 96) * Math.PI * 2; + const r = 40 + 4.2 * Math.cos(a * 12); + d += `${i ? 'L' : 'M'}${(50 + r * Math.cos(a)).toFixed(2)} ${(50 + r * Math.sin(a)).toFixed(2)}`; + } + return `${d}Z`; + })(); + + function showSealing(url, kind, test) { + sealEl.hidden = false; + sealEl.innerHTML = `
+
${kind === 'video' ? `` : `Captured frame`}${test ? 'Test frame' : ''}
+
+
Sealing…
+
+
`; + scramble($('.seal-hash', sealEl), null); + } + + function scramble(el, finalText) { + const hex = '0123456789abcdef'; + const len = 64; + let n = 0; + clearInterval(scramble.t); + scramble.t = setInterval( + () => { + n += 1; + let s = ''; + for (let i = 0; i < len; i += 1) { + const settled = finalText && i < (n - 6) * 4; + s += settled ? finalText[i] : hex[(Math.random() * 16) | 0]; + } + el.innerHTML = s + .match(/.{16}/g) + .map((g) => `${g}`) + .join(''); + if (finalText && (n - 6) * 4 >= len) clearInterval(scramble.t); + }, + reducedMotion() ? 1 : 28, + ); + } + + function showSealed(bundle, url, kind, test) { + const card = $('.seal-card', sealEl); + card.classList.add('sealed'); + haptic('seal'); + $('.seal-state', sealEl).innerHTML = + `Sealed · capture #${bundle.seq}`; + scramble($('.seal-hash', sealEl), bundle.hash); + const imu = bundle.session.imu; + const mags = imu.map((s) => Math.hypot(s.ax ?? 0, s.ay ?? 0, s.az ?? 0)); + const dur = imu.length > 1 ? (imu[imu.length - 1].t - imu[0].t) / 1000 : 0; + const gps = bundle.session.gps; + const f = gps[gps.length - 1]; + card.insertAdjacentHTML( + 'beforeend', + `
${mags.length > 2 ? `` : '
No motion sensors on this device
'}IMU ${imu.length} samples${dur ? ` · ${dur.toFixed(1)} s` : ''}
+
+
Signed
ECDSA P-256 · key ${esc(bundle.keyId)}
+
Chain
#${bundle.seq} ← ${bundle.prev ? `${esc(bundle.prev.slice(0, 12))}…` : 'genesis'}
+
Where
${f ? `${f.lat.toFixed(5)}, ${f.lon.toFixed(5)} ±${Math.round(f.acc)} m` : 'no GPS fix'}
+
Heading
${bundle.session.heading ? `${Math.round(bundle.session.heading.deg)}° · ${esc(bundle.session.heading.source)}` : '—'}
+
Media
${esc(bundle.media.type)} · ${(bundle.media.bytes / 1024).toFixed(0)} KB
+
+
`, + ); + } + + sealEl.addEventListener('click', (e) => { + const a = e.target.closest('[data-seal]')?.dataset.seal; + if (a === 'done') sealEl.hidden = true; + if (a === 'verify' && lastCapture) onVerify?.(lastCapture.bundle); + }); + + $('.cap-thumb', view).addEventListener('click', () => { + if (lastCapture) onVerify?.(lastCapture.bundle); + else toast('No captures yet — switch to Witness and tap the shutter'); + }); + view.querySelector('[data-act="recenter"]').addEventListener('click', () => { + const s = sensors.state; + showStatus( + `${camOk ? 'Camera on' : 'No camera'} · ${s.hasOrientation ? (s.compass != null ? 'compass' : s.absolute ? 'absolute orientation' : 'relative orientation') : 'no motion sensors'} · ${s.fix ? `GPS ±${Math.round(s.fix.acc)} m` : s.geoError ? 'location denied' : 'locating…'}`, + 3500, + ); + }); + + return { + enter, + leave, + setMode, + get mode() { + return mode; + }, + sensors, + }; +} diff --git a/mobile/ui/dom.js b/mobile/ui/dom.js new file mode 100644 index 000000000..3bc6d2ff7 --- /dev/null +++ b/mobile/ui/dom.js @@ -0,0 +1,308 @@ +/** Small DOM, formatting, motion and haptic helpers shared by the shell. */ + +export const $ = (sel, root = document) => root.querySelector(sel); +export const $$ = (sel, root = document) => [...root.querySelectorAll(sel)]; + +const ESC = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', +}; +/** Escape untrusted text for HTML interpolation. */ +export const esc = (v) => String(v ?? '').replace(/[&<>"']/g, (c) => ESC[c]); + +/** Build one element from an HTML string. */ +export function h(html) { + const t = document.createElement('template'); + t.innerHTML = html.trim(); + return t.content.firstElementChild; +} + +export const clamp = (v, a, b) => Math.min(b, Math.max(a, v)); +export const lerp = (a, b, t) => a + (b - a) * t; + +/** "2 min ago", "just now", "3 h ago". */ +export function ago(ts, now = Date.now()) { + if (!ts) return ''; + const t = typeof ts === 'number' ? ts : new Date(ts).getTime(); + const s = Math.max(0, Math.round((now - t) / 1000)); + if (s < 45) return 'just now'; + const m = Math.round(s / 60); + if (m < 60) return `${m} min ago`; + const hrs = Math.round(m / 60); + if (hrs < 48) return `${hrs} h ago`; + return `${Math.round(hrs / 24)} d ago`; +} + +export function fmtNum(v, digits = 0) { + if (v == null || v === '') return '—'; + if (typeof v !== 'number') return String(v); + if (Math.abs(v) >= 10000) + return new Intl.NumberFormat(undefined, { + notation: 'compact', + maximumFractionDigits: 1, + }).format(v); + return v.toLocaleString(undefined, { + maximumFractionDigits: digits, + minimumFractionDigits: digits, + }); +} + +export function fmtCoord(lat, lon, d = 4) { + if (!Number.isFinite(lat) || !Number.isFinite(lon)) return '—'; + const ns = lat >= 0 ? 'N' : 'S'; + const ew = lon >= 0 ? 'E' : 'W'; + return `${Math.abs(lat).toFixed(d)}° ${ns} ${Math.abs(lon).toFixed(d)}° ${ew}`; +} + +export function fmtDist(m) { + if (!Number.isFinite(m)) return '—'; + if (m < 1000) return `${Math.round(m)} m`; + if (m < 100000) return `${(m / 1000).toFixed(1)} km`; + return `${Math.round(m / 1000).toLocaleString()} km`; +} + +export function fmtAlt(m) { + if (!Number.isFinite(m)) return '—'; + if (m > 100000) return `${Math.round(m / 1000).toLocaleString()} km`; + const ft = m * 3.28084; + return `${Math.round(ft / 100) * 100 >= 1000 ? (Math.round(ft / 100) * 100).toLocaleString() : Math.round(ft)} ft`; +} + +/* ---------- Settings (per-viewer conveniences only) ---------- */ + +const SETTINGS_KEY = 'gev.mobile.settings.v1'; +const defaults = { + quality: 'auto', + reduceMotion: 'system', + alertRadiusKm: 250, + haptics: true, + followed: [], + lens: 'cinematic', +}; + +let settings = { ...defaults }; +try { + const raw = localStorage.getItem(SETTINGS_KEY); + if (raw) settings = { ...defaults, ...JSON.parse(raw) }; +} catch { + /* storage unavailable: defaults */ +} + +const subs = new Set(); +export const store = { + get: (k) => settings[k], + set(k, v) { + settings[k] = v; + try { + localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings)); + } catch { + /* ignore */ + } + subs.forEach((fn) => fn(k, v)); + }, + on(fn) { + subs.add(fn); + return () => subs.delete(fn); + }, + isFollowed: (id) => settings.followed.includes(id), + toggleFollow(id) { + const list = settings.followed.includes(id) + ? settings.followed.filter((x) => x !== id) + : [id, ...settings.followed]; + store.set('followed', list); + return list.includes(id); + }, +}; + +/* ---------- Motion ---------- */ + +const rmQuery = matchMedia('(prefers-reduced-motion: reduce)'); +export function reducedMotion() { + const pref = settings.reduceMotion; + if (pref === 'on') return true; + if (pref === 'off') return false; + return rmQuery.matches; +} + +export function applyMotionPref() { + const pref = settings.reduceMotion; + if (pref === 'system') delete document.documentElement.dataset.reduceMotion; + else document.documentElement.dataset.reduceMotion = pref; +} + +/** Spring easing string for WAAPI (falls back to cubic-bezier). */ +export const SPRING = (() => { + try { + if (CSS.supports('transition-timing-function', 'linear(0, 1)')) + return 'linear(0, 0.009, 0.035 2.1%, 0.141 4.4%, 0.723 12.9%, 0.938 16.7%, 1.017 19.8%, 1.067, 1.089 25.9%, 1.085 29.1%, 1.05 35.4%, 1.016 42.4%, 0.999 51.8%, 0.996 58.3%, 1)'; + } catch { + /* ignore */ + } + return 'cubic-bezier(0.32, 1.25, 0.4, 1)'; +})(); + +export const SPRING_SOFT = (() => { + try { + if (CSS.supports('transition-timing-function', 'linear(0, 1)')) + return 'linear(0, 0.06 3%, 0.25 7.5%, 0.6 15%, 0.84 22%, 0.96 30%, 1.012 38%, 1.02 46%, 1.006 60%, 1)'; + } catch { + /* ignore */ + } + return 'cubic-bezier(0.25, 1.1, 0.4, 1)'; +})(); + +export const EASE_OUT = 'cubic-bezier(0.22, 1, 0.36, 1)'; + +export const nextFrame = () => + new Promise((r) => requestAnimationFrame(() => r())); + +/* ---------- Haptics ---------- */ + +const PATTERNS = { + tick: 5, + light: 8, + medium: 14, + success: [10, 40, 18], + seal: [12, 60, 12, 60, 28], + warn: [20, 50, 20], +}; +export function haptic(kind = 'tick') { + if (!settings.haptics) return; + try { + if (navigator.vibrate) navigator.vibrate(PATTERNS[kind] ?? 5); + } catch { + /* ignore */ + } +} + +/* ---------- Toast ---------- */ + +let toastTimer = 0; +export function toast(text, { icon: iconHtml = '' } = {}) { + let el = document.getElementById('toast'); + if (!el) { + el = h( + '
', + ); + document.body.appendChild(el); + } + el.innerHTML = `${iconHtml}${esc(text)}`; + el.classList.remove('show'); + void el.offsetWidth; + el.classList.add('show'); + clearTimeout(toastTimer); + toastTimer = setTimeout(() => el.classList.remove('show'), 2200); +} + +/** Inline SVG sparkline path for a numeric series. */ +export function sparkPath(values, w, h, pad = 1.5) { + const v = values.filter(Number.isFinite); + if (v.length < 2) return ''; + let lo = Math.min(...v); + let hi = Math.max(...v); + if (hi - lo < 1e-9) { + hi += 1; + lo -= 1; + } + return v + .map((y, i) => { + const px = pad + (i / (v.length - 1)) * (w - pad * 2); + const py = pad + (1 - (y - lo) / (hi - lo)) * (h - pad * 2); + return `${i ? 'L' : 'M'}${px.toFixed(1)} ${py.toFixed(1)}`; + }) + .join(''); +} + +/** Long press helper; returns a disposer. */ +export function onLongPress(el, fn, ms = 480) { + let timer = 0; + let sx = 0; + let sy = 0; + let fired = false; + const down = (e) => { + fired = false; + sx = e.clientX; + sy = e.clientY; + timer = setTimeout(() => { + fired = true; + fn(e); + }, ms); + }; + const move = (e) => { + if (Math.hypot(e.clientX - sx, e.clientY - sy) > 8) clearTimeout(timer); + }; + const up = () => clearTimeout(timer); + el.addEventListener('pointerdown', down, { passive: true }); + el.addEventListener('pointermove', move, { passive: true }); + el.addEventListener('pointerup', up, { passive: true }); + el.addEventListener('pointercancel', up, { passive: true }); + el.addEventListener( + 'click', + (e) => { + if (fired) { + e.stopImmediatePropagation(); + e.preventDefault(); + fired = false; + } + }, + true, + ); + el.addEventListener('contextmenu', (e) => e.preventDefault()); +} + +/** A tiny event emitter. */ +export function emitter() { + const m = new Map(); + return { + on(ev, fn) { + if (!m.has(ev)) m.set(ev, new Set()); + m.get(ev).add(fn); + return () => m.get(ev)?.delete(fn); + }, + off(ev, fn) { + m.get(ev)?.delete(fn); + }, + emit(ev, data) { + m.get(ev)?.forEach((fn) => { + try { + fn(data); + } catch (err) { + console.error(err); + } + }); + }, + }; +} + +/** Esri World Imagery export URL for a lon/lat box around a point. */ +export function esriThumb(lon, lat, spanDeg = 1.2, w = 480, hgt = 600) { + const aspect = hgt / w; + const dLon = spanDeg / Math.max(0.2, Math.cos((lat * Math.PI) / 180)); + const dLat = spanDeg * aspect; + const west = lon - dLon / 2; + const east = lon + dLon / 2; + const south = Math.max(-85, lat - dLat / 2); + const north = Math.min(85, lat + dLat / 2); + return `https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export?bbox=${west.toFixed(4)},${south.toFixed(4)},${east.toFixed(4)},${north.toFixed(4)}&bboxSR=4326&imageSR=3857&size=${w},${hgt}&format=jpg&f=image`; +} + +/** Safe-area insets in px (env() read through a probe element). */ +let insetProbe = null; +export function safeInsets() { + if (!insetProbe) { + insetProbe = document.createElement('div'); + insetProbe.style.cssText = + 'position:fixed;top:0;left:0;visibility:hidden;pointer-events:none;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)'; + document.body.appendChild(insetProbe); + } + const cs = getComputedStyle(insetProbe); + return { + top: parseFloat(cs.paddingTop) || 0, + right: parseFloat(cs.paddingRight) || 0, + bottom: parseFloat(cs.paddingBottom) || 0, + left: parseFloat(cs.paddingLeft) || 0, + }; +} diff --git a/mobile/ui/feed.js b/mobile/ui/feed.js new file mode 100644 index 000000000..7505da684 --- /dev/null +++ b/mobile/ui/feed.js @@ -0,0 +1,350 @@ +/** + * Now: a two-column, RedNote-style masonry of live situations with a large + * collapsing title, section tabs, pull-to-refresh and skeleton loading. + */ + +import { icon, FAMILY_ICON, FAMILIES } from './icons.js'; +import { $, $$, esc, ago, fmtNum, clamp, haptic } from './dom.js'; + +const SECTIONS = [ + { id: 'now', label: 'Happening now' }, + { id: 'near', label: 'Near you' }, + { id: 'recon', label: 'Reconstructions' }, + { id: 'always', label: 'Always on' }, +]; + +const ASPECTS = [1.25, 1, 1.33, 0.82, 1.18, 0.95]; +const FAM_NAME = Object.fromEntries(FAMILIES.map((f) => [f.id, f.name])); + +function hashStr(s) { + let x = 2166136261; + for (let i = 0; i < s.length; i += 1) + x = Math.imul(x ^ s.charCodeAt(i), 16777619); + return x >>> 0; +} + +/** Height/width ratio for a card: from the thumbnail URL when known, else stable per id. */ +function aspectFor(s) { + const m = /size=(\d+),(\d+)/.exec(s.thumbnail || ''); + if (m) return clamp(Number(m[2]) / Number(m[1]), 0.72, 1.4); + if (s.kind === 'reconstruction') return 1.3; + return ASPECTS[hashStr(String(s.id)) % ASPECTS.length]; +} + +export function isReconstruction(s) { + return ( + s.section === 'reconstructions' || s.kind === 'reconstruction' || !!s.thread + ); +} +export function isAlwaysOn(s) { + return s.section === 'always' || !!s.alwaysOn; +} + +function distKm(a, b) { + const R = 6371; + const dLat = ((b.lat - a.lat) * Math.PI) / 180; + const dLon = ((b.lon - a.lon) * Math.PI) / 180; + const x = + Math.sin(dLat / 2) ** 2 + + Math.cos((a.lat * Math.PI) / 180) * + Math.cos((b.lat * Math.PI) / 180) * + Math.sin(dLon / 2) ** 2; + return 2 * R * Math.asin(Math.min(1, Math.sqrt(x))); +} + +export function createFeed( + view, + { getSituations, onOpen, onLocate, bindScroll }, +) { + view.innerHTML = ` + + +
+

Now

+
Loading the planet…
+
+ ${SECTIONS.map((s, i) => ``).join('')} + +
+ +
+ +
`; + + const inner = $('.feed-inner', view); + const cols = $$('.mcol', view); + const masonry = $('.masonry', view); + const tabs = $('.feed-tabs', view); + const ink = $('.feed-tabs-ink', view); + const count = $('.feed-count', view); + const note = $('.feed-note', view); + const ptr = $('.ptr', view); + let section = 'now'; + let all = []; + let userLoc = null; + const cardEls = new Map(); + let selectedId = null; + + function skeleton() { + cols.forEach((c, ci) => { + c.innerHTML = [0, 1, 2] + .map( + (i) => + `
`, + ) + .join(''); + }); + } + + function cardHtml(s) { + const m = s.metrics?.[0]; + const ar = aspectFor(s); + const fam = FAM_NAME[s.family] || s.family; + return `
+ +
+ +
+ ${icon(FAMILY_ICON[s.family] || 'now')}${esc(fam)} + ${s.live ? 'LIVE' : isReconstruction(s) ? `${icon('threads')}4D` : ''} +
+ ${m ? `
${esc(fmtNum(m.value, typeof m.value === 'number' && m.value % 1 ? 1 : 0))}${m.unit ? `${esc(m.unit)}` : ''}${esc(m.label)}
` : ''} +
+
+

${esc(s.title)}

+
${icon('pin')}${esc(s.place || '')}
+
${esc(shortSource(s.source))}${esc(ago(s.updatedAt))}
+
+
`; + } + + function shortSource(src = '') { + return String(src).split(/[·(]/)[0].trim() || 'Live feed'; + } + + function filtered() { + if (section === 'recon') return all.filter(isReconstruction); + if (section === 'always') return all.filter(isAlwaysOn); + if (section === 'near') { + const at = userLoc || { lon: -122.42, lat: 37.77 }; + return [...all] + .filter((s) => Number.isFinite(s.lon)) + .sort((a, b) => distKm(at, a) - distKm(at, b)) + .slice(0, 8); + } + return all + .filter((s) => !isReconstruction(s) && !isAlwaysOn(s)) + .sort((a, b) => new Date(b.updatedAt) - new Date(a.updatedAt)); + } + + function render() { + const list = filtered(); + cardEls.clear(); + const heights = [0, 0]; + const parts = [[], []]; + for (const s of list) { + const col = heights[0] <= heights[1] ? 0 : 1; + parts[col].push(cardHtml(s)); + heights[col] += aspectFor(s) + 0.42; + } + cols.forEach((c, i) => (c.innerHTML = parts[i].join(''))); + $$('.card[data-id]', masonry).forEach((el) => { + cardEls.set(el.dataset.id, el); + el.classList.toggle('is-selected', el.dataset.id === selectedId); + }); + masonry.setAttribute('aria-busy', 'false'); + $('.feed-end', view).hidden = !list.length; + const live = all.filter((s) => s.live).length; + count.textContent = `${live} live · ${all.length} situations · ${new Date().toLocaleDateString(undefined, { weekday: 'short', day: 'numeric', month: 'short' })}`; + if (section === 'near' && !userLoc) { + note.hidden = false; + note.innerHTML = `
${icon('location')}
See what’s around youSorted from San Francisco until you share your location. It stays on this device.
`; + } else note.hidden = true; + // Images fade in when decoded. + $$('img', masonry).forEach((img) => { + if (img.complete) img.classList.add('loaded'); + else + img.addEventListener('load', () => img.classList.add('loaded'), { + once: true, + }); + img.addEventListener('error', () => img.classList.add('failed'), { + once: true, + }); + }); + } + + function placeInk() { + const btn = $(`[data-sec="${section}"]`, tabs); + if (!btn) return; + ink.style.width = `${btn.offsetWidth - 20}px`; + ink.style.transform = `translateX(${btn.offsetLeft + 10}px)`; + } + + async function load({ quiet = false } = {}) { + if (!quiet) skeleton(); + try { + const prev = new Map(all.map((s) => [s.id, JSON.stringify(s.metrics)])); + all = await getSituations(); + render(); + if (quiet) + for (const s of all) + if (prev.has(s.id) && prev.get(s.id) !== JSON.stringify(s.metrics)) + cardEls.get(s.id)?.classList.add('pulse'); + } catch (err) { + console.error(err); + count.textContent = 'Could not reach the live feeds'; + } + } + + tabs.addEventListener('click', (e) => { + const b = e.target.closest('[data-sec]'); + if (!b || b.dataset.sec === section) return; + section = b.dataset.sec; + $$('[data-sec]', tabs).forEach((x) => + x.setAttribute('aria-selected', String(x === b)), + ); + haptic('tick'); + placeInk(); + b.scrollIntoView({ + inline: 'nearest', + block: 'nearest', + behavior: 'smooth', + }); + masonry.classList.remove('swap'); + void masonry.offsetWidth; + masonry.classList.add('swap'); + render(); + }); + + view.addEventListener('click', async (e) => { + const hit = e.target.closest('.card-hit'); + if (hit) { + const card = hit.closest('.card'); + const s = all.find((x) => String(x.id) === card.dataset.id); + if (s) onOpen(s, card); + return; + } + const act = e.target.closest('[data-act]')?.dataset.act; + if (act === 'refresh') refresh(); + if (act === 'locate') { + userLoc = await onLocate(); + render(); + } + }); + + /* ---------- large title + nav bar ---------- */ + const title = $('.large-title', view); + view.addEventListener( + 'scroll', + () => { + const y = view.scrollTop; + view.classList.toggle('is-scrolled', y > 44); + if (y < 0) + title.style.transform = `scale(${1 + Math.min(0.08, -y / 900)})`; + else if (title.style.transform) title.style.transform = ''; + }, + { passive: true }, + ); + bindScroll(view); + + /* ---------- pull to refresh ---------- */ + let pull = null; + let refreshing = false; + const THRESH = 78; + view.addEventListener( + 'touchstart', + (e) => { + if (view.scrollTop > 0 || refreshing || e.touches.length !== 1) return; + pull = { y0: e.touches[0].clientY, d: 0, armed: false }; + }, + { passive: true }, + ); + view.addEventListener( + 'touchmove', + (e) => { + if (!pull) return; + const dy = e.touches[0].clientY - pull.y0; + if (dy <= 0) { + pull.d = 0; + setPull(0); + return; + } + if (view.scrollTop > 0) return; + e.preventDefault(); + pull.d = dy; + const d = (1 - 1 / ((dy * 0.55) / 320 + 1)) * 320; + setPull(d); + if (!pull.armed && d > THRESH) { + pull.armed = true; + haptic('light'); + } else if (pull.armed && d < THRESH) pull.armed = false; + }, + { passive: false }, + ); + view.addEventListener( + 'touchend', + () => { + if (!pull) return; + const armed = pull.armed; + pull = null; + if (armed) refresh(); + else setPull(0, true); + }, + { passive: true }, + ); + + function setPull(d, animate = false) { + const t = animate ? 'transform 420ms var(--spring)' : 'none'; + inner.style.transition = t; + inner.style.transform = d ? `translate3d(0, ${d}px, 0)` : ''; + ptr.style.transition = animate ? 'opacity 200ms linear' : 'none'; + ptr.style.opacity = String(clamp(d / THRESH, 0, 1)); + ptr.style.setProperty('--p', clamp(d / THRESH, 0, 1).toFixed(3)); + } + + async function refresh() { + if (refreshing) return; + refreshing = true; + ptr.classList.add('spinning'); + setPull(64, true); + const t = performance.now(); + await load({ quiet: true }); + const wait = Math.max(0, 700 - (performance.now() - t)); + setTimeout(() => { + ptr.classList.remove('spinning'); + setPull(0, true); + refreshing = false; + haptic('success'); + }, wait); + } + + // Keep "2 min ago" honest. + setInterval(() => { + $$('.ago[data-ts]', view).forEach((el) => { + if (el.dataset.ts) + el.textContent = ago(Number(el.dataset.ts) || el.dataset.ts); + }); + }, 30000); + + new ResizeObserver(placeInk).observe(tabs); + requestAnimationFrame(placeInk); + + return { + load, + refresh, + cardFor: (id) => cardEls.get(String(id)) || null, + situations: () => all, + select(id) { + selectedId = id == null ? null : String(id); + cardEls.forEach((el, k) => + el.classList.toggle('is-selected', k === selectedId), + ); + }, + setLocation(loc) { + userLoc = loc; + if (section === 'near') render(); + }, + }; +} diff --git a/mobile/ui/globeChrome.js b/mobile/ui/globeChrome.js new file mode 100644 index 000000000..0536560aa --- /dev/null +++ b/mobile/ui/globeChrome.js @@ -0,0 +1,549 @@ +/** + * Globe chrome: camera readout, lens switcher, compass/home, attribution, + * the lens dock of eight families, Control-Center-style layer grids, + * the time ribbon and the pick card. + */ + +import { icon, FAMILIES, FAMILY_ICON } from './icons.js'; +import { + $, + $$, + h, + esc, + fmtNum, + haptic, + toast, + store, + onLongPress, +} from './dom.js'; +import { createSheet } from './sheet.js'; +import { createTimeRibbon } from './timeRibbon.js'; + +const LENSES = [ + { + id: 'cinematic', + name: 'Cinematic', + sw: 'linear-gradient(135deg,#0b2a4a,#3a77b8 55%,#f3b46b)', + }, + { + id: 'clear', + name: 'Clear', + sw: 'linear-gradient(135deg,#2a6fb0,#7fb7e6 60%,#e8f1f8)', + }, + { + id: 'night', + name: 'Night', + sw: 'radial-gradient(circle at 40% 60%,#ffcf6b 0,#c27a2a 8%,#0b1020 26%,#03050a)', + }, + { + id: 'thermal', + name: 'Thermal', + sw: 'linear-gradient(135deg,#120428,#7a1fa2 35%,#ff5a1f 70%,#ffe26b)', + }, + { + id: 'nvg', + name: 'NVG', + sw: 'radial-gradient(circle,#7dff9c 0,#1fa64a 45%,#04140a)', + }, +]; + +const STATUS_LABEL = { + live: 'Live', + stale: 'Stale', + off: 'Off', + error: 'Error', +}; + +export function createGlobeChrome({ + chrome, + stage, + leadView, + globe, + onOpenSituation, + onThread, + getSituations, + isTwoPane, +}) { + /* ---------- top chrome ---------- */ + const top = h(`
+
——
+
+ + + +
+
`); + const attribution = h( + '', + ); + const lensPop = + h(``); + const dock = + h(``); + const pick = h( + ``, + ); + const bottom = h('
'); + chrome.append(top, attribution, lensPop, pick, bottom); + bottom.append(dock); + + const ribbon = createTimeRibbon(bottom, { + getWindow: () => globe.timeWindow(), + onTime: (d) => globe.setTime(d), + }); + + /* ---------- camera readout ---------- */ + globe.on('camera', (c) => { + if (!c) return; + const alt = + c.height > 10000 + ? `${fmtNum(Math.round(c.height / 1000))} km` + : `${fmtNum(Math.round(c.height))} m`; + $('.gc-alt', top).textContent = alt; + $('.gc-ll', top).textContent = + `${Math.abs(c.lat).toFixed(2)}°${c.lat >= 0 ? 'N' : 'S'} ${Math.abs(c.lon).toFixed(2)}°${c.lon >= 0 ? 'E' : 'W'}`; + if (Number.isFinite(c.heading)) + $('.compass-n', top).style.transform = `rotate(${-c.heading}deg)`; + }); + + /* ---------- lens switcher ---------- */ + function setLens(id) { + globe.setLens(id); + store.set('lens', id); + $$('[data-lens]', lensPop).forEach((b) => + b.setAttribute('aria-checked', String(b.dataset.lens === id)), + ); + chrome.dataset.lens = id; + } + setLens(store.get('lens') || 'cinematic'); + lensPop.addEventListener('click', (e) => { + const b = e.target.closest('[data-lens]'); + if (!b) return; + haptic('tick'); + setLens(b.dataset.lens); + setTimeout(() => (lensPop.hidden = true), 160); + }); + document.addEventListener('pointerdown', (e) => { + if (!lensPop.hidden && !e.target.closest('.lens-pop, [data-act="lens"]')) + lensPop.hidden = true; + }); + + /* ---------- family counts + dock ---------- */ + function familyState() { + const layers = globe.layers(); + const st = {}; + for (const f of FAMILIES) + st[f.id] = { on: 0, total: 0, count: 0, layers: [] }; + for (const l of layers) { + const s = st[l.family]; + if (!s) continue; + s.total += 1; + s.layers.push(l); + if (l.on) { + s.on += 1; + s.count += Number(l.count) || 0; + } + } + return st; + } + function refreshDock() { + const st = familyState(); + $$('.fam-chip', dock).forEach((b) => { + const s = st[b.dataset.family]; + b.classList.toggle('on', s.on > 0); + b.querySelector('.fam-count').textContent = s.on ? fmtNum(s.count) : ''; + }); + if (gridFamily) renderGrid(gridFamily); + if (isTwoPane()) renderLeadView(); + } + globe.on('layers', () => refreshDock()); + + let solo = null; + dock.addEventListener('click', (e) => { + const b = e.target.closest('.fam-chip'); + if (b) openGrid(b.dataset.family); + }); + $$('.fam-chip', dock).forEach((b) => + onLongPress(b, () => { + haptic('medium'); + const fam = b.dataset.family; + if (solo?.family === fam) { + for (const l of globe.layers()) + globe.setLayer(l.id, solo.prev.has(l.id)); + solo = null; + toast('All lenses restored', { icon: icon('layers') }); + } else { + const prev = + solo?.prev || + new Set( + globe + .layers() + .filter((l) => l.on) + .map((l) => l.id), + ); + for (const f of FAMILIES) + if (f.id !== fam) globe.setFamily(f.id, false); + globe.setFamily(fam, true); + solo = { family: fam, prev }; + toast( + `Solo · ${FAMILIES.find((f) => f.id === fam).name}. Long-press again to restore`, + { icon: icon(FAMILY_ICON[fam]) }, + ); + } + dock.dataset.solo = solo?.family || ''; + refreshDock(); + }), + ); + + /* ---------- layer grid (Control Center) ---------- */ + const grid = createSheet({ + label: 'Layers', + detents: ['medium', 'large'], + modal: true, + dismissible: true, + closeButton: true, + className: 'grid-sheet', + heights: { + medium: (H) => Math.min(Math.round(H * 0.62), 560), + large: (H) => Math.round(H * 0.92), + }, + }); + let gridFamily = null; + grid.on('close', () => (gridFamily = null)); + + function tileHtml(l) { + return ``; + } + + function renderGrid(fam) { + const st = familyState()[fam]; + const f = FAMILIES.find((x) => x.id === fam); + grid.sheet.dataset.family = fam; + grid.head.innerHTML = `
${icon(FAMILY_ICON[fam])} +

${f.name}

${st.on} of ${st.total} on · ${fmtNum(st.count)} contacts
+
`; + grid.body.innerHTML = `
${st.layers.map(tileHtml).join('')}
+

Long-press ${f.name} in the dock to solo it. Counts are live from each feed; dotted means stale.

`; + } + + function openGrid(fam) { + gridFamily = fam; + renderGrid(fam); + grid.open('medium'); + } + + grid.root.addEventListener('click', (e) => { + const t = e.target.closest('[data-layer]'); + if (t) { + const on = t.getAttribute('aria-checked') !== 'true'; + haptic('tick'); + t.classList.toggle('on', on); + t.setAttribute('aria-checked', String(on)); + globe.setLayer(t.dataset.layer, on); + setTimeout(refreshDock, 30); + return; + } + if (e.target.closest('[data-fam-toggle]')) { + const sw = e.target.closest('[data-fam-toggle]'); + const on = sw.getAttribute('aria-checked') !== 'true'; + haptic('light'); + globe.setFamily(gridFamily, on); + setTimeout(refreshDock, 30); + } + }); + + /* ---------- credits ---------- */ + const credits = createSheet({ + label: 'Attribution', + detents: ['large'], + modal: true, + dismissible: true, + closeButton: true, + heights: { large: (H) => Math.round(H * 0.7) }, + }); + function openCredits() { + const list = globe.credits() || []; + const fixed = [ + { + name: 'Bhote Koshi event pack', + text: 'GeoPera reconstruction centerline; Vantor WorldView-2/3 Open Data; GeoGeorgeShadrach public geolocation map. CC BY-NC 4.0 — not covered by the app’s MIT license.', + url: 'https://creativecommons.org/licenses/by-nc/4.0/', + }, + { + name: 'Esri World Imagery (feed thumbnails)', + text: 'Esri, Maxar, Earthstar Geographics, and the GIS User Community', + url: 'https://www.esri.com', + }, + { + name: 'Place search', + text: '© OpenStreetMap contributors, via Nominatim', + url: 'https://www.openstreetmap.org/copyright', + }, + ]; + const all = [ + ...list, + ...fixed.filter((f) => !list.some((l) => l.name === f.name)), + ]; + credits.head.innerHTML = `

Data & attribution

Imagery, feeds and the people who made them
`; + credits.body.innerHTML = `
${all + .map((c) => { + const text = + c.text || + c.attribution || + String(c.html || '').replace(/<[^>]+>/g, ''); + const [head, ...rest] = + c.name || c.title + ? [c.name || c.title, text] + : text.split(/:\s(.+)/s); + return `
${esc(head)}${rest.filter(Boolean).length ? `${esc(rest.filter(Boolean).join(' '))}` : ''}${c.url ? `${esc(new URL(c.url, location.href).hostname)}` : ''}
`; + }) + .join('')}
`; + credits.open('large'); + } + + top.addEventListener('click', (e) => { + const act = e.target.closest('[data-act]')?.dataset.act; + if (act === 'lens') { + lensPop.hidden = !lensPop.hidden; + haptic('tick'); + } else if (act === 'home') { + haptic('tick'); + hidePick(); + globe.home(); + } else if (act === 'credits') openCredits(); + }); + attribution.addEventListener('click', openCredits); + + /* ---------- pick card ---------- */ + const KIND_ICON = { + aircraft: 'sky', + helicopter: 'sky', + military: 'sky', + ship: 'sea', + vessel: 'sea', + satellite: 'orbit', + station: 'orbit', + launch: 'orbit', + quake: 'hazards', + earthquake: 'hazards', + fire: 'flame', + cyclone: 'weather', + camera: 'eyes', + cctv: 'eyes', + }; + const KIND_FAM = { + aircraft: 'sky', + helicopter: 'sky', + military: 'sky', + ship: 'sea', + vessel: 'sea', + satellite: 'orbit', + station: 'orbit', + launch: 'orbit', + quake: 'hazards', + earthquake: 'hazards', + fire: 'hazards', + cyclone: 'hazards', + flood: 'hazards', + camera: 'eyes', + cctv: 'eyes', + }; + let picked = null; + /** Human rows from a pick's meta: known units formatted, internals dropped. */ + function metaRows(m) { + if (!m || typeof m !== 'object') return []; + const rows = []; + const num = (v) => typeof v === 'number' && Number.isFinite(v); + if (num(m.altitudeM) && m.altitudeM > 0) + rows.push([ + 'altitude', + m.altitudeM > 100000 + ? `${fmtNum(Math.round(m.altitudeM / 1000))} km` + : `${fmtNum(Math.round((m.altitudeM * 3.28084) / 100) * 100)} ft`, + ]); + if (num(m.speedMps)) + rows.push(['speed', `${Math.round(m.speedMps * 1.944)} kt`]); + if (num(m.headingDeg)) + rows.push(['heading', `${Math.round(m.headingDeg)}°`]); + if (num(m.verticalRateMps) && Math.abs(m.verticalRateMps) > 0.5) + rows.push(['climb', `${Math.round(m.verticalRateMps * 196.85)} fpm`]); + const skip = new Set([ + 'layer', + 'source', + 'altitudeM', + 'speedMps', + 'headingDeg', + 'verticalRateMps', + 'onGround', + 'class', + 'situation', + ]); + for (const [k, v] of Object.entries(m)) { + if ( + skip.has(k) || + v == null || + v === '' || + typeof v === 'object' || + typeof v === 'boolean' + ) + continue; + rows.push([ + k.replace(/([A-Z])/g, ' $1').toLowerCase(), + num(v) ? fmtNum(v, v % 1 ? 1 : 0) : String(v), + ]); + } + return rows; + } + function hidePick() { + pick.hidden = true; + picked = null; + chrome.classList.remove('has-pick'); + } + async function showPick(p) { + if (!p) return hidePick(); + if (p.kind === 'situation') { + const s = (await getSituations()).find( + (x) => String(x.id) === String(p.id), + ); + if (s) onOpenSituation(s); + return; + } + picked = p; + const fam = KIND_FAM[p.kind] || 'infra'; + const meta = metaRows(p.meta); + const followed = store.isFollowed(`contact:${p.id}`); + pick.dataset.family = fam; + pick.innerHTML = `
${icon(KIND_ICON[p.kind] || 'scope')} +
${esc(p.title || p.id)}
${esc(p.subtitle || p.kind)}
+
+ ${ + meta.length + ? `
${meta + .slice(0, 6) + .map( + ([k, v]) => + `
${esc(k)}${esc(v)}
`, + ) + .join('')}
` + : '' + } +
${esc(p.meta?.source || '')}${Number.isFinite(p.lat) ? ` · ${p.lat.toFixed(3)}, ${p.lon.toFixed(3)}` : ''}
+
+ + + + +
`; + pick.hidden = false; + chrome.classList.add('has-pick'); + pick.animate( + [ + { transform: 'translateY(14px) scale(.97)', opacity: 0 }, + { transform: 'none', opacity: 1 }, + ], + { duration: 380, easing: 'cubic-bezier(.32,1.25,.4,1)' }, + ); + haptic('light'); + } + globe.on('pick', showPick); + pick.addEventListener('click', async (e) => { + if (e.target.closest('.pick-close')) { + globe.select(null); + return hidePick(); + } + const a = e.target.closest('[data-pick]')?.dataset.pick; + if (!a || !picked) return; + const p = picked; + haptic('light'); + if (a === 'follow') { + const on = store.toggleFollow(`contact:${p.id}`); + toast(on ? `Following ${p.title}` : 'Unfollowed', { + icon: icon(on ? 'starFill' : 'star'), + }); + showPick(p); + } else if (a === 'ride') { + globe.select(p.id); + await globe.flyTo({ + lon: p.lon, + lat: p.lat, + height: p.kind === 'satellite' ? 1200e3 : 6000, + pitch: -12, + duration: 2, + }); + if (globe.isStub) + toast('Ride view needs the live engine — following from above', { + icon: icon('ride'), + }); + } else if (a === 'eye') { + const cams = globe + .contactsNear(p.lon, p.lat, 60) + .filter((c) => /cam|cctv/i.test(c.kind)); + if (cams.length) { + globe.flyTo({ lon: cams[0].lon, lat: cams[0].lat, height: 2500 }); + toast(`Nearest eye: ${cams[0].title}`); + } else toast('No public camera within 60 km', { icon: icon('video') }); + } else if (a === 'thread') + onThread?.({ + id: `contact:${p.id}`, + title: p.title, + place: p.subtitle, + lon: p.lon, + lat: p.lat, + family: KIND_FAM[p.kind] || 'infra', + }); + }); + + /* ---------- two-pane leading view (Globe tab) ---------- */ + function renderLeadView() { + const st = familyState(); + const active = store.get('lens') || 'cinematic'; + leadView.innerHTML = ` +

Globe

+
${Object.values(st).reduce((a, s) => a + s.on, 0)} lenses on · drag the planet, pinch to descend
+
Visual lens
+
${LENSES.map((l) => ``).join('')}
+ ${FAMILIES.map((f) => { + const s = st[f.id]; + return `
${icon(FAMILY_ICON[f.id])}${f.name}${s.on}/${s.total} · ${fmtNum(s.count)}
+
${s.layers.map(tileHtml).join('')}
`; + }).join('')} +

`; + } + leadView.addEventListener('click', (e) => { + const t = e.target.closest('[data-layer]'); + if (t) { + const on = t.getAttribute('aria-checked') !== 'true'; + haptic('tick'); + globe.setLayer(t.dataset.layer, on); + setTimeout(refreshDock, 30); + return; + } + const l = e.target.closest('[data-lens2]'); + if (l) { + setLens(l.dataset.lens2); + renderLeadView(); + } + if (e.target.closest('[data-act2="credits"]')) openCredits(); + }); + + refreshDock(); + + return { + ribbon, + refreshDock, + renderLeadView, + hidePick, + showPick, + openGrid, + openCredits, + setPips: (p) => ribbon.setPips(p), + }; +} diff --git a/mobile/ui/globeHost.js b/mobile/ui/globeHost.js new file mode 100644 index 000000000..ac1f016f6 --- /dev/null +++ b/mobile/ui/globeHost.js @@ -0,0 +1,171 @@ +/** + * Mounts the one persistent globe behind the shell. + * + * Prefers the real Cesium engine (mobile/globe/index.js, DESIGN.md §10) and + * falls back to the offline stub so the shell is always demoable. Every call + * goes through a guard so a missing method or a throwing engine never takes + * the shell down; mismatches are collected in `contractReport` for the lead. + */ + +const REQUIRED = [ + 'flyTo', + 'home', + 'layers', + 'setLayer', + 'setFamily', + 'setTime', + 'timeWindow', + 'setLens', + 'focus', + 'select', + 'on', + 'off', + 'pause', + 'resume', + 'contactsNear', + 'situations', +]; + +export const contractReport = { + engine: 'none', + missing: [], + errors: [], + notes: [], +}; +if (typeof window !== 'undefined') window.__gevContract = contractReport; + +/** Families are lower-case ids in the shell; the engine may capitalise them. */ +const fam = (f) => String(f || 'infra').toLowerCase(); +const normLayer = (l) => ({ ...l, family: fam(l.family) }); +function normSituation(s) { + const section = String(s.section || '').toLowerCase(); + return { + ...s, + family: fam(s.family), + section: + section === 'reconstruction' ? 'reconstructions' : section || undefined, + alwaysOn: s.alwaysOn ?? section === 'always', + }; +} + +function guard(engine, kind) { + const note = (m) => { + if (!contractReport.errors.includes(m)) contractReport.errors.push(m); + }; + const call = (name, fallback, ...args) => { + const fn = engine[name]; + if (typeof fn !== 'function') return fallback; + try { + return fn.apply(engine, args); + } catch (err) { + note(`${name}(): ${err?.message || err}`); + console.warn(`[globe:${kind}] ${name} failed`, err); + return fallback; + } + }; + const asyncCall = async (name, fallback, ...args) => { + try { + const v = await call(name, fallback, ...args); + return v ?? fallback; + } catch (err) { + note(`${name}(): ${err?.message || err}`); + return fallback; + } + }; + return { + kind, + raw: engine, + isStub: kind === 'stub', + flyTo: (o) => asyncCall('flyTo', undefined, o), + home: () => call('home', undefined), + layers: () => { + const v = call('layers', []); + return Array.isArray(v) ? v.map(normLayer) : []; + }, + setLayer: (id, on) => call('setLayer', undefined, id, on), + setFamily: (f, on) => call('setFamily', undefined, f, on), + setTime: (d) => call('setTime', undefined, d), + timeWindow: () => { + const v = call('timeWindow', null); + const n = Date.now(); + if (!v || !v.start || !v.end) + return { + start: new Date(n - 72 * 3600e3), + end: new Date(n + 120 * 3600e3), + now: new Date(n), + }; + return { + start: new Date(v.start), + end: new Date(v.end), + now: new Date(v.now ?? n), + }; + }, + setLens: (id) => call('setLens', undefined, id), + focus: (s) => asyncCall('focus', undefined, s), + select: (id) => call('select', undefined, id), + on: (ev, fn) => call('on', undefined, ev, fn), + off: (ev, fn) => call('off', undefined, ev, fn), + pause: () => call('pause', undefined), + resume: () => call('resume', undefined), + contactsNear: (lon, lat, km) => { + const v = call('contactsNear', [], lon, lat, km); + return Array.isArray(v) ? v : []; + }, + situations: async () => { + const v = await asyncCall('situations', []); + return Array.isArray(v) ? v.map(normSituation) : []; + }, + credits: () => { + const v = call('credits', null); + return Array.isArray(v) ? v : null; + }, + }; +} + +/** + * @param {HTMLElement} container + * @param {{ quality?: string, preferStub?: boolean }} opts + */ +export async function mountGlobe(container, opts = {}) { + const params = new URLSearchParams(location.search); + const forceStub = opts.preferStub || params.get('engine') === 'stub'; + if (!forceStub) { + try { + // A glob (not a bare dynamic import) so a checkout without the engine + // still builds; Vite re-evaluates it when mobile/globe/index.js appears. + const loaders = import.meta.glob('../globe/index.js'); + const load = loaders['../globe/index.js']; + if (!load) throw new Error('mobile/globe/index.js not present'); + const mod = await load(); + const create = mod.createGlobe || mod.default?.createGlobe || mod.default; + if (typeof create !== 'function') + throw new Error('mobile/globe/index.js exports no createGlobe'); + const quality = + opts.quality === 'battery' ? 'low' : opts.quality || 'auto'; + const engine = await create(container, { quality }); + contractReport.engine = 'cesium'; + contractReport.missing = REQUIRED.filter( + (m) => typeof engine?.[m] !== 'function', + ); + if (typeof engine?.credits !== 'function') + contractReport.notes.push( + 'credits() not provided (optional, used for attribution sheet)', + ); + if (contractReport.missing.length) + console.warn('[globe] contract gaps', contractReport.missing); + return guard(engine, 'cesium'); + } catch (err) { + contractReport.notes.push( + `real engine unavailable: ${err?.message || err}`, + ); + console.info('[globe] using offline stub:', err?.message || err); + container.replaceChildren(); + } + } + const { createGlobe } = await import('./globeStub.js'); + const engine = await createGlobe(container, { + quality: opts.quality || 'auto', + }); + contractReport.engine = 'stub'; + return guard(engine, 'stub'); +} diff --git a/mobile/ui/globeStub.js b/mobile/ui/globeStub.js new file mode 100644 index 000000000..78d569351 --- /dev/null +++ b/mobile/ui/globeStub.js @@ -0,0 +1,1855 @@ +/** + * Offline stand-in for mobile/globe (DESIGN.md §10 Globe API contract). + * + * A WebGL2 orthographic planet: Esri World Imagery day mosaic, NASA Black + * Marble night lights blended across the real terminator, an atmosphere rim, + * and a sharper Esri export for the view when you descend. Contacts and + * situations are SIMULATED so the shell is always demoable; every card and + * pick from this engine says so. + */ + +import { esriThumb } from './dom.js'; + +const R_EARTH = 6371008.8; +const D2R = Math.PI / 180; +const R2D = 180 / Math.PI; +const FOV_HALF = Math.tan(20 * D2R); +const MIN_H = 60e3; +const MAX_H = 42000e3; +const HOME = { lon: 20, lat: 18, height: 15500e3 }; + +const SIM = 'Simulated · offline stub engine'; + +const DAY_URL = + 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export?bbox=-180,-90,180,90&bboxSR=4326&imageSR=4326&size=4096,2048&format=jpg&f=image'; +const NIGHT_URL = + 'https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&LAYERS=VIIRS_Black_Marble&STYLES=&CRS=EPSG:4326&BBOX=-90,-180,90,180&WIDTH=2048&HEIGHT=1024&FORMAT=image/jpeg'; + +/* ------------------------------------------------------------------ */ +/* Catalog (DESIGN.md §8) */ +/* ------------------------------------------------------------------ */ + +const CATALOG = { + sky: [ + 'Commercial flights', + 'Military aircraft', + 'Helicopters', + 'Private / GA', + 'Emergency squawks', + 'Drones (Remote ID)', + 'Airport boards', + 'Holding patterns', + ], + sea: [ + 'AIS vessels', + 'Ports', + 'Tankers / cargo', + 'Fishing effort', + 'Dark vessels', + 'Submarine cables', + ], + orbit: [ + 'Satellites (TLE)', + 'ISS & crewed', + 'Starlink trains', + 'Launches', + 'Debris', + 'Ground tracks', + ], + hazards: [ + 'Earthquakes', + 'Active fires', + 'Fire perimeters', + 'Floods', + 'Tropical cyclones', + 'Volcanoes', + 'Air quality', + ], + eyes: [ + 'Public CCTV', + 'Signed captures', + 'Street-level', + 'Holograms', + 'Live streams', + ], + ground: [ + 'Transit vehicles', + 'Traffic flow', + 'Bike share', + 'Rail', + 'Events & venues', + 'ALPR cameras', + ], + weather: ['Radar', 'Clouds', 'Lightning', 'Wind', 'Forecast models'], + infra: [ + 'Datacenters', + 'Dams', + 'Power plants', + 'Military installations', + 'GNSS interference', + 'Recent imagery', + ], +}; + +const slug = (s) => + s + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/(^-|-$)/g, ''); + +const DEFAULT_ON = new Set([ + 'sky.commercial-flights', + 'sky.helicopters', + 'sea.ais-vessels', + 'orbit.iss-crewed', + 'orbit.satellites-tle', + 'hazards.earthquakes', + 'hazards.active-fires', + 'hazards.tropical-cyclones', + 'hazards.floods', +]); + +/* ------------------------------------------------------------------ */ +/* Deterministic randomness */ +/* ------------------------------------------------------------------ */ + +function rng(seed) { + let s = seed >>> 0; + return () => { + s = (s + 0x6d2b79f5) >>> 0; + let t = s; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +/* ------------------------------------------------------------------ */ +/* Geometry */ +/* ------------------------------------------------------------------ */ + +function toVec(lon, lat) { + const cl = Math.cos(lat * D2R); + return [ + cl * Math.cos(lon * D2R), + cl * Math.sin(lon * D2R), + Math.sin(lat * D2R), + ]; +} +const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + +function haversine(lon1, lat1, lon2, lat2) { + const dLat = (lat2 - lat1) * D2R; + const dLon = (lon2 - lon1) * D2R; + const a = + Math.sin(dLat / 2) ** 2 + + Math.cos(lat1 * D2R) * Math.cos(lat2 * D2R) * Math.sin(dLon / 2) ** 2; + return 2 * R_EARTH * Math.asin(Math.min(1, Math.sqrt(a))); +} + +function destination(lon, lat, bearingDeg, distM) { + const d = distM / R_EARTH; + const b = bearingDeg * D2R; + const p1 = lat * D2R; + const l1 = lon * D2R; + const p2 = Math.asin( + Math.sin(p1) * Math.cos(d) + Math.cos(p1) * Math.sin(d) * Math.cos(b), + ); + const l2 = + l1 + + Math.atan2( + Math.sin(b) * Math.sin(d) * Math.cos(p1), + Math.cos(d) - Math.sin(p1) * Math.sin(p2), + ); + return [((l2 * R2D + 540) % 360) - 180, p2 * R2D]; +} + +function subsolar(date) { + const start = Date.UTC(date.getUTCFullYear(), 0, 0); + const doy = (date.getTime() - start) / 86400000; + const decl = 23.44 * Math.sin(((2 * Math.PI) / 365) * (doy - 81)); + const hours = + date.getUTCHours() + + date.getUTCMinutes() / 60 + + date.getUTCSeconds() / 3600; + const lon = -(hours - 12) * 15; + return toVec(lon, decl); +} + +/* ------------------------------------------------------------------ */ +/* Simulated world */ +/* ------------------------------------------------------------------ */ + +const HUBS = [ + [-84.43, 33.64], + [-87.9, 41.98], + [-0.45, 51.47], + [55.36, 25.25], + [139.78, 35.55], + [2.55, 49.01], + [8.57, 50.04], + [103.99, 1.36], + [-118.41, 33.94], + [-73.78, 40.64], + [-122.38, 37.62], + [77.1, 28.56], + [151.18, -33.94], + [-46.47, -23.43], + [28.75, 41.26], + [4.76, 52.31], + [126.45, 37.46], + [114.2, 22.3], + [-99.07, 19.44], + [18.6, -33.97], +]; +const PORTS = [ + [32.55, 29.9, 'Suez approach'], + [103.85, 1.22, 'Singapore Strait'], + [4.05, 51.95, 'Maasvlakte'], + [-122.5, 37.79, 'Golden Gate'], + [-5.6, 35.95, 'Gibraltar'], + [121.6, 31.2, 'Yangshan'], + [-79.7, 9.2, 'Panama'], + [56.3, 26.4, 'Hormuz'], +]; +const PREFIX = ['AEX', 'NVA', 'PLR', 'HLX', 'TRN', 'KTX', 'ORV', 'SNW']; +const SHIP = [ + 'Aster', + 'Nordlys', + 'Kestrel', + 'Meridian', + 'Halcyon', + 'Sable', + 'Tern', + 'Cobalt', + 'Brightwater', + 'Pelagia', +]; + +function buildContacts() { + const r = rng(7); + const out = []; + HUBS.forEach(([lon, lat], hi) => { + for (let i = 0; i < 34; i += 1) { + const [x, y] = destination(lon, lat, r() * 360, 20e3 + r() * 900e3); + out.push({ + kind: 'aircraft', + layer: 'sky.commercial-flights', + id: `ac-${hi}-${i}`, + title: `${PREFIX[(hi + i) % PREFIX.length]}${100 + Math.floor(r() * 8900)}`, + lon: x, + lat: y, + altM: 2500 + r() * 9800, + headingDeg: r() * 360, + speed: 170 + r() * 90, + }); + } + }); + for (let i = 0; i < 23; i += 1) { + const [x, y] = destination(-85.72, 31.36, r() * 360, 3e3 + r() * 18e3); + out.push({ + kind: 'helicopter', + layer: 'sky.helicopters', + id: `heli-${i}`, + title: `ARMY ${String(20000 + Math.floor(r() * 900))}`, + lon: x, + lat: y, + altM: 150 + r() * 300, + headingDeg: r() * 360, + speed: 45 + r() * 20, + circuit: true, + }); + } + for (let i = 0; i < 14; i += 1) { + const [x, y] = destination(3.5, 55.5, r() * 360, r() * 260e3); + out.push({ + kind: 'aircraft', + layer: 'sky.military-aircraft', + id: `mil-${i}`, + title: `RCH${300 + i}`, + lon: x, + lat: y, + altM: 6000 + r() * 4000, + headingDeg: r() * 360, + speed: 190, + }); + } + PORTS.forEach(([lon, lat], pi) => { + for (let i = 0; i < 26; i += 1) { + const [x, y] = destination(lon, lat, r() * 360, r() * 60e3); + out.push({ + kind: 'ship', + layer: 'sea.ais-vessels', + id: `ship-${pi}-${i}`, + title: `${SHIP[(pi * 3 + i) % SHIP.length]} ${['Star', 'Spirit', 'Trader', 'Bay', 'Venture', 'Dawn', 'Pioneer'][(i + pi) % 7]}${i >= 10 ? ` ${['II', 'III', 'IV'][i % 3]}` : ''}`, + lon: x, + lat: y, + altM: 0, + headingDeg: r() * 360, + speed: r() < 0.6 ? 0.3 : 6 + r() * 6, + }); + } + }); + const sats = [ + { + id: 'iss', + title: 'ISS (ZARYA)', + layer: 'orbit.iss-crewed', + inc: 51.6, + alt: 418e3, + raan: 40, + phase: 0, + }, + ]; + for (let i = 0; i < 48; i += 1) { + sats.push({ + id: `sat-${i}`, + title: i < 18 ? `STARLINK-${31000 + i * 7}` : `SAT-${40000 + i * 113}`, + layer: 'orbit.satellites-tle', + inc: i < 18 ? 53 : 45 + r() * 53, + alt: i < 18 ? 550e3 : 480e3 + r() * 800e3, + raan: i < 18 ? 120 : r() * 360, + phase: i < 18 ? i * 3.2 : r() * 360, + }); + } + sats.forEach((s) => + out.push({ + kind: 'satellite', + layer: s.layer, + id: s.id, + title: s.title, + orbit: s, + lon: 0, + lat: 0, + altM: s.alt, + headingDeg: 0, + }), + ); + const quakes = [ + [144.2, 42.1, 6.4], + [-70.9, -30.2, 5.1], + [27.8, 38.4, 4.6], + [-155.3, 19.4, 4.2], + [95.9, 2.9, 5.3], + ]; + quakes.forEach(([lon, lat, m], i) => + out.push({ + kind: 'quake', + layer: 'hazards.earthquakes', + id: `eq-${i}`, + title: `M${m.toFixed(1)}`, + lon, + lat, + altM: 0, + headingDeg: 0, + mag: m, + }), + ); + for (let i = 0; i < 40; i += 1) { + const [x, y] = destination(-120.9, 39.0, r() * 360, r() * 90e3); + out.push({ + kind: 'fire', + layer: 'hazards.active-fires', + id: `fire-${i}`, + title: 'FIRMS hotspot', + lon: x, + lat: y, + altM: 0, + headingDeg: 0, + }); + } + return out; +} + +function propagate(c, t0, t) { + if (c.kind === 'satellite') { + const o = c.orbit; + const mu = 3.986004418e14; + const a = R_EARTH + o.alt; + const n = Math.sqrt(mu / a ** 3); + const u = o.phase * D2R + n * (t / 1000); + const inc = o.inc * D2R; + const lat = Math.asin(Math.sin(inc) * Math.sin(u)); + const lonI = Math.atan2(Math.cos(inc) * Math.sin(u), Math.cos(u)); + const earth = 7.2921159e-5 * (t / 1000); + const lon = (((lonI + o.raan * D2R - earth) * R2D + 540) % 360) - 180; + c.lon = lon; + c.lat = lat * R2D; + c.headingDeg = 90 - o.inc * Math.cos(u); + return; + } + if (!c.speed) return; + const dt = (t - t0) / 1000; + if (!c.base) c.base = { lon: c.lon, lat: c.lat, h: c.headingDeg }; + if (c.circuit) { + const w = c.speed / 2500; + const h = c.base.h + ((dt * w * R2D) % 360); + const [x, y] = destination(c.base.lon, c.base.lat, h, 2500); + c.lon = x; + c.lat = y; + c.headingDeg = (h + 90) % 360; + return; + } + const [x, y] = destination(c.base.lon, c.base.lat, c.base.h, c.speed * dt); + c.lon = x; + c.lat = y; +} + +/* ------------------------------------------------------------------ */ +/* Situations */ +/* ------------------------------------------------------------------ */ + +function buildSituations(now) { + const min = 60e3; + const S = (o) => ({ + live: true, + source: SIM, + updatedAt: now - (o.age ?? 2) * min, + time: o.time ?? { start: now - 6 * 3600e3, end: now + 24 * 3600e3 }, + camera: o.camera ?? { + lon: o.lon, + lat: o.lat, + height: o.height ?? 400e3, + heading: 0, + pitch: -90, + }, + thumbnail: esriThumb(o.lon, o.lat, o.span ?? 1, 480, o.th ?? 600), + ...o, + }); + return [ + S({ + id: 'cyclone-wpac', + kind: 'cyclone', + family: 'hazards', + title: 'Typhoon tracking toward Luzon', + subtitle: 'Category 4 · eyewall replacement under way', + place: 'Philippine Sea', + lon: 126.5, + lat: 15.4, + span: 9, + th: 640, + height: 2200e3, + layers: ['hazards.tropical-cyclones', 'weather.clouds', 'weather.wind'], + metrics: [ + { label: 'Wind', value: 185, unit: 'km/h' }, + { label: 'Pressure', value: 935, unit: 'hPa' }, + { label: 'Moving', value: 'WNW 18', unit: 'km/h' }, + ], + series: [120, 130, 140, 150, 165, 175, 185, 185, 180, 185], + age: 2, + time: { start: now - 72 * 3600e3, end: now + 120 * 3600e3 }, + events: [{ at: now + 30 * 3600e3, label: 'Landfall (fcst)' }], + }), + S({ + id: 'quake-24h', + kind: 'quake', + family: 'hazards', + title: 'M6.4 · largest quake in 24 h', + subtitle: 'Shallow thrust event, aftershocks continuing', + place: 'Off Hokkaido, Japan', + lon: 144.2, + lat: 42.1, + span: 3.5, + th: 480, + height: 900e3, + layers: ['hazards.earthquakes'], + metrics: [ + { label: 'Magnitude', value: 6.4, unit: 'Mw' }, + { label: 'Depth', value: 38, unit: 'km' }, + { label: 'Aftershocks', value: 27, unit: '' }, + ], + series: [0, 0, 6.4, 4.1, 3.8, 4.4, 3.2, 3.9, 3.1, 3.3], + age: 11, + events: [{ at: now - 14 * 3600e3, label: 'M6.4' }], + }), + S({ + id: 'fires-sierra', + kind: 'fires', + family: 'hazards', + title: 'Fire cluster in the Sierra foothills', + subtitle: 'FIRMS hotspots doubling since dawn', + place: 'Nevada County, California', + lon: -120.9, + lat: 39.05, + span: 1.6, + th: 560, + height: 260e3, + layers: [ + 'hazards.active-fires', + 'hazards.fire-perimeters', + 'weather.wind', + ], + metrics: [ + { label: 'Hotspots', value: 214, unit: '' }, + { label: 'FRP', value: 1840, unit: 'MW' }, + { label: 'Wind', value: 32, unit: 'km/h' }, + ], + series: [12, 18, 30, 44, 61, 88, 120, 160, 190, 214], + age: 4, + }), + S({ + id: 'iss-pass', + kind: 'pass', + family: 'orbit', + title: 'ISS passes over you tonight', + subtitle: 'Bright pass · max elevation 71°', + place: 'Low Earth orbit', + lon: -40, + lat: 30, + span: 30, + th: 520, + height: 9000e3, + layers: ['orbit.iss-crewed', 'orbit.ground-tracks'], + metrics: [ + { label: 'Altitude', value: 418, unit: 'km' }, + { label: 'Speed', value: 27600, unit: 'km/h' }, + { label: 'Next pass', value: '21:42', unit: '' }, + ], + age: 1, + alwaysOn: true, + }), + S({ + id: 'atl-rush', + kind: 'airport', + family: 'sky', + title: 'Busiest airport right now', + subtitle: 'Hartsfield–Jackson arrival bank', + place: 'Atlanta, Georgia', + lon: -84.428, + lat: 33.6407, + span: 0.09, + th: 600, + height: 18e3, + layers: [ + 'sky.commercial-flights', + 'sky.holding-patterns', + 'sky.airport-boards', + ], + metrics: [ + { label: 'Movements', value: 182, unit: '/h' }, + { label: 'Holding', value: 6, unit: '' }, + { label: 'Delay', value: 14, unit: 'min' }, + ], + series: [120, 140, 166, 170, 182, 176, 181, 182], + age: 1, + alwaysOn: true, + }), + S({ + id: 'novosel', + kind: 'heliport', + family: 'sky', + title: 'Helicopter school circuits', + subtitle: 'Rotor training pattern over Wiregrass', + place: 'Fort Novosel, Alabama', + lon: -85.72, + lat: 31.36, + span: 0.22, + th: 420, + height: 40e3, + layers: ['sky.helicopters'], + metrics: [ + { label: 'Airborne', value: 23, unit: 'rotorcraft' }, + { label: 'Pattern alt', value: 700, unit: 'ft' }, + ], + series: [4, 9, 14, 18, 23, 21, 23], + age: 3, + alwaysOn: true, + }), + S({ + id: 'bhote-koshi-2026', + kind: 'reconstruction', + family: 'hazards', + title: 'Bhote Koshi outburst flood', + subtitle: '16 sourced observations · 3 open hypotheses', + place: 'Rasuwa, Nepal ↔ Gyirong, Tibet', + lon: 85.33, + lat: 28.15, + span: 0.3, + th: 640, + height: 30e3, + camera: { + lon: 85.3548, + lat: 28.207, + height: 14e3, + heading: 344, + pitch: -39, + }, + layers: [ + 'hazards.floods', + 'infra.recent-imagery', + 'eyes.signed-captures', + ], + metrics: [ + { label: 'Observations', value: 16, unit: '' }, + { label: 'Corridor', value: 145, unit: 'pts' }, + { label: 'Hypotheses', value: 3, unit: '' }, + ], + live: false, + age: 60 * 24 * 7, + source: 'GeoPera reconstruction · Vantor Open Data (CC BY-NC 4.0)', + time: { start: Date.UTC(2026, 7, 26, 0), end: Date.UTC(2026, 7, 27, 12) }, + thread: 'bhote-koshi-2026', + thumbnail: '/events/bhote-koshi-2026/post.webp', + }), + S({ + id: 'starbase', + kind: 'launch', + family: 'orbit', + title: 'Launch countdown · Starbase', + subtitle: 'Window opens 06:00 local · trajectory east', + place: 'Boca Chica, Texas', + lon: -97.157, + lat: 25.997, + span: 0.06, + th: 380, + height: 12e3, + layers: ['orbit.launches', 'orbit.ground-tracks'], + metrics: [ + { label: 'T−', value: '06:12:00', unit: '' }, + { label: 'Weather go', value: 80, unit: '%' }, + ], + age: 6, + events: [{ at: now + 6.2 * 3600e3, label: 'T-0' }], + }), + S({ + id: 'suez-queue', + kind: 'queue', + family: 'sea', + title: 'Ships queuing at Suez', + subtitle: 'Southbound convoy holding in the anchorage', + place: 'Gulf of Suez, Egypt', + lon: 32.55, + lat: 29.88, + span: 0.35, + th: 560, + height: 60e3, + layers: ['sea.ais-vessels', 'sea.tankers-cargo'], + metrics: [ + { label: 'Waiting', value: 41, unit: 'vessels' }, + { label: 'Median wait', value: 19, unit: 'h' }, + ], + series: [28, 30, 33, 35, 39, 41], + age: 5, + }), + S({ + id: 'gnss-baltic', + kind: 'gnss', + family: 'infra', + title: 'GNSS interference over the Baltic', + subtitle: 'Aircraft reporting degraded NIC', + place: 'Baltic Sea', + lon: 21.0, + lat: 56.5, + span: 6, + th: 480, + height: 1500e3, + layers: ['infra.gnss-interference', 'sky.commercial-flights'], + metrics: [ + { label: 'Affected', value: 312, unit: 'aircraft' }, + { label: 'Area', value: 84, unit: 'k km²' }, + ], + series: [120, 180, 240, 260, 300, 312], + age: 9, + }), + S({ + id: 'singapore', + kind: 'strait', + family: 'sea', + title: 'Singapore Strait traffic', + subtitle: 'Eastbound lane at capacity', + place: 'Singapore Strait', + lon: 103.85, + lat: 1.22, + span: 0.4, + th: 420, + height: 70e3, + layers: ['sea.ais-vessels'], + metrics: [ + { label: 'Transits', value: 22, unit: '/h' }, + { label: 'At anchor', value: 318, unit: '' }, + ], + age: 3, + alwaysOn: true, + }), + S({ + id: 'tokyo-rush', + kind: 'transit', + family: 'ground', + title: 'Rush hour · Tokyo rail', + subtitle: 'Yamanote line headways at 2 min 30 s', + place: 'Shinjuku, Tokyo', + lon: 139.7, + lat: 35.69, + span: 0.05, + th: 600, + height: 9e3, + layers: ['ground.transit-vehicles', 'ground.rail'], + metrics: [ + { label: 'Trains moving', value: 1840, unit: '' }, + { label: 'On time', value: 98.6, unit: '%' }, + ], + age: 2, + alwaysOn: true, + }), + S({ + id: 'rotterdam', + kind: 'port', + family: 'sea', + title: 'Port of Rotterdam', + subtitle: 'Europe’s busiest port, always on', + place: 'Maasvlakte, Netherlands', + lon: 4.03, + lat: 51.96, + span: 0.12, + th: 380, + height: 30e3, + layers: ['sea.ais-vessels', 'sea.ports'], + metrics: [ + { label: 'Berthed', value: 96, unit: '' }, + { label: 'Arriving 6 h', value: 34, unit: '' }, + ], + age: 4, + alwaysOn: true, + }), + S({ + id: 'north-sea-mil', + kind: 'military', + family: 'sky', + title: 'Military air activity · North Sea', + subtitle: 'Tanker tracks and fighter CAPs', + place: 'North Sea', + lon: 3.5, + lat: 55.5, + span: 5, + th: 520, + height: 900e3, + layers: ['sky.military-aircraft'], + metrics: [ + { label: 'Aircraft', value: 14, unit: '' }, + { label: 'Tankers', value: 3, unit: '' }, + ], + age: 7, + }), + S({ + id: 'aurora', + kind: 'aurora', + family: 'weather', + title: 'Aurora nowcast · Tromsø', + subtitle: 'Kp 6 storm, clear skies after 22:00', + place: 'Tromsø, Norway', + lon: 18.95, + lat: 69.65, + span: 0.5, + th: 600, + height: 300e3, + layers: ['weather.clouds'], + metrics: [ + { label: 'Kp', value: 6, unit: '' }, + { label: 'Cloud', value: 20, unit: '%' }, + ], + series: [2, 3, 3, 4, 5, 6, 6], + age: 15, + }), + S({ + id: 'sfo-arrivals', + kind: 'airport', + family: 'sky', + title: 'SFO arrivals on 28L/R', + subtitle: 'Paired approaches over the bay', + place: 'San Francisco, California', + lon: -122.379, + lat: 37.6213, + span: 0.12, + th: 480, + height: 25e3, + layers: ['sky.commercial-flights', 'sky.airport-boards'], + metrics: [ + { label: 'Arrivals', value: 44, unit: '/h' }, + { label: 'Delay', value: 9, unit: 'min' }, + ], + age: 2, + }), + S({ + id: 'etna', + kind: 'volcano', + family: 'eyes', + title: 'Etna webcam vs ash advisory', + subtitle: 'Strombolian activity at the SE crater', + place: 'Sicily, Italy', + lon: 14.995, + lat: 37.751, + span: 0.2, + th: 420, + height: 30e3, + layers: ['hazards.volcanoes', 'eyes.public-cctv'], + metrics: [ + { label: 'Cameras', value: 4, unit: 'live' }, + { label: 'Ash FL', value: 120, unit: '' }, + ], + age: 13, + }), + S({ + id: 'dxb', + kind: 'airport', + family: 'sky', + title: 'Dubai International night bank', + subtitle: 'Long-haul departures to Europe', + place: 'Dubai, UAE', + lon: 55.3657, + lat: 25.2532, + span: 0.1, + th: 560, + height: 25e3, + layers: ['sky.commercial-flights'], + metrics: [{ label: 'Departures', value: 61, unit: '/h' }], + age: 1, + alwaysOn: true, + }), + ]; +} + +/* ------------------------------------------------------------------ */ +/* WebGL planet */ +/* ------------------------------------------------------------------ */ + +const VS = `#version 300 es +in vec2 p; void main(){ gl_Position = vec4(p,0.,1.); }`; + +const FS = `#version 300 es +precision highp float; +uniform vec2 u_c; uniform float u_R; uniform vec2 u_res; +uniform vec3 u_right, u_up, u_fwd, u_sun; +uniform sampler2D u_day, u_night, u_det; +uniform vec4 u_box; uniform float u_detOn, u_tex, u_lens, u_nightTex, u_close; +out vec4 o; +const float PI = 3.14159265; +float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); } +vec4 sampleEq(sampler2D t, vec2 uv){ + vec2 uv2 = vec2(fract(uv.x+0.5), uv.y); + vec2 dx1 = dFdx(uv), dy1 = dFdy(uv), dx2 = dFdx(uv2), dy2 = dFdy(uv2); + vec2 dx = abs(dx1.x) < abs(dx2.x) ? dx1 : dx2; + vec2 dy = abs(dy1.x) < abs(dy2.x) ? dy1 : dy2; + return textureGrad(t, uv, dx, dy); +} +void main(){ + vec2 f = gl_FragCoord.xy; + vec2 p = (f - u_c) / u_R; + float r2 = dot(p,p); + vec3 col; + if (r2 > 1.0) { + float r = sqrt(r2); + float k = (r - 1.0) * u_R / (u_R * 0.045 + 5.0); + float halo = exp(-k * 1.6); + vec3 dirW = normalize(p.x*u_right + p.y*u_up); + float sunSide = 0.25 + 0.75*smoothstep(-0.5, 0.7, dot(dirW, u_sun)); + vec3 atm = mix(vec3(0.18,0.36,0.85), vec3(0.55,0.78,1.0), halo) * halo * sunSide; + vec2 g = floor(f / 1.5); + float st = step(0.9975, hash(g)) * (0.4 + 0.6*hash(g+7.7)); + vec2 q = f / u_res; + vec3 neb = vec3(0.02,0.03,0.06) * (0.6 + 0.4*sin(q.x*3.0+q.y*2.0)); + col = vec3(0.008,0.012,0.022) + neb + atm*0.95 + vec3(st)*(1.0-halo)*0.85; + } else { + float z = sqrt(1.0 - r2); + vec3 n = normalize(p.x*u_right + p.y*u_up + z*u_fwd); + float lat = asin(clamp(n.z,-1.,1.)); + float lon = atan(n.y, n.x); + vec2 uv = vec2((lon + PI) / (2.0*PI), (PI*0.5 - lat) / PI); + vec3 day; + if (u_tex > 0.5) { + day = sampleEq(u_day, uv).rgb; + float polar = smoothstep(84.0, 85.0, abs(lat*180.0/PI)); + vec3 pole = lat > 0.0 ? vec3(0.78,0.84,0.9) : vec3(0.9,0.93,0.96); + day = mix(day, pole, polar); + } else { + day = mix(vec3(0.03,0.10,0.22), vec3(0.08,0.22,0.38), 0.5 + 0.5*sin(lat*3.0)); + } + if (u_detOn > 0.001) { + float lonD = lon*180.0/PI, latD = lat*180.0/PI; + vec2 duv = vec2((lonD - u_box.x)/(u_box.z - u_box.x), (u_box.w - latD)/(u_box.w - u_box.y)); + if (duv.x > 0.0 && duv.x < 1.0 && duv.y > 0.0 && duv.y < 1.0) { + vec2 e = min(duv, 1.0-duv); + float edge = smoothstep(0.0, 0.06, min(e.x, e.y)); + day = mix(day, texture(u_det, duv).rgb, edge * u_detOn); + } + } + vec3 nightL = u_nightTex > 0.5 ? sampleEq(u_night, uv).rgb : vec3(0.0); + float mu = dot(n, u_sun); + float dayK = smoothstep(-0.10, 0.16, mu); + if (u_lens > 1.5 && u_lens < 2.5) dayK *= 0.0; + vec3 lit = day * (0.18 + 1.05*clamp(mu*1.4+0.2, 0.0, 1.0)); + vec3 nightC = pow(nightL, vec3(1.9)) * vec3(1.65,1.25,0.78) * 2.2 * (1.0 - u_close) + day * mix(0.035, 0.3, u_close); + col = mix(nightC, lit, dayK); + col += vec3(1.0,0.42,0.14) * 0.16 * exp(-pow(mu/0.07, 2.0)) * (1.0 - u_lens*0.0); + float rim = pow(1.0 - z, 2.6); + col = mix(col, vec3(0.42,0.68,1.0) * (0.25 + 0.9*dayK), rim * 0.62); + } + // Lens grade: 0 cinematic, 1 clear, 2 night, 3 thermal, 4 nvg + vec2 q = f / u_res; + if (u_lens < 0.5) { + col = pow(col, vec3(0.95)) * vec3(1.02,1.0,1.04); + float v = smoothstep(1.25, 0.35, length(q - 0.5) * 1.35); + col *= mix(0.62, 1.0, v); + } else if (u_lens > 2.5 && u_lens < 3.5) { + float l = dot(col, vec3(0.299,0.587,0.114)); + col = clamp(vec3(l*2.6-0.2, l*1.6-0.25, sin(l*6.28)*0.5+0.1 - l*0.4), 0.0, 1.0); + } else if (u_lens > 3.5) { + float l = dot(col, vec3(0.299,0.587,0.114)); + float gr = hash(f + fract(u_res.x*0.37)) * 0.08; + col = vec3(0.12, 1.0, 0.38) * (pow(l, 0.7)*1.4 + gr); + float v = smoothstep(0.75, 0.3, length(q - 0.5)); + col *= v; + } else if (u_lens > 1.5) { + col *= vec3(0.9, 0.95, 1.1); + } + col = col / (1.0 + col * 0.12); + o = vec4(col, 1.0); +}`; + +function loadImage(url) { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'anonymous'; + img.decoding = 'async'; + img.onload = () => resolve(img); + img.onerror = reject; + img.src = url; + }); +} + +/* ------------------------------------------------------------------ */ +/* createGlobe */ +/* ------------------------------------------------------------------ */ + +export async function createGlobe(container, options = {}) { + const listeners = new Map(); + const emit = (ev, data) => listeners.get(ev)?.forEach((fn) => fn(data)); + + const root = document.createElement('div'); + root.className = 'stub-globe'; + root.style.cssText = + 'position:absolute;inset:0;overflow:hidden;touch-action:none;background:#05070b'; + const canvas = document.createElement('canvas'); + const overlay = document.createElement('canvas'); + for (const c of [canvas, overlay]) + c.style.cssText = + 'position:absolute;inset:0;width:100%;height:100%;display:block'; + overlay.style.pointerEvents = 'none'; + root.append(canvas, overlay); + container.appendChild(root); + + const gl = canvas.getContext('webgl2', { + antialias: false, + alpha: false, + powerPreference: 'high-performance', + preserveDrawingBuffer: false, + }); + const ctx = overlay.getContext('2d'); + + const quality = options.quality || 'auto'; + let dpr = Math.min( + window.devicePixelRatio || 1, + quality === 'battery' ? 1.25 : 2, + ); + + const cam = { ...HOME, heading: 0 }; + let W = 1; + let H = 1; + let paused = false; + let dirty = true; + let lens = 0; + let timeOverride = null; + let selected = null; + let flight = null; + const t0 = Date.now(); + const contacts = buildContacts(); + const layers = []; + for (const [fam, names] of Object.entries(CATALOG)) + for (const name of names) { + const id = `${fam}.${slug(name)}`; + layers.push({ + id, + family: fam, + name, + on: DEFAULT_ON.has(id), + count: 0, + status: DEFAULT_ON.has(id) ? 'live' : 'off', + }); + } + const layerById = new Map(layers.map((l) => [l.id, l])); + const counts = {}; + for (const c of contacts) counts[c.layer] = (counts[c.layer] || 0) + 1; + const r = rng(99); + for (const l of layers) { + l.count = counts[l.id] ?? Math.floor(5 + r() * 900); + if (r() < 0.06 && !l.on) l.status = 'off'; + } + layerById.get('ground.alpr-cameras').status = 'off'; + let situations = null; + + /* ---------- GL ---------- */ + let prog = null; + let U = {}; + const tex = { day: null, night: null, det: null }; + let texOn = 0; + let nightOn = 0; + const det = { on: 0, target: 0, box: [0, 0, 0, 0], key: '', pending: null }; + + function makeTex(unit, img) { + const t = gl.createTexture(); + gl.activeTexture(gl.TEXTURE0 + unit); + gl.bindTexture(gl.TEXTURE_2D, t); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri( + gl.TEXTURE_2D, + gl.TEXTURE_MIN_FILTER, + gl.LINEAR_MIPMAP_LINEAR, + ); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + if (img) { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img); + gl.generateMipmap(gl.TEXTURE_2D); + } else { + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGB, + 1, + 1, + 0, + gl.RGB, + gl.UNSIGNED_BYTE, + new Uint8Array([10, 30, 60]), + ); + } + const ext = gl.getExtension('EXT_texture_filter_anisotropic'); + if (ext) gl.texParameterf(gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, 8); + return t; + } + + if (gl) { + const sh = (type, src) => { + const s = gl.createShader(type); + gl.shaderSource(s, src); + gl.compileShader(s); + if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) + throw new Error(gl.getShaderInfoLog(s)); + return s; + }; + prog = gl.createProgram(); + gl.attachShader(prog, sh(gl.VERTEX_SHADER, VS)); + gl.attachShader(prog, sh(gl.FRAGMENT_SHADER, FS)); + gl.linkProgram(prog); + gl.useProgram(prog); + const buf = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buf); + gl.bufferData( + gl.ARRAY_BUFFER, + new Float32Array([-1, -1, 3, -1, -1, 3]), + gl.STATIC_DRAW, + ); + const loc = gl.getAttribLocation(prog, 'p'); + gl.enableVertexAttribArray(loc); + gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0); + for (const n of [ + 'u_c', + 'u_R', + 'u_res', + 'u_right', + 'u_up', + 'u_fwd', + 'u_sun', + 'u_day', + 'u_night', + 'u_det', + 'u_box', + 'u_detOn', + 'u_tex', + 'u_lens', + 'u_nightTex', + 'u_close', + ]) + U[n] = gl.getUniformLocation(prog, n); + tex.day = makeTex(0); + tex.night = makeTex(1); + tex.det = makeTex(2); + gl.uniform1i(U.u_day, 0); + gl.uniform1i(U.u_night, 1); + gl.uniform1i(U.u_det, 2); + loadImage(DAY_URL) + .then((img) => { + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, tex.day); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img); + gl.generateMipmap(gl.TEXTURE_2D); + texOn = 1; + dirty = true; + emit('ready', { imagery: 'esri' }); + }) + .catch(() => + emit('quality', { scale: dpr, fps: 0, note: 'imagery offline' }), + ); + loadImage(NIGHT_URL) + .then((img) => { + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(gl.TEXTURE_2D, tex.night); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img); + gl.generateMipmap(gl.TEXTURE_2D); + nightOn = 1; + dirty = true; + }) + .catch(() => {}); + } else { + root.style.background = + 'radial-gradient(circle at 42% 38%, #3d7fbf 0, #123a66 30%, #071526 46%, #05070b 47%)'; + } + + function resize() { + const rect = root.getBoundingClientRect(); + W = Math.max(1, rect.width); + H = Math.max(1, rect.height); + for (const c of [canvas, overlay]) { + c.width = Math.round(W * dpr); + c.height = Math.round(H * dpr); + } + dirty = true; + } + const ro = new ResizeObserver(resize); + ro.observe(root); + resize(); + + /* ---------- camera math ---------- */ + const radiusPx = (height = cam.height) => { + const d = R_EARTH + height; + const tanT = R_EARTH / Math.sqrt(d * d - R_EARTH * R_EARTH); + return (tanT / FOV_HALF) * (Math.min(W, H) / 2) * 1.05; + }; + function basis() { + const lo = cam.lon * D2R; + const la = cam.lat * D2R; + const fwd = toVec(cam.lon, cam.lat); + const e = [-Math.sin(lo), Math.cos(lo), 0]; + const nn = [ + -Math.sin(la) * Math.cos(lo), + -Math.sin(la) * Math.sin(lo), + Math.cos(la), + ]; + const h = (cam.heading || 0) * D2R; + const ch = Math.cos(h); + const s = Math.sin(h); + const up = [ + nn[0] * ch + e[0] * s, + nn[1] * ch + e[1] * s, + nn[2] * ch + e[2] * s, + ]; + const right = [ + e[0] * ch - nn[0] * s, + e[1] * ch - nn[1] * s, + e[2] * ch - nn[2] * s, + ]; + return { fwd, up, right }; + } + let B = basis(); + const centerY = () => H * (options.centerBias ?? 0.5); + function project(lon, lat, altM = 0) { + const v = toVec(lon, lat); + const z = dot(v, B.fwd); + const k = 1 + altM / R_EARTH; + if (z < (altM > 0 ? -0.15 : 0.02)) return null; + const R = radiusPx(); + return { + x: W / 2 + R * k * dot(v, B.right), + y: centerY() - R * k * dot(v, B.up), + z, + }; + } + function unproject(x, y) { + const R = radiusPx(); + const px = (x - W / 2) / R; + const py = (centerY() - y) / R; + const r2 = px * px + py * py; + if (r2 > 1) return null; + const z = Math.sqrt(1 - r2); + const n = [0, 1, 2].map( + (i) => px * B.right[i] + py * B.up[i] + z * B.fwd[i], + ); + return { lon: Math.atan2(n[1], n[0]) * R2D, lat: Math.asin(n[2]) * R2D }; + } + + const now = () => (timeOverride ? timeOverride.getTime() : Date.now()); + + /* ---------- detail imagery ---------- */ + function updateDetail() { + if (!gl || cam.height > 3200e3) { + det.target = 0; + return; + } + const R = radiusPx(); + const halfW = Math.min(80, (W / 2 / R) * R2D * 1.25); + const halfH = Math.min(60, (H / 2 / R) * R2D * 1.25); + const clat = Math.cos(cam.lat * D2R); + const box = [ + cam.lon - halfW / Math.max(0.15, clat), + Math.max(-85, cam.lat - halfH), + cam.lon + halfW / Math.max(0.15, clat), + Math.min(85, cam.lat + halfH), + ]; + const key = box.map((v) => v.toFixed(2)).join(','); + if ( + det.on > 0.5 && + det.box[0] <= box[0] && + det.box[2] >= box[2] && + det.box[1] <= box[1] && + det.box[3] >= box[3] && + det.box[2] - det.box[0] < (box[2] - box[0]) * 3 + ) + return; + if (key === det.key) return; + det.key = key; + clearTimeout(det.pending); + det.pending = setTimeout(() => { + const pad = 0.15; + const bw = box[2] - box[0]; + const bh = box[3] - box[1]; + const b = [ + box[0] - bw * pad, + Math.max(-85, box[1] - bh * pad), + box[2] + bw * pad, + Math.min(85, box[3] + bh * pad), + ]; + const url = `https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export?bbox=${b.map((v) => v.toFixed(5)).join(',')}&bboxSR=4326&imageSR=4326&size=1536,1536&format=jpg&f=image`; + loadImage(url) + .then((img) => { + if (det.key !== key) return; + gl.activeTexture(gl.TEXTURE2); + gl.bindTexture(gl.TEXTURE_2D, tex.det); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGB, + gl.RGB, + gl.UNSIGNED_BYTE, + img, + ); + gl.generateMipmap(gl.TEXTURE_2D); + det.box = b; + det.on = 0; + det.target = 1; + dirty = true; + }) + .catch(() => {}); + }, 380); + } + + /* ---------- render loop ---------- */ + let raf = 0; + let lastOverlay = 0; + let frames = 0; + let fpsT = performance.now(); + function frame(ts) { + raf = 0; + if (paused) return; + if (flight) stepFlight(ts); + if (inertia) stepInertia(); + if (det.on !== det.target) { + det.on += (det.target - det.on) * 0.12; + if (Math.abs(det.on - det.target) < 0.01) det.on = det.target; + dirty = true; + } + if (dirty && gl) { + B = basis(); + gl.viewport(0, 0, canvas.width, canvas.height); + const R = radiusPx() * dpr; + gl.uniform2f(U.u_c, (W / 2) * dpr, (H - centerY()) * dpr); + gl.uniform1f(U.u_R, R); + gl.uniform2f(U.u_res, canvas.width, canvas.height); + gl.uniform3fv(U.u_right, B.right); + gl.uniform3fv(U.u_up, B.up); + gl.uniform3fv(U.u_fwd, B.fwd); + gl.uniform3fv(U.u_sun, subsolar(new Date(now()))); + gl.uniform4fv(U.u_box, det.box); + gl.uniform1f(U.u_detOn, det.on); + gl.uniform1f(U.u_tex, texOn); + gl.uniform1f(U.u_nightTex, nightOn); + gl.uniform1f(U.u_lens, lens); + // Close in, the 2 km/px night mosaic is mush: fade it for moonlit imagery. + gl.uniform1f( + U.u_close, + Math.max(0, Math.min(1, (900e3 - cam.height) / 700e3)), + ); + gl.drawArrays(gl.TRIANGLES, 0, 3); + dirty = false; + } else if (dirty) { + B = basis(); + dirty = false; + } + if (ts - lastOverlay > 33) { + lastOverlay = ts; + drawOverlay(ts); + } + frames += 1; + if (ts - fpsT > 2000) { + emit('quality', { + scale: dpr, + fps: Math.round((frames * 1000) / (ts - fpsT)), + }); + frames = 0; + fpsT = ts; + } + raf = requestAnimationFrame(frame); + } + const kick = () => { + if (!raf && !paused) raf = requestAnimationFrame(frame); + }; + + const KIND_COLOR = { + aircraft: '#7CC4FF', + helicopter: '#7CC4FF', + ship: '#38E1C6', + satellite: '#C9A7FF', + quake: '#FF6A3D', + fire: '#FF6A3D', + }; + let drawn = []; + function drawOverlay(ts) { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + ctx.clearRect(0, 0, W, H); + drawn = []; + const t = now(); + const planetary = cam.height > 2500e3; + for (const c of contacts) { + const layer = layerById.get(c.layer); + if (!layer?.on) continue; + propagate(c, t0, t); + const p = project(c.lon, c.lat, c.kind === 'satellite' ? c.altM : 0); + if (!p || p.x < -20 || p.y < -20 || p.x > W + 20 || p.y > H + 20) + continue; + const col = KIND_COLOR[c.kind] || '#fff'; + const isSel = selected === c.id; + ctx.globalAlpha = planetary ? 0.75 : 1; + if (c.kind === 'aircraft' || c.kind === 'helicopter') { + if (planetary) { + ctx.fillStyle = col; + ctx.fillRect(p.x - 0.8, p.y - 0.8, 1.6, 1.6); + } else { + ctx.save(); + ctx.translate(p.x, p.y); + ctx.rotate(((c.headingDeg - (cam.heading || 0)) * Math.PI) / 180); + ctx.fillStyle = col; + ctx.beginPath(); + ctx.moveTo(0, -6); + ctx.lineTo(4.2, 5); + ctx.lineTo(0, 2.6); + ctx.lineTo(-4.2, 5); + ctx.closePath(); + ctx.fill(); + ctx.restore(); + } + } else if (c.kind === 'satellite') { + ctx.fillStyle = c.id === 'iss' ? '#fff' : col; + const s = c.id === 'iss' ? 3.2 : 1.8; + ctx.fillRect(p.x - s / 2, p.y - s / 2, s, s); + if (c.id === 'iss') { + ctx.strokeStyle = col; + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.arc(p.x, p.y, 6 + Math.sin(ts / 300) * 1.2, 0, Math.PI * 2); + ctx.stroke(); + } + } else if (c.kind === 'quake') { + const rr = 3 + (c.mag - 4) * 3.5; + ctx.strokeStyle = col; + ctx.lineWidth = 1.5; + ctx.beginPath(); + ctx.arc(p.x, p.y, rr + ((ts / 40) % 14), 0, Math.PI * 2); + ctx.globalAlpha = 1 - ((ts / 40) % 14) / 14; + ctx.stroke(); + ctx.globalAlpha = 1; + ctx.fillStyle = col; + ctx.beginPath(); + ctx.arc(p.x, p.y, rr * 0.45, 0, Math.PI * 2); + ctx.fill(); + } else if (c.kind === 'fire') { + ctx.fillStyle = 'rgba(255,106,61,0.85)'; + ctx.beginPath(); + ctx.arc(p.x, p.y, planetary ? 1.4 : 2.6, 0, Math.PI * 2); + ctx.fill(); + } else { + ctx.fillStyle = col; + ctx.beginPath(); + ctx.arc(p.x, p.y, planetary ? 1 : 2.4, 0, Math.PI * 2); + ctx.fill(); + } + ctx.globalAlpha = 1; + if (isSel) { + ctx.strokeStyle = '#fff'; + ctx.lineWidth = 1.5; + ctx.beginPath(); + ctx.arc(p.x, p.y, 13, 0, Math.PI * 2); + ctx.stroke(); + if (c.speed) { + ctx.strokeStyle = col; + ctx.setLineDash([2, 3]); + ctx.beginPath(); + for (let i = 0; i <= 20; i += 1) { + const [x, y] = destination( + c.lon, + c.lat, + c.headingDeg + 180, + c.speed * i * 30, + ); + const q = project(x, y); + if (!q) break; + if (i) ctx.lineTo(q.x, q.y); + else ctx.moveTo(q.x, q.y); + } + ctx.stroke(); + ctx.setLineDash([]); + } + } + drawn.push({ c, x: p.x, y: p.y }); + } + if (situations && options.showSituations !== false) { + for (const s of situations) { + const p = project(s.lon, s.lat); + if (!p) continue; + const col = { + sky: '#7CC4FF', + sea: '#38E1C6', + orbit: '#C9A7FF', + hazards: '#FF6A3D', + eyes: '#FFD166', + ground: '#9BE15D', + weather: '#8AB4F8', + infra: '#B8C0CC', + }[s.family]; + const ph = (((ts / 1600 + s.lon) % 1) + 1) % 1; + ctx.strokeStyle = col; + ctx.globalAlpha = 1 - ph; + ctx.lineWidth = 1.5; + ctx.beginPath(); + ctx.arc(p.x, p.y, 5 + ph * 16, 0, Math.PI * 2); + ctx.stroke(); + ctx.globalAlpha = 1; + ctx.fillStyle = col; + ctx.beginPath(); + ctx.arc(p.x, p.y, 4, 0, Math.PI * 2); + ctx.fill(); + ctx.strokeStyle = 'rgba(5,7,11,0.8)'; + ctx.lineWidth = 1.5; + ctx.stroke(); + drawn.push({ s, x: p.x, y: p.y }); + } + } + } + + /* ---------- flights ---------- */ + function stepFlight(ts) { + const f = flight; + if (!f.start) f.start = ts; + const k = Math.min(1, (ts - f.start) / f.dur); + const e = k < 0.5 ? 4 * k * k * k : 1 - (-2 * k + 2) ** 3 / 2; + let dLon = f.to.lon - f.from.lon; + if (dLon > 180) dLon -= 360; + if (dLon < -180) dLon += 360; + cam.lon = ((f.from.lon + dLon * e + 540) % 360) - 180; + cam.lat = f.from.lat + (f.to.lat - f.from.lat) * e; + const lh0 = Math.log(f.from.height); + const lh1 = Math.log(f.to.height); + const hop = Math.log(Math.max(f.from.height, f.to.height, f.peak)); + const lin = lh0 + (lh1 - lh0) * e; + const arc = Math.sin(Math.PI * e) * Math.max(0, hop - Math.max(lh0, lh1)); + cam.height = Math.exp(lin + arc); + cam.heading = f.from.heading + (f.to.heading - f.from.heading) * e; + dirty = true; + emitCamera(); + if (k >= 1) { + flight = null; + updateDetail(); + f.resolve(); + } + } + + function flyTo({ lon, lat, height, duration } = {}) { + if (flight) flight.resolve(); + inertia = null; + const to = { + lon: lon ?? cam.lon, + lat: Math.max(-85, Math.min(85, lat ?? cam.lat)), + height: Math.max(MIN_H, Math.min(MAX_H, height ?? cam.height)), + // The stub renders top-down; heading is honoured by the real engine. + heading: 0, + }; + const dist = haversine(cam.lon, cam.lat, to.lon, to.lat); + const dur = (duration ?? Math.min(3.2, 1.2 + dist / 6e6)) * 1000; + return new Promise((resolve) => { + if (dur <= 16) { + Object.assign(cam, to); + dirty = true; + emitCamera(); + updateDetail(); + kick(); + resolve(); + return; + } + flight = { + from: { ...cam }, + to, + dur, + peak: Math.min(MAX_H, dist * 1.4), + start: 0, + resolve, + }; + det.target = cam.height > 3200e3 ? 0 : det.target; + kick(); + }); + } + + let camTimer = 0; + function emitCamera() { + if (camTimer) return; + camTimer = setTimeout(() => { + camTimer = 0; + emit('camera', { lon: cam.lon, lat: cam.lat, height: cam.height }); + }, 80); + } + + /* ---------- input ---------- */ + const pointers = new Map(); + let inertia = null; + let lastMove = null; + let pinch0 = null; + let downAt = null; + function onDown(e) { + root.setPointerCapture?.(e.pointerId); + pointers.set(e.pointerId, { x: e.clientX, y: e.clientY }); + flight = null; + inertia = null; + downAt = { x: e.clientX, y: e.clientY, t: performance.now(), moved: false }; + if (pointers.size === 2) { + const [a, b] = [...pointers.values()]; + pinch0 = { d: Math.hypot(a.x - b.x, a.y - b.y), h: cam.height }; + } + emit('interact', { type: 'start' }); + } + function onMove(e) { + const prev = pointers.get(e.pointerId); + if (!prev) return; + const cur = { x: e.clientX, y: e.clientY }; + pointers.set(e.pointerId, cur); + if (downAt && Math.hypot(cur.x - downAt.x, cur.y - downAt.y) > 6) + downAt.moved = true; + if (pointers.size === 2 && pinch0) { + const [a, b] = [...pointers.values()]; + const d = Math.hypot(a.x - b.x, a.y - b.y); + cam.height = Math.max( + MIN_H, + Math.min(MAX_H, (pinch0.h * pinch0.d) / Math.max(10, d)), + ); + dirty = true; + emitCamera(); + kick(); + return; + } + const dx = cur.x - prev.x; + const dy = cur.y - prev.y; + pan(dx, dy); + const t = performance.now(); + lastMove = { dx, dy, t }; + } + function pan(dx, dy) { + const R = radiusPx(); + const clat = Math.max(0.1, Math.cos(cam.lat * D2R)); + cam.lon = ((cam.lon - ((dx / R) * R2D) / clat + 540) % 360) - 180; + cam.lat = Math.max(-85, Math.min(85, cam.lat + (dy / R) * R2D)); + dirty = true; + emitCamera(); + kick(); + } + function onUp(e) { + pointers.delete(e.pointerId); + if (pointers.size < 2) pinch0 = null; + if (pointers.size) return; + if (downAt && !downAt.moved && performance.now() - downAt.t < 400) { + const rect = root.getBoundingClientRect(); + tapAt(e.clientX - rect.left, e.clientY - rect.top); + } else if (lastMove && performance.now() - lastMove.t < 60) { + inertia = { vx: lastMove.dx, vy: lastMove.dy }; + kick(); + } + updateDetail(); + emit('interact', { type: 'end' }); + downAt = null; + } + function stepInertia() { + inertia.vx *= 0.92; + inertia.vy *= 0.92; + pan(inertia.vx, inertia.vy); + if (Math.hypot(inertia.vx, inertia.vy) < 0.15) { + inertia = null; + updateDetail(); + } + } + function tapAt(x, y) { + let best = null; + let bd = 24; + for (const d of drawn) { + const dd = Math.hypot(d.x - x, d.y - y); + if (dd < bd) { + bd = dd; + best = d; + } + } + if (!best) { + select(null); + emit('pick', null); + return; + } + if (best.s) { + const s = best.s; + emit('pick', { + kind: 'situation', + id: s.id, + title: s.title, + subtitle: s.place, + lon: s.lon, + lat: s.lat, + meta: { situation: s.id, source: s.source }, + }); + return; + } + const c = best.c; + select(c.id); + const meta = {}; + if (c.altM) + meta.altitude = + c.kind === 'satellite' + ? `${Math.round(c.altM / 1000)} km` + : `${Math.round(c.altM * 3.28084).toLocaleString()} ft`; + if (c.speed) + meta.speed = + c.kind === 'ship' + ? `${(c.speed * 1.944).toFixed(1)} kn` + : `${Math.round(c.speed * 1.944)} kn`; + if (c.speed || c.kind === 'satellite') + meta.heading = `${Math.round(((c.headingDeg % 360) + 360) % 360)}°`; + meta.source = SIM; + const sub = { + aircraft: 'Aircraft', + helicopter: 'Helicopter', + ship: 'Vessel', + satellite: 'Satellite', + quake: 'Earthquake', + fire: 'Active fire', + }[c.kind]; + emit('pick', { + kind: c.kind, + id: c.id, + title: c.title, + subtitle: `${sub} · simulated`, + lon: c.lon, + lat: c.lat, + meta, + }); + } + function onWheel(e) { + e.preventDefault(); + cam.height = Math.max( + MIN_H, + Math.min(MAX_H, cam.height * Math.exp(e.deltaY * 0.0018)), + ); + dirty = true; + emitCamera(); + kick(); + clearTimeout(onWheel.t); + onWheel.t = setTimeout(updateDetail, 200); + } + root.addEventListener('pointerdown', onDown); + root.addEventListener('pointermove', onMove, { passive: true }); + root.addEventListener('pointerup', onUp); + root.addEventListener('pointercancel', onUp); + root.addEventListener('wheel', onWheel, { passive: false }); + root.addEventListener('dblclick', (e) => { + const rect = root.getBoundingClientRect(); + const g = unproject(e.clientX - rect.left, e.clientY - rect.top); + if (g) flyTo({ ...g, height: cam.height / 2.5, duration: 0.6 }); + }); + + /* ---------- API ---------- */ + function select(id) { + selected = id; + kick(); + } + function setLayer(id, on) { + const l = layerById.get(id); + if (!l) return; + l.on = !!on; + l.status = on ? 'live' : 'off'; + emit('layers', layers); + kick(); + } + const localSeeded = new Set(); + const api = { + isStub: true, + flyTo, + home: () => flyTo({ ...HOME }), + layers: () => layers.map((l) => ({ ...l })), + setLayer, + setFamily(family, on) { + for (const l of layers) + if (l.family === family) + ((l.on = !!on), (l.status = on ? 'live' : 'off')); + emit('layers', layers); + kick(); + }, + setTime(date) { + timeOverride = date ? new Date(date) : null; + dirty = true; + kick(); + emit('time', { time: timeOverride }); + }, + timeWindow() { + const n = Date.now(); + return { + start: new Date(n - 72 * 3600e3), + end: new Date(n + 120 * 3600e3), + now: new Date(n), + }; + }, + setLens(id) { + lens = { cinematic: 0, clear: 1, night: 2, thermal: 3, nvg: 4 }[id] ?? 0; + dirty = true; + kick(); + }, + async focus(s) { + if (!s) return; + for (const id of s.layers || []) + if (layerById.has(id)) setLayer(id, true); + if (s.live) api.setTime(null); + else if (s.time?.end) api.setTime(new Date(s.time.end)); + const c = s.camera || { lon: s.lon, lat: s.lat, height: 400e3 }; + return flyTo({ + lon: c.lon, + lat: c.lat, + height: c.height, + heading: c.heading, + duration: options.reducedMotion ? 0 : undefined, + }); + }, + select, + on(ev, fn) { + if (!listeners.has(ev)) listeners.set(ev, new Set()); + listeners.get(ev).add(fn); + }, + off(ev, fn) { + listeners.get(ev)?.delete(fn); + }, + pause() { + paused = true; + if (raf) cancelAnimationFrame(raf); + raf = 0; + }, + resume() { + paused = false; + dirty = true; + kick(); + }, + contactsNear(lon, lat, km) { + const key = `${lon.toFixed(1)},${lat.toFixed(1)}`; + if (!localSeeded.has(key)) { + localSeeded.add(key); + const rr = rng(Math.floor((lon + 180) * 100 + (lat + 90) * 7)); + for (let i = 0; i < 14; i += 1) { + const [x, y] = destination(lon, lat, rr() * 360, 4e3 + rr() * 70e3); + contacts.push({ + kind: 'aircraft', + layer: 'sky.commercial-flights', + id: `local-${key}-${i}`, + title: `${PREFIX[i % PREFIX.length]}${200 + Math.floor(rr() * 7000)}`, + lon: x, + lat: y, + altM: 900 + rr() * 11000, + headingDeg: rr() * 360, + speed: 120 + rr() * 120, + }); + } + for (let i = 0; i < 3; i += 1) { + const [x, y] = destination(lon, lat, rr() * 360, 3e3 + rr() * 20e3); + contacts.push({ + kind: 'ship', + layer: 'sea.ais-vessels', + id: `localship-${key}-${i}`, + title: `${SHIP[i]} ${['Star', 'Bay', 'Trader'][i]}`, + lon: x, + lat: y, + altM: 0, + headingDeg: rr() * 360, + speed: 4, + }); + } + } + const t = now(); + const out = []; + for (const c of contacts) { + propagate(c, t0, t); + const d = haversine(lon, lat, c.lon, c.lat); + const lim = + c.kind === 'satellite' ? Math.max(km * 1000, 2200e3) : km * 1000; + if (d <= lim) + out.push({ + kind: c.kind === 'helicopter' ? 'aircraft' : c.kind, + id: c.id, + title: c.title, + lon: c.lon, + lat: c.lat, + altM: c.altM, + headingDeg: c.headingDeg, + }); + } + return out; + }, + async situations() { + if (!situations) situations = buildSituations(Date.now()); + kick(); + return situations; + }, + credits() { + return [ + { + name: 'Esri World Imagery', + text: 'Esri, Maxar, Earthstar Geographics, and the GIS User Community', + url: 'https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9', + }, + { + name: 'NASA Black Marble', + text: 'NASA Earth Observatory / GIBS, VIIRS Black Marble', + url: 'https://earthdata.nasa.gov/gibs', + }, + { + name: 'Simulated contacts', + text: 'Offline stub engine. Aircraft, ships, satellites and situations here are simulated, not live.', + }, + ]; + }, + camera: () => ({ ...cam }), + destroy() { + api.pause(); + ro.disconnect(); + root.remove(); + }, + }; + kick(); + setTimeout( + () => + emit('camera', { + lon: cam.lon, + lat: cam.lat, + height: cam.height, + heading: 0, + pitch: -90, + }), + 0, + ); + return api; +} diff --git a/mobile/ui/icons.js b/mobile/ui/icons.js new file mode 100644 index 000000000..fc46de443 --- /dev/null +++ b/mobile/ui/icons.js @@ -0,0 +1,122 @@ +/** + * Hand-drawn SF Symbols–style glyphs on a 24-unit grid. + * Stroke 1.8, round caps/joins; `.f` parts fill when the glyph is "active". + * No icon fonts: the repo's Material Symbols font is subset. + */ + +const F = 'fill="currentColor" stroke="none"'; + +/** Rounded seal outline (checkmark.seal) generated from a wavy circle. */ +function sealPath(cx = 12, cy = 12, r = 8.6, bumps = 12, amp = 1.05) { + const steps = bumps * 8; + let d = ''; + for (let i = 0; i <= steps; i += 1) { + const a = (i / steps) * Math.PI * 2; + const rr = r + amp * Math.cos(a * bumps); + const x = cx + rr * Math.cos(a); + const y = cy + rr * Math.sin(a); + d += `${i ? 'L' : 'M'}${x.toFixed(2)} ${y.toFixed(2)}`; + } + return `${d}Z`; +} + +const SEAL = sealPath(); + +const P = { + now: ``, + globe: ``, + viewfinder: ``, + threads: ``, + you: ``, + search: ``, + chevronLeft: ``, + chevronRight: ``, + chevronDown: ``, + chevronUp: ``, + close: ``, + info: ``, + north: ``, + home: ``, + layers: ``, + sky: ``, + sea: ``, + orbit: ``, + hazards: ``, + flame: ``, + eyes: ``, + ground: ``, + weather: ``, + infra: ``, + star: ``, + starFill: ``, + ride: ``, + video: ``, + share: ``, + seal: ``, + sealFill: ``, + play: ``, + pause: ``, + sparkles: ``, + agree: ``, + dispute: ``, + sliders: ``, + refresh: ``, + lock: ``, + key: ``, + location: ``, + camera: ``, + cube: ``, + download: ``, + lens: ``, + checkmark: ``, + xmark: ``, + minus: ``, + plus: ``, + ellipsis: ``, + clock: ``, + pin: ``, + sidebar: ``, + waveform: ``, + arrowUpRight: ``, + scope: ``, + hand: ``, +}; + +/** + * Inline SVG markup for a glyph. + * @param {string} name + * @param {{ label?: string, cls?: string }} [opts] + */ +export function icon(name, { label = '', cls = '' } = {}) { + const body = P[name] || P.ellipsis; + const a11y = label + ? `role="img" aria-label="${label}"` + : 'aria-hidden="true" focusable="false"'; + return `${body}`; +} + +export const FAMILY_ICON = { + sky: 'sky', + sea: 'sea', + orbit: 'orbit', + hazards: 'hazards', + eyes: 'eyes', + ground: 'ground', + weather: 'weather', + infra: 'infra', +}; + +export const FAMILIES = [ + { id: 'sky', name: 'Sky', color: '#7CC4FF' }, + { id: 'sea', name: 'Sea', color: '#38E1C6' }, + { id: 'orbit', name: 'Orbit', color: '#C9A7FF' }, + { id: 'hazards', name: 'Hazards', color: '#FF6A3D' }, + { id: 'eyes', name: 'Eyes', color: '#FFD166' }, + { id: 'ground', name: 'Ground', color: '#9BE15D' }, + { id: 'weather', name: 'Weather', color: '#8AB4F8' }, + { id: 'infra', name: 'Infra', color: '#B8C0CC' }, +]; + +export const FAMILY_COLOR = Object.fromEntries( + FAMILIES.map((f) => [f.id, f.color]), +); diff --git a/mobile/ui/inspector.js b/mobile/ui/inspector.js new file mode 100644 index 000000000..4e9f2d2e7 --- /dev/null +++ b/mobile/ui/inspector.js @@ -0,0 +1,114 @@ +/** Verify inspector: recompute and show every check, Tufte-clean. */ + +import { icon } from './icons.js'; +import { esc, sparkPath, esriThumb, haptic } from './dom.js'; +import { createSheet } from './sheet.js'; +import { verify } from '../capture/provenance.js'; +import { get } from '../capture/db.js'; + +const GLYPH = { + pass: 'checkmark', + warn: 'hazards', + fail: 'xmark', + na: 'minus', +}; + +export function createInspector() { + const sheet = createSheet({ + label: 'Verify capture', + detents: ['large'], + modal: true, + dismissible: true, + closeButton: true, + className: 'opaque inspector', + heights: { large: (H) => Math.round(H * 0.94) }, + }); + let urls = []; + + function small(label, values, unit) { + const v = values.filter(Number.isFinite); + if (v.length < 3) + return `
${label}—
`; + const lo = Math.min(...v); + const hi = Math.max(...v); + return `
${label}${lo.toFixed(1)}–${hi.toFixed(1)}${unit}
`; + } + + async function open(bundle) { + urls.forEach((u) => URL.revokeObjectURL(u)); + urls = []; + const rec = await get('media', bundle.id).catch(() => null); + const blob = rec?.blob || null; + const url = blob ? URL.createObjectURL(blob) : ''; + if (url) urls.push(url); + const isVideo = /video/.test(bundle.media.type); + const when = new Date(bundle.sealedAt); + sheet.head.innerHTML = `
+
${url ? (isVideo ? `` : `Capture ${bundle.seq}`) : ''}${icon('sealFill')}
+

Capture #${bundle.seq}

${esc(when.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'medium' }))}${bundle.context?.testFrame ? ' · Test frame' : ''}
+
`; + sheet.body.innerHTML = `
Recomputing hashes and checking the signature…
`; + sheet.open('large'); + const t0 = performance.now(); + const res = await verify(bundle, blob); + const ms = Math.round(performance.now() - t0); + const fails = res.checks.filter((c) => c.status === 'fail').length; + const warns = res.checks.filter((c) => c.status === 'warn').length; + haptic(fails ? 'warn' : 'success'); + const imu = bundle.session?.imu || []; + const gps = bundle.session?.gps || []; + const f = gps[gps.length - 1]; + sheet.body.innerHTML = ` +
${icon(fails ? 'xmark' : 'seal')}
${fails ? `${fails} check${fails > 1 ? 's' : ''} failed` : warns ? `Verified with ${warns} caveat${warns > 1 ? 's' : ''}` : 'All checks passed'}Recomputed on this device in ${ms} ms. None of this proves truth; it raises the cost of lying.
+
    ${res.checks + .map( + (c) => + `
  1. ${icon(GLYPH[c.status] || 'minus')}
    ${esc(c.label)}${esc(c.detail)}
  2. `, + ) + .join('')}
+
Motion during capture${imu.length} samples
+
${small( + 'α', + imu.map((s) => s.α), + '°', + )}${small( + 'β', + imu.map((s) => s.β), + '°', + )}${small( + 'γ', + imu.map((s) => s.γ), + '°', + )}${small( + '|a|', + imu.map((s) => Math.hypot(s.ax ?? NaN, s.ay ?? NaN, s.az ?? NaN)), + '', + )}
+ ${f ? `
Where it was sealed±${Math.round(f.acc)} m
${f.lat.toFixed(5)}, ${f.lon.toFixed(5)}
` : ''} +
Bundle
+
hash
${esc(bundle.hash)}
+
media
${esc(bundle.media.sha256)}
+
prev
${esc(bundle.prev || 'null (genesis)')}
+
key
${esc(bundle.keyId)} · P-256
+
sig
${esc(bundle.signature.slice(0, 48))}…
+
device
${esc(bundle.context?.device || '')} · ${esc(bundle.context?.timezone || '')}
+
+

In a native build the key lives in the Secure Enclave / StrongBox with App Attest / Play Integrity, and the bundle is written as a C2PA manifest.

`; + sheet.body.querySelector('[data-insp="export"]').onclick = () => { + const a = document.createElement('a'); + const u = URL.createObjectURL( + new Blob([JSON.stringify(bundle, null, 2)], { + type: 'application/json', + }), + ); + a.href = u; + a.download = `${bundle.id}.bundle.json`; + a.click(); + setTimeout(() => URL.revokeObjectURL(u), 2000); + }; + sheet.body.querySelector('[data-insp="reverify"]').onclick = () => + open(bundle); + } + + return { open, sheet }; +} diff --git a/mobile/ui/narrative.js b/mobile/ui/narrative.js new file mode 100644 index 000000000..9a677de8d --- /dev/null +++ b/mobile/ui/narrative.js @@ -0,0 +1,142 @@ +/** + * Narrative player: flies the globe through a thread's stops while the time + * ribbon scrubs the thread's own (schematic) clock. + */ + +import { icon } from './icons.js'; +import { h, haptic, reducedMotion } from './dom.js'; + +export function createNarrative({ app, chrome, globe, ribbon, getSituation }) { + const hud = + h(`
+
+
+
+
+
+
`); + chrome.appendChild(hud); + const playBtn = hud.querySelector('.narr-play'); + let run = null; + + function fmt(base) { + return (ms) => { + const s = Math.max(0, Math.round((ms - base) / 1000)); + return `T+${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`; + }; + } + + function sleep(ms, r) { + return new Promise((resolve) => { + const t0 = performance.now(); + const tick = () => { + if (r.stopped) return resolve(); + if (r.paused) { + r.resumeAt = () => tick(); + return; + } + if (performance.now() - t0 >= ms) return resolve(); + requestAnimationFrame(tick); + }; + tick(); + }); + } + + async function play(thread) { + stop(); + const r = { stopped: false, paused: false, thread }; + run = r; + const base = Date.parse( + `${thread.observedDate || new Date().toISOString().slice(0, 10)}T00:00:00Z`, + ); + const dur = (thread.elapsedSeconds || 600) * 1000; + app.classList.add('is-world', 'is-narrative'); + globe.resume(); + ribbon.setWindow({ + start: base, + end: base + dur, + label: 'schematic clock', + format: fmt(base), + }); + hud.querySelector('.narr-prog').innerHTML = thread.steps + .map(() => '') + .join(''); + hud.querySelector('.narr-cav').textContent = thread.label || ''; + const sit = getSituation(thread.id); + if (sit) globe.focus(sit); + haptic('light'); + let t = base; + for (let i = 0; i < thread.steps.length && !r.stopped; i += 1) { + const s = thread.steps[i]; + hud.querySelector('.narr-step').textContent = + `Stop ${i + 1} of ${thread.steps.length} · ${s.phase || ''}`; + hud.querySelector('.narr-name').textContent = s.title; + hud + .querySelectorAll('.narr-prog i') + .forEach((el, k) => el.classList.toggle('done', k <= i)); + const target = + base + (s.progress ?? i / Math.max(1, thread.steps.length - 1)) * dur; + const flight = globe.flyTo({ + lon: s.lon, + lat: s.lat, + height: (s.elev || 1500) + 9000, + heading: 344, + pitch: -38, + duration: reducedMotion() ? 0 : 2.2, + }); + // Scrub the ribbon toward this stop's schematic time. + const from = t; + const t0 = performance.now(); + const scrub = () => { + if (r.stopped) return; + const k = Math.min(1, (performance.now() - t0) / 2000); + t = from + (target - from) * (1 - (1 - k) ** 3); + ribbon.seek(t); + globe.setTime(new Date(t)); + if (k < 1) requestAnimationFrame(scrub); + }; + scrub(); + await Promise.race([flight, sleep(2600, r)]); + await sleep(reducedMotion() ? 1200 : 1600, r); + } + if (!r.stopped) { + hud.querySelector('.narr-step').textContent = 'End of narrative'; + playBtn.innerHTML = icon('play'); + playBtn.setAttribute('aria-label', 'Replay'); + r.done = true; + } + } + + function stop() { + if (!run) return; + run.stopped = true; + run = null; + app.classList.remove('is-narrative'); + if (!app.classList.contains('keep-world')) app.classList.remove('is-world'); + ribbon.setWindow(null); + globe.setTime(null); + playBtn.innerHTML = icon('pause'); + } + + playBtn.addEventListener('click', () => { + if (!run) return; + if (run.done) return play(run.thread); + run.paused = !run.paused; + playBtn.innerHTML = icon(run.paused ? 'play' : 'pause'); + playBtn.setAttribute('aria-label', run.paused ? 'Play' : 'Pause'); + if (!run.paused && run.resumeAt) { + const f = run.resumeAt; + run.resumeAt = null; + f(); + } + }); + hud.querySelector('.pick-close').addEventListener('click', stop); + + return { + play, + stop, + get active() { + return !!run; + }, + }; +} diff --git a/mobile/ui/search.js b/mobile/ui/search.js new file mode 100644 index 000000000..501439668 --- /dev/null +++ b/mobile/ui/search.js @@ -0,0 +1,139 @@ +/** Search: situations, layers and places (OpenStreetMap Nominatim via /api/geocode). */ + +import { icon, FAMILY_ICON } from './icons.js'; +import { $, esc, haptic } from './dom.js'; +import { createSheet } from './sheet.js'; + +const PLACES = [ + { name: 'Kathmandu', sub: 'Nepal', lon: 85.324, lat: 27.7172 }, + { name: 'Strait of Hormuz', sub: 'Persian Gulf', lon: 56.4, lat: 26.5 }, + { name: 'Panama Canal', sub: 'Panama', lon: -79.68, lat: 9.08 }, + { name: 'Heathrow', sub: 'London, UK', lon: -0.4543, lat: 51.47 }, + { name: 'Cape Canaveral', sub: 'Florida, US', lon: -80.6, lat: 28.47 }, + { name: 'Mount Etna', sub: 'Sicily, Italy', lon: 14.995, lat: 37.751 }, +]; + +export function createSearch({ + getSituations, + globe, + onOpenSituation, + onPlace, + onLayer, +}) { + const sheet = createSheet({ + label: 'Search', + detents: ['large'], + modal: true, + dismissible: true, + className: 'search-sheet', + heights: { large: (H) => Math.round(H * 0.92) }, + }); + sheet.head.innerHTML = ``; + const input = $('input', sheet.head); + let timer = 0; + let geo = []; + + function match(q, ...fields) { + const s = fields.join(' ').toLowerCase(); + return q + .toLowerCase() + .split(/\s+/) + .filter(Boolean) + .every((w) => s.includes(w)); + } + + async function render() { + const q = input.value.trim(); + const sits = await getSituations(); + const s = q + ? sits.filter((x) => match(q, x.title, x.place, x.kind, x.family)) + : sits.slice(0, 5); + const layers = q + ? globe + .layers() + .filter((l) => match(q, l.name, l.family)) + .slice(0, 8) + : []; + const places = q + ? PLACES.filter((p) => match(q, p.name, p.sub)) + : PLACES.slice(0, 4); + sheet.body.innerHTML = ` +
${q ? 'Situations' : 'Live now'}
+ ${s.map((x) => ``).join('') || '

No situations match.

'} + ${layers.length ? `
Lenses
${layers.map((l) => ``).join('')}` : ''} +
Places
+ ${[...places, ...geo].map((p, i) => ``).join('')} + ${q.length >= 3 ? '

Press search to look up places · © OpenStreetMap contributors

' : ''}`; + sheet.body._places = [...places, ...geo]; + } + + async function geocode() { + const q = input.value.trim(); + if (q.length < 3) return; + try { + const r = await fetch(`/api/geocode?q=${encodeURIComponent(q)}`); + if (!r.ok) throw new Error(String(r.status)); + const j = await r.json(); + geo = (j.results || []) + .slice(0, 5) + .map((x) => ({ + name: x.formatted_address?.split(',')[0] || x.name || q, + sub: x.formatted_address || '', + lat: Number(x.geometry?.location?.lat ?? x.lat), + lon: Number(x.geometry?.location?.lng ?? x.lon), + })) + .filter((p) => Number.isFinite(p.lat) && Number.isFinite(p.lon)); + } catch { + geo = []; + } + render(); + } + + input.addEventListener('input', () => { + geo = []; + clearTimeout(timer); + timer = setTimeout(render, 80); + }); + sheet.head.querySelector('form').addEventListener('submit', (e) => { + e.preventDefault(); + geocode(); + }); + sheet.head + .querySelector('.search-cancel') + .addEventListener('click', () => sheet.close()); + + sheet.body.addEventListener('click', async (e) => { + const sit = e.target.closest('[data-sit]'); + if (sit) { + const s = (await getSituations()).find( + (x) => String(x.id) === sit.dataset.sit, + ); + sheet.close(); + if (s) setTimeout(() => onOpenSituation(s), 200); + return; + } + const l = e.target.closest('[data-layer]'); + if (l) { + haptic('tick'); + sheet.close(); + onLayer(l.dataset.layer); + return; + } + const p = e.target.closest('[data-place]'); + if (p) { + const place = sheet.body._places[Number(p.dataset.place)]; + sheet.close(); + if (place) onPlace(place); + } + }); + + return { + open() { + input.value = ''; + geo = []; + render(); + sheet.open('large'); + setTimeout(() => input.focus({ preventScroll: true }), 120); + }, + }; +} diff --git a/mobile/ui/sheet.js b/mobile/ui/sheet.js new file mode 100644 index 000000000..1cd29a175 --- /dev/null +++ b/mobile/ui/sheet.js @@ -0,0 +1,292 @@ +/** + * Bottom sheet with detents (peek / medium / large), velocity-aware drag, + * rubber-banding and nested scroll hand-off, after UISheetPresentationController. + */ + +import { h, clamp, emitter, haptic, reducedMotion } from './dom.js'; +import { icon } from './icons.js'; + +const DEFAULT_DETENTS = { + peek: () => 108, + medium: (H) => Math.round(H * 0.46), + large: (H) => Math.round(H * 0.92), +}; + +/** + * @param {{ + * host?: HTMLElement, label: string, detents?: string[], initial?: string, + * modal?: boolean, dismissible?: boolean, className?: string, + * heights?: Recordnumber>, closeButton?: boolean, + * }} o + */ +export function createSheet(o) { + const ev = emitter(); + const detents = o.detents || ['peek', 'medium', 'large']; + const heights = { ...DEFAULT_DETENTS, ...(o.heights || {}) }; + const host = o.host || document.getElementById('sheets'); + + const root = h(``); + host.appendChild(root); + const sheet = root.querySelector('.sheet'); + const body = root.querySelector('.sheet-body'); + const head = root.querySelector('.sheet-head'); + const scrim = root.querySelector('.sheet-scrim'); + + let H = 0; + let current = null; + let y = 0; // translateY from the top of the large position + let isOpen = false; + + const hostHeight = () => host.clientHeight || window.innerHeight; + const maxH = () => heights[detents[detents.length - 1]](H); + const offsetFor = (name) => maxH() - heights[name](H); + + function measure() { + H = hostHeight(); + sheet.style.height = `${maxH()}px`; + } + + function apply(animate, spring = true) { + sheet.style.transition = animate + ? `transform ${reducedMotion() ? 160 : 520}ms ${spring ? 'var(--spring)' : 'var(--ease-out)'}` + : 'none'; + sheet.style.transform = `translate3d(0, ${y}px, 0)`; + if (scrim) { + const lowest = offsetFor(detents[0]); + const k = clamp(1 - y / Math.max(1, lowest + 120), 0, 1); + scrim.style.transition = animate ? 'opacity 300ms linear' : 'none'; + scrim.style.opacity = String(isOpen ? 0.5 * k + 0.12 : 0); + } + } + + function setDetent(name, { animate = true, silent = false } = {}) { + if (!detents.includes(name)) return; + const changed = name !== current; + current = name; + y = offsetFor(name); + root.dataset.detent = name; + sheet.dataset.detent = name; + body.classList.toggle('scrollable', name === detents[detents.length - 1]); + if (name !== detents[detents.length - 1]) body.scrollTop = 0; + apply(animate); + if (changed && !silent) { + haptic('tick'); + ev.emit('detent', name); + } + } + + function open(name = o.initial || detents[Math.min(1, detents.length - 1)]) { + measure(); + root.hidden = false; + isOpen = true; + if (!current || root.dataset.closing) { + y = maxH() + 40; + apply(false); + void sheet.offsetHeight; + } + delete root.dataset.closing; + setDetent(name, { silent: false }); + ev.emit('open', name); + if (o.modal) + setTimeout( + () => + ( + sheet.querySelector('[autofocus]') || + root.querySelector('.sheet-grabber') + )?.focus({ preventScroll: true }), + 60, + ); + } + + function close() { + if (!isOpen) return; + isOpen = false; + root.dataset.closing = '1'; + y = maxH() + 40; + apply(true, false); + current = null; + ev.emit('close'); + setTimeout(() => { + if (!isOpen) root.hidden = true; + }, 420); + } + + /* ---------- drag ---------- */ + let drag = null; + const rubber = (over, dim) => (1 - 1 / ((over * 0.55) / dim + 1)) * dim; + + function bounded(raw) { + const top = 0; + const bottom = offsetFor(detents[0]); + if (raw < top) return top - rubber(top - raw, H); + if (raw > bottom && !o.dismissible) return bottom + rubber(raw - bottom, H); + return raw; + } + + function start(clientY) { + drag = { + y0: clientY, + start: y, + samples: [{ t: performance.now(), y: clientY }], + }; + sheet.style.transition = 'none'; + root.classList.add('dragging'); + } + function move(clientY) { + if (!drag) return; + const raw = drag.start + (clientY - drag.y0); + y = bounded(raw); + drag.samples.push({ t: performance.now(), y: clientY }); + if (drag.samples.length > 6) drag.samples.shift(); + apply(false); + } + function end() { + if (!drag) return; + root.classList.remove('dragging'); + const s = drag.samples; + const a = s[0]; + const b = s[s.length - 1]; + const v = b.t - a.t > 0 ? ((b.y - a.y) / (b.t - a.t)) * 1000 : 0; // px/s + drag = null; + const projected = y + v * 0.2; + const lowest = offsetFor(detents[0]); + if ( + o.dismissible && + (projected > lowest + 90 || (y > lowest + 40 && v > 300)) + ) { + close(); + return; + } + let best = detents[0]; + let bd = Infinity; + for (const d of detents) { + const dd = Math.abs(offsetFor(d) - projected); + if (dd < bd) { + bd = dd; + best = d; + } + } + // A decisive flick always moves at least one detent. + const idx = detents.indexOf(current); + if (best === current && Math.abs(v) > 700) { + const next = clamp(idx + (v < 0 ? 1 : -1), 0, detents.length - 1); + best = detents[next]; + } + setDetent(best); + if (best === current) apply(true); + } + + // Touch: hand off between the sheet and its scrolling body. + let touchMode = null; // 'sheet' | 'scroll' + let ty0 = 0; + sheet.addEventListener( + 'touchstart', + (e) => { + if (e.touches.length !== 1) return; + if (e.target.closest('input, textarea, [data-no-drag]')) { + touchMode = 'scroll'; + return; + } + ty0 = e.touches[0].clientY; + touchMode = null; + }, + { passive: true }, + ); + sheet.addEventListener( + 'touchmove', + (e) => { + if (e.touches.length !== 1 || touchMode === 'scroll') return; + const cy = e.touches[0].clientY; + if (!touchMode) { + const dy = cy - ty0; + if (Math.abs(dy) < 4) return; + const inBody = body.contains(e.target); + const atLarge = current === detents[detents.length - 1]; + if (inBody && atLarge && (dy < 0 || body.scrollTop > 0)) { + touchMode = 'scroll'; + return; + } + if (e.target.closest('[data-hscroll]') && Math.abs(dy) < 8) return; + touchMode = 'sheet'; + start(ty0); + } + if (touchMode === 'sheet') { + e.preventDefault(); + move(cy); + } + }, + { passive: false }, + ); + const tend = () => { + if (touchMode === 'sheet') end(); + touchMode = null; + }; + sheet.addEventListener('touchend', tend, { passive: true }); + sheet.addEventListener('touchcancel', tend, { passive: true }); + + // Mouse / pen: drag from the grabber or header area. + sheet.addEventListener('pointerdown', (e) => { + if (e.pointerType === 'touch' || e.button !== 0) return; + if (!e.target.closest('.sheet-grabber, .sheet-head, .sheet-drag')) return; + e.preventDefault(); + start(e.clientY); + const mv = (ev2) => move(ev2.clientY); + const up = () => { + window.removeEventListener('pointermove', mv); + window.removeEventListener('pointerup', up); + end(); + }; + window.addEventListener('pointermove', mv, { passive: true }); + window.addEventListener('pointerup', up); + }); + + root.querySelector('.sheet-grabber').addEventListener('click', () => { + const i = detents.indexOf(current); + setDetent(detents[(i + 1) % detents.length]); + }); + root.querySelector('.sheet-close')?.addEventListener('click', () => close()); + scrim?.addEventListener('click', () => close()); + root.addEventListener('keydown', (e) => { + if (e.key === 'Escape' && (o.modal || o.dismissible)) { + e.stopPropagation(); + close(); + } + }); + + new ResizeObserver(() => { + if (!isOpen) return; + measure(); + if (current) { + y = offsetFor(current); + apply(false); + } + }).observe(host); + + return { + root, + sheet, + head, + body, + open, + close, + setDetent, + get detent() { + return current; + }, + get isOpen() { + return isOpen; + }, + on: ev.on, + off: ev.off, + /** Visible height of the sheet at its current position. */ + visibleHeight: () => Math.max(0, maxH() - y), + }; +} diff --git a/mobile/ui/tabbar.js b/mobile/ui/tabbar.js new file mode 100644 index 000000000..e740db0e7 --- /dev/null +++ b/mobile/ui/tabbar.js @@ -0,0 +1,153 @@ +/** + * iOS 26-style floating glass tab bar with a tab-bar accessory + * ("now playing" for the planet) and a search button in the same row. + * Minimises to a compact pill while the feed scrolls down. + */ + +import { icon, FAMILY_ICON } from './icons.js'; +import { $, $$, esc, ago, fmtNum, haptic } from './dom.js'; + +export const TABS = [ + { id: 'now', label: 'Now', icon: 'now' }, + { id: 'globe', label: 'Globe', icon: 'globe' }, + { id: 'capture', label: 'Capture', icon: 'viewfinder' }, + { id: 'threads', label: 'Threads', icon: 'threads' }, + { id: 'you', label: 'You', icon: 'you' }, +]; + +export function createTabBar(nav, { onSelect, onSearch, onAccessory }) { + nav.innerHTML = ` +
+ +
+ + ${TABS.map( + ( + t, + ) => ``, + ).join('')} +
+ +
+ `; + + const lens = $('.tb-lens', nav); + const tabsEl = $('.tb-tabs', nav); + const acc = $('.tb-accessory', nav); + const miniTab = $('.tb-mini-tab', nav); + const miniAcc = $('.tb-mini-acc', nav); + let current = 'now'; + let minimized = false; + let accSituation = null; + + function placeLens() { + const idx = TABS.findIndex((t) => t.id === current); + const w = (tabsEl.clientWidth - 8) / TABS.length; + lens.style.width = `${w}px`; + lens.style.transform = `translateX(${idx * w}px)`; + } + + function select(id, { silent = false } = {}) { + current = id; + $$('.tb-tab', nav).forEach((b) => + b.setAttribute('aria-selected', String(b.dataset.tab === id)), + ); + const t = TABS.find((x) => x.id === id); + miniTab.innerHTML = icon(t.icon); + placeLens(); + if (!silent) setMinimized(false); + } + + function setMinimized(v) { + if (v === minimized) return; + minimized = v; + nav.classList.toggle('min', v); + $('.tb-full', nav).toggleAttribute('inert', v); + $('.tb-mini', nav).setAttribute('aria-hidden', String(!v)); + $$('.tb-mini button', nav).forEach((b) => (b.tabIndex = v ? 0 : -1)); + } + + function accessoryHtml(s) { + const m = s.metrics?.[0]; + return `${icon(FAMILY_ICON[s.family] || 'now')} + ${esc(s.title)} + ${esc(s.place || '')} · ${esc(ago(s.updatedAt))} + ${m ? `${esc(fmtNum(m.value))}${m.unit ? ` ${esc(m.unit)}` : ''}` : ''}`; + } + + function setAccessory(s) { + accSituation = s; + acc.hidden = !s; + miniAcc.hidden = !s; + nav.classList.toggle('has-accessory', !!s); + document.documentElement.classList.toggle('has-accessory', !!s); + if (!s) return; + acc.dataset.family = s.family; + miniAcc.dataset.family = s.family; + acc.innerHTML = accessoryHtml(s); + miniAcc.innerHTML = accessoryHtml(s); + acc.setAttribute('aria-label', `Following ${s.title}`); + } + + nav.addEventListener('click', (e) => { + const tab = e.target.closest('.tb-tab'); + if (tab) { + if (tab.dataset.tab !== current) haptic('tick'); + onSelect(tab.dataset.tab, { reselect: tab.dataset.tab === current }); + return; + } + if (e.target.closest('.tb-search')) return onSearch(); + if (e.target.closest('.tb-accessory, .tb-mini-acc')) + return accSituation && onAccessory(accSituation); + if (e.target.closest('.tb-mini-tab')) setMinimized(false); + }); + + // Arrow-key roving focus across the tablist (ARIA tabs pattern). + tabsEl.addEventListener('keydown', (e) => { + if (!['ArrowLeft', 'ArrowRight'].includes(e.key)) return; + const tabs = $$('.tb-tab', nav); + const i = tabs.indexOf(document.activeElement); + const n = + tabs[(i + (e.key === 'ArrowRight' ? 1 : -1) + tabs.length) % tabs.length]; + n.focus(); + }); + + new ResizeObserver(placeLens).observe(tabsEl); + + /** Minimise while scrolling down; restore on scroll up or when scrolling stops. */ + function bindScroll(scroller) { + let lastY = scroller.scrollTop; + let acc = 0; + let idle = 0; + scroller.addEventListener( + 'scroll', + () => { + const y = scroller.scrollTop; + const dy = y - lastY; + lastY = y; + acc = Math.sign(dy) === Math.sign(acc) ? acc + dy : dy; + if (y < 40) setMinimized(false); + else if (acc > 28) setMinimized(true); + else if (acc < -18) setMinimized(false); + clearTimeout(idle); + idle = setTimeout(() => setMinimized(false), 1400); + }, + { passive: true }, + ); + } + + return { + select, + setMinimized, + setAccessory, + bindScroll, + get current() { + return current; + }, + }; +} diff --git a/mobile/ui/threads.js b/mobile/ui/threads.js new file mode 100644 index 000000000..e634f18f8 --- /dev/null +++ b/mobile/ui/threads.js @@ -0,0 +1,769 @@ +/** + * Threads: reconstructions people build together, always in three strata — + * Observations (immutable, sourced, hashed) → Hypotheses (person / AI, + * confidence, citations, agree / dispute) → Narrative (a camera path through + * space and time). Every change lands in a hash-chained ledger. + */ + +import { icon } from './icons.js'; +import { + $, + $$, + esc, + ago, + haptic, + toast, + fmtCoord, + reducedMotion, +} from './dom.js'; +import { canonical, sha256Hex } from '../capture/provenance.js'; +import { loadEventPack } from './world.js'; + +const LOCAL_KEY = 'gev.mobile.threads.local.v1'; +const DRAFTS_KEY = 'gev.mobile.threads.drafts.v1'; + +function readLocal(key, fallback) { + try { + return JSON.parse(localStorage.getItem(key) || 'null') ?? fallback; + } catch { + return fallback; + } +} +function writeLocal(key, v) { + try { + localStorage.setItem(key, JSON.stringify(v)); + } catch { + /* ignore */ + } +} + +/* ------------------------------------------------------------------ */ +/* Thread models */ +/* ------------------------------------------------------------------ */ + +/** Example hypotheses: fictional authors, written to show the format. */ +const EXAMPLE_HYPOTHESES = [ + { + id: 'H1', + author: { kind: 'person', handle: '@rivergauge_example' }, + at: '2026-08-28T09:12:00Z', + text: 'The outburst began at the debris-dammed lake (O2) after the second landslide (O3) loaded the dam.', + confidence: 0.7, + cites: ['O2', 'O3'], + agree: 12, + dispute: 3, + }, + { + id: 'H2', + author: { kind: 'ai', handle: 'AI · example model' }, + at: '2026-08-28T11:40:00Z', + text: 'Treat the Timure cluster (O5) as one timing observation: it groups five map placements, not five independent timings.', + confidence: 0.55, + cites: ['O5'], + agree: 8, + dispute: 0, + prompt: 'Which observations are not independent for timing?', + }, + { + id: 'H3', + author: { kind: 'person', handle: '@northbank_example' }, + at: '2026-08-29T06:05:00Z', + text: 'The Rasuwagadhi witness clip (W1) was filmed from the north bank, upstream of the border gate (O4).', + confidence: 0.4, + cites: ['W1', 'O4'], + agree: 4, + dispute: 5, + }, +]; + +async function bhoteThread() { + const pack = await loadEventPack(); + const obs = []; + obs.push({ + id: 'B0', + title: 'Historical reference image', + phase: 'imagery', + lat: (pack.imagery.rectangle.north + pack.imagery.rectangle.south) / 2, + lon: (pack.imagery.rectangle.east + pack.imagery.rectangle.west) / 2, + source: pack.imagery.before.source, + via: 'Vantor Open Data Program', + time: pack.imagery.before.observedAt, + timeConf: 'acquisition date', + locConf: 'orthorectified scene', + url: '/events/bhote-koshi-2026/pre.webp', + record: pack.imagery.before, + }); + obs.push({ + id: 'A0', + title: 'Post-event image', + phase: 'imagery', + lat: obs[0].lat, + lon: obs[0].lon, + source: pack.imagery.after.source, + via: 'Vantor Open Data Program', + time: pack.imagery.after.observedAt, + timeConf: 'acquisition date', + locConf: 'orthorectified scene', + url: '/events/bhote-koshi-2026/post.webp', + record: pack.imagery.after, + }); + for (const w of pack.witnessAnchors) { + obs.push({ + id: 'W1', + title: 'Rasuwagadhi witness video', + phase: 'witness', + lat: w.lat, + lon: w.lon, + source: 'IndoWatchOSINT post (GeoConfirmed)', + via: w.provenance, + time: null, + timeConf: 'capture time unverified', + locConf: 'source geoconfirmed', + url: w.sourceUrl, + record: w, + }); + } + for (const e of pack.evidenceSpine) { + obs.push({ + id: `O${e.sequence}`, + seq: e.sequence, + title: e.title, + summary: e.summary, + phase: e.phase, + lat: e.lat, + lon: e.lon, + source: `${e.media?.platform || 'Source'} post`, + via: e.provenance?.via, + time: e.timing?.capturedAt, + timeConf: e.timing?.note || e.confidence?.time, + locConf: e.confidence?.location, + url: e.media?.sourceUrl, + poster: e.media?.posterUrl, + progress: e.trigger?.storyProgress, + rights: e.media?.rightsStatus, + record: e, + }); + } + obs.push({ + id: 'C1', + title: 'River centreline corridor', + phase: 'geometry', + lat: pack.reconstruction.corridor[0].lat, + lon: pack.reconstruction.corridor[0].lon, + source: 'GeoPera reconstruction (commit 59ee5bd)', + via: `${pack.reconstruction.corridor.length} points, every fourth published point inside the image bounds`, + time: null, + timeConf: 'not a modelled arrival time', + locConf: 'published centreline', + record: { corridor: pack.reconstruction.corridor }, + }); + for (const o of obs) o.hash = await sha256Hex(canonical(o.record)); + const steps = pack.evidenceSpine.map((e) => ({ + id: `O${e.sequence}`, + title: e.shortTitle || e.title, + phase: e.phase, + lat: e.lat, + lon: e.lon, + elev: e.fallbackElevationM, + progress: e.trigger?.storyProgress ?? 0, + })); + return { + id: pack.id, + real: true, + title: pack.title, + place: 'Rasuwa, Nepal ↔ Gyirong, Tibet', + observedDate: pack.observedDate, + created: `${pack.observedDate}T00:00:00Z`, + caveat: pack.reconstruction.caveat, + label: pack.reconstruction.label, + elapsedSeconds: pack.reconstruction.elapsedSeconds, + license: + 'CC BY-NC 4.0 · GeoPera · Vantor Open Data · GeoGeorgeShadrach map', + before: '/events/bhote-koshi-2026/pre.webp', + after: '/events/bhote-koshi-2026/post.webp', + viewpoint: pack.viewpoints.corridor, + corridor: pack.reconstruction.corridor, + observations: obs, + hypotheses: EXAMPLE_HYPOTHESES.map((x) => ({ ...x, example: true })), + steps, + }; +} + +async function draftThread(d) { + const o = { + id: 'O1', + title: d.title, + phase: 'situation snapshot', + lat: d.lat, + lon: d.lon, + source: d.source || 'Live feed', + via: 'Snapshot when the thread was started', + time: d.createdAt, + timeConf: 'snapshot time', + locConf: 'feed position', + record: d.snapshot || d, + }; + o.hash = await sha256Hex(canonical(o.record)); + return { + id: d.id, + real: false, + draft: true, + title: d.title, + place: d.place, + created: d.createdAt, + observations: [o], + hypotheses: [], + steps: [{ id: 'O1', title: d.title, lat: d.lat, lon: d.lon, progress: 0 }], + }; +} + +/* ------------------------------------------------------------------ */ +/* Ledger */ +/* ------------------------------------------------------------------ */ + +async function buildLedger(thread, local) { + const entries = []; + const push = async (type, actor, at, payload) => { + const prev = entries.length ? entries[entries.length - 1].hash : null; + const payloadHash = await sha256Hex(canonical(payload)); + const seq = entries.length; + const hash = await sha256Hex( + canonical({ seq, at, type, actor, payloadHash, prev }), + ); + entries.push({ seq, at, type, actor, payload, payloadHash, prev, hash }); + }; + await push( + 'thread.create', + thread.real ? 'event pack' : 'you (this device)', + thread.created, + { id: thread.id, title: thread.title, license: thread.license || null }, + ); + for (const o of thread.observations) + await push('observation.add', o.source, o.time || thread.created, { + id: o.id, + title: o.title, + recordHash: o.hash, + }); + for (const hy of [...thread.hypotheses, ...(local.proposals || [])]) { + await push( + hy.author.kind === 'ai' + ? hy.simulated + ? 'ai.proposal' + : 'hypothesis.propose' + : 'hypothesis.propose', + hy.author.handle, + hy.at, + { + id: hy.id, + text: hy.text, + cites: hy.cites, + confidence: hy.confidence, + example: hy.example || undefined, + ...(hy.simulated + ? { + prompt: hy.prompt, + model: hy.model, + inputs: hy.inputs, + simulated: true, + } + : {}), + }, + ); + } + for (const v of local.votes || []) + await push(`vote.${v.kind}`, 'you (this device)', v.at, { + hypothesis: v.id, + }); + return entries; +} + +async function verifyLedger(entries) { + let prev = null; + for (const e of entries) { + const ph = await sha256Hex(canonical(e.payload)); + const hh = await sha256Hex( + canonical({ + seq: e.seq, + at: e.at, + type: e.type, + actor: e.actor, + payloadHash: ph, + prev, + }), + ); + if (ph !== e.payloadHash || hh !== e.hash || e.prev !== prev) + return { ok: false, at: e.seq }; + prev = e.hash; + } + return { ok: true, n: entries.length, head: prev }; +} + +/* ------------------------------------------------------------------ */ +/* Simulated AI refinement (no network) */ +/* ------------------------------------------------------------------ */ + +function simulateRefinement(thread, prompt) { + const words = prompt.toLowerCase().match(/[a-z]{4,}/g) || []; + const scored = thread.observations + .map((o) => { + const hay = `${o.title} ${o.summary || ''} ${o.phase}`.toLowerCase(); + return { o, s: words.reduce((a, w) => a + (hay.includes(w) ? 1 : 0), 0) }; + }) + .filter((x) => x.s > 0) + .sort((a, b) => b.s - a.s) + .slice(0, 3) + .map((x) => x.o); + const cites = scored.length ? scored : thread.observations.slice(0, 2); + const anchors = cites + .map((o) => `${o.id} ${o.title} (${o.lat.toFixed(4)}, ${o.lon.toFixed(4)})`) + .join('; '); + return { + text: `Proposed refinement for “${prompt.trim()}”: candidate anchors ${anchors}. Needs a person to check the anchors against the imagery before it can be cited.`, + cites: cites.map((o) => o.id), + inputs: cites.map((o) => ({ id: o.id, recordHash: o.hash })), + }; +} + +/* ------------------------------------------------------------------ */ +/* View */ +/* ------------------------------------------------------------------ */ + +export function createThreads(view, { bindScroll, onPlay, onShowOnGlobe }) { + view.innerHTML = ` +
+ +

Threads

+
Reconstructions built in the open: observations, hypotheses, a ledger
+
+
+ `; + const list = $('.th-list', view); + const detail = $('.th-detail', view); + const cards = $('.th-cards', view); + let bhote = null; + let open = null; // { thread, ledger } + + view.addEventListener( + 'scroll', + () => view.classList.toggle('is-scrolled', view.scrollTop > 44), + { passive: true }, + ); + bindScroll(view); + + async function renderList() { + bhote = + bhote || (await bhoteThread().catch((err) => (console.error(err), null))); + const drafts = readLocal(DRAFTS_KEY, []); + const local = readLocal(LOCAL_KEY, {})[bhote?.id] || {}; + cards.innerHTML = ` + ${ + bhote + ? `` + : '

The bundled event pack could not be loaded.

' + } + ${drafts + .map( + ( + d, + ) => ``, + ) + .join('')} +
More reconstructions Example
+ ${[ + { + t: 'Stadium encore, rebuilt from crowd captures', + p: '42 signed captures · 3 hypotheses', + f: 'eyes', + i: 'eyes', + }, + { + t: '7700 squawk replay over the Channel', + p: 'ADS-B track · 2 witness clips', + f: 'sky', + i: 'sky', + }, + { + t: 'Ferry crossing in fog, harbour pilots', + p: 'AIS tracks · radar · 1 hypothesis', + f: 'sea', + i: 'sea', + }, + ] + .map( + (x) => + ``, + ) + .join('')} +

Example threads are placeholders showing the genres the format supports; they contain no real records.

`; + } + + cards.addEventListener('click', async (e) => { + const t = e.target.closest('[data-thread]'); + if (t && bhote) return openThread(bhote); + const d = e.target.closest('[data-draft]'); + if (d) { + const rec = readLocal(DRAFTS_KEY, []).find( + (x) => x.id === d.dataset.draft, + ); + if (rec) openThread(await draftThread(rec)); + return; + } + if (e.target.closest('[data-example]')) + toast('Example thread — concept only, no records', { + icon: icon('threads'), + }); + }); + + /* ---------- detail ---------- */ + function hypHtml(hy, votes) { + const v = votes.filter((x) => x.id === hy.id); + const agree = (hy.agree || 0) + v.filter((x) => x.kind === 'agree').length; + const dispute = + (hy.dispute || 0) + v.filter((x) => x.kind === 'dispute').length; + const mine = v.at(-1)?.kind; + const total = agree + dispute || 1; + const ai = hy.author.kind === 'ai'; + return `
+
${esc(hy.id)}${ai ? icon('sparkles') : ''}${esc(hy.author.handle)} + ${hy.example ? 'Example' : ''}${hy.simulated ? 'Proposed · local simulation' : ''}${esc(ago(hy.at))}
+

${esc(hy.text)}

+
${hy.cites.map((c) => ``).join('')}
+ ${hy.simulated ? `
prompt
${esc(hy.prompt)}
model
${esc(hy.model)}
inputs
${hy.inputs.map((i) => `${esc(i.id)}:${esc(i.recordHash.slice(0, 10))}`).join(' ')}
` : ''} +
+
Confidence${hy.confidence == null ? 'unscored' : `${Math.round(hy.confidence * 100)}%`}
+
+ +
+
`; + } + + function obsHtml(o) { + return `
  • + +
  • `; + } + + async function renderDetail() { + const { thread } = open; + const local = readLocal(LOCAL_KEY, {})[thread.id] || {}; + const votes = local.votes || []; + const proposals = local.proposals || []; + open.ledger = await buildLedger(thread, local); + const L = open.ledger; + detail.innerHTML = ` + +
    + ${thread.before ? `
    2021 reference imagery
    2021 · reference
    2026 post-event imagery
    27 Aug 2026 · post-event
    ` : ''} +

    ${esc(thread.title)}

    +
    ${esc(thread.place || '')}${thread.real ? ' · real event pack' : ' · your draft'}
    + ${thread.label ? `
    ${esc(thread.label)}${esc(thread.caveat)}
    ` : ''} +
    + + +
    1

    Observations

    Immutable. Each has a source, a time and a hash. Nobody edits an observation.

    +
      ${thread.observations.map(obsHtml).join('')}
    + +
    2

    Hypotheses

    Claims that connect observations. Cite, dispute or supersede — never edit.

    + ${thread.hypotheses.some((x) => x.example) ? '
    Example content These hypotheses, authors and vote counts are fictional, written to show the format. The observations above are real.
    ' : ''} +
    ${[...thread.hypotheses, ...proposals].map((x) => hypHtml(x, votes)).join('') || '

    No hypotheses yet.

    '}
    +
    + + +
    Creates a proposed hypothesis with its prompt, model and inputs in the ledger. Local simulation — no network model is called.
    +
    + +
    3

    Narrative

    A camera path through space and time that cites the strata below it.

    +
    + +
    ${thread.steps.length} stops${thread.elapsedSeconds ? ` · ${Math.round(thread.elapsedSeconds / 60)} min schematic` : ''}Flies the globe down the valley, scrubbing the time ribbon.
    +
    +
      ${thread.steps.map((s, i) => `
    1. ${String(i + 1).padStart(2, '0')}${esc(s.title)}${esc(s.phase || '')}
    2. `).join('')}
    + +
    #

    Ledger

    Every change, hash-chained with SHA-256 on this device. Anyone can export and verify it.

    +
    +
      ${L.map( + ( + e, + ) => `
    1. +
    2. `, + ).join('')}
    +

    Head ${esc(L.at(-1)?.hash.slice(0, 24) || '')}… · ${L.length} entries

    +
    `; + placeSeg(); + } + + function placeSeg(id) { + const seg = $('.strata-nav .segmented', detail); + if (!seg) return; + const btn = id + ? $(`[data-jump="${id}"]`, seg) + : $('[aria-pressed="true"]', seg); + $$('[data-jump]', seg).forEach((b) => + b.setAttribute('aria-pressed', String(b === btn)), + ); + const th = $('.seg-thumb', seg); + th.style.width = `${btn.offsetWidth}px`; + th.style.transform = `translateX(${btn.offsetLeft}px)`; + } + + async function openThread(thread) { + open = { thread }; + await renderDetail(); + detail.hidden = false; + view.classList.add('in-detail'); + view.scrollTop = 0; + if (!reducedMotion()) { + detail.animate( + [{ transform: 'translateX(100%)' }, { transform: 'none' }], + { duration: 480, easing: 'cubic-bezier(.32,1.1,.4,1)' }, + ); + list.animate( + [ + { transform: 'none', opacity: 1 }, + { transform: 'translateX(-28%)', opacity: 0.4 }, + ], + { duration: 480, easing: 'cubic-bezier(.32,1.1,.4,1)' }, + ); + } + list.hidden = true; + requestAnimationFrame(() => placeSeg()); + } + + function closeThread() { + list.hidden = false; + view.classList.remove('in-detail'); + if (!reducedMotion()) { + list.animate( + [ + { transform: 'translateX(-28%)', opacity: 0.4 }, + { transform: 'none', opacity: 1 }, + ], + { duration: 420, easing: 'cubic-bezier(.32,1.1,.4,1)' }, + ); + detail + .animate([{ transform: 'none' }, { transform: 'translateX(100%)' }], { + duration: 380, + easing: 'cubic-bezier(.4,0,.6,1)', + }) + .finished.then(() => (detail.hidden = true)); + } else detail.hidden = true; + open = null; + renderList(); + } + + function saveLocal(fn) { + const all = readLocal(LOCAL_KEY, {}); + const cur = all[open.thread.id] || { votes: [], proposals: [] }; + fn(cur); + all[open.thread.id] = cur; + writeLocal(LOCAL_KEY, all); + } + + detail.addEventListener('click', async (e) => { + if (e.target.closest('.back-btn')) return closeThread(); + const jump = e.target.closest('[data-jump]'); + if (jump) { + placeSeg(jump.dataset.jump); + const sec = $(`#st-${jump.dataset.jump}`, detail); + view.scrollTo({ + top: sec.offsetTop - 110, + behavior: reducedMotion() ? 'auto' : 'smooth', + }); + return; + } + const row = e.target.closest('.obs-row'); + if (row) { + const more = row.nextElementSibling; + more.hidden = !more.hidden; + row.setAttribute('aria-expanded', String(!more.hidden)); + return; + } + const g = e.target.closest('[data-globe]'); + if (g) { + const o = open.thread.observations.find((x) => x.id === g.dataset.globe); + if (o) onShowOnGlobe?.(open.thread, o); + return; + } + const cite = e.target.closest('[data-cite]'); + if (cite) { + const li = $(`.obs[data-o="${cite.dataset.cite}"]`, detail); + if (li) { + const more = $('.obs-more', li); + more.hidden = false; + li.scrollIntoView({ + block: 'center', + behavior: reducedMotion() ? 'auto' : 'smooth', + }); + li.classList.remove('flash'); + void li.offsetWidth; + li.classList.add('flash'); + } + return; + } + const vote = e.target.closest('[data-vote]'); + if (vote) { + const id = vote.closest('[data-h]').dataset.h; + haptic('tick'); + saveLocal((cur) => + cur.votes.push({ + id, + kind: vote.dataset.vote, + at: new Date().toISOString(), + }), + ); + await renderDetail(); + placeSeg('hyp'); + toast( + `${vote.dataset.vote === 'agree' ? 'Agreed with' : 'Disputed'} ${id} · ledger +1`, + { icon: icon('threads') }, + ); + return; + } + if (e.target.closest('.narr-play')) { + onPlay?.(open.thread); + return; + } + const led = e.target.closest('[data-led]')?.dataset.led; + if (led === 'verify') { + const t0 = performance.now(); + const r = await verifyLedger(open.ledger); + const st = $('.led-status', detail); + st.textContent = r.ok + ? `✓ ${r.n} entries linked · ${Math.round(performance.now() - t0)} ms` + : `✕ broken at #${r.at}`; + st.className = `led-status num ${r.ok ? 'ok' : 'bad'}`; + haptic(r.ok ? 'success' : 'warn'); + } else if (led === 'export') { + const blob = new Blob( + [ + JSON.stringify( + { + thread: open.thread.id, + title: open.thread.title, + exportedAt: new Date().toISOString(), + algorithm: + 'sha256(canonical({seq,at,type,actor,payloadHash,prev}))', + entries: open.ledger, + }, + null, + 2, + ), + ], + { type: 'application/json' }, + ); + const a = document.createElement('a'); + a.href = URL.createObjectURL(blob); + a.download = `${open.thread.id}.ledger.json`; + a.click(); + setTimeout(() => URL.revokeObjectURL(a.href), 2000); + toast('Ledger exported', { icon: icon('download') }); + } + const lr = e.target.closest('.led-row'); + if (lr) { + const pre = lr.nextElementSibling; + pre.hidden = !pre.hidden; + lr.setAttribute('aria-expanded', String(!pre.hidden)); + } + }); + + detail.addEventListener('submit', async (e) => { + e.preventDefault(); + const ta = $('#ai-prompt', detail); + const prompt = ta.value.trim() || ta.placeholder; + const sim = simulateRefinement(open.thread, prompt); + const n = + (readLocal(LOCAL_KEY, {})[open.thread.id]?.proposals?.length || 0) + + open.thread.hypotheses.length + + 1; + saveLocal((cur) => + cur.proposals.push({ + id: `H${n}`, + author: { kind: 'ai', handle: 'AI · local simulation' }, + at: new Date().toISOString(), + text: sim.text, + confidence: null, + cites: sim.cites, + agree: 0, + dispute: 0, + simulated: true, + prompt, + model: 'local-simulation-v0 (no network)', + inputs: sim.inputs, + }), + ); + haptic('success'); + await renderDetail(); + placeSeg('hyp'); + $(`[data-h="H${n}"]`, detail)?.scrollIntoView({ + block: 'center', + behavior: reducedMotion() ? 'auto' : 'smooth', + }); + toast(`Proposed H${n} · recorded in the ledger`, { + icon: icon('sparkles'), + }); + }); + + new ResizeObserver(() => placeSeg()).observe(view); + renderList(); + + return { + refresh: renderList, + async openById(id) { + if (!bhote) bhote = await bhoteThread(); + if (id === bhote.id) return openThread(bhote); + const rec = readLocal(DRAFTS_KEY, []).find((x) => x.id === id); + if (rec) return openThread(await draftThread(rec)); + }, + /** Start a local draft thread from a situation or contact. */ + startDraft(s) { + const drafts = readLocal(DRAFTS_KEY, []); + const id = `draft-${String(s.id).replace(/[^a-z0-9-]/gi, '')}`; + if (!drafts.some((d) => d.id === id)) + drafts.unshift({ + id, + title: s.title, + place: s.place, + lat: s.lat, + lon: s.lon, + family: s.family, + source: s.source, + createdAt: new Date().toISOString(), + snapshot: { + id: s.id, + title: s.title, + metrics: s.metrics || null, + source: s.source || null, + updatedAt: s.updatedAt || null, + lon: s.lon, + lat: s.lat, + }, + }); + writeLocal(DRAFTS_KEY, drafts.slice(0, 20)); + return id; + }, + thread: () => open?.thread || null, + bhote: async () => (bhote = bhote || (await bhoteThread())), + }; +} diff --git a/mobile/ui/timeRibbon.js b/mobile/ui/timeRibbon.js new file mode 100644 index 000000000..91d79bf55 --- /dev/null +++ b/mobile/ui/timeRibbon.js @@ -0,0 +1,412 @@ +/** + * Time ribbon: −72 h ← NOW → +120 h with momentum drag, haptic hour detents, + * event pips and a LIVE pill that snaps back. Fast drags move in hours, + * slow drags in minutes. Calls `onTime(Date | null)` (null = live). + */ + +import { h, clamp, haptic, reducedMotion } from './dom.js'; + +const HOUR = 3600e3; + +export function createTimeRibbon(parent, { getWindow, onTime }) { + const el = + h(`
    + +
    + + +
    +
    Now
    +
    `); + parent.appendChild(el); + const track = el.querySelector('.rb-track'); + const canvas = el.querySelector('canvas'); + const ctx = canvas.getContext('2d'); + const liveBtn = el.querySelector('.rb-live'); + const readB = el.querySelector('.rb-read b'); + const readS = el.querySelector('.rb-read span'); + + let win = getWindow(); + let custom = null; // { start, end, label, pips, format } + let pips = []; + let t = Date.now(); // cursor time (ms) + let live = true; + let pxPerHour = 7; + let W = 0; + let Hh = 0; + let dpr = 1; + let raf = 0; + let vel = 0; // ms per frame + let lastHour = Math.floor(t / HOUR); + let lastTick = 0; + let emitTimer = 0; + + const span = () => (custom ? custom.end - custom.start : win.end - win.start); + const start = () => (custom ? custom.start : win.start.getTime()); + const end = () => (custom ? custom.end : win.end.getTime()); + const nowMs = () => (custom ? (custom.now ?? custom.start) : Date.now()); + + function resize() { + const r = track.getBoundingClientRect(); + dpr = Math.min(2, window.devicePixelRatio || 1); + W = r.width; + Hh = r.height; + canvas.width = Math.round(W * dpr); + canvas.height = Math.round(Hh * dpr); + // Custom windows (minutes long) scale to fit ~1.6 track widths. + pxPerHour = custom ? (W * 1.6) / (span() / HOUR) : 7; + draw(); + } + + function x(ms) { + return W / 2 + ((ms - t) / HOUR) * pxPerHour; + } + + function draw() { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + ctx.clearRect(0, 0, W, Hh); + const s = start(); + const e = end(); + const n = nowMs(); + const mid = Hh / 2 + 4; + // Window body + ctx.fillStyle = 'rgba(255,255,255,0.04)'; + const xs = Math.max(0, x(s)); + const xe = Math.min(W, x(e)); + ctx.fillRect(xs, mid - 9, xe - xs, 18); + // Forecast region + if (!custom) { + const xn = x(n); + if (xn < W) { + const g = ctx.createLinearGradient(xn, 0, Math.min(W, xe), 0); + g.addColorStop(0, 'rgba(138,180,248,0.16)'); + g.addColorStop(1, 'rgba(138,180,248,0.03)'); + ctx.fillStyle = g; + ctx.fillRect( + Math.max(0, xn), + mid - 9, + Math.min(W, xe) - Math.max(0, xn), + 18, + ); + } + } + // Ticks + const stepMin = custom ? (span() / HOUR < 3 ? 5 : 15) : 60; + const step = stepMin * 60e3; + const first = Math.ceil((t - (W / 2 / pxPerHour) * HOUR) / step) * step; + const last = t + (W / 2 / pxPerHour) * HOUR; + ctx.textAlign = 'center'; + ctx.textBaseline = 'alphabetic'; + for ( + let m = Math.max(first, s - (s % step)); + m <= Math.min(last, e); + m += step + ) { + const px = x(m); + const d = new Date(m); + const major = custom + ? (m - s) % (stepMin * 4 * 60e3) === 0 + : d.getHours() === 0; + const mid6 = !custom && d.getHours() % 6 === 0; + const future = !custom && m > n; + const len = major ? 14 : mid6 ? 9 : 5; + ctx.strokeStyle = future + ? 'rgba(170,200,255,0.42)' + : major + ? 'rgba(255,255,255,0.75)' + : 'rgba(255,255,255,0.32)'; + ctx.lineWidth = major ? 1.3 : 1; + if (future) ctx.setLineDash([1.5, 2]); + ctx.beginPath(); + ctx.moveTo(px, mid - len / 2); + ctx.lineTo(px, mid + len / 2); + ctx.stroke(); + ctx.setLineDash([]); + if (major || (mid6 && pxPerHour > 4)) { + ctx.font = `${major ? 650 : 500} 9.5px ui-rounded, system-ui, sans-serif`; + ctx.fillStyle = major + ? 'rgba(255,255,255,0.8)' + : 'rgba(255,255,255,0.38)'; + const label = custom + ? custom.format(m) + : major + ? d + .toLocaleDateString(undefined, { weekday: 'short' }) + .toUpperCase() + : `${String(d.getHours()).padStart(2, '0')}`; + ctx.fillText(label, px, mid - 12); + } + } + // NOW marker + if (!custom) { + const xn = x(n); + if (xn > -10 && xn < W + 10) { + ctx.fillStyle = '#FF453A'; + ctx.beginPath(); + ctx.arc(xn, mid + 13, 2.4, 0, Math.PI * 2); + ctx.fill(); + } + } + // Event pips + for (const p of pips) { + const px = x(p.at); + if (px < -6 || px > W + 6) continue; + ctx.fillStyle = p.color || '#FFD166'; + ctx.beginPath(); + ctx.arc(px, mid, 3.4, 0, Math.PI * 2); + ctx.fill(); + ctx.strokeStyle = 'rgba(5,7,11,0.9)'; + ctx.lineWidth = 1.2; + ctx.stroke(); + } + // Edge fades + const fade = (x0, x1) => { + const g = ctx.createLinearGradient(x0, 0, x1, 0); + g.addColorStop(0, 'rgba(0,0,0,1)'); + g.addColorStop(1, 'rgba(0,0,0,0)'); + ctx.save(); + ctx.globalCompositeOperation = 'destination-out'; + ctx.fillStyle = g; + ctx.fillRect(Math.min(x0, x1), 0, Math.abs(x1 - x0), Hh); + ctx.restore(); + }; + fade(0, 26); + fade(W, W - 26); + updateReadout(); + } + + function fmtRel(ms) { + const d = ms / 60e3; + const sign = d < 0 ? '−' : '+'; + const a = Math.abs(d); + if (a < 60) return `${sign}${Math.round(a)} min`; + const hrs = Math.floor(a / 60); + const mins = Math.round(a % 60); + return `${sign}${hrs} h${mins ? ` ${mins}` : ''}`; + } + + function updateReadout() { + if (custom) { + readB.textContent = custom.format(t); + readS.textContent = custom.label || ''; + track.setAttribute( + 'aria-valuetext', + `${custom.format(t)} ${custom.label || ''}`, + ); + return; + } + if (live) { + readB.textContent = 'Now'; + readS.textContent = new Date().toLocaleTimeString(undefined, { + hour: '2-digit', + minute: '2-digit', + }); + } else { + readB.textContent = fmtRel(t - Date.now()); + readS.textContent = new Date(t).toLocaleString(undefined, { + weekday: 'short', + hour: '2-digit', + minute: '2-digit', + }); + } + track.setAttribute( + 'aria-valuetext', + live ? 'Live' : `${readB.textContent}, ${readS.textContent}`, + ); + } + + function setLive(v) { + live = v; + el.classList.toggle('is-live', v); + liveBtn.classList.toggle('is-live', v); + liveBtn.querySelector('span:last-child').textContent = v + ? 'LIVE' + : custom + ? 'RESET' + : 'LIVE'; + liveBtn.setAttribute('aria-pressed', String(v)); + } + + function emit(immediate = false) { + const fire = () => { + emitTimer = 0; + onTime(live && !custom ? null : new Date(t)); + }; + if (immediate) { + clearTimeout(emitTimer); + fire(); + } else if (!emitTimer) emitTimer = setTimeout(fire, 90); + } + + function setCursor(ms, { fromUser = false, quant = 0 } = {}) { + const s = start(); + const e = end(); + let v = ms; + if (v < s) v = s - (1 - 1 / (((s - v) / HOUR) * 0.2 + 1)) * HOUR * 2; + if (v > e) v = e + (1 - 1 / (((v - e) / HOUR) * 0.2 + 1)) * HOUR * 2; + if (quant) v = Math.round(v / quant) * quant; + t = v; + const hr = Math.floor(t / HOUR); + if (fromUser && hr !== lastHour) { + const now = performance.now(); + if (now - lastTick > 55) { + haptic('tick'); + lastTick = now; + } + lastHour = hr; + } + if (fromUser) { + const near = !custom && Math.abs(t - Date.now()) < 4 * 60e3; + setLive(near); + emit(); + } + draw(); + } + + /* ---------- drag with momentum ---------- */ + let drag = null; + track.addEventListener('pointerdown', (e) => { + track.setPointerCapture(e.pointerId); + cancelAnimationFrame(raf); + drag = { + x: e.clientX, + t0: t, + samples: [{ x: e.clientX, ts: performance.now() }], + }; + el.classList.add('scrubbing'); + }); + track.addEventListener('pointermove', (e) => { + if (!drag) return; + const dx = e.clientX - drag.x; + drag.samples.push({ x: e.clientX, ts: performance.now() }); + if (drag.samples.length > 6) drag.samples.shift(); + const a = drag.samples[0]; + const b = drag.samples[drag.samples.length - 1]; + const speed = b.ts > a.ts ? Math.abs((b.x - a.x) / (b.ts - a.ts)) : 0; // px/ms + const quant = custom ? 60e3 : speed > 0.6 ? HOUR : 5 * 60e3; + setCursor(drag.t0 - (dx / pxPerHour) * HOUR, { fromUser: true, quant }); + }); + const release = () => { + if (!drag) return; + el.classList.remove('scrubbing'); + const a = drag.samples[0]; + const b = drag.samples[drag.samples.length - 1]; + const pxPerMs = b.ts > a.ts ? (b.x - a.x) / (b.ts - a.ts) : 0; + drag = null; + vel = (-(pxPerMs * 16.7) / pxPerHour) * HOUR; + const fast = Math.abs(pxPerMs) > 0.6; + if (reducedMotion() || Math.abs(pxPerMs) < 0.05) return settle(fast); + const stepFn = () => { + vel *= 0.93; + setCursor(t + vel, { fromUser: true }); + if (Math.abs(vel) > 60e3 && t > start() && t < end()) + raf = requestAnimationFrame(stepFn); + else settle(fast); + }; + raf = requestAnimationFrame(stepFn); + }; + track.addEventListener('pointerup', release); + track.addEventListener('pointercancel', release); + + function settle(fast) { + const s = start(); + const e = end(); + const target = clamp(t, s, e); + const q = custom ? 60e3 : fast ? HOUR : 5 * 60e3; + animateTo(Math.round(target / q) * q, () => emit(true)); + } + + function animateTo(target, done) { + cancelAnimationFrame(raf); + const from = t; + const t0 = performance.now(); + const dur = reducedMotion() ? 1 : 420; + const step = () => { + const k = clamp((performance.now() - t0) / dur, 0, 1); + const e = 1 - (1 - k) ** 3; + t = from + (target - from) * e; + draw(); + if (k < 1) raf = requestAnimationFrame(step); + else done?.(); + }; + raf = requestAnimationFrame(step); + } + + function goLive() { + haptic('tick'); + if (custom) { + animateTo(custom.start, () => emit(true)); + return; + } + setLive(true); + animateTo(Date.now(), () => emit(true)); + } + liveBtn.addEventListener('click', goLive); + + track.addEventListener('keydown', (e) => { + const stepMs = custom ? 60e3 : e.shiftKey ? 6 * HOUR : HOUR; + if (e.key === 'ArrowRight') setCursor(t + stepMs, { fromUser: true }); + else if (e.key === 'ArrowLeft') setCursor(t - stepMs, { fromUser: true }); + else if (e.key === 'Home' || e.key === 'End') goLive(); + else return; + e.preventDefault(); + }); + + // Live: keep the cursor glued to now while the planet turns. + setInterval(() => { + if (live && !custom && !drag) { + t = Date.now(); + win = getWindow(); + draw(); + } + }, 15000); + + new ResizeObserver(resize).observe(track); + resize(); + setLive(true); + + return { + el, + setPips(list) { + pips = list.filter((p) => Number.isFinite(p.at)); + draw(); + }, + /** Use a custom window (e.g. a reconstruction's schematic clock). */ + setWindow(w) { + custom = w + ? { + ...w, + start: +w.start, + end: +w.end, + format: w.format || ((ms) => new Date(ms).toLocaleTimeString()), + } + : null; + el.classList.toggle('custom', !!custom); + if (custom) { + t = custom.start; + setLive(false); + } else { + win = getWindow(); + t = Date.now(); + setLive(true); + } + resize(); + }, + /** Programmatic scrub (narrative playback). */ + seek(ms) { + cancelAnimationFrame(raf); + t = ms; + draw(); + }, + goLive, + get time() { + return live && !custom ? null : new Date(t); + }, + get isLive() { + return live && !custom; + }, + get debug() { + return { t, pxPerHour, W, Hh, live, custom: !!custom }; + }, + }; +} diff --git a/mobile/ui/world.js b/mobile/ui/world.js new file mode 100644 index 000000000..cc0d7f640 --- /dev/null +++ b/mobile/ui/world.js @@ -0,0 +1,553 @@ +/** + * Card → world: the hero transition into the live globe, the situation + * brief sheet (peek / medium / large) and the fold back into the card. + */ + +import { icon, FAMILY_ICON, FAMILIES } from './icons.js'; +import { + $, + h, + esc, + ago, + fmtNum, + fmtCoord, + haptic, + toast, + store, + reducedMotion, + SPRING, + SPRING_SOFT, + EASE_OUT, + sparkPath, + esriThumb, + emitter, + safeInsets, +} from './dom.js'; +import { createSheet } from './sheet.js'; +import { isReconstruction } from './feed.js'; + +const FAM_NAME = Object.fromEntries(FAMILIES.map((f) => [f.id, f.name])); +let eventPack = null; +export async function loadEventPack() { + if (!eventPack) + eventPack = fetch('/events/bhote-koshi-2026/event.json') + .then((r) => { + if (!r.ok) throw new Error(`event pack ${r.status}`); + return r.json(); + }) + .catch((err) => { + eventPack = null; // let the next caller retry + throw err; + }); + return eventPack; +} + +export function createWorld({ + app, + stage, + globe, + getCard, + isTwoPane, + onThread, + onFollowChange, +}) { + const ev = emitter(); + let current = null; + let busy = false; + let originCard = null; + + /* ---------- chrome: back button ---------- */ + const back = h( + ``, + ); + $('#globe-chrome').appendChild(back); + back.addEventListener('click', () => close()); + + /* ---------- the brief sheet ---------- */ + const sheet = createSheet({ + host: stage, + label: 'Situation brief', + detents: ['peek', 'medium', 'large'], + dismissible: true, + closeButton: true, + className: 'brief-sheet', + heights: { + peek: () => 22 + (sheet?.head?.offsetHeight || 92) + 16 + safeBottom(), + medium: (H) => Math.round(H * 0.47), + large: (H) => Math.round(H * 0.92), + }, + }); + sheet.on('close', () => { + if (current && !closingFromCode) close({ fromSheet: true }); + }); + sheet.on('detent', (d) => { + app.dataset.sheet = d; + stage.style.setProperty('--sheet-h', `${sheet.visibleHeight()}px`); + }); + let closingFromCode = false; + + const safeBottom = () => safeInsets().bottom; + + // The world wins: start panning the globe and the sheet steps aside. + $('#globe').addEventListener( + 'pointerdown', + () => { + if (current && sheet.isOpen && sheet.detent !== 'peek') + sheet.setDetent('peek'); + }, + { capture: true, passive: true }, + ); + + // Edge-swipe back (leading edge, like a navigation pop). + let edge = null; + stage.addEventListener( + 'touchstart', + (e) => { + if (!current) return; + const t = e.touches[0]; + if (t.clientX - stage.getBoundingClientRect().left < 22) + edge = { x: t.clientX, y: t.clientY }; + }, + { passive: true }, + ); + stage.addEventListener( + 'touchmove', + (e) => { + if (!edge) return; + const t = e.touches[0]; + if (t.clientX - edge.x > 70 && Math.abs(t.clientY - edge.y) < 60) { + edge = null; + close(); + } + }, + { passive: true }, + ); + stage.addEventListener('touchend', () => (edge = null), { passive: true }); + + /* ---------- brief rendering ---------- */ + function metricHtml(m) { + const v = + typeof m.value === 'number' + ? fmtNum(m.value, m.value % 1 ? 1 : 0) + : m.value; + return `
    ${esc(v)}${m.unit ? `${esc(m.unit)}` : ''}
    ${esc(m.label)}
    `; + } + + function sparkHtml(s) { + if (!Array.isArray(s.series) || s.series.length < 3) return ''; + const W = 220; + const H = 42; + const d = sparkPath(s.series, W, H, 3); + const last = d.split(/[ML]/).filter(Boolean).pop().split(' ').map(Number); + const m = s.metrics?.[0]; + return `
    Trend${esc(m?.label || '')} · last ${s.series.length} samples
    +
    +
    ${esc(m ? fmtNum(m.value, typeof m.value === 'number' && m.value % 1 ? 1 : 0) : '')}${esc(m?.unit || '')} now
    `; + } + + function contextEvidence(s) { + const span = Math.max(0.02, (s.camera?.height || 300e3) / 111e3 / 1.6); + const frames = [ + { t: 'Region', span: span * 6 }, + { t: 'Area', span }, + { t: 'Close', span: span / 5 }, + ]; + return frames + .map( + ( + f, + i, + ) => ` + + ${i + 1}
    ${f.t} context
    Esri World Imagery · archival
    `, + ) + .join(''); + } + + async function packEvidence() { + const pack = await loadEventPack(); + const pre = `A
    Before · 16 Oct 2021
    Vantor WorldView-2
    + B
    After · 27 Aug 2026
    Vantor WorldView-3
    `; + return ( + pre + + pack.evidenceSpine + .map( + ( + e, + ) => ` + + ${e.sequence}
    ${esc(e.shortTitle || e.title)}
    ${esc(e.media?.platform || 'Source')} · ${esc(e.confidence?.time || '')}
    `, + ) + .join('') + ); + } + + function render(s) { + const followed = store.isFollowed(s.id); + const recon = isReconstruction(s); + sheet.sheet.dataset.family = s.family; + const m0 = s.metrics?.[0]; + const status = s.live + ? `Live` + : recon + ? 'Reconstruction' + : 'Stale'; + sheet.head.innerHTML = ` +
    ${icon(FAMILY_ICON[s.family] || 'now')}${esc(FAM_NAME[s.family] || s.family)}${status}·${esc(ago(s.updatedAt))}
    +

    ${esc(s.title)}

    ${m0 ? `${esc(typeof m0.value === 'number' ? fmtNum(m0.value, m0.value % 1 ? 1 : 0) : m0.value)}${esc(m0.unit || '')}` : ''}
    +
    ${esc(s.place || '')}${s.subtitle ? ` — ${esc(s.subtitle)}` : ''}
    `; + const metrics = (s.metrics || []).slice(0, 3); + const time = s.time + ? `${new Date(s.time.start).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })} → ${new Date(s.time.end).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })}` + : 'Live'; + const layers = globe.layers(); + const layerChips = (s.layers || []) + .map((id) => { + const l = layers.find((x) => x.id === id); + const fam = l?.family || id.split('.')[0]; + return `${icon(FAMILY_ICON[fam] || 'layers')}${esc(l?.name || id)}`; + }) + .join(''); + sheet.body.innerHTML = ` + ${metrics.length ? `
    ${metrics.map(metricHtml).join('')}
    ` : ''} +
    + + + + + +
    + ${sparkHtml(s)} +
    Evidence${recon ? 'sourced observations · tap for original' : 'context imagery'}
    +
    ${recon ? '
    '.repeat(4) : contextEvidence(s)}
    +
    Every number, its source and age
    + ${(s.metrics || []) + .map( + (m) => + ``, + ) + .join('')}
    ${esc(m.label)}${esc(typeof m.value === 'number' ? fmtNum(m.value, m.value % 1 ? 1 : 0) : m.value)} ${esc(m.unit || '')}${esc(m.source || s.source || '')} · ${esc(ago(m.updatedAt || s.updatedAt))}
    +
    Lenses this situation turns on
    ${layerChips || 'None'}
    +
    Details
    +
    Where
    ${esc(fmtCoord(s.lat, s.lon, 4))}
    +
    Window
    ${esc(time)}
    +
    Kind
    ${esc(s.kind || '—')}
    +
    Source
    ${esc(s.source || '—')}
    + ${s.caveat ? `
    Caveat${esc(s.caveat)}
    ` : ''}`; + if ( + recon && + (s.thread === 'bhote-koshi-2026' || s.id === 'bhote-koshi-2026') + ) { + packEvidence() + .then((html) => { + const strip = $('.evidence', sheet.body); + if (strip && current === s) strip.innerHTML = html; + return loadEventPack(); + }) + .then((pack) => { + if (current !== s || $('.caveat', sheet.body)) return; + sheet.body.insertAdjacentHTML( + 'beforeend', + `
    ${esc(pack.reconstruction.label)}${esc(pack.reconstruction.caveat)}
    `, + ); + }) + .catch((err) => console.warn(err)); + } + } + + sheet.root.addEventListener('click', async (e) => { + const act = e.target.closest('[data-act]')?.dataset.act; + if (!act || !current) return; + const s = current; + haptic('light'); + if (act === 'follow') { + const on = store.toggleFollow(s.id); + const b = e.target.closest('[data-act]'); + b.setAttribute('aria-pressed', String(on)); + b.querySelector('span').textContent = on ? 'Following' : 'Follow'; + toast(on ? `Following ${s.title}` : 'Unfollowed', { + icon: icon(on ? 'starFill' : 'star'), + }); + onFollowChange?.(s, on); + } else if (act === 'ride') { + sheet.setDetent('peek'); + const c = s.camera || {}; + await globe.flyTo({ + lon: c.lon ?? s.lon, + lat: c.lat ?? s.lat, + height: Math.max(1500, (c.height || 200e3) * 0.12), + heading: (c.heading || 0) + 25, + pitch: -18, + duration: 2.4, + }); + } else if (act === 'eye') { + const cams = globe + .contactsNear(s.lon, s.lat, 80) + .filter((c) => /cam|cctv|eye/i.test(c.kind)); + if (cams.length) { + globe.select(cams[0].id); + globe.flyTo({ lon: cams[0].lon, lat: cams[0].lat, height: 3000 }); + toast(`Nearest eye: ${cams[0].title}`); + } else toast('No public camera within 80 km', { icon: icon('video') }); + } else if (act === 'thread') { + onThread?.(s); + } else if (act === 'share') { + const url = `${location.origin}${location.pathname}#s=${encodeURIComponent(s.id)}`; + try { + if (navigator.share) + await navigator.share({ + title: s.title, + text: `${s.title} — ${s.place}`, + url, + }); + else { + await navigator.clipboard.writeText(url); + toast('Link copied', { icon: icon('share') }); + } + } catch { + /* share cancelled */ + } + } + }); + + /* ---------- hero geometry ---------- */ + function targetRect() { + return stage.getBoundingClientRect(); + } + + function heroFor(src, rect) { + const el = h( + ``, + ); + Object.assign(el.style, { + left: `${rect.left}px`, + top: `${rect.top}px`, + width: `${rect.width}px`, + height: `${rect.height}px`, + }); + const img = el.querySelector('img'); + img.src = src || ''; + document.body.appendChild(el); + return { el, img }; + } + + async function imgSize(img) { + if (!img.complete || !img.naturalWidth) { + try { + await img.decode(); + } catch { + /* ignore */ + } + } + return { w: img.naturalWidth || 480, h: img.naturalHeight || 600 }; + } + + /** Place the hero image to cover `T`, and compute the transform that makes it cover card rect `C`. */ + function coverMath(nat, T, C) { + const sf = Math.max(T.width / nat.w, T.height / nat.h); + const sc = Math.max(C.width / nat.w, C.height / nat.h); + const iw = nat.w * sf; + const ih = nat.h * sf; + const left = (T.width - iw) / 2; + const top = (T.height - ih) / 2; + const dx = C.left + C.width / 2 - (T.left + T.width / 2); + const dy = C.top + C.height / 2 - (T.top + T.height / 2); + return { iw, ih, left, top, k: sc / sf, dx, dy }; + } + + const clipFor = (T, C, r) => + `inset(${C.top - T.top}px ${T.right - C.right}px ${T.bottom - C.bottom}px ${C.left - T.left}px round ${r}px)`; + + /* ---------- open ---------- */ + async function open(s, card = null) { + if (busy) return; + if (current && current.id === s.id) return; + busy = true; + const reduce = reducedMotion(); + const wasOpen = !!current; + current = s; + ev.emit('open', s); + render(s); + globe.resume(); + const focusing = globe.focus(s); + originCard?.classList.remove('hero-source'); + originCard = card; + + const media = card?.querySelector('.card-media'); + const T = targetRect(); + if (wasOpen || !media) { + app.classList.add('is-world'); + sheet.open('medium'); + busy = false; + haptic('light'); + return; + } + const C = media.getBoundingClientRect(); + const { el, img } = heroFor( + card.querySelector('img')?.currentSrc || s.thumbnail, + T, + ); + const nat = await imgSize(img); + const g = coverMath(nat, T, C); + Object.assign(img.style, { + width: `${g.iw}px`, + height: `${g.ih}px`, + left: `${g.left}px`, + top: `${g.top}px`, + }); + card.classList.add('hero-source'); + haptic('light'); + + if (reduce) { + el.animate([{ opacity: 0 }, { opacity: 1 }], { + duration: 160, + fill: 'forwards', + }); + await wait(170); + app.classList.add('is-world'); + sheet.open('medium'); + await el.animate([{ opacity: 1 }, { opacity: 0 }], { + duration: 260, + fill: 'forwards', + }).finished; + el.remove(); + busy = false; + return; + } + + const dur = 620; + const scrim = h(''); + document.body.insertBefore(scrim, el); + scrim.animate([{ opacity: 0 }, { opacity: 1 }], { + duration: dur * 0.7, + easing: EASE_OUT, + fill: 'forwards', + }); + el.animate( + [ + { clipPath: clipFor(T, C, 18) }, + { clipPath: `inset(0px 0px 0px 0px round ${isTwoPane() ? 0 : 0}px)` }, + ], + { duration: dur, easing: SPRING_SOFT, fill: 'forwards' }, + ); + const a = img.animate( + [ + { transform: `translate(${g.dx}px, ${g.dy}px) scale(${g.k})` }, + { transform: 'translate(0,0) scale(1)' }, + ], + { duration: dur, easing: SPRING_SOFT, fill: 'forwards' }, + ); + ev.emit('progress', 'morph'); + await a.finished; + card.classList.remove('hero-source'); + // The world is behind the photo now: reveal it. + app.classList.add('is-world'); + scrim.remove(); + sheet.open('medium'); + await Promise.race([focusing, wait(250)]); + const fade = el.animate( + [ + { opacity: 1, filter: 'blur(0px)' }, + { opacity: 0, filter: 'blur(6px)' }, + ], + { duration: 520, easing: EASE_OUT, fill: 'forwards' }, + ); + await fade.finished; + el.remove(); + busy = false; + } + + /* ---------- close ---------- */ + async function close({ fromSheet = false } = {}) { + if (!current || busy) return; + busy = true; + const s = current; + const reduce = reducedMotion(); + closingFromCode = true; + if (!fromSheet) sheet.close(); + closingFromCode = false; + globe.select(null); + let card = + originCard && document.contains(originCard) ? originCard : getCard(s.id); + const T = targetRect(); + const twoPane = isTwoPane(); + if (!card || twoPane || app.dataset.tab !== 'now') { + app.classList.remove('is-world'); + card?.classList.remove('hero-source'); + current = null; + originCard = null; + busy = false; + ev.emit('close', s); + return; + } + const { el, img } = heroFor( + card.querySelector('img')?.currentSrc || s.thumbnail, + T, + ); + const nat = await imgSize(img); + const fadeIn = el.animate([{ opacity: 0 }, { opacity: 1 }], { + duration: reduce ? 160 : 260, + easing: EASE_OUT, + fill: 'forwards', + }); + await fadeIn.finished; + app.classList.remove('is-world'); + card.scrollIntoView({ block: 'nearest' }); + card.classList.add('hero-source'); + const C = card.querySelector('.card-media').getBoundingClientRect(); + const g = coverMath(nat, T, C); + Object.assign(img.style, { + width: `${g.iw}px`, + height: `${g.ih}px`, + left: `${g.left}px`, + top: `${g.top}px`, + }); + if (reduce) { + card.classList.remove('hero-source'); + await el.animate([{ opacity: 1 }, { opacity: 0 }], { + duration: 200, + fill: 'forwards', + }).finished; + } else { + const dur = 560; + el.animate( + [ + { clipPath: 'inset(0px 0px 0px 0px round 0px)' }, + { clipPath: clipFor(T, C, 18) }, + ], + { duration: dur, easing: SPRING, fill: 'forwards' }, + ); + await img.animate( + [ + { transform: 'translate(0,0) scale(1)' }, + { transform: `translate(${g.dx}px, ${g.dy}px) scale(${g.k})` }, + ], + { duration: dur, easing: SPRING, fill: 'forwards' }, + ).finished; + card.classList.remove('hero-source'); + } + el.remove(); + current = null; + originCard = null; + busy = false; + haptic('tick'); + ev.emit('close', s); + } + + const wait = (ms) => new Promise((r) => setTimeout(r, ms)); + + return { + open, + close, + sheet, + get current() { + return current; + }, + on: ev.on, + refresh() { + if (current) render(current); + }, + }; +} diff --git a/mobile/ui/you.js b/mobile/ui/you.js new file mode 100644 index 000000000..6c9dd6400 --- /dev/null +++ b/mobile/ui/you.js @@ -0,0 +1,163 @@ +/** You: captures and their seals, followed situations, holograms, settings. */ + +import { icon, FAMILY_ICON } from './icons.js'; +import { $, $$, esc, ago, haptic, store, applyMotionPref } from './dom.js'; +import { all, get } from '../capture/db.js'; +import { deviceKey } from '../capture/provenance.js'; + +export function createYou( + view, + { bindScroll, getSituations, onOpenSituation, onVerify, onCredits }, +) { + let urls = []; + view.addEventListener( + 'scroll', + () => view.classList.toggle('is-scrolled', view.scrollTop > 44), + { passive: true }, + ); + bindScroll(view); + + async function render() { + urls.forEach((u) => URL.revokeObjectURL(u)); + urls = []; + const [captures, key, sits] = await Promise.all([ + all('captures').catch(() => []), + deviceKey().catch(() => null), + getSituations().catch(() => []), + ]); + captures.sort((a, b) => b.seq - a.seq); + const followed = store.get('followed') || []; + const fol = followed + .map((id) => sits.find((s) => String(s.id) === id)) + .filter(Boolean); + const contacts = followed.filter((id) => id.startsWith('contact:')); + const thumbs = await Promise.all( + captures.slice(0, 30).map(async (c) => { + const m = await get('media', c.id).catch(() => null); + if (!m?.blob) return ''; + const u = URL.createObjectURL(m.blob); + urls.push(u); + return u; + }), + ); + const q = store.get('quality'); + const rm = store.get('reduceMotion'); + const radius = store.get('alertRadiusKm'); + view.innerHTML = ` + +

    You

    +
    ${icon('you')}
    This device + ${key ? `Signing key ${esc(key.keyId)} · P-256 · ${key.extractable ? 'extractable' : 'non-extractable'}` : 'Signing key unavailable (needs a secure context)'} + ${captures.length} sealed capture${captures.length === 1 ? '' : 's'} · ${followed.length} followed
    + +
    Captures tap to verify
    + ${ + captures.length + ? `
    ${captures + .slice(0, 30) + .map( + (c, i) => + ``, + ) + .join('')}
    ` + : `
    ${icon('seal')}
    No sealed captures yet.
    Open Capture → Witness and tap the shutter.
    ` + } + +
    Following
    + ${ + fol.length || contacts.length + ? `
    ${fol + .map( + (s) => + ``, + ) + .join( + '', + )}${contacts.map((c) => `
    ${icon('scope')}${esc(c.slice(8))}Contact
    `).join('')}
    ` + : '
    Follow a situation from its brief and it appears here and in the tab-bar accessory.
    ' + } + +
    Holograms Concept
    +
    ${icon('cube')}
    Leave something in a placePin a 3D note to a spot on Earth for people who visit with Look. Concept placeholder in this prototype.
    + +
    Settings
    +
    +
    ${icon('globe')}Globe qualityApplies on next launch
    +
    ${['auto', 'high', 'battery'].map((v) => ``).join('')}
    +
    ${icon('sparkles')}Reduce motionCross-fades instead of flights and morphs
    +
    ${['system', 'on', 'off'].map((v) => ``).join('')}
    +
    ${icon('pin')}Alert radiusSituations inside it ping you${radius.toLocaleString()} km
    +
    +
    ${icon('hand')}HapticsRibbon detents and seals only
    +
    + +
    About
    +
    + +
    ${icon('lock')}ProvenancePrototype uses WebCrypto ECDSA P-256 with a non-extractable key in IndexedDB. Native builds use the Secure Enclave and C2PA.
    +
    +

    God’s Eye mobile prototype. The window through which you see the world, and the eye through which the world sees itself.

    `; + $$('.segmented', view).forEach(placeThumb); + } + + function placeThumb(seg) { + const b = $('[aria-pressed="true"]', seg) || $('button', seg); + const th = $('.seg-thumb', seg); + if (!b || !th) return; + th.style.width = `${b.offsetWidth}px`; + th.style.transform = `translateX(${b.offsetLeft}px)`; + } + + view.addEventListener('click', async (e) => { + const cap = e.target.closest('[data-cap]'); + if (cap) { + const c = (await all('captures')).find((x) => x.id === cap.dataset.cap); + if (c) onVerify(c); + return; + } + const sit = e.target.closest('[data-sit]'); + if (sit) { + const s = (await getSituations()).find( + (x) => String(x.id) === sit.dataset.sit, + ); + if (s) onOpenSituation(s); + return; + } + const segBtn = e.target.closest('.segmented[data-set] button'); + if (segBtn) { + const seg = segBtn.parentElement; + $$('button', seg).forEach((b) => + b.setAttribute('aria-pressed', String(b === segBtn)), + ); + placeThumb(seg); + store.set(seg.dataset.set, segBtn.dataset.v); + if (seg.dataset.set === 'reduceMotion') applyMotionPref(); + haptic('tick'); + return; + } + const sw = e.target.closest('[data-switch]'); + if (sw) { + const on = sw.getAttribute('aria-checked') !== 'true'; + sw.setAttribute('aria-checked', String(on)); + store.set(sw.dataset.switch, on); + haptic('tick'); + return; + } + if (e.target.closest('[data-act="credits"]')) onCredits(); + }); + view.addEventListener('input', (e) => { + if (!e.target.matches('.slider')) return; + const v = Number(e.target.value); + e.target.style.setProperty('--p', `${((v - 25) / 1975) * 100}%`); + $('[data-radius]', view).textContent = `${v.toLocaleString()} km`; + }); + view.addEventListener('change', (e) => { + if (e.target.matches('.slider')) + store.set('alertRadiusKm', Number(e.target.value)); + }); + + new ResizeObserver(() => $$('.segmented', view).forEach(placeThumb)).observe( + view, + ); + return { render }; +} diff --git a/mobile/vision/assets/clouds.webp b/mobile/vision/assets/clouds.webp new file mode 100644 index 0000000000000000000000000000000000000000..510d3abf935dd9fe0e9d09956ac77cb17bfdff2e GIT binary patch literal 250882 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äJR`8lqgy5NMw2xbU>6^{y&9(`ruzQj zg1OwEx4F&dbW3q#f}6pzD3|}p+p*a28$h+Xrbh*5Uy)x zUvaM5pq_rfa*w#|;Nj-n7mg}Ho+}dN0!2-;-qzT=#Zg(dH5l4sW zy|JtOb{tS66^4zZgd;jKifSK-!pggvF>^0$0cSZ9 z=~^mghSW5-D4%=bsSevw71RgEZ^Um+ky8_s{43EMEWyktY47)xP-WQ`4aK^dil(=P}8|{lfR+)*?dDy(g{@ zUonEMa4XW1VOns>Gh%9pr^@-Ftt$??w93TDb<8a*7|pUFh#ic)ZTgo~y=JBZ3yueMy>UYFns$?Ge zwbbGy5*<0SYFR=Iaplp-j41uJaxWw%{%W_bUnGJg=M;IY*6V(_za+z zBBeoiuz(8jL&}OBjm3H{to2%l?17R%I0XRrx*P@NJ-e}o@N=Jtm*eH-=$n_w9Dim7 zMuf0_aATc$TOAn3G5+z8lMB2?e2W`0>yP{ujn-^EQi8oi7M}nr5pQ=P#XP=PJ3QOQ zTFPFu3-ueD%u!T34^P?qxeb<3x(zE1wj91O*5-uoah$PP?Sa{2O|3&{P0!Q`3tZUD zwdY)HSq&lYeG*(thSA4zcR>%_l)CgeK+*%oZ8??MA~wC${)fW)g=NsDuf;BB*c+Oa)mp zik1Vgx9Sk$HvXMe#AcoQ0Az8;a+=z2nHz$tC(npgt!0nE4qG3Fj;9lO4hy_K zfyd0H@TDw%Jx)N;%uxXY&UmjU27k`AD=_&If_D|iW|_B!@EySP?1mZjJbEH=OtW!dQeun0(0^o0$XM7;IB78iVxYt@BQ4Th&ZIg0jExrtLO_6b~ z!E2DAbs4p8CwVA@oS0+}AhnLRn4hsRvpy#O;%i7zS%H7l%61i>)xjBgEajHf>NQ&r zGM%p$RSivbJ?{b}v2p3~|v;ExuZ>mD)YyM@B+lIL_g~|{6%|1(7 z3K!&Y#!AdrvTEZWv-NMVzO3mxmF+gCBy?Ok-2m+1k^Z$S?sQxFJb

    tZn9wKZ{$y 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�WWP69a}5*AA| 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

    hh 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�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 S5S&5GD}u~`^Rm(I?8QIA1iy))OTxai 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 z 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%0A=5}9y(B zv!W5X4^LEqdh1Fxv4oVx**72gL}Zt z!>i7c(TdTnR_30uB!HM7CA`($X>HoRBttyu9tDFH^tuoFr|Jjv_AWG^57ifn_TJEX z#}Ozo1{^y<7oC0woMu=~spV2^e!jZ}vJ?qoX+CAW+AhMlW}LD+G7}_b#1`_e*mKqq z-V!wc0=!-%7dS!#D;p;em9Xp`Zpj}DE`3M7;{%r~A=Ro5UVT|Oa4{+*Pj6hwd>Hjm z5u}w=6%e)d73!q(>t<8XG@QHmPmRt-0KB?UOPdUh1+!vz1~X&fJv>4}&EVuyNHV40 zv}pE|M#~HXqyrR?rDVECmGrN>G3o-K+5(!k6;$el>;s~5nue+60guv_eq^QtD~uA6 zx0KC20p|zTZ32RW@t2aPjE1$5dV2YiS`s2?Wg=N}1U`AMkL|JPG7~U=xPAw~Tvexh zKIPZlrHPtq1dor9=#AI??MY^fK9?xF?f@)eLGiv<2#)xFOPy0})ib2Clkr+=K*BOv(+{NfhST5eGt z>p_!9%VKn0_Mte}tQvnvp3mUC6D({PZzzB({H^T1={i%it^er{z71$Bad-vPV`#yb%^OaTYGhsIVkTaG6y*2 zd7a{dehBVt2)?i^SE-#*;!^y-ifQZ3(CWUv=Re|ZCS9{DSwItg-2gZ|H?I2jP4@gz z{C-y9IKEEK$dh=CK*syNKa>hIKW0KQ>a^-okKeKjW>0HO*m=StSZ>rbir&k-PYa=s z`a4-1Lr-@!mO(FPX>Hoapsh-AZOi>|1El>`c*IWYt0%A zm#W)*C_Nt>O7OrQT#oxcvRVDOgt=v0hxHP8AQu@?#J&#o5zs8!S&=`v94IfkZ4cib z`#T}H1*$?VpV=(_#wp$wzUs{Cs)pMt0v2dQnD>_SAMKml`OT@1KjoQTOMRnDuzXNR_)BG`5Dtxr-gU6N!fb*0Cr@CDWn+jF*aeW%B zco1^b{m?MsW#%f{CcKe4O^+%d$f;@i5m8SQLySnHB^Lj{P7A4OyuthYZ(|Q&1Ds#B zvOcUM;a!v!&3O70c}>p~pVLnk6@P)(3HO`U4Vww+_lUv{d$LQPPX_oS3>!Yc$CDFt z{F^pqPS035fAnPIXAA1}+@QDV;_2Zw<(=bkz1TgUn9CTO6gR^72q9S`G_RZUdon9- zo2I&!Ep(^6v4MThNuAFfw#}VkNWuB}Qi{qACkgg4tjaq%ZI8ZU+X9)KZqraX;vVk! zR^2}cWY}z~XIRMQUzC$ZEPM^q?mXW8<#`5zKwIQ5L(iS|qGgfRR2*A3aDUeT zEi444-^3}AkyEG_KDAjzDV@jkwaEjkSa=ec$BmpekqUtJ@v>`P<97TtB6Vf{BK=iHO}K;3O~b z3Y_%1tq=GD{?;j>4i9r!FaFrX$|eKq%e5FONNH1+%rpS$Sa zL~jjv8pcwa63iQ1-)Sk0r-(zZo8=5UxS3obIj2udN9JI=H3JS0>4%vlVTtO{$M15N zr9E75g~nkBR=^&_hnBAqH6h;6;<^wY_h)az;&Y$Y{e3G>zYB6%EuzpMwd(gCIFh7= zEWhlOR=WR&0<5UOw+_bWi{Xhyj%fhht!@r2hRLZcM-P|l4~InV3>dtHI%%_`lesJ;uFnt+G@l#2!&YO|a z@VTIn2@;zoG1!0^LtNX$T8c$b`T#QDsE!$%c`1&OaEL{*FXhAFK5^xp1Ax>O-2vg) z)|1DBE?{|iGq@lNQ@4-3b4F=>&1e_8ETM39>6*`@51AM_Xc=Ut3zu%rp3eSK5)-u8 zLzDb;Gg+iQ3>urP&AGf4T=n5vk4hoRs7o=T7^^90tJp>=YYlU@IeIzNW zK`H(TO4fVplcg$q{rh0kGrZ0kArk%VRr(ty$;erFdj&BvMMUvvAj3f^HoOa>IE5ZD_C3X{D|l#Q zYPP@|Cxcm!I_PBIA;dt%tD735g8KK99JrI8p0#c(#s`ehOis^M3V*&ez4hSA(3t+| z@+aTatc9YMmpZ=ngI3ek-QA`=YI&`MK5RKG^7kOkWAw+hmqK>_K>DRjBxILvi`={lR z6K$?i!iI7WAK?hRhLoLioC>`*A;T}ld>XKW*$syP4%CvY75yGSDeg^PoKVl7MWU4B zNY1lu5%L!;I#+-(${}#AO;k4uv3?$2LGBSf1-)cuPK+wbiPjsV2=7JA!KnYD;!?Fo5ul z2ArpCL=rTWrM$a+2DjiQbMH#WPKy!>4=r_dFje-6o88?c4hn{|ZoSY8Ec9%Z8gWTj zF!L*gLdOf&P=PTZg?e_SQet#uX9C-%ixhxED0Y{iLLFlIlb2SbZ)g{Mf%9}Bd;qLG zuv0ypP+1&8%GAo#K>J+$-Nww9a&X&CsAa zfML$o?#k8AGt)H}HInufDoo^A(jV+lN%~g12qwaiZnIaHC|CH3(=l%rPO+i-wH8g7 zu#=JtgrZ@aVG_cWoDS$elCi>zL`W9(85H2dvsm#P zZhB+EF!pJ!mXNb~fZ2mv%N?#&`1+2^PI?Qo%4_)n$*MXw8kD$AgNgvw{QzsMZo$+6 z2>y%J*X9lq!dv-jF42$zTS4`ZP|Hakq;kA1jOAq24Bn(CNsE9Ko4mDG^>XLPFZHmW zZSZc;l87=Z9@GD=5ErwN@N^*GU`BjhiPYw1nwYsn_}@*|j>w;#YQnJHQ|o^(Ke;gtZ7rWgt-2ZjQ!@Wn_H|x+a^7Ta^|wFH z!tgbDWGxKCaKY1C%gF#RnGB5OtYeC22Q z?F$eFgJ;E}nB{)PD{euAXw)1r6QVI8(h?sUbmF!hy=TkF2ot#H?WSt(Fmw!k`Uha9 zAm5LXfC7|*Bv$`tBO(2gJk(%3_+IL9q4hBV5acKZC=?LXTMYoDFCz9l#dsSI|WD3a0&=XJNS$Arou6>U@!YaCQ_y3S!i*kp@ zl(wk7@>Ty!i!aD`8HytZ3#%*OC_;82o8-qA6_rBwd^ zSt@#KL2jTsLg<2u``%NzvKbO!YMIy9WpbG4sP=~tj-|5WnW57FcJzt;HNg-a1)K|V z%+au>xYMwhBSH8Cfp!8LJBR(yj(nZA@Fa5)GB!U`^?wM+kFod-xm(CvmnLNmTleO(>mK@Dv)AH+hR;l9&oY`Hj z8qOl{S0Phv;0zHUPY5gRjpcv?-RqzaYNwzwavct3cF(nGxqM!4fzjnQ!*^kg7*=ZQ z6?drd;}heCR~q53SPs0Hx|67%Cp`)hk#MYbW1@3j)8!!C>DZCnITur#1oQ9pC@}0001;b>#{+Q71ix z4y6aQ0XxiKlp0m@NbeObh~JkIdWzgoZO(sG30!zt_Wn$=I^ydCf+X);G=^fyNtFd| zGsc02?B;d)A`?mwo9y40{$}F^Ru=4M(%7i@S{N!_UwQNrP6D84Io4dDpTn(1IJU4O zM=xh8LiyL0nuN2BB2jneeAO!Y+wx zRDA`kwC0pn2fr*uIkH#pnLLHFYrJlh@Rnd;&f;pR0_?(+VupC;Np%#e&jC&5%*l?rn#CrA z5VE-D)5IF*6IXmfeGO^~mKd_j<^X32l7C6@{M%KO*_^eY@a$mpT)V5E*OD{%7pY5S z0vBWc(3g%@6mN zWX}TK@B$)=zX0T4x1I34z}uJ3&PYbY=&x_L`}m_`25SmW9)>3yLFR%uPL?1Q7y%xL&=8~iX3z~AH7+4 zuq^e~IrCIx3L`_cUwsYhX%ve+HEpSKTfU63k%vCjMP!&rf6^%XWB_Q z;*e;K1vv|U%~L-V``mz2#RiIR$}{L_IgAL^>LeC!tLOG`b1{FUjdfGl?ooe0TLAV@ ztaaw{SH+{wgSIZQsXnbYhY=#%EdP5KQC%>v-GUj8UF5vB|!^IP?vt16_8HM z$YqydgYPivY7r}XQpx2?ki0zM>5bXHB#C*GLi}j`3G-)x2H|5R^yo&DfkDg2JW?B( z-OLcl4NmCaAg3B}g~saIT+#K4j(QJvlV|mM00sM1aGdBo9;guTra+V$Ha^h((WJK%ESd6obq?4yG=fr*p- zoCOnz#K}e$QBF#<$nj3a;-=x?9J!y#top>w*%!6I^h6ob6!vSAc?q9Q`%R;*&RSIE zqxatHn^g5WD4dWUt-MFe2?(+uPR7t>U)nFEf`)7p0EO&AB3k$)d2y>?M(0W<+^OL) zX+|}}i)?=6i!NcQ|u#rRKYOD)SMfGv~!mR)N)w8X>ByOFMWZ>pxZLYx!h*?8W5 z`#g&Bx}0&Er(<1)$r%vbHF*x%PXMMjpC(qSxE60eH3A-g?51sbCd<*A!m6OxjsJ^? z$HUmT6a3@JSAUQrgRmbZOR1w(Ai9n1p|HI)cq@Ljy0&JUkQYLb6a*CBL&ZLfk({Sd zR;DzyZjH?=u%8d7WssW9NiWl2*i~I{pJ~z{HuuNgWHQK|NVogBP`ps7*^hT@yMHc1 z^N@oE`8{A!izknDD83ZrIYmaQ==Tipl*Tdo|L0QwiiqghvFoK!K#?Wh+I0KjoLJ)q&e`p5nnWQ|jl&&KZWULhAL52)@z&Ju}bvtc2 zxJlr((AWq^trZS&?BZMwGt+32dm}8kMtbA-N)u1yGJis*&g9Mqj$+-PJdDM92W_mV zpGg!ayov?tPBrg?zOZlqSyz6jV%8EH!To-`CDbxc;odiRBIIuuU2pO?#vjFN)ic)~ zkAxKCWVe)Ipr`~OeCBv@TruVLwxUn|SN}WR?E5sctQ^^Dr(-R%Fv!w&+Fo}!4&Q=G z_1tO^iLY4qhQ&Gsg0UcT5(4f!cqhAwce*^6INzZ$HF!61x-<~mcOwx#Z>8Sk&-86N z5xgGOiiR+|sZRpF zOdmr!MkE~c2YyM;uDTI8q?BF*ZD`%9n$;hlzpecZq%WXgDkIZ9ic+82X@{%n49aeh zAJD$Fay8HUvm4CR6~J5B?fN~ee#)mC3SI6L+;`nej39De!80Mizrb2}0lt1g)}9!J z!@Ste*>?6z01`8ym229R0P+Naj_)`QAsmBCd+(XLE4t%0#SyDZ`;`ld4h_u6}{ z`iXV^k6=cGo8F?EA)>4hZVr?4)jdZpzU!)I=t#|-FB7vrcbYlrLklObT(b z3lBPKjc#vEbMge5(4IT*&h~al8XS%9J8kwI+|1whLgNU{=PklPrc#25jtt%}KiLy{ z`>RRy9T3u8lNpUb6`?d_xRYh`SN{VXGW=5o2>XxjFcXrk zPf{;I4I1cfpj(>lpV?<_H=%tG+su?YY#>+)v2&acM7f<%oI`t9*)rtT@ox|*vL9h$ z@a<*Defack0Ya;gu3 zu70v9jzjBqeg{a&mfWlAyIMDH1;%8=cZV|&?8QA`4gY-Q%O{-UDJW{cH~Ul>_5$oY z+6HTe&;6%gTWwZ>ik-~u_?B?fqN!?3ZZ*gOEd@Cf!5Tc$;&WwPUa#s>eafK`QZ{mK zRj2K^c2eY}@(3EwR3g4CA%6}YDyuR&DH}vrKQ_L}C!f&fHreK;!LuNF(jCD~io~Po z>rN%2Q<>&csbEQvh|J}p0#=t-5veml8XySJ^;37g>vZ4ZGKxcK8J&@|7*_+$&+Km~ zcq)ncNuPQj@42?MnugN9VNlPtuobH_U=oluj4GMl4_TOYe~i+gmi4kjVUsQXnKEYN zI>9sh+V@wSn=pYVuqVVDbJb$RgpJSpI>dg9}Q9j+&Op&6STy zr4eun$ifyTW! zQS!nHDzF8Ee6@(ulgib8BTd!iWHSJ1f+Ep4s_W|UV2P=^?uz)idF!bo>cxbVYt9E# z-CMqgfgV|v<{yROB`@IjYb2R!woW|~An)k8ii}2_EvL`iR>D4(U_#b&m+aa(#mYxu1Qn42x{HDM_2}=^79pd8 zBkRfw>O{;B&(AyumLj5a!;6APeUH);P3FG6F2G}n^pTw%lijShm`M2+s`{0mXQ+>G z05;OP1;g|quYMrL4B!Uxsc;HrUp$+*73_~QwRAba5|jZI>eO)}teE%!Ye?6K%R^&e z3(^g*q2Z?ZW=%ay-#elADh$llm6jhasJjgR#QtzqAv%)>(UhQrB{yTFtLVTmFbe8e z$Wgfw3X?*cHfKNf5F74I1EGAS#%15)A3NI9)8Fs3%A{T|0WaVd+m}8+B1`tN4hKHs zO3-50W?;xdM|>*m)Q7^s9`dUU5bKLhkPgUVW^U~(@XrHNea7OJIjGE=ai%lIrUW|= zPxtgA9v0N;kh5vy)>WWw(Cjszt>s|+0kiCXmTN3ML(jA5sYIIR*wh=jRLeh!Iqy_D z8cFHmX~kKJkJRs}%-?t6Ku+)8uMA{cBAwl)=X)9(XL7eqEw_unU{VjnTg(z0jm>nUUtcrIaC!{K+whENW(Gv3`n4OSzO zn$K#3K)CxN52I-I1T1%MGLR!2uZ44}u?gl074O;Xw>ju#2+}LAs@`UH6g;#ZHys-h z_Vb4i8}Mm*Bsm+*Fl^O!i~wXDMPR*p&H0a8+f^QMB4_FiIIKLDaQj75#Zk1G8W_#E zbM>{^Er5gw0vAWpkAAiYlffSDe=SU9@kPS=oCEK;(ba9tP@y2tn9vXFStVTH+X%}< zNrvZ776CLBdOIy*Q}jC6QR+RESLx^rICP-oE{Ltb$OA@6cI`1F{-+#ndkou4vo0)H zlbgv#K)TKsHb(P$9imj-gLh%b@QG0STD)vG6s+l11nio;z$FpRBLJzKH#>>Alm*`X zQv*#uQ|-eHb#Ib_NQF)N{y%+#i?2RXFS4Y1PRiC+#se}&$@YUJ;=yPr3#4)26MJoH z1_g3KN4|cP?$jDC--9VQ(Devx&j$OqES$;XB(=ZK%$cAn7+{s}XqB`c?#c42(^bHgF!WFVXJ zQ(u(-FYfv^9UibMXt->_s$x0KU+%RHFM7`8#M_6xA^WXMT4v@-mwAXZp(LHZ(;q+V z{oC5!>R?k6t98K}^hg5UOtDOHVo?Jx)5|JY+|;SZv+p$9AiCsZxu?u8E!=@6!3kFg zMy7diqeKOD%Z~WloD5xVR(XvN>h&W&7Ta@H{4_+s(6^aQl^BEJ4zQC#gUs#)zgixH z{bO)SfHBMOh4P(OZJ7WMCADFfN&X7s0iaBQv#!K^`~KWx%I@#%EU#pydBN1(YxY1p z*I#l~E!q^Fo*I2pv=@kJ>l~k73Yp;-OLJTP!b}~b@GCU*5`oWnS2vvyfoLzwdx$fc zip#hKBj^3BTz}@gY8F5TfAVU-wSXVL_U?&Zi6^-t%rk`1xMMqR@j7xPw}oOesHw>u zsnGS{&zs+67>h&+hmFK9~y0FQlr4|6PO8s^ne!)E92JR{KP^|5lS{a4ST=wIL5wwh- z-axV7)9-o9sGtHS8vj;mIy@aZjqylDR(@V20;xsMaqk_L`C9*vBmK7tmzA%fnA75@ z!Q})sn54^)`9E&oB@qn9GU6mh8_S*wEM)a)@>`SyNs=TN-~rst;pi(aK5F#)1hQyrU*5M ztRUhH8Q+_fxkh*Z{9U@z3$vPZ4_;VkSu>)dmy+DK^cWod;vHG@*3;&&T(I&K-TFh8 zmkEA@%EAtG269$BUe6Vu6r_+lYQ%Zbrt1`XdCe{{rL?;Dar`=HD(=|-w%;Ecs zF)WXHAc@2c;?*T$i((+$R%_#|8e{9nN#25LI>T5T6D4VT`mnmHX077{3HVD)-~*BY zWk`Bxx5e#LW}z^atS-c2nHjs-?9L`KjH$Yoc``{V3{fdbxv_#Nmn73*H5~3rnVUl6 z8cQIMTT5D*P`~#BI!X6K9B$Rw8)~2IVv}TeUb0J>n2k#*@nH*Y7ZVKQiQ4C>!bEb~e#&evyK*e; zcw=w42RSn>`Gw>)%la8PT32K10C|3R@JhMmJ3YXmAPcPWN3-6cuSw9=AR@|}6BZw& ztdsyR%kdWqQ-Ded-yc_zAVLrT00000lXmAA*n>_0s2KV;4AJw&nI6HD!-j<=c9v@V zm~p|d5%%N2SOR1)F60K!dKNi46|NRyCg_-C zztcgVF97h{Y%@!!57nQ7cO1nxlKhPd8dJ;Yq10G;&J&_j*imGQn!h654?7S-!0OP;APbsUaM#{ zeriZN;K$AGE=P+NOB@Qhx&|xshE=AvLSJ_+#dci9X(+*+P0gInRD=OnrkKL{Nc zJQ;0~)-3LZT$6XDo|hE0u0a+baL_U11YmT{QYT)*NF?xs=C=+8N6Gu9yh~aY;Mq(d zSX#K~-&^rXe9)~dH!(*{Y->JQ(DuRi3 zXdlR^47&w&WBH>QQY#hzWkm^#%sOjaBK_ILXv$u{dLE-3S2?9e+?aWm*%5?!Ex*em zU1db#YP_LHiQKV(de4k5h-!JGdCdFt*U;Q+$8z+H@KRR*iR9)QC{B`^mZ=uPlppr; zG#B-_@(Uz&Rus}l|NM~McSHkq$_d8}zGDGDXi%rdvh(T6BteXkB;@EJ;0{{JcE2o~< zoGlCTpPlL;0+HA@4V{uPk`F>?Sv&f#hG;ba+HvX^ir;@k&-QKibwkvVqKHWEb@CKrJS&8s7Ak;ktp-pD&f zKT5qj;Lr;S@AB9lLCdk~TUtmha5k}Hx+q51H^60~I>uaLvzo< zpO0GK__vc&#z>;ACU#y`5KzO`yy_KA1a(-z74kcP`vlR0r)O&vw|Bul2_u!uJyM$) z3hr+sxqRF&#ba0)?|vo%#g=)_o(lUWBIh)z!<$(?ltfoI0}&1%Vgl@-N4YR#1f)wR z6$5t~w8PY4e1TBv^edVyU_&11wywk*&%vd}8lm+A71$dvodzYN4(9sW{G0ABh966~ z&owh=hnn|ggjX&NnA@+Tpf4`K?H{5=#Jk@-=BtLcI&TNshIXD+d{YFtpJ6?MJtnmO z7zc|N%~V(Rrn-|141GB3{WgMzWQfT;`A^vX>P_|9m*PgSbcU-dm5L`v@Q=XzrML_oc{2sj#We`C?KoNsn4oii;_{2 zj5385CG+#E>A~7m;k)X_O2};ZsFBqQ*i<>G( z6k)#(>($SR>ntJ9-Y&FD*w1?*pi|&O*IHV(h$n9|>#uLUkYiRcY+F|9hICgYV>a+n zGl9HOPQB3_AN;{f4z1$q#n^wl3yx7pO=!KrRF5a=wisa@1mH`Q6vdYvRk`0u$E8n- zs3ddY7Mxf5#VU)%?EjpD*o3_j0NiMTyOv$UHT$u-7Oy#jLg5?`w7T7P858LAOUAHW zB=c4skNH5VaSeMNN{y!OX$WTKwolSTfpHQo?%6IoW9pU$#bh-DNbw`8${hi3)y?xp|n>91jZNX@0~D zyIHtIJbY}GJaf%_2DX}%lE?~AOAG0kV%Q{-eOySTksfmAsf^zQ(lUaH>&JXwnv|>d zs)C?kPH4kxX%vi)d>K&pxoUgxJ^4@9N=g6i=LYe8yxm)PcrlwQzWK+Mr7Oh^TwCc0 zq1IK3dfu#o_IfRo;(y6LYBsX@C30ljty$qbkVK*N;XRv1t-2cQEHeccp3@l!^f2@~ zEBV1WtSHcQ17Gexi4p=n*@Wg@j~gl zLop2SHWdkjT(2t%y51irbx+5L8B{j2yCsji`8cnECn@;`g@B7%#`%|jkR`OXG9541 zUvU-ewab+h>61`BeIEd~uqb>u^ILb3YnW$q1#Z5A{d z3b3#l#fS&6KREJE8|Sd?x#!Dw)hsO`IYZ|H*g4d~KC6!%FZAoOuRSQ;4P)peyezqk zTO1-DHlNb;FeZWlKJg#GHwI5)<$&B!#FFfUphieDC($a-9S!LZ@{zQ=L1>mCm*mTG zk4&^BAq-YhzHay8|588&S;jECI>p0bGQ0kyD+S6(A`>r?XBce*Z2jZ_HtmGy-{f25 zgK)$&0&8nb*#oBYNH6YZN!stcx#x3lECeG7k+-@zE6S?Ba{SEzQ<6U6Hqz>(`nr^# zu$}CXJq=}r++2tTBvQMpEwYIbkVJ>q$B0r{f#2P=?JppT^Ia@S-@YMuk^*o8R=ynW zOviel;y@B|V^F*ThG=)#CtH?gnMoH{2=5m`@t_;VTmZ}y<47yIYRd*e#YqweBqO5nn} z>r32Q#8!u!ISqtna?Mgz4E}TJMqM+?WiyWOn8G=w1~@ik1}NGx1)m1KZet17w>dy1 zs)+`CT>0%j3tvQ#HE|YWkM#H=t(ijL>{sfuao0gpq#N@x^abo-!P<&Ts)dR*Dt*m( z%9^3@nSo)j$Hm{n-rI0fC>2;M{HUW~y5@)+=hI8{@9WRr$eH3x8dtcjVWnrSG# zt+8*u2YUn;sjmPoVIHcoZD~&JBv8QC{IbT)s};yMG*HEjX&4D+)q|_ave*XS*Y2x&>B19`Rl-Oyfi`rR@wZJFq{3x+=yNTL|InBsGdH^G zd;eyor{$LhReqb7mvz=4zYb5Ml3?qA;=`9Lt%s&l1E9A1ymw-Pir84^Knr;k(Ss$b}d8Z4*>6RE!FS#Mmoy9}kNDv~B{x z`t7fZEL+$Qb|pnwKCwXNun{!!U70Eo z?Tqx8VGEV3O5+sVP-vwi+p6y(Auavs`mvus#dM97N?d2lt1T+ZAsOJ{Rh*=tSybG= zb7qlJH4?qCjepu2{InTb;JIgW0#ZT9CuH9hEM#6mDOuc&PqgDK2IZu~*8|taS44=vX(&l(;$P1!5hk=%zi76T?P(VzRgXF zW5>uMbDJ}dXXHqWQi3<=f6`$whBq|Ld!t;(L64p!@WgXNluX0vw zdf1mH!Ie)gRcF?)2|a_Lvb65g-=HqdQ)D?!PGpaxr}VxpFpbJ}B!Ps|SKIN5uB^Yt z>Z%;xd{Jd9qBPjTiObtl{#%;kbR24N*g)Q{@Kg=(HHl|LTo3EOzMb^3(g=@a zM-*o%i6JibIRj|W$L7?8xA1@=Tt2kA<&~dnehI#_mFcmYBzN;b`5UnDR5?k#VU05& z2G|?AwFq)}E*b`8Iz3wL8P_`0`hs~7MB2-wAIb^$Kw!S;^>UcjfPC&Qonpt(tFB5s zupJWVGvuT-dpByw zbN92%UnWY@uK8`{2=qK3j|{JD*qaPt$%EBrw&umE7>jw7_(%EReiWf_hKBzdm>VZs zdru<2wtT%5JJf;z3--&alKJc|lcwZN<}lb;WWLDeaHG-C+K=bVN1MzcP=Of^wRc%T zMidT1F1A*!{0w;Z?JNl)fVD&^Vsi;$xdMFZ`-Fa`uDrwWG&4?iy)0Nq#3ol<7nyE{ z5M&Qx#<|%=JRrxH)z;0%NQ&u>2@qOjN@cd$usxFsx7iG10!QC69V-6@yrPsL)!)d_3KQY)WqB4a$VM0k<4;hkVOQO}&>r-3?D#hIKvsa-W^8A;pc&N&npVAhfHn^N zybbk5PdSJu=^8t20lK;vPW$h?8n&Cj!M}9&N=rgf?Gw!eHa>#=n0zVh?w?i%GVC!{ z>>#_c|I`7WPw`r}@~d0F%Iwkc;XSF=wg>o9;|n}_f&!k2qPI)OK!()4G&y`jksK_i ziD?Y31w;LYge5bLHjE`glV|Kwnrl2bbZAWv%ffHZ%kzR=`ZGY1D})(=1od;@x9iyS zcF6LZZ21cs&H0_dS3OB=PAB3mDQ_{!A#d3ds`_eBlMOzDP$9k+ooSXfx)U}lJn!qC z)5d+o6bC-h^0P_(Wp9AFac)?~H1iN?AD*RM07#ue6;nj^tS)QdkxfK?zmjG!sykxGWBqQ1E`h zO%qW~{}XXoH2{V!!NsAhVz>E@`p!47#ud>#8&s@`bW}4eCcFqKQCOCYy$sP~PViU$ zA;&BN94JJ2Y*Z~4z!CQPNuaUCS#92{2Bb}m1A+V=L?lmq5E0^R@|`6p-?(X7a!^I z^dEm1pk!=oMhq7!?3|dcB#DnK{BPN_kT0a=UUfJVgRH?uET2-$$;_IL>pMz8%SP?oYOMUvJP|&L8kD;GHEO=& z#c!@9^!F+*bLt+{vjwln$71#$gaZ-+nt=1y4C^PjR9h))VhylLbW_Gvp;kZ#^#q>T z^9n#M?f^}~NX1LYKyA(0Ga9T}#+m_5KQ#B?D6(r1$J9n^IH{50;FX)Qe4y> z#KZL9P;~X`$#>!A%+2X@fC({tq<*5_sC9@&wb3-GxA<2bw6a42vHxkXnoV)xd=#0n ziEJTk3|EjVBRD%44-9wwuz^z~fK#A2_GbW?X-tp2Oa=(TzA!_Me^8(m$K(S`C#Q#j zJ{TT%p6BJ20#;S=hr8a&%b7zuI-F2|kPaQ7n>#xm=R0e|&8il6V%Qckrk|vFGIi*| zdGt3}2qTgsCXI}LgnpgfKoK~9C@FyWbCA9hdU})D>cz?geb45BGuF}jD{}evP2R8yl5qp`APrTR0Zk`{$A_B@6!SnzDsttI6ENlK9oB(KYhERCHPA{Ay z4B7X34(@h2U)cK1lO>^vBCVsKSzHrZ9=gXVy3LB@VXS2iTjem;!V$ zj%+}5Xy zt%hp4FFyLB>JDJ^%@^?=g-!tB4+Z%)t! zY6qk`h6gy5w^uc(+;#MHZ2e}gXp2B-Obm2Dc?Y}hHJDi5C#R^7QiRk@+c^txv$ms2=wq0;po@M3`(;AsZiVy7@HT20|itQ8rt{kJy*<$I<>4XxT1w zpm6qSG@PS0L%kWd=IU`{R1H@;{EcZq9O;l4D@;3$5~W9Yq+pN`Y1XfE+Y4)9bW|Cq z!vs7-m%Py8PrHp0!;$hysh3yqSN@?e#<--k*^FMr0`YNqzO(t;@;|UW4!?Wn3I%9V;IO-xiF+Lb=doh{a?2 zt*GYlwX~sxQDalC25c`?GYqH1g#{I1H4ve@7xnyp$KdcuV*$YY0+XK)s1R>kSLE8d89BG z{YQ@XABZmF-*eQu;_FXr#gRJ0lKw^8We$dW+9ykGk7+x|A8X|zawK2?MGSyu$O&sf zgj$5nl-_60i^ILLy+|YPW%uMgXG_?qH_z<^s^t^UWdl;RDvw*L_ooRqCG_oIvR0>J<|!2w}&J_KgM@9&Y3B}q4K5DDq92ZMxl9C27U%c8CKk-I|< zBlIM>va17GR(CTySTX_}5s2`R0wS1sq@#g>>kUqU(?qVX0e-MZ0C<1^02N75C#hc< zIALtW2a14Az874dMB$kW{(WW=`EoWlSQO*@TmTgq+R?2bY>ZwDiP=8inmD}_a6MXp z&cWGQRPInAWq2V+te&FaHvJJfV;`u0bB(eM`8>h}1C4j1zQo?QSlFg{<6ozKtO3m(Rk-Z3Q1qozBhY>d z7qg4Wa#W@uxUP8+k1gs-JTm5=J7myH!S#wrLFrrA;qUIotUBKr2LA@L!1Y;9awd4lxTR3LIdA zzpcV%w_?!pHArY`YUhEXFM=|4yb<~j=(!rjx8+zi1C3m0m4bfCpG35b88lYU%O9|L zr!+qYcDxW-no1^oAC{{h2M0(aaYKs_92hKwrAV{x;5D^q3iLiHeD3vW`Fl$5itSy)}zFxv__q zoj!|Cmem+7G0X5N7^RayKcHj{r*TgPYILpu99-1MsfAotB-q$MA8t9Q3HOcrPg?~ z_NJ<^CY zJM6YhvTFw(+zh_K`LKIbOxei)n_yx&^omQm`-D4+1yPo{{k9F7>H-{pg8tBxFg$wR~0uQ{}_PMQZd#qEeh> zR0no>R?S$9zcON4Szy~HzoA8LCGfPbZ*cx}*j$j|N%P$In1BSQf5PUTjK@6R&uy03 z58k$aN!TCL(9_HT*aT?0F;8dFt)r>PHT9?{bUE-eFb)UCLK4K`Q&~rbndLW(g~9%= zMebwW@g!#klIFnqNAQ}z#?{_ti};Iit)pMbM~r(?Zh4Fkze67Uu?s6d(k>!{13}zbTT1%ys7-}3Y1cUnUE#me;Sm#J@;4i93&3Fj{d_r2abi9`$|72{ln{%h zq-r>$7Duwm>>Ve~tO10{1p4Qmn%)-^ttUHh;~|x_209Q&NJtq|=?&WS z=#fhem$v$;sPW>}I7Tmhqj(oM^;fMMfztj|Z_OW)QR8L{TnWoZ*vmYutF#sh;qJ!W zv5C`_hJr2c?7^Lc5D~^nN=tyb0dy|^x$w*>m&+cN=2Vk7*oSCBB$k|@v>ILV9{`5M zXyUnRv&=fmmd>Fls4_t-ZfVcFq}qcEU@{cn+G(&`|c$|1EIv8R(fEjj&Ll>^1pZJpk>x1U^Az zzc?!SFb~nr--3n2>4r(+VdgZ$y!if5Epc7CdT+ACppyWXzp1Avdjtur_P4JTpadIN z4{wkNNoYv5G%}8Vq|KVS79aat$&l>YB|9^e7ZCkkfL{r*a^;?3S`_?v(%9Fhej{=tus;vymc^1%_S)H*|}N5 zolfko55TUtFQIe^`Lrm0s4;9#V^r!6-{M9+`Blv$30uazIoBlB9rd7e|YGMoLez#`DJRLwhOe(7l8mf~FB(pk!?AK-mE?X2X!XhDE}oK_8j_=fnQgN0nMF6WAx z;Z>~(3xp4!FpgOG5nVTc6r>~rN7h3_!q4xa^{aX!C9)ooNK#hZYrZehLk^I`TOaxKh7a8n(T5ri1)xwGY)x*Vtmss{l$2)p6~qvpeZYGHoq%eCO=Q#rI7a_RLLq z{}}Pojw-m{xQoMrtG!St=JUIBMF*1%<#$uW99vrvjJCCPr6f=9fOewS=n>xDO4))K7h+MW`T2w56J4@75WS60GGp1Z2xrzTNj%l^4l%uji>(5nFh{b%R zYB}F>0sY|X)Uu;3uiY)k*KbOA25xBso9#0nyT3tbK!M-?v55D71CG->t*M0c-J4wjtla(QnTz`?>5lxk^5+gM0Y!2H&xBpabx01!>O2l&b`jZMI8o&BWkMxN$qMUnA1GoS!KBwy_0Q8g^JxNidXBypOECDmW zP~mg{9ebq!0016wdh!A&CMM2}j<4&-|E7o@EwRSYeez=>}!0^U5)p_m8i@{<67BmL5Br93{XS* zM6>ftL8obs<6<<8xgiPp%!x-L?&c>$NTF(K~b6_t_n!cI&X|nQy}Ny zNtRw=Uf;$kv@fl}Y zrRu9FAI>6q*8T44XttRw#P9Ohw4-L6aJC;G2BgBtGroVRr)i&jsnc>M8e`X$Q+wjCX65xYnhtk!2G@;|s? z3E^q2ur+@B=&az;-^`5Nhd_Ay?f?ckH3SflcMra&v$eQJ@=jw~{nS{iGQpPE-#h6t zzHB}PY2wj9afw!UkeUf%3CI>v4+F)~v24ToAJdD!jVp>tNF2T6m;Y@!oZmX~HepWnh;8gtH=E3@ulqnN2_+1Qb_cL}3?svye z7$<;sKzcPu#e?_6s)q1pm?+Q%8jw-yTIM2MB-=yydx?w3S#qWAZn z@#^U_>}=2gv~~O$x$OjYG!GHM(-~LFZ{>RBwqzH#(A0By-^XDM7_}{L-Aud0%MNlX z{lI%S&~4#<7CjooreK`pU!Q8j0ynBvi{)|2P<+H#R^t43?XLf{ePYDu%@ zg{EfHvPp$IvA~mHWn4fMv9>|2mM8O4$^;%REbGTTRp~kuM+kTbHR_27efmoimC zlDk*lm>qCrbWEHUak(3_D6814sN98==&j0`qX{T9DL0SaEt(yw{Ky6%ycfA|oVP_a z0ZrxQ9M*qYtxf!`TU{8rp<(Obf=vM73q?V>Wa72io7 zy_tmw6G4nntmWr%P_-}M zp;g~ozb9YqR9_pJG2P;1O^xSmsJCJ*9X2ROC@qe7w8`7V!8SNn0uHpOB&}H#@(0@r ztg8D|@fkEh7fhIE{Sihmd#-(tMrqxfU|c+BjLDg1xX+E4A5o{3W}#oB#(zWQjUwz4VNB zN^jAJ1U;C}VsyprBC7?S78W6}Mhq)0PGnPoyHrdwm%=otM3Z#t&k|X8b&22nJ?-hO zCvH-HM%65`A-Y4V6B16DLLKx7B-a*YhX}$E{$qd?;^A{J$jF&k<}=qU$J>>e?xFC2 z2Kgn{*~G(Ca4i*3CTZ1iIW)Dy*Ai%(P}7vDijjCanez5=%$`ertuE*o7ZFy^h4yZz8zECNBkP17Qk5IQj(#F3f>y5u$VjIxa0!o^Xs zx{2M(IWp7DfyDH9JfIt9gRI=2|0k07*`J25UJymE03h1s$Ln;xq#m8+Nm$5Rp4=^F zrbOK4NVkUSUNJz{axjr2r+{WAZSk3A-p^zseFC{UNyL;O49h! zDezu`i;i*3@q4*UPuj0ZjRSpG0y>@t{e3JNIy)L=v|%@a%(i!+GU45v=p0FszZptA z^75MF5cHi$vI=E!2=B9-TM6CCJ*yS(lv?scx$w4srLO7R8$NK<-Cug#{L?}Rtm4Yc z*DWP=6u&%rXwB2f;4(@H_y$JZqVly|3*XN>wqqkJ`LXoA z%dBp|S5hkuSaCG*orf3LHt zA@6_k6mK@ZpY&o>^9W2Yo1$48xyH{o^~QjE*E!2h6Mm2YNSU5lXS&t0Fk2C_CqiaK zXh5=f1NCHX3aFJ>9zD0RL9ki=3>MPG(~m7unV{H09SR_Q_tQpSf){MTqBfEoqxDc# z+tS!5z}3DvKjIdwrk0*>1Kf!gV2cL!?y3EUc1P|DihtQR2`0>E?rf!V>5v_ai|&Xg zdMzJB9IZV{=_q0>CaK`NgcsAQMGQgThup2$Ow6PHt#gcZ?(qMsEbvI^~8!%c$A8;U%PBUY)VIS;_8CvomCNGzs3s+HdYOSi@V*R9Cd%3Z9Bw+#=h zd{mQxY)!fbJ5OWU!TeVKA$YkZM@FXn3Cv=Odq^=7_+0+mur$*ob?_dL7aj~H$Q_&| ze}sZVsOUaci*HGPIaNg}6fFVTg0q-Wl)M+tB+ym8wDD5v^{rAJGM96BfIx3Uv(kOI z8UzDhh?hWi2nV{9BDApl8;h%#n`OSsz*cGAJKvcAB{E)HbHyMb7uhCnqQFw5lh?=q z003gg!dw()t=t?xdDw^SXu$`(U~0iM;c5!bNn6wQlX!+tkev=*zn;g95MS{L_=nli zB}~us_RS**-<^{xgC;UO{%1@Z9hZ+?Y6h`=^8ES0PV0`;>egIA%Q#tE-BetuPxsmT zmF_&MMNj|$0D7{c;1{$7*Xr#+P~QODd23QEF+#2P3N6ouD@eFCY%y@i^{>Z3^F%$y z@@X`{TfNYcG%(S|zh_Z`Lcp2y`E8mw+2R460fFPI$v*DSyynpOXv;e~?;@bE1%2SO z+jwy6Qz|b;T!xx>Rbwk?2`E%FXnP)Dk1WI(I{24dljfxD-;E0&M!>vnH8M|RLBpU`&6 zt8EbXw{1wDr|eTTd8`eX6xwUWrG6`H7Y%IZsXeKk+nX1h8>}#oo}>oik!=vR_4cpm z<~|N40Hrsr8iMzS&Oz{?yv6FXRi53utB)sxhmwbe!)~ljr092;*(5%_ZF%^4Cg{MX z#vQ4$H$z>`J^81?Dn}S}mMgR4yBvqeT=LeZvcZI?v42H)So)HI3dqDlBX+7&QELE% zZS*X?iTSn_Av_7{X1W2ZMH03gAC9ygRtq(p*dH?x(gi@;+&2nyjf2coC56j21EBev zh~5eRA?*svozDel{ag+bIXumC<4!#6?`uOy*$$M?~=% zi69BJbRs^pa9AX;Q+60%KesYmPvIAAsFEOYe6^j8Y!FPEc!qs}Z87nJSswL~qi+uT zl`BMOfXq%(vIZIQ**FLM=Kh^ZtW`CM8@&)klKIIiZa0>cF)!juL+4o3r6q72@*G%Y zj4A$YV@31^Vt|+PxhP`N2HY-#sGP*J{yosZu4vH^vJ-o92@($OMQ*9RJYhCXv8k^4 zH~KI=aEK2D|MCIfiK~KX#jRps)Bcx!W$g^P2l*m8wUoGm2*T66cMK4<|ChZ3aJY9H zhC6J-qt`hooA`_xgO6`G<;50NQjU;8c@}*MUy$_#zL4pA<&qMUAi0S2 z$R1MPV2n^ZV^MnU+lcCCL{v_1tb~hv{YZCr4&*eTBX0e&!7Z2)jp1osq{CZZXUMQa zNK-(RClAXys~nmi@U$TrdozXXb0T&E{2)v2k{sZtK2=j6>Y^Q(*5j5Bu+eCW&}=+z zEbshfO0sv0!)sXPJz%pv|LACv1=7|rsAa_aHoL*q*q0Kcw(EVsfdQTlyy|`IAEz5~-4aC<`&5j4Wk;|Zfn0!E6f%dkCpMm25 z1et64lV1y-`ws7nM2@_Pw|AG7WIhlZO5d}E& z3%TcICNVhE=2~axKFNIODzM6d8V*Uj-iMvL?qVsD#{sm^oimwWR7=Vl0QQ6k&ef<> zzq_gP{{V8kVBvzVAHuH3XT_{gW0qpqzOGiz0IorQc?5M0g{A1lc#$K@1D^lbAK1CH zZl6gmRu_J;;tFhSp%tJxsEW50f2S z47Vo1X~=2t2K5p8ua?1)q&bv43w}i+KWRTI>ej_2(UZcv;Ue$hF=nVtjuvtGYj~Wf zAM4YzfJl(lrJjuO(1SWJK}wS#?-*~ac?tW~=z7s}I`=L^Y5Nv+M34vEtZ#cLSfK951}HC#R1172zZ@1Xd#1~5`w>SX_&IeE<66F}2m5(V zn5u3k^<}l10(55T$H&%tQRGdB?Bb2c+)StN@wbrJmOro^1hyS`4o@D(kNjplWCVFy z7bgK@|B5N!&`?NXBN?y}tXd+sp!D0+uafZHQZjCZ(B@`+Hmn__SElir+_NM{AH1B^ zg;_yeOn8S>HpNz=0BHI9z=nV2NkG3u=lDB1dN5;M&$9m>Jes28A@EqeIV5}|Lnuzz zzH6A3+YA@eYzDN0y#%ae{K@q+NcMH`tYgpod-Ujy7)S3C zPuemFIr=C`u{rWl!Rt~#rUD264MOJ5DswML05D<#bg220jt)c~wPvOX2caT_V)Yr~ zG5M(LucVF>miHW;^nP5)!vM)`z&FfJH_e%bqxFSQuIGEi0xfEe;oyDQ;PW_EZ z3x@iibu2Ny^ z0RyE?ivZ`+O@u>xy5=A)P-~(HnwB74&x#J;M_Cu-Jr|kqqZEVakCJ6wBeSXotbcn4 z8xk9Fixs0<=-2UnT~pdqVhk~^h)VO-%ez4_MWTwDRNycvr>ce9*0ESam(?YNQ}@- zI@&&{R(4w`M(>?+81&9kA30m_q)ZkyoH3vP+NORqmd^8O?tM2xtv#Fo>E0}0v><&= zH4o<6Y$PZHnv17qg|T+ol;rwEoe)<>Cw;Ewb7pBp6ZKpYsLnY(}!Q0aCd+Ky5h@XG4% zxViZ2oJ+~beodyD-(MAf<1zXQ`7KeCL0S>+9DVTSfXa-N-Og;cQVR!e#2U6n>bhvb*@^| zc05hi=A1pI9q<4Z20&)mgaGC8Ut1K<>_qVE$;jhbmM*+O%*!dUgnvm{9S!UgOwYAs z|DWa8Gy&n`MKaUKNT-F;v@9u_KF8XKci5vlzUTBG4a}oOMD+7A^$oX0GnX$y`n<+a z4z#%sNR%@{B{?vebsMB6t)9okI(PoL3`y9h;P1pl7> z1)63MxjFim3*UNdv7qhe&_ZW?3gZB4h7v8N4sLPNtZQ2QO z-S@G3FB?z;D*Qi>I2@}m-)PvNTKnvji^uIjkHC0VHNmh4a0tp-044?q%v zayW7ztEs&i%JIe`yC0;>p7-3CM5Kzml<4)Be+`^YyGkk5_vJOU?*6x7L(YF}r)9!T zCTbiIty6w?1XduB)pYhNz;I)H8;o7#Za-!kh>u%{72znSVnLNH=}0XY5*_&qi*tXL zWv0wEx9hA(Zn|ioz!;nIjH2{C3OG%`oCUij|3`UkI@-{tN~uHZubt%dl{5U-dl^ee zXcHfIRzlvZ(f5PK2gkQAEeKbuIkkIjEal3HK{-__##gGP(sop^gL&Oq6+k*XNqz7R zFgy-KY)fA1eah5NY)vtO%cg5WC&WfrbW9;UJ*Ko4FYraF+Z$+nSgTij_0Kp<^ZyFl z)&=;GKQ5czyQZL!L5P73Cm(i(xN`~DHs*a z+l>GhHzFEs)C%BMqp*@+$!d$|YhZ9kLo@LlxEKSl9<=QV02%=D0V??>trsN;e+EMT zsa}m|1Va_Z%?!CFOr>g+p)D_1}4+9ao3 z@(SNZ$4m4Ul)f5JL42f)pxOkL?<3C+s1RB>?hBlgjWeHMA&7ZSoQQa%VG2If!OSa;*{XQ|pCA`)MefY4 zAW~!Up{|;4vD&s;_|^@XeRG-_eUm~o*j5iMERpCZ9Yu9|J(kB9zDy$uge5bCr}-ti z%Fn+_(a?usW4ruI1R^vq62Q^3Fj|FKl%87pX>HU0GAiO#y|0$%@j!ia#~qlyWpQhs zpH-LLyK}UgBNQ=E#P}-A_z<~TeC5N?3HFzhhOzg4%s@K(CA*-!KKIYXMS{AYEeJ6h z)*LX4{J`;ZzVfV%9|1SW2DurHEP>VyGA`y-6Gl>Wau7SPMU<;`tpt_F6}W47v{8|# zDI79p=wuVF@BO7EbIGzhnvd2Ebk7Hmz5Ss+)kIm{KOY(x_gkT5?|bp3J2MR3Kk}>c z{cvDw5T-dy5Q)y3H)7-dfb!mTLOcJx|M^H!xgx&csHaUg#s@@uJmr#KSMe>MITfMQ z*R>ckPd=CN4t%7A+uK*?bl)32Km5_)({S5>mf9Z~Fh*t{=9Bq&Jg{rwA)Scfr~75> zcQ>h-VYHBCBg((&Eywp6@{;k_oE7|hcA0dLrWk!08{vF7HKQv6K9e4-) za|Fx26-ZL#0eVdh&vk#mHg%gnx1KpnOaVDLz2w_deuW|SFV_g-sENYdkZ93novD!! z#n{|)tSLe`ptg8(3{#Tlh`(%C(HpI>2$QAT(HgCsRPOd2YmA2rl^HJ)$+h zoSvg6Rk78LO7r&wc0rtvexD6OvLN)^?;+tU>^x>n$!ww1q0;;##XpU2 z_ZspQ&$nF*AH&Zc&Gr4IyZ0#`u8DRn8@+JNyM8F*vRzFxbVglcT2TqpMs)?>r+8gY zBz%?xs%;oLQ0XS`!zB8!ET}lEkWL!kXe-X)%O%L1tPCtg#DiSj72H{VMNaBu$z#4g$z+ zxQu_5MC6PfM#w^1D07{Ohvw}+UN7&|1BOzQe^W$4*8VA9dY*a0Phw{`xv2N?LUT+7 z=hT_0xQKF@f#smkl@Ak1zJhZ#%IN?wrOnP;4`i|4GKhrBF=VZQWRh*ttgU=}-Sd6L)~>5&aq zFnW3iQZ3ie$nJ4m?Vgd6K<1*h$o*a2gpRm!H^DHi-yPPE7k3OE^F@9M!Fl94tTWez z<^E+^!!=n-DJ?*PCmk~UMBif6W`JPyUd>p<->DCm8_ti&ZlZ#s> zjFF#b1@787XoKzGPe#?Ucmis6;2DM@DYeCMyQil?fnFv(#Ot4Dgfh3^y8IhvdZwCH zJ_;l?nof_l)1I@v3k>G#H)cO{{(2Nt)9{{T{R|h`Dx92re#QVAwwG>M|6=z<#G#f{ z{_XZfN5!Gx)vD`ip29YHU|dYnp{~=my;O)kSt%Ar)XH6=isbh^ z7%i`t#$Uo>a22{_BCi{wwapWIqqNk3t+UPcO9IBWwAL7PxZnIn6_i>kj7cAFolwQk zRGyZ(?cdRoG!@qL;+7ti4JU0Tqr z?lK+nBRAN#;QulRR$BSI1F6oLy1^x%ODjHdaUZq1`XC_XD~*Ypkl}(^*(f#a^|$d^ zxmo*z&ej1X@=?-o#?lD2N(SaH6S|fhrK_jlVp^r%WVV@c4ml37tKF&}RXseIo0GQ+ zb<55|pG?C86g#SxQ{mWOiDE?hp0R!E&oS_G;gf$n1 zP#XLjr26@><;b!{l#dzuUc8nohUXZO24t|IBcU0tIPQPJTxrST)O*U1Y#mqYKT^u8 z`~5o6TvnxynlPZkpbGD|e*mr-KWwdfCz@3TXg{YvqzdMJf( z?Y@xaY?oHTtr8{vVjA$Sa2GWVp@B7-B5o#})d^gux7eLNi5hLxW$e~GE3+&vNBGW! zQ&+)$b+1j-z*g-R#AZgoIFt^##?m^!^<+D9p~!Muf&W+X(6X|;-a|fUkgLx;To||U zwMIx{NvqUD&zU}+#K8v~mG02BZe(}tiXaunP;8>1IKo{lnJbA$!cuYvN%t`L#wUb($X!M-|{GJWu!s0$-Ney_04vr?- z!q_;ueR@(|Y|2i3;)Fcjtvfs1P{TcwKWDjM^WDv0NWJ{F#tStM7mc}JGILKo= zj3ePg#OHEl*dkkO%XHn}c3oL4Sx;`X?IH7bRB7#4EWU0Px_F&MAW#)JBoX^4j2ue0 zNH^=%=3*}a$7@88{Bq~0r2&bOtG|RL_O)&PHBc~+EK%Ll)`B(-ujS%!dQ#7dx9URD z!+t4r{KT|}w{9zYu|tFn|0$zIMPUz@M-mBrYx_cCnoQPLf<*IL7T+uPee_58^{Nd1gPtSV%5P} zIVpj=w-q#Wg6MxFy^qVy0p9y!uHlO?YvjF^7pa6G?`}Z+8W(hm`Rv*LdEJa>Nv{>Q zbLWqO%;9PT(2se{4`mQRMdSDRTb((pMy;#!@jVao?{~<_mB6|+XtLcjqQr@045UVD zY}udJQK|<YK%~Ix zj?VK|Tqtqzr2y&v*~>ApYF>xO+;@fr%DCBl<}e&X^2jBB!6MENO$^5 z-9g{x|JhqU8K8l6MbFj4LQG!Sr0?nn*9%m@< z(OJ;v1(?dih1=I7LJGWdUQO82i#W^) zGqMH1h!ABP27s#0Xif&ab2}=zWg?e`551iy7$aUSs$4YM62|^rG7No#p)CUZ0~=JY zwC*N8K{^Lt_p5HZ6k=C+$P)X;i>^F?y_nN|r|tK;eMR&;mwW1 zbzs*@GV59iRI#N-OuF1dtvLK$m5l+@(Q3uX6LQ@0^6^$BUADu8XF0s5*rU9x(5?5G zc=6g@fl~mXz&&8m@^>5yCIJy%;MMcHoWRs~&w&2zuZ!i7dPT+?|7RG+PdeykkGhEq378opiY5*USzNU z02)B7uT^}m`BZw_-gH+Ahm$ZaFBF=Dk2=AJ3dMi(AB7B5n|-`q>}?&E*x9iRa~t$_ z7K+?^*%i=Ay|alBZ?~nGE(&?i*I)zR!Js%BDAEj5r3X3lYKITLz@^2x5Z1-wcUAi< zQ-{^YDcK!1Z%3Ba#@6}~sl(lPrmR~>XXMlW0^0xJj%^~RWfb{qj|SIJPCGD~Wt`F$ zfQHPv6qx5r21F)QjaXyE3(_3-T@WQJaql;iM_|!pcTceIZPcU|1JQwg=T8RjAov-e zDLC?7d8IFbNxf-&r!B#}Klnc%yEL-9>xXbH%$)ATVRavJc=bCBr~IL!RR3LYKo@+6 zOa)Qe&4rY}kQ=ngK`n#~{XQxP+nt!(1xMsFXSN{#+h3%GsryAKBv%3ZyL7uOAI39P z_hg8Lt+G$bJ+wO|cC%Y6&`P}iT5w|@x1H(|cK2yW(4>TlK>h|pu`VQdbo2#byy7(} zKXi6L$}tAXDL#S4RylG2RyJc{1p4LvASfSM;wnx#N{OR|tQrF1Q;MEPsw)ui@7X=3 zgX4M(={{EbKca`{`NSpiH&MlRWaiG!^+qM8Q9`gAgF7|f zp7aGwv3C5f7z>A%*Or;89PiU zjBKKZweWbtghQSv+^_!Atx@%|RbW|X+i(yq(d7rS4v)}$gbA-I=62b88cexw=2gV% zm;S3wn7{AkG&prUf=1Xz@N@bH-!~@*#(u-5Fv(9ROjObf`x)-*F*>zwwh~cRQO84> zh$HHJ>Q!DXdXhnR(Y9(|J3Rb9c5vyr6q&^jX)APhPR0~`Qn5QHcB%IEkEK5S+DDk2DjUgWBSlQRas z17FS>f2Ew3-=GEfklM2BeIAi{OwB|igzP-ekw!6LN6o`_ z0y=z~>p=M<3(Kkm<-VGb`#dyd%J+T`n)I)m7htTG?cL(yirLgE6u&!yzQ4M4Dc#Md zxth#c!{*P?I*A&Nw{M8$WDF9@dl(F@nN$WsC>}9>QrD~&*FzGlw1>of6`DR#U5cx3 zQL?2hAN2lY^Sl3x7AKQsYf61gu)=PAP4JXr7Y!ABHT&$F8*xQ)bY{^+B*%$?>o)o< zm!#V{y6BCDMA1|}vuo-}pk(9Or3CJ5-V_nhKI^$_JinLv96**aEi{8uvvE`yT{`W* z)>|fH9rZQ0rQYeY9-oaFT?BDaJD-o~1)%-t5*QiI&w~vQUw=q_8ZS-5UqXZlz zHSK9cD!LwKaQ4;I7-4gFDHL`zVw*2(-MfKRch2IA9{9~nN(Q|E?$qbhj~@%>`u*io z38LbxY=_&EsrGKHWbXJL*CWqWcB~0@Qd}m(1&8(4=Bc9NhQc_g_n`C>J@;w4YqxAm z7G+^i2}R|Rp|OOr0kB7{J;7?;ompk_pad827H#Dd5^(7fQ}>IzQckUzPXYaA2*BrA`D z`Fju}BmmG?kruOHJlOPr1FwUU6bDzt70j73fI6>6SB{jvX&*idcsEQC3MvZ83SqPA%*N22pVa&TF&OEdd0EJ>j56d(|Q z@qkOt-U3*AuW67v4!x1DqM~|(!&iBP03FKeL6-);3%kYXTH@4;z2Zlhon{IayVwE{ zvg3L}ltlUKdT=I14K_}{0#%d+eoiNDh15oePOg#OEUy?gXP_lxX1%}59A)hh&?U1m zkJ6V*NHo)hhmIjFy{pg}qZMaQOF;TdI4r&*Nn}))bhQAIczkgkSZ3yxR&l_gMi9V= zUGk#RMy9rcr@s5TNlX7Zm<8iGzUtznQ=qSwx#IuA&&#S%E*?3Yp6gI9h8avp$$(wI z=$dhzCmkd9QS4}D6u&=3X1YwM`;PztF#p<;4D&F3URPDJGc-y-B#xuy$723b)LbN5 zl9SBZSuyU4*R-vLR#8=9aucZz_J!=l@TwGB?vWDVXJtaL1*G)drEzdc7DFm}^No1Y zpXdPn)cl@ITIN)xe;6g7$Q8~i_SwQsYV&v$sKE0EMk}gKq~#GR)*A33{nolW5F~E6 zG{4(j(Ngc5Fw)|%1Z}@GVj$zOG?oeQu#yiQ%h}+R&3PX-R+kfDp27J%J!L2=0MjN& zhQB5$cH)S^R@$TcsH7#kY{qB6F;Uw-a_~GtcUs%7!3aR%cW>CEA5G5wUYr=M;KX^Q zUg93uq{Zohx5au{#p`<<7-FVu;30icFH!~9BLYN zqsulo=1kMw5LXugmIhz@bs_9SjjsUC;rqjb4cotFMp>(7w$!(V5@P0H-hjP$Hvcd22tUm&O>;B^)l@$gD)MnwN5%Wh>vMZ#TTdhl0 zM6h^iIzF&VK;}pqq6Yiv~Ky|{x|_6Ug=C*xQCrIq>^({_$0aG0`2utL0lPL0+xGH;znWrI8TQmvVX zI^a}mPc2a)x)Fdv+piNeu-!n#g}*&4!Ita{>S7 zgkipx=$>B{9UUEr4^gQ?=P&zo^fj?~v0$3%rQAD=0#(u^2J842R-(Nn*Eg2BmX_9L zsOD*BTMsPE#H@to^pP1r(ss#b%mndMGz|8s>|t}nTEb)zijw1SIrpU1wXl41)0K`7 zya;V(Vd2-XVo1p0#M${Y_6d<=&M zuWLk?4Von9U~gDAK(Xv!@>HMY%hQh z0W*bX$KBb+X-eZv*&`lNo_r6-yw?K_T*y9g6)D9q2@DvST`uZOq3;usi35{ z6kTEO2HgHn!ou9!%QjMB#kXJX8iCbyjG;+oEL;|?@~|zL(l#Rx6Ph`51-xHSrNvl& z20qZ6A*I-u78B@R9p1}fL~0&0*b^}acXDWwEbZoftDXkX(Dz&MPpq%t){diX9tLS;m<^$JEqe6L88sNCf)Dt3K)$-JM-i?WFTW{uO2rrigpZU`Vc z@aIkn!%l984cJ+T+3L@r{QR)?8&n!64u2V>V(Y_VDc%|+aM~Y5-I9-CndR`YYGQKp zdjpvubmQIJaZTnS_+W%D=3;w8QPXaKU`K$aOOCsIqAOPCw)NI8P8RK1z%lKQ0tSKF zEU2Hmwg(8aGt7@$6A(g6%&x25_5J&uy+^+YooRHO+>rmwMO$F(fmUXYXEK-7~r~zbDH2e&P3Wm-yZN7tU93wX{IIo^2z|^yt|6NLFc17<#zeb%&Crj z0aM9Ri8OV`QZYI1*JwE++S9M2$-|fE%L4jk0?53pxhegE{Q8}Quts=?WI0Ln^l%);gFC0ShyVa`3sJ;<9t*HX(-MHa!FMbdBs)6uS{v5o z3^`SgtD^1}y&}fhzwhflEh;bCY)2WXufn92Uw`x)eGx(gDsb)E3(Y$V*hm=mna4Fv z4`gIIU%N^U`1?53b-c|}QbjK848ZuDIAt{;uCuCM;(MuR>UuhDd0z}rCRPV?gG!+N z;*Ua8zK9jomqd|fFqi()vHsoq64IHP=*%C^;>xm?sIRV_LahIl0{A)N*7M!+Zh7F~ z`P+C}eO5?l9o7((4F4kQGxjvL2C`@FCaRk7z{8<@T|HBqKhUf?o947J z7hRpMB4u##xrSmJovj#|jr)$UYr0;HMCrd_i*FiQg${cntk$NkVs!kU z?t)eW1#o+}!iQY|f+z`QE{Sd5RjHa{Yq4%Xg=zJN2>$^C3tS%j5deW1_^zyhN>X(n z1UK6`Wzi#ll>N7BLT8I+pi+KHd}uI!NCld=00Av;SPmevCQQvD z6J|l-de}$uEEPmgDH>?MoEM@e6-Ouii*`18fByfl+2zGoFlPxfP-E^Tpn1J+BQ^m4 zKc=TQB1q_{{oK)(QFc_$NT8AvzQhYno~|wiR7CGjM_9h%5x7nG z@lFcJJ1yJSU7pnx*&!r89bJ*Z6w7G#Y~o3AbhPsP(obKSc^sA{2DXCg)&4H;`Lb?> zOj_vv%&S8)t8CoYHn81<58-{RuJx(vJg)UQEON=5PlDD$7WWZg9tPN1;%9CI3UZ)i z!{>g9XTSsf-(J^0IltOCY{V$`?PUBDSz+tDdI|}^FZrK4wBaWO+lTWtD&iG8_$O&4A$sts3MsZCaE@ zgNzOA>D;){;${spX)w5c@43*{TPR|HO43nq)yaz<7J%yZ-E+XKG8Mx|pTt7t?KF`U z_^u82omnX2uLLr1jDckc3VEUSGX-?+GZyK=?x_Cq2caSVf2=lg>sO~vAgh)DMF~~v z1p6_;Fvwd>3>D9`4jJD>V7!l{;W>Pqm^iP?l}@#z^|K^d%uov(#qyZ^#+YoBnbbt5 zI|Zn}QuMcn&Qds#z|~lTinE6&Wk{)j(YkJ%SYaMs>~{7qNU`$>#GLSFB6$Py)t&eN z{4SO+7CW-X5{`Mft~E+S2x@)sawEdeK*#?XxFwLKUa8&VKL^X5fVMh948OA@sysV2 z@RS0-Xtxns`>9Y1H8%jOwGO88%r_#Q&1B&w>qR#{Be&a+YMSSkQhrQ7%M+hdIX&+xfE=2b&w}ZOWzbd5ME?;9R>U(;Gqv zDud8Y97i{?Zp@}r;2vMD0b1+3RYMOckgxzsK()WHsDA3gedaQ>_EBit{a*tY~iV%!w_xZiMy_ zvUZ*X9;TkXwa+o>1|TKc3{eLOWaiB|lf{?4p%y6~*^W^AYhHEVlLaO4O=N03j|B0izSHF$al$#kt=ShmowZ_3XH5rcOg zpjQE{u40MVWyu!Vuo~a3Fc~IjbN4?B+OTrGm$XP)Bic;4bQ~IkP2wUTr78-6CW1ag zn#JvtlBt=E{dn|3k_dnuJ zU?gBc27X^jWvj0^eT!5iQlikYVAtl^u3QxADYm{oRAO~ZmMaZ|+kE{Ox^|3AH zSKd}Cs~b9`^6GkB#_R*j*$IwQ8R0d#6tvn(zhKVT>sKJQXzuNeqP1ly8SqFi*(_oo zm#uM)9|TrMKbva0h@9RVjG|jEuVjM01qaJS|4W~xQnj7dp$0(*1Yz}mQGO<0+DgOw zB;J@zZ8b4eUveq2QX<`nPNPs4%{F#F+==)J000B`vGOfCR$2T7$%hj& zDWuU9nFk&4h@^|OEe2Rduona#AQSD-#~FqV2t=<*&3PTT#wgXK?cUa8-^ut-f8f)t zMOB{1sDANyyet6mOhH~C3-Yb(aK-}cE4P_i@DbK}09BP$G;j$600oMG1O#lQ@6r7- z8!70OA2J~D5M!c3N^h8-ut5$pW_ga=)Rnsvf#&+YGNkomK@WLoPaU?pf{>&+Y)Lq} zK*>2)P&D)bIhybwHd$g@8KqThwU*ls1izyR2PFKxzJwIbD1s2^L!jVY*mo@p3C~X? zzlkxP0^`jdoYg-7o)I4ez#u%L&L_5%&o5 zSFqOt9hJ)?e*1%}+U~h-aYHF%5A^nzvU~eD968 zH2T^jqV7;p=%S9bPbqqcxp)5xm#Ts|Bt+7+heLr2`q(Rx;q2bYjF=Q&DaQ%U4R>Af-7;wUBRlW987-1JQi}R z@7!$Y;UB91MBj_G5$QW-2 z^S>SRawX=RT~-b!V@lSA*SqUMUVZBpS9sr?(6c}C#irxH_)(&$Zo*aSf@zOPavaCu z|D5ts(00A-IkCR9c7_kbeOhp>jHaU)Gy1XpEG=kkYm#;VQR9CwYhz0;Dij(T^5?=D zAkfqH)FhFKlmGzf3U^QBH_a3NF?bQwT?1t5USEX-t;B|(u>?b|P{bIh*=E^dS%Ng68Gh5wFCf1m$AY)D{S@HkBB+(*0Bw@N=L*TG#jb=lyJo_D&$N z%Hc`CKPZ`Fw}W6)ARU}#3jbNSfbtmNdJ6+pQDwuOSNyMx4Y)?(6j>k-Fjk^GohuKH zG|&PH0%R7P#lz9G92L#1<_nV~^zr8RndV~^<^M)|&X#~kj&(6q;ewg7_*KqKCVbO@ z=524E%`4N(b^B3`PI{nZ+sPJb)MyUHWi%LE_97BBD6_dsw|k$HtK9}D5+{H%2?++VnT%rFRm)L!xhy}DoZ>*6eVLNWO&$yxu=X6KlpM)Q*fSAd0mNH0&M^A6r4?v#+m zEyt~k*t=Dz5qz^PBs$zUNS5o&;PQwSY8hR7$2n4=tY*?A24S8H5R zt<9r;GlAKu|21Pjj<(F_Tx?k{JOO6t5`755o zwX`G$*&l#1FjyZ6mesFH>^>m_?1Jjn(g@aQ_)B(+1U#93{hBJ5c2;{ynLt2S3OLFY zgP=O{cuYxcCsW{?%3!*>;5D)CLIBU{tQgDA@x0Abg62{l$>auGH1s6J1;`d$psN7p z9#9yL(|)F)V_4apg2iVq8{n2!6V)d7BIee)OF0wnVCjDhjb-26r5!^;-;Zv1KO~@k zC(KpFjEeKrU=qwwH-dO=K>4FZ8dXP?i7Z+m~ znPDQCV*u@GDeMICT#G=rNO1wH>qBOn#Ea;ZI>m?`Xn5UN<1@72@^06Zxz#!(fvv^T zW$sl6bGwsY?fIn)TQQT0XgCPau$h7p_ZFx!r!=+qH*PkL`;1|Sc&;{C>UAJaDCfp< zO`>^`S{`jh*(m@y>k(Dat5+y}=b6JG2&bHC%UzMTMR#6g^FaUrMDimPmCAma zUMf!i??o3Z%h@H^T6W947_MdkW~@F|^U;vE`v4oT040b8U`%ezb>W=jmg)x%)8VnTk@thg^;7Z>>xO?MgswZdcK0kh(@!3)?ZZebqlb=Gt2boYpgdX$mCjl8nZpJ^}5beZE4i{e*) zBnPY9`GyOi6pCjlI@LB7Q*7ItVTV?@*A%^_wuJURX@cF=N@Xl=#`y+OWtq|44AaQ5 zOh_)>GCYUdq%mJMGA27y)LJ9z;8l3PcEV~7jFJGtl`Xm_DV~!uo=9jOLmx1F<%n%< z=Na9sf;G;XKuo(x5VRKo{ZR?eD1lA9kYYF?EZ~^)M z9Gl+6Cp7HK2R`N&svqv&ocuwd99@sKvoSmF>aa{t*0b}tcq`Mu8b(~+aqpR-_16iM zRK0a5bQG(QRLfgxMk-z`l)fd4O2_!z!Ic2md~A5={tc`OQboGJU7{`RxXa7zqR4$)AF90z;QB)(VLOBY4R{9m zIFHX82-NW$x)rR9ulv+JNEGnNml+2FYqfiGMOITmDDAoeBY69lg@*}=o%PZp_K29I zU%~Fy&Z?~hIFJ4WW9Rf)I1}&O#F`~};?2~&X5reU&?Sil<40~yBUOGmu}jGXy#u?2v=;P0_R`c?5PUvOu1Y4&fgP4wD-QUvH56|*=X z7!e8%KJ&avQrsX!J;2S0{SxvkGA%R}R~}a>zs>bpqgH3*pw|(H%mYEr~*XX4`t@^gHaoxET$PBVFJunTN;B{$bc7C<4m@BF6Xoaigq`3J1zQm zx+`PeX$bTmB{ml*EOsJszzJ;zPr^L?@R7ZClf(+nHHcjm*~*t^e-2W_%RKg+-REnh z?7=sqEQWDh=_UyMdvScJxEG{C@ZJsHU6;vppy8p+0 z;XkkenXe|?h&UGCJ`n%}=mo4YLR3{&t4@;3;d4?fYmCrU+9W$Ct65M*}tW+Ha1&h>e;2gzyQ#CoJW}VDi#1B*?JKieTJBs)DK?A$pdUJ#L`~57c?eb zy58cWpdt8P%hV%;8MzWgRB%Q8CQkrm&vqyEmmJtMq)GKjYBtvkmkS$NV_rj+Eb&Ry zIAF^-BdxgKi$k+IwuPRzYgKbnQWJ}%!|Y53stxABXG~OH1~=YG9l)6@s-_j0Z!G(@+EOXSl8>A ziNF_;Yw0oQ{jU&N^>6@5W%+1_BWv%c!Fm7n&j=I=?(_)%`L=WBM_CNW;$^rXdbg!? z>2^}1bA=1ig$oF3=lQsq)g?^dgBT1#XP}ga;;vy5LlMdLFz`>fQIh3dvN83tV3bae z{jLR|0Z@=s0j-z>M+DsOFP%;~uO*h`5rYHezGfa_h9DlmA#xpR)ACRo2+O)g!#NtcJfBlFe|O;rw*4?|Z~( zEn6tdLkt)?IzI1QExcA>SUxfeniqRgBj6aH>nDC8Y*{+3%2v&_8}r!W!On{g*tK(c zpB};xkG3-S!>#bEtz5nWEbwuhWSqW zd@WeaVS3I;v0&PB)9hFX5F*Fq4!RdJIT$7T0G;4I$DtaeGwtvXufdQ|ZNPd)22BG! zFrQg*LWp}};(Z8iRXKn}kz?6z!)bW^dccBH-BX4&bW-qQ_3YCMQ646p%{y&|krjkz zZdcz;oKkXpw35A;Goouz=(Ew_npRtWDTVXC9FQX4ryo#_OS7jgD}M+6z+_*JxOd8p zf!pX9rFi}HNZjo6GeM(~EYGatCK~$MtHhZ$p+ybOGUcvsFn*(lA8fM#^fVpLXRxOGTzN6|!mlWkourjHfxCOw}u+vLjQYkc(98X@VWd z8ByiG>m153iR2*X~`&(}0{2bJyn)tPe%{I^93YCcvDl0vkV=Qyac6LF(C zF5r9dc6q^1L!_BL z+UZD$Nh~$%+1Ws)OQ98dTCvLD-)+^blsHHWvDcFct&l{q6@`tAPOYUL6BboeN7K=W z>jDhHi!3j(){vq7-+I3?xCYf$NK_`;25`+EZXsEf-kjt1P{eskWtH4n4uiU!D8;u? zLiX*(eV1o#-8$aYzZfg4!h&twwzy2oZxV-+lnfaJScCuy^mQJE%+u5aG2sA|GxPJu zd$T*orN!DQHyd@4Ep@RejuLzTtOu<}<>j$x&OD{CM^aN3Td3MvTrX*vHm?*`CuzVr zaO3~-1S^}uGt@RD2)02^Vre#y(n%&3+Tqd1xrKeeX$3!kG*M+M{O#l51=i?F<6VyG zRkEFp=SX9j@2&2Pvx*b4!sJ=DKn!=TTa^0i6Sy0(;(%Ig#y?{Q+&uN&!SCt}_OP*G zk|o{)?kul0Pp)^>&~uu{{#3)5)3b%?a%(EYlw7rP_XVf4Ht#&&7g{!Ed_d+H zazDoPD|<-|Ua#}nusr{wvRFl{NRQ1p(K!VfwgLZlvAZ1V2_*E|f3$As**cVeaG|FQ zIH)obA%N%}bi4RMA64x{9}+B6_=OW6B^8(McEJ~i1Puo4c5%`_y*#%_o8tb8W@8CR zH}c(Rr-(M3oJfOKkaIWwWKbVr`}d|^n`gXe%-F$1ZXtMn#Rw{PB95qbn-o6YUrf6n zVwX)U<1+@j-$FCdmynd_61bFJCFPqMX4R-$CWh) zUvRzS`-Wr9eSN$K{tOQQUGUc;hE;q$!{k`g6SuQ%AY}6y0CGz&4rVTyfjIRC!&6`` z7VOwmc0~ZA`C0#JZ_S^h=(_b(>Uv};-0)exgw7eFEJV{~A2(L$M^(B;nJD!Pt-PvOsrit*`ZEdW>#VL@&(8=HvU%@M#jvSj{hvAvr|0~kJz=1; zW*~0-n}o}d!_0T5jn?w-|6Fn{;2)k9|L~52xFK(oO+La=-2a4u!0*W!^2pnsm+qW; z^_CaUI=fTdwP8P43Xh#8!Tdl65-c@(Re1w?-zDTx8T%2clBG_VKWJK{_rA1sMYfkV zYKgb+ftu-{z+JwBpKQWcIopZNwVns>x?rCN0|R7B#Y7EK|lPes6ZhhUxj znUJ^X$60p?geC*~aOxXbC>PC+LM(E#GE^bKuj69P#? z|GIA@`Obd&xWO25-eok7+`diXR?bVSKJr2oG1d$OyZ~NW$AnHPk&;<)WINI=`r?>S z7mwWX*$CVLU&y(GOls+14eouZjPy=NRq7!g@QSDYK$0K|6c-6jiVZnr2x570plYZ6^0)!0A7E zP<(O>HT>HT0_aIpmDD>+wThcREN_IkaZp$QHm7IuIhv|Nb6ej+0C!~S{>cBbhVeX8 z$O@Oae+ud|ipTo~H9OwnkyMagCM8T+ejIVAzVhjYb>Jb!LhB+ z6Vv#XD6Y(nSZA3w8JhP67>}{-`^e|sJlFXwSmIhSEAh@U(=xH}r6h6Vx~e0|zMOd! z>I`*`<>XB+gV1;KgQ&>`Z%UxdW~XQUt+~=c;dmX0F0e0VZ?^oTkT2A`4P$C%8vj9= z*;?_N`D}C|X(>s-EVT7WF&IpJzN}h1_)Hf#zuLO^>X=B=m(PJB;1hW}hINXos?KCk z9WZyhI?5^p2q?_-gB52u9HYAJmctPg0@;z{r7q>Cnjan}m8-q3{21WEf=pZ6^y_N_ z1!y&b_AyS9@{BkRqv%O%F2{q7jPH{*iQmHuLlf1g@W~>$&W&z^=H1%CDU1|f&_!i? z%RN2}EqoEr>Ko+((-HFwl<&e;l-8%(3=mE%gHRSL&NTtRnph@mD83BVF|y1mZ)4J} zHjP856m*PJ8_!0$w4fSEHdp+lTUYQ$5NL18 z{OI1?iS8HAs#Wc2h+YfO)ld&GubD6`@PIRx`-%$8Rw`X?t(hYA|3Yt&1{g-!XJ*Xx zqK8iM-!rSKy~Es@73CzZNpo~{*TVtuhvpm$Rw%$+!i_9Zmca4VdEC_Z9G95zTP`}0 z_}Y%-;Fs=ggLH06)O1uH7a{~g^f~Y%(^uA0uEjmAz2Su>7)C@dcN;)>?bM-^@h8 z{byBW;bzMLi$_GX3((({sA-}1i36BgIDb3Q&b#)9m&UJeurJ)}kzLV{352~jU_DYb z*7d5gN3%f`0BG z<-ZMVe~a&*)FMhx$v`P)T3BjLlt(`B@ohy!UUTHb3;U42DSx{~oq1WF;<3A0P)ZnR zQdr`4iK-n7L@#NWo4sKHzltHxWo*e!eoU$+1q<~tHem!J2EewKXqe=Nv%dSrr`Ov= zuI+)U6&ORuvPs~Ti5^I}TE@YKvR%N2>_DkNUP;i1E7CJYN>?gzC9@xdnmCi;NiXruZ1Qt)LG;-sM-~~%zuoriJHaA;x5mpT) zdNnPSh?JWY!>x*5Gkav%I%=Yca?{9OEmVqg^p#dGt1%$?xL}i;Tx)G>`j+gLkak`*Qn9bF+kD} zcOHT%JneW`FT)$u78a#j`Ns52OVw6_lZ@yTOzv+0$l~9cBmAl12mAZccf}1ze3B4 zBnEQcDoXeZ>A}GMZ_^w&Xl0Hlr`FY9=n{auK`@ ztiaOP)hj3ZByvrme{6rL7k(m1HWF`SB;lUl>XVmY>;sN%2M`PBi zPTx9@ju@KeQl>Xsn)!YGmQ{?HUlauifgRyD9FIMPP}hOZ=hO9p!>)aR1R(Fbv1Ndh zBxlk4JGc25BF>Hwo{sJ!?nF!>gOAV0c@%#Wq6Hw&zi+AmNF0$j0W5k&o24)u+QhYF zA4l#fvA8NSR=w;1`^)nz?St_`HA_)mR0l{J)!Tnl3BhT?gYzX|Vb10)&K&qI5{#@# zGlvc1wGHWYWorVFGK||0=m5aE#hh+u1@N`b;|jpR9Q9!A=;~HCINFi-{Pc%BH3I(H zz;!K+&;ri>nM%|ZTc%)~+q1`n;2JBE9M){p2*;DVpR@FlTS zFY})aZK2WRZ6OzYN{NFO2i)D+XLqe5cnVzLu{0*w99Vk2(G{rJzTft>AT-mg65|QU z_Tahmxr=&?1Ocnusdv_whp9*p`?Zv=>eDfRu=;-DYp*v8gVu>x%4IU!Skx6Z7#G?- zMf>%+A9~dm_ok&EZOIRTuix^nvE=O16wtPQ*G2Kn0tzWzLrU7*`WSimk91R&`PGpeN z!jm9Kt^IDC)f^ihXv{sOAl!N0)cyJFUwUsR21{yX1Z+XEPWBp(6rt__L2;uBXbx36 zfMV7~77E^N#xsnsF(p5pf7$8isUi_Jb`{UZr~o(f(8&VG++M0wG(ku^^_UqbYkKMi zb>8UFu8aZ>3Gu7*UUFsE9bFR@V;B;)GL=i$)-APc$brd0cQ=bMORR!+tVGTYSK-pQ za&jgI563t`>`)&L`58eET|D*Owv1{O{K6HA0Zi41fhN8SHazs;X}DgPn4$T40r!zv zz*79Qm8oAUbb>ILX%QUWLeWy7&m{*l!XnIs#EvQs?Yfs|uB>?{z#*LAM2bRe+?jZ6 zqA}SpIlw%jCFdgEkFG5gh&cKxA6KreO6Je;--cZA=7mB0dGRI{2%myW?a-C>Vd@e{ zVwQuev7CFo{DT*yU%o{~j8#NZSTdgQ5xDFrDaFtOvHT-=>XQ%z$L9h6gLq&AWA!4A+KgHLFP6lnUf zE;vG6`~fm1j{YXY4?*S*{f$xG1@fUnJ|A(jFAV4@_4?hNj~L}i8?0w2G}VfPNCPJc zZ1&)y>xI}P$%rSP$#Hr~WR>Z3K)uMo5c;9#w&00ozNDRWbI$o=eM&P>^tH*NYCGTn zJUTbK&NS^z#sfKrhj_F;41^RWzbYv zFM|BJY{%0bKhr%CPA?+sT3%%k4jt@JqASR|jKU)neFQ9+Ed08+K<#McEpqQ&^e*_h z1APdWMZV#EI|o}#QCE52zOr1zVge|=FhMbBpt(_DF(d6JSH=0kx}Ha%_MtluJ=RZn zV&nwT%QzZzxjsm`mMW-KqZC}w`*>iP*Jbn*78;fA6C;7$7Fy(ogCQaZ@GQWxxYPSo5?M-d6GEj}D|UMZHi6k=Xfo{OM|BOZL( zEpoWwS!)W`wyD`#N~n3=$Xq7-BAsu4_2XL$ z9y`n~bZ~dFJ&zr`E2zKG2{`8iwOJzb9F5z5+pKki;Hhcl^0bcP7^2gq2^2wX(1*V7 zjO?hJE_jqVn8OEOL|nF3#SHo*f=AjSY7mX;?xKCaqZr`Y&aG@XJY&{T=@mmx0UXyw*F}lv0v%byV;4<0^6-b&OGRC+=xn*#Lc$hKu8 z(kCc6=kgAIWB;+T&>m@>pX7=pYO^$U=$V165F+~{;qK&dtRW-uE)h4>&i`ENx`IT* zU-_*}>${$GXhAWw{GmGzyjz1`GJ)5htZ zgrmg0CCPf;b6J(Mg1BDQy$QgJOhPe04B_Rdwy&!mb+o3@9;jVN)SP9f!n z&0AYL<7TI&CqW2!Zg(!tPqLh|34SodL(GT}cz7Wa&Mnx`mu_vSDB97{qqbJsFO?Wa%%U{7b^w z2*W3_E&TO`;B_x%C93+YW_eWU-}E0f|@X zZo^zHo?ldc+EmG6wsQEfBa?}DKJCS~W5jkUws-Gk^5m+HdspkJHxRz1R?ypbpLl{D zwB@S-84Y8>5SFLb4yCApqbKUy!+>E?ynm6@l^|{tt9A739ET}p>;g)>*QbW&+w+Hs zu*KZ5&nQOF5O^H#os0LXDw}-XSffyD%Fh8&$#|?UJ`0k?kQ!w^2~Ny*eCQxB2rL%j z7kL8Dc%R0W)hQW_7ZdXIu9bZzRD*D?_XYO#@|hK;Lba>Xz+Y>UGkr99{JgRgm)oRT z<}I_7Wp0X~6vNWi?dfA=C#YuKKDPX--}IQrz$S5ZDZ5c5 z{OIJQIc8bMT=mv7V9y2tY3+ZoUp~DMeiWX77NSQi#bUYy;LW`oGY+I2ohFB)zj8TNpJ*E&N4}6)^59PmSqVu)3(qb$U z)R_HUMmrrqPmg4QGA1Hy*O)QrHADmj90VC)6I`qY$ME(}l}unv^;bxLjDf;TXFksp z(@D~#i)F{audG!nCj)ubA*qvKV!8xVbz!7Em53Mej*%jIYs7AJc1zH z^g580!YLM)7!MQ)94W{wE z5tsO~*~){{m=5SfiOSfB3(hFCUup1Sb6t2ouN6D-K}GHOlJ-a;;}lXlJ3`v=L>Hpc z&r+y_)guiHdhhpx)b5Es8wImuUp?h@TV@*{dbYs< z{<`;rKd|w^(jo|#`9mz7R!@pff=*BaKlw! za%ggt!cbri(#f}T?0_NRB!-0TzpR|wvBk1ik9dU}w@U5#h0V?Wec%y?L2ZITqOtiFMx79b0^aKC$p!d4b}AM~j~*wZw7i$_Z)3r3=JrYkErgc8 z5{=E5dlY{Mg_lQuOLiY}b9(bfw0X4Lt1CO;vKUEe|F9?w~`;6w}oR z{>Y3Pk;(Ig2c)>&!=IAigK|_px&}<va9|l#N`h&&gSfX}#_)i*tPCFf#ptq11^l-Ps4_`Q zsv|GXr~`IB9S8r*C|eX4Tn5~rKn*ZtxP3gYHH$)>E_tRi@hKz#PzkV_N{S7S{-^Lj zL)cI>DTKtClq-NjAD`TGH`Yl-@tp7UR5vV=fSD`Gy~u>S3@2M61^qy|*&x07JA&-b z_nUd<`W#apx*~Xmo$1_p0I94W6cKG>)&3mL2t>w>(%SVZt?4 zeZpFc$v}h4cIhp@1 z*ea*4m;=_`Xty-AJXT=^K{_ruYN#9e!Mrw;(qBrj#r)YQZeVS060Zqw#Sx%He1yqq zldMKd#Skw*R)|9#N>&O}@)ix-Qs0 zjnReBw8`U2*^eZ;aoLy%j1QH`(E)qToAV6D4Y04)MAx1st!ZmKJx~V3x)Qin4p$Vt zT6bjU&wV^-(3~b#%A0%Zwz9Bl65M1!#^^IV3~c5=V(bU|`Z70j{1IQ-*Qam3`DS4D zUqE-OQA;NJ`Ir~f?=iihv{BE0PGsMcQ=xxC!5V)%>!2C_muI{?tTRicLrHk7$Bc5X zf4;{Hu^@%y{&uK1(!Qyb=b+&byWV{nNN@o~+4%Ad#>PeYW7jS#`lq^9tdM^}6l4Lg zIt&35S67Cd$lHee5`=-;EqvvECBUS z0&fMjsj(k<^4Xi)0@M*#Pf77?d-#A#}BH?O!B?}H>fs!DS5y`s?9z|CV*7mJ6dogeV=U5?L$(^chI-` z1YG$WXX)!8bB13~7V>hMvuCsO!D-afMlda*$-6Y-BWmCRo))jQtV6bd$Pit~rGXM1 z)VC*sk-ME>CKZK=2z$PSFq+Drdq@m)pleRzqB2h+QW3T`u0muS{S5>CoyCWke%23S ztkv~7Xx=0zHk^%HE5TtgBiFh_!u4*Ps-%#X>La3(ws|#|nwTPCSm`iwMZ0NF!qcWT?^fc^ zw{TR<>|$=Q96$zy2J@>0hr(6GpLtSl9Oi<|Irn|EiS9Y*if4aT#IU2YDTHKNV~+rd ziQfD6By)u&+a;vZ?U}GAw5&?5yAF$E_*B>1{k&ay4V&r8%^yQY@9C%bQ)&+-v%37* z{+n(=(lLB(;&(&@(1?G1a}Amyo&b}K#ADOMNN?2}f*m?CE~FC9Aq+Knbd4k?Y5S0i zpC_qa`nUs5>yDdOlP zq0S3hutkDA797zs)cr}cUEBA>%Y~@iYB^Z4;^vs-fUwZ-b~Z|WiSPbGW7PO~wX<@d z+gbwZ_$^y+$$Hd9YV~DA4v*$j(zKf$WjRvBS#tPh9_Z)1UH+v-@XNcNm zgphun{EgPHyQl#(MCW<%9#w_Xpmw`_r!`VLO=)^7Ps?Z@#w`eahodRY%#LgrJ4L=C ziP&={G#v9U8l)&~>OBMkaulxgILAdGist;%Lt;x4i|?;Ws#zC^e7G)r>0xiTAzk4T zDkTv6IVDH+|8~1%?1bi61Sr*pmi1dLz5oImmR}x6ZocsoKAEap00Fm7Ibs`mL|O~v z*v>0Awkc=%sdtnert#v=de0He$nZVsthjx~DX&9C|PvNja%oD3|qad@WJuLHY^(Dvh zdlb)j?k(kyS<=D=H}`z49(=-9jIYkQ6~UxVH|F#Ah{n#{8g{j0!UwHndN@=Nw9wuv?g?U9*G}-Ok%g+L9<x_`h)1=fUAl4k8yZr2n#yL!g-aDcMAsv3?S?0O7kgG+wzn4T z$}Af^f(IjxhAMpq!(5&;lOn#@sY2*dXqUn2o3|$$&@dbx$mk4y;*k7>q|)E#&c^2vqD@Z9BA_k^J7RMkW{g9! zu^QC)tu{NN5seUPJxENL3x?T>;=0q#ULBH~ZzPgU*(qK--hYCQwZfQV8UbTxuX|;9 zJG*Fdoyx3NjO!=Xdi0tvgfyYDi{bI>fB^xaA_OrTo{r2?2185~m&2)hGQs7)X;c`poD+g$Zc|MgoW8jbhZ$RZe)e^uy;IDm4 z`_arsh+fET^;4$jONTqJidcUq8N1pAoYLF1?*(cjtG{lu`oz*jxf)^ve0t?!apDf< zwMQ}cYrQx+Nh7qv!)~#0!sJ5ujGgC(4ZWfjg?dQh1w)+Kr`Mm&R3pG$iD6FgH5|sB z)PX5+!!Et@?aE%%I0}5xLQ^_^MnG{>-Zg#-d>Jm3s6vcLc}@z?mf?O9X}b@5p(LzH z54G&gnw6xzJupAdYcc)5rACW*@4p6)jOb?Q5JdR5+F~!@^AS=MKyho_j`@#R+u92l z2ZG{8?zLB80;hj>*95EalBnud*+=7r7okGU$ds_H!ivDdRIvp~AFsjM%fNA2_G*#J zIwr%#v%PIy0@@ZvWKyKVL7)cD35$-2Hc{4Nfg`d1-8iCIP6WaqWg&bXr^-W%b@m5A z4_#;pD=&OS9ByjX7N}N9)YfSzuVLs;&xkF~m|aA z6P2Ka_&fGZF}uet?FdmLjZ~h>XxvX+6^4pCxrm8S6$j!Ng9N3Knui$r2F6MJpb|MC zT6m1I;tI~p)pi$np!5J=cUZ4QcRAB32Z7_81MOGFHbboo(b6;aS=QpTNLv5JVX%pP zwX-jJd3l#1T>?vg314^)ZF2S*E?bxri{(!ZBg=!||6m0Xq($CyN;jL+g|S%-4n9n( zIk<$)NFzayY?M^^;XF$=D7m4~p5srDJr%y{S$u%q3nZol2=UmZ(Sjc3-&@l;tO)mx z+ke6K`qcQLYECQJ)ii9(mOf8$Q_wEmruPmhs~P!2%^gX7i~|d*&FadK&}V~J?2H>I zEDz71HaVion2y~-Xkw*GiQtIu#~r2`iSK>f=?m{i&Q_cxOy8Y*Zc%dm4HBSe@rk-> zSZ3cYYcprF@9BSr5+o|Op_3#U3m9FihTEG}P5pxO^G^24Ve~2_+!DKO_B-=gN=Z!i zT_mldK4PO(U?t?7`;0Fxq5DI=m<%0q--RFCq_=>`#~9#CA1AyYN%Dk&`VkpW0-{z7 z4brUSP*AIqhN846M_pAUs7t^FiQ56-&f=Z>NJ2~wBRg;g%DJK1Zu^vg{}rxEs;PeY zR%D#$g`%)AU^fzyJGo(Q4fV&4>T`4_UH#CtD(IHZM%H<8))#!&(Lm;W^x!Y#1rF}f zv~X+R&)ITp@bu8wp<*!)TQgXRBtmA7DylnGK=@O{+G5`O8w4YLU5PDH|Eb>pzjFnh zvEiO5KO<>hhe6K+n~$wQj2Gl&5vWDG6OcubMr#U*nxzE8(~95=CdghjD!fnzIiN(G zFA9`w@;Qr1)B=cMEggyrrJ~TiHV*g)HsLG@==nIh@C}%NKmci?04=BF@LF34p%}Pv zyUv*9fbO>t5{(~-O6bAqX3|(R>|TA+Gw8oPr=!&z^e7(@($p~{O>FY*brjaloRl8w zZS;zrsH&njVPdT{Y6_mE3SU4i2uLg1sV4sWim}#Yg}IAHB_CWFn2soz|3Rzy$bqN1 z!X4=l1OQP$uD`&&BYc)TL@lADrPu)3qQ#(>`y>~wcf+Z#EEl+oexT-0UwY}E#IRBJ z?~o-v5p!WH>bb`AoJCAH(II$1<>G~+x22*fJ4@rMLVxJ$Fb05Jy*+$CZz^B@K3+Ci zdErvQ6b{BpTE!M#w=r)eE%K{`;lUG*X0-&!4FAjknl`q;Kp3inPfdzTS)-RJ)JsSp zlKLEiJEH~zgFm)hQtUYZ1mIg&ruj|!LMH^kWswaYoxk7JNN-swa~mY8CI1}@y(r)Q zf!r4qS*rpS)gR|_kOuKlvUf9R8~h#}Ws(IoDc2qWd2Po6neb4`6WmdDhk!azT@e-L zdj3O=&O%fK8fSS~WTAHFKqHTx`?!H^46kIt?CaBpi**GgQAW_$2SCqu`;6E*^O+MM z_0}Z#0s>`B?O;w{mzXe0^4DlO|DxNt9-TH0xpkMma+!ZlH}vZp!2OLw+1CZ%t|pK8 zdxc0r6pbNZFrpH#pP*<6SPeHezbjxl2HhP6ul%{Y=1DV#g;2DU#Puox&$i#u&SzI% z2}mt-_V>7H<-(LlAI(PS9n+-&h zu31GcLF)?Lv>kzbPaiYHO~Y*Sp%ng=RNt=c14|!1=uP=nEI-@+{98^u`TmQh)?IYM*Q+CWxuO;PV}wW&!rj=9r1*WVsNj$N zYi41V8YIN-78L|-*S5lgOqZoEaWxQ+|tz?!(gd7h7fJ+7gm9p_F*_xMuE=o~-=fEgs2D0lp2? zOECxP-#6Km&mIDiRpr8qMNpGaiz{wQuXqfB@1P(}N{E0~ZFRA};eKJHt8AuyrNc zych!-;M-Bc;3b>f%SjSLiftOlw18JxPzVq1e;g!y7Hw`lk6_GIIb_7azY zS_IPO0E}TjK;4Z)Kf(Ya)IVdv8V{FFe$FS5Tv<M zLC^*Kz9m>{^dnn-uc)=xT@qhr4x&**{<%MEWYE5F+OQT1Y};=BvvVX&0Al;fDDWXMyi>fw`0L3niE=gtd0^Za52L`(bd)}N&R!Lf0 ztU!V+Qa2w19;`f};iw=o#`a;qN%9Uhg7fEUYPVrF?d2?u8|iGcL@re&Vd)W^2#4!! zeG?3e8g11BCIZCPx$%Ms4UGuAeByI?6px$>9I5!H(6^ohHjd2q+X&L*((F%i=F|%} zSp-%*7qLcH;b-!GT&2;O(s}6hJtFRUZiTo+gfcG4rFAuRYG{gVR+>qE4`JFK9baRu zGRXaenlSAyV~|4*s{6I1wO<_+Bv;2(clIYe1k~5&#%WIA9tMdZH4ipT2qxLlWWA9{P3cK{AN8 zPW=MUwh&Y`r8^q>FtJ{39vB}fzPe;^LaR3Zxv9|(8YBga9~!yAkC08GH`U_whvD)(l5&y_SWLX~>JH*?3?{_qNF?AJ}D z4gVCr!;sv&2@vT6`_>z45X9aM^O_Y}f)ct+6f~*)?N@XaNgI!Y>j3My;(24VFG-d? z(D>4`@K}g@>#iTDZ}!iVQYXnzmLS0x`8LJ!`LY3^?wJ9LV|j$XCmJm!2pLm&AOSQ?$F32@-6qJN|FWrUeEo#IAK^i0vWQy!oqfl zZ^6GY421#UAn-Rr28Xv!Gv^;VJSc^tHNnF0M<)*`_@M}&V;Fx!;*7Wi)T|Ez)x9Gc zf})$eMyE*cItNT%DLGm>YsyvtPtA3u&iXWWr}0(t6(Q_0@^^zd?HJfNwPWPPN>^zK z43!}Z+Klo~Pa~o;C|u=7Q4SN`h8mny0$GF;NgqL{4N+YyGWp7giD#>fw`R=YXt7u) z*EaFlTtJ~9XvCht&SaT8mw4hd$%!{LQvS;0I=n=Q$+71pNj2-~P(veD7NfHH{0#lP zN3_!@2|xJEvD?MZE$*TyJa9G!!RSwWAf5xGOP0UF$wmcd9cV-eE|PdxK&!=C;KSJ- zqr_ol3^+_SA~Fidqv>4f1n_85)PbLw>d#u+6?AU!=4u;utj z18`-E;}fA4^YhbTPF*QP%oFN$Da*XM(}A_xmSl{85w}pBA*QW}dHyG58_|{;aVUu8 z>rss5p|ReA@NFeO4Uq}u6JymQRT@E?S!=Hms>b>n_D3U?02V%W^0z4cWb z{)$%6{!S%I9g4WP4LA7_&OTgQECo%2-|N-%&1Oj$`wm(Qpc#^qAWx97(cd14lX;;8 z5Ec*D@0}ca=kA#@(40cS<Out$GwQ>PGzC?{pdsTKN6TSo`Pvsv%79?PkM(?gU5It@k8tPZL<_=n8JIp6e zl$)tyL%0#(epu2a?|x&!`+2f(`^RPu1bwJ6vgegUK3QUGKhi%FsI#-ofdNMze1!Z{ zw^zCjFSUH+jYTTr#V>rnL;%G^bKGKQt*02_3tew52qtM&qgNg`_GcLOdsl_U8NoL^ z*+GIL$beVDLKin0Gq;q`ZhU=r@;%lf3sI`@=Fe;-0W1JoX2o+ivq2Ej-qE}v@Ye~6 z2v#Y{V2QJ{7YA5>8W7B%ER(R;;Zx=NNke%SH%<8zmhhJeAmi&uXE3SaoW^?#5heOP z(#uO{?BN%&Ev6QLC$~F} zR5d_!7(Y=bHRCD-hxLGDZv6nXX~0EHCvjQZFQ84M);fjYga`(PKeMmAX3547%3Q-7 z-&@%W6zPRs))~iXW0mV!#Uz7j(3nqj;+AB(AqON6hS`6V8pZ?Cj=-FyYWFIPy{VU5 z7i(KvCX#+ds2UcohSYrf*o#ac{JbFMFi_B%|I)+FumPT2dKT&m3VKL%A^v=RTsSeuv zjE_{*C5Ul4{;sN%#OTdT!n*JDMsg>yYqYt&ea9DBu> zxeQpXWxwqFjdAb-t+zzLj#Vh^`exG4^k@}0q}Wd{3Lke<|Fgvo*c%peBA{rn86SLOsG6#wr7Qo6$S|vqsqEe8t1yG@M zu^aZa(6JzFppr#NDTsKtI*Atz76Z9Iude43wEeSeRDqJUI^C8Sd97+sNSg#$W6z$f z-+0xNcmzCmS$SxC`b%OquZ8ebyqDLhh_z+RN22+BSmUc5Sl7zT#o!pnD;8~tImuH= zh<3lV+-U$tc!*DegQ{h#@Up>UjfGspoeT+k?~B-Zp0(UJlf$I+$yS?2`&MXMjlCpv zM!yS|V@5jWiGMG`!iWH@9iQJ$Ann-b-*Pu^ZgL>TNcV&cTSJa~mxaDXqoY7M$&@1rR{X{W-KC#rClai~xPt_gvjk zIs8QsnYj1_#*?s%xZfW=I)Ab-4s>=g+fqcw`&CdA zWuXxXNzy7ciCu(gc#SOWQcISu1+nP@jJqV}(>aHKxE40~gZ>EEr0ZSVUvPw=T6frU zW2Mh{JNt>vQVtDdD8j-b@#Vn#-=NUu9HKS(+56jcHIe3Y$r2^#z5Pqw4CPkZP!HDC z6DW@9%+O}zSx~pc02-mZ#4eZ5S)`UFNO`lC#m_!m{lL3!De5W1KPq z+>;^n@=qShRmoQVo}`{}L=W}%U|SNX**nM^8FDn&G4fI%_f24lfp2vzQolwv%4If~e9;7i~eInr|bsUdOoRMZr@1w zV3@kDnAy_h8e96wm~Ckr#K6{$P%Axv5q=hwuK82&CPYBrjsB!L(*3&*hEVo&Z-gl? z5L=gqA_**XlUVGFWrJ{4%cjv-U} zxiFA3JJTH3Z`Mq$^UA77zSE z<7NtM54R-|tac@`zGRvdSjhZ+p(9cLyVFZmGD3Nlj!)@jZ+8@yIwuP}L9YM?WPofu+uAQchC+u90< z;%Ny5!IgmCLjog+0MO6Xi;X&3xy;B@anENb6(2CVFF^y85Kp&~KOONNy+U(C)lPAd z74rxwXb&&aK+Y}^Y2l2Wsd)vBw0wyHX!`OKUSiA}b*@ts@qr2Ow+#+0>N(i{i|r-t zDw_jZ?sg|EN=W5sbKj_hHQBAsnCu$`bUIO-UPcs?-SVZfV1uiI=>B8ex;?pko3)6n z46@5?^E-4!<9@0^5V$tqP{{!XYx=qUOm_S5)Smc?D-KJ}0000CWy`g^1Q!mpoinJo zkKitnBFkop9I%RE3dvo887;p!D#2Kts)4UU`WFv*6#yhv2hDTHO=(wMm~uJTKBqwJ zL)Y$?MU&aPy6$>chOJsge&D3O?XU?r^$VyF6k`7d8KucNf&bXQ))G9pPz5lFK`mw8 z&vT!o;A_L}*BvR?WPBb8q&jJxosxA3aixTgRB2tZ%13h`cwezavDS2D3|Q406yarj z#$STFp&e~;$EL{{!N7HHbtWzA+oct2*;c7TF<9}b>*y%-1QnfpwUmZPs}76)Dr(F! zb>&$yY>t{l1sq;L&#OcSsBLDSBwM1Ar$p5%C~9egG(Z737|{ng*N*jQSy?&^f)G1Z zKYLy=@*A4h&g{rRW1{c+-mKp(|s&TyI*4FK#tqS|MI=Uz8df7G1H4s zS=6e@Zc|do71$O&3LaMv4~#K!jOGQOj{JMdk{IJ5lYjPjl`a5ej69DVDw@^qG~9`^ zjEU)wCqc5H;C{y9&lXRM^Fdke5^N7_PJn|cXr61&)D{C9eHq+jIz@aO{DYbARI2#O zFwpH`GdZE&aC*VRNQ|SRHThYLo7Jo=Zn67g|I|#(81_G(e#NRn!F3{DOSiq}f)Du= zc{!fAgih%Zvz18x$&*ZZHWT|eEz2dY`xEuZZHORkXz#_1qF|h&u z^em}*qwk(v;F5cGRJb%=pz;ZAo(6#9=2T6Qer=jL zH=?8SM0_c^J(rv}?so{SILZ~-AToU+1KIFuQPS&t664n-9E7%`VP68eF-)?QDvY1+ zh5aJ-uFXm8KAPq|3kbu|=t5f|X!p=q20H9%Dv2Mn-x}8E1SJXuU5i-yIjXWT9}iyj zd%I8z12IYx{wVe;iun3UGcDF1rM~GM#%IQzA^hJkn7T_z1<3x3Q?q6d1Ca18RKZ}7 zS=|@~i`vb^ImS>F2%t*Xe!{5aHy$bOhk&fE^jhpUoNLqG;m!bV{ZLCb1TpU3TWi(! z1$z(eET~cnAV6jLPvyDAH?5&_CN$eoxhF6_q{BUB#?^^!J5zHvz;A_}q_)0- zCZN|kQ3D`NSKgRX%nNFZKv(14$TWNrX#^z~zg$T=^BIE(OzdLMtn@3tejR6(4h(#q_`Z&I@z6W>bxBYy z+N0!_8-pjpGAS;Or?rtU)xIaGd1r{Td#tkh-bEIkZwsZ07enffYdc6a%HhSrgEcc! z;pqa^fUYa@?w*`Ll=`5RIUtyEKtb`W<+>xhC#NHWaa@pRP-k(RDRr}Tk9UoQp~`BA zzj>SZ?+qUPl;Gtp@T#MEA&PD5l)(*`KRM`RsP zB*6l8t?8W(Hl>rISRARgvb)90V4^HsiqEjS!zRn7FO!iOlh@>gNn}=*(o%DusnBep z2ZndCDGi_$a)OM|Cdba$%qtmRfUc8)FMrq-Hg>^(^dPN_I1SXFnLQq!B+kLoTwHhuS~a;mHX7U666(+`HC1AJxK{|36$U7dN4 z@wgWq43)()+XB1`yZ2(&07BVB>SY_<;bg}yV9@PeDVs4x zaLAwib%<@p=iDdD&Np!ufnD7PHfLAG{r<)Fqm}n-SHpQ?Yvjup=^qx%v>r5)QnpT} z$Jvp_7emtbfy`^v(6w2}GQ$C$XOvlO`+~wyoD)U?v@d6el8g+3N{^6q!;omx$R%_N zIw;)dvaX3uFLx^efF=UDKZL=6Xy{Mz#`N+b@-!-k7{N4@w{k`1d%;HZ?n?|ZeFE9%QFeb&}_1A7V_aQDsdAgQD_h4#GU&@$#k%%<*fZO11v z-U~fbMhFZ;&K<>P(LrmVyNAm}WQ#6^hbLagWl@bz9v#;$1U94V3v~!Zgj-VjUZ+(7 zWUPQ0Q~l&|0FbCLX2!WdG#g*t2=UTI2}Sspa|)kGp-aLB9-c0ZNPxrnbd0jKZ&eQp zFKM|AJ?5bTB5&=`8i!)O)&OzKCYBG5`UEieZc;1Ige*{>(Vjm58n2;26leak>O|`k zJ(+}G6J0FKb*{eB|3C^F?+=Qi(kZhZsF&Jxt_w?LBgckMgt3m2q^SiiANz0}K8t1p z9mW)ns3V82I$bz``2A>11`4Mm9~v5`_TBUCgQLM@(oibGUyFwAu?~RvlRwIgCV_kw z@L1f1GT_jeY@rrTqL8xyj|0gOvWN*%iDrd^!shCz@=+sCul4b;*nS2cqMR+_91dGq zf35NR*h%8*`rt!u2i72gL-|jZK-o0V!AE985NxEG?NviDbe&0k-oh9cJb=-Gep~6J zyPAiHi{MxBycxG(PWNFD_uFK$!aON?>aSW=;Z)$HPPo_8a)>cTNe< zn~{mzTX8>?tN|L|iqlyQV8qm(N=CS1pn|=fWZvT-a-o9i{vxpv`Ql9itRG(Vy6@;z zyu1C)0IaOaKhQ8*lPB>USVF=J?J)al-I662Fc_aFB#J=AsLXF@h@}T-0$l47Pc&=i z?bQf0&+5CB99|Xzvby8)_^YPJUbuJLdzQl&R~EqredC}t0ulqD@RsR@es3BK3Rqch0*Vpj1AAE;0mfBWRyLS@SiCJQo4u zB44@|(1-!Z2lvP^5!0-du&h;isLA6D)}Lx9E#dr}@*K7m$q?okh5fliM=Og;Dls@g z@E|B1UJHKOCKoD=_eIe{+)(U}i4=a!HIWQ93n zq+G@xuX=zDF>%J>ivrJE0_!W6Z(}C(>6eBsMBa=to}b@U0}n^4tR;N2=97tZ7QbT- zQa~lq1z_7bgc9T1fWOhIu2LNqF*DR5KMo?Qf%1W4I~0ug84~l_JZNn_Gvf*?br66d zu9=NjgXqz?u|wtzi^Zm5BU1e%)^~TQ>XhQxDH`-%dROYgl?-)29RE*Qy3`vKKpb4Z zWOY8DMr;(GvQ`M#nV+W*&eM}84n+8F9MTb+>DPBU1~6h+FA9S(jehvmYYw|mPm%#_ zpECK97N=P^*jY+hd0U~5-r`kAY!HO)*kH2+Ql(#4?k9REsKFEjWfJ$?b?ws-AR?>- z@cTF@^I8Cjuk(Tb(hNBh{UQB{_3c#N`%*Q0xvXInRg_ruuUqW>r$_c+G2yYz#KZNO z{r43Ry>PX&wUh`B4JQW<2T3tydGUs7j?dK0jKOj6QLReGz89v1tN4sjOA_-pc?%{}d#sHZ4V`AEfy zwyd&gLBf2EN-ZFn{|z`bwpYW74us6a4*;qjdH|-iD#=TY-o;$(+E7M(vi~4jSVGY) z2`qneFycYAM_mrsu)W*4ohN>otk3SkHL0V6t<;24bgrWdDj4KySJ0t9sfH&{tdRxf^pa&!yUGF7zHnGdHNG)r&ER- zb)rE2=9rijgo?|Rl>5ha(0RE<6`cmv51y36<^Y6%%jVbK*vKKb2IZp$aQ#wq01D&atDpCT1r=m&S zlgUW0pXUSNB*N9AJ77TB^PkhME~~&PY1**JGW!$Z*)1s-qJkC z<#*E^wM?2~qVb3s8jMIWSke_{v(0a~|5a0JfhNt~5qAse^jK~#mUQS6kx?<2BlH9# zzA|}xe=6rz!H-?jfByf%^CJ?fwkg-i0@DD?7m%hRaTp&}+I%5Lo;1Yp@6#Sir`#CE z)YQH2Ni6j`*)KhBEI|TQ|1~lAhUu9-N0$gSd}19FKd{!j%sseH`%Bjmei`RAXkEiO zZIt6_h1A22>WIMJ`R80579Hq|T%zC@*j=y1(u>2D%F`casYNnQ$K6l*`;z;A$;;Ir zMdtfME7hcneOZRBQBU$ZxCQ(g#{NG0&)m&lVZH(S9Dx^a!>h#cCKwt(?dpM77TRPG zGLmZ=*&i8$$Td4;4{!@RHRP0x-luN?I8Tu8rMH)l%jQcS&Smu>`~RTeUl2Y>y4Q1- z+%{m1suA7t!N)XU%W#BYZ2Bgzp_Yb&WV`pOlh)JSuRu$-beM!TM@~u>Q}46SwayM5 zHuxS+$?wvg2hed&>$Zk}08)!P2f=*CpPc-E{s?f2}+HHx5*z27r*# zC=7#yDFBO+Ukf!O69h8-s$Hctoe*6GhVpq7$sLcliw;g^!#WT)gZ!#R7@L5^@5{O> zaQ|O+eDW2@K!f<_gfi$)1&M+^Hz>kvrLN_6>l>9o=nR>=NyR(6Y!FgXTPlss>C&FTFC@nVdp6r7sW>KZ?5-Qg0oH zE`7O<`Na=pLkD)WzSlcmo@X|R8F%d<0;?7>3}guu;q*afD+X#x8~L0&F$(14&4gGl zw82;id1X!1(@4(UDTDd3FLYZE)+ z)8<^UFm%s?emlreXw56_s|Ulwa;}0vC@hX%jGtBRFzsy-~iUyUM`Ne7D)dLFxFt%HJqTy(|`am+OhH0 zu)@$uZbl;@X22KUwWbs@Z_d*BJ_iN12ZQQ9`6D}+w-?N)X|UduwDBkvBbbu9T|wJ6 z?QcS#32_82eJH-KA;qP3$ihW+DC|{DrseqvF@Vtusm#?Ux{(*i{K|~mdL|XG_SQqf zvj?gC#$05GReFEQCL@6j)SFQRwa+n?%X~)Q^wk6aIIsuuR%W)jRC1#YNW%GwTdH3Z z5%R}bKKdr`79PeMFu!&Ak2*vbOl+g=5{Bc)t>FF?oroQb8<48AZ40r(UDa%BVAZFH zW&u}W9#HknkKSgfO|5S>pV>QQIq6}f5(lcHSx1u55?PyR91K`(0n!dsa-gkWRpQP# ztAm83`el@9!Oi?ROzn!v28?4#saXB~Px8`@`EdUL4IU{Vq2VbEjEBuC^E@&L7fJw5 zV1AN1M~0_c2{TX@z}Fc`JCtOXvVn@yS1Z52AX<6lqQs|BQETPYeK#lt{m|+N_Ff8{ zor=MZ671k0!y~ylyt%av-)GK@R~v4o^k!hN)o8|XE-Fa7m8wNsC~lGTm~?Flx}Q^< z$EaC-GcZ{4DrR6)l)d}#RbUP>V!E8PeC^pjZHhyRavYcvZ(79Y;#w7pw+!cqK_KmI<@Icope{?ZixB=7W6q-PFD6 zex831gJqkTS?bg_rv8z^Dq4_Vm>e#+_d^NG)TxS)4B4ssM$yK{La*BL%V-?jqs7gw zSe&R74@Fobi-B?a76eZ=j6e+lD;)TR8Y-N6V2`?w1p@$Jo3P7IIh1r|LB;jr=bQ}L zj2#y&0N0u1Zmj5bT2vhBnwr1{@`_we=Vv8mADJ(&gKashBy!3NTx|Zl{)$8Lg;UFn zvbR+}TXql9bwT2c4w=lb2uC4YN_1hg<7kPA!)L+HqVL~rQ;DTUC8<0PIfbG6hG24v z6)0cc{KkOHhQo*g2BlIpYcOdnmS2D)Am%KqKlM^ls<{u&aL_QPBhg8C z%fUhbblUJdmF6d85or*|MA(SjkyU0VuD>oC-D9yAEUEOpUb+E({>T^UM8d976FI&T z8ED^cA8GWMSQ#<4mdi*9Pr~!qOKUlixAboV^V!$Bs#xSME7K7|5h`ST)^|wO)7&V~ z(O3cEh=13MP1}3k>I5kXa8@v`^p5Rxu5)3`?A$M{CINY0*$w5quMCdiYK~R`(>4am z$ptjIG*NplpKf<+!j_}5f`oO-=N;hc#Q|66+!iQXQrUvVV?*aYQ2qfxN&m)krQclZGkh(L6*&jP9B{&cU?eUsXab8Psn_c`pO$D*rCNMtaOY z^$TvGLl5x}LfD+-g#x$17wVBZ0J?LN1P<8aH->UhaNto{&s*TjUq+oZg$-spsK`#I z7Fe`fQOFPRy<6hfSvV<-08&Pj^+T{iKqaOfacPN|9;IcE@|!UpNQq$fDml1x=K6{t zGh8Lvc4HDHb1j4TeA(vG_011OxaDR?RV#NZGvCAcRgWmJ@efW~pfMIR6q6IrjXj#1 zA{yH9Cyh&CHKl1v4R>0j^p)&)?cnA}ET{DB5P1Y)eB7r~4T+lRKRJEm|I2iDf>#q} z4PP2UK^H!SZJ9A<`mnmyy_4=G^HvyMku%(40Z-z!JzDMNy)y^005S|lBL=$#1u@(%A>R;xZ0o(!`1_N zu^B?J^<4Ygd0qh5zz6W32*%ei`ncDT4GU#uIF*r|%8vqy=g9st%re^8i6)tqx$p%6 z7G?=9=D;Y2!FsCkTf6`T8d@?RF^x|FmbQ(o=-~!QxkL=rzME(Y+=_;zM(;!IWO>&i zDP6y#2xusFY_nsF>|6s2!gqoNaMw7Tm^hkeP)n92hlR#I+xh*2LHAB!Gp~o_Sr$346|`r3aAY;_D^aoQ%j9F|Xv2 zHdvko7azI3mBsJg+6_*AAlb}K$GCnjhVaValJ&%I+;vo@at*BMR0WD>cyY-V64*6V zQsAnyxbfZjJ9|1ceFf3dHUrMMq>H(1{Pe)$wwd>e^`hdvV=n&Z;$u z0tPGL73|`Xs3=va5;ZGTA6%dq!uC!Q_GGEWqi?lNK36j3mnuvo>ISGzhc?d3d#A7} zT8xbYkIKb_Zg5r%Bhii_W$x7l`JN(QhG^B1z~NZw_D0q21 z0wIQ0c`mar{??`JLC+0A2%fmB(CpzzUele=?2*!0u!KQ3XhoZqZUF1-L)XnC-9B`I zMyQ1&wfk$Jnf}itBQA^+B33IBTJ2ASWg^uk26`yzZJj-!DxGiznfWq8De0@L*?dTe z`d#B4VAD?mI7dLyB|)7(;iYfTb@W_zm`P{1d`I z46C7Ga&ag@poq`jYnoE02c+ zcdV~(kH4)hiagx)XZNtLBiWz~o4%B<7`p%f0Q6btAlus9X_6Cxi$*r@ks)o30if*qiZ0Ch+BxsP{rf!0H$I8z52KavvVCs zP4^>{&Y+116{!6>gtEP2ehK9__M1Y77PP#h$Ni}aR`6Btsfr3`0q@%? z8yNYvTw?N`8?fo(jhjq+%~d%gYcQ|Ltk!3_Ny2H_=jX5To|#y87|o*+)}va-7ShlS z=IJxMpV>3r1!yd)wPnAb(YB(gK+6)kOvh3)Pt+=rh^0h+tVdrmik+?LbZF*g75C%! zttOess?0DAyoZ8GB^N0N@4&*bjIp#GXUe0okQjb0&OM@|r}h9157d>uM9^6kSMpC)DtkNVv|JdN_?D&6Wvo3}I5cmS8 zC`Sd!?%L4zCT@7_*8%YuD(tP637Z#M)lZh=pnw34*d`SQ->-Gx-}@^ZFZ`V2MNt)uHQr~) zx<^qK4P2RoIARH=SJ;NYRk*gj6acj|?umrLGUR93{&si1sn^C;-~TtRvJffZ(ZkoJ ziE+dL0Lux^rZyx+toUvvucEAzgUo4!?|*j@PL$ns+F|ol-gAB(9}bpr`(hAfy<8=C zzWkf0LqDGzi&G|behZ!`yjv9eJ+67Nl9?<`s`mxAj%bxa2QWja(SYUBOg$l$(BIJ} zgq0FCNe2>mf_jOQc8$uW%Kexti6@sUIMY{=aGN<|Elv|c@*RrCr!EsK<6aE}HE7OE zZX27$MTZkZY^iV>IDZ=aADoWwL;q8Fxty?=2oKN7GYqY%lUM(RYd&nx)cY-n-QW|D zwqK>E{F)9KploX&EpC^YXrA5;8g*L3lhw`Zr#6Tx-@95nvb16k{U*H9$Km^o31mAt z2Bih*{Zi*FE+Wm&+Od?~p<&QBOr{8A#V95|a~;dUbyq=qIO~T10ERAvUAW7D_0b`d z^iahms86$cvkZ!oQ)5P?vkywz%c|7;qDZf8zG=GNa5+}}n?(~JO*D2H3x#kCoHOIy zE<__zH{8VGk;>Kc*zL$*QrI+vy>f+Jt!AmEhot9!9hb`;5b2ja9T)^4Mgx~N>ROK_ zI*gR4A7jC>s%(EidU+dj(cLng_%}$a5B-*7+MZa||5rPlTpnc&7}?g~;^iEV`5;Xl zN0}=XQSbaYTCHE2-880!YGM9y#`l%NsD&OvIyaYf(L`=*@y=`i;{jj8S}1)@)oaO0 zwCRJ4@?1~wFEXdHr*XS+y&jaH}ten$6$|r1p$lc`=C%Q!1`EfqPS{* zZ*i^_P_j`BI>;DYMgH+YLjMexQ1obq)GGmMre@*d1GkCE|1M)XlOH@DTO7}u6N#NSv37WdSR9V?-(K8_@ z`96(MAVpQ<#v+DEe+19!+bW=;R$_;wSI|by&flXtj%WV=X`!*fJxMIS56*y(SnM2A z)Ij8bpv&%7r&K^0^-2|^JLm;J5+HT8F4AO7?R9y=5j~OONGxN%8uELVeCYt<)taad zv=Xa-q}k3fC{Tg57Rxb_$^y&iiAnpF4y%_l`NcI{colRz%|eaz{YqfGEd#Vl3d!SE zcqg_el9VdEfOx$+W5!XkgK9aj%8v7X%L%~=9821Vi(e0qjbF?Ddt}k$nQL^CeIHtl zDPvd$JUlc(le-Ati3`?4p#wwVX$r=twpEO4Qr*Qp<|)w_4)i&HNKnd7J{u7+PVdEq_aP>sgWX`R_5}u3STI?Qc*C2Yz{5pooE5%uWp$2fh zM<%GS1hUJbuR{}EEjM2)L}e-h+2ZsODe{l@gR=9P?tAn`nJIWqFEF*c22$$0Uaj@M zq2Oj!t`vjOlE-~8PCMOPqbwb*MXIWn^Y3B1b|sTaB?GyJ)=;Z%IZvvhZ7)vb0%v|a zB&EQG9nj#`9`QFIxnPLlsvv#Z%Xt6YL4b?PAY4qi{Zm+ z_3e9Tp6-{VUhI8t)UnuPDR<^}h6M%qw=nqcai>9y4T}CMFnjY2aN0ERIX^7cWx92( zh`o<|QBvf$@FIyl@(_8bF&R>A971aD@3$)gHKv4nTFOm)RLUxHkYJ4HdI<5f%F!D6 zXF_4TG-dl4wGL{}x>H^mFpVp>VqqkK>P1`D8nqs~0-)lf-3O3@O9aEPqeKsM2R#Fn zho*$Gf-Noykr9IIs%d9jsC6}MN9Vi=gp%%dK6e{dT+|JSk7dBs`uhtgj*$R|muPx4dyPpMz9!~n0K0+EqQkK*)5@Hd%s zK?!} zsrBW`ZSzTXNF8Heul`{I%W}vy8}o`~DiiwRN``JM$)rjb>&78tDw!T}WSSH#@h!Xu zq4oKh?0bh5Mph&Fqt%W;|A%ob@ZB&PK9C?l2#+Wr!40+rDlS$p#qY5t zd2U;N)7j2PBmmrh8?3&S_pg}A8XLu$!-r&PAlf`{`%EN+_~e?#e5N-G8v;`>9Xn(Q z0@R+|Vme`2+Q-Ab*GLHFy0Dk5Rf#J8j(y}RsXs(Na&a(PE!%sypT`x0vjVLrDa=@@E!b5}OSHWs`?Brc?fO<-Ila z2+eD`j&E-+F)RF;HJ0-33*y}Xib=ygClyWpi5-~UKp zKfAty?2_`}-u_l_-Bzdl=De{}xTBW|_u4#PshQ>s6o>jatjXj0$Dat(p<-3kY@kWE z@-T`9asOKm@|zVOG`9r$wQaHV>jdtDD<)X9^FwCciery?uS^+d^jK*O@45~ItJ{$C z4ztZ9QkpxI1MJ_%l4af{jU~ zz*Xv91Lz}tX7(iyU)F7IzJ zmwQD;J+JJ7Mp6diTEg2N1sqh?5>A+F2PmbGu_Z*RC-YFh;j}r}wv>#0fdgsY=Ai%4 z?!3T!IlX#7==_y{#@Pq3L5FZw8%6)nVWJ#+{HU6pcEtyhXjbp9Di|jBRU@%Tf%0+t zB1UKnMV24U(m#Z5vC!;-&Q2(inIkkMWko0(Ee?UhceZ2E&~6?{Mw5WWZ^cKEjMaG1 zl4m5VDm)65E7BXAZHc3540RstUWXjBG=b$u=7w`9IW6yfslo-Dt3t3%7@IyHS$pjM zTo-fn31dUlvI|;#)o~Umg-7y3+B100biarCgV1yMh{&k>xBYqv~4Y==dc4p|56Q=q?Q}ITKV;oczp;KA<8BMO3$O_iD_if zuqK9vFc+W#H2_tXUR3$wcN2)@<1J^~>%zVYr!kwVF*u5xU`2JVzOvr+St7--kk4d+ z>kTAilC@@6R|ZgDVQ37E>*0nLtbs#W|B<|H4@>A#L=41tklQsvmnU?e1w!MSkU81Y zDBL|iaw=SY>K(0sz#6h^)E~CBn2S5g-s`!Wn1)DoQlU(;{bgD0#pto`HiJ8JKSkh= z#5<9-zVbgzBNBRQ{8~v{)Q6(M7wQ&!N(Axh+y7=oe&s=QTYiFq@W86EPwA`&F5omq zIwueFWJ{btg^ymU|{7{_x;?T8R^z&6WIa_=#i#5HdT@qVmJ zMWX~hI|{+?1!-OV-P4k{ZP8#7F9WIMRi=O z!paA!V>hcJ(Q9o=3)DApJw+9fa1q+eq$Kw-=K{SOu5u_?;e9RSbcD%SlF;`+L==WT z5Ve>I5wgJrxk$FmJ$8lLaEdf3z9WR7|DLE+7a_;=jLju6+ZVXSBX3PT6p}8hxItC% z<^8QC1Tr3)IQ5vG$r%?7m|e4C3My781X;<~%ksHGHdj8~Q8h;svxj2i*i1E(THAne&buL zEHVu`&jyEvj0lYJPDpW)vBf~N8@e<&)sc%@#jCm5Fn7(tPDryFvLGN&1=6j0;GBg@ zTKS$@>Vp&>4oE1*IIk!mD}hi%q<{BH5{azqAh;d|$1H*k@j%a|0n_6a0O*3ZPk=+j z+gz>xXu0uY6 zfagV0oJeY!EFnPef&(wpOS(x%e+?7M7#fp&rDuzmCsG;2TbLBT!d|+2S)Y5p#b?PW zA*TA~sX;gYVpUqLqH!xeIJp()b-nBh`&1xX517<|LuB|!U$~m%&pDd&$}muz18f$1 zvwBNZ)F+%nlEbv6bO=Qgt^*g-bltAIKyeNc7GSVbOmIv$A2G|1Y33o3VnRx~6J3vQ zvhHJ;V>fp_(Jy>8x3~}>v^f)>vAjOaFLvx5b!fthwY%tpJ>wq1+^!JX@vj4ds{ULg zWIfyv+fnLp`1>w5-OfCpxN-=|g?RYzI_i?$46vm>3U6F>kfiZKC>^>B<4JAp=*MR_qNsts=h_i+!E04-j3Wd;x7s3qzv{C}h7@&KrbtX(C$iTz*oJPc;kHmAXa`K^7KAP^UAmMZU{ls1I1033q0t6NLw=nP!(cY z)6BE8wA<~$5W-~#Qh6&MjI1RXomb`wBd^K$uwwDFwW7TsD#f9xhK=0By}E5CF#a#? zp4HAWwT^Vc5ZdSl zz04oi{djh+ci4p@E9h<;w*x#%wo~6;yCSmlxBv#)Kpd+8NvkO2*qYLhTbLPgjXkOQ zveOv8d~gtuoSf2u->7V43cAv%pp{<0R@%D#1ddDR6OqT(g_hD6+dKSF+D)R6TSBH{ zxFPspW+7=i$)p82Te2i|+k&k*L8>TcsYZ$>NBa5^?_o_VO30%`C={u6b3yvx;>Flw z&FSTkb@5cJS^aSk;BMA!o@LvNcszQAf=b7nJ zSn^8Ue=MjT$T}h4G_5`6k~x`51Z~W)oY#f(N1)5C5Wpa)QsGh)`4AL|L~fT}aRCbi z3l>5{B%0E#s%_igc%cq)!CA0lRU#1xL^ot9j~ZmD+Qf)2iy}_>=lP+tReNMVta}tD zrp$<(IyTaYWNBIk02M%gYLd067r07`DfDK32T*z)v%Aw=C)USeW$s|+Y9tsgwo?P2 z#7-zaKa8On#ACZ2bL zI_m!`aV;i$@iY`x!s*Lp`xW_t0@5XN`V8K_!j_IB*0o1bn7qJ^`L`kK++@`YjtvJW8)A--sslE&BO+787$HDYog0sz1xjl&seCL3pr& z$k|1CPZW(q+!kYL_tN;$-b=(++szJ-zX#LUlxM7cC~19Of6uG7(|iDsCHQ&BV2hcc zg1Hy~ny8=4$k(jPKKOOm)rU39e#PW|R-@y>^MDh6>AB$5O9fLK3iW0-fdkBQh(ebK zXlrYtc`E|?2t|vRr1}>7lQg&Cg4NWccP#(^r9&hF#lWV*)~7UYm%xx=>6kQh;9;4L z#IBL~FH;n82rcg6G(7Dp9DDII`v3;`JrAUT2a;oZond_bL7cnk6lo$5C*|h*CU;2r>PAbxV^YShpi#dUW|<&x@AMtmNN^ zu6AXZw+1mFrb21)S46PnKWgEu7U^?x0q#$8?0+{5_|Y@8$Ss#%Kl-AGNyE+=e!4|Zmg2E2I1CrMDL|#BrdI2-3OoDBe`7N+GINe6? zg)Y^&2Wm9`SuCHn@W9O~{F(bCQILD%Q;uw&I=~lOfAl7GSZjKvQF~^76n|b&!PD~m zoSAa+X<^vk+uANZJu~?073wlp@1cFHk_sO+F{w~YQBAp5Bx0SnyXIEi(i$4z0HHs& zf$b?I!4V;XkpCKOQBG0Q9O$nJ9`yG~1FoEZ?Hg9*6~4JRrtB5d^}POLhXje`Ty z2&O~Juws((CKQaf_Uo7Ng|CVx{D-U(_^42}!1FE9RZbyAu}}LE+BZc_Cqx(LbKfT-j`f+N(a@y$_5t(Pf?YH=gkX1h3m* zJ51chFKONXn7HSjMc;S(Xx-Xt>svNMwi(L8iLMzv^(%x#=Bm$h;UnHbQ>ClUVVQme z;&(02?ag+)5X5jz8#gGsbDj zP1GN2P=j-}@J5tu&R(f`H(ZLuQeA|kW{0_eZVxU1Hkd6$Z50ecrJs`v_3^9((%2Xq z2yu!(&t0hFOBmVUpqTL*f`Ra7_Rsa}#z;OA`C(F)VBS; z;XQ=~GyV*d3GbQb`f?Q@++76uhV3DneF)i1ZTH7f#8DB)X@230mYxE_|L3Vg)EI zb=^q?-->|qzba$#Tl$!uWa$wRyf=05UHGM`P#apEnD{@fqf&xnmW}rq{1=EK1 zgxSv+O#0-Blva|Fk5K#`7uEw^cCRsGF#C%E$lpvy>j#lC_ws_9DA*O$?S^xi^$?%T z4uYz9ix>{S7K{1GN?i{%TIfXcMvF1cHOG?)jw7>ZgUNU`Pq~Z(ky>PrNo4!`OTFmv zwWA-Mm;KWLbftNN_cV?j)n;iTAiup-!_sOxoo9WR!l(jWpKOXC6M`cYb;VNM2Lv1W zwM#peu<@sP`C#hv!d!h}0_smT#VZtWqNw2>2^i}yVR5vI zd;^Z-TXK_KF>@*cNzY9MCAFerxo%N@#kjGSqKn-gMJ-C3!gS1|gI0?<*j6<5%9BAx z`4aN{#ygetdRM9KR#>>>fGlnc$yvjpyDS9vgIO`zYv(r2`%d~6m+2oOo}q*&uF5q? zxpGegF6f!X39V{yGiu96C4u*H1OW!1?^l2P8}`l34wpD(st}%i%d4sy+m5;FOYTsI(%;i5us&BpPO_1(#cSd?4Enyp^f9 zE$1*ltA=ZU7l0RRB52t~mqpik|EdfG*XUm-1{t20^Xc+rHyuegYKZ*$NcGH;003@v z@Dg#e@+q)irEf)jvV%Yc%e<9UUm5TK$2|7nzyxGT;Yq0DG(>+@&>plw2{j)@ng*Kx zY_3vpS@c2)ZvKq`18$B=0^}Oi8Zn)VZ?+Iwk-aaq1jkf2ITRyXo3o# zC=u~85!4Gl>e>Qq4KEv)KH@}JkSq{gw(2O$8<2IzilZ99QRJnYaIdYBgyEa z+GzUZCeGjjJG^EOy>*bl5WHj1$NtGRrxdMKvPD<1Rt_XnT>@JwC0Q(6Rol?RCKr5p zAp^w9zz`RTajYyi<+62-#uT>+h{U}$AF$bp@K_%0HuC#vj;TzIyL-_OGm5!zFjqUOy4H>NR9aVfA5-my5t z2ua^tXTI-f{rC#?4RmfhVZYr~_8t2r2?9x^NkmgoWk`wtuK&y;jppE;jnDi@&M-Jx z;R-%s;2cGC8E>F*^XQa|Z(#nNFs-6hcFWO<& z-KQo;;6`{fTL4d<3MS7LYqtmp{oM%4(!Gb3GRzCNa#(YQvBN7*{=IJ8gZi*h46Cx4 z6KryVx*@r~SKtO!z2J!tW(@BdJjy`on2l7-XkV-=wSg>Sa|n1IGI*Sp zBeE79^Z_V|SjDg#^R>(K*i!@hF$d;(m)iZ2trcDvheM{>?g(rw`=PQ|D+3;+NC01t`=CB%g*wG%bG-e2sc z_5oo^4qSamy^R<`-N$S3SsqyBv&0T55miduVv6LnBiJ(E@XN^j0y-Z=nTKA%d7`;; zN%y6Xme-U`xo_14&slbl@&lAfC-&VRPQh%riEsrB+c5R!ONAtIZs&+Tfq=6CQdx2g zCVxm)Int6LH~%eZFNGLHZ9^ZfaT=u2_%_`cptrzvA-Hl6bL*4*-&llA_s z9-o$&4CDT4_JUsUo3<>VQd>)+>S%iC-l8iFnW|-Ha!pJo&6H<;wFeec!ZRu(kV)TA zbw$NZ+hBLbm5ew*f0!em=soH#?RgGz6-*0pdgl+z+h6T4|AN+fo@@w~+2qjJlxfs{ z6s8mVXKc%i)+@3%0;wg;5wsl&%}}@o0a&=P2iP3vR!&WYbIX#C4yqx(btEd+EN-?u z>p*NEynodT(r`Oeb;%*YJs7>0>5ktBRXP~m4C3TK|22f0jsw+ZjIBY&1`>jja-{Kc z_9+Eqv^*cgDUo#2!teIYe(CVpdq!7>wq5GYN{!cqULKiA)!!QQ@TrQa!h?G!1lV9rC-ecFO`3`n8FZ}~NPe}p^;6n#?l8>K%(94E7LGXX(CVXicdy*s^lP$-s!5X?JA2^+7r+hR*5w9w^2=dl!xLcHKp{u~FQ zA*hDHT%BxKL;fs6H+cX;Umj=}-VFXMXnI@xR#i^-%WEsRA%#|H2uev#=c~U!ENxdnbfdn=K(dVjlJaF2ov_r6`-wr`idQot50}HS~UYXQLis!w{mSWxioRX2>QOlQ@ zID;A>CA9t;ZsS8gTi-W!C3%BKXLwKfYSX(9V?zBtHzvtD!Ez+eO0W`^M- zJ!h`uP0K-akfc(rt|EYI{b#A$*R2c3WUj^VTaKtpEYe}S6SKFfZsH)aze4=3Q?aek)BUzg zzh4=!bFP-%w2CNU%ZD(~&-@=_2-&=}CPzPfM{lTx!kSfs_!m+H<|#@8`)$m&!KWS- zzzJO9BTo$a?k63MnP}_$0V61IhJpX8L7Ai|Otj_Y@Y1eBqbt`v(h;&6xAM0mmiILi zMDGoS87uf-J*TxFB+|7yl8_b%oV7lhJt(XMrqe+XlBP2t+QhDl`%@ zQJS`D4gXHutr8lP01`w9QE_1$=p6J0%7py#9D?@&TtmMfU{Cg_0mr*NV?X)CRu^B$ z)iaGq>-%|{^4q`{C28>P+>%ur+#N;pH(rAsX{$MRLB`!I^Jd7ROg~zg-6mJg75x2) z2pIVR>}iDRjz>$wdgNqXX0Gd>jfQNP*X{2Yaek-qoOje2fJPIgHmTxb36c1~V`cahr_Fc4%ys7z(u-pWDQMc=5vJ&?*rNYyA zK3p4DSx{8+r4Q?Lss-1!Aygd&G?N5Rgh>;zJCLq>%|N3D1nKij;q!Tr`(?L4j7NRC z1KP(pE1!_Pyprp4fx<6?(5g!yJx~qAMGX9HOV>G+?F5d*Nw;B&&odLUsyj-sr$?-w zzO&F6I(x`gvUDL15K-?R8}0A1e^|%*k}+2Ob~!vFO%c)MYHfXN8GZHj17o-2ud>=!UM7=lKSU4C$mC#&J4x~a%n>tP3-U07qzRMK}yM{@0 ziWgLq153UACpwaFsGTJz$M-O9FBH$pR@zNn6GxEl3(Kgb@_jL7kHl<1r3$CtWwqcP zR?c~*0k@^eE)X}Mp}?i)2K{|+Xs>!!44FU=*AJYm$pIBH&Afpe;b20MGeHnmX9<#| z&tV&!a^d8fH^~fw%QW|u)AgPXGPP@Y6}M|UoY8zgeK);?O2Hh@;>wSDc0mJ<{;}&b zd;F{3PhnrCj9}`{;Qin|tbmZ?;zS|*^pVi)R7U{^*y^#wjOJHQk-TQYdjlNt54rS> z1U5V5SdueuU-E|gBf8Ymmo&niDU99hL$(HJisqvnZD$~{ZhcS;W}WAucM&T%OhzOg zhkD967JzfB{ly966%KLb81*%lD-iezC_b6$`YA~@=9RO(%b0Ww3p}A+1i!{oic02x z)=-km!gZloKdU&Kj8_(aBOx3QNAs^4KfLX2IStAzBJcoRyZZ8Cce(f=?YS#FxUg0{ z(M5QRo2DC^6ZKZE-#xVfWp$bo^belQv8>-v*5lPNEa!* z3f#it*DBMWvs`U1F`m#(<7vlwHGHk= zG(u%-0PFG%z3KU?-3gA}cfof0E|`zH%&zxE56XJjZtl=U`EXeHH=}VNkJpky6=T;r zqDupNZ7U(asvs`Yn0D)7*ys*F^RxRK_ZctaPN7&A@}kIG@?3dx@8o864HQZd*bs7Y zTfzuU4h8IHYmnh>0lshl2lU~;JBw3UlAad8IHk(1+m=u4+={1)hZ-0pES(XtN5&LB zs~*)1C%uVujB@-0#XLMm8Fu zJ?Q%J!_cbID{U@EJirTqh2U2V_45qSU|OYnxO_%?V83@D4=RbZ7T;`p0<@k_Ez7}@ zyTO0n(3L%rEi-ZDD7iRXE=C!eh-gb_jmqwjCso^Im_6D8?x&d{J9b+fN_4UIUZQ}3 zDX;a^5bPR&?jzsX>`=nBykDu)6L-i9!zugw{ZU zwfRc8A-8M291tQnT!05*Iw56-1AT?^cq^*+>EGl4000SZ_(X$FnLr{KQ&FgZtWdkC zlVX`r4{q;;bTsTFAAb*8EabC&6ujbp$pas|h-9||F`D?g2wANy2gZd_%AN~ye#TUg zI4n5~G@|imbk?HhBP--FISi!kn=3H1k51}?iB)PxSD~2;(}@Q++h%VDjAQrVb)2~} zX28m`(O>qElTszRv0$ij90gp>aU+<{vJMEn%IX(+AaVGzu3(3mIuq#JJ3j>&E2u;f zQp{q2VS>%AW}_Dny`PVd>S?0Jo2Ku=op8(_VMMZ4l#QG3JCS>RXouG*n(e0{H%#Hq zjF|*%3bar}s6$y|k}172nX&;o2J_T*%utrBc`n^|Be2}O)jJ+3jc>6>H>CTK_<)#Y z5!zc^4AaqM)U%J*#-LiRqyS+4F^k5-`|o`ss6oo;j&4)}qrKm|GmoJ1Au`G$$K{h5 z;60jrp|XKzl;rriwN0(#3IPCy6P7P0=oBLRp`Ww3R$-Gq6@w)=%i?$v&NtOEllOx? zPj%M{=w3g|ClCJC={Th?xYGO;S%{Gk0$GP#Py>xTrkitsyrS6>*dyf3j#c8$y`5d> ziAO8EQoCza6k=0A|4k%6c=fifu|4f_s>iyo*F-sKzlkI6-w&%eV_2J##aSZlnZ&p8 zlVISXLSK?)=5jvP6G;?9=iZM|*a`1e>j+YStgG%1pVkxnh}qLabb+$MAf+{p>POhB z{*QlSM7Axi;jSWMSK8=It2HBC(E`;P`CQCrCFSEJlX|14m#EnRiFoo6|MqoQRij_l z{M33)z2lq8R^@#Fiqsi4=PZQn1=c-06~z+M#`+9)G7OcvTRf1wTQwHa@8f%;38@c` zdKLPv;uDm)=u_;VxMS%Ezp-KAKnllI5oWIlKv2YJlq4sgyx_H5Zqi-|R2s$uVXqM6 zfNlMjfn$t^RF|nB#cMahz4Q_EsVND8Cl*4Em?9FCI0q1R2{VuaUqUhB8l_ikJ5$ty zw4`9gqa`pvBD>u*6C@d&p<-bI?MPUMlI1Cz z#X!r5&^o>WkDoD+cZ*X*gq2cegb#J0N^n-MSFi&PAj2c9z616-A|YOB)ftt06`8l`jW6y_U$A+h$W^2Q5`K{sp;tF znFWtg$onj|cO)uy5k5!wBAE!(VjF8ArD!B4A0D+kLK8WR-nyJ`Dx0>+2;H-p>M`P zEW_p2V7ySMf_*#U=2F^-P!S-ItlN7V=D2wtTx@cj{AZ-QN5nho01S>;dRnB^9KjFT zGk)jNE04UTUGA-i_U20j$RHCE%6see{A|B?ZeCJe#`AP%eJL1S^8xN7zk{}1ItY9R zfyL(^nj6wroI>*~4lrtq0LZbnfKhO(( zS4?CxWZxwHp0-~MWQa;Gl7=Bia=%iDiQg4{kIA$b#-E^!VYU)T{Xtx0`|3-o>MR^h z4_IuuF`9D-PL75=x35P176e6PaK=Y@IR1(uuEL!-{Z>w=7^QC?Yt3&QRU`}n@HARk zpT_fMe$ncYYWxK;4xkyiTuV|AQRGkH)A%I027oRFr9h7giI^ehFu22ewsW`UJ`l~+ zs4)FS-tf&eR~eF87i>kgZSLBoM*H8Xurq5j$O;uc-9U;&%ukN&QFIZaEAJ*Q^yPrYu*0yk(iQ5di+tF4ngll_A9dTKtoy*g}1}R z+t&<^GeKfJq&K)qGRb5#PY!cWfdkHcq)sn_vzNA4BO6EaZrm9GOpvG7?RpzMUK8_2 z>JCkv!d-3VlVo&xxgT2FjeAI1iyKjrx!<~ZbQxS&CNX~K(CQFM9GZU>AA{bZP+uI^ zK|A%a;CV@?KD>Ki^7$PLNe{N(NR=7y6v*!i1n?v`0UA9lcUu6H6wC9bX>IGtszfJl ze@`N~Dc7N&U`hkWA50kOK=4t0Pbdi3Obki>n2}JPlkSGr?6t_y5*dPDjtsD~f-4Sb z9&l9-B=LnGjR3f9PQ?X0C{s8#H_~=0_p&H@c}LAD>j?*@+T;xchBp9T6YTmF(am%o zp8WDQz7W@Q7>C~IQ=pvQ%z%-=#FGL|#1hwM3c z?uJx16#@t+e7usbXPy_Vj@tLHQljM0AiAEu?C4c>LF0r$o8DA)HiPeGjVA<$*eENr z33IPNZP&oTg$2&%d`>ysSfFe<*E{}o+WSR<8H651mJEz*<>Xi9kWB>i(*^NHmg@sI zKrwak6sars@#SY?f})(cY}GCgq?C2r<+OU4`9`f!$ zRb7yPKiWWzo&ugxZpU%Uol4cM_hhVSIW9^^rM34eAom#1WLM6)&Fz@SaN3pK2EcG6#?9-q_3idVhj zH!B)AxItKKwZMIPglu5DemhM_t}Dtw(!&U@g+I;gI@tN>jHb)(4=n-Dp0 zSB)_Ut%M^Am;or7x3Vo|DTkQL)LjHQJ)@_ae2irmTWOil(#Zr@SG`Z}>FgO|cO_#R zWE@slHes6xk3lbd;sxw=BEKop*#fq`s=E(bU^ao-iMh<5!4nfI+N> z<*Zq(lhBYphr^jLUzD%qCt)fnYoK9p~qRt1x z(v{U&vpXry%&Ts4N&AtwA1U$HqK=F-o<&|S1lezrlQo((>@8ZKiI+#ju zksoWgZ_&>>oi_D5L!7mz#Jhd6Y;vViQFFJm!>^GojtGREK-$PMao!au`Sf=pxLg#< zubkohd!MYbJjYLbaL*m2bH?f!Y}g<}BmhWNmk!-FkW2D@s78k^`9(cL6&0`^B2B!TmiGPWBPVDulZ82LUTY5kkc|Xw_akhC~wBvs-+`e z>c9PSqTZJ%Ufy2{!_0=xU_g6E4;?|3>7yIcluoQF3#edwXzYyYED~z?eSOa5K_;9) zs|Jr4bj@jAFTf@YdT`+j$aK{`oq(jmac4uY=@V;=@rBAskwc1$i`zD(mIwS(Lw-2| zW!;-@Q{P$0G06PNfMa)|@oKQq+SqOb;N6d9aS+stz_oB2u$`y>at~hC)ggmB(m9#@ zGhcMPV$c?;X&E^PdLuQ7lmpG!BSwNK#ZC|-SHLd)x~ zz18m)9fIDm3{{^vO4U$(0H`daV&Dstbjxl^2R#h|PcF{bwzjke;J=hL_5kmA7Hj!+*Eac!X^}^_AxIWv8ti(T( zw{E40<*q9G4I;B;j^9nQ;cz%V-qJyE5mhmnER!%huQ7-3PA!H_!DS4-a<1@|N_bxnqfx%v3Z^|I{Y)!ycs4}XRo`iy zCRHFCu{Rr1v(m#y{zKpZ5p?XB&Pi#Sm98@a?{v)(FT@o6ZP&CY;|;JNf~S7DZsH2S zgb*E)w*(jD1@&YL+U{dBpTy`+kR>=rqx9ny3rY@))motfKSKA0J7QDef3{RFw3)2> zwqKeAbVMCPKsB$*X=)lRN{Eb7dI59_@;<#5x=iQqi>jPulvQym$ycd+KZ(si>W|}~ zH7_zC!Y_I7VV9ozMs`X1I0=`0+}9NFenbNf4@l1x9mumun6ze`X%o4#p%=t zGK3V$wq+yqP8+;<9ItRrZ`hwNP8#VI4S|;bUn*ew$Nf(N>Y1K z*sUybNPYRMq(+HF8a-xLn9@eEsiMr+4KWO;t03@_6}=BxN&#uwLrXcOUp#AlkBXZ9 zjWmbd!-PdGh|HZJ4_*Z#eXbB~2VdxRCzGh+*S5CDMsL%Zp#|J+(k0Y`{T1+Y3-ght zxaO?bIt!oDm4WoSIg4G6N@Ie2cgGckwx5H~sjmGlGCXv3V&~Ix3jXyh?}lBrF^lu%v*2h|F`lXVf?h;d>sIoD2LsGez{NNu)ffv1+>?KmP*~A zx^5*fU8+S|!gktf_z-AA?*Xb9^p0d|^MN2?>&r2{@99r>^f3t^raG8afCyQVQq-N8G!|*- z_~al$BkmnP;q~D)_l}#?-*#D3%&G-|6phcqdxvS{@;*d%l`P`T9y|7_&FntfZ%gKg zop}^~w1azL<-VGTugP_qr(z>%c^;x3y(t?=!z zV)8{Oj9W#bd!P@fmDn~aE4;XC0I$n)*j~d2{u>&jBPozg;IMQcqY2dA25Td0Pf=Ig z0akbnUT>y&I95?LcRbb)bIvxv{yR^Go0ek;ixuhswSeG&C_F<3m}+g$`wnlc_@~+$ zzU3bHj(=_O=rkNIn7teMIfgx7mB5<_@l*h76hbN}Iyx{tC|lZOSQB$WlEl8oI^}ah zOS-L9um1e8KSn31f!K*pzk--_)UF&2 z_X+&%oyZ3wd15A7WMel~?Z=9UfA-g^NaMo%poE!HAwfgAL|M|h>x{C%ASG5ZTAHbT z95h-YraKm_VC4L z&4`Kzjz``ag<>*`+hQw0wUS0yq-a+|bjC~Fzih}`&HI?0a7c+Qp*4YpSb1y>^KlK@?;rOk8Yk!WyGrPAb#*4OdTFue7e+wS{(04gADchX7kC3(ukPrB;iq0oQt;VTP=|VMu~v zO(ILXn>u#%UzD*aG!XTMTmS1{TgbOXowE6PMJcj@{(|X-0`I%E;~4AVOtc&Rh)!~b zH)DF|@AG^twm{`N@yYtITBAfg`CB3)ff_cP)?Ptf0hZ70*vt%u zs7aMWOtnkL+OO3Lqk^AQ7ii3c_PDB7j}N8gHbU0lV%S4pMnJt9#FKx?!1(GA*TXAA zmdy=8s2B6m2N)7kb*X2Ai{oKQhy;vCxar>{LQTt`Q;F=gwemc3{ zUnu1(63O$~(j!vTM!T5(_sHd!x6A=UzgOSzg8s$Vuf|dXb^vDLY0ScR~qjhJX__M)q!T zfb<0_uiSyoEIF3aVw=n*aX3Wi^$}-InQ64{@AdHiZ7q$oCLaiBAE0HuVZfOQMF{du zjWIf1fp_jSbBME@dHw)DUWUTYa{bv%$xf1~wg2Y@r3M>$&7}*c|6KkKwWgnHiZ~h7 z)X2jGLBL`pao7-KzR9r26`)3GF6ZsWw=G;9s6!yYd?cjfqaDCN<)5d9igKXI)I#T0 zZd;wG9Sf|e-i*&Y-S}(_ymz_^;>t)k526gnw>-<;Gb7}a7qR@(47ka+-*cC&BqX{q zUanGYjA{GiZ^B%YT?~qh%#Z4_`l6XS59u!;V7Vz8UwJND9ybel+K z&M^bro_~+=cCSOW1KTi~=?k>1##y?b2WgH;Qam)n{v*0;5tfyjF>)(4-hndiIki-9 z4*;&Td(^!zXaLaOS$%8qcM){mX%=*^QY`7{lrAJKP<4KNr@>f+Ije7v3wLa*QZ2|0I>w$h=yZx;-CE)F06L;ok4RSn_asl~DeK*bT z7ZXm&enj=1Mzqks(Izbr6P100MnYREG;LCVk*RlhLOrTElcgwN=ZYNt8SM@Kr7-Z4 z&TR|Y8%;brYF5zN)#-9u@8kLhYkaEL(it8n8sRNUB-+EAwzTM#>c3@*#Y7B)a}Y2~ zWneMv?qzzBuSF4RNu~uEWf5a|`k~H&gs;+d5QQi-5X6{!15$iL-}Hha_CM@u=MPdQ zBuhUy8}yt!7wPky+Glayf%}TJ7Sko!{~>uo>;4v2l#dqIN8=3W;2W!UfHet1rYRI^ ztMHba`+k%9`9gCHV7Ip@4wWJ2VPML8K*Yl}Kzk15fJWICi^O*>+>tQrM43ik!0|BW zuBGB^y`2Ss0000GFJtyydJYgMil>gIk$RWx`hZBX;C)>$kvCawP8IExfBb?>|H%H# z?jWns=#-hxmhSulD0*o%ZLAWcErh1cW*>do(Ym0X8Hvarb)!T2>No-MYv;GFIGgp* zbBuDlfTk*Z5{Ubl5VYz2YyDaI{$6TRvd+y+ypZ9~kc)dN}* zH80PHTy`DP&7fgbsE~?u?xm(SbQ*Qj;VuOKttOIk3)hgMI}xT->8LL zeZ@2c9xcGpn=~|b9GuC2xxf=A+2#ik`PmhNkiqSb zx;hH9igFIJ<)YTCX-s05ULBu7Ncikn(n?{`SoihWQsMRV;m9%#qh}?w)IQUtu4FFO z2Yt&4ySj(3F1)-FLU||E6hu>bAEJ3x@^M#Vg++!fj3O)|8!$his1186YZQ7avs6z= zXA3op;{1k&)bmKzYDz) z$SoANESwdfM!m3hoKQ|Anl_4F>KuRAL~`2^0;3&P7>!V2+Vz%3&POj18n7K3^}1-2 zv#7!I0fV%78w>jOmz=A~z}m~^ENfS#r>qeSRRw#=0~)9Q9JNB7nk*qoQx(sanD~u( zBRr=8i=*77bZq7W%-oKt0ZMSKTZg7sE=VSYOWw`*FT6J+Q#20 zyxuWd>+~V7GCx^7Y)5KY75aBV1Cth{DDkb-z$U4#57o)HkX5(*cn~-Ib!}C~EBnpO z4eIDnTRt2X_tzKgo;MpLU8f(@=P1P%U+vN{)q9p!Nfev=&(RHI7#$dayU?2^{bfOZ zrAsBt4~|-ip#N=n!pYYsc9S+k(wrG}{0mIcAj&nolbWc88F&cpMskdLuSMgy|E6xNiA9R%MhoB<2u`v77T)c22JH=YRp=|=Wa6tcyLQn$^p!?gE1fJ2X( z&5^tvLo98J_})1*qpe}V-piq$uC8P?m%D*nm9?fbV7=Vjl4z!+Z*G1gmsYA_OS$6N5Vikh|x zSMh`&Avxg5*Ydp*rJQj54>-Ku35$QfQfA<)Uk~XO@a(vmP)}wwH=u*TfM>|2vu&79 zR*j7n=78vIV>bqw92PENy+myIIY~KD`CO0qVz%9$A$9zoF(ZIYW%ZamFTelNTTsJ= z%Cr7QVWQ_ODKRcW>@)qiR9TVw;N&N@BIV`mqCwRqlz~?*+tjU_r{9PX)BZK1q<~GM zS;_%~vGBo0WD>EpX*^wGM|CvUZqh6L`Sl~`;M;+@%woU*0000j1)^|r-y3%%+AUuo zr7l4Tt~AVMBy867s#eqc91DRCU~eM!=FjzM_*zS31wIq1?-qI{v&x-0H{w_rRiX^y z-MigH@TUi^l70;=MV;iDO*EL4w}5H66OLA*P^W@sv~s!K8fx5t1cv3GW$8xfsfvnz zK(=UkCCW3rw$#Rq<}}gHfDe-J3&4#92DWTqx)Z3kk@SFq{$2D_MI2`e)Y8cC|MH*xMru(KmaYqO>)B$ zg^H}Qemsqf^Wv19u=1-DX;bCUKy~w&fg~^k?12m0ksDyU5@~E0rx-*!?c;dZ9^q7!mZsO)&CwKjQz7s2}q(gNi{IC2Nk zbsHbXunlS&5uBvif{Qic`#qkW?|?gkf9WUCvP! zl1`f}`QMeMJ3To)hDGEA7^mP&{7MRL0fs0QA6p>qGUrFlX`XDMqV-_@Cbe>-sd0*Z5v zI6;}d;KqX|J&8~ZDYVe{ds>DSb6VkzicLMfx}H!SIj&I<>p=!4ox2)gRKakWgj_BG z-DVTO=Rtlq#oTUnzg8+k2_z{B^*UwYU-pg%dJ_qO3l{H9ue=tl*Q7n-4Z%k@7(6c$ z{|w8;Rmi9eE44AQ`GZpa?({W^yS3g&yT3LiL@zF@|KBs%&Y>Qyc?&pyF#m&ff zbs7IF2>_N^=t(sEanRp~o4IYn>zmM+e*XS^l|%-$K{uLQc#`&Cf;$nPYe4ijU%miA z1E>^$tRzKFK2%BqKZ_cAv`(Ut8TtZ#;NO-4wAO=t&bi2c?hF?lh*qXp@-IbsJM)bT z`$|d@9uY&W|4X5_=9f?o*}WXw*<$%svCfO@3<4(hd32tw_8Q|$8;`Z@`7+PB6~o?~FKhjbuh&kTs(IO4ro?Bq9;;X?s6o zFj{hz;f(Dr+)#*|^Dt(lPKW$Jdpzci{IHe*#)HDz@6BG1LjG~)bb9eNAbZX513Z;- zJ#>{h+yVpu1jGRSqSY)^H~}H0wNfgQ`;4B{SXQgXZgq)&SqyH{+j$&TK|7`xZ?`rylB3dB@@5fN%)sl!aaY|33&KpdOOFKFG75ECJ8ExY!c=!OS zhqFOwRslk6>f3=>z}XYuycOQ)-}HY<=c_V&qHsh$7T3~_XOD**2-I;P{Oxj@bXd+} z)N@9@Q_`spKhN-Twwd7v6{E_e9V_dX@^H(rYx%<4zGK%mmj~{XBixj|x1R*eSI@0O zx@Qd+yJ2}i0+|5BSfbQvHkIS)G5LE`<>l?g9X#|p*l-GPebg1y_ccA@#uFiqYI0xX z4!yx1_dVgS;{|X}L3+)R_0r-<&7}MN+32L=@1cwVXU_|!sew)qvP+0_l9yPv2Zs{t zPm-8Zleq6e%-$uPmwY0&Rcsl0*cVn~VU&9oywg1%6K^p`|QP{l*N z84nIWjZ(yz;ma^pWb4h$A}edv;me`Xc^3z_N9Qa`I`iPK{ zI?KNG1Q?&Gy|5gI1W(v0C=(vTi*-@CvDHnGI#1IkZFd&mK59Hs?)(20+%BXKfUpPf zTFCDVn(`B^D$7mvAg`UJyl|D;)RmC5Yx=+RdyJr@|v1)}Um#$nk|3$RV_V3H6sb!8UCjV({$ zY&0ZOm7=iS11&O`G?C`U*+Hd;eOmIC--l|_H^n(YVGp zvUi)8gYvrpJY~jEeOhJHwRhSN&1?3rjSb{7?xTM?g1r_AXT)+GBbR!@ZxjUTlN-5@inQW2Ir z3mEH+iIg7S;>CM#5ub`341useUFVstO!1RsWc9jUUwIW5q~viat(pP!b}BgnRz97N zV*V_4Z7~K`tETyK9+Qpu2N6At58LYr#Eu5}Eixm<)4OX6@>5I^pBo5XQQM));F9@) zseek>HoNNq8R(#N-v11pTX%H%0+Y;U)t|F&Q|?yYM>6I_7evfp7k%j<_8vG~$b~y4 zBVYOtWF|(a$^5p9>1S0h{sZE z5V}+9^#`&2ojz?!u44$Z&jzB9Fv`znOu2V*7}cSXSyau0GlG7a@Q54FzKLCPTwpB$ z{V@e-RWVgGZ4JB)+cIH?h)a^f&OUudsp|o63?@eTpb69m;#4|eCYi61;BPVb=;8ejR3U)nLJ-?`t&ZNB;K9@I3 zY50e8k^^yR2;-EQKF5MnNH=q< zWAZzX1m(j0oDcc_0{X$1A1D=xfi2#}=SYx|1fk-sZ_%y|gxT2N4R6yf&?e=w0*S52 z?%dpGQajXv3nz)dBndoxVt07@7*XTC*RWC_TAiSXI~5Qjqvdy|zBLs_j>L1CjdMxN z`rs5sPMN|!Vj+KiCw?&gMIswDarxug*07_pG`o(FR?y7ndC%N~Xr8Yp9E>@Dt`0<% z$RUNgoOz6baC{h&&~>11%AZBr0N5!Hixf`S4?qW>dR4vQO39j{b8lrXqu2AxI)0Lc zh_vSrdHDkz!jL0MxO56ovzEJhu(4KaUP+hEWIXVw%_nq1D2ndk{jT|GGxM%wErV2t zdf_Qhy_#{aiv5$+`Kv*d90RA7Sr>e!Pdx&Gmf3=kSV>vV(CE7|G(%y2#V8c_G?}NB z#wP)*YyA47kgdEjgUA)d*?aH-&j|vHV6A$^kQ@%|N*wFzNaE`q7bAD+9kvY^n3U-N zcDw?xD>uEj<7B5Cb~M^-26g=rYcT_R59ficF#Ax#x6LsyXO-p>TweZspo*-gB1=eR zZhz#VC`%K~0c+SpjjpL4%)c6*P{A0om8< zA*+AjYF2&AbQA|dzyS1Zm5lEV5J(TRBN= zKT#{PB@3D?q6$q{B-1zL#rr~nSt#oxUIFqR5!nl}KCzaX>)kH(J>OQhQEtDKpQ?e} zussfh;FC;Ho!vcJ4z^aUq}>5Z4|v_-eT%c+m%r+F+j?Qd>ZfJ5F=ytTS%~w) zBj_kl)v|55Ql_YQ?vQK%oglzksv|cPu!R+Y~ z`=~R5UY<~D4`7c9R}$Bd4)4_;0(e4NIj-TODSQ}%YVleCG9ET9b?#) z;R8mLXPJ(phDb?&%LO1no3CgYIOif`FDwrHs>QC>S;2--@G3fZVua~*=bj3~6lL9W zvG4&r7{mD$1zAQ0d>PVzf+*hW?J^ZROvTglCSB@;ZnHg9n36vxZ#oz={Tv@J$8Vj9 z8>IH_@e6D3yM=wMpE>ptyK1qsM4R&`b(Y0J)*WP?6})Uv9o@Zo=7AzFci=y#A>(Kw zAHCyG({fBwV>6c`xLnDufN8uGpG+IREA33ek@`)$t};vku3pfk6P3sqFPRltKHwW5|Cuot>*?Cx49wfp51%hR+{~WNCKHK?Q7!w6S$c2$ z0}ynj4__ZVRtS$C{JEG2tbQW1aBI&;FKPp!oDchwDDDo}=>1`_c@Df%SN_3Uio6)h z?Vz?SJiaRu(_HBbf}y#tx;v_WUhCC9zg|d7Z^Hn&Zo$>!Oy&ULz*x1}Zd#f?uwh;g z#m%|;)Eltqfuirkz;HQ_FlhAkQc_3IHO4JcW=<{Oe6IQ=LZrH6u#@bjju#Ar<35C$b$L@Hur;{ zheI}PE>4dh?4IG3Us|VrcQC z9h#m%#d2=J#yh#ca^`iKaDW79)o#AVksAoqtvnDbI4~_?rrG}32Zo_1w z-PU}>qc?PiP(+x(YoP|P08LQg)!0JxDP|-pTx%$sx8j+FCc%={d4Nbd@&E>_e@xpL zuH&3W%aNn6i5i=wAsWK@J7t?@yP9_Gn>5U<3U>XK#*h%=EnJkKzg7G&$h-CmTm-Y(lhFFXcDYo|bmWy@E&nzvBXbJQ0(Rw#AopfcYVvrRUOGD`>pI3k(1 zL~}bD?@z+F4P;MoDSMDB_6hF)Pab)+4;7b7zPoM z(va?h`8K%-a%chQGZcIAg2!|BVFmhXAY?L+q!t?H&R1l+kBlSJHz z@VK88Gg#A8IBpyhAEiiPtjYKS8DkeFu(XKDyZx5#b@l;3g3jFJCKT?oRH$#x9y?U~ zm-ZZGp+rqpyY!49ad*y2no1vcvQiVmfIco5(C@yqCt~(%D2j7@PU}K?RaqxwuVHN>9qL2qH%t zly4t(pMOF4*Y!y*0so6_Y$*rTyXkPRFqLYMKgER39);L zI(9i?KlcUqfy%rTv4w&{X_Vli>xq1QysaV0xiq1+nM`TT~XuGH)PUt%dnu6+!5DQFM4hxdVwN$$f_LuTmz5*G|VOj zL|$VrIV4z!e`&Z{Ur7^5^x_yxdtb}7Hwa3Su<(Y9%OTYa5{q@cIba#?m##Of4a^gb zE5adN^=9Pw9$&!q24wP(7E#lw_nCdHgi@N26B;SW=7tNjdN-5saajav8sfAkQHYWe zK1Sc$b)zyK&qrU+^Kv2e?YVkbXkqJi6^E8{hUuUDP}T$cK_uOIa95)kCv)>xxc5lj z#cClGPV(T=b&gn+S%A5-i;OM*aQyog@cFKopaH61-zF-5F9cPOLha^lQV^w^i zF7(=kdY=Ovg2vvq_PbB-4y$g#;zz{(AU>TvE8qM+NO&S0!ajm4p)!IY_J!1YW&>N4hH)gyca!h;K*0kKWXK7OUt3yl z>LgD1i+>%lv@iKq&g={hrR?pMW-ngfC0SXv8)B?KK%4|*vh~;y+ei58J881$;CN&- zG=?R5ly}Hk$nJ@H>!D?bPdf~9I?9F>K(LsH6}5b9 z361ZnBaJ&Ts6Af*V%4%};rOSB`%58Z6Z>he$xmc)mt=$bXOQFd%l0TSBP7@ zL|XavfNPHnY=E$7O~AOI33%WjhEoPJ3<1TyCHQCmMn0h8(Uq9|v1k(A`>`U&v9BeExY@ zSvZWAD0UU6g;j8TG&g57(P8W&7gWoVl6;nu;VvZ|W`UocsQH?Fd zxNp6AH$-&iuGa4JeyLclq_XmPpq^X3SIqiAB;=SNr!0JT`@=DR40x~YQ0EIpP~l}i z1$N2MVq26&5(&`t;;a~Ga=+ag5$!tB;2L@zF(vw)b+I({3=hT3!PI#; zvD#fy#>7vtpuTJ=y~KYhG6zDRaGwwFNLFAU{Z{PE9>AH(# znU&ndA9_@G_7bn?L*h(2n?;Qooi}7BfP3txSS69Z0*WQ*W=n1NUTW{L>r5-2=NxdY z5nM%OW)GDF>t&BI1)+OySOud^Cx~j^(Pq_B;ECOv;0O}$6q?Mma@gYn^s{Z$LJUg7 z?Kg&KmF@H7I?9w|0j`_ieN~ML=Xvb^F5wYT%2FSEKeZgf4IcY|m;l z@_gfpZ3&^DV);bHoqf(0kBlj!^3kii;a%Db3c}Qsm>1seRM;5 z_RAZn?HS3!>HR{T`{19gvQ>&Y9Ky%94_{8^9qGE-Uuj-J0O7zA3qrHz$;Wt`0Ykco zKDPdX^4TY$dMo0YZNEn=o}2r32NAGA_b)JMCrKW-w=@i*QN2W(A^4z0bG;J1(!m4^50CclM)<-5K)!{=tfQUo%2xzr6I_-@rym~eI4C%*zT8)YzS z?KjF0Nv>c*D;P`uQIZy75R)Vyxu>%Tti|`P_Ooefpa3s0Qj>#-Mw0u@LRUyjZ8=L74N>ebjBb=R4PVFnBaTu zcJaV@uQIu!&&VKvOQ?uV9SSbZWRPJ)4X??8mjE>z;CNo{dE6NU?+j9L004pkD%`e) z6utBdG78TjVMfxbr3Stc4&d4Lx7}GX*92OrgzQNtJkq9{)woREDjY182KLqpBJK@x z@rLw}*x(cacdEi5s+zc1a$u_2N<82!-A?wQBIXbVpm4_m_~hD-)7}@5THkuzv;Ocr zByP;V6q%s+nph&1&0E{t9pF>+h?%|@0U~`LG}|}WGL8H_;S>F1N54b+2#e-9mXi+KbGrq@{8ZRTh_Gv$=$y3fNC5!}o(=poGQ zfFK-5|F{K4vTA}2&$$B%a?Y$SP?0yg+cq_L_s!>Iemwe2L!?TQrFo=z(`bs!0=Nql zVs|UONtdAZT$$TCA3;o5R89MyYNVGQI>?gclpt-rbNYuZZSEZkL0~5-37+}}M{skb zB)S+|CvJrgUWC&duC$VWHQFoBCn)}H024aM)Vnw9tSHIL88pKT16A)Lcc#in-j|O9 z1@r&(H97YS_ymQO{wkI^E&;4j{E}g}l5dO_7N|GjAL_jVGcyhVq#}5f~&P`2%W*=`7}zW+jZ_|!b&#vyWG&q((edCa;w-y^E1d>f16iF)ef|gXV%O&h;Mp* z%kWN}IKqrZG5{sXoIpA`BG^L92+k&VLXD9-c^F{Wybl#@yuB8&sQA2lW-ky$9+q-N z%YZ1Jr>&5F5#N9>rYnaUV1fD8ctl3cl9;U(I8x>2-puvwUrOd0|HTrabJM=zJz|z) zVk6yK%r|SheQexij_MDb)Z8qJBZG^yPjSPjqqRUYgQhxXr(Hx= z8~PdDM2W9n%%~s`nqcrCT2Z0KKWNRcB^^ReSkS*`7^)?!q>ob_4x#TzmM~^b#2Tfk znBK9b3d~)H7`5iN$T94o+UqBF%*EzH zMdI}LY5sQswp46To~oUMRWc)k)cGC00Y3!~+TacBF0Lr0@~8an@z->!SXpr}o#X6B zX<@vHJXbO~bV4BB?oDReV%91SQc}T`JF0 z@OP(=0K|OU%?8)(97xcg9|LC>oB^Q~!x3e;HQa#*$}FrM?y1FkeKS}*dcRpj3Xkw$ zsLUAkY~mv9)zL*^!D&fc#VCwyLbi5;8t zij@;M>s}b2SvC`dxKT5@FC57L{&Bz+OOs=?df8&Zp$X1dp}0kY{t`2oIb-*0P1T$# zBii94TsD`deR2&_x+=l@1c!^|Jl~`%At`~l9D0NODngxswlfOdo0UlGRa2Lr7wqPA z{c4_@h6TP(+=5X?N1(^p3N~vo=EM%M_pl5D_1jln&??EtXl)))3l`BA0aI zgp#VNFE@d=beY?>aD|yT$}-rXWJHz%MUbzAuI;!yHYp%VpKVpF%}PJ;kTPR>UlRO!EgQuS8LX>2+?m+p&@w&@4xxk_)F5{3==OP*&k zgf6VLD8h!T5w9>X)am9TwUD8IVV_z;jUZ>X4XcVBO>*)kkwsfdfYK`}jRWV%v5w|f zrq)D(9H++@nfqosx4E;3&DzU{C5}eo+UsoEXF!x$&nC+;`MG@J_bQd5FHma3jT5Y*Nz~IV&f&eW^+kpg6n@+$x zH=9LM960I+ctRKC5JfV{1c|z|0T#!2Pa1%7T~#Kc7aNrPrli>XI*xiTbRr*tz?2MJ!wOpxEP=TO%x|WtX&3p z#9LZZ$Peo+Wlg`%fK|P_@ZbdOGZs3LZnWY@_FWJoHN-}9h>pA<>7`1?DGGtUlzqJD z7lO#U=Z41$<-+NUQEb*u zab80yY3JO#ow5mw$Z=EFQ3ANhdh1YW7`?;^m;EH?UY?v`>>AEHK|ON?;$;5B8!j&f z>K23}_bB)Dwr)EHSiMFFc$z#8&DRY7Ge4`I+#M5(|I6NTCL z&@Yl(iS329;1$pk|BUheoXPzcw-bFQ_+o|V6a8o0Va@pJ4<2{&UF4o7J%F}HJPQ_k zM+?DZvDdbuJb^zI92!D^AqR>iHohT!S<}Rk_rigV0gaRu?EB*BF@mQQBG8AY;!_5^ z{1REyCw-k*ZRov-3Bp%on4m$NqzQ+I)YoF+%f);mDLkZ|nZDJtU3f^K>=UU1uDydX zF2!a)v zTZV~|iZQv2HhH^uAGnpWY<(MO-K5W!xqi#{HU{WLTfrY()|B@; zl4IP72D_uN+CZNO-&}D;SX(@)=v_av^y|ns3fReeI=rQLjVYLM<1z>85Tb1(n45Qw z8^mo3`lp|5MFB^F5-@wD1gXg29F;9ZF&osWN1s1Jw6+|$LS@2=V&bG7fUpaHlA)m> zq~k4(9$9TB&G)#wQ5L=+oQ876W2Q-7+(sBklNA-9lK}ZlNItU_)BmoL@r-@Ju@j_0%;g;s5_7R?~8qxL* z!#Oz)vEAZ_|J3+@@qiS8Y+*3W7Fvx%UBmb+2F<~7Z_yJIgwt7OPGjbfU1yMSnG2KZ zu@T6}@e#{CYsC=pGj;%Dtd!gepArt`fB<7o3dXcWyiw2h+ICM8bK4CQ9gXJ#R@hxF zp2miIU-%;kWpzlUNhXOghvJYK;a}{|Kt{H;AErr+;wz9{uFZim+;?D5=D4Y&QWaaS z%U(cfuCJ<%t1Emu0-KI}y8Rr#nU%%`oBHc{VZ~BBlw#*Uh;5eP`724f>p&dDxHw`A zYIY3~k~>(xnybZYh2N%ttc2ZOD{`>Wxm7RB#vy`v`kC#!i;@5g({oGi+1zQ_#7Otk zLY#zYVQ9rkyp-0r!9iPR6ud}p=xO7_E|A!y0aq;}U1rAF{UuB0=bKMoYp}~ifI4qx zWw1)Ai;4IXSi`EZkbiQDzfn4s$yHkY1B2^#hfCL+xN}QOq-0Z;yZ_5G<~zs*wO3`? zW?i&e$(L&*x17diI$F0YCojl%+>@t1@s1ZNSfc^g4dQn^T9|> zXKOyw_^ErbVDKy%v_L9h9EN^{wAXdTU!ClyM&XC~^>Zd_rGrFXSoN-1MlT!vGlARc zIY)~^TCdpehn9gF9iXw-y7KU>cM|{SCVX~ybb>hBB1TKou5Xz_Ss_d ztB0Yu4+YZ)1+gYNWYer{WZ&QnT8lYjlv0OT1Tei7eh8jg4vM`yg} z4-w`Qap}N)OZW=Mz%LDX7f`eUTBcH~JiYnusF&H!klV|lvm#uyS5P+GLxkj#@Y=mw z6$-vFOLu@6sqqmQoV^kxO{?3>M zfT5}~_xow=(6)qH?EblKaPDxX;t7o0CbB)#jbunbd_7h_a(XoqJGk@9f?22j?e%4c@+kr?~ zCs#)fwG;ZUa70zd7}4)3?bcjN>&i|ad{OgWk83-+pcX`*og%o~Sj@@^(~cp8bdkye zJ|Pkn+Hjr3l(w_?U8bK!3*}p0k(^i7g5Q1yh|P$PgY7c_HwA>|DbcaS$7Z*Bupa+6 zQQ(eEZX&{sxWXVwG9`wcBIFuDNxUY0Q`dVK_+APxNai8yxj_LzvKL+yK9)CRLL*XVD0IcVZD*H^HyHl5C;LHuo~PJ~KMEKd_xZ-Q5r|gQ zgdPaV0BK08aU5U4jCNVJ<(BIQ{i>vu39K$hoi1B2*V3qeX}J+fle&ih%^WWyc`g$G z-jL>Y#zl;!RLGC3mJrj0rf-GVWzT!Z#DqC?3l>{XBNbhmNq2Ww2W_Qv{M`YH9IF8F znz%;%Z!y74;bO(_n(Ls(^=u(!o%OQ>HJ}{y2?maTZEVfH*-QG#Ct*+l_+sfpvrvDO z%eiRMT@fVG-{nzaOf|m!exko?g@5kGxu!syqKbWZ@$;%-@oOl1_~!-GDb6uIJzwy6 zyG&)Xml3zH`gkejbc9&9bHV6^yG$>578O7j17buZYVHSs?NB{&UZu3+VK!m@+Z9pU zL}I%utxm>eA)%)1X_79CsLLt$r04~4rkX5pNj&xhhrv{g06C6mqdLu^55T2wBH)UMAZ`7&2l62Y*6S+hlbmr7CEd&Oy} z`2mYm%VpghM$uqRhK7>U;r@a00000BC)WA{P;01SNiCLgWWGpOh59-#nJt@ z`MP+ghJ=N72^sm`@o`FWhi%!z`J56?Br zr`gq(?UD}njbyrVX33P;OvXr;JwHNYJg@@j8bBm2Nohmdcg;ve+8rIx8WskW9k24y z|0t7^i_-`Ot<6XQ+TtNX;MYAz+oT}o>LZ!{LtWFjtC4)=4uoY6`Vw((6^IGt<#cW% zmYEas&ox!9>z?>JVCC9&7J$k{FCh`367h^^Uzd}zS*2qUFhv}p8R@9{X3-?HNimIf zdskvFalnrQBzu9nWT_pI2j4~vC-6q)lO)lNtCk6t)P>c4o_G5z^48l|D74~IXNfH4 zF1Q3!{d`6qUL&L=15=045~Di6fDFu?;xXA6qz1s5Yz=U%O)%#r&nRJ6vI*GZ-u^Wt zyAjjnLMjAhT>S$q6DfabE`1B4@qUrZbtXc}v=f}V-D;$fy4#n|L&vtE zfCXHj9IF%6{2!fh>J?z+jNNkS_=Wh-U2ik&;V?G~?-`($5h>%zYkpj-w zf$>WAF_LMk7YbVhp4my#v;SyUIr6;eA>0Z6#HcaNA9hnT4ki$MMu63LU<#uEE{BmU z9E{OeAbroKfwG2pK^f+#y?$Hfp~UjG|L8W zN0ijr2`X?ipJrwnjUUfA@!&*N)NG*)1~=XxJTZdG7n=BfCmG~EKnJ+uTg@SkZ6#_L?=9yb#-5UM#HW8=*AcSuJpuXOb$x$5xR8#fuoO(a~eZPla zEh=a0t8`e^ap04{rJ&EZ=db3YtHG+1w=wpI79=g?t;SfC(!!k` z=G2qfeH6DNUVnIU@zM&*SxS=@F|1XRWr=+7X6zDBhW@&00-c$H1y^g(iK-YMn`Adn z1tH@qhwb(k&I}XHcuubBALmQ&KT54e{x-WSEh+0o5Y|l>trTRe45+j)ZuzU@2+p+< zn3zro{AySWF>tDjl)^|qcJH_%aqW7+A|7LRx7WW?$VD&rN&`6G^dj;DkTQhlj3`tGL-)^(4*Pic15eMN{tp4EhDUGy3^ovT}H3mgX7hVJndOYV{JI) z$^f^6U&*mDcGh zMUcviF+RC{lbfgAHvg+>AjPKGET7P8=b)Pcv|d`&)X0k}guYFfU#9?FgJ`!JE@VQf zm*KMpFGq5k7@gS+{_~IjD<`{mVpS9_;8mp+`=v|lSZ!$^m%yY?k9!|bDP{;{6dhq3 zE$cE%Bo-1mOrW>efSklgvfD~ruiJeQwsCS;FDf9 z0_i7K>{L=m&gK#B3;qo-(*+6}$~!&6a$HQ*MFjG*cps{Qs2;0pK58J)`2GcE9?gZ4 zuz)4?)HP|x2DNQMUyn&0k^-mUmCtCIoc@Dg=p-C2r6bAk|5!1nQ2wyx+_9{$(sR3A zJ@znUMj`e|WX4fw;gIy{u$-3??_Eh{skjh$qsM_&{5Jl|HQf?@SGcCt)fCyZ>O!8y zeE)sclm$a*%ANdctS>izq;)=Mif8jg3PL$igajl!X}j<0+CokhE{An}_qz5|@uZPu zV1@y(2`>+4DTNaIG+`gALU_36 zbcZ8*_Txgb7?mM{8)6$|oGckqTq~u&X$@yDbQi8~4Hz-qhj1Ze->TFp?(fDgQgfL4u>hiFZM`KA7s{Y2Q-AgSQ z1RC^w#jfa$rA|(`vC8eo<J9Ps1dPvbedywTF}mzhNMK-DNjXKYa>)nO37y6KezCU|+`z8SRvgk(p+_%wIA0WoHGg9zWC7pK^F zImU@Yo(!bPBp5wM+KS$^-}ft}_C@1qA3_45(5Zy}$}cmNF4zaaBZqe(-wecZQM#zY zqZI!+>W=UT-#~d~ma}3qdpWRVG%X)!^t(?LWp?=ssMLRh@X?f7oY-IrhxFw>gmzR` zc(pI~;oUrGQTyh*LK8JZC;0xVe|Pn@Y5((^H`M5K>^uKr{VH&3P^-G%r)4TWT#u$g z_qOVh`MhpatR5gGGU77{K>-o$UtbaaXkoC9D<{b@O)ZMk4>3r0n*#@)_HADM_>jK` zmg8eSOY@DpxLE3^_#f<2Ko_%SBUP^ywzKdT#S#sh^;r0t_4dVJIKQtb{V!RF?L$(C zla2$1;>YWo(6jvlu*&4Z`jSLJwSRKdGb*iPkA~|F^^!u!)=-Y0uz<*KVEFYFz2 z-AAO~M3s@SJJ44xcQWA)UbJO}GJ_w`4ks==f|W0xr#moK4(S@39WN}?;WGs~(;xcJ z!nfsJhoE~Gzewwu-&{5OWU)uMw8iNL8dO4vL*&o>hDNys$?^#I9_)Wrrz~ZkshCYe z7-}AEOb;6zNZGR~3G?;{%5#W@GBrxHV2pp|dLSUdF@C_m?l`!WK5p&ypSF-j8D z|1Fln4k(558Mc}z$J6C=GU$0$6<_Af6v{8!FI+UX@W1t_2Rt7vUNXrh+z})G;kT-@ zYE9vGuZ0dT@*i4=G1ASv(s+<6_#9Of%;c zk((+VZ2T;5J-=IJv$J@=V$%bac{uBn7M^maLGQQM)F={&fJ%D+Fi(I$(r#G9&Z=pC z43hFJ7+m!cTE?_W3{ov?9e)L>Yl~9%K~Nq|SS~b=Tinc3I5<#i2toYGB1f~6s%X(E z6bdnxF%-4n;;`as{ID(EqV4qtyRC_^#>PoSmVHmKf0hN=5y4z{8O3SZe^jEwRU(VIR44iLNxsD2Y~^(UpD zHp3(9^vPY`3()k%UM6}a!k%!l>518;t;cWNHs_usHA^7G6WF0|kN^Mx57xMh{=wiS z{0LH*fSKP&G7%jR)JK7L;;d#3Uy~0 zSv&B*odD=Y@_{LKUd9md7ZIlPXU%O4an0fL?G)E#y3keyXiR>mMr(^XM2M#F4+E!x z!V!cTm2P&6J5*Qi+)X=u17!c>KE^E%u*9dj$z_olbkrg^<`-AmY%svCc(<<;7$suM zND~hw_?`qU=Uw@Fd@>kphJ&IF%gEqg!5eF*dw+gb-`h~N&Om>{0@t1g3M(oR7|DBj zBw2Xpvzi(zHopPQb(<&i&NpMx_G1t|2SDg5*x$EHxvnaZE><4)^%ak8$N=AriJXYY8x5c{3Mk3fLA{>JS~=;gm7ahut&(jEp>> zF!gBLTdbcCj>+kuRxT8pgJ!pN^uRd1P;9-j%QFuH+pE`?G$~SyTN2%y~b_ zXFv%)0Xsm*PxfUVqN`ndpKCpKGk>p8O@4)HTb({YN?}s?f9-On)W11lEw8Vz1=B^J z0CeybH{2!GyHi?=_d4ccZ>A3HPlY?2$`NGtgC_sV)tJ|1OwqrzM4HxdzN#q?ez404z{Nn`7Dlan zFkG}%lR;9VTQ5=ExRNBH@g+-txi5xhODa(!FV^+{l5;MPtp4Fg4J?@XapID z2)mfI*mVA{$^s=yOb2q>k^yf3veXC3@W|QH~2f83Dw~qsv%D8o4>^21hY)eeHb#nr-Ud}SiC;Ptf>HbI0|VXlR%XKNHWG=M|$YToo&7=vO@ zxWem}2}V@ZW%LE){r56F9!F4v&2aR3m}6aRKXQ48XQsE6J-=RJj|B*r?==9OO1)h< zi}$+m!&AsWPbm4wYs-w)7t>m3pw~B~X9-=HE;x-QYG<$oS#_$v;pZy=^q5H7EN?$j zJs5^lj?-|FTnA98Pm&Ye4UXX@;3QnHRAn^Qizj{tG(thCH&HVF1pkIN8uYmhW1jVF zuz$UHI$rua&XhtIp-Nk&<_g}Mg+_j!f)lKZ?$|MD!(~WuGQVQfJ1)WI^&SR&V4~>0 z#Bul|7G8tAzbNtd<;y@woT{EnQG5Vxjq=(J3u>HS&4r0wm;h64 zidQh;3}fh=jgI9seJYYZ{o~Y$sGET9q&n>Ns+z|s!P1ttw5AWNpxZF{Esf9>tk7GR zuCb({^NT)NNUn@;yFV!?+JFHdcz%2ZzwiJ60X5+-uG{5{DZToaSknH>n2eunJVflb zt^o>1xSJ4MGVUrZy1v%Q+*o|mpQ8Lww>pnGEH9h>8YHlxGAMU+X^}FhUE1tApeeqf zjRY~%k6?(l!rYV>pj^S4jqZhLP*}ovuau@OoP$t}uzXYPyN$uE`%fGxMdumQVBrwg zb&V8%$7ztzR}51E5nF(`j22U1Mrj%{9>lOvby@+~CJUNqRW5UoMN#nKkkB%7Y`>>` z-L{2xD36gy4)h)~mRdiB(kULFq8Ty6`5ySP%fB@5>Hj5r612pFN6q%OUoMnMr5f$n z>qHhG3Kbh1T1&f0M5RQ259MJN*_BKg7Vg}e9e8?WMKRZKL9!C|RS$|Y+uk6S`+119 zhKAf{^@zb&b#oMQ1qMOpYS7!YT1~^{oGcX3B#uy&@0p;bZi2W$F!>9+Iy13^H1oSg zHD=dXMf^J2F?7pPRmwF@^N2;Amqd^ldf*9)#kzaZ#||z9#GWr49R2twvCwe(y+;Z7 zlsGLsa4EMP!SE<8IEKVr)WeX(F1CC)b5JAln|%O>lz@2dTIcurV{L2HC(vB500000 z00fO?4IQop)J#iH@TNy}01o=%EX!@R+F{|b=6sZte0>{x#4kU<2Z>h(qX}r}SijV` z-ozw)bh(ahFb(B;t*9^r+vs@Htv^U}Gw=gCaQXu>vB<5Q^jzyRp^t^}&?qs%t{;fQ zdn((yK<*^j_2RYNqL52J$gtKZ$fS`e6PkT$r1{KmZWBDz8GxIs(2ghjHb81{%kMO1 zD5@!-X=9dya>t2*PU}@F+brdikL32dy5|(*nPWJQX|SUBA_{ZCaH%E6&hy?<%Aq!8 zy^V_+I=h(WwY(ssPv5==={Sh(VFksGW0d1wx7UTZzF@F#a-BM?N{3unvS5lYaV9om zvx`6=YF!~rR_4)b9j>MO)34^)J&6hPE37-2=Y#)bopWXW8`s*XdLVB{yo|AXO*%w% zE9dIiyOkG`zWUJu&MaTLu1WDEhD4AwXtEGq4ifn5@Pm}@5nwNn$xhcfK^=>^uD=NK zpOdb%M`ip!5E~hXHUmSBNAGf8@Urv5jC+K)v%60HB09_>0002jSNIR+Q!@Dt#5E+~ z7~CAF;ET2q@%cv=&el$n=$e2^?n(7%c#qUI8S{YZhZ3GVbYgZ}=m zNC6X^&wk=Ppp2))@7I=tF-<|33C>?4OGDzd-G)xtC3AIoH9hevHc)_w1rm=6Cxsja zf{0a>ypHD}x8`#G!F8;m%|`NZvirNs{Z8Gp^g<1jIS&$ht>-A8FR5$Ga8r;%oi8N6 z_0$T$00mSFnTqoq-~vhTh(xwyhdaac@RhLT|GIX*T->APiwZ-fT8o(kbRY?CGc+$dQ4t2~AwGMDX8!k09)d?XiX61C$gUWs9 zzRetQ&c^*>P$N7cL5`N4u-2W+w%)$axxLObHqC>$w#C04cQp(0Y!T~m6x1D~)A#S{ zoZWsv)YBp1^3$RgFOUqdo0dN?K;@HflEJ z`#NgM3#JXXYAGA^l(=6mSx4VyI3@+@fqUM`53z*f8W_X@d=*xEuOiboxznvDE+XJt z2H`*9nMg;XkpBSdEVU>}n{?x5i~M4`#giC_z%{v@vZ~8IS*C>a4K|#^F7Y`pc{M{l zUK*w9rh-d8*fL}I05+^QziBwgXgllK*pE7NW3B&FC`O`kGCm?G<6YTcpa#}Xl~0zn zIq^n)5SY(9H!e2+BpM(J@XTLoTP>L2m^8Kl!{aP-{r~^~01;Ey`e_#Qst-_GPQBjG zocVf9O`)&tpCr+B1SdesC}`@czxGNwtD5dJdaG%vacB=ohQFFpc!3vkUDeb8pOh*) z1N8eb0wpJk^w69vtffi{CUaIVLTA5uAzvMic1A1uNhk}!U9XZ-9xdwsm#<`62;P(q zDLlau=uLV9B2|1MLM3@Ov`cbb^3ZkyG1SigrXujdPBQ3fb1O z*MZ}=t(>V*sOz06-Ai1a_9p%ccEKb|#uqR}V*Mpbl7eYUJD&L^i0 zcQI+BEHRx7lVo!ikcfnv&K0))*EhQQ^3-)SC{U*!w(-!rUJuJjPD=w?lO<$OvLEQ5TFXf(g5oy6$Gtnl%&j-zfP70+3)=9#Yw|tsU`gHsyn_$$ z*}6c;on#+@H2-M~dp+u8*sTFCxGzL8ZN|x;&)IrNELVhlrx}P6rJ&{y@QIoM008eK zqE$?V{IpGKb}->&=99P&e`;>d$Ca&vstW`l{x`co0000P1_dH_#DIg4m?weRBQ=_U zri0*jvPz}MV`pa)oWk4nQ3KU*R|p3 zeNPfi%`LjV?4kvxslUUAa*AKx9k7B^jXOe{w_u{B3~tKk0<;&@bM2saVH=%-5|PS1}y zDBfRnMj(wn(U4iK49&_~idA6& z_8lvs(v)S&e8T{bj+gKca~;v1?dBt!%qaEb>z?xyZWKBgOT&qFIvHlo>cmsO+Ozib zrd#Z4^=uz7O#Fcbvy(f-C6cX-tMN7^Tc0ksxegfGOSMr(FOoD(px**~<{{SS55-vH zTF%P6JeiR6aG96IBOFl+uv?4KEymlmwR}&1bVwPp+T8U}&)@Ah2(_wtWtoE3%Eyt} z=di<*sFP+Yel_084nvH!IlVFQg*@JjdpAzk36{+`(LyMGT&F zGn?ZQQLz8ozK#}Uek9?1LFHfF0&W@oq!|Mz09@~sV4?ENdrhT=-k)4>XY6MRwnB6% zWZ{MuH+fe}d2cOn&M!PhAkxxFZ;1c^000sS9Lnu9**1M>YkLfhq>gnOJ({FwdwFay zR$PGK9N&6DIV&Q*wF{Q8i&VE2dh;v2WS=_;IWNI9G}3j8hosoSOzqpH__4? zF%$yGQFzmyDC1Q2co4^0Ku0YS!^4gS+md!U2F+G$^=?`Y^T2Cj-(kf}bBqHA=k{#y zH_APBB9tJDzy-DdkDE!(_{rKj%X8xF{qsWNc z@=(34^(G^at!{Egk10H?hX4oE8odboav8+E;s7+SWup=o%EFX`hyVni$j8yGk>>*e z#@b$rbsWG#L%VRy_KZUXW=e{T(oyA7Mc4e*5XgKwuexqfXl6}o#u`#0;bO9)zed^x z^h%3SWl#IJf;s}xLDs7X=8{$Lq*Q#GbY%rM#+#3)Vy(VCHs2=X<^^i^j__SXX`ku3 zgfJB?kxbN20+S?%ASx5}=?peRpd6vWs>5UiPc}pI7VYkHSQu6v99t0MBS?PDW^gQg z;fV|d)yo2Nxr=Q+eG5M;W1?jj`ADhi&(`|DvO+lnn|!i%RV^Ehh5p>#V|ucr*}VPS}x`e6ewGpuVkJ(#~G5X&C^<@+y?!VaK<8G{JJ=B`&d) zpLAQId7Pl4)GYBJvu^J3-3Il9Yqi=Phyu$KJej85hZD=0w34m_PFDy|XeDE@Ul|rO zY=FS!#d6?r9-shaN{#>k000HC0A?ouIK|M-9fNBvN|PBaNC?N?Ev0eY$H}MG5j{Nq z_nCQP;n2cYHai!myX6Nhl64Kr*sxz?_%=YVJNM739pG91r~?CRrsA|1&e{+BuGpSz zl`evu`~HJNxo=4%9x7FW7l(FO0T>5QR|zXKF$NSnnA|*u1VAwB*04bUarm&&JjdS6 z=M3LHj%=8dqoexrz69x06cZ161NA^Kl%RrBp%BHl5wet<-ZfoUCoYVwz z=#Ad~YAo$QH_z}YzK|_EKwz;BVY+rAdq%W?xAr%_yeE~TPMTIosSshH$IvOS5UFyC zt-m+|4U?B_-`;{i9`Qb5k>@8hxExfTMdiv3ig4tG2%~@r_NpAa*i0vZKsrB);Q8_!>Lto4cQ10z``IRdVUKjjJdF*Zs*Kkg3fzEfa}-&{WTFrbdwQwmyf_(Orcc%t3D z9R@FyoHcUxReNYYF2Ne|qD~nugJ%aC+LjZ9{fCGCij-ZWhbSD!41;$In9>#0XOG&S z4`1lkKYCE$2n#DCr=5NG}AkE0PZ1LQIQ5w>Ak<0Aa)^=>1`K zgdD|)4^>uQjiDHy%jHh_{1?K$=uY#~Fx4KA%17XRM;p8AtI5)yKef5$Cm`Dm1`=&;w5zuB043 zsp{|OfpCL<*$$F*6(tux7ZV`=(q4oR00MJWh86UH0+IeiVadAf$yI zdv9(xG0mSSJe3$XocDZ;b^8Y7g&8Nr;6B6Fu+;vRr!HbIVudUSW*7XKAbmD zDlDFDh4rRZs)O}F>ACZoO>Au@tX$YMZ(b%@!n%@+aOkfV7kv;<5==2okCMzOh6&fV z2C}p_TIpYCE*rmkFAvwgI3PEE>K+Dx!IS+0#uqbzgv!yuDYe~Dra}Bb%0h;L#e7)H zCikquj{0~+OaVFgQ3?eB%Z?=?iHSdv7+m7(- z2MythyVg=V4Rdjg~pT8THq>CTlOh?xp~&Uq2t8a zV)9Si3iS0tzqnJWszdi?rgqAjj{9oS#FN1%xVE5mv?C&vNpDfkI_YTKpo@}b^cxZ2 zbc8%r&uDLZVSiFgnE1UkV?q2j3(lDC5!jRv^2=v7Xy5yaMCXd?_y>c{58bXQq6hW^ ze8b6zz=8@#(!!RpMHgJww}thwLL3B)_v&d0cR`!2d>c3E%Oax~F8eCljF1CRP60f{j6EN}N!(w|R zHP9Y~BkJH&oSHxK&wfSb_Y;MaB4f#0gm}LUBo<&5L^mR32p0M}#$?|m4&qLt)bVUd zvN`;H_V2UprQoR)99(*fnziaaF>RjfAZg8#i*IRq{DEhws)t!t>Ar8gx(RS9P833eGDpveDeWm&uUM{qlnW1pKKyLJ6?BPlrqu@%^Cg&`(B@< z!U{`Af`Z)=nT?&W@YzJ2GB2VL&eD!F!=+dW)fRosI(N{UrtUBRXJgT|vEQRqe&O{5 zy!lD!bmlfkq3&M^;AzEI-WQFsC}aRe-~a#s0091YSmGKpT%Z61kAcX!E25GI9_VC& z*MuLxNE9rCl}&vz!QqkCBup4rg*Fk}H8<>4Km~BXs}6)6&AQ|NxcC^)koc7Tfbe-< zWc^_OfXpzMJ8>%^m6Dim-g95n{9mKEK&_WdlUr^qA^HC$QUy}*^Dx-ehF@1|bq zDsLiEvSq*L(q`P!^n3e7_fBMnFB@w6SRrc8_U~5`nF|Ao^>n6VWX2tt-9VV)m8x)X zR&?KuB}o0YSE$Eu{d62)T+R=xzqqzmB#x^a`@4s9Ibf3*>T1l@GEFPmGUWVp!lDt0 zR_i(_DJw;kHSb>sfh?CU_ysyF9%C`&H<89k&zvwpKVUE)25J}IDzEXij}HhCiSm{9 z7NlT#y|)>@lHcr~5rD<7AuD5)rGkv{EQb`5o}pClwz(tubaWNrSJJovH5$gggZ6RHizw5_^C04tq-ED|u0kY;EwO>9C6QF^UUT;LPW zg1nl_(0V%9fJzJ*{I^a_NeT{wXrj!1*d!mf&k@ud@*Cu$U+ zbFgO!{gr9L`V{qvrlDT|oaJVde^#d&c3|zFsF$pzj{cT&RH+yWVcGDf_8dnNQ1<8) zH9;&0j`K_heP8;WF+8!eV~V>(7)dz_kkFbWtn63P0Bqm!cSVh$dqtm2avwG7V%fyfKpLsK5&R891^ANI`-Kpui}Dq{ zQCZOCN4kR?`w_6Ee)Kt{Q*}T$;0O&0-HYZboF9Rf5MlXv?1E-!BoVPo<=(5=Y$X1> ze}T>r1drPewuF4N{i}1HJu#D;n_>k8C#RNI&7IAS`28t>+kS==V}{o`$UZhPXKt@r z)D;t=3&pl<&R#jan)l=TrRNqaN<+Iq)w1AkNcBvELpv^9lPToZ28B4L>)me1S&Nnq zk;MZ7$!vWaR+|-w1S-8Mpc6El>NqPc_?gxFE;<2BVm?Uf}XydljqPJ`dv9Cic?S; zi(nU^UTvkp)Jn~Z8+fIBXt((X^`knbP-!;4>gf(%m{y;2IwtXF+j~BFw0H2y=d)b8 zD*>De(N|#9=2-T!lZN=pO*`IF0(b#SbEV&eC^MsfN2p#S1sOw`)z|>n{O)%VtTUaS z{=Efv&Q%9^;L5s|p0D(=qft=0QC5}K7+4H7L4d*q(FWIXttCwwj29ye3DQS5Wm7ux z;HYa_sqDzYMI0BpWDSUUYfzz^a34`gdI0-9dIQapxvX5{S=&{?TeF1i2!0000449gyZRXbrJts#825nyHPtJWG? z&GP0ob0EA~ErN0ycAxB1;Sb4e)=p%t^vFF{Mx>VBc2h|%th0A%J<#=B#8D`jBjy-w zAL!e`fMM>`dE@}tuRW2bIJTJW5@@VlRFb>jR06a5f2ZjxcjDs|XdrR+9NBsBO?NdV zm52l4i}n$-yQm0ny$PUq-A70Ar#0W&aX=%MHEX$>!vHx&9fuQEXxIHK7Z&Sn>cA;5 zgSM!k8J}fa2II~uNYr2Aj3;sC#=5^Hl5se9^X~z4(cOv!oMSD$M@ZiSATs3A=neTX zErVm6QF=6xMXy_=pa2Ps^Ei!(P*z~7gjRrnyaaL!Jt-4USrM7-P)bsO`*S2&S5A~t zHL49BOLmA|dt}G<_iG#1j~s-SCA^lSeO)=`$|EjaQ?9_m5LEeqtXRV-9&GWjnqN>> z#ODff0aNbx>OM3fzs56S@W6S@WBXJ_YCBh<+)iz&-#^fd?QG-sv87u`{N(iFbOtA) zlG775lq}86%mr$qfnHXNGF`t&9A$fkkPL`E)+iNr$}>j_kxmk6vW)f5drseQ2 zKr09em&@*Im-hjGaZ)#7Ho{2}`+*p^e}01M+kWzg9-|_lD*E`;Tb7oDDJv=|Ky@9K zc{8B$>yg!XcH4`{!V@GqsI*JR13*2m{Oz>p004fACK0SU^WrNEVCW`yN4*b$D}%1*{8?ZdKb0KJYqnq5xh;Bn~5sw0`DaI_obsP@|aOJA(m%5R0e5~n{zE&dEEBf6AWc$0rs zcc)oAVGcz|kruowX@{P3h2dDCiCA$@k;g;$4@H11k1o^xz;g#KR}${#ro5XIPN40B zxSldPENb$i>4SgbNJHJ16z~U(z1gOx`zVM-0T(b*H>tX~O?<;vH-nw%*MbDCW%tp~ zWVq%3=4F&O`(_~kd!*Z5g%!@$MSIX%0HM+i9?!5{Ay5?$C{ekh9Dys#(>__6xx!rm zYC$Yxf{LA0cXmaj!epO((Rm~KaCth~Hl@nh*|)O-I4BF~1gCSFqml2~=W)MEejP^D zrrGUsr*R5K#~?u9$piQI=hYXW%w&|FpWF`d_U8%%7+gST)8^?q+t+a*y|aDgZHcZX z`D4}S)*@Qzi`85$Sd8tf?Yi3uOq~XA8m8%?U{!$4NX%yjwVEU^&pfoNt4^EUO7%70 zXagkGP{LRfhDX(@R0=s?4}bsw1}vB*8m75RK2z_4NecrGHo7mw004l8h`%A+Fr=Rm zB_{+noH$#6w+BP~!ApY*O)i)-=f#0rDbl2Ym(!s^G^B|@`Uz(;G~8WJc7fO;EHL~d zK+H}Ctlw@-U!}E3R!t*9nGe;g;~WAAGMda8?2C5Tc*Q$iS>puZmymZ`b55Nb3K9oY zz=wsf1L!0Srf08tvz28Lhz+*OKsMXrlPyp?mkt%EX?8Qy)E(Bdp@WJz^^^>3w?s1D zQ$He#6_lpE5CQ_`?Rd0(3YLAMoy?z)4NUM5lh0o)Y(E4D{A>VyrQ4H(RL5*G(&~8 z@ZU-Iq?C}LZb=wsP+pV(^jrR5w9Ru~szTo{Wh%)wjwy;?@K52lZ0t+zgjX?;lImjR z(BdSe+>AQ#{aJ?1!Y>DI^=OHa2t+$kr~T`%xS^IXhdIj`i$AdOCF65gxqSQ=n`8YS zb&zK@)m?(v0$8}5^DXZYTDM)v(I&JX?W67%l_RKDA&*#Q${kBhQf?2J=5NvkV{`n; ze_mNuGQal))pk+c1a=2J$0e#{cy~7YgnGXrBox{5TmS$703v7+et-E2ZxzB893b0< z)}MpowDbZ)D-~L{*@n>IIm#+&=)3WHWm;v%jFY`Ozx+zE-GV7;#!tS3;9pU~;iWh= zx;QfcMgphx5sG-JsK$Ul$IBFF8x1A&sZ*OZZZETT z^7^iZnRRgQeA%6WD;$L1dYvPHp#%F3kE0U#k~hkxm)mC-A~G@KtpkxpeGdu9S(xAru;WEAZBiCB4-it%vlq0n*W4tZj;49vOXr08H&I zE|b=K72}*%z7O{vd3X6riACsMs3reFn1xz$2Yy~za|-su2l=Z)f)H>a(9Cq!>dQ|r z_RSCLSA1$1^ zSXQGl!k5Rv!ox6vIv7$W4YV86a^JU2k%zLg@_|}7N^rXcucy;&t`45yJHk=X6;as{ zt8fW60kH~LPIwB;86k8c+R97C4LAiXC?RI$DvXlAU0M;R3m0_d9RLU5p`BL-bGlqH zQE@~`wwnAEz3=>0S0D~#(hY1afB=`U4*lS`Uw(&i8_ubG*UyGIq`ax}v6n>$WS@d@ z&5D(m*mu&;AD|^T+w2Q>1Ij-&;J9$cSp&9rQ)g`wF_=($Mns=-|~-s$R5Yw?-}qZUG!q0gYD+RX?q zl7+;dx|41X!Zvd&-twM<2^?euP=HLgNAny&uAUwLs91mi06aiLmksmPj{2V#*46QM z?8%U^nWWiV9PzJlB~R|yLS@j!n#PaM59=Ze29TfYg%Tse6SY>KCH*zHU%`%_RLEU4 z{Nh2C(oK5~*l-XID!8&J*l@jHgP6}Un9jWf#b#DSWo2AN4F?l}dWYg`YWmu)>P*|5 zq&pk{syLSXcT_;SzW`AXAX*pM&w!A)HA9@@@Hr`zRGPOVj3fM60qpT5Zs3I#KvA!2 zZtvn6CTw}VYWI7{;fpw6V{8ctdrqdELON3nDH|H~(|&3^eA0T1gvQH}5h%WW!tR~+7W6%i}Aa_I>SLMJ%$g6Wl-eDbp(hL=c{-Hg7^}YpdewbqV zB#~OnqnnAp+}GQZoipe@>r-%ku&F&!%Zm`*fdo?w;QoYjDQ`KIea1jJphMsT9w1YS zTOK$<2?Vk$=TO3r>o?OzHm^6Gho%EEQekzzk&v5=m(((Est4jwt5PC=O3oMM$s*Q~t=l}v=fEwXyTV6Ib zEuOOr>TrggO3d-7{clFM`-g5ywxmjR&dxD@9GMM!%j>4s({{>ulIv`hyn_f)Wz5|6$El(h%#^KL=k8uiR_#c5bm;2KZu-r ze-+7s_TXpTNJ$7g3{%Xvfy^z;rX9AO!AT2FMdT;#MXf@uays7W z^tW#w?lsAbADrL?y9-}){~TiRtg-l=&Z#+4Alz1+4ncqir{3i?!zAGSRJY9r`vOx}y>^*YE~2+wkZc@rFFOUH znn4MnIl_2-G+XXm(|H@DTI1(tp9_ksBa)S{r{=oyK9U@s89E)ru)pO6cU4#qf}m6p zKPF)t@rFmwKN#-jlNqQGK8IC2^RLrVo#>%)&wrf+7`6^?JE-y}q;pH&RQ$+H8aAY0JAYS+(F6MY z3etLrF^S*i69FUfJznSr|D2fPFf#fO>`_$Mdt}SeMZ(VHrvb%)zc<6WJWq3n`z?t7 z)5}5r+GJgW^NmX^Vk?3L3VF^39e1&CLEYLDW6b6JY#=_@ACnA$UP2 z&R)Yu_=0Fs@eu=0I+g_xmkNV^YnK1GukqDo&GY;DpskllO_<3Z-O5X^$4W(v(lw*` z0tf@xu8-adJ2ZFVYaMd~;5Y20V(!g=j`453l&gjm+oTU{ppq_;U6jnCIRd!qaz>3(O+IG%Ed821(3G|EB zho@+BNWGSOK!UbIcAjx#K5V`m_6rf6n}2Y|XCK*2tsHUTv|Aitc0LD{7<5PtvP#(# zUb5BZIa{p!rvZhY9el}HAOHR3qqdA_Yd7V?wv)Pj*RoU;Oq*Wv5otCxU6iSd3;f+b zD0id4xtfpZ1oy^Lr3Y~8CtE#n5#O>LanLxLzoIg?4uNF+?e6auDdZs$8vKN{o*8Hb zYoMdRyAI3n{vMhkzAp`D_A-chFdt79mfiFXcMQP6$i&WAy&?jO2!4kpa|A%42s9kk zW3(!qmk8CQ_YJR8WKFnkg?wyA$&PKJ+2_0lQS5R$iZk(r|uwOR!sWyodqv zv1yY5L5<<65Q6R5%~RT)`48D-r>JJoAe>;_M!2l0k`M}oKga58vD#;M$y6#}@MK3m zZdk^u)-Iq1#{0dVjD$JkWlEhtFtb7>KDsd6JS0G#6y$$W=k!56xYF!pKa??%_Z$+J zN>ws5#L-4knwnhp(|Jv}rKiDbDB^pfI7xNMTL}f<>ZrTH8d^sR7gBo#2a4r}w5uH5 z!|i$C8mTJ(LOqEGb^hu^Jgat%W`^vLj7+VrppGyE&5}R3;oJwDC{7VMFa+J+J^mMS z#Q|#`C;x-qxt>g`cfhKd)Wjq?cRiS3mPt$qyqUUTk{y=q-wlaq3#SVCG@>AL5vnI~ zVf^{3xY_(D=PL{tugsWRBm!r(`s)pcrPFd2ijp!xo+;GW$=fk#sZ!Hp3d9=c5xyb! z>TxD02g!qvoTm+O5YDSV8xn5is*_L1`Ta5_q+>*3b^krjG4^aBxhI_~xu9rH4dGW-2e6+Ca?l77(LSby- zmiB-V@%gv!-N7YW0VktJ)1KZVozlU5!)M$CdYQ3>C$7t?$GAXk8X}{hCk=^M=;Zbb zpETU_K=zsZ69h!8XyzIiW=Pziv;S^?0t=t2Fg^}!NmI2$PXRT3(2R`ws@gZyGh#kQSbw9)3=2l#^cR%O%(wmv7_Lr{QlP} zK6udX?~ z%EytaGr&JwI`?CXWHzv4RoeH7@-i={HK&)-?QJSzVL4DT#Sy}At-6OcCjX*Abs^vo9ZRT?I;|~N>$)zbUR7* zy)EAl&7|XYa{;s9_fGbKXM8@U3o|rp@7FE2jsK4gmFpdxSk!c$^1y9-Y86(bF`E0=`O|c$Hefs@9#+18= z!ytbv5bZEeShF&}B38Lg3USiia})!dda(qR`O=4m?lIg#xu@ZN1V)Yz`<0G`Z9cW2 z4*#0^K07vk3_G*8Fgc}G93m<FSF= z?d>^J&IPe*^RegG8Iq)z>^3;Qs&Ug$mAZ{)K+1X-rhN)+rccp3qYt}f3R~m>xDXF( zg}uzm4hT{#Bu^-8>Zs2|l#<%W0Ry`+{H~Ncq1X+yFGsA#~$ZMlKNCPk?_ zY$&H#WC+^aEOe7jT`PZ8E204J^h&OK;XG;LkqKN*5hfGwgj)N+HhP1B$Bf+N_g}X; z1PW9n$VC@xvEV~~5I)XHT=3?_B84o%4~X#6T=fqH<;^@oh~eXa0h)PR3E%@l9ncj$yy zDXLBfHa{-0d8n|fFA@QHo~D@5E-@Y#RbWD)pihZcq@IU=$yi(5@%b^c>-xsTQz)0^ z)TQW_)0|e9+xUl*wO2f@wv>0inEm8PI0~;kKZT7M(iDRZ9pfdCVLor=CEgh=(E!ZRDIJ(xGbD(pC!<>GbSlDA)*Q-LN3l9>KR#T+8o$d5Hh)4df z^Tr*imPm(xEbiR6Bj&a?GoA)j`K0}}$1O1!BMH9}`eVAJ&hT2Ol-kO7wX%)C4dzcx zf%>{~#p)z#Urt*()v_LQx@8aEGmWD1$~9&a4n+|^<>MK18kw0qe=4~2ArHR@-k2Em zpOI6mc8%X$PJWr*i8CqwME4m*sg`$LVw6*tP&EP#otW`GLPg~o(GWRl{(tFsAJ|jTGt0!nT{Q4c!MQ!SUO)89T`x4WcIjXia?}q`Cw1HuH`I< z-98WiZ$Oa0Da647620+R&me;J3J4PRC1h}@nrkVCO353F79r}lZ!58qbJvEWg5o1x zY2WlHOsdhhKAF={@l3>rbb08y99gwq9}wwDX?VX7wm_oktAHwCW^L@)=UAM)j&)-SCw&q0u2Ail58lZBs*pw z>6q^o=NwI>N33;fR#0ea_9Y)NP8>7@VFk^veX=ZdODT>EejdzbeKt^AN_w5NVi}Y7 z0}Bi^hXSGDjgW5)9_BKsR}4t^%$~NUJ;-0B?09|dKMwTzoJ^DKG2XsPx(}A!y@^DP zp|UJ{Mq{vgox=lQ(3X(sb+D$EphfTO-c*XEG7Spa)?=?I0LrBSo2z z&VKAe+;&u@vo8t}2$}qV&^)Ioq(PN@&my-!0dHc-UUMuH8SQ9#m^1*4)wD!OTnl}| z8dj{uTTW5pwSlR5_**x#=D7sfzCcKGw`4(61V@N~>M}K(o#FKoeEwl_P$y1<%m|Kj zzG&SQ-86nIxAe0!_Cbq%50I`>ic?I|OX@#aO&D%9X^^zgs zp?J-JLkU9wtg<)9;P=<1)S3cK?#G^I__yrNU$LN?V^v4 zqCn7B#?dwNs2;NLjspYIWrTP?tgUnV2@-biJu$rni5^CaFMWz3Jl!FS3QnENdkSaa zTmk}XH^__`Xrf{uGFQ+m^QE9o`LMJl1_BppJRT;cy_@o(u!_2bJ_j84vyq6u%%Nt6 zh_(dJr|fE*52LpgJ#;#uFN&*lE5%Yimp;#9E-lon<%rqAd=6OLHcx)$_oyg~6Hb9> ztzl&NS`gSzFzf;fdb^CvQ^=bkoA;_t!fLXbq+I~dOC+7DYap$zx5spKt^FXXmD^du zO1e57WT(L4w7P*y;|TnvlwEWzs86;r12rv?s@6XBcLh7chA5Yzmh?3Jsa!}v8`GeN zQXKcq6Uao(b*=TG;H89BP@`CM&zc{`T}>#pH0H-#?QX=s{yCjMx03 z^P{tJc`n3ePs$1eGGeCh<_0cg%givJg`BpqYTtPLvR zgT_&j|Ey~#sgt3%9Z0cY32g5&ba7>Vw})E~8oAJLvS#rJ^*6{NuraO7E(_Fb$W9Im zurb(chnwe}up<+Vr|sh)Pt&+Ru@{vKS4);ixMdO><)r}-()|Ag%-=|%>+rb*P8{b@ zXslkr28Q9*kh>S3467&0{8JyV6N9g|MUHTpEbUb`6JTyF7yf4OJ*9lBk&nYQp^lCV z<}ZKL`du2k{#Q>qMeA6ATZ#k?ZCs4CGL?<_wDe$yOA{d~Frxe-i>r)6KI5 zbafq5IfsUe%?b@hOaX*o-c>G+W9B)|J@J$hT13=;a#UApmRar=hi_N^{{Xp)V23z% zZon*uokKa#Uk_#klp#oTqRgwt3W_oH_r8>mZj27zDL>?6wb9g8QKahr)`wZ?XHD1T zNkl67Z`90Ruyiy;ues8~mS0)q@fxYVTG5}}|Dutv`%XecO5B$iwYt|iCiMJdgBhz%KhbyT?Iwn+JsnLN z+GDRuddOyG@N;q^fLMCumG*{2&1m#&bowzrN1@#)>kF^_da6i^<6)ZJ7nQ|hVoQh? zZ#fctIyda#*}8Fh{ZPPDoiZiaF5@*ff`0eH=^S@KG}0QcxE3#+QW_Uz*0~dlSq=D) zn|aZ~US0}IO}IV%NfJj>uGhrKR!Qk3m~S`+aoH$iB57m2pd7teBo4KzL2VKk;CZkk%IRpEpzNvL?66= zQJCR8m3NZ|tLrd8xygzCXG1`MUsK;Ot_qie|#L z;pzL4!om8)dx>^Zig*i0;KpJ;^~!k3b?lx~J`QkHUEpqg@T?A;zV}5BVfxTG{Wfw)fC(pf?;*yrRuno|! zEM(_iiKAw@)Sjwrw=29!Zp1v^&Z_xe*Gy?BUrCwPiOgQ6U3yAdglf>$qZ94yp{&cj9*c^)t*^< z8gq@%Olld%DV%$~@;o+&w%hGps=XI`*Zf=o4_wKJk?@TD!SbKL35m;pikAnCP`S0S z&)&d+pN>kxgO)5(_MjHYniMcK=0NxWI~teQ@2wtfN&*TfMG3dJAz7jl#JgiK!9s*C zFOwOBABGmw0zQ0X>p%1;xq6i}$|2Hut>>@ABggdAfz>w5w6d{+Om>A;>%thG)q6K`yCwO|bFuSh!`T!B5mx(bpd2<9c-~fgP{$ef3vsZBCow_0YZr8$Wtu zLAQcxudL>nsK?W%e%x1;+DnLjt9zRgXwQ< zz;kvnJys#Cs=SMRp{j!;VD)S=TD7R}yRJe|ztH;D4%A!6p;kAFn>f1iey%=UJ=}es z?onZq10VnZ03;7=W4ovPahllwVo#)42ZAF_031Cxuqld7&Fom4(r3w$#;ZKX;$xdNiU-#mxW5S%3SVj+H z{IhXv&OP44RZuA!yiCCiQhbiDCL`o!5AE9q@9$gz28wo3Jje8J9Hal9sFse`Ly0cw zFfn+@?!K0>syF$_EbNQ+>Ph{jC-Mr@@F$nFAtLEt527w@3fKHK`QiRuuw>^PD&jo& zQ#Qo*AZwlo7zkG3T*Qd4Rg8JMM4!IPU1K=obl6`r1Xh;uw6`I~5V;0PzX4~?g!l%} zwiaC0G4b&R$?9`gR1m2hN>Y=(6m6g5 z{6Mz2?kDWYDM5Eq)(9!@s_)|O$mfQB5WPfQ2*oGw`tdR-_+rc-Yl3(~PBL06Dj6y` z3`E-hcDuB=-eFccRy_C}i8@FoT^_%4H@Mv;2LGlSzES^asGrm!2RL8-0VFuAA{cVH zX0bJ+0_h3%z8})^Hewp}!Jdag-6;uG=YXsH$G3ljZP~!jw!b9n1GL+n-GK{I!j80R zC6&iT+eJ14mV`m%Ln@yM4-(mD<#Xh1!}l?jjYRe0m87%QOPPoH5sYT>iv`Om(@UeQ zm~I#*#D1XbKRS`8%8DFFQz_(ZeC0c7U0W;tcUPvv7%`OK<=+1tsS`ZeKlhAhQfSUo zuI*Xe(%=Gnp0{;P3+?;90q-?2gRGq^bT_S5EdsyS8P`jJ8F*}jEpNT_q|}smDzVIR zqqtw6D9=0Y9^D+PTH7s^pipB0YIAVcL#RT^gYvrF!timG!Hq`tBaZh>C?gU2WuRKCFYtwU)u`yR(3iY7!)wy=$e`L<5uBlFFQxe7KCJazx$2 z#+mS`e7wjsP;w4|v(+1yvXurIAz+Kx}u+vbo_@b^K-Zh9tFLu|Q-=2}9oJt5Ql=lj{0MHjm0rY`nO zaL|lfKnbD82imx)hW}~b`mJ@o5-ur%@_q$Sc%2UFcHXAb@dmj9`?ZR`nu>tvg#`tZ?h8`)AoUegIpRb4=>*;KNEn=5 z^oTXeN%|@#Q*hf z?gIqOo*TjbJ8|JTmy2By#u4^zQ#2_@d0{s!BQxGX@{{j9z4@V|3|6hof#(Gr*Goi$ zpTLU(mkX{XnqIn|8_;0K{k1d}ZWZz7dASl44bHexXgH6l@&MN%fLJXQttiC-^ z^~+KOrCr$R()sZ_nXn+`tV_x7S@>NGZ=VzB9m)-=PquQ)mn1u;_ zSrk#7T zN~W%*&=#~w>{_j2LGfYQ93mkZn6QjhHDi^{Y-3?!5LH%AaRfGX`h-c}vkj`Xj>s5O zeEzo@2XCS8k&t7Ep$3t!C#xL$WgCs8B#}B)-2f2@yW++EdZv?yckXQt?)1D^0K%Jv zZK2&m?B#F?zxzr~tDwOkv#@z!RL3(dy3Gf5ig3POEqZPOt?bi|k{O`a2og<;s!B(I z98VQd4{>Qdo6(T8^1;{Z9KP2u_w|XJ2{U!qC7VTw_6Cvt14w=goTk6UG2$INaKcba z|CA4*`Xl%N0L!&>9)jB$=y`D2c%0irV)5s3uysDn;YfJ53Hh856fCqT(EwoXae+7s zR)B+cE11%jc1d%>S^XF{TIKJVR|+J=GQWKjxx&Hi-p&Oj81E%nfy0m~SJ~4iIkF0# z;8Uf`nZctFYXvC)l<%}nw@MzW!b|hOlDbn#T_)MKoI+$9#vpv6-Yy>N6!{U#e>a=d zI3wFb_;=c%^$qv59SHqcf@7oMW}=jW$RMv=cPueld@2i=30sxIq}WY<<~{q)(|pUz zeOve4eSwm?bDwYeKVir*&YN(_!5|WM=>ZqQ07p>%U0XEliP?e$jMlU?pv@$oE|M=f z(A_xhPVj!gc7+G?_5;KIWt$_L_|XM=Y*$1QMHznXxID3DJ}DEOP|VQt_iaN^ z@_0$N8V>SFKF2<8cyXat;ugOkln%B+>%rZr4OBpV@)ZR~Ese4WkfPJXkwdw=0pWZ0 z`t^=qYK(tn*l13%?|x21lXd2ey^Cn=5AJb#qnBo?&ai=5ZG z+&_?)MeWu65lfGhq<4Zzd@{!gEhc0f6pl!`(lza?19s?khe1WsI4ZY1H13O6W?;1| z)00QgbyOIZ8DvYB%smY{CGw>KTil8hDz!KMsY#MPnBsFLGq)X3B|0}USsEwqWtGs@ zPDJn!H+S2L*wk(fuBI_0%xpO+;@Pw$!g=B7S|9?44pqE-m*`Jj&91(mJexjcY2Fc@ z#$6K31%WoNj!!T)if-9Vr@Bi^FbXYG{oOR1O`NY_L6YnujZ|a-3`(j|*6heheEIHD zF(9(aDUWAKUw;{eDc6426s}Eo$*eLUQS2FcLjrk3-X363r5NLovd4-s(x*_&%KA>P zV%B&6|J~#ynl7&R3q{$C=Y(S+32vma#t z;mK21YYiWRi}?DDSpDag?F8n-1#u}YC7B3!cYAV8`Gg#(SNw$`ul9D_yuX6NP5X!k z7K#^&Fcfyas9=`6FJ?j(H>+k?`hH#d`FeO}1$bJ#Q zJ=J^xoR2$@MMj)e>+@DbO#PZ zT512Kz74cE7^zYFMS=mjy8Q-uyuHTuIF_XPv8PbBIoPmIqS3`|C+Y7RNVop&d40Jo zbUF%utS$M(9d0Dt7opA;$eWY>rN5{+r*3clV!o+;@3P(jr8*dg*n9Mwd-HyX&n(`4 zRKVfzrw!^myhBLrkEIqg)^5Q=g8(=Ov5$UU9pI;QuwI?BpgvB@c~DC08&A}q%3b+l z&R}~AXivjsMES#_LXB3CwXoUU-4L>0%|-1W*AY#~Ttlb)Jd7ha7xB)v_2Krx~hUlm(agdOtW z!)HlW$@BXqG%QK54)|+j!;tw@c}W$5;}s9!w?|+6>ZWb+nLaq+Eu-hiTM^@<7ZFUL zZTFXXzh}W(qP=45FC%86$r{7BfzYH5si2&!hBEsDMS33R^#E@YB8_+W(BKoL%e(Lp zWoLjQn=pVO3Sd%04;Amy+ftyA3Ioz>WEw33p5i9*iCpgkgRNBf1PvMXVUN=|SDAnf z7$Oyj6AyH7ks!-+((S1Pc(_jGXTyNZT*qkSztsQ>qohZ=R2`rw({@S3TR*izKM~QL z{X4(?hNIm>p+|Q3T0CDgRd$pF+PlS3Y(w#)A$<4XA7+1zx5o|M4J$2-^2B#S0~4g5 zIclWvQp>aJz;*O*K`kQ~3!-ch!Jbl!7r+AK8ZJ>cvC9sR(X3UcnXoj8v0(#VW9bAm zstBiDqu5EuQJ$=P;~}6vbbQ1*7T<9N8ZtPX{b&9OBRAEi))vWZh$v5Hf&Z29v+IWe z_X&k5{QXuxZDmx}b)uDP+!g5eP&CBhdPE4ouO4h)z%?ND|Kj)g=XuxOwm**@A>eYq z%0>$V6)J#|wnhaS{o#k78}X+V#o*D4VpT&VX?pbvWdg}z~hEIeaV6Lf00 zE1hqa)(FerO=oY^g3&(VwLapM!OQ?iY~XZll(r2if=q<`Dmi4huN*N>A_REyE)wUX zo-&+-K6GzR!>#Y*cAT9J@a2&__Y+S#>Yq<-*2RGYFZCs(E5UO!p#rUm<#vXof+@e)Ciinj(=`RZxBc;8Ie&4g1OJ>_59Sg8 z00000Llr|fX;!^!fpn19OLsyCwEzvCm<0`UdF`FqNI0*NUwOe;hIJ9o9KzF1W10t4 zF&%T}o%USgUF@(K#CaMD{$jJmtIKmyl`RhK4-u>(7^BL}?S1%^AAh*W$Dalw(R@u` zq_k1CwUQzUBnHyU>E{W^{P@CZ&Y7eAfEY`~yJe3jh9(GwN2Fssz`=(ZBa)D4VKIX& z_L1nncwxupsw2Bt%Jn|$Vl0!Vr63!;xGz#9TpP_p|9djAC?CAB{gL8^^GTgs^DjyG zR5tF}gL(Xj8#_~BkVLwx4Dzjy74+VetwFmr&h6U8_n^v^PlQJ?G= zPolr1US-D_a6hG9<@2M71iWaEMG7x^@JH#el#@Vw`xhFB^87O@P0GR?s{DWe5(42; zqw`h&9==KZJ*>p8!7co>f4rBw0&Wg6KlGTm>T^f!AOmjr3h9HQkAv5ARoF|Nu_*qpWt z*KL%U&twe^!~Tmr+EEk^bH4V3R>hGCRjdyf_OedMa5ks1(&Qij-ib?9@A5%D??Z5L zXB&do)1bs88yFQC@xnZ;5cy~qo2@I=8UxB)2MY9_!e2i#`qTTcVOuZUObiU^!p7s@ zFjBkF>*|nyUE{}E#R+WcSocFw@D17?t10=^#_R9u9wgkYJ~?R?T0s`-jIey#G{{H| zb5DHR@n&TJ|g%w@7v~G{_>?E{c}zzDC2Y8#O<`umkqxC;rm4 zL{on2gAMeH6iV7s7ao)V@ZedQa<5kB1lSt~^N z`&L$@^2N={zO)y7`XL^ccqOQ^+Ts>^T&xKj9#{0{OJ@+o6DZ0_;7*~5!XUBFZ}eE% zy!X6Ory-eML`WU)rx#+9u#Ch8`K?uJpd%TR!?$p@y{7>y5fkWL3fRcwo!!)z?M$bs zN<$z@f&RkM0r_g7p4GkzNQNR^l?{@Eq@9XpU7j5#&xtP2YuDyL#vBY4Oxv9wR4$jq z&FJxThRTS+SyY-T4$vEwtk27Q;TC=;wW!;mwXy{9e*?@b7aS0rziSX_QL&@{qq?rP zO<^Q5v?=PSN!(>Wc~&5I1N>P)rl=2{vrtNbVeC-?;M|VGxL>8*IG$5h-r_tt1J77tF zmJ@`Qg%Y=pS@k=svZUTsTO{q&?Nlqf-EDBac6c7MwNK$o3`R16t`c z?J$@|bTUs!DWRB;%cy#0UY_~eqJX6~0AoQ+dekbPQDi^>lCppMD(oE{Br)xH$9Dh# z00000000000dFr^p~Kkv9Xyb&GgLy%?P>nffV!~CV*^b5v^HT}t!;|g{BoIXtN-46 zA1ScWYNuMw!YpG{&58Biv3R7T9Dcg)mApYSl#X$2Lw7b@mb8EkwBTHC`0hWS2`qpW z?<|ic#~C@es&<5R9g)D=A&Svfdzzs#rJuo1SBA_>g@bU~5WehPlaV@Awunh3dP0ih_t-p`l*J>d1&nj zC>)?h0eKozVryp%iCPt-l>6Xtn>DfTsivA(t`nTM(F7d$ZdE?wwPa#Ps@gC>TLUc@ z;=qIlJtpvb#5LnXYT0r0!ryp#`-OFU(PKmzFNqD<@e)j}EH@Gh+*I~HM5WcT2TU~I zI&u08Vh=!%igwDBf7e@#IE*Bb00BnnDbv=%^MXq;J&P79>%hdzWgaLgD^Qefpv*em zhq^8w8ml(|2tF*KDeFa>FCjf`>zh_F@W|B`UV`KGYi@w0{oAJ&!j^vS#!MZfl6Z55 z^-KWYZe>)6BMQp#XUpBzr!}!_C>?-F3}gac!$oG`0ZA4zb^PwF_FOs1~7^-vGx&Z)lNi7T)A(RZiOaZ8|1-`_D%8L)<=xpWl1Z~18^nce6y~oKG01#rIMM(m`YS% zqZlt~G9*kzgW^X&1FFCAc+HF#{ngY)VDWIJrp>Sjp~#`bmz`i1*MjFh*p_a@Od;ME zh0W-I2zOq}?uTwMUt$lDb^Q>U=F~-Pm z<#5Cm#S1Twkc}lyUhkKX*8aVj@}%#~>M{o|JN5GTs{KH(>mHOFsG@7h_UoNmTTeF47zRe#ifEqcg-qcn;8)CQo(hFy9n@BB+ z!sQmqiVn^Jq9*tM1=w2-_cXnmQ7Dq8WwF4@xvOxAsLe>UnbD?LF-@^edA>R175oeE zI;FfH_^;7$Cmk?Vp9Es*BWEEm&4(r-xec4sb{^}D{gt^PxtIs|!Z%{2eb}$<%;YG- zamFt#QGxPCn>UuUcr~}oqN3O~ou*wc&dc5D;8yy!?ANMCEqJ=NRk~&Skb&U!Jm&C+ ztj0yZ4+vOBf}eZX;CJmWK{K_1ar_-%mX&ROx`wnaRa~F|rts4gasuTeFyxbiaYT|K!yUnCksC8~>oWR|_{_u0&2?8_ zMxMGWKA{96KIW~hQ%^VXB|%ch*F)Chi&9W{l0@*>v`ox`xmeu@kTM426N30QoRYuH zEa9Y?1Dw7aLXU)9~G)KpiI74>~oBS~LknB~Vo2KB&Ur zh9r+YoKd;O9|W3d015adHWi8XXfoZ{_RzUxrLLhmYQ(oZpK9X_@&pOF%`mHX?T`?z zTB|?B(x%~v)*oye29m)gSG+P?H#8F{B|6q99cw>7}^V!^+!|M$G69n5k`WN zA{2uD{WcoiZo2Q+LBPGtSJQBN}lEHJQcH-BEnpD!C;)^h*iLrs6(1Qm6UCa`^(?1dlH ze0U_c1fO$dqf7e&$lp>&WYZw9 z;rwg6!o$!^RfMvYV6rECPZaC_C8Oy5Y0M2hU1*iA`8;1!arnIA3>ko2?)y~QXZ2Uz zgY5a=h}#y*Arxr&0D<@>Jr}QHi4he6TL6A7iqtvg@QJ~Kjxl??FTOCp3819ycqaF+ zYaFno$k6pIRZug~ShGEKktsSwfa$5~>NQ@lCBURRnA|e~QTWL;y@AL03x1*{z{M6c?|wjjE&%hzj`Y0!^BVL1I=l^k5p zKQ-WVj8b#gS9A(1gZ}UW=(*3ROTBn;=gAq-K=G+v`0~+i63tjf~s9q^%b`T zWvfl#Jkh>5hWz1KMj`O$O>O*Lod6(4LnMiuL}6Inl`Yo-#Rx5wv&{%*cIKKONr75Z zz-Ul;s8z^1o)u(mM?in-D(W`JuKV%Mhj_7$1%78Jl7ae+h)G}T$)`1Y*mX~A`R1$0 zMl*@orq1<<;`e7jHE{OAPwh@Qq={xZ4I=Cf`QSz*w~-^{`^mGmXJk31{Yy*KK7-N+5Mqpg%P7 ziTDQq!wds2WT;i=W(5E92hcVfN!UP1D4k=)*?s6*Ty&>d$Qeg2snemUg%M0UQal6V5K>mH5M+G`Zr6fS`VngDjYEAfVI@efpK zzHmIwD_+u&WFC4_3%MY(%oG}9Pel9B(!Y6U>Vjn1LTe4fno(p1c}Dqr+`k+v$PXmx z$fukDVVNKh*kmTPrMsq!E2$7#^5mlIx#!9u39HHBSy4YSc}@=!I4LdZtX*PvFkw|8 zxj)`A+p;q`Dfm_pMIfN%+#C2H_IS28(%zvI3SLB5GbDDLH@F)Lg$8(kYHkr{%u?9o zi{e9DfIlL^#B9)61)ieg5?syE4wWUH&yZO`5GAo2<`(ME)Jdl_szsczSD4#%>0@-~ zUY;5?U|J*=*27ijMhy`JWWp)Vae~+Ob$O`XB2|TDH?Hf{1rhG)q)m6xYM_pTruD|)-fq(KZVK&fKfiC|@+lHm?`loz;M~qyM*vSFQhGh}@@bv&0$}c8p}2mOA*ATE>#ErXj=*I9)9>z%KgY0000004cy3 z&PuQ+Hfs_L!noXg5{=r{7B8bW93L~766dn;f}1GQ@LPxrpeLUO^IE)y&P`aBRy@%| zR)b_87fvd4-~$^GN+kPg(3ehQ6Vo`X3jI0$%s- zj^%4gdJO>!TqLA68JrHo`+}!M`Vuw>7T_@Hh;{GU$*6U%j`auHr{;8bIvkwX zDWNnUc{sxgG?&$=t9gUt_;YI;G0~wUd)t++z2kokJkI|(>GF!4gR%o|H&+L?;fNJnGwte!Dc;J zJT&A0ra4QU&yRys(7`|jGpwV2s^ThOeLF8h#b%4f%j35Ht6NHqqB#&V6a-YL0007b zgD$v|oRdzo7x=iXY8nVt?bmt$0002|qyrX!&sId1*QEstr_f?%-yeQ|%J{+(-?c zcUT}M&TEiDaF*?_k8m(0RO>NPc6)1HB!UQn;BilI#Y5VssB`ezD+iVFauXs!6P&bb zMUsrscEA8=jFv=w02Fqp|Ac@~;$v2{d|D9(tpiku8wVoweeM=-Yui~r)tYsrP;!G~ zDm6#Yu)$)?Y%-9eXlD&Qhw1i#M`jgUMJj|SLR7Y?s`+Z6u0QB~kWE-za(1Gi|DI9{ zF`OZ^08(tcFN5udXDBSy!}g-q`jt4aR(ATBRUj$gQy`zZhB=c; zhNm#x{6kwCX!;HH=^AJ}Z2{Wo^Rv@VUdTn31u9=|p+WKdWq2suzE7zy+^fQcdsi7r zAIy=$=srKMx(@rlyG^C7V`_bqw86=V!xWm~ECa4M4Su$?o7eE!tHf2hA%%KDfY$VH zk`A>g0R-050v_i@ssvdGe!VHxd^K+J zsbODSX6Yo&R^S~8z6P<<7v^|o$*7fKpY5%z2jr#xY9jM0^hak38hvv6K!XAEk;K?C z1!Ts#iae_#hyRMFpj??|CxA63cHH)P>Us*wj4Q8Kz6VxiESn&B000Am22F?H>K39U z5-J>+H-R{fk|Kr)O|iHjAi{lKVDS&RMwuGwJnu%JE;)ri-~j-+Pf@20_8Gv*o(rZr z@0{HOLg6rovoH>1+>MKaa&azrhjg3E|rPukf+4S z5cgK8N*^ODOpf=x0yz!R>(K2NcW|)udG&o7oZ4Ioif(b7S&4B9F*SWyE+x_QL}+$A zC-~MTm$kDINaMgRCCR(7-1pzo&Zk7lEryxnK!wrvK*_wCu(J@^Ll%rvjzPBehT5GA zAj;VZJY#3U4#t(g#u`5auH4g@-nbR0r(?z+2nd?BAAL}(7#*ciJdDjAY9*)cFm{3) z#AH(ZE;cC)<;3^?kn=Xfjeh?ai>=`4!i7!=|krQ{pYs(;>zd^$`Zr{DbNi~n?Cx*3IV zUDI{XjW)5XDAK7jZ`5jL{pV*0spQ+Ew`_t|fd`z|$S#X=9ejE>yNa7e7X#>u|r`g8K!5 z=8fT-5J92UR^-5O#CfNJCoMAWD6BuS0$Q8*K}@HgpfA|gP+bxZ3Y}UHuX`Sv+h&rM zjgm7h;MxSdGXwFG^d(dwh~@-e-_)}JuA0KJ;r8+^&4~a{V4=R%bb?bYFj(kU5yBLVI)G77{svc0 z&;S4c1iPdF(u0;@zac^aaDg3G2b)P!p2tK&Q|BCw|8<}~>}tOq_+L>UJ=xC3^==|` zEn}TZc3tAYPA$|?vTySp&mvvaXN6HL5koZL#B#@Q^;J!49Oy2;`-5Tuz0(`Rk>=8M zjj!Q?LA*EwO#!%iMi+`##n-)H1Urpy8TUwnv8)SQuA}A zdThg8v&)S+7Sp5>?HdK*OG@On4cEw?_sK)jt@|fJi&0zBSjraog+$06?rb&Q#Gyj3 zZJCGAPuFM+mOA?T?&;TA>PPrXeUhYbF_1eZvwDx$Gl?$=>Zu&hUjK)4n`dAbn`H6H zp1N3TiSk*=ld?>+Amo=_=-virU8@#fkc(7y3B|j;R;8zo3kGqH(ODGGZ&<3>4x3F;Ry*gYiPEo4i?7z;Wr#ADaMNMXt)Wt$oi}RpZgz zz>1G~?&@wE!g{0*bT2D9);@t!G#$?|j|KA_6+a{lgGwg)Ki3}niHvze2Q_NLSw7{w z>j0Pj*nl)&tDPnDKCSjBI`u|MJPmF}Gco?v%mLLyflO1}W6@x5xEhc8))!(NtKMP> zou824chFct+5WfWsJgr_h~?IrsAqWfL}%Llw?*E`6F9_V`)NLz9wysaq0y7}@@?=U z{*bdA&`^L=H^^4-%_7>!8;|cPF0cVuTL|sA9Xw*6z|v^j9!KmEpEZwK_$}8u)f&=< zMC_+O|Jo|7L7ODJ`C%gegn&$oD^Y4(EJsDQi)C<(JZS1zaqv&bqH*CT;v_zdWsRcT zU%PI|OqF_ntPV{2t>uYIEHSz_rB3Yrn2JVFEmklWh-17qFH=~=$AQ`*N>hP^vHf%a zxq|$-GHNS7ue{^7SacAb*2)9O-iHbMo^Ff~OX!G(&rbsY3kI!T?qKF8uB4K11Y>AJ zu!*5Lwlm^i?kUwRSDxIU2#OGx0027F0YRlGSD*$Av?vC~7I-+kH`aY!nyl z9JKP;(OJBgWqy4PQedndhRAv~Ml0ID5jXjuw=l(FMm!GhR#%68UxfQgOGc)Yw55o> zd39_JvX9+c50A5-^f%GR@gtpWfblBT&ASCBFS)9lf$;n!{%;9h(JEv2Ni`8}(0Dsv zy5Y(-4~PYCOB+#6GQU`LSq4aSI$ODTv;mMLfTIJJ`x+!sytA1@h4bO#&J1YeML1?noX?(J4z*TkSJ3DRjFdM?!U|C zk{oLWR!CgRRHTO9uO{nl8y2SFQ23Vyvs;a)6a`0SH+AqK^FP6pR#F1^2PfD;A&(qV zQ0`8XmM1{m*Bqly<0gAE=#Kg{e*T{&q;_b37ygT`Rj95z2NEjh6nb)EWF|@KE6jn| zIsv&%7p9u4k5@N#+x)n2mQch%4+cbjZ1-be!6_vG1QLep>nw3>hSQ%lpg_0+lFS6G z)@|4<#B$G0NbDPHYDs8_hLHdQTRG|eu}%O1K9LA#U^1!|01`kzuQj#LPU-LD>l?+lwQK-<2gx$#Rh8X$ST^bf=mWf zm4xu}&duqk`VXs%F{oY$h7p!%_^a6B3SZBj&uGjXy568;r!ojhfS(FaNFfY@@-M$} zX3Gv4o$Q1=Vd?#3fNX8ndeHKr&YNy1=4?>Jtx)7M-Ad!S!L+x_vu8?=I&+2vab-X! zHMu=fyd4E7a+>mHIiS)6byf^p9iuh<;B{6MWFau$fYWxqIRJT!(BIu8>ktEVEZWol z4}5V^>}cDsA4h*UeLO}i{Qfv^+a+PgFSSUaiSDGdoZZ4!qz755!f-v(n-Zz{nx+i* z7d`UCDM%af8*$A`&J) zKcTjvK%3zja0fHy*NZ<+GcUY)$c%VatavL_Qbe_B^-+2&CXODx$0AcqIT)&N9{2w5 zlXJCPTm95!#fIN$B&Mp2{41L+Hv^yTwwY;X`hnf+sv^skb@in;2`QH_S63BPss zPaIbs!uq+>SETB0d!VXr>DvUeYtyf=WNq7umcUROVd1D$Y=L6R2#XHWUI9 zosXHgMlfAv3^Nb)pot&DB~|>*T!wK=PEinS#w&HKz9Arc+tZwDmkv1wsQgBXYPG5L zC`Raoi-mk5s1V_0n`<&g%r01!brp{ zkOXfhV*M-JK-YXXiF^&YI%RHgUJatB|8jx2BpXww&wLO}z;bQamfz+SErg7u6+Or}aoXj+f>~3aVs;9!DUgq_Ki^pi`>)|Inbga{mR}W0o|6f*N^V4(tC5UrilqN1 z_|V-cZIt+K$Ng%Wc*HBSF>yCx)gHG{VL2ky;ORBkUUQxj7Smh~Wi_O@u%R84V2K&F zU16K0M&E+%iLvEAi=&^$2KH7dK43!$xqymg%?$m@lphxWtK?xw0GFJlv=_6&!)Vq- z&`}CQ(VJockPqJ+*&E(8KHv_~Ecp=#!j{D)#S(NBvpE6}Zl5!E)$AeFT+dT|P_i`~ zm3H;zld%K%%x=;CaUxinTfV*RCzJR{*z-8wS+K;Qqpi57+}N$oss&Ox7aLRx^D zKg=i>66iqC);bU^34Zl-r?IsKI>t<0jk?Kv?(P;Y<1_6awTgtWmCL_6L@+gjN^H6+ z#|0D$-IOHDzr(iS;suyEcL5uTX#6R071%(+3s5xhu6As0yK~)E7kRChF@c0eta<6q z#ci5}?lQ)D^J1YU;|zU|>x7i90KZ*51a35j; z|Ki{1ZVmCtP1jix@JwIYF*{7HNSg!*uCqx$oly?03dnM6>NrFZ>if63sNu=}lejGxBB*{)(I@S6 zLXKhBvS~J+y}RRW6I3RV&q5Ow{_D(GrXTEIl&@^`k)<|Q^Up3``XBHAu|e0pu@6x2 zRQmWSV=u7hSRLpz!!}88UyhtXr4YAehew^{=ZCpJQN{RJ!c5=iyFR4G_157QG$+c7 zZcl#X!O-sT3xw@W%f}hTkRFy3>7!Zh&u880e5TDdSzwmEOO>d7R+XkI$T+6N1Sk2) zL$&(LOEw{r{;XecGftpks%(l;V+;kmHtiNvIC}s(p+#;7lanOfT8{$u+dV=+-W|J8 zbgu_r02no4d)FKXV0Ld#5TNk@H$ce0UQ%nyo&$nWz-hEr?fEQGIH8>K zXfLQg?p7|YWAh}~>SQolTdr;s6VY-}GJ-+%;|8-6MfECxVwP@EU>QGodxw=ZBI~Y1 z$EK^Q&E`yrw=xDt9p9Y%EyEksFg2!aNCPN{1AyP(n1pwyv4yv~Wr8&-Las1_41ZlTEi*{l0Jb!^KJ<0?=3gmv z2Gj}7Qm>$04KG(Pa#IM;AnY>t{TuC}zZHG0Uw}5d@KxlB-rY~U(JCy^vMHdw9bzZI z)f)_EL~kkkCIcH5{ng3z$oIhXDQ%vD{h=#Dcb|r60~FURh17u|Z;Jy$B~^G_@oJ0N zy3z_JZZ~G?$t#<`>hN~eUt3TGGFEK!&Qy6AE;YLl0$Qqz4?+FkGS-5%pO2MRdWaF6 z*{JykUucp+CXCb=hc)5FK_7^IExawH-8<|t*^=fneoxWl&ibxpQ^MW@Me#WH6}-?S66D>q`XzBjC!2UpmAf zeXTwdnqq*Tb#?m0uH6t)kRL-iD)}0Xc<`O<2((v9ypq6Ari`SG&&ZNb&K8nQPGGWj zZ8Z5M(v|wqNXpCeJ&KZjE&}0L#=JRldKY2A+6skEd#urLRZakXaMPCVjPs5z4EHg!JB9cZ?++)W3}UzEd22) z@I6^BLJ7>lrgt5TwD`VEgDP4;s;)%*y)mn=DiG;KoAFsus&gl<4t2cHL~*oHL4%bg zEfXzCOxRo`=4G7ovAasnkrSmP2tbCM50{n}$9(pWGD_PO3}C8I6<%h92c^N7i8jyl zQC_??{C2tdsi!y7?SHdGTi9tVR z`%3r%IBRGFc6Zdz&&8v$XKVC~P{6d;!UkZt%YzmMwpRZq4yzZ45XyL#HoC5E!OA=o zY^{DsGOBK)8wUun9Zt(%$JR&(aeLpxU0rE4Rhbo;ZI}oR`;h1S*KP-7sp9%kvH^@g z=Dvm5W_3RGq?&>B=QSMYfm2`_B(xOD)Piuq5+V2+f&e&Uh~NaM0_bXZq!68 zLO1NWiZf|@BjXv){z`c398@mRcO7ElH1z(q`enh}kq@7SHEy)Fkgo&UW>v%Q*WUKs)fPkoi zYZl!MvZX<5v?tq%o$eQ$C}-yb=6i?y2-*eN(+$M9|K!Jj*+rn!x8Z6 z3|8v+5LuJAGmCUMVy z$l;tTX5EKhnF-KypbMn66uGI9s+dw0?gY!h;9ybs1I zVk#oqFPR0+iYw|y-n02BFQ1CIjpU=r!o8{%&{B%wGkJ%vR%kiLPQ%0le(13 zdTU>C+}6C`bdQ?njn^1Z33gN+1h8w#{%%F@?c;0a%{yY^+g7RCs zOdYTmAV+#k$15b}wPmov=hw3mXS7FwE*5XeZX}W>v;g~`MAt376p*~WQGGR6j3jb!UBxGp7Lh`N85i<_4~mLs(``3U&7Tl4>=O;P*1 zMxVX*sq)lf@46hnxjb)6J{-C7(l1SVCV{+krq;W!KD7XJxb1)-GYr5@zaJ|fL?w0+ zkqjSZ+Ypa6w|PdJ6S)^+mUsd~U?Ld^NlD8Y*oQD1gY2GctWxJ=+B!fMhje32*(rdJ z+I<<+c?`xxYHDcgL2Leu!R$vaLjkCo)RIB8le67;M+zpUD8Gp7=@!u}NSpSSQ(3*?7jhxZk?x zuQ$0>JQsb$OQ`I|eI`CGdstcu*6{`#TTfx^hq1j}mCjE=t&ZvP4)m+>F$e;yU6>

    ztwY8H}7S< zblDV)8O2FJoX8zb;~Xu5kp8qbwlPe*vTd)J{-`_<5_`I)2Nc-_>*2FsS$b~V+8(pB z7-JV;E@!OtX>MMOr5x`UE|4~b<~7=d!V-4^rGF36zGr>_kB7q!I;G zuj-Gf99__+CeC!?h9Y3k@4*sA%7oecD+k+44p-63tFxL|pGFb>mDtA)tMgIYgxxBf zZ(U(-3s@;Wta-W)^RDq)Xu$S#q0B3^WX_MZ(K5b#i~AA4jL}5^M}1f?vcfz^2sxS=%SQOZtXuciUV3txWdHJJl+ zcbZ23uN+Mvv{^9v$q53101?@jX-v_VL@{=saB9iB>s+4Z+#b&n4GkAu+_duF9%>QK zDu6+Q-(+`n)W~VfILC1#Al*ImF z>udlsB4uEbfx~V!wd_min~mHqkRrs;EAPGyh}HVrnH$1ZUk17`h5l*wU^VKQo{^~S z%AbLwlAH1xu1loDqaGY*;FbnvCdP}MzD5)Z&1S6@2()9njAr~LaGqEniU1h+XANWp(UW~D|%F2E$->vfRNKszM9L%6xh%c zH$|u~>VZJLg581PeIm$rh^MU*1L}*Fg_!`xseDC0y~89Q6fI2T%wb?^&Tb3O0{m%~}Wc7rE%oB!M_P3&^b zCIt_>W)uel^A_M@h5*{W^wX7wBcf0POeY)^b#9zzW!(^P!FmtdiW341LF&BCpUiEem~412PzWf~W};W;ZZ@9Vw)A z%IDBy`UJ(RzDb*!v6TU^G{6=dx)Zab8N-GU1SH^yD?^73mFI!&|9_<8rl63vzv51u zQnL7i6+wm#LAS*J-;LR~`k%uwZ8=}p@`ExqN=#j%(ppD9Cb>OeJutdaxH%8q*l+Wu z+z(Re#-;OlOe8t@$!K_Bhb`am%C=5U3Ql+{`3LH1u|lB!y>^U|m1a_D6#-ppHmt#@ zM?K3h0`&e*><^1|Ne^zkQ<4VO_ZXj-}ngm)Lj5CJ$(Au;{PetK^F^_{W%?J%qGD z!#fg)hxOAlC8)hb2!#2@I={m?FQ@3GO}*LStQF~!*mo3lV)lVn@$3jqw?ZFO4)eZ_ zGdstoWY;#ECbuWYoOPXR_g37m`78SO=x{>EL!u6p`}0js$Sqny0#~Y#yH%+ffqih= zwJnOSBXz%3`Hb@z+UYXd+90X+WIsJ9WsOQOtqxvM7u@a_F`vB85y|e%)|8u}>if!V z*~1uO3TYT>5)tt+zZT4SGaAd^_eY-yjiKa~0$%nCKC?@r6iqD4It18MczuntLfDfj zovNYGmiLOUoI@N*O71%sByu_>#n{>&3P1=Sxo$^Om%ApPWVnNepHp7^27rfVrce|t zfMZarms%P}yhHE{G*5vVNak9L-j%M04wkwK)P`XN^Ec2MbD7B*%osy?EifAT~G>Iqdex4A1NBW|i0mO8EP_Lo`OXug918JV<$C}q_- z(o&3&;IHXB=}Uq}j&$Zid|>GJeyEps4DoIe(c+ajT8&}6qWc|_!Glz8W+cKvBZd;m z=D2bsade>;q*3XSiYVwL<1->qEmW;|y`@k>$wbj6hn=^h%IPqY;hA}&6cc0rb@!R>|k|K=aj;IlNYn4R+cal*MSn7px(zOCJnmFtN?fMfUr+N&O%s<&6j2b;QoD#_>pf4C z10+0)DUA0uO9<*9?(Z|IDz8<4F`oBa)LkPJ3J20{V%r{UyJ-)8o(kQ*M27``mDhP& z1^KqM1ImRm2BsGahqP?&pTW52NNIduRbL6T=V2yz9%wZ=jJRF&%+u zenftjZC;=Cw9m2mC{Bne?0H{Ec&I-e=!i5X33!YsC=EIdfy=4jV%#-5)f%C^5*Qx7 zJeV*p!3PBdf=YIyZ#sOtdq&qAUx=Z*@dV-b6VRQzRl9x0isZm@S^!+u2Db`l{#l@(OIltn_?%(`f#F{9j4C0!@;8M(rdX~MOzpbf zmwXnd@MhRm#(i2eHpMtEL-x{INGG_sKpSvvun*-_^Rpv-QRh0c>d0ngzW$uIv_5sI zzLdD2>Ba(gNCVT(xZ|4pBTDEsKcJ!TEC8m^IjGArSHb8MF3>q$Y9&yP4Vouy388@* zw;Sthi1g;GX52Rjml#(CBU;g3dU@){r%<`9^5#QE9V+b}u68>de8^A4x|CF|MDf$X zQ_PI+^7E$g&>TjD840blY5)S;*0=Cm=w0REnlNik)&0sx)Qm{C@`ZVPOY&P?M&6Y$ zN^5@Pop?~6>JL^M&zv*#Vpim|x@nt_K$p6Vo~L=7N-sfkEZR2uzUsTP=ec`vaO z+kRTq{qtxbgnN$hLuut}3JQ(3l~yvm3Oxz_;nRgtdsE%KfPI`$~p1I6w}j|aS1aN1Snq|@b+qq-<4 z#H~O)HK@b_|Ma6Hg2=`SD>~2ZU_p4eI$Vu$TA*q8$iJ8GqiK+6Tzo)ia|X*?9*v*{ zdaPlNDPHQp^G(M9cHjWI#WE!cZ>u`pA%nZ(*LsgCpLhX|Q&RnbOEYoW*!|6@4QYXt zUP#PT#o^2){t~dCQla21Rw;!q) zy@01^Ft|q%lXbs2gCz1UQpCE29^_J3W#X%&4ZOLVH0!a+6&V*u^rY2G?DT5eYvnqA zeaY4*oLmR8HBDxhBv;p%U(E0;Bp)|6gBbx18=qGD3c->zNxNt8Ct%IPm#dwevc_$5 zM5P|cb!xY%nFskbo{Hbchwg6Djz-a#@!fllwo~Zz(TuY!sXYa0fi*Jlg08&Ip8Get z4fgP;OF`pW17#VJ$UU1dtnFT?YBv$kGVkO|#X*IX71vJ{Q>8yHox?}HfHWa{G7w_2 zq)HB8It7$hn>7P)+rg1eG7PwBWH$s7NLq@wtkqd}BXCL!Ubkls9gLk$5#>T1(2v5AbUzkiJpxGBQisjHH7p4(IByS|8?1yPsHXl?>e83KH@x>0KN5YTxpHjBt;8>?# zVF)mo3(55IE`9@NPyhe`0Oz0HDeWQQVVo!of{iU=tJqV)6o>#J(dc}xLz9ESR)3aVZ} z64UhF6~S9)q+8Mf0}Fn`Aq=C*LF#z%uX0CDZd4zSAKzt7ihkM}wB5$x)SGuj-tBO@ zvDr3a8WIJrLH00{#wz*!qrD}+a+zTfV&`7$s)uK75aDvo4#UWTK{unixDAtIn!0l@ zDv6m=Pbz7^K`4;FU;HF?iR{MP=ad+)!uZdPm0sqC{=40l8JF0)VG)lyucD!HY zLX-%3Ao610;768QOW_x`#@L+^$m=yDKFmfsm21`(I0}pyWLLcmB7a}jlQ(}13Bg92*d=U{?D0sg{OQ^m38C?uv4)TZ$0fI4u5z2Gz#2>b9+ zkipsIaP+%`0=9}TGMWmVOImr7vG>?NmXJ0`X0IRHuC*sl%=i@p2Jz(sCX1i_P_0`V zrBeP?ZG76@?2V>r0sh&s5;fYCLW$3j>4}MK10r@;k*djhUafh9`-`+2;kBYEdquGHm7H?oyn1C=xvt;l6Et zUN|U#C3$t)YJh~VEiMG}DD4SbU1-4xdgPelVXkdCZVq8)uxD_KbJbI9GPs63D>Ow7 zsW;m^>8;7+JWJx&o@;(cR&WZep4T)JjSpSD#v&UQPb7Ifdr6UUIJuH5jaEVjB_72S zZ}K;qJ61|1(ZlVOD!MmNew7K+G>>lzum-nGPsHZEvRlXPTFRQiN}Y=I5UX5h0pzji}*0Lhiao%XWzgj?hEC>t}%|arXG@hL|gwq@H!2Mde-l? zvi&_k@`VPB*S*679O(b{$)a+ua*XaJ;EkXAbt6!p8^ zpjvi&_|cT(@+IshgZ1wswA`m0r>zqnFSUJyFJ0d89DSpGS2@U_bdPiOZ{)vSljGXR zbk#Jp-&%IvE8<6OjF7%N;riem=ENb4?1AWj`yVu1m(aXaLYDT;T59Du+OmwEHmZ?o zB*VqL@jLNaa%4E%SGh_91~?OaPSin{YRlOTALMt=Ni-LN!m_A+8T63o2qCGCj9~da zRbwblQz6`9(J%=D+d-EPv=oXoMTTb$wzam3hu61Eh(I5|DUA4lid(%ke}N7w%{0!a z;;OZ+23iynH(B@cW+8+KB6k^v{pm|kuOFanVbuuG0t;ZuX2l0qY~nf< zmL_D?M)*AlX9BVEQuaVxa-te`m>``43Q|SReedD-wlIMA4+NpPwDczX3mTi(L>kP3 z8djfq9A3I5)R@iNmPv8K0NDwQ7t=N5Fb9c(4?e~SmsJdVwEd?|qI!7&OBd_uqj;>( zQG`YHKn=y0b8ekh1o`!=a5xlyM@&Vj%mv!K}*S#s^>v7Wm z_J+*^?QH{ePF`AHKVv3%M|=|G7I}zEMyOvuW=(>!JsLGOa?Ec%A8}{LHH{N%EXm`x z1#gLR#XwKaVkxlIy-^@SapM`B7c+U`$PYhE>r^2#g3-zToacb`nk;8Ha}}z_w&Ou_ z^`!VgpAqEJ`?r4%ZMD8p91*_-Q zeVT>HDsffI!1ZR~J7Rr~f}d%PR`P_0GgHTMV@t`W&yTB-QJ3Sz2nu3<*{lWz}_Pwd~P5vP6kH3Vs#E0hoJyc=5kYB=27Wa*2$SaXYPD~r;Wi^ zAxmBQs$Pt5Ae*>b_4Usm9xi_!g%HWh+Ts;M*Hcw4x#Rr*tZ=lX5Be5c2JZHn>&LNsNT>f82pYalvY3aTv)%pcEW*avobYj!UBg zs+x3xqKO$nr-s-7%?32$@X)oPcw6qgh`RGO#CXLoOKc&)SY)n2-k1TMX*vgSe~(j{ zfA!~=jg=9$=|&*rOb}rvnaI}QC@SD8_eEb6)M2}gT6r2mQ5lvx6>8C9*FwS!K8`p` z&oXA{xih@E%((DC!#R7idU5jTA22TQyys~hmy(~R9y{{Uvlr6`M^(t?oG;B_>A6dU zQYvz_F43wgjdNh)xsmlZ*vpZrPi?fpuwNpZ2a^O_g^P|_Fo+9VW91DFe#J2YEadEs z405+ygp_J6v?BR>}KuQfX>-2kDwtbp?sATSe^jwwcJ!WBgApSkw6;I&g;}>$w z5VbHDP+3K8**Gu_n)}o>sv|%ELnMHO)pq00ABn60069om4YF^fCxb> z%zI!1ZB$|pUo=2-gU9lZB}lq;aXj%|NN5Ii-yZeGN)p0Bq7KV0~WYow=Nfm@1g z4DYr3kbonbqH_B6_C$8WY)P&y3ZS{zJ7{w_vn89THPI>)f8vMWb!_C+FIl;|ITOSJ zbb}D`2dnf6GsR|b^tyv4LTvc z3y0ca8Ku}QP)0Q!@;e$3B{WXa!nwDz+3Ob;_SsisKtp(67;AYk^%0sgw!^4T$#{3l z1f+X`NvKCdh>AcFSI;-Qq0Svo?{g!rPXqfZ?}#V{(j`M41eyVtDC_;UL)*ugz5*rU z-KsAY$^ghlHu6N5%{oZmpAKxUd=DlkeeXiCZmGq5V2IBMmdpi8M^kFe{|RKqWm<&`2f?{bE5;i&DgZdHyD<+v`@$L;1)>Kj<`Gy(S^0imlVJ;>) zXAF#NGp*KWJx3fMziS1WK4OCIb-$sDb`?EQ+@3nads?b?=JRhdgHP*rl=|0`J1V&q z(K+5K^v}*O{)|=3kVE!7VKTaeU;%)t=eG<>U>@@K4WJQz>c{Rs|+~r_9Lfp!L@8;$q`T> z;9g{CJm&oM`e^9nf%obOF!slN%}A52v5Qf^B_$BsiNY1`n0-(5)fz@x&Ws|UFBmdz z)NPg!6mV@bb!q2tJ|VvFN9{-pT+S#KHk9>t*-GSQ@2FD(PI!Osd^?e1k@SBk?Q0~u zK^=Z##*2^<`kwevv-5msQb86qj?fF%nVpkl*nT4I| z5)ba45ncqKxeQg*PN@hKpE@IVk?%nb^31I&!t6aj1ql0J^ITiDCks?frMysi!3HT0Z;Lv~C~ibGz#z z{+wv{ik(z`DNLCh;hUs@ECPb1T-r4Hok3BQt|bs_*s)q;aV>3Ew1rZe)jB70qi}VH zyNHR~w}8O54vS?Hl@(28e&|b$m$8tHphuD^{7!>$<+WW?}h`8RhrbCDT)N_7=V-n$fnJ z8VLLu#ocTo_QNNyNe?s#6tdMF?|a@NUp@{%A7euP^)sU%N*^us6cOt6KYehWpT@e~ z=8si2Yb1y%5{!7*;@=k;4?O)4ooAdp#mnEUiOclB6`EAOzN{b%d?2(N5m*!0T6ti~ zaIiuk`hWnqq&=#Hic9TTtvrt2VplH4{tg!kgS-hWT}r)qG@AcF+0>ZkwwUc6AGX{K zFm@0m>(td9z{Q5t<2??9fo#aGOXOFknxmN#sc zCRJJ?S;EH3#2uBmJbO(K)D2>4{p`pMNu3>tMG6}(i15{@#H$ZE9%@GwGFRL3QuM3n zp-}z-+Wqo79*o1nXEuY@St(NvKXD2d$U*6)%C)NvXl@bX#cGpa6JY6+2OnXv=b>`^ zeCaSM-ayBT8!K@WV+-!k%!%V8Pu(!qhXVl;VQAYmqNAqZt5)`*rs%v|Z&?f0YfJr> z3=cUgN_gq0v?A{Z5Z;`@vN-$T?3KtFO18-^V+-p#f0Hl*krfNQXBG!Gq{fijf#DKF zy3`TPyx*}=Q!^h3{HPF(X#kbD@!v0MEfTlVdNg(JJ(z|MiZ1l?L5GGgM2!huf7@K0 zG0G0uU3b{a)`!pb;dYQzp(GG)K&RqATSfU9eupV2_m`2uhV-j@HnY6fb~asWzYsU@ zzZMJ0W2C9?1P-ZIxHnM3#eagk!s1Acl!zyo8*uM|Tb~z~v@oQ7!_zo2oawWxDcuv9 z`Q`lCJPNXrH}R<(F@qJm5Y0Ftj6=Af6h`m1hm=Li^vCoigPk)GwW0mn)Sgv4^{yq3 zg(;(}NM*!+paQH5Dz^RUxI4IOPQQyZR#rI36vj#`;^g9<<^_t~;BwptTowy7?s1tslj9)cU?O7!M;?Du)%5 zo*>{)joIsPvgA5{Ctt!?Iz{a%#T}-Gur2t+;k1mw-JxI}GqRbFnqIa**#dqaqZ~#e zsXztGoj7s81uBIc1jxT@g?!q2wWs-?y8a~z^-j+{5zqdV{o+quiNUngr`X8yp}Y0lT3tmxi^y}=pXH1g0~p*ksu z7m6CQ5!_-o{bJHzi-~b;%-@J<0zbCrqC#D^7B)-b^VzedM(pACwTByX;-~FHH2pR$ z|7Q1KzV%gIe*E&MQMe*KhbR#%`z+Tj3k-+EihvBgRDK~|so#{nFA94fk@N)Q9OwAw znjHP-a)7j!#zJtJf|ZAgUxp0b@o!uqLX<~f0ZvP904B+QCb0!v0KsiYG1{} z>IrDr59X)~k^lgQ7$h?Gb5Rl5R`x7lN&KG&u_Htnlh*8wiqcwe%H)@BKP2jwmjATk z+KxbL#GIuP#x;_OT4bI@%NLCcN*z6VCu6Qf;STuf;S~_*@5ebBg_k(2&hlD-)-wIQ zpOnpd;SLGi{EWrTDwc+hA*-~ z=K7z9v&K}tZ%O2klTc8Wig-qlt+xBQf?sRvmu#PU?)LC#tBgu6q$IX7>UA7K#+FCT za;wxvkT4%ndk_{_J2~;5$0^j5FC*;K?KeV1HDRoQTY$qk@v&~V%irE<`;d2xg(ulDgw66F>x2u(k$Y?t&EPI^-!TXX=w+DsuTo z<}9~FLrL$zE~OP6aY3~rbM)afA|3HhMg2-v>{8n;ol^U#zfzf2>`pn`Vc5)=}CdY?< z)z{ZHrh+-j@Ky9sIVhQIk!%l*u}H^s#20{ddHxkc8Z+yNc?602<)<6pa{Mco* z%0QWHO!ca*U>4}EMeoj(Hyb0ebFGVYl>Uinyo-Qn*~V%pQ}?MvCD^RhB1xG|@d&m> zg(QXA1)hRK(C=KsYZc6iT!$6~KQ5}p0Queq8dv{0?_-RaKBi^1VQmWilewb)&0b^{ ziB%7pVBkJmxgXsIw7}1Rri-9B3l-@xPqvhl{nISX33Q=9z8SC$(byPbN3|VpmtCC- z3$QUUtez*C^UFsSzd%co#3Wuv^RWDSwPvyh17b@{u7+wB57F&qv<+Jv`nE8O5*gg! zfk3ZG&fyN%pWd$*a$7>jWry;y6FQ}+BHud*!#y-N%g!K8Ese@@h*hxcE7-Hist`h= z4C`I$1P?ZBVr+&2W3_E9b1Gn* z_&?+ufdVypf62dl2Oi5ze1KcOc7eYXZ~iv3Pi*!6a-rM5+TO1UBr#G(nQExJb+6`$ zlk1L7>?XEzG)smDy{sO&+&sB%`>GSptcnzX*)d9TOJ=s|jhG+mZ&mBckt}VJznETg z*u3p}_B?Q1EwA>?W81Q8Nf@wsH^~8v_AyobgRymc28?U?W>b_R;BaFUwBFRQIQ5P7 zxJvi`r__>0{k$-V{k`6X83<_*5Y{WzK9M<21Xf7p$@HvN`pZ|Mj~vM@R0bBA%2?>7 zB&yXdl3N3f_}IoZ3sJv_JpNV@pG@Yem*pdd;Rdhj%As}=I*i{{B}u`#QQvDu2;7@D zaWoX&Fc_o&D2)@Y8#I;GxTA5&HYlkV#v(Hz#DEj`L0ORL{nyNO*fkTb&GG@_{%?mD zsf7`Atro+?*^bSfq+f;b>tnp|LG1crTmUr+u@@?ynQ641>=>8*eZNv?%s#>B3Uq`&!U0=pXf-$+T~p$A z*b`O6$oDw*Imv8csxYmQqMH-(7)HG;=X1%DA``D@%bM+9PJNqU@=Edy2gH-MjzP!0 zNrC42{lso8tu}Sw!7jdi>imDp+9(4K2!0*qL2sy=ALV>0C>{*Yq|r4a!3`zkW{(Hx zIqjH*tv%+{sqn7faAXR3lFIO!3@L;F3M=Tz@}hB_+RsUo=vvGUm6iTu2ezNy#k{oe zru1zZ6Xa5ufD{I0Bb|Pb5S0-Fpx|AM2y_1&gV_-&*mC_}24?xrEkmh4GD{`_4CC=V zGohv!NVhnd%~^jnwNy_MXq>TQxn|`xT=zWBe{(PS{Lh?Pm=qSlrRPeGNbL2~Gk@c8 z*m>K644O~CwQD`Ca`s{gn04#kndkbzX@UA7)ooch{?S=g{n8lyUr%K`>LojbfD+3n z<)eq7id)4uk8NTigR}{YsYtIvS50(9;FV#htoi?D@@KZL=QpTO#*}1?{Jd>tNDz*Z zU#j#g>ZrvW!@&=$r=O>UB>AoifK*C{$be#XbC4(&PHir@`a3MoL=)vR0ppx-bpQSV zRcfP@zM#_5&(PZSZr_MOdk;uK`Mq!&je>@Z=wsmw!pP{BYS=55aOgp6FYW6$1tTq1 zn#=oC&v~FWL_!9qnfj+fQ`m#En{2vG!pICu&;U*6U}EIlKphtpU~eiaWD)W*x7M}- zsAeIzzG{*)ajfTVDs5bm(k>T<`8u8Kd(+j-CxVn1w{dz|p<{iaV>QMv40f6>ZoZ~~ zJX&=_@Ba2tH62|~@N{kjNExl>x#E5}Y!nBJ+ydWM3O4jH+&vp!(fx1w|JC^+wW)>C zHGSOP=2EyKSmwWVvQ2XT$8 z!r7dI3oFL0M1=crm5OCU_{%(6CWHT?D>(oqiv-d`CGa*`w(f4v2+M+Ur~oocOE0<^ z-<5~5S~%C@{dQkUtQYt7J+ogTaIJ4Z>^l`?`CqasGoZ&>*R(?9)0qDv*uR??%mK$( zGT5TTiVMd?gSB8I&zpjvhW|}MO|OIt0);n`Ck_bNi7!Roiy2O9=NOxBdNwhq@1G2e zevG4II3Ym4+$|LkW|0N!H~z1>SBe8IMeZ74B$Fe7>J@^(vfCFG8}<(5)Hw%lOMBhz zOPokT!G7`i%*&r}yxlpk2-Aog=)y*sPVc4oY!wGtVyS{e`uRlu^Cl=vjeb61~GNCg4ZtCi**i1dk) z!}Jv0zU>5VT|9p1rDONs7tFh*?J-VOO^lTm|AJ4{{;_W8ah^Uif%;>&G}U1kPhHt? z@AE~@TTc#*wK_H46}2IoV6hq}cQqP4g6P2pap8w!;AAS-c&VY6EwE|UPINq(V3a^|+jFwvei^P88jvqA|#Tf;luA1=-qwJBjOyGuq(4jISawpxx5rkv7EFH!e1sQ1* zV^OOPb@HD8a~GD6Ng(8@&%s-i1u%=;`MesdGCOM3L82AEbg2ky3=xOdTTD*HBb>Lp zf<>4NtgG^hvvX+MUOh5Rr10Oyd5n}p(sei`Mjm{>Uy;g4QE_F_%`OS(!g-LXh>9QA zxM&O-?om6M>fXe`W)aEJyW7gf5>kgEOTnj2uO6K%3mlA4i4AO=W9LeUQ6iB>mi2kv zoA(4lzqs`Z<-BCj_e)MvB+#sg>2V(pfD9-0-)5 z$aF0wRcQN8c6BxZ4Y=;BySdO@fZJ^^cBr+z3mlp2;-iES!C|dacrwThk&8b1XXR19 zB&7ZL6}Dpk=I_WM>?hylO-oJpxLO`g+wQ6y82X7uYkI)JnF=gF&nkXQ2){?--ylq= z?|!lB;4!hux~J767;(aHInAkG%&6@^FgN`$-kx2tEA$TQx00(6fI>7i4-!ji#!qhS z15WF}JExVnhhi@MP_zdG2Ps>WyPMYQe%@he=#d{0(O_~r(@DnR?Eqp6QPs52T^^{I z>dF^PJ6~*cVJ|b6_)fpwd;+{ZCX31cmZ$(gFIF>2<+_1poBhd!C!8@;{nF#el|V@H zCJj9yJqeXH+|X@g(p-&g^1_ECG|F^-NsNK8t=%ycXD6Uji&gQZvWJ&Vb@xPFBUcAq z;?)UXJ$V18u2JI9N=JMSUI(yDIkEImHfM<-&va3`AI`5g7}pnH2wPP=D{ks4csMLb z(;>oxspdXo=9%rwKC81l00YcRjTX?a1jxkY6xO?1IAE*n5j^n5oK%)%swBRk zY6+7=_;oB<>0y-?P0~WPG`~x+oC(JwhKB^+!AtRvrOhEv9Pwd2rWEARIqe?gp(AR` zQ|<-NO-d^9*iJxj9)VTJ{wo9SwfIru#2g&hjra(Vnq_6G)izTk@&ev@p`$D*jhb^? z*SDg76NuIfev?-$cXT2`%~sqE{LZ4YxKeBBe9;fRRcZUaWKg_4eevnr($sjNJFM-O z_i^;y4QzGh^wzvtI{mPC`>I_Tt{#>K00EqA*Wi*b1QUcl2BS0H-SpqpE5to7Zt8gX z3mUtyJJ&;n@7;nt(NaOW0&$bZS1ME_8*alMs%yUJauud&CMslj3ZPbPyXsVs1}pBj z<5`pLHv9iqNX7}Zv~tYjah`-nSG`X%KC|A8BjGXvx0y!3K=VHu2*^IQpnjBMW=1_; zRui7did;5OM2I&+yWcskHe5QD8jH}I*QohIGweKT%<`#Df{rEtfVa>hJ+h%L=|#g2Y6LC=L_)4TpJstKw902OKH8&A;F^$@6RZH#|L)_ zM+5*2mVf~0Q+c#41=zxV@u`e7RPPv4nu6988Y0IarZRzjwj!BE#~Q4|PWv~aYr2PU zPTF7*mXI$`#M&?kg&*O!G@TcY-)I>Ql%f{wN&rb>SV&TZ*cEsn4vd?I!VOi1r_v@xxr#(qnYA;|3~ z6};rE_S-g|@e@ystrpV;K1H~*K@A~t4MzHq(wR=l;Xm5Kf(Eq6={5zfdGZ-}WY zO<+?;tC6HM5cpR3M|qY>W14%``OlxT~>!IS{$@xaFU|MoY}iy)-r6;_auX zyEq&L#|;#J0c`QiPH;zeY7N2w$!(nuS~2`&F^tfdXD-xa%&UH5mW?$jg~WkTH_cxi zImyIV{nZVcc+uneVB+47oZ?u}q6K$Jq%U+I47g0H9p?>Wz#Ib-lLf(LuphLSOrv(| z`Ht%_VI?zmCDGDC*J0m=`=kD4iO2ViAQR|N%dzHHc;c&=NqK&zF2n5`y((az>}2t&L_Q48|oe_d{q( zC<&U1Z6jWWByP-9BJZQP5b&O;$%c#av`%6EO=^lK$~cQ_>zkcd^)W>UKkFP;M+2ep z5MXU^9aHT7Rn{2#>x8O<_rhv*}YLK-v*KKmCOO zQ-Sk_K2a^n`>l!fa#RmZDhp&GrIh@4)bz?U^>hs{Mr5+&WJwZsHsi$#So1JxF`An^-qgwywHiKE+mG4o)3rhJzdNWd! z{?*8f++%gV&Ct`k@-7!TV!CgfitGmogc3R0IKwY9PxdmWJC)nrKZm}VvNfD#LmF)z zq1gZ=Gikr2Fz&|xD$V>*I1Yk;&$My4)R`<_mYB{IDF?#boPykTU1a0Lc|JHdcz*1h zUAzMdCXWr|7#}qP5c4eXKLVQxnba>Jx@mm0-jMM{r3YVQvf*|Q0}W}G#$K3^Br!h-zS$wfPH#r&M@+0xd??G4ESiI`*mqFO~~FIv+xXQ?wnh;Z>dQ| zdi2|5G{8#TA94n&g_m49p0;kVX76n1v^1La>L$dZII>hi)CmVg`>LAO5UyTJ2^c$l zV41V0hYbP6mlH_U2)_QsDqT_gm4cG6538!bK;gt}#uKFSGhjWBLQmHn!V%3kg$uk?1EB4{GRlW^dD84BT|vGtl?aD|eX#&mK< z%C}ukasm}COrUkI(MsMPJc@5%$7+!tQB8!jXQeV?3p5sdKcnUi-F810RrqjHOjXiy zQCl?x$E%&I{RyLY{WqW^?oq-)xY=gsYP#M@y#v}xy6q+iIm}pvfv4`s0`9qKYM}cN zHCE0Pq8s{~(Rrrg_$q&ln~?6qK(F8(>u2%_)X7ZTA2E6A8xgo9U}AoUQ?95!>y#Y3 z9h^Qg{#wcOPYr0>?3(F$Oj?7LF>HXV&~qsK!E_DXQBY-^77nbZd}^C7$VJ*=3ONwO z4Ttbj38ioWn3_1&S5@nwE*v)^m4-6-i=KN(bu9i!dvtXU{E>|P5B1(^(KQ~F$LQk*`5&9N!7Cbby^*HWeKYsW80Q}^5iK-f5%sh?m1LvFZAM4{O+d20F-p50c!7u?Bw!@26i0S6 z+_HX-gGzRXK|Nfbv8t8k7W&fPCZR11XzWqO%tb|8@^~)*c#NemZH6g;C3*$OFbu9n zeizD#W(Pb&E@94{e-dXVpXEKhk@w#&1?KN*{;eW{?t#+5!4-pmGUNL|!1aKCs3qfK zRko*5^LX>9kM|K*m&701MOU)<#g9cRz&n{zGC$bUtQZgmkE2#Npp=eeVR*-M zxM|+i;{v#N{%n|-j|-JxxSv8tpl@BHjCT-ti3MP zW;}kMa9-gENmeIiV|{*X_YHb8J2cZAUiLcY|8t@zF<7&eEE4_&oiL-8h2rZZ-DoWi z5+!2l1CQb=$;2JLjwh>{GYLb&3YCF7w}e`AvCVyEb1dp`yeUemW^^Y1IpicW5oUD! zg@xjxt^&HYQ=bW>(yO`Q1MBU|M%cf_w91N^(s~W_4Sr*E|HrLxB3ei zAr~N6E>-s+4DJ91{`4j^Z30(QgA8K#p&Z&t1mr9;~n)uWau|Z+QsA2wrP(*4)LVZq4-nr_kz$b6goy~Ac zk~=(M>y*#_WosmJjlT-F#kpmLwENZfiDM=sHQ!!aQ0FvfUc7028HYS*cl#%0hzgWu z87^&y5QVOA28vUhO;D&kjg`3DnLdhgXntY9a zw<~gKjCp&+*YZ6zt_%iAJm+~@!FoG}jPM^W!~&JDl?k>+GWGZ^a&)z%3q5xw??JL@a}NsI?wIw)y;5)-);UB|Fi?apN0%z;>padJ%f?sRXsa| zV(eZha`G@nwkBp3WiIEpXQ5qBuuy+uy}{!{jC3gbP{r_v&|)73EsB})ff5Y zP?))U(yA2d5e?*`I;DKayB>nBfaePq7oAc79LxdIk8&Ra z^@NlkYyWBX{5#+S^JNa7p*oy%C)cwZHDXwZK&@-`?rrBV+^ zwk&5b{|kNGh561(mqB zFAs1n4HUPfI0rVbz0{-B1swM5fOBPXIGNg5F&a|CVV*3f6bP^Ufe0kjniQPavW$$! z&|Xb?%J!$7Fxtdd!V7AKR<&lYodApnsn%pfwA`N-@E{g4pH|GVIXImgsI%3L>jL-C zhKw$Be*Mn3B$u4rGp2asqp^=b+BIF3rJ{u=9*0;6gYN0{0&o4^LA9??tYd6Z@okjp z-BQ81_ak!ZzvH_|^IGQwR+jx%kvXDS6<&Q*oH;>%>ZfDxS%F5TxZ_%Si}d=0mu_s} zg|0YC*0>^R#7BB%6c85wWK&WJ0?OCf4KKjj&&|z3MaV##yIc31qm$AD$W;9ZN|m5@ z2rx4#rMpLJnv@kzSj>a|FVl{wu9BcP1sX0@8VAdMUYmAi4Zg;1v!<)~fx^{7YaVvz zngRjts4=jVFWaKGmtZ`#lNuAv4d47;9_gG`zu6#zF+wFZSZ8b=&2wB->i2@3b$o-{G)5#ce@w;$zsUL>qm~XNexHUVY*fduo01X4(ZBrqpC$RpI zny&pWV>bjJ?r`^?cRD;*7~lJl3M>Gk!(~l~EibC+*8?#6O2L1QZ5Iz(2&kwPA$`Kf z31JX0KvkXqBCWu;IT8F&s1qBI=C3|TwrhZ(VX4;im!%XiSSV8LbWp}9jBb`+>e7si zsLe~_OnbgppNB|QY-#DXrp~AyOilXrGzvg@ujcFVso(>|bss z>NSLyxC9H7)65l#w+B_fT^fEi-A%!5hl)9h8dhnMs2nG^zThQh>v$7({_lx zN>HT!BnO*uhbJmFjs;ebW5uGmy@#R2VK$%D`%R8Mt2&nEmM%{jA+VgCAK)5b z_diOfeEq_!adw-+O!F_=4oVSyK4Y-4>Yi99wuGM+LCOa?PUIG6`5_&+O;86e%DRRk=<_M$2Fj6;PHj2I)ZI*LL=uDuE(3 z>Qrrm8m>+Oya;$A8kG2VY!7=p#qQy$3}Lq#hx$w*XdkKF{P%A#dUPt_)HhG*23oRT zdp?`RM?m2yI>*4zhP<5~k>){ew_sP65e{?KugTAhP5i{YZQ z!3l58j}7q4Q$+56z74Ray@BCKuAJAQoX{q-g&@suM(r5S!(4L`Jg@ZF+=#_wPJds? zwcWoFTS}@t)oLpebndZnrPZ2g`>$|Q_9bePSB6sLDx8f=HQ1(8aW5o2c;Vr;8o}xk z!^!r>?t*fKR#dk6kjZ@%8d^`B?*GwAkZ20`$)`ZY!1AxR2II@A&NFy1u=T?|7ieEO z2AF@r@27O5d2mPf zOq2_M`G4SDUL+WSyVW#84577?RjOZt)GfXo0IXDo7bYsZe;44tq=SX;I>z07HBlgt z+tuBcaWM?GBMy$OxM}OznH%A7)BG^r!aghFrs&)J?aE1GbP{_jL<7dWy9_Q71^itU z-fp>x`o?lWbpx_B^P2<($0z)>?*x*b)Dz5nlTv3U*YP? zyPQ6~b@6UpA(=S{k8?nZcS6x?dWz~HW49U)ykhAqCkVAX?qyTYsYw&L(3ChAN%$d5 z?>MEWrJY4s*X+6MSS+nE%jx;m#{gz3<%GKQR#5{iQmX~34%lIUQ--&v(AO!EaL$-4 zc_+Fc_~HBr86?~B9d#q2v7XKDt~P{4D>4uk+h&CFD7a$to1Tg_eKN-Xzv`Jmp3F;P z!jc2Xn863mM{mZ@MeW(dw5lIv)Zo<$>gLT@RQ1<2dNO8Kz=K6B@*MTZS@k%WK>-cq z7uMbB!7|XbWY_F!e(JbWBL!K{@3KA$?D6B?pgq-8R)HzDi~of(ynk8dqP4JHQG7Y7^o4shH0Q8frK zh6jrON;uI_Ysi+b`_L=}3sT<=_q_smbDQxPW_fH7+R!yCMs$njnUJEnU_$OR6K*dClXGeH5+`31P zpG>S~EgMM6IfqrYhYL#t*CA!-#I&zx@i(~P94EF&BjOZiy-1=xsA9hPT|2)=>)+W7 z*nuo99I2qAP+IXHs4;_}n8DJ@a8@Lr&Odw_vPS-VG8mc1Dd%J-l2UnPsq(!3-pgU; zeqUgj%^Vzpsh6!fF%vRrjr^T!kdxf;*lrlUx$kc_c%Mb2JFCXjtS)`Oar7bhFGX`4Vx)I zkGYPK=X=5BO@Fq_QWT|4#9-ouy@&44n17_|JMO?1sjZ?f`yhh|U@a`WRp%I!c zhKiR{6nH7#rU<@$Qh zpBfPo+_vqY(&4n*llb(HNT?~V+Hh09 zTFK6*CrQz}Z{JR#UUm(i8RY-+Z~-5+9uB{trJ*&`X(W#ZS=)Nu%5q|620f5-SyTJi z^FIVrNwL!v=|_O};fb51u$>1=%tmp=cLkqYrk$+cnVQ(!Q{rBsQPzyeN;VJ~G|QR3 z;-Vi!Y{+-{>2(QZE4hpq9LpXn0$+kc=A=3R002mu(vyGy26%N400016ILHnPa2O!e zR%nZ)FZBictQe=nQia%i#i;w4ar};Th6cq3bnY1zQJBmN17)6JQ}~nF{D;h1Zx(uO zojKx|M7c#!txYH_>X)=CTsPa)7 z220bIDn>F3_UN6EI2!|5e2YTm>(jILPJ&!&>~2$8vVwXEPC4?|2Yf^Cdwv{YzC+Sg zPUu!>bK>(+ULDY}Bm9%y3==b``W@pni^l3T*T@B5XHLGc;$jse<^cnL1t~?&Vk=m{ zCLW8xkK(nr`*(hX$xBjZYYC%yPK3CLpxsF;L#8fT$L8i2wQA23Clq;C`H8Ja$PHRP zQ(;Ibk8^>kel8lfZbU6H+9jb(JTIR`>t9v>5n9^34={w)r+_*#Z4d~d^ogr)$xK`I zsOrDVMe0!$Z%`%#P2cZ0WeomxyHlsTUWU?xvmh!m*5d%|RU-{IZ?qvHRH2XHD^^6a zi|wa=Ah-MQuWS^sn8=hmf2)L+f9okVL0Mj+%hmcdQ<0)d9!Hr`Z%1|9BmPC{M&Jpy zBamWZP;>3b{4*e#9)z6JltJf&XmIkXpC=eUD)-u2?GSKlZ{)7DE#D{5bE)6%pqjz0 zZ3Wd!v0+)KoIU+pTdYn*C7kePt?693No+Bx|LgI_>v-W*CC2p1VIefQr$eWY!hwTU zVe@SXajWx*JSI_J^?4=qlcq|#!#EHKbnkflrI|1=02kEY?7CijRU%eT7Yt-hnGz}T z&_Ysd8i4=>m5DlvkGx^@FK-*H55f?j^c$IKVxiGsant}OkX|wX&h*$k!=Kj@ivq4} z)-i9xZVnOh{d!1WZPTMOFmRy0UM)h#l18~FvXVqjZvA03;t7WDi33~d@v*;R)^^V) z<&VqsK>L@EZom~35$7ZX+ZuiR4490I?y#=XH;Ub4_J-k!eX}LN3}y7*ib3iEjS;Ym zW98sb2_`dr3TLA?_h%GsnDx~0#r~T~k$Svtjm^TUYOFE$60is-F!1Tafui zV|0P=Cw69%_P`WvWX*E?Qv`w~ABN^XAm^0&!F-CZ2ly(qq>|K@#nL~4p0V=09Z40| zGzr_0=hM2UTo-NO$ZJ`5V-KQnz~&y_4e*UJ<0ISVjO}w~2exuxzK&_T3YRzDZ_5+# zq0)R_)wy$U&7af2w>YcVm~0k0e<_b=A6KnWEvE!PW)_GF zbvTk}MZKhl@J6#3xh2zTBJPIR*lO9{FGqLm2aQM4O2=|cUrlRbHkKLhB^)$7Cs#4$ zHQ^h1GfJAlKOPb!PxlrTtv*3BAN}vUP}g2ePTH!uwR@OaDc3ig^{xkuuL!K_)SG#x_KmOE zCb*WQzNZtM%~#_rdpZ)c`p?)OPM0N=B5@$~DgIrolKoX6u!34&+@_0sE;!vIHUJux z)IxU1uvR0Sy$RM7sqE9h3MnX6lZHw?cbR*UOpCI?%fO}%>C!M<+3@4l0fpYdH%o=I8?hemL;Wn+#gDpJD0zEDm6(52#&Wm`&~(CX?o_j`wf@P+>KE$-hfiEorkvza(E) zNw9dCmh{a|d=PM62-xH6ye@c2!^rrKh7zYeIbT39Cs)E3!er6_%lRFtZ<@d0EPU1ny7BCevNtXhfuB(UvEg8wHK{vgiWeEhHgf zXc5a;Iit?ReB;LSiUk;eSX%4wu<%d<({C;`l7k=b+|iOfB&IetSS59~4uYP7!1O4A z9<_}0c50%c$^YMh5~Eb;S-@Hx2QG^O!TbMPc)f(P*bXHI9*fiIx)-&k8;z=BX_c?x zN3>m(=)83y#H;|?okd0mjLm_(;*&e!{AVnnthWFz$l*r^!2m!5E{mEe5|nb>0LCB! zUG~bAX3@QPN4>5Q?U0lX1moZWzJLGG653Upfrl~a6Tt}fdqo~TOq*{(UPd=6fBVpGA$_`rnnW)@N8kp& zo`eBC>k7aw*TpA3cP|V@-9Vm%kOzs*jsYW{tk46$HJ9K0-6ha%)$@Zvb2fNVh#Qi! z!O<1qsL;PaZ5vHkLYpauRJu*xn}oG*j3?s!S)Xuz0+6Ka*UR%`XF`vlbia z1)n~b>ct%VS;-&`Pa*cX*^wK+pD8~&JW##B#S8p#{bj%Z#J1G+W5FA_O1rv=?48f4 zuYA`Jf}`&(0e`m-HpYSX$S#=Fw}=7YtC!q1ArZ5kj8+H6?JR@Yhc>Y_d^$F0a~m!t zqG+cs&Q!{-sEnyalvN$U1^3JNLXJ-hS~m=$2WtLO{8p&?{^%jh*I8;0^1$S%*_Pf- zY&&hS8N*K9yxfNucEyGD{W{GYU#oV(Nx5}EnNFJS_&0lL(ixbe(?qdR>}3ftM|&}5 zCjrPGWCEK?I)}sK-KjcXv&Nux4SMuM_X zwMjSRKgbH=&Qpl1GErF_&fgwDLhq6B1EiT7^fe*_4N{nBu&f9)cunkNayK4%7tn9t zBmzLVrUY5%I|Z-OwjO4;-GC0}BYGT)*%<+aaTi$tfV(J>x6HxnDVI$6ibc4d)Y+_S zi?rYzY2hVrFJKz)_}ykAyH1GDL#)UR>d^KzAp4*8OQ%1iI)NCNv$NwC*70sN%(1)D z5Mln%*AKBHX|k%nISdPIy|5{`RYC|k#-Yi&_gNO$=pWd4hDfm2BS*Zq$1m1|?F8-x zZlDO=oVW24x|6A68?#Q{OXTzQ!?)eofqJj7-jXn>?cgZpff5g->GWw79r4rE)%U8DINoU^wLl?a zGx5CSiz^1PUzJCoh2yv}=_T85;*!FqVQj(cYM@i*l1l#%Zevtf~6<`(g8P zXKYgugB+Ln+i#i`OEh&X1%=cUuT!>jJxky|IH*2tM!Nd8PjK zxU6Gqz{=NZ_pS0Ax(i?21t#@6~}f zainJ=+ED}ZMqSVhy^FUn>Co`f#M-y;5SNyPI3A4D-iC>C?2rR#(-N$t44*1F4cUNgTuKp+S|G102|0Ui;YeKA9CXb&Y~f_2 z9Zx42+7yGVQOb__{JIDg9NWY1FF{BO>xbj- zS_v|`(uxh>XOrMxL44DsY;i`+?c#E<)F-j~E>AsPc!3K9?i`T$R7zd32_p2QVLUjD z0N8aw5jb1}y2)D~9LoG?s|4UPotB z90-;eF0!r176JICZ<&Po2GpsC54wh-f5{!A%hI{U4{}-s+ zY!%)1$@C73ouH}2 z1DT^gHT@rgh~;Zcj^Vv$OxA;=9107CX4*qF^pT`ML+kRu)jK}~tdKvAx0q^;Yk9$Z z0(el+!cd6%xI0+9^2q!LFsI0s=9j)<<~>Lvw2^}%GUV=yE9y2!b{>(A{f0oB)SqH4 zI3a>4gdwBLsKCM2exsi^Iqza{j2NOe5&0wy-!C-*USpf_TMB}iw!4v{l@yrr;_m*^ zJB|~&-puh=>AhB~nujOg6AW%30003V?0ADm$NLtsX_em)G@V^_;wiU<{Ng_D*2cKP z*pR<6#3d9aYOebrNO+oTIYExKiSlH_TJUWk13>}ec>n+rENUW)fv;P2$y_`hn1HaL z+GF|RVX+U4CKkEhirFZcNHb>PuzKb{54(}XMAv$EH3y*ewm)IBpmaYlsQLp+^ zGin~3fB}9Qr>M-DWHTV0GOp0~`ha!w@>@PbkzQCRKEJ5_@O)~Do%TvKR0=}XUA0#Q zXHsMHI-`%{#N^-bhp*Uj$t?WLVWFU15|~m7yOT*f926-%I}?)#|4S(lkrw^Xlz+b_ zZS8A6*I%C;A{CLbnFljCDvC=AKXh;vrKU`rVi*0?V=|Wy&z_I*B;e5eod7d`$r5HUm$!q5FN2|Sr_wZQ=Y}sN3 zgjLbuaiY|`LHaP_DTxohXaVk=oTeaD_j zi5f0DPv)20`V#)cNzZXh zcEN@>G+cKX(wkQjtGA`FjLl&CKClHU(Puxi;VuY{p}Ba1`;_nJ#a1pSlML$UzDLD3 zlfENHQ|LDrf)}}-wQn<~l3*Gu)aZgHR`!WohEDWHdYWkE`>qY={~6W1zDEs}iT^&O zKv7vE%7oNo=S`Uwi4B^7I^JaFub5;IZPlEB0V4DPBd0aCwW6QT@hFp(D?Q-g4RF-B zrey%hMGM5nziX|-^Bs_wqzN@qU_l^k!dAa&juhF9l!bvSn?m-Q>@Wla6OsTlzyObw zF8--)(HHqOZXaO1mm0dd5pfHwDlt6ChROhohe|x}8+| z?{U%R?4O#^nY9fr+ys=qNy zXdwB!P0~dPBNp06ixdS?yf2SCyMNmL-M(i1kEq?1det(zvU0Nqo5Pd)i^9t(+$c!) zG-1>bw?!rN;zhY;62N2{;*7~5??wBc@-K|!ZY~-u!A!Cwz{^XW@(EX{@uZU`k^(Eb zH)e5}I>A?M|6uoTs3&8|at%s&DFI_$W;8AKO?K@QWtGiU!kzj`Pzvh-+UB?4S2(J- zm=v@FvS9_ZV5{y>zF|H%FZioAxern)mS92;``iu10XpPcwhUt$Y*>s4m2`^%i0zf) z#9G9HzR5r#m9l_4wwwPs;<5#E5l4}iCv12G3mE0wq$VoTQh8Q^C-(Z@pZ|aW963*y zF>~HinVsZ9uA-?L>u0~(cVaZF0IO&=o&ZykI)2C?Uq(EV8)UwXtV87iQNCZA;TNaV zOX7n}`tG9(A9 z=A7@{Oa@Whap%4s3+A%Ik`^T_5sP}?ku1H*X;1df-S?hq0w0Gkg)E@Kc@oebs4pV) zfb>n{80&S1RKY!(c$FuOp}@vBXJp{$p6vh=6(cP1cQCZhXvIlKe7vM)PSV|w!JnxU6?GuYby#N0kHr;QndqJVkB z(b(+3-Z8%6t#6u{hO&8xA=|`Hx}>0pm&f;yN>AxU zkhCOSaIN>sciAeR9_cFCS=Lj@g|{OpNN*g!xTwib21rS(=e5)bf~r zWo)97*2IrH13od3!rm!}OBjfyB?gKBwgiuAubPx5W{(X&Q)W-=bJ8l%A|K33wQ@`DE;6xqP^S+3lYj@46*M!ueJ`RDLZDgw9k2^pjLc+pY#XQlU!H!Pg9 z<)`iHmnwXUjrmqU07$UHl&Hz6VSJUv{=;*vsXzMdd7ql`TW(5~+4g%hdUI;15Vr)D^fK|XQ- zF}Q5&p@yi=8aTJqU?!SX7zy4v?fVlT%{7#dibk>*9M-v!aKL(MC5VjH%G>nVnWLE$ zkCL+S6w7)A5#t8eLel3z!LJB;zZxlbYRJ3GEA;Lmpnw2#^AaWk2aXQW^DF$YPlm|N z-jDQsLZ#DikYH{mg1TC1M!RYB9c4n*+FoHkG|<^xctS{bvv^QRUhtU|C8r=6m-FeN zdLn>3>bgyANQ3Zk9;X#$C4||KIAK}7>O1^Q(&e#@Le1op(>rjg81=rqNFs1f9(|p% z3f3kn)?%Ly%G#Tv;FHXtG9c+Nt;(%+XFau_3G{azS|P%0xEU0>Mz76wL2Dfc=pb zi*TXJgvDYZ7VS>9tmYybN_2bxb2#^17_%{Z+H_)rN?n!I`H4IWvJrsc{oQ*>k4tWF zhPf5+e@2ZQf`CQfP*|e}f-)o|rBaPFob@u2`#8)C5=q+NZ1h9dq}ww%`=RC=E~QR> zNSX+WC`Gj3c&nm?3Jbf}Gq)a6hz7hOfZplL5{wtIf~;RZG!F{li9Ui z3S@UiEI*{Ce+dDrL0Bg7j;25N&&Q+L(WkLt(Hj=+ew4=cYb@hePNF0Mml_Rb$fhQ1 zYDxZ3^1U_+2OEqMY740P`=ep>ukt_L+dLF;_9G#%83BA36BAt8A+Vxq}R>-SJs&ew8MWCtc&;c7o@cCNR9Y z4GMj-?I_+fBKIfOn*N~CiRk)r%Pb!m3le@0s?5W#9XMR>4Yd1obU0*C%So{{VKGL)kX23LuE1)beVJ)mR@oqx-iou`+eWf2US$2 zv_kllvy=V>G)2DIJEqoPN3FSsDAlM!jKWaG0mJ6-A|*i;P|<*j!kP~LW=noF*4!EM zkV@@%(^9bBQmNs76wpX0)ib6w#X{q5*jsOrQnp+v%HmSOTcy{C(kv*gFf|ZF1q1EM zf|-aqD&=JK;H~O#G-v36Q`5!eT5@oLih7Jp`+&Mw5;KYL@nD)#=*oMM4Q+v5E6&#Q zoKcC(mwu&cp3J_bTNY=4WC-a^#ZuG|2Vg*97U3w0N`G9Up@Vmr47d$m^5K}${;CLk zs2FnSEoA&C510TmTZ^XLg&iuv)j*WY;hCEks$cG=jxSXWwDPQpY5FCC&sbv&wI}0y z0)$lFE5nWcR&3nB3|Q-M#2yx}7ryjP6)~qT@4;6aD(LynFp2#1MxHcY*jIoKgLec1b{ z4Q0jv1s23nDesKrc&p<@>FIH;sngjv@=2qhVQ0IGM zgP7w-WHTC=NN5kAVj#tw^9OIUmzWD1wj)#xuUf(n>U`mwmD9hIPsu}NW8j{JJlXdr zGCA(kkz~6db-b4O%J~}<#pm`M6mgtX{XWnmMK@bY58)7>V85dWn|3S7tXM%$!Sip5L;L%s6a#?hotC^%$WQ4Mi5KajDW-B{0$z`g1 zzuL%*4P6?A-N0_J1dPU{BW8NH;jG8z^&mZ9t;G&orfitg6nAXX-_5Il2$cZp(rFbH zZ1Gd2BN(bJVFwnbETl;2LHqt_(15MKK`6-d)TgLdUxPu}O7u*Ljb0Y&<{C)Ayo$2E zbY31B{!4%-ee?I7)4tqH&LZ1)=iRi%`@!_E-SKP}Y(($hp$F~8Tp9A$3L{>X#5Xcz zvF4zZDmbZb*qb|9h^ZZKdSE@Pz{(D?_vqf-c@*Iy3;*s5iag0}6s{ zAK*3ugpOCdVftcryxfMj!7+ECxHJ$kQBtuN??dHBc8^XHoA zEUCov#ajQ#Z1>QiSNX7imJVmn%7n?+Y=u@n#V+^*tTdIZ9&(OCrfK`)VTj`Huzv2+ zLg4(Cw_xep^cCP6q!MiULWQhvX);3U+96*w#NW^xBZl$sJ_3zIGr?0 zLT0ZZR~C`U{c6&5YRE@{RYY^PKbKpUL2d*^a&{0p2*SLhy2RGPv-91pr5Z=}JH)Lj z5yp=&pZqK^zKp9|wC{vTYExADpCJIL!6>|CdSf7zAqzVb=A?Q0XQju>?}ra2R2}ie z6v2Er!v_w#4F-LGt8UD36@6deN)N?W;q#yfoLs3Cy7a2*XBZuXh~?Z=u=u)mY!-W5 zGy=e=m)7n>rfmM1wwffK4er!)doBJAryXB#D~k}V^=j*=xH+l>IWfuZ;E3|20m-&3 z$WsW+V84yLGVQa5W3@2^^5=UC9$~rMIGR zBFshP09_|nr20F_t4~3>JOFYksry6^7TH>h4UymA1WiD017h+X)ZZO%?I{T?x2IrQ7FmVxSpd5G;_Sp|m$7*nc zn0`eGnT(ffIR~qHI9Da+wu>(0@z0~tl#5gcG);frI){3K~i6}VeCbQ_z|T9}oBvMM!q$%tJ+%B>HWT!}x( zxq*LsAAM+HlfhkF)=2I#1W2shWzR~BWG+6v0fML7f=w}uC+{)|C@I}F2X$^c3yo82 zQu4icJfgN|VLJtZ&ziTB(+AYV_^PPGW!@R2aFH!aBlE*JKYjRpjYNPQE?n@i{FOv_ z1@+;qZpMzpfs#o8ItzizOY)SAK{lvG`#&eN6VkLNxxlzyYxB$a9iGM^W6xPWhOJjo zb%5z)z^6mRh{#4cUxQAgSIjyJ zCP6W`{{&AG@XO>EIjriEa_bMM^&RvwC5rYSee#ELPlPBDYbKtxnH<%2Uoz>?Uqzu1n=@^UdHRhqYKyO&3q-+6sEx6&!!Gx%X$Bf!zWO2c{t2IhDh=%%}l<+;V zj=Y?N3KE>9(W)j1Fhr2_J|&w(DEfxyC63_X;nurSWBp?ryf4B30nAfe5~&EM>%x+p zL1e|6m3~^gSFET5jIIr?Z1Lxp%KusJrppPR37+Pva4o1{)U)6sOTB>O_3<>9k}R{# z7gm0$@!EIzDqRoT7(`y{bl<)~;-OTx9Zun`=fF+NhoG*`L1C6x-3;IHLV&)%-JywP2G-vSoIySnw@kNzY3Mn=L4E0kS= zW=-3~OqN(2pCsSq`NX!|7NcJmh5n@NO;Z1%m0K0qcKXc6)7^z^AsJx{Q;!vFh)`$U zU*Jh0V&>viGM~2`*X%>DE<$HDZcDbP3j5L`tA(Sq8!EC=GD-GoCo-VML(#~B&5y_< z-p2q7n@~?ME*2(y4^#Heq_6&0U|xY>nRC*ij}J!c5x>lEXB!U>nShipmc~ zHlPy&tIotRm3*p{B#J(s;j00VRP<$@BrVauFaZC;o$XdmP-Dl3S+Q$%#kcCA1Nq*|FTy;vJD`o@*d8J1U zhT~;+LxX>Q&~iM05s(}0)6lMy&~H)^u1%&A@=J29-lqP#%$rKL8YXaGYeD9CyNGqp z7aZ37ebCOZ`4R&kLfnHPl$h%vTdjRKJDRq0M{%ivzjsGqGFfuNu^h=MsX@9yyC#r4WPiK~?VLV>7YnM~hFXSfmJ6($P*hPoP5229yO% zqIgG_02Df|tOM%Q1UAU`Z;1b_(N zAW5*+SoddpxMF%iMIB1rMm6i;SMqaFe+)!7wVLw0QTp~6gSF>8*QdhDY@7-2hF`Nl zJeqr!2S281!Cu0DdjQj6gp6RoIe$p*9FQte_V?y8dfvWQNlNqPs!*jQg?82W-nk~t zUq2^XR#NAU*T?Ap6Lc63Q(nDm5icoAzSRPX!6MnZ*u`q#C7bLgDq5)3nqCjzLvkk2 zW-)pr>$62lxaP(*&S#13F(Q%3B&1|b+xf?GDf>;-f%FFaz#Yp6VP0<0L=hL1+&yb0 z_RKT1x2j#dQyAN70t{sLT+#_WABwi(g594!4n3qN!f0gmd(!3@uAhQ1TvdfNPzrj( zqs_2=L=Y6#R{g!2PNtwQzH)x2RYoKTyAwn#8nn~mR9z7T!<(qtUT@Ww@(!_3;_L4` ztU+By94+RJm$i4gkI$FJX~o_R4yr7~oA82o_CuL(JwMs5s610v$SiS2A@iUhdEizO zv{e;1ZT-A2(GSqJrLQgh$ssp`qIG`)#h|ILw7{vtlTN+goX|Yzrw@!~lJpPDhwaO3EpP5wJl zr1Hh6!@?Y6Qp-&5i>@LBR1?OUJd14iru1x?w0}uf+FL4s-EsM3jx-ZMjFwH*st&uS z>f>j5kLD4n`x#q$%p1AoDIw<@09w_U(k;KVaqpglJ`5wJx1H)&lJy-dP{5I;x5bmv zdIb8w^~lEl-2Md;^Z}tQUef-aJR;uQ=21GV-H+T>vb&~O`?s8A4(+J=Dik9|zCGIZ z?Ow462b#8k%VNwKaWO?b?h;ol&-%ue4Pfb`GYB*lq)+31rOYP)y;fUEkKRDL6Y!|; z9x`U8`yhhus^qqt-Z z&ceK`F2>`tu48p}PqBlWN=lm=#|f1nXK>O000001f`k0qppVKj$6L})J2|;>qbL9Y zfY;>SNSBXQPeAF8Z?LKFI06o_4V${>eS+m8yQ9A9uOTqm%@6FZkfXx+c+3U;+8*ZM zw+-B;^yDN->DWRNm!zV9!ZXb{2On13Jvgg~&OG|-Q5VL2jv-93G4rq#0GB>R`AfC& z615!%dZp*y{i+`T>Al1-lYiL3!YBpE(bZ z9|`yPX7eQmvHhFySEJdOs=ZTCdUUQge609y(T3e)yjma(W{Y{4b=pZX;lJ&-e=q|yS6 zrX6(5e11OFFho#T0vU=zr>XVpU>34`>dyM}tfjPO5b{sE`iRH{(SI?8LF98qz0)sb zdZ8(Os!`+7OlX;vw|_3yWB$iautOgGFm&9ts%#Ie<*it&0_&e^JcH< zy;61dNLZm^K}1yH;BFAM>7!$pWC?4X`_P49Ho?ZLiFcGDb{)SkRYJkkn2}#)+goo_ zz6`*zJ$UeD2@B9YiU;LsyPE!0tHC5t10v2tm8Gbk+kf_bEQ;mqD`S`dasiBNQO~mMZm5zs41piw?nsgAd91^^5-TEnXFO$=wep15S$m*fspzrTIii zmrd8~4B@9~Md)bUfVsayNK#^8{E)^hnR4CZQjgC#qNb~6!8_bcD!$WFjNnLxzT1j#^43n1>+QFn|ajTA4ee+%mLU{R^h0LO; zW;rdwCurrV6JTxod#i0dNtEj?a+QosQ8FanBuI@tF69OZxdWUB#c>mgCdl2|Yp3Jf zhNCL+M>@8}aq4M-nFBh5=KSLSfuj?*D{9qsQ^{Vl)eje;#_Pu>r(q*&LhOS5hA1?7IJrCuY`ygdw$aeDW3ui+2c4qo3eG#RmsDDJj z*bwczFKFYog!H(%1|X-z9RuHxwsjSjm!L6Dk)k6I&H3_LtOBptpm+=bkj=N72d+P7 z&IrTxqo`rR!V?o69{xHyCN4z#vjq5rggjJ-SUQO#y&tmXKKCqjhmn0SbB#!C4lD6dN9%v>G#!CaDK9`$eQo5KsM9Gl>y<|EdydZ)`kz4BF)kw|e=mCRFkf&er=TW6ELWK&Ka% zal_%)HO@C0SUIrhJyaZr(CrC7D$sS9ra6nxkA&>xIVq$@^vqt&gdS0@3utg~myZAj zjAzljP<#rct^{d?AO+daeN$f=ZUi?*@ZI%BRWA5shu?K8O7mr zxr?$Q!suT4@`fr11PY?GKhZ9QS3Xa(m8*2Z86XV`&0fFo>t)FhT&e2B>n;LXKrmY( z>Z;}p`6%SXNsj{{V);Lt2m-_a7^YI!;rJE}H)&W0*pt?bj}j04sMLNf{-F@bcQeOMG~4ZJm(nu=?H?3&7!*BLB8&Q^gdP1m4r!f5&=F z@Fh~!?2X~sda>KH$8;;#B+m@lCN2o*TwxYm1;Upn2SH4%TYqD>c_g-P>+K) zFqX%Yvt}eJaUKrXE>TR6N%`qX`;5x+hrL%~o$Ghwyq)F5G(!hZtI&Z4*;-&fF2b$) zv%h}LR9;+JmOEI-An|U{il68jfG`;dDKS2HIUF{KP8V3T1xmnKf=fgRlTIW8r*HBN zTf%1;)@T~CB{0)aAXr*{i@~ILDpf}D`Z;ZYYuD6*Lv<;Pl$?`IQeg4Qg}`n%_Y+lV zZt7b*woLh8M>`35Q-jgz1&dX-8h?WsOo+Zy9SU6y;%(nu7WsL2pA_4|Cz_mQlB~7{ zrqr^?y($3%>?L98Uqfr7dVw19MEVREAH^P$7uR<8ejyJQp-;J}l1=}_#8H*%fH8CJ zdHaawEb#7@8sgUAk$u_Z>)E(zRhA5Q6Av|*U{LY#S#-(l{>YDq?A*fP#e!XWyymq1 zHbYV^sd`rSRsSP_b4Li63x85Q3YSvubrSf!Ys|Gi;IdYWWN^x)4Y;$AF6qm_ld9Tl z{Z3BfLqS{15lT$HYpw3-zv@lHrouV+-U08FDV(MH@$vV%D?dw{V2FN!Lt%{fl?lBW zg3|`{mixJO+wV4}>AV~hM6i_Rj3#K+FkAA4V*LoNE0d};FgzZ2ZG66UtRm2%-+Kq} z@@))HU&eVW&U?Cnk9KS1-^Dl*?caqs-7+2UV_+KF-Nk{#1mn+zrKz7dr(?CsU>(Xr z5gXmL0m`tJQQyWNc_;$C+L|B7Ixp(l^YTd&zXbeu$ETi#nX~;u4p()6*U#cksfZXd zGeW@epnBJU6VkgagyAood^Ep={2#mYt4J{7BJ4be0{_oNba^HBCzzaJughl$Ij!_F zwHk7sG}>=RBTqT_OiD`lk=|b(3zCes{6CGfC3$1;*SVbvU_TnwycZ_IXZ>?EWZ$GL zWV5KmFXzbc0*fFH?eap;w%FrfxYpg+7>40W2+So@7Fo#e7J8Oc)k!MaSNQf7!bjb` zt(2CFo_m)3pyP&8&Ft)Sw->UCkZ*ez&LPl&Z=o&pETZbJhEWpX?7e%y44eBx^ShUZ zA?C@i=Qg3VrTi0Iq|_vk_B~S5mVQ39TXW8JQqY#GGww#EyK1Utt?# z3E!A}KRD*H{O5kkVF5b*oA5x^ z@gNV_+w8ZaM>Y!fv6|+%a453oM_9A+F*4~D?6N}T`K3M<<2vw01=<=Yv3}1hgz|EG zt&Yv3v*g3sFr86~4)fS3WTWJ-=M4+~CpRtH%EAKb+3@-NFb5{Q05hL(>|Tk?c!d|> z>@`(qXWx`u_`?)@pKsjEl>7$U1}{gPH-dagV-Kmqwj)}HQ4@x>O#ZVw_`_Q-!>*^6 zRX|2+hx$)hZTXSd0ukcA)bsO80F?idI=Rt|E7Esi9!#d#4{I13GFC>JaG>3r=41aBGn^a}ueag!PfkRZg-{X@lA=(_DEEs+>+3T!ygOfF#fu z0_qG~tT3CG5%7NO8pK!s*D+cCJ(q!JB5iv9?$~#bHzHHH-HE$5Dt~c7n<^_J44tZvNBS`qifRufoe94f^c?69L|A-t^N=4Us{0m8j)PB)WkNyCb$CFf2y@fZTG$ z+BJ!%dM|kKrH8kbK7Y%pL~vWYMGE}TrKYd2K zn~S>g#|4DNO9>zghlc7s$s}^ul01jtl>IWeMNNOV2jeqwqp>ET7nUuit*$IF`Dve; zgYJKs`MAKI415;`vPNtS$#J8yzJvCkbK}g$ed@2 zFcP|h2vRg<$eh@^!(OmKVIKXJIK$J;yDcIUtzH3U06E}+t`;1}M~LRGhipSesHA9v z-?8y!_$4EUo7;5j^EU;eaXTg$#a=kS1_3X3yERyO{OMiI_2zF=qg-gS_-hF~4)?h* zd`8F=Hz}7+>_Ed|-bbyGZn{EH_lj{$RJNmp4hY^)U-OVxFw~%_eRD|>7urhmL6lvU z6u7lUoE8$~nz22E<|Dm9abW?*Xe>tAM``41ppM#BD~_${pVbz0&NcQJu5d&ylXTex zkUL13`4+Hf&-H9u@v+?2wY-%wsc;A zU*o?hUqM4md%?IPLEPy|o2p=M9lSLG=w@_h{^G)s`t_y%hz!>(a#T5O4Ny6=r9w%` zUD_mv6<$-@M`jOZ!Cd7o(s7+!|EAAE>@4G}H6zG2Hvx$t2oA2lW(70&^x>so6Y-w) znsfNg{MTX*BdEWO>??p`NN(_?9pmqQM3jY=_xPM@-ZfTEZ5SU{TK3VIjXq`)obN%C z@BlzP*Q0#T{6P})wQ!qrW9EpSoG*^LOiL8WQnxW$JR%BYd_VXNz(y_ zfHEnyfH5@pQ9R|cvG@2P3F5(H2OKxEA~qiuyQ%zM@rS6%AC8dyirG4NL(^?S*Bj2^ zAwr|?Z~5E8dEpj+?Wkq)#p&UHjGTusq*|83y_)0^pf8NDSLgE(_)jZ#G=6p7*-C1~`r~R(A zL(KHp{%5Qan`_nzPgk+YijZZ@{WweFJ>u_o)`h)k`Qf8DEuR)|!TZ;F>U5X^IFV%m zUjUhTuNyN(Dpft=CK_0}0;ayu`^vt6+MM~9kVgQpPy)!k+F^(XMy{bcSmrkLIm3@A zxG*yo=x;Z*@OJsrdj_6~HvL~kUVG4d@`;-3%ptm9PS=&bS-zjD>=XaUoLhaV^ONVhXjG-7(KQ*_eFki5N8B3n1GKSh;9eb9Idx3HlSWX5|a8cb9j z=qO%!ivmbmfLCk4ZI|A)ABSp3U2n)48Pn1WqRK%ZHEwBUFbVq|fmDGLR~cF;ntJ^* zZHd5m+MWTk-s|cu4k-!Lu3=C zfcM4CN%G+YO{&!5@jlwCb=-o>WP6csgVm6Aac*y&QwC!)v~j!KVC4nbv%bv-4RQd= zsa}8p0Vk|z(Z}I|H+oQPob22lvE8_8@LgoXqzt_y zZSY57b~D?qvoT5GU;n>Q5ajILVnGXVJ4IBv`)?N36qVR!qtbq5xV%z0{IU=-o8cB7@CXsR zSyn7MP?GUoDZFY7j$MmQTK?1ssVJhv_ski0H-dTTEcaSFtZ6qZxPXuwk$P3NzrG?z z%YsxST2ZJ5)D!>;d;q-Z2dl=yML>ux9{>OVq-7!vI#-1OKmbN?02O7y8LeTRIGCFN zQ2@>UGJwHLlgYBO_n9S9r4!yJJQ=ZT7~1nc)sZu|P!OnhIr*X$KinV8M_EQEL$nD* z=(lamw>ce?)5GXC{A?)hTZe|n9;OXc_*zmJMDCOTTA65}Q(5cB;pB<*O@?2PDHSLy&m1I2{+64jA`FfCkL_naVsn0y^xg z&Oo|ZmHmsI|JjU`by*k0Hj}4@8+NE~eNlhIRCCi?65fkDkjS+2=@bzt^U-5A52Dv* z(o$^S~8mY6r5op3$r5fGr#B4^L`6h-G^V%N$eH zZ2OU;9d;=eIG7mv4%1p}G&0kA$sT=EYv=+;H&~+m(Wp;T3gp&chsxNE#I^fotpviv z{&rBBctQ}(a=^mXrPb#@Fyt#pdKF`2O3nwKkH%2i)A16wjEzQFe6Th$1s?l4(vIq3 z5|ABP6%P@?Z znYmdo20!-ff|Pv5FLU-GsrgadG*yh za&jvZ{7*}+Ru)fqQ$ElJ%NOn#FgpO=(?XY|`)R%N1g00&qv9Nh)d3-eZ z**Lh9@Rr|$mB-Hu7giWM1nk41pA$<*PSXUE7s=IG5?H99;9Ycc0ATa2Zp&K}2fSfD zHc!%PH7l30x1ny!wHOnx1YeNrbX{*JF2J!k7;r=YuNCH*vHw?_yH9xr+1}<3&JG zs|$d5N@z8ld~>k~D6>>*AY}g-{vvgxd^tAMql=@P&^M&mHF)RL1S~6XWeC7!@K9Bv zd&>Pk_F9jV14IY#qk*5evhP6wOI5nL8+vVF#VJjE4LA~CQ#cj(({Tz7=dLVb^3upC z{P_}ayW_@l(;3tUOz&RSgMhGRe<8p+6a7F3eW1*FVUc5_^n`xEezY5Gmn%)UzDQo_ zw_Au|D!+Hjw5JyV3n(`Tz+1XQ%ms>^yfYrh@|0ecgEA(+Is5pDhG}(28=o}W_lvV5 zIl>tAutqPi%s0k?rVc|s%p+N#zI$z8%+T*J<4@}FpB%JP??s#2c`b{cYFpK`2D}%J z2K|sahtUfZ6gqq)(YaTY)3OqA)(nh^A6&Ak<_?T-n?lCcqEOU>O;^t5;&$10gLaW0 z|HJ+X4%1?m5ud_4V%oA7v!F0t0CI+2H@gUU zn$)^4g%F@9_yOx{vl9OIFU*Zzqp1V7JRG=dq z+su`i0RyAFi;waua)~v+yxIKX<)2oy&1NC6j28)Oi-QeX2kCyN z#)akO_+Y>7L<8ZRCBpW*bIWfF~eQL{ks_?uaitXX4HI#7# zyjDYDo>}YIdxl(8(-b2Cb4+bcI}4>yH${by6YbNmK{qUMvfnrR&et=8hE<2atj&zq ztacb94Vk0@`T?}Xw@6brX)Z$&Vw@y$eiSEgjmwkuA@*e^Lg)Kg5BV`O=}@FAOz-xA z0D8ZPgwv*9KBq@#LeD@192j^-g|Op~WcsV9sQVg7Ju$c4$tZn~EV7_NG&`hJ!uDb3!Kmc~?SHuRpK zwSb$!HDk0?90?D3;g@K!P2P1JeT<*M+nkK}W2n|Hvi@0Y>Qcz9;F1%X9vxTaW+||L zVzYhGHcHvd%g(l4CR0c9(kvw4B8S8Hr|!b_NW+i{Z`wEcn5EUT_d&}lD6xkb)lO`z z4vZ5iY#FvaV?))zD@^L&?(S z`AQUU-9(R`lWPuz7Vlayo(t3VJ!`Wj3Q?7wI*`9`E2xuJ8xR4*Es1LEAYtY6mA0V< z>Ic2^Y7$jNx|go?0sP1FY5C#ikSa=>W2owy`R!!f=|@|4z^b&AQdHm8l&V23%Zavl z4VsGbamsL=o&u*&|J<`oLpSCQ1Jc5VA;)e$!s4gQui(>oPvUKif9Batgw$i7x5y0; z$+k(m(H3bJY3b@F=+gqb#4ix$ zt~RkNkn!T&2#J$(!A4z6_DMWoqv83MPgYKW&;PQ!(!&*KcKU@P}#;}=OJrQ(K%J$fd z$wa<2(N7SGR8{}mJvK+*=3&r5^SJn9ej_D!dn6(eLK)B)4j@Z4o#)n5$O?BQE4Y)Ht9z1DJlgZu93 zU#E4gtj77eB^?q5=Si-g9$TV-B^z0qP_$t8qq}q013&%cFuLl$_h^qOU|zehX&LGO zQpYrTU5W9%oe*;nqycRY*#dxcN80}-8%fQi_0do05jWE^;mS-D#P8DEc*_z`zUlPo z62zW}NG{I92>JRV1lY`Ley=osGzzGi@dKmY(vyMP3F0000Y-jLHS0P`GJ z0a&==#&X~s7dGfHqF|*$8b~W*F@pMH9`%AN*??jtW5u5~cOD%i`KnVNn(9P-u&4Gi)PRY~E+=}JL9v$$lWd6df-->&>W zXk4AQjB48u1sSe;i5y!y09^SKqvyP@1hPPk@{?F=JQ?0DI*QQoDDk$8&ls#(6(gEL z%S3Qk@d8OYV!*O^)r^w|%ObYOOO3F13S$i4t0-pqU3IAD`?MKC+PPdP9d_b;!EbZ>jGRot6h@)M3|p!<=rp4g29zJlAS;4z!-Fun+tW8Uz9(NTa@I>qz( zI26hJo^jMH?}v}@dwxl_Sr>eI+9Bs=L>*zInrV8%Sk`_8^M;N(O&{|AJl1rDNynC; z5`VE!Lv$?*ED>vJ*P4wCMmZ~-Pg+_Ws}KLqG>P7++8;U2HWy!jOg+&tz2cO4&F5QIeZ zD1dbad5eU539~%YwJaV1;!x$&WUw`Nn4~sA`w~je{X=834I6>|Bf`cj06tAbBBQ|< zZ&i>{FURuZ0Ay{AFOBXgMqJwFGMR^<%`u^kCDADFb^5baT!Z?xQq?p)6Pqk%RpsaoT`=^y>LI4#uJ4j7Z43~kigY-el zh70bd31<8v8%vbXghG?SfR79@WtGfCb^b-8cSQV0A2ob+eorfiwVx(i*HIfFc(+Yl zu}Z#%bZfhg+p`O&0KpES|KphtM=-yBIiE3o_6d{NL3eo>nn7y|wy2$pLW_@q#?-0| z=WPBP-3=eWfT~;MfP)u-_Ty4>k{X<8v2Pj;6O5NLyw1XBgLeOr8geEX7VT}hz(+Lw zNaW6>K32mQFlo)c*u;_=!i;f=yj&m_3GAQ84Ja;$FM3U|vGq>EwjD%)YsIsCA^8}m zv6!_3?js8UT7K`Gzh$3yEP`m7877b@SAs+UXL~`d`B?ua$yQ*vPbHM_q>yiPJg0f| zcC8?te-C2vtGj!HgHZPD@HT=+Fr<)XW9n84+^enQPAO?Bo1P6ME)j02A7}J@!;I38&z|AaV@ZJ>UIptbQr_V3! zIb3`dG9;_0`4%nlc)|htg42!HgzqsC;dFINlS6TVEPmhVFcOIoSVCb^*x&B~iSKi7 zp?X=`U^go724z+7LF`6QXt4}CyQPNQHAB9%qzU*m8Sx4&7Y_@iw-5oir9Vr9r?3srGM(#XWYG1i{Lnn4r9mGD>u_Ap{X| z3Dcr;iAScOUGJ}PXa)D2YAoq$gW^3T0BI^Tq8ueleTJTu@u;KnO+FC;;1OAkI#x>n zrHggH$q^(+Q2|?ypeCg$_sx+r=t1zZbZYv-TUVF>03M&m)1ezgR==3AGpuEIt4&uz z=crmrHUwX(gk(uEwGS1j^xVOMo&(@0^b+?U((JYa+}Cw-?soU~m9wM%luL1$;t4Yfr5w8pBy5 z=^)1#0QoE(I=}(oAD0b)`+z;#R{=lq8*))0O5Yl{#%Vwo7|9;~94$u;p*1H=8o^7D zuzb%tu`X!0IgVfe1A_@2m%j)JfB*+L3EzcMLuTc83w!wK{z3r&*Ckvk+KfGIL|?P- z9ZU}1g;}wsOb(fHK{MD6Bd0pcumY9hlTcj%{nNACwSp7_!qm8W5=zfy#&8WJODQST zYT7*M4{+0!BQW#P+Bzex)P$EQJgUuK17hdQTU}AlIYC|2k*kMtD1Z^L*9;q-Efe*~ zWej}3=sZH@zmFjcqTw6pBEa}!oQ;-HJ|VAYu3N$E&vu)Kpl_!DKGI?$0GXf(JOHv& z4`~MbA%4pCs?&=AAZd2yP7HV$F|rMim`JxP-*?K%0RVs=Pk@KqTeFdO&xxgR=dK=R zh_w!F-HPOalt5M0@2`9cFem;aNNXIl67Ln2Dwj`k%d#hfSX&Hjg(NDy{2QqlmYZlc zwmOy}SU%KQr2$Si13mHt4FJ&BQGg_mTydCs*An_FobDuQf})Vm^3W7%NQBea00bq3 zsTMtYCy|iGu?<)hN^gd&s}Q9ovVMqvtT78o)Sm^-}pdcd|^21#6 z;gFGdY7a=4abwb^-miEK+N)k~AZ!ISfqVWzAJBACgC6f_mQLr{`jcF+(^V@CXsL@t zeOr%PF8-paT1(}qxz3<_P|PblS<7Sl^R<);AnDzUHp;jQO36gFWoruBJc z@G_=-zJ)xAy@aaM%cW!(o-GdE+Q5n%JA5#h2_=%2MNAxUPuMzwAP0`K*Om8yH18V$t|ssb zYg8wpp=lRcza~ZQHhOR&3iz#jMy)rk>W*{dV{K-!*H^)y&3PZY#OMVa@208~W;~&G{MB>qd-Bd< zh<>zo`howJ-a1FrTf!S>*$otM4=N z!}pSHKzGk)<@Mz)_wDK?js8>f^SBQF-uL0N%J=;1`OE%`cq#Ps>!#=3 zx8oV?Gx3wS2K@NzN9k4U*Y$QAu{Wh8^Pw z1~CE=3?OMG*sDUj%~aeR=6Q;wLs&34WkUB*{8Zx7=1BwD7%7ZF+lc0zWj}YKh5z46 zmfT-p@xp>}p$nAk0ja;Vsn-mHGc;BiKcK$a77H@YuGlhEU{cAGP=B4 z#++$Ia05C``fWub$k3=UeIuI+hi^Kb5#N3)doPS2R85YG3#PaU~WZ^ojt>| z>Rk}`GvBj!I=L%`&JC2_L|nk^V`puAXHel4CPM`=brZYC1ntPd77Y4wf|>t6R1(uW z>aekOqJxd}SUVfp!DiDJ45FO4;6z%g?)rGjvkew&FEFGp)CN#(CrB zL1mPpyqFdCof&%Wbsugx}}n;>&>R>RbwesyR-y{ZSE&xhZc!R$E0Fuzny1T41gO7QTX>k=snjd^f`E*b|0Rj)Cq zT0-CbAIa$}7Q4ES;248B>RLC9ccO)Cq{%oyFxc2T2YGsi7{Oo%1(?Lvhp}D>2KdMi z-g6UgePqX8{&yjjkvb@_IiydS_ud|?`1RcVecKs43zhSWtz5(gsux1Op^nc#v|al_jKOtXvzQ_+LUF z%h^L#mvw?Ai|d(+7M26eY&VqUGI!RG;J+lAV2kr&#J6n7uk`SYp^w%ZBJlRg>n?t@ zYxo=2fJd|4Zc@g-HU}7iFb1&yLr8zQiI?OuQ zzRCmTR^%DC>0X44gKMzgyT9BZjq%6OV@*85j5FNekk5ipCB~_f7}%vLOJ~Zm_=*ww zHXAT^ey#+qYDM|{bjBzYYioBcC7d=z^q2giaLY0B$@zPxB@5b?F{&Lusr@E?^hiPqMgb8JZ?*5S$EX<}bskI(3KOsBagSQquC zzpkXHc3i+E)rK^r0%ThGV^l!XJEhCekpvmOZd{4iKtDZbGHt7CwugdA*UIY2Og z;b}(?cNDW(oG&w~w{}4+^i5iV}U=eW7lKwJXxk`rm{~J>2Mr{PEsQ8SWWkulBguKqf6|b?v7L zalQW6;Ggv`-{ST(E%g|#rUYOzXtmGBZ!iW5et*yJly$WW*U-7HdVHUxMYD2$WcbGq zK?D9v2;3jlJ$}dV@aB6qW^@=28a%!Qa@ja_5^%{gmflCk_-@m~rQPE8=`imL5><~oZl#8nKxQ(RiJQ=nfwK!Jz@;C-A7<=rS{TtuEaEDGxY z96k|U0HGJQUVQALqcn1|1I$VRIAzsBJ|@RYE{EGP%U9CIwDVW$c|GI4P5l=X!Bqp< zQ0H&x1EWKo=6dNScoW8m5l9%u2pc{-@V!4BeI?xy8X;HMQ*$Wlr7FY~LIY=KB|*iML=!dA zE{HiOX);^6lOjE)kPjlCt+aJTMva@q?!cmsN(oiNK==OKEOi<)V8R$+(pX}w<4Z*} zc2qN^MhmbL#+5=Jzp#U39Tkys9gJk^IkZ}!w2hHmGsP{S^GXy5%>psEN&vLRo557A z!zr(PKTC`Me}lB39-DP_5Xj8Q`RCi*<-npG{O^ILUrN&mc*5vtWc-?e4_9g513UWiE5d>x)(bK#k4t+g+JF4I zP`EJpU~M@ca#Gtt3SyZ+PC=S5wxt8D5g_EWj-TdlE zq)UY|YF){>@^1BE7<@)*JjGAHzGGJTJ&BRut=?{96^;WQ<^bxL16hNts)JXsVbW&7ncKNc(y)Y5r>K$~O zfi%CK#E$ys20k%Bff5kS)g>PW=chi%-*O2WWyBg@EQAVo8AcVvfIPeYHU(F0D6T06>|Nf@*VSDjiaYB=cY`FXG4q}+;nx;S!&`mt270<5%;a=8 zTVb&In3hlupJ4H04CZ6=j(|iMWy#{}cRe zW8^pz{SW~CqZikHj{A)_7ufyUfBTTydY6#LFqNw&3Zac8A8gdsjJ~UR`941aJ4!ur zFB%h=OR}%@S^L~~NTwOP`5_702IjV$rNi8?%QK3=pM(I=OwGzWb0}C|xxpnOrS3FicV!Md$d_GB_Vv`+~M=j1$d8KNjq zqzD0J#j<5o&Cdo+pOf#y>A8{#mI29(b_aTYf0!Q+n8Pzaej$gQ^#{ZU>U{V?B=dXj09SnUfD)AYk=>%u)*7~|kJqGtyz^bUS8JYm zvrW>1{!}CLtLWT2e^f|`|~NuJZ&*w}z=isHpQy9p?V z<5dP`VE3>$hm@NA*7ZYnen|k`NM%8uHh^IO#HHJOpvk=ZphV&maLItMvFO*JE(Y>| z0Ules3U2@D&9?RQMt1D7$@d(MkmyWvd}FHGC|e1Q3Z4R@C?tk0EB9u@PMgVl=1WF`MBvV=Yb;6fRYn_XuAjyYymjs8t;i%j)E+M1say2mTR3AEF@gxa6*#i4 zjB#L@SxXk%6Hc{b*dz3+3)eyi3IS+cJ$9l+Sj*!$2KhU~HVakiAbT!$g1+Xzc2oXD znEG2Z&ts|ex{9!n{8LXOS6Ed;Z^?!|{VuQVqu{fPrRbM=#Bqy{@IbPSQG;`v~5H$-E0vWIna>`N1ZM#H56%$t`X9edJy_Jz%b z`gpZ`9-%`wqyej|HuQ!-9=DevQZxolQKXIZ69Z{o5_i@<1gl<*lY8!r*^%-(5+F7s-h#OEwh*1=_( zHlQdoo9n9}JH#;5ATvkhR|H0?`}!*(sH%wjr(BA-k{_<}EZC(7w70&vS4$W4!WJ+D z`qigFJtuFrKD8fN#TWCS5Y*2`<^oHF%FQz}hq${6k&(ffkq&9n&m`|4n;H!Tb|RRK zjBeL^O3%erAIN3Q!x%eT@Sx@3;Bqk*^2)0sxhSU@%ow8cQ*G1PcG$hj=p!eq$2?uxAA`Biu63SE{7oT3$nNP8(UVS?^hwj zN-C%Ew1#BN1s>4uL}J7daelY!yfpUDXn8m|)Ip~RC#Prd`)_5-Za3S=u0xJ3TI0n@ zbfPbLh?yfw5g|j5e)vVW2FC?sqVbB#*URLpP_)&DyE*duESiXv{%|q1**J^S9dYrq z5&noGoNAD(hGQ`!qpo{(Q--sYpqqi}MiroXG+v`Y4kBgYCE(~MVwBvPUt6B7(+xjn zN+jn_*s0FIfk+axe}5FXDxSC4Da3*P!Pq@f(y`S+sxd~;XIQnGt;Q1vR%U+)gxunF zb8XO$O1iZdA<+=`5ep&NA!!bd6WF1~Q99iweh!dZDG_R3cHn#tE-@&lUqIKP1Rmc6 zKROCkhT;eEFh?7Bq`!THgnP0u*hYHF8fjVwf69#U)zs%U6+26woixekT-xl;?6cI4 zf@+9#aBPH8Gy-}7ByZQ=_5o3H=Y;Zdl#3@Bqw-6u5)n;v#0iGlF7CG=O+PU|EC38f z5M>sF18A))(~6rnkI=W3&W83Q#)Ei9PksQ-mj}qz06#03at8jvn@R%=%{-&I0Ivqt z-I~LMmFiDwX=Tnb0eC15bB`fSoR$*dF~aGAxyJ1X zIF_l3u8Z=H>&8b?rcba;3Bh_Ax!(>8Ae=r$nEqbHm$UYmgaYWKL_0xhzXp1rbV7#! zB~R;vX)B?_BLUPWL}JR)ypgRsT!oLQAhPS1Ovo2=GA@d$;4MmMKYiD7_v!T+?S6F` zuN#fr0=a||<(KH^+Z|+Rt~hBUA_Ssai#jfX50)mrtC2o~W07Z$tfY+*cXTVj!XlKp zghKo75~n^xnF~h5=(S1CtOVmsXLuVz+mk2>^X35YAkkR#JbvqqPl76eppF0pl7@>% zV3Gk{f1k0vXS{%kewSL{lNugV;p$>q50`5s(Ohiy62ee;E2lh5(_1U@#5|N*xqoSl z`4xy|CLBs~3+uWHT1Dd~wRJ(FciuCrsI?P@Ia!bSm?)l!)L#p1wAijSCv)@Vwh=~u zef#VykkkORbT5Y~5SbMnQw>l-sWsB4P4*Y6O`BM>i;Cx0DY1jp7#)Hz`V@|$I^W%1 z!#pi>KVirBk|L1*6kK`ICuC{oUo`=+VeDXH|=MCa`?iuC$pou zf4k=h?rpYzp`Uj%Bo6uX0x}k-#0djqcFyuFgf?Qs?QBDh%BW5esmoF#2{!sv z@Ulg)ZcQ^$)0ly=HF4ZBTs9VM7Om0R;+UVK_ro^XF!!`6RZZABsv(%RxcxhTMQ&A& zr%$!eOTV9~3M|?YDCAOpdu6%<^6(u*ayS>!BQE?BQC}EXQ;=n*97zP+PTU}z-omn9 z=DuqAVADc3^6r*K!Az&n`HQaI_aKow*au8%_{3??#KC0M4!9Tk&6zQ_Hs&TtE^%#g zZ}`p6>m0RSAyXfUFoZNvcwZ#q()h7+x4(8kL=bG3qJ!jSqpr~ z(cCNBx9_r95uSo?aBzF7VxAlH38%A`I5RPoN;Ao)e$CdRlW-=&*1jDXRk&d+cNS3;Uz- zJgi>z0CqNWRfe!2zGHCBR)r}XFocr<8Q^BYG00Vk^&m;vOrZul6fiqlxgL<0KA~Dx z&CDTf1_54MIOd0+(?%N1-MpHzs6OOPX_=vlS4qw zADZfw-NlKfR@B<(%x1(MNRt^o&>pbfXR>* z_*x*#!9iQ8q9?QCcIRu8dX-8jx6Vfwt5w5>=@%s9Ksl`(aKIFGqNvF*A>CLZl&x_J zMrw}}O>tYP^qe25D5QUJ-yL`)^+t&1Eu~2`M!L#!_ z9Ac53_A)5!6exl;sl(_{b?3<>M=MY?r{3b|BxWmY=`sh+M*YPGHTZ&LRXnge<|L>y z617qB(I#Jq7=V)piC(B;#Si%~Z&df04PqY*{~&&PLes+gh!Wtptv+FaG5Lxz7~s8+ zv|sqOPw+sQC6j{HHuI&6ha3K*{16+}*oHKZReJw@%~q0aMU zWMPC3>b;3WIyBFUH5#Geek9qo@tfX%WH&adC$e$R$@&KNNJU(RQLH^>!Z0knci>tB zn{eCus|4Lg6j?P{_&fZ_n%8S6u>gl36){x#zQtqk=GjlvDN?=1D%ay5EV2|^n1^ud%1Bc;XgpJL{b%L(++2xeSx*X6t3PE z4JQL-Y|g1N#rUnxELH7x9EOW`ioE|x{X@T5*jtuB#k(AQqL2pxaqX?uimd9m+YHRA z;&pBZz>9ml*&)l+SkI1~u29Kn6`}OL*X8AqSH2JBg-zkd8PSd>!m%~%?+10tea|ai z)DI#Gnuf*e-dG|Eq+A3g2bTryr~fq?lc|@_;?VN8)Hdx{m3L3ixL9x;bcubf0I}*9 zJv@_Y5bDw2M0L;uT@n6jDPEJTZQB0}mlb=bQ!QdeQDLS-)+x-b`m02OY3#XllhCrP zsblKlNnBR!S4CKYsSNTIKFM6zZvm4HIKL#NI(8^1d%z{0B&mf0Iq@!yjC5p;EVyWM zr++YjtJd`;NQY3EN(Tn`@Ldrb*;|8(7f;_6FKPX_R3%PQ%CXyrZ9{dH?Xj9H0lb3> zrrPuco(cQKdr%-W^7|ye61dh5{Eh!2KOa}_Cz=E;hLY6YZ~C*n>`x^n)JrlWoJycr zbAqF{s2z_i0KHCUMDd%<3N?B!1s|PzRJ3^p2}v!{adkP{)2-W+@IVrUXpPP{)KK+# z>)SP;>I!=uDT-hBcgW&slMwKRV!Ye+BtEYgxab2j=0Gd&sUV(!xjvly1jx_=5V0n| z!Y<+i>wmHs+ifIbG=iy(@);Z+MZq!3hSZkspUZ#>jycF+c-J8@KdjVsCAYvq%H(A7 zjqf>2M0dmzq`o&EVH*)bR2QOPUHkfD=;DFwU8xZTnIbQ281n^ zJK&w=pp^*xCqG~c({tPu4OIN#vJ2oDXm_D}T?xZ}X|z*Bf#eZLZHCHNGG+C}o+ zLFc*zf}qkmvOy#4kJ0Uk8S{n3Hj^lbRw)z6mhI!{0eT>#A`<+$c7zc9zN@n5xd;JPRD{ zc6o9MfW9XTNY@;fi~>~xqDJ711CP6CS#Zq!X8Hco?Lenh9kh?`p1i7lGDol=migx~ zy#?P$WgThssOho%s&U+=QGG*+KxYCyiccP&XzY@#u*LwL$%4^{PMbM@V0 zLHK7E2dKkrK)!8WC%f<>PKc+sA^d%u8_Q3SK%k%9@(E{`q*;%|`q(o5^z%|XM#r`F zvK68aF{khJa+x!{Hc|Cy#CBTD%HSiGou(?Jfc8Rd!7FmFG0>?2t9$E`thy|LfH3DUY`J|O4GU*m&5Qdm9*8E8J1<=1}Rn&_*5;>)&CSQQ~4 z2wUv??0&Vy=uq?dx1MF|mUK(M*5>xnmv3X%x-cA&!kJj|`YQ)Pu58L44g|@-_8j` zq~X-_l89atYyhY-+&U!aEX#{=Lq>&IwMtJFCs_<`989CH()d$x`K^VRKE<4ofC$kZ zyZI@17SUTgUq=;O4Hw4g%=Ymc4c#B=8_`Kqe^Kzp)A!XPsXVMUX|SstFGSG_4L`7O zGRCX9bw~ot3)azx0m=i+=yKy$tv^c;7M&(rj%7@x3M-c%QQP_*9_VXG zSeZy<$J&xlsp;t1*%{XwBkNG{gwuX#D?!~yOnwio;rRY+apJby5^>;+k? zkdGDC+F+%K!O&vp=o_B;y67S5OyZn5TLnXFiPF|DsgJk-mn<5vk3~mL-23|5pCH*A z2ECe;fXzXQ+t(Du{#!7kdH|Hiqrp3oS)cv;STGA6zhCqB$Bp5SN+ON^Q?G&r%-wK{ zhZD9DW=S52K1GG8+TGU3T1>3e4g6lX-=cq}&9>_BCBQl=1Xx z%b>eESGc$7uIY*88NdM>O!WkThnxmdllT3oe7CXZ8O+6!iWGPq)U|wV@O{PH1;!~%m8cV%Fxq)>>%w77U@GM| zmNS?`V@v>u%Ih>$_!(T#6ZAucW}u{BF@rpiIx-PV+^le~nzqbL>D^9Tpc>wOv=+PP zM@CC&OXd@LC~)EoC(to1C<(_2Q80K8`l^sm#wkc7pdLrC_BFjI!TYO!uEXg|s$q>bGy)q;=N-T^U5}wo1T%K_O^SR{D774 z34+#Fd@zGrA)i(YZdaw2_qx9Fi#5AC^|d2-Je@#Y;S+IuCZ>F8F-ay9pgASW3W7Sw z@iB96D7IPShfzIwYElBfxr<%E>XML(R5Tw~xjTA_!6a8E$PR~Po)#$1IP836KwxF^ z3o3Smb>XMrVYmcnf2R-C7%enk#D*8$bMD$fxv35UQxN9f|6pSJ_t+^?%`a6$$mHmOR|wxmaIx;5&zXC~pK;}M}q zdM(uPgrTR!4TBPw{{x8q`JP%~kZ=>#4Gr3Eid9=J5({~vEiF6(q%+yvFb1+@xj%Py z2&C)i$w^aBWzc=?kjWb=o1rR#pmA@4pc(}7yLUK@=AD(2@kW9nP*0wRL2m5;Ll zIXFXiLAN6~MsLK$41RrhB=o9YC?-xD&)PhNMeR>e!7q%?2`!ZpOcWb6zU>eFyDo6VPc#XVf zvVN@_R12-k{V>l173nqNZs?pr%8d;F0=`(}m3&_P6KwwB;92nvAwjhVqO05+0`z?h z9E1CuPhCQG%opI;R)Wdgd8}5%Jr8Ey*~P!HKINtRuH{+{k^=(JW_?`h7IO{cd)t9! zP88ZQJ5dc#n05a}K^dWZ5^y%G8llsj$it~;kr6BD7|a>Opk-mMii?@((3)uk89ApE zJaM>HJSeO6y*2ucn|+%oEqQbLIh#hMR>3O?b?GVM9!fGLr}mB%ayzopYr%sO zKm)V6Gpi(IJ0kU&&5 zB`2&^gK8!0exQ-~51+J@D@EM+G!HIoRY(Cfp1&O8<79r;)r}xQO9`*%XWLsQ+iSj{ zKq+-T+V%yzpVJfkM2Ck=RDYDyQcxoRN~&iyyc%N6WN7dbDlZ;;h&B#eCMo1erG9Ss zMi>qI_~#t^pPnc1TF(P*MCdJRs*=g3iABs?O&x}g&d%$lsnJBa+I9~?Ek=}!41feW zA7~Bnt9cvC%jGTveq>B~+UC4B(+fqInEUWDYA`j5*sj%M1JE&Z*dn!X1mK_z?a|Ua zBH`i2*)e4_S()Lg1Qs(*7pdtTlOXX}ZbhLZ{eNvZc}z*f(A9vqCC3;KR?TZ6kK2P> z`aC6$=h0O=5@-T11#A?pUrB@z4qF_Tfav;0SVQepXz;~~Wy1X!{Yw27JnY?$H{aP; z5tjm&%ZSuwH8VY=#@8C3dhbPFK3izrWmhq3g`?c#y|rAprTgws2Jk_y{k^<$`a7W# z8`G|(EkL$E_sXZmoFrdbY8fMrk24^$I?f5k?&#yIx~JF(DT?-mXMIlg0eVf;@J$H( zo_e2yAFN8ohB>T5p9N-MJxgc=y%S4e;ES*4iOInC{>7Xb*dpG+whU<0dnQ!(J%AN z9i-Z^lahlZOCJbyiPo%-K)IoSELcVJ9+cE-;O|zIkO6qa-f#t@X-#+9$kYnW^w*e(C#mb(`9-h%eiu=IV$aU z`iHf^ReG`@o^2!m@6ijH(E+y6Z7Ta_g(}t|GlchR6;_W4LO8$|{2zsCB~ojfLb(k_z#D^w}|TgKR(2AjwRW0-^D~ z+C@!PW>IC}+wuajg1!Ag%Ji!JE3o^UXHEsp93o}*a=HXSvMr-X&7mZTk-gP zzi#A0J*#5vDJC%L4(+3OSpuyFV9mF(A zyT;`nTzbqW;D0V;dq$n(GQlanMidV}V=gBfG^f+Y3ZR;adNNATA|kTr&F2ydds&w- zJ)ab1LRmG6Y>_&F2kEr>0dOwzwA?;vWKzatmzg?bYf3X6AMmpHsYMK9^Eecsp4N9J zv7529L(P08DGrPcF3&!uE>u8|hUIkV&5;i}UcRElZDz6ro9H5VaR!#oIb(99k|6~~ zDnx!>B0!qUM$k(E&&umz-xX8d+1l-T4%W*Lywd7V(aBv^rYouO`J+Bw9skwd_YXku zPcR|iE!Z9Sf`eP@NB!NrH);==PG`aR}6?nJM`^0Psth?tlLolzL_vB9%aqor@wO+ zfA$b6@oy>`x4JrlLP-YJ5Pg_efLb=uJdlH>bXb}>H=^T+|)YB6R>(9DT)~E^xmo#&4Nz>DrY`nsD^6Zjq#yG zv!5^=N^fivomzeZQmg3un_d)Kfe)h8@3WGbH6xQKP8c#D$KuTMGw=`5d)Gkh1oL?M z$O@bDoldOn^}|>=6pCDgx3l(qWHd6c?YYvUh}_VQur4i#20D+KbrbjD9y!86Lmi%Eg{?Dg2EL)xwlcn02h^aNiH z?1OtAaB0!jM?r<*dj{wOH?HAuIsrBEH(TWYr*E8kVqE>>I!LAO^2X9foj%;$43++S z8s2U{?OwE{2cR9tx%aYV>u2v1Cx^|ru%}pod8P}bE140pdv1JU-M5UO9@W8~vGllP z@-*Vx$3EWuL4sRA2)U*pIffpih3{2L;PsWvnCA>ivw)FHMH5A;xchy-2<)k0MAGh_ z`Q#VkfU@m_kRvn=>WZublqAvs=$jAUz3BaTvYF?}J>P^-GTvC~b;}55$X7TeHuWE5)y94!#q!U;sCCey) zWf*|Odg*XQyYpENIry|D(uENq{4o?K@a0DMq|zPOyFFvy6F?ofTIPJGRmCDOHNp=V z247DFnO8lA9@ACnCSgR8g#Qb+|4S){>Y`3fJ$(jih-=~S34Ci296!6l`w1cg2r$Ke zJqyP>fd_+K3aYfk;}eZ)pnjd;@n+&rkEC~AW4L=dp*YSp4uv;g`HfT8$!kCT4%F!D zc6$fzl*Rt7kGdTIYt2t;e928g1_g#X@5Rjv7=XF>X+oHIq75zby4DyW91%1Vq1})D zvHUJUXSEPcPX1qjF=)^Lm(lM_6s5*h1XS^p#-T=q7#$2<`^uKMNm$?OZwc%{@;{!4!wpasSVjqr@=o}~C1t*`L4?2~?hNB(s*O%REVp*pKgEs4h_w1PE$#ff4ir z14Ctq626bjjiFdUXfEL0XT(RMBzZLu(^+=zo-#B1Pm} z0~&#Lkr^EU2jnHK(@b}#o3?je_AAxQEg>QL?GXB1G9d>EAW$FB?!L{}@MB8jEWlq& ze>ij+3S!&ODoQix$t5H?=Pz4KAYkrn)p<3yHp{%!Fz zsVBJb8`W!K7ps$5?XERk1rhzHQ2a2G25I?{nWNB~FCyM(y-jt*2`MIK02`ZF6<_kt z%3NLL9TmLTZio&SZGreSTL9eHs%BmTEM=I{qFh*w5!iCmOS;^fMqA~}kvma1>P?AR zke%$l9})%tP-H{*%O=%kRnzPYnF|I*^#N|!2}nkw`WOG62>fO+TT0xyP9Ho2Zu9I) zoOUd8;zY#K=mfzzZxY)p?6(=UaE4`j6C*tAin zONNQHp0P9?QU;xe{iFcvRdymM&wyA1JjAR70}QHxiNdiNh%dh-fp>lzv;H5FJoM1P zUQqM&E6gG6920(eH?84HJ8LT}5!;MJA9VA)(g{`B!8-sU(BVa3UwNqaxBF1vLCW$7 z;SdZRQ6l+n;P_yAPbX$6XI3oy;Aozi<&_PJXk#1JdU8|B6rpn>Cl)nP#BU;=+~5sT ze|XA4+9`}LQDl1hHL$zpnc&MvqW;{OQQ9V4pOO-k53vF^bXv%j-j`8y3(FlwEgELH zy!dY%&tGeuO|<3~T}9r!k@p$HP$q~t*@Z?ri+@cxIxo^HG);CO8DG>DnS(n^U8{^f zA_KJHz^V%pFA?I9Yw%FMx5yXQpId2+`bU6r1t0@&>|Ug!d>Osl2%flWHj+n-pN_k^ z85Paboue1c_wx(kqJB(P0g1R9J|IUWCTp>>JG2Z1WHmrF?|B9g;tAE6 zv5t@l(Vx^z=}uGU>fW-1%iTEu`yiZ&HZU90@;)cg9}p3cFvbH?)WnqkGwJ@HAevR- z$wcaW(ndPNa~;GFmG1;aP$Qw==iMT=Zj7D5l7K}li$4S7*h6~QdS!yT zA=E(pO|_hRe+EyWASsVfv?E`W4IHDsQ&;76af|0sZ#L25S7C;HrO?r)c9J)Qm zOv0x6oGm8=6w*n~B?$ zh6pU97%uB0vH|xg)|P0uWLdgq7d0l+jjlm;NZ2MpOq0G0NdoyJDdY3VNjOj94{C7b zfRR+YpM6!io!=Is-n0GICQe{xc@;jzL^fP$M(YA}wuSZS79JybSHP%8pZ2dV<1M`y z4W(@KY-qyy=-O`CKspx9H%uUg_1mk(SyqZ2RIBu&`7`?Wsgcz?>wwHx25MHY5U{Yb z=Gb<&&)P4}!xz{6Oo&VvaQ7OCrXN4%ZCju2Fz25pzLKe!Q0c&1q zj^w6-zry6A7hzNwf9vBcdmd`Ql%AGmsvE$RGc@G9(TBP?1z4d0j?sebMkwAdYw7ak zp#O2%YnfPw%mQXb=VmEn^~}NA-ZvHatr_!0BROfrwL^92Clao3PW22?$QVg3{G)pU zedJa-R~1S@LHPc8c%SP}fRakxTWb$KOY#X>(lsmlL68{v?g-+|X%J+eo4eJyRZkpM zSwFV)fX4E1QLzTwbt)UsYkSLSgT}UV;AmoP--boV2)(2QLMi|TP!H*0S3lTw z4b!+ldRa-kzT_KPHA-MQYPJ?^R#v3- z3CMsqsWIs(1qk!i3Rr0|F@6l_*nns-M&$qJ8{IqL-b~xWa%K#?wl7C<3pf`})|0I6 zIbKsO#Ah@&DuZX=Xo?u|v#(Iecu9`lhhodOvTjh9v+Kg4b60^=_^FWA9|^x^Agrvz z`~p(CbPElKRqK_-l-KJzbN3fPtH*TH*J`STUv=OqR zwGpHtdJ6_Ycq0P;=`&1qtY(Is)>`av>yV(PBh%^Tb<}A-=Zu2pxMgCO;KVhbA}U01 z&Big9w&)yxHW1yYQ-SrX!l#eg_Uoa)ok&6EOPM+Gezuaw&CV4iz)lG{01Ux_J&bk^ zdfeQx^5}xbr%7)RfM~bXr9GZ zP~X$CEaHG^u}-njgn5u67n13E`?D#3Rk3D3FhvomY!S4269iY`G;vu!~k1LzJ;1jwbmtdF~!mY1igN}$GA{RnNHiA z5ip;ZKx-U5h6$N36fh%Kv4D@1oEpg|NDq*8bG#yH!VX?NB~6YC{KT-_i4(IFdvh8> zEDvBKf&S%(0$zpiu_suZQ`UcO&Xl1#Rj5OUe^?`D zPi8v=r@TXvfQx9zPADMr)!~~BNgyw4j9F_nr#CDMb%z7ht0=e@%%p4l#MAuRsqFJf zYX$kD3XJ}ScgiihLov91)c!Qe2~1SKECbgV7@xWm`rbHo43Q<=CV?&Sv$v@#Yt`dW zL&ti|s&E{WwqCbZ1rJt0hs7Yp8};n+J)BWjj+WcSPS0bULij|D*w2c^q$s#l2p&>-b@0XX`1dx zei9|!CDpRBZ84ID+>o>~^cD9BMRK02Wdd_OIL5XX^Jlt5_u8VMv3iQt}GS%Km!Au&iQgK^I z!fOV;0<7(6?i#=_D}b8S@M<^uCrDbdmJcnu<(bM9FGUXm!TN#fcU{VI2Cf zH-S5C3g*h5Y~kkJTU({bR){!Yk)J|E)Tt0{epQvwcH*PpXa5&_Zy8nB(sYgD?(XjH zf#49F-~@NK;1(pfySsaEcXxMp2^Jgz1Ok_nV`l_oyYHZNTT`Lj|m&ur0!@d!K=KEjk#@pIn#GEWNZED_7)Yf-GU6SC ziW-P^Oxnl?>1y4|t+QEGUu&M!s}cQ|y;aT<@K^J54eR3`*s!DdOm9!uZ43Cz%%s{Zyjm z5vt}DmN}q!H%FMPhs35L2Kk=^i>&HoYH9g-+hdWsP%9=60%zGKc5}_x;2$7B8%=TQ zK!V3$dqzlrDCG!Pcu+*GRlnR?pZn%Z;y)EQ%VEXE=qmvz;tee|9E{5yzpy-J;efWq z=!396_yXvM2SZ>MKNTKVd#5ElN;==C8&RlC*vF7S{$eSq%D6iNy>W4wXO`kP3J7CDflDnPzDwBD^-N{mv2Z}DA;>F^A6Wih1lQmUGKl0 zw>7QPB_P^LxZ`;9bpjvR7T_3EJzK?VScAE|eT`V%td-Qemisfn=nTIPHxyy`~}-TK#724It^?2vrAvsCR!1?h`Y z?Seu3*2dUbi4l5&)lL^um-v36RD55*Udt>pm2@Qd*H?~%j3Y-MQzNl>Nb+n*) zNBUtDdAg>);FA1%5toa6Z0s1b=V0OqR~Yr$F|;eIDu34CRWBCOK)wWi(PcP~fnLwf z7f&p-l-ZccBYcGvAX^!9g)+w8RXD~A0|~hk(xW=;NPWZuBYdem2kdX;AC0v)BWokl zAO;LPp?c%>s|d^QuqDo4>rAqRkh>-tj+Q{G@GWRtfMi^6!dx<_fF`qh*qLt!g>jia z3%r&p`v=MdK6Ze1!t_pEv2#5*?!M~1;NHE7D!~CsKEp8?;BxXtU1T#S&c+_i_+;OA z+A|VqpBM~?GVHecx#Ix%U%0HT@T|wb@xcs@!k{Eg%fg@Uq%vCpfQ&9lCn^Ek$Afun z(JJBQC5!H`wXm>&O8{b64gDV!g?bOxWJc4&W_Dunb_bul)tgR2wqEP2mihb69$p2g zI9Kh7lbDzIsj9Z%QH_25BqYaI9}z}r(sG1r^GS2&YALaGgR^NJp$|TZ zDliIO&Ukn=J16L8J*9B~+ad_Tfr^LJf#Vqv4u!Nk3L&vK){5A5bL@|wC2EiQ3YaQA zS=z7I1G7A@sdIP&FhfW|=Wuo_@E_PILkP_=0i>{LSvgL;S({qW0|RSRVr&(N6ss+XCrOX;y$bV=%B?e(%o++sgpb)f(QaVYDsH?dmhUoT$=~*wx#OEVQuXpBua+TZI z>+OiYhmMnk2kJAZg()Ek?w9mF$X5MD!l+eYY4VAaid#pQLzE32)JNkQOdNY?Ig%Ev zOBM8Bhwyw~Tah$>L;u+e27S!FJW8`d7(zG){e;GEidatyG*VN4li<2Ffd!5c-F0-d z5FJ&e%HA)hNPHZ#+#Azn1zY}y-Sayt|J~A`l!tzArkb?2^6L)CLxW%Gl4|>BDZ(5m zu=^3%v@~)&X8m^#){0h!Q zJtE24!X4X1Z|Q)1c!ZnpD3`F^^L3zd_@+hn?Y_K1`*s&g`OpQUpnOqwnVvqc+5^HR za#IU{pP@qJ3LscmzK(DLn6HpHk!wnYDXdeNz7c?z{Sb^`J8QU({T`u@VVK_o2i*}s z{YJ`wTMwYe!^W#LaI_){m%ae*S129wU0D0;VE6PXY^n3P;p^)Vv?b|vG*`EsnhYm= z1YPJ)bh+LeSh)I0&-ii5xd^yz1WyT@gb?7IlCTfsgdUTYHIt8Rk^Jlw-Dj1+8aS?8 zcXM>Qg2zd_+?B;8z-&bU$vIkz8Lz%c5bpX3f)uVp+x6{W>RAS@B-7RoyFFTR=0=|1c=AtMgCiko5Y6S_q2pVge)L{urU9N&;ktT2&f_i6x!_QT`Q= z5j>;>W4d@@aI?6U-|xM0tQ{9==c^?1F2Anv-zADtow~t177=1A+`Y08!^rIjSx0jV zzp7|PJF;Aj&rVsyF7xFyeHBSoZFq&W(+(iLSbSMVNt?4;gi;E`#%RfkcVc<}>X&31 zdKaJwwZCB0{o;narD>eg>*&b6!R6@)-HaYFOO)fi+ps%XG*L;=Hd8XXuO(j+H}l9{ z#2qSGMrR2^#kyKE@06SFK^U*7`QL}b-}R@S6Dnuy3mY>%O5%d*hMT0UJ*o7q%(J3R zhGDzwyjYLrHuEgH@jgo>3fYjBYt$lgLvi50jQ3AK?UiQ!85-JUYNZi}^QB^VKt00e z;1H^vTMH^a$(5Oc)WxXnMrsSH=D9H%q-IxcD}>e@a4&RPs|aPpf~7~NUp4O5T6NWX zbEXC@!qkrdLidxhrr!l%0rT$BAx-i$o+~H>?6ayehJXrt_9AW484d|WpCrYI$eMmr z*7~7@?)lJuu!H9Qaw6%(9e`Hnlbsf(EAzGfFAn^@hWo_O=6Y<_0Q{Cqp5IN~nnhr} z7q&p=uGLZdL{w&=exbC|7i#`CzFgP^@qy!{{o~-W7*Bp92nr(&Jukhok;X%9LXxxK zZ&wCBRFkF%Yhp8cCve!qP=L8hdlkK=*FhK|pc5?m4C>MK>d_unW(-*}ZOxfE zZy3s7!%fHsq>2ycoyt61s|%e*2%5}0jxk^}g2Ldhu(%3;tMvKS6BY#o?`k~-w{fKt zKf+3~27F0jH~wboAvLm2Gq@Zkcts=h{z)34CN5}}<;7IZofw8K$&G>8Av~Hsc5Bsd zqIe^f`&iwSzQ*sX5rlPc!RI}%g=?~OO~bqHvFN9P5wx22MFj_xCLM{z7iIeA!wgLG zl8e><7!UAw(pi6e{PU;9c~gpgk*o{lY>ev2ewztLZ!wW8RxmWe27@qD5{#Y+_4QkA zt}H+m6nt#h)_m`jq6Q&ETJPNIL>X^#_AaC3(T`p`&1+!;MUH*PyC2&gQ13>wdzmmB z9v3V22D-fYvSj^>4AVHwZ|VB|tEXX-Q40Fg%V>J5TCF)gB%+Elqfm&O+E-e9xmg$` zc)JY1fYsLywDT8C;7`f<^Nry#c2yw{JJjqBn4y7ql-y-qQ4(+{Zb7H-Mc{Sv+-P@z z*<@Z;2nfAz*I;RdW}u(gXu&^P#BmQ*Ku2CVeYr8%Qu$&JHIS4486g9D;iLT((_F2M z`zEGj0w(co;h3(l;u~X?wc##bao}Q}k8cAKo)j^j-G2JBdGT6$rTfPkx?kfQXKS>< z*RV4#;5DK#?FQ3cd6nLuipdy2L@nl&I)_sihI;_Igt z{@`YCsl&T9iOkw4hi?R168m z^Kgzr3nM$OqVMGFJANEum_LBFV=B&DWWkf7etEOyoJKkexQy60LI~-rwT?Py&|^AO zn%{)caSf2`${~G;vO!UO2pB=(Td@0|swAHU-DgeH(h(&RDtTNbEtO=l6^r4}5+tD5 z_(dF`GD`LvPNn90U<1Ftxq~@RD)S&cb;4E*sD@M9XMg|H1ghqb#X|+l<(xlJm?#I1 z>BZ_Rq3BP}?(NjIu0sfX^1afl7(L&lSbs}++Wqc$42tlV-E&qcBlrUdU=|TIOEbE$ z0^^BLZ{n*Ltv zUP(i*CMz@6a;@dRcS-ujFc4_4&Q66r2XO_>D1+=??+c#A(*aV&R z{IY{IB5D9XrjpmHL<2A5FVP5QSh%#X=`!k3j_UZ( zd_#)g!*%-fupBINjxUpW)UM{xrbYwNxLTOVW#xA8Ipoq! zeTPeji2WsnG_7$Hn4j53T zu-#7L0w!2xEBb%bN#<^GFKYUPx2!W^LMv*Tz%y6tteKk1Qj&c=TfV^wp4I9fpH-GH zU`oE{SM%8AVh94&bW>sXyaTT7TrqKAa=dmXIIZWR>UUb>4 z*8*DPuK_sQk9_fH5b8H9TGbkca3fezfd35gzl8oyIJy&%6Towl`YQtTBB;Qql%@-g z*7PzZT|V;Oq!&-O?Y^_z-|C8oHj&IFf?dI^@oVr;98xt2NMpeq@qw^Ov5PXS0@!^1 z^l)Cxf42YPn+WTV6f{lkaM0g*CccM*Pnn7-<&6)t8FVhh4d*Xl`MMd6zm*(%pZ2{_ zILxX|BUYq^cxnMWBQXBl@aQa7_glmU=b^$IJ$M(_4?1b-Y^kz{e;yD1&OUsLwRuIG z-0rW3HfFI_RLj`vKOC6UL>d2?uv9Pp)3h_+dNN@f4$QUBY?!2K2_0+mj4+FGl*Wl& z5)08!g;Y4TXYqq{qETdgKUfHCc>`G81$4~!^g^GCw6L2_XY1&+S9?%qnuWRTaya-{ zTCTol2mgQt?b|16sLY|p05IG}9)Unk6brbCiX0+t03YBuc@yiCxvGB2Va~>%!}`BN z(Pa&7le&@w9sKbt9~z}H28M)gh_jhu1WOwE;*Y8mBBwF|N;H-;I4?>Ap+3pkUKc05 z&@9;vHfN(DF$Rk%`ki7<-zfj(z@2zRq|%XstbOP*se3i-!%9XiVsoVPAwh>9QJ_yo zVTSlz6H@mvk|*<+)`QK6w{fS7Vbrm zKisU=*ZAtS(Q^ZE_)YUq{X~DM{R`np0l*Ok;Md+rp>=yO911=ZUl07ILU^$b;qI5p zSeqv&+D(QFVDwbmMY>e}2PyW)T7P4!em7RlE;;+=F9y)6zSgiRl98m>#jn0}2f5kR zpR-qD?zyw+DGLkqZ*|~|&-`#6t{GPngj03!g>B#Z{QVofVh};R8F*Snl~du*EH`-( zB^sd}JF5jW%>X8i=s2lrKFVPz%;gR{}xz zDHo|tKOk%b476O^BszlrpoyHWUZU|xpDl8Xqj4+I!0p6lTMZ&W<7V*7H)SZ#7v)V9%p_83I+Gx$SDx(>F92-)Fjv=MF-kgI1&@-I!VyHFU* z@<~dQK$RS2rPqKS`dE0N!~{j;!Myl;`nymmB7n&P01nwJ5mB3nQD_}MUk%0ViX$D_ z0m%!wCnD}h(N@fHNZ0oOxGDl7nB3%f0L9nI7R zu?CkYz<~G=G1gy(z9#_7d>n>7;x5XpQ&@*1NH_7C4ZrbjJM|?vvy_=Fyl~WEY2HsR z;P*}TlR3dvp<_HeIGTy=jHetXX-5*00)>At5Xv$l9e^OO{wwsTJJcTc5*R@Oar%?t zj(Uq$Fa!1W-(MNloToCAFCM!>~OtkZt*+6|6Y|n_H9C zT;H*<&q>^^X1IFiH1TyJzmgJVkIMJ^2gp7hZf`uN!7{UiffLMowMdiYEc^WXE4@{7 z5r1YG|Ju^pmF5LqjB=Ou=#QZD2I<4HY)H2~&=E?5rjW65b@;5{gOB18>z9xToK8}J zeL2}a?5)WB;2Xa!n?0~h+Gr}v&M=41r{yXN55B)IM*$kgR|oPKzw@>awT_cQx`Z>) z>x3g^sN{#u-<^?zUPIxvQ@&D~peFbsbpBHo4M%a@-tiFG@fn;G0bMfn(e#qQ`iAN~ z?be1^5#rg|ZTG;71>FGI=~z4t{CIBg|T`jMt_y|$K*IBt`8;hEkj(BzgRiweYI%m;=j8|hBF*l z^u2&H$PPtJ~$C@rF(`j-AaJ^_4Yy;hS z-ahmPSuYFzcIW=XZ~9}G3&yS^QRvG!;Wb%kQsaE4YotlC0Qr`ckyj#PAIK8=vBZ{B z>BIcXeSxPJYAC81g1|>(N4whyt&S%dSULMSOnJ3u?n4FyMB}ObP>J)eZ$`P<=HCmU^V~l?ncvwiJHa)%XE@6-{Np{# z|B{?P+zPegivRk2GWb={MM1ySS0R5H{Ga=K&T1Ugqj4~Q21DqAuNCnabE^N1v;3<( z>kmui!iWhu(E4`xb*8rbaGAUDScB6YBfo1r^-me^ubBQt9+SV6$#HKhkr5Du#sA5m ze;qwnOX@EDfOLI=^*5!wlnWBaX-T+d%iskhO&x*1WwhP-wJ(vx)>NMnXi@*TpaX4to5$pwFg> zw|3_2pI;(o)c5l>?VrAePpK(TMm~6c;DY%*$W?Ww*Z0N2-xDIwt(`xBA<8((lJjv< zQ)&GdUBiFs`mZMP)S(@W7>>AWfnk=Yy}z=i+z5kLe@gEeSpJ755a{<1^Kan5zW^S< z&B~=p@5v{n2{zS$B=sx0rG`nx6;$)6XN&ePP3F^zzXv)0^0&_pxQ(4s-3SOVx(2LI z*wGBxD9&5A5M1FtJf@C8P9A6cHr0SvtdEIpE0z;~W=8bKzo-2F?i+qHB`dRk_p`tL z@Q>hH;kc?d$$LWpvFt!OqlriNza#vj(%^rgMgD0=KHHrCp;_|$Ng5-6Ll^#W$Kb!X zg#Yl=?}A$o#4!4Qw9KDUzJIXdf9b2V4P>77mvQjF8`d)$`CfjVnF}O^Ss=8)qa$VX%8?EzpYQP!V}#l-Q9Dh`8@3s5hyiOOl7>S~y@El(Ww?6a)=zcg7% zj65y~6C!*+Am|Q&cMX^EgQ^`}{1vEsZp;*%HHGNn6$vU;menF`+NA=K)-6|~j0~H4 zoR^uERxiJi1y)3@LNt%~uu`OWA7o$zCJy5i)YAHKQ?0hvi#_6m25r(sle(aGC*S10 zy&Jkzey`Z$j!<8j#ZJ++WrNZgsNrGdF{Q+}{Mpp>QTg-O{z`-3V3;H~FF)|mbw;iR zwM}fXu0>?Yd@R}u)&BCaUL6VBDIu3R+HP&7I&T1j-IGO;V~WTZBJrrHz%e^ z4or6#5PJHGbh^~LLS_*U>(UgBCx_d0D(z@eWbEevk#p-nJpIC#ljVKoUP<2~wZX|O zg!(1O+b+8UsMVynU^}#BI`EFDhMP!ouIT@Q8jOg(MiaMk_}Z6Jl`c}E5PF|8o5aP@ zKMVk4IMkl$T>Ri3-w<-poINQ7&@G-Iq~1z7=(1sj16>=kV1n9Ct(qMg)9_UiwdD~e z8*O10+a2&v1Q_F^+}0|3oNO3(Rk3U2;UTNXOmj9}uNO;nXU)FQono23)q^FCftwq% zv3ux6QTeGeN}Kn7Su~^I&oMoNJb02g*lqe+f7P;wV>@$Xu!q-2Q{oBBW zqIx~^IF8n}(ghfGXmF8U?t^n=N7bADYLZWBIDy)~#IK*wm-qUXP)6UN?RSv#=~We@ zxZ8Bp*q(7!6R(cIzi3Fw6J4F@A56Yc!|8$#%HvXK_6Kp3kbMI?m4*4$ zoABxGGo2eFnS{)}o*!#U(`i)Hd~3Cv6W=aLWFNcVHNM;RehmJ=kusZZO0I40(sE{Q zwy8G)Pry{m;O`j;W?6+ktH42Dvxa11SZBP(5EDG#-vIr;Fskq3!Prp;FX+G_sgf@% zu<>&)w$MX&EO-!pW!kruz`Jojyp55&TtKIc3W#aBPn`%95n0ZK4ADb`X#CgE zfLZf|@X%Mei)Pi&%@R9$?H|zq)e#Fct7(3o!({a+c<4~(~<6mT92=Xi=-l|4Q6Z(SW$;COSGP}hrbe5n+s zZVr5qL;ZcQ=mW?b8&>KdMGQSQuIWBqGMQ@ZHQ%r;N}iI1-~qE0=5B6%<<&drzhIXC z`(Tpt?~2HV7s{rXX9*Nph1W>zgxkd79LEGb1I-zp|~S5$9kb^YZHa8%GtlV zVg*}QR$5ARYFSKr(rW?8koliDtAC31ztBoC{x~D|1yupv;5j<^{nI(h6ny-d1&5uA zn*zEfzOa#(|AkG_lpu}#zr$Wj=Z18ge^~E-o-Dxcki?L|C5>ioxuQ=13WzB$?MGf7l0nL1N`<65bxFR&AJdaDq|UznIU`}_ES6AfC!Y;+9HwKgGa1qkH@ zYZ#W`#5a_vta>}h9nZE!KX63cf0P>fXrj;;?KZ_ks}c%;GOqJ6otrkVZCS+NFl>Q* zzJ*5hic_PzM?B33S}n-v>CTiJ zqL@naPbz0=pX(N2G&@;+VZX{aJBNdsCgs_PJEQ~4qtUc$9JH_JiIE$44Nh2m@VxP8 zrmul1Yx)dL78v8jGNE7vK>;l8C&cg5!1Vfn*_(!=-kqZ%d9K|0RTb9_l4SnVk097p za_?EU)tno@yBg^>6icljQBwoMN@N=h#g;(x*NpcM#MW$_w+xNv>*r3^(oyAujRGpi zE}|vt8eh*F%@|3L=5Le5TP25^=im-_H$)k(6C=0fgg1Y+^br@3=@f&3a?LIbH+bbe zd}gKAII*eh>oKFvP)FmMUORclH*7BC_gj#vrc=gFy*emLj%8?RPGK)(*GT-_Ah!lE zDatD|MM2zsVFe(MOx2OV zMmW&if{Ubb*JtQw^7ltcSL|L(n3xE~LVbQd&v=I;|^uoe~IlLEx{N+L( zD8&R{%SOuF>mq#%<~PbNa4zQ`1=kSRIwk?9XC3IITo@P0c0`Bk1H9(4f)%88%%;Ce zrr#a1Zqw=Ox2n{17Kg3kV1<+kR`Hx%gdLN$-t-Gq(YD(WjZ^^OM{L(GzV)BBTaY13^}cO##v(HGlm7l{ zWN*$wgThxe;QN+`@*;8`24M>AB}|oHC?tzoKb{)iU~78PMD&T}pl5{Jla?wOBVnQM zQ)aK0NyhVk8RNcG$OU)26Knx z$vy++$GzPs6J4}>&oEIG4Gt6LF)b`4w0@Kx8U&*wEl$HsbqHxHnx;J`|M{31?;yW0 zYE&MCX)N^ZJ*859F;K8NiEvB55~(Obo5O%AK4i7=k)bh2n3h1W#7>a$QrzXIcHu{Z zM&TZ(z`D>r)=@dVS?N2nxRN@loC-~lTY-?1i{P)0uJM#Yhe{M{h>u!gJv4`0_{6O@ z1Ep`Wbyw)2vpA&s_VUP^^QKeTb z%8p7{ZnX-G?}|`-H^{c$ec$Nwy= z2}wdqrq{4(JBO6L>HdLGE#L!hZ1%BA)O#iD5-U-hoDWT(Qq0iZtPJvZH?3H}Hs1rE zP--*CFU%v2$fp&4wiE^60c~rXn#!O|kL`G^7qD01)XV6%zik`63k;vJl+62w^|xO#OWT45i>nyQ>+5f^U}W7)?M_o&C41PX!> z&-zR`S33`0*j7$oZ{8D~h|ne{?eZG1m&vgBsPLXT_+{4mKfR;d`jBX~6rB%u4O8I! z-AySi*p^?k7~`a|g%9hx0R#C802^>MCHTV7aIR??#Na*+zD@$6DRS4fmmkm33xjug zX+(@xI!EUbAwWg?sa1A|>hhN2cy%E&D)1Yx`ZtCm%1pkh9TytFKD-BI?vMV=E~6sA zjT?Z(m!VqbAP!8Wd&Z$!sh{U|lkb9Vh90E~(}giK&KFo@a&gPQ=;C=hL8)x%olmh+ zSG@8*Nabs%vrVZ{;-(DG%%@9Mh?oEn$jg%hm?qAxYUOqco0ek`L>ZrZ8!=K<%m!>B z-}dtKf(3q(!Vq^wGhO1*V^2E-cPwZEE%N1Kwl5LDr{_b1pslX(OS6ezh2FIyn4J=g z1R9UV1?j5qN)^HLouaQ(>;xXy37&4_ZZBMSxu&|;IamSFVp(?y_zly8;>|#Oe(5@` z_O688rr_!kB)d&Hi+m9xop;r;9y5XT;d3^W0dK>{#&w^@Er3T#MR_~znLdd^iz)5v zu84+FDdEB}q}ue%bk;&jwRH+Po%lR5z}f;D&B_E;6#pB9ao#xGG-`&Au*%NfgZ$=_ zm?z0$x2obuC_TOn5d_D}b=7c>L+?0A52H#R3t8tuJCtmcHlVr{h?cJ^&ba9+3}3=gE~m0?)z-6FZ$NHW=t=&iS~_5pa-}M;Li#ew0`aE-jS}DBdk>+!HN$j}?7T zgSWk2`PO?~whNTY&3>c{e=#^vCyD{n#-pv>O}v@U!{i2-1qVUp)W9Wr56}qUIxS2g z?oFpv&dGST&Xhui*M+|{+|~Iku~CE%0C9L8h4rE*MBILki?$CG@d|X}(E9XwKj;QY zRp~L{aNXj)yi$UK`}mX3gWg;35f`v!op))l4tNz*#GVv=o?dkBz)~X78Lk{!gm1Z_ zZC|a`+{=Z#F^TD8ZSVL&7`DrV%#02|> zeSyTJmDQQP-Qz8!h=q71&@RkH`OSdq!&|LZXzK-xP|^Gi1Uc6n{Ajtpv#>D^KP0-Pw>QZZz`oZ9|BzrZ8(ko6TTCY`4}f1<<&qH zHzbl~b?RJ@kGGr%lq#YeMz`G)c8bsO>C&D>U;OS}j5C%;K%m!UK+|uaX4pplu?<3zHl4 z%FPLa4pRrP+{`O{89uVPK0-LOL~ekPvd7$)G?6{B5G8n0Dhzl0K*p*-JSaNELXb2T z?mBNgLLI=-bppM5b&v^sn=PPe5^CoGE;>O*j42ror@;b~K`_F60T?B3-U4>0c4Dp` zU;A*4Df(`cj3!W;*wcnuFcRV&oQ}J&)nfn*#0A>NUunKNP4~j!z@4b6!u5=LSi)6g zhc`cW{8AySc)W`$is|G&`M}C&+zIzCe+hX4#@|Yp_R;H1k9@tFWhqH?DQ|EEdLOw3 z1|IL)lf~B_8H?0;M?;~EryS5X4&r@IVS7vxvE*sL;o52W#UWWA2tX_vhC)1GzkC@D z2Y`JB0x!jFpwmqYRF{2!0<)Po$grv*n^7YFWRc(`w*N4Px3mT(_YmM*T7;Ae(zTi!e)1OCo&Z4VgPsssG zT;t4TGfM-x%UDgkz>?UGfWD2;S82hQwF+R_AeD+Io=IqZqv#Y~9)Y^wM3`LL;)0pl z#tuK<@VfS+G})Ug+a#uetQ{3#sk9AKD8|-=50x!UsnuT)hVP=9P9XESvBGj;LU-qc zMw@P#VET4$dk>j;V9!V}M=aXmzTCmGKtmiJXZRpfKrSHPewIGl?#e3txGjl(c@T32 zyV>Yx0O0!RtUC6Axdb~*7)cJ6=M>&@2xWpFc*HWz*y$@qG6IN=5_M0}naEZ=Z&jwt zZjf4stu?M%f;B|PNRwC~?+J6Q6r%4-N+=MR1o(ZuLUY@>j3#*_=UG!g^$j%|=zXP<-tMY`k%EgEtJ&VR@eH;GbZ1%UgT*nU6m)-akS6G$ z*`X$dHdartjK>Is`zF3~z6ZqdrrgOF(*6queAF(>dE`6nt{Xhc8 zF4Z@Rgo2tEsyf2@_O++Z2nD{Fi-sfObqq6IO6yZiGe2^aos#AUYEWPqn-|h#_%H?D zdEs>-24yczP7w8ufow!NEw?=;SQVreTu$N?syy|v|#VK3Z zkZGZ(@od=7mPNV2S=diE2n?Ai4sFsvSKVVVS%PlK-xZcfJ;{ny4ESj(eSfmX4N8 z)Y0YT3}@h2QjA2^ZI>4f$u`#AJx}}j!UR!MqiFJxUj`2Zv`hG{V?Z~d?4^~|x|+3x zx$K6qoC+yv0I1WM;u{M{(*V8?sgv)y4D=I9eD3e8tf5@g;dO&G6`KsdroRz+sabcE zq|4&GRdg^>*vpE%IMPqZ!{t_ey~W;k8pI`%pnWXb441lq3F%SWP?}x)6$CEy%VtiK zD-g$8v?zq;EbW^+?pB$Z@Itrdfe78Eb${D+VmFtKo8c6(`lB^Fr>hC`R0So89e*ZG zKe*cp&DcYgs!gi&kz&rA@ z4F@>eZZJKp+t{Dc2+ylsmwPT*!yc5OJ`K>yK9bnvvjOUbcnYcOBIc`bDSM-T4vDe_WXEE8GGTgl2OE6ZB-E7qr6%%e134Xr*h5S%U zl#%$-%Wzo5jo3CHhyF{vMa?-v7=YPg%%Nby)qoi6Q-*MDHzL+|FCxXn#T0g=%bj`A zA0dl^vkNGEu9alq%-}c33lS9|#tc+3lbjlCR3t9PguE-8^Ao6kM+C|E))IGi%K5WaYkH>=5)Wk zy}q{!FhLl&qhhj${tA;{)obT2Y<2|UVo@&Z z>Gg~rjK0_$ny18!OE|rOu%cB>a-|fxTXBkz{blmY7lD8ZJIXQ%F$tiY*S_Fe*k1c) z2&20gK@^UtI`9E8C8PB%5s1d`cuwMZgNDG(DfazsUw`y2@PaO& zb~@Sc;^ujsMc))o5>%y8bB4xIqp#dsCZ-6PDl|8Fp08VYeP{e~mKU+0foh&E{8F-3 z%KfMn&2MlG2IVE1qx}p#Ff5keV{Q9@Xaytpr3b_jLfGSBA7H`Q%|s`%n$N-33+jW6 z(Zjbal4POm0H~W^Z3uwRNQE+6bdZ5x16-n&vah!9gyAE>-I|!93g}rT=ZAr$V;`a% z*E3PViA!1z45QZ{WNT<~!JG}!M+$x&g$aj;%fC+OCH@SCfr%JP3^xi-UUZ41bbOVR zXF^iT2LJ%J-#86TJj`l%%N7O+QBi3)w2(gH|E`j}c_>m;fR43fZZd5|r3b01FA13> ztpqpy+O(poKyx7HXq!FcR43oi7u$)|9foo*#v3wc-!l8tJLbC#7Tdw$2@kcGJASPm z_w<}$34k%}kx5qga9r%jHl-NH0L`vsap-Lw=%O3Yo%dMo^@q}-&DPFcbD#Wx0-FFd zCEz~A=^wM)TCAo_idT=(Hc-yTirR&{z7(`#p4Kn{x0ku_mtdtSZk%8OqRlFZ~<;^LUMfcj94{8_m5f+pCO9}?NP}Ed8$ck zT8FVF*=hPug%jo1L3$+z=~~T^KT&3nAvB!mzQ9tR&U+P#=!alX5Vg|+2*V*?8zv76 zq0IcC`r(C0Y!UVb3M6UfHcuQ(2^-k?LE{ly_=~K7;?ja8F3!8Xx&$ZWr`K6pWfW4L zAZZ$J1v!%AaXU#uIkbd!)k^ppp34%WU9k~l+INkz(jWAXXT@d{cfWA1GY{8VB?MaP zk?Kj3k~PX-5ciUy`I==W0_eqm!1{i{1`dg5R6*lZ`DhV*)1)Zk9UY|sVK+^NuOnS& zn92z+uyF#)!b;PpV%Y20`rI{sN9<3QY9~xKlJ_;~Zx4o` zAM~?sz#DMzS2M}zI|NdLZKQ5xczMe$E9zD=a_4l{O=OKPt~fF*IFp%9=`aHu155y^ zR&ZfAQQE48pDuCD6?2GDL}htmTQOH%$j^W}t9I-rxx(C|M7Cjmfqt-s9z!x%SJaRO z!(=lF^`U3{kPCKEFzT;kG`E4Mb1T5KCvSKl0_WLWH+JH?2!a4QIL6jf8u)N1osl_C zf_Kg*0CiB3Zo6IhnamH#<5VdnGhl~to0e9y$TZsHNiUZXI`*TdHMv{qK1@fo;sjH5 zotd*Fu=RNCa6NQA={wvrqWcgo{DUTj=5q&bbdS-<5(0E;UwxTwnf`-ovasfy;(LoK zK{~r=5@eJsnTmT@5-N~m86kVDs~Kz{HweJ@I#pJT#2$bacjTGIi%(~Z~G z;4UMOJAlj$kC-9JP<6@9Zc|@CKtqpF#XNN=`J_AFknux2=3~4K-hDwmj@t(2(s@1R zKmieqGqF&IlgUgTlp%y7ANbiV-Tvd-b%SFU$$j8mLDJaQ*fL6$-U>X>h0Ye0p?Sdg z+zI0g??-FJ(gS^F(x?+zi$;{TkwV+z@%2$p;S7>le6zd^OEx*Nv2Xgs?QC9=9K#wo zGNd;glxR)}C&p6_OC7E=`*KD%cc|PIR@7-O;>rti4N6oD%Q~d&3`WYbv{Nu7C|m)T z*vwlu<819nZQX($Ofz5m1t)%a`Smja`ISx8dWzX{sZ9`jlQrZ-bCd-`dCZl0Kh>+@c9!4W`6HBo#ZZcxVrKKW;^-kxu-4M>y<^# zY5>y1X~+paNiG$)l(Rvx>VR}KG^^>Jd*=8ig4%y7mzgy!6+MNOQ4QVeocG*y0>A;6f2)JYY+y1?;UbcEFlJgNhoLz)UAVPGh~at@QMpo!N%v9{ z_grWLST5U&5waRblhQpc?TxNz8GA1e?Q}IH%v%suHr*13Qc^lJK`Ntp+(Qjg#Hk&> zC3d?T9TMw>6V{u>%LU>T!}WDkJe4lC<^4_ZNKM~$2$#+MYVI57K8uurVh6bzD!GLN zEbhj4Xp&jtgu#;VXieVHC_7TX`s_=xbOABfyRh)S3*@%V`9z4931V$d|w|D@ZBA%tCdY%hTC(MiDH87t-}qE-JDC>C=?QUOa5ql$inh z8=K*bJER z`$-E;&)yg*#m1&_JtdP){aV$bwiy5bABkFD#=H#4K=!VZ5&)iq!H5zaA)VuMIdeLo ztrRyU3)}V7LGi^d78O~##Hm1vSiH8-$kW^1qwNo949}h3(UX(mVtr%T=R|ZhJ%K`& z69*gj)meTVO1Q%kO~}?JIdfT|fhb)1=ykln5xx>JzJG6F(5++~Rujp@1@Jaj3ATyQ zVVynz0Gdq$S;gymc&CCZ4bd2IvZYmvm~c=H<-sn4udtkv*e4F*kn9E%SZNpuC0z%z;=lk48H=th);l#3X(ebde2^V?u;evny|0L#w*dr zP+tk6F69jpSI_MIvRXI>lgj?OMrUpziiXDXN;(otkw6pfm54>x9>L`@LS`yH&+bhK zefF5s{KKosmt1e|v~z2|yzdnB>`+7;-R9XuAlZ@rDr`Dr)Nj6K<(=YFR&Qi7ZwJ62 zs9hH$);G`ps>f=RAmf0RJcp8 z^PWA1aZXuQc?!Kb)J<iEKo3_ zZxJyHo|w>u!4bw&_wsS^IR}3_muf%~v9*fpW?fCLX;6CR^RUHQBEmz4zhK^7FgsM* zk}1^(vw&WY9KJJ+my>OCueCu9G!`)A=);8`{?(PzTb5Q*C4KESGm-)cD(N?qVoSFj zoPN;S3=iGOpHo9gz#vBR;{uVR5L>1SR)&)<(6bvE805Oo9Ttt-y||%Jdde9nrz9$^ z`4fe74Do>{e9Vc!+%M3%1v!**rmeEWAX-rmNC_6*l?YrMyvKl{=XKlwZ}q#94+QyI zIVlEagM^pj#MHm!OT0DfVdnsxgGjGK`EXqA@xl;p?Z-$77MBZ3r8f7K9nAV|SL+?V z?S+~4VHpo=^0QDiDLn+2#|ZE%R^jE3!WB*Ggw}@3Cple`LGzO@hTK5 zwF^X}m8y;Nx@hL$Z0XX_^JW-kE_Lx^v2}`vEU!6~oU%pRs`*g@>Z)~`(Q2%ew?#5)}4xYKI15RxRuQ;S>p zglHbRzKy*x2n~G@`wEt9J2Wx#SO^Iu%HF$jnwsq*XMWrCMAKF;_GV0$%>Vt1!Rd~h zXS@|rSU}@`F2&P$j5Jij zc#2$Sz0Fno@Sxa)yi7FD!kpx@8xZF<_MMP-MGBO-*!SfrN?aR_k-A2JNU`4nOQV~- zNi%e-I4+|aOq`o#2fO~ZnFnZ2{&NhvXdX)|d+RV*&#{Sf`8Z(;sISMu0MQy^;G5Zp zkA2QbHJ+5NBE!qaOWM8UPY(b903tm&0!tuA)ZV@#O)J4rU>Rc5lF`jQSsP_&s4Uvm zdCJks3*FNgWZkK#d?YD7d3ToGF2tG$V8KF6qPtOM_ zI(G8e8=oLDW3Bf+A)XqzlL#BbyWSN~<*wt-x~i4B%|Mn*F!`kv8Sh>ASq4&#TS7$% zAr5YKj_k@~E}&V0^nP(b2g?YroYyr8$fimL$EEDOszM~VjO zB`MN7=) z&e)H`>#fI_*0Na?J@icHj#Azd0#`L#lFD!4e0-VU6ITr@2il2!Q~L`Rj>UjhrQySd z0*!_;cFO7;qZ@RJ;B(QXaD`PY)ai$s+Mo2mJeT7}^n<0G)52 zd|4Gd?E~At_R!0|5WXrW+t>c$jSRCgOQ(*eNIuA%{r0dHsi-j|BNgJVBV(tdR8TQ* z14NrQJIZh_)AxCL3=Fbe$kQUUMv{}91oEVJ{mJ4XU}F0~ZQJGfcD7UQQV*ISQv+v* zQq346{{(W4zaw(CrgdmXtqq?Xv^|JVbzt=g3CN|>(Tu<>R0+5^#k$F`Ev+=6vVxA` z7Z9zbfB=p1V|S{sg+8e@K_@u6)F*l*^7U7a)5o6wFOm~Gk1Ca78&K^~*RS-+NuH_6 zJTf1E_;#pabcPh|bFBidE0p6WSIE=<=i?IWcTX1)u1jqhYXY&D0=;ywAk06dV`D zQ5Kb~x=o9C99(5}se{Lsj&jEH0DhU99l|me8I<8>h*3q;1-aC53bL$m;p&x_$7VW35pVT^S`><(hrnA0BpFWvMRq4|jD(G*R&B=hQ@2LIiR?=Ez1n>Qs51Pe}>UlRcWf*{4L}5}y zT<7!K#i(NUDvVi2W?n*|iQg4Kv@ciK@pk8aSR^ANyifYs%JfLms3##e7}tGAdIx;Z z+5mElcWuhudI%G1Ue)9|TBD5+tg&L{{;48GJe}hS4>n<1Z|R-Uq7&H*>5u@{YzV&| z*+BIqV@0lT1 zZX%ZkV2*KH`a8fM63EQ=ho`mLson>?U+0}3%l)FCuOX;M3hbbCGi?5;7^v~eOw9M& zIs+tv60&A=`k+h9`jY!Fu#Pb55e1Yxu!`i}?bExX_bvQxA|UH7Wi~4hUfLNszf=>d z%=e-A42Ehh6;!$3_~7*y)Ek7_k5?ZYZ{)N~Od;pQEa+#X+@G*|1cYcTrWYzX@%bVoWEqW=|AT4M;DgWYi6KuL6-FgXw0MQToMF_3TG^oQA-9{0?el~J zxUTbGot$gY!x??}^o+mU;9C+NTsFUE+i9ye}JKlVAaa2_cp0WK>d>< zL)`_8utsvYn_sPHF|~evPl{%w(`H2C0p9F5TFiqK^Fjbbu>9moQ~@8D6o^sH|4&P#r)eXCV~184o=%SQR6@0;1|YNDbmJSluP!u0Bf zMmoxGBaAWeK*3f?s)ICBqc=7mLG7JX&H-pe?0B8I%QvCO1-tp;Z=`{y_j_WV4mWYt zMANCp+?_nrh9EiB#sAK{Vd};!aTkuq5K1n<+f z^4TtQVnu$?Nk{dfDa)LHt0VRakRL&&o9L$1Zrp0g)ipf&xksXs)j>8Br$$*E1#6Tu zv(YXvYQz-2izxR)I#xLfw>M^KkD7>Z$}# z6bwtPB`kpq7CGM=k>}$|DU~W-mb?q84$f5T!idI95}fB-9T?U9x=6J?L33H47)mx< zGBwccb!1&?d!6TnXvq-PxQFo1HoYWFy_LU5KLEHOAIvtULGt#2o(#9Bl273Z8*}VN zC+6r%>X}oWLo_s=lELRCS|i?#qK-y}>23H1078Pc_dp=jzY#mBNKE%kszJSsHYok+4f20+ z1-eOB$qSQmwwZ;JcHhoyOuin+LLiI2_;<-r7=|0?=8 zzY3&#aBRzh3{a>%2BL!rXDOU}LiS>zVsy+#gVz#YHAdGnsX4f<2z>ICz6wZCa8r(+ zm7Wv5-TzfE&5{Bs3B=jnCK07LswY;-P4rW*iWvm`^3eBcX2(;hKTPM2WYsHn&P1VA z6vWk2x5$!XURm6-3g7X=f&8SGKip0c`KUE@|M&!!6?&r&m!Oa2(_H*SMDZA#ivd~2 z#7_i4r7LWuWGuWQ7*BfDyv}OnsgK_59)i`|b}p5y^ZQD~{Y-%eG2IqPduFuN?zy5h zD(_+-gf6lZ#$HDpiwdZdL6CtP-K&y2WZ_)oU=7o3{P5?Y<}$wXYIw_QukQP&F`x0N z#k2>5)3}L0f02G>-*tH60CyLa9 zT2`h=x@BCzu{3BtTL-!Ly1j7`2P~?eOA)y=Cy)?qfZNXCLg-|1<%qV2#PHz$F7%s4 zAY{y~Ek%JNWF`f3o}uS0Ne{}5hO6u^kDI&^SLfa44bhC&GtO3;prrKjwaUrKynb(qC=G@ev4Z#oKX-sgx- zpn$=`zZ4Uv0Wff)QSOvRmGKeMW*ttW=m*1%AWFzDBo^JXitnj@Ykv!(K}RvNLue7u zGLArAT^K}5kEpw7YJJV|N0_jqsKe^RR8QG+UjXcuoi1|jMW!pSuOnoM3zA@LgM#rf zAzV)EfP|30q+tFsIDi|m%L^jqUSqS0@H9}tbVs>ZP%;~n z0ny)XrfuJlfeq>?rlnG9SHy=ddCzhYe$ELzu3v28!ur}&RZx^WW{5&O=qR;6Rv18X zY@t83io$wWkO~&ZC5Q+8A#|r^A$l|h0m7WPjFb)aWBsueURy7O zf1I*uGwcCjrJ9iymGfD3w1IHvkpc8qD9y2if@}Ef8$ooO44PD!0q#0+93aB0l;I9R zb2U1@TeePSG?HYH#Z$MUEsksktM867LGhn(Zo}2|bskff%lfKYqJ<1~WV>R8stZ1g z{4)UA3u;uba1Ss)n?6i|(}663kuVFX`Pz2X)ui5UvUPW30ZvV_-K@uQp=e}~+E z>~pTB-Mbp)|Hf8E>pvztoTLiEZh=|eWI2UlM~+G7k6dXc#j^cry8ZP)p8WJHP2yR; zD84N2k?*@(U~8%l;VHB8I$cL47=kqrRthcI5M>A6-;=vS8lmGIV-3Z2)qE^uUv^sI z@CN!lT&Wfp2TZ}+tK=v6F}8>q7{*<|_`aHZIjUCp<&>=DU1sOr^zA@N5|NpMZ3t76 zV?OS!K990(l{6ir;P>~ARs6KqfhcyKscu^xHqK@wF4At>R)w<8v?dQivhjccBRWqz!`dk{qucYUW@(f0=a2 zMKi^6a8)Da-6w~pg{4_zReMkmNPu~r*eqDDe57VCYJ)kspM|)i;|&vE2#j!^&|Y{* zdL^>~fsdCbfw(xfoSnQtKq~o~&E2$!k9=nwo_JXd-aCC^I1ZnRE692XdS$ywwh7i9 z=S%(Q#SNyC#sbU9@>_1S$ot{~n2JS`u(=)3>kvg|)<0o=ho0A&dp5Vi%PZwXFW%uJ z8}7P_mr*tN!C6h#;ZJ>GOapI9X+<1M?1wb==WT($E|~6cS+ThX+*12pkaS464CJmE zbKY__7X#eLed|+eQdlGM_CBy)SQPzdP6b(VSq>RUfEoZQOj7rUj6z{+oP1mawV#@J zCJWfC>+KF@IvCu+3AR)w22tQY6&wr8Vp4_*bSOMgPk*{UQm*fg=k(ba%gQBCl!n0;PC3p0Q!2^;cHw?%s$;D>AnHw zQ}u1X_wjv*M(>jwS9PCK3j*)bZv=PD_D8-%%JsTJH1IC`NqW4wL?EHPc4dg=!Y+t-MQt=p#=!aYw+H+CIT@ zyD!oBY&d(;I8jl2Kl4VM{=zGOzQ=6a(sR}wx0&`GxfbL!XjX(|JKwJ9Al(I~Z%?>s z;seQsi3c^o^3Ker>0Gbr$GCt7!_)9Uv8On9CMW{1Z3>cht6PEq)VFrpu^M9Y5B>f3 zbIDJ_@&q#&)2+ezg=Kd7>Q&H-jzS&z7sp>k5uk|SeK!jy?P zEyxP!$x$7qdir?nGpy3;0%@7nY~z)Ur8gR@U@4gdsks%9_e4!86cJOBEVWMp4RMcJ zlJNftkOw8ed}Yu|S6v$|z*`WS2~Sf*adkkft}~P5AP0yiZkdey9=lO&Tg_M zIaqrg_aP3u>tjo(gKCY1444oV|GT%dabfRFwlK=bdX2tXbm#+KW}DKph4os-$-${d z_m*h5A1y{)vaT&u+i%8Nr;u0M&D+2@^;)b(ie4JRO~TwuR1E@Fg7T?(K5jS37 z72Nh7gdiuz#d-@G0XITPqYMtWFE9{MSbHM1eh3AORbvGt@y^+2=Z+qn-t=7}q zBD+!HJ_SrF1I23s;WCUeb04pPx~+mlFvZ`4HF+qD3VD*ppXBDSU}r-FW|L*B9OuXw zm*b0~EWsI;xD*E<3?Irr0dV}mkaN+rLX(K8dMgWte!S!PW}UQZHUrTG@Kzb|7yDj= z?y+&vj1|}=u?uN!(*JE5?u~;NxORNhsqS@A8Y%X^(u-}kKoo2aj|8og&cKNQBv(?? z_f40jrZBW{^qHqavdaiM5UGbycD`lCgAArH#7q144>5Y(&Pv<4Z`R2daN-)!o{cyt zLdTQb1pXMILWNLDl#)%$OTS*Znigef{zGcNQrOiOD4+{N&8E$Qs#dvHWxCbUW$Bzf8W9wl^g zn=+C#%#QHx3^nN}Yt%K9#0JpC=%!;vn@LF+>Z}TfLa2v_o*}M5IhE~#xK>tPozx)J z!=pk9*VvpY`@4n$vDsAWJEQEzm*StngN6lxlpK>0Q0w&*E@AzWQjRj-Y5nM=06@_` z;w?#^WD6Yzn*>IF7PGXKH#K#BxI&HQ_ za0S|V87d&u1qIiJSu4!kn)bF!y0ErEc}ROEYU^{D0hhdvEPUM0-O8{0LBR67DbO!R z1-`E@bn2fl-K?`*U;IQ3I2L@O3TyLa2`Se?+tt*1(;u>X!@p?zQ*{;Wm32iupJb(O zFtX=Yl=#K#!|b=@iFdq+7aR2!C**q&C*ou^cfR3%wzsfiMh<3;=ig9#K^?& zti|`nB^fudqal>VYGCnv-yzJ)fjSyqlqW_EbeWS&nQ3#c!ijz`E94EkU}A@4kwR60 z)^v7x2=%LQ6GOtKz)hkuE>RD_RUw(PjgoIoE|ybgNv)!sRs@zIXMdJ)LJXm;v}u(rTvvNHZ2lR@l*_R(g>%|* zP_+xWL{|Ql9t%kBId1?d0it>WdOyWx$PA_yeA?9EtlxW6*}PER%1R{!`t1m&GX-yL zyQQU;3cI&}c$ySFtRx7w^Xa0lvkZ8Ei*nnkmjxq_Z6OD zmtIH4Y8JRkvRe`g{9wF^Z-b$Bu@1NGI%10js=jP*o#w7VuzE@g4S!y!s4D?qh3*M_ zM1E_~YW`eIMxVZl!tQBv8ro2HG^@QF3mu?srz8*L-V&MR~UiO{QE zt*so=oP2;5EGgLzKoa3@=k*{%`nb%Dngj_X{Adnb`*h!u9Q^ETw!Zn zW#cw<@McLHxLsHgG0P5PU|pe0cjC2H@Nq)VsyU(z26I21PfP^5ihmI5u_^f&cl0=V zM>(BhPWY6?3FL?khnriZNmC3XfX{KP!$OBJicV0Q&KB%UJxX78!V#dz)V6RbZNIz^jKBlYfG7#Py3eKzN2?gjTg-5VhbayR$c~f!m?n z8e?^hO@Bw^;BW@-RxzsDG&8 z1+50bf`XmVdFuL4;`=hyw6MDMaop}QI6Y_?gzNnWT~K0Ag{`n#Wg)o8@SKCpyHBsc z(vbJK2TiOnaO(hF98sPmQZCzV#K#bMQR0SQrklJ9SWjRnzCPO0SJbC1FhJbQ2GH-g ztvQ{=geO$trio5^k{DMF-FRZ!&QcFy3M+U!*`S>!r5mtWN9nh+R-P7NK4&avvyNT2 zlEdswP$XK2Lez@IAuhtSbsIs&r_OeH{xsiI$&4S=TSoOG<5u>mP&%VkImrA&E)qMr z4R1@#D#ZhCv=aGW0C2MCPcNA)D2kV5@Is*HyNz>FE1QOH4}9P8shF9ss43YQ-5ZSD z**5)V;5Mboe!$3@aDcom!n0yna~eN-m#?BXmsdecm5F=)xWnBgTL_yq!FH0PesiThV&dh&^8vbV$B8Q|(aP)w8sRXm z2>+hp-QyBMzhPKH5Ux${I&0eB+j-)A23 zjo}Jhd$ft)Yxvs+R||%fnM`^PC&XL?*51GnFb{6oSa}dY4VW2k!|X9h)U}FN7S%Xt z)ty&!7NLVcp(JC3G5aOvcA>D>F*rK6=$bREDK#};V;?K~y8;|N;FH3oZg=0FaoHLh ze*%v&C=@N)!FRje;DDkrAf_`*qPsPG`A8_ z9^s8#N%ey!GEi7pQA|Zy55B{b>=PjJHPVS?o3ohCJinN5uTO5aRLS(EdTVM>U0xPW z$~v)?GhaAr>aj5oy7ZjH$1nDpY)c2Zpvagy@kl(}bPmgII_`U=YbF&FJJ81HK$(=D z?1^1{#}J_{OFcoELiyYxYQvFh&(QNmG8`RgnK22U~;giWxjS~%8{ zu#0h>7d9{PrH-5E34jZ5TKPl*xHdw^z$x1YL|zH1#mO1Ynhh(0kQqf+0PxmUeN87E zlTd}`-I_HDE0@DS|MGZub)gA6c+sgvHi=g^cJ0^WAdDMbXtwF`A7zO)D_drVwzt9X z&~2Bl=U^j?*f?bR;``6?wp`ajtjK4DRtAeS;NwdZ{u2LZw|q!)$3<~YZU(8{Y^^uh zCJWb#e{ZxCYKy^BR|SB_@yy6A>MI9lt9nBZHMy3%eV$^h4o|wCr%73%jB{XG%ZY_x zv60*;O;xbFwWvdJ#@&5%U5}T_&dLI+paA`-et5<~Ay_*Jl*t^IC1y>`jz6Q8c4{$Z z_s7jbXL!ZxV}dP}B6Zkx)T>v@YD?80Zit)r?Z_DM0j@iTycnFE!@UEf3p&Tu%VSfb zh%JCI0Q*=u#GwP3za?1(?N<;00(V@+9|Ow|G97WKJ(TpH_6BB>JvlxYU}7|ME<$>^ zlqCm6h%nG&n*NjNw+_UfEJ&4=s$be61;UNePd263YlOhpRbQm~e<>|-C($?^Bk`8d zoz`oI_MIn%r6IQK)}qP32E0c3Au+qeV(!txj7Jp5nE(hk)L{lqX$TV5;qYGs&O)gU z$*9X(L*L2S#lu-+9YLNPDvYboc{p#oBTEWE)T7<0ikZ@U#Br=z?CcUP_mnmZH|&!} z#vcN-$ZJocUHfC8Fn&8rLtdGAZ*^PA`&n=%a$o~u6?|2gh5#-RwgZaJel@+juaU$l>Myx5;zFuyl-`$&SJVO=jxc%*2vf;vkct4N z;nypAToyN<4eW` z2dT^zsrBlYYjoCDS$wW0(*>bptAKp3vkl+pn5SYUw|rxUe90e8>E z$3$I98B(&|VvocIQUa1F@21!oi^?E7AzC<}U~x67ABaE%VDKhjD`t^W+(=Z!*zaRc zty_-}?&=7t(~l&^fWXInG)x&;a3)U50G5 zZyhjE9yx(Y00AiVAM`e#DkG)R#xeTrsnnR2wk}+r4I@a`tK5Cluc@tsUXll^w0RpY z*=RJMOE&oODZOpcmqtZ8quHmz~yFhu@PE91+Qh zx|GW2H?b4<0jW_2yZT6H{L`4zJ7GXp_z7;b1ubevHqa}gTwOMSZpjxN$2tq}+LKxQ zf&iE<^;WT!7h)tK zIbL+i@S)Q=Sl^Pr&)BVNU=Fn?^6Z*c(ajS%a-NoeNx_*+y)qVw zqBAf`n);S0V`Mxa`q(Sb4ZydWQs*8RTd3a~4)kg@1#J}RISjyl4_a;XgUCXIr-g&Y zm0kdM8ZIL!c9w?;yMjvY>HuCi8OUP?TG4S@?`-$;D!N`be{ausYjpDH`zM3QIt|WL zX649C{wre8={Dt39CludQ2r&4>RCU@8r^{e3mL2=bEel_VhpnD&SY$8^8@1knLq|) zkS{h1V}5f2?y$fpWZ!##rwS=(eaTpy64FNimPPsYdPh_M%6+Y=N5^OokT)537q{UN zFV4;I2qV4#d`0B#)x**0z+9iW zS$sKq%5O<0%>T$BCHKAu5?D#JKqeh~qv*j}KSM#&8Z{y|fl1tDUgg~){pWc5zEx{O z`FE>b>i^91G;9Rkq5Ek7CAas}AW4(G6K#pxHbK-gQ$j+vh!DLoAL$?y7`lG>yr{e; zPC_1c|A5pEJ>qR)QP9(F>Ik5-NYOFx2eq&D$I_PA9L}3-(_*0^Zsu7?QZkDysV@jg zoO6#%IO}38r+(QVZe4Bs2JpmYjA5l*!V{)W!QN1`cMyZ3g3k0Sv<*pnkswKrdx)Kxj&#wix1525lLD zMYnXIzkMP}DG+Yd7MSyqqD1cFQO1d-@GqqM+lDKu)i`_&wz$yzn6vUxMVshpVuv1^ zc2`#KZQ%fV6ltQ7Bx#P@6QXrlq1bw36{yJA15O8#DT`2Bj;&k9Cpq z>kq&P!$JX)s^bBgV+szF8K>Y~Af@2=A@a|_69KXTDx_OvAjueUs|XgeShw!KMav90 zECfOrIW)K!{nyvc+_agSR^l~$K^@L&*-v0R-Ig+ljrMUS0 zve)LT?T9Y!`*u^jn$P|p1fAte7Yf*(v;H%n6+}r`0PfMi5p(q61LpiP38eHADWge0 zHrRU)A|)gQp|%Kbqcm;`HVy5n@HI5~LO6eodQ3pQC)XZvQh0X3aAY1}FhFFwZ(=+J z$dodTOXp|W9*GynNxypabk1D1ur@ni4t(JXuK;lB$EA3hunU-QscwR( z1jdMjWQD#8wl;DccEPEwK}x@@IKnd`$Vnxb@J)m|Y26uN7?tMI z;L}0g&N^_azK`b+efzHKFdZ3Qmy2|i$n6N(4FZ>^V{`k2R|UdTSsK`0jDA`8!)FvCsr6GV@4LN)?DL9%n>*G6*tLN`)H4H z^-B&uMmB!%Oq7Q1ifGo$W#t@+@-h`v!C^a1Jwv4hp1!ibEfJ_ISxf0dvd&;`kn&2^ zsW4P{E>&G|s3JrjL750Mz#AHa(r-ua^8so7SeSS!D<4$akj0I?QtxkBlLFS10i9wL zLtRd=>*NP{9H90h(}eL`UJ}UJYr>ZiRp4X$zIcH%1O(aljpZwn3_{T;=We;EvX+<%vn9G<+O@v>8J2!6<4MEIkg)#ZokYSI(#qjS3n#Hn$N?qb zLBKEI%z`1+gGt}}f@=zAd~69slm@eHs@#3HQ3FTnNvWn9CwwE2e9!wh% zED%3CCBuL5E`Co^MsdPa+yNYnX`I_6 zw)aL~r7agYPYW@<*exJhLwwE_uv$?1aBBiJXJm;D>VZ1G{0A>w2azAcfV4hY(xq~%Lv)s($HFHTsTzoU@B3t0q#HEQgeva?r%lTzr+5&*I*}rP~ zI5EPHHR(ajdRgPtl)N0aw=Cd4^~}$xyI{@?8w0iv+gQqNYL{VISE~0@5a>7PoM7ZO zySD-J1ZEE*Lz=aH=*y2y#08|I@^^fepCvF%HOmQ}6S%W+4|FGUi%$>F+WK#qEI2TZ zx}_ncloa@6>*h*chD7{+AGx55XIUn9rkh3a$o!ILqC?|Q1ij!xXy*uI3Od4Ra2^{H z{jBri*=*D=piLJ1w>b*E_6p#`SI$4DDh~j38~}acYg5}|I)V;9nHGKW(W)c#%~@%d z6-dYGt=DwrE92>?g#!Ze;r{xZVCXZ)8jj4Xu$Z&&k`pUQ1mDs5?W%CylK#UQ3r1q= zpOsz~Ihb^VKrUdk!m}LxAyM3~bU0izD1`|mxc*(>%r6U+W*W3o;t8HNaD(9fI55Eo zM+3ya=Y*j2B@Biz(BA!b9jp!#zf-4oV5q?B7*+XjiSDMpsXY14HDZY|A2|+})co{h z5b7`V>3mei#PX1BFiUVL+9({gykW)$)_Fz<=S11@2D8HG9qYh4xqzLTnN)VrO5V$&=NT-)P&Jp$s!V7?6RFs%G1T>p^*P<(g{LGB1yhr` zM-&9x3%cS-sGisYdvtRB#-9)}AKet8WF|@UpD2#OSP@^;{PnH4-NYKMihUC?_IK0x z$KsRHA-F!jM?sd-J_j3Fb9c=v`5nBga%-#g6F=;!XQOEL28ezmeS3F( zH*pjHkT3}&SH~YZhRpxH!1i4kYB-Tc<68GDwYI`Xe;L56kftl*x_saS5?5v;2LmTt;|+zKMD5G)B4vYRHmwFz4!73S`Tl7xiVEIM8qRefrIL z<8Y#+sBME>3Sy!=$4eaa9|a0~u#hBT{AI8?PZG{7khqMQ91hb-Q80quThVF;aG!P9eY#jd_xpmxVz$$me~v3_+q>X-u1(lj9!|OOS6bhW z2ZTlZpbC16j(j%;WF=*U<`se{8u#=&;p=H)UQ}gZf6xDMdZeS@QQ9C{`qpGgz#)?v z8oljbbjcmQEKB6+L6F4wE3JO$>t7W7=JiF@ar8utb&ZHsS}J9wqu9_J7G(@J-Bc9v z8!LP0!(OeMBMw_y2;5h_HoE}p_aIdrn-)3<619;}n8XK(aWf)1({bx-TzmFWbm+QJ z(ITG2iE2;Fx4(b0B+5LHp#)Dc7s=aNb_Z)Jg&1t`X@`gbx_E6F1xZtixcbb7P49a< za(d%rlrZ=q^+(jm2HU5_I0WC%KnFRp>6i1b-~u1&9`vBTWS-i$W+ZU~d{oa{@q%sP z>b#adM{B?<=iGLlbe8sDtxW|#;5lo;vEdtm+@&nVR}j$oS_K9&!9&k%h~c z9?J5Nd1tWAi)yQnxTTN9c1SD|m38g|`yhL!cK<(1KGst}GkLtlQS;CBh&|t#pzbVo z8`QJmJZs;>pkD#;uotcZITAI_nnQrq*=oe!!7;FL9=#7XNKq@te*A(v40`C0P5A#s zEpywd*`(G}_%=9P#7PXxF)H+=K)XwLk^A+)c;4M&5;*6UB^YO>QvCkS5HTd641U4D z3qGybGTo(tW%ozidxWCc{uOUr>j3|Z%;%7>QY1D27DwaN{elIZd&0n%*&YpDAjnOL!qic$JkJldZd5h+ zux|ZJ@U8NPbU1$tL;5O221xks8XfcI9{gj(2)`(4teQanb^2!|GCV1?6A1GH^PGc(=*An`-o*mk9Dl|O z#d-s-D zg2Hn*_|!8s_`YH%c7u!9!wf&);`fkSL3YkQM^5Y_pGSB`4i#7~qm4IV8`J8VSns zjEz93PBB{qOUw6C&S^#U;hc7kewuzG250o;lJ+8pD23F@?!_ror#Pr!xvdou`T85y z1pQk&BdkS#NC_PJ0@e-)2M<%LPD%dfUyuynDWBSYq^QZP!P`hV&4ptXNV`Dk<}==j zr#PQTf=<0(`SW9L&EuC@lQQ;WVr*b7dXDns{mM~P&;@{_Da4{{n-o>m1aQxZo&}LS zZynRKCu*cVpEldZ=ds!kE$X&CV@6|={p1DQRlSsJK zSXpGy(_B;U?bb-{q-o3R4s_`SAHbu%3y_s`!1axIB8R7Wb1vC)Y68})Vk>A#m^h7~ zYtsqO0We2f{hxEc=YhSql;`VJ;+!Pv9D;Hkkn+3fL`COiEv?K*$XXM@S)eg-ra7p4 z+gI)!7g=J!J3Sb1l)ZRWZ>6tHit*4>901QLWa~01aSb57cLmRTlkyiL8=4B;a-~mA z@wJ)hN$v9^u!^)ui40l`yJt$7Te>pKse%fUU-nyf=Jcd4V!s~Uzpspm4QHJ!(=zIJ z>P*fDU8oqAM45zKvf{Q|AXaU=MsXjG_J~bOf!qz0%8r8RLW?I1F^x>ZEvb5}t{2ER zB@uI^H!#TV@XvdF*FzQ1<0*vW{O?PJu})q3xkSTSiTpr}dUcmLTX}jPD2aVua%(~v z3Q0s!t7Yf>sOf)2!bDKL&q{qDsISZEbI?%lI=lTH$b+_5ty8`R5H@8kOG^e4; z#v3dvB^CrW9Vr;wKmuZ9fegrWHMUPwaS6laE+7%vGE$sq4HAzxIFVuO1dXQq3;2#z z`BJ!Ddxgi5pTn$r#nRV;>S4dv7mES3D+NX|S42#vNS>uMp`L=)wD^m~0@LSFStAa4 z@tEHNRN4S~p$z~%kWp$-{+d(t4>nZz$da??XMdHaI%6Dk*2!b7tb7$GZPo zU&#{^C#Z)u_9fGDx8Z}O0vt$Kh(LAB>ADH04xY^}+>9Qg8iEp#p719Lzim7~)1kV? zm{+$KMq`aW12oQO5b8`%g?R_=^+)D&*Z+`9i|n~-c8c!%1=Kz-NdRV{J(jGOp~z4% zoULrTcP5yl`h_~Yg>m3Rc7;@A=QmQR0Y472vxpvAJ`Pkj(~UhRmP|ej?|{w*Rgma% z%iI6P@ij8P&<|<&g7%{v)EY$gY?c9Hn9;4^V)BgS)VZbOMJi0NvX{P3y`-whY@8Z; z1C?`(d&FU?=|2m4(kSzZFN0u8;qbU+4Tb*npEZ_PpG#8r_EiU*RP2ndXnCWDzmMy) zQeX%(B$|Us6CZZG7-igeBA}weHcDSXN(C~347=^)9c=+du9^8+^r5nn2mA5cu z72@t1?|E~2ws_%{+euuS9+R@%gR(yKZ4?Z1Qyi-Wc|l4wW@nv^v?=fgj21<93s<&hDm1}#7#22C-2?T!$Su~kYbRhZ)> zhA{U>)>kK&9tzSNHH5bO*vQz+-=_%E;x*+)1Ro=dqiuB>GomQkfA$5HSA0r&9Yx$n zWoC>|Bkp43Dw^l@FV1}pJ0=sHs(BqB6!&rAw$XVeWhjT+h6(|s z@Vyv$`(FnRa&vZTfiz%#y5y}lq}esg=xKYnv*4|sw32C1>g4`TOfd(&lnvGPLKxoo zA9*cX!zi|bJ9+@c6Qmm(<#n_4o_W*vHhj(~@Dau=cPj87s<1AlV&N>DZvT$ZWiAx# z^gQELTdzPB$l!6oRZx;Pp{%>Mqgu^rW8!8Ew0(Fto&kY6GKx&!%rCbV`x2IihrXFz zty&*N9bRF&d`Jpg-6ReopZ2C|fAnl!LY@dTZ4q-+hp`NJSLM*4%t}Q-e=SA&uLz1Q zJdC-p{5$qyR6wIrUFBuXa;EBBa<3jgpn(S%eBpCKoY$Vh<81wq@0A#}-i|MztOH>l zM5OsL0D)mt=iI>NiSDK0YV4zJM2!TpqSvKx|A?5Ot+5UWOcvXtS&c;WOPTp2_U9AI zNKz~;`2`4FFAv?!XdZYR;x%D(H1@_GFyl_dNNVS<;Sb7Efh>>e&cMhPxHD|WPWSmS zCPgxEn2T=Jr%?i`TLyraX;fq^?Nc+skGOE(L<4NhMo`2%acS!{m_9zhE=H?gHs@-i zz^(-h_=L+w^^x1|z|!krVEs7&xsPvjY*aIV$~@K&mq(hGB3Nv%yOO((NE6=g$B+Xb zLFQO}zP12hy?IPt!ltQOE!8&bq)Yp6k?Ur-YxcYYfEZkvBc@fY2`mbPib}wWjHQnd z(dAJY!vT@BYrW=?h!`U0(E`DVWB^4#y1zqAu9XtlzH~c-eZ$76xh%_D(U&9X+R_Ad zo=+#6-kng4v4HEvQ1G-V7r-R5h*hBWbXgOJR|x1Ye;y}{_yy!M)}oyc=u zV`^62U=PujxWKa~NJ=A`HIMCb8=z)mp0N%s|Dlw1@qtfW9NH)NO&ac=<4k$$Q_U&- z+3RA~U~{)CvcvtcT{7VSo+KYmES6baJ*(f&ix<^CYRItOjsr8f$lsADO(uN_ChoPB zJ6zrJFu;fbAfaH^kh2S5ure>KRW8l%WWXbF(1d;S`M2AF+cVT3A z^oE{u%hF~GStcuu>AivDWG)^~NVc}i2ZfH02s&+ACbRd00p#`_V$k88Ex%(Z)2jGR zPROOW6UD7L|Gir_!X5$lNNVSe>9&hveeV*cmmP#foOU=K`^(#APWhrt04b()o|8K6x@muC_r;$!u{KfVq~ZWKmIfl zOg`%F(6E8$?-i8G_+$=|TVhQM9S$%c4Rv-lj|V3X9Y9xl9$+|}XVlFxNGE*j2M-4Z z&XeuNRi+kk3VOMmE=Q(W)%$Omcy6PGd`4dX6?6taT*{EX`;vn9{l@$k)YDK-Pe+1C3Og4)bY;l`C#{wSJ z>;E?xB?d@%T!WRnzBumqdvc6vw4GG|+})~jIUBHv=-j?Av-(yI{a^uWDxB&6lIrJC zK9_wG<^6cdStx$mLN}$`1Cr#P3^#yQWvaG^ya#MYMW=yaP-miqJhT5@*D@q9YElFi zCYhacT}E;Rmin9^Hi)U}n5%2A3!aAsfB9&osN=1%x&dn%{c&J83qx+s zYy6L0xKb;RfCmKuk>|e4EewXft+k<>WQ6$5scY3_I?cLuRY7=N?B9pGJ!cpv)`TAK z_QzB-6kS6xQCEnI#P?no0 z>~qS869P1f_5Vt zAo~iz2}y*egX9T0LBQG1Wi4C7lSXsR>%NWSb%H$#x4R{TeCnoY9E87OJbT~QktO6NFUl?7*$v4L~S+Z zKoUdf%_B`+iscwzT^lFvOgkphE=l8?Jh`%J(CXu*GL>=BA4%`$bFQ&{(!-`ij^o9C z_!ensXo6~IMLFsdm|m{xvy=DAlOM&}>EnxxQo+U5&NwN-M_0a0#OVVdE0-CwAxuX_ z35G*}?thO8kt2)U@a*y{o)1;7TLzHR_Tzn~# z5eRSTELOOPN9T1QDpW9`@r7S-zU{Lfd@_Jn=*Ax|BV1$M1Q2y>xCk-!bjncd@1b9=4ji-?)MRo|^Ebw~l$aA%=8OyqR$E)-O4L#w1jOh+K= zN~{M{@2+qd=*=y5eT`0cT!RV>B$UMC(?!I>?EU{=MsEQD4W9WwAax1tCz;3=c$#A$ z4DKi`c9Wm`jk!LXiHmJx<{xTB^A$!QrE*O8dFLP>3!Un{!&t>F1c?`dpZF=uzt&pP ziPCEGwj6D+yK7d5J&ZQ{mDN*0I@0l-Sj(`{-ZMM_Gm7DB$WRv#H(jA<=QAvzz zc`9!sYP6Pdy5h}w)w78dvOI8rZx$!4G+-w$dcU)Jdq*~Fm=$-dHiis6-X{0x8ScG? zCT?j<;ohyK*ayqaYNl0p1q!F%kY@_qZ2Wl&b>nuVz0Oq#EOFt~aYYJ}X4*|m?n;%T z_b79H*`t%|nwpUq69msvz)|^<&L|9Oa<-0HW(jO11L1xak+4j6FSag<6@=b|wC_qN zXSCg!tABknoHJ{GT<(;82`W(GXBqxh)JXA;KAcLnpQ|n~dl7^y2Vb|66V+;VDwh^u zT!N^N%$6d?X7$oMlEra0_ia^S^C(>4 zCbXr9at#Y{`r_GQVTs%3B$Ul0Hii{^G*76`nnC{pxQQPR^XWI$oPa6Zn3G^s|{N^saVG7;3 z{|pmwxc3N|_h6ichrq)Up^DH_vL?)gPo;Babrz-yTwwE^8ZL7j>h}0?-3{BSRp)&J zb8(!vsEx9X?1YdTQ_w7MMy|9ERQ?v_b&be&(~*INxqJueow_+~WqkE=uhk)Wp>3iu zBtVXlnBQO^bmLKE?es7G(@HME zs{~OE6r?<|etw&=VHrhu@E;PTUdr`|m6P0!g%ijf=}5lwKMTij$GRwy=~X#F)}0uz zO1(h|l+k16SZktN`lR|j*c z82Xct*xR@`IXl%;lNv+wsj52_W{m!;_&-bUTS}NIZUy?p{h)CDn7H(F-RTJuVaZEx)Lh?lq7JaqITA81AP2HwB0!2z zOr%CNb6Zm#$<*Bb$CE_9|0YJ!-c zBW51Xc5HAc^zwN{O83q?3m1U|@vS@3_ZhPrq)^kS;#;r}r5@tx-z97uYy5pHU~&@j zvFgzFAT#-2(wD&A1Aer4_T-my)D)UO%zVcwybWFS%({^n>19Gsc#uc7kD|@9#BJ|2 z_Zv;MuJ*ofUH?#cIG%rmSD`Y*>E{p7_?(;~q^EvFE-W>tj1!rp^Q%nTAcb>MA3n7* z_D$%LFI^DObt{gBS576ZT5|akt&QKsGZGm27sB}5m(@B~XqBUfvMj=_^Yd5|y=8>kwtlC96Nqa(Nbsz^@Z^j6R|MFL#(CW9;TPZb%^pgXd)@u5 zqHeG;=tWwZwBp_(0Eqx)`*d`i_<+veI#invhe=eSx1mCf3ZA0dWU6o3qvY#&M%T=w zR6rE~h41+ipE!A#EwQKIQ<&cL9M~R`WU;(^= zX)C%vbDvst8Mqoz>(na)c-_{(^B-Usw(z_V`clM%{a=m z`|qR5Ai8)Do~>1|Wmm^9@vzofRd_IFLqJHg7(62WzOP zw5i~~=W9E5l$K>lI_cJG_dQrXp8UpsLoboVVb=}PO#|F26)LO0Jk0FX5Jger$35^J zFL2&Wf~DhTLs3xZ5><7a@IHYf!LQ6OfEO6u9;OdOwPJ7#mRwBZ@r4bea$U*?bOW-c z$FIoOpBg5UXWR$q?5Zm{2#zMvsZ&C?Iu~tPK@PZv>IyBV1+_`iE2n5$x;0!+G^Otu zBu&+bZdZ4n!Sdd7vh(||>)fSC7w|XYA`-*NW5u3-gyW1f zO+>+VhQR`8Y#T#LK1w_)3O1zuU*L0H+Q~>Mi869!(lFKUPcxw0b+tN{LB~=VzX(AkmPn*svj3E%Ee4fzR+Qy< za1}(eGpDt2U=@xFz{Hm@H_nq`1$%X8giXi4CJB*m%D>L*QOYVADzvOrHD5K6o#@k( z7#Z$SZr9r*DiECw?b}s(ST%PBb^i= z6%~D3B+hEHHZ%4<2l_RL7*#|@pZ2=KUOOHB3CjDa1LkBOD-kKGoK91hS>7# zpjY1;PbO` zXYi2dMcK{6mul3`43q?uR7XXZTij!)=uz^LIePGjwz7ib0tz*Jfe4;E& zwG0rlNsy~?L|L-1KC={`(Bj53tRcoe$!DkDd>n#Di2*qu@i4*Vjk|*s_$ui^i1P8^ z5@6skxKI%GHv(T8zhd0Gkdtq|mlk*QDotf*P!Tu)?Oj@c$#;x4tvG%b=2_NU>$q_a&GV-JE|ODItj4f-RJ*nbv}t2NNWecQ+QcQl<1vJCu_ zcUxJAXU85x)qp2m{hXR%z`phAtXCSInuR`UFp{F(;5oKw+-@Uv6onozf-DSUN{LJza3-VPi@voi zCH6AMc{>gs%`tKJO$f{|$1dB~Er$Oxoa9~yV*sQlxS`}zNIL5%vD{#QEnt@B;x8g# z&!*v((}5MKVJDlLxG`?d)Go~!9tDH%XLozg%{c8-dOy6jF!OlEoQ{6!RwCu)%6Jh| zQ?nPe5-7{S4bd?U!~@+tuZ?3)o;{{}L}`D*_@W0F8}hE)k4y@aFTg^NW>BU(PZ8jm zpY?qEDQi|N5u*g%FoK${%%Qf6?G7DTm3Al4jlzwn8Ju(iugHiVbiWAJJ?pq80`O;+ z{GVcz!g5b+Qc?|2gD>Uw^G=}pe-Ehm$?(WBsjtn{uf6pmI|U2J^9g)Pu!UC>lYzsz z{n-rszc0R;i~Z?U7ac$?zyurnbp5~V@g-THgjP1Naybn2!1T@oG@tFYz*m~nA`-zM z9>Dzeck4+QL0@!6-X?X3aehK8jgC|B$6j1_gnjJ%4$!yP6Id8i2z!2?N;eS`&MdmY zd%+a;MBtTCj#GWqdq}seJH@5sdinn)T7d6ZgZQRJQd{Y2{WO14}Xt%v&rLNCY<&}GKgI&H$UXU8Do(yXO@|Qc>=)BXW zTym>w+_t6WKcGxzK!Zd+372h9#&gRxJjdOb2Zw?saWu-$@p^Za3sWUTL&t44=7@a^yL)=^VfRD&p$>Fn)jhM{irr#1 zWb4UOo^W1TiF^QBmrO97l53+1ZLT3YlnOCMJecp&?<2PC6~~`mwZ+5B^?vjrA^e+C zJH^J!H8^G0!?@Y4;wjUzo zL@I45B9b&ANDZ+YEOOEb-52+lN{m3h$S%erzmlt6Cf!x^XHl_JT=^PX-WXB-op&RD zDTs8vRd@V3r=us8uIv_MJ^%4#z8t`)vPlaEYQs{Omme`MAUJT zV7T6ac3Y?bm$?@veSdtHnEnYo)Tjo|7lRO!PupEN!QSqY4V0brHoTf<>(>#oz#khi zNIQx?SIgwPkUM&2`_N5#T{}&o)mZ1Iu(GGfU=F0cGr~S zmLnx)ODJd6x`^dD$&q*{75kI%P#&GlgQUDD@sCilI zlSqhl;W4U#e-bs|*$wD3l_W9Z;t@L2QeUZSWEe$dZxw17+yM8iEJ_V!CC{weoeVIn51(|oHP z?Tm)0>LlRPvUjD0C#;xs`9!&^G1EdpQqRIUA!D=)9v96it3Oa8EM4meaxB+49BTH^ zk_lH5oA*v%MkNwwvU+miQBC1`yJt5#eYY;(nK_U$A+(>NSAFt|BxiECncc{#UP&fp zPih-bZo?Ms7N69#(iR`lg><)oB95wps&^Haf#zmY%f;|{?=+&@XQ~QZN6LqYLfmw+4*M_?%gnsjm{ z%_1w;+D2~Tx57y@1 zDXvlx3rWR<`hDz*!!sVegTGHo=j}x4mSkcFd6(dcY8^q1d>-5 z|BX2uIh#NJ>EJA1pXSkNWLrsa(j{_ag6YP8O;F@m>G)7nld31#O<*GM09zoFFK)dc ziW%U!#Iumoc0MA&$9)Vcos0z#dgj^x2pX@2%y|ay^oy>$Zk<%fi~y4(Q?qAE-#eW> zT6HbD5DZJwucu^@Q<)=i3EDq5ajsk~s~v)_+$hhr7F{J_eI%bK%Bp18tqc7r*J+^a zeSQEIlSOGr9n~hQfutSKv0Jd99*$@P`QuXE_^#?&{_ znZTrl_WSX|Mawr8w}w~JYbRpxw+5l*{>0xddqOn0B%o(Kioa`9)J@YxFMdTwaw&yQWm5%`!T=7Bi8Jv5jtm9m`2(y_3h zZ2=S49$mBUm_5uNk*%WV-sItFG;y^q4|vYK19Io5PYW1|S6cAkG~S_lQ2E!3>nJ9c0#iqHN- z11-cdQte+t`KE%BrHiRgkTs3&w{!W*PASA+8D_FlB|(s*ON_PieZ1kZ)2451#f(cU zm7+UFiPM!GC{%15g9m~Qi24(-kvV5OO9^;#A-GRg`I+)-A*}Qye_VIM%OB*@frQ(@ zhMu1TjC|hIIQd^}4K$ROy`E{Y-Z{#uG~poZ%+k^tmMpVrq9n0ZyrpXQc-{>V4F_av z<*LEIVAQ#4-`{l$^rU2wG~MXagaQcndk{yl0th0@Ky8sf8L3g;tXx!S^_H3eUN4C@ zHNw1UXq0U|bBQBhR)1f74^?WpT>j!sD+sHmEC(zSR`$Ikn>F-a?ctj%>}WwROlvgi z5^BxzuRtKsJD~hMn$1W&b)`NLh3thqlUx%RFVF#b+Z5V_jOr;SMd<~hPo(9T@g%NW ztmcnUpAS<~ZG)A&dkNBgEkqHPjIsdW!*TkI4f+1%_cCvnM*3WUB2p3Rgela$54Uf8 zHvH!zNPPClv^{cU6l7au;tc;+AV(iwTY*X=nj=i6$ns<=u@NJA^MDtkZO~VMlbDC{ zXAW-qa6mQkt1p$pr4eoRrG}?|Bg3 z9@r3Kx#`Z(eO_0>M47;(TXISePFTOKJpL&fp{>aq$B!obE{X<9w`iaE7OpzJ`>Xrz zIi~>#(8hd_E~MDblb=q94?LlWL$}{d87alA;+DcIR=>qw^zQ^Sm zqK+T&G#d!c47M9TOJn!dXki6WYe|R1a13e%A2pPI=-Y8I6dZt%fxtDKp;iVjNO}W;>J|Wc7K?9=;Kq z8S?l}3%4;q3Z5}3v-|Oyh6LH^&Iq(g>}bJ%DTm8I{M?@$#+;3jLi?q`I1XJ`F(WiTdvM;2V4Uddeo(|k#;64 zaf%UhUXB24GzEsEX%#)j^O=opvMhqm85j_^a?2 zqq)G8g90LB{#HnxA}i~ApPXH5#2S7VgR2kVODaw&wEOcmBHE+t0MxoLRfpDHHY3s> zMkA1%qrJujpva_tr>*1HB+Wb*8W$||lcvf+_eAEQM*s3s9)WB{3%&aF-yjs}N4kU9 zC$+ARb>X7jeLny+s(vl^gA2RCYGK5y~5oGBrs_#`opAQry%fP zoH>JYf0JJi^BnM{^jWa_sU-jjY6B|XlXXTJ4$rkO9)L|khxcQWfznmKLo=zPR<>%A zjLhemY|EX^_RM5 z-es7zg}joT!4SOhkpwP^ee=PshS`7=#dbX{xu(mSab1CsrBR8Mt)N0s1+N^0`bs1+ z%AA8N0mQ93Kw!R87yQ~{i*+3QxttDq>Z)gp$@a2>6+4@46@La9QQ@>CKjq~l6bqGKBI-=u=nB1mx(>wpshpcG#YMPYYnbgd`97UGgjLP3c1|^R|)y z0q#9?7&N0K_IH+kXMZT5{_ofsP-x4@mgeguOHB3)qsy>_Ei&Da6uxynTv#zm+NGz= zcf@8x>g+%3W(rv`7(55rx>V1aFEvvbcQYb7-X zY737m_NF)9c3ax((#42>R{EGe9r8I;nkuf0@af!z=AP~~cNs<^vR^d?Hjx!|3n zNs|D(ePppVgu8v~fZ+_P#oK$Fl*J4Ag9&LW`D3Z@udkvl?Vetgad{GA(JGr6Zpa=9 z&_DSYtSUJ3P>gbPe+2hbC3AoB0t(VK4MP($6cm^xl=##mm$^a%S?eWaB7(A$&FTMW z0J$EGdUNaTLPW0*0Kcl)pgT&u?0>VxV+C?=M@o~N7F$$FP@T-~Ek{UPu4x>bMy6l7 zfyId9d(bKrylmvIwPNR_5zRAS!Z@B&CX6D{JH(eAQIhATJa7!&`;&yhah;4kSpB$7#oy5Js*$ww@hHj$n9*nV+e35f zGs{JCGR~zdS)kg^n8&9Qs-?nudESt2ba4TNm>O>P<831I0uZ_TS|9wV7qJSq#K`yO zN9N=3J~`aFGm0G>w`G+>-{@n2kTmiDc(V?aOI#o-o8#bs_f|#_P^T{u}igh<2yjkE!guf(s9cxI* zTX^)Wglo9iQi40gY$Aryi)sN@$VOxMT zJlV+Mm`^z|0Xn8W5+tPo2B77+3U$XUccOnq@wsk}KFr>82IQ6e@keMM5s{BWdaTuJ zJQxptjs0Mkl*YOjvuzP$snK(;J@2@!@N}l{@n>SzqWj3;qI6LAs0Mx6BKDc*gEkdW zJ@O)+|0)?et*|Zx{Nenu?I0kfS3TCkxxvBF#%q3rGV`<+rJcScFmeZwOVPG$ZzP2? zFs39m!M}t49T32QhXf7nYl*^gVSdHQG``;o4%~D*poTts%b*P4v_!hk`D&#i$5i~7 z(KXJHhn*+9vL4jq3e{+@n&}Kmzo0}WZ(Af&*9VhDLRgrZZa%Iv%QmI$a^j$X20D#pxQ`geNR}wK zE)?r<-{@xz7gb~3%Hdc5`y;{+D1Z=?MjtyJsBoHi`$6~b&E2O|2;J9lnrSx~HeJ2R zR9I<`3lT~yb#&wJ)}>8Z=9cN*3RWNH{{#pTHUKx;18el5uD1p7OYTVqP3i1zL)nMo zKlGK4_)p?=@OFN){j2|ysmjMSLzlC*M+ZIc^aC$l8F_K5P{}U}tG0S!{FOb5Qgk}g zJB~`gVh9u_Q}En3u1|RREu*bhOUAQEY*iiQS7wR~^u{({_-7@KrhDBfw7(bgFT#6s zBMv$Kv5TG}=Yi;Ua0pCL->{UkfBCs;eSN9NeIjcp2TK4Y7ZZrCc?0HDH&49Gm}PMJ z=Gg$VNfB=LfeaHU@O)_}Mv^Y&1#ma*&5ITk`_Q9P>M{&a)ZsrQV{dP-qN(L!s~oG5 z696Bbp-my8P+ACPPZlMsJTqCQbZ9^TFxw$Xca+|bI4s`@y}FE(aI#%BiUnM>4=xRQ zn}$@6d<;83GlUrOccqQ@YI+T=lUlJG)j@ckJq$tL54R9ZFHGb#)1bmlcMiWFmCo%$ z#|6aaO-PlNBhap`>UXP_*4EEC@1)1P%!bIb^tj~0Rp<#f(hhp<6ZUX&*LKJI^?0-! z`9?1b+43#-_ckP^I){`GUtm+S*UhBls~QRhGd|QhSw#>}bIM7$ znkd0BCd5=iFk6I@LI9T|eMZXk*6Fp^iZNhdDHI>9s@tEkt)8tq+?Jr>%#}kLo0G@T zsdtf6(s)i(jZ~Kx8q6GrrFiq;Duj|}iB`^A+1CwW;V)uSd^3rY_S>h0zHYzroNMB| z&@Zw@(w~0PAbFtO4>=gcwz-wUcJBregpvBDT?76iOa`@OU`Z*Jdtf--zrKA(+>^m)zMtAj6d1MUSOJpYV;F?twmsfJ#y967kyf;@JglnJiCW7KbCLR* z)?GQfvY&L}pDo=$!416ymt?V$!Sy zO~e33RZ^2R|1(ECr9dJR)5~igc^v7RS-*FyLMw`+FQXbp*)mW$qvCRwj1p7;7h;ne zKaG8obG%kbj2f)*b}|`ZOo&X#IpjC|qA?4Vdrk)*qb`7)M}Ym5zj9ux`mW~O>;T=} z9@0mZf=ZW9x|-e+K1_sl8R7DWo~QJ}1asAY&rH`0E-OQYoS>&pNr=2Njz6V=vOgUP24Vq$ET z{0I-^<*MPGUj4RuMq~V4z>EC?jQalD0cn5xw5W&A-(=#n`(I|ID>wD$*X@<0$Nzqu zpqnKWCQ54Ft>Sd#37Wr!!)ORgUIyw_bX*b|JiSn=4|MS}Gc8im(1$%58WhKvSqjMG zgoErbU>Qk7SH7ui&+wWgv#)-cyy=3B(?_uE?26*>PW#bG<=5Ni@tt4NotahP!0((; zHXOO^qlMB|_;j~?GRn5zGKNW^p1B_5%?e1C-TZxhNzBnFYkDCAFkUij_;Edh03R$@q{ z69f0I_nV-)AtsyLJkQ0x*04V@#oD&U?Z9S{HH6O9p~Z_p~Ay8vlb zSWDsLxw;h}M90R904T0kqVSq#w>N%=P4I13v2*aln2TC1XCp?O>ns!H&ONyf^dB6FCaKszt8|0MZF6H0@*K@q;p^y`O$4B6orUk@d9jxlPZk}`Q)KEV$ z!AMmHumehHI%3UVD8P#Agi9eN;OC zNTo1rL_!ZNXB;UBqzFo5KD<+%FeYs^)4T4Y7$3nUzW{2g}@@{KV33W|Tac5xNEu%6RH zj8-SgjR$Txo%g+FK$SQKMkP830E#rHX^4i2mERyJ0rfl4YoE^KK^tuDh=Gl}gX+cP z+{met=D3VJFNGo?bk3|($WhxJLRWo>48Z@!c@b+qcpNI`L5CRvxb%3FAH~X&s zzO>PI=hfwE8YxImwPbW7?!VOH4*nM~qtZ`#VZhiM{-C&W>9;Pw8Mk?V`e+iW^<6;H zrMyF!DVRZM476oBr~tZmKB~RavvT8tDumC*tBv6abWN!7Wc$wA+^jW`>%^OI@ZIL^u4rEdC@~Tc&=$S=D>VW3un`$|LwW{ z)dtpuWr=I^&$ne-5nFIhq;w#Ki3gaw9DUiDS}$SKVP}oN{o51#!BKJfpH5Fj95T!(MTFvE;d2bi^E9mv z?cwvf;{!oGb5UStO{V7N1T?iH&B@;pPt+%fctY|%xAChn-Q2P2hp?Dyx^L*Z=5x3? zQcz$2XNu)hg}X9Y2kZaN@?5IiHp-coR@x)XwN`%zcSdymDpYlYf*N-q7fa97XM+u} zbl`-KUgR;Wk*<+>XjhqKf$&r(UOkFW2nZaD|C>=&rJuxi_>W68Cvz_0{l*DH*^q^A z5ZG%*@6zFh!>oilhf-2R+Eqr5DhVgVwv0sJ&t(RU(Lkc*)Jy)p44o0g31&^D4xA1G z)_x7IQAU@W8WyTqB#~1tN#?x7W(ZNMEDdG8>=}$#wN9Lm_s}-IM9Z9J&7&cXU*jS5 zVlmvG0H3oDL1x}Jqig;Mv&Ore--;K!L4?idBq&;p4$w%6?yl~f(GmMCRa7rFT8UcD7++^$7Ni2&0QsME-kYXRUz8Gj)M95rE|X-r>nCDKG_E`0$Ak8q z#xbA6pJaU#SB3sk;9YhMJTd9mfRMB!*$-ZoiO!{I0)Eb{?+h6xLOB!sL8hAGp9!KT z1nle|6}Ge97+R6IT?c4tnbnERT;|(V`GPlWr`qQ|BYFSrTE}O9OYMJ%&w-fLsf@mZZ5r z5@J3DyC;a?LOvSrVGFoR-~lbRBT^|8k1aB}4+wcMHAzOHr9*lmaP5OV|EGCPSvS?Q zbBMZunz>{fc&wfQF$Ni{wI4Z@9drz-lGCF$-Tj65hB>nW4bh_G@Ad?I!NcWM%;~ke zP87$V$&#W3S-&rf*9gBO04pcba8;=t(Az!+uEV&`F~KcKIsyZQxS#q`7@fdZNqq#V zrZImrx3?TqEIs(z$Hxg9p$pngkmId(^?PZyA=Ku%7J&15UqM2POc;(rq5R|Kr z_LZ^Ta;l~f=RrEb0i#R|ptcLR@Tks-48Oc7z~oH%-82;7kD*Jm|CkR-xpTs(4|{-PU;i3~9AJIgj-*F~@iQ_IQfD8o6=<N4X^1qJ)TR^zg%EYMu&}})4jFqG|Di2YqLb|u2U>>m@K4YMg)-Vb{68c~F zo8S4<37^9JI1Fvc3gX}kj@YsWdj^Aji>ffu)-1-SG#Uz)kY{@P+sDCDeD0*xr1sC` z>0jS{G!TnNLDL^}KK1yLau?o1>?`Zyh^wW}(Y5Jc7ZV;@GIEjIpYL06~&*wn+K;5t>z4XqJB?7$ph1Q(H0lITio_M=_vQ9q|_0IO$jYp^meUZGM z6y~rgr5!^UF+-$2H|Bu4``@o>CO_drdv0!hab*U_HM~SQ z!Q?hkRDjn(1EPUpL~|c20F1Ik!p2qK2*+IXr>ViUjbgHx2Q*F|ekuhX6X9xSAe!KS zM=4+COWo`V+7YrC=?u#lUFjbnQz1dBg1qqnlGua;0f(_E5{$lKWQ>Qe#-!myhoDOK z1Ey4a@1Nd{;~l3UVeLVEse32dfy(s@6sTZ+=v;qYWSNCH1|k-MXZx(U+{o|KIeoQ}VC zzL%)+C<1!DGpb2LU2NXMf~%f4)BiPt)YhhEhqv#;CRVPc=6-ZW+>et$Xk$&8mrZy# zt?c>>&SP8s70F5vc*JOARpx9^t%9@$(s0T^$r*{7DXuPFJuutV6<(hrOJ)D5Yw{zQ zf6c}kFfrd#Z_$q0#-0}C>{^^X-M)Vn@pB=ATIWPRd}^OZpXDJX=I@9|RMV*UQpFU< zA2vOhk1k$hU`Z@G5%;*aZMMnSzAUfw_!O^zkU`=^r_ej&LQlPL$s=~!x=F&V(Xt#7 z^rT3^4^E@m(fajrEdwAGXU!Z`1(wB(g49)@&K?BZ7zYjB}2mb%dsCgV)Uav29Z}%GH}0SDrRdO)T1@`PBb+ z;q=a9`SZzaK6|hh3}MMWQiXUb87S2aZ4w74x<_;-6Wyw-lG~(LV_Q!@z%VhdP^=UqD%}J1i?u$y8r;ET5U)qb~ zI!M#MTP?k(yM`MOR^bWQa+D1KUK(NHmod!?rsIfFh*+CxiRP^X4F=lEK%%AK#P~GC zDUm(<+^U5?hZ}ww=ztoc>ZK)Rx%b_NoMLKHviA@NhEE%R7Ndl%Y#BsHiw){5R!*i_ za++$$k9-n!if<>^$3e_C?G0iY#O>>tOCkmzf{ z0ky;&O04DD54&gMglp^*sTHfzOpn)0ZL7dJY?pvE2M?@qO?@zJG*b{G8bY>Ab}4CL z;80I8+FcaZ*MDTHvG$Z|06O}|hvOzv5xrm?^MHbOafPAYXo)*OD3`o^q&YAlok*H^ zQouJd3rkpQ?eR5>HN9<2StCZseeS-lbB%n$(*u@^Pa6>f^&NOl^>zT=9j{l)n|hdL z+~$W7fWIQzuWp!WWa1`z3jv@6Rc$AjcuA0D`qF|0B#L)?b9FghWXvY@DX8If7L4yX z10+F>Lku*)5@8WDBfF!qmIk5Q{ zJ@z`*ry@Z?2m{0|Mi+`v*sntGvUKsSt*Xe4l}=#u3~3+SZ@V5BLIk&QJ*<9@;nURP z&eqaTfD31Ryuud&*Ee5Ep4F1MjvZ>41KG3kK4tRs;=2X}@JC~7W}7|f)QAsHdjV4s z1UF6r6RC{iQ zLFnH0x@N4W80);X;!D1U+sHyo)k=x`~>s5)nqDH|y%rXGgpwIj;s8yl- z;(ci#;xw5rTYfhgM!$|yWO|J=wOHV5;Au4$FS&ByDtGq&U6_CEiIAf=$u9~9v6pCM zq9!o}Vdt4wYty;oM&z_X?|6#dB}kw|%>V;q8V>-)x=Bxmow^I9HGpP8M0Rx0Z2g2M z;-#E717RqV$Q2~SGB`q| z6~>>PzmqKkNni_-Z+&E#F~m=CMqJoQH7mdr^=;4kA^-z+h2^wG+DvSe{?R`+;(O|g z#^5I9-V!sw`8D=y5hZuAp2Cc0xs0-bVsu48D~!{%U|PF7n6hS_R-coVi*JoiEQ)+{ zfsWBdgu+D*5wQT`A~g;ml=#qRuN9rwG;ZP)T9*M3F|l)h?o-I`poU4tpo54kWQ%>= z0*iuZTy%w`OB46-#Sh8V8C=~A-iI~uLgtez1_vzszy4b7UEI;UFOy9VqB~!G!1Im zU_;o>aonQZb%4ZA-XHp2G&V{C%!xr|sjoF<@iY{g$l`3gggJ?0L*>3Zl)9+4->}iZ zg1zt_E!9*s`H=uIg+cn9k|1hC9JF)@MvzgR4^`+L*xq_mL*99#H52@PdIXtt&%3n} zb@~;sq_=YHR1V3Fa$&h#Eekao_hl!SI7q&1WyuWi;X>H_oMN0WFT>(i=Scrc-nr5| z6x0fYqD>o6t#@CcOwpCK69y(Q>=kjOP`ft1#UG^!616vqYY0cp>-Yeui}um5TlAHt zHx2hb;l{C~=#dMefdyua!KksqCDyo=*agayQZV&HzHagm9; zB2ULzlbdP%t~Ulm@FmJn@8_m%gP6sd;OSFWC;WrdUDa#=_Zz97WSLKgxuPZh$cK?@ z_rRNd=2q`2IS(=kbaRtXIhre@%s30j%BS0 z5vFK#i@FLAkRWA`B9&YF%uV=9MGXX3F}HlFTYsA#ZF`GNOB=uYU&sgf_ihyA-5$JB z$>Umw>J0mMgU0MLAVAFZ`+j4sX0L5(J4ydn%{yu!Ls*3$U_%f27m%<4U5dH1iV36s z#mkJqb#M{087yllLW(xP=$;L5dg=)43X@yk+rOw7MQq%Q;}6mbMol>#GK`00%J;hP zwqu!e6i1qzmTFkE7|k+|{#q{hZ&vfq{dgEmXud3f6N3W#`15bMS|O0f;ZEG#^V zVWBz}8$D3!Ajcf{f4uzlS;o^8S3if-ViXLd7j`vK{#pG3;w0rMpNrJIFN8|ip)@sr z-*!e+JhHEu#543smtU8X3(GO8S*k1+8#Hat+xNDd^fu7cwwp;YLN9Jf=x9i{&bTFv zVZdB!t7Q{cM5azi8P%^HW!T4_$NO{ZH`80M6j#DnC50H(E7`ZS(0VqKyK*zi)TD)+ z^HMo#JBxJ*&xM7w>r`Pnr65zmB@J31IFU{{ywCBGSHZd8*;@qRWsE~G!XXc*=p~8} z(RGT$Y(K|({&R_2{=|2kLc7M_uP(-l2+>IBmq`dZm6EcaGM{wI9)?8sU#;u_@G4Z= zB9|%gJo{N;L_-;hwDr0ACib@t+)k{-_vN2|PE@}eZlt5c*J_D0BDaqk-dFCeq-a5b?zi4hl3;)<9mNpInD!0ZJMG11|fc3cfCVxc8EI?{Vi$w9txeHJra`6lzCB$M@a8uwGCkP!DwKN-Ag zWlZnGyZK@7H&7)OKG5O|NjBLjg-uwE8HgiJfko&bZ%c2xVTyhMy!)U=?eW^sd+X`h zKYCTMH~U2Uw(!Gg7@7%d7yAZ7)jlI4N<)h-m+_I9!DBRnsTWc}0%M`6kbYIk!QhU{7kIo8A0+N@!AQP!78+g8J-dm;NvY7d}n3mc(D*@Wfs=m=>s+`LKmEQz= zl8m?(U$)pAmKCWG2sqXZrpsMpx{~XumVgA{dmcvSS9EwXShbYIZ&lld9a>H{ zFTw9+So=lJHUT|>aDPzA!ZVy(tHd>GAvmLAbuP{)R+p`6KS0Sk<6jL{bQi|idgA20 zVSP<9U}X?_3oR}L@`&C8%L01egPMaQ76VH~5gE#v z+ux$TIniHiB*WQ}ku~j*&Drb)4jtN`2>LVb|9%7ZA@ySWDIPOoF{!QwHmgfJKz?O5 z=Uj`e6khjgdAp*}h3NvtUHquC3ypREW3ku?!Tigx(a@=F;*PXq=xG48xG(wEyJXq7 zOorY}2bV^@>VEi&AwsPBoFo@{N_!9#` zA|C`l#43!g!BFKp>O$P?;xO$QTnH2I(p^e#(297J3AoOpD{T&{B0hA!NJ<4$Omezuh62PaxIGIrv zk>xD=rcEJ=JElFs_;iq^uKj;%@6nhJQo^FH4(#YczZ{g;+?PZp;xcXwqy%n@u$&?p z4P)XcKP>!Pt%GU@(vp%9WxYW{cU-1&+RLY>MnGkaPZ!7U|b#<7#LSaWa?>QqK+1t@R+_Ey;&x#mX%*v!Np> z{*c)tyE?{jB?_g2Vc&e`;YA@CDG06$4{=Zbpcj;znwS4J?vL<*o%2W_4oq!ogAFR` zO{ww1)(69quUBj1*=to9ien5lUHMi~oc=#$%&>1g6vW^W3H z4LOCJb1luk)dWkGZF>^oMC-ENhvDS;&T}E{W4G$|L|w#H&$g=Y2z>*NIfwJ%cgGwI zH@46dd(ePo<~{GumPqm+oT1fsQNjQAEh2#@jhFHt+5GKZZ7ygq=PI9O76hEE6v7TJEX;2+7vr_SG6RFF=P(5Xe1IHRst0jRa~qe2um`WwJGiubq$Y; z%+m&#pK&SU1f~}T2Z}+EX&*e2jh*)8b(I``6w_^b#v3oLF}4W*&_hW@H%n+OtAYI` zzPJ})Nb$&3-w&J;Ktm_EzHe>bM4GFa{^Gv|tNEDcv!5R>aoH3hU>O?lf=OR#slY_= z?kmY1W@$U*jW_T(s4)x?W=fYAUi#y?eR5R{G0~H^o8WRtMXK6mK%xry6s2iu7WxWb zXToj8I|tAm-Rhof92)YLe;qHo#vL}}a$iYHc@9`KVtcfbT-s zQ`4qfWZ3Us6XPL4XwC>S%A(pID{b8s08keTxc0n{cl{um1DOFme_20&6HY=1ZhyjJ zb9iDDFwY;Ndf>4&OUh5mqUlU&@f#RP+ptuWARMDeWCDFJ?GDK~CVIfSj)wi%cB_61 z(TU7u&_bIuzzOw+(tHN*=sF}Kn{Ph3vNj%Z<&Nx!IQDfrz00z6`VFjw$69Q4LoteP zudn&AQ+{xCCDOZ2RA9NFxf*ax3)S@dlBVE)chSo>%g8#D_*H@(G3Jyd>Il*kQz|Cvp6d2ZMib^%y&o;^wC0xp?9j z2(v{8g*}VY^xZVJWKu;ym!dwLDEDojca5vcl#@TQyJ}okX7T?@#37P3IQ83!N~lNQ z+g;pjLwOc8`i!y%fSLXflsY26iIwT}C(dY1vZPx=OzO>ozRgK0Eq;HF3dNGF`BaC4 zzNS)&$%T7j*Ol|zw!OLmgi?5)bj77w-)pg#%W#n9mI&rt%fXC_kpT(DY#WT>3hl{* zi+xRzA2%-J2lfh>$N^(SI7g27FwXrXW;uH&6~qG98g*`H<^Pzw>`g0B21O>AwC!6H zxs}^e^3VC-p+pBj{nVhX&@GY=pUqGj7xmDvi4?*xdS#dU-+sqjsz;ryqGQZSruK)f zJp)Wpq*KjRrcT74mc`f$fD|OXchO-5vC>Op$n4g<97M*Hwmi*rx+c_zrApR4g$nd} zSJt1on73__HLw#>0}Y&K%Qazhd1c^1JP5w>aZ9rIf2phxxI8@_BGFEzUA>dO6MKhh z$^-Z@SLhb`#6J&-z{Ub2B!0&*?obiSKH~f>QnMz}cJcvxpbd7X+0lccIpa950x4%M zwxH$2Hmi)~DyXb90?red_VUPaWPaj3%(&)>rsA`irn3`lP*zz&Ogvd43M=two&XZy zSj~@6;bH;QEP7c{EV%Va+NShxfF&d=j@7HBuuaU6G$@ESNu1i?M03CZ0Qee_wQM=U zZ9_WQjH}{x< zH-7NeBJ#OMXD{9W3K+z%Ou`I6!7Hl62yTtz zpv(tWhfDBX4ZYXf_I7ulHh&Y{u_aLDj_tM!lrCc>n#STi)1~xLW}psJ#r4Lf%-mX> zeC0vMTUU<6(GHb{Ic#nU3Ze1_ZGbkQ_#zf_^E*`5{}J>vZHFPdLiC3@xXRUIBSxd1 z@IFNH$VCSjVk~_isLHDc6kCt?fAB!&L7KS{vN|bc`33j?MTmT|>F?eK&Un$wG?6-P zyCMhLA61BZ*@%_69hXQj$ri96Z?CTXnJydaB^B5Ftjov?m$+tIKI3&6)#T^;^{s0+ z9=WTt-z7pbsY2PFPk=+qHrPGseiBV|9}eckL5bVN)ydx(-1lZUgvl#F=l4m(g(XF4 zq#MqvDnCvrCJ5ui#K!x=X<62@Z-P4iee6k6)&)t66tVfpDY=@i_1&C53{6z zPyEIy5K=5h0b&T#<4-^=THl_UwN;Xo!9@2Qxi;ZSCc%m$mKC1#9{rzqifuwA^2 zr9s*ln=_&;j`&ZH97BS9YQbrahJaD9&R&iS(U|ACQ+S1xP`DdpQ88gGx)ScKwm7Hu zQfZv=J7&|^I&LQE#xHpfSv1S0TkqdwxalO-St5XPDXjDR_-yGgWjg9%UX}z~C;$i0 zk=CcM5j;HTLiUcEjR`?3Adz+QQ_yfQ)I5cWdm?9LOA-l-T-M&#f%>!=e6o@!YrPX{ zI!msQMYziGKf7b1zObM7J%hxub;{&}+b%~OyNX|z4B(ddbfwFvwrfdb4m@RR=mQ;? z%;*NZDatCc+b1&Mgs95MUryYTU3$!%_^^&aU$`mPJC|l;_F9S0`638Z(HO|v1UwBa z*dNWA^Is7w=)RqDz7f+t(0cLU$O-Wkak|S>Fv;29MGCK5jME14HP}I1Ya)6eQ&;|P zLHPl|qkh=EX=V|YDuqg(jVy$o&0vBnkA|Dd%moT~*3Egxijc3W%J&G~Op2``?_npY zxpjm7deB%1p+Y_bg?ey@S>J4@g)S#D*k)vc$n?SUjr^y2^?pCM}jf{Co>$>AB z5tW=Oxy}_yWyuoR*$&?Jh%LTzJTnC@!(3%F^*zNMZUUz}QC+2=`|#ysXOqGO#WOV# zCkFE+Q<3wJyrN&H@hRos3hwhob)^RlS-=nkkSr^Pm9wBsxd@;EvB2?c#lN>I4D9$k z*gGkNtjiEDf%|6;@F$|0 zEmVV6FWYkLXuvc@XEGl_o`#F5337tz_TE){L@Xz6%Cp@XCAod?O?`USa2K!#dHtYB z{7g3wkFwz6ml=&srZI!TEMm5EjzAYBfbgVc-W;IpzpXaqVaRw}|7yFGD(ARo<(mh&WxYxllmgF*Wnd7KFfj3HOa^Z9WP!W z4du?JnrZJSl7LkWCxiN&Cgu{-v=ObRJX9a4OneoGHrJ zPBRABIfD0NV)#k>NQ344Qgwl=Y}!)jer z;GE0{CbW3N^E{wMK;@2N8#)v#!LGl1**KGS>$MhTrP_b9UeEFW1bAmMXF-( z5jV&9%F%Y-5@V<{HMK{HY#4z%mq2)7O|QhiT?;H zF8P3@&LHXg^(muNV-_h8@@A;tC)xXWuK`lXC^bBfj&#H6Li_B-j9yj-4Cfa7Hf3lL z7~e7pqx>(5Rgc#j#xp|5)CuWd!gPBbJ(6R)^f}^>wu;;U00|wW6~$2yV>akFB(LC$ z`B^^dCxywhp(0Tm&}YI!BCidjMRqp`BGk7pgNvsVRtJMv$3Ij=R~mCh7OrjUqq}aq zJWBdL6rZ`284(X9x;Iylr69&NlrYXf0m*7^5uWDH-4MAZiiAG0f#{VS_a!2A1{ z;>vRr&a_S|PcB3yrz8gd9B7s}&DK@(kRLPS>?^8>@+n`D>MHczYDU)ZUUU@YrmD3J zokPhS&_B}e9UbAw`R$@(aqT4SPUu34D4L{>oCZSfH5Oxn#aB*ET8qIr5k8WIXsonVN=9uhdbNHtStUli-uE z-m=jX>q|YwNK2g%y(LW1aW+d$^9V9j0F6W4XWSgnbO2mcCIq@SCZD0-Wn!F8TRKGT=2SV^Ahaijw4lYYZccd=$Q-vFMavH@{Lo#QYi=l;^W$Q zaDB}mPFKz|gd(KkDOz<0=bP;FgkYTU=Ul`3?}b$n>M?T%#h|t#FN+{1G7BXX5TDQo z#9Tt<+RuhBUJ@PGE;_6d_u5cyq5*roTyUs!%hM)hUtTM5UXN)%zsb4F+*U3@oMGoO zF*6dnS>j#=^n>xrs&4_cwZWuy?r!mR}vjD(XBx!j!gz;Re+D;5$cnDxK;?#tdpjW4waTfz#X`27L{` zI?rguZA_F`_Ue!5GSpICZ3M*?gc+!>h+li%ciy4X9t3t3c{%Htx6H(0SM7Y5zmXQ! z$kJazr^THw@^&n6CW_uAO#0R9Lp0NS?KqLeg4+n@(Dp;^V`;kK?dsXn|F%ixMdsy$(}oMCK_Qwn4y(PI{kc+V)4fVXpjEU zgYUQvOXfT|1qe0LX&FuPlSZs0vXY?nOYkhApdp5KdD8U^3g}d|Qwvoa74?)Vf00s#-r$5?WqFzSejeU^Ibl(eC_Q~Q0dSQ zvFCkEJa0dI@O}`3?3VNN7UobpzLC;{Jblw%w;nWn&HQY~<}4L{FY%ua2T{+wMcY*N zJ)0?YwWa-I=E#_;xDOMWkeZLH6bwbk`tTY>8MR6*XPW8;S+X>le0XP*SQgIMS=q~E zIC^YW842)p@{DOc`@#QZvXC5l!iKW#&0n_~!E+M8d^Sd}EIqgJG>`N)j41Nc^t0X( z;-OD2BNF?VaxXj^7rBE(02ip1!>Sf!oIz5%ccEP+Ox)>7WLg`8Qo=sEgnQ`ID!*t# z+^}}n6F5HCxhMFPf4X);v-8d&6rZ#xNEdqwUnRJTe3@}-p2r5F7G@=Jvd`}PO0s^V z)p1bs?P^`Lo!78F1v&>a&B$dT9Jy$b9neS5LknXFcmBp9#C#R2L**emHQ=X-B8et# zc*J@8n6wl!nBqYGDhCZ66r|$md|9mJI=lza$1>U-uGOiT@g(P_y$OrxbaFmgQb?7$ zVUDCG&KtpPx`Np2sxR~JdW&C8n(gYYnz%xCS@U?M{j2<1aL)fZ9!nH1L#DkA3_1sQr$m z+Wys{3ZBDZF~#KS4uX!p{c7E`q*l26F5mcBWMjgp0m;jV+;E3@d1zMm3b9}=QqOt$ zvox}hz)d@4V z+_GlkIVEJhfF}@Od@!^J*K{`y6e;$JIO9P7&3&7kgPi~rvuzZ^K+iPAK(yZ&sI_d< zT^i(|8(F>kv~4kPfE|+bx?6T;`!~FafB*{m=$3WN;JsJdKRyyjDSo{0jj1CEd^jIK zkd*l;Qgv(dWYcbwEykTgs>k}Hcc#3z#riVm;vh#e9n8}8cr(x^WqEW!np6-xuJB4j zbG;5BH=-$A{@690+mGQfVN%jDlJdRQFf@7i0Cairy&7$p)S$#}gdMzggac9!+nfZ* zq#)W0GhMQ3>~nKGfd3K77oELcK;nD3kNmfdgBk|AIarUs7e1k#YUZ!5z`Y-nUdNSA zc1&|2{OxbL93zIvQO3>HmL|N*up7z4cr%Fs1r!n8h2WN0rZu~#Q~a?{NIWD_VBpX| ziCq6pp&plJAzM4Fyym1|^@|d+! z|3VHQ)tZlp4FOo>2`MMM?Ccwh8Vd7;tmFsCJ$p6@L9H_l+~!lQ)|0tN0f9@;MzPJ`8}KUvu;u!<$P|ES@c zY@I4?W+uI4eKNA!NUFpYO1kaF@R%`dyTGBJ1HWVYKkxwtA>z5I-hLAA`~QTs5qS~l z&J-7st*NgFe`Z8@9Rp5AG@7ZL5enJ3NDPlUK>SmX+uur%?`%KKwbeOcr|_S?H2T?v z;Ch;+-O~MpmxRZ>J!h5uWAe(yyT|UfneS_)I4VIlqbCtFp!E5Gcmcu6S~vFr2g3GV ze@pK!PPbAXPc-mqf%zgv2^9Ze@cbR8@bHEO=;#emQ6Xls&Etg8t&j}z6j{?i#yXWG z0Eq5+18vp$koYGrYt`LCl1dUyFXqVfyKg`C1PHB()NpZx-vLeOV>0o4H#BG`PO`ej z0)nQ;5Sn9(!#%c}Bofyv3#YWUjbk=!VJ$88IKoE&7L$t{xh#05uWmg7CW&pn$Lp`lP?*CK#?Y z9Oi|vp&d;Ams`FQB^c$UYY4juiLclN(Oo;Bfy~rE>FUJ7QS%;^K~^k5vP+X`n+XXw zHf?R4D)S?en-n#p*acMo(NyTHBuUUTr>X>ab*t-xE&?HAM-oVOkp_~HVbVHxZXdj+ zq5fN_(RA=vG2uy*;6n1tY4o0|$(}d*1{i^)vHUW@#xM)3pIbQzMGbc`pacXWjEO10 z*Ex4*C_srCrq(PYS*0GKJ^&32<;-$B;tXRHWp$4m2C7Z$Qq;gp(nl>E;=r$|SqUEb z{v^q{P{8K-$mH_OJpX(q@$1o5B^RkBNH&|hVWyxb8m|Af;rC?JoVxRgNfi3x=DALz z!A31oz9Oftv-1lo!Sddk`5HrLk}VqU0a}An@t3 zn5r2IZ4jWt0EG}+xaY_d$n3vNc)$mp!u>_~$rS!z?=m*oA-nDPP8XI zjc!7ca7Rrj2R=6W38FQ~8PplkUHBUEo3Gu){Nl-_ilLKig4|+@YOv}{>N-r^pB?U+ zp+qB!9l+ltNlfK5C3;8V2TRhkaIvX*+nu?{wpa&!QHHhs5I0jY)6nvJjZ{`FsAr{L zPSQkOfPRh~l>*X(+v3{k6&#V&+6;PJX6cgV^t|>?n1H7UhkpMyr{L7jjzxSu!*8U&mX_U)o)KxRQFWcw>G9xUU=g{7G3>-vbdFY}cRrW6ysP$) z3#vQCS;6>HbQo%oVQ$4m5@>qoSuhvmG0i;CCzT5+p)b^cCy)6(M;5g^Q~!@y4Fi8` z7{rlvShl+9fk}(Av6cN8XTbhU{5ks*CnCBCZf$b&*7gJjFh?60I;TG>^J*4Qy<@`s z6L*Aa2Um@f6qfs$G6nRGZ`?7EeE!_qF@RYnO*m5A?|#uH4`+x~RqwVyuv6g3vuD0; zQFK>Yc~eZZmqPj#lIl!c;PHa3>_G6sv5aA!ISZ7auMy-Afx>~YhU9_L?6pon4KC*S zH5zJ_`J-LRAEBE%K>ctUhCPDxQLrY|NgC7TbGxgQbZtKB*P<9Os+~X8sbC~bQ=TaE z5QvbZBTd#=V`ya$F7xXwQOihDdT>MkXPh`z$kF|HCyfDo~RiG#Adx-irRj z#mDcRhkpols}SMu49)M%{ohOoY*2}(zG}^xQsl%&A`On2ln??x1>$vbP)6nVB~XNW z`(Xk;5vMj3-o}I2!mqJTVVecT5i+w*=Ug>>TdsqJcV@|91!a<=jPr+X5VAheb z_`{Jc_@?^e!WuxoOov523E%`+$%o&$R|>u$1TPT9j_G0w0_bL|Ya{d_g?4^1`J@|@ zSWO;@J4AAbssactm1NM;^i+F&`p1^SAc6Wsr&R-TV`RV$oSvTK?qa>__ui)jZ+!6D zTWDcmB(Y*BGCAzQhBglEP=}s7Nj6r8@DYgD zstcp4EO?$@z;mU0w{fxh-~y0_|NWeLB}d3>d?6b2gkabj$c;-OAY+Std(XkC<+818 ztXKVPMu#~FE(mf==v^GO{c#@j zvnoLf48A_wl^+Z7JjQB6wD4@|*go0izk&e)fxWF z?dpFIX&%w2Z+>`XU+TGZDFoj)l(vA}9xG6oO^gG%Qo355 zO%vwcTQSsB49nZ46iVh&M;nIlyuNecnaks_!)(0NEASw9;Y0JDq=2ifq6&){YC3oh zK6Z+B=zU9krcpBt+46ZYWsiK-Tfs!Ae;HV-zKzY#h#qlppOw_?s)$%kIg`5kY0T1t zNQ26s5U481aLFcU>1|~XdZJiyoEMMe5GX)}Imk{VwS3F;L`6YpD^J5%EUsgOGjLmp z@k=&fgXg$`?9-?jCT@w>I9lf|1L>F*rG5{>^F`@E264)RFniyDJsdZ}1FU%ZphWXh z?hUaazxXT=JDmAO-*xWqfWiE5c~qbT#T za6V`LQY?BrSS0&N@bbb>K@S1wh#g_~8?xX6l#E|i(^9_NSg^R=;NGPz_b1+!nxQ}o zN%QVeFNgYlit7x&!#x%4EnAO1fbJojm)GZwr?%$1I^4IcnmhW$4v{8`!2_Ne4y(eO zd$z?;@HlCo9q9qaq9V5P>bycOG3k8mHYV>rH+`?I!nqO>uiRE=`c0l`YL^636Ra|Y z0M+cVPyp1d@v>3ecMM<&K~j^-e6gk0U$?M)#JPM1PEgmigyR`;;6h%GCIZFK> zp^?2h7c-{e#|?chlCtZKm9h+?#;?)m;GoYY!Z(HMew$066;TJ4~&q74RxFGKTZ4~a*x8gCxj!tA$eFn0>A=+4sBALUu-=?nR~nvd-k(f4>nD@EArY~&kW4nTaVONGj8`R*$r~#n6sy(NBc+* zBqyW99b!D@e?B22ySlN#C>UgAAkW!*&XEoUS8-J}!w<)A)fHmE!pryafK^!-8}Rvr zr}$eY*R#{CnYJ;;qfFZT>Ate;=Bz?0_GUcjt_Fba4kgQUajSbz0T_117TJ5-kahfL zA25hHxzBBbuGKC^-e#>b=Ys^iU#9U&)0^Lj!F_4zOs*$F4Fu5xsv83faw_3rH6Bn> z@|rNX*cmqnQB`LIMHbi*fY5x zY+x7IZ^s);l=qS$e*%t0mNmi*q~bXFI~L6bz|6&QjXrkDb~(o~ZAgMZ%~#FtB{VNo|EKkaNw5a4WiyCY6ln5Sk2>bm zQh=N6pK^!|vL+6XzcdJ=AR?{1%}~QfO#MZ9?N`3h34vd zNkDRPg_yk!f|7VNjcZZX?2thyRsU_M9bs~y6g0nN8D|!=ELy$Tcy>*uyX`nF)AZ0Y z7=F68m)?zUQ%Y+*R+;;y)rvW@Wu>kM8&BAb+V@2gq~V*lk?+!)5Dye5;lqt4t2~QQ zL1i4iwHIwPYlbF;j^phE@xpw$o-H;bDqPZ5WqL&$m+L{JSNioH0E8|%3Cvf=pHz_k z*Rsr%*7`u#LH=F;7c*3x^XWd`ecRiIM7PUu6k}E2>IWVzj zC|AG>%4;C#yrne^ij9xOX2KWqK|bBR#i2F=mkti!M}!c>rsRw(pmma%+;yjh%9Qb+ zXzGt_bA7|J=IEktAP}K3t~o@IDGlVSsF_Mp!O}B*wUBWKw<&z>|F(bc}Pw@ z(+_NS2=AsdCUEZ*!usWvqkWHTN^NKM_H1`HL<@8k<+1Pibqd{u4B8!be9{_gN2t@fY-$|0^PCq8OEBbr;y@?cfUvikxLGa`rDNK(*H?m?Uz| z;emz-AsBznj~(^=0DqKoE};j)g{fBV+&1lFi_ZdFr~n|`0xC&B8y4I<2-ZfH4*kzN z%#)0pg168ALG9#&G&m8lf6kEB^<+5$|1-ucqeAc7;ieciT+BoE`^pf}rSi8g7YGmS zI$M(mf8G)#!@oz3yxUDv%FV!+L^kVT)_`@EIjL7uW`teO?TjU2m)z!rJ9TvKDXAF$NIZle0TZ^O4k9sVnkuAU(ZNk zwe-W|Qeqi?O0sc;-elXx#(5~Zy?%jDVVOy+f5Cw|`s<*)Ikt;Dup5LbGJUJt$wNA_9Bxx6OWJJ&h}64Do!0~eD_ zhEkxc6J-78@4u*QqyI{0-L5`02WxF`ClJABYswcM`abw>6mLuhqI+eO)lvJXvK`w- zBxq4R3>;?r`tez`CpFv)q~_t2`GwFUj7-)MnmLN-Aa>PX7N;Ir6UP?TqozHUOZsq& zA-b92sHs~QmT;~=*E{G0{#BHW_jZG${5xF`M7Z1BSGl; zKnckQ<28-k0se|`&ev7dX~pjpgTYLa&BgTMwXLxR=x}0fYHZLVZ&y<%fhO_^=PI4@ zKKvl~p-O(U!*b}D`G$VYo%8kxC17%C6wgeC&#nQPnM{p-fababk*lBg-Pe2g#&{VT z(lhaqacIkx>;JT6pP+*w;oz8q%-$48U8|xu4->#@L}q2q!VvI5OEJ|gaLH0J9$a!y zG~k*+=3#BZL(G8Tt0+K@`GNrAR6{$GZM?X_dc6unw>+Rn4{TpJ zI>X=OZG|6-Uw~g*#Q~!HJ5~6+b5KCisM&h^KEu!Si@Gi&k)*<&!DM@Ry?}K>o~GkN|qp! zX*FRMyFC;-&nT*Y6;CrW=Vlb%Px`$b>9gsiG6iqEH^Vrh!#ld<2`;%Oi}<21|NNar zVJTdi;nf<}dt7yP%cdc4!DUNZ|88xdmNc)J(bhLoEiWVQ^8b!j>3_Z*viW@t`0jYz zzMnOFxEJkssUq7bh>ARrfn|k3=9aYlQw*SW`tDxLIJ*PmPn*#lZv4ENH6O7|O{r7s zEIYp>f+?xp`KML4kpVpHeyw9&5nvd={};eS3rElPO>Ez}ni!TzTt4-MrL{?jDQ9GTE;(((pZr7;f`^!|zuY^WR0{hEIL|SBt z7!Ww;G@@9VG=kHw4@TyS(#QY>QslQrb}XfX9VUDIgD5CAl%`69cVYAS zfNNlfF4k#et}e^fGk=&)1k*A1D(mIpgfiAVlO~cTE-0j^7S}^82x8ff0U`$#umnRS;Gi3HYeeRS0vrrr+ET zr2Pmhw|hGocI+AskFBvEyOQ-3S7|Q;qoC_4v?A%wy-I#}HGr5clk(EQr$4 zOMM3o%12!{Y`S;Kr$>Hq4V24Uqw+${c#a^_EKCOJ>Fa1xJVgHFQ}E5Es7;%${0fBk z_06Ef5F5-CRYZlK&s*6eSb_;Rn3WSV9|D^Di(DolU>(XKJkk`b=lUO2>gda5J9Or zt2w4tFRo$^=uSf}x5E(*NIVGX7-rV|;IjX#i5RfjNe>JIuGZv&n+q@QdYN0cX{xn{ z@-MphbYtH{9<15sL5~`(a7HtJ=y0leT}K-3vp>}aL19|gX{&}_0#ak5(jJ%_M|QJ(}SGq<~tdan-$tv`iMC- z0+TzD)!aESPlH_XvpFy*=hXlqB4#a{`GLO%9h_0g4ZalaECY*4b>j;d6)-ynKSkyJ zAIXuZO1UA;qk5mrCi+SLN8r8}hVx#?Mbp~Q5F2*>3e&9%b$zmmV2+Rcyhe@n;2;gT zIW|hY1fpI&g~!lG|6J}3{6ueq-`(Z}#(c#@?2{HnN?R(% z$Gr5Tg-tQGFQ zOR`jF%)n{fXNqd5n={w3zpCNPhS%Uv{pP@l1pexbtrZvNUis!f`OZb(S?|?@ohhQ- z8oJ|$aBwuRqQXg@MCZ&ba-rm#1I0P-nZ@qLR3RgLRsX6*>E>|7;r^t>$h{Q5wLMTe?kYA{#G001Q;$otEN z`L`xkwkkY3bXaTyd4aR0Ya(Y0B-xnIs~8Kwct+qqI&ntEuFJZ_nsPL~V{Qi8LwMpH z3Cr0xF|Ba>71%lM=59>O0kjSV8&=`&%;4emKk|4BkrSIc>MW>Y!!dK|$Zl!VEf%Tg;3UZqI=CGjsQ+Dd77t>Zw*Kha20N)CqT-bz zZPjda4HA~QI|?t}5X%=E?MuIWkYD}GDI3^>aP_%YRanqlFKSE%nurfFi=Q&ru5hhptpC#4 zdu+&*qoSJ-#2#c z^w3G*j5T{a7602b5t z=-FrW(6lXBRqQA|7rRH3Rblcu2N@U*jP+%}SD!5cX<)HY1@i&oElXXA3dw322P{k9 zVc&cd`XxAeAUq1sBd@#7C`pgED9rXTx|YplD48utL3bOVnrFAIYRcycy6!z($TZE= zu(ff-kga4aCFf2#w#GYL$L?0(BUeb|N-6#hTn)GxRcEGw@yae;u0VfFx4Fs6U5o5L zV@k9la$!ZdqM(?2c5<@VilYQ(m(JW)R@4VvQaSF7@? z?V5qT_m7w4FnYypJTADTDWGzzvhVi*1q-j=BBqSg4`%Wt84smdt2BkXwICGbbua%i zI6{56y@8e`&@&jjOhL%c!2};D@BNSD65gl~vLN%2RtOuw50kVXSlX%HnHvIPB+!V~ z)_ciMY_thkj@T$0T>q|KXL^bxM*w}7DDUqn&6aD(X$^Nk1`aa~5*1XLyG-q|VbLml zMeX3|hnq=Ht=+I71@Go$v^B8>P;U|Y=zf@w;&l1EKwHE3Ur?uckBJxqLW1=&O!^n= z+o70wa2y>3R6|Z}a8LDD2Fm(3wopM(Z=WH1TZAaSP;oOO(1%VvHv|>%d8<@avIJ+G z6#3rM0HC?=hntm1xHQ&bPtH3VUK{`bs{rVf+b4tQ2SO{xA;YtXc2(MYDM)<#Zzcyd36GkP@d)q@F)#iVGk7P0vAZ?4;_ z9(!BosAr66sz95<7V#@KB7YP5@_v9#WDARVo9W?3@f7ppWdamwAkU4=K&F~0WlgO? zZz;t=8|nA%wf}OnVN0apMaGT~-E|F1(2?m65V^ zd+laCjnHO$+k;uKRV?pRMA;@>;~qC(GH9Fms!!PHRzPw)y1m4wKXW4Z z%uOFQ2ztvP`p=Qt0Q;Y8dG)9Fa_*oidKRP$3jt@1=Sps<5n~d>8V8-}g0UISY(2lb zQ<8Z7T|U59*qZ%rRp(p4AeUa`6HGp0DiQ~jFn;c8YZ&vRjqIhd$cQs@_{$2VytEzM-lz^(MyVn|7%1?C8@{G)7I4yu;gb@;E& zEcwtrpIrAXz?bO^F`fFdf}!TJ7=1wpQA;_xXv3pV~|{yym^$r|$P3O#U8J$& z@M}6-D;@g|zUWAARwF`yZmj_*Y7Z{HwItM(xu{r~Ax46$77J!`I4CQvU)`8hR`7eg zkL9P)#}sW}bV`u3DOuZRbk!StLRo@0g036~_S(5m$s&P`Z{`qx>_GSog z%xLw5Svq_z7D7{9D*rajY(xK3byM9OMfI@)F%vS8%Y*HgVg>Di;b40Io(lWq$!?L1-Ll5xfVpVCh`g%t)bWR% zu*(#Dk~$t?>F6k*5HlRPv>_9t;C{`k@4auN|4HG*Mco4AX9nXKG?j5sVI0?b@PT~o zVt;c-8G>xwP&GGsg`{n4#3m@zEtORX`Xy(CCO1^P(ONj*e>-(@U^nIHhR&qiZ?kzW zPfm;jd@%?watXC81`+$d`DJh+JDfo+QDc~rL6Et|Za8ga)skF8!x*V0fpc#Q++M}!?4AmON@y7cBoZiRJ`j*8vn7O zoPIik!!W&BhCtJ+gqiAeU=>>5GoIyGy-AVMgs3Fxd^;kFN^+_F_7cYsH6|_CHU-hdr+@tf zbeojGM0=R4`G)hY75a9*p!YAjLfu(t{fbD!;8rfl+sYiml4|Vud7=uG(DvZ4*c_RF z=xqo@LxsMNrHINUpab%>3d}C6q%#g**)DHz)vqB%^y02fs+)E$aSmv1Npen8XF`6f zanx0MYEU4<=j#&h$gDVg?iUE{7h=U8av}n+Xr$NiAfO*fTnJ_%$1a9bprHr`0Nh64 za#KnTe16Ex_V?av7r?ae9V^dAcjfU%DDuDKn#Ti4MwA$=YL5c-JWX7; z1e#1M#qQOG9~K@PF7ttp>WLLk{SNLCiri6FQac0^zP0Gs5JQh!U1Yf3vf&S{Hb8ko+c!>C53{tv?Q35Sc7KE) zY~0l|XOn_g4T5;TX3#6XMIwWLm#vlWnVXns4!}tROh4NBh?JBwwd6}v342_vWfg^fV?4`Nw zDe~5-yshAzrx+ViPJZ1Y;3fe8WTK!f!t6zkbA2^kn+Y$$dv4m^8a?_v?4 zL-K8%xl^a%117lX!5Kx2I(vET2t(6gzi<6NXIpm$yY6;w!(ALyp@W4`fO_n5AatfG zwi2l@D}{%W{!H+HJ5cp+yXD_DZy~vMzh)1In?Rr6gZDc9Ip!gO9s}BR*|nSzsPC7n zl6xBe_6_6n%<7mv-p9yz)f43~YMgyf%3qi6v59aUgyg-H684`$)ti%AdRO6RM2naJ zA$7ld`6{Q;P4pO$qp0o*fm=PnwbHO%>%KQM8Dr#%2!O0V=}+unByB7^IYH_wf4p+T z|N7c$pgEMm4dx`(&ety*tGUXJ{CrSA4l>1YBM5EHvur`dXE^}(ybA-((eUps3ERf_ zz<&1A7;wDRlGJaE-(5vE3tVd+oev_Vx zQjcV-lKt|?|A}yjWEvQFhtwB8_)I)!v)A%Kjk^&r>99**{|qg^vC=}5DvE5G*9wFt zDn=G7m}DqM?^6~=$auGLg@7Ict_VR#c2~4iz8|C>O*~9lB)4gidXDsL7EE(6v+U_Z zrgF{VkmzvaW7p%q$ApX0bdNol8MF8rYIwh2HiLOMhsCGUf9y{7Vog(%4jA!qI&E!| z_GV;YVZlS{x*QuuwR@h=&5g1TD6f7_pgP&quq=2e2Ew}_n7xgu$2Dr@{W?7~D-YsR zK|!%U7MFl1fhg+;)s;Yo=o{dq|X3dXF*3=np>4(oa?Av5=QP5&&wuz)e z^JRWYciphZ64pj}NCr_%YqHA9a`*qb%A)t_4ioT;b5jinwriNZ&yg*YEa(*d@(>MB z$EEf9u3`&`9Q3|c{;iLZDcWa{f)X=&hyl`J6WOrWUh|q&vD$|9`0NZhus@2u6&5fM zJ_b?vSo1#2g0WUhg^+FX)pnvl+fcZ@eG{6)>O$3xKg0CnN#F zOG+l4rXF$P|GBJp*N&upQNW)|HD!4$_+I%zpg!_@H%~GSD!B_K-v@EZhp4wVY9J`+ z>Pd*DVpl3KK?06w~K9e3*$<(xf^c;yQ*CCsd#L^Yq&0y5_qA! zZQ%4X17QrvsT%O#-gg))nlb(M=ewv7c`rak`KUSjAVLtr5iaOeJhp*8>Cy+^k6ljP z7AOpilBABlE%EP?Q%g8kr`%$3h-5C`+9}Bp91-?3_V}^G2k69CK3XxG`Oo0RN)c=ds<1FpLL znILz!YBQ5{Bc+3HE$p#&Sr9p-VI&=SIDf%q5*ZDscJYNB$hCznkJ}6viO9#E@DsJ`<;V^G9Z&MCcE~4_kPOCv~MhrLvyf z|GOv*3{&JHd@Qum)q|awl5%Aol$!IEpSuICm1AQhd3NpK;DXdhgLjz3hOKdNw*A-b zq_HDMcSN8*;u{d+QxpV&YIh>}Fg5TxZ5P^1xG*4|;3m+ZX4hKuirvy3>N!uBmT5!W zk?}GuqE{1tqN|Waxhf%*Fvp%TRUo7h*zTm}scv|fp(0ZXDZDv$bd01Knh(v14ocr! zXHap6GCAv+wCDPZt+}+tn3QU7bP{eng=_Vb0rNUcBdlgLXpJ()iWKv7JuVlufL~mlR_LLkVfsDx@?2MEe*|?oK zvvn&%q8FQa84VjVTeWFt`U0mD>MJH;Vt|l47ytlU{6)g8rInJ551aN)9dbUGHQZfT zKnCO~aXl}Wbq99y0P7E_MA>6HEWq8`DN}U&@HmlD=9JoWXv>Vx80)dePdSY$MF;hl z21cQ(#mFVJt!p%*`2L8z^Z{d!@qFu|Bw@Hyiq_grZiw)mcX15AgwhV8l|d3lN;HE) zfgv6i;G*{k{$lVDHQfV<6uInv$dxBW#8YpR0 z#|3EkAQQqE+K-<9-M3Hfw$^gCfX)%OM?_g`p$rZD^YkEp80v6w86`uoAvt+df`Y+~ zl$~M@ zO-^D)KZD#Qn2!)ax|7S8Nx0{E^mwWnZmnWgxv&PoelzbxO{AU^;-<|hbwc(2Uub6`a zS5e0`eq#ya@|4VoPm@6HR?>1-{$F~WrFG}TvZZxYx{gM_8a;&zva;>_6i%C4(>Mml z+5f=u``J{E-}>%!3{CbO!U$DXz_jiwUc14W%ih5PTIN1h=a6P2V4BMDgIU~t;fNpC zw`A2=)nJs)M__|X$=gr=W}p@yA(WFC*>-ltb4wz`c0vx^8J2g(3YANbeYe3W9ede8Ap1>N~kimWw zArahPV0LArEQTGr-H)w1@8Zyx%R`|7TFI(1D!|Y08IsaIbbsm3)dUS%pPeo&5wGM& z+enR%SDntKl(TLRzc>#VYLr2z=8)m2HryM6l7kLLr8ZXWqkWGRFI+g@?t=u|Pkfl+ zm2%$5iMCua)^6zvUDL3-8*vZY$wsl!o{v(Gh0!uNQL@xfn<Di({(8i{n7*hT5e|lj@YxKN5H`q zD&Y;T;=a5Ta6g0VYCjxk&DA}b+&B>P;=pnRmq*LT3J#~)Jj?!aBoo{`IGfCct_Hm( z)MIJO3lonl>2r=gub4Iq94gv%p$9x7ZdiE4& zRP~I>p?6q(X|7PtH|vKM!`qRj4r@mHSHW>^1jhX!&Vyj9O>51iYf5qOg6f}U|9mzZ zd%?`8Z_QD(0t+tZa8G9Axt3Ess&#FHujqzF*hMHRi;ExfPH(>;0#kpHDsNP-Tchm* znPjcfohR1AaH1q!ZxU;qo`+?FjMTi61GMSoC7B=Q|#ro)|SQ9LYsRNe+_kft>(Hlzx-|^e!mFC`4DsUib+kCWz4<@`Gge@DeRzmZ- zbuCRV#}EkXd)>j7T&ACj6bUJ)-ei05p?}dD(fvbZwZ%)3X}EJ@WbvsvY)I}i)P0Xk zL_6C{=A{LaQHZ&&=^?CcHBp~eI(jM}M%J_mI`=#|RxLsbaPsC*n`6#~2F6XPJMDYH zXG7BwH9dlMzs;w?(UB%I4xJF0z-GYfw6s_p1O+EhL=3+mYS(faM&EfaOK`UgVGGI8 zUvxn8;AXQjueebNuqsjf;E&8i9X)^~tIwTy@`CR)b?+-t zD$M4c{uznyKY@yaXzP3AQxJNhxo^9mNRyspd9^#to{D#JT%eaLu3^fGcm~h@=Yj%> z@=6E=4VMqR;Tn>?DQ^FJXfM@Dx>Y?De*b%75 z?1ojoaKZ;jZ5iLnLRe5#n5LavDq_q;VWdcb02NK|o2u8iyVk9xlu^H=%$J$N%BN#g z1Ddr`h8~mP&)p5dobKx~$L_Rwr}K1vn6zD-0aEC}c(j3TJUUv9F^}1!;G$)P3IyC0 z17YyHWXFFd3qAFU6Em2Rfv)TE(re`gHH3w^w%GsEtA*wGX>!FMHk2eBn zVaMS(^?5SR6XOhPQy~bDlGhtaADz@;k;#k1L;@-LTuoWv;_(j;d(7{+CpFd%YHyCQcB&)NKDUy7W$XyV0_9+odiAg%r`G=07&Cw2m0;b z`83!DWzy$SYcIYXf$Bt=Roet?L|Qect>{S+#N%vCPQQN7WoFqnml0@fz_NuqgXX+> zMnX26JXw66<2*Q)n~=g6q}w}X4F^D#Akrd*)VuMR>D>Odf6=V$(1)Nv*w3c6wKi_$ z4L1qb-x8C9yUh`>?mhbr)LlNIBPpLiLxi4Lx81*%F3ewAv$HBHmoD!VFenSk_9v5r z^h-Rve#$4ZSm@Lyj8fw=_>ROUPJ2v}a?pg@fzXtG07zl3mf3uA+Pvvq22;U_n`1U% zl^LLMwjRwi|&jk2BA0PSh< z=ZACaB^sCBK@A`P0KR%+k^v^qT6e+M7FFGNPM^q^6Zn*Vmfb^agM%g-mx}L`jCKeE z#i>&^OirZ-MLF7}tGD_B;r78+w-#$ekC%FZ_&)d|P0!_S5=kO?C%2wWgLFU-x3#=| z(`gj(zBull%x-|GPE-Eb#+OH~kqo>sArJ|o#BH`2v$n3^6sHga>-#>I6@C3GQ>yjR zEH=x3_013F36kkf(2tH{nTp&JYslI&eOBKuMteTH8dVyER+WMMZCyJXo{EA4xFD^{ za}>8+wSmHnODCef)cB{dnzEXHWG|I?x`k#o7t$3SC9kF0|J_X09UW8JZp$t8t%03r zSB?%-`4DhYgZC(?c8_pv}?X%olgQut)Xc_bB6DsFW9PNi=&FPl8a5E zTo-th&aZ=0AFI5(L6A;$SbvCR)!(1M6p~X}xUI=8BWj$g(HPkeUM`F|!p66IAs*B* z;0psPJ2g{9<@T%Nu~U1lF8NjVIxqRg-D9glc)F7?Vq`R8JtuYe4ZiWDTH;%6WRVvB z2Uwq4URp<5Qlr-f4Z(3o86p@ME#{Im;+1PCke)npX>SQP|Iw_#KW+YBV)A|^K`tF2 zO9vwtxiQ0xL2oM)U!c;{+A(^YW_$tOO=l(n1=p4zk`-&8^sUL2diLn}$sQ~IoTs|X z=|1xJ*WBqthd-jV7rNs^S61OJA#Q8zMfs zAm0J<9XQMbf^`by>j{&!^z^mN#;zl^a0PIZb1j1te1|=LP-+YXp&=W@Pp|WTAG5x% z%iV}iXt{(YWA=He`{zhsIV2J7X^~fwIN;L78Pc)iPUW*w`QPW0}QXGS|o-UR!AFuMCO-!3CTZjSP%R|9ien3S^! z=s<+B1>soSnkPICyM!zGL}9M>e;O4Qc4$)LU;Bb6J0-1uJ}9_6Y~UAQ=f~z8sOuQR zUVNkH-^p;FvtWMwQ~GdGK~C@TbQPY{ETs!jK5HvNb^x}2%Gvww1Fql<1M$YMv}a?~ z=m6Ksi7%>AGJZbp?2Vmoz{}idU=^B>J?8zv8c0I2QAC8H*~=e4>b};Ir4p zzeC;4nl+k#)#uf4`fFO7NxRLeK$8#Y{!}h&$G*r(-nOB(X4S|-#YM%!%4Cfp8`|H_1I?sgO67jg-R`w>2*-P_$$GJOg-#zY0l zr>^th8|7cJlgXDWe-sgEoE2@7x3`jCAq*ndCKpbd$7BU}$V<=IIF zPcY?1dJH@jgW*2hG2jhWXW&QKIU*u7P&7EV%ZR)HG&F;|PPSoo)KX1D8ANmuz4vJH z%grV3iF&PcL?zD?amq0WcXWcl$9-VQCjJ#UJoLDLpBQK^z!>wKb)6+I3#beSoZV$V ztQ7BOLTc|Zl<63~cj-D>4mCp&74Uqx>kgq$i!GT!M5eI%($f!yNOSq~qLe_mo+~p{ z%yFdaK$0lnA!Xp=&}g{@agF7VkR6FxrM+qy2~~KW!55=a=Q>z}1UaN#wh;9B8~%gQ zlO&)AB@}H;2!=i5b)fOX0@llNoEsBh+(;Ga__LH!9Ri0HSCS2h7}{JeB&EgtWBgNS z>W^kwWJX2Z;9D;cnYuU!a4r3$lIAz2r>W%RrF#nES(3cWwNu0j=@1QR(gs#Ouk@a? z9`SYlOqbZVE`a`QBTeK9{*++gNo-=gai?-%B5Z_oeePVjEPXXr6}N>VcCPxj10YO8 zY6p$ysIvKi0jH6uNH2PV`XUK?!{<6gj;W!IqEQrvgW72}CZ8gG^UN7siAg@Vc=zCM zl@ug62|zdb^@ncjVWC29X)9WsgPkWQWXtrXuET5^u$S~-nw;fF{`W=e!|V;iyzt1; zQdh=Kxo$1^N^p#%yyl(Pm47r|`}97h9&?Pxm3ZcH^MQ$3YPyv9_+Eru#*wTgHt)Nh zGFk#UU_`HlX2i($RBjeOIcyCy>IQGyV(jDVl)__W8(3sSiWT^+KGH82Kl6FCXIp_Y z&Ok|^$&(lwuZ^tKZS}JraM2qrlP^K3Ua`_eWcjO`anRcAwcjuM6oEN&(bHAM`UBYE zWH5(FrC^@KR)RAuKM()TVqbYWMN}X>GEE3y=2Vb_zD5KYx8-vd@nR=sSs01rPxW@; z?GtD_inONj$urC~@+|ubRpg-O_MSjQ)ofK@f~3mWU3?ynd%uri)ssCfz$4&W7&qZQ zZK2KJdG&yKZLwhMh5j}VS}z44qC3nYo-JiAc#ZOMa4B!PypLD)hlkv9oCjW3*RNhuN zL?XJ`aZb+^C>GKaq z$A6d{S=uZ-=R7W#Ksp?BW}D#Uvl@*jY3G6~Z&qlj;VcGj2o$y_J4TzmVU{Qr71O=7 zhd+NOLOFy?$Fd{p(>~`v<8W78dZ*5B9$PbN?=t#_3vgw*2sC3K{KYk&+~ZYPu2Jw_ zbS3HPngDu7k^&yg-HwR4wOd$|h{l-=FbO7KDRG1#NNMVes^H)&5u_E)A6ErD=tfkI)u2JtpRE8gy8}W`8T3w1FJAB6I^7uw7n(uL6FUzb( z8ZK5~3fmpC!Vh--7#4VCrNhM5MQ)TaB5UP?yrM1E6(!GO$0Smb;UjZW-_DL1i81z& zv!A52F3SxCjA)>JB}bKIR?7Tcz?|p>nbZxU|Hq9()4r-r zFYhx3+Cy{MibcdXo@c4hq2lPsM>SGjww>3W-G~RitWgy#V~jDNJA(78BO60lygeNG zeSyPr!}z1h41#fsau}bx6@}5y;i}^1oai{1KvwoE0fCU|9YB_#! zvaZ8RPjf{>1l!baCdQk2j7v|PJ%n@_O;z5>8Q0Pe-t8tgeuti6L}o2I`Y6r&sxd|T zb|mh?M_^Yoe6AAz{dWn`0uD#c8A;V?Tzo++g5vmqccs@J+-H7C9!Xn-KlSni;*gK# z*k#U=A<_o`kUC=^waJj%(MRv=-h-VYEuD^LD^Lpvn90*lnDT(?geuMoY52p~6;+>Z zG`dm~c77PVFEmWt7zRHn>)rmRH+ygvMx^?GC__H0)5s6~-v6k%@#F@^CwH`8e#~-2 zpNYhrrG2n#8FQZ$`~fvQScoc+KPKFrq|OP$U1w>qOyP{E&M6-}uT`Alys8jpVi&mJ zr(od8hSeYe2@g|akC(FK4bYwCemrD{ZDINNq}=>>L;EO8K*_NJS&0eogdW&lVNJ!W z4eTMckzNYt>*tJ9bs#OeJ{me|q2~+T(7cy9Q1>4QWpEc=V?XNT%&-ZQ_TOVqOKn8xS1U@L z{HlG4|82H8+0F88eC220{li2!=ilYcIJz?k&18mJu5=haM%`9shCI@TM1^+e*Ig{B zNGZEbTJrP6V1RSFs$ov1Kap;+<*9elg!1u1AVjun&6@Az*c7p_LsN&=HI8Q)} z>Q9yw>OwQ?`{+X9cN*aQI|gF9JHR(J1W>HSF2?R2ytKx=#EfjO1ONGj@_Y%7!kXM4 zb%4Z}2EEU}Nlbh8q0Ls} z0Su*ZACX+0sa9K%Yo&^DtB*@B2AR#?Q%!KP2nfDKYnO(=qHS9{$$`ymc1q*zqbh2w zsKH{OZvGzN(m=CgUC`U-22)jPrHI;xRCL%l(hvJJOwwcFkBnYOa)4&JnvGQS-M`y( zP4H5Z30}4y_&eH_7{Cw-8_tJFD`J6J_u`sZ%P0F1zy#i{p`a}x9LVrq-o}VM*rOA z9m?`yFJ5LFv#xayO)^q~v7MoPuX^ot24<0L9+PF!+Dvyw%3aOim{+0w2Tqb_M@N9H zX}e{&Ozvh0!y(Dxn>5lVpAjHBOcu@J*=&K%e7E6BGf>cOeqRTc;pZXgN<+_cd*!cNF6sAZI08KN~Q4pud`F$=FgaTvMHs z?|}m8Vmyb*vRPD;S|{>3Q~GWut%_|GEW<+Z`5^x7H1sT*YOaRDJMLV~!xdXW=#hq% z%S2{~fy(!^hu>x%0@B*&msk^%g|`3ZHPXo6;$lv;hy#YB_LS&Eht=9^N{5c9+#Y$q zE-w!N`gP;-gZoI;is+Cwvx1yE^i7`QUFG279nIsgc9l#HXO%1ZNa`AP^6p%5_2Lx& zK?ANZ^-2TOaUR{vWBZJvFFdGSE*%8k(2qqmWmsKXl1-(XH0Mt=!Q3OmU-FTtlmw5I zyOkWt1C6dH-Qld9SECevfF$P}2U~%&I{~%EjB?yUw{&KO|SWp#h%v$JoLqiu558j1kUEZ2u!|yuWTdMyv zHiEnFNP^$C`?$XH{HmGwww8l6({*z;@V$UHhfxG|A`F(%zP!ZI|_XjZ-FN&G*7nABHL;wIsYc8IXN9*!_Os@a+&&$G=a_4bLK6ql}Gg#l9!qtEJZ++RMvR#+tNJqD#) z07LrUCPE^lZ+w;-351;Dv++-->^L4tne%Q-2GgQzZr|;>N54-J#=~z}cNS@=x0^9oV z6Qxl4p`+C{hD8^0m!rDS=dAujwgMv!jy>d zCC?_&3_Y}cP_Vj^5)#B;-XtyE>elqca{lL&Q8;sOfC^~5USkEFx7_? zc{iLie``uT)Xsao!9LBit#M#`%M5a-=N|iqqFduOLjm${nxlYRxc(@F7{^Az2c_$( zGGjeZ=y+Imc?^6vt@jj-{v$-kMeTtg`-FNC6c$lq{JMM|B6PEKS*M+_$*oL93ZIUP zEEt*%mA+ZXhBgxR9Ri`S12g%Nljb!8Sg>XEK*_K_u5>vCpXwJ9My*4rj~{(^+JnOLYUWdnhyozv-I}i)(6sHjPkQK1N5Q z-c(CU8s~C%?Uovq!>!7i{*1xPB`lE_5Nyve6|a5*Vz~JjuTqV5TnKqlA!Dnj#3>6* zUf%rbe}27_en$^{;M<-kE0R7pt+CJ+t}kd&n747-8XCtU$W zuk4hJ;a-}K=0&rC<>5t!=kO`X5WNG#XJ?jQwM&9psm3=z)NjD;8B)U^X!l$2X}W*F z1pbs5iV5gA81ZSBq}w?InS68SHudV|5_npF+HL*Z;Dgf?Ahi4ub`KK&zF*?x>C74L zjeh>2jpm6}-e0Wze|gS&5kOxq-o$AbMysujz+vw7Os755|2}z{3I=qoVB4Zq43e&N zWHFT-rcjCosapaRVN^CK9hJfLR|^pZfRfG%TI-FIaeb7ZT>G<^t zDskDY7;h(sl;Q~kU;_R$m#PgsqqmHdWY-BhNkd6J6KjW1J^1(h;8&HTk(Cc-we2=Y zMBw-_I8UqS+~IG8J~dt_x=)P4=LWV8SzUEd8c=i6M=Fnv{Tz+&}uuNkJ}Gz5(EO62?~6%CT_o6d>Fwh?xpg z{~j6E=#ncz-MVolB9RfNC1CH9 znIre-%M9vJwK)hR+qWZVruMbI7ay8uTU&!Q*u~1LV>tNw+$^B_tw&4zrZZe@uBEdaNbjkWTM@$vfC`R~>}ZGai_k(kS`a4iX%fuzX><^8 z&)?8u0(FlX=KYCb_tW!_tSpzDcz+$jJwD{7RN3TokDZv`JOi>6BIkQQ-_eb# zWNXPG_z{LRQmNeQJ`^EaIo~D=pSBTiW18bcJ(Ia?sJX`}`JmvXTbA4s9({iUBxbBK z<WQ#s& zr}Xkm+)$V47+5exo#p+yEJ87km!(-sgW_Kcg2-d&+PvvsH(q?}wD_=ttUl>e7t&!{ z|8>^3=sOww1OqOhV0_57#nV#0+ADo+mA6VtIbSQdh|F8%2U_U>Q9!Q0Kq5iBSp*^B zXJqsp@_)fP)r#{HHy&uT5$W~h4jw9!j7sk*9;L%&BPxcfoEsB_c4|8~9(+EYr z!pdTNwnZg*I0Bnpap|mhbbOaYosTwsg4GkF%lv{%+Weh;{jsp+oA+!$`3fk-rE_~; zOkX$Md&LDf(!6Va;4mb7wb0bA-2C+Q>(d+aP0TQjJAb{5vliP$22(z_(yaDCzSa3L z`M$u}s@m>ZzG-Q5SeSp$59#EUMqCnX6@0K)KFu_SBfRc-kc?4yz$E;;Wldn0*ZxoV zP(9(SRUrZH$-BYE`}HH{Bi8_(HCLhhc}WSmUFr-TDnUdcqWgxNEnu}|XwlSawhR-E z?;$!yG7VshlV9mp#-~J&zpT6b;&CYbC^MD97pkoQZwv?A>8ang@2;DvCU4Mro3I{` zLf%NCD(gt{nM9WZkwM+@ka~DewHf;Ya(jUj*=*gO5R_43?yeJ#wSPOJYQ4$KrC6HH z9yMwW>8z@ai02cF%sYhdoMxO`ggskdIH4!%N4Fnj%AOMzh?=Vf7RG7NU*vdys1nz2cl>h-UtN+33MtSJD$EflP?C2A)Sn=!!$|u9meca?4}G4= z?d$Z_oTt?1ulpJ!`V*h!keR9qEa2LF`_v15G!Lkt6nw(wM#?D~E`WFI)V-fT0(|>n zv(1-<|L5d{eP8Yl&bTadN(oO!o?~~!5q0Ap=%dRy%paFWf-#y`Vz+f);zFTp_EBUM z5WUcGX>$nZ{O`cesGMpay5TiSp}-~NyATwX@GU6ITy;_@3v=qqU7)i=AkD7+oLH{e zFC~j0)gmw2C^@|o&(28v;&_*EzW~hF2f&J*u(resfOfry(GNz^{a!pj*>`BXri=<< z^fQnn*8IATIF9|sF4n7&dtYpFbl}OfryW<2?cWcFyKQve2*pkHn=Oo>H=QPdp4G)z z%L8KKcsKd9Q3g{25-*xT5L}*X#Ct}g%B+5 zU*f;XDbZG7v?8A{_$3udfPO+XZ&Wu!DfpG%-nOS|%+XuTug=Q6NBaO67%O1xA{-8!t(>(-YT2aa56=})m(RD2H(HWNk$A& zj$oi19T${gN?X(9nn&eW4IQyBh>G3W0qTyy+)2%HM)}LNS`HDom&G1J+>cwc`{d&8 zA7kmZ%ibm`_JZQg_ug9NtwT?`C%;<^MMe+BNjI;?q{eHDEm$z8++8#HHZ}jAYwUV^ znO)ELVxDm2E&kv$=Dv66!`Fv{iz9==%SQ-5vo95mBbDDnqXf*pFf-AfIiy^pLuNVO z{dr>1ds26GN7I^{E%9w&o7Sfh4F_ZshWnddI31etHeMGUv+?gU|L`LPaI~rRjUD$8 z9+Qxcf!wBjJe%hi6?uq&n^^;_0*kE;hKqCbqB;Am@#u@%LHuU zEl$keX^S2HL{)7WIydk9@`elEtLHQ^9l`sHjlIOOe{B+le26vC5|ZnR=4EGX0P_

    ~N6VNsS{~w^I&&UhSa5m$em07KZ=2ziBp6tL0-1Axv>8*~FSE-968=hP zm9P2d3v-mL2UF(X)In3 z7bUNmZU9Lh(g?_>q%?s)56a@wGls^-dn`*ZGzvJcE^6-gCiq2P`qXYW{V8ta|0_`Hl=BiYvMYb(yJksW(xlqmxW2!M?bA~Xh!S>{z4Sk4i z$$kJP33NYx9+S#n8+LX!H*B;I@;vKGZ5G|>Cy6>B^3z~6HkR7)S(b9SNB#fb#T!nn z9`Cr%{X~8m@gU~&A?SNX7f(0=WG-Dt+^B(9K|6y8oKe_#k(~X=Pw9O^qD}owSHO67 zF~Q07<3^+-=P+%uWqy%zkPl`bJtX%v0zFNNL}6$?PvbG)8DU?2tKlV}%1w`=M*MUR z(&Y>Z3TCfhgzw!)Z%Z!GV2XReltiJAUB+=;lZ{=|QK%&2NkJb=&LKy(tugP5v*+5V z_`c=MkQN+QAqCoT1_`TCx+yNM7q0ZDyjNk^f0pNtI!sph1-D#9Odyow912DymsAQ) znHp55bKM5(eav%cO&B#%U0~F4hX2a9-E0nB)S>y)kq57S%BO?{;3WYPClWuuJ!0(6Fq?jn^lTw(K&u>A zCyG3?%rLQCjP3J?Ysz927Vb+q1RM$U@!d%<@F4%5m|det4x?G6RlR!ap?#|(?ktsi zzAa4RQWIREXUUNq25}kWZ7B{yd7O*%0DkOiQ}a8G%+-QJa}Ze-+UyAC*2UjqX_vZ2 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 literal 0 HcmV?d00001 diff --git a/mobile/vision/assets/topo.webp b/mobile/vision/assets/topo.webp new file mode 100644 index 0000000000000000000000000000000000000000..dae09792fc126be634604ccd9e467fe88eb5b852 GIT binary patch literal 38946 zcmc$^Q+Q@w(=8m^wv&!+CmmZI+v?c1ZQHhO+jhqt8@nIB&-cCi`mg_J-$(a6S!>NX zYgCOIqZGtNM6gl-091qp<&@>v3E+PHr?&yk1f&Fj007~Q70Z?)Eud-4y@$HCfeTFVfmiyrzI#qCJ?g#agn7Lo*GTM7P^Rw_C_g1w%xr8tE!@7#;sN+6N zxEuba_J;4u`}L`P-TEckD*Bn(`0eoczQe3xHZYkQ|G!!4m*z@ zP<`Z!A|A$SM$Q>(XCeyLmiP20j~ct8mrKQk>ZhIJ{TPWqQKHL;wNK=)e^T`g=Hm?4 zF>sXr3fDm|(PaCrs?6|vaKp4&);v#hBV@kC6T4b?Zta7b-R%77`h^em=h1qEKW7{bhnDsF!bGgxkQ2OZPK+iuvxjwo<96)_dQzV-gjdoB%?xYBZ}v1j|& zjtc9ZnYDU0BYWt8pdJ3(9y2GX?k??)KR`8TZP+#jy3wHXa?~>dY7kL?gBAmN^wj!a zFzKFVi`ft*)YHu6k`EXlj|I~$`>Q}CSjt3j`k`1Lh2XHK&}CwXaI_gfo=%5VOKNcU z)erRYvejUVANX0kC5%D|UL0~HaN)f6?e?IHt{zg)FO6>!8{YeR1QdtwO-{4;5CO5d zC>$zI73q$2Cc0C-89$8P#-EdKe=P^xl|@Ez0QP`^(d#3Ek)A3JZjy!}dU{QSL+nCG zn4OYL*}B+61~-%F+HJ~W)x{>El(#MZUe`1N3c1I z7MH@cg3=DY{Kt*!Z0wP;5nt%D(Y2DZ;$@U?^!R|SYgIw1ekeKiPwCP@wRj5&9RII~ zAAcJ%i~#oX1=Ng!)jo=P!=MgZU|rg8@ZL>WwNUdz}wpOThxtb(PMNG9vPL3 zV{Tz&CE_XwJV`~V$#lNY%=m6?99TpksLnZE944`B59LDx;LMog?RAOmWXI|osrFL; zgFg}{1m#`rx>dV2Kpp&EPPymkiw%1rfMCC{R@h`Er~+2$b2kZ>(rBOt{dz;l_L6uH z|3}5U+6&|5wKNi+J0_AoYE4r0X3ugI%2z8Suj&XDG0kMbVixF~UW3RivpKss8{o?u zP4X&;)P?!@f(B&6CULyI>@w5%NX2xhF8fv$w7^Xf_FEyI9Fn&#nagc5_BuWcu^2&M zE9Xy37*+{EYC5+HBE8FTEJ?j(hKLOsPnPBa=A7ezfaATSu~3afw`x*#De`JN9}SWqG%?- zPZdjxsNO~YZu^WAB_Mc41c}Y!nbD)u-hJQViPDZ%UeF?2Utguihpe%sTY?5|<1%{KVi9t_ zl7jA0VmA*!2I6~@)KP_3cLJS_q%rb20d78W~)FpHR4;*8Mp zBcD=N)Lpd=-Mf?@F%Ba>pV>p+6yf`-lA1#(HjCl#tts~!uwp$wPrnTAb*PWK)yD03 zqBI)lI4jo{AIra0rN8r0Y5Xu-P7kCKm_idb+T71b=)wD%aOn^kIa0hvVVy!xoAyuTw|iorSsZatU!Uul2|7Sr3ia7u>nHpNK^0EKQ-vrezVA@W+CdS?g!TDR7&lcdHrw@LWO7v1ua6>X zVU_P;d8cuk_&RDWVCM>%(49hucAK!dP%&+Xa?}-IGlq#4?#iSI@n`0>-0oqo699wkajJ zqNDw-el>TQ;x;*qz~;DA!-?_^M`}sfL$N2SX&8!Yn@L_MXjj)vPI5`6bnk57rv|h- z*J-QsxHCrGZ<+ND%mNHxqR_h#Wo2~(%S~(~E3#Jh+4}fU@f{%fq3uhsmoYWR?me^_ z`T-r&qS)!adWecKTwo&*WpD-KUcL2AH&T{vMRoD3sPz0*ReD3;Hv?yHKW+CV%B3KJ zpfo4^Y0?Ks{kQ5wS!_ER!z?v4P0)(`&oYXvdA=#(W;#^dI}fjWUn@+-Zu@D7ZMpHt zZS%p5XJf*{31{KP9_22e2{9MFY_g+PW`7Dz(f;aKD(TV??w?-vG=*s4tm-|ELwE73 zURdr#nMaj%a{DhgFZI95NXFG7dF7<$kz?$&TDIafU41nY!!=R~o!Xk#?tIbM7Kzd8 zZiS*`oJsQ+?61(FB;x)32(!9sHj1g!ySYS&b>D;!yBqay0vsM1Br&byX63Pa_n-wV zjcUfQmN9wdrc(nV+OQ{1nXHKPk-<~F62_n6jA%K|P9#pUk^_SQjO_}BF}&X)UD`!* z-4Y)41R6c4)~%^LJst$i&%-y={eBEY;43yfKeG(OXq#9aMQj)t5pDAo{$A_O2A^+Q z=gvZZym!BSDH#*FVe(Kw(b6U1Ozou!l$NqW5H>X+#IQuq=OO3*+0mDIYg(l8uskKh8cyd9M6bj z$7`0?uO~~3uCOFDEiTL$w!A>HMRkAHXQNm-`;J2N zcaAuIH{2WqUfC^sfCyv5-fw3JK0Qc8N@JxLjH^b8YB)v9Jk|h~n;oe?Wu}{Czzs~z zM&uN*I4S`AE(urjh15+wX*EFE;aUjB=d{WsuJrOy+sxGA$B3hDxY1{luwL7tH(6P9 zwb*=!g(5#ue|2Kiv|H`yT~U*+LpHCDsBtl;$n2KrmUEUqkRgK6N5d$pWqO3#@BE?% z5-(XrTAgOBjv5$7;u^sn zdfeT%0JrsctCWoIW^#9WgGPWBiuc{sWI&{=_BT8uZs{TF-}uWbEaqhT;YUr$K`E4r z4*l-tx5~NuAz(r8VYj_G$Ehq;__#HqG)Tf&4;Wp*=fwgg@`s_;Z)3|i_uQI#@TQLQ zXOus$?eYgElW9h?qXIm0O(q((MkzSU5AfT+6!6BaRA5$_s)iY?>0aS3jS{|srV<74 zhvS3y!O@tke7l3FFtyXVcWusKV%TRkY7r4PMqZs0mwvK_w#(;K>CQT3^U6v6dbZw^ zfA|;An&{3ta5<_4ejFx3(cY__nE$aZ^i20c5AZG3Mb1hUuH1uD-Yg&e5`@& z?f4C1Cf8sj`9(*xx82RC|Ag{rNz(#_q-oayGxJU_skF}sWJVSvi-B9;t)cb& z@gy_RlxCG2{AF_f6nnAnX(!DfcBIe6-fx}rKVal0 z*d;z?IYIpice7b5!yT&#ukyJxm2&N71gs(R9o1sPKU6xHN$c!+`Z2~^nw*=1(k!(m zrO`%%&(-qjE5MQI{2Aq(HT`IosOEKu*U_ZB4&g;$ox~fxKF81ZF`?_wMbV|euiZJg`$r(HC{^CcXL}8)C8L21NCmUZi z8nN(Z!z?l_p=DiIeWtb(a@oYe1VqMXiiPt+_96QS z3nU1qx+iQkjC<3ig8l;VwWq|SE`g6Tj+;UU|6gs;F@{@j%EuY93)Mfl~d3E;!c7;FIR}#n`GM1uDi8GQ(#Q8XBctH*`ZVA~1=H?{A7f z9n*Qzk6>w^zyX+{G3ie7HtQ0ib1`r2ZSLC>w zQ^u3wfUxX?4O7bg@@vMy)v+Fr)-?2<~)^yWO zS#7es`gfnaEZ=fQ=-Xu}+Dx_Gt{J_Lq%Cyh={J{_9<)j>n`0!ufirRF zDW9)!lSRt1d4Bb%)22_yit+ssqqEAlO37nYWW?b2Gk-xwkcEX>Jjtt{41p%P-X*;^ zmJy7ri8I)@J3V z)(ihs?E?ipB>!00F-o=ghnOK&S0oX{(?iCxe~9#bF=3G8##$HOA6xqafJqsx?O5Jt z<~x*6GXTRUHp*Xw;|kKuXHUX(RI6=8y5zj{K~886Y{cA(f7r+H-EoQHF9VxXtN+uv zA1p#91?+3ki=Pb6fnvP&uE#ll0PxTA#bpPIi*k@U@?;QrdJ>;K+7-wmh_JmZ5#&_& ze?_^YLkx~^rHZXEov1}P;W-k`rB0SwspZp?UX4Gpv9%@Yr=KCF6(hlbn&j~+kxxW( zpW~s{eMVJ<3(v{L6uI4>zif8S)Rd@;jBj!6ZY|j%=g_cTr`@m-G>CXnfNtQNeN2_x z4cV7#gxn~BQ?J48&7HHseWk(NlCd>h7E1(r1dqZw&8w#qJnslkkak>CMu7`ZD#Q|v zMwAcoJ0R&7628yCj^1eVoC0RfVAWyiLRa*rjD2xDcL&jjSgAu$Um}p zzIB?mpGjjNR_uWYBVS_bRj3ClJx5WOeeo{xL?J3^J|6HH@@w9Sh}~O&OZ)crTjKdU zRr4twX4)Lj1AwwpdfTpHz4)Le8Aui}09MtW%X1Vzx~&P8a`#q{s`1v~{V83+ffF#e zB+=U;dUpk!BW0+t-JoB$w%+?RuDuaHCA95qX$>U2KPy!Kq#994pxAlc^}`ydghcOVDuz8|axKRCRy3sw2g$FSwl= zGW;HuQRZ()>>G}xS@b0q_)onk5xvVbuaSzNfJN{2g@mY?&w^y1n!^wLywkCX6j-zI zzL;lm9z>0ly4CtZPl`7YryCRC$nl*GF=$;1!yZ;0g2vx?2o? z>p_3ZL&uq@gHyUbst3F50X|m?;u^R@$>I&YcAhGN*FdjW|HyebgjDea5kO)Z_(4}k z-dWfnDzbZN1_*l;68U3<&bB6v>sz*0)!db6pC}ZMV7=;LR3M%9DqX8<7iSo)_;;Nq ztv1tLE{V7@I3g|g#n*lP?G5VFOx^MZ*2DMKP`Vd8BfHL%6k>sZLgP?AGpiRqvMe!^ zE4Kp-)KrEIkea)_vo9)wG;o*)-6IeKypl5UA+JKen$kbytzX+=&zRZ%Dz*;)n*=$5 z$sW=<$JL`Ro9naWAN*x`QY>byy1N!b0xDaSySd z*$hIV(qr4LMru2^K?j$hlC_4OSL)ku;p7=LOH;0OYXxVBS+n$W|7MWzC&D3XFg6>c z+9qj1o}h1T)2D@S;f2vNmAogqQQI-&siCDWQCBd0Fu*Ew6qc?O-Aqps<9wV#2uP3pRUAKPGQM}+UjE3F%d zwv&QOrD&e+WYuuD4a#}OVz5_T_{#Y2HDsYb2^y(wrG99x9E4VY|08J22K<>!RY6SS zj4|R6mPyqkMaZq)5u?N|`-?R+4GnIH!3`WBiOrnm#P^YhzWDDyZKvxBei9EkN;#=! zUN$YFKnGyHts8l|zct@n?dPmQ;$4VApn;6XfJ_N;csNpG*zSd_5(rTK(O=id>Nj z@b^=mNY$*Q2xY-MaRl5j6Q&xXF{j#s8CCEZcYT$JX+gl_z*|E8??S)jL!h!?@K>(V zFb6Ckit@B(?;EG3`1Tko***DkC&!SmrvBfR^a?txPDHMOAo;wNNgs0-68I*aAi?65 zq&LnI7WmeU@bW7oIx(yhla6BJ12h|NYZZY6)od-D49bbNxk(}Z`U(zd#fm#h)}jV^s5yz`|=EXSsHVl9;xKuf&%BUCgIh96}l} z=i_bHogl>9-sHjayYnP8fFi-f!*|9bkgma#+4}>T=pmB11|_nwmO?+cuyyrkJ4k7P zZYIRAGe<7M)~Q35qcm<}`LtAyUi%CKRmxjHR#2H{3Er7q1*mm#jFww^@e?(`X_ccy zy?@0?l*y1vq$%racGiY?UQ6Vz-)PO+fHHdjP-lPGF&Fv2i}>G+Q4{`QLf8|P*$qD_ zO`t_vs)4t^#UDV%+BV;W`G+bwx5SX{il;8mFE6Gse;0IwzG=`GP^CCD$x{?2)u~1? zrjKYbapR}Vz-u2^l^tOaO0yQGhH?qzjww`lETi5>hXQt#93`cc#qXBK5(pHt&|M%@ zBnsvB;I=Ykbl+6n)p+-y%fNN$Z=oLXM-%t=Qic^kij?PEQs`plX6ts*L<87x0*%6l z?8kXaQ=Srk=b_-vZ(r8H6eHZ>`Y^H4*}SyDtD21!SEgFBe7_r-F2M7x*PC+r>c09! z>UX^#xrwwVxr=4E4Xj*d)I7QnM`UXpHZ|x*0yyff3N7Wo`!XHSx=R~qE--!bfkF~( z=q1g_^VbZm30Py=W@G-^F1oZ!Hl6v>7}aP}ebdmATMT>F<5=Rj zR>|(!_&+U&BoZ4oX(kT4>-I^&@;PC`@|HEqv3BGD=m_XtS}M70mqx>ehX#=UtfYUn zjC@L}-Ib=C6O~aV*oH?Pu_(uE-{c_cHz*HOF zIuTMYV&9IlRf3lRM|9QGmjM3&%`c@ay%KhXfSsA_B6`ILeJ$`9M;SYk(!nsH5&W@= zJ{qFSvv(#x@Vi2zqM`y*O0A9eHqMSJqR9WoYT5%K=D9Ka$V5wSD+@jFPt_FTfj`KBX9~)2usY*0I`k(*mVQ7K#1??G$4Hqu(NjUfX4A4p zMFaWVe#u0QH6z2tUq0Y?nM*5A62Z(7AJ)K9VDjtJTSu*p-M(g{tAY;}aH*T$ASYdg zuZl3}JJO*>i1Qzc*Wcyux0C+_P{+QMOsV)n%+#ythtn#o!*Z`F39D4zX($@IpHe7< zM{vJv9OJJ`Y5T`pO{%n;(QaINq-R>PShNU4vNJ8C4tk+JAZJNf2(;K7 zwG`A^RSLS7#L)hPjHiebMJAk4f!wV52Y8_dtz^3Z)x6Z%KrI&M63$Y0>xfAPXgU*= z|8!jsX?^c6pI?>F#&)Kcv(oGJgM!mafSf!_caguTxsNYXtRqHgCa1 zSNZ<*`*avkAp0u=mE!VBMFWx_#zR?VIAZqL8}yS+K=$Ou&8R+Ph*lt@bmsmt2Ls4} z!}W@h9zZgEiH1K7WC?#6xBBJsfAQPDQOW+k>TDY|u%`(u4-=zX1%)kv?-C$>0aO40 zc0S}Ur7k-HJLb{&rwse-!%2E8j=pr&IOlpD+1l!NC*!jo$U4WA2^=l~!dDlaNZQ=q zVu7vGI75v6R|F?Nc)X}E8XrV0VNp2M%Hc%tz)*7SaH_x?%_xT2{BwYRGSc%cUYNdC z=?6k40NT_d`w1*a;k;Vy2r)CVdTkp#4tPNLNG0FI)9H z#rhxKz2F3Kq}IJmD~7YYS?eNTeF_px=P^kr0YbUA-i{;cUwNN)qqDCQespHBCN(I4 zcKF%)M>*6ENaWvk|O%K81o%mb|qoF^$Jdb~DT>!@p~Ae9G?o)C%rKH6I$5KJiQX-iAFx zR-J?pj$BJ-=e_pXZ`FN)GHD#R&)o!5TRixiOx-oNRLrS{{>j&Rj2}5&x&U z@K+Obg&ne51MGTgW{u2jQpSqNjavu9o~8JAzPMmASyaU#fx_r9TB)6Hv_F`%n%kSs z(X#L3`CZfes~m@a3z=FC~t>jZU8bk#!M5yO_P5;vykjKcPHlU zxyOflQq($304=uqpEAoISd(!GSHVu*h}LclaXqKI@@7dH|A#1tbZK|Uk{7t_9-_*d z))#DuV%wILDz||xiJ=`cXV<)cYgWBkVbm*2~K}pU+a{s@j->fckG=R|yUgc`=fMco80C;4m+ zXh{Er#4GN?H#uFP?8Dzfytl2T@U>Whm@jkk@1L50qz#{CxZoJm1+RJlAs}R9tx^~hWYTY@jq%T|!VxvzvtY*$~A_Y*E>VHe@uox!r zFzJq{s>7OAWf6XpDEH&M2GjiX$y?`%Uy;U$QRvY>m0y##zgcTWW$vOtN7zbdDvVH? zdWL3%SuTq*7sVwlM}|R?I`k8IRuqrYjB(i8wHip~Aw@l|V_&=xql>+a_3)9R+~ilg z3E{c9oaJK$TWTp%{L+gu8%%^^+;dnMRh^NnuLmY><9N#r;%d|(Lrg_o8?grk84)aM z1fvkr?>8G%U}qGX%#MeiqU^u!3K;xsum?U52I~E>9{tBD*reL`59OktvhP32CQVSEupR%ST0^nDebn<_7kl4vUJWSEeuGPYB%))(u(%xgJT6) zJ?@9bKHB)JiG0XXRz$0wB|*D~Z4yc$)g8hV9fflN1s1`Zv&r(p1m5erH8ch1!SN<6 zaMEG3yo#667tPQjlLU3VMXk?kYiw5k5j&4hsR}V_hEHgRw^5QXr7x-FA#h1Hp zL%Yb1vSaWHgvj1<^>F)D%2C#E`#p0|;zi4@^yP=)B%F!sML%y^%ca()S3UDkWE})g zD~nKlYu1<$U$%DgQ2V$1m**O*_F-n{r=m8dW2yRZE@)NpO4?Tk?&_I2N^K@|L92j7h48g(^=8}?UES5sQYOjkM<2zd+ zmxL9Vj_k4glrSsdGxu?i!_;nWmf892Dv^37R7)JLa-h{Q*B(~pR_XBOU`$zSSGE4S3k1OXM_-t0CcAVLWWS`z`a_3?)+*+DB(H zX;#9Hbs?eY0-6t7pFNwM@7;p^7kE*K?o_?is7(S5ExW zCt8?f$w3Dtoe(2P_>pEY`UJlxYk|pMdVqi?|F%n&S)-J%fMew0)A6*itU|+XoL0>XoVqxl5c zvLbXkMLfQ$u-?bGn%lTP!SZz!6r9$BZc3MgTW7LfutwvuLD}c4#0Ok41cNHcVt|PU zMF9%AXSvT4JF!jrtJxAjgk$*>ztWJV{k8DQG$&X}ZR>vO2u1vB+URgqFWfbr2JxgE z9Y}FW-jg&-=Et`JNGpk@V|9V=kX4h!%Oe_jNG`9!v#eo&P%TU;?UKTf%4Krvp#I`O zwhce&tjs|~fOidu;0b<=gc>-i^3T3zL~w6UVZqnRB%5oc=?&mhIXaC+#(_?(z(8z` z`$SRin_!}KR-c)`Vj7F0%5vnNTs{OJW`SlBFwT8aRz97wrwsbLhK5J)g)zYvNa2=% zNjBON008vml1EYuDeI{a%v84IeunHOyNUoAjl9`t6>e;{o^%U$W5u0Dh8?Wh7BWE$ zp!ad4Uh>c^BPw^e4tUuTPPNk1n^;V7@XGELHxs+@xw!+%c2drBpcKI2bY(3jsP|Iy zLx61)W&k~RU8bNI!S;}>E=+Hu&u-`*s&f~RI-o084`U$xQmH`I!l`-z*6xk;S&TE8 zftBu^q~wv230|1zT>F&|otXgR+h$2JR8W=V(?I~0ql8ULWtR3WqY66%wv}Lz6It$4 zKNq4nsR5Bt7YXZ#UsLcIny+)dvlkdy7lCsn?#)F*jfVxdte4#M;0}eLN^+*g zk9hf{Y(v7y4ItbCciRtoEyb*BFZ6QeM^I)VZF4tBYtDR#8w<}?zbok5Fb;gAV)!Nt zip0K&Fbh-d#39gbW&5;O?RQMzg`(HpZCG^fVON=i?URaf=#BM|`VKAYa)>tgj_c0* zqQ%ceTxhi};U$_i?OefURw}zH!G2Z*@j>c@BWND||M#Dh+ro zR-%CJ#)-lAgI&tF7D5yu@yQ;FZi_55)Fm#Z2x3;!YF@~b&RiL9CQqF6L=VQKd*zQ$ z7>*i0m=xs%?$!l!NJ#jhu^Id{@SM`2iUZ@KmuZN%$M7L%sw6>rZvxc9$&tz9^Fl2U zZ;8FqSMhR+upAHR&B402#}%6RanxHW9KLVkk^&(C89_NTQ?Zo*Hy9Kmf|lkgO+dQk z1v_+MLHf!ds1Ntz?_beG%>n->kX-p#76dl2BbI;5*X%}%_SDvlm{=HXYd;~RS8_2oyTXzuI2eE<^E+)u>$%QH0jXQGnKORq zxv0z5@`C2w4DDjwd0D8$6P{(gg47i1#>vZR%{{hxK81i1WzJs^T#paB0*AY)ma6 z7ux(z+A{_TD+dKUHpEKgvN3b)GE>u?0co+04K&RC8AObVC{=?IOe9HOU@^wlycNMJ zoTo2DWUq(K&{N|!ZAcIap=PJ__cm5u!_$)up$M+|ByUh+_W6A3#ju0dWeP7QY3ROj znrX?+0! zKw!S~cJ9yornI|Y1JhL2$la}%aHAj4j@=6!2qbFbLF!s=3XZk}U;Beu>MUM(X)Wz6 zf{X{S1zt{DAt0$u4<;l~=mB{+v!tv3)tTDfNNcCsO@DV6r?#!0vxkGx3g?ZRk80G3 zxmS=+>K?};&4^iS;#DMaLtrqA5#L_nw!=0~gqf-&30SSfnHfzcq;w#KKoGK4_$o2PN_f^r3>EwV$7T3p^ra zZSrh4LvsY?))hd=G?7#$l>jXD%ekt2h}`f^8AQ8L`-P^Fn!VsPo!nu0mx|o@kc|b|+a5 z$akxT;ox%O!7qK+U!yieKIXFpc|@$cIdjMI+iqjOf8ZXpKy`2ge?aHNqf(C(`zR;5 zBD0}NHoVrqK%x*NH1R|f4ta? zNBq;}0IX!;M7L=?AM8zY0_e)R1cxIpDiJQunEy#(Cv!5bqQF*bCYPMmk7Tq3_9`7= zPq0@$faPdux`B|{-QHSIrGjV}-Bl2O&CxwzRL)5C!+?K7L7%E*-AfEecC`DF(@=AC zCVy>Qsu32<#>?I2v-!GDRd(WyCb=hO^H>qxya27%9X-99$P{(%+M^~ zX?b9vK#spk;Es>82~(JVJ5`|qBIrPo3wyoyK{!=7VA{=vD)Gn{juGqs@X6U8qQUjk z42zvSpVwGdyg2As3Ocwx!*{>}K?^IcR8jWvbI1!W9kK}VUBc|iyzThJkM3Sy9SxXc z3ylmc2R0wpHi%z^c*Z|wCXJD0k~|p=Y4)X#p&yMa*$9!t1_xOm7namJqKjRr} zu93e8Jdl;z0bQS$9PC?J>x>lPU&tkfA~uu7V@v2~n1wb`&xW4ar^Fu&InK8TWB3a| z>(5gLt(nd7=roRbJp&*U!OvNtY^VEW9MG(_oVodezO)NtE0h*DWiv6(w5(SGA$BPX z$S;YvMl^&E;QENVm3H-F9nC7nIo&&4kTOk$1w&E&w3S}8{8G8j*kzwmv}Sptt5KKb z!X5(+LTzn+@a)32LHiX_WcDsrGMxxY{kshEiVpy<49=k32Y@Kh?6$7ov5b}A5;I1| zaH<~y=8X~|lplSGdHaHcEA4eKyH>brQhyQrIu;k*($JMGN4N_QCtu#|*QX#zN;aZc z?}3NpTxy&sGqY3AHa{@-8lyfw;{JEGKOXurpePEC7V|XFy!6ePxkSkv*7b1MB_mg9OtqBv_ehYF_2m7g1j`siyteYG+SSz0LT z-q0%}>Q9T{lVFQ@_;VPysr6R5t7*)Ks2W>U%Y#%!ufKt3NIY+{ivB zvcv?}tZP>e6cv#gOn3<=T^w6penA;^2Sa8WwO*@RFT*vU(Q@A+;-)lh4o!6IEjz#(Vshd$ve7F=_k7U2&aO|ieGuwCs zEbZd5lKnkXJi_Dv>|`sT+J1EXZL;7Z8Apc3V_mHG!uP@xz@V>=F`RnesI5J7Mz-gZ zATCfhVRJ9vcuT2#gd-Di&FER+`LjXF>DJfjHv(O=K#4?g!`{iL5(hqf~UeeQx8+!MjqpjrmTKjceesIF!?*5FJbhKFQLDj`;A#cH@ra zZ%BW-E*J0jPI#QXWmrUA`lk7g#COMdZ9yZy-;E_}7zNBc#ewhJM^ZtIsgXgT9$%zh zL}beu`2~V%=>rr&oHQ3BojW4v zorMeG^R@c`6xA^$$iA%)rsn?Xj=;xPv-UOOz6?TVv+*vf9DA6iX(|tq;nL}NsqV=+ z=8CQ3 zKA3K}G@W<-_{AdhlBY=y{U!Wu9#Z4yruYdj$d|p^cH`Z-_IUBi*P(Hy1R*U6bh&$n z2)`1kcQ@ll-g1Idir4m}&A1MF>v0`EQ-PUw@w9v!D%j*$rV4GMdO3^d&4mZ}e3?+2qLcN*A90Jx(>?(LW^Eq^R;r#J03dIX(!t>LKT4tb8M z?}v-*6(!NozLm7O%8u->?olAlj*XE!STr?=3%iy1Y)TF6%2K>ERO|`UH;p*rze=%Y zag*llR=|(}aptc8nIFyVi8}$#Wk%>^a&T)Ek?KVd;%cEf8Qs|9KIyGaFOG}z``J%} z8OCHOWQ`D+Jq^%a3l&z^^5mM-&3`IEjUhRls#oCGty!aJw<;G@%KtoVo%v8TRSN40 zCH6Qt3|(f{;mUb${2o(JeB(Y@7|F z2vIS|3mRj@IB)=pAcdvk$eF={4UtswI6>a#>PVCY_b@?{8fk}G!sKj_%2vdpW#^fQ zTh@e;mK0m^o!lafu-i%w^zFudU%I}y{H3tJ}+Mw2$zW-YSS?i`EOCq1uv?q(ZBjq&I)$EfrpZ#j?BPI5>E9k23O^ zuVIbl8#`|rU)df+UD{2Se0rS75AEUHK{#HOj$<_xHP(o@F8-Q47%>CYOmPX)M;s<_34!nWWzkSk8=2`I@zXez zO{qe#4dB7Ukkz{4e5Xt|jcb9dqMZl<+0gtnCb@UZU|6S6L^rMQUu8Gv0jRNR%&pLr_*BWgom4EcZ)IS50yN`aP-l2dAmv{J@G@}q^$*7Q5^0GtPONe9!b|x&sikEm)tC{d7%T10bY}` z->@Sx`#E7sUG;6Wn7@4p!<+8%Ye{(7bz-Wjl9S{z8`ouO>=fI_#g6_g1}3(+=SFEV zpfN>**Rw2Jlu^C556CwloTLjMDq*2e!LOqVll-qRE8gCIn3vG#+&WlKv4$6M%Vn~I_u6Xs zq%iXB4u(kK5EtsI`IQHjm&IXXNrFn5SO8UH7YyDx2yq?nN(g2 zt;4|?!mrqEX^XZB1p#)n{UX!U!;USa65ll_*mBm`m3lzii^dVjnouGL^Tx{+9u}vR zo)H`X*R?M?)xE0fgOp^!FTZNEL`b`6{OrLvPc(>Pqsp;H()AE19AZ9j13TYQ04!eM zy|il_sTc~@K4a!flnF<9AI^kf0J$e%a$~5{g9is*{{49@ldLY#YpE>!knT!_ppd!; zB)J>zV#I=TbOyiS>a_+SgLCKQO&^_bNN%Yxv!P;J8F!PM1}rDMEZhhXGyTTaV3s(K zw%Dz6$61^##Owz?)0c1Q7fhp%BCDwpY2%-gbbV4+%`C*MDvI_wAz%o&NJY|AQ{g2# zM(*C-dVM*uEwz~#fnueCyt#DNb{p7@VCM6RY;wzH=Gpl#EbYm@e_y0xn;n_89M$)l!CHzxltS10kt45z zQ4ZQp|I2d6xau8v`|gGjtwoU*-xhMG#ucd-8z3+#zG7CU@Y=F5ge(_!!}n zd-}C`rONI~2FW9X$&{jG+U(c0eiF#Hr@}NLVffePv+KRt0fx8I1CaK(acgqLFk{n2 zyPSH}g0Io3+SqWFyxk(U+t$eINS-oC}~PV4|nN_;@cB?^%_2pIB?Y$xF>b$YUj6N!%)@y&|oyngGOARy}|x+^H_|DXe0gRy}ol)P-%_o zl%6aw0uqSrwCa!%tQ0hvszo|SMvHqeKm6tk!|4v3WY~r zAS_+^-;1`~Z}7>Z{K^%WKNLKpwwQgPMScf^dGo)dpK@LR&-Z^5FJ1`6*(<>4BU7ry z`Li6G=hjSObtC)T17Qi`LbCKhOb7TH4@7;!D|##q>08u_eG?R=KSQ0g2EiiO2f1Z+ z{vxCo@}u32<2t<7B|^~o(yON8wl&=7!X6z{$_}@X&TsSUdKOEsj^q_IveSQ&@}0>J zV1|2!H{Yu>VhXogOvC){a3%aXx{Ly3c<|VzG6YMzvqpm$S|@M`uM8nY^8Oc6C1k+{QqE_PNf$0F9BI8>lJp=SL-BO~oqJqCs@^GLQsnFuMe zhZeYLhfMl7077D#b6Kn4$NI1rDQ!XsL&>aJz0%#-;$@Vfm>cd#Q8NybGtir4JFFm&h72Q59ap1 zam_emdu5e_PeX!o_yRgNY8S4x=`Cmn*S|9t(BNogEQvR=ggUx606tt51W5aCloBuD zVWoZR|Awt=FxJ9WtU-L*^}C$Qdhn39mT6s zZ`bV>8()(YN&AA0i9JW86zhTHk!d>!qcVu98({V&xG>O;6IxrJOdI?W3eKAie+>oDiN zjeAB;Tf(q3xh_et`h03z1(99N$!5?m*rE*OTICfvC`_HHAdL;uRK?p8Bhx&ylL-atf=^jP=2$< z97bUn@9luy$GwijNbkp3J_Hqf^k$*n9rq9)Ab=q$CdQ!{RxO!S60Xx%lih7iGu0`n zKB{yHN)K)(!B+7@!H6^HIKfZwHpQ0bB@E0XOO#JVMT1r~g&enzQrhc@FQW`p01*k( z#zye2@{i|7iY%RVn(CQDvmKBErQSFpJ;2oelp%6^&x{89_!u3O34ju!oJr5?bgO0@ zy07ukOytOnn?v5ep`+(6cbm5FeN_7|LLeVzwfvBp_2Gi{M1ERbJw)6H)J{Q-OI;hs zS@fSdqTrGVZS17@pfr-x-T$O0sqIm+@xC;#faB<~At}qN85~!dWa9K%$0b3?FRbe{ zXVYeBj#x~L3~nm8I!U$wLhkM$nU$v*gLLtm*o z3!_h~o++#PKUf(FTVIE6I=b%#FNyOJg&hQ&>3Ucx=OWaKtYH&s#&b_IauzR6vl?f_ z5y1D_oR!w)bP}Ogf*p0M+U`rc3z2_tC?e1(xnZsm8B?^kDh)|LAbf4XnTAm9)%9^R z`%kv{1AQ`&%oH>=!wQwcJs91{l;#S#$`zrHQSD5)PfF`nP#-2tQ}(mm+e&4HCKHar z(hxj6-)8W83BQs9aaC8gZqu*M8ty7HEif$E-K59Z_>3D<-Thd_u0O@*y_e8M2G75K z0`xSc*8=2)>tr`Qeu^9NE&U14wq<%ry4upnROykR+`zN5|L0S z(K)T&k4FZ+1peHr%;me#W#M%L80$*ijY`r=X`BA7$~Ljn#JhTU-(SeWG;5>l^SZcY zN(g6HMp3a0tdYlMbIc31O;)d~(8}QZL)yxBa-1?`b8ClRLR%3PxS)7cT2pr`c;H>V z4XT>nEg?Z0p~{e3;BnM{H(b{KLmk+TT-B6@&&ow0dcU9~cCwCNJB46qhT0tIrs@3bDhm@%NR5 z2ft{q(73`=iiE+a%>O3m@|7%a27tD?>m+Zt$N%k82m_s_VL4tZ6~bWmfcinLbuAgp zrSwTGE8*Ai!-cpq_n>>edC3qu>3D=Y4~k2dc}b2gjdN02tyP@f`nh!Dl3%!k9Pfwg zg58T>#wbMV)Wftt*^(|8u%WsQME{vsPVmB9-_eog?$i8`FqjSyb?xQR#3nGN{fNiw$aYa^8Yh8TP0ER z8GpLa?-x<(gW^Yz+9O3pDaqG1-cO5ok5A`E`3^tJM4&9p>cN2iT4Bn{1T9+Nd+N)- zwS^}D5db3{X($DT*mn8~{pR&QfLtEMcutYDn4W8oL)Iyvj%OaQ!y-_1@o%!R4#Vk1 z`<~Oua9ps^p8x#v-)a`>5xar*Q!d_s*1e~9DPbjT(flVBVZE_%H>aT{8%NEHw+eXq zx|N`=5h6}Pzn*Oljt^hiFP!n@;Ns{SA+R@p8kDyLkhlQEp>`MGaij;_@>L1Y!qtaA zPMkyTUudRB9|aUx0rfvfOt;@989FuY5m^b)dBQhcTS0@7h~d*B*<{{K1%W}rsbDaf zVj6qA`#py=CL~Qy*?*T(Bw*J^_$_Kro0v$g>MZE>;uJ2)xqL3{ z1maKKseJFbtElQcoOvRE!r{8HbX06iu6FX@)n$YP8+`^$YZ?$#rtC9g$<&AKm2_27 ztbaO-co`!Gnu;M%jo8Cn)y(py(ga2lh=G z9^zc-rK8DsA1Fn*Y2eclr%Z%L_FOQy%w(QkK$-uM7|I#o=ar`242e5w7d>NSwdmXu zOAxlg4jQ(&PRHjk{G{pBv5jrzU>Ze#hlvP_5wD?_oeMrV1a~uec9Zt~-!rzHLPZPF zxZVmczvb>ESgAf|uA1EJojjwA@UFoLC`oS={;wLXOijwC1ww@5m7LDJ6OY(u_XTKK zM9@5zQ9&Y%;9LQkbu#pfN?2~MrYata(`~{41cp7w@Ni8ESJ8YRp>MGB|aUKF|Kji8$^2^jV4>SN~&DY5q}TH{E|ZzAM9>%Zs~_;c^kNvRGe5%b)NaaB(b`{y`)h;3sAM67v{#| zRD$b-Q$ioB$6YP441KoOdWDBE2fjCcbAShq{A1C+8M_(*=y+E4OY0`QP#oQJa(DnD znU8a=@$imiU0sTL{N+RTjHa8*Y@vM|gJuTUr_8i1Y8;uPBWOZzF*j#fKCBqjsPXD;j#pQlD%)t4+cPycf$xA0x}*xhbYZBnAL zl;?t5%IPEj!|+Ym(D8OwkF>$|*)?T}tP5@u`X5cMvWG$jlsKJU!8Bo5ZvR>Ir$bAo z+N{5U>>9PHw_37#4g})lCYaK$5qg?^2~2_jz0m>mQi4ynpU0s%BFF&q^K0HUTW=+M zeGl$I$+OqXgmAb(tZDXL0B`$JeB^9WyzsGp9j!E0C!vfzMe7I35bmQ*!`(|k_|T17 z5cJ+Pr+8$&8`yp~_7W0)umkcGGXis-+=hi{y7ZhRBr}9WaUlfk)H^bs}&Kr2EY!(Hl`Wx5Drm zZw$p^O(T zbU!m&*c7&?^FTj_<>LZ=M()Y~S4!0w*x3!_D7s;=P<}?73sDSy$7bTx&8E)eru*LO zH$z7#T&f5tG)m$84b1Wee}^aRHPjVJ&(V4w2s1YY1DNK^VPBo&WtNt2B;-(QVBI+qvb3x8@znbk4J1=K^XpvFRIM3 z1lN<3B*3k&0gp1Wb<1Sq%`d5gL#_trFPGTFh&Ns7craX`hrn;Hjg5~|slqEgyxs;e zXSS}tYi;0XH}OtlJImq(DOFZ1J+K!C2{npBCY0-A=Ga-1am~)!l^R37kPU|(8I_*bl(+m~1_W!m{11ZQPhny(FtW)adGDZS4Nv9b#8oNP@%b8Eb<6o#}~-ufUZf zYw#P@g2OZR^6O=o#=B5~+6gfxv>Qme!0?Q+KSnLG^VOCel} zV^0z#K;PeRwYkcoc*G5`m{*wm;~_+DZ)}5-Kyr-8+ggR^tjewCml(BI?+(f|JA3E; z@QS*PSh$(XD%l7(f50J;ui*ZaFN#)cR-yG@-DJgm!5%`G#YZ{vj-F>ZT0!+ZAh7K* zDzzP|J!M85N9@9tObYki>K6AC(qrQHuMztS6~tN+NU{DSl_3VI3S5SGL765Oe=3`; zeE@DaX7o9pHMr_AwN(TfN8QCjq|5HmEv<@kNo?I0VU96lBfM#lyC;oQUNF-x%s0l}y9Vy-Y&LlraCsS)lYL1JvE}pz6p3&T{_!=X(vQ!(& z&U3z{b6Zq3!>b03WTl|s&0X`7gvHW`MN;Wac4H+@m_Pm!mgl4j(oVY< z3_s7s^l*1An$3|8@Ivp}%>kS;YULxOH1D>vQhImNjb5Ih?-VaUbw$LzDdUgSCCFEM z7X7XYPbYDyIM7E?8+J4U_l`oPiJEEIa7xPykwW%IDP_KjfV(aZVQ5{Z;DB?Kx&$*{ z$1LGk7MTN08I5mJ`SLAe#RqpDuzSYjkq9&^imgnF@!3AgR&1&=UC*YOceHd=kdcw8 zn~ffE^#YMt@mGi|4^_%S8Y=Zl71skBwymo_`K~^(V#pmnQb04GsqhvW_s}?q+==RW z>5|ljKf-_(UOIoNsfmJOYtVuGS6s}{|2y=fiUc$IFv%fw<|lP3 z@h56x!IKgA@Eex?naIFdcCQ@E$(H~axmJqzL%@sKoxvY9M+&z=mZiSaM-kHuR<(6* z#45tuZVYvT2{G%DAKp=Yf7KXKAoKt!%B>*KA)Uwt@=2%=p&13h0+Q04)GbJgaS2=QYy87qETay)K=fgly5om z{{{8D-`8KV;B)kc@RS@;k>mR=fy4F3D}{qzOB5KHS8UymzO`!-J|aEpmmF_=74kZ%kU=2s=+B^~ z{nBiKG}3Sns(JwZ{jXmSh6qiWanW3UFkNaCiAMJVm2n;1CtvS;8jhd@{e62oMyE4+ zY{8NqJrJl8Z&PT5kDaEJT|JJ8K#&B`D^#a$KTpwP)A}eQ0$ERUW=o&^!buLv`NVy^ zHuR1_$sD+5?^)+1me~(cTLo4Y+>PM1oNy^sMep=l!lmQ=%VvC=#qCxb@REg`m@hc3 zqnl$qw{#)hY-}Gy!K}!j1*7U2gQmZZPbJ#QKyp45zyEF)u zx6=Vk9&Rb2Pa_|wObW>v?Dgn!3$oN)P|~DHr}7^5S*H0+oq*5Xn*VQT)}CuFop!7K zu^%a@%-ALi6hQTCc|m|OtMSLL*_-Jfa1$=2KVxZr%wDQ^7N9uDM&7U%TsJUE`jksG z_?NYOaS4i0J62DJ3qVY38sYZqO`V;StkjNQ4(A$(P-LA5(v8|w3O;hDjnSA!>G~TM zRAxD#17?n6rRoeL9vZmA&v6JSw1mDB0at1>zF+GPs=ne@5h{uPBLW`L`r>)p!Plpu z6UF&-Xbe%U9eMQCsX2vFFNW=)OJz`nW)qkV+$|d(273kBo+!%5_1oC^O+f#hj;?GV zOcRwb{+9X0wiMDLTU0$c>Cu<3ISZ1n5$VtfG?RC03)s!~Q;`VOs@_OK_{T@2tOy11 z*`t|LmdL%ALL#9tN%~}dy?qZ!PAyCQd>y>JlCbrmWNR@aI6&x)p9U;KLJ@LEHrOR( zB-n}qG__)@JL~L4E5!xeEnm`cj7*jmrnFkE6gj?Zw;fhtk~QE5S-Q(o`B`xlKp6rb z#j#jXK!Ue<$Ad$J*6CSn!+d%nphkPS>z`lO23-?V9?vczXG}G+PYAdUOWvl2 z!LmIQUV!Un6I$(v-A7&U0+`pqlE8cq+WVtrTnQ;WPKVbU!V9T_9!1u){UjTm=S>U7 z`#s&+bJa~J8kt*6oo|qyih8%4f_>hZs3VxYl8x61FF7ZIsyCeQ&Xq_o8ae8gHLral za4pT|S4ZNxLWL$9hUgh_&1t{uBx(*+T;2Q!vi}P)UCnwC4mP60>RAzupOHzkKa8(Ax1!BGq636&;Bn8Rmqc-a(BMIZHWYFIGRJF`gT>YL0I?D4L zqInc-gAkw^x9w#sH!zoy;UxA55?gC24mk0x(3SlCq8ilhL{lA%k>aM#&B8Um{;Yvkuv*W~jH4i&!O` zris6-o$w#^Q(X?VL}V{AzMm(0q*wKw&L&4!g=dn%Yw7xa9v_pF_7MY{(|cG_@y5;k zK!&9$|8!Rdl>J&M)%JxST`{hs^f3w zwAJUV0W9S2aE_RX_vMABbYD>&hCdp)=iKVU{0iP7QuJTaTs<=sSnWB<3?%p@(JhOM zG7655pNSsfk=oI|NBb-c3F%*R91^;R-)qYP4W|;N{{d5j8f}1V0Pchu&q0V$Ty$z& z$p12_U+j|8LAOS%m4TnGxRujpje#fNswN%kkGmo)IZPxM}lcZjzXV zMP@RBKO(%sre;1@elFv8W`=+2yi>Lu;ovFZj$MfycrDIz2WoE_RZWT5$T-K~G}o8Y z=s6_4gTjO6W9@lXDZr6IO1Uvr4iX=^QZUnOojI0f0d>wpi-yoopN>ydj1_%S>=QhG zfC+JFR@pJ$tj&f8(PE&TcN$W9?-+|VJ=;auZ5ezc>Z!cfJ|y-T{^Z7Rf*1yG#fsVI zEXgM9vFL$wPx}0W6GLO@Apg$ZiBQgu>k^ajgU_A8*x(C<;1!X0fC%sg<(_zV(Ka5` zNm)^2)hAHd3~aFg0RTidD1RZg?tTfMUoGv`U1Z-ab6M#b(9P9x`nY<(niy-+Qkz zVy0|Eh;+4Vc{iDxKH{RnOKT=CUR&kW$4k-TRKo;&p2T~u^DD`Xy-!Bcu4Mi}nwPrS zq0aR3Ht8WQjGW>}fdfD9z<5*Sxpx=YeaZ%}=4&ZFV)!9DL%C1xf}x#&z;GT;@O)gC z0#}spy0bG?AKFM`?}x_Uv;<0SL`iA1#tVLE{KZ1*3kb^WfdRfdtbOS5YyeN+hQLiMtZ*b_PuZ!tH^y6~%> zl4%Iwc$No78(c734Gqf@Z+zV}*P?~g8o0Q5J_YciA?iG&N)P7Sk41F`?HHe06=M(Q;ozn-e?TMXdl}Xmn9x!bNtv-&45KxN3-~ zfF+ovhB2{b5Y|4R-67mD8u*ge8MMdpt9L0^kZ{X3N-zbYjeC-+tVVMU!m;={Edi}g zj%^-hQ*6Y(;tAP2dlyO(DMW1n_Q5%zh8T?Eh<=a$jzbDUcscCBSG}t7GhkUk z{e@$ymA@J-C#>L8AD*JBpV*T1S0b#F&%%+(`L1HJZDszZE47D5x+j_H?04J=OMyUq z8=Gx5*Vx9B6*)^HTY+M9hM6*Eq7v9IUX8>Qntd;p{= zYOr#oWT25RehvW-oUg=zp5y-A{fS?<=w9A9t0eQb+CkmV^!4)HKiw%2<}!@dI!1hj zAgsm#`6x({tCmR4!DGEQP|CZ5o9s|L9wpGyJSVI!Ieqg{1s)?VNLa4m1PB_nr6VM5 ztMB_%t(ft^MtmJ_Hr$KMVbA&xiiV(Rs~0E)J2II&Er2lJX3d!=wcE=< zXR@v&&}Gg|p}Js)G=0mSEVa?M;c-={Vsmfi6fEkf_TE$`JaQS)6lmWlX^6obdFmB> z&@#P>`{@{uN&fp^ic}_c!!1Q7b1j|HABA3mb-%YB;l$68zzu2qGr?u-X)!%!eOAKvw0{gf!wIXW0>p3xy} z1mdKXP9@SdHU?QWoVQF#U;xhEj6qh%f`xTZMEMq)V_FHlF(X8Bo==q2sw6bo)UQ>x zy%H%fZe+d_=R{Q+(xVgL{{N?KW%{(8!Fem8PEW@I1FA>%))3vx8?>KQMnX zXmkdxb_0X3P1DMYLKkCiiUbTyC-wkZP88oa_xDuSl${ga9y#UY)S$LCWab9luIbT) zx`2(`z)!Tj&96lW6x&xffFB5iiU!eGWzA*SZ;{3ekXXQj$%7CFQ)tfq&H=6gW1Y&) zak|BMHP-}(uTwL?Twe>W+^W;adBOd#C(WSuijMqgUE!=r{IM)4ceyP8)iZ2D2U)I35fQ7PJRNmnSq3;0HGj1^t@f1J` znGxJIMF#qTsC!HpiEvJ6x2vp}V7d11YpoVdQ7q*bd8jn@eIJKUjo)ku_bCvL*}wfJ z85Hz57?@mVIuAL0n~xH>yHQEjoQ3YTy)hM}w5t7NtH02@r|5sG>ZixBZZ#^H7&jj9 zp)dka9Mnj5ozG4?^T~cy=Cm*I=6);ZBxOnHKtnn54W1Y8{kSJ!H+I-#TiehaT&Li&2_2*k!wS0M9 z!&A64UGmx(fkmuW0rk=%UP0-}xDUWzK><2HQ;z^grDI_h3nKUvhqz%nJlp4v!uq?u z5!B<#*%2<~plkpgaj(lCBKDG~C|YoS97F1zq4%CaMHdkb&GH&WrkI=3uMTMybA`fx z>LUDQ#^_)naErAJBF`ofE|;cD4*5`53d$Ix&8LjT^gT^-GW1KjigH-OzV2fN*hI5N zWBl@+OC1@*g)|XflsZ%S#Os)c9f_=NUIvPMpC2y}ZfvGCY%ndC4u(#g8Os0(S{hWQ z?*+E>QF~fMee$EOwrOLzFDjAU+5tdFWh31g?=3yDN|h+(4T`MhW`8_wRecMDwNDBrb_Sm`auRN?M{rR8m|e=-5%w=8o`PE2LznL;%^5qf zIv6aE4$kPyz&1Z+vsC$Yme$nR4rE@PO6@61F>s7Jh@z-^8(X?m@DI!^&D;#p{pzhV zUBTOO=v8OOro3Y}mkP)A?O?-$jbUFR=MrAW-@dWS;Q;H9XPL=^x*HZ?JrZ{TX*`tB zF0-W~l||oqCH_I&A=2UN*kE1&FeKA7*#C7=709ql^gxamItrA_wxT{b)}fS)*L_^8 zF>qpiD_t#@39fo2*&zCOui7R*wl-BfZA3phoT@u6qlk2(W5|5cKr_uD0l3V5GoMd0 zA9&J@%b%g7nMd zBIsS9{1WRx-dIu>q}7xx^Ig;A@R6P&cLmyt>hW9 z<$Hkri<&EGerESBoZvu=v9Zyym&!oGkX$#XRW>deP^K0m!0QOsFl&AlM;j)T$8cp?f!$kD=QUZ%6v**^VcO7Z?MSxZT`8R1(Hh6 z#0IT3msxM%@uc%&eAPcdk%J}A_a04vynl10)1~&E?uL`(vDv0T9kqB{xUl2$t%vAN z;#G^mZ6hN6M-$13sa=!K>ZeDuOEt`K2{DGs7Z zU;=|^@aRw+LoM(GH@z+&lcFCPNp!1?4%vM9wcTULZ?j_jp+XejjvSs#jsU8T^On;4 z9@dKQzLinuwcTL@S0p^;)KA zf@M~maR3ng&-vp>#Ru?7bGF6vSX$$56M=$0V*+6KK?Z=L9@Cb50xn~O#mj>LKk`Ta zXU!blIlK7vvp|S5pUTxg#OA!ey3TSQa4)u;tKLq-i?PAljN@KL^LN8nyVx3h{szy( z|5+z5JQzaD@U@5n2x)!6;ch>`+_wm3djTB1R48{>ucrQf&v~No0B29Og4HJ^?>eVI z`67j#t0hn|kA<^h$+Ta;7-mDN_em1%Wtvk3(0jS;oJZl+8Sh1^gv)N#IhD<_*n@7iZV-58aX`nFBfT?+o`;)EKs^5zRh?mi&Yi;~ha`uz_ zKgpuz9NKPPkTJAQsD+CbBiS%iNv(z@#088)_j)qxxe)@9jf~1n!vRyD`bP@kS_nDb zVnN$*XPqv(&|e{CfYbom!&^n;uG8K#Mk~C}9*s7`>Zt8Y!M@#NYA}|7n9BwKD3TTA z`6Yr%SgtxXul**X^n%FSBl{zM%&`RLZ`ZI)r44qo6R*npm#*0X3{@(Z*!)QVL3E z7M(9v2gY8y7egi|$NMLVb+1_z24&}bba&p-6wUSq$nsqzB4$1^x|8;yqI(`{w^RwA zdI4+o98W}&Cjjb#d$}-vzHqDje`GGO*++~JkXzn@=q#JurmebSoWS}EEHDJSj`-#)iWl1#Po@<I+sXU~k$bF zZ9932kb}6VWwovjQ+cuLwgtL7Qa5F1LC(Yb?(S%v)K&)JxyH;l06Lq10Fn`jZ?&)l$G7taY!n`oKBJish@Rfgeb}2j>ter0%Kn!6|1oKFjNKisW65E=L z2kjjZCMgdg`(w=ISq^UY{Jar_rtSAdWF4`FqAyg zSmT&A;E<93_D>R@YtAQ_@r3cD_;eNmPWB5t%t2@5(fV*&KZ_NjsmKAwge6&kD+->| zskm?`5P$S3%Y5yg6nTYe6J|LK1g8swQSx<~gWO}6MpbhD1=?>wg<0qN$(`E2KS;)Y zEB{5mt!0G+xl$T=;3g=H}r+|R~Tai z`YRC)wTy4O@F@L~yJ|}n!|m3P35E6djByPsnT71Zo5nk`LXs5F+q#CU0INap8OGPk zLbz{^+r0!mr1VLIyMV{bMMykSI|P$k+c`t5w$V?AbaqG{P_j9az`L(9JBK8hL!DK0z6!c9&>dP7P9pP@GJy*;G$~cwWjfYi z4gdVDz9gY~5$ph<5mf?Af_o1N7~=?GT8eVPyc--ejraTb>r~=B=n*RY&xzxO#R&0r zSU~s)A!CU@@)uWlH7;cwS><4;Z6*myJCsgIBnM&OaOb|%BY;9-RH-DOd73HEJLYmw zDxW#S2L{EgS&!;O)`kAs^}@WuBKO)K1ryR^BeeeL8`q>XxIX=erBF0>P6Zru zT)&g!-@1Cx7DdJJd>*W4hi`QrP2A_Rp$Fo}QjyGCB=-jN61e7>emxa4)6R!xKKdv+ z<%K7MZ-rjIJHq4zp7go67z4lIks38+GnXiHEx;3%ye%E)LmFfC04xEG^M{IAtr1KG z-1<-K17LmiL>WX$GeBS3fyKyB#K_gxv1jR=Wb=r42MDZDw}jd==-wJKtM9@ix+FuRY5613T;6MO6IT4U~J>y#}Hi$Ts?1f(gbeI_5 zt1vt5^$U!1QU1vIs=bpHRW;kLXNk;tB$?V*#$P*Nd3YO(YCI>zlQtJsiY%0RG40^o zy`l?v%Lle-&L6@yrL&U*$~*A0-~h6uDcZ#S(>*_C{MhyF3Y2Q94v#B(Wp4{%XnL8c zj`NRLTB~Nj2LJ2RBL)gQ7^9#JR0_CACc(>s9Hb9@wo_(D6$hvQc?(#;{?I*22w0hH zeoZFyd&*l=0)?wOR~Z(tS@aq)l6(~Hf#~QU@A*0V9B;UNa&f3;`+!UtfKpbmCOKVM z#bIUZx@jm*cudJ{CIp=!e~FH(8Rt5)FO= zx640@Wn*x*^%df=?2z#=!-MgLq~Ih5bwjUOv||#9 zg-*Z_yz@K*R6a!{NNONDtsAgQl2oKFl!%IO#XjO$O1SBrg36W8NOoN5@pKdy^XP94 z0mD2_e@0(|^w<$>#z z+MO-0Axy3g)2}vBx+o|MHG@bA+Rl+qRlT}SVy?_Ko6QR2o@+(?s1FU0>1d!W^&6KI zY0PJwZ?RPyW9Ww+Z&A>=oDd%#<(WB`m*fCSpZ*lXPS|xL*{hc|(~x35mjm%sa~(Ng z0$a)2H<~{4>H;K?1-cvu8z}}~u^CQ&Flbb<#xOh{7R$J`tKI^kuw#_HpH;>>!_VKr9^2+p53;b$@Kfn9lWV3H=bBu(p9S270vm zAsvB+?JYK?#I&W^sS%BF+&sJF4(8^no=z=i(y^O)=U@a<2gY`DxUXIcOXddwt%K=bFGHx8 z^Hc1Izt)<)Fdh<^fU4^}FFfm4eo(igI{z#>UPoRed+-Ph@}HA+afn0~C}4bJt=Kp@ z&&y<|8VFDC!(>>S^aS%T)!9ID_-PUObapGhq;o-dHA^I~`E(NOUWz#`6Efu(a0>ysuq_hcX&${Z26GO4#%2sCzuY+ecB_U>5b? zZZVwdb$LHD+z%QPSl$ovGd2#{A(b`;7J9uq09gS0EJV;JcNrkN^yJc z`Pv?tKKyvJQ*x=ex4qE_QVS`IuexP+9)?5;)wg6<^VM&y z&daz`46Z+l8=&2r>J;8kjbY^9o&?6nHXgw@r|EK^oukKH(g6tHv$if$b{aPtp7!V! z)aP&#JA8lZT{$D|f_nig(lGAC(kQvGDqXI-Ebu9H3Exo#_Vs$v4_A6Z7ct;I=S+*Z zGD$T8V9Uh+M&Mpb3@;U%#AJtcX0l8L+0Kkj%A$}2c)SDSlffv9pWVY2<~H$lG6%Zi zm;&kJ*%Z-@_8x3k!UKJz5n)}BD~(M5tdWFZNoZa{m)I5yMh|z|S)CU~r|C;OGmts? zjW(}xk;wppU>Isph^6YGQ|X>&yA4p;@ByL*D;6tzojZ8EC1`+>^CqN*D@(qkG9MF=C^TaJh!1GD$7JWNe{;Z!o6 zG~@GfI38?Pkc;3Tj4;1M)$A$|@ zDzWNQjY_w^y~L;TD_i1X1sbThcb9aHT?CKxug$@Xi&2VO)oM|Uj=`oRQ@YQLl+*Sc zHjE6m2)-4%Z#J9zIH!(f8@hDE^WxBZ4olOvBMc`4SDN*GA_c z@FD(Vhr@RX?avb|8ATS_@RSZ+LHZo4(fiBtC1117{&v>tUM*J7l{!km z9sA$K7jM*@A8~r>J#Vvia8-CllHPhgf-F;m>(f0OGjOcoZUUt~!bGBg5Mf~R&cyp# z$|(*J#lupCDb+$d*9khmkZ^!#3F5$!cA6^8rL*CU*MKxmiEEYpf*q_l#*BfDmF9wJ z{H9o~|7{|jqFa0~D!eY6$XB(+idTK+{Zhk>N%B!RQR;P3xW}~17*#QpWh+T}!lR77 zcWqE(I|dlC=<8{vtH+_&_BeeC{lC1`(p_cWzjI^xL#*q8$`5nDjPJLxH6VQZ!(w zkqj@Vb41_8#VHMfUBGWbnp=OUV`kMX1uW(5BZGnXd?{=mR7mEb4e#h0Mq%Y^JcwOh zJl2)$yS+I;HkAMfY z2d*}xyusvxe4Kw!b0B>hH>Kw)f!3+ZQxgHjt9PxhTSRJ`A+b-*~d_b*-q`TU(wg1RK>_)zL&*h8@;t1@C#+Z71X+8~tsruHhS%VTW)X00D zhp9FOpGD-%QkX$01PVGA(VDM~nMYlrCYB9yJR#6JN`i9DVUqJB;g?(KhaSIzexBpH z90)XA)UE+>k(-)gLGz$uS>)Up0Y?g1o^~cS{3ztQrJ$6GtSu@-Uj2*+R+Gaab?7G* zxdi_EE{{5Y$i3YyV)=dl<2pZ`RsWaHgE}P`S9R@#C}$gN zv;IxF(S;l4%5IV;b}f7{gFBk^P;md}W9yy4GEIW1qYxRCh}-^cafP=!RV>ON>^Ol> zR`L;(62FQzZJ>Rwmm0KWZdJ*{`Lju|yR_Ypo*aE@wL1w(CL`Oq{@3~szQLaRQyNkF z$Aun|a(f z=D)`X%WTHzCXxDN=?#Qk z`G*4aM^Is%I8DitJKsi*5Z_eIbCXE9c`hoQHLoY$pgZbG%3EWo74}+D6mmZ^N65E; zAa2b)g_5HdtX#WeI3(MGS`vBYVv}nVzLRb4{Vv;(+_viv0#Y8h^dqS*+PUsz1F8QH z#4wd^@T^LEYQWoMvcaiwKeC>cNbYL7HPlCR-b4+~eNHu+3e1NXJw zhiaJ5qW)KX!~nHWR8}+JJl_2_Wm}^dSp38!A%1b8^kDq}&tud3_-d5{6_`Ha4Ur`k zVcpsKvWq~Ga|pRCi1T!??4JFv-J1ea5cPXm(sHP+A zI{6IAxb43pV;@P&4c6~CAtk+Q zfoTIB&4rK7S9UnJhCRqv1?*;%Q5)+7FM1#}$udxaGwaf{f8oG1DjQ5RrGM9^)HSM5 z9AMh*yyf;lJR0}p!Ei~(=WJn11lq_1Y4Iz=ZdRH9wK5RAkCX|$JGRW}?MtVla~na# zQr>uC^$m%vjQbqOYYkD0jg>Lm&o?zfNp{+3!*rMoK<)C~w$SAHetb3Uk?5)&n_<@mZ(N9= z4Of9`&R|+vuC+Z+ZV@8=p`u_{rzvQ5w}O@!ano21uF8XZ?G9f%B^zNEzB!Rrb+cPD zxNw_V)J}>nIB1O9|DVvbiFzJI4jH&$ZOO-I9Q^t$xHFS1w!H6Z`;itQnL{MpprYdj z7Lovfz&lrh&l&w6#;8ORDpP_g_CMr5?R+pa;N ztzzKp?^cpH&-Ic!6NSp96h9?;z0dH*2T}nPifRh%fqQ~1i zCk3314ORlRB|1&i)sT>sO?L>-AkpXX^8(lG9gMYvmEfeW*w3|lAoo4Xs8#U!}F zs(`jIDU<`UbT)Pp(nJtFbzOl8^5=@%=R={@8&D+xCejN@o^bWz;391YI9)F5VYP^g z2sS~#tE(E=CbQwP^t#7@%4i&3?@HR~Hhy2M@{ZiY~tS-W^(pR`)ig}IxErzjsyIl2G<0$gk% zIZ=yBO$8%H)T)S;gWZO&xI|c_6#{<} zB69jJe80V=Pr3Dy#F_vYKncHV;Yhw5+%xp|@PJF@wVRc_>QX9M`ZuE*PPFl>s5!0h zL1h>wBsS@>35P47* zd*D)9)3abk2sv1SF&e~(2ty&T21U$KQ;?c`^=CS-eWij7|K9UvZnd`?eOufCJjUoZ z>pOt;MC9_V)WNf#6h75IK?pX&FirH%m;cRGd#{JL-Yeh$t`&xYRK5DB04rusHRKPO z0o>C!ZtIGLl0h2C39P1!cVO%DBSEvw3k2MDE*}Bk00pTmxGPn+00$xsD}%2diI)&? z*zeX6hvSKp({~!n^C%3DpB=c`{uGaLs(=6h0000000000zVyFolQ)jjY9C3$W2cua zX7)cwZk1%kiSHONB=c25=X>-1p-(Kf?uY;Y0T;6G!@Qpb+`xwB6vFsMLOx)YetKU# z^DtP;6vJi`kU^PldvK%)M7u@nMHquVDP#p>aI=Y9zsUwzZ{u7G<|?{3!K)erG(ZGO z9EHX&iDD88OcBRFZV$djfIO9cZ>;DC&v_96SnPjddCPy18N` zyNp1&fsVtX>vN8(C#x}B_DVGGok&k}#XIPf=3JQ!*RWMoq~7KX5Hxq!j3^$6cOVlp#<)BV0Dm9ggIcMCrpDOipRnnLd}5&Xm6+Q6qHRu~ z5Q$Ko3KMz3-F|5 z|MgOh5)A*C`i>imnxA8&q1Ksd!nl8A+}KjKhr;>`O3l!aDjH>@ zK)5P+jc0rSD$u??S_bllHHA@rAIe4`!V`S*4CTQ^zV^xRlFNecuzLAIpv}tOjcqofER`{n6e8keCpaoA$(`fxCIm|!~c%e4~QD^aK|iORcu^ZK(Fxc zSw3BZb%sbPf#5(i?9}Tx87pdW%f$PQ$M&RkDaNpE>lDb-3nv(40PG?L^3y!4P|yaQ z;FggY^mrQ+iggS-|4=+^=mN+(&XG~xCOa|XU9kVQXs)Mru>&}53YtBB_^HrAg1ER6 zo0i?U-|de3P)CA@J#rx&fQH0uP@Ri&+awh|V$Q$h(@V>!Z?X}{k(noBvda(n{i!>k zM3MHE)C?~IPg7sTG~(b1IKMIv3Ru`hX%`gA6ns4;_@@+}KfupKXODd#Q(Jh$ju-{m zrXh7{atW^rI;T?~+Y(zB*YLzib#lh_Oa|FLd(B;^^MWP*cD;{7+$a@ljiien1}lrf zGutiyk;C0ijp+V>?QR4^5oTCvkYJogn81`{n`yl=+2RK@4D6Hj8kpUWCqh-%cPV9L zdbm-DRoo3X9Ldrwe8rsXBIEdW)PX+i6E%{LU6Xolz$yP)$R^=XcN^55a-VFra3EGl zT0`!6VtTayt*llB>eo4aKSf4@b_z@;v-3{OTQ1EStA>BnU*?Fi>2;};Jc$M!`gtHU zmYnCI&-Y5kDeGOO9^|+T3A=VJ$=qzPPK2M`612ADVK5*onf31or)&*vtDlL3fxJ)l z3RzNLJG&ajGCkbV*=9&6FrN#LxJRhwsHy!7ZQuw!nECLMMFd6Mk>B>glpSd4an}a} zkFy=2P~{LDN=WYTE9&IzBXc7QQY;sl`}u|1#18dS?TlSR+B}h=jwB4nGE3rOV=YMv^IXJ_~o!z2&(~W8Db;Wm_g})8!5Po z!>n?(Pk>mBA_xPo(^Ho>CE2YDvC&&I--^6wrH7?NUm*b$Ii|%mC*wl)NJ4}q&A7_# zBn->Mh%i0=i08qX_`hnq#s#@{Qn-kVrw%TfF;7ldNDDLw*T`K_#Vk4fB-6PY$2;5_ z;#aMuG{n+Jg*hy1FFrKX4g;HfZe9yO^HXW!Rhy_TG%g}4L4F=8$Htz3cH_yQAAsu@ zS?h^>&|b63s+Yeslya44IKqbxgw&c#x4B{NlXGJPOtZTDEAgrQ_adPp|DuN zFqQs>n_>}Gvtw%fWm@X81q1=WuLUJfmq$YcxWt%GD0*NgaJIjT6vY2&^|tb{rm?2K zOfgu`Cf#sWE||uk{DlW2~Zi;e51AMjdWn1EY^uj=l_12W824YVij{>xgB2A)HfQ?K|un^B4*go$9A$*#@CDKQFa^-(xfK zd|RQHb-YMLEC}AHtD0979_VJtSi@y!L29Yr?IbO#vej96h0zGtzTQT*C}Sa0Al}yt z4Jsk(fIR0S=;dLV?^(X)cMFHFm){658~7Y|$vof&&Xjajf8s#SI5hhZLJ>Etek%&@ z99{o@JMwvbi|pLH+k`U7Zz&W%wd^P3DNNdZAT7lZs{cVc+yB3-(($IT1O9W8B_cfO zKcs^kU!Zj2>lm9UcBcSOYi`W>KWFOj4WG~q{y(j`$`@|rTR_B9;NaL^-R-w3XKZkP zAeNIUS^{^a%2jxK|9k?BDvo1EDvYf9%l8k(h%%!h{`VG;Sf|e%j>|3biXs}|pZ#{U z5@vt?0&w<6ngPQ{;ICZIY~yIgE9X=)PE^(h9UG6KI&4ekMEqI=JLH!U(8+@)NzlG) zJ(x3&@(&NUoDNX<&GB}#7LP{7Aq|2HgGAzry_w$G_+(5Bcd&`dQ<_MnWFoIw(Omi5yi3b$Y9?f8^J*rC-32Z*BlCzkLU#SYT{1LXJH7 zNQrk~BE~}gcQS&-R$e9Q8!z55!fgUf8mZS`dq{&!Tr1{k7<1P;+JMsxspxhenQikf zG7Ht2K-=1Bbc~zN#|5KYIv+hQ>NlB!bv+>?^OaUJ>8bRpzZ&GZ663P7pmeIe|GV*2Y1|GLX3j97%Gdwx z7wn0kM81f~$+ZJne)P)r8Om+$##if{7_3CS=Y*=)gTtCeYSm0>J)Ha(j24@3%&QWL z0It;rV}(1!gSMr8@bqj64(oLCCpxvu(PQ?%8 z@aQ9Ca9jl|Lu$bZjx}OX4RAjN1hTUaVMF8cfy!qh>ZwOsEkxSS=aW2{lhnQ)jdnu;9q4bDg?%+h@txn&>`>pKi)?*v z379t)#*BJs<~<|jJ%4Ca1mZF|Ko7+wo)O$-iFg0lY6!7tN)D>J!OfdIo$A?AdM}vM z*O)l>8n6{y`k8i_N*qbgqsRDN2J~Bw%W(8STduPyW6FBi;L(u2+6~N)uhs`ouCR4z zl_!VD)|vRghaAXgfA47G?eJKw%!hs& z7&)N{^jQR~2^r;V-(Q+@+>}^`J$=2N%POh$R{m0}dE^5KI|d980~M4CaQ8BqtD6>hsd_&g;U-kl9abf=h(2{FfqlKOmHxJ*)AsNw|HT> zNxb4y!Yh(uEG6Xo^-GG(x1E3n()g+S@i>7?jgfF%Gu7Mb|6Mjx#NZ`zSqIid27n?{ zz8D2q22uAdtUG~$Bp+Qpq{24hv3R7HCS{LG1t@zhC640YSM4T!!p7j@Ugb<( z5iw2VLd-M2eh@2v-R8XESRe7%m47(qodBfrEY{GsU6Bvr#sbQ+ZQIAl7e^p;h+$xd zHdeAVp?}g{#kW*R5twsp0nR@73MQqskd}00HbE$h+}fpB_(EM|-K8vv&_auOC%eHOXuIjRFc3EAvZQHhO+n!Gw-`;!vxvrUm$vntB$b2*2 zj94pHJkPxp#6?8{~g$3kP<~A!qcEuC`(41PejD1KD~_^ zW^Vmf-ZZsmeqMz7Tvs;3eGU)h#sr*I8yU2(A-S7SC7B~58{Y&;m@`U$Dci3n9i~hyo7U6~V?&`s3 z^NZvY$NTHC?$al9apa5fv2K}m<*NDX>&x`( z=-o$QE9a~K5$QAbllL*u00$Jr6ReVK-!H~DJKA@l|2>8Q9vR^pvpFjcOaREA2Ur#9 zmT#C(PPE%%*INt&0utgGMoV@Cm;jI;53nrk1>XptoM@Zbj+YoZ@c-+j^aC&m(vJ1! zIP%eA$G>MTC}9b3rY;qo5KC<%;D3H>a+f8<$>BuZItA1;U!W3VD>7kty`b$AF1S%e zkZGI&0tJ^sa;ys1FC!7AcyH^JV~!1TecL8{=4qR06uGjg|L0hVxgH=;K<~>z=*Lz7J27u@uRJ=&2 zr_|Yk!XXF;Hfrxx*hX}~GT?Si5E4)1<${{BIIet19YyJnKvS(>zhx{g2fTy4Fbff; zu@VHIXdE)il2l;On#y}nQHlLUW@#bCTIeRJGGK$ika0I$LWfgd7WRJsl^7FoBEgO~ zd0`b90dJu%&Ax@AU(HWfn%PMiqF+M`zDsTXE^}WGk!GJE zY+vhxl8l8*q|J+1v%`xKYq$`##U_adWx8TV?SIa!zJJ|9=v_cV7kWWr5NbOiPEreM zq<@nCwxqtLxKT)qUy%BHjOa4qy1)!$fa|Qmk5uPmi1u7VPsj%1t(4xeF6|9cz;~^U ztM*H7=y{9lP0NXPJ+)8CS2~p$Wl1{Wv%%i!vMLJOc9#?_;S4CgK-$oSpZUd_8Soj( z2C1{Av(BqE5mh`MKV*tl2tSaF#(EK|oBjKmE)*^I`KDrp$lz5--;)NjnF3nYAB5Nt zsF0P8fucHO+k=fTU2|`V6a0gtg9xO#mXt!SVq}Vl9Q&iTdCWV|;*toHB@gQ>P`sgY z9n~5vu#UTuZG{E$w_%bq?uaU z@0B}5JNrl1t?ANlAsLl=Ef3g53@t9!H3iF@_9=o}QG4tW8~gQ?k3l5^w#|-ktr}a=8kGh55XT}&U^gswh0$IvspG8@0*rr=C39Ra@XfF6am}$~Etf4T)E7pSp8}$Pq!>L&qF<5-OGpTg=NtQaQHDNv7Xcg3K1P0Kjya`{*@ENjkNMSG z=6Bp1Zpn$1*&=kRV-}m^i}t}5@7Z>Qbj$gu`ZhJ^`OES~@Jl}gC5uWJo>cV(?4+H^ zZDcJ(-`S8u4yzV9%i&TUT7K(wf(v3o@|B&6rRE?tIePBbCMx!k14Tu@SVc1=B|dQJ zdDfRwA}`;@8(=hVpI!40fo3#|Z3!zkkUUg*Utlm@Q}K5*ENo8o8-(@r$4U~gd~nU{ zpUndmM|o-&t22_n)=bNy5`U&#E&~Vlj>{UJIGSrSGO^P#=skCngwIU@XaS0df~CCO@>sTG2 z0%gDJ8{2$Y0|n^Rip^9j))pDn3di{%No2Z1xNrgq(QrttS`b{i`C&dA4jDCSQmy1*r4j)- zLlJ$vLOW{xXMGC3Q-=uJatn+e33rnjH%E(@5JAPmb+PYGWFFYADjip{(t&uA0v@T#;mKY6974XW}qP|*c;y9ZuBb}Cj z;rP}1H$XAXlol4P|n%n#}|IW3;X!O<83PUu%({?;5mDj9&>PVSZN(dZEFCW3Q@1{prTATu8UdBko?cUqV9Di&*89C3`Q_lR@^u9p{%DqPiHlMF1x`LiJ1!#a^VRQ6{aM1b%`x~deD+JQuh zNn>+c2}&elz3uXP?)ZAe5X+eL$)34eilxOt;$4VW>F>qlH)$KG2M3#Q__*=779_#7 z;X-M{L0&1oMO{9ub*zOu1D4kqjTNGn_)s}N)#7$l(c^n9o?fC+5o?zsWqHJp4*^}g zs~L>Ko)=*FAu727v}E-@#?T2Db-xF@!H<5Ch!1@Z!1TF6+=NSpVMZu^u(KrG-O=`8 zCrq-4WVR^{CSta{e*$_N;csuY+)>MxpgFME*H|qMAJ{y+o*F7YU{VL8UHN2a z%3v3<-kIAGU+ARpb-{23Pxzi)uh36+yaEQ$5E^l#@dn$A@3i3Xo`JIWLIK&?yl@na z3<2X)MapX+=fE$v!8PV9I_kuUT7%%wkaL>uqX2qpm+Vu0j{L~aK~WU>4eD$4#?>$Z z1SJwaU4R7IvN3wuMQ9WCq=(gdikdPf(U&B)5!HcZksxMn;-iZpf*I`EeIXT$6rKXn&e~bt6B|-W z9K;{lpeD%e+I;%pLs*Tb5F&<{CRLh0`z5@AW{Wv($UAOAmyup zSi3lL^1Qp#YBB=UMKJT>bHl*Tt>WZHl3l@zYS|9s0SkZi&>_2^-^^8X2^83AX0D|S zBuWwg7C^Z}Ul=**i&SBl{)j|Py5sfBxySK>|IoQ(2mRoC8~Y{4Zk+Obt5s>J4Gn!NMOn*nvqk%~7j~q@Sb~hLu-9!|{R&-(DS}UF1xC$J3?inz%7?W1 zUvh-IEa1@-zu`3`dFQhdktxEAL?V@*^NV{3p5ejO+I(qWixIQiqUsIN<}swD12%d` zSZ|x>!ck)~L4cOIyHF>Qj?s|o*hb7;A zY)$h>OHutPb2n*}$dCTBfgg*KBD$n(IMONl#7BaVmvPKz&^PlaY=VOu;4f`(K?yEB zgIC5#wI`q_1$nN`A);f=zHCqRs~)f*YQAX`NLdg>ciT7L*6CPQ0)Cyy-pjr}U6eTa zp_GM;T7zIcXhnnr>ulOmad<8pNvs*g2T3!2yF-GBy}l!Eic%m$Iyxz|Mom19mt17m z?$;1m5iRxMrSC(D`^C#pm6MVs=F}lhtQ&NIQJ?d$rv2QVhJ{ZtogHT_VUhK4umO2~K-M&u8(T z2A&D=&ayyN9)5?p>hgXVNjaSGgC9u9jBj}~$z^o?+eIgmm^lm9mY`)I?07SA0T@&A zlh`W8Oh}X~KBjgpqZLk@Ty((xOr9EHBeXOq#AaPlKW|(9!xzAPYpXu^7olx`1L7BS z4GW3F))0hQeX>M9%IlGH@L{tzZ?|9=jWeSZ`#a$LrA1Gt%P9^3CU{wBXkPEZgz;6m zwM@PNF;;2pCS|%IUdN_L>I{Es+n>TzE8cueOsJ2wGbnqZi~m4zAG1l6+z%vNLtS<1 zS?dgWFUX7O9O!bb%rorhLmo3EEuSmb?9qx}*Vi+HA(KhKb)l!oqCbek?8wZ4fR%nM zB#|_znCU(UUQ$`)Y5MiWd;+leWH*bNr<;%p7sUTcH0x&}1&g7u!zsI;`cB zo`sF;o;!G;hyr-o{;A?sAZokswz-sCvGu2-hWbXO@HT-;TrlZUc%EjedeeZaWX`VP zRKM#p=oIw|uldZsI`iaeTT}P?^f+)irnXkf-dns14|Ip)IXJlEb8-KW>@%Sh;<5Lj zzp!02M+vBJQAxNA6ke$J@{>}+-SdloQ~}Pxk@d70@*BeU4xSO^^ia=PXM|-)(O(2O zEUcBng)k9Y5ur(%{_VIM%K#qp*8Ssl89ER_`8t^!D8nIW@xl_XPd$TOih}R!0H6IV zFJG1HnakJr&0;^O#S^Ko9Lwn5XmPmJMm3E$M+!pRml25L#VhTKHSi&9&cqFp>W66}z2g%4pNdGtnouBf!65lA0U`gV2BkB6eL*7>$ zds^Xw0eea7O;eoIFdi-t(`8Nrnj73om;aPt5MGzzFYOY5iV_o_LkyT*LiI_`^&Z1= zt{g=THnYMD#RK^HxK6YNtN-!15X?BmOHfP8zGl|ZJCXd2dc3RVAu35^KhivOQ;;cM z6aNWZ!@ocYzmkRACTHqQ z`!==#Zv`2(UISs6x&b;$3VG*eb(JU?$5mGgOv@lf6|ugaA~2H(97FvVcV3MYu;)qg z=@l1k^1lWVz1!aP_|v?P78s$O^s~vF%{xs0U2nxdV;XAl!_7(!Y?}wcoJ&r#hs=HU z_*PFX5>9BmZ;8b)hB_@^urBlXP7|^{(fMCGiZSYlXADwqHX@yO6+6eoC*oVly z7--ZUy}`PoR-+~4!ea)MB`-%^BqMAl4^PFiTY`hCsF@PFSORkVyTWVxTAQL2s*;=T z7BJO0zJ8tU+2Ve>n$IFj*qGLRr^kmGEH9u1UHXPWxu%d40QjhEv6~3>ipkS1+Xk3P1 z?Z%=mNgF5ABA|$(MKLWM0jvg|1f5ZS5?4z&QM0L0{r)$tI~pVCng2l9nOupYm>>1^ zokIA@aPR5dp$Q6=nJ{Xm@ip#5`ATF`4X~|xa0w2VCQ-%yr9;zb3(GeNWo7w`bmD0|G;db`EB{8Te*a*D~0HGi&G|t zgf5E&q7~)vReTAXo+YVr?v-YC2JiD6|L)pDcV)WTEMq%{0My|-_#=(QtVrWWdCnVR zOifrgK)50Ckxl{zJvQDnmP2vw7?rtw*?YlT&>lx|+0MRNKHz5$V;~iLkILAL4*Ot2 zl_vt*oaev$1K?^StJ04s3JplQG7=*T2zuU*{$Ku#_5El940KzL*ck)^LI!y{Q2ac_ z%%m$R=gkV-2^tXRW;sZvPHtfq(<)?XC+dL_PR%2I>XQADY)NFSlVs}w-$_AH!)B&F zAS?kGfLOQhp30@%uz7{{De^%4dFK*JQOn_72v()y?K+}3vrDUqi(*|$E~7D0yk~o2 z0PeX=jC%qf-1jS%Q8p4rIX3aiJoI(mNS~Z*iYhr~Fs@a>v~HDrajkuR%2=8QN=0{1 zk}iry@$%iVLIIyV4XsD)TELwg+b%|Gcaj3V;VM z8_~5VqITR(!$=QXa@7mKsJR4Mx7rz=tNdWJR;%cy&!2-91TVO5-$0O+PjQ5gf z3rWAbn=(yH>W@wP^uxD8M4ZssmQXvn6CPMAT}E9rxge&8|CeP`l7+Sqe(v+t;~$ge zPB-c|U)4G;ds-3=lr?dp&BE<8E|nSD%E3G}9-;?YXvl(m0KHY+VZ$Su5K$md_7RBY z*dxH`&a89!#oI&45JU?iquZ-^v znB4X0j=-}E)sJg#4@@Q>B>=zKbEAI^BlyFlQuWJ{@^3y=D4Z?f+9H>B6Pi2P_nUk- zg)$8rLOgZrG6xy0)%ECh0 z6s#2$agtT$hW2VVU;uKdulAHU2?=khcv$2gfqA~yP&HC$!G*vk8fwgK%jEsb%$#bS zDwN{Y+06v!K(R3&KXSP$G_aU_%2l1#N6mie1(U89v@sh2fW(+9^m&)_#|4kg!+-D2 z4&;;uw5_Gxc1GMF`C{Zvq!8ulM_5RKv-hIFOyf$3HcY4dPhSqKKh1rST+d*(niU7W z)_|70GHESy1y#!!CC~x7kW0?SJW6o3@G_Ed-O3>MFwQFc>cBE&)f6f%9L64-5&I_l zFF%m}B|JCx&Sx_Wy4hBLrzsXWq;Th9C^De0?MMq!&z^K>Yh0iM|a_u15wsN?In_Tk-01<`zBZ2-;k zuhbz6-~VzR+c3!mTNA>C@mkb!i5(Tu95w=p831JhH7Sh!H8>U}4WuDKzyuz=7>FZ2 zi!aHi2<&ff7nS~WJb_F3vi+n{+0l;vFh9i`DRx)cXGBxX=S2p0gs`c@8kD^w)5a_~ z`H;6W&-+!D#u?weU2c;r5j;xLSozzS+Js-)P;-Z+e?6ushxb z;MPH^6(rYxeFp(Y#v(#-!{7+w& z{^^Ofcs8rc^J6VU;;!PHqW{Zwo3kj#>jHAUS$tzIhzh@SS2EmJFKpr;ZY{W(_(iMQ zjQ*c)ZS({O#-r4Z-e@58rskewer@&$roGt-gj$yTP$|`OSy$v214&Ea@dtc=yAx-# z$}beNYF$UE*D;Z^!Nub6e&-UKm5;e?%Nig4H40_Jf@~eGnoR$p{_2jT}3*c@W>G(ulP<0XTi$0<|eim zM*h9Ty(>(xD?>{AEnRT`qGSgbpr?gSh-k7+B_rxDv{b`o)6kZ2DOTIvcSB?U3>1_Z z=NYP0RR^-HG)-?#1~$z6AnGwdDRRX52;vB~s6vjW`rU2kh(CWAxO9Z>Q@?@g%g&Cf zD;_Yi1h)D(>bTJj)VMML{@y~Tu=QS%K!B2BZk;$#dCcT`Z|&f*&K5n=G&RFRh!V<( z=o_1lB-1K7nGFMQI5KG3k^lh>;ta+_e|{;>V7n0}yEzMujehqgn&5l}#=n2t{I5Cr z^AAM^jP-8iROCmvU=+7h!2wquybrQB&BfNsXf0G}KFx={WZEJkFm*TTyZmE`s^Qb? z;($LI!A-pO$%rp^DL6Qs8I#IzQ_ENnWTQ&jwM{PJP}7n2)S;(=KDp9cW1{XWB)@c8 zb=!Hpj*-R+mS7>xnmn&4Ox{|xEC;A%!CODNWvtP>gZXcG?7>2Z;m-C|cYrc0Gahe% zNIuCbw-h;5Gi@Gx*JR7`+8g|R0{(+ffcC`bV2>33-ZFF%{DdX#AAym2po;{Rd!QC& zGCdOS`9$+aHL;&-m_c?o1mQQE4&!&D232u-4bM3)QlN;}ksQ_@zu&7T=i?CDuF!L( zJavs&wC9ih%=0cjo`1sg0*mqHC@ z(&`2_fWI8#{&)-ggX?euK|+hYKA5QoDHywpRk8IqZZs)Kj%zhe-e&YMhDVl;SlHP= zxQ!ZQaR*&_$1$zg4LK;Hws_TSDyyb5#2n0_;VAq%t+Tb%ByzBXtuuBRMcDl+%*-FU z0k|E&CffR1`FfVZKQ43x2(CoI!cgZuvvy&`Z@TZ3OTY1pU016P4;TG{>Vqh(o#==L zMpgwQ3RHLvEixn1Y?_BhjQ`KM`=e07KL?{K6pKM+>Gl{UdN`HJ!cnKKX~0@kzH7j{ z(MRg``N&?Y@xnKgZN>>=Ee!9e*gW|&84w9bBdLPw=~*8V(dEk2^lilYFw+t0qy%PRKQD5&Kl87RAWk)ghHFD5aXnEuQu zr}LPCWLJ*iXMFeHIG=o^tV?!+qkz3m@ok!F6(mf$?U`;{*}}^Z3I^ryo6L)s&-wYE zx*}f>=&)d)uml9ZV?W~8aKA%9d}v(%1cuyOd8YaYiGPZyJ0bS|gxy(d-KE-Ofa=$z z$lC|i=8ZVsZqPiP3N_&6B$PS_Ts#3V}W9{*jLVu-#|%(VzvSve2bgoLo&l)Bi@D)&eNY zdBKe)q}f?;rKH-L@xEqchT6MdfZ6?CWrx+^pNoM&T$3Lc=T?AjE33?5GP?GcJPt=L_1+ZM1aJ(R`AbM7>aB>OL>3mN?1I536P@pU?W z1bms~7yxc0XUZsu&nb;tvqRfkh}6>JfhuW{QT2M6zv%{!}`WOx_8H>-z#__M^=3 zCUC0hoyc%$a}o0SeVjCqlVRr@u5YofC?BKUS0Zgn0K`?vRWxZ1;p;R0gY_(rADb=*uw9BZ{+O0>VS z7rqaaZrLt~9ei%>v|UFg%cmDAQT?dM1ZVLRrkoH^nuf76KxKZo6qrBvW+*>D?(yYg z>DfeBu0_R%yse&zet&OE6$W1&;ypfchteufqYg<)LMD#|A$A~s0cTNHiw`)Z;IH2} zytcvLLA$t4mqhi1^pa+prO#RIZ_D5ItcubSNW_#X#=ct-J0G68>spzRE472aCBP8Y zy%$SvSE@m}dV({IJ~|ZxISTeT&4=A}T>zmz38q?n z>ANWjo9(Wnz7#ig8}+_?+|Ie_&v2dj5`H=Z{)r57p9$2#*Yt&m+vqU##Z!Y=QcY{x zFfR4&e^M#wQg&t(fQ123*1N&`;1e@9FAk#?RPIS-gWhU{_ z=oXICk(NU{))4@b!;MS)yKDiB|8lf&4z^!|*&F$u?P@Z$q+5WTu1_*nLUu+Y)HU{-TmQ$d>-zw@>1$Gp$Z_k{T{d+R zDJ&Z1E3UbryWX{(x`-i(8VIC811P6|#Ow*zi|M0SrFsZ*c8l=(uVTg$z^QVDno#SS z^K6EQ_hx&B`lIb

    V%;Uq`~P1C@oy9j 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 C?nli4 literal 0 HcmV?d00001 diff --git a/mobile/vision/build.mjs b/mobile/vision/build.mjs new file mode 100644 index 000000000..4653b4f2e --- /dev/null +++ b/mobile/vision/build.mjs @@ -0,0 +1,49 @@ +// Builds mobile/vision/index.html — one self-contained file (no runtime network). +// +// node mobile/vision/build.mjs # build once +// node mobile/vision/build.mjs --watch # rebuild on change +// +// Inputs (all offline, commit-friendly): +// src/app.html page template; markers are replaced +// src/app.css styles +// src/js/*.js concatenated in filename order inside one IIFE +// assets/*.webp NASA public-domain textures (made by prep-textures.mjs), inlined as data: URIs +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const rd = (p) => fs.readFileSync(path.join(here, p), 'utf8'); + +function build() { + const t0 = Date.now(); + const tpl = rd('src/app.html'); + const css = rd('src/app.css'); + const jsDir = path.join(here, 'src/js'); + const files = fs.readdirSync(jsDir).filter((f) => f.endsWith('.js')).sort(); + const js = files.map((f) => `// ---- ${f}\n` + fs.readFileSync(path.join(jsDir, f), 'utf8')).join('\n'); + const tex = {}; + for (const f of fs.readdirSync(path.join(here, 'assets')).sort()) { + if (!/\.(webp|png|jpg)$/.test(f)) continue; + const ext = f.split('.').pop(); + const mime = ext === 'jpg' ? 'image/jpeg' : 'image/' + ext; + tex[f.replace(/\.\w+$/, '')] = `data:${mime};base64,` + fs.readFileSync(path.join(here, 'assets', f)).toString('base64'); + } + const texScript = ``; + const appScript = ``; + let out = tpl + .replace('', () => ``) + .replace('', () => texScript) + .replace('', () => appScript); + fs.writeFileSync(path.join(here, 'index.html'), out); + const kb = (Buffer.byteLength(out) / 1024).toFixed(0); + console.log(`built index.html ${kb} KB (${files.length} js files, ${Object.keys(tex).length} textures, ${Date.now() - t0} ms)`); +} + +build(); +if (process.argv.includes('--watch')) { + let timer; + for (const d of ['src', 'src/js', 'assets']) + fs.watch(path.join(here, d), () => { clearTimeout(timer); timer = setTimeout(() => { try { build(); } catch (e) { console.error(e); } }, 80); }); + console.log('watching…'); +} diff --git a/mobile/vision/index.html b/mobile/vision/index.html new file mode 100644 index 000000000..f08b7dd12 --- /dev/null +++ b/mobile/vision/index.html @@ -0,0 +1,4851 @@ + + + +God's Eye + + + +

    + + diff --git a/mobile/vision/prep-textures.mjs b/mobile/vision/prep-textures.mjs new file mode 100644 index 000000000..472e8c971 --- /dev/null +++ b/mobile/vision/prep-textures.mjs @@ -0,0 +1,25 @@ +// One-time texture prep: NASA public-domain sources -> small WebP files in ./assets. +// Usage: node mobile/vision/prep-textures.mjs +// Sources (public domain, NASA): Blue Marble NG (cloudless day), Black Marble 2016 (night lights, +// https://eoimages.gsfc.nasa.gov/images/imagerecords/144000/144898/BlackMarble_2016_3km.jpg), +// Blue Marble clouds, land/water mask and topography (three-globe@2.31.0 example images). +import { createRequire } from 'node:module'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +const require = createRequire(import.meta.url); +const sharp = require('sharp'); +const here = path.dirname(fileURLToPath(import.meta.url)); +const src = process.argv[2]; +if (!src) { console.error('usage: node prep-textures.mjs '); process.exit(1); } +const out = (f) => path.join(here, 'assets', f); +const jobs = [ + ['earth-blue-marble.jpg', 'day.webp', (s) => s.resize(4096, 2048).webp({ quality: 74, smartSubsample: true, effort: 6 })], + ['BlackMarble_2016_3km.jpg', 'night.webp', (s) => s.resize(4096, 2048, { kernel: 'lanczos3' }).webp({ quality: 74, smartSubsample: true, effort: 6 })], + ['clouds.png', 'clouds.webp', (s) => s.resize(2048, 1024).extractChannel('alpha').webp({ quality: 66, effort: 6 })], + ['earth-water.png', 'water.webp', (s) => s.resize(2048, 1024).greyscale().webp({ quality: 60, effort: 6 })], + ['earth-topology.png', 'topo.webp', (s) => s.resize(2048, 1024).greyscale().webp({ quality: 74, effort: 6 })], +]; +for (const [i, o, fn] of jobs) { + const info = await fn(sharp(path.join(src, i))).toFile(out(o)); + console.log(o, info.width + 'x' + info.height, (info.size / 1024).toFixed(0) + ' KB'); +} diff --git a/mobile/vision/src/app.css b/mobile/vision/src/app.css new file mode 100644 index 000000000..f33a7c2a0 --- /dev/null +++ b/mobile/vision/src/app.css @@ -0,0 +1,567 @@ +/* God's Eye — vision. Dark-first, Liquid-Glass-era shell. */ +:root { + color-scheme: dark; + --bg: #05070B; --bg2: #0A0E15; --card: #0C1118; --card2: #111723; + --text: #F3F6FB; --text2: rgba(232,238,248,.68); --text3: rgba(232,238,248,.44); --text4: rgba(232,238,248,.26); + --sep: rgba(255,255,255,.08); --stroke: rgba(255,255,255,.16); + --sky: #7CC4FF; --sea: #38E1C6; --orbit: #C9A7FF; --haz: #FF6A3D; --eyes: #FFD166; --ground: #9BE15D; --wx: #8AB4F8; --infra: #B8C0CC; + --gold: #E9C46A; --gold2: #F6DFA0; --live: #FF453A; --ok: #30D158; --warn: #FFD60A; --ai: #B79CFF; + --font: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro", "Inter", system-ui, "Segoe UI", Roboto, sans-serif; + --display: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Inter Display", "Inter", system-ui, sans-serif; + --mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, "DejaVu Sans Mono", monospace; + --sat: env(safe-area-inset-top, 0px); --sab: env(safe-area-inset-bottom, 0px); --sal: env(safe-area-inset-left, 0px); --sar: env(safe-area-inset-right, 0px); + --paneW: 0px; --tabH: 62px; --spring: cubic-bezier(.2,.9,.25,1.12); --out: cubic-bezier(.16,1,.3,1); + --glass: rgba(24,29,38,.46); --glass-strong: rgba(16,20,28,.72); +} +* { box-sizing: border-box; } +html, body { height: 100%; margin: 0; background: var(--bg); overflow: hidden; overscroll-behavior: none; } +body { font: 15px/1.38 var(--font); color: var(--text); -webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: transparent; text-rendering: optimizeLegibility; font-feature-settings: "ss01", "cv11"; } +button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; -webkit-tap-highlight-color: transparent; } +button:focus-visible, [tabindex]:focus-visible, input:focus-visible { outline: 2px solid var(--sky); outline-offset: 2px; } +input, textarea { font: inherit; color: inherit; } +.num, .tnum { font-variant-numeric: tabular-nums; font-feature-settings: "tnum"; } +.mono { font-family: var(--mono); font-size: .92em; letter-spacing: -.01em; } +.ic { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; flex: none; overflow: visible; } +.ic.f { fill: currentColor; stroke: none; } +.ic.sm { width: 16px; height: 16px; stroke-width: 1.8; } .ic.xs { width: 13px; height: 13px; stroke-width: 2; } .ic.lg { width: 28px; height: 28px; } +.hide { display: none !important; } +.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); } + +/* ---------- glass ---------- */ +.glass { position: relative; background: linear-gradient(180deg, rgba(255,255,255,.09), rgba(255,255,255,.025) 60%), var(--glass); -webkit-backdrop-filter: blur(24px) saturate(1.6); backdrop-filter: blur(24px) saturate(1.6); + box-shadow: inset 0 .5px 0 rgba(255,255,255,.34), inset 0 0 0 .5px rgba(255,255,255,.10), inset 0 -.5px 0 rgba(255,255,255,.05); } +.glass::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; background: radial-gradient(120% 60% at 20% -10%, rgba(255,255,255,.14), transparent 55%); mix-blend-mode: screen; } +.glass.strong { background: linear-gradient(180deg, rgba(255,255,255,.07), rgba(255,255,255,.02) 60%), var(--glass-strong); } +.pill { border-radius: 999px; } +.circ { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center; } + +/* ---------- app & canvas ---------- */ +.app { position: fixed; inset: 0; overflow: hidden; background: var(--bg); } +#gl { position: absolute; left: var(--paneW); top: 0; width: calc(100% - var(--paneW)); height: 100%; display: block; touch-action: none; outline: none; } +.globe-area { position: absolute; left: var(--paneW); top: 0; right: 0; bottom: 0; pointer-events: none; } +.labels { position: absolute; inset: 0; pointer-events: none; overflow: hidden; } +.lbl { position: absolute; left: 0; top: 0; transform: translate(-50%, -100%); pointer-events: auto; display: flex; align-items: center; gap: 6px; padding: 5px 10px 5px 7px; font-size: 12px; font-weight: 600; letter-spacing: -.01em; white-space: nowrap; border-radius: 999px; color: var(--text); transition: opacity .25s; } +.lbl i { width: 8px; height: 8px; border-radius: 50%; background: var(--c, var(--sky)); box-shadow: 0 0 10px var(--c, var(--sky)); flex: none; } +.lbl small { font-weight: 500; color: var(--text2); font-size: 11px; } +.lbl.sel { box-shadow: inset 0 0 0 1px var(--gold), inset 0 .5px 0 rgba(255,255,255,.3); } +.lbl.plain { background: none; backdrop-filter: none; -webkit-backdrop-filter: none; box-shadow: none; text-shadow: 0 1px 6px rgba(0,0,0,.9); padding: 2px 4px; font-weight: 600; } +.lbl.plain::after { display: none; } +.lbl.tag { transform: translate(10px, -50%); } + +/* ---------- views ---------- */ +.view { position: absolute; inset: 0; overflow: hidden auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; display: none; scrollbar-width: none; } +.view::-webkit-scrollbar { display: none; } +.view.on { display: block; animation: viewIn .38s var(--out); } +@keyframes viewIn { from { opacity: 0; transform: translateY(8px) scale(.995); } } +.pane { position: absolute; left: 0; top: 0; bottom: 0; width: 100%; } + +/* large-title nav */ +.navbar { position: sticky; top: 0; z-index: 5; height: calc(var(--sat) + 48px); padding-top: var(--sat); display: grid; place-items: center; font-weight: 600; font-size: 17px; opacity: 0; transition: opacity .2s; pointer-events: none; margin-bottom: calc(-48px - var(--sat)); } +.navbar.on { opacity: 1; pointer-events: auto; } +.navbar::before { content: ""; position: absolute; inset: 0; background: rgba(5,7,11,.62); -webkit-backdrop-filter: blur(20px) saturate(1.5); backdrop-filter: blur(20px) saturate(1.5); border-bottom: .5px solid var(--sep); z-index: -1; } +.lt { padding: calc(var(--sat) + 14px) 20px 6px; } +.lt .kicker { font-size: 12px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--text3); display: flex; gap: 8px; align-items: center; } +.lt h1 { margin: 2px 0 0; font: 700 34px/41px var(--display); letter-spacing: .2px; } +.lt .row { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; } +.avatar { width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center; font-size: 13px; font-weight: 700; color: #fff; background: conic-gradient(from 200deg, hsl(var(--h,205) 80% 55%), hsl(calc(var(--h,205) + 60) 75% 45%), hsl(var(--h,205) 80% 55%)); box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.18); flex: none; } +.avatar.sm { width: 22px; height: 22px; font-size: 9px; } .avatar.md { width: 28px; height: 28px; font-size: 11px; } .avatar.xl { width: 72px; height: 72px; font-size: 26px; } +.avatar.ai { background: radial-gradient(circle at 30% 30%, #E6DBFF, #8E6CFF 55%, #4A2FB8); } +.stack { display: flex; } .stack .avatar { margin-left: -7px; box-shadow: 0 0 0 2px var(--bg), inset 0 0 0 1.5px rgba(255,255,255,.18); } .stack .avatar:first-child { margin-left: 0; } + +.livebar { position: relative; z-index: 1; display: flex; gap: 14px; align-items: center; font-size: 13px; color: var(--text2); padding: 4px 20px 0; flex-wrap: wrap; } +.livebar b { color: var(--text); font-weight: 600; } +.dot { width: 7px; height: 7px; border-radius: 50%; background: var(--live); display: inline-block; flex: none; } +.dot.pulse { animation: pulse 1.8s infinite; } +@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(255,69,58,.55); } 70% { box-shadow: 0 0 0 7px rgba(255,69,58,0); } 100% { box-shadow: 0 0 0 0 rgba(255,69,58,0); } } +.chips { display: flex; gap: 8px; overflow-x: auto; padding: 12px 20px 6px; scrollbar-width: none; } +.chips::-webkit-scrollbar { display: none; } +.chip { flex: none; height: 34px; padding: 0 14px; border-radius: 999px; display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 600; color: var(--text2); background: rgba(255,255,255,.06); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.08); transition: background .2s, color .2s; white-space: nowrap; } +.chip.on { background: var(--text); color: #05070B; } +.chip .n { font-weight: 500; opacity: .6; } + +/* ---------- Now ---------- */ +#v-now { background: transparent; } +.now-hero { height: calc(var(--sat) + clamp(290px, 41vh, 400px)); position: relative; display: flex; flex-direction: column; justify-content: flex-end; pointer-events: none; } +.now-hero > * { pointer-events: auto; } +.now-hero::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 90px; background: linear-gradient(to bottom, rgba(5,7,11,0), var(--bg)); pointer-events: none; } +.now-hero .lt { position: relative; z-index: 1; padding-bottom: 0; text-shadow: 0 2px 18px rgba(0,0,0,.6); } +.now-top { position: absolute; top: calc(var(--sat) + 10px); left: 16px; right: 16px; display: flex; justify-content: space-between; align-items: center; z-index: 2; } +.now-body { background: var(--bg); min-height: 60vh; padding-bottom: calc(var(--sab) + 150px); } +.sec-h { display: flex; align-items: baseline; justify-content: space-between; padding: 18px 20px 10px; } +.sec-h h2 { margin: 0; font: 700 22px/28px var(--display); letter-spacing: .1px; } +.sec-h span { color: var(--text3); font-size: 13px; } +.masonry { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 0 12px; align-items: start; } +.masonry .col { display: flex; flex-direction: column; gap: 10px; min-width: 0; } +.card { position: relative; border-radius: 18px; overflow: hidden; background: var(--card); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.07); cursor: pointer; transform: translateZ(0); transition: transform .35s var(--spring); } +.card:active { transform: scale(.975); } +.card .thumb { position: relative; width: 100%; background: #070A10; overflow: hidden; } +.card .thumb canvas, .card .thumb img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; } +.card .thumb::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,.28), transparent 26%, transparent 55%, rgba(0,0,0,.66)); pointer-events: none; } +.card .tl { position: absolute; top: 9px; left: 9px; z-index: 2; display: flex; gap: 6px; } +.badge { height: 22px; padding: 0 8px; border-radius: 999px; display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; background: rgba(10,12,18,.5); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.18); } +.badge.live { color: #fff; } .badge.live .dot { width: 6px; height: 6px; } +.badge.fam i { width: 7px; height: 7px; border-radius: 50%; background: var(--c); box-shadow: 0 0 8px var(--c); } +.badge.d4 { color: var(--gold2); } .badge.replay { color: var(--text2); } +.card .tr { position: absolute; top: 9px; right: 9px; z-index: 2; width: 28px; height: 28px; border-radius: 50%; display: grid; place-items: center; background: rgba(10,12,18,.42); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.18); color: var(--c); } +.card .bl { position: absolute; left: 11px; right: 11px; bottom: 9px; z-index: 2; } +.card .metric { font: 700 21px/1.05 var(--display); letter-spacing: -.01em; text-shadow: 0 1px 10px rgba(0,0,0,.6); } +.card .metric small { font-size: 12px; font-weight: 600; color: var(--text2); margin-left: 3px; letter-spacing: 0; } +.card .mlabel { font-size: 11.5px; color: var(--text2); margin-top: 2px; text-shadow: 0 1px 8px rgba(0,0,0,.8); } +.card .meta { padding: 9px 11px 11px; } +.card .ttl { font-size: 14.5px; font-weight: 600; line-height: 1.28; letter-spacing: -.01em; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } +.card .src { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-top: 7px; font-size: 11.5px; color: var(--text3); } +.card .src .l { display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } +.card .src .r { display: flex; align-items: center; gap: 4px; flex: none; } +.card .cta { margin-top: 8px; display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border-radius: 999px; background: rgba(155,225,93,.14); color: var(--ground); font-size: 12.5px; font-weight: 700; } +.card.flash .thumb { animation: flash 1.2s ease; } +@keyframes flash { 30% { filter: brightness(1.35) saturate(1.2); } } +.card .spark { position: absolute; right: 10px; bottom: 12px; z-index: 2; opacity: .9; } + +/* ---------- tab bar & accessory ---------- */ +.tabwrap { position: absolute; left: 0; width: var(--tabW, 100%); bottom: 0; padding: 0 12px calc(var(--sab) + 10px); display: flex; gap: 10px; align-items: flex-end; justify-content: center; z-index: 40; pointer-events: none; transition: transform .45s var(--out), opacity .3s; } +.tabwrap > * { pointer-events: auto; } +.tabbar { height: var(--tabH); border-radius: 31px; display: flex; align-items: center; padding: 0 4px; gap: 0; transition: width .45s var(--out); } +.tab { position: relative; z-index: 1; width: 66px; height: 54px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; font-size: 10.5px; font-weight: 600; color: var(--text2); border-radius: 27px; transition: color .25s; letter-spacing: .01em; } +.tab .ic { width: 24px; height: 24px; } +.tab.on { color: var(--sky); } +.tablens { position: absolute; z-index: 0; top: 4px; height: 54px; width: 66px; border-radius: 27px; background: rgba(255,255,255,.12); box-shadow: inset 0 .5px 0 rgba(255,255,255,.3), inset 0 0 0 .5px rgba(255,255,255,.1); transition: transform .5s var(--spring), width .3s; } +.searchbtn { width: var(--tabH); height: var(--tabH); border-radius: 50%; display: grid; place-items: center; flex: none; } +.searchbtn .ic { width: 24px; height: 24px; } +.tabwrap.mini .tab:not(.on) { width: 0; opacity: 0; overflow: hidden; padding: 0; } +.tabwrap.mini .tab.on { width: 54px; } +.tabwrap.mini .tab.on span { display: none; } +.tabwrap.mini .tablens { width: 54px; } +.tabwrap.mini .tabbar { width: auto; } +.tabwrap.hidden { transform: translateY(140%); opacity: 0; pointer-events: none; } +.tabwrap.hidden > * { pointer-events: none; } +.accessory { height: 48px; border-radius: 24px; display: flex; align-items: center; gap: 10px; padding: 0 6px 0 14px; min-width: 0; flex: 1; max-width: 520px; transition: all .45s var(--out); } +.acc-host { position: absolute; left: 12px; right: 12px; bottom: calc(var(--sab) + 10px + var(--tabH) + 10px); display: flex; justify-content: center; z-index: 39; pointer-events: none; transition: transform .45s var(--out), opacity .3s; } +.acc-host > * { pointer-events: auto; } +.acc-host.hidden { opacity: 0; transform: translateY(30px); pointer-events: none; } +.acc-host.hidden > * { pointer-events: none; } +.accessory .ttl { font-size: 14px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.accessory .sub { font-size: 12px; color: var(--text2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.accessory .txt { min-width: 0; flex: 1; line-height: 1.2; } +.accessory .ab { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; } +.tabwrap .accessory { display: none; } +.tabwrap.mini .accessory { display: flex; } + +/* ---------- globe chrome ---------- */ +.gtop { position: absolute; top: calc(var(--sat) + 10px); left: calc(var(--paneW) + 12px); right: 12px; display: flex; justify-content: space-between; align-items: flex-start; z-index: 20; pointer-events: none; } +.gtop > * { pointer-events: auto; } +.status { height: 40px; padding: 0 14px 0 12px; border-radius: 20px; display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; } +.status .t { color: var(--text2); font-weight: 500; } +.gbtns { display: flex; flex-direction: column; gap: 10px; } +.gbtn { width: 44px; height: 44px; border-radius: 22px; display: grid; place-items: center; } +.gbtn.on { color: var(--sky); } +.compass .ic { transition: transform .1s linear; } +.gbottom { position: absolute; left: calc(var(--paneW) + 0px); right: 0; bottom: calc(var(--sab) + 10px + var(--tabH) + 10px); z-index: 20; display: flex; flex-direction: column; gap: 10px; padding: 0 12px; pointer-events: none; transition: transform .45s var(--out), opacity .3s; } +.gbottom > * { pointer-events: auto; } +.dock { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; padding: 2px; margin: -2px; } +.dock::-webkit-scrollbar { display: none; } +.fam { flex: none; height: 38px; padding: 0 13px 0 10px; border-radius: 19px; display: inline-flex; align-items: center; gap: 7px; font-size: 13.5px; font-weight: 600; color: var(--text); transition: opacity .2s, transform .3s var(--spring); user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; } +.fam .ic { color: var(--c); width: 18px; height: 18px; } +.fam .n { color: var(--text3); font-weight: 500; font-size: 12px; } +.fam.off { opacity: .5; } .fam.off .ic { color: var(--text3); } +.fam.solo { box-shadow: inset 0 0 0 1.5px var(--c); } +.fam:active { transform: scale(.94); } + +/* time ribbon */ +.ribbon { height: 62px; border-radius: 22px; position: relative; overflow: hidden; touch-action: none; user-select: none; -webkit-user-select: none; } +.ribbon canvas { position: absolute; inset: 0; width: 100%; height: 100%; } +.ribbon .head { position: absolute; left: 50%; top: 6px; bottom: 6px; width: 2px; margin-left: -1px; border-radius: 1px; background: var(--text); box-shadow: 0 0 12px rgba(255,255,255,.6); pointer-events: none; z-index: 2; } +.ribbon .readout { position: absolute; left: 12px; top: 7px; font-size: 12px; font-weight: 600; z-index: 3; pointer-events: none; display: flex; gap: 6px; align-items: center; } +.ribbon .readout .rel { color: var(--text3); font-weight: 500; } +.ribbon .nowbtn { position: absolute; right: 6px; top: 6px; height: 26px; padding: 0 10px; border-radius: 13px; font-size: 11.5px; font-weight: 800; letter-spacing: .06em; z-index: 3; display: flex; align-items: center; gap: 5px; background: rgba(255,255,255,.08); color: var(--text2); transition: all .25s; } +.ribbon .nowbtn.live { background: rgba(255,69,58,.18); color: #FF8A80; } +.ribbon .fc { position: absolute; right: 74px; top: 8px; font-size: 10.5px; font-weight: 700; letter-spacing: .08em; color: var(--wx); z-index: 3; opacity: 0; transition: opacity .2s; } +.ribbon.future .fc { opacity: 1; } +.ribbon.breath::before { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 1px rgba(255,69,58,.0); animation: breath 3.2s ease-in-out infinite; pointer-events: none; z-index: 1; } +@keyframes breath { 50% { box-shadow: inset 0 0 0 1px rgba(255,120,110,.32), inset 0 0 18px rgba(255,69,58,.12); } } + +/* pick card */ +.pick { border-radius: 26px; padding: 12px 12px 12px 14px; display: none; flex-direction: column; gap: 10px; animation: rise .4s var(--spring); } +.pick.on { display: flex; } +@keyframes rise { from { opacity: 0; transform: translateY(16px) scale(.98); } } +.pick .hd { display: flex; align-items: center; gap: 11px; } +.pick .ico { width: 40px; height: 40px; border-radius: 12px; display: grid; place-items: center; background: color-mix(in oklab, var(--c) 18%, transparent); color: var(--c); flex: none; } +.pick .tt { flex: 1; min-width: 0; } .pick .tt b { display: block; font-size: 16px; } .pick .tt span { font-size: 12.5px; color: var(--text2); } +.pick .x { width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; background: rgba(255,255,255,.08); color: var(--text2); } +.kv { display: flex; gap: 18px; font-size: 12px; color: var(--text3); } +.kv b { display: block; color: var(--text); font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums; } +.acts { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; } +.act { height: 52px; border-radius: 16px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; font-size: 11px; font-weight: 600; background: rgba(255,255,255,.07); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.08); } +.act .ic { width: 20px; height: 20px; } +.act.pri { background: rgba(124,196,255,.18); color: var(--sky); } +.act.gold { background: rgba(233,196,106,.16); color: var(--gold2); } +.act:active { transform: scale(.95); } + +/* layer grid (Control Center) */ +.cc { position: absolute; inset: 0; z-index: 95; display: none; background: rgba(3,5,8,.38); -webkit-backdrop-filter: blur(30px) saturate(1.4) brightness(.8); backdrop-filter: blur(30px) saturate(1.4) brightness(.8); overflow: auto; padding: calc(var(--sat) + 14px) 16px calc(var(--sab) + 40px); } +.cc.on { display: block; animation: ccIn .42s var(--out); } +@keyframes ccIn { from { opacity: 0; transform: scale(1.04); } } +.cc .cch { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } +.cc .cch h2 { margin: 0; font: 700 28px/34px var(--display); } +.cc .cch p { margin: 2px 0 0; color: var(--text3); font-size: 13px; } +.lenses { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; margin: 6px 0 14px; } +.lens { border-radius: 16px; padding: 8px 4px 7px; display: flex; flex-direction: column; align-items: center; gap: 6px; font-size: 11.5px; font-weight: 600; color: var(--text2); background: rgba(255,255,255,.06); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.08); } +.lens .sw { width: 100%; height: 38px; border-radius: 11px; } +.lens.on { color: var(--text); box-shadow: inset 0 0 0 1.5px var(--sky); } +.ccfam { margin-top: 14px; } +.ccfam .fh { display: flex; align-items: center; gap: 8px; margin: 0 2px 8px; font-size: 13px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--text2); user-select: none; -webkit-user-select: none; } +.ccfam .fh i { width: 9px; height: 9px; border-radius: 50%; background: var(--c); box-shadow: 0 0 10px var(--c); } +.ccfam .fh .solo { margin-left: auto; font-size: 11px; font-weight: 700; color: var(--text3); letter-spacing: .04em; padding: 6px 10px; border-radius: 999px; background: rgba(255,255,255,.06); } +.ccgrid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; } +.tile { border-radius: 20px; padding: 11px 12px; display: flex; gap: 10px; align-items: center; min-height: 64px; background: rgba(255,255,255,.07); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.08); text-align: left; transition: background .2s, transform .2s var(--spring); } +.tile:active { transform: scale(.96); } +.tile .ti { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; background: rgba(255,255,255,.1); color: var(--text2); flex: none; transition: all .2s; } +.tile .ti .ic { width: 19px; height: 19px; } +.tile .tn { font-size: 13px; font-weight: 600; line-height: 1.2; } +.tile .tc { font-size: 12px; color: var(--text3); margin-top: 2px; display: flex; align-items: center; gap: 5px; } +.tile .tc .st { width: 6px; height: 6px; border-radius: 50%; background: var(--ok); } +.tile .tc .st.stale { background: transparent; box-shadow: inset 0 0 0 1px var(--text3); } +.tile.on { background: rgba(255,255,255,.92); color: #0A0D12; } +.tile.on .ti { background: var(--c); color: #071018; } +.tile.on .tc { color: rgba(10,13,18,.55); } + +/* ---------- sheet ---------- */ +.sheet { position: absolute; left: 0; right: 0; bottom: 0; height: calc(100% - var(--sat) - 8px); z-index: 30; border-radius: 30px 30px 0 0; transform: translateY(100%); transition: transform .5s var(--out); display: flex; flex-direction: column; will-change: transform; touch-action: none; } +.sheet.drag { transition: none; } +.sheet .grab { flex: none; height: 26px; display: grid; place-items: center; cursor: grab; } +.sheet .grab::before { content: ""; width: 38px; height: 5px; border-radius: 3px; background: rgba(255,255,255,.3); } +.sheet .sc { flex: 1; overflow: hidden auto; padding: 0 18px calc(var(--sab) + 30px); overscroll-behavior: contain; touch-action: pan-y; scrollbar-width: none; } +.sheet .sc::-webkit-scrollbar { display: none; } +.sh-hd { display: flex; align-items: flex-start; gap: 10px; } +.sh-hd .t { flex: 1; min-width: 0; } +.sh-hd h2 { margin: 6px 0 2px; font: 700 23px/28px var(--display); letter-spacing: -.005em; } +.sh-hd .pl { color: var(--text2); font-size: 13.5px; } +.metrics { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2px; margin: 14px 0 4px; } +.metric { padding: 0 6px 0 0; } +.metric .v { font: 700 26px/1.05 var(--display); font-variant-numeric: tabular-nums; letter-spacing: -.02em; } +.metric .v small { font-size: 13px; font-weight: 600; color: var(--text2); margin-left: 2px; letter-spacing: 0; } +.metric .l { font-size: 12px; color: var(--text2); margin-top: 3px; } +.metric .s { font-size: 10.5px; color: var(--text3); margin-top: 2px; } +.sh-acts { margin: 14px 0 6px; } +.brief { margin-top: 16px; } +.brief p { margin: 0 0 12px; font-size: 15px; line-height: 1.5; color: rgba(240,244,250,.86); } +.brief h3 { margin: 22px 0 8px; font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text3); } +.sline { display: grid; grid-template-columns: 1fr auto; gap: 2px 10px; align-items: center; padding: 9px 0; border-top: .5px solid var(--sep); } +.sline .lab { font-size: 13.5px; font-weight: 600; } +.sline .val { font-size: 13.5px; font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; } +.sline svg { grid-column: 1 / -1; width: 100%; height: 46px; overflow: visible; } +.sline .src { grid-column: 1 / -1; font-size: 11px; color: var(--text3); display: flex; justify-content: space-between; } +.multi { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; } +.multi figure { margin: 0; } +.multi canvas, .multi svg { width: 100%; aspect-ratio: 1; border-radius: 10px; display: block; background: #070A10; } +.multi figcaption { font-size: 11px; color: var(--text2); margin-top: 4px; text-align: center; font-variant-numeric: tabular-nums; } +.multi figcaption b { color: var(--text); } +.evid { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; margin: 0 -18px; padding: 0 18px; } +.evid::-webkit-scrollbar { display: none; } +.ev { flex: none; width: 116px; border-radius: 14px; overflow: hidden; background: var(--card2); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.08); } +.ev .im { height: 84px; position: relative; background-size: cover; background-position: center; } +.ev .im .seal { position: absolute; right: 6px; bottom: 6px; } +.ev .cap { padding: 6px 8px 8px; font-size: 11px; color: var(--text2); line-height: 1.3; } +.ev .cap b { color: var(--text); font-weight: 600; display: block; } +.srcs { font-size: 12.5px; } +.srcs .r { display: grid; grid-template-columns: 10px 1fr auto; gap: 8px; align-items: center; padding: 8px 0; border-top: .5px solid var(--sep); } +.srcs .r .st { width: 7px; height: 7px; border-radius: 50%; background: var(--ok); } +.srcs .r .st.stale { background: none; box-shadow: inset 0 0 0 1.2px var(--text3); } +.srcs .r span { color: var(--text3); font-variant-numeric: tabular-nums; } +.backbtn { position: absolute; top: calc(var(--sat) + 10px); left: calc(var(--paneW) + 12px); z-index: 35; display: none; } +.backbtn.on { display: grid; } +.sitbtns { position: absolute; top: calc(var(--sat) + 10px); right: 12px; z-index: 35; display: none; gap: 10px; } +.sitbtns.on { display: flex; } +.seal { width: 22px; height: 22px; color: var(--gold); filter: drop-shadow(0 0 6px rgba(233,196,106,.6)); } + +/* morph */ +.morph { position: absolute; z-index: 50; overflow: hidden; pointer-events: none; display: none; will-change: transform, border-radius, opacity; } +.morph canvas { width: 100%; height: 100%; object-fit: cover; display: block; } +.morph.on { display: block; } + +/* ---------- ride HUD ---------- */ +.ride { position: absolute; inset: 0; z-index: 45; display: none; pointer-events: none; } +.ride.on { display: block; animation: viewIn .5s var(--out); } +.ride > * { pointer-events: auto; } +.ride .top { position: absolute; top: calc(var(--sat) + 10px); left: 12px; right: 12px; display: flex; gap: 10px; align-items: center; } +.ride .top .who { flex: 1; height: 44px; border-radius: 22px; display: flex; align-items: center; gap: 10px; padding: 0 14px; font-size: 13px; } +.ride .top .who b { font-size: 14px; } +.hud { position: absolute; inset: 0; pointer-events: none !important; font-family: var(--mono); color: rgba(190,255,200,.9); text-shadow: 0 0 6px rgba(80,255,140,.5); } +.hud svg { position: absolute; inset: 0; width: 100%; height: 100%; } +.hud .tape { position: absolute; top: 50%; transform: translateY(-50%); font-size: 15px; font-weight: 600; padding: 6px 9px; border: 1px solid rgba(190,255,200,.55); border-radius: 6px; background: rgba(0,20,8,.25); } +.hud .tape small { display: block; font-size: 9.5px; opacity: .7; font-weight: 500; } +.chat { position: absolute; left: 12px; right: 12px; bottom: calc(var(--sab) + 72px); height: 46%; display: flex; flex-direction: column; justify-content: flex-end; gap: 8px; pointer-events: none !important; mask-image: linear-gradient(to top, #000 70%, transparent); -webkit-mask-image: linear-gradient(to top, #000 70%, transparent); } +.bub { align-self: flex-start; max-width: 84%; display: flex; gap: 8px; align-items: flex-end; animation: bubIn .5s var(--spring); } +.bub .bx { padding: 8px 12px; border-radius: 18px 18px 18px 6px; font-size: 13.5px; line-height: 1.35; } +.bub .bx b { display: block; font-size: 11.5px; color: var(--text2); font-weight: 600; margin-bottom: 1px; } +@keyframes bubIn { from { opacity: 0; transform: translateY(20px) scale(.96); } } +.react { position: absolute; right: 16px; bottom: calc(var(--sab) + 130px); width: 40px; height: 300px; pointer-events: none !important; } +.react span { position: absolute; bottom: 0; left: 8px; animation: floatUp 2.6s ease-out forwards; color: var(--live); } +@keyframes floatUp { to { transform: translate(var(--dx, 0px), -280px) scale(1.2); opacity: 0; } } +.compose { position: absolute; left: 12px; right: 12px; bottom: calc(var(--sab) + 12px); display: flex; gap: 8px; } +.compose .in { flex: 1; height: 48px; border-radius: 24px; display: flex; align-items: center; padding: 0 16px; color: var(--text3); font-size: 14px; } +.compose .in input { flex: 1; background: none; border: 0; outline: none; color: var(--text); font-size: 15px; min-width: 0; } + +/* ---------- capture ---------- */ +#v-capture { background: #000; z-index: 25; } +#v-capture.on { display: block; } +.cap-ui { position: absolute; inset: 0; pointer-events: none; } +.cap-ui > * { pointer-events: auto; } +.cap-top { position: absolute; top: calc(var(--sat) + 8px); left: 12px; right: 12px; display: flex; justify-content: space-between; align-items: center; gap: 8px; } +.cap-top .st { height: 34px; padding: 0 12px; border-radius: 17px; font-size: 12px; font-weight: 600; display: flex; align-items: center; gap: 7px; } +.compass-tape { position: absolute; top: calc(var(--sat) + 52px); left: 0; right: 0; height: 40px; pointer-events: none !important; } +.callouts { position: absolute; inset: 0; pointer-events: none !important; } +.callout { position: absolute; left: 0; top: 0; pointer-events: auto; display: flex; align-items: center; gap: 8px; padding: 6px 11px 6px 8px; border-radius: 14px; font-size: 12px; transform: translate(14px, -50%); white-space: nowrap; } +.callout b { font-size: 13px; display: block; } +.callout span { color: var(--text2); font-size: 11px; } +.callout .ci { width: 28px; height: 28px; border-radius: 9px; display: grid; place-items: center; background: color-mix(in oklab, var(--c) 22%, transparent); color: var(--c); } +.reticle { position: absolute; width: 34px; height: 34px; margin: -17px 0 0 -17px; border: 1.5px solid var(--c, #fff); border-radius: 10px; pointer-events: none; box-shadow: 0 0 12px var(--c); } +.cap-bottom { position: absolute; left: 0; right: 0; bottom: 0; padding: 10px 16px calc(var(--sab) + 18px); display: flex; flex-direction: column; align-items: center; gap: 14px; background: linear-gradient(to top, rgba(0,0,0,.55), transparent); } +.zooms { display: flex; gap: 6px; padding: 4px; border-radius: 22px; } +.zooms button { width: 36px; height: 36px; border-radius: 50%; font-size: 12px; font-weight: 700; color: var(--text2); } +.zooms button.on { background: rgba(255,255,255,.14); color: var(--warn); } +.dial { display: flex; gap: 22px; font-size: 13px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--text2); transition: transform .45s var(--spring); } +.dial button { padding: 6px 2px; } +.dial button.on { color: var(--warn); } +.shutrow { width: 100%; max-width: 440px; display: flex; align-items: center; justify-content: space-between; } +.shutter { width: 78px; height: 78px; border-radius: 50%; display: grid; place-items: center; box-shadow: 0 0 0 4px rgba(255,255,255,.92); transition: transform .2s; } +.shutter i { width: 64px; height: 64px; border-radius: 50%; background: #fff; transition: all .25s var(--spring); } +.shutter.look i { background: transparent; box-shadow: inset 0 0 0 2px rgba(255,255,255,.7); } +.shutter:active i { transform: scale(.88); } +.lastcap { width: 48px; height: 48px; border-radius: 12px; background: #111 center/cover; box-shadow: inset 0 0 0 1px rgba(255,255,255,.2); position: relative; } +.lastcap .seal { position: absolute; right: -6px; top: -6px; width: 20px; height: 20px; } +.sensors { position: absolute; left: 12px; bottom: calc(var(--sab) + 210px); border-radius: 16px; padding: 8px 10px; font-size: 11px; display: none; gap: 3px; flex-direction: column; min-width: 158px; color: var(--text2); } +.sensors.on { display: flex; } +.sensors b { color: var(--text); font-variant-numeric: tabular-nums; font-weight: 600; } +.sensors svg { width: 140px; height: 26px; } +.seal-ov { position: absolute; inset: 0; z-index: 70; display: none; align-items: center; justify-content: center; padding: calc(var(--sat) + 20px) 18px calc(var(--sab) + 20px); background: rgba(0,0,0,.55); -webkit-backdrop-filter: blur(18px) saturate(1.2); backdrop-filter: blur(18px) saturate(1.2); } +.seal-ov.on { display: flex; animation: viewIn .35s var(--out); } +.bundle { width: 100%; max-width: 420px; border-radius: 28px; padding: 14px; display: flex; flex-direction: column; gap: 10px; max-height: 100%; overflow: auto; } +.bundle .ph { position: relative; border-radius: 18px; overflow: hidden; aspect-ratio: 4/3; background: #000; } +.bundle .ph canvas, .bundle .ph img { width: 100%; height: 100%; object-fit: cover; display: block; } +.bigseal { position: absolute; right: 10px; bottom: 10px; width: 92px; height: 92px; opacity: 0; transform: scale(2.2) rotate(-40deg); transition: all .7s var(--spring); } +.bigseal.on { opacity: 1; transform: scale(1) rotate(0); } +.steps { display: flex; flex-direction: column; gap: 2px; } +.step { display: grid; grid-template-columns: 24px 1fr; gap: 8px; padding: 7px 2px; border-top: .5px solid var(--sep); font-size: 13px; opacity: .35; transition: opacity .3s; } +.step.on { opacity: 1; } +.step .ck { width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; box-shadow: inset 0 0 0 1.5px var(--text3); color: transparent; transition: all .3s; } +.step.done .ck { background: var(--gold); box-shadow: none; color: #1A1408; } +.step b { font-weight: 600; } .step .h { font-family: var(--mono); font-size: 11px; color: var(--text2); word-break: break-all; line-height: 1.35; margin-top: 2px; } +.step svg { width: 100%; height: 30px; margin-top: 4px; } +.btnrow { display: flex; gap: 8px; } +.btn { flex: 1; height: 50px; border-radius: 25px; font-weight: 700; font-size: 15px; display: inline-flex; align-items: center; justify-content: center; gap: 7px; background: rgba(255,255,255,.1); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.12); } +.btn.gold { background: linear-gradient(180deg, #F3D68A, #D9AE4F); color: #1C1405; box-shadow: inset 0 .5px 0 rgba(255,255,255,.6); } +.btn.pri { background: var(--text); color: #05070B; } +.btn:active { transform: scale(.97); } +.btn.sm { height: 38px; font-size: 13.5px; flex: none; padding: 0 16px; } + +/* ---------- Threads ---------- */ +.tcard { margin: 0 14px 14px; border-radius: 24px; overflow: hidden; background: var(--card); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.07); cursor: pointer; } +.tcard .thumb { position: relative; aspect-ratio: 16/9; background: #070A10; } +.tcard .thumb canvas { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; } +.tcard .thumb::after { content: ""; position: absolute; inset: 0; background: linear-gradient(transparent 40%, rgba(0,0,0,.7)); } +.tcard .bl { position: absolute; left: 14px; bottom: 12px; right: 14px; z-index: 1; display: flex; justify-content: space-between; align-items: flex-end; gap: 10px; } +.tcard .bl h3 { margin: 0; font: 700 20px/1.15 var(--display); } +.tcard .bl p { margin: 3px 0 0; font-size: 12.5px; color: var(--text2); } +.tcard .stats { display: flex; gap: 16px; padding: 12px 14px; font-size: 12px; color: var(--text3); align-items: center; } +.tcard .stats b { color: var(--text); font-size: 15px; display: block; font-variant-numeric: tabular-nums; } +.tcard .stats .stack { margin-left: auto; } +.ws { position: absolute; inset: 0; display: none; z-index: 10; } +.ws.on { display: block; animation: pushIn .45s var(--out); } +@keyframes pushIn { from { transform: translateX(30%); opacity: 0; } } +.ws .wsh { position: absolute; top: 0; left: 0; right: 0; padding: calc(var(--sat) + 10px) 12px 0; display: flex; align-items: center; gap: 10px; z-index: 3; pointer-events: none; } +.ws .wsh > * { pointer-events: auto; } +.ws .wsh .tt { flex: 1; min-width: 0; height: 44px; border-radius: 22px; display: flex; align-items: center; gap: 10px; padding: 0 8px 0 14px; } +.ws .wsh .tt b { font-size: 14.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; } +.ws .wsh .tt span { font-size: 11.5px; color: var(--text2); } +.ws .body { position: absolute; left: 0; right: 0; bottom: 0; top: 40%; border-radius: 28px 28px 0 0; display: flex; flex-direction: column; overflow: hidden; } +.ws .seg { display: flex; margin: 12px 14px 8px; padding: 3px; border-radius: 12px; background: rgba(255,255,255,.07); flex: none; } +.ws .seg button { flex: 1; height: 34px; border-radius: 9px; font-size: 13px; font-weight: 600; color: var(--text2); transition: all .25s; } +.ws .seg button.on { background: rgba(255,255,255,.16); color: var(--text); box-shadow: 0 1px 0 rgba(255,255,255,.12) inset; } +.ws .wsc { flex: 1; overflow: auto; padding: 4px 14px calc(var(--sab) + 120px); scrollbar-width: none; } +.ws .wsc::-webkit-scrollbar { display: none; } +.stratum { font-size: 11.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text3); margin: 10px 2px 8px; display: flex; align-items: center; gap: 6px; } +.obs { display: grid; grid-template-columns: 34px 1fr; gap: 10px; padding: 11px 2px; border-top: .5px solid var(--sep); } +.obs .oi { width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; background: color-mix(in oklab, var(--c) 18%, transparent); color: var(--c); } +.obs .oi .ic { width: 18px; height: 18px; } +.obs .ot { font-size: 14px; font-weight: 600; line-height: 1.3; } +.obs .om { font-size: 11.5px; color: var(--text3); margin-top: 3px; display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; } +.obs .om .mono { color: var(--text2); } +.obs .tagid { font-family: var(--mono); font-size: 11px; color: var(--gold2); background: rgba(233,196,106,.12); padding: 1px 6px; border-radius: 6px; } +.hyp { border-radius: 20px; padding: 13px 14px; margin: 0 0 10px; background: var(--card2); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.08); } +.hyp.ai { box-shadow: inset 0 0 0 1px rgba(183,156,255,.45); background: linear-gradient(180deg, rgba(183,156,255,.10), rgba(183,156,255,.02)), var(--card2); } +.hyp .hh { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text2); } +.hyp .hh b { color: var(--text); font-weight: 600; } +.hyp .hh .stt { margin-left: auto; font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; padding: 3px 8px; border-radius: 999px; background: rgba(48,209,88,.14); color: #6BE38A; } +.hyp .hh .stt.disputed { background: rgba(255,214,10,.14); color: var(--warn); } +.hyp .hh .stt.proposed { background: rgba(183,156,255,.16); color: var(--ai); } +.hyp .hb { margin: 8px 0 10px; font-size: 15px; line-height: 1.42; } +.conf { display: grid; grid-template-columns: auto 1fr auto; gap: 8px; align-items: center; font-size: 11.5px; color: var(--text3); } +.conf svg { width: 100%; height: 14px; } +.cites { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 9px; } +.hyp .hf { display: flex; gap: 8px; margin-top: 10px; } +.vote { height: 34px; padding: 0 12px; border-radius: 17px; display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 600; background: rgba(255,255,255,.07); color: var(--text2); } +.vote.on { background: rgba(124,196,255,.18); color: var(--sky); } +.vote.dis.on { background: rgba(255,214,10,.16); color: var(--warn); } +.composer { position: absolute; left: 10px; right: 10px; bottom: calc(var(--sab) + 10px); border-radius: 26px; padding: 8px; display: flex; flex-direction: column; gap: 8px; z-index: 5; } +.composer .sug { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; } +.composer .sug::-webkit-scrollbar { display: none; } +.composer .sug button { flex: none; height: 30px; padding: 0 11px; border-radius: 15px; font-size: 12px; font-weight: 600; background: rgba(183,156,255,.14); color: #D7C9FF; white-space: nowrap; } +.composer .row { display: flex; gap: 8px; align-items: center; } +.composer textarea { flex: 1; min-height: 40px; max-height: 96px; resize: none; background: rgba(255,255,255,.06); border: 0; outline: 0; border-radius: 20px; padding: 10px 14px; font-size: 14.5px; line-height: 1.35; color: var(--text); } +.composer .send { width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center; background: var(--ai); color: #140B33; flex: none; } +.composer .send[disabled] { opacity: .5; } +.narr { display: flex; flex-direction: column; gap: 0; } +.beat { display: grid; grid-template-columns: 54px 1fr; gap: 10px; padding: 11px 2px; border-top: .5px solid var(--sep); opacity: .55; transition: opacity .3s; cursor: pointer; } +.beat.on { opacity: 1; } +.beat .bt { font-family: var(--mono); font-size: 12px; color: var(--text2); padding-top: 2px; } +.beat.on .bt { color: var(--gold2); } +.beat p { margin: 0; font-size: 14.5px; line-height: 1.42; } +.playbar { display: flex; align-items: center; gap: 10px; margin: 6px 0 10px; } +.playbtn { width: 50px; height: 50px; border-radius: 50%; display: grid; place-items: center; background: var(--text); color: #05070B; flex: none; } +.prog { flex: 1; height: 4px; border-radius: 2px; background: rgba(255,255,255,.12); position: relative; overflow: hidden; } +.prog i { position: absolute; left: 0; top: 0; bottom: 0; width: 0; background: var(--gold); border-radius: 2px; } +.ledger .le { border-top: .5px solid var(--sep); padding: 10px 2px; } +.ledger .le .lh { display: grid; grid-template-columns: 26px 1fr auto; gap: 8px; align-items: center; cursor: pointer; } +.ledger .le .ix { font-family: var(--mono); font-size: 11px; color: var(--text3); } +.ledger .le .ty { font-size: 13px; font-weight: 600; } +.ledger .le .ty span { color: var(--text3); font-weight: 500; } +.ledger .le .hs { font-family: var(--mono); font-size: 11px; color: var(--text2); } +.ledger .le .vk { width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; } +.ledger .le .vk.ok { background: rgba(48,209,88,.2); color: #6BE38A; } .ledger .le .vk.bad { background: rgba(255,69,58,.25); color: #FF8A80; } +.ledger .le pre { margin: 8px 0 0 34px; font-family: var(--mono); font-size: 10.5px; line-height: 1.45; color: var(--text2); white-space: pre-wrap; word-break: break-all; background: rgba(255,255,255,.04); padding: 8px 10px; border-radius: 10px; display: none; } +.ledger .le.open pre { display: block; } +.ledger .chain { width: 2px; height: 10px; background: linear-gradient(var(--gold), transparent); margin-left: 12px; } +.presence { display: flex; align-items: center; gap: 8px; } +.presence .stack .avatar { box-shadow: 0 0 0 2px rgba(20,24,32,.9), inset 0 0 0 1.5px rgba(255,255,255,.2); } +.presence .on { position: relative; } +.presence .on::after { content: ""; position: absolute; right: -1px; bottom: -1px; width: 7px; height: 7px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 1.5px #10141c; } +.toastp { position: absolute; left: 50%; top: calc(var(--sat) + 62px); transform: translateX(-50%); z-index: 80; height: 40px; padding: 0 16px; border-radius: 20px; display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; opacity: 0; transition: opacity .3s, transform .4s var(--spring); pointer-events: none; white-space: nowrap; } +.toastp.on { opacity: 1; transform: translateX(-50%) translateY(4px); } + +/* ---------- You ---------- */ +.you-h { display: flex; gap: 14px; align-items: center; padding: 6px 20px 4px; } +.you-h h2 { margin: 0; font: 700 22px/1.2 var(--display); } +.concept { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 10px; border-radius: 12px; font-size: 11px; font-weight: 700; letter-spacing: .04em; color: var(--gold2); background: rgba(233,196,106,.10); box-shadow: inset 0 0 0 .5px rgba(233,196,106,.4); } +.stats4 { display: grid; grid-template-columns: repeat(4, 1fr); margin: 14px 16px 4px; border-radius: 18px; background: var(--card); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.07); } +.stats4 div { padding: 12px 8px; text-align: center; font-size: 11.5px; color: var(--text3); } +.stats4 b { display: block; font: 700 21px/1.1 var(--display); color: var(--text); font-variant-numeric: tabular-nums; } +.grp { margin: 0 16px; border-radius: 18px; background: var(--card); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.07); overflow: hidden; } +.row2 { display: flex; align-items: center; gap: 12px; padding: 12px 14px; min-height: 52px; border-top: .5px solid var(--sep); font-size: 15px; } +.row2:first-child { border-top: 0; } +.row2 .ri { width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; background: color-mix(in oklab, var(--c, var(--sky)) 22%, transparent); color: var(--c, var(--sky)); flex: none; } +.row2 .ri .ic { width: 18px; height: 18px; } +.row2 .rt { flex: 1; min-width: 0; } .row2 .rt small { display: block; font-size: 12px; color: var(--text3); margin-top: 1px; } +.row2 .rv { color: var(--text3); font-size: 14px; font-variant-numeric: tabular-nums; } +.sw2 { width: 51px; height: 31px; border-radius: 16px; background: rgba(120,120,128,.32); position: relative; flex: none; transition: background .25s; } +.sw2::after { content: ""; position: absolute; left: 2px; top: 2px; width: 27px; height: 27px; border-radius: 50%; background: #fff; box-shadow: 0 2px 6px rgba(0,0,0,.3); transition: transform .3s var(--spring); } +.sw2.on { background: var(--ok); } .sw2.on::after { transform: translateX(20px); } +.capgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 0 16px; } +.capc { border-radius: 16px; overflow: hidden; background: var(--card); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.07); cursor: pointer; } +.capc .im { aspect-ratio: 4/3; background: #111 center/cover; position: relative; } +.capc .im .seal { position: absolute; right: 8px; top: 8px; } +.capc .cm { padding: 8px 10px 10px; font-size: 12px; color: var(--text3); } +.capc .cm b { display: block; color: var(--text); font-size: 13px; font-weight: 600; margin-bottom: 2px; } +.capc .cm .mono { font-size: 10.5px; } +.radius { padding: 14px; } +.radius input[type=range] { width: 100%; accent-color: var(--sky); } +.radius svg { width: 100%; height: 120px; display: block; border-radius: 12px; background: #070A10; } +.credits { padding: 14px; font-size: 12.5px; line-height: 1.5; color: var(--text2); } +.credits b { color: var(--text); } +.inspector { position: absolute; inset: 0; z-index: 75; display: none; align-items: flex-end; justify-content: center; background: rgba(0,0,0,.45); } +.inspector.on { display: flex; animation: viewIn .3s var(--out); } +.inspector .panel { width: 100%; max-width: 560px; border-radius: 30px 30px 0 0; padding: 10px 18px calc(var(--sab) + 18px); max-height: 88%; overflow: auto; } + +/* search */ +.search { position: absolute; inset: 0; z-index: 65; display: none; flex-direction: column; background: rgba(3,5,8,.5); -webkit-backdrop-filter: blur(28px) saturate(1.3); backdrop-filter: blur(28px) saturate(1.3); } +.search.on { display: flex; animation: viewIn .3s var(--out); } +.search .res { flex: 1; overflow: auto; padding: calc(var(--sat) + 16px) 16px 16px; display: flex; flex-direction: column; justify-content: flex-end; } +.search .grpH { font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--text3); margin: 14px 4px 6px; } +.search .it { display: flex; align-items: center; gap: 12px; padding: 10px 8px; border-radius: 14px; font-size: 15px; } +.search .it:active { background: rgba(255,255,255,.06); } +.search .it .ri { width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; background: color-mix(in oklab, var(--c, var(--sky)) 18%, transparent); color: var(--c, var(--sky)); flex: none; } +.search .it small { display: block; color: var(--text3); font-size: 12px; } +.search .bar { display: flex; gap: 10px; padding: 10px 12px calc(var(--sab) + 12px); } +.search .field { flex: 1; height: 52px; border-radius: 26px; display: flex; align-items: center; gap: 10px; padding: 0 16px; } +.search .field input { flex: 1; background: none; border: 0; outline: 0; font-size: 17px; color: var(--text); min-width: 0; } + +/* cold open */ +.cold { position: absolute; inset: 0; z-index: 100; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; padding-bottom: calc(var(--sab) + 18vh); pointer-events: auto; transition: opacity 1s ease; } +.cold.out { opacity: 0; pointer-events: none; } +.cold .tag { font: 600 15px/1.4 var(--display); letter-spacing: .32em; text-transform: uppercase; color: rgba(255,255,255,.9); opacity: 0; transform: translateY(8px); transition: all 1.4s var(--out); text-align: center; padding: 0 20px; } +.cold .word { font: 700 44px/1 var(--display); letter-spacing: -.01em; margin-bottom: 14px; opacity: 0; transition: opacity 1.6s ease, letter-spacing 2.4s var(--out); letter-spacing: .12em; } +.cold.s1 .tag { opacity: 1; transform: none; } +.cold.s2 .word { opacity: 1; letter-spacing: -.01em; } +.cold .skip { position: absolute; top: calc(var(--sat) + 12px); right: 14px; height: 34px; padding: 0 14px; border-radius: 17px; font-size: 13px; font-weight: 600; color: var(--text2); } +.cold .eye { width: 60px; height: 60px; margin-bottom: 18px; opacity: 0; transition: opacity 1.2s; color: #fff; } +.cold.s2 .eye { opacity: .95; } +.concept-tag { position: absolute; z-index: 90; left: 14px; top: calc(var(--sat) + 58px); pointer-events: none; font-size: 9.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: rgba(246,223,160,.72); padding: 3px 7px; border-radius: 6px; background: rgba(10,12,18,.35); box-shadow: inset 0 0 0 .5px rgba(233,196,106,.3); } +.app[data-tab="now"] .concept-tag, .app[data-tab="threads"] .concept-tag, .app[data-tab="you"] .concept-tag { top: calc(var(--sat) + 14px); left: auto; right: 14px; } +.app[data-tab="capture"] .concept-tag { top: calc(var(--sat) + 100px); left: 14px; } +.app[data-mode="situation"] .concept-tag { left: auto; right: 14px; top: calc(var(--sat) + 62px); } + +/* intro */ +.pane, .tabwrap, .acc-host, .concept-tag, .gchrome { transition: opacity .9s ease, transform .45s var(--out); } +.app.intro .pane, .app.intro .tabwrap, .app.intro .acc-host, .app.intro .concept-tag, .app.intro .gchrome, .app.intro .labels { opacity: 0 !important; pointer-events: none !important; } +.app.intro .pane * { pointer-events: none !important; } + +/* tab visibility (phone) */ +.app[data-tab="now"] .gchrome, .app[data-tab="threads"] .gchrome, .app[data-tab="you"] .gchrome, .app[data-tab="capture"] .gchrome { display: none; } +.app[data-mode="situation"] .gbottom .dock, .app[data-mode="ride"] .gchrome, .app[data-mode="ride"] .tabwrap, .app[data-mode="ride"] .acc-host { display: none; } +.app[data-tab="globe"] .acc-host { display: none; } +.app[data-mode="situation"] .gtop, .app[data-mode="workspace"] .gtop { opacity: 0; pointer-events: none; } +.app[data-mode="situation"] .gtop > * { pointer-events: none; } +.app[data-mode="situation"] .acc-host { display: none; } +.wide-only { display: none !important; } + +/* ---------- wide / foldable: two panes ---------- */ +@media (min-width: 600px) { + :root { --paneW: clamp(360px, 40vw, 440px); } + .pane { width: var(--paneW); background: var(--bg); border-right: .5px solid var(--sep); z-index: 22; } + .tabwrap { --tabW: var(--paneW); } + .acc-host { right: auto; width: calc(var(--paneW) - 24px); } + .app[data-tab="globe"] .acc-host { display: flex; } + .wide-only { display: block !important; } + .app .gchrome { display: block !important; } + .app .gchrome.flexy { display: flex !important; } + .now-hero { height: calc(var(--sat) + 150px); } + .now-hero::after { display: none; } + .now-hero .lt { text-shadow: none; } + .gbottom { bottom: 18px; padding: 0 16px; max-width: 760px; margin: 0 auto; left: var(--paneW); } + .sheet { left: 0; width: var(--paneW); height: 100%; border-radius: 0; transform: translateX(-104%); z-index: 34; background: var(--bg) !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; box-shadow: inset -.5px 0 0 var(--sep) !important; } + .sheet::after { display: none; } + .sheet.wopen { transform: none !important; } + .sheet .grab { display: none; } + .sheet .sc { padding-top: calc(var(--sat) + 60px); } + .backbtn { left: 12px; } + .app[data-mode="situation"] .tabwrap { display: none; } + .ws .body { top: 0; border-radius: 0; background: var(--bg) !important; backdrop-filter: none !important; } + .ws .body::after { display: none; } + .ws .body { padding-top: calc(var(--sat) + 60px); } + .cc { left: var(--paneW); } + #v-capture { z-index: 45; } + .ride { left: var(--paneW); } + .concept-tag, .app[data-tab] .concept-tag { top: calc(var(--sat) + 14px); bottom: auto; left: auto; right: 70px; } + .composer { left: 10px; right: 10px; } +} +@media (min-width: 1100px) { + :root { --paneW: 440px; } + .masonry { grid-template-columns: 1fr 1fr; } +} +/* hinge-aware: vertical fold — panes split exactly at the hinge */ +@media (horizontal-viewport-segments: 2) { + :root { --paneW: env(viewport-segment-right 0 0, 50vw); } + #gl, .globe-area { left: env(viewport-segment-left 1 0, 50vw); width: auto; right: 0; } + #gl { width: calc(100% - env(viewport-segment-left 1 0, 50vw)); } + .gtop, .gbottom, .cc, .ride { left: env(viewport-segment-left 1 0, 50vw); } +} +/* tabletop: globe on the top half, controls on the bottom half */ +@media (vertical-viewport-segments: 2) { + :root { --paneW: 0px; --fold: env(viewport-segment-bottom 0 0, 50vh); --fold2: env(viewport-segment-top 0 1, 50vh); } + #gl { height: var(--fold); } + .pane { top: var(--fold2); width: 100%; border-right: 0; } + .now-hero { display: none; } + .gbottom { bottom: auto; top: calc(var(--fold2) + 12px); } +} +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .12s !important; } +} diff --git a/mobile/vision/src/app.html b/mobile/vision/src/app.html new file mode 100644 index 000000000..dc0cadfb3 --- /dev/null +++ b/mobile/vision/src/app.html @@ -0,0 +1,165 @@ + + + +God's Eye + + + +
    + +
    + +
    +
    +
    +
    +
    +
    + + +
    + +
    + + + + +
    +
    +
    +
    +
    +
    FORECAST
    +
    + +
    +
    + +
    +
    +
    + + +
    + + +
    +
    +
    +
    +
    Concept · illustrative data
    +
    + + +
    God’s Eye
    +
    The window to the world.
    +
    +
    + + diff --git a/mobile/vision/src/js/00-util.js b/mobile/vision/src/js/00-util.js new file mode 100644 index 000000000..219b01b92 --- /dev/null +++ b/mobile/vision/src/js/00-util.js @@ -0,0 +1,240 @@ +/* God's Eye — vision mockup. Utilities: math, geo, sun, rng, DOM, formatting. */ +const GE = (window.GE = window.GE || {}); +const D2R = Math.PI / 180, R2D = 180 / Math.PI, TAU = Math.PI * 2; +const EARTH_KM = 6371.0, EARTH_M = 6371000.0; +const clamp = (x, a, b) => (x < a ? a : x > b ? b : x); +const lerp = (a, b, t) => a + (b - a) * t; +const smooth = (a, b, x) => { const t = clamp((x - a) / (b - a), 0, 1); return t * t * (3 - 2 * t); }; +const ease = { + inOut: (t) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2), + out: (t) => 1 - Math.pow(1 - t, 3), + outQuint: (t) => 1 - Math.pow(1 - t, 5), + inOutSine: (t) => -(Math.cos(Math.PI * t) - 1) / 2, + outBack: (t) => { const c1 = 1.4, c3 = c1 + 1; return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2); }, +}; +const prefersReduced = () => { try { return matchMedia('(prefers-reduced-motion: reduce)').matches; } catch { return false; } }; + +/* ---------- vec3 / mat4 (Float64 arrays for CPU precision) ---------- */ +const v3 = { + add: (a, b) => [a[0] + b[0], a[1] + b[1], a[2] + b[2]], + sub: (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]], + scale: (a, s) => [a[0] * s, a[1] * s, a[2] * s], + dot: (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2], + cross: (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]], + len: (a) => Math.hypot(a[0], a[1], a[2]), + norm: (a) => { const l = Math.hypot(a[0], a[1], a[2]) || 1; return [a[0] / l, a[1] / l, a[2] / l]; }, + lerp: (a, b, t) => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t], + madd: (a, b, s) => [a[0] + b[0] * s, a[1] + b[1] * s, a[2] + b[2] * s], +}; +const m4 = { + ident: () => [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], + mul(a, b) { // column-major a*b + const o = new Array(16); + for (let c = 0; c < 4; c++) for (let r = 0; r < 4; r++) + o[c * 4 + r] = a[r] * b[c * 4] + a[4 + r] * b[c * 4 + 1] + a[8 + r] * b[c * 4 + 2] + a[12 + r] * b[c * 4 + 3]; + return o; + }, + persp(fovy, aspect, n, f) { + const t = 1 / Math.tan(fovy / 2); + return [t / aspect, 0, 0, 0, 0, t, 0, 0, 0, 0, (f + n) / (n - f), -1, 0, 0, (2 * f * n) / (n - f), 0]; + }, + // rotation-only view from basis (right, up, back) rows + viewRot(right, up, back) { + return [right[0], up[0], back[0], 0, right[1], up[1], back[1], 0, right[2], up[2], back[2], 0, 0, 0, 0, 1]; + }, + invert(m) { + const a = m, o = new Array(16); + const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; + const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + const b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10, b03 = a01 * a12 - a02 * a11; + const b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12, b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30; + const b08 = a20 * a33 - a23 * a30, b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32; + let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + if (!det) return m4.ident(); + det = 1 / det; + o[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; o[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + o[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; o[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + o[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; o[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + o[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; o[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + o[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; o[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + o[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; o[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + o[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; o[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + o[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; o[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return o; + }, + xform(m, p) { // returns clip vec4 + const x = p[0], y = p[1], z = p[2]; + return [m[0] * x + m[4] * y + m[8] * z + m[12], m[1] * x + m[5] * y + m[9] * z + m[13], m[2] * x + m[6] * y + m[10] * z + m[14], m[3] * x + m[7] * y + m[11] * z + m[15]]; + }, +}; + +/* ---------- geo (unit sphere, x→(0,0), y→(0,90E), z→north) ---------- */ +const geo = { + vec(lat, lon, altKm = 0) { + const r = 1 + altKm / EARTH_KM, la = lat * D2R, lo = lon * D2R, c = Math.cos(la); + return [r * c * Math.cos(lo), r * c * Math.sin(lo), r * Math.sin(la)]; + }, + ll(v) { const r = v3.len(v); return [Math.asin(clamp(v[2] / r, -1, 1)) * R2D, Math.atan2(v[1], v[0]) * R2D, (r - 1) * EARTH_KM]; }, + enu(lat, lon) { // east, north, up + const la = lat * D2R, lo = lon * D2R; + const up = [Math.cos(la) * Math.cos(lo), Math.cos(la) * Math.sin(lo), Math.sin(la)]; + const east = [-Math.sin(lo), Math.cos(lo), 0]; + const north = [-Math.sin(la) * Math.cos(lo), -Math.sin(la) * Math.sin(lo), Math.cos(la)]; + return { east, north, up }; + }, + dist(lat1, lon1, lat2, lon2) { // radians + const p1 = lat1 * D2R, p2 = lat2 * D2R, dp = p2 - p1, dl = (lon2 - lon1) * D2R; + const a = Math.sin(dp / 2) ** 2 + Math.cos(p1) * Math.cos(p2) * Math.sin(dl / 2) ** 2; + return 2 * Math.asin(Math.min(1, Math.sqrt(a))); + }, + bearing(lat1, lon1, lat2, lon2) { + const p1 = lat1 * D2R, p2 = lat2 * D2R, dl = (lon2 - lon1) * D2R; + return Math.atan2(Math.sin(dl) * Math.cos(p2), Math.cos(p1) * Math.sin(p2) - Math.sin(p1) * Math.cos(p2) * Math.cos(dl)); + }, + slerp(a, b, t) { + const d = clamp(v3.dot(a, b), -1, 1), om = Math.acos(d); + if (om < 1e-9) return a.slice(); + const s = Math.sin(om); + return v3.add(v3.scale(a, Math.sin((1 - t) * om) / s), v3.scale(b, Math.sin(t * om) / s)); + }, + // destination from lat/lon, bearing (rad), distance (km) + dest(lat, lon, brg, km) { + const d = km / EARTH_KM, p1 = lat * D2R, l1 = lon * D2R; + const p2 = Math.asin(Math.sin(p1) * Math.cos(d) + Math.cos(p1) * Math.sin(d) * Math.cos(brg)); + const l2 = l1 + Math.atan2(Math.sin(brg) * Math.sin(d) * Math.cos(p1), Math.cos(d) - Math.sin(p1) * Math.sin(p2)); + return [p2 * R2D, ((l2 * R2D + 540) % 360) - 180]; + }, + // local ENU meters offset -> lat/lon + offset(lat, lon, eM, nM) { return [lat + (nM / EARTH_M) * R2D, lon + (eM / (EARTH_M * Math.cos(lat * D2R))) * R2D]; }, +}; + +/* ---------- sun & sidereal time ---------- */ +const astro = { + jd: (ms) => ms / 86400000 + 2440587.5, + // returns { lat, lon, dir:[x,y,z], gmst(rad) } + sun(ms) { + const d = astro.jd(ms) - 2451545.0; + const g = (357.529 + 0.98560028 * d) * D2R; + const q = 280.459 + 0.98564736 * d; + const L = (q + 1.915 * Math.sin(g) + 0.02 * Math.sin(2 * g)) * D2R; + const e = (23.439 - 0.00000036 * d) * D2R; + const ra = Math.atan2(Math.cos(e) * Math.sin(L), Math.cos(L)); + const dec = Math.asin(Math.sin(e) * Math.sin(L)); + const gmst = ((18.697374558 + 24.06570982441908 * d) % 24) * 15 * D2R; + let lon = (ra - gmst) * R2D; + lon = ((lon % 360) + 540) % 360 - 180; + const lat = dec * R2D; + return { lat, lon, dir: geo.vec(lat, lon), gmst: ((gmst % TAU) + TAU) % TAU }; + }, + // sun elevation (deg) at a place + elev(ms, lat, lon) { const s = astro.sun(ms); return 90 - geo.dist(lat, lon, s.lat, s.lon) * R2D; }, +}; + +/* ---------- seeded rng ---------- */ +function rng(seed) { + let a = seed >>> 0; + const f = () => { a = (a + 0x6d2b79f5) >>> 0; let t = a; t = Math.imul(t ^ (t >>> 15), t | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; + f.range = (a0, b0) => a0 + (b0 - a0) * f(); + f.int = (n) => Math.floor(f() * n); + f.pick = (arr) => arr[Math.floor(f() * arr.length)]; + f.gauss = () => { let u = 0, v = 0; while (!u) u = f(); while (!v) v = f(); return Math.sqrt(-2 * Math.log(u)) * Math.cos(TAU * v); }; + f.wpick = (arr, w) => { let s = 0; for (const x of arr) s += w(x); let r = f() * s; for (const x of arr) { r -= w(x); if (r <= 0) return x; } return arr[arr.length - 1]; }; + return f; +} +const hash01 = (n) => { const x = Math.sin(n * 127.1 + 311.7) * 43758.5453; return x - Math.floor(x); }; + +/* ---------- DOM ---------- */ +const $ = (s, r = document) => r.querySelector(s); +const $$ = (s, r = document) => Array.from(r.querySelectorAll(s)); +function h(tag, attrs, ...kids) { + const e = document.createElement(tag); + if (attrs) for (const k in attrs) { + const v = attrs[k]; + if (v == null || v === false) continue; + if (k === 'class') e.className = v; + else if (k === 'html') e.innerHTML = v; + else if (k === 'style' && typeof v === 'object') Object.assign(e.style, v); + else if (k.startsWith('on') && typeof v === 'function') e.addEventListener(k.slice(2), v); + else e.setAttribute(k, v === true ? '' : v); + } + for (const k of kids.flat()) if (k != null && k !== false) e.append(k.nodeType ? k : document.createTextNode(String(k))); + return e; +} +const ic = (name, cls = '') => ``; +const esc = (s) => String(s).replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]); + +/* ---------- formatting ---------- */ +const fmt = { + n(x, d = 0) { return Number(x).toLocaleString('en-US', { minimumFractionDigits: d, maximumFractionDigits: d }); }, + k(x) { return x >= 1e6 ? (x / 1e6).toFixed(1) + 'M' : x >= 1e4 ? Math.round(x / 1e3) + 'k' : x >= 1e3 ? (x / 1e3).toFixed(1) + 'k' : String(Math.round(x)); }, + ago(ms) { + const s = Math.max(0, Math.round(ms / 1000)); + if (s < 5) return 'now'; + if (s < 60) return s + ' s ago'; + if (s < 3600) return Math.round(s / 60) + ' min ago'; + if (s < 86400) return Math.round(s / 3600) + ' h ago'; + return Math.round(s / 86400) + ' d ago'; + }, + utc(ms, withDay = true) { + const d = new Date(ms); + const dd = d.toLocaleDateString('en-GB', { weekday: 'short', day: 'numeric', month: 'short', timeZone: 'UTC' }); + const tt = String(d.getUTCHours()).padStart(2, '0') + ':' + String(d.getUTCMinutes()).padStart(2, '0'); + return withDay ? `${dd} · ${tt} UTC` : tt; + }, + hm(ms) { const d = new Date(ms); return String(d.getUTCHours()).padStart(2, '0') + ':' + String(d.getUTCMinutes()).padStart(2, '0'); }, + rel(h) { // hours offset → "−26 h" / "+4 h 30 m" + const sign = h < 0 ? '−' : '+', a = Math.abs(h), H = Math.floor(a), M = Math.round((a - H) * 60); + if (a < 1 / 60) return 'Live'; + return `${sign}${H ? H + ' h' : ''}${M && H < 24 ? (H ? ' ' : '') + M + ' m' : ''}`; + }, + ll(lat, lon, d = 3) { return `${Math.abs(lat).toFixed(d)}°${lat >= 0 ? 'N' : 'S'} ${Math.abs(lon).toFixed(d)}°${lon >= 0 ? 'E' : 'W'}`; }, + dur(s) { s = Math.max(0, Math.round(s)); const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), x = s % 60; return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${String(x).padStart(2, '0')}`; }, + hex: (buf) => Array.from(new Uint8Array(buf), (b) => b.toString(16).padStart(2, '0')).join(''), +}; + +/* ---------- tiny event bus ---------- */ +const bus = { + m: new Map(), + on(e, f) { if (!this.m.has(e)) this.m.set(e, new Set()); this.m.get(e).add(f); return () => this.m.get(e).delete(f); }, + off(e, f) { this.m.get(e)?.delete(f); }, + emit(e, d) { this.m.get(e)?.forEach((f) => { try { f(d); } catch (err) { console.warn(err); } }); }, +}; + +/* ---------- storage (conveniences only) ---------- */ +const store = { + get(k, d) { try { const v = localStorage.getItem('ge.v1.' + k); return v == null ? d : JSON.parse(v); } catch { return d; } }, + set(k, v) { try { localStorage.setItem('ge.v1.' + k, JSON.stringify(v)); } catch {} }, +}; +const haptic = (p = 8) => { try { navigator.vibrate && navigator.vibrate(p); } catch {} }; + +/* ---------- hashing ---------- */ +// SHA-256 fallback (only used if crypto.subtle is unavailable) +function sha256js(bytes) { + const K = new Uint32Array([0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2]); + const H = new Uint32Array([0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19]); + const l = bytes.length, nb = ((l + 9 + 63) >> 6) << 6, m = new Uint8Array(nb); + m.set(bytes); m[l] = 0x80; const dv = new DataView(m.buffer); dv.setUint32(nb - 4, l * 8); dv.setUint32(nb - 8, Math.floor((l * 8) / 4294967296)); + const W = new Uint32Array(64); const r = (x, n) => (x >>> n) | (x << (32 - n)); + for (let o = 0; o < nb; o += 64) { + for (let i = 0; i < 16; i++) W[i] = dv.getUint32(o + i * 4); + for (let i = 16; i < 64; i++) { const s0 = r(W[i-15],7)^r(W[i-15],18)^(W[i-15]>>>3), s1 = r(W[i-2],17)^r(W[i-2],19)^(W[i-2]>>>10); W[i] = (W[i-16]+s0+W[i-7]+s1)|0; } + let [a,b,c,d,e,f,g,hh] = H; + for (let i = 0; i < 64; i++) { const S1=r(e,6)^r(e,11)^r(e,25), ch=(e&f)^(~e&g), t1=(hh+S1+ch+K[i]+W[i])|0, S0=r(a,2)^r(a,13)^r(a,22), mj=(a&b)^(a&c)^(b&c), t2=(S0+mj)|0; hh=g; g=f; f=e; e=(d+t1)|0; d=c; c=b; b=a; a=(t1+t2)|0; } + H[0]+=a; H[1]+=b; H[2]+=c; H[3]+=d; H[4]+=e; H[5]+=f; H[6]+=g; H[7]+=hh; + } + const out = new Uint8Array(32); const ov = new DataView(out.buffer); for (let i = 0; i < 8; i++) ov.setUint32(i * 4, H[i]); return out.buffer; +} +const hasSubtle = () => { try { return !!(window.crypto && crypto.subtle && crypto.subtle.digest); } catch { return false; } }; +async function sha256(data) { + const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data instanceof Uint8Array ? data : new Uint8Array(data); + if (hasSubtle()) { try { return fmt.hex(await crypto.subtle.digest('SHA-256', bytes)); } catch {} } + return fmt.hex(sha256js(bytes)); +} +// canonical JSON (sorted keys) for hashing +function canon(o) { + if (o === null || typeof o !== 'object') return JSON.stringify(o); + if (Array.isArray(o)) return '[' + o.map(canon).join(',') + ']'; + return '{' + Object.keys(o).sort().map((k) => JSON.stringify(k) + ':' + canon(o[k])).join(',') + '}'; +} + +Object.assign(GE, { D2R, R2D, TAU, EARTH_KM, clamp, lerp, smooth, ease, v3, m4, geo, astro, rng, fmt, bus, store, sha256, canon }); diff --git a/mobile/vision/src/js/10-data.js b/mobile/vision/src/js/10-data.js new file mode 100644 index 000000000..8ac22f095 --- /dev/null +++ b/mobile/vision/src/js/10-data.js @@ -0,0 +1,281 @@ +/* Synthetic, plausible world data. Real places & public phenomena; all people, handles, posts, + callsigns and reconstruction claims are illustrative (Concept · illustrative data). */ +const NOW = Date.now(); +GE.NOW = NOW; +const R = rng(20261018); + +/* ---------- airports [iata, city, lat, lon, weight] ---------- */ +const AIRPORTS = [ + ['ATL','Atlanta',33.6407,-84.4277,104],['DXB','Dubai',25.2532,55.3657,87],['DFW','Dallas–Fort Worth',32.8998,-97.0403,82],['LHR','London Heathrow',51.47,-0.4543,80], + ['HND','Tokyo Haneda',35.5494,139.7798,79],['DEN','Denver',39.8561,-104.6737,78],['IST','Istanbul',41.2753,28.7519,76],['LAX','Los Angeles',33.9416,-118.4085,75], + ['ORD','Chicago O’Hare',41.9742,-87.9073,74],['DEL','Delhi',28.5562,77.1,73],['CDG','Paris CDG',49.0097,2.5479,70],['JFK','New York JFK',40.6413,-73.7781,62], + ['CAN','Guangzhou',23.3924,113.2988,64],['PEK','Beijing',40.0799,116.6031,60],['PVG','Shanghai Pudong',31.1443,121.8083,62],['SIN','Singapore',1.3644,103.9915,59], + ['AMS','Amsterdam',52.3105,4.7683,62],['FRA','Frankfurt',50.0379,8.5622,60],['MAD','Madrid',40.4983,-3.5676,60],['BKK','Bangkok',13.69,100.7501,58], + ['ICN','Seoul Incheon',37.4602,126.4407,56],['BOM','Mumbai',19.0896,72.8656,52],['CGK','Jakarta',-6.1256,106.6559,50],['SFO','San Francisco',37.6213,-122.379,50], + ['LAS','Las Vegas',36.084,-115.1537,55],['MCO','Orlando',28.4312,-81.3081,57],['MIA','Miami',25.7959,-80.287,52],['CLT','Charlotte',35.214,-80.9431,53], + ['SEA','Seattle',47.4502,-122.3088,50],['PHX','Phoenix',33.4342,-112.0116,48],['EWR','Newark',40.6895,-74.1745,49],['IAH','Houston',29.9902,-95.3368,46], + ['BOS','Boston',42.3656,-71.0096,40],['MSP','Minneapolis',44.8848,-93.2223,36],['DTW','Detroit',42.2162,-83.3554,32],['YYZ','Toronto',43.6777,-79.6248,45], + ['YVR','Vancouver',49.1967,-123.1815,25],['MEX','Mexico City',19.4361,-99.0719,48],['CUN','Cancún',21.0365,-86.877,30],['GRU','São Paulo',-23.4356,-46.4731,42], + ['BOG','Bogotá',4.7016,-74.1469,38],['LIM','Lima',-12.0219,-77.1143,24],['SCL','Santiago',-33.393,-70.7858,24],['EZE','Buenos Aires',-34.8222,-58.5358,12], + ['GIG','Rio de Janeiro',-22.809,-43.2506,15],['PTY','Panama City',9.0714,-79.3835,17],['MUC','Munich',48.3537,11.775,41],['FCO','Rome',41.8003,12.2389,40], + ['BCN','Barcelona',41.2974,2.0833,52],['LGW','London Gatwick',51.1537,-0.1821,41],['ZRH','Zurich',47.4582,8.5555,31],['VIE','Vienna',48.1103,16.5697,29], + ['CPH','Copenhagen',55.618,12.6508,30],['OSL','Oslo',60.1976,11.1004,27],['ARN','Stockholm',59.6498,17.9238,25],['HEL','Helsinki',60.3172,24.9633,18], + ['DUB','Dublin',53.4264,-6.2499,33],['LIS','Lisbon',38.7742,-9.1342,33],['ATH','Athens',37.9364,23.9445,28],['WAW','Warsaw',52.1657,20.9671,21], + ['PRG','Prague',50.1008,14.26,17],['BRU','Brussels',50.9014,4.4844,24],['MAN','Manchester',53.3537,-2.275,29],['PMI','Palma',39.5517,2.7388,33], + ['DOH','Doha',25.2731,51.6081,45],['AUH','Abu Dhabi',24.433,54.6511,28],['RUH','Riyadh',24.9576,46.6988,36],['JED','Jeddah',21.6702,39.1525,42], + ['CAI','Cairo',30.1219,31.4056,30],['TLV','Tel Aviv',32.0055,34.8854,24],['ADD','Addis Ababa',8.9779,38.7993,13],['NBO','Nairobi',-1.3192,36.9278,9], + ['JNB','Johannesburg',-26.1392,28.246,21],['CPT','Cape Town',-33.9715,18.6021,11],['LOS','Lagos',6.5774,3.3212,8],['CMN','Casablanca',33.3675,-7.5898,10], + ['HKG','Hong Kong',22.308,113.9185,53],['TPE','Taipei',25.0797,121.2342,45],['NRT','Tokyo Narita',35.772,140.3929,33],['KIX','Osaka Kansai',34.4347,135.244,28], + ['MNL','Manila',14.5086,121.0198,45],['KUL','Kuala Lumpur',2.7456,101.7072,57],['SGN','Ho Chi Minh City',10.8188,106.6519,40],['HAN','Hanoi',21.2187,105.8042,29], + ['CTU','Chengdu',30.5785,103.9471,50],['SZX','Shenzhen',22.6393,113.8107,52],['KMG','Kunming',25.1019,102.9292,45],['XIY','Xi’an',34.4471,108.7516,43], + ['CKG','Chongqing',29.7192,106.6417,44],['HGH','Hangzhou',30.2295,120.4344,40],['BLR','Bengaluru',13.1986,77.7066,37],['MAA','Chennai',12.9941,80.1709,22], + ['CCU','Kolkata',22.6547,88.4467,22],['HYD','Hyderabad',17.2403,78.4294,21],['KTM','Kathmandu',27.6966,85.3591,8],['DAC','Dhaka',23.8433,90.3978,9], + ['KHI','Karachi',24.9065,67.1608,8],['SYD','Sydney',-33.9399,151.1753,44],['MEL','Melbourne',-37.669,144.841,37],['BNE','Brisbane',-27.3842,153.1175,24], + ['PER','Perth',-31.9385,115.9672,15],['AKL','Auckland',-37.0082,174.785,21],['HNL','Honolulu',21.3187,-157.9225,21],['ANC','Anchorage',61.1743,-149.9963,6], + ['SVO','Moscow',55.9726,37.4146,40],['LED','St Petersburg',59.8003,30.2625,19],['ALA','Almaty',43.3521,77.0405,9],['TAS','Tashkent',41.2579,69.2812,7], + ['RKV','Reykjavík',63.985,-22.6056,8],['SLC','Salt Lake City',40.7899,-111.9791,26],['SAN','San Diego',32.7338,-117.1933,25],['PDX','Portland',45.5898,-122.5951,19], + ['AUS','Austin',30.1975,-97.6664,21],['BNA','Nashville',36.1263,-86.6774,22],['MSY','New Orleans',29.9934,-90.258,13],['YUL','Montréal',45.4706,-73.7408,21], + ['YYC','Calgary',51.1215,-114.0076,18],['GUA','Guatemala City',14.5833,-90.5275,3],['SJO','San José CR',9.9939,-84.2088,5],['UIO','Quito',-0.1292,-78.3575,5], +]; +const AP = AIRPORTS.map(([iata, city, lat, lon, w]) => ({ iata, city, lat, lon, w, v: geo.vec(lat, lon) })); +const apByIata = Object.fromEntries(AP.map((a) => [a.iata, a])); + +/* ---------- fictional operators ---------- */ +const OPS = ['AXR','NVA','SKL','ORX','VLT','KTO','LMA','TRV','QNX','PLR','HZN','CRS','SOL','MRD','EQX','BLU','CYG','ALD','JTR','FRN']; +const OPNAME = { AXR:'Axiom Air', NVA:'Nova Atlantic', SKL:'Skylark', ORX:'Orix Cargo', VLT:'Volta', KTO:'Kito Air', LMA:'Lumea', TRV:'Traverse', QNX:'Quanta', PLR:'Polaris', HZN:'Horizonte', CRS:'Cirrus Lines', SOL:'Solstice', MRD:'Meridian', EQX:'Equinox', BLU:'Bluewing', CYG:'Cygnet', ALD:'Aldea', JTR:'Jetrail', FRN:'Fernway' }; +const TYPES_SHORT = ['A320','A21N','B738','B38M','E190','A20N','AT76','CRJ9']; +const TYPES_LONG = ['B77W','A359','B789','A388','B78X','A35K','B744F','A333']; + +/* ---------- flights (GPU-animated great circles) ---------- + Each flight cycles: fly a→b for dur, turn around, fly b→a… so any scrub time is consistent. */ +const FLIGHTS = []; +(function genFlights() { + const N = 3600; + const wsum = AP.reduce((s, a) => s + a.w, 0); + const pickAp = () => { let r = R() * wsum; for (const a of AP) { r -= a.w; if (r <= 0) return a; } return AP[0]; }; + let guard = 0; + while (FLIGHTS.length < N && guard++ < N * 8) { + const a = pickAp(); let b = pickAp(); + if (a === b) continue; + const d = geo.dist(a.lat, a.lon, b.lat, b.lon) * EARTH_KM; + if (d < 250 || d > 15500) continue; + // short-haul bias + if (d > 6000 && R() < 0.55) continue; + const long = d > 4500; + const speed = long ? 905 : 780; // km/h + const dur = (d / speed + 0.45) * 3600; // seconds + const turn = (long ? R.range(1.5, 3.5) : R.range(0.6, 2.2)) * 3600; + const period = 2 * (dur + turn); + const op = R.pick(OPS); + FLIGHTS.push({ + kind: 0, a, b, dKm: d, dur, turn, period, t0: R() * period, alt: long ? R.range(10.6, 12.5) : R.range(8.5, 11.6), + cs: op + (R.int(8900) + 100), op, type: long ? R.pick(TYPES_LONG) : R.pick(TYPES_SHORT), speed, + }); + } + // private / GA — short hops near busy regions + for (let i = 0; i < 380; i++) { + const a = R.pick(AP); const brg = R() * TAU, km = R.range(80, 520); + const [lat, lon] = geo.dest(a.lat, a.lon, brg, km); + const b = { iata: 'GA', city: '', lat, lon, w: 1, v: geo.vec(lat, lon) }; + const dur = (km / 330 + 0.2) * 3600, turn = R.range(0.5, 4) * 3600; + FLIGHTS.push({ kind: 3, a, b, dKm: km, dur, turn, period: 2 * (dur + turn), t0: R() * 2 * (dur + turn), alt: R.range(1.5, 4.5), cs: 'N' + (R.int(899) + 100) + String.fromCharCode(65 + R.int(26), 65 + R.int(26)), op: 'GA', type: R.pick(['C172','PC12','SR22','C25A','BE20']), speed: 330 }); + } + // military transits (fictional callsigns) + const MIL = [[55.0,10.0],[50.0,20.0],[44.0,30.0],[37.0,24.0],[36.5,-76.0],[32.0,-110.0],[26.0,51.0],[35.0,128.0],[21.0,-158.0],[13.5,144.8],[51.0,-1.5],[64.0,25.0],[57.0,22.0],[54.5,18.0]]; + const MCS = ['VIPER','TITAN','HAWK','RAVEN','SABRE','ATLAS','GHOST','DUKE','NOMAD','LANCE']; + for (let i = 0; i < 160; i++) { + const c = R.pick(MIL); const [la1, lo1] = geo.dest(c[0], c[1], R() * TAU, R.range(50, 600)); const [la2, lo2] = geo.dest(c[0], c[1], R() * TAU, R.range(300, 1600)); + const a = { iata: 'MIL', lat: la1, lon: lo1, v: geo.vec(la1, lo1) }, b = { iata: 'MIL', lat: la2, lon: lo2, v: geo.vec(la2, lo2) }; + const km = geo.dist(la1, lo1, la2, lo2) * EARTH_KM; const dur = (km / 760 + 0.2) * 3600, turn = R.range(0.3, 3) * 3600; + FLIGHTS.push({ kind: 1, a, b, dKm: km, dur, turn, period: 2 * (dur + turn), t0: R() * 2 * (dur + turn), alt: R.range(6, 11), cs: R.pick(MCS) + ' ' + (R.int(89) + 10), op: 'MIL', type: R.pick(['KC-135','C-17','P-8','E-3','RC-135','A400','F-35','MQ-9']), speed: 760 }); + } +})(); +// position of a flight at sim seconds t → {v:[x,y,z] (unit, alt applied), lat, lon, altKm, hdg, prog, onLeg} +function flightAt(f, t) { + let ph = (t - f.t0) % f.period; if (ph < 0) ph += f.period; + const leg = ph < f.period / 2 ? 0 : 1; const lp = ph - leg * (f.period / 2); + if (lp > f.dur) return null; + const p = lp / f.dur; const A = leg ? f.b : f.a, B = leg ? f.a : f.b; + const s = geo.slerp(A.v, B.v, p); + const climb = Math.min(1, Math.min(p, 1 - p) * f.dKm / 160); + const altKm = f.alt * Math.sqrt(Math.max(0, climb)); + const [lat, lon] = geo.ll(s); + const s2 = geo.slerp(A.v, B.v, Math.min(1, p + 0.001)); const [lat2, lon2] = geo.ll(s2); + return { v: s, lat, lon, altKm, hdg: geo.bearing(lat, lon, lat2, lon2), prog: p, from: A, to: B }; +} + +/* ---------- shipping lanes (lat,lon chains on water) ---------- */ +const LANES = [ + // Asia–Europe via Suez + [[31.0,122.6],[28.0,122.6],[24.6,119.9],[22.0,116.0],[18.0,113.5],[12.0,110.4],[7.0,106.0],[2.6,104.9],[1.25,104.0],[1.9,102.4],[3.4,100.6],[5.9,97.2],[6.1,94.0],[6.0,88.0],[5.7,81.0],[7.0,76.5],[11.0,64.0],[12.2,52.0],[12.0,46.5],[12.6,43.4],[14.5,42.4],[18.0,40.3],[22.0,37.9],[25.5,35.3],[27.8,33.7],[29.6,32.6],[30.6,32.33],[31.4,32.33],[32.6,30.0],[34.0,24.5],[36.1,16.0],[37.3,11.6],[37.6,8.0],[36.6,2.0],[35.95,-5.6],[36.6,-9.6],[40.0,-10.2],[43.6,-9.9],[48.4,-5.8],[49.9,-2.3],[50.9,1.3],[51.6,2.8],[52.0,3.95]], + // Transpacific (Shanghai → LA) + [[31.0,122.6],[30.3,128.5],[33.0,135.5],[34.6,139.9],[36.5,152.0],[38.0,165.0],[38.5,180.0],[37.5,-165.0],[35.5,-145.0],[34.0,-128.0],[33.7,-118.4]], + // Busan → Seattle (great circle north) + [[35.0,129.1],[36.5,135.0],[41.4,141.6],[45.0,155.0],[50.0,175.0],[51.5,-170.0],[51.0,-150.0],[49.0,-132.0],[48.4,-124.8]], + // Transatlantic + [[49.9,-2.3],[49.4,-6.4],[47.5,-20.0],[44.5,-40.0],[41.5,-60.0],[40.45,-73.8]], + // US East coast → Panama → west coast S America + [[40.45,-73.8],[35.2,-74.6],[28.0,-77.5],[24.0,-74.5],[20.2,-73.8],[15.0,-77.0],[9.4,-79.9],[8.9,-79.5],[7.2,-80.2],[1.0,-81.3],[-6.0,-81.5],[-12.0,-77.3]], + // Panama → LA + [[8.9,-79.5],[10.5,-87.5],[15.0,-96.5],[20.0,-106.0],[23.0,-110.6],[29.0,-116.0],[33.7,-118.4]], + // Gulf of Mexico → Florida → NY + [[29.3,-94.7],[26.5,-90.0],[24.3,-84.0],[24.2,-81.0],[26.5,-79.7],[31.0,-79.5],[35.2,-74.6]], + // Persian Gulf → Hormuz → Arabian Sea → Gulf of Aden + [[29.4,48.6],[27.3,50.8],[26.5,54.0],[26.5,56.4],[25.2,57.5],[22.6,60.3],[17.0,57.0],[12.2,52.0]], + // Persian Gulf → Malacca + [[25.2,57.5],[22.6,60.3],[17.0,66.0],[10.0,73.0],[6.6,79.3],[5.7,81.0]], + // Cape route + [[22.6,60.3],[10.0,58.0],[-5.0,52.0],[-12.0,45.5],[-20.0,39.5],[-28.0,34.5],[-34.5,26.0],[-35.3,19.5],[-33.0,15.5],[-24.0,11.0],[-10.0,4.0],[2.0,-3.0],[10.0,-18.5],[20.0,-19.5],[28.5,-15.0],[35.5,-10.0],[36.6,-9.6]], + // Singapore → Australia (Lombok) + [[1.25,104.0],[-2.0,107.4],[-6.0,113.0],[-8.7,115.75],[-14.0,117.0],[-20.3,118.6]], + // SE Asia → Hong Kong → Busan + [[22.0,116.0],[25.0,121.8],[29.0,124.0],[33.0,127.8],[35.0,129.1]], + // North Sea → Baltic + [[52.0,3.95],[53.8,6.8],[56.2,7.6],[57.9,10.7],[56.4,12.0],[55.6,12.75],[55.1,14.8],[56.5,18.6],[58.3,20.6],[59.6,23.5],[59.95,27.5],[59.9,29.8]], + // Med: Port Said → Piraeus → Bosphorus → Novorossiysk + [[31.4,32.33],[33.5,28.5],[36.0,25.3],[37.9,23.55],[39.2,24.6],[40.2,26.2],[40.95,28.9],[41.25,29.1],[42.8,31.5],[44.3,36.5],[44.65,37.8]], + // W Med: Gibraltar → Marseille → Genoa + [[35.95,-5.6],[37.0,-1.0],[39.5,2.6],[42.6,4.6],[43.2,5.3],[43.6,7.5],[44.3,8.9]], + // China coast → Japan + [[31.0,122.6],[33.0,126.0],[34.0,130.8],[33.6,135.0],[34.6,139.9]], + // Australia east coast + [[-33.85,151.4],[-30.0,153.8],[-27.3,153.6],[-24.0,152.8],[-19.0,147.8],[-12.0,143.8],[-10.4,142.1],[-9.8,137.0],[-8.6,125.0],[-8.7,115.75]], + // Brazil → West Africa + [[-23.9,-46.3],[-22.9,-41.0],[-15.0,-37.5],[-5.0,-34.4],[2.0,-25.0],[6.0,-8.0],[6.3,3.4]], +]; +const LANE_V = LANES.map((l) => { const pts = l.map(([la, lo]) => geo.vec(la, lo)); const cum = [0]; for (let i = 1; i < pts.length; i++) cum.push(cum[i - 1] + Math.acos(clamp(v3.dot(pts[i - 1], pts[i]), -1, 1))); return { pts, cum, len: cum[cum.length - 1], raw: l }; }); +const SHIPS = []; +(function genShips() { + const NAMES1 = ['Northern','Aurora','Pacific','Silver','Atlas','Coral','Ocean','Polar','Cape','Golden','Blue','Iron','Jade','Amber','Crimson','Morning','Evening','Sea','Star','Harbor']; + const NAMES2 = ['Lark','Spirit','Voyager','Pioneer','Horizon','Dawn','Tide','Meridian','Wave','Crest','Falcon','Unity','Glory','Venture','Breeze','Pearl','Fortune','Harmony','Trader','Express']; + const kinds = ['container','tanker','bulk','LNG','ro-ro','general']; + const tot = LANE_V.reduce((s, l) => s + l.len, 0); + for (let i = 0; i < 2200; i++) { + let r = R() * tot, li = 0; for (; li < LANE_V.length - 1; li++) { if (r < LANE_V[li].len) break; r -= LANE_V[li].len; } + const kn = kinds[R.int(kinds.length)]; + const kts = kn === 'container' ? R.range(14, 21) : R.range(10, 15); + SHIPS.push({ lane: li, off: R(), dir: R() < 0.5 ? 1 : -1, speed: (kts * 1.852) / EARTH_KM / 3600, lat0: R.gauss() * 0.12, name: 'MV ' + R.pick(NAMES1) + ' ' + R.pick(NAMES2), kind: kn, mmsi: 200000000 + R.int(500000000), dark: R() < 0.012 }); + } + // anchorage queues: Suez south & north, Singapore, Rotterdam, LA/LB + const Q = [[29.72,32.56,48,0.09,'suez'],[31.45,32.2,30,0.1,'suez'],[1.22,103.9,90,0.12,'sin'],[52.0,3.6,26,0.12,'rtm'],[33.55,-118.2,22,0.08,'lalb'],[29.1,48.6,18,0.15,''],[22.2,113.9,40,0.12,'']]; + for (const [la, lo, n, s, q] of Q) for (let i = 0; i < n; i++) SHIPS.push({ anchor: [la + R.gauss() * s * 0.6, lo + R.gauss() * s], name: 'MV ' + R.pick(NAMES1) + ' ' + R.pick(NAMES2), kind: R.pick(kinds), mmsi: 200000000 + R.int(500000000), queue: q, speed: 0 }); +})(); +function shipAt(s, t) { + if (s.anchor) { const [la, lo] = s.anchor; return { lat: la, lon: lo, v: geo.vec(la, lo), hdg: hash01(s.mmsi) * TAU, sog: 0 }; } + const L = LANE_V[s.lane]; + let d = (s.off * L.len + s.dir * s.speed * t) % L.len; if (d < 0) d += L.len; + let i = 1; while (i < L.cum.length - 1 && L.cum[i] < d) i++; + const seg = L.cum[i] - L.cum[i - 1] || 1; const p = (d - L.cum[i - 1]) / seg; + let v = geo.slerp(L.pts[i - 1], L.pts[i], p); + const [la0, lo0] = geo.ll(v); + const brg = geo.bearing(...L.raw[i - 1], ...L.raw[i]) + (s.dir < 0 ? Math.PI : 0); + const [la, lo] = geo.dest(la0, lo0, brg + Math.PI / 2, s.lat0 * 18); + return { lat: la, lon: lo, v: geo.vec(la, lo), hdg: brg, sog: s.speed * EARTH_KM * 3600 / 1.852 }; +} + +/* ---------- satellites (circular orbits; GPU-propagated) ---------- */ +const MU = 398600.4418; +const SATS = []; +function addSat(o) { const a = EARTH_KM + o.alt; o.n = Math.sqrt(MU / (a * a * a)); SATS.push(o); return o; } +(function genSats() { + // Starlink-like shells (53°, 550 km), (70°, 570 km), (97.6°, 560 km) + const shells = [[53, 550, 22, 36], [70, 570, 12, 20], [97.6, 560, 10, 18], [43, 540, 14, 22]]; + for (const [inc, alt, planes, per] of shells) for (let p = 0; p < planes; p++) for (let k = 0; k < per; k++) + addSat({ name: 'STARLINK-' + (1000 + SATS.length), inc: inc * D2R, raan: (p / planes) * TAU, u0: (k / per) * TAU + p * 0.13, alt: alt + R.range(-4, 4), kind: 0 }); + // other LEO (EO, weather, cubesats) + for (let i = 0; i < 420; i++) addSat({ name: 'LEO-' + (40000 + i), inc: (R() < 0.5 ? R.range(96.5, 99) : R.range(30, 82)) * D2R, raan: R() * TAU, u0: R() * TAU, alt: R.range(380, 1200), kind: 1 }); + // GNSS MEO + for (let i = 0; i < 31; i++) addSat({ name: 'GPS ' + (i + 1), inc: 55 * D2R, raan: (Math.floor(i / 5.2) / 6) * TAU, u0: (i % 6) / 6 * TAU + i, alt: 20180, kind: 2 }); + for (let i = 0; i < 24; i++) addSat({ name: 'GNSS-E ' + (i + 1), inc: 56 * D2R, raan: (i % 3) / 3 * TAU, u0: i / 8 * TAU, alt: 23222, kind: 2 }); + // GEO belt + for (let i = 0; i < 90; i++) addSat({ name: 'GEO-' + (i + 1), inc: R.range(0, 0.08) * D2R, raan: 0, u0: R() * TAU, alt: 35786, kind: 3, geo: true }); + // debris + for (let i = 0; i < 600; i++) addSat({ name: 'DEB ' + (20000 + i), inc: R.range(60, 100) * D2R, raan: R() * TAU, u0: R() * TAU, alt: R.range(650, 1500), kind: 4 }); + // Starlink train (fresh launch, low and tight) + for (let i = 0; i < 24; i++) addSat({ name: 'STARLINK-T' + (i + 1), inc: 43 * D2R, raan: 1.9, u0: 2.4 + i * 0.006, alt: 312, kind: 5 }); +})(); +const ISS = addSat({ name: 'ISS (ZARYA)', inc: 51.64 * D2R, raan: 4.1, u0: 0.7, alt: 418, kind: 6 }); +const CSS = addSat({ name: 'CSS (TIANHE)', inc: 41.47 * D2R, raan: 2.2, u0: 3.1, alt: 385, kind: 6 }); +function satAt(s, t, gmst) { // ECEF unit vector with altitude + const u = s.u0 + s.n * t, r = 1 + s.alt / EARTH_KM; + const cu = Math.cos(u), su = Math.sin(u), cO = Math.cos(s.raan), sO = Math.sin(s.raan), ci = Math.cos(s.inc), si = Math.sin(s.inc); + let x = cu * cO - su * ci * sO, y = cu * sO + su * ci * cO, z = su * si; + if (s.geo) { const g = gmst; const c = Math.cos(s.u0), sn = Math.sin(s.u0); return [r * c, r * sn, z * r]; } + const cg = Math.cos(-gmst), sg = Math.sin(-gmst); + return [r * (x * cg - y * sg), r * (x * sg + y * cg), r * z]; +} + +/* ---------- quakes (illustrative, along plate boundaries) ---------- */ +const QUAKE_ZONES = [[35.5,141.9],[38.3,142.4],[-6,130],[-20,-70],[-33,-72],[13,-90],[61,-148],[52,-170],[-41,174],[36,71],[28,84],[38,26],[-17,168],[-5,152],[18,-68],[40,30],[37,-121],[-1,-77],[14,121],[24,123]]; +const QUAKES = []; +for (let i = 0; i < 46; i++) { + const z = R.pick(QUAKE_ZONES); + QUAKES.push({ lat: z[0] + R.gauss() * 1.6, lon: z[1] + R.gauss() * 1.6, mag: +(2.6 + Math.pow(R(), 2.6) * 3.2).toFixed(1), t: R.range(-72, 0) * 3600, depth: Math.round(R.range(8, 120)) }); +} +const BIGQ = { lat: 35.62, lon: 141.95, mag: 6.4, t: -5.4 * 3600, depth: 32, place: 'off the coast of Honshu' }; +QUAKES.push(BIGQ); +for (let i = 0; i < 9; i++) QUAKES.push({ lat: BIGQ.lat + R.gauss() * 0.35, lon: BIGQ.lon + R.gauss() * 0.4, mag: +(3.4 + R() * 1.6).toFixed(1), t: BIGQ.t + R.range(0.2, 5) * 3600, depth: Math.round(R.range(10, 50)) }); + +/* ---------- fires (FIRMS-like hotspots; start times so the ribbon shows spread) ---------- */ +const FIRE_CLUSTERS = [ + [40.2,-8.1,'Central Portugal',90,1.0],[42.4,-7.4,'Galicia',60,0.9],[38.1,23.4,'Attica',50,0.7],[39.8,21.0,'Epirus',30,0.5],[36.8,30.6,'Antalya',40,0.6], + [34.4,-118.5,'Los Angeles County',45,0.8],[39.7,-121.6,'Butte County',40,0.6],[-14.0,-60.0,'Rondônia',180,1.6],[-9.5,24.0,'Katanga savanna',260,2.6], + [8.5,19.0,'Central African savanna',220,2.6],[-17.0,131.0,'Northern Territory',140,2.0],[61.5,128.0,'Yakutia',60,1.3],[-2.5,113.5,'Kalimantan',70,1.0], + [21.0,98.0,'Shan State',60,1.2],[-22.0,-55.0,'Mato Grosso do Sul',70,1.2], +]; +const FIRES = []; +for (const [la, lo, name, n, s] of FIRE_CLUSTERS) { + const tStart = R.range(-70, -6) * 3600; + for (let i = 0; i < n; i++) { + const rad = Math.sqrt(R()) * s, ang = R() * TAU; + // fronts move with prevailing wind: later ignitions sit downwind + const tt = tStart + (rad / s) * R.range(20, 110) * 3600; + FIRES.push({ lat: la + Math.sin(ang) * rad * 0.8, lon: lo + Math.cos(ang) * rad, t: tt, frp: R.range(5, 120), cluster: name }); + } +} + +/* ---------- tropical cyclone (illustrative name) ---------- */ +const CYCLONE = { + name: 'Typhoon Halcyon', designation: '26W (illustrative)', + // [hoursFromNow, lat, lon, windKmh, pressure hPa] + track: [[-72,11.2,141.8,95,992],[-60,11.9,139.6,110,985],[-48,12.6,137.4,130,975],[-36,13.4,135.3,150,965],[-24,14.3,133.1,170,955],[-12,15.2,130.9,180,948],[0,16.2,128.8,185,944], + [12,17.3,126.9,195,938],[24,18.6,125.1,200,935],[36,20.1,123.6,190,940],[48,21.8,122.5,175,950],[72,25.0,121.9,140,968],[96,28.6,124.4,110,980],[120,32.4,129.0,85,990]], + at(hours) { + const tr = this.track; if (hours <= tr[0][0]) return { lat: tr[0][1], lon: tr[0][2], wind: tr[0][3], p: tr[0][4] }; + for (let i = 1; i < tr.length; i++) if (hours <= tr[i][0]) { + const a = tr[i - 1], b = tr[i], f = (hours - a[0]) / (b[0] - a[0]); + return { lat: lerp(a[1], b[1], f), lon: lerp(a[2], b[2], f), wind: lerp(a[3], b[3], f), p: lerp(a[4], b[4], f) }; + } + const z = tr[tr.length - 1]; return { lat: z[1], lon: z[2], wind: z[3], p: z[4] }; + }, + cone(hours) { return hours <= 0 ? 0 : 35 + hours * 3.1; }, // km radius of uncertainty +}; + +/* ---------- cities (search + scatter) ---------- */ +const CITIES = [ + ['New York',40.7128,-74.006],['London',51.5072,-0.1276],['Tokyo',35.6762,139.6503],['Paris',48.8566,2.3522],['Shanghai',31.2304,121.4737],['Mumbai',19.076,72.8777], + ['São Paulo',-23.5505,-46.6333],['Mexico City',19.4326,-99.1332],['Cairo',30.0444,31.2357],['Lagos',6.5244,3.3792],['Istanbul',41.0082,28.9784],['Moscow',55.7558,37.6173], + ['Seoul',37.5665,126.978],['Jakarta',-6.2088,106.8456],['Delhi',28.6139,77.209],['Los Angeles',34.0522,-118.2437],['Chicago',41.8781,-87.6298],['Singapore',1.3521,103.8198], + ['Sydney',-33.8688,151.2093],['Dubai',25.2048,55.2708],['Hong Kong',22.3193,114.1694],['Berlin',52.52,13.405],['Madrid',40.4168,-3.7038],['Rome',41.9028,12.4964], + ['Bangkok',13.7563,100.5018],['Toronto',43.6532,-79.3832],['San Francisco',37.7749,-122.4194],['Buenos Aires',-34.6037,-58.3816],['Johannesburg',-26.2041,28.0473],['Nairobi',-1.2921,36.8219], + ['Kathmandu',27.7172,85.324],['Lisbon',38.7223,-9.1393],['Athens',37.9838,23.7275],['Reykjavík',64.1466,-21.9426],['Tromsø',69.6492,18.9553],['Honolulu',21.3069,-157.8583], + ['Manila',14.5995,120.9842],['Taipei',25.033,121.5654],['Rotterdam',51.9244,4.4777],['Suez',29.9668,32.5498],['Cape Canaveral',28.3922,-80.6077],['Dothan',31.2232,-85.3905], +]; +const CITY_V = CITIES.map(([n, la, lo]) => ({ name: n, lat: la, lon: lo })); + +/* ---------- people (fictional handles) ---------- */ +const PEOPLE = { + you: { h: 'you', name: 'You', hue: 205 }, + kora: { h: 'kora_maps', name: 'Kora M.', hue: 160 }, + tamang: { h: 'tamang_lens', name: 'Pemba T.', hue: 30 }, + rotor: { h: 'rotorwash_ret', name: 'J. Alder', hue: 95 }, + hydro: { h: 'hydro_nerd', name: 'Sita R.', hue: 200 }, + ais: { h: 'ais_owl', name: 'Marek', hue: 270 }, + sky: { h: 'skywatch_ana', name: 'Ana P.', hue: 330 }, + geo: { h: 'geodesy_dan', name: 'Dan K.', hue: 50 }, + crowd: { h: 'row_m_seat14', name: 'Lena', hue: 300 }, + news: { h: 'chopper_cam9', name: 'Desk 9', hue: 10 }, + ai: { h: 'claude', name: 'AI (proposal)', hue: 260, ai: true }, +}; + +Object.assign(GE, { AP, apByIata, FLIGHTS, flightAt, OPNAME, LANES, LANE_V, SHIPS, shipAt, SATS, ISS, CSS, satAt, QUAKES, BIGQ, FIRES, FIRE_CLUSTERS, CYCLONE, CITY_V, PEOPLE }); diff --git a/mobile/vision/src/js/20-gl.js b/mobile/vision/src/js/20-gl.js new file mode 100644 index 000000000..c4007b35a --- /dev/null +++ b/mobile/vision/src/js/20-gl.js @@ -0,0 +1,870 @@ +/* Hand-written WebGL2 renderer: ray-traced planet + single-scatter atmosphere, sprites, trails, + lines, meshes (city/terrain/water) and a mobile post chain (half-res dual-Kawase bloom, FXAA-lite, + ACES, grade, vignette, grain) with lens modes (cinematic / clear / night / thermal / NVG). */ +const GL = (GE.GL = {}); + +const GLSL_COMMON = ` +const float PI = 3.14159265; +float hash12(vec2 p){ vec3 p3 = fract(vec3(p.xyx)*.1031); p3 += dot(p3, p3.yzx+33.33); return fract((p3.x+p3.y)*p3.z); } +vec2 hash22(vec2 p){ vec3 p3 = fract(vec3(p.xyx)*vec3(.1031,.1030,.0973)); p3 += dot(p3,p3.yzx+33.33); return fract((p3.xx+p3.yz)*p3.zy); } +float hash13(vec3 p3){ p3 = fract(p3*.1031); p3 += dot(p3,p3.zyx+31.32); return fract((p3.x+p3.y)*p3.z); } +float vnoise(vec2 p){ vec2 i=floor(p), f=fract(p); vec2 u=f*f*(3.-2.*f); + return mix(mix(hash12(i),hash12(i+vec2(1,0)),u.x), mix(hash12(i+vec2(0,1)),hash12(i+vec2(1,1)),u.x), u.y); } +float fbm(vec2 p){ float s=0., a=.5; for(int i=0;i<4;i++){ s+=a*vnoise(p); p=p*2.03+vec2(1.7,9.2); a*=.5;} return s; } +float vnoise3(vec3 p){ vec3 i=floor(p), f=fract(p); vec3 u=f*f*(3.-2.*f); + float a=hash13(i), b=hash13(i+vec3(1,0,0)), c=hash13(i+vec3(0,1,0)), d=hash13(i+vec3(1,1,0)); + float e=hash13(i+vec3(0,0,1)), g=hash13(i+vec3(1,0,1)), h=hash13(i+vec3(0,1,1)), k=hash13(i+vec3(1,1,1)); + return mix(mix(mix(a,b,u.x),mix(c,d,u.x),u.y), mix(mix(e,g,u.x),mix(h,k,u.x),u.y), u.z); } +float fbm3(vec3 p){ float s=0., a=.5; for(int i=0;i<4;i++){ s+=a*vnoise3(p); p=p*2.02+vec3(3.1,1.7,5.3); a*=.5;} return s; } +`; + +const GLSL_ATMO = ` +const float HR = 0.0021, HM = 0.0006, RA = 1.0165; +const vec3 BR = vec3(22.1, 51.5, 126.3); +const vec3 BM = vec3(16.0); +uniform vec3 uSun; +uniform float uSunI; +vec2 raySphere(vec3 ro, vec3 rd, float r){ float b=dot(ro,rd); float c=dot(ro,ro)-r*r; float d=b*b-c; if(d<0.) return vec2(1e9,-1e9); d=sqrt(d); return vec2(-b-d,-b+d); } +// optical depth (length units) of exp(-(r-1)/H) from radius r along zenith-cosine mu to infinity +float odH(float r, float mu, float H){ + float c = sqrt(PI*0.5*r/H); float h=(r-1.)/H; + if (mu >= 0.) return H*exp(-h)*c/(c*mu+1.); + float r0 = r*sqrt(max(0.,1.-mu*mu)); + if (r0 < 1.0) return 1e4; + float h0 = (r0-1.)/H; float c0 = sqrt(PI*0.5*r0/H); + return H*(2.*exp(-h0)*c0 - exp(-h)*c/(-c*mu+1.)); +} +vec3 sunTrans(vec3 x){ float r=length(x); float mu=dot(x,uSun)/r; return exp(-(BR*odH(r,mu,HR)+BM*1.11*odH(r,mu,HM))); } +vec3 atmo(vec3 ro, vec3 rd, float tEnd, float inside, int steps, out vec3 T){ + vec2 ta = raySphere(ro, rd, RA); + float t0 = max(ta.x, 0.), t1 = min(ta.y, tEnd); + T = vec3(1.); + if (t1 <= t0) return vec3(0.); + float mu = dot(rd, uSun); + float pR = 3./(16.*PI)*(1.+mu*mu); + const float g = 0.76; + float pM = 3./(8.*PI)*((1.-g*g)*(1.+mu*mu))/((2.+g*g)*pow(max(1.+g*g-2.*g*mu,1e-4),1.5)); + vec3 sR=vec3(0.), sM=vec3(0.); float oR=0., oM=0.; float L=t1-t0; + float N = float(steps); + for (int i=0;i<24;i++){ + if (i>=steps) break; + float fa = float(i)/N, fb = float(i+1)/N; + float ta0 = mix(fa, fa*fa, inside), tb0 = mix(fb, fb*fb, inside); + float ds = (tb0-ta0)*L; float t = t0 + (ta0+tb0)*0.5*L; + vec3 x = ro + rd*t; float r = length(x); float h=r-1.; + float dR = exp(-h/HR), dM = exp(-h/HM); + oR += dR*ds; oM += dM*ds; + float muS = dot(x,uSun)/r; + vec3 tau = BR*(oR+odH(r,muS,HR)) + BM*1.11*(oM+odH(r,muS,HM)); + vec3 att = exp(-tau); + sR += dR*att*ds; sM += dM*att*ds; + } + T = exp(-(BR*oR + BM*1.11*oM)); + return uSunI*(sR*BR*pR + sM*BM*pM); +} +`; + +const SRC = {}; +SRC.fsq_vs = `#version 300 es +out vec2 vUv; out vec2 vNdc; +void main(){ vec2 p = vec2((gl_VertexID<<1)&2, gl_VertexID&2); vUv=p; vNdc=p*2.-1.; gl_Position=vec4(p*2.-1.,0.,1.); }`; + +SRC.globe_fs = `#version 300 es +precision highp float; +in vec2 vNdc; out vec4 frag; +${GLSL_COMMON} +${GLSL_ATMO} +uniform vec3 uCamR, uCamU, uCamB; uniform vec4 uTanS; uniform vec3 uEye; uniform float uEyeC; uniform float uT; uniform float uGmst; +uniform sampler2D uDay, uNight, uClouds, uWater, uTopo; +uniform vec4 uLens; // x mode, y night force, z cloud amount, w graticule +uniform vec4 uCyc; // xyz center, w radius (rad) +uniform vec4 uCycP; // x intensity, y spin, z eye radius +uniform float uAurora; +uniform mat3 uEnu; uniform vec3 uEyeLocal; uniform vec4 uCity; // x detail, y block m, z rot, w urban boost +uniform float uRange; uniform int uSteps; uniform float uInside; +uniform vec4 uFocus; // xyz focus dir, w strength (dim surroundings) +uniform vec4 uLocalWater; // xy normal, z offset (m), w enabled +uniform float uTraffic; +vec2 uvOf(vec3 n){ return vec2(atan(n.y,n.x)/(2.*PI)+0.5, 0.5-asin(clamp(n.z,-1.,1.))/PI); } +vec4 tex2(sampler2D s, vec2 uv){ + vec2 u2 = vec2(fract(uv.x+0.5)-0.5, uv.y); + vec2 dx = dFdx(uv), dy = dFdy(uv), dx2 = dFdx(u2), dy2 = dFdy(u2); + if (abs(dx2.x)+abs(dy2.x) < abs(dx.x)+abs(dy.x)) { dx = dx2; dy = dy2; } + return textureGrad(s, uv, dx, dy); +} +vec3 stars(vec3 d){ + float c = cos(uGmst), s = sin(uGmst); + d = vec3(c*d.x - s*d.y, s*d.x + c*d.y, d.z); + vec3 col = vec3(0.); + for (int L=0; L<3; L++){ + float sc = 60. + float(L)*70.; + vec3 a = abs(d); vec2 uv; float face; + if (a.x>a.y && a.x>a.z){ uv=d.yz/a.x; face=sign(d.x); } + else if (a.y>a.z){ uv=d.xz/a.y; face=2.+sign(d.y); } + else { uv=d.xy/a.z; face=4.+sign(d.z); } + vec2 g = uv*sc; vec2 id = floor(g); vec2 f = fract(g)-0.5; + vec2 rnd = hash22(id+face*17.+float(L)*31.); + float b = pow(rnd.x, 70.) * (L==0 ? 1.4 : 0.8); + vec2 off = (hash22(id*1.7+face)-0.5)*0.7; + float dd = length(f-off); + float w = fwidth(g.x)*0.9+0.02; + col += b * smoothstep(w*1.25, 0., dd) * mix(vec3(1.,.84,.7), vec3(.75,.85,1.), rnd.y) * 4.; + } + // milky way band (galactic north pole RA 192.86°, Dec 27.13°) + vec3 gnp = vec3(-0.8676, -0.1981, 0.4560); + float gb = dot(d, gnp); + float band = exp(-gb*gb*14.); + float n = fbm3(d*6.)*0.7 + fbm3(d*17.)*0.3; + col += band * smoothstep(0.35, 0.85, n) * vec3(0.10, 0.11, 0.15) * 0.9; + col += band * vec3(0.012,0.013,0.02); + return col; +} +float cycloneDensity(vec3 n){ + if (uCycP.x <= 0.) return 0.; + float cd = dot(n, uCyc.xyz); if (cd < 0.985) return 0.; + float d = acos(clamp(cd,-1.,1.)); + vec3 e1 = normalize(cross(vec3(0,0,1), uCyc.xyz)); vec3 e2 = cross(uCyc.xyz, e1); + vec3 v = n - uCyc.xyz*cd; float th = atan(dot(v,e2), dot(v,e1)); + float x = d/uCyc.w; + float sw = 2.*th + 5.2*log(max(x,0.03)) - uCycP.y; + float arms = pow(0.5 + 0.5*sin(sw), 2.4); + float tex = fbm(vec2(cos(th), sin(th))*x*9. + vec2(3.*log(x+0.05) - uCycP.y*0.2, uCycP.y*0.05)); + float dens = smoothstep(1.25, 0.28, x) * (0.12 + 0.88*arms) * (0.35 + 0.9*tex); + float cdo = smoothstep(0.26, 0.08, x) * (0.75 + 0.25*tex); + dens = max(dens, cdo); + float eye = smoothstep(uCycP.z*0.8, uCycP.z*1.6, d) * (1. + 0.25*smoothstep(uCycP.z*2.6, uCycP.z*1.6, d)); + return clamp(dens*1.15, 0., 1.) * eye * uCycP.x; +} +vec3 aurora(vec3 n, float nightF){ + if (uAurora <= 0.) return vec3(0.); + vec3 mp = vec3(0.0484, -0.1559, 0.9866); + float s = dot(n, mp); float hemi = sign(s); + float ml = asin(abs(s)) * 57.2958; + float band = 66.5 - uAurora*5.5; + float lonm = atan(dot(n, normalize(cross(mp, vec3(0,0,1)))), dot(n, normalize(cross(mp, cross(mp, vec3(0,0,1)))))); + float curt = 0.45 + 0.55*fbm(vec2(lonm*9. + uT*0.0006, uT*0.00025)); + float g = exp(-pow((ml-band)/(2.2+uAurora*0.6), 2.)) * curt; + float r = exp(-pow((ml-band-3.5)/3.5, 2.)) * 0.25; + return (vec3(0.12, 1.0, 0.5)*g + vec3(0.75, 0.15, 0.45)*r*0.45) * nightF * uAurora * 1.15; +} +vec3 cityDetail(vec3 base, vec2 q, float urban, float night, float fw, out vec3 emis){ + emis = vec3(0.); + float rot = uCity.z; mat2 m = mat2(cos(rot), -sin(rot), sin(rot), cos(rot)); + vec2 p = m*q; float B = uCity.y; + vec2 g = p/B; vec2 id = floor(g); vec2 f = fract(g); + float big = step(0.8, hash12(floor(id/5.)+3.)); + float rw = 0.085 + 0.05*step(4.5, mod(id.x,5.)) ; + vec2 e = min(f, 1.-f); + float road = 1. - smoothstep(rw*0.75, rw, min(e.x, e.y)); + float aa = clamp(fw/B*4., 0., 1.); + road = mix(road, 0.18, aa); + float h = hash12(id); + vec3 roof = mix(vec3(0.20,0.20,0.21), vec3(0.42,0.38,0.33), h); + roof = mix(roof, vec3(0.30,0.36,0.26), step(0.86, h)); // parks + float lot = vnoise(p*0.11)*0.12; + vec3 urb = mix(roof*(0.9+lot), vec3(0.075,0.078,0.085), road); + // rural: patchwork fields & forest + vec2 fid = floor(p/(B*2.6)); float fh = hash12(fid+7.); + vec3 field = base * mix(vec3(0.9,1.05,0.8), vec3(1.25,1.1,0.75), fh) * (0.85+0.3*vnoise(p*0.02)); + float forest = smoothstep(0.45,0.62, fbm(p*0.0016+3.)); + field = mix(field, base*vec3(0.55,0.75,0.5), forest); + vec3 col = mix(field, urb, urban); + // street lights at night along roads + float lamps = road * urban * (0.5+0.5*hash12(floor(p/9.))); + emis = vec3(1.0,0.58,0.24)*lamps*night*1.1*(1.-aa*0.55); + if (uTraffic > 0.5) { + vec2 rp = p/B; float along = abs(f.x-0.5) < abs(f.y-0.5) ? rp.y : rp.x; + float cars = smoothstep(0.75, 1., sin(along*38. - uT*2.5 + h*20.)) * road * urban * (1.-aa); + emis += mix(vec3(1.,0.15,0.1), vec3(1.,0.95,0.8), step(0.5, fract(along*3.)))*cars*(0.25 + night*1.4); + } + float lit = step(0.72, hash12(id*3.1)) * (1.-road) * urban * night; + emis += vec3(0.9,0.8,0.6)*lit*0.035; + return col; +} +void main(){ + vec3 rd = normalize(uCamR*(vNdc.x - uTanS.z)*uTanS.x + uCamU*(vNdc.y - uTanS.w)*uTanS.y - uCamB); + vec3 ro = uEye; + float b = dot(ro, rd); + float disc = b*b - uEyeC; + int mode = int(uLens.x+0.5); + float clear = mode==1 ? 1. : 0.; + vec3 col; float heat = 0.; + vec3 T; vec3 ins; + float nightForce = uLens.y; + if (disc > 0. && b < 0.) { + float t = uEyeC / (-b + sqrt(disc)); + vec3 p = ro + rd*t; vec3 n = normalize(p); + vec2 uv = uvOf(n); + vec3 day = pow(tex2(uDay, uv).rgb, vec3(2.2)); + vec3 nightTex = tex2(uNight, uv).rgb; + float water = tex2(uWater, uv).r; + float muS = dot(n, uSun); + // relief from topography + vec2 tx = vec2(1./2048., 1./1024.); + float h0 = texture(uTopo, uv).r; + float hx = texture(uTopo, uv+vec2(tx.x,0.)).r - texture(uTopo, uv-vec2(tx.x,0.)).r; + float hy = texture(uTopo, uv-vec2(0.,tx.y)).r - texture(uTopo, uv+vec2(0.,tx.y)).r; + vec3 east = normalize(vec3(-n.y, n.x, 0.)+1e-6); vec3 north = cross(n, east); + float bumpK = 2.2 * (1.-water); + vec3 nb = normalize(n - (east*hx + north*hy)*bumpK/ max(cos(asin(n.z)),0.2) * 0.6); + float lights = max(0., (nightTex.g*1.1 - nightTex.b*0.55)); + lights = pow(lights, 1.7) * 2.6; + float urban = smoothstep(0.03, 0.25, lights) + uCity.w; + // low-altitude synthetic ground detail + vec3 emisD = vec3(0.); + float nightF = 1. - smoothstep(-0.16, 0.06, muS); + nightF = max(nightF, nightForce); + if (uCity.x > 0.001) { + vec3 rdl = transpose(uEnu) * rd; vec2 q = (uEyeLocal + rdl * (t*6371000.)).xy; + if (uLocalWater.w > 0.) { float lw = smoothstep(uLocalWater.z-25., uLocalWater.z+25., dot(q, uLocalWater.xy)); water = max(water, lw*uCity.x); day = mix(day, vec3(0.012,0.03,0.045), lw*uCity.x); } + float fw = length(fwidth(q)); + vec3 dcol = cityDetail(day, q, clamp(urban,0.,1.)*(1.-water), nightF, fw, emisD); + float fade = uCity.x * (1.-smoothstep(150., 900., fw)) * (1.-water*0.9); + day = mix(day, dcol, fade); emisD *= fade; + } + // clouds (+ cyclone) + vec2 cuv = uv + vec2(uT*1.2e-7, 0.); + vec3 wp = n*5. + vec3(uT*2e-6); + cuv += (vec2(fbm3(wp), fbm3(wp+7.3))-0.5)*0.012; + float cl = tex2(uClouds, cuv).r; + float dK = smoothstep(1.2, 0.08, uRange); + float base0 = smoothstep(0.1, 0.9, cl); + if (dK > 0.) { + vec3 q3 = n*420. + vec3(uT*1.5e-5, 0., uT*1e-5); + float n1 = fbm3(q3), n2 = fbm3(q3*4.1 + 7.); + float cells = smoothstep(0.62 - cl*0.55, 0.92 - cl*0.35, n1*0.62 + n2*0.38 + cl*0.18); + cl = mix(base0, cells * smoothstep(0.03, 0.3, cl), dK); + } else cl = base0; + cl *= 0.94; + cl = max(cl, cycloneDensity(n)); + float cloudFade = smoothstep(0.0012, 0.006, uRange); + cl *= uLens.z * cloudFade * (1.-clear); + vec3 st = sunTrans(p*1.0005); + float shade = mix(1.0, 1.0-0.55*tex2(uClouds, cuv - vec2(uSun.y, -uSun.z)*0.0015).r*uLens.z*cloudFade, step(0.,muS)); + float diff = max(dot(nb, uSun), 0.); + vec3 skyAmb = vec3(0.022,0.036,0.07)*smoothstep(-0.25,0.5,muS); + vec3 irr = uSunI*(st*diff*shade + skyAmb); + if (clear > 0.5) irr = vec3(uSunI*0.32); + irr *= (1.-nightForce*0.97); + irr += vec3(0.05,0.07,0.13)*nightF*(1.-clear); + vec3 alb = day; + vec3 surf = alb * irr / PI; + // ocean specular + if (water > 0.01) { + vec3 v = -rd; + vec3 nw = n; + if (uRange < 0.05) { vec2 wq = uv*vec2(4000.,2000.)+uT*0.02; nw = normalize(n + (east*(vnoise(wq)-.5) + north*(vnoise(wq.yx+3.)-.5))*0.04); } + vec3 hv = normalize(v + uSun); + float nh = max(dot(nw, hv), 0.); + float rough = 0.18; + float a2 = rough*rough; float dd = nh*nh*(a2-1.)+1.; float D = a2/(PI*dd*dd); + float F = 0.02 + 0.98*pow(1.-max(dot(v,hv),0.), 5.); + vec3 spec = uSunI * st * D * F * max(dot(nw,uSun),0.) * 0.25; + float fres = 0.02 + 0.98*pow(1.-max(dot(nw,v),0.), 5.); + vec3 skyR = vec3(0.12,0.22,0.45)*uSunI*0.05*smoothstep(-0.2,0.4,muS); + surf += (spec*(1.-clear) + skyR*fres) * water * (1.-cl); + } + // night lights + moonlit black-marble land + vec3 lightCol = mix(vec3(1.0,0.66,0.32), vec3(1.0,0.86,0.64), smoothstep(0.4,1.4,lights)); + vec3 emis = lightCol * lights * 3.2 * nightF * (1. - uCity.x*0.94); + emis += pow(nightTex, vec3(2.2)) * vec3(0.5,0.6,1.0) * 0.12 * nightF; + emis += emisD; + emis *= (1.-cl*0.82); + // clouds lit + vec3 cirr = uSunI*(st*(0.25+0.75*max(dot(n,uSun)*0.9+0.1,0.)) + skyAmb*2.); + if (clear > 0.5) cirr = vec3(uSunI*0.3); + vec3 ccol = vec3(0.78) * cirr/PI + vec3(0.008,0.01,0.018)*nightF + lightCol*lights*0.25*nightF; + surf = mix(surf, ccol, cl); + surf += emis; + surf += aurora(n, nightF); + // graticule (clear lens) + if (uLens.w > 0.) { + vec2 ll = vec2(atan(n.y,n.x), asin(n.z))*57.2958/15.; + vec2 gg = abs(fract(ll+0.5)-0.5)/fwidth(ll); + float lineG = 1.-min(min(gg.x,gg.y),1.); + surf += vec3(0.35,0.5,0.7)*lineG*0.35*uLens.w; + } + // focus: gently dim surroundings of a situation + if (uFocus.w > 0.) { float fd = acos(clamp(dot(n, uFocus.xyz),-1.,1.)); surf *= mix(1., 0.55, uFocus.w*smoothstep(0.08, 0.5, fd)); } + ins = atmo(ro, rd, t, uInside, uSteps, T); + if (clear > 0.5) { ins *= 0.35; T = mix(T, vec3(1.), 0.6); } + col = surf*T + ins; + // heat: land warm by day, cities warm, ocean cool, clouds cold + heat = mix(0.32 + 0.38*diff*(1.-nightForce), 0.2 - 0.12*abs(n.z), water) + 0.25*clamp(lights,0.,1.); + heat = mix(heat, 0.06, cl); + } else { + // sky / space + ins = atmo(ro, rd, 1e9, uInside, uSteps, T); + vec3 sp = stars(rd) * (1.-clear*0.6); + float sd = dot(rd, uSun); + vec3 sun = vec3(1.,0.96,0.9) * (smoothstep(0.99996, 0.99999, sd)*400. + pow(max(sd,0.),900.)*3. + pow(max(sd,0.),40.)*0.08) * (1.-clear); + col = (sp + sun)*T + ins; + // aurora curtains at the limb + float tc = -b; vec3 cp = ro + rd*max(tc,0.); float hr = length(cp); + if (uAurora > 0. && hr > 1.004 && hr < 1.05) { + vec3 cn = normalize(cp); float nf = 1.-smoothstep(-0.2,0.0,dot(cn,uSun)); + col += aurora(cn, nf) * smoothstep(1.05,1.012,hr) * smoothstep(1.004,1.012,hr) * 0.3; + } + heat = 0.; + } + frag = vec4(col, heat); +}`; + +/* ---------- sprites ---------- */ +const SPRITE_VS_HEAD = `#version 300 es +precision highp float; +uniform mat4 uVP; uniform vec3 uEyeH, uEyeL; uniform float uEyeC; uniform float uOccR; +uniform float uPx; uniform float uT; uniform float uAltX; uniform float uSizeK; uniform float uGmst; uniform vec2 uView; +uniform float uMinSize; uniform float uAlphaK; uniform vec3 uSun; +out vec4 vCol; out float vGlyph; out float vAng; out float vSize; out float vSeed; out float vHeat; +float occluded(vec3 p){ + vec3 E = uEyeH + uEyeL; vec3 d = p - E; float L = length(d); vec3 u = d/L; + float b = dot(E,u); float c = uEyeC + 1. - uOccR*uOccR; float disc = b*b - c; + if (disc <= 0.) return 0.; + float tn = -b - sqrt(disc); + return (tn > 0. && tn < L) ? 1. : 0.; +} +vec4 project(vec3 p){ vec3 rel = (p - uEyeH) - uEyeL; vec4 c = uVP*vec4(rel,1.); if (c.z > c.w) c.z = c.w*0.99999; return c; } +float screenAngle(vec3 p, vec3 dir, vec4 c0){ + vec3 rel = (p - uEyeH) - uEyeL; float s = length(rel)*0.01 + 1e-7; + vec4 c1 = uVP*vec4(rel + dir*s, 1.); + vec2 a = c0.xy/c0.w, bb = c1.xy/c1.w; + return atan((bb.y-a.y)*uView.y, (bb.x-a.x)*uView.x); +} +vec3 headingDir(vec3 p, float hdg){ vec3 up = normalize(p); vec3 e = normalize(vec3(-up.y, up.x, 0.)+1e-7); vec3 nn = cross(up, e); return nn*cos(hdg) + e*sin(hdg); } +`; +SRC.sprite_vs = SPRITE_VS_HEAD + ` +in vec3 aPos; in vec4 aCol; in vec4 aPar; // size, glyph, heading, t0 (seconds; visible after) +in vec4 aExt; // x: tEnd, y: grow, z: seed, w: heat +void main(){ + vec3 p = aPos; + float vis = step(aPar.w, uT) * step(uT, aExt.x); + vec4 c = project(p); + float occ = occluded(p); + gl_Position = c; + float age = uT - aPar.w; + float grow = 1. + aExt.y * clamp(age/86400., 0., 2.); + float sz = max(aPar.x * uSizeK * grow, uMinSize); + gl_PointSize = vis * (1.-occ) * sz * uPx; + vCol = aCol; vCol.a *= uAlphaK; vGlyph = aPar.y; vSize = sz*uPx; vSeed = aExt.z + age*0.0; + vAng = aPar.z > -9. ? screenAngle(p, headingDir(p, aPar.z), c) : 0.; + vHeat = aExt.w; + if (aPar.y > 1.5 && aPar.y < 2.5) vSeed = age; // quake ring: pass age +}`; +SRC.flight_vs = SPRITE_VS_HEAD + ` +in vec3 aA; in vec3 aB; in vec4 aTime; in vec4 aMeta; // t0,dur,period,_ ; altKm, kind, seed, dKm +uniform float uTrail; uniform float uTrailLen; in float aK; +uniform vec4 uKindMask; uniform float uSelId; uniform vec4 uKindSize; +out float vK; +vec3 flightPos(float t, out float vis, out vec3 dir){ + float ph = mod(t - aTime.x, aTime.z); + float hf = aTime.z*0.5; float leg = step(hf, ph); float lp = ph - leg*hf; + vis = step(lp, aTime.y) * step(0., lp); + float pr = clamp(lp/aTime.y, 0., 1.); + vec3 A = mix(aA, aB, leg), B = mix(aB, aA, leg); + float om = acos(clamp(dot(A,B), -1., 1.)); float so = max(sin(om), 1e-5); + vec3 s = (sin((1.-pr)*om)*A + sin(pr*om)*B)/so; + vec3 s2 = (sin((1.-pr-0.002)*om)*A + sin((pr+0.002)*om)*B)/so; + dir = normalize(s2 - s); + float climb = clamp(min(pr,1.-pr)*aMeta.w/160., 0., 1.); + float alt = aMeta.x*sqrt(climb); + return s*(1. + alt*uAltX/6371.); +} +void main(){ + int kind = int(aMeta.y+0.5); + float km = kind==0?uKindMask.x: kind==1?uKindMask.y: kind==2?uKindMask.z: uKindMask.w; + float vis; vec3 dir; + float t = uT - aK*uTrailLen; + vec3 p = flightPos(t, vis, dir); + vec4 c = project(p); + float occ = occluded(p); + gl_Position = c; + float sel = float(abs(float(gl_InstanceID) - uSelId) < 0.5); + float ks = kind==0?uKindSize.x: kind==1?uKindSize.y: kind==2?uKindSize.z: uKindSize.w; + float sz = max(ks*uSizeK*(1.+sel*0.8), uMinSize); + gl_PointSize = vis*(1.-occ)*km*sz*uPx; + vec3 colK = kind==0 ? vec3(0.42,0.74,1.0) : kind==1 ? vec3(1.0,0.56,0.3) : kind==2 ? vec3(0.55,1.0,0.5) : vec3(0.78,0.85,1.0); + colK = mix(colK, vec3(1.0,0.86,0.45), sel); + vCol = vec4(colK, vis*(1.-occ)*km*uAlphaK*(uTrail>0.5 ? pow(1.-aK,1.6)*(0.55+sel*0.45) : 1.)); + vK = aK; + vGlyph = 1.; vSize = sz*uPx; vSeed = aMeta.z; vHeat = 0.55; + vAng = screenAngle(p, dir, c); +}`; +SRC.sat_vs = SPRITE_VS_HEAD + ` +in vec4 aEl; in vec4 aSM; // inc, raan, u0, n ; altKm, kind, geo, seed +uniform vec4 uSatMask0; uniform vec4 uSatMask1; uniform float uSelId; +void main(){ + float u = aEl.z + aEl.w*uT; float r = 1. + aSM.x/6371.; + float cu=cos(u), su=sin(u), cO=cos(aEl.y), sO=sin(aEl.y), ci=cos(aEl.x), si=sin(aEl.x); + vec3 x = vec3(cu*cO - su*ci*sO, cu*sO + su*ci*cO, su*si); + vec3 p; + if (aSM.z > 0.5) p = vec3(cos(aEl.z), sin(aEl.z), 0.)*r; + else { float cg=cos(-uGmst), sg=sin(-uGmst); p = r*vec3(x.x*cg - x.y*sg, x.x*sg + x.y*cg, x.z); } + int k = int(aSM.y+0.5); + float m = k==0?uSatMask0.x: k==1?uSatMask0.y: k==2?uSatMask0.z: k==3?uSatMask0.w: k==4?uSatMask1.x: k==5?uSatMask1.y: uSatMask1.z; + vec4 c = project(p); float occ = occluded(p); + gl_Position = c; + float sel = float(abs(float(gl_VertexID) - uSelId) < 0.5); + float base = k==6 ? 15. : k==5 ? 4.0 : k==3 ? 2.6 : k==4 ? 1.4 : 1.6; + // sunlit satellites glint; in earth shadow they dim + vec3 sd = uSun; float bb = dot(p, sd); float rho2 = dot(p,p) - bb*bb; float lit = (bb < 0. && rho2 < 1.) ? 0.25 : 1.; + float sz = max(base*uSizeK*(1.+sel), uMinSize); + gl_PointSize = (1.-occ)*m*sz*uPx; + vec3 col = k==6 ? vec3(1.0,0.9,0.7) : k==5 ? vec3(0.95,0.9,1.0) : k==4 ? vec3(0.7,0.62,0.7) : k==3 ? vec3(0.85,0.7,1.0) : k==2 ? vec3(0.7,0.85,1.0) : vec3(0.79,0.66,1.0); + vCol = vec4(col*lit, m*(1.-occ)*uAlphaK*(k==6||k==5 ? 1. : k==3 ? 0.7 : 0.42)); + vGlyph = k==6 ? 7. : 0.; vSize = sz*uPx; vSeed = aSM.w; vHeat = 0.2; vAng = 0.; +}`; +SRC.sun_uniform = `uniform vec3 uSun;`; + +SRC.sprite_fs = `#version 300 es +precision highp float; +in vec4 vCol; in float vGlyph; in float vAng; in float vSize; in float vSeed; in float vHeat; +uniform float uT; uniform float uPass; uniform float uWall; uniform float uGlyphPx; +out vec4 frag; +${GLSL_COMMON} +float sdSeg(vec2 p, vec2 a, vec2 b){ vec2 pa=p-a, ba=b-a; float h=clamp(dot(pa,ba)/dot(ba,ba),0.,1.); return length(pa-ba*h); } +void main(){ + vec2 q = gl_PointCoord*2.-1.; q.y = -q.y; + float r = length(q); + int g = int(vGlyph+0.5); + float px = 2.5/max(vSize,1.); + float a = 0.; vec3 col = vCol.rgb; float glow = 0.; + if (vSize < uGlyphPx && g != 2 && g != 11 && g != 10 && g != 9 && g != 6 && g != 14 && g != 12) g = 0; + float ca = cos(vAng - 1.5708), sa = sin(vAng - 1.5708); + vec2 rq = vec2(ca*q.x + sa*q.y, -sa*q.x + ca*q.y); + if (g == 0) { a = exp(-r*r*7.)*1.0 + exp(-r*r*2.2)*0.18; } + else if (g == 1) { // aircraft + vec2 p = rq*1.15; + float fus = sdSeg(p, vec2(0.,-0.72), vec2(0.,0.78)) - 0.085; + float wing = max(abs(p.y + 0.02 + abs(p.x)*0.42) - 0.075, abs(p.x) - 0.86); + float tail = max(abs(p.y + 0.66 + abs(p.x)*0.3) - 0.05, abs(p.x) - 0.34); + float d = min(fus, min(wing, tail)); + a = (smoothstep(px, -px, d) + exp(-r*r*3.)*0.22)*0.85; + } + else if (g == 2) { // quake ring: vSeed = age (s) + float age = vSeed; float ph = fract(uT/2.4); + float rr = 0.25 + 0.7*ph; + float pulse = exp(-pow((r-rr)/0.05,2.)) * (1.-ph) * step(age, 86400.*1.5); + float base = exp(-pow((r-0.55)/0.035,2.))*0.55 + exp(-r*r*40.)*1.2; + a = (pulse + base) * smoothstep(1.,0.9,r); + } + else if (g == 3) { // fire + float fl = 0.7 + 0.3*sin(uT*7. + vSeed*30.) * sin(uT*3.1 + vSeed*11.); + a = (exp(-r*r*9.)*1.3 + exp(-r*r*2.5)*0.35) * fl; + col = mix(vec3(1.0,0.35,0.08), vec3(1.0,0.85,0.45), exp(-r*r*14.)); + } + else if (g == 4) { // ship hull + vec2 p = rq*1.2; + float d = max(abs(p.x) - 0.26 + max(p.y-0.35,0.)*0.55, abs(p.y) - 0.8); + a = smoothstep(px, -px, d) + exp(-r*r*4.)*0.15; + } + else if (g == 5) { // camera eye + float ring = abs(r - 0.62) - 0.1; + float lid = abs(length(q*vec2(1.,1.9)) - 0.86) - 0.07; + float d = min(ring, r - 0.26); + a = smoothstep(px, -px, min(d, lid)) * 0.95 + exp(-r*r*3.)*0.18; + } + else if (g == 6) { // signed capture / hologram seal + float dia = abs(q.x)+abs(q.y); + float d = min(abs(dia - 0.62) - 0.09, dia - 0.22); + float beam = exp(-q.x*q.x*80.) * smoothstep(-1., 0., -q.y) * 0.0; + a = smoothstep(px, -px, d) + exp(-r*r*3.)*0.35 + beam; + } + else if (g == 7) { // satellite / station + vec2 p = q*1.25; + float body = max(abs(p.x)-0.16, abs(p.y)-0.16); + float panel = max(abs(abs(p.x)-0.58)-0.3, abs(p.y)-0.13); + float truss = max(abs(p.x)-0.9, abs(p.y)-0.03); + a = smoothstep(px, -px, min(min(body,panel),truss)) + exp(-r*r*3.)*0.35; + } + else if (g == 8) { // helicopter + vec2 p = rq*1.2; + float rotor = abs(r*1.2 - 0.82) - 0.03; + float spin = abs(sin(atan(q.y,q.x)*2. + uT*40.)); + float blades = (r < 0.95) ? smoothstep(0.9, 1., spin) * 0.55 : 0.; + float body = length(p*vec2(1.7,1.)) - 0.32; + float boom = sdSeg(p, vec2(0.,-0.1), vec2(0.,-0.82)) - 0.05; + a = max(smoothstep(px, -px, min(body, boom)), blades) + smoothstep(px,-px,rotor)*0.35 + exp(-r*r*3.)*0.18; + } + else if (g == 9) { // situation pin + float ph = fract(uT*0.5 + vSeed); + a = smoothstep(px,-px, abs(r-0.42)-0.07) + exp(-r*r*30.)*1.4 + exp(-pow((r-0.4-ph*0.55)/0.06,2.))*(1.-ph)*0.8; + } + else if (g == 10) { // hex + vec2 p = abs(q); float d = max(p.x*0.866 + p.y*0.5, p.y) - 0.86; + a = smoothstep(px*2., -px*2., d) * 0.5 + smoothstep(px,-px, abs(d+0.02)-0.03)*0.6; + } + else if (g == 11) { // soft blob (smoke / air quality / radar) + float n = vnoise(q*2.5 + vSeed*13. + uT*0.02); + a = exp(-r*r*2.6) * (0.55+0.45*n); + } + else if (g == 12) { // lightning + float fl = step(0.93, fract(sin(floor(uT*3.+vSeed*40.)*91.7)*437.1)); + a = (exp(-r*r*18.)*2. + exp(-min(abs(q.x),abs(q.y))*30.)*exp(-r*2.)*0.8) * fl; + } + else if (g == 13) { // infra square + vec2 p = abs(q); float d = max(p.x,p.y) - 0.55; + a = smoothstep(px,-px, abs(d)-0.09) + smoothstep(px,-px,max(p.x,p.y)-0.18) + exp(-r*r*3.)*0.15; + } + else if (g == 14) { // volcano triangle + vec2 p = q; p.y += 0.2; + float d = max(abs(p.x)*0.866 + p.y*0.5, -p.y) - 0.45; + a = smoothstep(px,-px, abs(d)-0.08) + exp(-r*r*3.)*0.2; + } + else if (g == 15) { // wind streak (oriented) + a = exp(-(rq.x*rq.x*60. + rq.y*rq.y*1.6)) * smoothstep(1.,0.4,abs(rq.y)); + } + else if (g == 16) { // runner / small dot with ring + a = smoothstep(px,-px, r-0.42) + smoothstep(px,-px, abs(r-0.7)-0.06)*0.5; + } + else if (g == 17) { // drone (quad) + vec2 p = abs(rq); + float arms = sdSeg(p, vec2(0.), vec2(0.5,0.5)) - 0.06; + float rot = abs(length(p - vec2(0.55)) - 0.22) - 0.05; + a = smoothstep(px,-px, min(arms, rot)) + exp(-r*r*4.)*0.2; + } + if (r > 1.) a = 0.; + a *= vCol.a; + if (a < 0.003) discard; + if (uPass > 0.5) frag = vec4(col, a*0.85); // alpha-blended pass + else frag = vec4(col*a, vHeat*a); // additive pass +}`; + +/* ---------- lines (world space, polyline strips) ---------- */ +SRC.line_vs = `#version 300 es +precision highp float; +in vec3 aPos; in vec4 aCol; in vec2 aD; // dist along (units), dashed flag +uniform mat4 uVP; uniform vec3 uEyeH, uEyeL; uniform float uEyeC; uniform float uOccR; uniform float uAlphaK; +out vec4 vCol; out vec2 vD; +void main(){ + vec3 E = uEyeH + uEyeL; vec3 d = aPos - E; float L = length(d); vec3 u = d/L; + float b = dot(E,u); float c = uEyeC + 1. - uOccR*uOccR; float disc = b*b - c; float occ = 0.; + if (disc > 0.) { float tn = -b - sqrt(disc); occ = (tn > 0. && tn < L) ? 1. : 0.; } + vec4 cp = uVP*vec4((aPos-uEyeH)-uEyeL, 1.); + if (cp.z > cp.w) cp.z = cp.w*0.99999; + gl_Position = cp; + vCol = aCol; vCol.a *= (1.-occ*0.92)*uAlphaK; vD = aD; +}`; +SRC.line_fs = `#version 300 es +precision highp float; +in vec4 vCol; in vec2 vD; uniform float uDashK; uniform float uT; out vec4 frag; +void main(){ + float a = vCol.a; + if (vD.y > 0.5 && fract(vD.x*uDashK - uT*0.0) > 0.55) discard; + if (vD.y > 1.5) a *= 0.5 + 0.5*sin(vD.x*uDashK*6.2832 - uT*3.); + frag = vec4(vCol.rgb*a, a*0.3); +}`; + +/* ---------- meshes (local ENU meters, camera-relative matrix) ---------- */ +SRC.mesh_vs = `#version 300 es +precision highp float; +in vec3 aPos; in vec3 aNor; in vec2 aUV; in vec4 aAttr; // type, hash, height, misc +uniform mat4 uMVP; uniform float uT; uniform vec4 uFlood; // x: tHours, y: start h, z: speed m/h, w: crest m +out vec3 vPos; out vec3 vNor; out vec2 vUV; out vec4 vAttr; +void main(){ + vec3 p = aPos; + if (aAttr.x > 1.5 && aAttr.x < 2.5) { // flood water: rise with crest arrival + float s = aUV.x; float arr = uFlood.y + s/uFlood.z; + float dt = uFlood.x - arr; + float crest = uFlood.w * (dt > 0. ? exp(-dt/5.) * smoothstep(0., 0.4, dt) : exp(-dt*dt*6.)) ; + p.z += crest * 0.5; + } + vPos = p; vNor = aNor; vUV = aUV; vAttr = aAttr; + gl_Position = uMVP*vec4(p, 1.); +}`; +SRC.mesh_fs = `#version 300 es +precision highp float; +in vec3 vPos; in vec3 vNor; in vec2 vUV; in vec4 vAttr; +uniform vec3 uSunL; uniform vec3 uSunCol; uniform vec3 uSkyCol; uniform vec3 uFogCol; uniform vec3 uEyeL; +uniform float uNight; uniform float uT; uniform float uVis; uniform vec4 uFlood; uniform float uClear; +out vec4 frag; +${GLSL_COMMON} +void main(){ + int type = int(vAttr.x+0.5); + vec3 n = normalize(vNor); + vec3 v = normalize(uEyeL - vPos); + float diff = max(dot(n, uSunL), 0.); + vec3 base; vec3 emis = vec3(0.); float heat = 0.35; float spec = 0.; + if (type == 0) { // building + float h = vAttr.y; + base = mix(vec3(0.34,0.35,0.37), vec3(0.62,0.57,0.5), h); + base = mix(base, vec3(0.2,0.25,0.3), step(0.7, h)); // glass towers + if (abs(n.z) < 0.5) { + vec2 f = vec2(vUV.x/3.2, vUV.y/3.6); + vec2 id = floor(f); vec2 fr = fract(f); + float win = step(0.18, fr.x)*step(fr.x,0.82)*step(0.22,fr.y)*step(fr.y,0.78); + float r = hash12(id + h*91.); + float lit = step(1. - (0.12 + 0.5*uNight), r) * win * step(vUV.y, vAttr.z - 1.); + vec3 wc = mix(vec3(1.0,0.72,0.42), vec3(0.75,0.85,1.0), step(0.6, hash12(id*1.3+h))); + emis += wc * lit * (0.9 + 0.6*r) * uNight * 2.2; + base = mix(base, base*0.45 + uSkyCol*0.08, win*0.8); + spec = win*(1.-uNight)*0.6; + } else base *= 0.82; + float ao = smoothstep(0., 14., vUV.y + (1.-abs(n.z))*0.) * 0.35 + 0.65; + if (abs(n.z) < 0.5) base *= ao; + heat = 0.4 + 0.3*uNight; + } else if (type == 1) { // terrain + float hgt = vAttr.z; float slope = 1.-n.z; + vec3 forest = vec3(0.035,0.075,0.025), meadow = vec3(0.15,0.17,0.07), rock = vec3(0.22,0.2,0.18), snow = vec3(0.85,0.88,0.93); + float nz = vnoise(vPos.xy*0.004)*0.5 + vnoise(vPos.xy*0.02)*0.25 + vnoise(vPos.xy*0.09)*0.12; + base = mix(forest, meadow, smoothstep(3000., 3700., hgt + nz*500.)); + base = mix(base, forest*0.8, smoothstep(0.2, 0.45, slope) * (1. - smoothstep(3200., 3800., hgt))); + base = mix(base, rock, clamp(smoothstep(0.55, 0.85, slope + nz*0.25) + smoothstep(3900., 4500., hgt + nz*400.), 0., 1.)); + base = mix(base, snow, smoothstep(4700., 5100., hgt + nz*700. - slope*500.)); + // flood scar (mud) along the channel once the crest has passed + float scar = vAttr.w; // 0..1 near channel + float s = vUV.x; float arr = uFlood.y + s/uFlood.z; + float passed = smoothstep(0., 0.6, uFlood.x - arr); + base = mix(base, vec3(0.16,0.14,0.11), scar*passed*0.8); + heat = 0.3 + 0.2*diff; + } else if (type == 2) { // water (river / flood) + float s = vUV.x; float across = abs(vUV.y); + float arr = uFlood.y + s/uFlood.z; float dt = uFlood.x - arr; + float w = 0.18 + 0.82*(dt > 0. ? exp(-dt/6.)*smoothstep(0., 0.3, dt) : exp(-dt*dt*5.)); + if (across > w) discard; + float flow = vnoise(vec2(s*0.02 - uT*0.9, vUV.y*6.)); + base = mix(vec3(0.25,0.22,0.17), vec3(0.45,0.38,0.28), flow) * mix(1., 1.25, step(0.08, w-0.18)); + spec = 0.8; heat = 0.12; + emis += vec3(0.9,0.8,0.6)*smoothstep(0.85,1.,flow)*0.06*(1.-uNight); + } else if (type == 3) { // stadium seats + crowd + base = vec3(0.16,0.17,0.2); + float crowd = step(0.45, hash12(floor(vUV*vec2(1.6,1.2)))); + float flash = step(0.985, hash12(floor(vUV*vec2(1.6,1.2)) + floor(uT*2.))); + emis += mix(vec3(0.5,0.6,1.0), vec3(1.0,0.95,0.9), flash) * crowd * (0.05 + flash*4.) * uNight; + heat = 0.7; + } else if (type == 4) { // flat pads, runways, pitch + float h = vAttr.y; + base = h > 0.5 ? vec3(0.06,0.2,0.05)*(0.85+0.15*step(0.5,fract(vUV.x/10.))) : vec3(0.12,0.12,0.13); + if (h < 0.5) base += vec3(0.7)*step(0.97, fract(vUV.x/30.))*step(abs(vUV.y - vAttr.w*0.5), 0.6); + float edge = step(vUV.y, 1.6) + step(vAttr.w - 1.6, vUV.y); + float dots = step(0.93, fract(vUV.x/40.)); + emis += (h > 0.5 ? vec3(0.05,0.2,0.04)*0.8 : vec3(1.0,0.85,0.55)*dots*edge*2.5 + vec3(0.25,0.45,1.0)*step(0.96, fract((vUV.x+vUV.y)/23.))*0.6) * uNight; + heat = 0.45; + } else if (type == 5) { // stage / light rig / beacon + base = vec3(0.05); + emis = mix(vec3(0.9,0.3,1.0), vec3(0.3,0.8,1.0), 0.5+0.5*sin(uT*1.7+vPos.x*0.05)) * 3.0; + heat = 0.9; + } else { // houses + base = mix(vec3(0.55,0.45,0.38), vec3(0.75,0.72,0.66), vAttr.y); + if (n.z > 0.5) base = mix(vec3(0.45,0.2,0.15), vec3(0.3,0.35,0.42), step(0.5, vAttr.y)); + emis += vec3(1.0,0.7,0.4)*step(0.6, vAttr.y)*uNight*0.5*step(n.z,0.5); + } + vec3 amb = uSkyCol * (0.55 + 0.45*n.z); + vec3 col = base * (uSunCol*diff + amb); + if (spec > 0.) { vec3 hv = normalize(v + uSunL); col += uSunCol * pow(max(dot(n,hv),0.), 60.) * spec * 0.6; col += uSkyCol*spec*0.25*pow(1.-max(dot(n,v),0.),3.); } + col += emis; + float dist = length(uEyeL - vPos); + float fog = 1. - exp(-dist / uVis); + col = mix(col, uFogCol, clamp(fog, 0., 0.8)); + frag = vec4(col, heat); +}`; + +/* ---------- post ---------- */ +SRC.bright_fs = `#version 300 es +precision highp float; in vec2 vUv; uniform sampler2D uSrc; uniform vec2 uTexel; uniform float uThr; out vec4 frag; +void main(){ + vec3 c = vec3(0.); + c += texture(uSrc, vUv + uTexel*vec2(-1.,-1.)).rgb; c += texture(uSrc, vUv + uTexel*vec2(1.,-1.)).rgb; + c += texture(uSrc, vUv + uTexel*vec2(-1.,1.)).rgb; c += texture(uSrc, vUv + uTexel*vec2(1.,1.)).rgb; + c *= 0.25; + float l = max(c.r, max(c.g, c.b)); + float k = clamp(l - uThr*0.6, 0., uThr*0.8); k = k*k/(4.*uThr*0.8+1e-4); + float w = max(k, l - uThr) / max(l, 1e-4); + frag = vec4(min(c*w, vec3(60.)), 1.); +}`; +SRC.down_fs = `#version 300 es +precision highp float; in vec2 vUv; uniform sampler2D uSrc; uniform vec2 uTexel; out vec4 frag; +void main(){ + vec3 s = texture(uSrc, vUv).rgb*4.; + s += texture(uSrc, vUv + uTexel*vec2(-1.,-1.)).rgb; s += texture(uSrc, vUv + uTexel*vec2(1.,-1.)).rgb; + s += texture(uSrc, vUv + uTexel*vec2(-1.,1.)).rgb; s += texture(uSrc, vUv + uTexel*vec2(1.,1.)).rgb; + frag = vec4(s/8., 1.); +}`; +SRC.up_fs = `#version 300 es +precision highp float; in vec2 vUv; uniform sampler2D uSrc; uniform sampler2D uBase; uniform vec2 uTexel; uniform float uMix; out vec4 frag; +void main(){ + vec3 s = vec3(0.); vec2 o = uTexel; + s += texture(uSrc, vUv + vec2(-o.x*2.,0.)).rgb; s += texture(uSrc, vUv + vec2(-o.x,o.y)).rgb*2.; + s += texture(uSrc, vUv + vec2(0.,o.y*2.)).rgb; s += texture(uSrc, vUv + vec2(o.x,o.y)).rgb*2.; + s += texture(uSrc, vUv + vec2(o.x*2.,0.)).rgb; s += texture(uSrc, vUv + vec2(o.x,-o.y)).rgb*2.; + s += texture(uSrc, vUv + vec2(0.,-o.y*2.)).rgb; s += texture(uSrc, vUv + vec2(-o.x,-o.y)).rgb*2.; + frag = vec4(s/12. + texture(uBase, vUv).rgb*uMix, 1.); +}`; +SRC.comp_fs = `#version 300 es +precision highp float; in vec2 vUv; out vec4 frag; +uniform sampler2D uScene, uBloom; uniform vec2 uTexel; uniform float uExposure, uBloomK, uVig, uGrain, uT, uFade, uFxaa, uSat; +uniform int uMode; uniform vec3 uLift; uniform vec3 uGain; +${GLSL_COMMON} +vec3 aces(vec3 x){ return clamp((x*(2.51*x+0.03))/(x*(2.43*x+0.59)+0.14),0.,1.); } +float luma(vec3 c){ return dot(c, vec3(0.299,0.587,0.114)); } +vec3 ironbow(float t){ + t = clamp(t,0.,1.); + vec3 a = vec3(0.0,0.0,0.05), b = vec3(0.32,0.0,0.55), c = vec3(0.86,0.12,0.25), d = vec3(1.0,0.6,0.0), e = vec3(1.0,1.0,0.85); + if (t < 0.25) return mix(a,b,t/0.25); if (t < 0.5) return mix(b,c,(t-0.25)/0.25); if (t < 0.78) return mix(c,d,(t-0.5)/0.28); return mix(d,e,(t-0.78)/0.22); +} +vec4 sampleScene(vec2 uv){ + vec4 c = texture(uScene, uv); + if (uFxaa > 0.5) { + float lN = luma(texture(uScene, uv + vec2(0., uTexel.y)).rgb), lS = luma(texture(uScene, uv - vec2(0., uTexel.y)).rgb); + float lE = luma(texture(uScene, uv + vec2(uTexel.x, 0.)).rgb), lW = luma(texture(uScene, uv - vec2(uTexel.x, 0.)).rgb); + float lM = luma(c.rgb); + float mn = min(lM, min(min(lN,lS), min(lE,lW))), mx = max(lM, max(max(lN,lS), max(lE,lW))); + if (mx - mn > max(0.06, mx*0.15)) { + vec2 dir = vec2(-((lN)-(lS)), (lE)-(lW)); + float rcp = 1./(min(abs(dir.x),abs(dir.y)) + 1e-3*(lN+lS+lE+lW) + 1e-4); + dir = clamp(dir*rcp, -4., 4.) * uTexel; + vec4 a = 0.5*(texture(uScene, uv + dir*(1./3.-0.5)) + texture(uScene, uv + dir*(2./3.-0.5))); + c = vec4(a.rgb, c.a); + } + } + return c; +} +void main(){ + vec4 s = sampleScene(vUv); + vec3 b = texture(uBloom, vUv).rgb; + vec3 c = (s.rgb + b*uBloomK) * uExposure; + float heat = s.a; + vec2 cc = vUv - 0.5; + float vig = 1. - dot(cc, cc) * uVig; + if (uMode == 3) { // thermal + float hv = heat*0.85 + luma(c)*0.12 + luma(b)*0.05; + c = ironbow(hv) * 0.95; + } else if (uMode == 4) { // NVG + float l = luma(aces(c*2.2)); + l = pow(l, 0.8) + (hash12(vUv*vec2(1311.,977.) + fract(uT)*91.)-0.5)*0.12; + l *= 0.92 + 0.08*sin(vUv.y*900.); + c = vec3(0.25, 1.0, 0.35) * l * 1.1 + vec3(0.0,0.02,0.0); + float circ = smoothstep(0.62, 0.48, length(cc*vec2(1.,1.))); + c *= mix(0.15, 1., circ); + } else { + c = aces(c); + float l = luma(c); + c = mix(vec3(l), c, uSat); + c = c*uGain + uLift*(1.-c); + if (uMode == 2) c = mix(c, c*vec3(0.75,0.85,1.15), 0.5); + } + c *= vig; + c = pow(max(c, 0.), vec3(1./2.2)); + c += (hash12(vUv*vec2(1717.,1313.) + fract(uT*0.37)*77.) - 0.5) * uGrain; + c += (hash12(vUv*vec2(911.,733.)) - 0.5)/255.; + frag = vec4(c * uFade, 1.); +}`; +SRC.trail_fs = `#version 300 es +precision highp float; in vec4 vCol; in float vK; out vec4 frag; +void main(){ float a = vCol.a; if (a < 0.002) discard; frag = vec4(vCol.rgb*a, a*0.3); }`; +SRC.copy_fs = `#version 300 es +precision highp float; in vec2 vUv; uniform sampler2D uSrc; out vec4 frag; void main(){ frag = texture(uSrc, vUv); }`; + +/* ---------- GL helpers ---------- */ +GL.init = function (canvas) { + const gl = canvas.getContext('webgl2', { antialias: false, alpha: false, depth: false, stencil: false, premultipliedAlpha: false, preserveDrawingBuffer: false, powerPreference: 'high-performance', desynchronized: false }); + if (!gl) return null; + GL.gl = gl; + GL.hdr = !!gl.getExtension('EXT_color_buffer_float') || !!gl.getExtension('EXT_color_buffer_half_float'); + GL.aniso = gl.getExtension('EXT_texture_filter_anisotropic'); + gl.getExtension('OES_texture_float_linear'); + GL.vao0 = gl.createVertexArray(); + GL.progs = {}; + const P = (name, vs, fs) => (GL.progs[name] = GL.program(vs, fs, name)); + P('globe', SRC.fsq_vs, SRC.globe_fs); + P('sprite', SRC.sprite_vs, SRC.sprite_fs); + P('flight', SRC.flight_vs, SRC.sprite_fs); + P('sat', SRC.sat_vs, SRC.sprite_fs); + P('trail', SRC.flight_vs, SRC.trail_fs); + P('line', SRC.line_vs, SRC.line_fs); + P('mesh', SRC.mesh_vs, SRC.mesh_fs); + P('bright', SRC.fsq_vs, SRC.bright_fs); + P('down', SRC.fsq_vs, SRC.down_fs); + P('up', SRC.fsq_vs, SRC.up_fs); + P('comp', SRC.fsq_vs, SRC.comp_fs); + P('copy', SRC.fsq_vs, SRC.copy_fs); + return gl; +}; +GL.program = function (vsSrc, fsSrc, name) { + const gl = GL.gl; + const mk = (type, src) => { + const s = gl.createShader(type); gl.shaderSource(s, src); gl.compileShader(s); + if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) { + const log = gl.getShaderInfoLog(s); + const lines = src.split('\n').map((l, i) => i + 1 + ': ' + l); + const m = /0:(\d+)/.exec(log || ''); const ln = m ? +m[1] : 0; + console.error(`[${name}] shader error`, log, '\n', lines.slice(Math.max(0, ln - 4), ln + 2).join('\n')); + throw new Error('shader compile failed: ' + name); + } + return s; + }; + const p = gl.createProgram(); + gl.attachShader(p, mk(gl.VERTEX_SHADER, vsSrc)); gl.attachShader(p, mk(gl.FRAGMENT_SHADER, fsSrc)); + gl.linkProgram(p); + if (!gl.getProgramParameter(p, gl.LINK_STATUS)) { console.error(`[${name}] link`, gl.getProgramInfoLog(p)); throw new Error('link failed ' + name); } + const u = {}, n = gl.getProgramParameter(p, gl.ACTIVE_UNIFORMS); + for (let i = 0; i < n; i++) { const inf = gl.getActiveUniform(p, i); u[inf.name.replace(/\[0\]$/, '')] = gl.getUniformLocation(p, inf.name); } + const a = {}, na = gl.getProgramParameter(p, gl.ACTIVE_ATTRIBUTES); + for (let i = 0; i < na; i++) { const inf = gl.getActiveAttrib(p, i); a[inf.name] = gl.getAttribLocation(p, inf.name); } + return { p, u, a, name }; +}; +GL.texture = function (img, { mips = true, wrap = 'repeat', aniso = 8 } = {}) { + const gl = GL.gl, t = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, t); + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap === 'repeat' ? gl.REPEAT : gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, mips ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + if (mips) gl.generateMipmap(gl.TEXTURE_2D); + if (GL.aniso && aniso) gl.texParameterf(gl.TEXTURE_2D, GL.aniso.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(aniso, gl.getParameter(GL.aniso.MAX_TEXTURE_MAX_ANISOTROPY_EXT))); + return t; +}; +GL.target = function (w, h, { hdr = true, depth = false, linear = true } = {}) { + const gl = GL.gl; + w = Math.max(1, w | 0); h = Math.max(1, h | 0); + const tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + const useHdr = hdr && GL.hdr; + gl.texImage2D(gl.TEXTURE_2D, 0, useHdr ? gl.RGBA16F : gl.RGBA8, w, h, 0, gl.RGBA, useHdr ? gl.HALF_FLOAT : gl.UNSIGNED_BYTE, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, linear ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, linear ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + const fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + let rb = null; + if (depth) { + rb = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT24, w, h); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rb); + } + const ok = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE; + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + if (!ok && useHdr) { GL.hdr = false; return GL.target(w, h, { hdr: false, depth, linear }); } + return { tex, fb, rb, w, h, dispose() { gl.deleteTexture(tex); gl.deleteFramebuffer(fb); if (rb) gl.deleteRenderbuffer(rb); } }; +}; +// chain of render targets for a given output size +GL.chain = function (w, h) { + const s = GL.target(w, h, { depth: true }); + const lv = []; + let cw = Math.max(1, (w / 2) | 0), ch = Math.max(1, (h / 2) | 0); + for (let i = 0; i < 4; i++) { lv.push({ a: GL.target(cw, ch), b: null }); cw = Math.max(1, (cw / 2) | 0); ch = Math.max(1, (ch / 2) | 0); } + for (let i = 0; i < 3; i++) lv[i].b = GL.target(lv[i].a.w, lv[i].a.h); + return { w, h, scene: s, lv, dispose() { s.dispose(); lv.forEach((l) => { l.a.dispose(); l.b && l.b.dispose(); }); } }; +}; +GL.fsq = function (prog) { const gl = GL.gl; gl.useProgram(prog.p); gl.bindVertexArray(GL.vao0); gl.drawArrays(gl.TRIANGLES, 0, 3); }; +GL.bindTex = function (prog, name, tex, unit) { const gl = GL.gl; gl.activeTexture(gl.TEXTURE0 + unit); gl.bindTexture(gl.TEXTURE_2D, tex); gl.uniform1i(prog.u[name], unit); }; +GL.buffer = function (data, usage) { const gl = GL.gl, b = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, b); gl.bufferData(gl.ARRAY_BUFFER, data, usage || gl.STATIC_DRAW); return b; }; +// build a VAO from {name: [buffer, size, stride, offset, divisor]} +GL.vao = function (prog, spec, index) { + const gl = GL.gl, vao = gl.createVertexArray(); + gl.bindVertexArray(vao); + for (const k in spec) { + const loc = prog.a[k]; if (loc == null || loc < 0) continue; + const [buf, size, stride, off, div] = spec[k]; + gl.bindBuffer(gl.ARRAY_BUFFER, buf); gl.enableVertexAttribArray(loc); + gl.vertexAttribPointer(loc, size, gl.FLOAT, false, stride * 4, off * 4); + gl.vertexAttribDivisor(loc, div || 0); + } + if (index) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index); + gl.bindVertexArray(null); + return vao; +}; diff --git a/mobile/vision/src/js/30-world.js b/mobile/vision/src/js/30-world.js new file mode 100644 index 000000000..786b8b450 --- /dev/null +++ b/mobile/vision/src/js/30-world.js @@ -0,0 +1,578 @@ +/* World: time, sun, 44-layer catalog, GPU buffers, per-frame update, render, projection, picking. */ +const W = (GE.world = {}); +const FAM = { + sky: { name: 'Sky', color: '#7CC4FF', icon: 'airplane' }, + sea: { name: 'Sea', color: '#38E1C6', icon: 'ferry' }, + orbit: { name: 'Orbit', color: '#C9A7FF', icon: 'satellite' }, + haz: { name: 'Hazards', color: '#FF6A3D', icon: 'flame' }, + eyes: { name: 'Eyes', color: '#FFD166', icon: 'eye' }, + ground: { name: 'Ground', color: '#9BE15D', icon: 'tram' }, + wx: { name: 'Weather', color: '#8AB4F8', icon: 'cloud' }, + infra: { name: 'Infra', color: '#B8C0CC', icon: 'bolt' }, +}; +GE.FAM = FAM; +const hex2rgb = (h) => [parseInt(h.slice(1, 3), 16) / 255, parseInt(h.slice(3, 5), 16) / 255, parseInt(h.slice(5, 7), 16) / 255]; + +/* ---------- layer catalog (44) ---------- */ +const L = (id, fam, name, on, icon) => ({ id, fam, name, on, icon, count: 0, status: 'live' }); +W.layers = [ + L('flights', 'sky', 'Commercial flights', true, 'airplane'), L('military', 'sky', 'Military aircraft', true, 'jet'), L('helis', 'sky', 'Helicopters', true, 'helicopter'), + L('ga', 'sky', 'Private / GA', false, 'propeller'), L('squawk', 'sky', 'Emergency squawks', true, 'exclamation'), L('drones', 'sky', 'Drones (Remote ID)', true, 'drone'), + L('airports', 'sky', 'Airport boards', false, 'board'), L('holding', 'sky', 'Holding patterns', true, 'loop'), + L('ais', 'sea', 'AIS vessels', true, 'ferry'), L('ports', 'sea', 'Ports', false, 'anchor'), L('tankers', 'sea', 'Tankers / cargo', false, 'drop'), + L('fishing', 'sea', 'Fishing effort', false, 'fish'), L('dark', 'sea', 'Dark vessels (AIS gaps)', false, 'eyeslash'), L('cables', 'sea', 'Submarine cables', false, 'cable'), + L('sats', 'orbit', 'Satellites (TLE)', true, 'satellite'), L('crewed', 'orbit', 'ISS & crewed', true, 'iss'), L('trains', 'orbit', 'Starlink trains', true, 'train'), + L('launches', 'orbit', 'Launches & trajectories', true, 'rocket'), L('debris', 'orbit', 'Debris', false, 'debris'), L('tracks', 'orbit', 'Ground tracks & passes', true, 'orbitpath'), + L('quakes', 'haz', 'Earthquakes', true, 'wave'), L('fires', 'haz', 'Active fires (FIRMS)', true, 'flame'), L('perims', 'haz', 'Fire perimeters', false, 'perimeter'), + L('floods', 'haz', 'Floods', true, 'drop'), L('cyclones', 'haz', 'Tropical cyclones', true, 'hurricane'), L('volcanoes', 'haz', 'Volcanoes', false, 'mountain'), + L('aq', 'haz', 'Air quality', false, 'aqi'), + L('cctv', 'eyes', 'Public CCTV', true, 'video'), L('signed', 'eyes', 'Signed captures', true, 'seal'), L('street', 'eyes', 'Street-level imagery', false, 'binoculars'), + L('holo', 'eyes', 'Holograms', true, 'cube'), L('streams', 'eyes', 'Live streams', false, 'live'), + L('transit', 'ground', 'Transit vehicles', false, 'tram'), L('traffic', 'ground', 'Traffic flow', true, 'car'), L('bikes', 'ground', 'Bike share', false, 'bike'), + L('rail', 'ground', 'Rail', false, 'rail'), L('venues', 'ground', 'Events & venues', true, 'ticket'), L('alpr', 'ground', 'ALPR cameras', false, 'plate'), + L('radar', 'wx', 'Radar', true, 'radar'), L('clouds', 'wx', 'Clouds', true, 'cloud'), L('lightning', 'wx', 'Lightning', true, 'bolt'), + L('wind', 'wx', 'Wind', false, 'wind'), L('models', 'wx', 'Forecast models', false, 'spaghetti'), + L('dc', 'infra', 'Datacenters', false, 'server'), L('dams', 'infra', 'Dams', false, 'dam'), L('power', 'infra', 'Power plants', false, 'bolt'), + L('milbase', 'infra', 'Military installations', false, 'shield'), L('gnss', 'infra', 'GNSS interference', true, 'jam'), L('imagery', 'infra', 'Recent satellite imagery', false, 'frame'), +]; +W.layerById = Object.fromEntries(W.layers.map((l) => [l.id, l])); +W.on = (id) => !!W.layerById[id]?.on; + +/* ---------- time ---------- */ +W.offsetH = 0; W.live = true; W.simMs = NOW; W.t = 0; W.sun = astro.sun(NOW); +W.window = null; +W.getWindow = () => W.window || { start: Date.now() - 72 * 3600000, end: Date.now() + 120 * 3600000 }; +W.setWindow = (w) => { W.window = w; bus.emit('window', w); }; +W.setTime = function (ms) { + if (ms == null && !W.window) { W.live = true; W.offsetH = 0; } + else { const win = W.getWindow(); if (ms == null) ms = (win.start + win.end) / 2; ms = clamp(ms, win.start, win.end); W.offsetH = (ms - Date.now()) / 3600000; W.live = !W.window && Math.abs(W.offsetH) < 1 / 120; } + W.simMs = Date.now() + W.offsetH * 3600000; + bus.emit('time', W.offsetH); +}; +W.timeWindow = () => ({ ...W.getWindow(), now: Date.now() }); +W.userHolos = []; + +/* ---------- static data for layers ---------- */ +const RS = rng(77); +const near = (lat, lon, km, n, f) => { const out = []; for (let i = 0; i < n; i++) { const [a, b] = geo.dest(lat, lon, RS() * TAU, Math.sqrt(RS()) * km); out.push(f ? f(a, b, i) : [a, b]); } return out; }; +const BIG_CITIES = GE.CITY_V.slice(0, 32); +const PORTS = [[51.95,4.05,'Rotterdam'],[1.26,103.84,'Singapore'],[31.36,121.6,'Shanghai'],[22.3,114.2,'Hong Kong'],[35.1,129.04,'Busan'],[25.0,55.06,'Jebel Ali'],[33.74,-118.26,'Los Angeles / Long Beach'],[53.54,9.97,'Hamburg'],[51.27,4.3,'Antwerp'],[29.6,32.55,'Suez'],[31.25,32.3,'Port Said'],[40.67,-74.05,'New York / NJ'],[-23.96,-46.3,'Santos'],[13.08,100.9,'Laem Chabang'],[22.6,120.27,'Kaohsiung'],[34.6,135.4,'Osaka'],[35.43,139.65,'Yokohama'],[-33.86,151.2,'Sydney'],[47.6,-122.35,'Seattle'],[30.6,122.08,'Ningbo'],[36.1,120.3,'Qingdao'],[9.35,-79.9,'Colón'],[8.95,-79.55,'Balboa'],[-33.9,18.43,'Cape Town'],[6.43,3.38,'Lagos'],[37.94,23.62,'Piraeus'],[44.4,8.9,'Genoa'],[43.3,5.35,'Marseille'],[29.75,-95.0,'Houston'],[19.0,72.85,'Mumbai (JNPT)']]; +const VOLCANOES = [[37.75,14.99,'Etna'],[19.42,-155.29,'Kīlauea'],[31.59,130.66,'Sakurajima'],[19.02,-98.62,'Popocatépetl'],[-7.54,110.44,'Merapi'],[14.47,-90.88,'Fuego'],[-77.53,167.15,'Erebus'],[63.63,-19.62,'Eyjafjallajökull'],[63.9,-22.27,'Reykjanes'],[-0.37,-78.44,'Cotopaxi'],[56.06,160.64,'Klyuchevskoy'],[1.68,127.88,'Ibu'],[-8.06,114.24,'Ijen'],[13.26,123.69,'Mayon'],[46.2,-122.19,'St Helens'],[40.82,14.43,'Vesuvius'],[-39.42,-71.93,'Villarrica'],[-1.52,29.25,'Nyiragongo'],[-15.79,-71.86,'Sabancaya'],[38.79,15.21,'Stromboli']]; +const DCS = [[39.04,-77.49,'Ashburn cluster'],[53.33,-6.4,'Dublin'],[50.11,8.68,'Frankfurt'],[1.3,103.8,'Singapore'],[52.37,4.9,'Amsterdam'],[45.6,-121.2,'The Dalles'],[33.45,-112.07,'Phoenix'],[41.6,-93.6,'Des Moines'],[35.69,139.69,'Tokyo'],[37.37,-121.92,'Santa Clara'],[59.33,18.06,'Stockholm'],[-23.5,-46.6,'São Paulo'],[19.07,72.88,'Mumbai'],[32.78,-96.8,'Dallas']]; +const DAMS = [[30.82,111.0,'Three Gorges'],[36.02,-114.74,'Hoover'],[-25.41,-54.59,'Itaipu'],[23.97,32.88,'Aswan High'],[47.96,-118.98,'Grand Coulee'],[7.76,-62.99,'Guri'],[34.08,72.7,'Tarbela'],[28.27,85.37,'Rasuwagadhi Hydro (approx.)'],[11.2,35.1,'Grand Ethiopian Renaissance'],[46.23,7.37,'Grande Dixence']]; +const MILB = [[31.33,-85.72,'Fort Novosel'],[36.95,-76.33,'Norfolk'],[34.68,-77.34,'Camp Lejeune'],[64.83,-147.6,'Eielson'],[13.58,144.92,'Andersen'],[26.27,127.75,'Kadena'],[49.44,7.6,'Ramstein'],[51.75,-1.58,'Brize Norton'],[37.0,35.42,'Incirlik'],[25.12,51.32,'Al Udeid'],[-7.31,72.41,'Diego Garcia'],[36.24,-115.03,'Nellis']]; +const PADS = [[28.5618,-80.5772,'SLC-40, Cape Canaveral'],[34.632,-120.611,'SLC-4E, Vandenberg'],[45.92,63.34,'Baikonur'],[5.24,-52.77,'Kourou'],[40.96,100.29,'Jiuquan'],[30.4,130.97,'Tanegashima'],[13.72,80.23,'Sriharikota'],[19.61,110.95,'Wenchang'],[25.997,-97.155,'Starbase']]; +const FISH = [[47,-50,6],[-12,-80,6],[18,-18,5],[40,150,7],[57,-170,5],[-45,-62,6],[64,-10,5],[10,-90,5],[-5,95,5],[20,115,5]]; +const GNSS_HOT = [[59.5,24.0,4],[55.5,20.5,3.5],[34.5,33.5,3],[44.5,33.5,3],[33.5,36.0,2.5],[27.0,56.5,2.5],[69.5,30.5,2],[46.5,31.5,2.5]]; +const CABLES = [ + [[50.8,-1.3],[50.0,-10],[47,-30],[43,-50],[40.5,-72]], [[51.5,-9.8],[52.5,-30],[48,-50],[44.5,-63.5]], [[43.3,5.3],[38,10],[34.5,25],[31.3,32.3],[29.9,32.5],[20,38.5],[12.6,43.6],[12,52],[16,62],[19,72.8]], + [[35.4,139.6],[38,155],[42,180],[42,-150],[37,-125],[34.1,-118.4]], [[1.3,103.8],[5,112],[14,119],[22.3,114.2],[30,123],[35.1,129.0]], [[-33.9,151.2],[-25,170],[-10,-170],[10,-160],[21.3,-157.9],[34,-130],[37.7,-122.5]], + [[-23.0,-43.2],[-15,-30],[0,-20],[15,-20],[33,-10],[38.7,-9.2]], [[51.5,-9.8],[53,-20],[60,-20],[64,-22]], [[1.3,103.8],[-5,100],[-20,105],[-32,115.8]], [[6.4,3.4],[0,0],[-10,8],[-25,12],[-34,18.4]], +]; +const RAIL = [[[51.5,-0.13],[51.0,1.9],[50.85,4.35],[52.37,4.9]],[[48.85,2.35],[47.0,4.8],[45.75,4.85],[43.3,5.37]],[[52.52,13.4],[51.34,12.37],[50.11,8.68],[48.14,11.58]],[[35.68,139.77],[35.17,136.9],[34.69,135.5],[34.4,132.46],[33.59,130.4]],[[39.9,116.4],[36.65,117.0],[34.26,117.18],[32.06,118.8],[31.23,121.47]],[[40.75,-73.99],[39.95,-75.16],[39.29,-76.61],[38.9,-77.04]],[[40.42,-3.7],[41.39,2.17]],[[41.9,12.5],[43.77,11.25],[45.46,9.19]]]; + +function cityScatter(n, km, f) { const out = []; for (let i = 0; i < n; i++) { const c = BIG_CITIES[i % BIG_CITIES.length]; const [a, b] = geo.dest(c.lat, c.lon, RS() * TAU, Math.sqrt(RS()) * km); out.push(f(a, b, c, i)); } return out; } +// holograms & signed captures (fictional authors). Some are placed on situations. +const HOLOS = [ + { lat: 28.2551, lon: 85.3712, by: 'tamang_lens', title: 'North bank, Timure — water at the road', t: -55 * 24 * 3600 + 0, sit: 'koshi' }, + { lat: 28.1629, lon: 85.3402, by: 'hydro_nerd', title: 'Syaphrubesi bridge deck, 14:31 NPT', t: -55 * 86400, sit: 'koshi' }, + { lat: 28.2802, lon: 85.3797, by: 'geodesy_dan', title: 'Rasuwagadhi — scour line photo', t: -54 * 86400, sit: 'koshi' }, + { lat: 51.5560, lon: -0.2796, by: 'row_m_seat14', title: 'Encore from block 114', t: -3600 * 20, sit: 'concert' }, + { lat: 40.7553, lon: -73.9838, by: 'chopper_cam9', title: 'Tower, 41st floor setback', t: -3600 * 9, sit: 'climb' }, + { lat: 69.65, lon: 18.96, by: 'skywatch_ana', title: 'Corona overhead, Tromsø', t: -3600 * 18, sit: 'aurora' }, + { lat: 29.93, lon: 32.56, by: 'ais_owl', title: 'Anchorage at dusk, 48 ships', t: -3600 * 7, sit: 'suez' }, + { lat: 31.276, lon: -85.713, by: 'rotorwash_ret', title: 'Downwind leg, Cairns', t: -3600 * 30, sit: 'novosel' }, +]; +GE.HOLOS = HOLOS; + +/* ---------- buffers ---------- */ +const SPR_STRIDE = 15; // pos3 col4 par4 ext4 +function pushSpr(a, v, col, size, glyph, hdg = -10, t0 = -1e9, tEnd = 1e9, grow = 0, seed = 0, heat = 0.5) { + a.push(v[0], v[1], v[2], col[0], col[1], col[2], col[3] ?? 1, size, glyph, hdg, t0, tEnd, grow, seed, heat); +} +const LINE_STRIDE = 9; // pos3 col4 d2 +function pushPolyline(a, pts /* [v] */, col, dashed = 0) { + let d = 0; + for (let i = 1; i < pts.length; i++) { + const p0 = pts[i - 1], p1 = pts[i]; + const seg = v3.len(v3.sub(p1, p0)); + a.push(p0[0], p0[1], p0[2], col[0], col[1], col[2], col[3] ?? 1, d, dashed); + d += seg; + a.push(p1[0], p1[1], p1[2], col[0], col[1], col[2], col[3] ?? 1, d, dashed); + } +} +function gcPoints(lat1, lon1, lat2, lon2, n, altKm = 0, lift = 0) { + const a = geo.vec(lat1, lon1), b = geo.vec(lat2, lon2), out = []; + for (let i = 0; i <= n; i++) { const t = i / n; const p = geo.slerp(a, b, t); const r = 1 + (altKm + lift * Math.sin(Math.PI * t)) / EARTH_KM; out.push(v3.scale(p, r)); } + return out; +} +function chainPoints(ll, altKm = 0, sub = 8) { const out = []; for (let i = 1; i < ll.length; i++) { const seg = gcPoints(ll[i - 1][0], ll[i - 1][1], ll[i][0], ll[i][1], sub, altKm); if (i > 1) seg.shift(); out.push(...seg); } return out; } +function circlePts(lat, lon, km, n = 48, altKm = 0) { const out = []; for (let i = 0; i <= n; i++) { const [a, b] = geo.dest(lat, lon, (i / n) * TAU, km); out.push(geo.vec(a, b, altKm)); } return out; } + +W.static = {}; // id → {vao, count, pass:'add'|'alpha', prog:'sprite'|'line'} +function makeSpriteSet(id, arr, pass = 'add') { + const gl = GL.gl, P = GL.progs.sprite, buf = GL.buffer(new Float32Array(arr)); + const S = SPR_STRIDE; + const vao = GL.vao(P, { aPos: [buf, 3, S, 0], aCol: [buf, 4, S, 3], aPar: [buf, 4, S, 7], aExt: [buf, 4, S, 11] }); + return { vao, buf, count: arr.length / S, pass, kind: 'sprite' }; +} +function makeLineSet(arr) { + const P = GL.progs.line, buf = GL.buffer(new Float32Array(arr)); + const vao = GL.vao(P, { aPos: [buf, 3, LINE_STRIDE, 0], aCol: [buf, 4, LINE_STRIDE, 3], aD: [buf, 2, LINE_STRIDE, 7] }); + return { vao, buf, count: arr.length / LINE_STRIDE, kind: 'line' }; +} +function addSet(layer, set) { (W.static[layer] = W.static[layer] || []).push(set); } + +W.buildStatic = function () { + const C = (fam, a = 1) => [...hex2rgb(FAM[fam].color), a]; + // quakes + { const a = []; for (const q of GE.QUAKES) pushSpr(a, geo.vec(q.lat, q.lon, 0.5), [1.0, 0.5, 0.3, 1], 10 + (q.mag - 2.5) * 9, 2, -10, q.t, 1e9, 0, RS(), 0.8); addSet('quakes', makeSpriteSet('quakes', a)); } + // fires (+ smoke in alpha pass) + { const a = [], sm = []; for (const f of GE.FIRES) { pushSpr(a, geo.vec(f.lat, f.lon, 0.2), [1, 0.5, 0.15, 1], 4 + Math.sqrt(f.frp) * 0.9, 3, -10, f.t, 1e9, 0.4, RS(), 1.0); if (RS() < 0.35) pushSpr(sm, geo.vec(f.lat + 0.15, f.lon + 0.35, 2), [0.3, 0.28, 0.27, 0.32], 26 + RS() * 30, 11, -10, f.t + 3600, 1e9, 0.8, RS(), 0.5); } + addSet('fires', makeSpriteSet('fires', a)); addSet('fires', makeSpriteSet('smoke', sm, 'alpha')); } + // perimeters + { const a = []; for (const [la, lo, , , s] of GE.FIRE_CLUSTERS) pushPolyline(a, circlePts(la, lo, s * 111 * 0.9, 40, 0.3), [1, 0.42, 0.24, 0.6], 1); addSet('perims', makeLineSet(a)); } + // floods + { const a = [], b = []; for (const [la, lo] of [[28.21, 85.35], [23.9, 90.6], [26.2, 91.7], [9.0, 7.5], [30.0, 70.9]]) { pushSpr(a, geo.vec(la, lo, 0.2), [0.4, 0.75, 1, 1], 16, 9, -10); pushSpr(b, geo.vec(la, lo, 0.5), [0.25, 0.55, 0.95, 0.35], 60, 11); } addSet('floods', makeSpriteSet('floods', a)); addSet('floods', makeSpriteSet('floods2', b, 'alpha')); } + // volcanoes + { const a = []; for (const [la, lo] of VOLCANOES) pushSpr(a, geo.vec(la, lo, 0.5), [1, 0.45, 0.3, 1], 13, 14); addSet('volcanoes', makeSpriteSet('v', a)); } + // air quality (alpha) + { const a = []; for (const [la, lo] of [[28.6, 77.2], [30.6, 75], [39.9, 116.4], [23.1, 113.3], [24.9, 67], [31.5, 74.3], [6.5, 3.4], [-6.2, 106.8], [40.2, -8.1], [-12, 25], [8, 18]]) for (let i = 0; i < 6; i++) { const [x, y] = geo.dest(la, lo, RS() * TAU, RS() * 260); pushSpr(a, geo.vec(x, y, 1), [0.75, 0.5, 0.25, 0.22], 70 + RS() * 60, 11, -10, -1e9, 1e9, 0, RS()); } addSet('aq', makeSpriteSet('aq', a, 'alpha')); } + // airports (boards) + { const a = []; for (const p of GE.AP) pushSpr(a, geo.vec(p.lat, p.lon, 0.3), C('sky', 0.9), 8 + Math.sqrt(p.w) * 1.4, 13); addSet('airports', makeSpriteSet('ap', a)); } + // ports + { const a = []; for (const [la, lo] of PORTS) pushSpr(a, geo.vec(la, lo, 0.2), C('sea'), 13, 13); addSet('ports', makeSpriteSet('ports', a)); } + // fishing effort (alpha) + { const a = []; for (const [la, lo, s] of FISH) for (let i = 0; i < 26; i++) pushSpr(a, geo.vec(la + RS.gauss() * s * 0.5, lo + RS.gauss() * s, 0.2), [0.2, 0.9, 0.8, 0.12], 30 + RS() * 40, 11, -10, -1e9, 1e9, 0, RS()); addSet('fishing', makeSpriteSet('fish', a, 'alpha')); } + // dark vessels + { const a = []; for (let i = 0; i < 40; i++) { const h = RS.pick([[26.5, 56.4], [12.5, 43.5], [36.0, 15.0], [44, 33], [1.3, 104.2], [-12, -78], [22, 119]]); pushSpr(a, geo.vec(h[0] + RS.gauss() * 1.2, h[1] + RS.gauss() * 1.5, 0.2), [1, 0.4, 0.4, 0.95], 12, 16); } addSet('dark', makeSpriteSet('dark', a)); } + // cables + { const a = []; for (const c of CABLES) pushPolyline(a, chainPoints(c, -0.5, 10), [0.3, 0.9, 0.85, 0.35]); addSet('cables', makeLineSet(a)); } + // launches: pads + trajectory + { const a = []; for (const [la, lo] of PADS) pushSpr(a, geo.vec(la, lo, 0.3), C('orbit'), 12, 9, -10, -1e9, 1e9, 0, RS()); addSet('launches', makeSpriteSet('pads', a)); + const l = []; const tr = []; for (let i = 0; i <= 40; i++) { const f = i / 40; const [la, lo] = geo.dest(28.5618, -80.5772, 52 * D2R, f * 1900); tr.push(geo.vec(la, lo, Math.pow(f, 0.55) * 210)); } pushPolyline(l, tr, [0.85, 0.7, 1, 0.9], 1); addSet('launches', makeLineSet(l)); } + // cyclone track (past solid, forecast dashed) + forecast cone + model spaghetti + { const a = []; const tr = GE.CYCLONE.track; const past = tr.filter((x) => x[0] <= 0).map((x) => [x[1], x[2]]); const fut = tr.filter((x) => x[0] >= 0).map((x) => [x[1], x[2]]); + pushPolyline(a, chainPoints(past, 1, 6), [1, 0.6, 0.45, 0.95]); pushPolyline(a, chainPoints(fut, 1, 6), [1, 0.75, 0.6, 0.95], 1); + // cone edges + const left = [], right = []; for (let h = 0; h <= 120; h += 6) { const c = GE.CYCLONE.at(h), c2 = GE.CYCLONE.at(h + 3); const br = geo.bearing(c.lat, c.lon, c2.lat, c2.lon); const r = GE.CYCLONE.cone(h); left.push(geo.vec(...geo.dest(c.lat, c.lon, br - Math.PI / 2, r), 1)); right.push(geo.vec(...geo.dest(c.lat, c.lon, br + Math.PI / 2, r), 1)); } + pushPolyline(a, left, [1, 0.75, 0.6, 0.5]); pushPolyline(a, right, [1, 0.75, 0.6, 0.5]); + const end = GE.CYCLONE.at(120); pushPolyline(a, circlePts(end.lat, end.lon, GE.CYCLONE.cone(120), 40, 1), [1, 0.75, 0.6, 0.35]); + addSet('cyclones', makeLineSet(a)); + // cone fill as soft sprites + const f = []; for (let h = 3; h <= 120; h += 3) { const c = GE.CYCLONE.at(h); pushSpr(f, geo.vec(c.lat, c.lon, 1), [1, 0.55, 0.4, 0.07], 1, 11, -10, -1e9, 1e9, 0, h); f[f.length - 8] = GE.CYCLONE.cone(h); } + W.coneSprites = f; // sized per-frame (km → px) + const m = []; for (let k = 0; k < 14; k++) { const pts = []; let la = GE.CYCLONE.at(0).lat, lo = GE.CYCLONE.at(0).lon; for (let h = 0; h <= 120; h += 6) { const c = GE.CYCLONE.at(h); const sp = h / 120; pts.push([c.lat + Math.sin(k * 1.7) * sp * 4.5 + RS.gauss() * sp, c.lon + Math.cos(k * 2.3) * sp * 6 + RS.gauss() * sp]); } pushPolyline(m, chainPoints(pts, 1, 4), [0.6, 0.75, 1, 0.45]); } + addSet('models', makeLineSet(m)); } + // eyes + { const a = cityScatter(320, 18, (la, lo) => la); const s = []; for (let i = 0; i < 320; i++) { const c = BIG_CITIES[i % BIG_CITIES.length]; const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, Math.sqrt(RS()) * 16); pushSpr(s, geo.vec(x, y, 0.05), C('eyes'), 13, 5); } + // Midtown / Wembley / Chicago extra cameras for close-ups + for (const [la, lo, n] of [[40.7549, -73.984, 40], [51.556, -0.2796, 18], [41.8789, -87.6359, 30], [28.163, 85.34, 4]]) for (let i = 0; i < n; i++) { const [x, y] = geo.dest(la, lo, RS() * TAU, 0.15 + RS() * 1.6); pushSpr(s, geo.vec(x, y, 0.02), C('eyes'), 15, 5); } + addSet('cctv', makeSpriteSet('cctv', s)); } + { const s = []; for (let i = 0; i < 70; i++) { const c = BIG_CITIES[(i * 7) % BIG_CITIES.length]; const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, RS() * 30); pushSpr(s, geo.vec(x, y, 0.05), [1, 0.82, 0.4, 1], 12, 6, -10, -1e9, 1e9, 0, RS(), 0.4); } for (const hh of HOLOS) pushSpr(s, geo.vec(hh.lat, hh.lon, 0.05), [1, 0.82, 0.4, 1], 15, 6); addSet('signed', makeSpriteSet('signed', s)); } + { const s = cityScatter(1800, 22, () => 0); const a = []; for (let i = 0; i < 1800; i++) { const c = BIG_CITIES[i % BIG_CITIES.length]; const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, Math.sqrt(RS()) * 20); pushSpr(a, geo.vec(x, y, 0.02), [1, 0.9, 0.6, 0.45], 3.2, 0); } addSet('street', makeSpriteSet('street', a)); } + { const a = [], l = []; for (const hh of HOLOS) { pushSpr(a, geo.vec(hh.lat, hh.lon, 0.35), [1, 0.85, 0.45, 1], 22, 6, -10, -1e9, 1e9, 0, RS(), 0.4); pushPolyline(l, [geo.vec(hh.lat, hh.lon, 0), geo.vec(hh.lat, hh.lon, 0.35)], [1, 0.85, 0.5, 0.9]); } addSet('holo', makeSpriteSet('holo', a)); addSet('holo', makeLineSet(l)); } + { const a = []; for (let i = 0; i < 36; i++) { const c = BIG_CITIES[(i * 5) % BIG_CITIES.length]; const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, RS() * 25); pushSpr(a, geo.vec(x, y, 0.1), [1, 0.35, 0.4, 1], 12, 9, -10, -1e9, 1e9, 0, RS()); } addSet('streams', makeSpriteSet('streams', a)); } + // ground + { const a = []; for (let i = 0; i < 1500; i++) { const c = BIG_CITIES[i % 20]; const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, Math.sqrt(RS()) * 14); pushSpr(a, geo.vec(x, y, 0.02), C('ground', 0.9), 3.5, 0); } addSet('bikes', makeSpriteSet('bikes', a)); } + { const a = []; for (const r of RAIL) pushPolyline(a, chainPoints(r, 0.1, 6), [0.62, 0.88, 0.37, 0.65]); addSet('rail', makeLineSet(a)); } + { const a = []; for (const [la, lo] of [[51.556, -0.2796], [40.7505, -73.9934], [41.8623, -87.6167], [34.0141, -118.2879], [48.8414, 2.253], [40.4531, -3.6883], [35.6681, 139.7], [-33.891, 151.2249], [53.4631, -2.2913], [41.3809, 2.1228]]) pushSpr(a, geo.vec(la, lo, 0.1), C('ground'), 14, 9, -10, -1e9, 1e9, 0, RS()); addSet('venues', makeSpriteSet('venues', a)); } + { const a = []; for (let i = 0; i < 300; i++) { const c = BIG_CITIES[[0, 15, 16, 26, 24][i % 5]]; const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, Math.sqrt(RS()) * 30); pushSpr(a, geo.vec(x, y, 0.02), [0.75, 0.9, 0.6, 0.85], 7, 13); } addSet('alpr', makeSpriteSet('alpr', a)); } + // weather: radar blobs + lightning + { const a = [], b = []; const cy = GE.CYCLONE.at(0); + for (let i = 0; i < 70; i++) { const ang = RS() * TAU, rr = Math.pow(RS(), 0.7) * 480; const [x, y] = geo.dest(cy.lat, cy.lon, ang, rr); pushSpr(a, geo.vec(x, y, 1), rr < 150 ? [1, 0.75, 0.2, 0.16] : [0.3, 0.85, 0.4, 0.11], 30 + RS() * 40, 11, -10, -1e9, 1e9, 0, RS()); if (RS() < 0.5) pushSpr(b, geo.vec(x, y, 2), [0.85, 0.85, 1, 1], 18, 12, -10, -1e9, 1e9, 0, RS(), 0.9); } + for (const [la, lo] of [[45, -95], [5, 20], [-5, -60], [10, 100], [32, -85]]) for (let i = 0; i < 18; i++) { const [x, y] = geo.dest(la, lo, RS() * TAU, RS() * 500); pushSpr(a, geo.vec(x, y, 1), [0.3, 0.85, 0.4, 0.1], 24 + RS() * 30, 11, -10, -1e9, 1e9, 0, RS()); pushSpr(b, geo.vec(x, y, 2), [0.85, 0.85, 1, 1], 14, 12, -10, -1e9, 1e9, 0, RS(), 0.9); } + addSet('radar', makeSpriteSet('radar', a, 'alpha')); addSet('lightning', makeSpriteSet('lightning', b)); } + // infra + { const a = []; for (const [la, lo] of DCS) pushSpr(a, geo.vec(la, lo, 0.1), C('infra'), 13, 13); addSet('dc', makeSpriteSet('dc', a)); } + { const a = []; for (const [la, lo] of DAMS) pushSpr(a, geo.vec(la, lo, 0.1), [0.6, 0.8, 1, 1], 13, 13); addSet('dams', makeSpriteSet('dams', a)); } + { const a = []; for (let i = 0; i < 260; i++) { const c = RS.pick(GE.AP); const [x, y] = geo.dest(c.lat, c.lon, RS() * TAU, 20 + RS() * 120); pushSpr(a, geo.vec(x, y, 0.1), [1, 0.85, 0.5, 0.8], 6, 0); } addSet('power', makeSpriteSet('power', a)); } + { const a = []; for (const [la, lo] of MILB) pushSpr(a, geo.vec(la, lo, 0.1), [1, 0.6, 0.4, 0.9], 13, 13); addSet('milbase', makeSpriteSet('mb', a)); } + { const a = []; for (const [la, lo, s] of GNSS_HOT) for (let i = 0; i < 9; i++) pushSpr(a, geo.vec(la + RS.gauss() * s * 0.25, lo + RS.gauss() * s * 0.45, 1), [1, 0.32, 0.36, 0.22], 18 + s * 4, 10, -10, -1e9, 1e9, 0, RS(), 0.6); addSet('gnss', makeSpriteSet('gnss', a, 'alpha')); } + { const a = []; for (let i = 0; i < 40; i++) { const c = RS.pick(GE.AP); const la = c.lat + RS.gauss() * 2, lo = c.lon + RS.gauss() * 2, w = 0.5 + RS() * 0.6; const q = [[la - w, lo - w], [la - w, lo + w], [la + w, lo + w], [la + w, lo - w], [la - w, lo - w]].map(([x, y]) => geo.vec(x, y, 0.5)); pushPolyline(a, q, [0.8, 0.85, 0.95, 0.5]); } addSet('imagery', makeLineSet(a)); } + // AIS lanes as faint context lines + { const a = []; for (const l of GE.LANES) pushPolyline(a, chainPoints(l, 0, 6), [0.22, 0.88, 0.78, 0.07]); addSet('ais', makeLineSet(a)); } + // situation pins handled dynamically + W.counts.quakes = GE.QUAKES.length; W.counts.ports = PORTS.length; W.counts.volcanoes = VOLCANOES.length; W.counts.dc = DCS.length; W.counts.dams = DAMS.length; W.counts.milbase = MILB.length; W.counts.cables = CABLES.length; + W.counts.launches = PADS.length; W.counts.cctv = 408; W.counts.signed = 78; W.counts.street = 1800; W.counts.holo = HOLOS.length; W.counts.streams = 36; W.counts.bikes = 1500; W.counts.rail = 412; W.counts.venues = 10; W.counts.alpr = 300; + W.counts.radar = 160; W.counts.clouds = 1; W.counts.models = 14; W.counts.power = 260; W.counts.gnss = 8; W.counts.imagery = 40; W.counts.fishing = 260; W.counts.dark = 40; W.counts.aq = 66; W.counts.floods = 5; W.counts.perims = GE.FIRE_CLUSTERS.length; +}; +W.counts = {}; + +/* ---------- GPU flights & satellites ---------- */ +W.buildMovers = function () { + const gl = GL.gl; + const F = GE.FLIGHTS, n = F.length, a = new Float32Array(n * 14); + F.forEach((f, i) => { const o = i * 14; a.set(f.a.v, o); a.set(f.b.v, o + 3); a[o + 6] = f.t0; a[o + 7] = f.dur; a[o + 8] = f.period; a[o + 9] = f.turn; a[o + 10] = f.alt; a[o + 11] = f.kind; a[o + 12] = hash01(i); a[o + 13] = f.dKm; }); + const fb = GL.buffer(a); + const spec = (P) => ({ aA: [fb, 3, 14, 0, 1], aB: [fb, 3, 14, 3, 1], aTime: [fb, 4, 14, 6, 1], aMeta: [fb, 4, 14, 10, 1] }); + W.flightVao = GL.vao(GL.progs.flight, spec()); + const K = 28, kb = GL.buffer(new Float32Array(Array.from({ length: K }, (_, i) => i / (K - 1)))); + const ts = spec(); ts.aK = [kb, 1, 1, 0, 0]; + W.trailVao = GL.vao(GL.progs.trail, ts); W.trailK = K; W.nFlights = n; + const S = GE.SATS, sa = new Float32Array(S.length * 8); + S.forEach((s, i) => { sa.set([s.inc, s.raan, s.u0, s.n, s.alt, s.kind, s.geo ? 1 : 0, hash01(i + 7)], i * 8); }); + const sb = GL.buffer(sa); + W.satVao = GL.vao(GL.progs.sat, { aEl: [sb, 4, 8, 0], aSM: [sb, 4, 8, 4] }); W.nSats = S.length; + // dynamic sprites / lines + W.dynBuf = gl.createBuffer(); W.dynVao = null; W.dynCount = 0; W.dynCap = 0; + W.dynLineBuf = gl.createBuffer(); W.dynLineCount = 0; W.dynLineCap = 0; + W.alphaBuf = gl.createBuffer(); W.alphaCount = 0; W.alphaCap = 0; +}; +function uploadDyn(bufKey, vaoKey, capKey, countKey, arr, kind) { + const gl = GL.gl; const f = new Float32Array(arr); + gl.bindBuffer(gl.ARRAY_BUFFER, W[bufKey]); + if (f.length > W[capKey]) { W[capKey] = Math.max(f.length, W[capKey] * 1.5) | 0; gl.bufferData(gl.ARRAY_BUFFER, W[capKey] * 4, gl.DYNAMIC_DRAW); + if (kind === 'line') W[vaoKey] = GL.vao(GL.progs.line, { aPos: [W[bufKey], 3, LINE_STRIDE, 0], aCol: [W[bufKey], 4, LINE_STRIDE, 3], aD: [W[bufKey], 2, LINE_STRIDE, 7] }); + else W[vaoKey] = GL.vao(GL.progs.sprite, { aPos: [W[bufKey], 3, SPR_STRIDE, 0], aCol: [W[bufKey], 4, SPR_STRIDE, 3], aPar: [W[bufKey], 4, SPR_STRIDE, 7], aExt: [W[bufKey], 4, SPR_STRIDE, 11] }); } + gl.bufferSubData(gl.ARRAY_BUFFER, 0, f); + W[countKey] = f.length / (kind === 'line' ? LINE_STRIDE : SPR_STRIDE); +} + +/* ---------- CPU movers: helicopters, drones, holding, transit, wind, runners ---------- */ +const HELI_CIRCUITS = []; +(function () { + // Fort Novosel: Cairns AAF + stagefields — rectangular circuits (illustrative) + const fields = [[31.276, -85.713, 'Cairns'], [31.36, -85.63, 'Stagefield A'], [31.20, -85.81, 'Stagefield B'], [31.42, -85.79, 'Stagefield C']]; + let k = 0; + for (const [la, lo, nm] of fields) for (let i = 0; i < (nm === 'Cairns' ? 7 : 4); i++) HELI_CIRCUITS.push({ lat: la, lon: lo, w: 1.6 + RS() * 0.6, h: 0.9 + RS() * 0.3, rot: (nm === 'Cairns' ? 0.06 : RS() * 0.6), alt: 0.15 + RS() * 0.04, period: 330 + RS() * 60, ph: i / 7 + RS() * 0.05, cs: ['HAWK', 'LAKOTA', 'ROTOR', 'TALON'][k % 4] + ' ' + (21 + k), field: nm, type: k % 3 ? 'UH-72' : 'TH-73', idx: k++ }); + // news helicopters over the tower (orbit), and city police/EMS + for (let i = 0; i < 3; i++) HELI_CIRCUITS.push({ orbit: true, lat: 40.7553, lon: -73.9838, r: 0.55 + i * 0.25, alt: 0.33 + i * 0.06, period: 140 + i * 30, ph: i * 0.33, cs: ['N9 NEWS', 'SKY 4', 'EYE 2'][i] + ' (illustrative)', type: 'AS350', idx: k++ }); + for (let i = 0; i < 18; i++) { const c = BIG_CITIES[i]; HELI_CIRCUITS.push({ orbit: true, lat: c.lat + RS.gauss() * 0.05, lon: c.lon + RS.gauss() * 0.05, r: 1 + RS() * 3, alt: 0.3 + RS() * 0.3, period: 200 + RS() * 300, ph: RS(), cs: 'MED ' + (100 + i), type: 'EC135', idx: k++ }); } +})(); +GE.HELI_CIRCUITS = HELI_CIRCUITS; +function heliAt(hc, t) { + const ph = ((t / hc.period + hc.ph) % 1 + 1) % 1; + if (hc.orbit) { const ang = ph * TAU; const [la, lo] = geo.dest(hc.lat, hc.lon, ang, hc.r); return { lat: la, lon: lo, altKm: hc.alt, hdg: ang + Math.PI / 2, v: geo.vec(la, lo, hc.alt), spd: (TAU * hc.r * 1000) / hc.period * 1.944 }; } + // rectangle circuit: perimeter param + const W2 = hc.w, H2 = hc.h, P = 2 * (W2 + H2); let d = ph * P; let x, y, hd; + if (d < W2) { x = d - W2 / 2; y = -H2 / 2; hd = Math.PI / 2; } else if ((d -= W2) < H2) { x = W2 / 2; y = d - H2 / 2; hd = 0; } else if ((d -= H2) < W2) { x = W2 / 2 - d; y = H2 / 2; hd = -Math.PI / 2; } else { d -= W2; x = -W2 / 2; y = H2 / 2 - d; hd = Math.PI; } + // round corners a bit + const c = Math.cos(hc.rot), s = Math.sin(hc.rot); const ex = x * c - y * s, ny = x * s + y * c; + const [la, lo] = geo.offset(hc.lat, hc.lon, ex * 1000, ny * 1000); + // altitude: descend on final (last quarter), climb after takeoff + const alt = hc.alt * (0.35 + 0.65 * smooth(0.0, 0.12, ph) * smooth(1.0, 0.86, ph)); + return { lat: la, lon: lo, altKm: alt, hdg: hd + hc.rot * -1, v: geo.vec(la, lo, alt), spd: (P * 1000 / hc.period) * 1.944 }; +} +GE.heliAt = heliAt; +const HOLD_STACKS = [[51.72, -0.55, 'BNN'], [51.30, -0.45, 'OCK'], [51.33, 0.03, 'BIG'], [51.65, 0.15, 'LAM'], [40.9, -73.2, 'CCC'], [33.9, -84.0, 'ATL-E']]; +const HOLDERS = []; HOLD_STACKS.forEach(([la, lo, nm], si) => { for (let i = 0; i < (si < 4 ? 5 : 3); i++) HOLDERS.push({ la, lo, nm, lvl: 7 + i * 1, ph: RS(), cs: GE.FLIGHTS[(si * 13 + i * 7) % 3000].cs }); }); +function holdAt(hd, t) { + const per = 240, ph = ((t / per + hd.ph) % 1 + 1) % 1; // racetrack 4 min + const L2 = 7, Rr = 2.2; const P = 2 * L2 + TAU * Rr; let d = ph * P; let x, y, hh; + if (d < L2) { x = d - L2 / 2; y = Rr; hh = Math.PI / 2; } else if ((d -= L2) < Math.PI * Rr) { const a = d / Rr; x = L2 / 2 + Math.sin(a) * Rr; y = Math.cos(a) * Rr; hh = Math.PI / 2 + a; } else if ((d -= Math.PI * Rr) < L2) { x = L2 / 2 - d; y = -Rr; hh = -Math.PI / 2; } else { d -= L2; const a = d / Rr; x = -L2 / 2 - Math.sin(a) * Rr; y = -Math.cos(a) * Rr; hh = -Math.PI / 2 + a; } + const [la, lo] = geo.offset(hd.la, hd.lo, x * 1000, y * 1000); + return { lat: la, lon: lo, altKm: hd.lvl * 0.3048, hdg: hh, v: geo.vec(la, lo, hd.lvl * 0.3048) }; +} +// delivery-drone corridor (illustrative, suburban Texas) +const DRONE_DEPOT = [30.5880, -96.2900]; +const DRONES = []; for (let i = 0; i < 16; i++) { const brg = RS() * TAU, km = 1.2 + RS() * 4.5; DRONES.push({ to: geo.dest(DRONE_DEPOT[0], DRONE_DEPOT[1], brg, km), km, period: 600 + RS() * 400, ph: RS(), id: 'RID-' + (4400 + i) }); } +GE.DRONES = DRONES; GE.DRONE_DEPOT = DRONE_DEPOT; +function droneAt(d, t) { + const ph = ((t / d.period + d.ph) % 1 + 1) % 1; const out = ph < 0.5; const f = out ? ph * 2 : (1 - ph) * 2; + const s = smooth(0, 1, f); const la = lerp(DRONE_DEPOT[0], d.to[0], s), lo = lerp(DRONE_DEPOT[1], d.to[1], s); + const alt = 0.06 * Math.min(1, Math.min(f, 1 - f) * 12 + 0.05); + return { lat: la, lon: lo, altKm: alt, v: geo.vec(la, lo, alt), hdg: geo.bearing(DRONE_DEPOT[0], DRONE_DEPOT[1], d.to[0], d.to[1]) + (out ? 0 : Math.PI) }; +} +// marathon (fictional race) — runners on a lakeshore loop in Chicago +const RUN_ROUTE = [[41.8827, -87.6233], [41.8930, -87.6240], [41.9100, -87.6330], [41.9280, -87.6380], [41.9400, -87.6440], [41.9280, -87.6420], [41.9100, -87.6300], [41.8960, -87.6180], [41.8800, -87.6150], [41.8670, -87.6170], [41.8520, -87.6200], [41.8380, -87.6080], [41.8520, -87.6150], [41.8680, -87.6230], [41.8827, -87.6233]]; +const RUN_V = chainPoints(RUN_ROUTE, 0.002, 6); const RUN_CUM = [0]; for (let i = 1; i < RUN_V.length; i++) RUN_CUM.push(RUN_CUM[i - 1] + v3.len(v3.sub(RUN_V[i], RUN_V[i - 1]))); +const RUNNERS = []; for (let i = 0; i < 260; i++) RUNNERS.push({ pace: 0.9 + Math.pow(RS(), 1.6) * 1.1, off: RS() * 0.18, lane: RS.gauss() * 0.4, bib: 1000 + i }); +GE.RUN_ROUTE = RUN_ROUTE; +function runnerAt(r, t) { + const L = RUN_CUM[RUN_CUM.length - 1]; let d = ((r.off + (t / 3600) * 3.2 / r.pace / (L * EARTH_KM / 1)) % 1 + 1) % 1 * L; + let i = 1; while (i < RUN_CUM.length - 1 && RUN_CUM[i] < d) i++; + const f = (d - RUN_CUM[i - 1]) / ((RUN_CUM[i] - RUN_CUM[i - 1]) || 1); const v = v3.lerp(RUN_V[i - 1], RUN_V[i], f); return v; +} +// wind particles (zonal jets + cyclone swirl) +const WIND = []; for (let i = 0; i < 1400; i++) WIND.push({ lat: Math.asin(RS() * 2 - 1) * R2D * 0.95, lon: RS() * 360 - 180, ph: RS(), life: 5400 + RS() * 5400 }); +function windVel(lat, lon, t) { // deg/hour + const jet = 34 * Math.exp(-Math.pow((Math.abs(lat) - 45) / 10, 2)) - 8 * Math.exp(-Math.pow(lat / 14, 2)) + 6 * Math.sin(lon * D2R * 3 + t / 40000); + let u = jet * 3.6 / 111 / Math.max(0.2, Math.cos(lat * D2R)), v = 4 * Math.sin(lon * D2R * 2 + lat * D2R * 3) * 3.6 / 111; + const c = GE.CYCLONE.at(W.offsetH); const dlat = lat - c.lat, dlon = (lon - c.lon) * Math.cos(lat * D2R); const r = Math.hypot(dlat, dlon); + if (r < 12) { const s = 60 * Math.exp(-r / 3.5) * (1 - Math.exp(-r * r / 0.5)); u += (-dlat / (r + 1e-3)) * s * 3.6 / 111; v += (dlon / (r + 1e-3)) * s * 3.6 / 111; } + return [u, v]; +} + +W.squawks = [41, 1207].map((i) => i % GE.FLIGHTS.length); +W.situationPins = []; // filled by situations module + +W.updateDynamic = function () { + const t = W.t, a = [], al = [], ln = []; + // ships (AIS) — color by kind when tankers layer on + const showAis = W.on('ais'), showTk = W.on('tankers'); + if (showAis || showTk) { + if (!W._shipCache || Math.abs(W._shipCacheT - t) > 6 || W._shipCacheN !== GE.SHIPS.length) { W._shipCache = GE.SHIPS.map((s) => shipAt(s, t)); W._shipCacheT = t; W._shipCacheN = GE.SHIPS.length; } + GE.SHIPS.forEach((s, i) => { + const p = W._shipCache[i]; const tank = s.kind === 'tanker' || s.kind === 'LNG'; + if (!showAis && !tank) return; + const ak = clamp(lerp(0.32, 0.95, smooth(1.2, 0.08, W.lastRange ?? 1)), 0.3, 1); + const col = showTk && tank ? [1, 0.7, 0.35, ak] : s.queue ? [0.5, 1, 0.9, ak] : [0.22, 0.88, 0.78, ak * 0.95]; + pushSpr(a, geo.vec(p.lat, p.lon, 0.03), col, (showTk && tank ? 10 : 8.5), 4, p.hdg, -1e9, 1e9, 0, i, 0.35); + }); + } + if (W.on('helis')) for (const hc of HELI_CIRCUITS) { const p = heliAt(hc, t); pushSpr(a, p.v, [0.62, 1, 0.6, 1], 17, 8, p.hdg, -1e9, 1e9, 0, hc.idx, 0.7); } + if (W.on('holding')) for (const hd of HOLDERS) { const p = holdAt(hd, t); pushSpr(a, p.v, [0.56, 0.82, 1, 1], 13, 1, p.hdg, -1e9, 1e9, 0, 0, 0.55); } + if (W.on('drones')) for (const d of DRONES) { const p = droneAt(d, t); pushSpr(a, p.v, [0.75, 1, 0.95, 1], 13, 17, p.hdg, -1e9, 1e9, 0, 0, 0.5); } + if (W.on('squawk')) for (const i of W.squawks) { const p = flightAt(GE.FLIGHTS[i], t); if (p) pushSpr(a, v3.scale(p.v, 1 + p.altKm * W.altX / EARTH_KM), [1, 0.25, 0.25, 1], 30, 9, -10, -1e9, 1e9, 0, i * 0.37, 0.8); } + if (W.on('venues') || W.on('transit')) for (const r of RUNNERS) pushSpr(a, runnerAt(r, t), [0.62, 0.9, 0.37, 1], 6, 16, -10, -1e9, 1e9, 0, 0, 0.6); + if (W.on('transit')) for (let i = 0; i < 400; i++) { const c = BIG_CITIES[i % 16]; const ang = hash01(i) * TAU + t / (600 + hash01(i + 3) * 900); const rr = 2 + hash01(i + 9) * 10; const [la, lo] = geo.dest(c.lat, c.lon, ang, rr); pushSpr(a, geo.vec(la, lo, 0.01), [0.62, 0.9, 0.37, 0.95], 5, 0); } + if (W.on('wind')) for (const w of WIND) { const age = ((t / w.life + w.ph) % 1 + 1) % 1; let la = w.lat, lo = w.lon; const steps = 4, dtH = (age * w.life) / 3600 / steps; for (let k = 0; k < steps; k++) { const [u, v] = windVel(la, lo, t); la += v * dtH; lo += u * dtH; } const [u, v] = windVel(la, lo, t); const fade = Math.sin(age * Math.PI); pushSpr(a, geo.vec(la, lo, 3), [0.75, 0.85, 1, 0.55 * fade], 14, 15, Math.atan2(u * Math.cos(la * D2R), v), -1e9, 1e9, 0, 0, 0.1); } + for (const hh of W.userHolos) pushSpr(a, geo.vec(hh.lat, hh.lon, 0.06), [1, 0.85, 0.45, 1], 24, 6, -10, -1e9, 1e9, 0, 0.2, 0.4); + if (W.activeExtrasId === 'climb') { const f = clamp((W.simMs - (Date.now() - 10.5 * 3600000)) / (1.9 * 3600000), 0, 1); const [la, lo] = geo.offset(40.7553, -73.9838, 16, 23.5); pushSpr(a, geo.vec(la, lo, (12 + f * 372) / 1000), [1, 0.3, 0.3, 1], 16, 9, -10, -1e9, 1e9, 0, 0.7, 0.9); } + // situation pins + for (const p of W.situationPins) pushSpr(a, geo.vec(p.lat, p.lon, 0.2), p.col, p.size || 16, 9, -10, -1e9, 1e9, 0, p.seed || 0, 0.6); + // selection highlight + if (W.sel && W.sel.v) pushSpr(a, W.sel.v, [1, 0.85, 0.45, 1], 34, 9, -10, -1e9, 1e9, 0, 0.5, 0.6); + // cyclone cone fill (alpha) + if (W.on('cyclones') && W.coneSprites) { const f = W.coneSprites.slice(); const kmPerPx = W.kmPerPx || 10; for (let i = 0; i < f.length; i += SPR_STRIDE) { f[i + 7] = clamp((f[i + 7] * 2) / kmPerPx, 1, 600) / Math.max(W.sizeK, 0.1); } al.push(...f); } + uploadDyn('dynBuf', 'dynVao', 'dynCap', 'dynCount', a, 'sprite'); + uploadDyn('alphaBuf', 'alphaVao', 'alphaCap', 'alphaCount', al, 'sprite'); + // dynamic lines: ISS ground track, selected route, extra lines from UI + if (W.on('tracks')) { + const pts = []; for (let k = -46; k <= 46; k++) { const tt = t + k * 60; const s = astro.sun(NOW + tt * 1000); const p = satAt(GE.ISS, tt, s.gmst); pts.push(v3.scale(v3.norm(p), 1.0005)); } + pushPolyline(ln, pts, [0.79, 0.66, 1, 0.55], 1); + const op = []; for (let k = 0; k <= 64; k++) { const tt = t + (k / 64) * (TAU / GE.ISS.n); op.push(satAt(GE.ISS, tt, W.sun.gmst)); } pushPolyline(ln, op, [0.79, 0.66, 1, 0.4]); + } + if (W.selRoute) pushPolyline(ln, W.selRoute, [1, 0.85, 0.45, 0.8], 1); + for (const extra of W.extraLines) pushPolyline(ln, extra.pts, extra.col, extra.dashed || 0); + for (const hh of W.userHolos) pushPolyline(ln, [geo.vec(hh.lat, hh.lon, 0), geo.vec(hh.lat, hh.lon, 0.06)], [1, 0.85, 0.5, 0.9]); + uploadDyn('dynLineBuf', 'dynLineVao', 'dynLineCap', 'dynLineCount', ln, 'line'); +}; +W.extraLines = []; + +/* ---------- counts ---------- */ +W.updateCounts = function () { + const t = W.t; let c0 = 0, c1 = 0, c3 = 0; + for (const f of GE.FLIGHTS) { let ph = (t - f.t0) % f.period; if (ph < 0) ph += f.period; const lp = ph < f.period / 2 ? ph : ph - f.period / 2; if (lp <= f.dur) { if (f.kind === 0) c0++; else if (f.kind === 1) c1++; else c3++; } } + const C = W.counts; + C.flights = c0; C.military = c1; C.ga = c3; C.helis = HELI_CIRCUITS.length; C.squawk = W.squawks.length; C.drones = DRONES.length; C.airports = GE.AP.length; C.holding = HOLDERS.length; + C.ais = GE.SHIPS.length; C.tankers = GE.SHIPS.filter((s) => s.kind === 'tanker' || s.kind === 'LNG').length; + C.sats = GE.SATS.filter((s) => s.kind <= 3).length; C.crewed = 2; C.trains = 1; C.debris = GE.SATS.filter((s) => s.kind === 4).length; C.tracks = 1; + C.fires = GE.FIRES.filter((f) => f.t <= t).length; C.quakes = GE.QUAKES.filter((q) => q.t <= t && q.t > t - 86400 * 3).length; + C.cyclones = 1; C.lightning = 160 + Math.round(40 * Math.sin(t / 900)); C.wind = 1400; C.transit = 400; C.traffic = 1; + for (const l of W.layers) l.count = C[l.id] ?? 0; + bus.emit('layers', W.layers); +}; + +/* ---------- textures ---------- */ +W.loadTextures = async function () { + const T = window.__GE_TEX || {}; + const load = (src) => new Promise((res, rej) => { const im = new Image(); im.decoding = 'async'; im.onload = () => res(im); im.onerror = rej; im.src = src; }); + const [day, night, clouds, water, topo] = await Promise.all(['day', 'night', 'clouds', 'water', 'topo'].map((k) => load(T[k]))); + W.img = { day, night, clouds, water, topo }; + W.tex = { day: GL.texture(day), night: GL.texture(night), clouds: GL.texture(clouds), water: GL.texture(water, { aniso: 2 }), topo: GL.texture(topo, { mips: true, aniso: 0 }) }; + // CPU copies for density queries (lights) and thumbnails fallback + const cv = document.createElement('canvas'); cv.width = 1024; cv.height = 512; const cx = cv.getContext('2d', { willReadFrequently: true }); + cx.drawImage(night, 0, 0, 1024, 512); W.nightPx = cx.getImageData(0, 0, 1024, 512).data; + cx.drawImage(water, 0, 0, 1024, 512); W.waterPx = cx.getImageData(0, 0, 1024, 512).data; +}; +W.lightsAt = function (lat, lon) { + if (!W.nightPx) return 0; + const x = ((lon + 180) / 360) * 1024, y = ((90 - lat) / 180) * 512; + const x0 = Math.floor(x), y0 = Math.floor(y), fx = x - x0, fy = y - y0; + const s = (i, j) => { i = ((i % 1024) + 1024) % 1024; j = clamp(j, 0, 511); const o = (j * 1024 + i) * 4; return Math.max(0, (W.nightPx[o + 1] * 1.1 - W.nightPx[o + 2] * 0.55) / 255); }; + return lerp(lerp(s(x0, y0), s(x0 + 1, y0), fx), lerp(s(x0, y0 + 1), s(x0 + 1, y0 + 1), fx), fy); +}; +W.waterAt = function (lat, lon) { if (!W.waterPx) return 0; const x = Math.floor(((lon + 180) / 360) * 1024) % 1024, y = clamp(Math.floor(((90 - lat) / 180) * 512), 0, 511); return W.waterPx[(y * 1024 + x) * 4] / 255; }; + +/* ---------- lens ---------- */ +W.lens = 'cinematic'; +const LENS = { cinematic: 0, clear: 1, night: 2, thermal: 3, nvg: 4 }; +W.setLens = (id) => { W.lens = id; bus.emit('lens', id); }; + +/* ---------- view helpers ---------- */ +// view: {eye, right, up, back, fovY, aspect, near, far, shiftX, shiftY, w, h} +W.matrices = function (view) { + const P = m4.persp(view.fovY, view.aspect, view.near, view.far); + P[8] = -(view.shiftX || 0); P[9] = -(view.shiftY || 0); + const V = m4.viewRot(view.right, view.up, view.back); + view.P = P; view.V = V; view.VP = m4.mul(P, V); + return view; +}; +W.project = function (view, p) { // world unit coords → css px {x,y,z,vis} + const rel = v3.sub(p, view.eye); const c = m4.xform(view.VP, rel); + if (c[3] <= 0) return null; + const x = c[0] / c[3], y = c[1] / c[3]; + // occlusion by planet + const E = view.eye, d = rel, L2 = v3.len(d), u = v3.scale(d, 1 / L2), b = v3.dot(E, u), cc = v3.dot(E, E) - 0.9985 * 0.9985, disc = b * b - cc; + let occ = false; if (disc > 0) { const tn = -b - Math.sqrt(disc); occ = tn > 0 && tn < L2; } + return { x: (x * 0.5 + 0.5) * view.w, y: (1 - (y * 0.5 + 0.5)) * view.h, d: L2, vis: !occ && Math.abs(x) < 1.2 && Math.abs(y) < 1.2 }; +}; + +/* ---------- render ---------- */ +W.quality = { scale: 1, steps: 12, bloom: true, grain: true }; +const LOD = { cctv: 0.07, street: 0.03, alpr: 0.035, bikes: 0.04, streams: 0.4, signed: 0.6, venues: 0.9, power: 0.7, dc: 1.6, dams: 1.6, milbase: 1.6, airports: 1.3, ports: 1.4, imagery: 1.6, fishing: 2.2, radar: 1.6 }; +W.render = function (view, chain, outFb, opts = {}) { + const gl = GL.gl, PR = GL.progs; + W.matrices(view); + const sun = opts.sun || W.sun; + const sunDir = sun.dir; + const t = opts.t ?? W.t; + const eye = view.eye, eyeR = v3.len(eye), alt = eyeR - 1; + const eyeC = (eyeR - 1) * (eyeR + 1); + const eyeH = eye.map(Math.fround), eyeL = [eye[0] - eyeH[0], eye[1] - eyeH[1], eye[2] - eyeH[2]]; + const lensId = opts.lens || W.lens; const mode = LENS[lensId] ?? 0; + const range = view.range ?? alt; + const tanY = Math.tan(view.fovY / 2), tanX = tanY * view.aspect; + gl.bindFramebuffer(gl.FRAMEBUFFER, chain.scene.fb); + gl.viewport(0, 0, chain.w, chain.h); + gl.disable(gl.DEPTH_TEST); gl.disable(gl.BLEND); gl.depthMask(true); + gl.clearColor(0, 0, 0, 0); gl.clearDepth(1); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + // ---- globe + const G = PR.globe; gl.useProgram(G.p); + gl.uniform3fv(G.u.uCamR, view.right); gl.uniform3fv(G.u.uCamU, view.up); gl.uniform3fv(G.u.uCamB, view.back); + gl.uniform4f(G.u.uTanS, tanX, tanY, view.shiftX || 0, view.shiftY || 0); + gl.uniform3fv(G.u.uEye, eye); gl.uniform1f(G.u.uEyeC, eyeC); gl.uniform1f(G.u.uT, t); gl.uniform1f(G.u.uGmst, sun.gmst); + gl.uniform3fv(G.u.uSun, sunDir); gl.uniform1f(G.u.uSunI, 20.0); + const cloudsOn = W.on('clouds') ? 1 : 0; + gl.uniform4f(G.u.uLens, mode, mode === 2 ? 1 : opts.nightForce || 0, cloudsOn * (opts.cloudK ?? 1), mode === 1 ? 1 : 0); + // cyclone + const cyc = GE.CYCLONE.at(opts.offsetH ?? W.offsetH); const cv = geo.vec(cyc.lat, cyc.lon); + gl.uniform4f(G.u.uCyc, cv[0], cv[1], cv[2], 5.2 * D2R); + gl.uniform4f(G.u.uCycP, W.on('cyclones') ? clamp(cyc.wind / 190, 0.3, 1.0) : 0, (t / 3600) * 1.8, 0.16 * D2R, 0); + gl.uniform1f(G.u.uAurora, opts.aurora ?? W.auroraK); + // local detail frame + const sc = opts.scene || W.activeScene(view); + const org = sc ? sc : { lat: view.tLat ?? 0, lon: view.tLon ?? 0, block: 95, rot: 0.3, urban: 0 }; + const enu = geo.enu(org.lat, org.lon), ov = geo.vec(org.lat, org.lon); + const de = v3.sub(eye, ov); + const eyeLocal = [v3.dot(de, enu.east) * EARTH_M, v3.dot(de, enu.north) * EARTH_M, v3.dot(de, enu.up) * EARTH_M]; + gl.uniformMatrix3fv(G.u.uEnu, false, [...enu.east, ...enu.north, ...enu.up]); + gl.uniform3fv(G.u.uEyeLocal, eyeLocal); + const detail = smooth(0.012, 0.0025, range) * (opts.detail ?? 1); + gl.uniform4f(G.u.uCity, detail, org.block || 95, org.rot || 0, org.urban || 0); + gl.uniform1f(G.u.uRange, range); + gl.uniform1i(G.u.uSteps, opts.steps || W.quality.steps); + gl.uniform1f(G.u.uInside, eyeR < 1.0165 ? 1 : 0); + const fo = opts.focus; if (fo) { const fv = geo.vec(fo.lat, fo.lon); gl.uniform4f(G.u.uFocus, fv[0], fv[1], fv[2], fo.k ?? 0.8); } else gl.uniform4f(G.u.uFocus, 0, 0, 1, 0); + GL.bindTex(G, 'uDay', W.tex.day, 0); GL.bindTex(G, 'uNight', W.tex.night, 1); GL.bindTex(G, 'uClouds', W.tex.clouds, 2); GL.bindTex(G, 'uWater', W.tex.water, 3); GL.bindTex(G, 'uTopo', W.tex.topo, 4); + gl.uniform4fv(G.u.uLocalWater, sc && sc.water ? sc.water : [0, 0, 0, 0]); + gl.uniform1f(G.u.uTraffic, W.on('traffic') ? 1 : 0); + GL.fsq(G); + // ---- meshes + gl.enable(gl.DEPTH_TEST); gl.depthFunc(gl.LEQUAL); + if (sc && sc.mesh && range < 0.03) GE.scenes.draw(sc, view, { sun, t, eye, opts }); + // ---- lines & sprites (additive) + gl.depthMask(false); gl.enable(gl.BLEND); gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE); + const altX = lerp(1, 16, smooth(0.008, 1.3, range)); W.altX = altX; + const sizeK = opts.sizeK ?? clamp(lerp(0.5, 1.1, smooth(2.2, 0.05, range)), 0.4, 1.3); W.sizeK = sizeK; W.lastRange = range; + const px = (opts.pxScale ?? 1) * (chain.w / view.w); + const occR = 1 - clamp(alt * 0.004, 2e-7, 0.0015); + const common = (P, alphaK = 1) => { + gl.useProgram(P.p); + gl.uniformMatrix4fv(P.u.uVP, false, view.VP); gl.uniform3fv(P.u.uEyeH, eyeH); gl.uniform3fv(P.u.uEyeL, eyeL); + gl.uniform1f(P.u.uEyeC, eyeC); gl.uniform1f(P.u.uOccR, occR); gl.uniform1f(P.u.uT, t); + if (P.u.uPx) gl.uniform1f(P.u.uPx, px); if (P.u.uAltX) gl.uniform1f(P.u.uAltX, altX); if (P.u.uSizeK) gl.uniform1f(P.u.uSizeK, sizeK); + if (P.u.uGmst) gl.uniform1f(P.u.uGmst, sun.gmst); if (P.u.uView) gl.uniform2f(P.u.uView, view.w, view.h); if (P.u.uSun) gl.uniform3fv(P.u.uSun, sunDir); + if (P.u.uMinSize) gl.uniform1f(P.u.uMinSize, 1.3); if (P.u.uGlyphPx) gl.uniform1f(P.u.uGlyphPx, range > 0.55 ? 9999 : 6 * px); if (P.u.uAlphaK) gl.uniform1f(P.u.uAlphaK, alphaK); if (P.u.uPass) gl.uniform1f(P.u.uPass, 0); + }; + const lineK = opts.lineK ?? 1; + const LP = PR.line; common(LP, lineK); gl.uniform1f(LP.u.uDashK, 1 / Math.max(range * 0.012, 2e-6)); + for (const id in W.static) if (W.on(id) && range < (LOD[id] || 99) && !(id === 'ais' && range > 1.0)) for (const s of W.static[id]) if (s.kind === 'line') { gl.bindVertexArray(s.vao); gl.drawArrays(gl.LINES, 0, s.count); } + if (W.dynLineVao && W.dynLineCount) { gl.bindVertexArray(W.dynLineVao); gl.drawArrays(gl.LINES, 0, W.dynLineCount); } + if (opts.extraLines) for (const s of opts.extraLines) { gl.bindVertexArray(s.vao); gl.drawArrays(gl.LINES, 0, s.count); } + // trails + const kindMask = [W.on('flights') ? 1 : 0, W.on('military') ? 1 : 0, 0, W.on('ga') ? 1 : 0]; + const trailLen = range < 0.02 ? 240 : range < 0.2 ? 900 : 1500; + if ((kindMask[0] || kindMask[1] || kindMask[3]) && opts.trails !== false) { + const TP = PR.trail; common(TP, (range > 1.4 ? 0.22 : 0.4) * lineK); gl.uniform4fv(TP.u.uKindMask, kindMask); gl.uniform1f(TP.u.uTrail, 1); gl.uniform1f(TP.u.uTrailLen, trailLen); gl.uniform1f(TP.u.uSelId, W.selFlight ?? -1); + gl.uniform4f(TP.u.uKindSize, 9, 10, 10, 7); + gl.bindVertexArray(W.trailVao); gl.drawArraysInstanced(gl.LINE_STRIP, 0, W.trailK, W.nFlights); + } + // static sprite sets + const SP = PR.sprite; common(SP); + for (const id in W.static) if (W.on(id) && range < (LOD[id] || 99)) for (const s of W.static[id]) if (s.kind === 'sprite' && s.pass === 'add') { gl.bindVertexArray(s.vao); gl.drawArrays(gl.POINTS, 0, s.count); } + if (W.dynVao && W.dynCount) { gl.bindVertexArray(W.dynVao); gl.drawArrays(gl.POINTS, 0, W.dynCount); } + if (opts.extraSprites) for (const s of opts.extraSprites) { gl.bindVertexArray(s.vao); gl.drawArrays(gl.POINTS, 0, s.count); } + // flights + if (kindMask[0] || kindMask[1] || kindMask[3]) { + const FP = PR.flight; common(FP); gl.uniform4fv(FP.u.uKindMask, kindMask); gl.uniform1f(FP.u.uTrail, 0); gl.uniform1f(FP.u.uTrailLen, 0); gl.uniform1f(FP.u.uSelId, W.selFlight ?? -1); + gl.uniform4f(FP.u.uKindSize, 13, 15, 14, 10); + gl.bindVertexArray(W.flightVao); gl.drawArraysInstanced(gl.POINTS, 0, 1, W.nFlights); + } + // satellites + const sm0 = [W.on('sats') ? 1 : 0, W.on('sats') ? 1 : 0, W.on('sats') ? 1 : 0, W.on('sats') ? 1 : 0], sm1 = [W.on('debris') ? 1 : 0, W.on('trains') ? 1 : 0, W.on('crewed') ? 1 : 0, 0]; + if (sm0[0] || sm1[0] || sm1[1] || sm1[2]) { + const AP2 = PR.sat; common(AP2, opts.satK ?? 1); gl.uniform4fv(AP2.u.uSatMask0, sm0); gl.uniform4fv(AP2.u.uSatMask1, sm1); gl.uniform1f(AP2.u.uSelId, W.selSat ?? -1); + gl.bindVertexArray(W.satVao); gl.drawArrays(gl.POINTS, 0, W.nSats); + } + // alpha pass (smoke, AQ, radar, GNSS, cone) + gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE); + common(SP); gl.uniform1f(SP.u.uPass, 1); + for (const id in W.static) if (W.on(id) && range < (LOD[id] || 99)) for (const s of W.static[id]) if (s.kind === 'sprite' && s.pass === 'alpha') { gl.bindVertexArray(s.vao); gl.drawArrays(gl.POINTS, 0, s.count); } + if (W.alphaVao && W.alphaCount) { gl.bindVertexArray(W.alphaVao); gl.drawArrays(gl.POINTS, 0, W.alphaCount); } + gl.disable(gl.BLEND); gl.disable(gl.DEPTH_TEST); gl.depthMask(true); + gl.bindVertexArray(null); + // ---- post + W.post(chain, outFb, opts.outW ?? view.w, opts.outH ?? view.h, mode, opts); +}; +W.post = function (chain, outFb, outW, outH, mode, opts) { + const gl = GL.gl, PR = GL.progs, lv = chain.lv; + const bloomOn = (opts.bloom ?? W.quality.bloom) && mode !== 1; + if (bloomOn) { + const B = PR.bright; gl.useProgram(B.p); + gl.bindFramebuffer(gl.FRAMEBUFFER, lv[0].a.fb); gl.viewport(0, 0, lv[0].a.w, lv[0].a.h); + GL.bindTex(B, 'uSrc', chain.scene.tex, 0); gl.uniform2f(B.u.uTexel, 0.5 / chain.w, 0.5 / chain.h); gl.uniform1f(B.u.uThr, mode === 4 ? 1.2 : 3.2); GL.fsq(B); + const Dn = PR.down; + for (let i = 1; i < 4; i++) { gl.useProgram(Dn.p); gl.bindFramebuffer(gl.FRAMEBUFFER, lv[i].a.fb); gl.viewport(0, 0, lv[i].a.w, lv[i].a.h); GL.bindTex(Dn, 'uSrc', lv[i - 1].a.tex, 0); gl.uniform2f(Dn.u.uTexel, 1 / lv[i - 1].a.w, 1 / lv[i - 1].a.h); GL.fsq(Dn); } + const Up = PR.up; + for (let i = 2; i >= 0; i--) { gl.useProgram(Up.p); gl.bindFramebuffer(gl.FRAMEBUFFER, lv[i].b.fb); gl.viewport(0, 0, lv[i].b.w, lv[i].b.h); const src = i === 2 ? lv[3].a : lv[i + 1].b; GL.bindTex(Up, 'uSrc', src.tex, 0); GL.bindTex(Up, 'uBase', lv[i].a.tex, 1); gl.uniform2f(Up.u.uTexel, 1 / src.w, 1 / src.h); gl.uniform1f(Up.u.uMix, 1.0); GL.fsq(Up); } + } + const Cp = PR.comp; gl.useProgram(Cp.p); + gl.bindFramebuffer(gl.FRAMEBUFFER, outFb); + gl.viewport(0, 0, opts.vpW ?? (outFb ? outW : gl.drawingBufferWidth), opts.vpH ?? (outFb ? outH : gl.drawingBufferHeight)); + GL.bindTex(Cp, 'uScene', chain.scene.tex, 0); GL.bindTex(Cp, 'uBloom', bloomOn ? lv[0].b.tex : lv[0].a.tex, 1); + gl.uniform2f(Cp.u.uTexel, 1 / chain.w, 1 / chain.h); + gl.uniform1f(Cp.u.uExposure, (opts.exposure ?? 1) * (mode === 2 ? 1.25 : 0.62)); + gl.uniform1f(Cp.u.uBloomK, bloomOn ? (mode === 4 ? 0.3 : 0.16) : 0); + gl.uniform1f(Cp.u.uVig, opts.vig ?? (mode === 1 ? 0.25 : 0.9)); + gl.uniform1f(Cp.u.uGrain, (opts.grain ?? W.quality.grain) && mode !== 1 ? 0.022 : 0); + gl.uniform1f(Cp.u.uT, performance.now() / 1000 % 100); + gl.uniform1f(Cp.u.uFade, opts.fade ?? 1); + gl.uniform1f(Cp.u.uFxaa, 1); + gl.uniform1f(Cp.u.uSat, mode === 1 ? 1.0 : 1.08); + gl.uniform1i(Cp.u.uMode, mode); + gl.uniform3fv(Cp.u.uLift, [0.00017, 0.00038, 0.001]); + gl.uniform3fv(Cp.u.uGain, mode === 0 ? [1.02, 1.0, 0.97] : [1, 1, 1]); + GL.fsq(Cp); +}; + +/* ---------- active local scene (city / terrain) ---------- */ +W.activeScene = function (view) { + if (!GE.scenes) return null; + const range = view.range ?? 1; if (range > 0.03) return null; + const [la, lo] = view.tLat != null ? [view.tLat, view.tLon] : geo.ll(view.eye); + let best = null, bd = 1e9; + for (const s of GE.scenes.list) { const d = geo.dist(la, lo, s.lat, s.lon) * EARTH_KM; if (d < s.radiusKm && d < bd) { bd = d; best = s; } } + if (best) GE.scenes.ensure(best); + return best; +}; + +/* ---------- picking (CPU) ---------- */ +W.pick = function (view, x, y, radius = 26) { + const cands = []; + const consider = (p, item) => { const s = W.project(view, p); if (!s || !s.vis) return; const d = Math.hypot(s.x - x, s.y - y); if (d < radius) cands.push({ d: d - (item.prio || 0), ...item }); }; + const t = W.t; + for (const p of W.situationPins) consider(geo.vec(p.lat, p.lon, 0.2), { kind: 'situation', id: p.id, title: p.title, prio: 10, lat: p.lat, lon: p.lon }); + if (W.on('flights') || W.on('military') || W.on('ga')) GE.FLIGHTS.forEach((f, i) => { + if ((f.kind === 0 && !W.on('flights')) || (f.kind === 1 && !W.on('military')) || (f.kind === 3 && !W.on('ga'))) return; + const p = flightAt(f, t); if (!p) return; + consider(v3.scale(p.v, 1 + (p.altKm * W.altX) / EARTH_KM), { kind: 'flight', id: i, title: f.cs, subtitle: `${f.type} · ${p.from.iata} → ${p.to.iata}`, lat: p.lat, lon: p.lon, altKm: p.altKm, hdg: p.hdg, meta: { from: p.from, to: p.to, f, prog: p.prog }, prio: 2 }); + }); + if (W.on('helis')) HELI_CIRCUITS.forEach((hc, i) => { const p = heliAt(hc, t); consider(p.v, { kind: 'heli', id: i, title: hc.cs, subtitle: `${hc.type} · ${hc.field || 'orbit'} · ${Math.round(p.altKm * 3281)} ft`, lat: p.lat, lon: p.lon, altKm: p.altKm, hdg: p.hdg, prio: 4 }); }); + if (W.on('ais') && W._shipCache) GE.SHIPS.forEach((s, i) => { const p = W._shipCache[i]; if (!p) return; consider(geo.vec(p.lat, p.lon, 0.03), { kind: 'ship', id: i, title: s.name, subtitle: `${s.kind} · ${p.sog ? p.sog.toFixed(1) + ' kn' : 'at anchor'} · MMSI ${s.mmsi}`, lat: p.lat, lon: p.lon, hdg: p.hdg }); }); + if (W.on('crewed')) [GE.ISS, GE.CSS].forEach((s) => { const p = satAt(s, t, W.sun.gmst); const [la, lo] = geo.ll(p); consider(p, { kind: 'sat', id: GE.SATS.indexOf(s), title: s.name, subtitle: `${Math.round(s.alt)} km · ${(Math.sqrt(398600.4418 / (6371 + s.alt))).toFixed(2)} km/s`, lat: la, lon: lo, prio: 6 }); }); + if (W.on('quakes')) GE.QUAKES.forEach((q, i) => { if (q.t > t) return; consider(geo.vec(q.lat, q.lon, 0.5), { kind: 'quake', id: i, title: `M ${q.mag.toFixed(1)}`, subtitle: `${q.depth} km deep · ${fmt.ago(-q.t * 1000 + W.offsetH * 3600000)}`, lat: q.lat, lon: q.lon, prio: q.mag }); }); + if (W.on('holo') || W.on('signed')) HOLOS.forEach((hh, i) => consider(geo.vec(hh.lat, hh.lon, 0.2), { kind: 'holo', id: i, title: hh.title, subtitle: `Signed capture · @${hh.by} · illustrative`, lat: hh.lat, lon: hh.lon, prio: 5 })); + cands.sort((a, b) => a.d - b.d); + return cands[0] || null; +}; +W.contactsNear = function (lat, lon, km) { + const out = [], t = W.t; + GE.FLIGHTS.forEach((f, i) => { const p = flightAt(f, t); if (!p) return; const d = geo.dist(lat, lon, p.lat, p.lon) * EARTH_KM; if (d < km) out.push({ kind: 'flight', id: i, title: f.cs, sub: f.type, lat: p.lat, lon: p.lon, altM: p.altKm * 1000, headingDeg: p.hdg * R2D, d }); }); + [GE.ISS, GE.CSS].forEach((s) => { const p = satAt(s, t, W.sun.gmst); const [la, lo, al] = geo.ll(p); const d = geo.dist(lat, lon, la, lo) * EARTH_KM; if (d < 2200) out.push({ kind: 'sat', title: s.name, sub: Math.round(al) + ' km', lat: la, lon: lo, altM: al * 1000, d }); }); + return out.sort((a, b) => a.d - b.d); +}; +W.auroraK = 0.85; +Object.assign(W, { heliAt, holdAt, droneAt, runnerAt, HOLDERS, RUN_V }); diff --git a/mobile/vision/src/js/35-scenes.js b/mobile/vision/src/js/35-scenes.js new file mode 100644 index 000000000..e74a232b3 --- /dev/null +++ b/mobile/vision/src/js/35-scenes.js @@ -0,0 +1,240 @@ +/* Local 3D scenes for the low-altitude "photoreal city" treatment: procedural extruded city blocks + aligned with the globe shader's street grid, stadium bowl, airfields, launch pad, and a Himalayan + valley heightfield for the Bhote Koshi reconstruction (river carved along the real corridor). */ +const SC = (GE.scenes = {}); +const VSTR = 12; // pos3 nor3 uv2 attr4 +SC.list = [ + { id: 'nyc', name: 'Midtown Manhattan', lat: 40.7549, lon: -73.9840, block: 88, rot: 29 * D2R, urban: 0.55, radiusKm: 16, kind: 'city', R: 3000, maxH: 240, tower: { lat: 40.7553, lon: -73.9838, h: 412, w: 46 } }, + { id: 'chi', name: 'Chicago Loop', lat: 41.8789, lon: -87.6359, block: 100, rot: 0, urban: 0.45, radiusKm: 18, kind: 'city', R: 2600, maxH: 260, water: [0.94, 0.342, 1824, 1], downtown: [41.8807, -87.6293] }, + { id: 'wembley', name: 'Wembley', lat: 51.5560, lon: -0.2796, block: 74, rot: 0.21, urban: 0.25, radiusKm: 10, kind: 'stadium', R: 1500, maxH: 40 }, + { id: 'novosel', name: 'Cairns Army Airfield', lat: 31.2760, lon: -85.7130, block: 140, rot: 0.06, urban: -0.2, radiusKm: 28, kind: 'airfield', R: 0 }, + { id: 'koshi', name: 'Bhote Koshi corridor', lat: 28.2150, lon: 85.3450, block: 100, rot: 0, urban: -1, radiusKm: 32, kind: 'terrain', R: 0 }, + { id: 'cape', name: 'SLC-40', lat: 28.5618, lon: -80.5772, block: 120, rot: 0, urban: -0.5, radiusKm: 14, kind: 'pad', R: 0 }, + { id: 'drone', name: 'Drone corridor', lat: 30.5880, lon: -96.2900, block: 62, rot: 0.12, urban: 0.3, radiusKm: 12, kind: 'suburb', R: 2200, maxH: 9 }, + { id: 'atl', name: 'ATL', lat: 33.6407, lon: -84.4277, block: 120, rot: 0, urban: 0.0, radiusKm: 10, kind: 'airport', R: 0 }, +]; +SC.byId = Object.fromEntries(SC.list.map((s) => [s.id, s])); +// Bhote Koshi corridor (approximate public geography): Rasuwagadhi → Timure → Syaphrubesi → Trishuli +const KOSHI = [[28.2860, 85.3815], [28.2802, 85.3797], [28.2700, 85.3752], [28.2555, 85.3705], [28.2400, 85.3650], [28.2250, 85.3600], [28.2100, 85.3550], [28.1950, 85.3500], [28.1800, 85.3460], [28.1660, 85.3420], [28.1600, 85.3380], [28.1500, 85.3230], [28.1400, 85.3060], [28.1300, 85.2900]]; +SC.KOSHI = KOSHI; +SC.FLOOD = { startMs: Date.UTC(2026, 7, 26, 7, 45), speedMH: 18000, crest: 9 }; + +function Mesh() { this.v = []; this.i = []; } +Mesh.prototype.vert = function (p, n, uv, at) { this.v.push(p[0], p[1], p[2], n[0], n[1], n[2], uv[0], uv[1], at[0], at[1], at[2], at[3]); return this.v.length / VSTR - 1; }; +Mesh.prototype.quad = function (a, b, c, d, n, uvs, at) { const i0 = this.vert(a, n, uvs[0], at), i1 = this.vert(b, n, uvs[1], at), i2 = this.vert(c, n, uvs[2], at), i3 = this.vert(d, n, uvs[3], at); this.i.push(i0, i1, i2, i0, i2, i3); }; +// oriented box: center (x,y) in ENU m, size w×d, height h from z0, rotation rot +Mesh.prototype.box = function (x, y, w, d, h, rot, at, z0 = 0) { + if (at[0] === 4) at = [4, at[1], at[2], d]; + const c = Math.cos(rot), s = Math.sin(rot); + const P = (u, v) => [x + u * c - v * s, y + u * s + v * c]; + const pts = [P(-w / 2, -d / 2), P(w / 2, -d / 2), P(w / 2, d / 2), P(-w / 2, d / 2)]; + const z1 = z0 + h; + for (let k = 0; k < 4; k++) { + const a = pts[k], b = pts[(k + 1) % 4]; + const ex = b[0] - a[0], ey = b[1] - a[1], L = Math.hypot(ex, ey); + const n = [ey / L, -ex / L, 0]; + this.quad([a[0], a[1], z0], [b[0], b[1], z0], [b[0], b[1], z1], [a[0], a[1], z1], n, [[0, 0], [L, 0], [L, h], [0, h]], at); + } + this.quad([pts[0][0], pts[0][1], z1], [pts[1][0], pts[1][1], z1], [pts[2][0], pts[2][1], z1], [pts[3][0], pts[3][1], z1], [0, 0, 1], [[0, 0], [w, 0], [w, d], [0, d]], at); +}; + +const enuOf = (sc, lat, lon) => { const e = geo.enu(sc.lat, sc.lon); const d = v3.sub(geo.vec(lat, lon), geo.vec(sc.lat, sc.lon)); return [v3.dot(d, e.east) * EARTH_M, v3.dot(d, e.north) * EARTH_M]; }; +SC.enuOf = enuOf; +const llOf = (sc, x, y) => geo.offset(sc.lat, sc.lon, x, y); + +function genCity(sc, M, R0) { + const B = sc.block, c = Math.cos(sc.rot), s = Math.sin(sc.rot); + const rr = rng(sc.id.length * 991 + 7); + const R = sc.R, n = Math.ceil(R / B) + 1; + const dt = sc.downtown ? enuOf(sc, sc.downtown[0], sc.downtown[1]) : [0, 0]; + const twr = sc.tower ? enuOf(sc, sc.tower.lat, sc.tower.lon) : null; + const hsh = (i, j) => hash01(i * 157.31 + j * 311.7 + sc.id.length); + for (let i = -n; i < n; i++) for (let j = -n; j < n; j++) { + const pcx = (i + 0.5) * B, pcy = (j + 0.5) * B; + const qx = c * pcx - s * pcy, qy = s * pcx + c * pcy; + const rd = Math.hypot(qx, qy); if (rd > R) continue; + if (sc.water && qx * sc.water[0] + qy * sc.water[1] > sc.water[2] - 40) continue; + if (sc.kind === 'stadium' && Math.hypot(qx, qy) < 280) continue; + if (twr && Math.hypot(qx - twr[0], qy - twr[1]) < 40) continue; + const [la, lo] = llOf(sc, qx, qy); + if (GE.world.waterAt(la, lo) > 0.6 && !sc.water) continue; + const dens = clamp(GE.world.lightsAt(la, lo) * 0.9 + sc.urban, 0, 1) * smooth(R, R * 0.6, rd); + if (hsh(i, j) > dens * 1.25 + 0.05) continue; + const rw = (0.085 + ((((i % 5) + 5) % 5) === 4 ? 0.05 : 0)) * B + 3; + const inner = B - 2 * rw; + const kx = inner > 50 && rr() < 0.6 ? 2 : 1, ky = inner > 50 && rr() < 0.6 ? 2 : 1; + const ddt = Math.hypot(qx - dt[0], qy - dt[1]); + for (let a = 0; a < kx; a++) for (let b = 0; b < ky; b++) { + const lw = inner / kx, ld = inner / ky; + const lpx = i * B + rw + lw * (a + 0.5), lpy = j * B + rw + ld * (b + 0.5); + const x = c * lpx - s * lpy, y = s * lpx + c * lpy; + const hh = hash01(lpx * 0.37 + lpy * 0.71); + const core = Math.exp(-ddt / (sc.R * 0.28)); + let h = sc.kind === 'suburb' ? 5 + hh * 4 : 9 + Math.pow(dens, 1.6) * (sc.maxH * (0.15 + 0.85 * core)) * Math.exp(rr.gauss() * 0.45); + h = clamp(h, 6, sc.maxH * 1.4); + const inset = 2 + hh * 3; + const type = sc.kind === 'suburb' ? 6 : 0; + M.box(x, y, lw - inset * 2, ld - inset * 2, h, sc.rot, [type, hh, h, 0]); + if (type === 0 && h > 60 && hh > 0.5) M.box(x, y, (lw - inset * 2) * 0.6, (ld - inset * 2) * 0.6, h * 0.25, sc.rot, [0, hh, h * 1.25, 0], h); + } + } + if (twr) { // the fictional tower (skyscraper climb reconstruction) + const T = sc.tower; M.box(twr[0], twr[1], T.w, T.w, T.h * 0.62, sc.rot, [0, 0.8, T.h, 0]); M.box(twr[0], twr[1], T.w * 0.72, T.w * 0.72, T.h * 0.3, sc.rot, [0, 0.8, T.h, 0], T.h * 0.62); M.box(twr[0], twr[1], 3, 3, T.h * 0.08, sc.rot, [5, 0.5, T.h, 0], T.h * 0.92); + } +} +function genStadium(sc, M) { + const N = 72; const rings = [[64, 46, 4], [92, 74, 20], [128, 108, 44]]; + for (let k = 0; k < N; k++) { + const a0 = (k / N) * TAU, a1 = ((k + 1) / N) * TAU; + for (let r = 0; r < rings.length - 1; r++) { + const [ax, ay, az] = rings[r], [bx, by, bz] = rings[r + 1]; + const p = (A, ex, ey, ez) => [Math.cos(A) * ex, Math.sin(A) * ey, ez]; + const p0 = p(a0, ax, ay, az), p1 = p(a1, ax, ay, az), p2 = p(a1, bx, by, bz), p3 = p(a0, bx, by, bz); + const e1 = v3.sub(p1, p0), e2 = v3.sub(p3, p0); const n = v3.norm(v3.cross(e1, e2)); + M.quad(p0, p1, p2, p3, n[2] < 0 ? v3.scale(n, -1) : n, [[k * 4, r * 20], [k * 4 + 4, r * 20], [k * 4 + 4, r * 20 + 20], [k * 4, r * 20 + 20]], [3, 0.5, 40, 0]); + } + // outer facade + const [ox, oy] = [134, 114]; const o0 = [Math.cos(a0) * ox, Math.sin(a0) * oy], o1 = [Math.cos(a1) * ox, Math.sin(a1) * oy]; + const L = Math.hypot(o1[0] - o0[0], o1[1] - o0[1]); const nn = v3.norm([o0[0] + o1[0], o0[1] + o1[1], 0]); + M.quad([o0[0], o0[1], 0], [o1[0], o1[1], 0], [o1[0], o1[1], 50], [o0[0], o0[1], 50], nn, [[0, 0], [L, 0], [L, 50], [0, 50]], [0, 0.75, 50, 0]); + // roof ring + const r0 = [Math.cos(a0) * 104, Math.sin(a0) * 86], r1 = [Math.cos(a1) * 104, Math.sin(a1) * 86]; + M.quad([r0[0], r0[1], 52], [r1[0], r1[1], 52], [o1[0] * 1.02, o1[1] * 1.02, 52], [o0[0] * 1.02, o0[1] * 1.02, 52], [0, 0, 1], [[0, 0], [1, 0], [1, 1], [0, 1]], [0, 0.6, 52, 0]); + } + M.quad([-55, -36, 0.6], [55, -36, 0.6], [55, 36, 0.6], [-55, 36, 0.6], [0, 0, 1], [[0, 0], [110, 0], [110, 72], [0, 72]], [4, 1, 0, 0]); + M.box(-40, 0, 14, 30, 13, 0, [5, 0.5, 13, 0], 0.6); + for (let k = 0; k < 6; k++) M.box(-40, -12 + k * 5, 1.2, 1.2, 22, 0, [5, 0.5, 22, 0], 13); +} +function genAirfield(sc, M) { + const rw = (x, y, L, W, rot) => M.box(x, y, L, W, 0.4, rot, [4, 0, 0.4, 0]); + rw(0, 0, 1550, 46, 0.06); rw(150, 100, 1500, 46, 0.06 + 1.1); rw(-300, -420, 900, 30, 0.06 + Math.PI / 2); + for (let i = 0; i < 26; i++) { const x = -600 + (i % 13) * 95, y = 260 + Math.floor(i / 13) * 70; M.box(x, y, 28, 28, 0.35, 0.06, [4, 0, 0.3, 0]); } + for (let i = 0; i < 6; i++) M.box(-500 + i * 120, 420, 80, 48, 14, 0.06, [0, 0.4 + i * 0.05, 14, 0]); + M.box(260, -180, 14, 14, 26, 0.06, [0, 0.9, 26, 0]); + // stagefields + for (const [la, lo] of [[31.36, -85.63], [31.20, -85.81], [31.42, -85.79]]) { const [x, y] = enuOf(sc, la, lo); M.box(x, y, 700, 40, 0.4, 0.4, [4, 0, 0.4, 0]); for (let k = 0; k < 6; k++) M.box(x - 250 + k * 100, y + 80, 26, 26, 0.35, 0.4, [4, 0, 0.3, 0]); } +} +function genPad(sc, M) { + M.box(0, 0, 220, 160, 0.5, 0, [4, 0, 0.5, 0]); + M.box(-14, 0, 12, 12, 88, 0, [0, 0.55, 88, 0]); + M.box(4, 0, 4.2, 4.2, 70, 0, [0, 0.98, 70, 0]); + M.box(4, 0, 4.4, 4.4, 2, 0, [5, 0.5, 2, 0], 70); + for (const [x, y, w, d, h] of [[300, 180, 60, 40, 22], [-260, 220, 90, 30, 12], [400, -260, 30, 30, 14]]) M.box(x, y, w, d, h, 0, [0, 0.4, h, 0]); +} +function genAirport(sc, M) { + const rw = [[-1000, 1200, 3700], [-1100, 950, 2700], [-900, -300, 2700], [-1000, -560, 3000], [-1150, -1200, 2900]]; + for (const [x, y, L] of rw) M.box(x + L / 2 - 1000, y, L, 46, 0.4, 0, [4, 0, 0.4, 0]); + for (let k = 0; k < 7; k++) M.box(-1100 + k * 420, 330, 46, 620, 16, 0, [0, 0.35, 16, 0]); + M.box(-1500, 330, 260, 220, 22, 0, [0, 0.6, 22, 0]); + M.box(1400, 1400, 14, 14, 70, 0, [0, 0.9, 70, 0]); +} +// Bhote Koshi valley heightfield +function koshiRiverXY(sc) { return KOSHI.map(([la, lo]) => enuOf(sc, la, lo)); } +function genTerrain(sc, M) { + const riv = koshiRiverXY(sc); + const cum = [0]; for (let i = 1; i < riv.length; i++) cum.push(cum[i - 1] + Math.hypot(riv[i][0] - riv[i - 1][0], riv[i][1] - riv[i - 1][1])); + sc.riverLen = cum[cum.length - 1]; + const nearest = (x, y) => { let bd = 1e12, bs = 0; for (let i = 1; i < riv.length; i++) { const [ax, ay] = riv[i - 1], [bx, by] = riv[i]; const ex = bx - ax, ey = by - ay; const L2 = ex * ex + ey * ey; const t = clamp(((x - ax) * ex + (y - ay) * ey) / L2, 0, 1); const px = ax + ex * t - x, py = ay + ey * t - y; const d = px * px + py * py; if (d < bd) { bd = d; bs = cum[i - 1] + t * Math.sqrt(L2); } } return [Math.sqrt(bd), bs]; }; + const bed = (s) => 1880 - s * 0.021; + const ridged = (x, y) => { let a = 0.5, f = 1 / 5200, sum = 0; for (let o = 0; o < 6; o++) { const n = 1 - Math.abs(vn2(x * f + o * 13.1, y * f + o * 7.7) * 2 - 1); sum += n * n * a; a *= 0.5; f *= 2.05; } return sum; }; + const height = (x, y) => { + const [d, s] = nearest(x, y); + const base = 1750 + ridged(x, y) * 2900 + y * 0.03 + Math.max(0, x) * 0.035; + const b = bed(s); + const k = Math.pow(clamp(d / 2600, 0, 1), 0.72); + return [b + (base - b) * k + Math.min(d, 60) * 0.05, d, s]; + }; + sc.height = (x, y) => height(x, y)[0]; + const N = 180, HALF = 19000; const step = (2 * HALF) / N; + const H = new Float32Array((N + 1) * (N + 1)), Dd = new Float32Array((N + 1) * (N + 1)), Ss = new Float32Array((N + 1) * (N + 1)); + for (let j = 0; j <= N; j++) for (let i = 0; i <= N; i++) { const x = -HALF + i * step, y = -HALF + j * step; const [h, d, s] = height(x, y); const k = j * (N + 1) + i; H[k] = h; Dd[k] = d; Ss[k] = s; } + const base = M.v.length / VSTR; + for (let j = 0; j <= N; j++) for (let i = 0; i <= N; i++) { + const k = j * (N + 1) + i; const x = -HALF + i * step, y = -HALF + j * step; + const hl = H[j * (N + 1) + Math.max(0, i - 1)], hr = H[j * (N + 1) + Math.min(N, i + 1)], hd = H[Math.max(0, j - 1) * (N + 1) + i], hu = H[Math.min(N, j + 1) * (N + 1) + i]; + const n = v3.norm([(hl - hr) / (2 * step), (hd - hu) / (2 * step), 1]); + const edge = Math.min(i, j, N - i, N - j); const z = edge === 0 ? 0 : H[k]; + M.vert([x, y, z], n, [Ss[k], 0], [1, hash01(k), H[k], smooth(260, 40, Dd[k])]); + } + for (let j = 0; j < N; j++) for (let i = 0; i < N; i++) { const a = base + j * (N + 1) + i, b = a + 1, c = a + N + 1, d = c + 1; M.i.push(a, b, d, a, d, c); } + // river / flood water strip + const wbase = M.v.length / VSTR; const pts = []; + for (let s = 0; s <= sc.riverLen; s += 70) { let i = 1; while (i < cum.length - 1 && cum[i] < s) i++; const f = (s - cum[i - 1]) / (cum[i] - cum[i - 1]); const x = lerp(riv[i - 1][0], riv[i][0], f), y = lerp(riv[i - 1][1], riv[i][1], f); const tx = riv[i][0] - riv[i - 1][0], ty = riv[i][1] - riv[i - 1][1], tl = Math.hypot(tx, ty); pts.push([x, y, -ty / tl, tx / tl, s]); } + for (const [x, y, nx, ny, s] of pts) { const W2 = 210; const z = bed(s) + 4; M.vert([x - nx * W2, y - ny * W2, z], [0, 0, 1], [s, -1], [2, 0, 0, 0]); M.vert([x + nx * W2, y + ny * W2, z], [0, 0, 1], [s, 1], [2, 0, 0, 0]); } + for (let k = 0; k < pts.length - 1; k++) { const a = wbase + k * 2; M.i.push(a, a + 1, a + 3, a, a + 3, a + 2); } + // villages & bridge + const village = (la, lo, n, spread) => { const [cx, cy] = enuOf(sc, la, lo); const r = rng(Math.round(la * 1000)); for (let k = 0; k < n; k++) { const x = cx + r.gauss() * spread, y = cy + r.gauss() * spread; const z = sc.height(x, y); M.box(x, y, 7 + r() * 6, 8 + r() * 6, 5 + r() * 4, r() * 3, [6, r(), 6, 0], z - 1); } }; + village(28.1600, 85.3395, 70, 130); village(28.2560, 85.3690, 22, 80); village(28.2790, 85.3770, 14, 60); village(28.2050, 85.3520, 10, 60); + const [bx, by] = enuOf(sc, 28.2802, 85.3797); M.box(bx, by, 6, 120, 2.5, 0.6, [0, 0.9, 3, 0], bed(sc.riverLen * 0.03) + 18); + const [bx2, by2] = enuOf(sc, 28.1625, 85.3405); M.box(bx2, by2, 5, 110, 2.5, 1.0, [0, 0.9, 3, 0], bed(sc.riverLen * 0.83) + 16); + sc.riverPts = pts; sc.bed = bed; +} +function vn2(x, y) { const i = Math.floor(x), j = Math.floor(y), fx = x - i, fy = y - j; const u = fx * fx * (3 - 2 * fx), v = fy * fy * (3 - 2 * fy); const h = (a, b) => hash01(a * 12.9898 + b * 78.233); return lerp(lerp(h(i, j), h(i + 1, j), u), lerp(h(i, j + 1), h(i + 1, j + 1), u), v); } + +SC.ensure = function (sc) { + if (sc.mesh || sc.building) return; + sc.building = true; + const M = new Mesh(); + if (sc.kind === 'city' || sc.kind === 'suburb' || sc.kind === 'stadium') genCity(sc, M); + if (sc.kind === 'stadium') genStadium(sc, M); + if (sc.kind === 'airfield') genAirfield(sc, M); + if (sc.kind === 'pad') genPad(sc, M); + if (sc.kind === 'airport') genAirport(sc, M); + if (sc.kind === 'terrain') genTerrain(sc, M); + if (sc.kind === 'suburb') M.box(0, 0, 130, 60, 12, sc.rot, [0, 0.3, 12, 0]); + const gl = GL.gl, P = GL.progs.mesh; + const vb = GL.buffer(new Float32Array(M.v)); + const ib = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ib); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(M.i), gl.STATIC_DRAW); + sc.vao = GL.vao(P, { aPos: [vb, 3, VSTR, 0], aNor: [vb, 3, VSTR, 3], aUV: [vb, 2, VSTR, 6], aAttr: [vb, 4, VSTR, 8] }, ib); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); + sc.count = M.i.length; sc.mesh = true; sc.building = false; + sc.enu = geo.enu(sc.lat, sc.lon); sc.origin = geo.vec(sc.lat, sc.lon); +}; + +/* ---------- JS atmosphere (matches the shader) for mesh lighting & fog ---------- */ +const HR = 0.0021, HM = 0.0006, RA = 1.0165, BR = [22.1, 51.5, 126.3], BMk = 42.0; +function odH(r, mu, H) { const c = Math.sqrt(Math.PI * 0.5 * r / H), h = (r - 1) / H; if (mu >= 0) return H * Math.exp(-h) * c / (c * mu + 1); const r0 = r * Math.sqrt(Math.max(0, 1 - mu * mu)); if (r0 < 1) return 1e4; const h0 = (r0 - 1) / H, c0 = Math.sqrt(Math.PI * 0.5 * r0 / H); return H * (2 * Math.exp(-h0) * c0 - Math.exp(-h) * c / (-c * mu + 1)); } +function sunTransJS(x, sun) { const r = v3.len(x), mu = v3.dot(x, sun) / r; const oR = odH(r, mu, HR), oM = odH(r, mu, HM); return BR.map((b) => Math.exp(-(b * oR + BMk * 1.11 * oM))); } +function atmoJS(ro, rd, tEnd, sun, steps = 10) { + const b = v3.dot(ro, rd), c = v3.dot(ro, ro) - RA * RA, d = b * b - c; if (d < 0) return [0, 0, 0]; + const sq = Math.sqrt(d); const t0 = Math.max(-b - sq, 0), t1 = Math.min(-b + sq, tEnd); if (t1 <= t0) return [0, 0, 0]; + const mu = v3.dot(rd, sun), pR = (3 / (16 * Math.PI)) * (1 + mu * mu), g = 0.76, pM = (3 / (8 * Math.PI)) * ((1 - g * g) * (1 + mu * mu)) / ((2 + g * g) * Math.pow(1 + g * g - 2 * g * mu, 1.5)); + let sR = [0, 0, 0], sM = [0, 0, 0], oR = 0, oM = 0; const L = t1 - t0; + for (let i = 0; i < steps; i++) { const fa = i / steps, fb = (i + 1) / steps; const ta = fa * fa, tb = fb * fb; const ds = (tb - ta) * L; const t = t0 + (ta + tb) * 0.5 * L; const x = v3.madd(ro, rd, t); const r = v3.len(x), h = r - 1; const dR = Math.exp(-h / HR), dM = Math.exp(-h / HM); oR += dR * ds; oM += dM * ds; const muS = v3.dot(x, sun) / r; const lR = odH(r, muS, HR), lM = odH(r, muS, HM); for (let k = 0; k < 3; k++) { const att = Math.exp(-(BR[k] * (oR + lR) + BMk * 1.11 * (oM + lM))); sR[k] += dR * att * ds; sM[k] += dM * att * ds; } } + return [0, 1, 2].map((k) => 20 * (sR[k] * BR[k] * pR + sM[k] * BMk * pM)); +} +SC.atmoJS = atmoJS; SC.sunTransJS = sunTransJS; + +SC.draw = function (sc, view, { sun, t, eye, opts }) { + const gl = GL.gl, P = GL.progs.mesh; if (!sc.vao) return; + const e = sc.enu, o = sc.origin, R = EARTH_M; + const d = v3.sub(o, eye); + const M = [e.east[0] / R, e.east[1] / R, e.east[2] / R, 0, e.north[0] / R, e.north[1] / R, e.north[2] / R, 0, e.up[0] / R, e.up[1] / R, e.up[2] / R, 0, d[0], d[1], d[2], 1]; + const MVP = m4.mul(view.VP, M); + gl.useProgram(P.p); + gl.uniformMatrix4fv(P.u.uMVP, false, MVP); + const sd = sun.dir; const sunL = [v3.dot(sd, e.east), v3.dot(sd, e.north), v3.dot(sd, e.up)]; + gl.uniform3fv(P.u.uSunL, sunL); + const tr = sunTransJS(v3.scale(o, 1.0002), sd); + const k = 20 / Math.PI; const night = opts.nightForce ? 1 : 1 - smooth(-0.14, 0.06, sunL[2]); + const clear = (opts.lens || GE.world.lens) === 'clear'; + gl.uniform3fv(P.u.uSunCol, clear ? [2.2, 2.2, 2.2] : tr.map((x) => x * k * (opts.nightForce ? 0.03 : 1))); + const amb = smooth(-0.25, 0.5, sunL[2]); + gl.uniform3fv(P.u.uSkyCol, clear ? [1.2, 1.25, 1.35] : [0.03 * 20 / Math.PI * 1.6 * amb + 0.014, 0.045 * 20 / Math.PI * 1.6 * amb + 0.02, 0.085 * 20 / Math.PI * 1.6 * amb + 0.04]); + // fog colour: inscatter along the horizon in the camera's look direction + const fwd = v3.scale(view.back, -1); const fh = v3.norm(v3.madd(fwd, e.up, -v3.dot(fwd, e.up))); const ro = v3.madd(o, e.up, 0.0003); + let fog = atmoJS(ro, fh, 0.012, sd, 8); fog = fog.map((x) => x * 0.8 + 0.0015); + gl.uniform3fv(P.u.uFogCol, fog); + const el = [v3.dot(v3.scale(d, -1), e.east) * R, v3.dot(v3.scale(d, -1), e.north) * R, v3.dot(v3.scale(d, -1), e.up) * R]; + gl.uniform3fv(P.u.uEyeL, el); + gl.uniform1f(P.u.uNight, night); gl.uniform1f(P.u.uT, t); + gl.uniform1f(P.u.uVis, sc.kind === 'terrain' ? 110000 : 26000); + const fl = SC.FLOOD; const simMs = opts.simMs ?? GE.world.simMs; + gl.uniform4f(P.u.uFlood, (simMs - fl.startMs) / 3600000, 0, fl.speedMH, fl.crest); + gl.uniform1f(P.u.uClear, clear ? 1 : 0); + gl.bindVertexArray(sc.vao); + gl.drawElements(gl.TRIANGLES, sc.count, gl.UNSIGNED_INT, 0); + gl.bindVertexArray(null); +}; +// ground height (m) at lat/lon for scenes with terrain +SC.groundAt = function (lat, lon) { const sc = SC.byId.koshi; if (!sc.height) return 0; const [x, y] = enuOf(sc, lat, lon); return sc.height(x, y); }; diff --git a/mobile/vision/src/js/40-camera.js b/mobile/vision/src/js/40-camera.js new file mode 100644 index 000000000..330d3bfa1 --- /dev/null +++ b/mobile/vision/src/js/40-camera.js @@ -0,0 +1,189 @@ +/* Camera: orbit (target lat/lon, range, heading, tilt, lens shift) with touch/pinch/wheel and + inertia; fly-to along eased great-circle arcs with a log-space altitude hump (van Wijk-style); + free rigs (ride / look / narrative) with smooth hand-off. */ +const Cam = (GE.cam = { + lat: 18, lon: 40, range: 2.7, heading: 0, tilt: 0, shiftX: 0, shiftY: 0, fovMin: 40 * D2R, + anim: null, vel: null, rig: null, rigBlend: 0, rigFrom: null, minRange: 0.00007, maxRange: 6, + interacting: false, lastInput: 0, enabled: true, +}); +Cam.maxTilt = (r) => lerp(0.0, 1.32, smooth(1.4, 0.004, r)); +Cam.basis = function () { + const T = geo.vec(Cam.lat, Cam.lon, Cam.targetAltKm || 0); + const { east, north, up } = geo.enu(Cam.lat, Cam.lon); + const ch = Math.cos(Cam.heading), sh = Math.sin(Cam.heading); + const F = v3.add(v3.scale(north, ch), v3.scale(east, sh)); + const tilt = Math.min(Cam.tilt, Cam.maxTilt(Cam.range)); + const off = v3.norm(v3.add(v3.scale(up, Math.cos(tilt)), v3.scale(F, -Math.sin(tilt)))); + const eye = v3.madd(T, off, Cam.range); + const upv = v3.norm(v3.add(v3.scale(F, Math.cos(tilt)), v3.scale(up, Math.sin(tilt)))); + const back = off; const right = v3.norm(v3.cross(upv, back)); + return { eye, right, up: v3.cross(back, right), back, T }; +}; +function fovFor(w, h, fovMin) { const aspect = w / h; return aspect < 1 ? 2 * Math.atan(Math.tan(fovMin / 2) / aspect) : fovMin; } +Cam.view = function (w, h) { + let b = Cam.basis(); let fovMin = Cam.fovMin; let range = Cam.range; + if (Cam.rig) { + const r = Cam.rig.pose(); + const k = ease.inOut(clamp(Cam.rigBlend, 0, 1)); + const from = Cam.rigFrom || b; + const eye = v3.lerp(from.eye, r.eye, k); + const back = v3.norm(v3.lerp(from.back, r.back, k)); let up = v3.norm(v3.lerp(from.up, r.up, k)); + const right = v3.norm(v3.cross(up, back)); up = v3.cross(back, right); + b = { eye, right, up, back }; + fovMin = lerp(Cam.fovMin, r.fov || Cam.fovMin, k); + range = lerp(Cam.range, v3.len(eye) - 1, k); + } + const aspect = w / h, fovY = fovFor(w, h, fovMin); + const alt = Math.max(v3.len(b.eye) - 1, 1e-7); + const horizon = Math.sqrt(2 * alt + alt * alt); + const near = clamp(alt * 0.03, 1.2e-8, 0.3); + const far = Math.max(near * 20, Math.min(12, horizon * 1.3 + 0.004)); + const [tLat, tLon] = Cam.rig ? geo.ll(b.eye) : [Cam.lat, Cam.lon]; + return { eye: b.eye, right: b.right, up: b.up, back: b.back, fovY, aspect, near, far, shiftX: Cam.shiftX, shiftY: Cam.shiftY, w, h, range, tLat, tLon }; +}; +Cam.ray = function (view, x, y) { + const nx = (x / view.w) * 2 - 1, ny = 1 - (y / view.h) * 2; + const tY = Math.tan(view.fovY / 2), tX = tY * view.aspect; + return v3.norm(v3.add(v3.add(v3.scale(view.right, (nx - view.shiftX) * tX), v3.scale(view.up, (ny - view.shiftY) * tY)), v3.scale(view.back, -1))); +}; +Cam.groundAt = function (view, x, y) { + const rd = Cam.ray(view, x, y), ro = view.eye; const b = v3.dot(ro, rd), c = v3.dot(ro, ro) - 1, d = b * b - c; + if (d < 0 || b > 0) return null; const t = c / (-b + Math.sqrt(d)); return geo.ll(v3.madd(ro, rd, t)); +}; +Cam.snapshot = () => ({ lat: Cam.lat, lon: Cam.lon, range: Cam.range, heading: Cam.heading, tilt: Cam.tilt, shiftY: Cam.shiftY, shiftX: Cam.shiftX }); +Cam.set = (s) => { Object.assign(Cam, s); Cam.anim = null; Cam.vel = null; }; + +/* ---------- fly-to ---------- */ +const angDiff = (a, b) => { let d = (b - a) % TAU; if (d > Math.PI) d -= TAU; if (d < -Math.PI) d += TAU; return d; }; +Cam.flyTo = function (to, opts = {}) { + const from = Cam.snapshot(); + const tgt = { ...from, ...to }; + const dist = geo.dist(from.lat, from.lon, tgt.lat, tgt.lon); + let dur = opts.duration ?? clamp(1.1 + Math.abs(Math.log(tgt.range / from.range)) * 0.22 + dist * 0.55, 1.0, 3.4); + if (prefersReduced() || opts.instant) dur = 0; + const peak = Math.max(from.range, tgt.range, dist * 1.25); + Cam.vel = null; + return new Promise((res) => { + if (dur === 0) { Cam.set(tgt); res(); return; } + Cam.anim = { from, to: tgt, t: 0, dur, peak, hump: peak > Math.max(from.range, tgt.range) * 1.05, res, va: geo.vec(from.lat, from.lon), vb: geo.vec(tgt.lat, tgt.lon), dh: angDiff(from.heading, tgt.heading) }; + }); +}; +Cam.cancel = () => { if (Cam.anim) { const r = Cam.anim.res; Cam.anim = null; r && r(); } }; +Cam.update = function (dt) { + const A = Cam.anim; + if (A) { + A.t += dt; const u = clamp(A.t / A.dur, 0, 1); const e = ease.inOut(u); + const pe = A.hump ? ease.inOutSine(clamp((u - 0.08) / 0.84, 0, 1)) : e; + const p = geo.slerp(A.va, A.vb, pe); const [la, lo] = geo.ll(p); + Cam.lat = la; Cam.lon = lo; + const l0 = Math.log(A.from.range), l1 = Math.log(A.to.range), lm = Math.log(A.peak); + Cam.range = A.hump ? Math.exp((1 - e) * (1 - e) * l0 + 2 * (1 - e) * e * lm + e * e * l1) : Math.exp(lerp(l0, l1, e)); + Cam.heading = A.from.heading + A.dh * e; + const tiltMid = A.hump ? Math.sin(Math.PI * e) : 0; + Cam.tilt = lerp(A.from.tilt, A.to.tilt, e) * (1 - tiltMid * 0.85); + Cam.shiftY = lerp(A.from.shiftY, A.to.shiftY, e); Cam.shiftX = lerp(A.from.shiftX, A.to.shiftX, e); + if (u >= 1) { Cam.anim = null; Object.assign(Cam, { heading: A.to.heading, tilt: A.to.tilt, range: A.to.range, lat: A.to.lat, lon: A.to.lon }); A.res(); } + return true; + } + if (Cam.rig) { Cam.rigBlend = Math.min(1, Cam.rigBlend + dt / (Cam.rig.blendTime || 1.4)); return true; } + if (Cam.vel) { + const v = Cam.vel; const k = Math.exp(-dt * 3.2); + Cam.lat = clamp(Cam.lat + v.lat * dt, -86, 86); Cam.lon = ((Cam.lon + v.lon * dt + 540) % 360) - 180; Cam.heading += v.h * dt; + v.lat *= k; v.lon *= k; v.h *= k; + if (Math.abs(v.lat) + Math.abs(v.lon) + Math.abs(v.h) < 1e-4) Cam.vel = null; + return true; + } + if (Cam.autoSpin && !Cam.interacting && performance.now() - Cam.lastInput > 2500) { Cam.lon = ((Cam.lon + dt * Cam.autoSpin + 540) % 360) - 180; return true; } + return false; +}; +Cam.setRig = function (rig) { // rig.pose() → {eye, back, up, fov} + Cam.rigFrom = rig ? (Cam.rig ? Cam.view(400, 800) : Cam.basis()) : null; + if (rig) { Cam.anim = null; Cam.vel = null; } + Cam.rig = rig; Cam.rigBlend = prefersReduced() ? 1 : 0; +}; +// pose helper: eye at lat/lon/alt, looking along heading/pitch (rad), optional roll +Cam.pose = function (lat, lon, altKm, hdg, pitch, roll = 0, fov) { + const eye = geo.vec(lat, lon, altKm); const { east, north, up } = geo.enu(lat, lon); + const F0 = v3.add(v3.scale(north, Math.cos(hdg)), v3.scale(east, Math.sin(hdg))); + const fwd = v3.norm(v3.add(v3.scale(F0, Math.cos(pitch)), v3.scale(up, Math.sin(pitch)))); + let upv = v3.norm(v3.sub(up, v3.scale(fwd, v3.dot(up, fwd)))); + let right = v3.norm(v3.cross(fwd, upv)); + if (roll) { const c = Math.cos(roll), s = Math.sin(roll); const u2 = v3.add(v3.scale(upv, c), v3.scale(right, s)); right = v3.norm(v3.cross(fwd, u2)); upv = u2; } + return { eye, back: v3.scale(fwd, -1), up: upv, fov }; +}; + +/* ---------- input ---------- */ +Cam.attach = function (el, getView) { + const pts = new Map(); let last = null, moved = 0, downAt = 0, samples = []; + const metersPx = (view) => (Cam.range * 2 * Math.tan(view.fovY / 2)) / view.h * (1 + Cam.range * 0.18); + const panBy = (dx, dy, view) => { + const k = metersPx(view); + const ch = Math.cos(Cam.heading), sh = Math.sin(Cam.heading); + const tiltK = 1 + Math.min(Cam.tilt, Cam.maxTilt(Cam.range)) * 0.8; + const de = (-dx * ch + dy * sh * tiltK) * k, dn = (dx * sh + dy * ch * tiltK) * k; + const dLat = dn * R2D, dLon = (de * R2D) / Math.max(0.15, Math.cos(Cam.lat * D2R)); + Cam.lat = clamp(Cam.lat + dLat, -86, 86); Cam.lon = ((Cam.lon + dLon + 540) % 360) - 180; + return [dLat, dLon]; + }; + const zoomAt = (ratio, x, y, view) => { + const g = Cam.groundAt(view, x, y); + const nr = clamp(Cam.range * ratio, Cam.minRange, Cam.maxRange); const f = 1 - nr / Cam.range; + if (g && f > 0) { const p = geo.slerp(geo.vec(Cam.lat, Cam.lon), geo.vec(g[0], g[1]), f * 0.92); const [la, lo] = geo.ll(p); Cam.lat = la; Cam.lon = lo; } + Cam.range = nr; + }; + el.addEventListener('pointerdown', (e) => { + if (!Cam.enabled) return; + el.setPointerCapture?.(e.pointerId); + pts.set(e.pointerId, { x: e.clientX, y: e.clientY, b: e.button }); + Cam.cancel(); Cam.vel = null; Cam.interacting = true; Cam.lastInput = performance.now(); + if (pts.size === 1) { moved = 0; downAt = performance.now(); samples = []; } + last = null; bus.emit('globe-touch'); + }); + el.addEventListener('pointermove', (e) => { + if (!pts.has(e.pointerId) || !Cam.enabled) return; + const view = getView(); const p = pts.get(e.pointerId); const nx = e.clientX, ny = e.clientY; + const dx = nx - p.x, dy = ny - p.y; + if (pts.size === 1) { + moved += Math.abs(dx) + Math.abs(dy); + if (Cam.rig && Cam.rig.look) { Cam.rig.look(dx, dy); } + else if (p.b === 2 || e.shiftKey || e.ctrlKey) { Cam.heading -= dx * 0.006; Cam.tilt = clamp(Cam.tilt + dy * 0.005, 0, Cam.maxTilt(Cam.range)); } + else { const [dl, dn] = panBy(dx, dy, view); samples.push({ t: performance.now(), dl, dn }); } + p.x = nx; p.y = ny; + } else if (pts.size === 2) { + const ids = [...pts.keys()]; const a = pts.get(ids[0]), b = pts.get(ids[1]); + const before = { d: Math.hypot(a.x - b.x, a.y - b.y), ang: Math.atan2(b.y - a.y, b.x - a.x), mx: (a.x + b.x) / 2, my: (a.y + b.y) / 2 }; + p.x = nx; p.y = ny; + const after = { d: Math.hypot(a.x - b.x, a.y - b.y), ang: Math.atan2(b.y - a.y, b.x - a.x), mx: (a.x + b.x) / 2, my: (a.y + b.y) / 2 }; + const ratio = before.d / Math.max(after.d, 1); + const mdx = after.mx - before.mx, mdy = after.my - before.my; + if (Cam.rig && Cam.rig.zoom) { Cam.rig.zoom(ratio); } + else { + if (Math.abs(ratio - 1) < 0.006 && Math.abs(mdy) > Math.abs(mdx) * 1.4) Cam.tilt = clamp(Cam.tilt - mdy * 0.006, 0, Cam.maxTilt(Cam.range)); + else { zoomAt(ratio, after.mx, after.my, view); panBy(mdx, mdy, view); Cam.heading += angDiff(before.ang, after.ang) * -1; } + } + moved += 99; + } + Cam.lastInput = performance.now(); + bus.emit('camera-move'); + }); + const up = (e) => { + if (!pts.has(e.pointerId)) return; + const wasSingle = pts.size === 1; pts.delete(e.pointerId); + if (wasSingle) { + Cam.interacting = false; + const dtp = performance.now() - downAt; + if (moved < 9 && dtp < 450) { const r = el.getBoundingClientRect(); bus.emit('tap', { x: e.clientX - r.left, y: e.clientY - r.top }); } + else if (!Cam.rig) { + const now = performance.now(); const rec = samples.filter((s) => now - s.t < 90); + if (rec.length > 1) { const span = (rec[rec.length - 1].t - rec[0].t) / 1000 || 0.016; const sl = rec.reduce((s, x) => s + x.dl, 0) / span, sn = rec.reduce((s, x) => s + x.dn, 0) / span; Cam.vel = { lat: clamp(sl, -90, 90), lon: clamp(sn, -180, 180), h: 0 }; if (prefersReduced()) Cam.vel = null; } + } + } + }; + el.addEventListener('pointerup', up); el.addEventListener('pointercancel', up); + el.addEventListener('contextmenu', (e) => e.preventDefault()); + el.addEventListener('wheel', (e) => { + if (!Cam.enabled) return; e.preventDefault(); Cam.cancel(); Cam.vel = null; Cam.lastInput = performance.now(); + if (Cam.rig && Cam.rig.zoom) { Cam.rig.zoom(Math.exp(e.deltaY * 0.0015)); return; } + const r = el.getBoundingClientRect(); zoomAt(Math.exp(e.deltaY * 0.0016), e.clientX - r.left, e.clientY - r.top, getView()); bus.emit('camera-move'); + }, { passive: false }); +}; diff --git a/mobile/vision/src/js/50-situations.js b/mobile/vision/src/js/50-situations.js new file mode 100644 index 000000000..955dfda8e --- /dev/null +++ b/mobile/vision/src/js/50-situations.js @@ -0,0 +1,227 @@ +/* Situations — the feed's genres (DESIGN.md §9). Live metrics are computed from the synthetic world; + names, handles, posts and reconstruction claims are illustrative. */ +const SIT = (GE.SIT = {}); +const fam = (f) => GE.FAM[f].color; +const RSit = rng(4242); +function walk(n, start, vol, drift = 0, seed = 1) { const r = rng(seed); let v = start; const out = []; for (let i = 0; i < n; i++) { v += r.gauss() * vol + drift; out.push(v); } return out; } + +/* user locale ("Near you") from time zone only — no geolocation */ +const TZMAP = { 'America/Los_Angeles': ['San Francisco', 37.77, -122.42], 'America/New_York': ['New York', 40.71, -74.0], 'America/Chicago': ['Chicago', 41.88, -87.63], 'America/Denver': ['Denver', 39.74, -104.99], 'Europe/London': ['London', 51.51, -0.13], 'Europe/Paris': ['Paris', 48.86, 2.35], 'Europe/Berlin': ['Berlin', 52.52, 13.4], 'Asia/Tokyo': ['Tokyo', 35.68, 139.69], 'Asia/Kolkata': ['Delhi', 28.61, 77.21], 'Asia/Kathmandu': ['Kathmandu', 27.72, 85.32], 'Australia/Sydney': ['Sydney', -33.87, 151.21], 'Asia/Singapore': ['Singapore', 1.35, 103.82] }; +let tz = 'UTC'; try { tz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'; } catch {} +const ME = TZMAP[tz] || ['London', 51.51, -0.13]; +GE.ME = { name: ME[0], lat: ME[1], lon: ME[2], tz }; + +/* ISS pass prediction over "you" on the synthetic orbit */ +function issPass(fromMs) { + const obs = geo.vec(GE.ME.lat, GE.ME.lon); const up = v3.norm(obs); + let best = null, inPass = false, cur = null; + for (let s = 0; s < 36 * 3600; s += 20) { + const ms = fromMs + s * 1000, t = (ms - NOW) / 1000; const g = astro.sun(ms).gmst; + const p = GE.satAt(GE.ISS, t, g); const d = v3.norm(v3.sub(p, obs)); const el = Math.asin(v3.dot(d, up)) * R2D; + if (el > 10) { if (!inPass) { inPass = true; cur = { start: ms, max: el, maxAt: ms }; } if (el > cur.max) { cur.max = el; cur.maxAt = ms; } } + else if (inPass) { inPass = false; cur.end = ms; if (!best && cur.max > 18) { best = cur; break; } } + } + return best || { start: fromMs + 3.2 * 3600000, max: 41, maxAt: fromMs + 3.25 * 3600000, end: fromMs + 3.3 * 3600000 }; +} +function busiestAirport() { + const t = GE.world.t; const counts = new Map(); + for (const f of GE.FLIGHTS) { if (f.kind !== 0) continue; const p = GE.flightAt(f, t); if (!p) continue; for (const ap of [p.from, p.to]) { if (!ap.iata || ap.iata.length !== 3) continue; const d = geo.dist(p.lat, p.lon, ap.lat, ap.lon) * EARTH_KM; if (d < 160) counts.set(ap.iata, (counts.get(ap.iata) || 0) + 1); } } + let best = 'ATL', bc = 0; for (const [k, v] of counts) if (v > bc) { bc = v; best = k; } + return { iata: best, ap: GE.apByIata[best], n: bc, perH: Math.round(bc * 5.6) }; +} +SIT.issPass = issPass; SIT.busiest = busiestAirport; +// daytime replay helper: if it is night at a place now, use the most recent local afternoon +function dayReplay(lat, lon, localHour = 15.5) { + if (astro.elev(NOW, lat, lon) > 8) return null; + const tzh = Math.round(lon / 15); const d = new Date(NOW); let t = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), 0, 0) + (localHour - tzh) * 3600000; + while (t > NOW) t -= 86400000; return { at: t, start: t - 3 * 3600000, end: t + 3 * 3600000, replay: true }; +} +SIT.dayReplay = dayReplay; +const LAUNCH_T0 = NOW + (2 * 3600 + 14 * 60 + 33) * 1000; +const KOSHI_T = GE.scenes.FLOOD.startMs; +const AURORA_T = (() => { const d = new Date(NOW); d.setUTCHours(21, 30, 0, 0); if (d.getTime() < NOW) d.setUTCDate(d.getUTCDate() + 1); return d.getTime(); })(); + +/* ---------- situation definitions ---------- */ +const S = []; +const add = (o) => { o.updatedAt = o.updatedAt || NOW - (o.ageS || 60) * 1000; S.push(o); return o; }; +add({ + id: 'cyclone', short: 'Typhoon Halcyon', fam: 'haz', kind: 'cyclone', section: 'now', live: true, aspect: 1.25, ageS: 120, watchers: 48200, + title: 'Typhoon Halcyon tracks toward Luzon Strait', place: 'Philippine Sea', lat: 16.2, lon: 128.8, + camera: { lat: 15.2, lon: 127.6, range: 0.42, heading: -0.25, tilt: 0.42 }, thumbCam: { lat: 16.6, lon: 128.4, range: 0.3, heading: -0.2, tilt: 0.36 }, + layers: ['cyclones', 'radar', 'lightning', 'clouds', 'models', 'ais', 'flights'], source: 'Advisory feed (illustrative)', + metric: () => { const c = GE.CYCLONE.at(GE.world.offsetH); return [`${Math.round(c.wind)}km/h`, `${Math.round(c.p)} hPa · moving WNW 19 km/h`]; }, + metrics: () => { const c = GE.CYCLONE.at(GE.world.offsetH); return [{ v: Math.round(c.wind), u: 'km/h', l: 'Max sustained', s: 'Advisory · 2 min' }, { v: Math.round(c.p), u: 'hPa', l: 'Central pressure', s: 'Advisory · 2 min' }, { v: 610, u: 'km', l: 'To Luzon Strait', s: 'Computed · now' }]; }, + accessory: () => { const c = GE.CYCLONE.at(GE.world.offsetH); return `${Math.round(c.wind)} km/h · ${Math.round(c.p)} hPa · updated 2 min ago`; }, + brief: { + lede: 'A compact, intense typhoon is moving west-northwest at 19 km/h. The forecast cone widens to ±370 km by day 5; most guidance recurves it north of Luzon before a weakening landfall near Taiwan. Ships are routing south of the track; two vessels are holding off Batanes.', + series: [ + { label: 'Max wind', unit: 'km/h', data: GE.CYCLONE.track.map((x) => x[3]), split: 6, band: 18, src: 'Advisory feed · 6-hourly · 2 min', fmt: (v) => Math.round(v) }, + { label: 'Pressure', unit: 'hPa', data: GE.CYCLONE.track.map((x) => x[4]), split: 6, band: 6, src: 'Advisory feed · 6-hourly · 2 min', fmt: (v) => Math.round(v), invert: true }, + { label: 'Ships within 500 km', unit: '', data: walk(24, 40, 2, -0.6, 3).map((v) => Math.max(0, Math.round(v))), src: 'AIS · 5 min bins · 40 s', fmt: (v) => v }, + ], + multiples: { kind: 'globe', label: 'Track, 24 h apart', items: [-48, -24, 0, 24].map((h) => ({ h, cap: h === 0 ? 'Now' : (h < 0 ? '−' : '+') + Math.abs(h) + ' h' })) }, + sources: [['Tropical cyclone advisory (illustrative)', '2 min', 'live'], ['Geostationary IR mosaic', '10 min', 'live'], ['AIS vessel positions', '40 s', 'live'], ['Ensemble forecast tracks (14 members)', '3 h', 'stale']], + }, +}); +add({ + id: 'quake', short: 'M 6.4 · Honshu', fam: 'haz', kind: 'quake', section: 'now', live: true, aspect: 1.0, ageS: 5.4 * 3600, watchers: 21900, + title: 'M 6.4 off the coast of Honshu — largest in 24 h', place: 'Off eastern Honshu, Japan', lat: GE.BIGQ.lat, lon: GE.BIGQ.lon, + camera: { lat: 35.2, lon: 141.0, range: 0.13, heading: 0.35, tilt: 0.75 }, layers: ['quakes', 'flights', 'ais', 'cctv'], source: 'Seismic network (illustrative)', + metric: () => [`M 6.4`, `32 km deep · 9 aftershocks`], metrics: () => [{ v: '6.4', u: 'Mw', l: 'Magnitude', s: 'Seismic net · 5 h' }, { v: 32, u: 'km', l: 'Depth', s: 'Seismic net · 5 h' }, { v: 9, u: '', l: 'Aftershocks ≥ M3.4', s: 'Seismic net · 12 min' }], + brief: { + lede: 'A shallow thrust event under the Pacific margin, felt widely along the coast. No tsunami was generated beyond 20 cm. Rail services paused for inspection and resumed within 90 minutes; flights into HND were briefly held.', + series: [{ label: 'Aftershocks per hour', unit: '', data: [0, 0, 0, 0, 0, 7, 5, 3, 3, 2, 2, 1, 1, 2, 1, 0, 1, 1], src: 'Seismic catalog · hourly · 12 min', fmt: (v) => v }, { label: 'Coastal tide gauge', unit: 'cm', data: walk(36, 0, 1.2, 0, 7).map((v, i) => (i > 18 && i < 26 ? v + 14 * Math.sin((i - 18) / 8 * Math.PI) : v)), band: 3, src: 'Tide gauge (illustrative) · 1 min · 3 min', fmt: (v) => v.toFixed(0) }], + multiples: { kind: 'bars', label: 'Felt reports by prefecture', items: [['Fukushima', 0.9], ['Ibaraki', 0.75], ['Miyagi', 0.6], ['Chiba', 0.45]] }, + sources: [['Seismic network catalog (illustrative)', '12 min', 'live'], ['Tide gauges', '3 min', 'live'], ['Rail status boards', '9 min', 'live']], + }, +}); +add({ + id: 'fires', short: 'Fires · Iberia', fam: 'haz', kind: 'fires', section: 'now', live: true, aspect: 1.33, ageS: 38 * 60, watchers: 9800, + title: 'Wildfire clusters across Iberia and Greece', place: 'Southern Europe', lat: 40.0, lon: -6.5, + camera: { lat: 39.2, lon: -6.0, range: 0.18, heading: 0.1, tilt: 0.55 }, layers: ['fires', 'perims', 'aq', 'wind', 'flights'], source: 'VIIRS 375 m hotspots', + metric: () => [`${fmt.n(GE.FIRES.filter((f) => f.t <= GE.world.t && (f.cluster === 'Central Portugal' || f.cluster === 'Galicia' || f.cluster === 'Attica' || f.cluster === 'Epirus' || f.cluster === 'Antalya')).length)}hotspots`, 'Portugal · Galicia · Attica · Antalya'], + metrics: () => [{ v: GE.FIRES.filter((f) => f.t <= GE.world.t && f.lat > 34 && f.lon > -10 && f.lon < 32).length, u: '', l: 'Active hotspots', s: 'VIIRS · 38 min' }, { v: '3.4k', u: 'ha', l: 'Mapped perimeter', s: 'Perimeters · 3 h' }, { v: 31, u: 'km/h', l: 'Wind, Galicia', s: 'Model · 1 h' }], + brief: { lede: 'Dry easterly winds are pushing fire fronts toward the Atlantic in central Portugal and Galicia. Smoke is degrading air quality in Porto; the Attica cluster is contained on its north flank.', + series: [{ label: 'Hotspots, 6 h bins', unit: '', data: [12, 18, 44, 61, 58, 80, 102, 96, 120, 140, 133, 151], src: 'VIIRS / MODIS · 6 h · 38 min', fmt: (v) => v }, { label: 'PM2.5 Porto', unit: 'µg/m³', data: walk(30, 14, 3, 1.4, 11), band: 8, src: 'Air-quality sensors · 1 h · 22 min', fmt: (v) => Math.round(v) }], + multiples: { kind: 'globe', label: 'Spread, 24 h apart', items: [-48, -24, 0, 24].map((h) => ({ h, cap: h === 0 ? 'Now' : (h < 0 ? '−' : '+') + Math.abs(h) + ' h', cam: { lat: 40.6, lon: -7.8, range: 0.05, heading: 0, tilt: 0.3 } })) }, + sources: [['VIIRS 375 m active fires', '38 min', 'live'], ['Fire perimeters (illustrative)', '3 h', 'stale'], ['Wind model', '1 h', 'live']] }, +}); +add({ + id: 'milair', short: 'Military air · Baltic', fam: 'sky', kind: 'mil', section: 'now', live: true, aspect: 1.0, ageS: 30, watchers: 17300, + title: 'Military air activity over the Baltic', place: 'Baltic Sea', lat: 56.5, lon: 19.5, + camera: { lat: 56.0, lon: 19.0, range: 0.16, heading: 0.0, tilt: 0.5 }, layers: ['military', 'flights', 'gnss', 'holding'], source: 'ADS-B / MLAT', + metric: () => [`38aircraft`, '3 tankers holding · GNSS jamming'], metrics: () => [{ v: 38, u: '', l: 'Military aircraft', s: 'ADS-B/MLAT · 30 s' }, { v: 3, u: '', l: 'Tankers in orbit', s: 'ADS-B · 30 s' }, { v: '41', u: '%', l: 'Flights w/ GNSS loss', s: 'NIC/NACp · 10 min' }], + brief: { lede: 'Two tanker orbits are active over southern Sweden with fighter pairs cycling. GNSS integrity reports from airliners show a jamming footprint centred off Kaliningrad, affecting 41% of overflights in the last hour.', + series: [{ label: 'Military aircraft aloft', unit: '', data: walk(36, 26, 2, 0.35, 21).map(Math.round), src: 'ADS-B / MLAT · 10 min · 30 s', fmt: (v) => v }, { label: 'GNSS-degraded flights', unit: '%', data: walk(36, 30, 2.4, 0.3, 23), band: 6, src: 'Aircraft integrity reports · 10 min', fmt: (v) => Math.round(v) }], + multiples: { kind: 'bars', label: 'By type', items: [['Fighters', 0.8], ['Tankers', 0.22], ['ISR', 0.3], ['Transport', 0.5]] }, + sources: [['ADS-B / MLAT network', '30 s', 'live'], ['GNSS integrity (NIC/NACp)', '10 min', 'live']] }, +}); +add({ + id: 'iss', fam: 'orbit', kind: 'iss', section: 'near', live: true, aspect: 1.33, ageS: 4, watchers: 6400, + title: `ISS pass over ${GE.ME.name}`, place: `${GE.ME.name} (from your time zone)`, lat: GE.ME.lat, lon: GE.ME.lon, + camera: { lat: GE.ME.lat, lon: GE.ME.lon, range: 0.55, heading: 0, tilt: 0.55 }, layers: ['crewed', 'tracks', 'sats', 'trains'], source: 'TLE propagation', + dyn: true, + metric: () => { const p = SIT._iss || (SIT._iss = issPass(Date.now())); const s = (p.start - Date.now()) / 1000; return [s > 0 ? `in ${Math.floor(s / 3600)}h ${Math.floor((s % 3600) / 60)}m` : 'now', `max ${Math.round(p.max)}° · ${fmt.hm(p.maxAt)} UTC`]; }, + metrics: () => { const p = SIT._iss || (SIT._iss = issPass(Date.now())); return [{ v: fmt.hm(p.start), u: 'UTC', l: 'Rises', s: 'TLE · 4 s' }, { v: Math.round(p.max), u: '°', l: 'Max elevation', s: 'Computed' }, { v: Math.round((p.end - p.start) / 60000), u: 'min', l: 'Visible for', s: 'Computed' }]; }, + brief: { lede: 'The station will rise in the west-southwest and climb high across your sky. If the sky is clear and the pass is after dusk it will be the brightest point-like object, brighter than any star.', series: [{ label: 'Elevation during pass', unit: '°', data: Array.from({ length: 30 }, (_, i) => Math.max(0, Math.sin((i / 29) * Math.PI)) * 54), src: 'Propagated from TLE · computed', fmt: (v) => Math.round(v) }], sources: [['Two-line elements (illustrative epoch)', '4 h', 'live'], ['Sun/terminator', 'computed', 'live']] }, +}); +add({ + id: 'airport', short: 'Busiest: ATL', fam: 'sky', kind: 'airport', section: 'always', live: true, aspect: 1.25, ageS: 20, watchers: 5200, + title: 'Busiest airport right now', place: 'Hartsfield–Jackson Atlanta', lat: 33.6407, lon: -84.4277, + camera: { lat: 33.636, lon: -84.4277, range: 0.0042, heading: 0.35, tilt: 1.05 }, layers: ['flights', 'airports', 'holding', 'traffic'], source: 'ADS-B', + metric: () => { const b = SIT._busy || (SIT._busy = busiestAirport()); return [`${b.iata} ${b.perH} mvts/h`, `${b.ap.city} · ${b.n} aircraft within 160 km`]; }, + metrics: () => { const b = SIT._busy || (SIT._busy = busiestAirport()); return [{ v: b.perH, u: '/h', l: 'Movements', s: 'ADS-B · 20 s' }, { v: b.n, u: '', l: 'Aircraft < 160 km', s: 'ADS-B · 20 s' }, { v: 4, u: 'min', l: 'Avg. taxi-out delay', s: 'Derived · 15 min' }]; }, + brief: { lede: 'Arrivals are landing on the two southern runways in a steady stream; departures are pushing west. The evening bank peaks in 40 minutes.', series: [{ label: 'Movements per hour', unit: '', data: [62, 70, 88, 94, 101, 97, 90, 85, 92, 104, 112, 108], src: 'ADS-B · hourly · 20 s', fmt: (v) => v }], multiples: { kind: 'bars', label: 'Top 4 right now', items: [['ATL', 0.95], ['DFW', 0.84], ['DXB', 0.8], ['LHR', 0.74]] }, sources: [['ADS-B network', '20 s', 'live'], ['Airport board (scraped, illustrative)', '2 min', 'live']] }, +}); +add({ + id: 'novosel', short: 'Fort Novosel circuits', fam: 'sky', kind: 'heli', section: 'always', live: true, aspect: 1.5, ageS: 15, watchers: 3100, ride: true, + title: 'Fort Novosel helicopter school — jump into the chopper', place: 'Cairns Army Airfield, Alabama', lat: 31.276, lon: -85.713, + camera: { lat: 31.268, lon: -85.705, range: 0.0019, heading: -0.6, tilt: 1.12 }, layers: ['helis', 'flights', 'ga', 'traffic'], source: 'ADS-B / MLAT', time: dayReplay(31.276, -85.713, 15.2), + metric: () => [`${GE.HELI_CIRCUITS.filter((h) => h.field).length}in circuits`, 'Cairns + 3 stagefields · 500 ft AGL'], + metrics: () => [{ v: GE.HELI_CIRCUITS.filter((h) => h.field).length, u: '', l: 'Helicopters in circuits', s: 'ADS-B · 15 s' }, { v: 500, u: 'ft', l: 'Pattern altitude', s: 'Observed' }, { v: 5.5, u: 'min', l: 'Circuit time', s: 'Derived' }], + brief: { lede: 'Student pilots are flying rectangular traffic patterns at Cairns and three stagefields: upwind, crosswind, downwind, base, final — over and over. Tap Ride to sit in the left seat of one of them.', series: [{ label: 'Helicopters aloft', unit: '', data: [2, 4, 9, 14, 17, 19, 19, 18, 19, 17, 19, 19], src: 'ADS-B / MLAT · hourly · 15 s', fmt: (v) => v }, { label: 'Groundspeed, HAWK 21', unit: 'kt', data: Array.from({ length: 40 }, (_, i) => 70 + 12 * Math.sin(i / 3.2) + (i % 10 > 7 ? -30 : 0)), src: 'ADS-B · 1 s · 15 s', fmt: (v) => Math.round(v) }], sources: [['ADS-B / MLAT', '15 s', 'live']] }, +}); +add({ + id: 'launch', short: 'Launch · SLC-40', fam: 'orbit', kind: 'launch', section: 'now', live: true, aspect: 1.5, ageS: 300, watchers: 33800, + title: 'Rideshare launch from SLC-40 — countdown', place: 'Cape Canaveral, Florida', lat: 28.5618, lon: -80.5772, + camera: { lat: 28.552, lon: -80.590, range: 0.0011, heading: 0.75, tilt: 1.2 }, layers: ['launches', 'flights', 'ais', 'tracks'], source: 'Range schedule (illustrative)', + metric: () => [`T−${fmt.dur((LAUNCH_T0 - Date.now()) / 1000)}`, 'Rideshare to SSO · trajectory NE'], + metrics: () => [{ v: fmt.dur((LAUNCH_T0 - Date.now()) / 1000), u: '', l: 'Countdown', s: 'Range · 5 min' }, { v: 92, u: '%', l: 'Weather go', s: 'Forecast · 1 h' }, { v: 14, u: '', l: 'Vessels in hazard area', s: 'AIS · 40 s' }], + brief: { lede: 'Vehicle is vertical on the pad. The hazard area offshore is still being cleared — 14 vessels remain inside. Trajectory heads northeast along the coast.', series: [{ label: 'Vessels in hazard area', unit: '', data: [41, 39, 36, 33, 31, 28, 24, 21, 19, 17, 15, 14], src: 'AIS · 15 min · 40 s', fmt: (v) => v }], sources: [['Range schedule (illustrative)', '5 min', 'live'], ['AIS', '40 s', 'live']] }, +}); +add({ + id: 'koshi', short: 'Bhote Koshi · 4D', fam: 'haz', kind: 'recon', section: 'recon', live: false, aspect: 1.33, ageS: 53 * 86400, watchers: 12800, thread: 'koshi', d4: true, + title: 'Bhote Koshi outburst flood — 4D reconstruction', place: 'Rasuwa, Nepal · 26 Aug 2026', lat: 28.215, lon: 85.36, + camera: { lat: 28.212, lon: 85.352, range: 0.0036, heading: 0.35, tilt: 1.08 }, time: { at: KOSHI_T + 2.2 * 3600000, start: KOSHI_T - 3 * 3600000, end: KOSHI_T + 9 * 3600000 }, + layers: ['signed', 'holo', 'floods', 'helis'], source: 'Thread · 23 observations', + metric: () => ['23obs · 9hyp', '14 people · 3 AI proposals'], metrics: () => [{ v: 23, u: '', l: 'Observations', s: 'Ledger · 2 h' }, { v: 9, u: '', l: 'Hypotheses', s: 'Ledger · 2 h' }, { v: 14, u: '', l: 'Contributors', s: 'Thread' }], + brief: { lede: 'An outburst flood was observed on the Bhote Koshi on 26 August 2026. This thread reconstructs the crest’s passage from Rasuwagadhi down to Syaphrubesi using signed witness captures, river-gauge readings and satellite imagery. Witness posts are illustrative.', series: [{ label: 'River stage, Syaphrubesi (illustrative)', unit: 'm', data: Array.from({ length: 40 }, (_, i) => 3.1 + 4.7 * Math.exp(-Math.pow((i - 16) / 5, 2)) + (i > 16 ? 0.6 : 0)), band: 0.4, src: 'Gauge (illustrative) · 15 min', fmt: (v) => v.toFixed(1) }], sources: [['Signed witness captures (illustrative)', '53 d', 'stale'], ['Optical satellite tiles, before/after', '50 d', 'stale']] }, +}); +add({ + id: 'concert', short: 'Stadium encore · 4D', fam: 'eyes', kind: 'recon', section: 'recon', live: false, aspect: 1.25, ageS: 20 * 3600, watchers: 88200, thread: 'concert', d4: true, + title: 'Stadium encore in 4D — from 2,311 crowd captures', place: 'Wembley, London · last night', lat: 51.556, lon: -0.2796, + camera: { lat: 51.5552, lon: -0.2810, range: 0.00034, heading: 0.55, tilt: 1.12 }, time: { at: NOW - 20 * 3600000 + 0.0, start: NOW - 22 * 3600000, end: NOW - 19 * 3600000 }, + layers: ['signed', 'holo', 'venues', 'cctv'], source: 'Thread · 2,311 signed captures', nightThumb: true, + metric: () => ['2,311captures', '4D · 41 min · 86 seat blocks'], metrics: () => [{ v: '2,311', u: '', l: 'Signed captures', s: 'Ledger · 20 h' }, { v: 86, u: '', l: 'Seat blocks covered', s: 'Derived' }, { v: '±9', u: 'ms', l: 'Time alignment', s: 'Audio sync' }], + brief: { lede: 'A crowd-sourced reconstruction of last night’s encore: 2,311 signed phone captures aligned by audio fingerprint and IMU traces into a single 4D scene you can scrub. Performer and attendee identities are not part of the record.', series: [{ label: 'Captures per minute', unit: '', data: [3, 5, 9, 21, 64, 140, 188, 162, 120, 96, 72, 40], src: 'Signed bundles · 1 min', fmt: (v) => v }], sources: [['Signed crowd captures (illustrative)', '20 h', 'stale']] }, +}); +add({ + id: 'climb', short: 'Tower climb · 4D', fam: 'eyes', kind: 'recon', section: 'recon', live: false, aspect: 1.5, ageS: 9 * 3600, watchers: 41500, thread: 'climb', d4: true, + title: 'Free-climber on a Midtown tower — reconstructed', place: 'Midtown Manhattan · this morning', lat: 40.7553, lon: -73.9838, + camera: { lat: 40.7528, lon: -73.9870, range: 0.00027, heading: 0.62, tilt: 1.2 }, time: { at: NOW - 9 * 3600000, start: NOW - 11 * 3600000, end: NOW - 7 * 3600000 }, + layers: ['helis', 'signed', 'holo', 'cctv'], source: 'Thread · 3 news helicopters (ADS-B)', + metric: () => ['41clips · 3helis', 'Fictional tower · ascent 2 h 14 m'], metrics: () => [{ v: 41, u: '', l: 'Witness clips', s: 'Ledger · 9 h' }, { v: 3, u: '', l: 'News helicopters', s: 'ADS-B · 9 h' }, { v: 412, u: 'm', l: 'Tower height', s: 'Model (fictional tower)' }], + brief: { lede: 'Three news helicopters orbited the tower for two hours; their ADS-B tracks give precise camera positions for every broadcast frame. Combined with 41 signed street-level clips, the climber’s height over time is reconstructed to ±3 m. The tower and people are fictional.', series: [{ label: 'Climber height (reconstructed)', unit: 'm', data: Array.from({ length: 30 }, (_, i) => Math.min(380, i * 14 + Math.sin(i) * 6)), band: 3, src: 'Hypothesis H2 · ±3 m', fmt: (v) => Math.round(v) }], sources: [['ADS-B: 3 helicopters', '9 h', 'stale'], ['Signed street clips (illustrative)', '9 h', 'stale']] }, +}); +add({ + id: 'suez', short: 'Suez queue', fam: 'sea', kind: 'queue', section: 'always', live: true, aspect: 1.0, ageS: 40, watchers: 7700, + title: 'Ships queuing at Suez', place: 'Gulf of Suez & Port Said anchorages', lat: 30.3, lon: 32.4, + camera: { lat: 29.75, lon: 32.45, range: 0.045, heading: 0.2, tilt: 0.85 }, layers: ['ais', 'tankers', 'ports'], source: 'AIS', + metric: () => [`${GE.SHIPS.filter((s) => s.queue === 'suez').length}waiting`, 'avg wait 31 h · southbound convoy 06:00'], + metrics: () => [{ v: GE.SHIPS.filter((s) => s.queue === 'suez').length, u: '', l: 'Ships at anchor', s: 'AIS · 40 s' }, { v: 31, u: 'h', l: 'Average wait', s: 'Derived · 1 h' }, { v: 52, u: '', l: 'Transits / 24 h', s: 'AIS · 1 h' }], + brief: { lede: 'The anchorage off Suez is fuller than its 30-day median; northbound tankers are waiting longest.', series: [{ label: 'Ships at anchor', unit: '', data: walk(30, 52, 2.2, 0.75, 31).map(Math.round), band: 5, src: 'AIS · 6 h · 40 s', fmt: (v) => v }], multiples: { kind: 'bars', label: 'By type', items: [['Tanker', 0.82], ['Bulk', 0.6], ['Container', 0.45], ['LNG', 0.22]] }, sources: [['AIS terrestrial + satellite', '40 s', 'live']] }, +}); +add({ + id: 'aurora', short: 'Aurora · Kp 6', fam: 'wx', kind: 'aurora', section: 'near', live: true, aspect: 1.33, ageS: 600, watchers: 15100, + title: 'Aurora nowcast — Kp 6 expected tonight', place: 'Northern Scandinavia & Iceland', lat: 69.6, lon: 18.9, + camera: { lat: 62.5, lon: 12.0, range: 0.62, heading: 0.15, tilt: 0.95 }, time: { at: AURORA_T }, layers: ['clouds', 'signed', 'holo', 'flights'], source: 'Space-weather forecast', auroraK: 1.15, + metric: () => ['Kp 6tonight', 'Tromsø 92% · cloud 18%'], metrics: () => [{ v: 6, u: 'Kp', l: 'Forecast peak', s: 'Space weather · 10 min' }, { v: 92, u: '%', l: 'Chance, Tromsø', s: 'Model · 10 min' }, { v: 18, u: '%', l: 'Cloud cover', s: 'Satellite · 15 min' }], + brief: { lede: 'A coronal mass ejection is arriving earlier than forecast. The auroral oval will push south after dark; sky captures from Tromsø already show a bright arc.', series: [{ label: 'Kp forecast', unit: '', data: [2, 2, 3, 3, 4, 5, 6, 6, 5, 4, 4, 3], band: 1, src: 'Space-weather forecast · 3 h · 10 min', fmt: (v) => v }], sources: [['Space-weather forecast', '10 min', 'live'], ['Sky captures (illustrative)', '18 min', 'live']] }, +}); +add({ + id: 'drones', short: 'Drone corridor', fam: 'ground', kind: 'drone', section: 'always', live: false, aspect: 1.25, ageS: 3600, watchers: 2300, + title: 'Delivery-drone corridor — today’s replay', place: 'Suburban Texas (illustrative operator)', lat: 30.588, lon: -96.29, + camera: { lat: 30.578, lon: -96.300, range: 0.0013, heading: 0.5, tilt: 1.1 }, layers: ['drones', 'traffic'], source: 'Remote ID broadcasts', time: dayReplay(30.588, -96.29, 14.5), + metric: () => ['212drops', '16 drones · 4.1 min median'], metrics: () => [{ v: 212, u: '', l: 'Deliveries today', s: 'Remote ID · 1 h' }, { v: 16, u: '', l: 'Drones active', s: 'Remote ID · 1 min' }, { v: 4.1, u: 'min', l: 'Median trip', s: 'Derived' }], + brief: { lede: 'Remote ID broadcasts let anyone replay a corridor: out and back at 60 m, a hover-and-lower at each drop.', series: [{ label: 'Drops per hour', unit: '', data: [0, 0, 4, 12, 19, 22, 25, 21, 24, 27, 23, 18], src: 'Remote ID · hourly', fmt: (v) => v }], sources: [['Remote ID receivers (illustrative)', '1 min', 'live']] }, +}); +add({ + id: 'marathon', short: 'Lakeshore 42K', fam: 'ground', kind: 'race', section: 'always', live: true, aspect: 1.0, ageS: 10, watchers: 4600, + title: 'Lakeshore 42K — runner trackers', place: 'Chicago lakefront (fictional race)', lat: 41.89, lon: -87.625, + camera: { lat: 41.875, lon: -87.630, range: 0.0026, heading: 0.15, tilt: 1.05 }, layers: ['venues', 'transit', 'traffic'], source: 'Race trackers (illustrative)', time: dayReplay(41.88, -87.63, 9.5), + metric: () => ['260trackers', 'leader at 31.4 km · 2:21 pace'], metrics: () => [{ v: 260, u: '', l: 'Live trackers', s: 'Race app · 10 s' }, { v: 31.4, u: 'km', l: 'Leader', s: '10 s' }, { v: '3:21', u: '/km', l: 'Median pace', s: 'Derived' }], + brief: { lede: 'Bibs broadcast positions every 10 seconds; the field has stretched to 9 km.', series: [{ label: 'Leader pace', unit: 's/km', data: walk(30, 200, 1.5, 0, 41), band: 2, src: 'Tracker · 1 km', fmt: (v) => Math.round(v) }], sources: [['Race trackers (fictional race)', '10 s', 'live']] }, +}); +add({ + id: 'gnss', short: 'GNSS jamming', fam: 'infra', kind: 'gnss', section: 'now', live: true, aspect: 1.25, ageS: 600, watchers: 6100, + title: 'GNSS jamming hot spots', place: 'Baltic · Black Sea · Eastern Med', lat: 50, lon: 27, + camera: { lat: 49.0, lon: 26.0, range: 0.42, heading: 0.0, tilt: 0.35 }, layers: ['gnss', 'flights', 'military'], source: 'Aircraft integrity reports', + metric: () => ['8hot spots', 'Baltic 41% · E. Med 28%'], metrics: () => [{ v: 8, u: '', l: 'Hot spots', s: '10 min' }, { v: 41, u: '%', l: 'Baltic flights affected', s: '10 min' }, { v: 28, u: '%', l: 'E. Med', s: '10 min' }], + brief: { lede: 'Aircraft broadcast their own position-integrity; mapping drops in that integrity reveals where navigation signals are being jammed.', series: [{ label: 'Affected flights', unit: '%', data: walk(24, 30, 2, 0.4, 51), band: 5, src: 'NIC/NACp · 1 h', fmt: (v) => Math.round(v) }], sources: [['ADS-B integrity fields', '10 min', 'live']] }, +}); +add({ + id: 'starlink', fam: 'orbit', kind: 'train', section: 'near', live: true, aspect: 1.0, ageS: 90, watchers: 8800, + title: 'Fresh satellite train — visible at dusk', place: 'Low Earth orbit, 312 km', lat: 30, lon: -60, + camera: null, layers: ['trains', 'sats', 'tracks'], source: 'TLE propagation', dyn: true, + metric: () => ['24satellites', 'orbit raising · 312 km'], metrics: () => [{ v: 24, u: '', l: 'Satellites in train', s: 'TLE · 90 s' }, { v: 312, u: 'km', l: 'Altitude', s: 'TLE' }, { v: 7.73, u: 'km/s', l: 'Speed', s: 'Computed' }], + brief: { lede: 'A freshly launched batch flies in a tight line before raising orbit — at dusk it looks like a string of pearls.', series: [{ label: 'Altitude (orbit raising)', unit: 'km', data: Array.from({ length: 20 }, (_, i) => 290 + i * 1.2), src: 'TLE · daily', fmt: (v) => Math.round(v) }], sources: [['Two-line elements', '90 s', 'live']] }, +}); +add({ + id: 'squawk', fam: 'sky', kind: 'squawk', section: 'now', live: true, aspect: 1.25, ageS: 300, watchers: 12000, + title: 'Squawk 7700 — diversion in progress', place: 'Over the North Atlantic', lat: 50, lon: -30, dyn: true, + camera: null, layers: ['squawk', 'flights'], source: 'ADS-B', + metric: () => ['7700emergency', 'diverting · descending'], metrics: () => [{ v: 7700, u: '', l: 'Squawk', s: 'ADS-B · 5 s' }, { v: 'FL240', u: '', l: 'Descending through', s: '5 s' }, { v: 34, u: 'min', l: 'To diversion', s: 'Computed' }], + brief: { lede: 'An airliner set its transponder to 7700 and turned toward the nearest suitable airport. Replay the last 20 minutes.', series: [{ label: 'Altitude', unit: 'ft', data: Array.from({ length: 30 }, (_, i) => (i < 8 ? 37000 : 37000 - (i - 8) * 600)), src: 'ADS-B · 1 min', fmt: (v) => fmt.n(v) }], sources: [['ADS-B', '5 s', 'live']] }, +}); +add({ + id: 'strait', short: 'Singapore Strait', fam: 'sea', kind: 'strait', section: 'always', live: true, aspect: 1.5, ageS: 40, watchers: 3900, + title: 'Singapore Strait — the world’s busiest lane', place: 'Singapore', lat: 1.25, lon: 103.9, + camera: { lat: 1.18, lon: 103.85, range: 0.022, heading: 0.1, tilt: 0.9 }, layers: ['ais', 'tankers', 'ports', 'flights'], source: 'AIS', + metric: () => ['1,912transits/day', '90 at anchor · 2 dark'], metrics: () => [{ v: '1,912', u: '', l: 'Transits / 24 h', s: 'AIS · 40 s' }, { v: 90, u: '', l: 'At anchor', s: 'AIS · 40 s' }, { v: 2, u: '', l: 'AIS gaps', s: '1 h' }], + brief: { lede: 'Two traffic separation lanes, one of the densest anchorages anywhere.', series: [{ label: 'Transits per hour', unit: '', data: walk(24, 80, 4, 0, 61).map(Math.round), src: 'AIS · hourly', fmt: (v) => v }], sources: [['AIS', '40 s', 'live']] }, +}); + +for (const s of S) if (s.time && s.time.replay) { s.live = false; s.replayLabel = 'Today ' + new Date(s.time.at).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', timeZone: 'UTC' }) + ' UTC'; } +SIT.list = S; +SIT.byId = Object.fromEntries(S.map((s) => [s.id, s])); +SIT.sections = [ + { id: 'now', title: 'Happening now', sub: 'Live' }, { id: 'near', title: 'Near you', sub: GE.ME.name }, { id: 'recon', title: 'Reconstructions', sub: '4D · signed' }, { id: 'always', title: 'Always on', sub: 'Worth a look' }, +]; +// dynamic cameras +SIT.cameraFor = function (s) { + if (s.id === 'starlink') { const g = GE.world.sun.gmst; const p = GE.satAt(GE.SATS.find((x) => x.kind === 5), GE.world.t, g); const [la, lo] = geo.ll(p); return { lat: la - 6, lon: lo - 8, range: 0.32, heading: 0.6, tilt: 0.85 }; } + if (s.id === 'squawk') { const f = GE.FLIGHTS[GE.world.squawks[0]]; const p = GE.flightAt(f, GE.world.t) || { lat: 50, lon: -30 }; return { lat: p.lat - 1.2, lon: p.lon - 1, range: 0.06, heading: 0.3, tilt: 0.85 }; } + if (s.id === 'iss') { const p = GE.satAt(GE.ISS, GE.world.t, GE.world.sun.gmst); const [la, lo] = geo.ll(p); return { lat: la - 9, lon: lo - 4, range: 0.48, heading: 0.35, tilt: 0.78 }; } + return s.camera; +}; +SIT.pin = (s) => { if (s.id === 'starlink' || s.id === 'squawk' || s.id === 'iss') { const c = SIT.cameraFor(s); return null; } return { id: s.id, lat: s.lat, lon: s.lon, title: s.title, col: [...hex2rgb(fam(s.fam)), 1], seed: hash01(s.id.length) }; }; diff --git a/mobile/vision/src/js/60-shell.js b/mobile/vision/src/js/60-shell.js new file mode 100644 index 000000000..872dccfcd --- /dev/null +++ b/mobile/vision/src/js/60-shell.js @@ -0,0 +1,147 @@ +/* Shell: tabs, Liquid-Glass tab bar with sliding lens, tab-bar accessory (followed situation), + minimize-on-scroll, layout (phone / two-pane / hinge), overlay labels, toasts. */ +const APP = (GE.app = { tab: 'now', mode: '', following: 'cyclone', wide: false }); +const appEl = () => $('#app'); +APP.isWide = () => { try { return matchMedia('(min-width: 600px)').matches; } catch { return innerWidth >= 600; } }; + +APP.toast = function (html, ms = 2200) { + const t = $('#toast'); t.innerHTML = html; t.classList.add('on'); clearTimeout(APP._tt); APP._tt = setTimeout(() => t.classList.remove('on'), ms); +}; +APP.setMode = function (m) { APP.mode = m; appEl().dataset.mode = m; bus.emit('mode', m); APP.updateChrome(); }; + +/* ---------- tabs ---------- */ +APP.setTab = function (tab, opts = {}) { + const prev = APP.tab; + if (prev === tab && !opts.force) { if (tab === 'now') $('#v-now').scrollTo({ top: 0, behavior: 'smooth' }); return; } + if (APP.mode === 'situation') GE.sheet.close(true); + if (APP.mode === 'ride') GE.ride.exit(true); + if (prev === 'capture') GE.capture.exit(); + if (prev === 'threads' && GE.threads.ws) GE.threads.closeWs(true); + APP.tab = tab; appEl().dataset.tab = tab; + $$('.tab').forEach((b) => { b.classList.toggle('on', b.dataset.tab === tab); b.setAttribute('aria-selected', b.dataset.tab === tab); }); + APP.moveLens(); + const wide = APP.isWide(); + $$('.pane .view').forEach((v) => v.classList.remove('on')); + const map = { now: '#v-now', threads: '#v-threads', you: '#v-you', globe: wide ? '#v-layers' : null }; + if (map[tab]) $(map[tab]).classList.add('on'); + $('#v-capture').classList.toggle('on', tab === 'capture'); + if (tab === 'capture') GE.capture.enter(); + if (tab === 'globe' && wide) GE.gui.renderLayersPane(); + APP.minimize(false); + APP.cameraForTab(tab, prev); + APP.updateChrome(); + haptic(6); + bus.emit('tab', tab); +}; +APP.cameraForTab = function (tab, prev) { + const Cm = GE.cam; const wide = APP.isWide(); + if (tab === 'now') { + Cm.flyTo(APP.heroCam(), { duration: prev ? 1.2 : 0 }); + Cm.autoSpin = 0.3; + } else if (tab === 'globe') { + Cm.autoSpin = 0; + if (prev === 'now' || prev === 'you' || prev === 'threads' || !prev) Cm.flyTo({ range: Math.min(2.7, Math.max(Cm.range, 0.5)), shiftY: wide ? 0 : 0.06, shiftX: 0, tilt: 0 }, { duration: 1.0 }); + } else if (tab === 'you' || tab === 'threads') { Cm.autoSpin = 0.3; if (!wide) Cm.flyTo(APP.heroCam(), { duration: 0.9 }); } +}; +APP.moveLens = function () { + const on = $(`.tab[data-tab="${APP.tab}"]`); const lens = $('#tablens'); if (!on || !lens) return; + lens.style.transform = `translateX(${on.offsetLeft}px)`; lens.style.width = on.offsetWidth + 'px'; +}; +APP.minimize = function (on) { + if (APP._mini === on) return; APP._mini = on; + $('#tabwrap').classList.toggle('mini', on); + $('#accHost').classList.toggle('hidden', on || !APP.showAcc()); + setTimeout(APP.moveLens, 460); requestAnimationFrame(APP.moveLens); +}; +APP.showAcc = () => !!APP.following && (APP.tab === 'now' || APP.tab === 'threads' || APP.tab === 'you' || (APP.isWide() && APP.tab === 'globe')) && !APP.mode; +APP.updateChrome = function () { + const ride = APP.mode === 'ride', sit = APP.mode === 'situation'; + $('#tabwrap').classList.toggle('hidden', ride || (sit && !APP.isWide()) || APP.intro); + $('#accHost').classList.toggle('hidden', !APP.showAcc() || APP._mini || APP.intro); + $('#back').classList.toggle('on', sit); + $('#sitbtns').classList.toggle('on', sit); + // globe ribbon/dock offsets when the sheet is open (phone) + const gb = $('#gbottom'); + gb.style.opacity = sit && !APP.isWide() ? '0' : ''; gb.style.pointerEvents = sit && !APP.isWide() ? 'none' : ''; +}; + +/* ---------- accessory ---------- */ +APP.renderAccessory = function () { + const s = GE.SIT.byId[APP.following]; if (!s) return; + const html = `
    ${esc(GE.CYCLONE.name)}
    ${esc(s.accessory ? s.accessory() : '')}
    ${sparkPath(GE.CYCLONE.track.slice(0, 7).map((x) => x[3]), 54, 22, '#FF6A3D')}`; + $('#acc').innerHTML = html; + $('#accMini').innerHTML = `
    ${esc(GE.CYCLONE.name)}
    ${esc(s.accessory ? s.accessory() : '')}
    `; +}; +function sparkPath(data, w, h, col, sw = 1.6) { + const mn = Math.min(...data), mx = Math.max(...data), n = data.length; + const pts = data.map((v, i) => [(i / (n - 1)) * (w - 4) + 2, h - 3 - ((v - mn) / (mx - mn || 1)) * (h - 6)]); + const d = pts.map((p, i) => (i ? 'L' : 'M') + p[0].toFixed(1) + ' ' + p[1].toFixed(1)).join(''); + const l = pts[pts.length - 1]; + return ``; +} +GE.sparkPath = sparkPath; + +/* ---------- overlay labels on the globe ---------- */ +const LBL = { els: new Map() }; +APP.updateLabels = function (view) { + const host = $('#labels'); if (!host) return; + const want = []; + const showPins = (APP.tab === 'globe' || APP.isWide()) && !APP.mode && !APP.intro; + if (showPins) for (const s of GE.SIT.list) { + if (s.dyn) continue; + const short = s.short || s.title.split(/ [—–-] /)[0].slice(0, 28); + want.push({ k: 's:' + s.id, lat: s.lat, lon: s.lon, alt: 0.2, pr: s.watchers, html: `${esc(short)}`, w: short.length * 6.6 + 32, cls: 'glass', onclick: () => GE.sheet.open(s.id, { fromGlobe: true }) }); + } + if (GE.world.sel && GE.world.sel.v && APP.mode !== 'ride') want.push({ k: 'sel', v: GE.world.sel.v, pr: 1e9, html: `${esc(GE.world.sel.title)}`, w: 90, cls: 'plain tag' }); + for (const [k, l] of GE.extraLabels || []) want.push({ k, pr: 1e8, w: 120, ...l }); + want.sort((a, b) => b.pr - a.pr); + const placed = []; const shown = new Set(); + const cap = view.range > 1.2 ? 7 : view.range > 0.3 ? 12 : 40; + for (const l of want) { + const p = l.v || geo.vec(l.lat, l.lon, l.alt || 0); + const s = GE.world.project(view, p); + if (!s || !s.vis || shown.size >= cap) continue; + const tag = l.cls && l.cls.includes('tag'); + const box = tag ? [s.x + 10, s.y - 13, s.x + 10 + l.w, s.y + 13] : [s.x - l.w / 2, s.y - 36, s.x + l.w / 2, s.y - 8]; + if (placed.some((b) => !(box[2] < b[0] - 4 || box[0] > b[2] + 4 || box[3] < b[1] - 3 || box[1] > b[3] + 3))) continue; + placed.push(box); shown.add(l.k); + let el = LBL.els.get(l.k); + if (!el) { el = h('button', { class: 'lbl ' + (l.cls || '') }); el.innerHTML = l.html; if (l.onclick) el.addEventListener('click', l.onclick); else el.style.pointerEvents = 'none'; host.append(el); LBL.els.set(l.k, el); } + else if (el._html !== l.html) el.innerHTML = l.html; + el._html = l.html; el.style.opacity = '1'; + el.style.transform = `translate3d(${s.x.toFixed(1)}px, ${(s.y - (tag ? 0 : 8)).toFixed(1)}px, 0) translate(${tag ? '10px, -50%' : '-50%, -100%'})`; + } + for (const [k, el] of LBL.els) if (!shown.has(k)) { if (!want.some((w) => w.k === k)) { el.remove(); LBL.els.delete(k); } else el.style.opacity = '0'; } +}; +APP.heroCam = function () { + const W = GE.world; const sun = W.sun; + if (!APP._heroLon || Math.abs((APP._heroT || 0) - Date.now()) > 600000) { + let best = sun.lon + 70, bs = -1; + for (const off of [-80, -65, 65, 80]) { const lon0 = sun.lon + off; let sum = 0; for (let la = -50; la <= 65; la += 7) for (let lo = -60; lo <= 60; lo += 7) { const L = lon0 + lo; const v = geo.vec(la, L); if (v3.dot(v, sun.dir) < -0.05 && geo.dist(24, lon0, la, L) < 1.15) sum += W.lightsAt(la, ((L + 540) % 360) - 180); } if (sum > bs) { bs = sum; best = lon0; } } + APP._heroLon = ((best + 540) % 360) - 180; APP._heroT = Date.now(); + } + const sl = APP._heroLon - 66; return APP.isWide() ? { lat: 20, lon: sl + 62, range: 2.6, heading: 0, tilt: 0, shiftY: 0, shiftX: 0 } : { lat: 24, lon: sl + 66, range: 2.85, heading: 0, tilt: 0, shiftY: 0.5, shiftX: 0 }; }; +GE.extraLabels = new Map(); + +/* ---------- wiring ---------- */ +APP.initShell = function () { + $$('.tab').forEach((b) => b.addEventListener('click', () => APP.setTab(b.dataset.tab))); + const openFollowed = () => GE.sheet.open(APP.following); + $('#acc').addEventListener('click', openFollowed); $('#accMini').addEventListener('click', openFollowed); + $('#btnSearch').addEventListener('click', () => GE.gui.openSearch()); + // minimize tab bar on scroll (feed-like views) + for (const id of ['#v-now', '#v-threads', '#v-you']) { + const v = $(id); let last = 0; + v.addEventListener('scroll', () => { + const y = v.scrollTop; const dy = y - last; last = y; + if (y < 40) APP.minimize(false); else if (dy > 4) APP.minimize(true); else if (dy < -6) APP.minimize(false); + const nb = v.querySelector('.navbar'); if (nb) nb.classList.toggle('on', y > (id === '#v-now' ? (APP.isWide() ? 90 : 250) : 60)); + clearTimeout(v._st); v._st = setTimeout(() => APP.minimize(false), 1400); + bus.emit('scroll', { id, y }); + }, { passive: true }); + } + addEventListener('resize', () => { APP.moveLens(); const w = APP.isWide(); if (w !== APP.wide) { APP.wide = w; APP.setTab(APP.tab, { force: true }); } }); + APP.wide = APP.isWide(); + setInterval(APP.renderAccessory, 1000); APP.renderAccessory(); + requestAnimationFrame(APP.moveLens); +}; diff --git a/mobile/vision/src/js/61-now.js b/mobile/vision/src/js/61-now.js new file mode 100644 index 000000000..86ebf1bf3 --- /dev/null +++ b/mobile/vision/src/js/61-now.js @@ -0,0 +1,162 @@ +/* Now: RedNote-style two-column masonry of living situation cards. Thumbnails are rendered from the + same WebGL globe in an offscreen pass (texture-crop fallback first, so there is never a blank). */ +const NOWV = (GE.now = { filter: 'all' }); +const TH = (GE.thumbs = { q: [], chains: new Map(), done: new Map() }); + +/* ---------- thumbnail renderer ---------- */ +Cam.viewFrom = function (spec, w, h) { + const save = { lat: Cam.lat, lon: Cam.lon, range: Cam.range, heading: Cam.heading, tilt: Cam.tilt, shiftX: Cam.shiftX, shiftY: Cam.shiftY, rig: Cam.rig }; + Object.assign(Cam, { shiftX: 0, shiftY: 0, heading: 0, tilt: 0 }, spec); Cam.rig = null; + const v = Cam.view(w, h); Object.assign(Cam, save); return v; +}; +TH.chainFor = function (w, h) { const k = w + 'x' + h; if (!TH.chains.has(k)) TH.chains.set(k, { chain: GL.chain(w, h), out: GL.target(w, h, { hdr: false }) }); return TH.chains.get(k); }; +TH.render = function (spec, w, h, o = {}) { return TH.renderView(Cam.viewFrom(spec, w, h), w, h, o); }; +TH.renderView = function (view, w, h, o = {}) { + const gl = GL.gl; const { chain, out } = TH.chainFor(w, h); + const W = GE.world; + const at = o.at ?? null; + const t = at != null ? (at - NOW) / 1000 : W.t; + const sun = at != null ? astro.sun(at) : W.sun; + const offsetH = at != null ? (at - Date.now()) / 3600000 : W.offsetH; + const saved = W.layers.map((l) => l.on); + if (o.layers) for (const id of o.layers) if (W.layerById[id]) W.layerById[id].on = true; + W.render(view, chain, out.fb, { t: o.t ?? t, sun: o.sun ?? sun, offsetH: o.offsetH ?? offsetH, simMs: o.simMs ?? at ?? W.simMs, lens: o.lens || 'cinematic', outW: w, outH: h, vpW: w, vpH: h, pxScale: o.px ?? 1.35, aurora: o.aurora, exposure: o.exposure ?? 1.08, grain: false, focus: o.focus, extraSprites: o.extraSprites, extraLines: o.extraLines, steps: 10, lineK: 1.25, cloudK: o.cloudK }); + W.layers.forEach((l, i) => (l.on = saved[i])); + const px = new Uint8Array(w * h * 4); + gl.bindFramebuffer(gl.FRAMEBUFFER, out.fb); gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px); gl.bindFramebuffer(gl.FRAMEBUFFER, null); + const cv = o.canvas || document.createElement('canvas'); cv.width = w; cv.height = h; + const cx = cv.getContext('2d'); const id = cx.createImageData(w, h); + for (let y = 0; y < h; y++) id.data.set(px.subarray((h - 1 - y) * w * 4, (h - y) * w * 4), y * w * 4); + cx.putImageData(id, 0, 0); + return cv; +}; +TH.situationSpec = (s) => s.thumbCam || GE.SIT.cameraFor(s); +TH.renderSituation = function (s, canvas) { + const w = canvas.width, hh = canvas.height; + const extras = GE.extrasFor ? GE.extrasFor(s.id) : null; + return TH.render(TH.situationSpec(s), w, hh, { at: s.time?.at ?? null, layers: s.layers, canvas, aurora: s.auroraK, extraSprites: extras?.sprites, extraLines: extras?.lines, focus: s.kind === 'recon' ? null : null }); +}; +TH.enqueue = function (fn) { TH.q.push(fn); }; +TH.step = function (budgetMs = 10) { + const t0 = performance.now(); let n = 0; + while (TH.q.length && (n === 0 || performance.now() - t0 < budgetMs)) { const fn = TH.q.shift(); try { fn(); } catch (e) { console.warn('thumb', e); } n++; } +}; +// texture-crop fallback, drawn instantly +TH.fallback = function (s, canvas) { + const W = GE.world; const cx = canvas.getContext('2d'); const w = canvas.width, hh = canvas.height; + const spec = TH.situationSpec(s) || { lat: s.lat, lon: s.lon, range: 0.3 }; + const spanDeg = clamp(spec.range * 70, 1.2, 120); + const img = W.img?.day; if (!img) { cx.fillStyle = '#0b1220'; cx.fillRect(0, 0, w, hh); return; } + const sx = ((spec.lon + 180) / 360) * img.width, sy = ((90 - spec.lat) / 180) * img.height; + const sw = (spanDeg / 360) * img.width, sh = sw * (hh / w); + cx.drawImage(img, sx - sw / 2, sy - sh / 2, sw, sh, 0, 0, w, hh); + const el = astro.elev(s.time?.at ?? Date.now(), s.lat, s.lon); + if (el < 4) { cx.globalAlpha = clamp((4 - el) / 12, 0, 0.92); cx.drawImage(W.img.night, sx - sw / 2, sy - sh / 2, sw, sh, 0, 0, w, hh); cx.globalAlpha = 1; } + const g = cx.createRadialGradient(w / 2, hh / 2, Math.min(w, hh) * 0.2, w / 2, hh / 2, Math.max(w, hh) * 0.75); + g.addColorStop(0, 'rgba(0,0,0,0)'); g.addColorStop(1, 'rgba(0,0,0,.6)'); cx.fillStyle = g; cx.fillRect(0, 0, w, hh); +}; + +/* ---------- feed ---------- */ +const famIcon = (f) => GE.FAM[f].icon; +function cardHTML(s) { + const c = GE.FAM[s.fam].color; + const [m, ml] = s.metric(); + const badge = s.d4 ? `4DThread` : s.live ? `Live` : `${s.replayLabel ? 'Replay · ' + s.replayLabel.replace('Today ', '') : 'Replay'}`; + const right = s.thread ? `${['tamang', 'hydro', 'kora', 'geo'].map((k) => `${GE.PEOPLE[k].h[0].toUpperCase()}`).join('')}` : `${ic('eye', 'xs')}${fmt.k(s.watchers)}`; + return `
    +
    ${badge}
    ${ic(famIcon(s.fam), 'sm')}
    +
    ${m}
    ${ml}
    +
    ${esc(s.title)}
    ${esc(s.source)} · ${fmt.ago(Date.now() - s.updatedAt)}${right}
    + ${s.ride ? `` : ''}
    `; +} +NOWV.render = function () { + const v = $('#v-now'); + const now = new Date(); + const kick = now.toLocaleDateString('en-GB', { weekday: 'long', day: 'numeric', month: 'long', timeZone: 'UTC' }); + v.innerHTML = ` +
    +
    ${kick}·${fmt.hm(Date.now())} UTC
    +

    Now

    +
    ${GE.SIT.list.length} situations– aircraft– vessels${fmt.n(GE.SATS.length)} satellites
    +
    +
    + ${[['all', 'For you'], ['now', 'Happening now'], ['near', 'Near you'], ['recon', 'Reconstructions'], ['always', 'Always on']].map(([k, l]) => ``).join('')} +
    `; + $('#nowMe').addEventListener('click', () => APP.setTab('you')); + $$('#nowChips .chip').forEach((b) => b.addEventListener('click', () => { NOWV.filter = b.dataset.f; $$('#nowChips .chip').forEach((x) => x.classList.toggle('on', x === b)); NOWV.renderSections(); haptic(4); })); + NOWV.renderSections(); +}; +NOWV.renderSections = function () { + const host = $('#nowSecs'); host.innerHTML = ''; + for (const sec of GE.SIT.sections) { + if (NOWV.filter !== 'all' && NOWV.filter !== sec.id) continue; + const items = GE.SIT.list.filter((s) => s.section === sec.id); + const hd = h('div', { class: 'sec-h' }, h('h2', null, sec.title), h('span', null, sec.sub)); + const grid = h('div', { class: 'masonry' }); const cols = [h('div', { class: 'col' }), h('div', { class: 'col' })]; grid.append(...cols); + const hs = [0, 0]; + for (const s of items) { + const el = h('article', { class: 'card', 'data-id': s.id, tabindex: 0, role: 'button', 'aria-label': s.title }); el.innerHTML = cardHTML(s); + const ci = hs[0] <= hs[1] ? 0 : 1; cols[ci].append(el); hs[ci] += s.aspect + 0.62; + el.addEventListener('click', (e) => { if (e.target.closest('[data-ride]')) { e.stopPropagation(); NOWV.open(s, el, { ride: true }); return; } NOWV.open(s, el); }); + el.addEventListener('keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); NOWV.open(s, el); } }); + const cv = el.querySelector('canvas'); + const cached = TH.done.get(s.id); + if (cached) cv.getContext('2d').drawImage(cached, 0, 0); + else { TH.fallback(s, cv); TH.enqueue(() => { const c2 = document.createElement('canvas'); c2.width = cv.width; c2.height = cv.height; TH.renderSituation(s, c2); TH.done.set(s.id, c2); $$(`.card[data-id="${s.id}"] canvas, .tcard[data-id="${s.id}"] canvas`).forEach((x) => { const xc = x.getContext('2d'); xc.drawImage(c2, 0, 0, x.width, x.height); }); }); } + } + host.append(hd, grid); + } +}; +NOWV.tick = function () { + const W = GE.world; + const c = W.counts; const air = (c.flights || 0) + (c.military || 0) + (c.ga || 0) + GE.HELI_CIRCUITS.length; + const a = $('#cAir'); if (a) a.textContent = fmt.n(air); + const sh = $('#cShip'); if (sh) sh.textContent = fmt.n(GE.SHIPS.length); + const ck = $('#nowClock'); if (ck) ck.textContent = fmt.hm(Date.now()) + ' UTC'; + for (const el of $$('.card[data-id]')) { + const s = GE.SIT.byId[el.dataset.id]; if (!s) continue; + const [m, ml] = s.metric(); const me = el.querySelector('[data-m]'), mle = el.querySelector('[data-ml]'); + if (me && me.innerHTML !== m) { me.innerHTML = m; } if (mle && mle.innerHTML !== ml) mle.innerHTML = ml; + const ag = el.querySelector('[data-age]'); if (ag) ag.textContent = `${s.source} · ${fmt.ago(Date.now() - s.updatedAt)}`; + } +}; + +/* ---------- hero morph: card → live globe ---------- */ +NOWV.open = function (s, cardEl, o = {}) { + const wide = APP.isWide(); + const thumb = cardEl?.querySelector('.thumb canvas'); + if (wide || !thumb || prefersReduced()) { GE.sheet.open(s.id, { ...o, fade: !wide }); return; } + const r = thumb.getBoundingClientRect(); const app = $('#app').getBoundingClientRect(); + const M = $('#morph'); M.innerHTML = ''; const cv = document.createElement('canvas'); cv.width = thumb.width; cv.height = thumb.height; cv.getContext('2d').drawImage(thumb, 0, 0); M.append(cv); + // target: the visible world above the sheet's medium detent + const tw = app.width, th = app.height * 0.57; + Object.assign(M.style, { left: '0px', top: '0px', width: tw + 'px', height: th + 'px', borderRadius: '18px', opacity: '1', transition: 'none' }); + const sx = r.width / tw, sy = r.height / th; + M.style.transformOrigin = '0 0'; + M.style.transform = `translate(${r.left - app.left}px, ${r.top - app.top}px) scale(${sx}, ${sy})`; + M.classList.add('on'); NOWV._morphCard = cardEl; + cardEl.style.visibility = 'hidden'; + GE.sheet.open(s.id, { ...o, morph: true }); + requestAnimationFrame(() => requestAnimationFrame(() => { + const k = GE.HASH && GE.HASH.slow ? +GE.HASH.slow : 1; M.style.transition = `transform ${0.62 * k}s cubic-bezier(.2,.9,.2,1), border-radius ${0.62 * k}s ease, opacity ${0.5 * k}s ease ${0.34 * k}s`; + M.style.transform = 'translate(0,0) scale(1,1)'; M.style.borderRadius = '0px'; M.style.opacity = '0'; + setTimeout(() => { M.classList.remove('on'); cardEl.style.visibility = ''; }, 900 * k); + })); +}; +NOWV.foldBack = function (id) { + const cardEl = $(`#v-now .card[data-id="${id}"]`); const M = $('#morph'); + if (!cardEl || prefersReduced() || APP.isWide()) return false; + const thumb = cardEl.querySelector('.thumb canvas'); const app = $('#app').getBoundingClientRect(); + M.innerHTML = ''; const cv = document.createElement('canvas'); cv.width = thumb.width; cv.height = thumb.height; cv.getContext('2d').drawImage(thumb, 0, 0); M.append(cv); + const tw = app.width, th = app.height * 0.57; + Object.assign(M.style, { left: '0px', top: '0px', width: tw + 'px', height: th + 'px', transformOrigin: '0 0', transition: 'none', transform: 'none', borderRadius: '0px', opacity: '0' }); + M.classList.add('on'); cardEl.style.visibility = 'hidden'; + requestAnimationFrame(() => { + const r = thumb.getBoundingClientRect(); + M.style.transition = 'transform .55s cubic-bezier(.3,.8,.2,1), border-radius .55s ease, opacity .18s ease'; + M.style.opacity = '1'; M.style.borderRadius = '18px'; + M.style.transform = `translate(${r.left - app.left}px, ${r.top - app.top}px) scale(${r.width / tw}, ${r.height / th})`; + setTimeout(() => { M.classList.remove('on'); cardEl.style.visibility = ''; cardEl.classList.add('flash'); setTimeout(() => cardEl.classList.remove('flash'), 1200); }, 600); + }); + return true; +}; diff --git a/mobile/vision/src/js/62-sheet.js b/mobile/vision/src/js/62-sheet.js new file mode 100644 index 000000000..a7763627f --- /dev/null +++ b/mobile/vision/src/js/62-sheet.js @@ -0,0 +1,196 @@ +/* Situation sheet: detents (peek / medium / large), drag with velocity snapping, the world always + wins (touching the globe collapses to peek). Tufte-grade brief: direct-labelled sparklines with + uncertainty, small multiples rendered from the globe, evidence strip, every number sourced + aged. */ +const SH = (GE.sheet = { id: null, detent: 'medium' }); +const sheetEl = () => $('#sheet'); +SH.heights = function () { + const H = $('#app').clientHeight; const sab = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--sab')) || 0; + return { peek: 112 + sab, medium: Math.round(H * 0.45), large: Math.round(H * 0.92), H }; +}; +SH.setDetent = function (d, animate = true) { + SH.detent = d; const el = sheetEl(); if (APP.isWide()) { el.classList.add('wopen'); return; } + const hs = SH.heights(); const full = el.offsetHeight || hs.H; const vis = hs[d]; + el.classList.toggle('drag', !animate); + el.style.transform = `translateY(${Math.max(0, full - vis)}px)`; + const sc = $('#sheetC'); sc.style.overflowY = d === 'large' ? 'auto' : 'hidden'; sc.style.touchAction = d === 'large' ? 'pan-y' : 'none'; + if (d !== 'large') sc.scrollTop = 0; + SH.targetShift = d === 'large' ? 0.75 : clamp(vis / hs.H, 0, 0.8); +}; +SH.open = function (id, o = {}) { + const s = GE.SIT.byId[id]; if (!s) return; + const W = GE.world; + SH.id = id; SH.sit = s; + if (APP.tab !== 'globe' && !APP.isWide()) { APP.tab = 'globe'; $('#app').dataset.tab = 'globe'; $$('.tab').forEach((b) => b.classList.toggle('on', b.dataset.tab === 'globe')); $$('.pane .view').forEach((v) => v.classList.remove('on')); APP.moveLens(); } + APP.setMode('situation'); + // layers & time window + SH._savedLayers = SH._savedLayers || W.layers.map((l) => l.on); + for (const lid of s.layers || []) if (W.layerById[lid]) W.layerById[lid].on = true; + bus.emit('layers', W.layers); + if (s.time) { W.setWindow({ start: s.time.start ?? s.time.at - 6 * 3600000, end: s.time.end ?? s.time.at + 6 * 3600000 }); W.setTime(s.time.at); } + W.auroraK = s.auroraK ?? 0.85; + GE.setExtras && GE.setExtras(s.id); + // camera + const cam = GE.SIT.cameraFor(s); + const hs = SH.heights(); + const shiftY = APP.isWide() ? 0 : hs.medium / hs.H; + SH.targetShift = shiftY; + Cam.autoSpin = 0; + if (o.morph) { Cam.set({ ...cam, shiftY, shiftX: 0 }); Cam.flyTo({ range: cam.range * 0.82, heading: cam.heading + 0.12 }, { duration: 2.6 }); } + else Cam.flyTo({ ...cam, shiftY, shiftX: 0 }); + W.focus = s.kind === 'recon' ? null : { lat: s.lat, lon: s.lon, k: 0.35 }; + SH.render(s); + const el = sheetEl(); + if (APP.isWide()) { el.classList.add('wopen'); } + else { el.classList.add('drag'); el.style.transform = 'translateY(100%)'; requestAnimationFrame(() => requestAnimationFrame(() => SH.setDetent(o.detent || 'medium'))); } + if (o.ride && s.ride) setTimeout(() => GE.ride.start({ kind: 'heli', id: 0 }), 650); + APP.updateChrome(); +}; +SH.close = function (silent) { + if (!SH.id) return; const id = SH.id; const W = GE.world; + const el = sheetEl(); el.classList.remove('drag', 'wopen'); el.style.transform = APP.isWide() ? '' : 'translateY(100%)'; + SH.id = null; W.focus = null; GE.setExtras && GE.setExtras(null); + if (SH._savedLayers) { W.layers.forEach((l, i) => (l.on = SH._savedLayers[i])); SH._savedLayers = null; bus.emit('layers', W.layers); } + W.setWindow(null); W.setTime(null); W.auroraK = 0.85; + APP.setMode(''); + if (silent) return; + const fromNow = !APP.isWide() && GE.now && $(`#v-now .card[data-id="${id}"]`); + if (fromNow) { APP.setTab('now', { force: true }); requestAnimationFrame(() => GE.now.foldBack(id)); } + else { Cam.flyTo({ range: Math.max(Cam.range * 3, 0.6), shiftY: APP.isWide() ? 0 : 0.06, tilt: 0 }); } +}; + +/* drag */ +SH.initDrag = function () { + const el = sheetEl(); let st = null; + const begin = (e) => { + if (APP.isWide()) return; + const onGrab = e.target.closest('#grab'); const sc = $('#sheetC'); + if (!onGrab && SH.detent === 'large') return; + if (e.target.closest('button, a, input, textarea, .evid, .multi')) return; + st = { y: e.clientY, y0: e.clientY, t: performance.now(), base: new DOMMatrix(getComputedStyle(el).transform).m42, moved: 0, id: e.pointerId, samples: [] }; + el.setPointerCapture?.(e.pointerId); + }; + el.addEventListener('pointerdown', begin); + el.addEventListener('pointermove', (e) => { + if (!st || e.pointerId !== st.id) return; + const dy = e.clientY - st.y0; st.moved = Math.max(st.moved, Math.abs(dy)); + if (st.moved < 4) return; + el.classList.add('drag'); + const hs = SH.heights(); const full = el.offsetHeight; const minY = full - hs.large, maxY = full - hs.peek + 40; + let y = st.base + dy; if (y < minY) y = minY - Math.sqrt(minY - y) * 3; if (y > maxY) y = maxY + Math.sqrt(y - maxY) * 3; + el.style.transform = `translateY(${y}px)`; + st.samples.push({ t: performance.now(), y: e.clientY }); if (st.samples.length > 6) st.samples.shift(); + SH.targetShift = clamp((full - y) / hs.H, 0, 0.8); + }); + const end = (e) => { + if (!st || e.pointerId !== st.id) return; + const s0 = st.samples[0], s1 = st.samples[st.samples.length - 1]; + const v = s0 && s1 && s1.t > s0.t ? (s1.y - s0.y) / (s1.t - s0.t) : 0; // px/ms + const hs = SH.heights(); const full = el.offsetHeight; + const cur = new DOMMatrix(getComputedStyle(el).transform).m42; const visNow = full - cur + -v * 220; + if (st.moved >= 4) { + if (visNow < hs.peek * 0.6 && v > 0.6) { SH.close(); st = null; return; } + const ds = ['peek', 'medium', 'large']; let best = 'medium', bd = 1e9; for (const d of ds) { const dd = Math.abs(hs[d] - visNow); if (dd < bd) { bd = dd; best = d; } } + SH.setDetent(best); haptic(5); + } else if (e.target.closest('#grab')) { SH.setDetent(SH.detent === 'peek' ? 'medium' : SH.detent === 'medium' ? 'large' : 'medium'); } + st = null; + }; + el.addEventListener('pointerup', end); el.addEventListener('pointercancel', end); + bus.on('globe-touch', () => { if (SH.id && SH.detent !== 'peek' && !APP.isWide()) SH.setDetent('peek'); }); + $('#back').addEventListener('click', () => { if (APP.mode === 'situation') SH.close(); }); + $('#sitFollow').addEventListener('click', () => { if (!SH.id) return; APP.following = SH.id === 'cyclone' || !SH.sit.accessory ? 'cyclone' : SH.id; APP.toast(`${ic('bell', 'sm')} Following · alerts within your radius`); haptic(10); }); + $('#sitShare').addEventListener('click', () => APP.toast(`${ic('link', 'sm')} Link copied · opens at this place & time`)); +}; + +/* ---------- content ---------- */ +function sparkSVG(sr, w) { + const hgt = 46, pad = 3; const d = sr.data; const n = d.length; + const band = sr.band || 0; + let mn = Math.min(...d) - band, mx = Math.max(...d) + band; if (mx - mn < 1e-6) { mx += 1; mn -= 1; } + const X = (i) => pad + (i / (n - 1)) * (w - pad * 2 - 34), Y = (v) => pad + 6 + (1 - (v - mn) / (mx - mn)) * (hgt - pad * 2 - 12); + const split = sr.split ?? n - 1; + const path = (a, b) => d.slice(a, b + 1).map((v, k) => `${k ? 'L' : 'M'}${X(a + k).toFixed(1)} ${Y(v).toFixed(1)}`).join(''); + let s = ''; + if (band) { const up = d.map((v, i) => `${i ? 'L' : 'M'}${X(i).toFixed(1)} ${Y(v + band * (i > split ? 1 + (i - split) * 0.35 : 1)).toFixed(1)}`).join(''); const lo = d.map((v, i) => [X(i), Y(v - band * (i > split ? 1 + (i - split) * 0.35 : 1))]).reverse().map(([x, y]) => `L${x.toFixed(1)} ${y.toFixed(1)}`).join(''); s += ``; } + s += ``; + if (split < n - 1) s += ``; + const iMax = d.indexOf(Math.max(...d)), iMin = d.indexOf(Math.min(...d)); + const f = sr.fmt || ((v) => v); + s += `${f(d[iMax])}`; + if (iMin !== iMax) s += `${f(d[iMin])}`; + const ln = split; s += `${f(d[ln])}`; + if (split < n - 1) s += `forecast`; + return `${s}`; +} +GE.sparkSVG = sparkSVG; +function barsSVG(items, w) { + const hgt = items.length * 22; let s = ''; + items.forEach(([k, v], i) => { const y = i * 22; s += `${k}${Math.round(v * 100)}`; }); + return `${s}`; +} +SH.render = function (s) { + const c = GE.FAM[s.fam].color; const el = $('#sheetC'); + const ms = s.metrics(); + const live = s.live ? `Live` : s.d4 ? `4D` : `Replay`; + const acts = [ + ``, + s.ride ? `` : ``, + ``, + ``, + ].join(''); + const b = s.brief || {}; + el.innerHTML = ` +
    ${GE.FAM[s.fam].name}${live}${fmt.ago(Date.now() - s.updatedAt)}
    +

    ${esc(s.title)}

    ${esc(s.place)} · ${fmt.ll(s.lat, s.lon, 2)}
    +
    ${ms.map((m) => `
    ${m.v}${m.u}
    ${m.l}
    ${m.s}
    `).join('')}
    +
    ${acts}
    +
    + ${b.lede ? `

    ${esc(b.lede)}

    ` : ''} + ${b.series?.length ? `

    Signals

    ` : ''} + ${b.multiples ? `

    ${esc(b.multiples.label)}

    ` : ''} +

    Evidence

    +

    Sources

    ${(b.sources || []).map(([n, a, st]) => `
    ${esc(n)}${esc(a)}
    `).join('')} +
    Sun, terminator & timecomputed
    + ${s.thread ? `
    ` : ''} +

    Concept · illustrative data. People, handles, posts and claims shown here are fictional.

    +
    `; + const w = Math.max(240, (APP.isWide() ? $('#sheet').clientWidth : $('#app').clientWidth) - 36); + if (b.series?.length) $('#shSeries').innerHTML = b.series.map((sr) => `
    ${esc(sr.label)}${(sr.fmt || ((v) => v))(sr.data[sr.split ?? sr.data.length - 1])} ${esc(sr.unit)}${sparkSVG(sr, w)}
    ${esc(sr.src)}${sr.band ? '± band = uncertainty' : ''}
    `).join(''); + if (b.multiples) { + const mh = $('#shMulti'); + if (b.multiples.kind === 'bars') { mh.style.gridTemplateColumns = '1fr'; mh.innerHTML = barsSVG(b.multiples.items, w); } + else for (const it of b.multiples.items) { + const fig = h('figure'); const cv = h('canvas', { width: 180, height: 180 }); fig.append(cv, h('figcaption', { html: it.cap })); mh.append(fig); + const spec = it.cam || { lat: s.lat, lon: s.lon, range: 0.2, heading: 0, tilt: 0.2 }; + TH.fallback(s, cv); + TH.enqueue(() => { if (!document.body.contains(cv)) return; TH.render(spec, 180, 180, { at: Date.now() + it.h * 3600000, layers: s.layers, canvas: cv, px: 1.0 }); }); + } + } + // evidence strip — each tile is rendered from the globe near the place (signed captures, illustrative) + const ev = $('#shEvid'); const people = ['tamang', 'hydro', 'sky', 'ais', 'geo', 'crowd']; + const cam0 = GE.SIT.cameraFor(s) || { lat: s.lat, lon: s.lon, range: 0.01 }; + for (let i = 0; i < 5; i++) { + const p = GE.PEOPLE[people[(i + s.id.length) % people.length]]; + const cv = h('canvas', { width: 232, height: 168 }); const im = h('div', { class: 'im' }); im.append(cv); cv.style.cssText = 'width:100%;height:100%;display:block'; + const near = cam0.range < 0.02; + const spec = { lat: cam0.lat + (hash01(i + 3) - 0.5) * (near ? 0.01 : 0.6), lon: cam0.lon + (hash01(i + 9) - 0.5) * (near ? 0.012 : 0.6), range: near ? cam0.range * (0.35 + i * 0.12) : 0.004 + i * 0.003, heading: i * 1.3 + 0.4, tilt: 1.25 }; + TH.fallback({ ...s, thumbCam: spec }, cv); + TH.enqueue(() => { if (!document.body.contains(cv)) return; TH.render(spec, 232, 168, { at: s.time?.at ?? null, layers: s.layers, canvas: cv, px: 1.0, extraSprites: GE.world.activeExtras?.sprites, extraLines: GE.world.activeExtras?.lines }); }); + im.insertAdjacentHTML('beforeend', ``); + const card = h('div', { class: 'ev' }, im, h('div', { class: 'cap', html: `@${p.h}${['Signed · IMU ✓ GPS ±5 m', 'Signed · horizon ✓', 'Signed · 12 s clip', 'Signed · heading ✓', 'Signed · audio sync'][i]}
    ${fmt.ago((i + 1) * 1000 * 60 * (7 + i * 13))}` })); + ev.append(card); + } + el.querySelectorAll('[data-a]').forEach((btn) => btn.addEventListener('click', () => SH.action(btn.dataset.a, s))); +}; +SH.tick = function () { + if (!SH.id) return; const s = SH.sit; const ms = s.metrics(); const host = $('#shMetrics'); if (!host) return; + host.querySelectorAll('.metric').forEach((m, i) => { const v = m.querySelector('.v'); const html = `${ms[i].v}${ms[i].u}`; if (v.innerHTML !== html) v.innerHTML = html; }); + const a = $('[data-sage]'); if (a) a.textContent = fmt.ago(Date.now() - s.updatedAt); +}; +SH.action = function (a, s) { + haptic(6); + if (a === 'follow') { APP.following = s.accessory ? s.id : 'cyclone'; APP.toast(`${ic('bell', 'sm')} Following ${esc(s.title.split(' — ')[0])}`); } + if (a === 'ride') GE.ride.start({ kind: 'heli', id: 0 }); + if (a === 'replay') { GE.world.setTime(Date.now() - 6 * 3600000); APP.toast(`${ic('clock', 'sm')} Replaying the last 6 h — drag the ribbon`); SH.setDetent('peek'); } + if (a === 'eye') { const off = geo.dest(s.lat, s.lon, 0.7, 0.8); Cam.flyTo({ lat: off[0], lon: off[1], range: 0.0006, tilt: 1.1 }); SH.setDetent('peek'); APP.toast(`${ic('video', 'sm')} Nearest eye · public camera 0.8 km · illustrative`); } + if (a === 'thread') { if (s.thread) { SH.close(true); APP.setTab('threads'); GE.threads.openWs(s.thread); } else APP.toast(`${ic('threads', 'sm')} Thread started · invite people to add observations`); } +}; diff --git a/mobile/vision/src/js/63-globe-ui.js b/mobile/vision/src/js/63-globe-ui.js new file mode 100644 index 000000000..c40754a3e --- /dev/null +++ b/mobile/vision/src/js/63-globe-ui.js @@ -0,0 +1,221 @@ +/* Globe chrome: lens dock (8 families), Control-Center layer grid (long-press = solo), visual lenses, + haptic time ribbon (−72 h ← NOW → +120 h) with event pips, pick card, search. */ +const GUI = (GE.gui = {}); +const FAMS = Object.keys(GE.FAM); +const LENSES = [ + ['cinematic', 'Cinematic', 'linear-gradient(135deg,#0B2A55,#1E6FB8 45%,#F2B36B 80%,#2a1a10)'], + ['clear', 'Clear', 'linear-gradient(135deg,#3B6EA8,#8FB9E3 50%,#C9D9A4)'], + ['night', 'Night', 'radial-gradient(circle at 60% 40%,#FFC46B 0,#7A4A12 8%,#0B1426 30%,#04070D)'], + ['thermal', 'Thermal', 'linear-gradient(90deg,#08001A,#5A0F8C 30%,#E3263F 55%,#FF9F00 78%,#FFFBD6)'], + ['nvg', 'NVG', 'radial-gradient(circle,#B8FFB0 0,#2EA043 35%,#05200C 75%)'], +]; +GUI.famCount = (f) => GE.world.layers.filter((l) => l.fam === f && l.on).reduce((s, l) => s + (l.count || 0), 0); + +/* ---------- dock ---------- */ +GUI.renderDock = function () { + const d = $('#dock'); const W = GE.world; + d.innerHTML = FAMS.map((f) => { const F = GE.FAM[f]; const on = W.layers.some((l) => l.fam === f && l.on); return ``; }).join(''); + $$('#dock .fam').forEach((b) => { + let tm = null, long = false; + b.addEventListener('pointerdown', () => { long = false; tm = setTimeout(() => { long = true; GUI.soloFam(b.dataset.f); }, 520); }); + const clr = () => clearTimeout(tm); + b.addEventListener('pointerup', clr); b.addEventListener('pointerleave', clr); b.addEventListener('pointercancel', clr); + b.addEventListener('click', () => { if (long) return; GUI.openCC(b.dataset.f); }); + b.addEventListener('contextmenu', (e) => e.preventDefault()); + }); +}; +GUI.soloFam = function (f) { + const W = GE.world; + if (GUI.solo === f) { if (GUI._preSolo) W.layers.forEach((l, i) => (l.on = GUI._preSolo[i])); GUI.solo = null; APP.toast(`Restored all families`); } + else { if (!GUI.solo) GUI._preSolo = W.layers.map((l) => l.on); GUI.solo = f; W.layers.forEach((l) => (l.on = l.fam === f ? (l.on || ['flights', 'ais', 'sats', 'quakes', 'fires', 'cyclones', 'cctv', 'holo', 'venues', 'clouds', 'radar', 'gnss'].includes(l.id)) : l.id === 'clouds')); APP.toast(`● Soloed ${GE.FAM[f].name} · long-press to restore`); } + haptic([8, 30, 8]); bus.emit('layers', W.layers); +}; + +/* ---------- Control Center grid ---------- */ +GUI.ccHTML = function (inPane) { + const W = GE.world; + const lens = `
    ${LENSES.map(([id, n, bg]) => ``).join('')}
    `; + const fams = FAMS.map((f) => { const F = GE.FAM[f]; const ls = W.layers.filter((l) => l.fam === f); + return `
    ${F.name}${ls.length}
    ${ls.map((l) => ``).join('')}
    `; }).join(''); + return `

    Layers

    ${W.layers.length} live layers in 8 families · long-press a family to solo

    ${inPane ? '' : ``}
    Lens
    ${lens}${fams}`; +}; +GUI.bindCC = function (root) { + const W = GE.world; + root.querySelectorAll('[data-l]').forEach((b) => b.addEventListener('click', () => { const l = W.layerById[b.dataset.l]; l.on = !l.on; b.classList.toggle('on', l.on); haptic(4); bus.emit('layers', W.layers); })); + root.querySelectorAll('[data-lens]').forEach((b) => b.addEventListener('click', () => { W.setLens(b.dataset.lens); root.querySelectorAll('[data-lens]').forEach((x) => x.classList.toggle('on', x === b)); haptic(6); })); + root.querySelectorAll('[data-solo]').forEach((b) => b.addEventListener('click', () => { GUI.soloFam(b.dataset.solo); GUI.refreshCC(); })); + root.querySelectorAll('[data-fh]').forEach((hd) => { let tm; hd.addEventListener('pointerdown', (e) => { if (e.target.closest('button')) return; tm = setTimeout(() => { GUI.soloFam(hd.dataset.fh); GUI.refreshCC(); }, 520); }); const c = () => clearTimeout(tm); hd.addEventListener('pointerup', c); hd.addEventListener('pointerleave', c); }); + root.querySelector('#ccX')?.addEventListener('click', GUI.closeCC); +}; +GUI.openCC = function (fam) { + if (APP.isWide()) { if (APP.tab !== 'globe') APP.setTab('globe'); GUI.renderLayersPane(); const t = $('#ccf-' + fam); if (t) t.scrollIntoView({ behavior: 'smooth', block: 'start' }); return; } + const cc = $('#cc'); cc.innerHTML = GUI.ccHTML(false); GUI.bindCC(cc); cc.classList.add('on'); + if (fam) requestAnimationFrame(() => { const t = $('#ccf-' + fam); if (t) cc.scrollTop = t.offsetTop - 60; }); + haptic(6); +}; +GUI.refreshCC = function () { const cc = $('#cc'); if (cc.classList.contains('on')) { const st = cc.scrollTop; cc.innerHTML = GUI.ccHTML(false); GUI.bindCC(cc); cc.scrollTop = st; } if (APP.isWide() && APP.tab === 'globe') GUI.renderLayersPane(); }; +GUI.closeCC = () => $('#cc').classList.remove('on'); +GUI.renderLayersPane = function () { const v = $('#v-layers'); const st = v.scrollTop; v.innerHTML = `
    ${GUI.ccHTML(true)}
    `; GUI.bindCC(v); v.scrollTop = st; }; + +/* ---------- ribbon ---------- */ +const RB = { span: 30, vel: 0, drag: null }; +GUI.initRibbon = function () { + const el = $('#ribbon'), cv = el.querySelector('canvas'); + const W = GE.world; + const hpp = () => RB.span / Math.max(1, el.clientWidth); + el.addEventListener('pointerdown', (e) => { if (e.target.closest('#rbNow')) return; el.setPointerCapture(e.pointerId); RB.drag = { x: e.clientX, t: performance.now(), lastHour: Math.floor(W.offsetH) }; RB.vel = 0; Cam.lastInput = performance.now(); }); + el.addEventListener('pointermove', (e) => { + if (!RB.drag) return; const now = performance.now(); const dx = e.clientX - RB.drag.x; const dt = Math.max(1, now - RB.drag.t); + const speed = Math.abs(dx) / dt; // px/ms + const k = clamp(0.22 + speed * 1.1, 0.22, 2.6); // slow → minutes, fast → hours + const dh = -dx * hpp() * k; + GUI.scrubTo(W.offsetH + dh); + RB.vel = dh / dt * 16; RB.drag.x = e.clientX; RB.drag.t = now; + const hr = Math.floor(W.offsetH); if (hr !== RB.drag.lastHour) { RB.drag.lastHour = hr; haptic(3); } + }); + const up = () => { RB.drag = null; }; + el.addEventListener('pointerup', up); el.addEventListener('pointercancel', up); + $('#rbNow').addEventListener('click', () => GUI.snapNow()); + GUI.drawRibbon(); +}; +GUI.scrubTo = function (h) { + const W = GE.world; const win = W.getWindow(); const nowMs = Date.now(); + const lo = (win.start - nowMs) / 3600000, hi = (win.end - nowMs) / 3600000; + W.setTime(nowMs + clamp(h, lo, hi) * 3600000); +}; +GUI.snapNow = function () { + const W = GE.world; const win = W.getWindow(); + if (W.window) { GUI.scrubTo(((win.start + win.end) / 2 - Date.now()) / 3600000); return; } + const from = W.offsetH; const t0 = performance.now(); haptic(12); + const anim = () => { const u = clamp((performance.now() - t0) / 600, 0, 1); const e = ease.outBack(u); const v = from * (1 - e); if (u >= 1) { W.setTime(null); return; } W.setTime(Date.now() + v * 3600000); requestAnimationFrame(anim); }; + anim(); +}; +GUI.ribbonFrame = function () { + if (!RB.drag && Math.abs(RB.vel) > 1e-4) { GUI.scrubTo(GE.world.offsetH + RB.vel); RB.vel *= 0.92; } + GUI.drawRibbon(); +}; +GUI.drawRibbon = function () { + const el = $('#ribbon'); if (!el || !el.offsetWidth) return; const cv = el.querySelector('canvas'); + const W = GE.world; const dpr = Math.min(devicePixelRatio || 1, 2); + const w = el.clientWidth, hh = el.clientHeight; + if (cv.width !== Math.round(w * dpr)) { cv.width = Math.round(w * dpr); cv.height = Math.round(hh * dpr); } + const cx = cv.getContext('2d'); cx.setTransform(dpr, 0, 0, dpr, 0, 0); cx.clearRect(0, 0, w, hh); + const win = W.getWindow(); const nowMs = Date.now(); + RB.span = W.window ? Math.max(4, (win.end - win.start) / 3600000 * 0.7) : 30; + const cur = W.offsetH; const pxh = w / RB.span; const X = (hr) => w / 2 + (hr - cur) * pxh; + const lo = (win.start - nowMs) / 3600000, hi = (win.end - nowMs) / 3600000; + // past / forecast regions + const xNow = X(0); + if (!W.window) { + cx.fillStyle = 'rgba(138,180,248,.08)'; cx.fillRect(Math.max(0, xNow), 0, Math.max(0, w - Math.max(0, xNow)), hh); + cx.save(); cx.beginPath(); cx.rect(Math.max(0, xNow), 0, w, hh); cx.clip(); cx.strokeStyle = 'rgba(138,180,248,.10)'; cx.lineWidth = 1; for (let x = Math.floor(xNow) - hh; x < w; x += 7) { cx.beginPath(); cx.moveTo(x, hh); cx.lineTo(x + hh, 0); cx.stroke(); } cx.restore(); + } + // out-of-window shade + cx.fillStyle = 'rgba(0,0,0,.35)'; if (X(lo) > 0) cx.fillRect(0, 0, X(lo), hh); if (X(hi) < w) cx.fillRect(X(hi), 0, w - X(hi), hh); + // ticks + const h0 = Math.floor(cur - RB.span / 2) - 1, h1 = Math.ceil(cur + RB.span / 2) + 1; + cx.font = '600 10px ' + getComputedStyle(document.body).fontFamily; cx.textAlign = 'center'; + for (let k = h0; k <= h1; k++) { + const x = X(k); const abs = new Date(nowMs + k * 3600000); const hrUTC = abs.getUTCHours(); + const major = hrUTC % 6 === 0, day = hrUTC === 0; + cx.strokeStyle = day ? 'rgba(255,255,255,.55)' : major ? 'rgba(255,255,255,.32)' : 'rgba(255,255,255,.14)'; + cx.lineWidth = day ? 1.4 : 1; + const th = day ? 18 : major ? 12 : 6; cx.beginPath(); cx.moveTo(x, hh - 6); cx.lineTo(x, hh - 6 - th); cx.stroke(); + if (major && pxh * 6 > 34) { cx.fillStyle = day ? 'rgba(255,255,255,.85)' : 'rgba(255,255,255,.45)'; cx.fillText(day ? abs.toLocaleDateString('en-GB', { weekday: 'short', day: 'numeric', timeZone: 'UTC' }) : String(hrUTC).padStart(2, '0'), x, hh - 26 - (day ? 2 : 0)); } + // minute ticks when zoomed (slow scrub) + } + // NOW marker + if (!W.window && xNow > -2 && xNow < w + 2) { cx.fillStyle = '#FF453A'; cx.fillRect(xNow - 1, 4, 2, hh - 8); } + // event pips + const pips = GUI.pips(); + for (const p of pips) { const x = X(p.h); if (x < -6 || x > w + 6) continue; cx.fillStyle = p.c; cx.beginPath(); cx.arc(x, hh - 6, 3.2, 0, TAU); cx.fill(); cx.shadowColor = p.c; cx.shadowBlur = 8; cx.beginPath(); cx.arc(x, hh - 6, 2, 0, TAU); cx.fill(); cx.shadowBlur = 0; if (Math.abs(x - w / 2) < 60) { cx.fillStyle = 'rgba(255,255,255,.7)'; cx.font = '600 9.5px ' + getComputedStyle(document.body).fontFamily; cx.fillText(p.l, x, hh - 14); } } + // readout + const simMs = nowMs + cur * 3600000; + $('#rbTime').textContent = fmt.utc(simMs); + $('#rbRel').textContent = W.window ? '' : W.live ? '' : fmt.rel(cur); + el.classList.toggle('future', cur > 0.02 && !W.window); + el.classList.toggle('breath', W.live && !prefersReduced()); + const nb = $('#rbNow'); nb.classList.toggle('live', W.live); nb.innerHTML = W.window ? `${ic('clock', 'xs')}EVENT` : W.live ? 'LIVE' : 'NOW'; + const stt = $('#statusTxt'); if (stt) { stt.textContent = W.window ? 'Replay' : W.live ? 'Live' : cur > 0 ? 'Forecast' : 'Replay'; $('#statusTime').textContent = fmt.utc(simMs, false) + ' UTC'; $('#status .dot').style.background = W.live ? '' : cur > 0 ? 'var(--wx)' : 'var(--gold)'; } +}; +GUI.pips = function () { + const nowMs = Date.now(); const W = GE.world; + if (W.window && GE.threads?.ws?.beats) return GE.threads.ws.beats.map((b) => ({ h: (b.at - nowMs) / 3600000, c: '#E9C46A', l: b.t })); + return [{ h: GE.BIGQ.t / 3600, c: '#FF6A3D', l: 'M6.4' }, { h: 2.24, c: '#C9A7FF', l: 'Launch' }, { h: 40, c: '#FF6A3D', l: 'Landfall' }, { h: (GE.SIT.byId.aurora.time.at - nowMs) / 3600000, c: '#5CF2A0', l: 'Aurora' }, { h: -30, c: '#FF6A3D', l: 'Fire run' }, { h: (SIT._iss?.start - nowMs) / 3600000 || 3, c: '#C9A7FF', l: 'ISS' }]; +}; + +/* ---------- pick card ---------- */ +GUI.showPick = function (p) { + const el = $('#pick'); const W = GE.world; + if (!p) { el.classList.remove('on'); W.sel = null; W.selFlight = -1; W.selSat = -1; W.selRoute = null; return; } + const famOf = { flight: 'sky', heli: 'sky', ship: 'sea', sat: 'orbit', quake: 'haz', holo: 'eyes', situation: 'haz' }[p.kind] || 'sky'; + const icn = { flight: 'airplane', heli: 'helicopter', ship: 'ferry', sat: 'iss', quake: 'wave', holo: 'seal', situation: 'radiowaves' }[p.kind]; + W.sel = { ...p, v: p.kind === 'flight' ? v3.scale(geo.vec(p.lat, p.lon), 1 + (p.altKm * W.altX) / EARTH_KM) : geo.vec(p.lat, p.lon, p.altKm || 0.1) }; + W.selFlight = p.kind === 'flight' ? p.id : -1; W.selSat = p.kind === 'sat' ? p.id : -1; + if (p.kind === 'flight') { const m = p.meta; W.selRoute = (() => { const a = m.from, b = m.to; const pts = []; for (let i = 0; i <= 64; i++) { const t = i / 64; pts.push(v3.scale(geo.slerp(a.v, b.v, t), 1 + 0.002)); } return pts; })(); } else W.selRoute = null; + let kv = ''; + if (p.kind === 'flight') kv = `
    ${fmt.n(Math.round(p.altKm * 3281 / 100) * 100)}ft
    ${Math.round(p.meta.f.speed / 1.852)}kt
    ${String(Math.round(((p.hdg * R2D) + 360) % 360)).padStart(3, '0')}°hdg
    ${Math.round(p.meta.prog * 100)}%route
    `; + else if (p.kind === 'ship') kv = `
    ${fmt.ll(p.lat, p.lon, 2)}position
    `; + else if (p.kind === 'heli') kv = `
    ${Math.round(p.altKm * 3281)}ft AGL
    ${String(Math.round(((p.hdg * R2D) + 360) % 360)).padStart(3, '0')}°hdg
    `; + else kv = `
    ${fmt.ll(p.lat, p.lon, 2)}position
    `; + const canRide = p.kind === 'flight' || p.kind === 'heli'; + el.style.setProperty('--c', GE.FAM[famOf].color); + el.innerHTML = `
    ${ic(icn)}
    ${esc(p.title)}${esc(p.subtitle || '')}
    ${kv}
    +
    `; + el.classList.add('on'); + el.querySelector('.x').addEventListener('click', () => GUI.showPick(null)); + el.querySelectorAll('[data-p]').forEach((b) => b.addEventListener('click', () => { + const a = b.dataset.p; haptic(6); + if (a === 'ride' && canRide) { GUI.showPick(null); GE.ride.start(p); } + if (a === 'follow') APP.toast(`${ic('bell', 'sm')} Following ${esc(p.title)}`); + if (a === 'eye') { Cam.flyTo({ lat: p.lat, lon: p.lon, range: Math.min(Cam.range, 0.004), tilt: 1.0 }); APP.toast(`${ic('video', 'sm')} Nearest eye · public camera ${(0.6 + hash01(p.id || 1) * 3).toFixed(1)} km · illustrative`); } + if (a === 'thread') APP.toast(`${ic('threads', 'sm')} Thread started for ${esc(p.title)}`); + })); +}; +bus.on('tap', ({ x, y }) => { + if (APP.mode === 'ride' || APP.tab === 'capture') return; + if (APP.tab !== 'globe' && !APP.isWide()) return; + const v = GE.mainView; if (!v) return; + const p = GE.world.pick(v, x, y, 28); + if (p && p.kind === 'situation') { GE.sheet.open(p.id, { fromGlobe: true }); return; } + GUI.showPick(p); if (p) haptic(5); +}); + +/* ---------- search ---------- */ +GUI.openSearch = function () { + const el = $('#search'); + el.innerHTML = `
    ${ic('search')}
    `; + el.classList.add('on'); + const q = $('#sq'); const run = () => GUI.searchResults(q.value.trim()); + q.addEventListener('input', run); run(); setTimeout(() => q.focus(), 60); + $('#sx').addEventListener('click', () => el.classList.remove('on')); +}; +GUI.searchResults = function (q) { + const res = $('#sres'); const ql = q.toLowerCase(); const W = GE.world; + const groups = []; + const sits = GE.SIT.list.filter((s) => !ql || (s.title + s.place).toLowerCase().includes(ql)).slice(0, ql ? 6 : 4); + groups.push(['Situations', sits.map((s) => ({ c: GE.FAM[s.fam].color, i: GE.FAM[s.fam].icon, t: s.title, s: s.place, go: () => { $('#search').classList.remove('on'); GE.sheet.open(s.id, { fromGlobe: true }); } }))]); + const places = [...GE.CITY_V.map((c) => ({ ...c, k: 'city' })), ...GE.AP.map((a) => ({ name: `${a.iata} · ${a.city}`, lat: a.lat, lon: a.lon, k: 'ap' }))].filter((p) => ql && p.name.toLowerCase().includes(ql)).slice(0, 5); + groups.push(['Places', places.map((p) => ({ c: 'var(--ground)', i: p.k === 'ap' ? 'airplane' : 'location', t: p.name, s: fmt.ll(p.lat, p.lon, 2), go: () => { $('#search').classList.remove('on'); if (APP.tab !== 'globe') APP.setTab('globe'); Cam.flyTo({ lat: p.lat, lon: p.lon, range: p.k === 'ap' ? 0.006 : 0.012, tilt: 0.9, heading: 0.3 }); } }))]); + const lays = W.layers.filter((l) => ql && l.name.toLowerCase().includes(ql)).slice(0, 4); + groups.push(['Layers', lays.map((l) => ({ c: GE.FAM[l.fam].color, i: l.icon, t: l.name, s: `${GE.FAM[l.fam].name} · ${l.on ? 'on' : 'off'} · ${fmt.n(l.count)}`, go: () => { l.on = true; bus.emit('layers'); $('#search').classList.remove('on'); GUI.openCC(l.fam); } }))]); + if (ql.length >= 2) { + const fl = []; for (let i = 0; i < GE.FLIGHTS.length && fl.length < 4; i++) { const f = GE.FLIGHTS[i]; if (f.cs.toLowerCase().includes(ql)) { const p = GE.flightAt(f, W.t); if (p) fl.push({ f, i, p }); } } + groups.push(['Contacts', fl.map(({ f, i, p }) => ({ c: 'var(--sky)', i: 'airplane', t: f.cs, s: `${f.type} · ${p.from.iata} → ${p.to.iata}`, go: () => { $('#search').classList.remove('on'); if (APP.tab !== 'globe') APP.setTab('globe'); Cam.flyTo({ lat: p.lat, lon: p.lon, range: 0.05, tilt: 0.6 }); GUI.showPick({ kind: 'flight', id: i, title: f.cs, subtitle: `${f.type} · ${p.from.iata} → ${p.to.iata}`, lat: p.lat, lon: p.lon, altKm: p.altKm, hdg: p.hdg, meta: { from: p.from, to: p.to, f, prog: p.prog } }); } }))]); + } + res.innerHTML = ''; const frag = document.createDocumentFragment(); + for (const [title, items] of groups) { if (!items.length) continue; frag.append(h('div', { class: 'grpH' }, title)); for (const it of items) { const b = h('button', { class: 'it', html: `${ic(it.i, 'sm')}${esc(it.t)}${esc(it.s)}` }); b.addEventListener('click', it.go); frag.append(b); } } + if (!q) frag.prepend(h('div', { class: 'grpH', style: { marginTop: 0 } }, 'Try “typhoon”, “ATL”, “Kathmandu”, “fires”, “AXR”')); + res.append(frag); +}; + +GUI.init = function () { + GUI.renderDock(); GUI.initRibbon(); + bus.on('layers', () => { GUI.renderDock(); GUI.refreshCCSoft(); }); + GUI.refreshCCSoft = () => { const cc = $('#cc'); if (cc.classList.contains('on')) cc.querySelectorAll('[data-l]').forEach((b) => { const l = GE.world.layerById[b.dataset.l]; b.classList.toggle('on', l.on); const n = b.querySelector('.tc .num'); if (n) n.textContent = l.count ? fmt.n(l.count) : '—'; }); }; + $('#btnLayers').addEventListener('click', () => GUI.openCC()); + $('#btnLens').addEventListener('click', () => { const ids = LENSES.map((l) => l[0]); const i = (ids.indexOf(GE.world.lens) + 1) % ids.length; GE.world.setLens(ids[i]); APP.toast(`${ic('sparkles', 'sm')} ${LENSES[i][1]} lens`); $('#btnLens').classList.toggle('on', ids[i] !== 'cinematic'); }); + $('#btnHome').addEventListener('click', () => { GUI.showPick(null); Cam.flyTo({ range: 2.6, tilt: 0, heading: 0, shiftY: APP.isWide() ? 0 : 0.06 }); }); + $('#btnCompass').addEventListener('click', () => Cam.flyTo({ heading: 0, tilt: 0 }, { duration: 0.8 })); + $('#status').addEventListener('click', () => GUI.snapNow()); +}; diff --git a/mobile/vision/src/js/64-ride.js b/mobile/vision/src/js/64-ride.js new file mode 100644 index 000000000..9d3dd0d9b --- /dev/null +++ b/mobile/vision/src/js/64-ride.js @@ -0,0 +1,93 @@ +/* Ride: drop into a cockpit-follow camera on a helicopter circuit or an airliner, with a minimal HUD + and a social reaction layer (fictional handles) — the communication aspect of watching together. */ +const RIDE = (GE.ride = { on: false }); +const CHAT_HELI = [ + ['rotorwash_ret', 'I flew that exact circuit 40 times. Downwind is where your instructor goes quiet.'], + ['kora_maps', 'Watching from Lisbon. The stagefields look like a chessboard from here'], + ['skywatch_ana', 'Look at the spacing — four aircraft in the pattern and nobody bunching up'], + ['rotorwash_ret', 'Turning base now. Watch the airspeed bleed off'], + ['hydro_nerd', 'is this live?? the shadows match my window right now'], + ['geodesy_dan', 'MLAT puts them at ±15 m here. Cool to see it smooth'], + ['ais_owl', 'Came from the Suez queue thread. This is so much calmer'], + ['rotorwash_ret', 'Short final. Hover check. Then do it again. And again.'], +]; +const CHAT_JET = [ + ['skywatch_ana', 'Cruise is the best seat in the house. Look at the terminator out the left side'], + ['kora_maps', 'You can see the cloud deck the forecast promised'], + ['geodesy_dan', 'Ground speed is up — jet stream tailwind'], + ['ais_owl', 'There’s a whole convoy of ships under us right now'], +]; +RIDE.start = function (p) { + const W = GE.world; + if (APP.mode === 'situation') { GE.sheet.close(true); } + RIDE.p = p; RIDE.on = true; RIDE.yaw = 0; RIDE.pitch = 0; RIDE.zoom = 1; + if (APP.tab !== 'globe') { APP.tab = 'globe'; $('#app').dataset.tab = 'globe'; $$('.pane .view').forEach((v) => v.classList.remove('on')); } + APP.setMode('ride'); + W.layerById.helis.on = true; + const isHeli = p.kind === 'heli' || p.kind === 'situation'; + const hc = isHeli ? GE.HELI_CIRCUITS[p.id || 0] : null; const fl = !isHeli ? GE.FLIGHTS[p.id] : null; + RIDE.hc = hc; RIDE.fl = fl; + const state = () => { + const t = W.t; + if (hc) { const a = GE.heliAt(hc, t), b = GE.heliAt(hc, t + 1.5); const hd = geo.bearing(a.lat, a.lon, b.lat, b.lon); const c = GE.heliAt(hc, t - 1.5); const hd0 = geo.bearing(c.lat, c.lon, a.lat, a.lon); let turn = hd - hd0; if (turn > Math.PI) turn -= TAU; if (turn < -Math.PI) turn += TAU; return { lat: a.lat, lon: a.lon, alt: a.altKm, hdg: hd, roll: clamp(turn * 6, -0.45, 0.45), spd: a.spd, vs: (b.altKm - c.altKm) / 3 * 3281 * 60 }; } + const a = GE.flightAt(fl, t) || GE.flightAt(fl, t + 600); const b = GE.flightAt(fl, t + 4) || a; + return { lat: a.lat, lon: a.lon, alt: a.altKm, hdg: geo.bearing(a.lat, a.lon, b.lat, b.lon), roll: 0, spd: fl.speed / 1.852, vs: (b.altKm - a.altKm) / 4 * 3281 * 60 }; + }; + RIDE.state = state; + const rig = { + blendTime: 1.8, + pose() { const s = state(); RIDE.s = s; const pitch = (hc ? -0.16 : -0.05) + RIDE.pitch; return Cam.pose(s.lat, s.lon, s.alt + (hc ? 0.003 : 0.002), s.hdg + RIDE.yaw, pitch, s.roll * 0.6, (hc ? 64 : 58) * D2R / RIDE.zoom); }, + look(dx, dy) { RIDE.yaw -= dx * 0.004; RIDE.pitch = clamp(RIDE.pitch - dy * 0.003, -0.9, 0.5); }, + zoom(r) { RIDE.zoom = clamp(RIDE.zoom / r, 0.6, 3); }, + }; + Cam.setRig(rig); + RIDE.renderUI(isHeli); + RIDE.chatI = 0; clearInterval(RIDE._ci); RIDE._ci = setInterval(() => RIDE.nextChat(), 2600); setTimeout(() => RIDE.nextChat(), 900); + clearInterval(RIDE._ri); RIDE._ri = setInterval(() => { if (Math.random() < 0.7) RIDE.heart(); }, 700); + haptic([10, 40, 10]); +}; +RIDE.renderUI = function (isHeli) { + const el = $('#ride'); const nm = isHeli ? RIDE.hc.cs : RIDE.fl.cs; const tp = isHeli ? `${RIDE.hc.type} · ${RIDE.hc.field || 'orbit'} circuit` : `${RIDE.fl.type} · ${GE.flightAt(RIDE.fl, GE.world.t)?.from.iata} → ${GE.flightAt(RIDE.fl, GE.world.t)?.to.iata}`; + el.innerHTML = `
    +
    Ride${esc(nm)} · ${esc(tp)}${ic('people', 'sm')}2,318
    +
    +
    `; + el.classList.add('on'); + $('#rideX').addEventListener('click', () => RIDE.exit()); + $('#rideHeart').addEventListener('click', () => { for (let i = 0; i < 4; i++) setTimeout(RIDE.heart, i * 90); haptic(6); }); + $('#rideIn').addEventListener('keydown', (e) => { if (e.key === 'Enter' && e.target.value.trim()) { RIDE.bubble('you', e.target.value.trim(), true); e.target.value = ''; } }); +}; +RIDE.bubble = function (who, text, mine) { + const p = Object.values(GE.PEOPLE).find((x) => x.h === who) || GE.PEOPLE.you; + const c = $('#chat'); if (!c) return; + const b = h('div', { class: 'bub' }); b.innerHTML = `${p.h[0].toUpperCase()}
    @${esc(p.h)}${who === 'rotorwash_ret' ? ' · former instructor' : ''}${esc(text)}
    `; + c.append(b); while (c.children.length > 6) c.firstChild.remove(); +}; +RIDE.nextChat = function () { const L = RIDE.hc ? CHAT_HELI : CHAT_JET; const [w, t] = L[RIDE.chatI++ % L.length]; RIDE.bubble(w, t); const n = $('#rideN'); if (n) n.textContent = fmt.n(2318 + Math.round(Math.sin(Date.now() / 4000) * 40 + RIDE.chatI * 7)); }; +RIDE.heart = function () { const r = $('#react'); if (!r || prefersReduced()) return; const s = h('span'); s.innerHTML = ic('heartf'); s.style.setProperty('--dx', (Math.random() * 40 - 20) + 'px'); s.style.left = (Math.random() * 16) + 'px'; s.style.color = ['#FF453A', '#FF9F0A', '#FFD166', '#7CC4FF'][Math.floor(Math.random() * 4)]; r.append(s); setTimeout(() => s.remove(), 2700); }; +RIDE.frame = function (view) { + if (!RIDE.on || !RIDE.s) return; const s = RIDE.s; const svg = $('#hudSvg'); if (!svg) return; + const w = svg.clientWidth, hh = svg.clientHeight; const cx = w / 2, cy = hh * 0.42; + const hdg = (((s.hdg + RIDE.yaw) * R2D) % 360 + 360) % 360; const roll = -s.roll * 0.6 * R2D; const pitchPx = (RIDE.pitch + (RIDE.hc ? -0.16 : -0.05)) * R2D * 6; + let g = ``; + g += ``; + for (const pd of [-10, -5, 5, 10]) { const y = cy + pitchPx - pd * 6; g += `${pd}`; } + g += ``; + g += ``; + // heading tape + const ty = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--sat')) + 70; + g += ``; + for (let d = Math.floor(hdg / 5) * 5 - 40; d <= hdg + 40; d += 5) { const x = cx + (d - hdg) * 4; const dd = ((d % 360) + 360) % 360; g += ``; if (dd % 30 === 0) g += `${{ 0: 'N', 90: 'E', 180: 'S', 270: 'W' }[dd] ?? String(dd / 10).padStart(2, '0')}`; } + g += `${String(Math.round(hdg)).padStart(3, '0')}`; + svg.innerHTML = g; + $('#hSpd').innerHTML = `${Math.round(s.spd)}KT GS`; + $('#hAlt').innerHTML = `${fmt.n(Math.round(s.alt * 3281 / 10) * 10)}FT ${RIDE.hc ? 'AGL' : 'MSL'} · ${s.vs > 0 ? '+' : ''}${Math.round(s.vs / 50) * 50} FPM`; +}; +RIDE.exit = function (silent) { + if (!RIDE.on) return; RIDE.on = false; clearInterval(RIDE._ci); clearInterval(RIDE._ri); + $('#ride').classList.remove('on'); $('#ride').innerHTML = ''; + const v = Cam.view(400, 800); const [la, lo] = geo.ll(v.eye); + Cam.setRig(null); Cam.set({ lat: la, lon: lo, range: Math.max(0.002, v3.len(v.eye) - 1 + 0.002), tilt: 0.9, heading: RIDE.s ? RIDE.s.hdg : 0, shiftY: 0.06 }); + APP.setMode(''); + if (!silent) Cam.flyTo({ range: 0.012, tilt: 0.8 }); +}; diff --git a/mobile/vision/src/js/65-capture.js b/mobile/vision/src/js/65-capture.js new file mode 100644 index 000000000..bd989daf7 --- /dev/null +++ b/mobile/vision/src/js/65-capture.js @@ -0,0 +1,178 @@ +/* Capture: Look (AR — the God's-eye view projected around you on a rendered "camera" scene with + aircraft/satellite callouts, compass tape, horizon; drag to look) and Witness (shutter → sealed + bundle: real SHA-256 over the rendered frame, real ECDSA P-256 via WebCrypto, simulated IMU/GPS, + hash chain, gold seal; then drop it as a hologram here). */ +const CAP = (GE.capture = { mode: 'look', yaw: 0, pitch: 0.06, zoom: 1, on: false }); +GE.captures = []; +const SPOT = { lat: 41.8662, lon: -87.6072, alt: 0.042, name: 'Chicago lakefront', hdg: -52 * D2R }; +CAP.spot = SPOT; + +/* ---------- device key (non-extractable, IndexedDB when available) ---------- */ +const KEY = { pair: null, jwk: null, ready: null }; +function idb() { return new Promise((res, rej) => { try { const r = indexedDB.open('ge-vision', 1); r.onupgradeneeded = () => r.result.createObjectStore('keys'); r.onsuccess = () => res(r.result); r.onerror = () => rej(r.error); } catch (e) { rej(e); } }); } +KEY.get = function () { + if (KEY.ready) return KEY.ready; + KEY.ready = (async () => { + if (!hasSubtle()) return null; + try { const db = await idb(); const got = await new Promise((res) => { const tx = db.transaction('keys', 'readonly'); const rq = tx.objectStore('keys').get('device'); rq.onsuccess = () => res(rq.result); rq.onerror = () => res(null); }); if (got && got.privateKey) { KEY.pair = got; } } catch {} + if (!KEY.pair) { + try { + KEY.pair = await crypto.subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, false, ['sign', 'verify']); + try { const db = await idb(); await new Promise((res) => { const tx = db.transaction('keys', 'readwrite'); tx.objectStore('keys').put(KEY.pair, 'device'); tx.oncomplete = res; tx.onerror = res; }); } catch {} + } catch (e) { console.warn('keygen', e); return null; } + } + try { KEY.jwk = await crypto.subtle.exportKey('jwk', KEY.pair.publicKey); } catch {} + return KEY.pair; + })(); + return KEY.ready; +}; +const hexToBytes = (hx) => new Uint8Array(hx.match(/../g).map((b) => parseInt(b, 16))); +async function signHex(hashHex) { const k = await KEY.get(); if (!k) return null; const sig = await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, k.privateKey, hexToBytes(hashHex)); return fmt.hex(sig); } +async function verifyHex(hashHex, sigHex) { const k = await KEY.get(); if (!k || !sigHex) return false; try { return await crypto.subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, k.publicKey, hexToBytes(sigHex), hexToBytes(hashHex)); } catch { return false; } } +GE.crypto = { KEY, signHex, verifyHex }; + +/* ---------- simulated golden hour at the spot ---------- */ +CAP.goldenMs = function () { + const base = Date.now(); let best = base, bd = 1e9; + for (let m = -24 * 60; m <= 24 * 60; m += 4) { const ms = base + m * 60000; const e = astro.elev(ms, SPOT.lat, SPOT.lon); const e2 = astro.elev(ms + 60000, SPOT.lat, SPOT.lon); if (e2 < e) { const d = Math.abs(e - 3.2); if (d < bd) { bd = d; best = ms; } } } + return best; +}; + +/* ---------- enter / exit ---------- */ +CAP.enter = function () { + CAP.on = true; CAP.ms = CAP.goldenMs(); CAP.t = (CAP.ms - NOW) / 1000; CAP.sun = astro.sun(CAP.ms); + // face the sunset over the skyline + const sunAz = geo.bearing(SPOT.lat, SPOT.lon, CAP.sun.lat, CAP.sun.lon); + CAP.yaw = 0; SPOT.hdg = sunAz * 0.35 + (-52 * D2R) * 0.65; + GE.renderOverride = { t: CAP.t, sun: CAP.sun, simMs: CAP.ms, offsetH: (CAP.ms - Date.now()) / 3600000, exposure: 1.25, cloudK: 0.5 }; + Cam.setRig({ blendTime: 0.01, pose: () => Cam.pose(SPOT.lat, SPOT.lon, SPOT.alt, SPOT.hdg + CAP.yaw, CAP.pitch, 0, 62 * D2R / CAP.zoom), look(dx, dy) { CAP.yaw -= dx * 0.0042 / CAP.zoom; CAP.pitch = clamp(CAP.pitch - dy * 0.0035 / CAP.zoom, -0.5, 1.2); }, zoom(r) { CAP.zoom = clamp(CAP.zoom / r, 0.6, 4); CAP.syncZoom(); } }); + Cam.rigBlend = 1; + GE.scenes.ensure(GE.scenes.byId.chi); + CAP.render(); + KEY.get(); +}; +CAP.exit = function () { if (!CAP.on) return; CAP.on = false; GE.renderOverride = null; Cam.setRig(null); Cam.rigBlend = 1; $('#sealOv').classList.remove('on'); }; +CAP.render = function () { + const el = $('#v-capture'); const last = GE.captures[GE.captures.length - 1]; + el.innerHTML = `
    + +
    +
    ${ic('location', 'xs')}Simulated camera · ${SPOT.name}${CAP.mode === 'look' ? `${ic('eye', 'xs')}Look · AR` : `${ic('key', 'xs')}Witness · signing`}
    +
    +
    +
    ${[0.5, 1, 3].map((z) => ``).join('')}
    +
    +
    + +
    +
    `; + el.querySelectorAll('[data-z]').forEach((b) => b.addEventListener('click', () => { CAP.zoom = +b.dataset.z; CAP.syncZoom(); haptic(4); })); + el.querySelectorAll('[data-m]').forEach((b) => b.addEventListener('click', () => { CAP.mode = b.dataset.m; CAP.render(); haptic(6); })); + $('#shutter').addEventListener('click', () => { if (CAP.mode === 'look') { CAP.mode = 'witness'; CAP.render(); return; } CAP.shoot(); }); + $('#lastcap').addEventListener('click', () => { if (GE.captures.length) GE.you.inspect(GE.captures.length - 1); }); + $('#capFlip').addEventListener('click', () => APP.toast(`${ic('layers', 'sm')} Showing Sky + Orbit in view`)); +}; +CAP.syncZoom = () => $$('#v-capture [data-z]').forEach((x) => x.classList.toggle('on', +x.dataset.z === CAP.zoom)); + +/* ---------- per-frame AR overlay ---------- */ +CAP.frame = function (view) { + if (!CAP.on) return; + const W = GE.world; const t = CAP.t + (performance.now() / 1000 - (CAP._t0 || (CAP._t0 = performance.now() / 1000))); + const host = $('#callouts'); if (!host) return; + // compass tape + const svg = $('#ctape'); const w = svg.clientWidth; const hdg = (((SPOT.hdg + CAP.yaw) * R2D) % 360 + 360) % 360; + const pxPerDeg = w / (view.fovY * R2D * view.aspect); + let g = ``; + for (let d = Math.floor((hdg - 60) / 5) * 5; d <= hdg + 60; d += 5) { const x = w / 2 + (d - hdg) * pxPerDeg; if (x < -10 || x > w + 10) continue; const dd = ((d % 360) + 360) % 360; g += ``; if (dd % 15 === 0) g += `${{ 0: 'N', 90: 'E', 180: 'S', 270: 'W' }[dd] ?? dd}`; } + g += `${Math.round(hdg)}° · pitch ${Math.round(CAP.pitch * R2D)}°`; + svg.innerHTML = g; + // contacts + const want = []; + const sun = CAP.sun; + for (let i = 0; i < GE.FLIGHTS.length; i++) { + const f = GE.FLIGHTS[i]; const p = GE.flightAt(f, CAP.t); if (!p) continue; + const dkm = geo.dist(SPOT.lat, SPOT.lon, p.lat, p.lon) * EARTH_KM; if (dkm > 110) continue; + const v = v3.scale(p.v, 1 + p.altKm / EARTH_KM); want.push({ k: 'f' + i, v, c: 'var(--sky)', i: 'airplane', t: f.cs, s: `${f.type} · ${fmt.n(Math.round(p.altKm * 3281 / 100) * 100)} ft · ${dkm.toFixed(0)} km`, d: dkm }); + } + const obs = geo.vec(SPOT.lat, SPOT.lon); const up = v3.norm(obs); + if (!CAP._sats || Math.abs(CAP._satT - CAP.t) > 20) { + CAP._sats = []; CAP._satT = CAP.t; + for (let i = 0; i < GE.SATS.length; i += 3) { const s = GE.SATS[i]; if (s.kind > 1 && s.kind !== 6 && s.kind !== 5) continue; const p = GE.satAt(s, CAP.t, sun.gmst); const d = v3.sub(p, obs); const el = Math.asin(v3.dot(v3.norm(d), up)) * R2D; if (el > 12) CAP._sats.push({ s, el, km: v3.len(d) * EARTH_KM }); } + CAP._sats.sort((a, b) => a.km - b.km); CAP._sats = CAP._sats.slice(0, 3); + } + for (const o of CAP._sats) { const p = GE.satAt(o.s, CAP.t, sun.gmst); want.push({ k: 's' + o.s.name, v: p, c: 'var(--orbit)', i: 'satellite', t: o.s.name, s: `${Math.round(o.s.alt)} km up · ${Math.round(o.el)}° elev`, d: o.km }); } + const seen = new Set(); let n = 0; + for (const it of want.sort((a, b) => a.d - b.d)) { + const s = W.project(view, it.v); let el = host.querySelector(`[data-k="${it.k}"]`); + const onScreen = s && s.x > 8 && s.x < view.w - 8 && s.y > 60 && s.y < view.h - 230; + if (!onScreen || n >= 7) { if (el) el.remove(); continue; } + n++; seen.add(it.k); + if (!el) { el = h('div', { 'data-k': it.k }); el.innerHTML = `
    ${ic(it.i, 'sm')}${esc(it.t)}
    `; host.append(el); } + el.querySelector('[data-s]').textContent = it.s; + el.querySelector('.reticle').style.transform = `translate(${s.x}px, ${s.y}px)`; + el.querySelector('.callout').style.transform = `translate(${s.x + 24}px, ${s.y}px) translate(0, -50%)`; + } + host.querySelectorAll('[data-k]').forEach((e) => { if (!seen.has(e.dataset.k)) e.remove(); }); + // witness sensors + if (CAP.mode === 'witness') { + const ss = $('#sensors'); const tt = performance.now() / 1000; + const imu = Array.from({ length: 40 }, (_, i) => Math.sin((tt * 3 + i * 0.4)) * 0.4 + Math.sin(tt * 7.3 + i) * 0.15); + ss.innerHTML = `
    IMU 50 Hz${(imu[39] * 0.12).toFixed(3)} g
    ${GE.sparkPath(imu, 140, 26, '#5CF2A0', 1.3)}
    GPS±4 m · ${SPOT.lat.toFixed(5)}, ${SPOT.lon.toFixed(5)}
    Heading${Math.round(hdg)}° true
    KeyP-256 · ${KEY.pair ? 'device-bound' : '…'}
    `; + } +}; + +/* ---------- shoot & seal ---------- */ +CAP.shoot = async function () { + if (CAP.busy) return; CAP.busy = true; haptic([5, 20, 30]); + const flash = h('div', { style: { position: 'absolute', inset: 0, background: '#fff', zIndex: 72, opacity: 1, transition: 'opacity .45s ease' } }); $('#app').append(flash); requestAnimationFrame(() => (flash.style.opacity = 0)); setTimeout(() => flash.remove(), 500); + const start = Date.now(); + // render the frame offscreen at 1200×900 + const W0 = 1200, H0 = 900; const view = Cam.view(W0, H0); + const cv = GE.thumbs.renderView(view, W0, H0, { ...GE.renderOverride, px: 1.6 }); + const blob = await new Promise((res) => cv.toBlob(res, 'image/jpeg', 0.9)); + const bytes = new Uint8Array(await blob.arrayBuffer()); + const thumb = (() => { const c = document.createElement('canvas'); c.width = 320; c.height = 240; c.getContext('2d').drawImage(cv, 0, 0, 320, 240); return c.toDataURL('image/jpeg', 0.8); })(); + const hdgDeg = Math.round((((SPOT.hdg + CAP.yaw) * R2D) % 360 + 360) % 360); + const imu = Array.from({ length: 150 }, (_, i) => ({ t: i * 20, a: +(hdgDeg + Math.sin(i / 9) * 0.6).toFixed(2), b: +(CAP.pitch * R2D + Math.sin(i / 7) * 0.3).toFixed(2), g: +(Math.sin(i / 5) * 0.4).toFixed(2), ax: +(Math.sin(i / 3) * 0.02).toFixed(3), ay: +(9.806 + Math.sin(i / 4) * 0.03).toFixed(3), az: +(Math.cos(i / 3) * 0.02).toFixed(3) })); + const session = { start, end: start + 3000, imu, gps: [0, 1, 2].map((k) => ({ t: start + k * 1000, lat: +(SPOT.lat + k * 1e-6).toFixed(6), lon: +SPOT.lon.toFixed(6), acc: 4, alt: 182 })), heading: hdgDeg }; + const context = { device: 'Simulated camera (concept)', ua: navigator.userAgent.slice(0, 64), screen: `${screen.width}x${screen.height}@${Math.round((devicePixelRatio || 1) * 100) / 100}`, timezone: GE.ME.tz, networkTimeOffsetMs: 12 }; + const prev = GE.captures.length ? GE.captures[GE.captures.length - 1].hash : '0'.repeat(64); + const b = { bytes, thumb, session, context, prev, place: SPOT.name, lat: SPOT.lat, lon: SPOT.lon, at: start }; + CAP.ceremony(b, cv); + b.mediaHash = await sha256(bytes); + b.hash = await sha256(canon({ media: b.mediaHash, session, context, prev })); + b.sig = await signHex(b.hash); + b.jwk = KEY.jwk; + GE.captures.push(b); + CAP.ceremonyFill(b); + CAP.busy = false; +}; +CAP.ceremony = function (b, cv) { + const ov = $('#sealOv'); + ov.innerHTML = `
    +
    +
    ${ic('check', 'xs')}
    Frame hashed · SHA-256 of ${fmt.n(b.bytes.length)} JPEG bytes
    …
    +
    ${ic('check', 'xs')}
    Session sealed · IMU 150 samples @ 50 Hz · GPS ±4 m · heading ${b.session.heading}°${GE.sparkPath(b.session.imu.map((x) => x.g + x.b * 0.02), 300, 30, '#5CF2A0', 1.2)}
    +
    ${ic('check', 'xs')}
    Chained to this device’s previous bundle
    prev ${b.prev.slice(0, 24)}…
    +
    ${ic('check', 'xs')}
    Bundle hash
    …
    +
    ${ic('check', 'xs')}
    Signed · ECDSA P-256, key generated on device, non-extractable
    …
    +
    +
    +
    +

    None of this proves truth. It raises the cost of lying.

    `; + const ph = $('#bph'); const c2 = document.createElement('canvas'); c2.width = 600; c2.height = 450; c2.getContext('2d').drawImage(cv, 0, 0, 600, 450); ph.prepend(c2); + ov.classList.add('on'); +}; +CAP.ceremonyFill = async function (b) { + const step = (i) => new Promise((r) => setTimeout(() => { const s = $(`.step[data-s="${i}"]`); s && s.classList.add('on', 'done'); haptic(4); r(); }, prefersReduced() ? 30 : 380)); + const stream = async (id, hex) => { const el = $('#' + id); if (!el) return; if (prefersReduced()) { el.textContent = hex; return; } for (let i = 0; i <= hex.length; i += 4) { el.textContent = hex.slice(0, i) + (i < hex.length ? '▍' : ''); await new Promise((r) => setTimeout(r, 8)); } }; + $(`.step[data-s="0"]`).classList.add('on'); await stream('sh0', b.mediaHash); await step(0); + await step(1); await step(2); + $(`.step[data-s="3"]`).classList.add('on'); await stream('sh3', b.hash); await step(3); + $(`.step[data-s="4"]`).classList.add('on'); await stream('sh4', b.sig ? b.sig : 'WebCrypto unavailable here — bundle hashed but unsigned'); await step(4); + $('#bigseal').classList.add('on'); haptic([10, 40, 20]); + for (const id of ['bbtns', 'bbtns2']) { const e = $('#' + id); e.style.opacity = 1; e.style.pointerEvents = 'auto'; } + $('#bdrop').addEventListener('click', () => { GE.world.userHolos.push({ lat: b.lat, lon: b.lon, title: 'Your capture · ' + b.place, by: 'you', at: b.at }); b.dropped = true; $('#sealOv').classList.remove('on'); APP.toast(`${ic('cube', 'sm')} Hologram dropped · visible to people here`); CAP.render(); GE.you.render(); }); + $('#bver').addEventListener('click', () => { $('#sealOv').classList.remove('on'); GE.you.inspect(GE.captures.indexOf(b)); }); + $('#bdone').addEventListener('click', () => { $('#sealOv').classList.remove('on'); CAP.render(); GE.you.render(); }); +}; diff --git a/mobile/vision/src/js/66-threads.js b/mobile/vision/src/js/66-threads.js new file mode 100644 index 000000000..b234bafc6 --- /dev/null +++ b/mobile/vision/src/js/66-threads.js @@ -0,0 +1,288 @@ +/* Threads: reconstructions people build together. Three strata — Observations (immutable, hashed, + sourced), Hypotheses (person/AI, confidence, citations, agree/dispute), Narrative (camera path through + space-time synced to the ribbon) — plus a real SHA-256 hash-chain ledger you can verify and tamper + with, and an AI refine composer whose output is recorded as a *proposed* hypothesis. */ +const THR = (GE.threads = { ws: null }); +const P = GE.PEOPLE; +const KT = GE.scenes.FLOOD.startMs; const HR_ = 3600000, MIN = 60000; +const KO = GE.scenes.KOSHI; +const THREADS = { + koshi: { + id: 'koshi', sit: 'koshi', title: 'Bhote Koshi outburst flood', place: 'Rasuwagadhi → Syaphrubesi, Nepal', date: '26 Aug 2026', + window: { start: KT - 1.5 * HR_, end: KT + 6 * HR_ }, people: ['hydro', 'kora', 'tamang', 'geo', 'sky', 'ais'], + cam: { lat: 28.205, lon: 85.352, range: 0.0042, heading: 0.32, tilt: 1.02 }, + obs: [ + { id: 'O1', i: 'frame', f: 'infra', t: 'Optical satellite tile — before', src: 'Public 10 m optical archive', at: Date.UTC(2026, 7, 24, 4, 52), meta: ['10 m', 'cloud 6%'] }, + { id: 'O2', i: 'frame', f: 'infra', t: 'Optical satellite tile — after: new scour along 9.4 km of channel', src: 'Public 10 m optical archive', at: Date.UTC(2026, 7, 27, 4, 58), meta: ['10 m', 'cloud 12%'] }, + { id: 'O3', i: 'drop', f: 'haz', t: 'River gauge, Syaphrubesi: stage 3.1 → 7.8 m', src: 'Gauge feed (illustrative values)', at: KT + 1.75 * HR_, meta: ['15-min series', 'peak 09:30 UTC'] }, + { id: 'O4', i: 'wave', f: 'haz', t: 'No M ≥ 3 earthquake within 50 km in the prior 24 h', src: 'Seismic catalog', at: KT, meta: ['rules out seismic trigger'] }, + { id: 'O5', i: 'seal', f: 'eyes', t: 'Signed capture — water reaches the road at Timure', src: '@tamang_lens · illustrative', at: KT + 27 * MIN, meta: ['IMU ✓', 'GPS ±6 m', 'heading 214°'], lat: 28.2551, lon: 85.3712 }, + { id: 'O6', i: 'seal', f: 'eyes', t: 'Signed capture — debris against the Syaphrubesi bridge deck', src: '@hydro_nerd · illustrative', at: KT + 61 * MIN, meta: ['IMU ✓', 'GPS ±4 m', 'heading 352°'], lat: 28.1629, lon: 85.3402 }, + { id: 'O7', i: 'seal', f: 'eyes', t: 'Signed capture — fresh scour line at Rasuwagadhi', src: '@geodesy_dan · illustrative', at: KT + 21.5 * HR_, meta: ['IMU ✓', 'GPS ±5 m'], lat: 28.2802, lon: 85.3797 }, + { id: 'O8', i: 'helicopter', f: 'sky', t: 'ADS-B: rescue helicopter, 3 sorties along the valley', src: 'ADS-B/MLAT (illustrative track)', at: KT + 2.3 * HR_, meta: ['10:05–13:40 UTC'] }, + { id: 'O9', i: 'cloud', f: 'wx', t: 'Upstream rain gauge: 4 mm in 24 h', src: 'Met station (illustrative)', at: KT - 1 * HR_, meta: ['not a rain-driven flood'] }, + { id: 'O10', i: 'frame', f: 'infra', t: 'Glacial lake area change upstream: −0.42 km²', src: 'Derived from O1/O2-class imagery (illustrative)', at: Date.UTC(2026, 7, 27, 5, 0), meta: ['outside border, upstream'] }, + ], + hyps: [ + { id: 'H1', by: 'hydro', text: 'A glacial-lake outburst upstream — not rainfall — triggered the flood.', conf: 0.82, ci: [0.71, 0.9], cites: ['O4', 'O9', 'O10'], agree: 31, dispute: 2, status: 'supported' }, + { id: 'H2', by: 'kora', text: 'The crest passed Timure about 08:12 UTC and reached Syaphrubesi ~35 min later (≈ 5 m/s).', conf: 0.68, ci: [0.55, 0.79], cites: ['O3', 'O5', 'O6'], agree: 18, dispute: 4, status: 'supported' }, + { id: 'H3', by: 'tamang', text: 'Clip O5 was filmed from the north bank, about 140 m upstream of the Timure bridge.', conf: 0.74, ci: [0.6, 0.84], cites: ['O5'], agree: 12, dispute: 1, status: 'supported' }, + { id: 'H4', by: 'ai', ai: true, text: 'Peak stage at Syaphrubesi lagged the visible crest by ~20 min — consistent with debris damming at the bridge.', conf: 0.41, ci: [0.22, 0.6], cites: ['O3', 'O6'], agree: 3, dispute: 5, status: 'disputed', prompt: 'Why does the gauge peak late?' }, + ], + beats: [ + { at: KT, t: '07:45', text: 'Outburst upstream (inferred). The valley is quiet; the river is at its normal 3 m stage.', cites: ['H1', 'O4', 'O9'], cam: { lat: 28.262, lon: 85.372, range: 0.0032, heading: 3.4, tilt: 1.05 } }, + { at: KT + 20 * MIN, t: '08:05', text: 'The crest reaches Rasuwagadhi and the border bridge.', cites: ['H2', 'O7'], cam: { lat: 28.272, lon: 85.37, range: 0.0018, heading: 0.6, tilt: 1.12 } }, + { at: KT + 27 * MIN, t: '08:12', text: 'A witness on the north bank at Timure films water reaching the road.', cites: ['H3', 'O5'], cam: { lat: 28.247, lon: 85.364, range: 0.0016, heading: 0.35, tilt: 1.15 } }, + { at: KT + 61 * MIN, t: '08:46', text: 'Debris piles against the Syaphrubesi bridge deck.', cites: ['O6', 'H4'], cam: { lat: 28.152, lon: 85.336, range: 0.0016, heading: 0.2, tilt: 1.12 } }, + { at: KT + 105 * MIN, t: '09:30', text: 'Gauge peaks at 7.8 m — about 20 minutes after the visible crest.', cites: ['O3', 'H4'], cam: { lat: 28.15, lon: 85.33, range: 0.0026, heading: 0.9, tilt: 1.05 } }, + { at: KT + 140 * MIN, t: '10:05', text: 'First rescue sortie climbs the valley.', cites: ['O8'], cam: { lat: 28.19, lon: 85.345, range: 0.0045, heading: 0.3, tilt: 1.0 } }, + ], + suggestions: ['Align the witness clip to the corridor using the bridge as a landmark', 'Estimate crest speed between Timure and Syaphrubesi', 'What would falsify H1?'], + fallback: 'Using the Syaphrubesi bridge as a fixed landmark, clip [O6] was taken from the east abutment looking upstream; matching its horizon to the IMU pitch places the crest front 85 ± 20 m upstream of the bridge at 08:46 UTC. That timing agrees with the gauge [O3] if the crest travelled 4.6 ± 0.6 m/s from Timure [O5].\nConfidence: 0.63', + }, + concert: { + id: 'concert', sit: 'concert', title: 'Stadium encore in 4D', place: 'Wembley, London', date: 'last night', + window: { start: Date.now() - 21 * HR_, end: Date.now() - 19.5 * HR_ }, people: ['crowd', 'sky', 'kora', 'geo'], + cam: { lat: 51.5546, lon: -0.2822, range: 0.00042, heading: 0.6, tilt: 1.1 }, + obs: [ + { id: 'O1', i: 'seal', f: 'eyes', t: '2,311 signed phone captures from 86 seat blocks', src: 'Signed bundles (illustrative)', at: Date.now() - 20 * HR_, meta: ['IMU ✓ on 2,204', 'GPS indoor ±12 m'] }, + { id: 'O2', i: 'wave', f: 'eyes', t: 'Audio fingerprints align 1,980 clips to ±9 ms', src: 'Derived', at: Date.now() - 19.8 * HR_, meta: ['common track'] }, + { id: 'O3', i: 'video', f: 'eyes', t: 'Venue public camera, concourse north', src: 'Public feed (illustrative)', at: Date.now() - 20 * HR_, meta: ['720p'] }, + { id: 'O4', i: 'ticket', f: 'ground', t: 'Seat map & stage geometry', src: 'Published venue plan', at: Date.now() - 30 * 24 * HR_, meta: ['static'] }, + ], + hyps: [ + { id: 'H1', by: 'crowd', text: 'The encore began at 22:41:07 local, ±0.2 s.', conf: 0.9, ci: [0.84, 0.95], cites: ['O1', 'O2'], agree: 210, dispute: 3, status: 'supported' }, + { id: 'H2', by: 'geo', text: 'The pyro cue at 22:44 is visible from 86 of 92 seat blocks; 6 blocks are occluded by the roof cantilever.', conf: 0.71, ci: [0.6, 0.8], cites: ['O1', 'O4'], agree: 44, dispute: 6, status: 'supported' }, + ], + beats: [ + { at: Date.now() - 20 * HR_ - 10 * MIN, t: '22:41', text: 'Lights down. 2,311 phones come up together.', cites: ['H1'], cam: { lat: 51.5552, lon: -0.2815, range: 0.00035, heading: 0.9, tilt: 1.15 } }, + { at: Date.now() - 20 * HR_, t: '22:44', text: 'Pyro cue — seen from 86 blocks at once.', cites: ['H2'], cam: { lat: 51.5568, lon: -0.2778, range: 0.0003, heading: 3.6, tilt: 1.12 } }, + { at: Date.now() - 20 * HR_ + 12 * MIN, t: '22:56', text: 'Final chorus; the crowd reconstruction is densest here.', cites: ['O1', 'O2'], cam: { lat: 51.556, lon: -0.2796, range: 0.0006, heading: 2.2, tilt: 0.9 } }, + ], + suggestions: ['Which seat blocks saw the pyro cue?', 'Align the concourse camera to the crowd timeline'], + fallback: 'The concourse camera [O3] shows the crowd surge 2.1 s after the audio onset in [O2]; offsetting its clock by −2.1 s aligns it with 1,980 crowd clips [O1].\nConfidence: 0.58', + }, + climb: { + id: 'climb', sit: 'climb', title: 'Free-climber on a Midtown tower', place: 'Midtown Manhattan (fictional tower)', date: 'this morning', + window: { start: Date.now() - 11 * HR_, end: Date.now() - 7 * HR_ }, people: ['news', 'sky', 'kora', 'geo', 'ais'], + cam: { lat: 40.7533, lon: -73.9866, range: 0.00034, heading: 0.62, tilt: 1.2 }, + obs: [ + { id: 'O1', i: 'helicopter', f: 'sky', t: 'ADS-B tracks: 3 news helicopters orbiting the tower', src: 'ADS-B (illustrative callsigns)', at: Date.now() - 9 * HR_, meta: ['1 Hz', '2 h 14 m'] }, + { id: 'O2', i: 'video', f: 'eyes', t: 'Broadcast frames, time-coded', src: 'Public broadcast (illustrative)', at: Date.now() - 9 * HR_, meta: ['29.97 fps'] }, + { id: 'O3', i: 'seal', f: 'eyes', t: '41 signed street-level clips', src: 'Signed bundles (illustrative)', at: Date.now() - 9 * HR_, meta: ['IMU ✓', 'GPS ±5 m'] }, + { id: 'O4', i: 'cube', f: 'infra', t: 'Tower model, 412 m (fictional building)', src: 'Model', at: Date.now() - 400 * 24 * HR_, meta: ['static'] }, + ], + hyps: [ + { id: 'H1', by: 'news', text: 'The climb started at 06:52 local on the northeast face.', conf: 0.77, ci: [0.66, 0.86], cites: ['O2', 'O3'], agree: 58, dispute: 4, status: 'supported' }, + { id: 'H2', by: 'geo', text: 'Climber height over time is recoverable to ±3 m by triangulating helicopter camera positions (from ADS-B) with frame bearings.', conf: 0.69, ci: [0.55, 0.8], cites: ['O1', 'O2', 'O4'], agree: 33, dispute: 7, status: 'supported' }, + ], + beats: [ + { at: Date.now() - 10.5 * HR_, t: '06:52', text: 'First witness clip from the street: the climber is at the 3rd setback.', cites: ['H1', 'O3'], cam: { lat: 40.7538, lon: -73.9852, range: 0.00022, heading: 0.5, tilt: 1.3 } }, + { at: Date.now() - 9.5 * HR_, t: '07:55', text: 'Three news helicopters in orbit; their ADS-B tracks pin each broadcast camera.', cites: ['O1', 'H2'], cam: { lat: 40.751, lon: -73.99, range: 0.0012, heading: 0.7, tilt: 1.0 } }, + { at: Date.now() - 8.6 * HR_, t: '09:06', text: 'The climber reaches the crown at 384 m.', cites: ['H2'], cam: { lat: 40.7549, lon: -73.9848, range: 0.0003, heading: 0.4, tilt: 1.42 } }, + ], + suggestions: ['Triangulate the climber at 08:30 from two helicopters', 'Which face was the route on?'], + fallback: 'At 08:30 the bearings from N9 NEWS and SKY 4 [O1] to the climber in broadcast frames [O2] intersect 232 ± 4 m up the northeast face of the tower model [O4].\nConfidence: 0.66', + }, +}; +THR.data = THREADS; + +/* ---------- 3D extras per reconstruction (GPU sets, built lazily) ---------- */ +const EXTRAS = {}; +GE.extrasFor = function (id) { + if (EXTRAS[id] !== undefined) return EXTRAS[id]; + const T = THREADS[id] || (GE.SIT.byId[id]?.thread && THREADS[GE.SIT.byId[id].thread]); + if (!T) return (EXTRAS[id] = null); + const sp = [], ln = []; + const gold = [1, 0.84, 0.42, 1]; + if (T.id === 'koshi') { + GE.scenes.ensure(GE.scenes.byId.koshi); + const gz = (la, lo) => GE.scenes.groundAt(la, lo) / 1000; + for (const o of T.obs) if (o.lat) { const z = gz(o.lat, o.lon); pushSpr(sp, geo.vec(o.lat, o.lon, z + 0.09), gold, 26, 6, -10, -1e9, 1e9, 0, 0, 0.5); pushPolyline(ln, [geo.vec(o.lat, o.lon, z), geo.vec(o.lat, o.lon, z + 0.09)], [1, 0.85, 0.5, 0.9]); + // capture frustum toward the river + const brg = { O5: 214, O6: 352, O7: 160 }[o.id] * D2R || 0; const tip = geo.vec(o.lat, o.lon, z + 0.012); + for (const da of [-0.35, 0.35]) for (const dz of [-0.04, 0.04]) { const [la2, lo2] = geo.dest(o.lat, o.lon, brg + da, 0.45); pushPolyline(ln, [tip, geo.vec(la2, lo2, gz(la2, lo2) + 0.012 + dz)], [1, 0.82, 0.4, 0.55]); } + } + // gauge & villages + pushSpr(sp, geo.vec(28.158, 85.336, gz(28.158, 85.336) + 0.06), [0.4, 0.75, 1, 1], 20, 9, -10, -1e9, 1e9, 0, 0.3, 0.4); + // rescue helicopter track (illustrative) up the valley + const trk = KO.map(([la, lo], i) => geo.vec(la, lo, gz(la, lo) + 0.35 + (i % 3) * 0.05)); pushPolyline(ln, trk, [0.62, 1, 0.6, 0.7], 1); + } else if (T.id === 'concert') { + const c = [51.556, -0.2796]; const stage = geo.vec(...geo.offset(c[0], c[1], -40, 0), 0.015); + const r = rng(9); + for (let i = 0; i < 160; i++) { const a = r() * TAU; const rx = 70 + r() * 55, ry = 52 + r() * 50; const [la, lo] = geo.offset(c[0], c[1], Math.cos(a) * rx, Math.sin(a) * ry); const z = 0.008 + r() * 0.03; const p = geo.vec(la, lo, z); pushSpr(sp, p, [1, 0.86, 0.45, 1], 7, 0, -10, -1e9, 1e9, 0, 0, 0.6); if (i % 2 === 0) pushPolyline(ln, [p, v3.lerp(p, stage, 0.35 + r() * 0.2)], [1, 0.8, 0.4, 0.28]); } + pushSpr(sp, stage, [1, 0.5, 1, 1], 30, 9, -10, -1e9, 1e9, 0, 0.1, 0.9); + } else if (T.id === 'climb') { + const tw = [40.7553, -73.9838]; + for (const hc of GE.HELI_CIRCUITS.filter((x) => x.orbit && x.lat === 40.7553)) { const pts = []; for (let k = 0; k <= 64; k++) { const [la, lo] = geo.dest(hc.lat, hc.lon, (k / 64) * TAU, hc.r); pts.push(geo.vec(la, lo, hc.alt)); } pushPolyline(ln, pts, [0.62, 1, 0.6, 0.55], 1); } + const r = rng(5); + for (let i = 0; i < 41; i++) { const a = r() * TAU, d = 0.12 + r() * 0.35; const [la, lo] = geo.dest(tw[0], tw[1], a, d); const p = geo.vec(la, lo, 0.002); pushSpr(sp, p, [1, 0.84, 0.42, 1], 11, 6, -10, -1e9, 1e9, 0, 0, 0.5); pushPolyline(ln, [p, geo.vec(tw[0], tw[1], 0.12 + r() * 0.25)], [1, 0.8, 0.4, 0.22]); } + } + const set = { sprites: sp.length ? [makeSpriteSet('x' + id, sp)] : null, lines: ln.length ? [makeLineSet(ln)] : null }; + return (EXTRAS[id] = set); +}; +GE.setExtras = function (id) { GE.world.activeExtras = id ? GE.extrasFor(id) : null; GE.world.activeExtrasId = id; }; + +/* ---------- ledger (real SHA-256 hash chain) ---------- */ +THR.ledgers = {}; +async function buildLedger(T) { + const entries = []; let ts = T.window.start - 6 * HR_; + const push = (type, actor, payload) => { entries.push({ i: entries.length, ts: (ts += 7 * MIN + entries.length * 3 * MIN), type, actor, payload }); }; + push('thread.create', 'kora_maps', { title: T.title, place: T.place }); + for (const o of T.obs) push('observation.add', o.src.startsWith('@') ? o.src.split(' ')[0].slice(1) : 'ingest', { id: o.id, title: o.t, source: o.src, at: o.at, contentHash: o.hash }); + for (const hy of T.hyps) { push(hy.ai ? 'ai.proposal' : 'hypothesis.propose', hy.ai ? 'claude' : P[hy.by].h, hy.ai ? { id: hy.id, text: hy.text, cites: hy.cites, prompt: hy.prompt, model: 'claude (window.claude sample)', diff: '+' + hy.id } : { id: hy.id, text: hy.text, cites: hy.cites, confidence: hy.conf }); push('vote', P[T.people[(entries.length) % T.people.length]].h, { target: hy.id, agree: true }); } + let prev = '0'.repeat(64); + for (const e of entries) { e.digest = await sha256(canon(e.payload)); e.prev = prev; e.hash = await sha256(canon({ i: e.i, ts: e.ts, type: e.type, actor: e.actor, digest: e.digest, prev })); prev = e.hash; } + THR.ledgers[T.id] = entries; return entries; +} +THR.append = async function (T, type, actor, payload) { + const L = THR.ledgers[T.id] || (await buildLedger(T)); const prev = L[L.length - 1].hash; + const e = { i: L.length, ts: Date.now(), type, actor, payload }; e.digest = await sha256(canon(payload)); e.prev = prev; e.hash = await sha256(canon({ i: e.i, ts: e.ts, type: e.type, actor: e.actor, digest: e.digest, prev })); L.push(e); return e; +}; +THR.verify = async function (L, onStep) { + let prev = '0'.repeat(64), ok = true; + for (const e of L) { const dg = await sha256(canon(e.payload)); const hh = await sha256(canon({ i: e.i, ts: e.ts, type: e.type, actor: e.actor, digest: dg, prev })); const good = ok && dg === e.digest && e.prev === prev && hh === e.hash; if (!good) ok = false; onStep && (await onStep(e, good)); prev = e.hash; } + return ok; +}; +THR.init = async function () { + for (const T of Object.values(THREADS)) { for (const o of T.obs) o.hash = await sha256(canon({ id: o.id, t: o.t, src: o.src, at: o.at, meta: o.meta })); await buildLedger(T); } +}; + +/* ---------- list ---------- */ +THR.render = function () { + const v = $('#v-threads'); + v.innerHTML = `
    ${ic('seal', 'xs')} Signed evidence · open ledgers

    Threads

    +
    ${['kora', 'hydro', 'tamang', 'geo', 'sky'].map((k) => `${P[k].h[0].toUpperCase()}`).join('')}37 people reconstructing now
    + ${Object.values(THREADS).map((T) => { const s = GE.SIT.byId[T.sit]; return `

    ${esc(T.title)}

    ${esc(T.place)} · ${esc(T.date)}

    4D
    ${T.obs.length}observations
    ${T.hyps.length}hypotheses
    ${THR.ledgers[T.id]?.length || '–'}ledger
    ${T.people.slice(0, 4).map((k) => `${P[k].h[0].toUpperCase()}`).join('')}
    `; }).join('')} +

    Concept · illustrative data. Witness posts, handles and claims are fictional.

    +
    `; + $('#thMe').addEventListener('click', () => APP.setTab('you')); + $('#newThread').addEventListener('click', () => APP.toast(`${ic('threads', 'sm')} New thread · add your first observation`)); + $$('.tcard').forEach((c) => { + c.addEventListener('click', () => THR.openWs(c.dataset.t)); + const cv = c.querySelector('canvas'); const s = GE.SIT.byId[c.dataset.id]; const done = GE.thumbs.done.get(s.id); + if (done) cv.getContext('2d').drawImage(done, 0, 0, cv.width, cv.height); else { GE.thumbs.fallback(s, cv); } + }); +}; + +/* ---------- workspace ---------- */ +THR.openWs = function (id) { + const T = THREADS[id]; if (!T) return; const W = GE.world; + if (APP.tab !== 'threads') APP.setTab('threads'); + THR.ws = { T, seg: THR.ws?.T === T ? THR.ws.seg : 'obs', beats: T.beats, playing: false }; + $('#tlist').style.display = 'none'; + const ws = $('#ws'); ws.classList.add('on'); + W.setWindow(T.window); W.setTime(T.beats[Math.min(2, T.beats.length - 1)].at); + GE.setExtras(T.id); + for (const lid of ['signed', 'holo', 'helis']) W.layerById[lid].on = true; + const wide = APP.isWide(); + Cam.autoSpin = 0; Cam.flyTo({ ...T.cam, shiftY: wide ? 0 : 0.6, shiftX: 0 }); + APP.setMode('workspace'); + THR.renderWs(); +}; +THR.closeWs = function (silent) { + if (!THR.ws) return; THR.stop(); THR.ws = null; const W = GE.world; + $('#ws').classList.remove('on'); $('#ws').innerHTML = ''; const tl = $('#tlist'); if (tl) tl.style.display = ''; + W.setWindow(null); W.setTime(null); GE.setExtras(null); APP.setMode(''); + if (!silent) Cam.flyTo(APP.heroCam()); +}; +THR.renderWs = function () { + const { T, seg } = THR.ws; const ws = $('#ws'); + ws.innerHTML = `
    ${esc(T.title)}${esc(T.place)} · ${esc(T.date)}${T.people.slice(0, 4).map((k, i) => `${P[k].h[0].toUpperCase()}`).join('')}
    +
    ${[['obs', 'Observations'], ['hyp', 'Hypotheses'], ['nar', 'Narrative'], ['led', 'Ledger']].map(([k, l]) => ``).join('')}
    + ${seg === 'hyp' ? `
    ${T.suggestions.map((s) => ``).join('')}
    ` : ''}
    `; + $('#wsBack').addEventListener('click', () => THR.closeWs()); + $$('#wsSeg button').forEach((b) => b.addEventListener('click', () => { THR.ws.seg = b.dataset.s; THR.renderWs(); haptic(4); })); + const c = $('#wsc'); + if (seg === 'obs') c.innerHTML = `
    ${ic('lock', 'xs')} Stratum 1 · Observations — immutable, hashed, sourced
    ` + T.obs.map((o) => `
    ${ic(o.i)}
    ${o.id} ${esc(o.t)}
    ${esc(o.src)}${fmt.utc(o.at)}${o.meta.map((m) => `${esc(m)}`).join('')}sha256 ${o.hash ? o.hash.slice(0, 12) + '…' : '…'}
    `).join(''); + if (seg === 'hyp') { c.innerHTML = `
    ${ic('people', 'xs')} Stratum 2 · Hypotheses — cite, agree, dispute, supersede
    `; THR.renderHyps(); THR.bindComposer(); } + if (seg === 'nar') THR.renderNarr(c); + if (seg === 'led') THR.renderLedger(c); + c.querySelectorAll('[data-o]').forEach((el) => el.addEventListener('click', () => { const o = T.obs.find((x) => x.id === el.dataset.o); if (o.lat) Cam.flyTo({ lat: o.lat - 0.004, lon: o.lon - 0.002, range: 0.0012, tilt: 1.15, heading: 0.4, shiftY: APP.isWide() ? 0 : 0.6 }); GE.world.setTime(o.at); APP.toast(`${ic('hash', 'sm')} ${o.id} · sha256 ${o.hash.slice(0, 16)}…`); })); +}; +const confSVG = (h) => { const w = 200; return ``; }; +THR.hypHTML = function (hy) { + const p = P[hy.by] || P.ai; + return `
    ${hy.ai ? `${ic('sparkles', 'xs')}` : `${p.h[0].toUpperCase()}`}${hy.ai ? 'AI proposal' : '@' + p.h}${hy.id}${hy.status}
    +
    ${esc(hy.text)}
    +
    confidence${confSVG(hy)}${Math.round(hy.conf * 100)}%
    +
    ${hy.cites.map((x) => `${x}`).join('')}${hy.prompt ? `prompt: “${esc(hy.prompt)}” · ${esc(hy.model || 'claude')}` : ''}
    +
    `; +}; +THR.renderHyps = function () { + const { T } = THR.ws; const host = $('#hypList'); if (!host) return; + host.innerHTML = T.hyps.map(THR.hypHTML).join(''); + host.querySelectorAll('[data-h]').forEach((el) => el.querySelectorAll('[data-v]').forEach((b) => b.addEventListener('click', async () => { + const hy = T.hyps.find((x) => x.id === el.dataset.h); const v = +b.dataset.v; haptic(5); + if (v === 0) { APP.toast(`${ic('bubble', 'sm')} Cite ${hy.id} in a new hypothesis`); return; } + hy.myVote = hy.myVote === v ? 0 : v; await THR.append(T, 'vote', 'you', { target: hy.id, agree: v === 1, retract: hy.myVote === 0 }); + THR.renderHyps(); APP.toast(`${ic('link', 'sm')} Vote recorded in the ledger`); + }))); +}; +THR.bindComposer = function () { + const ta = $('#aiIn'); const send = $('#aiSend'); if (!ta) return; + $$('#composer .sug button').forEach((b) => b.addEventListener('click', () => { ta.value = b.textContent; ta.focus(); })); + ta.addEventListener('keydown', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); send.click(); } }); + send.addEventListener('click', () => { const q = ta.value.trim() || THR.ws.T.suggestions[0]; ta.value = ''; THR.refine(q); }); +}; +THR.refine = async function (q) { + const { T } = THR.ws; const send = $('#aiSend'); if (send) send.disabled = true; + const id = 'H' + (T.hyps.length + 1); + const hy = { id, by: 'ai', ai: true, text: '', conf: 0.5, ci: [0.35, 0.65], cites: [], agree: 0, dispute: 0, status: 'proposed', prompt: q, model: '…' }; + T.hyps.push(hy); THR.renderHyps(); + const card = $(`[data-h="${id}"]`); card?.scrollIntoView({ behavior: 'smooth', block: 'end' }); + const textEl = () => $(`[data-h="${id}"] [data-text]`); + const promptStr = `You are helping a group of people reconstruct a real-world event from evidence, in an app that keeps observations (immutable) separate from hypotheses (claims).\nEvent: ${T.title} — ${T.place} (${T.date}). Some witness posts are illustrative.\nObservations:\n${T.obs.map((o) => `[${o.id}] ${o.t} — ${o.src}, ${new Date(o.at).toISOString().slice(0, 16)}Z (${o.meta.join('; ')})`).join('\n')}\nCurrent hypotheses:\n${T.hyps.filter((x) => x.id !== id).map((x) => `[${x.id}] ${x.text} (confidence ${x.conf})`).join('\n')}\nRequest from a participant: "${q}"\nReply with ONE new proposed hypothesis in at most 70 words. Cite observation IDs in square brackets like [O3]. Do not invent new observations. End with a final line exactly like "Confidence: 0.xx".`; + let out = '', model = 'scripted fallback (no AI available here)'; + const render = (txt) => { out = txt; const el = textEl(); if (el) el.textContent = txt.replace(/\n?Confidence:.*$/s, '').trim() || '…'; }; + let sample = null; + try { sample = window.claude?.use ? await window.claude.use('sample') : null; } catch { sample = null; } + if (sample) { + try { const r = await sample(promptStr, { onText: ({ text }) => render(text) }); render(r?.text ?? out); model = 'claude · window.claude sample'; } + catch (e) { sample = null; } + } + if (!sample) { const full = T.fallback; for (let i = 1; i <= full.length; i += 3) { render(full.slice(0, i)); await new Promise((r) => setTimeout(r, prefersReduced() ? 0 : 12)); } render(full); } + const cm = /Confidence:\s*([0-9.]+)/i.exec(out); hy.conf = cm ? clamp(parseFloat(cm[1]), 0.05, 0.95) : 0.55; hy.ci = [Math.max(0, hy.conf - 0.16), Math.min(1, hy.conf + 0.14)]; + hy.cites = [...new Set((out.match(/\[(O\d+)\]/g) || []).map((x) => x.slice(1, -1)))]; hy.text = out.replace(/\n?Confidence:.*$/s, '').trim(); hy.model = model; + const e = await THR.append(T, 'ai.proposal', 'claude', { id, prompt: q, model, inputs: hy.cites, output: hy.text, diff: '+' + id }); + THR.renderHyps(); if (send) send.disabled = false; + APP.toast(`${ic('sparkles', 'sm')} Proposed ${id} · ledger #${e.i} · ${e.hash.slice(0, 10)}…`, 3000); +}; + +/* narrative */ +THR.renderNarr = function (c) { + const { T } = THR.ws; + c.innerHTML = `
    ${ic('play', 'xs')} Stratum 3 · Narrative — a camera path through space-time
    ${fmt.utc(GE.world.simMs)}${T.beats.length} beats
    ${T.beats.map((b, i) => `
    ${b.t}
    UTC

    ${esc(b.text)}

    ${b.cites.map((x) => `${x}`).join('')}
    `).join('')}
    `; + $('#play').addEventListener('click', () => (THR.ws.playing ? THR.stop() : THR.play())); + c.querySelectorAll('[data-b]').forEach((el) => el.addEventListener('click', () => THR.goBeat(+el.dataset.b))); +}; +THR.goBeat = function (i, dur) { const { T } = THR.ws; const b = T.beats[i]; THR.ws.beat = i; Cam.flyTo({ ...b.cam, shiftY: APP.isWide() ? 0 : 0.6 }, { duration: dur ?? 2.2 }); GE.world.setTime(b.at); $$('.beat').forEach((x) => x.classList.toggle('on', +x.dataset.b === i)); }; +THR.play = function () { + const ws = THR.ws; ws.playing = true; const T = ws.T; const per = 3.6; const t0 = performance.now(); let last = -1; + const btn = $('#play'); if (btn) btn.innerHTML = ic('pause'); + const step = () => { + if (!THR.ws || !THR.ws.playing) return; const el = (performance.now() - t0) / 1000; const total = per * T.beats.length; + const f = clamp(el / total, 0, 1); const bi = Math.min(T.beats.length - 1, Math.floor(el / per)); + if (bi !== last) { last = bi; THR.goBeat(bi, per * 0.9); } + const a = T.beats[bi], b = T.beats[Math.min(T.beats.length - 1, bi + 1)]; const u = clamp((el - bi * per) / per, 0, 1); + GE.world.setTime(lerp(a.at, b.at, bi === T.beats.length - 1 ? 0 : u)); + const p = $('#narP'); if (p) p.style.width = (f * 100).toFixed(1) + '%'; const nt = $('#narT'); if (nt) nt.textContent = fmt.utc(GE.world.simMs); + if (f >= 1) { THR.stop(); return; } requestAnimationFrame(step); + }; + step(); +}; +THR.stop = function () { if (!THR.ws) return; THR.ws.playing = false; const btn = $('#play'); if (btn) btn.innerHTML = ic('play'); }; + +/* ledger */ +THR.renderLedger = function (c) { + const { T } = THR.ws; const L = THR.ledgers[T.id] || []; + c.innerHTML = `
    ${ic('link', 'xs')} Ledger — SHA-256 hash chain · ${L.length} entries
    ${L.map((e) => `
    #${e.i}${esc(e.type)} · @${esc(e.actor)}
    ${e.hash.slice(0, 20)}… ← ${e.prev.slice(0, 8)}…
    ${esc(JSON.stringify({ i: e.i, ts: new Date(e.ts).toISOString(), type: e.type, actor: e.actor, payload: e.payload, digest: e.digest, prev: e.prev, hash: e.hash }, null, 1))}
    `).join('
    ')}
    `; + c.querySelectorAll('.le .lh').forEach((x) => x.addEventListener('click', () => x.parentElement.classList.toggle('open'))); + $('#lv').addEventListener('click', async () => { + c.querySelectorAll('[data-vk]').forEach((x) => { x.className = 'vk'; x.innerHTML = ''; }); + const ok = await THR.verify(L, async (e, good) => { const el = c.querySelector(`.le[data-i="${e.i}"] [data-vk]`); if (el) { el.className = 'vk ' + (good ? 'ok' : 'bad'); el.innerHTML = ic(good ? 'check' : 'x', 'xs'); el.scrollIntoView({ block: 'nearest' }); } await new Promise((r) => setTimeout(r, prefersReduced() ? 0 : 45)); }); + APP.toast(ok ? `${ic('check', 'sm')} Chain verified · ${L.length} links intact` : `${ic('x', 'sm')} Chain broken at #3 — a payload no longer matches its digest`, 2800); haptic(ok ? 10 : [20, 60, 20]); + }); + $('#lt').addEventListener('click', () => { const e = L[3]; if (!e) return; if (THR._tampered) { e.payload = THR._tampered; THR._tampered = null; } else { THR._tampered = e.payload; e.payload = { ...e.payload, title: (e.payload.title || e.payload.text || '') + ' (edited)' }; } THR.renderLedger(c); APP.toast(THR._tampered ? 'Entry #3 edited locally — now verify' : 'Entry #3 restored'); }); + $('#lx').addEventListener('click', () => { try { const blob = new Blob([JSON.stringify(L, null, 1)], { type: 'application/json' }); const a = h('a', { href: URL.createObjectURL(blob), download: `ledger-${T.id}.json` }); document.body.append(a); a.click(); a.remove(); } catch {} APP.toast(`${ic('share', 'sm')} Ledger exported as JSON`); }); +}; diff --git a/mobile/vision/src/js/67-you.js b/mobile/vision/src/js/67-you.js new file mode 100644 index 000000000..d40cf1569 --- /dev/null +++ b/mobile/vision/src/js/67-you.js @@ -0,0 +1,68 @@ +/* You: captures and their seals (+ verify inspector), holograms left in places, followed situations, + alert radius, rendering quality, the concept marker and credits. */ +const YOU = (GE.you = { radius: store.get('radius', 250), follows: store.get('follows', { cyclone: true, koshi: true, aurora: true, iss: false, launch: true }) }); +YOU.render = function () { + const v = $('#v-you'); const st = v.scrollTop; const W = GE.world; + const caps = GE.captures; const holos = [...W.userHolos, ...GE.HOLOS.filter((x) => x.by === 'you')]; + v.innerHTML = `
    +
    ${ic('key', 'xs')} Device key · P-256 · ${GE.crypto.KEY.pair ? 'ready' : 'generating…'}

    You

    +
    Y

    Your window

    Watching from ${esc(GE.ME.name)} · ${esc(GE.ME.tz)}
    ${ic('sparkles', 'xs')} Concept · illustrative data
    +
    ${caps.length}captures
    ${holos.length}holograms
    ${Object.values(YOU.follows).filter(Boolean).length}following
    ${caps.length ? '100%' : '—'}verified
    +

    Captures

    sealed on this device
    +
    ${caps.length ? caps.map((c, i) => `
    ${esc(c.place)}${fmt.utc(c.at)}
    ${c.hash ? c.hash.slice(0, 18) + '…' : 'sealing…'}
    `).join('') : `
    No captures yet — open Capture › Witness and press the shutter.
    `}
    +

    Holograms

    left in places
    +
    ${(holos.length ? holos : [{ title: 'Drop one from a Witness capture', lat: 0, lon: 0, empty: true }]).map((x) => `
    ${ic('cube')}${esc(x.title)}${x.empty ? 'Visible to people nearby' : fmt.ll(x.lat, x.lon, 3) + ' · visible to people nearby'}${x.empty ? '' : ``}
    `).join('')}
    +

    Following

    alerts
    +
    ${Object.entries(YOU.follows).map(([id, on]) => { const s = GE.SIT.byId[id]; if (!s) return ''; return `
    ${ic(GE.FAM[s.fam].icon)}${esc(s.title.split(' — ')[0])}${esc(s.place)}
    `; }).join('')}
    +

    Alert radius

    ${YOU.radius} km
    +
    10 km2,000 km
    +

    Rendering

    adaptive
    +
    ${ic('gauge')}Resolution scaleDrops when frames take > 20 ms for 2 s
    +
    ${ic('cpu')}Frame timePost chain: atmosphere → FXAA → half-res bloom → grade
    +
    ${ic('sparkles')}Bloom
    +
    ${ic('frame')}Film grain
    +
    ${ic('gyro')}Reduced motionFollows your system setting${prefersReduced() ? 'On' : 'Off'}
    +

    About

    vision mockup
    +

    ${ic('sparkles', 'xs')} Concept · illustrative data

    +

    God’s Eye — the window through which you see the world, and the eye through which the world sees itself. This is a design vision: every flight, ship, satellite, quake, fire, cyclone, camera, person, handle, post and reconstruction claim here is synthetic or fictional, placed in real geography.

    +

    Imagery: NASA Earth Observatory / Visible Earth — Blue Marble: Next Generation (cloudless day), Black Marble 2016 (night lights), Blue Marble cloud mosaic, land/water mask and topography. Public domain, courtesy of NASA.

    +

    Real crypto: SHA-256 (WebCrypto) over every rendered capture and ledger entry; ECDSA P-256 signatures with a non-extractable key generated on this device.

    +

    Renderer: hand-written WebGL2 — ray-traced planet with single-scatter atmosphere, day/night terminator from the real sun position, ocean glint, clouds, stars, procedural cities and terrain, GPU-propagated flights and orbits.

    `; + v.scrollTop = st; + v.querySelectorAll('[data-c]').forEach((el) => el.addEventListener('click', () => YOU.inspect(+el.dataset.c))); + v.querySelectorAll('[data-f]').forEach((el) => el.addEventListener('click', () => { const id = el.dataset.f; YOU.follows[id] = !YOU.follows[id]; el.classList.toggle('on', YOU.follows[id]); el.setAttribute('aria-checked', YOU.follows[id]); store.set('follows', YOU.follows); haptic(5); })); + v.querySelectorAll('[data-q]').forEach((el) => el.addEventListener('click', () => { const k = el.dataset.q; W.quality[k] = !W.quality[k]; el.classList.toggle('on', W.quality[k]); haptic(5); })); + v.querySelectorAll('[data-fly]').forEach((el) => el.addEventListener('click', () => { const [la, lo] = el.dataset.fly.split(',').map(Number); APP.setTab('globe'); Cam.flyTo({ lat: la, lon: lo, range: 0.002, tilt: 1.1 }); })); + const rad = $('#rad'); rad.addEventListener('input', () => { YOU.radius = +rad.value; $('#radV').textContent = YOU.radius + ' km'; store.set('radius', YOU.radius); YOU.drawRadius(); }); + YOU.drawRadius(); +}; +YOU.drawRadius = function () { + const svg = $('#radSvg'); if (!svg) return; const W = GE.world; const me = GE.ME; const r = YOU.radius; + const spanKm = Math.max(600, r * 2.6); const sx = 300 / spanKm, sy = 120 / (spanKm * 0.4); + const P2 = (la, lo) => [150 + (lo - me.lon) * 111 * Math.cos(me.lat * D2R) * sx, 60 - (la - me.lat) * 111 * sy]; + let s = ``; + for (const c of GE.CITY_V) { const [x, y] = P2(c.lat, c.lon); if (x > -5 && x < 305 && y > -5 && y < 125) s += ``; } + let n = 0; for (const s0 of GE.SIT.list) { const d = geo.dist(me.lat, me.lon, s0.lat, s0.lon) * EARTH_KM; const [x, y] = P2(s0.lat, s0.lon); if (d < r) n++; if (x > 0 && x < 300 && y > 0 && y < 120) s += ``; } + for (const q of GE.QUAKES) { const d = geo.dist(me.lat, me.lon, q.lat, q.lon) * EARTH_KM; if (d < r) n++; } + s += `${esc(me.name)}`; + svg.innerHTML = s; const nn = $('#radN'); if (nn) nn.textContent = `${n} alerts in range this week`; +}; +YOU.tick = function () { const a = $('#qScale'); if (a) a.textContent = `${GE.gov.scale.toFixed(2)}× · ${GE.gov.w}×${GE.gov.h}`; const b = $('#qFps'); if (b) b.textContent = `${GE.gov.ms.toFixed(1)} ms`; }; +YOU.inspect = async function (i) { + const c = GE.captures[i]; if (!c) return; const el = $('#inspector'); + el.innerHTML = `
    +
    Verify capture
    ${esc(c.place)} · ${fmt.utc(c.at)}
    +
    ${['Media hash recomputed (SHA-256)', 'Bundle hash recomputed', 'Signature valid — ECDSA P-256, device public key', 'IMU agrees with the image horizon (±0.8°)', 'GPS track agrees with capture time', 'Chain link to previous bundle'].map((t, k) => `
    ${ic('check', 'xs')}
    ${t}
    `).join('')}
    +
    pubkey x ${c.jwk?.x || '—'}
    pubkey y ${c.jwk?.y || '—'}
    +

    In a native build the key lives in the Secure Enclave / StrongBox and the bundle is written as a C2PA manifest.

    `; + el.classList.add('on'); + $('#insX').addEventListener('click', () => el.classList.remove('on')); + el.addEventListener('click', (e) => { if (e.target === el) el.classList.remove('on'); }); + const mark = async (k, ok, txt) => { await new Promise((r) => setTimeout(r, prefersReduced() ? 0 : 260)); const s = $(`#vsteps [data-k="${k}"]`); if (!s) return; s.classList.add('on'); if (ok) s.classList.add('done'); else s.querySelector('.ck').style.cssText = 'background:var(--live);box-shadow:none;color:#fff'; s.querySelector('[data-h]').textContent = txt; haptic(3); }; + const mh = await sha256(c.bytes); await mark(0, mh === c.mediaHash, mh); + const bh = await sha256(canon({ media: mh, session: c.session, context: c.context, prev: c.prev })); await mark(1, bh === c.hash, bh); + const ok = await GE.crypto.verifyHex(c.hash, c.sig); await mark(2, ok, ok ? (c.sig || '').slice(0, 64) + '…' : 'no signature available in this browser'); + await mark(3, true, `roll ${c.session.imu[0].g}° · pitch ${c.session.imu[0].b}° vs rendered horizon`); + await mark(4, true, `${c.session.gps.length} fixes within ${(c.session.end - c.session.start) / 1000} s of the shutter`); + const prev = i > 0 ? GE.captures[i - 1].hash : '0'.repeat(64); await mark(5, prev === c.prev, `prev ${c.prev.slice(0, 32)}…`); +}; diff --git a/mobile/vision/src/js/90-main.js b/mobile/vision/src/js/90-main.js new file mode 100644 index 000000000..7387c310f --- /dev/null +++ b/mobile/vision/src/js/90-main.js @@ -0,0 +1,103 @@ +/* Boot, render loop, adaptive-DPR governor, cold open. */ +const HASH = (() => { const o = {}; try { (location.hash || '').slice(1).split('&').forEach((kv) => { const [k, v] = kv.split('='); if (k) o[decodeURIComponent(k)] = v == null ? true : decodeURIComponent(v); }); } catch {} return o; })(); +GE.HASH = HASH; +const gov = (GE.gov = { levels: [1, 0.85, 0.72, 0.6, 0.5], li: 0, scale: 1, ms: 16, w: 0, h: 0, acc: 0, n: 0, slow: 0, fast: 0, pinned: HASH.dpr ? parseFloat(HASH.dpr) : null }); +let chain = null; const canvas = $('#gl'); +function sizeCanvas() { + const cw = canvas.clientWidth || innerWidth, chh = canvas.clientHeight || innerHeight; + const dpr = Math.min(devicePixelRatio || 1, 2); + const s = gov.pinned || dpr * gov.levels[gov.li]; gov.scale = s; + const w = Math.max(2, Math.round(cw * s)), hh = Math.max(2, Math.round(chh * s)); + if (canvas.width !== w || canvas.height !== hh) { canvas.width = w; canvas.height = hh; } + if (!chain || chain.w !== w || chain.h !== hh) { chain && chain.dispose(); chain = GL.chain(w, hh); } + gov.w = w; gov.h = hh; return [cw, chh]; +} +function governor(dt) { + if (gov.pinned) return; + gov.ms = lerp(gov.ms, dt * 1000, 0.08); + if (gov.ms > 21) { gov.slow += dt; gov.fast = 0; } else if (gov.ms < 13.5) { gov.fast += dt; gov.slow = 0; } else { gov.slow = Math.max(0, gov.slow - dt); gov.fast = 0; } + if (gov.slow > 2 && gov.li < gov.levels.length - 1) { gov.li++; gov.slow = 0; bus.emit('quality', { scale: gov.scale, fps: 1000 / gov.ms }); } + if (gov.fast > 5 && gov.li > 0) { gov.li--; gov.fast = 0; } + W.quality.steps = gov.li >= 3 ? 8 : 12; +} +function globeVisible() { + if (APP.intro) return true; + if (APP.isWide()) return true; + if (APP.tab === 'globe' || APP.tab === 'capture' || APP.mode) return true; + if (APP.tab === 'now') { const v = $('#v-now'); return v.scrollTop < v.querySelector('.now-hero')?.offsetHeight + 40; } + return false; +} +let lastT = performance.now(), lastDyn = 0, lastSec = 0, running = true; +function frame(now) { + if (!running) return; + const dt = Math.min(0.1, Math.max(0.001, (now - lastT) / 1000)); lastT = now; + W.simMs = Date.now() + W.offsetH * 3600000; W.t = (W.simMs - NOW) / 1000; W.sun = astro.sun(W.simMs); + Cam.update(dt); + if (APP.mode === 'situation' && !Cam.anim && GE.sheet.targetShift != null && !APP.isWide()) Cam.shiftY += (GE.sheet.targetShift - Cam.shiftY) * Math.min(1, dt * 7); + if (globeVisible()) { + const [cw, chh] = sizeCanvas(); + if (now - lastDyn > 40) { W.updateDynamic(); lastDyn = now; } + const view = Cam.view(cw, chh); GE.mainView = view; + const ov = GE.renderOverride || {}; + W.render(view, chain, null, { ...ov, focus: W.focus, extraSprites: W.activeExtras?.sprites, extraLines: W.activeExtras?.lines, fade: GE.introFade ?? 1 }); + APP.updateLabels(view); GE.ride.frame(view); GE.capture.frame(view); + } + if (APP.tab === 'globe' || APP.isWide() || APP.mode) GE.gui.ribbonFrame(); + GE.thumbs.step(APP.intro ? 14 : 8); + if (now - lastSec > 1000) { lastSec = now; W.updateCounts(); GE.now.tick(); GE.sheet.tick(); GE.you.tick(); } + governor(dt); + requestAnimationFrame(frame); +} +document.addEventListener('visibilitychange', () => { if (document.hidden) running = false; else if (!running) { running = true; lastT = performance.now(); requestAnimationFrame(frame); } }); + +/* ---------- cold open ---------- */ +function coldOpen() { + const cold = $('#cold'); const app = $('#app'); + const skipAll = HASH.nointro || HASH.tab; + const red = prefersReduced(); + W.sun = astro.sun(Date.now()); const finalCam = APP.heroCam(); + const end = () => { + if (!APP.intro) return; APP.intro = false; GE.introFade = 1; W.setTime(null); + cold.classList.add('out'); app.classList.remove('intro'); setTimeout(() => cold.remove(), 1100); + Cam.cancel(); if (Cam.range > 2.2 && !APP.isWide()) Cam.flyTo(finalCam, { duration: 0.6 }); + Cam.autoSpin = 0.3; APP.updateChrome(); APP.moveLens(); + if (HASH.tab) APP.setTab(HASH.tab, { force: true }); + }; + APP.intro = true; app.classList.add('intro'); APP.updateChrome(); + if (skipAll) { Cam.set(finalCam); end(); return; } + Cam.set({ lat: 8, lon: finalCam.lon + 75, range: 5.8, heading: 0, tilt: 0, shiftY: 0.0, shiftX: 0 }); + const T = red ? 1.2 : 3.4; const t0 = performance.now(); + GE.introFade = 0; + if (!red) Cam.flyTo(finalCam, { duration: T }); + else Cam.set(finalCam); + const tick = () => { + if (!APP.intro) return; const u = clamp((performance.now() - t0) / 1000 / T, 0, 1); + GE.introFade = ease.out(clamp(u * 2.2, 0, 1)); + if (!red) W.setTime(Date.now() - (1 - ease.outQuint(u)) * 9 * 3600000); + if (u > 0.12) cold.classList.add('s1'); if (u > 0.36) cold.classList.add('s2'); + if (u >= 1) { setTimeout(end, red ? 200 : 500); return; } requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); + $('#skip').addEventListener('click', (e) => { e.stopPropagation(); Cam.set(finalCam); end(); }); + cold.addEventListener('click', () => { Cam.set(finalCam); end(); }); +} + +/* ---------- boot ---------- */ +async function boot() { + const gl = GL.init(canvas); + if (!gl) { document.body.insertAdjacentHTML('beforeend', '
    This vision needs WebGL2. Try a recent browser on a phone, tablet or desktop.
    '); return; } + canvas.addEventListener('webglcontextlost', (e) => { e.preventDefault(); running = false; APP.toast('Graphics context lost — reopen to resume', 4000); }); + await W.loadTextures(); + W.buildStatic(); W.buildMovers(); W.updateCounts(); W.updateDynamic(); + W.situationPins = GE.SIT.list.map(GE.SIT.pin).filter(Boolean); + APP.initShell(); GE.now.render(); GE.threads.render(); GE.you.render(); GE.gui.init(); GE.sheet.initDrag(); + Cam.attach(canvas, () => GE.mainView || Cam.view(canvas.clientWidth, canvas.clientHeight)); + sizeCanvas(); + coldOpen(); + requestAnimationFrame(frame); + GE.threads.init().then(() => { if (!GE.threads.ws) GE.threads.render(); }); + GE.crypto.KEY.get().then(() => GE.you.render()); + if (HASH.open) setTimeout(() => GE.sheet.open(HASH.open, {}), 300); + GE.ready = true; +} +boot().catch((e) => { console.error(e); });