From c7e86663d8ae03cbd36e1d462a47b74d395139bf Mon Sep 17 00:00:00 2001 From: Emil Date: Thu, 17 Sep 2026 02:10:53 +0300 Subject: [PATCH] Expand voxel gameplay, lighting, full-height streaming and world imports Add shared Rust/WASM physics, worker meshing and diagnostics, 64-chunk full-height streaming, atlas texture support, and baseline world import. Document the current implementation and include the supplied in-game lobby screenshot. --- .github/workflows/ci.yml | 1 + Cargo.lock | 9 + Cargo.toml | 2 +- README.md | 21 +- client/ambient-occlusion.js | 120 + client/app.js | 731 +- client/block-light-controller.js | 104 + client/block-light-worker.js | 15 + client/block-light.js | 257 + client/block-textures.js | 101 + client/dynamics-diagnostics.js | 60 + client/edit-diagnostics.js | 28 + client/edit-mesh-controller.js | 43 + client/edit-mesh-worker.js | 10 + client/edit-mesh.js | 54 + client/index.html | 43 +- client/light-changes.js | 28 + client/light-properties.js | 78 + client/light-properties.json | 1 + client/lighting-shaders.js | 321 + client/local-light-bounds.js | 10 + client/math.js | 1 + client/mesh-geometry.js | 189 + client/physics.wasm | Bin 0 -> 247211 bytes client/player-interpolation.js | 21 + client/player-physics.js | 256 + client/pointer-lock.js | 115 + client/renderer.js | 802 +- client/section-block-map.js | 68 + client/section-stream.js | 64 + client/section-voxel-map.js | 75 + client/shadow-frame.js | 25 + client/style.css | 13 +- client/terrain-controller.js | 231 + client/terrain-mesh-worker.js | 13 + client/terrain-state.js | 192 + client/terrain-worker.js | 27 + client/tests/actor-rendering.test.js | 91 + client/tests/ambient-occlusion.test.js | 144 + client/tests/block-light-controller.test.js | 227 + client/tests/block-light.test.js | 202 + client/tests/block-textures.test.js | 106 + client/tests/dynamics-diagnostics.test.js | 17 + client/tests/edit-diagnostics.test.js | 20 + client/tests/edit-mesh.test.js | 75 + client/tests/fixtures/lighting-java26.2.json | 984 +++ client/tests/large-world.test.js | 33 + client/tests/light-changes.test.js | 69 + client/tests/light-properties.test.js | 72 + client/tests/local-terrain-meshing.test.js | 117 + client/tests/math.test.js | 5 + client/tests/mesh-geometry.test.js | 132 + client/tests/physics-wasm.test.js | 133 + client/tests/player-avatar.test.js | 39 + client/tests/player-interpolation.test.js | 140 + client/tests/player-physics.test.js | 208 + client/tests/pointer-lock.test.js | 169 + client/tests/renderer-smoke.html | 478 +- client/tests/renderer-streaming.test.js | 47 + client/tests/section-block-map.test.js | 98 + client/tests/section-stream.test.js | 70 + client/tests/shadow-frame.test.js | 21 + client/tests/terrain-controller.test.js | 335 + client/tests/terrain-state.test.js | 253 + client/tests/terrain-streaming-smoke.html | 148 + client/tests/terrain-upload.test.js | 236 + client/tests/texture-pack.test.js | 70 + client/tests/view-distance.test.js | 86 + client/tests/world-view.test.js | 358 + client/texture-pack.js | 70 + client/view-distance.js | 30 + client/world-view.js | 206 + crates/shacraft-compat/src/anvil.rs | 28 + crates/shacraft-compat/src/lib.rs | 2 +- crates/shacraft-compat/src/main.rs | 16 +- crates/shacraft-compat/tests/roundtrip.rs | 52 +- crates/shacraft-core/src/database.rs | 10 + crates/shacraft-core/src/store.rs | 88 +- crates/shacraft-core/tests/generated.rs | 78 + crates/shacraft-physics/Cargo.toml | 12 + crates/shacraft-physics/src/lib.rs | 1222 +++ .../tests/fixtures/java26.2.json | 7814 +++++++++++++++++ crates/shacraft-physics/tests/locomotion.rs | 624 ++ crates/shacraft-server/Cargo.toml | 1 + crates/shacraft-server/src/control.rs | 67 +- crates/shacraft-server/src/game.rs | 663 +- crates/shacraft-server/src/main.rs | 15 +- crates/shacraft-server/src/terrain.rs | 775 ++ crates/shacraft-server/src/tests.rs | 919 +- crates/shacraft-server/src/world_streaming.rs | 516 ++ docs/CLIENT.md | 50 +- docs/LIGHTING.md | 129 + docs/PACKAGES.md | 33 + docs/PHYSICS.md | 187 + docs/PHYSICS_PLAN.md | 22 + docs/SERVER.md | 24 +- docs/STATUS.md | 10 +- docs/WORLD_STREAMING.md | 278 + docs/WORLD_STREAMING_PLAN.md | 28 + docs/images/minigames-lobby-night.png | Bin 0 -> 1503354 bytes docs/interop.md | 5 + scripts/build_physics.sh | 7 + scripts/check_chunk_streaming.mjs | 293 + scripts/check_player_physics.mjs | 221 + scripts/lighting_reference.java | 129 + scripts/measure_lighting.py | 88 + scripts/measure_physics.py | 70 + scripts/physics_reference.java | 332 + scripts/prepare_texture_pack.py | 160 + scripts/prepare_vanilla_texture_pack.py | 262 + scripts/verify.sh | 7 +- 111 files changed, 24257 insertions(+), 598 deletions(-) create mode 100644 client/ambient-occlusion.js create mode 100644 client/block-light-controller.js create mode 100644 client/block-light-worker.js create mode 100644 client/block-light.js create mode 100644 client/block-textures.js create mode 100644 client/dynamics-diagnostics.js create mode 100644 client/edit-diagnostics.js create mode 100644 client/edit-mesh-controller.js create mode 100644 client/edit-mesh-worker.js create mode 100644 client/edit-mesh.js create mode 100644 client/light-changes.js create mode 100644 client/light-properties.js create mode 100644 client/light-properties.json create mode 100644 client/lighting-shaders.js create mode 100644 client/local-light-bounds.js create mode 100644 client/mesh-geometry.js create mode 100755 client/physics.wasm create mode 100644 client/player-interpolation.js create mode 100644 client/player-physics.js create mode 100644 client/pointer-lock.js create mode 100644 client/section-block-map.js create mode 100644 client/section-stream.js create mode 100644 client/section-voxel-map.js create mode 100644 client/shadow-frame.js create mode 100644 client/terrain-controller.js create mode 100644 client/terrain-mesh-worker.js create mode 100644 client/terrain-state.js create mode 100644 client/terrain-worker.js create mode 100644 client/tests/actor-rendering.test.js create mode 100644 client/tests/ambient-occlusion.test.js create mode 100644 client/tests/block-light-controller.test.js create mode 100644 client/tests/block-light.test.js create mode 100644 client/tests/block-textures.test.js create mode 100644 client/tests/dynamics-diagnostics.test.js create mode 100644 client/tests/edit-diagnostics.test.js create mode 100644 client/tests/edit-mesh.test.js create mode 100644 client/tests/fixtures/lighting-java26.2.json create mode 100644 client/tests/large-world.test.js create mode 100644 client/tests/light-changes.test.js create mode 100644 client/tests/light-properties.test.js create mode 100644 client/tests/local-terrain-meshing.test.js create mode 100644 client/tests/mesh-geometry.test.js create mode 100644 client/tests/physics-wasm.test.js create mode 100644 client/tests/player-avatar.test.js create mode 100644 client/tests/player-interpolation.test.js create mode 100644 client/tests/player-physics.test.js create mode 100644 client/tests/pointer-lock.test.js create mode 100644 client/tests/renderer-streaming.test.js create mode 100644 client/tests/section-block-map.test.js create mode 100644 client/tests/section-stream.test.js create mode 100644 client/tests/shadow-frame.test.js create mode 100644 client/tests/terrain-controller.test.js create mode 100644 client/tests/terrain-state.test.js create mode 100644 client/tests/terrain-streaming-smoke.html create mode 100644 client/tests/terrain-upload.test.js create mode 100644 client/tests/texture-pack.test.js create mode 100644 client/tests/view-distance.test.js create mode 100644 client/tests/world-view.test.js create mode 100644 client/texture-pack.js create mode 100644 client/view-distance.js create mode 100644 client/world-view.js create mode 100644 crates/shacraft-core/tests/generated.rs create mode 100644 crates/shacraft-physics/Cargo.toml create mode 100644 crates/shacraft-physics/src/lib.rs create mode 100644 crates/shacraft-physics/tests/fixtures/java26.2.json create mode 100644 crates/shacraft-physics/tests/locomotion.rs create mode 100644 crates/shacraft-server/src/terrain.rs create mode 100644 crates/shacraft-server/src/world_streaming.rs create mode 100644 docs/LIGHTING.md create mode 100644 docs/PHYSICS.md create mode 100644 docs/PHYSICS_PLAN.md create mode 100644 docs/WORLD_STREAMING.md create mode 100644 docs/WORLD_STREAMING_PLAN.md create mode 100644 docs/images/minigames-lobby-night.png create mode 100755 scripts/build_physics.sh create mode 100644 scripts/check_chunk_streaming.mjs create mode 100644 scripts/check_player_physics.mjs create mode 100644 scripts/lighting_reference.java create mode 100644 scripts/measure_lighting.py create mode 100644 scripts/measure_physics.py create mode 100644 scripts/physics_reference.java create mode 100644 scripts/prepare_texture_pack.py create mode 100644 scripts/prepare_vanilla_texture_pack.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4371734..59965ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ jobs: with: toolchain: 1.96.0 components: rustfmt, clippy + targets: wasm32-unknown-unknown - uses: actions/setup-node@v4 with: node-version: 22 diff --git a/Cargo.lock b/Cargo.lock index 099bc83..e2849ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1467,6 +1467,14 @@ dependencies = [ "serde_json", ] +[[package]] +name = "shacraft-physics" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "shacraft-server" version = "0.1.0" @@ -1483,6 +1491,7 @@ dependencies = [ "sha2", "shacraft-content", "shacraft-core", + "shacraft-physics", "tempfile", "tokio", "tower", diff --git a/Cargo.toml b/Cargo.toml index c097e8b..b1be0dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["crates/shacraft-core", "crates/shacraft-tools", "crates/shacraft-server", "crates/shacraft-mcp", "crates/shacraft-content", "crates/shacraft-compat"] +members = ["crates/shacraft-core", "crates/shacraft-tools", "crates/shacraft-server", "crates/shacraft-mcp", "crates/shacraft-content", "crates/shacraft-compat", "crates/shacraft-physics"] [workspace.package] version = "0.1.0" diff --git a/README.md b/README.md index 980ffb9..c16d7f0 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,12 @@ An independent, open-source voxel engine written in Rust. The local MVP includes Minecraft is mentioned to identify compatibility targets and data sources. Minecraft names, brands, and assets remain the property of their respective owners. See the [Minecraft Usage Guidelines](https://www.minecraft.net/en-us/usage-guidelines). +## In-game demonstration + +![An imported minigames lobby at night, with block lighting and another player visible in the Shacraft browser client](docs/images/minigames-lobby-night.png) + +An imported minigames lobby running in Shacraft, with multiplayer avatars and block lighting. This development screenshot uses original Minecraft textures for a local compatibility test; the world and texture pack are not bundled with the repository. Render distance supports up to 64 chunks (1,024 blocks), with progressive loading across the full world height, Y=−64 through 319. + ## Quick start You need Rust 1.96+, a C compiler for bundled SQLite, and a browser with WebGL2. Java and Node.js are not required to play. The first run downloads Cargo dependencies and builds the release binaries; subsequent runs use the existing binaries. @@ -18,9 +24,10 @@ cd shacraft-core bash scripts/run.sh --data data --listen 127.0.0.1:4000 ``` -Open **http://127.0.0.1:4000**. The server creates a lobby, a block gallery, and two Spleef arenas automatically. The MVP client currently uses Russian interface text. +Open **http://127.0.0.1:4000**. The server creates a lobby, a block gallery, two Spleef arenas and a procedural Overworld automatically. Open `http://localhost:4000/?world=overworld` for the large world. The MVP client currently uses Russian interface text. - **WASD** to move, **Space** to jump, and the mouse to look around. Drag to look if pointer lock is unavailable. +- **Ctrl** to sprint, **Shift** to crouch, **double-Space / F** to toggle permitted creative flight; Space/Shift ascend/descend. - **Left/right click** to remove/place a block; **E** for the material library, **T** for chat, and **F3** for diagnostics. - Select a world in the upper-left corner. To play Spleef, two players join the same arena and start a match from the menu. @@ -29,7 +36,8 @@ World data is stored under `--data`. Stop the server with Ctrl+C. Acknowledged b ## What's included - **`shacraft-core`** — compact 16³ sections, a bounded shared cache, SQLite with WAL and FULL synchronization, immutable snapshots, independent world edits, revisions, idempotent operations, undo, and reset. No graphics or networking dependencies. -- **`shacraft-server`** — authoritative movement, collision shapes and interactions, WebSocket/HTTP, persistent entities and settings, and a complete Spleef match cycle. +- **`shacraft-server`** — authoritative movement, collision shapes and interactions, WebSocket/HTTP, persistent entities and settings, and a complete Spleef match cycle. The seeded Overworld spans 384 vertical layers and nearly ±30 million horizontal blocks, with bounded CPU generation and section streaming. +- **`shacraft-physics`** — shared 20 Hz Rust/WASM player movement, client prediction and reconciliation, tested against measured Java 26.2 movement kernels, collision cases and block callbacks. See [physics and its limits](docs/PHYSICS.md). - **`client/`** — a custom renderer, material library, players and entities, chat, world switching, reconnection, and verified package downloads. - **`shacraft-mcp`** — a separate stdio MCP server with 17 tools, resources, and a prompt; build plans, reads, undo, entities, arenas, metrics, and PNG previews. - **`shacraft-content`** — **1,196 blocks, 32,366 states, and 158 entity types from Java 26.2**, DataVersion 4903. Source identifiers, measured collision shapes, and independently authored rendering templates. An additional trampoline block demonstrates extensions. @@ -38,9 +46,9 @@ World data is stored under `--data`. Stop the server with Ctrl+C. Acknowledged b ## Compatibility and scope -This MVP does not implement full vanilla AI, redstone, inventories, or fluid simulation. Context-dependent shapes are marked separately. After edits, the converter uses an explicit `best-effort` mode; an unchanged original can be returned byte for byte. Full Minecraft gameplay or NeoForge mod compatibility is not claimed. Minecraft source code, binaries, and original visual/audio assets are not distributed. +This MVP does not implement full vanilla AI, redstone, inventories, or fluid simulation. Context-dependent shapes are marked separately. After edits, the converter uses an explicit `best-effort` mode; an unchanged original can be returned byte for byte. Full Minecraft gameplay or NeoForge mod compatibility is not claimed. Minecraft source code, binaries, texture packs, and audio files are not bundled. -The release benchmark measured a maximum of **59.65 MiB RSS/VmHWM with 10 moving clients** and **50.50 MiB RSS with 100 idle world forks**. These are results from a short local workload, not a comparison with Paper or a production capacity guarantee. See [verification and limits](docs/VERIFICATION.md). +The earlier MVP release benchmark measured a maximum of **59.65 MiB RSS/VmHWM with 10 moving clients** and **50.50 MiB RSS with 100 idle world forks**. These measurements predate the shared movement solver and are results from a short local workload, not a comparison with Paper or a production capacity guarantee. See [verification and limits](docs/VERIFICATION.md). ## MCP and world conversion @@ -61,13 +69,14 @@ The Control API token is created at `data/control.token` with mode 0600 on Unix ```bash # Rust checks, crash recovery, JavaScript tests, and real HTTP/WebSocket clients: +rustup target add wasm32-unknown-unknown bash scripts/verify.sh # Release benchmark with budgets set before the run: cargo build --release --workspace --locked node scripts/benchmark_server.mjs --output artifacts/server-benchmark.json ``` -Node.js 22+ is required for network and JavaScript checks; Python 3 is required for the storage crash test. The independent MCP SDK and Java/NBT verification procedures are documented in [VERIFICATION](docs/VERIFICATION.md). Recorded checks include 84 Rust tests, 6 JavaScript tests, and 14 HTTP/WebSocket scenario groups. +Node.js 22+ is required for network and JavaScript checks; Python 3 is required for the storage crash test. Verification rebuilds the physics WebAssembly with the Rust `wasm32-unknown-unknown` target; playing uses the included artifact. The independent MCP SDK and Java/NBT verification procedures are documented in [VERIFICATION](docs/VERIFICATION.md). ## Documentation @@ -75,6 +84,8 @@ Node.js 22+ is required for network and JavaScript checks; Python 3 is required - [Requirements](docs/REQUIREMENTS.md), [implementation plan](docs/PLAN.md), and [design decisions](docs/DECISIONS.md) - [Core contracts](docs/CONTRACT.md), [memory and storage](docs/MEMORY_AND_STORAGE.md), and [development tools](docs/DEVELOPMENT.md) - [Server](docs/SERVER.md), [client](docs/CLIENT.md), and [MCP](docs/MCP.md) +- [Player physics, reference measurements and prediction](docs/PHYSICS.md) +- [Procedural worlds, streaming and movement diagnostics](docs/WORLD_STREAMING.md) - [Content catalog](docs/CONTENT.md), [compatibility](docs/COMPATIBILITY.md), [world interchange](docs/interop.md), and [packages](docs/PACKAGES.md) - [Acceptance criteria](docs/ACCEPTANCE.md) and [verification evidence](docs/VERIFICATION.md) diff --git a/client/ambient-occlusion.js b/client/ambient-occlusion.js new file mode 100644 index 0000000..f557831 --- /dev/null +++ b/client/ambient-occlusion.js @@ -0,0 +1,120 @@ +import { unitBox } from "./math.js"; + +const EPSILON = 1e-4; +const LEVELS = Object.freeze([0.76, 0.84, 0.92, 1]); +const OPEN = Object.freeze([1, 1, 1, 1]); + +/** Cutout and translucent surfaces should not stamp solid black corners. */ +export function isAmbientOccluder(material) { + if (!material) return true; // Match the renderer's unknown-block cube. + if (material.transparent || material.cutout || (material.opacity ?? 1) < 1) + return false; + const name = (material.state ?? "").split("[")[0].split(":").pop(); + return !/(?:^|_)(?:glass|leaves|sapling|flower|tulip|orchid|bush|roots|fern|vine|vines|torch|lantern|rail|coral|seagrass|kelp)(?:_|$)/.test(name) && + !/^(?:water|lava|ice|frosted_ice|cobweb|scaffolding|iron_bars|chain|ladder|tripwire|redstone_wire|short_grass|tall_grass|dead_bush|sugar_cane|lily_pad|dandelion|poppy|blue_orchid|allium|azure_bluet|oxeye_daisy|cornflower|lily_of_the_valley|wither_rose|sunflower|lilac|rose_bush|peony|azalea|flowering_azalea|brown_mushroom|red_mushroom|crimson_fungus|warped_fungus)$/.test(name); +} + +function validBoxes(material) { + return (material?.render ?? [unitBox]).filter((box) => + box?.min?.length === 3 && box?.max?.length === 3 && + box.min.every((value, axis) => Number.isFinite(value) && + Number.isFinite(box.max[axis]) && box.max[axis] > value), + ); +} + +/** + * Create once per section rebuild. Voxel and material lookups are cached until + * that rebuild ends; a later edit must use a fresh sampler. + * + * The returned function accepts (position, localBox, axisNormal, faceVertices). + * faceVertices are four normalized 0/1 cube corners, in renderer face.v order. + * Values describe ambient light only: direct sunlight remains independent. + * Optional isOccluder(material, blockId) can reject texture-pack cutout surfaces. + */ +export function createAmbientOcclusionSampler(blocks, materials, isOccluder) { + const materialBoxes = new Map(), voxelBoxes = new Map(), offsets = new Map(); + offsets.set("0,0,0", [0, 0, 0]); + const boxesFor = (id) => { + if (!materialBoxes.has(id)) { + const material = materials.get(id); + materialBoxes.set(id, + isAmbientOccluder(material) && (!isOccluder || isOccluder(material, id)) + ? validBoxes(material) : [], + ); + } + return materialBoxes.get(id); + }; + // Catalog render boxes can extend beyond their owning voxel (e.g. fences). + // Only those actual offsets add lookups; ordinary cubes use a single cell. + for (const id of materials.keys()) + for (const box of boxesFor(id)) { + // Unbounded custom geometry must not turn a section rebuild into a scan + // of the whole world. The renderer/selection catalog uses this same reach. + const min = box.min.map((value) => Math.max(-3, Math.floor(value))); + const max = box.max.map((value) => Math.min(3, Math.ceil(value) - 1)); + for (let x = min[0]; x <= max[0]; x++) + for (let y = min[1]; y <= max[1]; y++) + for (let z = min[2]; z <= max[2]; z++) + offsets.set(`${x},${y},${z}`, [x, y, z]); + } + const ownerOffsets = [...offsets.values()]; + const occupied = (point) => { + const cellX = Math.floor(point[0]), cellY = Math.floor(point[1]), cellZ = Math.floor(point[2]); + for (const offset of ownerOffsets) { + const x = cellX - offset[0], y = cellY - offset[1], z = cellZ - offset[2]; + const key = `${x},${y},${z}`; + if (!voxelBoxes.has(key)) { + const id = blocks.getAt ? blocks.getAt(x,y,z) : blocks.get(key); + voxelBoxes.set(key, id ? boxesFor(id) : []); + } + const localX = point[0] - x, localY = point[1] - y, localZ = point[2] - z; + for (const box of voxelBoxes.get(key)) + if (localX > box.min[0] && localX < box.max[0] && + localY > box.min[1] && localY < box.max[1] && + localZ > box.min[2] && localZ < box.max[2]) return true; + } + return false; + }; + return (pos, box, normal, faceVertices) => { + const normalAxis = normal.findIndex((value) => Math.abs(value) === 1); + if (normalAxis < 0 || normal.some((value, axis) => axis !== normalAxis && value !== 0)) + return OPEN; + const tangents = [0, 1, 2].filter((axis) => axis !== normalAxis); + return faceVertices.map((vertex) => { + const point = vertex.map((value, axis) => + pos[axis] + box.min[axis] + value * (box.max[axis] - box.min[axis]) + + normal[axis] * EPSILON, + ); + const sample = (first, second) => { + const candidate = [...point]; + for (let index = 0; index < 2; index++) { + const axis = tangents[index]; + candidate[axis] += (vertex[axis] < 0.5 ? -1 : 1) * + (index === 0 ? first : second) * EPSILON; + } + return occupied(candidate) ? 1 : 0; + }; + const sideA = sample(1, -1), sideB = sample(-1, 1); + // Both sides enclose the corner even when its diagonal cell is empty. + const level = sideA && sideB ? 0 : 3 - sideA - sideB - sample(1, 1); + return LEVELS[level]; + }); + }; +} + +/** Mesh sections whose corner lighting can depend on an edited block. */ +export function affectedSectionKeys(pos, renderBoxes = [unitBox]) { + const min = [...pos], max = [...pos]; + for (const box of renderBoxes ?? [unitBox]) + for (let axis = 0; axis < 3; axis++) { + min[axis] = Math.min(min[axis], pos[axis] + Math.floor(box.min[axis])); + max[axis] = Math.max(max[axis], pos[axis] + Math.ceil(box.max[axis]) - 1); + } + const lower = min.map((value) => Math.floor((value - 1) / 16)); + const upper = max.map((value) => Math.floor((value + 1) / 16)); + const sections = []; + for (let x = lower[0]; x <= upper[0]; x++) + for (let y = lower[1]; y <= upper[1]; y++) + for (let z = lower[2]; z <= upper[2]; z++) sections.push(`${x},${y},${z}`); + return sections; +} diff --git a/client/app.js b/client/app.js index cc9ffde..4091871 100644 --- a/client/app.js +++ b/client/app.js @@ -1,4 +1,27 @@ -import { Renderer } from "./renderer.js"; +import { EditDiagnostics } from "./edit-diagnostics.js"; +import { DynamicsDiagnostics, drawDynamicsChart } from "./dynamics-diagnostics.js"; +import { normalizeViewDistance, DEFAULT_VIEW_DISTANCE, MAX_VIEW_DISTANCE, viewDistanceProfile } from "./view-distance.js"; +import { Renderer } from "./renderer.js?v=large-world-1"; +import { SectionVoxelMap } from "./section-voxel-map.js"; +import { applySectionView, applySectionBatch, sectionInBounds } from "./section-stream.js"; +import { SectionBlockMap } from "./section-block-map.js"; +import { PointerLockController } from "./pointer-lock.js"; +import { + loadPhysics, + samplePhysicsWorld, + PhysicsClock, + LocalPrediction, +} from "./player-physics.js?v=movement-1"; +import { + updateRemotePlayer, + smoothRemotePlayer, +} from "./player-interpolation.js"; +import { + getViewBounds, + mergeChunkUpdate, + mergeSnapshot, + positionInView, +} from "./world-view.js"; import { clamp, key, @@ -12,9 +35,9 @@ const $ = (id) => document.getElementById(id), const state = { ws: null, id: null, - world: "lobby", + world: new URLSearchParams(location.search).get("world") || "lobby", revision: null, - blocks: new Map(), + blocks: new SectionBlockMap(), materials: new Map(), registry: [], players: new Map(), @@ -24,6 +47,12 @@ const state = { target: [0, 2, 8], yaw: 0, pitch: -0.14, + eyeHeight: 1.62, + eyeTarget: 1.62, + physicsStatus: "Загрузка", + physicsPose: "standing", + playerFlying: false, + playerSprinting: false, connected: false, manifest: null, retry: 0, @@ -39,8 +68,17 @@ const state = { packFiles: 0, packBytes: 0, packCached: 0, + texturePack: "", + textureCount: 0, + textureSize: 0, resync: false, viewCenter: null, + viewBounds: null, + fullSnapshots: 0, + chunkUpdates: 0, + sectionStream: false, viewGeneration: 0, loadedSections: new Set(), totalSections: 0, sectionBatches: 0, + streamApplyMs: 0, networkBytes: 0, waitingTerrain: false, + viewDistance: DEFAULT_VIEW_DISTANCE, viewDistanceSupported: false, metrics: null, name: localStorage.getItem("shacraft:name") || @@ -73,7 +111,13 @@ function bounceFeedback() { source.start(); } } -let pointerFallback = false; +let pointerFallback = false, + physics = null, + prediction = null, + motionSupported = false, + flyToggle = false, + lastSpace = -Infinity; +const physicsClock = new PhysicsClock(); let renderer, wsGeneration = 0, retryTimer, @@ -89,9 +133,37 @@ let renderer, held = new Set(), drag = null, lastAction = 0, - lastInput = 0, lastSelection = "", packageCache = null; +const frameSamples = []; +const dynamics = new DynamicsDiagnostics(); +const editDiagnostics = new EditDiagnostics(); +let lastDynamicsStatus = "idle"; +const pointerLock = new PointerLockController(canvas, { + onChange(locked) { + document.body.classList.toggle("locked", locked); + canvas.dataset.pointerLock = locked ? "locked" : "idle"; + if (locked) { + if (drag && canvas.hasPointerCapture(drag.pointerId)) canvas.releasePointerCapture(drag.pointerId); + drag = null; + pointerFallback = false; + delete canvas.dataset.pointerLockError; + updateMouseHint(); + } else controlsZero(); + }, + onError(error) { + canvas.dataset.pointerLock = "error"; + canvas.dataset.pointerLockError = `${error.name}: ${error.message}`; + canvas.dataset.pointerLockFocused = String(document.hasFocus()); + toast("Браузер не смог захватить мышь. Попробуйте ещё раз или включите перетаскивание в меню.", true); + }, +}); +function updateMouseHint() { + $("mouse-mode").textContent = `Мышь: ${pointerFallback ? "перетаскивание" : "захват"}`; + $("play-hint").textContent = pointerFallback + ? "Удерживайте кнопку для обзора · щелчок — убрать / поставить блок" + : "Нажмите на мир для захвата мыши · Esc — освободить"; +} const niceName = (s) => (s || "") .replace(/^minecraft:/, "") @@ -107,8 +179,10 @@ const bytes = (n) => : `${n} Б` : "—"; const isUIOpen = () => - ["menu", "worlds", "library", "diagnostics"].some((id) => !$(id).hidden) || + ["menu", "worlds", "library"].some((id) => !$(id).hidden) || !$("chat-form").hidden; +const isUIFocused = () => isUIOpen() || + (!$("diagnostics").hidden && $("diagnostics").contains(document.activeElement)); function toast(message, error = false, duration = 4300) { $("toast").textContent = message; $("toast").classList.toggle("error", error); @@ -136,7 +210,11 @@ function send(message) { } function controlsZero() { held.clear(); - if (state.connected) + flyToggle = false; + if (state.connected && motionSupported) { + send({ type: "input_reset" }); + physicsClock.reset(); + } else if (state.connected) send({ type: "input", seq: ++state.seq, @@ -145,18 +223,103 @@ function controlsZero() { forward: 0, strafe: 0, jump: false, + sprint: false, + sneak: false, }); } +function movementInput(consumeToggle = false) { + const automatic=dynamics.controls(consumeToggle,state.playerFlying,performance.now(),Boolean(prediction?.body?.horizontal_collision)); + if(automatic && state.connected && !document.hidden){state.yaw=automatic.yaw;state.pitch=automatic.pitch;return automatic;} + const enabled = !isUIFocused() && !document.hidden, + sneak = enabled && (held.has("ShiftLeft") || held.has("ShiftRight")), + input = { + yaw: Math.fround(state.yaw), + pitch: Math.fround(state.pitch), + forward: enabled + ? Number(held.has("KeyW") || held.has("ArrowUp")) - + Number(held.has("KeyS") || held.has("ArrowDown")) + : 0, + strafe: enabled + ? Number(held.has("KeyD") || held.has("ArrowRight")) - + Number(held.has("KeyA") || held.has("ArrowLeft")) + : 0, + jump: enabled && held.has("Space"), + sprint: + enabled && + !sneak && + (held.has("ControlLeft") || held.has("ControlRight")), + sneak, + fly_toggle: enabled && flyToggle, + }; + if (consumeToggle) flyToggle = false; + return input; +} +function disablePrediction(error) { + console.error("Shacraft prediction disabled", error); + prediction = null; + physics = null; + state.physicsStatus = "Только сервер"; + toast("Локальная физика недоступна. Движение рассчитывает сервер.", true); +} +function receiveMotion(motion, reset = false) { + if (!motion || !prediction) return; + try { + const previous = prediction.authority; + if (prediction.receive(motion, reset)) { + if ( + !reset && + previous && + previous.velocity[1] <= 0 && + motion.body.velocity[1] > 0.4 + ) { + const under = previous.position.map((value, axis) => + Math.floor(value - (axis === 1 ? 0.1 : 0)), + ); + if ( + state.materials.get(state.blocks.get(key(under)))?.effect === "bounce" + ) + bounceFeedback(); + } + motionSupported = true; + state.ack = motion.ack; + state.tick = motion.tick; + state.target = [...prediction.body.position]; + state.physicsPose = prediction.body.pose; + state.playerFlying = Boolean(prediction.body.flying); + state.playerSprinting = Boolean(prediction.body.sprinting); + if (reset) { + state.position = [...prediction.body.position]; + physicsClock.reset(); + } + } + } catch (error) { + disablePrediction(error); + } +} +function inputStep() { + const input = movementInput(true), + seq = state.seq + 1; + if (!send({ type: "input", seq, ...input })) return; + state.seq = seq; + if (motionSupported && prediction) { + try { + prediction.push(seq, input); + } catch (error) { + disablePrediction(error); + } + } +} function closePanels() { - for (const id of ["menu", "worlds", "library", "diagnostics"]) + for (const id of ["menu", "worlds", "library"]) $(id).hidden = true; } function panel(id) { const wasOpen = !$(id).hidden; - closePanels(); - document.exitPointerLock?.(); + if (id !== "diagnostics") closePanels(); + pointerLock.release(); controlsZero(); $(id).hidden = wasOpen; + if (wasOpen) canvas.focus(); if (!wasOpen && id === "library") { loadCatalog(true); $("catalog-search").focus(); @@ -165,7 +328,7 @@ function panel(id) { if (!wasOpen && id === "diagnostics") fetchMetrics(); } function release() { - document.exitPointerLock?.(); + pointerLock.release(); controlsZero(); } function acquire() { @@ -176,22 +339,12 @@ function acquire() { toast("Соединение с сервером ещё не установлено."); return; } - try { - const p = canvas.requestPointerLock?.(); - p?.catch?.(() => { - pointerFallback = true; - toast( - "Захват мыши недоступен: перетаскивайте для обзора, щёлкните для правки.", - ); - }); - } catch { - pointerFallback = true; - toast("Для обзора удерживайте кнопку мыши и двигайте курсор."); - } canvas.focus(); + if (!pointerFallback) pointerLock.request(); } -function addMaterials(items = []) { - let changed = false; +function addMaterials(items = [], remesh = true) { + if (items.length) prediction?.invalidateWorld(); + const added = new Set(); for (const item of items) { if (!item || !Number.isInteger(item.id)) continue; const prev = state.materials.get(item.id), @@ -214,29 +367,68 @@ function addMaterials(items = []) { if (style?.color) mat.color = style.color; mat.effect = style?.effect; state.materials.set(mat.id, mat); - if (!prev) changed = true; + if (!prev) added.add(item.id); } - return changed; + if (added.size && renderer && remesh) + renderer.change( + [...state.blocks] + .filter(([, id]) => added.has(id)) + .map(([position, block]) => ({ + pos: position.split(",").map(Number), + block, + })), + ); + return added.size > 0; } function snapshot(m) { + editDiagnostics.reset(); + const newWorld = + m.type === "welcome" || + (m.world && m.world !== state.world) || + state.revision === null; + if (!newWorld && m.revision < state.revision) return; state.id = m.id ?? state.id; state.world = m.world || state.world; state.registry = m.registry || state.registry; - addMaterials(m.materials); - state.blocks = new Map(); - for (const b of m.blocks || []) - if (b.block) state.blocks.set(key(b.pos), b.block); + addMaterials(m.materials, !newWorld); + state.sectionStream = m.features?.includes("chunk_stream_v2") || false; + state.viewDistanceSupported = m.features?.includes("view_distance_v1") || false; + acceptViewDistance(m); + if (newWorld) state.blocks = state.sectionStream ? new SectionVoxelMap() : new SectionBlockMap(); + if (state.sectionStream) { + state.viewGeneration = m.generation; + state.loadedSections = new Set(); state.blocks.readySections = state.loadedSections; + state.totalSections = m.total_sections || 0; + } + const changes = state.sectionStream && !newWorld ? [] : mergeSnapshot(state.blocks, m.blocks || []); state.revision = m.revision; state.resync = false; state.viewCenter = m.view_center || m.spawn?.map((v) => Math.floor(v / 16) * 16) || null; - if (m.spawn) { + state.viewBounds = getViewBounds(m); + renderer.setLightBounds(state.viewBounds); + if (state.sectionStream && !newWorld) { + const unload=[...state.blocks.loadedSectionKeys()].filter(id=>!sectionInBounds(id.split(",").map(Number),state.viewBounds)).map(id=>id.split(",").map(Number)); + for(const pos of unload)state.blocks.deleteSection(pos.join(",")); + renderer.unloadSections(unload); + } + state.fullSnapshots++; + if (newWorld && m.spawn) { state.position = [...m.spawn]; state.target = [...m.spawn]; } - if (m.players) updatePlayers(m.players, true); + if (newWorld) { + prediction?.reset(); + motionSupported = false; + physicsClock.reset(); + flyToggle = false; + } + if (m.players) updatePlayers(m.players, newWorld); + prediction?.invalidateWorld(); + receiveMotion(m.motion, newWorld); if (m.entities) state.entities = m.entities; - renderer.replace(state.blocks, state.materials); + if (newWorld) renderer.replace(state.blocks, state.materials); + else renderer.change(changes); $("world-button").textContent = `${state.world} ▾`; document.title = `Shacraft · ${state.world}`; if (m.type === "welcome") { @@ -254,6 +446,11 @@ function updatePlayers(players, instant = false) { for (const p of players) { present.add(p.id); if (p.id === state.id) { + if (prediction && motionSupported && !instant) continue; + state.eyeTarget = p.eye_height ?? 1.62; + state.physicsPose = p.pose || "standing"; + state.playerFlying = Boolean(p.flying); + state.playerSprinting = Boolean(p.sprinting); if (p.position) { const under = [ Math.floor(state.target[0]), @@ -277,42 +474,81 @@ function updatePlayers(players, instant = false) { continue; } const old = state.players.get(p.id); - state.players.set(p.id, { - ...p, - position: old && !instant ? old.position : [...p.position], - target: [...p.position], - }); + state.players.set(p.id, updateRemotePlayer(old, p, instant)); } for (const id of state.players.keys()) if (!present.has(id)) state.players.delete(id); } function inView(pos) { - const center = state.viewCenter; - return ( - !center || - pos.every( - (v, i) => v >= center[i] - (i === 1 ? 8 : 32) && v <= center[i] + 31, - ) - ); + return positionInView(pos, state.viewBounds); +} +function requestResync() { + if (state.resync) return; + state.resync = true; + send({ type: "resync" }); + toast("Сверяем изменения с сервером…"); +} +function chunkUpdate(m) { + if (state.revision === null || state.resync) return; + const result = mergeChunkUpdate(state, m, { includeUnloadedChanges: false }); + if (result.status === "resync") { + requestResync(); + return; + } + if (result.status !== "applied") return; + renderer.setLightBounds(state.viewBounds); + addMaterials(m.materials, !renderer.terrain); + renderer.change(result.changes, [...m.sections.map(section => section.section), ...m.unload], m.sections); + renderer.unloadSections(m.unload); + state.chunkUpdates++; + prediction?.invalidateWorld(); + loadMissingMaterials(); +} +function sectionView(m) { + const result=applySectionView(state,m); + if(result==="resync")return requestResync(); + if(result==="ignored")return; + renderer.setLightBounds(state.viewBounds); + renderer.unloadSections(result.unload); + acceptViewDistance(m); + state.chunkUpdates++; + prediction?.invalidateWorld(); +} +function sectionBatch(m) { + const start=performance.now(); + const result=applySectionBatch(state,m); + if(result.status==="resync")return requestResync(); + if(result.status!=="applied")return; + addMaterials(m.materials,!renderer.terrain); + renderer.change([],result.sections.map(s=>s.section),result.sections); + renderer.terrain?.update({columns:result.columns}); + state.totalSections=m.total_sections || state.totalSections; + state.sectionBatches++; + prediction?.invalidateWorld(); + state.streamApplyMs=performance.now()-start; + dynamics.event("sections",state.streamApplyMs,{sections:result.sections.length,loaded:state.loadedSections.size}); + loadMissingMaterials(); } function blockUpdate(m) { + if (m.world && m.world !== state.world) return; if (state.revision === null || state.resync) return; if (m.revision <= state.revision) return; if (m.revision !== state.revision + 1) { - state.resync = true; - send({ type: "resync" }); - toast("Сверяем изменения с сервером…"); + requestResync(); return; } const changes = (m.changes || []).filter((change) => inView(change.pos)); const needed = new Set(changes.map((change) => change.block)); - addMaterials((m.materials || []).filter((mat) => needed.has(mat.id))); + addMaterials((m.materials || []).filter((mat) => needed.has(mat.id)), !renderer.terrain); for (const change of changes) { if (change.block) state.blocks.set(key(change.pos), change.block); else state.blocks.delete(key(change.pos)); } state.revision = m.revision; + prediction?.invalidateWorld(); + editDiagnostics.confirmed(changes); renderer.change(changes); + if(m.columns?.length)renderer.terrain?.update({columns:m.columns.map(item=>({column:item.column,heights:new Int16Array(item.heights)}))}); loadMissingMaterials(); } function onMessage(m) { @@ -324,6 +560,8 @@ function onMessage(m) { case "state": state.tick = m.tick ?? state.tick; state.ack = m.ack ?? state.ack; + state.waitingTerrain = Boolean(m.motion?.waiting_terrain); + receiveMotion(m.motion); if (m.players) updatePlayers(m.players); if (m.entities) state.entities = m.entities; if (m.match) showMatch(m.match); @@ -331,6 +569,11 @@ function onMessage(m) { case "blocks": blockUpdate(m); break; + case "view": sectionView(m); break; + case "sections": sectionBatch(m); break; + case "chunks": + chunkUpdate(m); + break; case "chat": chat(m.name, m.text); break; @@ -370,6 +613,14 @@ async function getJSON(url) { throw Error(`${url.split("?")[0]}: HTTP ${response.status}`); return response.json(); } +function updatePackageStatus() { + const progress = state.packFiles + ? `${state.packFiles} файлов проверено · ${bytes(state.packBytes)} · из кэша ${state.packCached}` + : "Сервер не требует дополнительных файлов."; + $("package-status").textContent = state.texturePack + ? `${progress} · ${state.texturePack}: ${state.textureCount} текстур ${state.textureSize}×${state.textureSize}` + : progress; +} async function verifyPackages(manifest, generation) { if (!crypto.subtle) throw Error( @@ -378,6 +629,10 @@ async function verifyPackages(manifest, generation) { state.packFiles = 0; state.packBytes = 0; state.packCached = 0; + state.texturePack = ""; + state.textureCount = 0; + state.textureSize = 0; + renderer.clearTexturePack(); packageStyles.clear(); try { packageCache = await caches.open("shacraft-packages-v1"); @@ -433,28 +688,38 @@ async function verifyPackages(manifest, generation) { await packageCache?.delete(cacheURL); throw Error(`Хеш ресурса не совпадает: ${pack.id}/${file.path}`); } + if (generation !== wsGeneration) return; if (!cached && packageCache) try { await packageCache.put(cacheURL, new Response(blob)); } catch { /* Quota failures do not weaken integrity verification. */ } + if (generation !== wsGeneration) return; state.packFiles++; state.packBytes += blob.size; state.packCached += cached ? 1 : 0; verifiedFiles.set(file.path, blob); - $("package-status").textContent = - `${state.packFiles} файлов проверено · ${bytes(state.packBytes)} · из кэша ${state.packCached}`; + updatePackageStatus(); connection(`Пакеты ${state.packFiles}`); } // Resolve declared references only after every resource passed integrity checks. - // The supported client hook is declarative `effect: bounce`, with no package JS. + // Texture packs and the bounce hook are declarative, with no package JS. for (const file of resources.filter( (f) => f.role === "client-style" || f.path?.endsWith("style.json"), )) { const style = JSON.parse(await verifiedFiles.get(file.path).text()); + if (generation !== wsGeneration) return; if (style.schema !== 1) throw Error(`Неизвестная схема стиля пакета ${pack.id}`); + if (style.texture_pack) { + await renderer.setTexturePack(style.texture_pack, verifiedFiles); + if (generation !== wsGeneration) return; + state.texturePack = style.texture_pack.name; + state.textureCount = style.texture_pack.textures.length; + state.textureSize = style.texture_pack.pixel_size; + updatePackageStatus(); + } if (typeof style.block === "string") packageStyles.set(style.block, style); const texture = verifiedFiles.get(style.texture); @@ -473,9 +738,7 @@ async function verifyPackages(manifest, generation) { } } } - if (!state.packFiles) - $("package-status").textContent = - "Сервер не требует дополнительных файлов."; + updatePackageStatus(); if (packageCache) { const keys = await packageCache.keys(); if (keys.length > 512) @@ -494,6 +757,9 @@ async function connect() { state.id = null; state.players.clear(); state.seq = 0; + prediction?.reset(); + motionSupported = false; + physicsClock.reset(); connection("Подключение"); controlsZero(); try { @@ -513,15 +779,23 @@ async function connect() { send({ type: "join", protocol: 1, + features: [ + "chunk_stream_v2", "chunk_stream_v1", "view_buffer_v1", "full_height_v1", + ...(physics ? ["movement_prediction_v1"] : []), + ], name: state.name, world: state.world, + view_distance: normalizeViewDistance($("view-distance").value), manifest_hash: manifest.hash, }); }); ws.addEventListener("message", (event) => { if (generation !== wsGeneration) return; try { - onMessage(JSON.parse(event.data)); + const start=performance.now(),message=JSON.parse(event.data); + state.networkBytes+=event.data.length; + onMessage(message); + dynamics.event("network",performance.now()-start,{typeName:message.type,bytes:event.data.length}); } catch (error) { console.error("Shacraft protocol error", error); toast(`Ошибка данных сервера: ${error.message}`, true); @@ -577,7 +851,7 @@ async function loadWorlds() { const title = document.createElement("strong"); title.textContent = world.name; const subtitle = document.createElement("small"); - subtitle.textContent = `Ревизия ${world.revision}${world.template ? ` · экземпляр ${world.template}` : ""}`; + subtitle.textContent = world.terrain ? `Процедурный мир · seed ${world.terrain.seed} · Y −64…319` : `Ревизия ${world.revision}${world.template ? ` · экземпляр ${world.template}` : ""}`; b.append(title, subtitle); b.onclick = () => { if (!state.connected) { @@ -600,7 +874,7 @@ async function loadMissingMaterials() { missingPending = true; try { while (state.connected) { - const missing = [...new Set(state.blocks.values())] + const missing = [...new Set(state.blocks.materialIds ? state.blocks.materialIds() : state.blocks.values())] .filter((id) => !state.materials.has(id)) .slice(0, 128); if (!missing.length) break; @@ -609,15 +883,6 @@ async function loadMissingMaterials() { ); const items = data.items || data; if (!addMaterials(items)) break; - const loaded = new Set(items.map((material) => material.id)); - renderer.change( - [...state.blocks] - .filter(([, id]) => loaded.has(id)) - .map(([position, block]) => ({ - pos: position.split(",").map(Number), - block, - })), - ); await new Promise((resolve) => setTimeout(resolve, 0)); } seedHotbar(); @@ -772,31 +1037,27 @@ function showMatch(m) { `${phases[m.phase] || m.phase}${m.remaining !== undefined ? ` · ${Math.ceil(m.remaining)} с` : ""}${winner}`; } function action(kind) { - if (!state.connected || isUIOpen()) return; + if (!state.connected || isUIFocused()) return; const hit = state.selection; if (!hit) return; const now = performance.now(); if (now - lastAction < 130) return; lastAction = now; - send({ - type: "input", - seq: ++state.seq, - yaw: state.yaw, - pitch: state.pitch, - forward: (held.has("KeyW") ? 1 : 0) - (held.has("KeyS") ? 1 : 0), - strafe: (held.has("KeyD") ? 1 : 0) - (held.has("KeyA") ? 1 : 0), - jump: held.has("Space"), - }); - if (kind === "break") send({ type: "break", pos: hit.pos }); + if (motionSupported) + send({ type: "look", yaw: state.yaw, pitch: state.pitch }); + if (kind === "break") { + if (send({ type: "break", pos: hit.pos })) editDiagnostics.request(hit.pos, 0, now); + } else if (kind === "place") { const mat = state.materials.get(state.hotbar[state.slot]); if (!mat?.id) return; - send({ + const pos = hit.pos.map((v, i) => v + hit.normal[i]); + if (send({ type: "place", - pos: hit.pos.map((v, i) => v + hit.normal[i]), + pos, block: mat.id, state: mat.state, - }); + })) editDiagnostics.request(pos, mat.id, now); } else if (kind === "pick") { state.hotbar[state.slot] = hit.block; renderHotbar(); @@ -810,7 +1071,51 @@ function openChat() { } $("library-button").onclick = () => panel("library"); $("diagnostics-button").onclick = () => panel("diagnostics"); +$("diagnostics").addEventListener("pointerdown", () => { pointerLock.release(); controlsZero(); }); $("menu-button").onclick = () => panel("menu"); +try {$("view-distance").value=String(normalizeViewDistance(localStorage.getItem("shacraft:view-distance")));} catch {} +function updateViewDistanceUI() { + const selected=normalizeViewDistance($("view-distance").value); + $("view-distance-apply").disabled=!state.connected||!state.viewDistanceSupported||selected===state.viewDistance; + $("view-distance-status").textContent = state.viewDistanceSupported + ? `Сейчас: ${state.viewDistance} ${state.viewDistance<5?"чанка":"чанков"} · загружено ${state.loadedSections.size} / ${state.totalSections} секций` + : "Настройка станет доступна после подключения к обновлённому серверу."; + $("view-distance-info").textContent = `${viewDistanceProfile(selected).radius} блоков вокруг игрока. ${selected>=6?"Высокая нагрузка на память и видеокарту; подгрузка займёт больше времени.":"Большая дальность увеличивает расход памяти. По умолчанию — 3 чанка."}`; +} +function acceptViewDistance(message) { + if(Number.isInteger(message.view_distance)&&message.view_distance>=2&&message.view_distance<=MAX_VIEW_DISTANCE) { + state.viewDistance=message.view_distance; + if(renderer)renderer.viewDistance=state.viewDistance; + } + updateViewDistanceUI(); +} +$("view-distance").onchange=updateViewDistanceUI; +$("view-distance-apply").onclick=()=>{ + const chunks=normalizeViewDistance($("view-distance").value); + if(!state.connected||!state.viewDistanceSupported)return; + send({type:"view_distance",chunks}); + try {localStorage.setItem("shacraft:view-distance",String(chunks));} catch {} + $("view-distance-status").textContent="Меняем дальность и подгружаем чанки…"; +}; +updateViewDistanceUI(); +$("mouse-mode").onclick = () => { + pointerFallback = !pointerFallback; + pointerLock.release(); + updateMouseHint(); +}; +updateMouseHint(); +function setTimeOfDay(timeOfDay) { + const night = timeOfDay !== "day"; + renderer.daylight = night ? 0 : 1; + renderer.lightingName = night ? "Moonlight" : "Daylight"; + $("time-button").textContent = `Освещение: ${night ? "ночь" : "день"}`; +} +$("time-button").onclick = () => { + if (!renderer) return; + const timeOfDay = renderer.daylight === 0 ? "day" : "night"; + setTimeOfDay(timeOfDay); + localStorage.setItem("shacraft:time-of-day", timeOfDay); +}; $("world-button").onclick = () => panel("worlds"); for (const b of document.querySelectorAll("[data-close]")) b.onclick = () => ($(b.dataset.close).hidden = true); @@ -853,7 +1158,7 @@ $("chat-form").onsubmit = (e) => { canvas.focus(); }; window.addEventListener("keydown", (e) => { - const editing = /INPUT|TEXTAREA/.test(document.activeElement?.tagName); + const editing = /INPUT|TEXTAREA|SELECT/.test(document.activeElement?.tagName); if (e.code === "Escape") { if (!$("chat-form").hidden) { $("chat-form").hidden = true; @@ -865,7 +1170,8 @@ window.addEventListener("keydown", (e) => { controlsZero(); return; } - if (editing) return; + if (e.code === "F3") { e.preventDefault(); if (!e.repeat) panel("diagnostics"); return; } + if (editing || (!$("diagnostics").hidden && $("diagnostics").contains(document.activeElement))) return; if ( [ "Space", @@ -879,6 +1185,10 @@ window.addEventListener("keydown", (e) => { "ArrowRight", "Tab", "F3", + "ControlLeft", + "ControlRight", + "ShiftLeft", + "ShiftRight", ].includes(e.code) ) e.preventDefault(); @@ -887,10 +1197,6 @@ window.addEventListener("keydown", (e) => { panel("library"); return; } - if (e.code === "F3") { - panel("diagnostics"); - return; - } if (e.code === "KeyT" || e.code === "Enter") { openChat(); return; @@ -900,7 +1206,17 @@ window.addEventListener("keydown", (e) => { renderHotbar(); return; } - if (!isUIOpen()) held.add(e.code); + if (!isUIFocused()) { + if (e.code === "Space") { + const now = performance.now(); + if (now - lastSpace < 300) { + flyToggle = true; + lastSpace = -Infinity; + } else lastSpace = now; + } + if (e.code === "KeyF") flyToggle = true; + held.add(e.code); + } }); window.addEventListener("keyup", (e) => held.delete(e.code)); window.addEventListener("blur", () => { @@ -908,12 +1224,9 @@ window.addEventListener("blur", () => { controlsZero(); }); document.addEventListener("visibilitychange", () => { - if (document.hidden) controlsZero(); -}); -document.addEventListener("pointerlockchange", () => { - const locked = document.pointerLockElement === canvas; - document.body.classList.toggle("locked", locked); - if (!locked) controlsZero(); + if (document.hidden) {dynamics.stop(performance.now(),'tab-hidden');controlsZero();} + physicsClock.reset(); + lastFrame = performance.now(); }); function look(dx, dy) { const sensitivity = Number($("sensitivity").value); @@ -932,13 +1245,16 @@ canvas.addEventListener("pointerdown", (e) => { unlockAudio(); if (isUIOpen()) { closePanels(); + canvas.focus(); return; } + canvas.focus(); if (document.pointerLockElement === canvas) { action(e.button === 2 ? "place" : e.button === 1 ? "pick" : "break"); return; } drag = { + pointerId: e.pointerId, x: e.clientX, y: e.clientY, startX: e.clientX, @@ -955,7 +1271,6 @@ canvas.addEventListener("pointermove", (e) => { if (Math.hypot(e.clientX - drag.startX, e.clientY - drag.startY) > 3) drag.moved = true; if (drag.moved) { - pointerFallback = true; look(dx, dy); } drag.x = e.clientX; @@ -965,6 +1280,7 @@ canvas.addEventListener("pointerup", (e) => { if (!drag) return; const d = drag; drag = null; + if (canvas.hasPointerCapture(e.pointerId)) canvas.releasePointerCapture(e.pointerId); if (!d.moved) { if (d.button === 2) action("place"); else if (d.button === 1) action("pick"); @@ -985,10 +1301,12 @@ canvas.addEventListener( async function fetchMetrics() { try { state.metrics = await getJSON("/api/metrics"); + dynamics.serverSample({tickMs:state.metrics.tick_ms,stream:state.metrics.stream,terrain:state.metrics.terrain,rss:state.metrics.rss_bytes}); } catch {} updateDiagnostics(); } function updateDiagnostics() { + updateViewDistanceUI(); const m = state.metrics || {}, storage = m.storage || m.store || m, mem = m.memory || {}, @@ -1001,11 +1319,47 @@ function updateDiagnostics() { ["Сущности", String(state.entities.length)], ["Игроки", String(state.players.size + (state.id ? 1 : 0))], ["WebGL", renderer?.lost ? "Контекст потерян" : "WebGL2"], + ["Захват мыши", pointerFallback ? "Перетаскивание" : ({ idle: "Нажмите на мир", requesting: "Запрошен", locked: "Активен", error: "Ошибка браузера", unsupported: "Не поддерживается" })[pointerLock.status]], + ["Ошибка мыши", canvas.dataset.pointerLockError || "—"], + ["Освещение", renderer?.lightingName || "—"], + ["Свет блоков / неба", `${renderer?.canvas.dataset.blockLight || 0} / ${renderer?.canvas.dataset.skyLight || 15}`], + ["Источники света", String(renderer?.blockLightField?.sourceCount || 0)], + ["Расчёт света", renderer?.blockLighting.status === "ready" ? "Готов" : "Обновляется"], + ["Тени", renderer?.shadowsEnabled && renderer?.shadowReady ? `Мягкие · ${renderer.shadowSize}²` : "Недоступны"], ["Кадры / с", String(state.fps)], + ["Кадр p95 / максимум", `${state.frameP95 || 0} / ${state.frameMax || 0} мс`], ["Треугольники", renderer?.triangles.toLocaleString("ru-RU") || "0"], ["Ожидают построения", String(renderer?.dirty.size || 0)], + ["Геометрия", renderer?.terrain?.meshWorker ? "Worker · локальный свет" : renderer?.terrain ? "Worker" : "Основной поток"], + ["Ближайшие секции", `${renderer?.canvas.dataset.nearMeshes || 0} построено / ${renderer?.canvas.dataset.nearLoaded || 0} загружено`], + ["Первые чанки", renderer?.canvas.dataset.firstTerrainMs ? `${renderer.canvas.dataset.firstTerrainMs} мс` : "Загрузка…"], + ["Свет секции", `${renderer?.canvas.dataset.localLightMs || 0} мс · ${renderer?.canvas.dataset.localLightCells || 0} ячеек`], + ["Подготовка данных", `${renderer?.canvas.dataset.terrainPrepareMs || 0} мс`], + ["Построение секции", `${renderer?.canvas.dataset.meshBuildMs || 0} мс`], + ["Правка: подготовка", `${renderer?.canvas.dataset.editPrepareMs || 0} мс`], + ["Правка: ответ сервера", editDiagnostics.last ? `${editDiagnostics.last.acknowledgementMs.toFixed(1)} мс` : "—"], + ["Правка: обновление геометрии", editDiagnostics.last ? `${editDiagnostics.last.geometryMs.toFixed(1)} мс` : "—"], + ["Правка: всего", editDiagnostics.last ? `${editDiagnostics.last.totalMs.toFixed(1)} мс` : "—"], + ["Загрузка геометрии", `${renderer?.canvas.dataset.meshUploadMs || 0} мс`], + ["Меши секций", String(renderer?.sections.size || 0)], + ["Перестроения мешей", String(renderer?.meshRebuilds || 0)], + ["Сбросы геометрии", String(renderer?.meshResets || 0)], + ["Полные снимки", String(state.fullSnapshots)], + ["Обновления чанков", String(state.chunkUpdates)], + ["Секции загружены", `${state.loadedSections.size} / ${state.totalSections}`], + ["Пакеты секций", String(state.sectionBatches)], + ["Применение чанков", `${state.streamApplyMs.toFixed(2)} мс`], + ["Массивы блоков", bytes(state.blocks.byteLength)], + ["Генерация сервера", `${m.terrain?.pending || 0} в очереди · ${(m.terrain?.last_generate_ms || 0).toFixed(2)} мс`], + ["Ожидание местности", state.waitingTerrain ? "Да" : "Нет"], ["Тик сервера", String(state.tick)], ["Подтверждён ввод", String(state.ack)], + ["Физика", state.physicsStatus], + ["Положение тела", state.physicsPose], + ["Полёт", state.playerFlying ? "Да" : "Нет"], + ["Бег", state.playerSprinting ? "Да" : "Нет"], + ["Ввод в пути", String(prediction?.pending.length || 0)], + ["Коррекция позиции", `${(prediction?.correction || 0).toFixed(3)} м`], ["Ping", state.ping ? `${state.ping} мс` : "—"], ["Координаты", state.position.map((n) => n.toFixed(1)).join(", ")], ["RAM процесса", bytes(rss)], @@ -1014,6 +1368,12 @@ function updateDiagnostics() { bytes(storage.cache_payload_bytes ?? storage.cache?.payload_bytes), ], ["Пакеты", `${state.packFiles} файлов`], + [ + "Текстурпак", + state.texturePack + ? `${state.texturePack} · ${state.textureCount} текстур ${state.textureSize}×${state.textureSize}` + : "По умолчанию", + ], ]; $("debug-values").replaceChildren(); for (const [label, value] of rows) { @@ -1024,12 +1384,45 @@ function updateDiagnostics() { dd.dataset.metric = label; $("debug-values").append(dt, dd); } + canvas.dataset.editTimings = JSON.stringify(editDiagnostics.last); + canvas.dataset.selection = state.selection ? JSON.stringify({pos:state.selection.pos,normal:state.selection.normal,block:state.selection.block}) : ""; canvas.dataset.world = state.world; canvas.dataset.revision = String(state.revision ?? ""); canvas.dataset.blocks = String(state.blocks.size); canvas.dataset.entities = String(state.entities.length); + canvas.dataset.viewDistance = String(state.viewDistance); + canvas.dataset.viewMin = state.viewBounds?.min.join(",") || ""; + canvas.dataset.viewMax = state.viewBounds?.max.join(",") || ""; + canvas.dataset.fullHeight = String(state.viewBounds?.fullHeight === true); canvas.dataset.webgl = renderer?.lost ? "lost" : "ready"; canvas.dataset.connected = String(state.connected); + canvas.dataset.texturePack = state.texturePack; + canvas.dataset.textureCount = String(state.textureCount); + canvas.dataset.textureSize = String(state.textureSize); + canvas.dataset.fullSnapshots = String(state.fullSnapshots); + canvas.dataset.chunkUpdates = String(state.chunkUpdates); + canvas.dataset.loadedSections = String(state.loadedSections.size); + canvas.dataset.totalSections = String(state.totalSections); + canvas.dataset.sectionBatches = String(state.sectionBatches); + canvas.dataset.streamApplyMs = String(state.streamApplyMs); + canvas.dataset.voxelBytes = String(state.blocks.byteLength || 0); + canvas.dataset.waitingTerrain = String(state.waitingTerrain); + canvas.dataset.meshResets = String(renderer?.meshResets || 0); + canvas.dataset.meshRebuilds = String(renderer?.meshRebuilds || 0); + canvas.dataset.sectionMeshes = String(renderer?.sections.size || 0); + canvas.dataset.viewCenter = state.viewCenter?.join(",") || ""; + canvas.dataset.physics = + motionSupported && prediction + ? prediction.suspended + ? "waiting-world" + : "predicted" + : "server"; + canvas.dataset.predictionPending = String(prediction?.pending.length || 0); + canvas.dataset.predictionCorrection = String(prediction?.correction || 0); + canvas.dataset.playerPosition = state.position.join(","); + canvas.dataset.playerPose = state.physicsPose; + canvas.dataset.playerFlying = String(state.playerFlying); + canvas.dataset.playerSprinting = String(state.playerSprinting); } const playerLabels = new Map(); function updateLabels() { @@ -1049,7 +1442,7 @@ function updateLabels() { label.textContent = p.name; const at = renderer.project([ p.position[0], - p.position[1] + 1.95, + p.position[1] + (p.height ?? 1.8) + 0.15, p.position[2], ]); label.hidden = @@ -1065,17 +1458,48 @@ function updateLabels() { } } function frame(time) { - const dt = Math.min(0.05, (time - lastFrame) / 1000); + const frameStart=performance.now(); + const elapsed = Math.max(0, time - lastFrame), + dt = Math.min(0.05, elapsed / 1000); lastFrame = time; + frameSamples.push(elapsed); + if (frameSamples.length > 240) frameSamples.shift(); state.frames++; + if (state.connected && !document.hidden) + physicsClock.advance(elapsed, inputStep); + else physicsClock.reset(); const blend = 1 - Math.exp(-dt * 19); - for (let i = 0; i < 3; i++) - state.position[i] += (state.target[i] - state.position[i]) * blend; - for (const p of state.players.values()) + let local = null; + if (motionSupported && prediction) { + try { + local = prediction.sample(physicsClock.alpha, dt, movementInput()); + } catch (error) { + disablePrediction(error); + } + } + if (local) { + state.position = local.position; + state.target = [...local.body.position]; + state.physicsPose = local.body.pose; + state.playerFlying = Boolean(local.body.flying); + state.playerSprinting = Boolean(local.body.sprinting); + state.eyeHeight += (local.eyeHeight - state.eyeHeight) * blend; + state.physicsStatus = prediction.suspended + ? "Ожидаем чанки" + : "Rust / WebAssembly · 20 Гц"; + } else { for (let i = 0; i < 3; i++) - p.position[i] += (p.target[i] - p.position[i]) * blend; + state.position[i] += (state.target[i] - state.position[i]) * blend; + state.eyeHeight += (state.eyeTarget - state.eyeHeight) * blend; + if (state.connected) state.physicsStatus = "Только сервер"; + } + for (const p of state.players.values()) smoothRemotePlayer(p, blend); const camera = { - eye: [state.position[0], state.position[1] + 1.62, state.position[2]], + eye: [ + state.position[0], + state.position[1] + state.eyeHeight, + state.position[2], + ], yaw: state.yaw, pitch: state.pitch, }; @@ -1099,53 +1523,88 @@ function frame(time) { ) : ""; } + const drawStart=performance.now(); renderer.draw( camera, [...state.players.values()], state.entities, state.entityDefs, ); + const drawEnd=performance.now(); updateLabels(); - if (state.connected && time - lastInput >= 50) { - lastInput = time; - let forward = isUIOpen() - ? 0 - : (held.has("KeyW") || held.has("ArrowUp") ? 1 : 0) - - (held.has("KeyS") || held.has("ArrowDown") ? 1 : 0), - strafe = isUIOpen() - ? 0 - : (held.has("KeyD") || held.has("ArrowRight") ? 1 : 0) - - (held.has("KeyA") || held.has("ArrowLeft") ? 1 : 0); - send({ - type: "input", - seq: ++state.seq, - yaw: state.yaw, - pitch: state.pitch, - forward, - strafe, - jump: !isUIOpen() && held.has("Space"), - }); + const sample={frameMs:elapsed,physicsMs:drawStart-frameStart,drawMs:drawEnd-drawStart, + position:[...state.position],yaw:state.yaw,correction:prediction?.correction||0, + waiting:state.waitingTerrain || Boolean(prediction?.suspended),dirty:renderer.dirty.size, + viewChanges:state.chunkUpdates,batches:state.sectionBatches,meshResets:renderer.meshResets, + loadedSections:state.loadedSections.size,totalSections:state.totalSections,voxelBytes:state.blocks.byteLength||0}; + dynamics.ready(sample,state.connected&&!sample.waiting&&(!state.sectionStream||sample.loadedSections===sample.totalSections)&&!sample.dirty&&!renderer.meshUpload&&renderer.blockLighting.status==="ready"); + dynamics.frame(sample); + if(dynamics.status!==lastDynamicsStatus){ + lastDynamicsStatus=dynamics.status;canvas.dataset.dynamicsStatus=dynamics.status; + $("dynamics-status").textContent=({idle:"Готов к записи",warming:"Ожидаем готовность чанков и геометрии…",recording:"Запись идёт. Стоп — кнопка в диагностике или Esc для автомаршрута.",done:"Запись завершена",error:"Не удалось дождаться готовности местности"})[dynamics.status]; + if(dynamics.result){$("dynamics-result").hidden=false;$("dynamics-result").textContent=JSON.stringify(dynamics.result,null,2);canvas.dataset.dynamicsResult=JSON.stringify(dynamics.result);$("dynamics-export").disabled=false;} + if(dynamics.status==="done") {controlsZero();toast("Диагностика завершена. Результаты доступны в F3.");} } if (time - fpsTime > 1000) { + const sorted = [...frameSamples].sort((a, b) => a - b); + state.frameP95 = Math.round((sorted[Math.floor((sorted.length - 1) * 0.95)] || 0) * 10) / 10; + state.frameMax = Math.round((sorted.at(-1) || 0) * 10) / 10; state.fps = Math.round((state.frames * 1000) / (time - fpsTime)); state.frames = 0; fpsTime = time; updateDiagnostics(); + if(!$("diagnostics").hidden)drawDynamicsChart($("dynamics-chart"),dynamics.recent); + if(dynamics.status==="recording")fetchMetrics(); } requestAnimationFrame(frame); } -try { - renderer = new Renderer(canvas); - renderHotbar(); - connect(); - requestAnimationFrame(frame); - setInterval(() => { - if (state.connected) send({ type: "ping", client_time: performance.now() }); - if (!$("diagnostics").hidden) fetchMetrics(); - }, 3000); -} catch (error) { - console.error(error); - $("fatal").textContent = error.message; - $("fatal").hidden = false; - connection("Ошибка графики", true); +$("dynamics-start").onclick=()=>{ + controlsZero(); dynamics.arm($("dynamics-scenario").value,30); + $("dynamics-result").hidden=true;$("dynamics-export").disabled=true; + closePanels();canvas.focus(); +}; +$("dynamics-stop").onclick=()=>{dynamics.stop();controlsZero();}; +$("dynamics-export").onclick=()=>{ + const blob=new Blob([JSON.stringify(dynamics.trace(),null,2)],{type:"application/json"}); + const url=URL.createObjectURL(blob),a=document.createElement("a");a.href=url;a.download=`shacraft-dynamics-${Date.now()}.json`;a.click();setTimeout(()=>URL.revokeObjectURL(url),1000); +}; +try {new PerformanceObserver(list=>{for(const e of list.getEntries())dynamics.event("longtask",e.duration);}).observe({type:"longtask",buffered:false});}catch{} +window.addEventListener("keydown",e=>{if(e.code==="Escape"&&dynamics.scenario!=="record"){dynamics.stop();controlsZero();}}); +async function start() { + try { + renderer = new Renderer(canvas); + renderer.onMeshPublished = (id) => { + const timing = editDiagnostics.published(id); + if (timing) dynamics.event("block-edit", timing.totalMs, timing); + }; + setTimeOfDay(localStorage.getItem("shacraft:time-of-day") || "night"); + renderHotbar(); + requestAnimationFrame(frame); + try { + physics = await loadPhysics(); + prediction = new LocalPrediction(physics, (body) => + samplePhysicsWorld( + body, + state.blocks, + state.materials, + state.viewBounds, + ), + ); + state.physicsStatus = "Готова"; + } catch (error) { + disablePrediction(error); + } + connect(); + setInterval(() => { + if (state.connected) + send({ type: "ping", client_time: performance.now() }); + if (!$("diagnostics").hidden) fetchMetrics(); + }, 3000); + } catch (error) { + console.error(error); + $("fatal").textContent = error.message; + $("fatal").hidden = false; + connection("Ошибка графики", true); + } } +start(); diff --git a/client/block-light-controller.js b/client/block-light-controller.js new file mode 100644 index 0000000..8b524aa --- /dev/null +++ b/client/block-light-controller.js @@ -0,0 +1,104 @@ +import { attachBlockLightSamplers, buildBlockLight } from "./block-light.js"; +import { applyLightProperties, loadLightProperties } from "./light-properties.js"; + +/** Only one build runs at a time. Edits arriving during a build replace its result. */ +export class BlockLightController { + constructor(publish) { + this.publish = publish; + this.generation = 0; + this.busy = false; + this.pending = null; + this.status = "loading"; + this.properties = null; + this.worker = null; + if (typeof Worker === "function") { + try { + this.worker = new Worker(new URL("./block-light-worker.js", import.meta.url), { type: "module" }); + } catch { + // Restricted browser contexts can reject workers before any error event. + // The same solver remains available on the main thread. + } + } + if (this.worker) { + this.worker.onmessage = ({ data }) => this.receive(data); + this.worker.onerror = (event) => { + event.preventDefault(); + this.worker.terminate(); + this.worker = null; + this.busy = false; + // Preserve the latest request and recover with the same implementation. + this.pending ||= this.current; + this.start(); + }; + } + loadLightProperties().then(properties => { + this.properties = properties; + this.start(); + }).catch(error => { + this.status = `error: ${error.message}`; + console.error("Shacraft light metadata", error); + }); + } + request(blocks, materials, bounds) { + this.generation++; + this.pending = { blocks, materials, bounds, generation: this.generation }; + this.status = "pending"; + if (!this.timer) this.timer = setTimeout(() => { this.timer = null; this.start(); }, 25); + } + start() { + if (this.busy || !this.pending || !this.properties) return; + const request = this.pending; + this.pending = null; + this.busy = true; + this.current = request; + this.status = "building"; + const materials = new Map([...request.materials].map(([id, mat]) => [id, + applyLightProperties({ + minecraft_id: mat.minecraft_id, state: mat.state, light: mat.light, + opacity: mat.opacity, render: mat.render, transparent: mat.transparent, + light_dampening: mat.light_dampening, light_occlusion: mat.light_occlusion, + }, this.properties)])); + const packet = { generation: request.generation, bounds: request.bounds, + blocks: [...request.blocks], materials: [...materials] }; + this.current = { ...request, blocks: new Map(packet.blocks), materials }; + if (this.worker) this.worker.postMessage(packet); + else setTimeout(() => { + const start = performance.now(); + try { + this.receive({ generation: request.generation, + field: buildBlockLight(this.current.blocks, materials, request.bounds), + milliseconds: performance.now() - start }); + } catch (error) { this.receive({ generation: request.generation, error: error.message }); } + }, 0); + } + receive(message) { + const current = this.current; + if (!this.busy || message.generation !== current?.generation) return; + this.busy = false; + if (message.generation === this.generation) { + if (message.error) { + this.status = `error: ${message.error}`; + console.error("Shacraft block lighting", message.error); + } else { + this.status = "ready"; + this.milliseconds = message.milliseconds; + this.publish(attachBlockLightSamplers(message.field, current.blocks, current.materials)); + } + } + this.start(); + } +} + +/** In a standalone scene, keep a full light-radius margin around its geometry. */ +export function inferLightBounds(blocks) { + const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity]; + for (const key of blocks.keys()) { + const pos = key.split(",").map(Number); + for (let axis = 0; axis < 3; axis++) { + min[axis] = Math.min(min[axis], pos[axis]); + max[axis] = Math.max(max[axis], pos[axis]); + } + } + if (!Number.isFinite(min[0])) return { min: [-16, -16, -16], max: [16, 16, 16] }; + return { min: min.map(v => v - 15), max: max.map(v => v + 15) }; +} diff --git a/client/block-light-worker.js b/client/block-light-worker.js new file mode 100644 index 0000000..d40c57e --- /dev/null +++ b/client/block-light-worker.js @@ -0,0 +1,15 @@ +import { buildBlockLight } from "./block-light.js"; + +self.onmessage = ({ data: request }) => { + try { + const start = performance.now(); + const result = buildBlockLight(new Map(request.blocks), new Map(request.materials), request.bounds); + const { min, size, data, sourceCount, blockLevels, skyLevels } = result; + self.postMessage({ generation: request.generation, + field: { min, size, data, sourceCount, blockLevels, skyLevels }, + milliseconds: performance.now() - start, + }, [data.buffer, blockLevels.buffer, skyLevels.buffer]); + } catch (error) { + self.postMessage({ generation: request.generation, error: error.message }); + } +}; diff --git a/client/block-light.js b/client/block-light.js new file mode 100644 index 0000000..14b384f --- /dev/null +++ b/client/block-light.js @@ -0,0 +1,257 @@ +import { isAmbientOccluder } from "./ambient-occlusion.js"; +import { unitBox } from "./math.js"; +import { MAX_LIGHT_CELLS } from "./view-distance.js"; + +const MAX_CELLS = MAX_LIGHT_CELLS; +const EPSILON = 1e-4; +const DIRECTIONS = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]]; +const OPPOSITE = [1, 0, 3, 2, 5, 4]; +const ZERO = Object.freeze([0, 0, 0]); +const DARK = Object.freeze({ block: ZERO, sky: 0, blockLevel: 0, skyLevel: 0 }); +const integerTriple = (value) => Array.isArray(value) && value.length === 3 && value.every(Number.isSafeInteger); +const lightLevel = (value) => Number.isFinite(value) ? Math.max(0, Math.min(15, Math.floor(value))) : 0; + +/** Canonical source strength comes exclusively from the authoritative state. */ +export function blockEmission(material) { + const level = lightLevel(material?.light); + const state = (material?.state ?? "").split("[")[0].split(":").pop(); + let color = [1, 0.82, 0.57]; + if (/^soul_|soul_fire/.test(state)) color = [0.3, 0.82, 1]; + else if (/sea_lantern|end_rod|beacon/.test(state)) color = [0.76, 0.9, 1]; + else if (/redstone_(?:wall_)?torch|redstone_ore/.test(state)) color = [1, 0.28, 0.13]; + else if (/amethyst|crying_obsidian|respawn_anchor/.test(state)) color = [0.69, 0.42, 1]; + else if (/warped|glow_lichen|verdant_froglight/.test(state)) color = [0.54, 1, 0.79]; + else if (/pearlescent_froglight/.test(state)) color = [1, 0.72, 0.9]; + else if (/lava|fire|campfire|furnace|magma/.test(state)) color = [1, 0.56, 0.24]; + else if (/torch|lantern|candle|glowstone|shroomlight|jack_o_lantern/.test(state)) color = [1, 0.75, 0.43]; + return { level, color }; +} + +function boxesOf(value) { + return (value ?? []).filter((box) => box?.min?.length === 3 && box?.max?.length === 3 && + box.min.every((min, axis) => Number.isFinite(min) && Number.isFinite(box.max[axis]) && box.max[axis] > min)); +} + +function faceRectangles(boxes, direction) { + const axis = direction >> 1, positive = direction % 2 === 0; + const tangents = [0, 1, 2].filter((value) => value !== axis); + const rectangles = []; + for (const box of boxes) { + if (positive ? box.max[axis] < 1 - EPSILON : box.min[axis] > EPSILON) continue; + const rect = [ + Math.max(0, box.min[tangents[0]]), Math.max(0, box.min[tangents[1]]), + Math.min(1, box.max[tangents[0]]), Math.min(1, box.max[tangents[1]]), + ]; + if (rect[2] > rect[0] && rect[3] > rect[1]) rectangles.push(rect); + } + return rectangles; +} + +/** Exact union coverage of axis-aligned boundary rectangles, including slabs. */ +function coversFace(rectangles) { + if (!rectangles.length) return false; + if (rectangles.some((r) => r[0] === 0 && r[1] === 0 && r[2] === 1 && r[3] === 1)) return true; + const xs = [...new Set([0, 1, ...rectangles.flatMap((r) => [r[0], r[2]])])].sort((a, b) => a - b); + const ys = [...new Set([0, 1, ...rectangles.flatMap((r) => [r[1], r[3]])])].sort((a, b) => a - b); + for (let x = 1; x < xs.length; x++) + for (let y = 1; y < ys.length; y++) { + const midX = (xs[x - 1] + xs[x]) / 2, midY = (ys[y - 1] + ys[y]) / 2; + if (!rectangles.some((r) => midX > r[0] && midX < r[2] && midY > r[1] && midY < r[3])) return false; + } + return true; +} + +function materialDescriptors(materials) { + const air = { index: 0, dampening: 0, boxes: [], faces: Array.from({ length: 6 }, () => []), fullFaces: 0, emission: { level: 0, color: ZERO } }; + const descriptors = [air], byId = new Map(), faceCache = new Map(); + const get = (id) => { + if (!id) return air; + if (!byId.has(id)) { + const material = materials.get(id); + const render = boxesOf(material?.render ?? [unitBox]); + const opaque = isAmbientOccluder(material); + const fullCube = opaque && coversFace(faceRectangles(render, 0)) && coversFace(faceRectangles(render, 1)) && + coversFace(faceRectangles(render, 2)) && coversFace(faceRectangles(render, 3)) && + coversFace(faceRectangles(render, 4)) && coversFace(faceRectangles(render, 5)); + const emission = blockEmission(material); + const measuredDampening = material?.light_dampening ?? material?.light_block; + const dampening = Number.isFinite(measuredDampening) ? lightLevel(measuredDampening) : fullCube ? 15 : 0; + // Effective Java light-occlusion shapes are already empty for ordinary + // full cubes and transparent blocks. Opacity handles ordinary solid cubes. + const boxes = boxesOf(material?.light_occlusion ?? (opaque && !fullCube ? render : [])); + const faces = DIRECTIONS.map((_, direction) => faceRectangles(boxes, direction)); + const fullFaces = faces.reduce((mask, rects, direction) => mask | (coversFace(rects) ? 1 << direction : 0), 0); + const descriptor = { index: descriptors.length, dampening, boxes: opaque ? render : [], faces, fullFaces, emission }; + descriptors.push(descriptor); + byId.set(id, descriptor); + } + return byId.get(id); + }; + const blocked = (source, target, direction) => { + if ((source.fullFaces & (1 << direction)) || (target.fullFaces & (1 << OPPOSITE[direction]))) return true; + const first = source.faces[direction], second = target.faces[OPPOSITE[direction]]; + if (!first.length || !second.length) return false; + const key = `${source.index},${target.index},${direction}`; + if (!faceCache.has(key)) faceCache.set(key, coversFace([...first, ...second])); + return faceCache.get(key); + }; + return { get, descriptors, blocked }; +} + +function validateBounds(bounds) { + if (!integerTriple(bounds?.min) || !integerTriple(bounds?.max)) throw new RangeError("Block-light bounds must contain integer min/max triples"); + const min = [...bounds.min], size = bounds.max.map((value, axis) => value - min[axis] + 1); + const count = size[0] * size[1] * size[2]; + if (size.some((value) => value <= 0 || !Number.isSafeInteger(value)) || !Number.isSafeInteger(count) || count > MAX_CELLS) + throw new RangeError(`Block-light bounds must contain 1 to ${MAX_CELLS} cells`); + return { min, size, count }; +} + +/** + * Bounded, deterministic Java-style max-light propagation. Bounds are inclusive; + * x is the fastest axis: x + size[0] * (y + size[1] * z). + * + * RGB is a visual tint of the winning canonical source. Equal-strength sources + * combine their tint by channel maximum, never adding to block-light levels. + * Sky above the supplied top boundary is treated as exposed sky; unknown side + * and bottom boundaries are closed. The caller supplies the full loaded view. + */ +export function buildBlockLight(blocks, materials, bounds, skyColumns = null) { + const { min, size, count } = validateBounds(bounds); + const [sx, sy, sz] = size, plane = sx * sy; + const data = new Uint8Array(count * 4), blockLevels = new Uint8Array(count), skyLevels = new Uint8Array(count); + const types = new Uint32Array(count), definitions = materialDescriptors(materials); + const blockBuckets = Array.from({ length: 16 }, () => []), skyBuckets = Array.from({ length: 16 }, () => []); + let sourceCount = 0; + const addBlock = (wx,wy,wz,id) => { + const x=wx-min[0], y=wy-min[1], z=wz-min[2]; + if(x<0||x>=sx||y<0||y>=sy||z<0||z>=sz)return; + const index=x+sx*(y+sy*z), descriptor=definitions.get(id); + types[index]=descriptor.index; + const {level,color}=descriptor.emission; + if(!level)return; + sourceCount++;blockLevels[index]=level; + for(let channel=0;channel<3;channel++)data[index*4+channel]=Math.round(color[channel]*255); + blockBuckets[level].push(index); + }; + if(blocks.forEachBlock) blocks.forEachBlock(addBlock,bounds); + else for(const [key,id] of blocks) if(id) addBlock(...key.split(",").map(Number),id); + for (let z = 0; z < sz; z++) + for (let x = 0; x < sx; x++) { + if (skyColumns) { + const wx=x+min[0],wz=z+min[2], column=skyColumns.get(`${Math.floor(wx/16)},${Math.floor(wz/16)}`); + const height=column?.[((wx%16+16)%16)+16*((wz%16+16)%16)] ?? 32767; + if(height>=min[1]+sy)continue; + } + const index = x + sx * (sy - 1 + sy * z), descriptor = definitions.descriptors[types[index]]; + if (descriptor.dampening >= 15 || descriptor.fullFaces & (1 << 2)) continue; + const value = 15 - descriptor.dampening; + if (!value) continue; + skyLevels[index] = value; + skyBuckets[value].push(index); + } + const offsets = [1, -1, sx, -sx, plane, -plane]; + const propagate = (levels, buckets, sky) => { + for (let level = 15; level > 0; level--) { + const bucket = buckets[level]; + for (let cursor = 0; cursor < bucket.length; cursor++) { + const index = bucket[cursor]; + if (levels[index] !== level) continue; + const x = index % sx, y = Math.floor(index / sx) % sy, z = Math.floor(index / plane); + const source = definitions.descriptors[types[index]]; + for (let direction = 0; direction < 6; direction++) { + if ((direction === 0 && x === sx - 1) || (direction === 1 && x === 0) || + (direction === 2 && y === sy - 1) || (direction === 3 && y === 0) || + (direction === 4 && z === sz - 1) || (direction === 5 && z === 0)) continue; + const nextIndex = index + offsets[direction], target = definitions.descriptors[types[nextIndex]]; + const attenuation = sky && level === 15 && direction === 3 && target.dampening === 0 ? 0 : Math.max(1, target.dampening); + const value = level - attenuation, previous = levels[nextIndex]; + if (value <= 0 || value < previous || (sky && value === previous) || definitions.blocked(source, target, direction)) continue; + if (value > previous) { + levels[nextIndex] = value; + buckets[value].push(nextIndex); + if (!sky) for (let channel = 0; channel < 3; channel++) data[nextIndex * 4 + channel] = data[index * 4 + channel]; + } else if (!sky) { + // All parents at level + 1 are finalized before this level is + // propagated, so equal-strength tint changes need no extra queue. + for (let channel = 0; channel < 3; channel++) + data[nextIndex * 4 + channel] = Math.max(data[nextIndex * 4 + channel], data[index * 4 + channel]); + } + } + } + } + }; + propagate(blockLevels, blockBuckets, false); + propagate(skyLevels, skyBuckets, true); + for (let index = 0; index < count; index++) { + const level = blockLevels[index], brightness = (level / 15) ** 2; + for (let channel = 0; channel < 3; channel++) data[index * 4 + channel] = Math.round(data[index * 4 + channel] * brightness); + data[index * 4 + 3] = level; + } + return attachBlockLightSamplers({ min, size, data, sourceCount, blockLevels, skyLevels }, blocks, materials); +} + +/** Restore cheap sampling methods after worker ArrayBuffer transfer. */ +export function attachBlockLightSamplers(field, blocks, materials) { + const { min, size, data, blockLevels, skyLevels } = field; + const definitions = materialDescriptors(materials), voxelCache = new Map(), sampleCache = new Map(); + const indexAt = (point) => { + const x = Math.floor(point[0]) - min[0], y = Math.floor(point[1]) - min[1], z = Math.floor(point[2]) - min[2]; + return x < 0 || x >= size[0] || y < 0 || y >= size[1] || z < 0 || z >= size[2] ? -1 : x + size[0] * (y + size[1] * z); + }; + const voxelAt = (point) => { + const x = Math.floor(point[0]), y = Math.floor(point[1]), z = Math.floor(point[2]); + const index = x - min[0] + size[0] * (y - min[1] + size[1] * (z - min[2])); + if (!voxelCache.has(index)) voxelCache.set(index, { pos: [x, y, z], descriptor: definitions.get(blocks.getAt ? blocks.getAt(x,y,z) : blocks.get(`${x},${y},${z}`)) }); + return voxelCache.get(index); + }; + const freeAt = (point) => { + if (indexAt(point) < 0) return false; + const { pos, descriptor } = voxelAt(point); + return !descriptor.boxes.some((box) => point.every((value, axis) => value - pos[axis] > box.min[axis] && value - pos[axis] < box.max[axis])); + }; + const canSampleFrom = (point, anchor) => { + if (indexAt(anchor) < 0 || !freeAt(point)) return false; + const target = voxelAt(point), source = voxelAt(anchor); + let direction = -1, distance = 0; + for (let axis = 0; axis < 3; axis++) { + const delta = target.pos[axis] - source.pos[axis]; + if (delta) { direction = axis * 2 + (delta < 0 ? 1 : 0); distance += Math.abs(delta); } + } + return distance === 0 || (distance === 1 && !definitions.blocked(source.descriptor, target.descriptor, direction)); + }; + field.sample = (point) => { + const index = indexAt(point); + if (index < 0) return DARK; + if (!sampleCache.has(index)) sampleCache.set(index, + { block: [data[index * 4] / 255, data[index * 4 + 1] / 255, data[index * 4 + 2] / 255], + sky: skyLevels[index] / 15, blockLevel: blockLevels[index], skyLevel: skyLevels[index] }); + return sampleCache.get(index); + }; + field.sampleFace = (pos, box, normal, vertices) => { + const axis = normal.findIndex((value) => Math.abs(value) === 1), tangents = [0, 1, 2].filter((value) => value !== axis); + const result = { block: [], sky: [], blockLevels: [], skyLevels: [] }; + for (const vertex of vertices) { + const corner = vertex.map((value, a) => pos[a] + box.min[a] + value * (box.max[a] - box.min[a]) + normal[a] * EPSILON); + const offset = (u, v) => { + const point = [...corner]; + for (let i = 0; i < 2; i++) point[tangents[i]] += (vertex[tangents[i]] < 0.5 ? -1 : 1) * (i ? v : u) * EPSILON; + return point; + }; + // Begin just inside this face's tangent bounds. Interpolate only toward + // accessible neighboring cells, never through an opaque corner or wall. + const base = offset(-1, -1), first = offset(1, -1), second = offset(-1, 1), diagonal = offset(1, 1); + const baseSample = freeAt(base) ? field.sample(base) : DARK; + const firstOpen = canSampleFrom(first, base), secondOpen = canSampleFrom(second, base); + const diagonalOpen = (firstOpen && canSampleFrom(diagonal, first)) || (secondOpen && canSampleFrom(diagonal, second)); + const samples = [baseSample, firstOpen ? field.sample(first) : baseSample, + secondOpen ? field.sample(second) : baseSample, diagonalOpen ? field.sample(diagonal) : baseSample]; + result.block.push([0, 1, 2].map((channel) => samples.reduce((sum, sample) => sum + sample.block[channel], 0) / 4)); + result.sky.push(samples.reduce((sum, sample) => sum + sample.sky, 0) / 4); + result.blockLevels.push(samples.reduce((sum, sample) => sum + sample.blockLevel, 0) / 4); + result.skyLevels.push(samples.reduce((sum, sample) => sum + sample.skyLevel, 0) / 4); + } + return result; + }; + return field; +} diff --git a/client/block-textures.js b/client/block-textures.js new file mode 100644 index 0000000..afc7251 --- /dev/null +++ b/client/block-textures.js @@ -0,0 +1,101 @@ +import { BLOCK_FACES } from "./texture-pack.js"; + +const WHITE = Object.freeze([1, 1, 1]); +const GRASS = Object.freeze([0.58, 0.8, 0.34]); +const LEAVES = Object.freeze([0.46, 0.7, 0.28]); + +// These aliases share a surface material. Similar block names are deliberately +// not enough: stripped logs, other wood species and deepslate ores need assets. +const materials = new Map([ + ["stone", ["stone", "stone_stairs", "stone_slab", "stone_button", "stone_pressure_plate"]], + ["cobblestone", ["cobblestone", "cobblestone_stairs", "cobblestone_slab", "cobblestone_wall"]], + ["oak_planks", ["oak_planks", "oak_stairs", "oak_slab", "oak_fence", "oak_fence_gate", "oak_button", "oak_pressure_plate"]], + ["bricks", ["bricks", "brick_stairs", "brick_slab", "brick_wall"]], + ["stone_bricks", ["stone_bricks", "stone_brick_stairs", "stone_brick_slab", "stone_brick_wall"]], + ["glass", ["glass", "glass_pane"]], + ["snow", ["snow", "snow_block"]], + ...["dirt", "sand", "gravel", "diamond_ore", "iron_ore", "coal_ore", "gold_ore", "redstone_ore", "deepslate", "obsidian", "netherrack"].map((name) => [name, [name]]), +].flatMap(([texture, blocks]) => blocks.map((block) => [block, texture]))); + +/** Face order matches renderer.js: east, west, up, down, south, north. */ +export function getBlockFaceTextures(state, layers) { + const empty = () => Array(6).fill(null); + const match = /^(?:minecraft:)?([a-z0-9_]+)(?:\[([^\]]*)\])?$/.exec(state ?? ""); + if (!match) return empty(); + const [, name, properties = ""] = match; + const props = Object.fromEntries( + properties.split(",").filter(Boolean).map((entry) => entry.split("=")), + ); + const mapping = layers.get(BLOCK_FACES); + if (mapping) { + const base = `minecraft:${name}`; + const canonical = base + (properties ? `[${Object.entries(props).sort(([a], [b]) => a.localeCompare(b)).map(([k, v]) => `${k}=${v}`).join(",")}]` : ""); + const index = Object.hasOwn(mapping.states, canonical) ? mapping.states[canonical] : mapping.defaults[base]; + if (Number.isInteger(index)) return mapping.sets[index]; + } + const face = (texture, tint = WHITE, cutout = false) => { + const layer = layers.get(texture); + return Number.isInteger(layer) && layer >= 0 ? { layer, tint, cutout } : null; + }; + const all = (texture, tint = WHITE, cutout = false) => + Array.from({ length: 6 }, () => face(texture, tint, cutout)); + + if (name === "grass_block") { + const side = props.snowy === "true" ? null : "grass_block_side"; + return [side, side, "grass_block_top", "dirt", side, side].map( + (texture, index) => texture ? face(texture, index === 2 ? GRASS : WHITE) : null, + ); + } + if (name === "oak_log") { + const caps = { x: [0, 1], y: [2, 3], z: [4, 5] }[props.axis ?? "y"]; + if (!caps) return empty(); + return Array.from({ length: 6 }, (_, index) => + face(caps.includes(index) ? "oak_log_top" : "oak_log"), + ); + } + if (name === "oak_wood") return all("oak_log"); + if (name === "oak_leaves") return all("oak_leaves", LEAVES, true); + if (name === "oak_door") { + if ((props.half ?? "lower") !== "lower") return empty(); + let alongX = ["east", "west"].includes(props.facing ?? "north"); + if (props.open === "true") alongX = !alongX; + const broadFaces = alongX ? [0, 1] : [4, 5]; + return Array.from({ length: 6 }, (_, index) => + face(broadFaces.includes(index) ? "oak_door_bottom" : "oak_planks"), + ); + } + const texture = materials.get(name); + return texture ? all(texture, WHITE, texture === "glass") : empty(); +} + +/** + * UVs address an unflipped bitmap with its first row at V=0. Coordinates stay + * relative to the whole block, so slabs and other boxes crop instead of stretch. + * Horizontal logs rotate back to the vertical-log frame before projection, + * aligning the bark grain with the log axis without mirroring any face. + */ +export function getFaceUV(faceIndex, localPos, state = "", textureFace = null) { + if (textureFace?.uv) { + const uv = textureFace.uv, [x, y, z] = localPos; + return [uv[0]*x + uv[1]*y + uv[2]*z + uv[3], uv[4]*x + uv[5]*y + uv[6]*z + uv[7]]; + } + let [x, y, z] = localPos; + const log = /^(?:minecraft:)?oak_(?:log|wood)\[([^\]]*)\]$/.exec(state); + const axis = log && /(?:^|,)axis=([xz])(?:,|$)/.exec(log[1])?.[1]; + if (axis === "x") { + [x, y, z] = [1 - y, x, z]; + faceIndex = [2, 3, 1, 0, 4, 5][faceIndex]; + } else if (axis === "z") { + [x, y, z] = [x, z, 1 - y]; + faceIndex = [0, 1, 5, 4, 2, 3][faceIndex]; + } + switch (faceIndex) { + case 0: return [1 - z, 1 - y]; + case 1: return [z, 1 - y]; + case 2: return [x, z]; + case 3: return [x, 1 - z]; + case 4: return [x, 1 - y]; + case 5: return [1 - x, 1 - y]; + default: throw new RangeError(`Unknown block face: ${faceIndex}`); + } +} diff --git a/client/dynamics-diagnostics.js b/client/dynamics-diagnostics.js new file mode 100644 index 0000000..c737c6b --- /dev/null +++ b/client/dynamics-diagnostics.js @@ -0,0 +1,60 @@ +const percentile=(values,p)=>{if(!values.length)return 0;const sorted=[...values].sort((a,b)=>a-b);return Math.round(sorted[Math.min(sorted.length-1,Math.floor((sorted.length-1)*p))]*100)/100;}; +const statistics=values=>({p50:percentile(values,.5),p95:percentile(values,.95),p99:percentile(values,.99),max:percentile(values,1)}); +/** Bounded local trace. Durations use monotonic browser time, not wall clocks. */ +export class DynamicsDiagnostics { + constructor(){this.status='idle';this.recent=[];this.frames=[];this.events=[];this.server=[];this.result=null;this.scenario='record';this.duration=30;this.toggleSent=false;} + arm(scenario='record',duration=30){ + this.status='warming';this.scenario=scenario;this.duration=Math.min(120,Math.max(5,duration));this.frames=[];this.events=[];this.server=[];this.result=null;this.toggleSent=false;this.climbUntil=0;this.armed=performance.now();this.stableAt=null; + } + ready(sample,ready,now=performance.now()){ + if(this.status!=='warming')return; + if(ready)this.stableAt??=now;else this.stableAt=null; + if(this.stableAt!==null&&now-this.stableAt>=500){this.status='recording';this.started=now;this.initial=sample;this.yaw=sample.yaw;} + if(now-this.armed>120000){this.status='error';this.result={error:'Terrain did not settle within 120 seconds',sample};} + } + frame(sample,now=performance.now()){ + this.recent.push(sample);if(this.recent.length>300)this.recent.shift(); + if(this.status!=='recording')return; + if(this.frames.length<18000)this.frames.push({...sample,t:now-this.started}); + if(now-this.started>=this.duration*1000)this.stop(now); + } + event(type,milliseconds,detail={}){if(this.status==='recording'&&this.events.length<3000)this.events.push({t:performance.now()-this.started,type,milliseconds,...detail});} + serverSample(sample){if(this.status==='recording'&&this.server.length<150)this.server.push({t:performance.now()-this.started,...sample});} + controls(consume,flying,now=performance.now(),collision=false){ + if(this.status!=='recording'||this.scenario==='record')return null; + const t=(now-this.started)/1000,fly=this.scenario!=='run'; + let fly_toggle=false; + if(fly&&!flying&&!this.toggleSent){fly_toggle=true;if(consume)this.toggleSent=true;} + if(fly&&collision&&consume)this.climbUntil=now+900; + return {forward:fly&&t<2.5?0:1,strafe:0,jump:fly&&(t<2.5||now<(this.climbUntil||0)),sprint:true,sneak:false,fly_toggle, + yaw:this.yaw+(this.scenario==='turns'?Math.sin(t*.8)*1.3:Math.sin(Math.max(0,t-3)*.11)*.35),pitch:fly?-.16:-.08}; + } + stop(now=performance.now(),reason=null){ + if(this.status==='warming'){this.status='idle';return;} + if(this.status!=='recording')return; + const f=this.frames,last=f.at(-1)||this.initial,values=k=>f.map(x=>x[k]||0); + let distance=0;for(let i=1;iv-f[i-1].position[a])); + this.result={schema:1,scenario:this.scenario,interrupted:reason,durationMs:Math.round(now-this.started),frames:f.length, + frameMs:statistics(values('frameMs')),physicsMs:statistics(values('physicsMs')),drawMs:statistics(values('drawMs')), + over25ms:f.filter(x=>x.frameMs>25).length,over50ms:f.filter(x=>x.frameMs>50).length, + streamApplyMs:statistics(this.events.filter(e=>e.type==='sections').map(e=>e.milliseconds)), + networkHandlerMs:statistics(this.events.filter(e=>e.type==='network').map(e=>e.milliseconds)), + longTasks:this.events.filter(e=>e.type==='longtask').length, + maxCorrection:percentile(values('correction'),1),waitingFrames:f.filter(x=>x.waiting).length, + maxDirty:percentile(values('dirty'),1),distance:Math.round(distance*100)/100, + viewChanges:last.viewChanges-this.initial.viewChanges,sectionBatches:last.batches-this.initial.batches, + meshResets:last.meshResets-this.initial.meshResets,loadedSections:last.loadedSections,totalSections:last.totalSections, + voxelBytes:last.voxelBytes,server:this.server.at(-1)||null,start:this.initial.position,end:last.position}; + this.status='done'; + } + trace(){return {summary:this.result,frames:this.frames,events:this.events,server:this.server};} +} +export function drawDynamicsChart(canvas,samples){ + const ctx=canvas.getContext('2d');if(!ctx)return; + const w=canvas.width,h=canvas.height;ctx.fillStyle='#10231b';ctx.fillRect(0,0,w,h); + ctx.font='11px monospace';ctx.strokeStyle='#405448';ctx.fillStyle='#a5b8ac'; + for(const ms of [16.7,33.3,50]){const y=h-ms/70*h;ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(w,y);ctx.stroke();ctx.fillText(`${ms} ms`,4,y-3);} + for(const [key,color] of [['frameMs','#efc46a'],['drawMs','#8bd0b4'],['physicsMs','#8bb6ed']]){ + ctx.strokeStyle=color;ctx.beginPath();samples.forEach((s,i)=>{const x=i/300*w,y=h-Math.min(70,s[key]||0)/70*h;i?ctx.lineTo(x,y):ctx.moveTo(x,y);});ctx.stroke(); + } +} diff --git a/client/edit-diagnostics.js b/client/edit-diagnostics.js new file mode 100644 index 0000000..aa932a2 --- /dev/null +++ b/client/edit-diagnostics.js @@ -0,0 +1,28 @@ +/** Monotonic timings for local requests and authoritative mesh publication. */ +export class EditDiagnostics { + constructor() { this.reset(); } + reset() { this.requests = new Map(); this.sections = new Map(); this.last = null; } + request(pos, block, now = performance.now()) { + for (const [key, value] of this.requests) if (now - value.time > 5000) this.requests.delete(key); + if (this.requests.size >= 64) this.requests.delete(this.requests.keys().next().value); + this.requests.set(pos.join(','), { block, time: now }); + } + confirmed(changes, now = performance.now()) { + for (const { pos, block } of changes) { + const key = pos.join(','), request = this.requests.get(key); + if (!request || request.block !== block || now - request.time > 5000) continue; + this.requests.delete(key); + const id = pos.map(v => Math.floor(v / 16)).join(','); + if (this.sections.size >= 64) this.sections.delete(this.sections.keys().next().value); + this.sections.set(id, { request: request.time, confirmed: now }); + } + } + published(id, now = performance.now()) { + const edit = this.sections.get(id); + if (!edit) return null; + this.sections.delete(id); + this.last = { acknowledgementMs: edit.confirmed - edit.request, + geometryMs: now - edit.confirmed, totalMs: now - edit.request }; + return this.last; + } +} diff --git a/client/edit-mesh-controller.js b/client/edit-mesh-controller.js new file mode 100644 index 0000000..17e314c --- /dev/null +++ b/client/edit-mesh-controller.js @@ -0,0 +1,43 @@ +/** Small independent edit jobs cannot queue behind whole-view lighting. */ +export class EditMeshController { + constructor({capture,onError=()=>{},workerFactory}={}) { + this.capture=capture;this.onError=onError;this.epoch=0;this.job=0; + this.pending=new Map();this.tickets=new Map();this.ready=new Map();this.busy=null; + try { + this.worker=workerFactory ? workerFactory() : new Worker(new URL('./edit-mesh-worker.js',import.meta.url),{type:'module'}); + this.worker.onmessage=({data})=>this.receive(data); + this.worker.onerror=event=>{event.preventDefault();this.fail(event.message);}; + } catch(error) {this.fail(error.message);} + } + fail(error) {this.error=error;this.dispose();this.onError(error);} + request(ids) { + if(this.error||this.disposed)return; + for(const id of ids) { + const job=++this.job; + this.pending.set(id,job);this.tickets.set(id,job);this.ready.delete(id); + } + } + cancel(id) {this.pending.delete(id);this.tickets.delete(id);this.ready.delete(id);} + reset() {this.epoch++;this.pending.clear();this.tickets.clear();this.ready.clear();this.busy=null;} + isCurrent(result) {return result.epoch===this.epoch&&this.tickets.get(result.id)===result.editJob;} + pump() { + if(this.error||this.disposed||this.busy||this.ready.size>=2||!this.pending.size)return; + const [id,editJob]=this.pending.entries().next().value; + this.pending.delete(id); + try { + const start=performance.now(),packet={...this.capture(id),epoch:this.epoch,editJob}; + const transfers=packet.sections.map(s=>s.cells.buffer); + if(packet.light)transfers.push(packet.light.data.buffer,packet.light.blockLevels.buffer,packet.light.skyLevels.buffer); + this.busy={id,editJob,epoch:this.epoch};this.worker.postMessage(packet,transfers); + this.prepareMilliseconds=performance.now()-start; + } catch(error) {this.fail(error.message);} + } + receive(result) { + if(this.disposed||result.epoch!==this.epoch||result.editJob!==this.busy?.editJob)return; + this.busy=null; + if(!this.isCurrent(result))return; + if(result.error){this.fail(result.error);return;} + this.meshMilliseconds=result.milliseconds;this.ready.set(result.id,result); + } + dispose() {this.disposed=true;this.reset();this.worker?.terminate();} +} diff --git a/client/edit-mesh-worker.js b/client/edit-mesh-worker.js new file mode 100644 index 0000000..8861781 --- /dev/null +++ b/client/edit-mesh-worker.js @@ -0,0 +1,10 @@ +import {buildEditMesh} from './edit-mesh.js'; +import {loadLightProperties} from './light-properties.js'; +const properties=loadLightProperties(); +self.onmessage=({data})=>properties.then(table=>{ + const start=performance.now(),result={id:data.id,epoch:data.epoch,editJob:data.editJob,preview:true}; + try { + const mesh=buildEditMesh(data,table); + self.postMessage({...result,...mesh,milliseconds:performance.now()-start},[mesh.vertices.buffer,mesh.transparent.buffer]); + } catch(error) {self.postMessage({...result,error:error.message});} +}).catch(error=>self.postMessage({id:data.id,epoch:data.epoch,editJob:data.editJob,error:error.message})); diff --git a/client/edit-mesh.js b/client/edit-mesh.js new file mode 100644 index 0000000..f706056 --- /dev/null +++ b/client/edit-mesh.js @@ -0,0 +1,54 @@ +import { SectionVoxelMap } from './section-voxel-map.js'; +import { attachBlockLightSamplers } from './block-light.js'; +import { applyLightProperties } from './light-properties.js'; +import { buildSectionMesh } from './mesh-geometry.js'; +import { textureSubset } from './texture-pack.js'; + +/** Copy only the edited section's sampling neighborhood, independent of view radius. */ +export function captureEditMesh(id, blocks, materials, textures, field) { + const base=id.split(',').map(v=>Number(v)*16); + let pad=2; + for(const mat of materials.values()) for(const box of mat.render || []) + for(let axis=0;axis<3;axis++) pad=Math.max(pad,Math.ceil(-box.min[axis])+2,Math.ceil(box.max[axis]-1)+2); + const min=base.map(v=>v-pad),size=Array(3).fill(16+pad*2),sections=[]; + for(let x=Math.floor(min[0]/16);x<=Math.floor((min[0]+size[0]-1)/16);x++) + for(let y=Math.floor(min[1]/16);y<=Math.floor((min[1]+size[1]-1)/16);y++) + for(let z=Math.floor(min[2]/16);z<=Math.floor((min[2]+size[2]-1)/16);z++) { + const section=`${x},${y},${z}`; + if(blocks.getSectionCells) { + const cells=blocks.getSectionCells(section); + if(cells) sections.push({section,cells:cells.slice()}); + } else { + const cells=new Uint32Array(4096); + for(const key of (blocks.keysInSection ? blocks.keysInSection(section) : [...blocks.keys()].filter(key=>key.split(",").map(v=>Math.floor(Number(v)/16)).join(",")===section))) { + const p=key.split(',').map(Number); + cells[SectionVoxelMap.index(...p)]=blocks.get(key); + } + sections.push({section,cells}); + } + } + let light=null; + if(field) { + const count=size[0]*size[1]*size[2]; + light={min,size,data:new Uint8Array(count*4),blockLevels:new Uint8Array(count),skyLevels:new Uint8Array(count)}; + const lo=min.map((v,i)=>Math.max(v,field.min[i])),hi=min.map((v,i)=>Math.min(v+size[i],field.min[i]+field.size[i])); + if(hi[0]>lo[0]) for(let z=lo[2];z used.has(id))); + return {id,sections,materials:[...nearbyMaterials],textures:[...textureSubset(textures, nearbyMaterials)],light}; +} +export function buildEditMesh(packet, properties) { + const blocks=new SectionVoxelMap(); + for(const {section,cells} of packet.sections) blocks.setSection(section,cells); + const materials=new Map(packet.materials.map(([id,mat])=>[id,applyLightProperties(mat,properties)])); + const field=packet.light ? attachBlockLightSamplers(packet.light,blocks,materials) : null; + return buildSectionMesh({id:packet.id,blocks,materials,textureLayers:new Map(packet.textures),blockLightField:field,localCoordinates:true}); +} diff --git a/client/index.html b/client/index.html index e4c39a9..4ab483a 100644 --- a/client/index.html +++ b/client/index.html @@ -14,7 +14,8 @@
@@ -57,6 +58,7 @@
W A S D движениеПробел прыжокCtrl / Shift бег / присестьЛКМ / ПКМ убрать / поставитьT чат
@@ -91,6 +93,29 @@ побеждает.

+ + + +
+ + +
+

Радиус вокруг игрока. Большая дальность увеличивает нагрузку на память и видеокарту.

+

Esc освобождает мышь. Перетаскивание работает и без захвата. Средняя - кнопка выбирает блок под прицелом. + кнопка выбирает блок под прицелом. Ctrl — бег, Shift — присесть и + удержаться у края. Двойной пробел или F включает полёт, если он разрешён + в мире; пробел / Shift — вверх / вниз.

@@ -152,6 +179,16 @@ × +

F3 — скрыть панель. Нажмите на мир, чтобы играть с открытой диагностикой.

+
+ + +
+

Готов к записи. Автомаршрут использует обычное управление игроком.

+ +

Жёлтый — кадр · зелёный — отрисовка · синий — физика.

+ +
Пакеты ещё не загружены
@@ -160,6 +197,6 @@ кэша — разные измерения.

- + diff --git a/client/light-changes.js b/client/light-changes.js new file mode 100644 index 0000000..22d41cb --- /dev/null +++ b/client/light-changes.js @@ -0,0 +1,28 @@ +/** Compare only visible mesh neighborhoods; unchanged retained sections keep their buffers. */ +export function changedLightSections(previous, next, sections) { + if (!previous) return [...sections]; + const index = (field, x, y, z) => { + x -= field.min[0]; y -= field.min[1]; z -= field.min[2]; + if (x < 0 || y < 0 || z < 0 || x >= field.size[0] || y >= field.size[1] || z >= field.size[2]) return -1; + return x + field.size[0] * (y + field.size[1] * z); + }; + const changed = []; + for (const id of sections) { + const base = id.split(",").map(v => Number(v) * 16); + let dirty = false; + outer: for (let z = base[2] - 1; z <= base[2] + 16; z++) + for (let y = base[1] - 1; y <= base[1] + 16; y++) + for (let x = base[0] - 1; x <= base[0] + 16; x++) { + const a = index(previous, x, y, z), b = index(next, x, y, z); + if (a < 0 && b < 0) continue; + if (a < 0 || b < 0 || previous.skyLevels[a] !== next.skyLevels[b] || + previous.data[a * 4] !== next.data[b * 4] || + previous.data[a * 4 + 1] !== next.data[b * 4 + 1] || + previous.data[a * 4 + 2] !== next.data[b * 4 + 2]) { + dirty = true; break outer; + } + } + if (dirty) changed.push(id); + } + return changed; +} diff --git a/client/light-properties.js b/client/light-properties.js new file mode 100644 index 0000000..639d3a0 --- /dev/null +++ b/client/light-properties.js @@ -0,0 +1,78 @@ +// Factual Java 26.2 block-state metadata, generated by scripts/measure_lighting.py. +// The catalog's minecraft_id is distinct from Shacraft's material registry id. +let loading; +const decoded = new WeakMap(); + +export function loadLightProperties() { + loading ??= fetch(new URL("./light-properties.json", import.meta.url)) + .then((response) => { + if (!response.ok) throw new Error(`Light properties HTTP ${response.status}`); + return response.json(); + }) + .then((properties) => { + if (!Array.isArray(properties.codes) || !Array.isArray(properties.shapes) || + !Array.isArray(properties.schemas) || !properties.blocks) { + throw new Error("Invalid block light properties"); + } + return properties; + }) + .catch((error) => { loading = undefined; throw error; }); + return loading; +} + +function stateId(state, properties) { + if (typeof state !== "string") return undefined; + const match = /^([a-z0-9_]+:[a-z0-9_/.]+)(?:\[([^\]]*)\])?$/.exec(state); + if (!match) return undefined; + const definition = properties.blocks?.[match[1]]; + if (!definition) return undefined; + const [first, defaultId, schemaId] = definition; + if (match[2] === undefined || match[2] === "") return defaultId; + const schema = properties.schemas[schemaId]; + const requested = new Map(); + for (const pair of match[2].split(",")) { + const parts = pair.split("="); + if (parts.length !== 2 || requested.has(parts[0])) return undefined; + requested.set(parts[0], parts[1]); + } + const defaults = []; + let remaining = defaultId - first; + for (let index = schema.length - 1; index >= 0; index--) { + const values = schema[index][1]; + defaults[index] = remaining % values.length; + remaining = Math.floor(remaining / values.length); + } + let offset = 0; + for (let index = 0; index < schema.length; index++) { + const [name, values] = schema[index]; + const selected = requested.has(name) ? values.indexOf(requested.get(name)) : defaults[index]; + if (selected < 0) return undefined; + requested.delete(name); + offset = offset * values.length + selected; + } + return requested.size ? undefined : first + offset; +} + +/** Enrich a copy; explicit Minecraft IDs take priority over the state fallback. */ +export function applyLightProperties(material, properties) { + if (!material || !properties?.codes) return { ...material }; + let id = material.minecraft_id; + if (!Number.isInteger(id) || id < 0 || id >= properties.codes.length) id = stateId(material.state, properties); + if (id === undefined) return { ...material }; + const code = properties.codes[id]; + let cache = decoded.get(properties); + if (!cache) { cache = new Map(); decoded.set(properties, cache); } + let lighting = cache.get(code); + if (!lighting) { + const boxes = properties.shapes[Math.floor(code / 16)]; + if (!boxes) return { ...material }; + lighting = { + light_dampening: code % 16, + light_occlusion: Object.freeze(boxes.map((box) => Object.freeze({ + min: Object.freeze(box.slice(0, 3)), max: Object.freeze(box.slice(3, 6)), + }))), + }; + cache.set(code, lighting); + } + return { ...material, ...lighting }; +} diff --git a/client/light-properties.json b/client/light-properties.json new file mode 100644 index 0000000..a2a9b74 --- /dev/null +++ b/client/light-properties.json @@ -0,0 +1 @@ +{"version":"26.2","encoding":"codes[minecraft_id] = light_dampening + 16 * occlusion_shape_index; blocks[name] = [first_state_id, default_state_id, schema_index]","codes":[0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,15,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,16,32,48,64,80,96,15,15,15,15,15,15,1,0,0,0,0,0,0,1,1,1,16,32,48,64,80,96,15,15,15,15,15,15,112,112,128,128,144,144,160,160,176,176,192,192,208,208,224,224,240,240,256,256,272,272,288,288,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,305,304,305,304,305,304,305,304,305,304,305,304,305,304,305,304,321,320,321,320,321,320,321,320,321,320,321,320,321,320,321,320,337,336,337,336,337,336,337,336,337,336,337,336,337,336,337,336,353,352,353,352,353,352,353,352,353,352,353,352,353,352,353,352,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,0,0,0,0,0,0,0,0,752,752,752,752,752,752,752,752,15,15,15,15,15,15,15,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,768,784,800,816,832,80,848,879,1,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,15,0,0,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,15,15,0,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,0,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,896,896,896,896,912,912,912,912,15,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,15,15,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,15,15,15,15,15,15,15,15,15,15,15,15,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,800,15,15,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,752,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,1,1,15,15,15,15,15,15,0,15,15,15,15,15,15,15,15,15,15,15,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,15,15,15,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,15,944,944,944,944,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,0,15,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,881,880,817,816,15,15,881,880,817,816,15,15,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,15,15,15,15,15,15,15,15,15,0,0,0,0,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,881,880,817,816,15,15,15,15,15,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,15,15,15,15,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,881,880,817,816,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,15,1,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,817,816,15,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,15,15,817,817,817,817,817,817,817,817,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,881,880,817,816,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,369,368,385,384,401,400,417,416,433,432,449,448,465,464,481,480,497,496,513,512,529,528,545,544,561,560,577,576,593,592,609,608,625,624,641,640,657,656,673,672,689,688,561,560,385,384,593,592,417,416,705,704,641,640,465,464,673,672,497,496,721,720,401,400,545,544,433,432,577,576,737,736,481,480,625,624,513,512,657,656,881,880,817,816,15,15,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,15,15,15,15,15,15,15,15,15,15,0,0,15,15,15,15,15,15,15,15,15,0,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"shapes":[[],[[0.0,0.0,0.25,1.0,1.0,1.0]],[[0.0,0.0,0.0,0.75,1.0,1.0]],[[0.0,0.0,0.0,1.0,1.0,0.75]],[[0.25,0.0,0.0,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.75,1.0]],[[0.0,0.25,0.0,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,1.0,0.25],[0.375,0.375,0.25,0.625,0.625,1.0]],[[0.0,0.0,0.0,1.0,1.0,0.25],[0.375,0.375,0.25,0.625,0.625,1.25]],[[0.75,0.0,0.0,1.0,1.0,1.0],[0.0,0.375,0.375,0.75,0.625,0.625]],[[0.75,0.0,0.0,1.0,1.0,1.0],[-0.25,0.375,0.375,0.75,0.625,0.625]],[[0.0,0.0,0.75,1.0,1.0,1.0],[0.375,0.375,0.0,0.625,0.625,0.75]],[[0.0,0.0,0.75,1.0,1.0,1.0],[0.375,0.375,-0.25,0.625,0.625,0.75]],[[0.0,0.0,0.0,0.25,1.0,1.0],[0.25,0.375,0.375,1.0,0.625,0.625]],[[0.0,0.0,0.0,0.25,1.0,1.0],[0.25,0.375,0.375,1.25,0.625,0.625]],[[0.375,0.0,0.375,0.625,1.0,0.625],[0.0,0.75,0.0,0.375,1.0,1.0],[0.375,0.75,0.0,1.0,1.0,0.375],[0.375,0.75,0.625,1.0,1.0,1.0],[0.625,0.75,0.375,1.0,1.0,0.625]],[[0.375,-0.25,0.375,0.625,1.0,0.625],[0.0,0.75,0.0,0.375,1.0,1.0],[0.375,0.75,0.0,1.0,1.0,0.375],[0.375,0.75,0.625,1.0,1.0,1.0],[0.625,0.75,0.375,1.0,1.0,0.625]],[[0.0,0.0,0.0,1.0,0.25,1.0],[0.375,0.25,0.375,0.625,1.0,0.625]],[[0.0,0.0,0.0,1.0,0.25,1.0],[0.375,0.25,0.375,0.625,1.25,0.625]],[[0.0,0.0,0.6875,1.0,0.25,1.0],[0.0,0.25,0.8125,1.0,1.0,1.0],[0.0,0.75,0.6875,1.0,1.0,0.8125]],[[0.0,0.0,0.0,1.0,0.25,0.3125],[0.0,0.25,0.0,1.0,1.0,0.1875],[0.0,0.75,0.1875,1.0,1.0,0.3125]],[[0.6875,0.0,0.0,1.0,0.25,1.0],[0.8125,0.25,0.0,1.0,1.0,1.0],[0.6875,0.75,0.0,0.8125,1.0,1.0]],[[0.0,0.0,0.0,0.3125,0.25,1.0],[0.0,0.25,0.0,0.1875,1.0,1.0],[0.1875,0.75,0.0,0.3125,1.0,1.0]],[[0.0,0.0,0.0,1.0,1.0,0.5],[0.0,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,0.5,1.0,1.0],[0.5,0.0,0.0,1.0,1.0,0.5],[0.5,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,1.0,0.5],[0.5,0.0,0.5,1.0,1.0,1.0],[0.0,0.5,0.5,0.5,1.0,1.0]],[[0.0,0.0,0.0,0.5,1.0,0.5],[0.0,0.5,0.5,1.0,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],[[0.5,0.0,0.0,1.0,1.0,0.5],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,1.0,1.0,0.5]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,1.0,1.0,0.5],[0.5,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,0.5]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],[[0.0,0.0,0.5,1.0,1.0,1.0],[0.0,0.5,0.0,1.0,1.0,0.5]],[[0.0,0.0,0.5,1.0,1.0,1.0],[0.5,0.0,0.0,1.0,1.0,0.5],[0.0,0.5,0.0,0.5,1.0,0.5]],[[0.0,0.0,0.0,0.5,1.0,1.0],[0.5,0.0,0.5,1.0,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],[[0.5,0.0,0.5,1.0,1.0,1.0],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],[[0.0,0.0,0.5,0.5,1.0,1.0],[0.0,0.5,0.0,1.0,1.0,0.5],[0.5,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.5,1.0,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.5,0.5,0.5,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.5,0.5,1.0,1.0]],[[0.0,0.0,0.0,0.5,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,1.0]],[[0.5,0.0,0.0,1.0,1.0,1.0],[0.0,0.5,0.0,0.5,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0],[0.5,0.5,0.0,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.9375,1.0]],[[0.0,0.0,0.0,1.0,0.125,1.0]],[[0.0,0.0,0.0,1.0,0.25,1.0]],[[0.0,0.0,0.0,1.0,0.375,1.0]],[[0.0,0.0,0.0,1.0,0.5,1.0]],[[0.0,0.0,0.0,1.0,0.625,1.0]],[[0.0,0.0,0.0,1.0,0.875,1.0]],[[0.0,0.0,0.0,1.0,1.0,1.0]],[[0.0,0.5,0.0,1.0,1.0,1.0]],[[0.0,0.0,0.0,1.0,0.8125,1.0],[0.25,0.8125,0.25,0.75,1.0,0.75]],[[0.0,0.0,0.0,1.0,0.8125,1.0]],[[0.0,0.0,0.0,1.0,0.125,1.0],[0.25,0.125,0.25,0.75,0.875,0.75]],[[0.0,0.0,0.0,1.0,0.5625,1.0]]],"blocks":{"minecraft:air":[0,0,0],"minecraft:stone":[1,1,0],"minecraft:granite":[2,2,0],"minecraft:polished_granite":[3,3,0],"minecraft:diorite":[4,4,0],"minecraft:polished_diorite":[5,5,0],"minecraft:andesite":[6,6,0],"minecraft:polished_andesite":[7,7,0],"minecraft:grass_block":[8,9,1],"minecraft:dirt":[10,10,0],"minecraft:coarse_dirt":[11,11,0],"minecraft:podzol":[12,13,1],"minecraft:cobblestone":[14,14,0],"minecraft:oak_planks":[15,15,0],"minecraft:spruce_planks":[16,16,0],"minecraft:birch_planks":[17,17,0],"minecraft:jungle_planks":[18,18,0],"minecraft:acacia_planks":[19,19,0],"minecraft:cherry_planks":[20,20,0],"minecraft:dark_oak_planks":[21,21,0],"minecraft:pale_oak_wood":[22,23,2],"minecraft:pale_oak_planks":[25,25,0],"minecraft:mangrove_planks":[26,26,0],"minecraft:bamboo_planks":[27,27,0],"minecraft:bamboo_mosaic":[28,28,0],"minecraft:oak_sapling":[29,29,3],"minecraft:spruce_sapling":[31,31,3],"minecraft:birch_sapling":[33,33,3],"minecraft:jungle_sapling":[35,35,3],"minecraft:acacia_sapling":[37,37,3],"minecraft:cherry_sapling":[39,39,3],"minecraft:dark_oak_sapling":[41,41,3],"minecraft:pale_oak_sapling":[43,43,3],"minecraft:mangrove_propagule":[45,50,4],"minecraft:bedrock":[85,85,0],"minecraft:water":[86,86,5],"minecraft:lava":[102,102,5],"minecraft:sand":[118,118,0],"minecraft:suspicious_sand":[119,119,6],"minecraft:red_sand":[123,123,0],"minecraft:gravel":[124,124,0],"minecraft:suspicious_gravel":[125,125,6],"minecraft:gold_ore":[129,129,0],"minecraft:deepslate_gold_ore":[130,130,0],"minecraft:iron_ore":[131,131,0],"minecraft:deepslate_iron_ore":[132,132,0],"minecraft:coal_ore":[133,133,0],"minecraft:deepslate_coal_ore":[134,134,0],"minecraft:nether_gold_ore":[135,135,0],"minecraft:oak_log":[136,137,2],"minecraft:spruce_log":[139,140,2],"minecraft:birch_log":[142,143,2],"minecraft:jungle_log":[145,146,2],"minecraft:acacia_log":[148,149,2],"minecraft:cherry_log":[151,152,2],"minecraft:dark_oak_log":[154,155,2],"minecraft:pale_oak_log":[157,158,2],"minecraft:mangrove_log":[160,161,2],"minecraft:mangrove_roots":[163,164,7],"minecraft:muddy_mangrove_roots":[165,166,2],"minecraft:bamboo_block":[168,169,2],"minecraft:stripped_spruce_log":[171,172,2],"minecraft:stripped_birch_log":[174,175,2],"minecraft:stripped_jungle_log":[177,178,2],"minecraft:stripped_acacia_log":[180,181,2],"minecraft:stripped_cherry_log":[183,184,2],"minecraft:stripped_dark_oak_log":[186,187,2],"minecraft:stripped_pale_oak_log":[189,190,2],"minecraft:stripped_oak_log":[192,193,2],"minecraft:stripped_mangrove_log":[195,196,2],"minecraft:stripped_bamboo_block":[198,199,2],"minecraft:oak_wood":[201,202,2],"minecraft:spruce_wood":[204,205,2],"minecraft:birch_wood":[207,208,2],"minecraft:jungle_wood":[210,211,2],"minecraft:acacia_wood":[213,214,2],"minecraft:cherry_wood":[216,217,2],"minecraft:dark_oak_wood":[219,220,2],"minecraft:mangrove_wood":[222,223,2],"minecraft:stripped_oak_wood":[225,226,2],"minecraft:stripped_spruce_wood":[228,229,2],"minecraft:stripped_birch_wood":[231,232,2],"minecraft:stripped_jungle_wood":[234,235,2],"minecraft:stripped_acacia_wood":[237,238,2],"minecraft:stripped_cherry_wood":[240,241,2],"minecraft:stripped_dark_oak_wood":[243,244,2],"minecraft:stripped_pale_oak_wood":[246,247,2],"minecraft:stripped_mangrove_wood":[249,250,2],"minecraft:oak_leaves":[252,279,8],"minecraft:spruce_leaves":[280,307,8],"minecraft:birch_leaves":[308,335,8],"minecraft:jungle_leaves":[336,363,8],"minecraft:acacia_leaves":[364,391,8],"minecraft:cherry_leaves":[392,419,8],"minecraft:dark_oak_leaves":[420,447,8],"minecraft:pale_oak_leaves":[448,475,8],"minecraft:mangrove_leaves":[476,503,8],"minecraft:azalea_leaves":[504,531,8],"minecraft:flowering_azalea_leaves":[532,559,8],"minecraft:sponge":[560,560,0],"minecraft:wet_sponge":[561,561,0],"minecraft:glass":[562,562,0],"minecraft:lapis_ore":[563,563,0],"minecraft:deepslate_lapis_ore":[564,564,0],"minecraft:lapis_block":[565,565,0],"minecraft:dispenser":[566,567,9],"minecraft:sandstone":[578,578,0],"minecraft:chiseled_sandstone":[579,579,0],"minecraft:cut_sandstone":[580,580,0],"minecraft:note_block":[581,582,10],"minecraft:white_bed":[1931,1934,11],"minecraft:orange_bed":[1947,1950,11],"minecraft:magenta_bed":[1963,1966,11],"minecraft:light_blue_bed":[1979,1982,11],"minecraft:yellow_bed":[1995,1998,11],"minecraft:lime_bed":[2011,2014,11],"minecraft:pink_bed":[2027,2030,11],"minecraft:gray_bed":[2043,2046,11],"minecraft:light_gray_bed":[2059,2062,11],"minecraft:cyan_bed":[2075,2078,11],"minecraft:purple_bed":[2091,2094,11],"minecraft:blue_bed":[2107,2110,11],"minecraft:brown_bed":[2123,2126,11],"minecraft:green_bed":[2139,2142,11],"minecraft:red_bed":[2155,2158,11],"minecraft:black_bed":[2171,2174,11],"minecraft:powered_rail":[2187,2200,12],"minecraft:detector_rail":[2211,2224,12],"minecraft:sticky_piston":[2235,2241,13],"minecraft:cobweb":[2247,2247,0],"minecraft:short_grass":[2248,2248,0],"minecraft:fern":[2249,2249,0],"minecraft:dead_bush":[2250,2250,0],"minecraft:bush":[2251,2251,0],"minecraft:short_dry_grass":[2252,2252,0],"minecraft:tall_dry_grass":[2253,2253,0],"minecraft:seagrass":[2254,2254,0],"minecraft:tall_seagrass":[2255,2256,14],"minecraft:piston":[2257,2263,13],"minecraft:piston_head":[2269,2271,15],"minecraft:white_wool":[2293,2293,0],"minecraft:orange_wool":[2294,2294,0],"minecraft:magenta_wool":[2295,2295,0],"minecraft:light_blue_wool":[2296,2296,0],"minecraft:yellow_wool":[2297,2297,0],"minecraft:lime_wool":[2298,2298,0],"minecraft:pink_wool":[2299,2299,0],"minecraft:gray_wool":[2300,2300,0],"minecraft:light_gray_wool":[2301,2301,0],"minecraft:cyan_wool":[2302,2302,0],"minecraft:purple_wool":[2303,2303,0],"minecraft:blue_wool":[2304,2304,0],"minecraft:brown_wool":[2305,2305,0],"minecraft:green_wool":[2306,2306,0],"minecraft:red_wool":[2307,2307,0],"minecraft:black_wool":[2308,2308,0],"minecraft:moving_piston":[2309,2309,16],"minecraft:dandelion":[2321,2321,0],"minecraft:golden_dandelion":[2322,2322,0],"minecraft:torchflower":[2323,2323,0],"minecraft:poppy":[2324,2324,0],"minecraft:blue_orchid":[2325,2325,0],"minecraft:allium":[2326,2326,0],"minecraft:azure_bluet":[2327,2327,0],"minecraft:red_tulip":[2328,2328,0],"minecraft:orange_tulip":[2329,2329,0],"minecraft:white_tulip":[2330,2330,0],"minecraft:pink_tulip":[2331,2331,0],"minecraft:oxeye_daisy":[2332,2332,0],"minecraft:cornflower":[2333,2333,0],"minecraft:wither_rose":[2334,2334,0],"minecraft:lily_of_the_valley":[2335,2335,0],"minecraft:brown_mushroom":[2336,2336,0],"minecraft:red_mushroom":[2337,2337,0],"minecraft:gold_block":[2338,2338,0],"minecraft:iron_block":[2339,2339,0],"minecraft:bricks":[2340,2340,0],"minecraft:tnt":[2341,2342,17],"minecraft:bookshelf":[2343,2343,0],"minecraft:chiseled_bookshelf":[2344,2407,18],"minecraft:acacia_shelf":[2600,2609,19],"minecraft:bamboo_shelf":[2664,2673,19],"minecraft:birch_shelf":[2728,2737,19],"minecraft:cherry_shelf":[2792,2801,19],"minecraft:crimson_shelf":[2856,2865,19],"minecraft:dark_oak_shelf":[2920,2929,19],"minecraft:jungle_shelf":[2984,2993,19],"minecraft:mangrove_shelf":[3048,3057,19],"minecraft:oak_shelf":[3112,3121,19],"minecraft:pale_oak_shelf":[3176,3185,19],"minecraft:spruce_shelf":[3240,3249,19],"minecraft:warped_shelf":[3304,3313,19],"minecraft:mossy_cobblestone":[3368,3368,0],"minecraft:obsidian":[3369,3369,0],"minecraft:torch":[3370,3370,0],"minecraft:wall_torch":[3371,3371,20],"minecraft:fire":[3375,3406,21],"minecraft:soul_fire":[3887,3887,0],"minecraft:spawner":[3888,3888,0],"minecraft:creaking_heart":[3889,3896,22],"minecraft:oak_stairs":[3907,3918,23],"minecraft:chest":[3987,3988,24],"minecraft:redstone_wire":[4011,5171,25],"minecraft:diamond_ore":[5307,5307,0],"minecraft:deepslate_diamond_ore":[5308,5308,0],"minecraft:diamond_block":[5309,5309,0],"minecraft:crafting_table":[5310,5310,0],"minecraft:wheat":[5311,5311,26],"minecraft:farmland":[5319,5319,27],"minecraft:furnace":[5327,5328,28],"minecraft:oak_sign":[5335,5352,29],"minecraft:spruce_sign":[5367,5384,29],"minecraft:birch_sign":[5399,5416,29],"minecraft:acacia_sign":[5431,5448,29],"minecraft:cherry_sign":[5463,5480,29],"minecraft:jungle_sign":[5495,5512,29],"minecraft:dark_oak_sign":[5527,5544,29],"minecraft:pale_oak_sign":[5559,5576,29],"minecraft:mangrove_sign":[5591,5608,29],"minecraft:bamboo_sign":[5623,5640,29],"minecraft:oak_door":[5655,5666,30],"minecraft:ladder":[5719,5720,31],"minecraft:rail":[5727,5728,32],"minecraft:cobblestone_stairs":[5747,5758,23],"minecraft:oak_wall_sign":[5827,5828,31],"minecraft:spruce_wall_sign":[5835,5836,31],"minecraft:birch_wall_sign":[5843,5844,31],"minecraft:acacia_wall_sign":[5851,5852,31],"minecraft:cherry_wall_sign":[5859,5860,31],"minecraft:jungle_wall_sign":[5867,5868,31],"minecraft:dark_oak_wall_sign":[5875,5876,31],"minecraft:pale_oak_wall_sign":[5883,5884,31],"minecraft:mangrove_wall_sign":[5891,5892,31],"minecraft:bamboo_wall_sign":[5899,5900,31],"minecraft:oak_hanging_sign":[5907,5956,33],"minecraft:spruce_hanging_sign":[5971,6020,33],"minecraft:birch_hanging_sign":[6035,6084,33],"minecraft:acacia_hanging_sign":[6099,6148,33],"minecraft:cherry_hanging_sign":[6163,6212,33],"minecraft:jungle_hanging_sign":[6227,6276,33],"minecraft:dark_oak_hanging_sign":[6291,6340,33],"minecraft:pale_oak_hanging_sign":[6355,6404,33],"minecraft:crimson_hanging_sign":[6419,6468,33],"minecraft:warped_hanging_sign":[6483,6532,33],"minecraft:mangrove_hanging_sign":[6547,6596,33],"minecraft:bamboo_hanging_sign":[6611,6660,33],"minecraft:oak_wall_hanging_sign":[6675,6676,31],"minecraft:spruce_wall_hanging_sign":[6683,6684,31],"minecraft:birch_wall_hanging_sign":[6691,6692,31],"minecraft:acacia_wall_hanging_sign":[6699,6700,31],"minecraft:cherry_wall_hanging_sign":[6707,6708,31],"minecraft:jungle_wall_hanging_sign":[6715,6716,31],"minecraft:dark_oak_wall_hanging_sign":[6723,6724,31],"minecraft:pale_oak_wall_hanging_sign":[6731,6732,31],"minecraft:mangrove_wall_hanging_sign":[6739,6740,31],"minecraft:crimson_wall_hanging_sign":[6747,6748,31],"minecraft:warped_wall_hanging_sign":[6755,6756,31],"minecraft:bamboo_wall_hanging_sign":[6763,6764,31],"minecraft:lever":[6771,6780,34],"minecraft:stone_pressure_plate":[6795,6796,35],"minecraft:iron_door":[6797,6808,30],"minecraft:oak_pressure_plate":[6861,6862,35],"minecraft:spruce_pressure_plate":[6863,6864,35],"minecraft:birch_pressure_plate":[6865,6866,35],"minecraft:jungle_pressure_plate":[6867,6868,35],"minecraft:acacia_pressure_plate":[6869,6870,35],"minecraft:cherry_pressure_plate":[6871,6872,35],"minecraft:dark_oak_pressure_plate":[6873,6874,35],"minecraft:pale_oak_pressure_plate":[6875,6876,35],"minecraft:mangrove_pressure_plate":[6877,6878,35],"minecraft:bamboo_pressure_plate":[6879,6880,35],"minecraft:redstone_ore":[6881,6882,36],"minecraft:deepslate_redstone_ore":[6883,6884,36],"minecraft:redstone_torch":[6885,6885,36],"minecraft:redstone_wall_torch":[6887,6887,28],"minecraft:stone_button":[6895,6904,34],"minecraft:snow":[6919,6919,37],"minecraft:ice":[6927,6927,0],"minecraft:snow_block":[6928,6928,0],"minecraft:cactus":[6929,6929,38],"minecraft:cactus_flower":[6945,6945,0],"minecraft:clay":[6946,6946,0],"minecraft:sugar_cane":[6947,6947,38],"minecraft:jukebox":[6963,6964,39],"minecraft:oak_fence":[6965,6996,40],"minecraft:netherrack":[6997,6997,0],"minecraft:soul_sand":[6998,6998,0],"minecraft:soul_soil":[6999,6999,0],"minecraft:basalt":[7000,7001,2],"minecraft:polished_basalt":[7003,7004,2],"minecraft:soul_torch":[7006,7006,0],"minecraft:soul_wall_torch":[7007,7007,20],"minecraft:copper_torch":[7011,7011,0],"minecraft:copper_wall_torch":[7012,7012,20],"minecraft:glowstone":[7016,7016,0],"minecraft:nether_portal":[7017,7017,41],"minecraft:carved_pumpkin":[7019,7019,20],"minecraft:jack_o_lantern":[7023,7023,20],"minecraft:cake":[7027,7027,42],"minecraft:repeater":[7034,7037,43],"minecraft:white_stained_glass":[7098,7098,0],"minecraft:orange_stained_glass":[7099,7099,0],"minecraft:magenta_stained_glass":[7100,7100,0],"minecraft:light_blue_stained_glass":[7101,7101,0],"minecraft:yellow_stained_glass":[7102,7102,0],"minecraft:lime_stained_glass":[7103,7103,0],"minecraft:pink_stained_glass":[7104,7104,0],"minecraft:gray_stained_glass":[7105,7105,0],"minecraft:light_gray_stained_glass":[7106,7106,0],"minecraft:cyan_stained_glass":[7107,7107,0],"minecraft:purple_stained_glass":[7108,7108,0],"minecraft:blue_stained_glass":[7109,7109,0],"minecraft:brown_stained_glass":[7110,7110,0],"minecraft:green_stained_glass":[7111,7111,0],"minecraft:red_stained_glass":[7112,7112,0],"minecraft:black_stained_glass":[7113,7113,0],"minecraft:oak_trapdoor":[7114,7129,44],"minecraft:spruce_trapdoor":[7178,7193,44],"minecraft:birch_trapdoor":[7242,7257,44],"minecraft:jungle_trapdoor":[7306,7321,44],"minecraft:acacia_trapdoor":[7370,7385,44],"minecraft:cherry_trapdoor":[7434,7449,44],"minecraft:dark_oak_trapdoor":[7498,7513,44],"minecraft:pale_oak_trapdoor":[7562,7577,44],"minecraft:mangrove_trapdoor":[7626,7641,44],"minecraft:bamboo_trapdoor":[7690,7705,44],"minecraft:stone_bricks":[7754,7754,0],"minecraft:mossy_stone_bricks":[7755,7755,0],"minecraft:cracked_stone_bricks":[7756,7756,0],"minecraft:chiseled_stone_bricks":[7757,7757,0],"minecraft:packed_mud":[7758,7758,0],"minecraft:mud_bricks":[7759,7759,0],"minecraft:infested_stone":[7760,7760,0],"minecraft:infested_cobblestone":[7761,7761,0],"minecraft:infested_stone_bricks":[7762,7762,0],"minecraft:infested_mossy_stone_bricks":[7763,7763,0],"minecraft:infested_cracked_stone_bricks":[7764,7764,0],"minecraft:infested_chiseled_stone_bricks":[7765,7765,0],"minecraft:brown_mushroom_block":[7766,7766,45],"minecraft:red_mushroom_block":[7830,7830,45],"minecraft:mushroom_stem":[7894,7894,45],"minecraft:iron_bars":[7958,7989,40],"minecraft:copper_bars":[7990,8021,40],"minecraft:exposed_copper_bars":[8022,8053,40],"minecraft:weathered_copper_bars":[8054,8085,40],"minecraft:oxidized_copper_bars":[8086,8117,40],"minecraft:waxed_copper_bars":[8118,8149,40],"minecraft:waxed_exposed_copper_bars":[8150,8181,40],"minecraft:waxed_weathered_copper_bars":[8182,8213,40],"minecraft:waxed_oxidized_copper_bars":[8214,8245,40],"minecraft:iron_chain":[8246,8249,46],"minecraft:copper_chain":[8252,8255,46],"minecraft:exposed_copper_chain":[8258,8261,46],"minecraft:weathered_copper_chain":[8264,8267,46],"minecraft:oxidized_copper_chain":[8270,8273,46],"minecraft:waxed_copper_chain":[8276,8279,46],"minecraft:waxed_exposed_copper_chain":[8282,8285,46],"minecraft:waxed_weathered_copper_chain":[8288,8291,46],"minecraft:waxed_oxidized_copper_chain":[8294,8297,46],"minecraft:glass_pane":[8300,8331,40],"minecraft:pumpkin":[8332,8332,0],"minecraft:melon":[8333,8333,0],"minecraft:attached_pumpkin_stem":[8334,8334,20],"minecraft:attached_melon_stem":[8338,8338,20],"minecraft:pumpkin_stem":[8342,8342,26],"minecraft:melon_stem":[8350,8350,26],"minecraft:vine":[8358,8389,47],"minecraft:glow_lichen":[8390,8517,48],"minecraft:resin_clump":[8518,8645,48],"minecraft:oak_fence_gate":[8646,8653,49],"minecraft:brick_stairs":[8678,8689,23],"minecraft:stone_brick_stairs":[8758,8769,23],"minecraft:mud_brick_stairs":[8838,8849,23],"minecraft:mycelium":[8918,8919,1],"minecraft:lily_pad":[8920,8920,0],"minecraft:resin_block":[8921,8921,0],"minecraft:resin_bricks":[8922,8922,0],"minecraft:resin_brick_stairs":[8923,8934,23],"minecraft:resin_brick_slab":[9003,9006,50],"minecraft:resin_brick_wall":[9009,9012,51],"minecraft:chiseled_resin_bricks":[9333,9333,0],"minecraft:nether_bricks":[9334,9334,0],"minecraft:nether_brick_fence":[9335,9366,40],"minecraft:nether_brick_stairs":[9367,9378,23],"minecraft:nether_wart":[9447,9447,52],"minecraft:enchanting_table":[9451,9451,0],"minecraft:brewing_stand":[9452,9459,53],"minecraft:cauldron":[9460,9460,0],"minecraft:water_cauldron":[9461,9461,54],"minecraft:lava_cauldron":[9464,9464,0],"minecraft:powder_snow_cauldron":[9465,9465,54],"minecraft:end_portal":[9468,9468,0],"minecraft:end_portal_frame":[9469,9473,55],"minecraft:end_stone":[9477,9477,0],"minecraft:dragon_egg":[9478,9478,0],"minecraft:redstone_lamp":[9479,9480,36],"minecraft:cocoa":[9481,9481,56],"minecraft:sandstone_stairs":[9493,9504,23],"minecraft:emerald_ore":[9573,9573,0],"minecraft:deepslate_emerald_ore":[9574,9574,0],"minecraft:ender_chest":[9575,9576,31],"minecraft:tripwire_hook":[9583,9592,57],"minecraft:tripwire":[9599,9726,58],"minecraft:emerald_block":[9727,9727,0],"minecraft:spruce_stairs":[9728,9739,23],"minecraft:birch_stairs":[9808,9819,23],"minecraft:jungle_stairs":[9888,9899,23],"minecraft:command_block":[9968,9974,59],"minecraft:beacon":[9980,9980,0],"minecraft:cobblestone_wall":[9981,9984,51],"minecraft:mossy_cobblestone_wall":[10305,10308,51],"minecraft:flower_pot":[10629,10629,0],"minecraft:potted_torchflower":[10630,10630,0],"minecraft:potted_oak_sapling":[10631,10631,0],"minecraft:potted_spruce_sapling":[10632,10632,0],"minecraft:potted_birch_sapling":[10633,10633,0],"minecraft:potted_jungle_sapling":[10634,10634,0],"minecraft:potted_acacia_sapling":[10635,10635,0],"minecraft:potted_cherry_sapling":[10636,10636,0],"minecraft:potted_dark_oak_sapling":[10637,10637,0],"minecraft:potted_pale_oak_sapling":[10638,10638,0],"minecraft:potted_mangrove_propagule":[10639,10639,0],"minecraft:potted_fern":[10640,10640,0],"minecraft:potted_dandelion":[10641,10641,0],"minecraft:potted_golden_dandelion":[10642,10642,0],"minecraft:potted_poppy":[10643,10643,0],"minecraft:potted_blue_orchid":[10644,10644,0],"minecraft:potted_allium":[10645,10645,0],"minecraft:potted_azure_bluet":[10646,10646,0],"minecraft:potted_red_tulip":[10647,10647,0],"minecraft:potted_orange_tulip":[10648,10648,0],"minecraft:potted_white_tulip":[10649,10649,0],"minecraft:potted_pink_tulip":[10650,10650,0],"minecraft:potted_oxeye_daisy":[10651,10651,0],"minecraft:potted_cornflower":[10652,10652,0],"minecraft:potted_lily_of_the_valley":[10653,10653,0],"minecraft:potted_wither_rose":[10654,10654,0],"minecraft:potted_red_mushroom":[10655,10655,0],"minecraft:potted_brown_mushroom":[10656,10656,0],"minecraft:potted_dead_bush":[10657,10657,0],"minecraft:potted_cactus":[10658,10658,0],"minecraft:carrots":[10659,10659,26],"minecraft:potatoes":[10667,10667,26],"minecraft:oak_button":[10675,10684,34],"minecraft:spruce_button":[10699,10708,34],"minecraft:birch_button":[10723,10732,34],"minecraft:jungle_button":[10747,10756,34],"minecraft:acacia_button":[10771,10780,34],"minecraft:cherry_button":[10795,10804,34],"minecraft:dark_oak_button":[10819,10828,34],"minecraft:pale_oak_button":[10843,10852,34],"minecraft:mangrove_button":[10867,10876,34],"minecraft:bamboo_button":[10891,10900,34],"minecraft:skeleton_skull":[10915,10931,60],"minecraft:skeleton_wall_skull":[10947,10948,61],"minecraft:wither_skeleton_skull":[10955,10971,60],"minecraft:wither_skeleton_wall_skull":[10987,10988,61],"minecraft:zombie_head":[10995,11011,60],"minecraft:zombie_wall_head":[11027,11028,61],"minecraft:player_head":[11035,11051,60],"minecraft:player_wall_head":[11067,11068,61],"minecraft:creeper_head":[11075,11091,60],"minecraft:creeper_wall_head":[11107,11108,61],"minecraft:dragon_head":[11115,11131,60],"minecraft:dragon_wall_head":[11147,11148,61],"minecraft:piglin_head":[11155,11171,60],"minecraft:piglin_wall_head":[11187,11188,61],"minecraft:anvil":[11195,11195,20],"minecraft:chipped_anvil":[11199,11199,20],"minecraft:damaged_anvil":[11203,11203,20],"minecraft:trapped_chest":[11207,11208,24],"minecraft:light_weighted_pressure_plate":[11231,11231,62],"minecraft:heavy_weighted_pressure_plate":[11247,11247,62],"minecraft:comparator":[11263,11264,63],"minecraft:daylight_detector":[11279,11295,64],"minecraft:redstone_block":[11311,11311,0],"minecraft:nether_quartz_ore":[11312,11312,0],"minecraft:hopper":[11313,11313,65],"minecraft:quartz_block":[11323,11323,0],"minecraft:chiseled_quartz_block":[11324,11324,0],"minecraft:quartz_pillar":[11325,11326,2],"minecraft:quartz_stairs":[11328,11339,23],"minecraft:activator_rail":[11408,11421,12],"minecraft:dropper":[11432,11433,9],"minecraft:white_terracotta":[11444,11444,0],"minecraft:orange_terracotta":[11445,11445,0],"minecraft:magenta_terracotta":[11446,11446,0],"minecraft:light_blue_terracotta":[11447,11447,0],"minecraft:yellow_terracotta":[11448,11448,0],"minecraft:lime_terracotta":[11449,11449,0],"minecraft:pink_terracotta":[11450,11450,0],"minecraft:gray_terracotta":[11451,11451,0],"minecraft:light_gray_terracotta":[11452,11452,0],"minecraft:cyan_terracotta":[11453,11453,0],"minecraft:purple_terracotta":[11454,11454,0],"minecraft:blue_terracotta":[11455,11455,0],"minecraft:brown_terracotta":[11456,11456,0],"minecraft:green_terracotta":[11457,11457,0],"minecraft:red_terracotta":[11458,11458,0],"minecraft:black_terracotta":[11459,11459,0],"minecraft:white_stained_glass_pane":[11460,11491,40],"minecraft:orange_stained_glass_pane":[11492,11523,40],"minecraft:magenta_stained_glass_pane":[11524,11555,40],"minecraft:light_blue_stained_glass_pane":[11556,11587,40],"minecraft:yellow_stained_glass_pane":[11588,11619,40],"minecraft:lime_stained_glass_pane":[11620,11651,40],"minecraft:pink_stained_glass_pane":[11652,11683,40],"minecraft:gray_stained_glass_pane":[11684,11715,40],"minecraft:light_gray_stained_glass_pane":[11716,11747,40],"minecraft:cyan_stained_glass_pane":[11748,11779,40],"minecraft:purple_stained_glass_pane":[11780,11811,40],"minecraft:blue_stained_glass_pane":[11812,11843,40],"minecraft:brown_stained_glass_pane":[11844,11875,40],"minecraft:green_stained_glass_pane":[11876,11907,40],"minecraft:red_stained_glass_pane":[11908,11939,40],"minecraft:black_stained_glass_pane":[11940,11971,40],"minecraft:acacia_stairs":[11972,11983,23],"minecraft:cherry_stairs":[12052,12063,23],"minecraft:dark_oak_stairs":[12132,12143,23],"minecraft:pale_oak_stairs":[12212,12223,23],"minecraft:mangrove_stairs":[12292,12303,23],"minecraft:bamboo_stairs":[12372,12383,23],"minecraft:bamboo_mosaic_stairs":[12452,12463,23],"minecraft:slime_block":[12532,12532,0],"minecraft:barrier":[12533,12534,7],"minecraft:light":[12535,12566,66],"minecraft:iron_trapdoor":[12567,12582,44],"minecraft:prismarine":[12631,12631,0],"minecraft:prismarine_bricks":[12632,12632,0],"minecraft:dark_prismarine":[12633,12633,0],"minecraft:prismarine_stairs":[12634,12645,23],"minecraft:prismarine_brick_stairs":[12714,12725,23],"minecraft:dark_prismarine_stairs":[12794,12805,23],"minecraft:prismarine_slab":[12874,12877,50],"minecraft:prismarine_brick_slab":[12880,12883,50],"minecraft:dark_prismarine_slab":[12886,12889,50],"minecraft:sea_lantern":[12892,12892,0],"minecraft:hay_block":[12893,12894,2],"minecraft:white_carpet":[12896,12896,0],"minecraft:orange_carpet":[12897,12897,0],"minecraft:magenta_carpet":[12898,12898,0],"minecraft:light_blue_carpet":[12899,12899,0],"minecraft:yellow_carpet":[12900,12900,0],"minecraft:lime_carpet":[12901,12901,0],"minecraft:pink_carpet":[12902,12902,0],"minecraft:gray_carpet":[12903,12903,0],"minecraft:light_gray_carpet":[12904,12904,0],"minecraft:cyan_carpet":[12905,12905,0],"minecraft:purple_carpet":[12906,12906,0],"minecraft:blue_carpet":[12907,12907,0],"minecraft:brown_carpet":[12908,12908,0],"minecraft:green_carpet":[12909,12909,0],"minecraft:red_carpet":[12910,12910,0],"minecraft:black_carpet":[12911,12911,0],"minecraft:terracotta":[12912,12912,0],"minecraft:coal_block":[12913,12913,0],"minecraft:packed_ice":[12914,12914,0],"minecraft:sunflower":[12915,12916,14],"minecraft:lilac":[12917,12918,14],"minecraft:rose_bush":[12919,12920,14],"minecraft:peony":[12921,12922,14],"minecraft:tall_grass":[12923,12924,14],"minecraft:large_fern":[12925,12926,14],"minecraft:white_banner":[12927,12935,67],"minecraft:orange_banner":[12943,12951,67],"minecraft:magenta_banner":[12959,12967,67],"minecraft:light_blue_banner":[12975,12983,67],"minecraft:yellow_banner":[12991,12999,67],"minecraft:lime_banner":[13007,13015,67],"minecraft:pink_banner":[13023,13031,67],"minecraft:gray_banner":[13039,13047,67],"minecraft:light_gray_banner":[13055,13063,67],"minecraft:cyan_banner":[13071,13079,67],"minecraft:purple_banner":[13087,13095,67],"minecraft:blue_banner":[13103,13111,67],"minecraft:brown_banner":[13119,13127,67],"minecraft:green_banner":[13135,13143,67],"minecraft:red_banner":[13151,13159,67],"minecraft:black_banner":[13167,13175,67],"minecraft:white_wall_banner":[13183,13183,20],"minecraft:orange_wall_banner":[13187,13187,20],"minecraft:magenta_wall_banner":[13191,13191,20],"minecraft:light_blue_wall_banner":[13195,13195,20],"minecraft:yellow_wall_banner":[13199,13199,20],"minecraft:lime_wall_banner":[13203,13203,20],"minecraft:pink_wall_banner":[13207,13207,20],"minecraft:gray_wall_banner":[13211,13211,20],"minecraft:light_gray_wall_banner":[13215,13215,20],"minecraft:cyan_wall_banner":[13219,13219,20],"minecraft:purple_wall_banner":[13223,13223,20],"minecraft:blue_wall_banner":[13227,13227,20],"minecraft:brown_wall_banner":[13231,13231,20],"minecraft:green_wall_banner":[13235,13235,20],"minecraft:red_wall_banner":[13239,13239,20],"minecraft:black_wall_banner":[13243,13243,20],"minecraft:red_sandstone":[13247,13247,0],"minecraft:chiseled_red_sandstone":[13248,13248,0],"minecraft:cut_red_sandstone":[13249,13249,0],"minecraft:red_sandstone_stairs":[13250,13261,23],"minecraft:oak_slab":[13330,13333,50],"minecraft:spruce_slab":[13336,13339,50],"minecraft:birch_slab":[13342,13345,50],"minecraft:jungle_slab":[13348,13351,50],"minecraft:acacia_slab":[13354,13357,50],"minecraft:cherry_slab":[13360,13363,50],"minecraft:dark_oak_slab":[13366,13369,50],"minecraft:pale_oak_slab":[13372,13375,50],"minecraft:mangrove_slab":[13378,13381,50],"minecraft:bamboo_slab":[13384,13387,50],"minecraft:bamboo_mosaic_slab":[13390,13393,50],"minecraft:stone_slab":[13396,13399,50],"minecraft:smooth_stone_slab":[13402,13405,50],"minecraft:sandstone_slab":[13408,13411,50],"minecraft:cut_sandstone_slab":[13414,13417,50],"minecraft:petrified_oak_slab":[13420,13423,50],"minecraft:cobblestone_slab":[13426,13429,50],"minecraft:brick_slab":[13432,13435,50],"minecraft:stone_brick_slab":[13438,13441,50],"minecraft:mud_brick_slab":[13444,13447,50],"minecraft:nether_brick_slab":[13450,13453,50],"minecraft:quartz_slab":[13456,13459,50],"minecraft:red_sandstone_slab":[13462,13465,50],"minecraft:cut_red_sandstone_slab":[13468,13471,50],"minecraft:purpur_slab":[13474,13477,50],"minecraft:smooth_stone":[13480,13480,0],"minecraft:smooth_sandstone":[13481,13481,0],"minecraft:smooth_quartz":[13482,13482,0],"minecraft:smooth_red_sandstone":[13483,13483,0],"minecraft:spruce_fence_gate":[13484,13491,49],"minecraft:birch_fence_gate":[13516,13523,49],"minecraft:jungle_fence_gate":[13548,13555,49],"minecraft:acacia_fence_gate":[13580,13587,49],"minecraft:cherry_fence_gate":[13612,13619,49],"minecraft:dark_oak_fence_gate":[13644,13651,49],"minecraft:pale_oak_fence_gate":[13676,13683,49],"minecraft:mangrove_fence_gate":[13708,13715,49],"minecraft:bamboo_fence_gate":[13740,13747,49],"minecraft:spruce_fence":[13772,13803,40],"minecraft:birch_fence":[13804,13835,40],"minecraft:jungle_fence":[13836,13867,40],"minecraft:acacia_fence":[13868,13899,40],"minecraft:cherry_fence":[13900,13931,40],"minecraft:dark_oak_fence":[13932,13963,40],"minecraft:pale_oak_fence":[13964,13995,40],"minecraft:mangrove_fence":[13996,14027,40],"minecraft:bamboo_fence":[14028,14059,40],"minecraft:spruce_door":[14060,14071,30],"minecraft:birch_door":[14124,14135,30],"minecraft:jungle_door":[14188,14199,30],"minecraft:acacia_door":[14252,14263,30],"minecraft:cherry_door":[14316,14327,30],"minecraft:dark_oak_door":[14380,14391,30],"minecraft:pale_oak_door":[14444,14455,30],"minecraft:mangrove_door":[14508,14519,30],"minecraft:bamboo_door":[14572,14583,30],"minecraft:end_rod":[14636,14640,68],"minecraft:chorus_plant":[14642,14705,45],"minecraft:chorus_flower":[14706,14706,69],"minecraft:purpur_block":[14712,14712,0],"minecraft:purpur_pillar":[14713,14714,2],"minecraft:purpur_stairs":[14716,14727,23],"minecraft:end_stone_bricks":[14796,14796,0],"minecraft:torchflower_crop":[14797,14797,70],"minecraft:pitcher_crop":[14799,14800,71],"minecraft:pitcher_plant":[14809,14810,14],"minecraft:beetroots":[14811,14811,52],"minecraft:dirt_path":[14815,14815,0],"minecraft:end_gateway":[14816,14816,0],"minecraft:repeating_command_block":[14817,14823,59],"minecraft:chain_command_block":[14829,14835,59],"minecraft:frosted_ice":[14841,14841,52],"minecraft:magma_block":[14845,14845,0],"minecraft:nether_wart_block":[14846,14846,0],"minecraft:red_nether_bricks":[14847,14847,0],"minecraft:bone_block":[14848,14849,2],"minecraft:structure_void":[14851,14851,0],"minecraft:observer":[14852,14857,72],"minecraft:shulker_box":[14864,14868,68],"minecraft:white_shulker_box":[14870,14874,68],"minecraft:orange_shulker_box":[14876,14880,68],"minecraft:magenta_shulker_box":[14882,14886,68],"minecraft:light_blue_shulker_box":[14888,14892,68],"minecraft:yellow_shulker_box":[14894,14898,68],"minecraft:lime_shulker_box":[14900,14904,68],"minecraft:pink_shulker_box":[14906,14910,68],"minecraft:gray_shulker_box":[14912,14916,68],"minecraft:light_gray_shulker_box":[14918,14922,68],"minecraft:cyan_shulker_box":[14924,14928,68],"minecraft:purple_shulker_box":[14930,14934,68],"minecraft:blue_shulker_box":[14936,14940,68],"minecraft:brown_shulker_box":[14942,14946,68],"minecraft:green_shulker_box":[14948,14952,68],"minecraft:red_shulker_box":[14954,14958,68],"minecraft:black_shulker_box":[14960,14964,68],"minecraft:white_glazed_terracotta":[14966,14966,20],"minecraft:orange_glazed_terracotta":[14970,14970,20],"minecraft:magenta_glazed_terracotta":[14974,14974,20],"minecraft:light_blue_glazed_terracotta":[14978,14978,20],"minecraft:yellow_glazed_terracotta":[14982,14982,20],"minecraft:lime_glazed_terracotta":[14986,14986,20],"minecraft:pink_glazed_terracotta":[14990,14990,20],"minecraft:gray_glazed_terracotta":[14994,14994,20],"minecraft:light_gray_glazed_terracotta":[14998,14998,20],"minecraft:cyan_glazed_terracotta":[15002,15002,20],"minecraft:purple_glazed_terracotta":[15006,15006,20],"minecraft:blue_glazed_terracotta":[15010,15010,20],"minecraft:brown_glazed_terracotta":[15014,15014,20],"minecraft:green_glazed_terracotta":[15018,15018,20],"minecraft:red_glazed_terracotta":[15022,15022,20],"minecraft:black_glazed_terracotta":[15026,15026,20],"minecraft:white_concrete":[15030,15030,0],"minecraft:orange_concrete":[15031,15031,0],"minecraft:magenta_concrete":[15032,15032,0],"minecraft:light_blue_concrete":[15033,15033,0],"minecraft:yellow_concrete":[15034,15034,0],"minecraft:lime_concrete":[15035,15035,0],"minecraft:pink_concrete":[15036,15036,0],"minecraft:gray_concrete":[15037,15037,0],"minecraft:light_gray_concrete":[15038,15038,0],"minecraft:cyan_concrete":[15039,15039,0],"minecraft:purple_concrete":[15040,15040,0],"minecraft:blue_concrete":[15041,15041,0],"minecraft:brown_concrete":[15042,15042,0],"minecraft:green_concrete":[15043,15043,0],"minecraft:red_concrete":[15044,15044,0],"minecraft:black_concrete":[15045,15045,0],"minecraft:white_concrete_powder":[15046,15046,0],"minecraft:orange_concrete_powder":[15047,15047,0],"minecraft:magenta_concrete_powder":[15048,15048,0],"minecraft:light_blue_concrete_powder":[15049,15049,0],"minecraft:yellow_concrete_powder":[15050,15050,0],"minecraft:lime_concrete_powder":[15051,15051,0],"minecraft:pink_concrete_powder":[15052,15052,0],"minecraft:gray_concrete_powder":[15053,15053,0],"minecraft:light_gray_concrete_powder":[15054,15054,0],"minecraft:cyan_concrete_powder":[15055,15055,0],"minecraft:purple_concrete_powder":[15056,15056,0],"minecraft:blue_concrete_powder":[15057,15057,0],"minecraft:brown_concrete_powder":[15058,15058,0],"minecraft:green_concrete_powder":[15059,15059,0],"minecraft:red_concrete_powder":[15060,15060,0],"minecraft:black_concrete_powder":[15061,15061,0],"minecraft:kelp":[15062,15062,73],"minecraft:kelp_plant":[15088,15088,0],"minecraft:dried_kelp_block":[15089,15089,0],"minecraft:turtle_egg":[15090,15090,74],"minecraft:sniffer_egg":[15102,15102,75],"minecraft:dried_ghast":[15105,15106,76],"minecraft:dead_tube_coral_block":[15137,15137,0],"minecraft:dead_brain_coral_block":[15138,15138,0],"minecraft:dead_bubble_coral_block":[15139,15139,0],"minecraft:dead_fire_coral_block":[15140,15140,0],"minecraft:dead_horn_coral_block":[15141,15141,0],"minecraft:tube_coral_block":[15142,15142,0],"minecraft:brain_coral_block":[15143,15143,0],"minecraft:bubble_coral_block":[15144,15144,0],"minecraft:fire_coral_block":[15145,15145,0],"minecraft:horn_coral_block":[15146,15146,0],"minecraft:dead_tube_coral":[15147,15147,7],"minecraft:dead_brain_coral":[15149,15149,7],"minecraft:dead_bubble_coral":[15151,15151,7],"minecraft:dead_fire_coral":[15153,15153,7],"minecraft:dead_horn_coral":[15155,15155,7],"minecraft:tube_coral":[15157,15157,7],"minecraft:brain_coral":[15159,15159,7],"minecraft:bubble_coral":[15161,15161,7],"minecraft:fire_coral":[15163,15163,7],"minecraft:horn_coral":[15165,15165,7],"minecraft:dead_tube_coral_fan":[15167,15167,7],"minecraft:dead_brain_coral_fan":[15169,15169,7],"minecraft:dead_bubble_coral_fan":[15171,15171,7],"minecraft:dead_fire_coral_fan":[15173,15173,7],"minecraft:dead_horn_coral_fan":[15175,15175,7],"minecraft:tube_coral_fan":[15177,15177,7],"minecraft:brain_coral_fan":[15179,15179,7],"minecraft:bubble_coral_fan":[15181,15181,7],"minecraft:fire_coral_fan":[15183,15183,7],"minecraft:horn_coral_fan":[15185,15185,7],"minecraft:dead_tube_coral_wall_fan":[15187,15187,31],"minecraft:dead_brain_coral_wall_fan":[15195,15195,31],"minecraft:dead_bubble_coral_wall_fan":[15203,15203,31],"minecraft:dead_fire_coral_wall_fan":[15211,15211,31],"minecraft:dead_horn_coral_wall_fan":[15219,15219,31],"minecraft:tube_coral_wall_fan":[15227,15227,31],"minecraft:brain_coral_wall_fan":[15235,15235,31],"minecraft:bubble_coral_wall_fan":[15243,15243,31],"minecraft:fire_coral_wall_fan":[15251,15251,31],"minecraft:horn_coral_wall_fan":[15259,15259,31],"minecraft:sea_pickle":[15267,15267,77],"minecraft:blue_ice":[15275,15275,0],"minecraft:conduit":[15276,15276,7],"minecraft:bamboo_sapling":[15278,15278,0],"minecraft:bamboo":[15279,15279,78],"minecraft:potted_bamboo":[15291,15291,0],"minecraft:void_air":[15292,15292,0],"minecraft:cave_air":[15293,15293,0],"minecraft:bubble_column":[15294,15294,79],"minecraft:polished_granite_stairs":[15296,15307,23],"minecraft:smooth_red_sandstone_stairs":[15376,15387,23],"minecraft:mossy_stone_brick_stairs":[15456,15467,23],"minecraft:polished_diorite_stairs":[15536,15547,23],"minecraft:mossy_cobblestone_stairs":[15616,15627,23],"minecraft:end_stone_brick_stairs":[15696,15707,23],"minecraft:stone_stairs":[15776,15787,23],"minecraft:smooth_sandstone_stairs":[15856,15867,23],"minecraft:smooth_quartz_stairs":[15936,15947,23],"minecraft:granite_stairs":[16016,16027,23],"minecraft:andesite_stairs":[16096,16107,23],"minecraft:red_nether_brick_stairs":[16176,16187,23],"minecraft:polished_andesite_stairs":[16256,16267,23],"minecraft:diorite_stairs":[16336,16347,23],"minecraft:polished_granite_slab":[16416,16419,50],"minecraft:smooth_red_sandstone_slab":[16422,16425,50],"minecraft:mossy_stone_brick_slab":[16428,16431,50],"minecraft:polished_diorite_slab":[16434,16437,50],"minecraft:mossy_cobblestone_slab":[16440,16443,50],"minecraft:end_stone_brick_slab":[16446,16449,50],"minecraft:smooth_sandstone_slab":[16452,16455,50],"minecraft:smooth_quartz_slab":[16458,16461,50],"minecraft:granite_slab":[16464,16467,50],"minecraft:andesite_slab":[16470,16473,50],"minecraft:red_nether_brick_slab":[16476,16479,50],"minecraft:polished_andesite_slab":[16482,16485,50],"minecraft:diorite_slab":[16488,16491,50],"minecraft:brick_wall":[16494,16497,51],"minecraft:prismarine_wall":[16818,16821,51],"minecraft:red_sandstone_wall":[17142,17145,51],"minecraft:mossy_stone_brick_wall":[17466,17469,51],"minecraft:granite_wall":[17790,17793,51],"minecraft:stone_brick_wall":[18114,18117,51],"minecraft:mud_brick_wall":[18438,18441,51],"minecraft:nether_brick_wall":[18762,18765,51],"minecraft:andesite_wall":[19086,19089,51],"minecraft:red_nether_brick_wall":[19410,19413,51],"minecraft:sandstone_wall":[19734,19737,51],"minecraft:end_stone_brick_wall":[20058,20061,51],"minecraft:diorite_wall":[20382,20385,51],"minecraft:scaffolding":[20706,20737,80],"minecraft:loom":[20738,20738,20],"minecraft:barrel":[20742,20743,81],"minecraft:smoker":[20754,20755,28],"minecraft:blast_furnace":[20762,20763,28],"minecraft:cartography_table":[20770,20770,0],"minecraft:fletching_table":[20771,20771,0],"minecraft:grindstone":[20772,20776,82],"minecraft:lectern":[20784,20787,83],"minecraft:smithing_table":[20800,20800,0],"minecraft:stonecutter":[20801,20801,20],"minecraft:bell":[20805,20806,84],"minecraft:lantern":[20837,20840,85],"minecraft:soul_lantern":[20841,20844,85],"minecraft:copper_lantern":[20845,20848,85],"minecraft:exposed_copper_lantern":[20849,20852,85],"minecraft:weathered_copper_lantern":[20853,20856,85],"minecraft:oxidized_copper_lantern":[20857,20860,85],"minecraft:waxed_copper_lantern":[20861,20864,85],"minecraft:waxed_exposed_copper_lantern":[20865,20868,85],"minecraft:waxed_weathered_copper_lantern":[20869,20872,85],"minecraft:waxed_oxidized_copper_lantern":[20873,20876,85],"minecraft:campfire":[20877,20880,86],"minecraft:soul_campfire":[20909,20912,86],"minecraft:sweet_berry_bush":[20941,20941,52],"minecraft:warped_stem":[20945,20946,2],"minecraft:stripped_warped_stem":[20948,20949,2],"minecraft:warped_hyphae":[20951,20952,2],"minecraft:stripped_warped_hyphae":[20954,20955,2],"minecraft:warped_nylium":[20957,20957,0],"minecraft:warped_fungus":[20958,20958,0],"minecraft:warped_wart_block":[20959,20959,0],"minecraft:warped_roots":[20960,20960,0],"minecraft:nether_sprouts":[20961,20961,0],"minecraft:crimson_stem":[20962,20963,2],"minecraft:stripped_crimson_stem":[20965,20966,2],"minecraft:crimson_hyphae":[20968,20969,2],"minecraft:stripped_crimson_hyphae":[20971,20972,2],"minecraft:crimson_nylium":[20974,20974,0],"minecraft:crimson_fungus":[20975,20975,0],"minecraft:shroomlight":[20976,20976,0],"minecraft:weeping_vines":[20977,20977,73],"minecraft:weeping_vines_plant":[21003,21003,0],"minecraft:twisting_vines":[21004,21004,73],"minecraft:twisting_vines_plant":[21030,21030,0],"minecraft:crimson_roots":[21031,21031,0],"minecraft:crimson_planks":[21032,21032,0],"minecraft:warped_planks":[21033,21033,0],"minecraft:crimson_slab":[21034,21037,50],"minecraft:warped_slab":[21040,21043,50],"minecraft:crimson_pressure_plate":[21046,21047,35],"minecraft:warped_pressure_plate":[21048,21049,35],"minecraft:crimson_fence":[21050,21081,40],"minecraft:warped_fence":[21082,21113,40],"minecraft:crimson_trapdoor":[21114,21129,44],"minecraft:warped_trapdoor":[21178,21193,44],"minecraft:crimson_fence_gate":[21242,21249,49],"minecraft:warped_fence_gate":[21274,21281,49],"minecraft:crimson_stairs":[21306,21317,23],"minecraft:warped_stairs":[21386,21397,23],"minecraft:crimson_button":[21466,21475,34],"minecraft:warped_button":[21490,21499,34],"minecraft:crimson_door":[21514,21525,30],"minecraft:warped_door":[21578,21589,30],"minecraft:crimson_sign":[21642,21659,29],"minecraft:warped_sign":[21674,21691,29],"minecraft:crimson_wall_sign":[21706,21707,31],"minecraft:warped_wall_sign":[21714,21715,31],"minecraft:structure_block":[21722,21723,87],"minecraft:jigsaw":[21726,21736,88],"minecraft:test_block":[21738,21738,89],"minecraft:test_instance_block":[21742,21742,0],"minecraft:composter":[21743,21743,90],"minecraft:target":[21752,21752,62],"minecraft:bee_nest":[21768,21768,91],"minecraft:beehive":[21792,21792,91],"minecraft:honey_block":[21816,21816,0],"minecraft:honeycomb_block":[21817,21817,0],"minecraft:netherite_block":[21818,21818,0],"minecraft:ancient_debris":[21819,21819,0],"minecraft:crying_obsidian":[21820,21820,0],"minecraft:respawn_anchor":[21821,21821,92],"minecraft:potted_crimson_fungus":[21826,21826,0],"minecraft:potted_warped_fungus":[21827,21827,0],"minecraft:potted_crimson_roots":[21828,21828,0],"minecraft:potted_warped_roots":[21829,21829,0],"minecraft:lodestone":[21830,21830,0],"minecraft:blackstone":[21831,21831,0],"minecraft:blackstone_stairs":[21832,21843,23],"minecraft:blackstone_wall":[21912,21915,51],"minecraft:blackstone_slab":[22236,22239,50],"minecraft:polished_blackstone":[22242,22242,0],"minecraft:polished_blackstone_bricks":[22243,22243,0],"minecraft:cracked_polished_blackstone_bricks":[22244,22244,0],"minecraft:chiseled_polished_blackstone":[22245,22245,0],"minecraft:polished_blackstone_brick_slab":[22246,22249,50],"minecraft:polished_blackstone_brick_stairs":[22252,22263,23],"minecraft:polished_blackstone_brick_wall":[22332,22335,51],"minecraft:gilded_blackstone":[22656,22656,0],"minecraft:polished_blackstone_stairs":[22657,22668,23],"minecraft:polished_blackstone_slab":[22737,22740,50],"minecraft:polished_blackstone_pressure_plate":[22743,22744,35],"minecraft:polished_blackstone_button":[22745,22754,34],"minecraft:polished_blackstone_wall":[22769,22772,51],"minecraft:chiseled_nether_bricks":[23093,23093,0],"minecraft:cracked_nether_bricks":[23094,23094,0],"minecraft:quartz_bricks":[23095,23095,0],"minecraft:candle":[23096,23099,93],"minecraft:white_candle":[23112,23115,93],"minecraft:orange_candle":[23128,23131,93],"minecraft:magenta_candle":[23144,23147,93],"minecraft:light_blue_candle":[23160,23163,93],"minecraft:yellow_candle":[23176,23179,93],"minecraft:lime_candle":[23192,23195,93],"minecraft:pink_candle":[23208,23211,93],"minecraft:gray_candle":[23224,23227,93],"minecraft:light_gray_candle":[23240,23243,93],"minecraft:cyan_candle":[23256,23259,93],"minecraft:purple_candle":[23272,23275,93],"minecraft:blue_candle":[23288,23291,93],"minecraft:brown_candle":[23304,23307,93],"minecraft:green_candle":[23320,23323,93],"minecraft:red_candle":[23336,23339,93],"minecraft:black_candle":[23352,23355,93],"minecraft:candle_cake":[23368,23369,36],"minecraft:white_candle_cake":[23370,23371,36],"minecraft:orange_candle_cake":[23372,23373,36],"minecraft:magenta_candle_cake":[23374,23375,36],"minecraft:light_blue_candle_cake":[23376,23377,36],"minecraft:yellow_candle_cake":[23378,23379,36],"minecraft:lime_candle_cake":[23380,23381,36],"minecraft:pink_candle_cake":[23382,23383,36],"minecraft:gray_candle_cake":[23384,23385,36],"minecraft:light_gray_candle_cake":[23386,23387,36],"minecraft:cyan_candle_cake":[23388,23389,36],"minecraft:purple_candle_cake":[23390,23391,36],"minecraft:blue_candle_cake":[23392,23393,36],"minecraft:brown_candle_cake":[23394,23395,36],"minecraft:green_candle_cake":[23396,23397,36],"minecraft:red_candle_cake":[23398,23399,36],"minecraft:black_candle_cake":[23400,23401,36],"minecraft:amethyst_block":[23402,23402,0],"minecraft:budding_amethyst":[23403,23403,0],"minecraft:amethyst_cluster":[23404,23413,94],"minecraft:large_amethyst_bud":[23416,23425,94],"minecraft:medium_amethyst_bud":[23428,23437,94],"minecraft:small_amethyst_bud":[23440,23449,94],"minecraft:tuff":[23452,23452,0],"minecraft:tuff_slab":[23453,23456,50],"minecraft:tuff_stairs":[23459,23470,23],"minecraft:tuff_wall":[23539,23542,51],"minecraft:polished_tuff":[23863,23863,0],"minecraft:polished_tuff_slab":[23864,23867,50],"minecraft:polished_tuff_stairs":[23870,23881,23],"minecraft:polished_tuff_wall":[23950,23953,51],"minecraft:chiseled_tuff":[24274,24274,0],"minecraft:tuff_bricks":[24275,24275,0],"minecraft:tuff_brick_slab":[24276,24279,50],"minecraft:tuff_brick_stairs":[24282,24293,23],"minecraft:tuff_brick_wall":[24362,24365,51],"minecraft:chiseled_tuff_bricks":[24686,24686,0],"minecraft:sulfur":[24687,24687,0],"minecraft:potent_sulfur":[24688,24688,95],"minecraft:sulfur_slab":[24693,24696,50],"minecraft:sulfur_stairs":[24699,24710,23],"minecraft:sulfur_wall":[24779,24782,51],"minecraft:polished_sulfur":[25103,25103,0],"minecraft:polished_sulfur_slab":[25104,25107,50],"minecraft:polished_sulfur_stairs":[25110,25121,23],"minecraft:polished_sulfur_wall":[25190,25193,51],"minecraft:sulfur_bricks":[25514,25514,0],"minecraft:sulfur_brick_slab":[25515,25518,50],"minecraft:sulfur_brick_stairs":[25521,25532,23],"minecraft:sulfur_brick_wall":[25601,25604,51],"minecraft:chiseled_sulfur":[25925,25925,0],"minecraft:cinnabar":[25926,25926,0],"minecraft:cinnabar_slab":[25927,25930,50],"minecraft:cinnabar_stairs":[25933,25944,23],"minecraft:cinnabar_wall":[26013,26016,51],"minecraft:polished_cinnabar":[26337,26337,0],"minecraft:polished_cinnabar_slab":[26338,26341,50],"minecraft:polished_cinnabar_stairs":[26344,26355,23],"minecraft:polished_cinnabar_wall":[26424,26427,51],"minecraft:cinnabar_bricks":[26748,26748,0],"minecraft:cinnabar_brick_slab":[26749,26752,50],"minecraft:cinnabar_brick_stairs":[26755,26766,23],"minecraft:cinnabar_brick_wall":[26835,26838,51],"minecraft:chiseled_cinnabar":[27159,27159,0],"minecraft:calcite":[27160,27160,0],"minecraft:tinted_glass":[27161,27161,0],"minecraft:powder_snow":[27162,27162,0],"minecraft:sculk_sensor":[27163,27164,96],"minecraft:calibrated_sculk_sensor":[27259,27260,97],"minecraft:sculk":[27643,27643,0],"minecraft:sculk_vein":[27644,27771,48],"minecraft:sculk_catalyst":[27772,27773,98],"minecraft:sculk_shrieker":[27774,27781,99],"minecraft:copper_block":[27782,27782,0],"minecraft:exposed_copper":[27783,27783,0],"minecraft:weathered_copper":[27784,27784,0],"minecraft:oxidized_copper":[27785,27785,0],"minecraft:waxed_copper_block":[27786,27786,0],"minecraft:waxed_exposed_copper":[27787,27787,0],"minecraft:waxed_weathered_copper":[27788,27788,0],"minecraft:waxed_oxidized_copper":[27789,27789,0],"minecraft:copper_ore":[27790,27790,0],"minecraft:deepslate_copper_ore":[27791,27791,0],"minecraft:cut_copper":[27792,27792,0],"minecraft:exposed_cut_copper":[27793,27793,0],"minecraft:weathered_cut_copper":[27794,27794,0],"minecraft:oxidized_cut_copper":[27795,27795,0],"minecraft:waxed_cut_copper":[27796,27796,0],"minecraft:waxed_exposed_cut_copper":[27797,27797,0],"minecraft:waxed_weathered_cut_copper":[27798,27798,0],"minecraft:waxed_oxidized_cut_copper":[27799,27799,0],"minecraft:chiseled_copper":[27800,27800,0],"minecraft:exposed_chiseled_copper":[27801,27801,0],"minecraft:weathered_chiseled_copper":[27802,27802,0],"minecraft:oxidized_chiseled_copper":[27803,27803,0],"minecraft:waxed_chiseled_copper":[27804,27804,0],"minecraft:waxed_exposed_chiseled_copper":[27805,27805,0],"minecraft:waxed_weathered_chiseled_copper":[27806,27806,0],"minecraft:waxed_oxidized_chiseled_copper":[27807,27807,0],"minecraft:cut_copper_stairs":[27808,27819,23],"minecraft:exposed_cut_copper_stairs":[27888,27899,23],"minecraft:weathered_cut_copper_stairs":[27968,27979,23],"minecraft:oxidized_cut_copper_stairs":[28048,28059,23],"minecraft:waxed_cut_copper_stairs":[28128,28139,23],"minecraft:waxed_exposed_cut_copper_stairs":[28208,28219,23],"minecraft:waxed_weathered_cut_copper_stairs":[28288,28299,23],"minecraft:waxed_oxidized_cut_copper_stairs":[28368,28379,23],"minecraft:cut_copper_slab":[28448,28451,50],"minecraft:exposed_cut_copper_slab":[28454,28457,50],"minecraft:weathered_cut_copper_slab":[28460,28463,50],"minecraft:oxidized_cut_copper_slab":[28466,28469,50],"minecraft:waxed_cut_copper_slab":[28472,28475,50],"minecraft:waxed_exposed_cut_copper_slab":[28478,28481,50],"minecraft:waxed_weathered_cut_copper_slab":[28484,28487,50],"minecraft:waxed_oxidized_cut_copper_slab":[28490,28493,50],"minecraft:copper_door":[28496,28507,30],"minecraft:exposed_copper_door":[28560,28571,30],"minecraft:weathered_copper_door":[28624,28635,30],"minecraft:oxidized_copper_door":[28688,28699,30],"minecraft:waxed_copper_door":[28752,28763,30],"minecraft:waxed_exposed_copper_door":[28816,28827,30],"minecraft:waxed_weathered_copper_door":[28880,28891,30],"minecraft:waxed_oxidized_copper_door":[28944,28955,30],"minecraft:copper_trapdoor":[29008,29023,44],"minecraft:exposed_copper_trapdoor":[29072,29087,44],"minecraft:weathered_copper_trapdoor":[29136,29151,44],"minecraft:oxidized_copper_trapdoor":[29200,29215,44],"minecraft:waxed_copper_trapdoor":[29264,29279,44],"minecraft:waxed_exposed_copper_trapdoor":[29328,29343,44],"minecraft:waxed_weathered_copper_trapdoor":[29392,29407,44],"minecraft:waxed_oxidized_copper_trapdoor":[29456,29471,44],"minecraft:copper_grate":[29520,29521,7],"minecraft:exposed_copper_grate":[29522,29523,7],"minecraft:weathered_copper_grate":[29524,29525,7],"minecraft:oxidized_copper_grate":[29526,29527,7],"minecraft:waxed_copper_grate":[29528,29529,7],"minecraft:waxed_exposed_copper_grate":[29530,29531,7],"minecraft:waxed_weathered_copper_grate":[29532,29533,7],"minecraft:waxed_oxidized_copper_grate":[29534,29535,7],"minecraft:copper_bulb":[29536,29539,100],"minecraft:exposed_copper_bulb":[29540,29543,100],"minecraft:weathered_copper_bulb":[29544,29547,100],"minecraft:oxidized_copper_bulb":[29548,29551,100],"minecraft:waxed_copper_bulb":[29552,29555,100],"minecraft:waxed_exposed_copper_bulb":[29556,29559,100],"minecraft:waxed_weathered_copper_bulb":[29560,29563,100],"minecraft:waxed_oxidized_copper_bulb":[29564,29567,100],"minecraft:copper_chest":[29568,29569,24],"minecraft:exposed_copper_chest":[29592,29593,24],"minecraft:weathered_copper_chest":[29616,29617,24],"minecraft:oxidized_copper_chest":[29640,29641,24],"minecraft:waxed_copper_chest":[29664,29665,24],"minecraft:waxed_exposed_copper_chest":[29688,29689,24],"minecraft:waxed_weathered_copper_chest":[29712,29713,24],"minecraft:waxed_oxidized_copper_chest":[29736,29737,24],"minecraft:copper_golem_statue":[29760,29761,101],"minecraft:exposed_copper_golem_statue":[29792,29793,101],"minecraft:weathered_copper_golem_statue":[29824,29825,101],"minecraft:oxidized_copper_golem_statue":[29856,29857,101],"minecraft:waxed_copper_golem_statue":[29888,29889,101],"minecraft:waxed_exposed_copper_golem_statue":[29920,29921,101],"minecraft:waxed_weathered_copper_golem_statue":[29952,29953,101],"minecraft:waxed_oxidized_copper_golem_statue":[29984,29985,101],"minecraft:lightning_rod":[30016,30035,102],"minecraft:exposed_lightning_rod":[30040,30059,102],"minecraft:weathered_lightning_rod":[30064,30083,102],"minecraft:oxidized_lightning_rod":[30088,30107,102],"minecraft:waxed_lightning_rod":[30112,30131,102],"minecraft:waxed_exposed_lightning_rod":[30136,30155,102],"minecraft:waxed_weathered_lightning_rod":[30160,30179,102],"minecraft:waxed_oxidized_lightning_rod":[30184,30203,102],"minecraft:dripstone_block":[30208,30208,0],"minecraft:pointed_dripstone":[30209,30214,103],"minecraft:sulfur_spike":[30229,30234,103],"minecraft:cave_vines":[30249,30250,104],"minecraft:cave_vines_plant":[30301,30302,105],"minecraft:spore_blossom":[30303,30303,0],"minecraft:azalea":[30304,30304,0],"minecraft:flowering_azalea":[30305,30305,0],"minecraft:moss_carpet":[30306,30306,0],"minecraft:pink_petals":[30307,30307,106],"minecraft:wildflowers":[30323,30323,106],"minecraft:leaf_litter":[30339,30339,107],"minecraft:moss_block":[30355,30355,0],"minecraft:big_dripleaf":[30356,30357,108],"minecraft:big_dripleaf_stem":[30388,30389,31],"minecraft:small_dripleaf":[30396,30399,109],"minecraft:hanging_roots":[30412,30413,7],"minecraft:rooted_dirt":[30414,30414,0],"minecraft:mud":[30415,30415,0],"minecraft:deepslate":[30416,30417,2],"minecraft:cobbled_deepslate":[30419,30419,0],"minecraft:cobbled_deepslate_stairs":[30420,30431,23],"minecraft:cobbled_deepslate_slab":[30500,30503,50],"minecraft:cobbled_deepslate_wall":[30506,30509,51],"minecraft:polished_deepslate":[30830,30830,0],"minecraft:polished_deepslate_stairs":[30831,30842,23],"minecraft:polished_deepslate_slab":[30911,30914,50],"minecraft:polished_deepslate_wall":[30917,30920,51],"minecraft:deepslate_tiles":[31241,31241,0],"minecraft:deepslate_tile_stairs":[31242,31253,23],"minecraft:deepslate_tile_slab":[31322,31325,50],"minecraft:deepslate_tile_wall":[31328,31331,51],"minecraft:deepslate_bricks":[31652,31652,0],"minecraft:deepslate_brick_stairs":[31653,31664,23],"minecraft:deepslate_brick_slab":[31733,31736,50],"minecraft:deepslate_brick_wall":[31739,31742,51],"minecraft:chiseled_deepslate":[32063,32063,0],"minecraft:cracked_deepslate_bricks":[32064,32064,0],"minecraft:cracked_deepslate_tiles":[32065,32065,0],"minecraft:infested_deepslate":[32066,32067,2],"minecraft:smooth_basalt":[32069,32069,0],"minecraft:raw_iron_block":[32070,32070,0],"minecraft:raw_copper_block":[32071,32071,0],"minecraft:raw_gold_block":[32072,32072,0],"minecraft:potted_azalea_bush":[32073,32073,0],"minecraft:potted_flowering_azalea_bush":[32074,32074,0],"minecraft:ochre_froglight":[32075,32076,2],"minecraft:verdant_froglight":[32078,32079,2],"minecraft:pearlescent_froglight":[32081,32082,2],"minecraft:frogspawn":[32084,32084,0],"minecraft:reinforced_deepslate":[32085,32085,0],"minecraft:decorated_pot":[32086,32095,110],"minecraft:crafter":[32102,32147,111],"minecraft:trial_spawner":[32150,32156,112],"minecraft:vault":[32162,32166,113],"minecraft:heavy_core":[32194,32195,7],"minecraft:pale_moss_block":[32196,32196,0],"minecraft:pale_moss_carpet":[32197,32197,114],"minecraft:pale_hanging_moss":[32359,32359,115],"minecraft:open_eyeblossom":[32361,32361,0],"minecraft:closed_eyeblossom":[32362,32362,0],"minecraft:potted_open_eyeblossom":[32363,32363,0],"minecraft:potted_closed_eyeblossom":[32364,32364,0],"minecraft:firefly_bush":[32365,32365,0]},"schemas":[[],[["snowy",["true","false"]]],[["axis",["x","y","z"]]],[["stage",["0","1"]]],[["age",["0","1","2","3","4"]],["hanging",["true","false"]],["stage",["0","1"]],["waterlogged",["true","false"]]],[["level",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]]],[["dusted",["0","1","2","3"]]],[["waterlogged",["true","false"]]],[["distance",["1","2","3","4","5","6","7"]],["persistent",["true","false"]],["waterlogged",["true","false"]]],[["facing",["north","east","south","west","up","down"]],["triggered",["true","false"]]],[["instrument",["harp","basedrum","snare","hat","bass","flute","bell","guitar","chime","xylophone","iron_xylophone","cow_bell","didgeridoo","bit","banjo","pling","trumpet","trumpet_exposed","trumpet_oxidized","trumpet_weathered","zombie","skeleton","creeper","dragon","wither_skeleton","piglin","custom_head"]],["note",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]],["powered",["true","false"]]],[["facing",["north","south","west","east"]],["occupied",["true","false"]],["part",["head","foot"]]],[["powered",["true","false"]],["shape",["north_south","east_west","ascending_east","ascending_west","ascending_north","ascending_south"]],["waterlogged",["true","false"]]],[["extended",["true","false"]],["facing",["north","east","south","west","up","down"]]],[["half",["upper","lower"]]],[["facing",["north","east","south","west","up","down"]],["short",["true","false"]],["type",["normal","sticky"]]],[["facing",["north","east","south","west","up","down"]],["type",["normal","sticky"]]],[["unstable",["true","false"]]],[["facing",["north","south","west","east"]],["slot_0_occupied",["true","false"]],["slot_1_occupied",["true","false"]],["slot_2_occupied",["true","false"]],["slot_3_occupied",["true","false"]],["slot_4_occupied",["true","false"]],["slot_5_occupied",["true","false"]]],[["facing",["north","south","west","east"]],["powered",["true","false"]],["side_chain",["unconnected","right","center","left"]],["waterlogged",["true","false"]]],[["facing",["north","south","west","east"]]],[["age",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["east",["true","false"]],["north",["true","false"]],["south",["true","false"]],["up",["true","false"]],["west",["true","false"]]],[["axis",["x","y","z"]],["creaking_heart_state",["uprooted","dormant","awake"]],["natural",["true","false"]]],[["facing",["north","south","west","east"]],["half",["top","bottom"]],["shape",["straight","inner_left","inner_right","outer_left","outer_right"]],["waterlogged",["true","false"]]],[["facing",["north","south","west","east"]],["type",["single","left","right"]],["waterlogged",["true","false"]]],[["east",["up","side","none"]],["north",["up","side","none"]],["power",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["south",["up","side","none"]],["west",["up","side","none"]]],[["age",["0","1","2","3","4","5","6","7"]]],[["moisture",["0","1","2","3","4","5","6","7"]]],[["facing",["north","south","west","east"]],["lit",["true","false"]]],[["rotation",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["waterlogged",["true","false"]]],[["facing",["north","south","west","east"]],["half",["upper","lower"]],["hinge",["left","right"]],["open",["true","false"]],["powered",["true","false"]]],[["facing",["north","south","west","east"]],["waterlogged",["true","false"]]],[["shape",["north_south","east_west","ascending_east","ascending_west","ascending_north","ascending_south","south_east","south_west","north_west","north_east"]],["waterlogged",["true","false"]]],[["attached",["true","false"]],["rotation",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["waterlogged",["true","false"]]],[["face",["floor","wall","ceiling"]],["facing",["north","south","west","east"]],["powered",["true","false"]]],[["powered",["true","false"]]],[["lit",["true","false"]]],[["layers",["1","2","3","4","5","6","7","8"]]],[["age",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]]],[["has_record",["true","false"]]],[["east",["true","false"]],["north",["true","false"]],["south",["true","false"]],["waterlogged",["true","false"]],["west",["true","false"]]],[["axis",["x","z"]]],[["bites",["0","1","2","3","4","5","6"]]],[["delay",["1","2","3","4"]],["facing",["north","south","west","east"]],["locked",["true","false"]],["powered",["true","false"]]],[["facing",["north","south","west","east"]],["half",["top","bottom"]],["open",["true","false"]],["powered",["true","false"]],["waterlogged",["true","false"]]],[["down",["true","false"]],["east",["true","false"]],["north",["true","false"]],["south",["true","false"]],["up",["true","false"]],["west",["true","false"]]],[["axis",["x","y","z"]],["waterlogged",["true","false"]]],[["east",["true","false"]],["north",["true","false"]],["south",["true","false"]],["up",["true","false"]],["west",["true","false"]]],[["down",["true","false"]],["east",["true","false"]],["north",["true","false"]],["south",["true","false"]],["up",["true","false"]],["waterlogged",["true","false"]],["west",["true","false"]]],[["facing",["north","south","west","east"]],["in_wall",["true","false"]],["open",["true","false"]],["powered",["true","false"]]],[["type",["top","bottom","double"]],["waterlogged",["true","false"]]],[["east",["none","low","tall"]],["north",["none","low","tall"]],["south",["none","low","tall"]],["up",["true","false"]],["waterlogged",["true","false"]],["west",["none","low","tall"]]],[["age",["0","1","2","3"]]],[["has_bottle_0",["true","false"]],["has_bottle_1",["true","false"]],["has_bottle_2",["true","false"]]],[["level",["1","2","3"]]],[["eye",["true","false"]],["facing",["north","south","west","east"]]],[["age",["0","1","2"]],["facing",["north","south","west","east"]]],[["attached",["true","false"]],["facing",["north","south","west","east"]],["powered",["true","false"]]],[["attached",["true","false"]],["disarmed",["true","false"]],["east",["true","false"]],["north",["true","false"]],["powered",["true","false"]],["south",["true","false"]],["west",["true","false"]]],[["conditional",["true","false"]],["facing",["north","east","south","west","up","down"]]],[["powered",["true","false"]],["rotation",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]]],[["facing",["north","south","west","east"]],["powered",["true","false"]]],[["power",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]]],[["facing",["north","south","west","east"]],["mode",["compare","subtract"]],["powered",["true","false"]]],[["inverted",["true","false"]],["power",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]]],[["enabled",["true","false"]],["facing",["down","north","south","west","east"]]],[["level",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["waterlogged",["true","false"]]],[["rotation",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]]],[["facing",["north","east","south","west","up","down"]]],[["age",["0","1","2","3","4","5"]]],[["age",["0","1"]]],[["age",["0","1","2","3","4"]],["half",["upper","lower"]]],[["facing",["north","east","south","west","up","down"]],["powered",["true","false"]]],[["age",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"]]],[["eggs",["1","2","3","4"]],["hatch",["0","1","2"]]],[["hatch",["0","1","2"]]],[["facing",["north","south","west","east"]],["hydration",["0","1","2","3"]],["waterlogged",["true","false"]]],[["pickles",["1","2","3","4"]],["waterlogged",["true","false"]]],[["age",["0","1"]],["leaves",["none","small","large"]],["stage",["0","1"]]],[["drag",["true","false"]]],[["bottom",["true","false"]],["distance",["0","1","2","3","4","5","6","7"]],["waterlogged",["true","false"]]],[["facing",["north","east","south","west","up","down"]],["open",["true","false"]]],[["face",["floor","wall","ceiling"]],["facing",["north","south","west","east"]]],[["facing",["north","south","west","east"]],["has_book",["true","false"]],["powered",["true","false"]]],[["attachment",["floor","ceiling","single_wall","double_wall"]],["facing",["north","south","west","east"]],["powered",["true","false"]]],[["hanging",["true","false"]],["waterlogged",["true","false"]]],[["facing",["north","south","west","east"]],["lit",["true","false"]],["signal_fire",["true","false"]],["waterlogged",["true","false"]]],[["mode",["save","load","corner","data"]]],[["orientation",["down_east","down_north","down_south","down_west","up_east","up_north","up_south","up_west","west_up","east_up","north_up","south_up"]]],[["mode",["start","log","fail","accept"]]],[["level",["0","1","2","3","4","5","6","7","8"]]],[["facing",["north","south","west","east"]],["honey_level",["0","1","2","3","4","5"]]],[["charges",["0","1","2","3","4"]]],[["candles",["1","2","3","4"]],["lit",["true","false"]],["waterlogged",["true","false"]]],[["facing",["north","east","south","west","up","down"]],["waterlogged",["true","false"]]],[["potent_sulfur_state",["dry","wet","dormant","erupting","continuous"]]],[["power",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["sculk_sensor_phase",["inactive","active","cooldown"]],["waterlogged",["true","false"]]],[["facing",["north","south","west","east"]],["power",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]],["sculk_sensor_phase",["inactive","active","cooldown"]],["waterlogged",["true","false"]]],[["bloom",["true","false"]]],[["can_summon",["true","false"]],["shrieking",["true","false"]],["waterlogged",["true","false"]]],[["lit",["true","false"]],["powered",["true","false"]]],[["copper_golem_pose",["standing","sitting","running","star"]],["facing",["north","south","west","east"]],["waterlogged",["true","false"]]],[["facing",["north","east","south","west","up","down"]],["powered",["true","false"]],["waterlogged",["true","false"]]],[["thickness",["tip_merge","tip","frustum","middle","base"]],["vertical_direction",["up","down"]],["waterlogged",["true","false"]]],[["age",["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"]],["berries",["true","false"]]],[["berries",["true","false"]]],[["facing",["north","south","west","east"]],["flower_amount",["1","2","3","4"]]],[["facing",["north","south","west","east"]],["segment_amount",["1","2","3","4"]]],[["facing",["north","south","west","east"]],["tilt",["none","unstable","partial","full"]],["waterlogged",["true","false"]]],[["facing",["north","south","west","east"]],["half",["upper","lower"]],["waterlogged",["true","false"]]],[["cracked",["true","false"]],["facing",["north","south","west","east"]],["waterlogged",["true","false"]]],[["crafting",["true","false"]],["orientation",["down_east","down_north","down_south","down_west","up_east","up_north","up_south","up_west","west_up","east_up","north_up","south_up"]],["triggered",["true","false"]]],[["ominous",["true","false"]],["trial_spawner_state",["inactive","waiting_for_players","active","waiting_for_reward_ejection","ejecting_reward","cooldown"]]],[["facing",["north","south","west","east"]],["ominous",["true","false"]],["vault_state",["inactive","active","unlocking","ejecting"]]],[["bottom",["true","false"]],["east",["none","low","tall"]],["north",["none","low","tall"]],["south",["none","low","tall"]],["west",["none","low","tall"]]],[["tip",["true","false"]]]],"provenance":{"source_url":"https://piston-data.mojang.com/v1/objects/823e2250d24b3ddac457a60c92a6a941943fcd6a/server.jar","source_sha1":"823e2250d24b3ddac457a60c92a6a941943fcd6a","source_sha256":"cdacdfb25898de5e4b4b0e5ddcc2722f77067e46605709c2d886c000ebb63ec5","executable_sha256":"183c0499c5f855570ee487dd38e141a53f0121f83a0b07a3bac2d8b6698823e8","probe_sha256":"8663e2f81af754fa4063a6f0a109fa27b8c1fae06a5a393d7ca42ac243a252bb","command":"python3 scripts/measure_lighting.py --java /path/to/java25/bin/java"}} diff --git a/client/lighting-shaders.js b/client/lighting-shaders.js new file mode 100644 index 0000000..edc6134 --- /dev/null +++ b/client/lighting-shaders.js @@ -0,0 +1,321 @@ +// One direction drives visible sunlight, surface lighting, and the shadow camera. +const sun = [-0.5, 0.78, 0.37]; +export const SUN_DIRECTION = Object.freeze(sun.map((v) => v / Math.hypot(...sun))); +const sunlight = `const vec3 SUN_DIRECTION = vec3(${SUN_DIRECTION.join(",")});`; + +// Atlas cells are sampled as integer texels, so neighboring sprites never bleed. +const blockTextureSampling = ` +uniform sampler2DArray uBlockTextures; +uniform vec2 uBlockAtlasGrid; +uniform vec2 uGrassOverlay; +vec4 blockPixelRaw(vec2 uv, float layer) { + if (uBlockAtlasGrid.x < 1.0) return texture(uBlockTextures, vec3(uv, layer)); + ivec2 cellSize = textureSize(uBlockTextures, 0).xy / ivec2(uBlockAtlasGrid); + ivec2 cell = ivec2(mod(layer, uBlockAtlasGrid.x), floor(layer / uBlockAtlasGrid.x)); + ivec2 pixel = min(ivec2(floor(fract(uv) * vec2(cellSize))), cellSize - 1); + return texelFetch(uBlockTextures, ivec3(cell * cellSize + pixel, 0), 0); +} +vec4 blockPixel(vec2 uv, float layer) { + vec4 pixel = blockPixelRaw(uv, layer); + if (uGrassOverlay.x >= 0.0 && abs(layer - uGrassOverlay.x) < 0.1) { + vec4 overlay = blockPixelRaw(uv, uGrassOverlay.y); + pixel.rgb = mix(pixel.rgb, overlay.rgb * vec3(0.58, 0.8, 0.34), overlay.a); + } + return pixel; +}`; + +const colorSpace = ` +vec3 toLinear(vec3 color) { + color = max(color, vec3(0.0)); + return mix(color / 12.92, pow((color + 0.055) / 1.055, vec3(2.4)), step(vec3(0.04045), color)); +} +vec3 toSRGB(vec3 color) { + color = max(color, vec3(0.0)); + return mix(color * 12.92, 1.055 * pow(color, vec3(1.0 / 2.4)) - 0.055, step(vec3(0.0031308), color)); +}`; + +// Linear scene colors. The world fog and water reflection sample this same sky. +const atmosphere = ` +${sunlight} +uniform float uDaylight; +vec3 daylightSky(vec3 ray) { + float altitude = clamp(ray.y, 0.0, 1.0); + vec3 horizon = vec3(0.67, 0.77, 0.80); + vec3 zenith = vec3(0.105, 0.315, 0.59); + vec3 sky = mix(horizon, zenith, pow(altitude, 0.48)); + float sunAngle = max(dot(ray, SUN_DIRECTION), 0.0); + // Wide scattering is faint; the small solar disc is rendered separately. + sky += vec3(0.12, 0.075, 0.025) * pow(sunAngle, 24.0); + sky = mix(vec3(0.46, 0.51, 0.48), sky, smoothstep(-0.24, 0.015, ray.y)); + vec3 nightHorizon = vec3(0.009, 0.015, 0.028); + vec3 nightZenith = vec3(0.0014, 0.0034, 0.011); + vec3 night = mix(nightHorizon, nightZenith, pow(altitude, 0.48)); + night += vec3(0.0025, 0.0035, 0.006) * pow(sunAngle, 36.0); + night = mix(vec3(0.0035, 0.005, 0.009), night, smoothstep(-0.24, 0.015, ray.y)); + return mix(night, sky, clamp(uDaylight, 0.0, 1.0)); +}`; + +export const worldVertex = `#version 300 es +precision highp float; +layout(location=0) in vec3 aPos; +layout(location=1) in vec3 aColor; +layout(location=2) in vec3 aNormal; +layout(location=3) in float aMaterial; +layout(location=4) in float aOpacity; +layout(location=5) in vec3 aBlockTexture; +layout(location=6) in vec2 aLight; +// RGB is linear block irradiance; alpha is the normalized skylight level. +layout(location=7) in vec4 aBlockLight; +uniform mat4 uVP; +uniform vec3 uOffset; +out vec3 vPos; +out vec3 vColor; +out vec3 vNormal; +flat out float vMaterial; +out float vOpacity; +out vec2 vBlockUV; +flat out float vBlockLayer; +out vec2 vLight; +out vec4 vBlockLight; +void main() { + vPos = aPos + uOffset; + vColor = aColor; + vNormal = aNormal; + vMaterial = aMaterial; + vOpacity = aOpacity; + vBlockUV = aBlockTexture.xy; + vBlockLayer = aBlockTexture.z; + vLight = aLight; + vBlockLight = aBlockLight; + gl_Position = uVP * vec4(vPos, 1.0); +}`; + +export const worldFragment = `#version 300 es +precision highp float; +precision highp sampler2DArray; +in vec3 vPos; +in vec3 vColor; +in vec3 vNormal; +flat in float vMaterial; +in float vOpacity; +in vec2 vBlockUV; +flat in float vBlockLayer; +in vec2 vLight; +in vec4 vBlockLight; +uniform vec3 uEye; +uniform sampler2D uTexture; +uniform bool uTextured; +uniform sampler2D uEffectTexture; +uniform bool uEffectTextured; +${blockTextureSampling} +uniform float uPulse; +uniform float uFogDistance; +uniform float uViewDistance; +uniform mat4 uLightVP; +uniform sampler2D uShadowMap; +uniform bool uShadows; +uniform float uShadowTexel; +uniform vec3 uShadowCenter; +uniform float uShadowRadius; +out vec4 outColor; +${colorSpace} +${atmosphere} + +float hash(vec3 p) { + return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453); +} +vec3 shacraftBounceTint(vec3 color,float pulse){return color;} + +float sunVisibility(vec3 normal, float incidence) { + if (!uShadows || incidence <= 0.0) return 1.0; + vec4 clip = uLightVP * vec4(vPos + normal * 0.025, 1.0); + vec3 projected = clip.xyz / clip.w * 0.5 + 0.5; + if (any(lessThan(projected, vec3(0.0))) || any(greaterThan(projected, vec3(1.0)))) return 1.0; + float bias = 0.00010 + 0.00028 * (1.0 - incidence); + float visible = 0.0; + // A compact, stable PCF kernel keeps the edges soft without moving grain. + for (int y = -1; y <= 1; ++y) { + for (int x = -1; x <= 1; ++x) { + float depth = texture(uShadowMap, projected.xy + vec2(float(x), float(y)) * uShadowTexel).r; + visible += step(projected.z - bias, depth); + } + } + float coverage = 1.0 - smoothstep(max(0.0, uShadowRadius - 6.0), uShadowRadius, distance(vPos, uShadowCenter)); + vec2 border = min(projected.xy, 1.0 - projected.xy); + coverage *= smoothstep(0.0, 0.018, min(border.x, border.y)); + return mix(1.0, visible / 9.0, coverage); +} + +float textureAlpha = 1.0; +vec3 surfaceColor(vec3 normal) { + if (vBlockLayer >= 0.0) { + vec4 pixel = blockPixel(vBlockUV, vBlockLayer); + if (pixel.a < (uBlockAtlasGrid.x > 0.0 ? 0.01 : 0.5)) discard; + if (uBlockAtlasGrid.x > 0.0 && pixel.a < 0.99) textureAlpha = pixel.a; + return clamp(pixel.rgb * vColor, 0.0, 1.0); + } + vec2 uv = abs(normal.y) > 0.5 ? vPos.xz : (abs(normal.x) > 0.5 ? vPos.zy : vPos.xy); + vec3 p = floor((vPos + normal * 0.002) * 16.0); + float noise = hash(p) * 0.14 - 0.07; + float pattern = 1.0; + if (vMaterial > 1.5 && vMaterial < 2.5) { + pattern = 0.89 + 0.11 * step(0.07, fract(uv.y * 4.0)); + pattern *= 0.9 + 0.1 * step(0.055, fract(uv.x * 0.5 + floor(uv.y * 4.0) * 0.5)); + } + if (vMaterial > 2.5 && vMaterial < 3.5) { + pattern = 0.87 + 0.13 * step(0.06, fract(uv.y * 4.0)); + pattern *= 0.84 + 0.16 * step(0.045, fract(uv.x * 2.0 + floor(uv.y * 4.0) * 0.5)); + } + if (vMaterial > 3.5 && vMaterial < 4.5) { + pattern = 0.91 + 0.09 * sin(floor(uv.x * 16.0) * 1.73 + sin(floor(uv.y * 16.0) * 0.22)); + } + float tex = uTextured ? mix(0.84, 1.12, texture(uTexture, uv).r) : 1.0; + if (vMaterial > 4.5 && vMaterial < 5.5 && uEffectTextured) { + tex = mix(0.75, 1.2, texture(uEffectTexture, uv).g); + } + vec3 color = clamp((vColor + noise) * pattern * tex, 0.0, 1.0); + if (vMaterial > 0.5 && vMaterial < 1.5 && normal.y < 0.5) { + color = mix(color, vec3(0.38, 0.29, 0.17), 0.65); + } + return color; +} + +void main() { + vec3 normal = normalize(vNormal); + vec3 albedo = surfaceColor(normal); + if (vMaterial > 4.5 && vMaterial < 5.5) albedo = shacraftBounceTint(albedo, uPulse); + albedo = toLinear(albedo); + float occlusion = clamp(vLight.x, 0.0, 1.0); + float emission = clamp(vLight.y, 0.0, 1.0); + float skyLevel = clamp(vBlockLight.a, 0.0, 1.0); + float skyExposure = skyLevel * skyLevel; + vec3 blockLight = max(vBlockLight.rgb, vec3(0.0)); + float incidence = max(dot(normal, SUN_DIRECTION), 0.0); + float sunlight = skyExposure > 0.0 ? sunVisibility(normal, incidence) * skyExposure : 0.0; + // The lower hemisphere has muted ground bounce, keeping undersides legible. + float hemisphere = normal.y * 0.5 + 0.5; + vec3 ambient = mix(vec3(0.15, 0.145, 0.13), vec3(0.29, 0.355, 0.44), hemisphere); + float daylight = clamp(uDaylight, 0.0, 1.0); + vec3 moonAmbient = mix(vec3(0.009, 0.011, 0.018), vec3(0.025, 0.036, 0.060), hemisphere); + ambient = mix(moonAmbient, ambient, daylight); + // Closed rooms receive a small visibility floor, not the outdoor hemisphere. + ambient *= mix(0.20, 1.0, occlusion) * mix(0.015, 1.0, skyExposure); + vec3 direct = mix(vec3(0.034, 0.050, 0.080), vec3(0.94, 0.865, 0.735), daylight) * incidence * sunlight; + // Voxel propagation already accounts for walls and distance to emitters. + // A weak contact term keeps corners grounded without swallowing torchlight. + vec3 localLight = blockLight * 1.1 * mix(0.65, 1.0, occlusion); + vec3 color = albedo * (ambient + direct + localLight); + color = mix(color, albedo * 1.14, emission); + + vec3 eyeDelta = uEye - vPos; + vec3 toEye = eyeDelta / max(length(eyeDelta), 0.0001); + if (vMaterial > 5.5 && vMaterial < 6.5) { + // Flat, quiet voxel water: the silhouette and texture remain pixel aligned. + float fresnel = 0.035 + 0.58 * pow(1.0 - max(dot(normal, toEye), 0.0), 5.0); + vec3 reflection = daylightSky(reflect(-toEye, normal)) * 0.82 * skyExposure + blockLight * 0.08; + color = mix(color, reflection, fresnel); + vec3 halfVector = normalize(SUN_DIRECTION + toEye); + float glint = pow(max(dot(normal, halfVector), 0.0), 160.0); + color += mix(vec3(0.045, 0.060, 0.090), vec3(0.45, 0.38, 0.24), daylight) * glint * sunlight; + } + + // Matching atmosphere avoids a separate tinted band along the horizon. + float fog = (1.0 - exp(-pow(length(eyeDelta) / uFogDistance, 2.0))) * 0.92; + // Fade completely before the prefetched ring can be unloaded. + float viewEdge = max(abs(eyeDelta.x), abs(eyeDelta.z)); + fog = max(fog, smoothstep(uViewDistance * 0.82, uViewDistance, viewEdge)); + color = mix(color, daylightSky(-toEye) * skyExposure, fog); + outColor = vec4(toSRGB(clamp(color, 0.0, 1.0)), textureAlpha < 0.99 ? textureAlpha : vOpacity); +}`; + +export const skyVertex = `#version 300 es +precision highp float; +out vec2 vUV; +void main() { + vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2); + vUV = p; + gl_Position = vec4(p * 2.0 - 1.0, 1.0, 1.0); +}`; + +export const skyFragment = `#version 300 es +precision highp float; +in vec2 vUV; +uniform float uPitch; +uniform float uYaw; +uniform float uAspect; +uniform float uTanHalfFov; +uniform float uSkyExposure; +out vec4 outColor; +${colorSpace} +${atmosphere} +float starHash(vec2 cell) { + return fract(sin(dot(cell, vec2(127.1, 311.7))) * 43758.5453); +} +vec3 nightStars(vec3 ray) { + // A fixed world-space hemisphere avoids stars sliding with the camera. + vec2 skyPlane = ray.xz / max(ray.y + 1.15, 0.2) * 128.0; + vec2 cell = floor(skyPlane); + float seed = starHash(cell); + vec2 center = vec2(starHash(cell + 19.4), starHash(cell + 71.2)) * 0.6 + 0.2; + float radius = mix(0.065, 0.13, starHash(cell + 37.8)); + float distanceToStar = length(fract(skyPlane) - center); + float edge = max(fwidth(distanceToStar), 0.01); + float star = 1.0 - smoothstep(max(0.0, radius - edge), radius + edge, distanceToStar); + star *= step(0.994, seed) * smoothstep(0.025, 0.20, ray.y); + vec3 tint = mix(vec3(0.48, 0.59, 0.80), vec3(0.82, 0.74, 0.60), starHash(cell + 113.0)); + return tint * star * mix(0.32, 0.72, starHash(cell + 53.0)); +} +void main() { + vec3 forward = vec3(sin(uYaw) * cos(uPitch), sin(uPitch), -cos(uYaw) * cos(uPitch)); + vec3 right = vec3(cos(uYaw), 0.0, sin(uYaw)); + vec3 up = vec3(-sin(uYaw) * sin(uPitch), cos(uPitch), cos(uYaw) * sin(uPitch)); + vec2 screen = vUV * 2.0 - 1.0; + vec3 ray = normalize(forward + right * screen.x * uAspect * uTanHalfFov + up * screen.y * uTanHalfFov); + vec3 color = daylightSky(ray); + float daylight = clamp(uDaylight, 0.0, 1.0); + color += nightStars(ray) * (1.0 - daylight); + float sunAngle = dot(ray, SUN_DIRECTION); + float rim = max(fwidth(sunAngle), 0.000001); + float angularRadius = mix(0.0125, 0.0105, daylight); + float disc = smoothstep(cos(angularRadius) - rim, cos(angularRadius) + rim, sunAngle); + vec3 moonRight = normalize(cross(SUN_DIRECTION, vec3(0.0, 1.0, 0.0))); + vec3 moonUp = cross(moonRight, SUN_DIRECTION); + vec2 moonUV = vec2(dot(ray, moonRight), dot(ray, moonUp)) / sin(angularRadius); + vec2 craterA = moonUV - vec2(-0.24, 0.22), craterB = moonUV - vec2(0.28, -0.27); + float craters = 0.12 * exp(-dot(craterA, craterA) * 22.0) + 0.075 * exp(-dot(craterB, craterB) * 36.0); + float moonShade = 0.78 + 0.22 * sqrt(max(0.0, 1.0 - dot(moonUV, moonUV))) - craters; + vec3 moon = vec3(0.62, 0.70, 0.84) * moonShade; + color = mix(color, mix(moon, vec3(1.0, 0.965, 0.84), daylight), disc); + // Match the distant backdrop to cave fog when the streamed window ends + // underground; missing geometry must not reveal a bright surface sky. + outColor = vec4(toSRGB(clamp(color * uSkyExposure, 0.0, 1.0)), 1.0); +}`; + +export const shadowVertex = `#version 300 es +precision highp float; +layout(location=0) in vec3 aPos; +layout(location=4) in float aOpacity; +layout(location=5) in vec3 aBlockTexture; +uniform mat4 uLightVP; +uniform vec3 uOffset; +out vec2 vBlockUV; +flat out float vBlockLayer; +out float vOpacity; +void main() { + vBlockUV = aBlockTexture.xy; + vBlockLayer = aBlockTexture.z; + vOpacity = aOpacity; + gl_Position = uLightVP * vec4(aPos + uOffset, 1.0); +}`; + +export const shadowFragment = `#version 300 es +precision highp float; +precision highp sampler2DArray; +in vec2 vBlockUV; +flat in float vBlockLayer; +in float vOpacity; +${blockTextureSampling} +void main() { + if (vOpacity < 0.99) discard; + if (vBlockLayer >= 0.0 && blockPixel(vBlockUV, vBlockLayer).a < 0.5) discard; +}`; diff --git a/client/local-light-bounds.js b/client/local-light-bounds.js new file mode 100644 index 0000000..190431b --- /dev/null +++ b/client/local-light-bounds.js @@ -0,0 +1,10 @@ +// Fifteen light levels plus the halo sampled by faces and partial models. +export const LOCAL_LIGHT_HALO = 18; +export function localLightBounds(id, view) { + if (!view) return null; + const [x,,z] = id.split(',').map(value=>Math.floor(Number(value)/2)*32); + return { + min:[Math.max(view.min[0],x-LOCAL_LIGHT_HALO),view.min[1],Math.max(view.min[2],z-LOCAL_LIGHT_HALO)], + max:[Math.min(view.max[0],x+31+LOCAL_LIGHT_HALO),view.max[1],Math.min(view.max[2],z+31+LOCAL_LIGHT_HALO)], + }; +} diff --git a/client/math.js b/client/math.js index 26045c8..dbe1668 100644 --- a/client/math.js +++ b/client/math.js @@ -167,6 +167,7 @@ export function isFullCube(mat) { b?.length === 1 && b[0].min.every((v) => v === 0) && b[0].max.every((v) => v === 1) && + (mat.opacity ?? 1) >= 1 && !mat.transparent ); } diff --git a/client/mesh-geometry.js b/client/mesh-geometry.js new file mode 100644 index 0000000..4bf9143 --- /dev/null +++ b/client/mesh-geometry.js @@ -0,0 +1,189 @@ +import { key, isFullCube, unitBox } from "./math.js"; +import { getBlockFaceTextures, getFaceUV } from "./block-textures.js"; +import { createAmbientOcclusionSampler } from "./ambient-occlusion.js"; + +/** Shared terrain and actor format; all values become Float32 at upload. */ +export const MESH_VERTEX_STRIDE = 20; + +export const faces = [ + { + n: [1, 0, 0], + v: [ + [1, 0, 1], + [1, 0, 0], + [1, 1, 0], + [1, 1, 1], + ], + }, + { + n: [-1, 0, 0], + v: [ + [0, 0, 0], + [0, 0, 1], + [0, 1, 1], + [0, 1, 0], + ], + }, + { + n: [0, 1, 0], + v: [ + [0, 1, 1], + [1, 1, 1], + [1, 1, 0], + [0, 1, 0], + ], + }, + { + n: [0, -1, 0], + v: [ + [0, 0, 0], + [1, 0, 0], + [1, 0, 1], + [0, 0, 1], + ], + }, + { + n: [0, 0, 1], + v: [ + [0, 0, 1], + [1, 0, 1], + [1, 1, 1], + [0, 1, 1], + ], + }, + { + n: [0, 0, -1], + v: [ + [1, 0, 0], + [0, 0, 0], + [0, 1, 0], + [1, 1, 0], + ], + }, +]; +export function boxVertices( + out, + pos, + box, + color, + material = 0, + skip = () => false, + yaw = 0, + opacity = 1, + textures = null, + state = "", + ambient = null, + emission = 0, + blockLight = null, + dynamicLight = false, + origin = [0,0,0], +) { + for (let f = 0; f < 6; f++) { + if (skip(faces[f].n)) continue; + const face = faces[f], + c = Math.cos(yaw), + s = Math.sin(yaw), + n = [ + face.n[0] * c - face.n[2] * s, + face.n[1], + face.n[0] * s + face.n[2] * c, + ]; + const light = ambient ? ambient(pos, box, face.n, face.v) : [1, 1, 1, 1]; + const propagated = !dynamicLight && blockLight ? blockLight.sampleFace(pos, box, face.n, face.v) : null; + // Flip the diagonal so occlusion interpolation has no dark triangular seam. + const indices = light[0] + light[2] > light[1] + light[3] + ? [0, 1, 3, 1, 2, 3] : [0, 1, 2, 0, 2, 3]; + for (const i of indices) { + const v = face.v[i].map( + (v, k) => box.min[k] + v * (box.max[k] - box.min[k]), + ); + const point = [pos[0] + v[0] * c - v[2] * s, pos[1] + v[1], pos[2] + v[0] * s + v[2] * c]; + const local = dynamicLight && blockLight ? blockLight.sample(point.map((p, axis) => p + n[axis] * 0.02)) : null; + out.push( + point[0]-origin[0], point[1]-origin[1], point[2]-origin[2], + ...(textures?.[f]?.tint || color), + ...n, + material, + opacity, + ...getFaceUV(f, v, state, textures?.[f]), + textures?.[f]?.layer ?? -1, + light[i], + emission, + ...(propagated?.block[i] || local?.block || [0, 0, 0]), + propagated?.sky[i] ?? local?.sky ?? 1, + ); + } + } +} +export function materialType(state = "", effect) { + if (effect === "bounce") return 5; + if (/^minecraft:(water|bubble_column)(\[|$)/.test(state)) return 6; + if (state.includes("grass_block")) return 1; + if (state.includes("planks")) return 2; + if (state.includes("brick")) return 3; + if (/log|stem|wood/.test(state)) return 4; + return 0; +} +/** + * Pure section meshing for both worker and synchronous fallback. World maps and + * the light field are immutable for a build. A caller may reuse faceTextureCache + * between sections; clear it whenever texture layers change. + */ +export function buildSectionMesh({ + id, blocks, materials, textureLayers = new Map(), blockLightField = null, + faceTextureCache = new Map(), localCoordinates = false, +}) { + const faceTextures = (mat) => { + if (!textureLayers.size) return null; + if (!faceTextureCache.has(mat.state)) + faceTextureCache.set(mat.state, getBlockFaceTextures(mat.state, textureLayers)); + return faceTextureCache.get(mat.state); + }; + const base = id.split(",").map((value) => Number(value) * 16), + vertices = [], transparent = [], + ambient = createAmbientOcclusionSampler(blocks, materials, + (mat) => !mat || (mat.opacity ?? 1) >= 1 && !faceTextures(mat)?.some(face => face?.cutout)); + for (let x = base[0]; x < base[0] + 16; x++) + for (let y = base[1]; y < base[1] + 16; y++) + for (let z = base[2]; z < base[2] + 16; z++) { + const pos = [x, y, z], + block = blocks.getAt ? blocks.getAt(x,y,z) : blocks.get(key(pos)); + if (!block) continue; + const mat = materials.get(block) || { + color: [150, 152, 142], + render: [unitBox], + }, + color = mat.color.map((v) => v / 255), + textures = faceTextures(mat), + cutout = textures?.some((face) => face?.cutout), + opacity = cutout ? 1 : (mat.opacity ?? 1), + full = isFullCube(mat) && !cutout; + for (const box of mat.render || [unitBox]) { + boxVertices( + opacity < 1 ? transparent : vertices, + pos, + box, + color, + materialType(mat.state, mat.effect), + (n) => { + if (!full) return false; + const neighbor = materials.get( + (blocks.getAt ? blocks.getAt(pos[0]+n[0],pos[1]+n[1],pos[2]+n[2]) : blocks.get(key(pos.map((v, i) => v + n[i])))), + ); + return ( + isFullCube(neighbor) && + !faceTextures(neighbor)?.some((face) => face?.cutout) + ); + }, + 0, + opacity, + textures, + mat.state, + ambient, + Math.max(0, Math.min(1, (mat.light || 0) / 15)), + blockLightField, false, localCoordinates ? base : [0,0,0], + ); + } + } + return { vertices: new Float32Array(vertices), transparent: new Float32Array(transparent), origin: localCoordinates ? base : [0,0,0] }; +} diff --git a/client/physics.wasm b/client/physics.wasm new file mode 100755 index 0000000000000000000000000000000000000000..2946513628e07f830f249624eaf813e8e1c929a0 GIT binary patch literal 247211 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 literal 0 HcmV?d00001 diff --git a/client/player-interpolation.js b/client/player-interpolation.js new file mode 100644 index 0000000..e413270 --- /dev/null +++ b/client/player-interpolation.js @@ -0,0 +1,21 @@ +/** Separate the last server pose from the pose currently drawn on screen. */ +export function updateRemotePlayer(previous, packet, instant = false) { + const preserve = previous && !instant; + const targetYaw = packet.yaw ?? 0; + return { + ...packet, + position: preserve ? previous.position : [...packet.position], + target: [...packet.position], + yaw: preserve ? previous.yaw : targetYaw, + targetYaw, + }; +} + +export function smoothRemotePlayer(player, blend) { + for (let axis = 0; axis < 3; axis++) + player.position[axis] += + (player.target[axis] - player.position[axis]) * blend; + // Follow the shortest arc, including when server angles cross ±π or 2π. + const delta = player.targetYaw - player.yaw; + player.yaw += Math.atan2(Math.sin(delta), Math.cos(delta)) * blend; +} diff --git a/client/player-physics.js b/client/player-physics.js new file mode 100644 index 0000000..025ba01 --- /dev/null +++ b/client/player-physics.js @@ -0,0 +1,256 @@ +/** The browser and authoritative server execute the same 20 Hz Rust solver. */ +export const PHYSICS_TICK_MS = 50; +export const EYE_HEIGHT = { standing: 1.62, crouching: 1.27, swimming: 0.4 }; + +const copyBody = (body) => ({ + ...body, + position: [...body.position], + velocity: [...body.velocity], +}); +const validBody = (body) => + [body?.position, body?.velocity].every( + (v) => Array.isArray(v) && v.length === 3 && v.every(Number.isFinite), + ); + +export async function loadPhysics(url = "/physics.wasm?v=movement-1") { + const response = await fetch(url, { cache: "no-cache" }); + if (!response.ok) throw Error(`Physics module: HTTP ${response.status}`); + let result; + try { + result = await WebAssembly.instantiateStreaming(response.clone(), {}); + } catch { + // Some local servers do not supply application/wasm. + result = await WebAssembly.instantiate(await response.arrayBuffer(), {}); + } + const api = result.instance.exports; + if ( + api.physics_version?.() !== 1 || + !api.memory || + ![ + "physics_input", + "physics_run", + "physics_output", + "physics_output_len", + ].every((name) => typeof api[name] === "function") + ) + throw Error("Incompatible physics module"); + const encoder = new TextEncoder(), + decoder = new TextDecoder(); + return (request) => { + const input = encoder.encode(JSON.stringify(request)); + if (input.length > 16 * 1024 * 1024) + throw Error("Physics input exceeds 16 MiB"); + const pointer = api.physics_input(input.length); + if (!pointer) throw Error("Physics input allocation failed"); + // The allocator/solver can grow memory: never retain an old typed view. + new Uint8Array(api.memory.buffer, pointer, input.length).set(input); + const status = api.physics_run(); + const output = JSON.parse( + decoder.decode( + new Uint8Array( + api.memory.buffer, + api.physics_output(), + api.physics_output_len(), + ), + ), + ); + if (status || !validBody(output)) + throw Error(output.error || "Invalid physics output"); + return output; + }; +} + +/** Build only the swept collision neighbourhood, including non-solid fluids. */ +export function samplePhysicsWorld(body, blocks, materials, bounds) { + if (!bounds || !validBody(body)) return null; + const min = [], + max = []; + for (let axis = 0; axis < 3; axis++) { + const pos = body.position[axis], + velocity = body.velocity[axis]; + min[axis] = Math.floor( + Math.min(pos, pos + velocity) - (axis === 1 ? 3 : 2), + ); + max[axis] = Math.floor( + Math.max(pos, pos + velocity) + (axis === 1 ? 4 : 2), + ); + // Unknown chunks are not empty air. Keep authority until they arrive. + if (!(axis === 1 && bounds.fullHeight) && (min[axis] < bounds.min[axis] || max[axis] > bounds.max[axis])) + return null; + } + if (bounds.fullHeight) { + // Above/below the declared world height is known void, not missing chunks. + min[1] = Math.max(min[1], bounds.min[1]); + max[1] = Math.min(max[1], bounds.max[1]); + } + if (blocks.hasSection) { + for(let x=Math.floor(min[0]/16);x<=Math.floor(max[0]/16);x++) + for(let y=Math.floor(min[1]/16);y<=Math.floor(max[1]/16);y++) + for(let z=Math.floor(min[2]/16);z<=Math.floor(max[2]/16);z++) + if(!blocks.hasSection(`${x},${y},${z}`) || blocks.readySections && !blocks.readySections.has(`${x},${y},${z}`))return null; + } + const records = []; + for (let x = min[0]; x <= max[0]; x++) + for (let y = min[1]; y <= max[1]; y++) + for (let z = min[2]; z <= max[2]; z++) { + const id = blocks.getAt ? blocks.getAt(x,y,z) : blocks.get(`${x},${y},${z}`); + if (!id) continue; + const material = materials.get(id); + if (!material) return null; + records.push({ + pos: [x, y, z], + state: material.state, + collision: material.collision, + }); + } + return { blocks: records }; +} + +/** Fixed steps are independent of display FPS; long stalls never create a burst. */ +export class PhysicsClock { + constructor() { + this.reset(); + } + reset() { + this.accumulator = 0; + } + advance(elapsed, step) { + this.accumulator += Math.max(0, Math.min(250, elapsed)); + let count = 0; + while (this.accumulator + 1e-7 >= PHYSICS_TICK_MS && count < 5) { + this.accumulator -= PHYSICS_TICK_MS; + count++; + step(); + } + return count; + } + get alpha() { + return Math.max(0, Math.min(1, this.accumulator / PHYSICS_TICK_MS)); + } +} + +/** Sequence-based reconciliation; physics state is never replaced by visual lerp. */ +export class LocalPrediction { + constructor(step, getWorld, historyLimit = 120) { + this.step = step; + this.getWorld = getWorld; + this.historyLimit = historyLimit; + this.reset(); + } + reset() { + this.body = null; + this.authority = null; + this.settings = {}; + this.pending = []; + this.ack = -1; + this.tick = -1; + this.epoch = null; + this.offset = [0, 0, 0]; + this.correction = 0; + this.waitingThrough = -1; + this.suspended = false; + this.preview = null; + } + simulate(body, input) { + const world = this.getWorld(body); + return world + ? this.step({ body, input, world, settings: this.settings }) + : null; + } + receive(motion, reset = false) { + if ( + !validBody(motion?.body) || + !Number.isSafeInteger(motion.ack) || + !Number.isSafeInteger(motion.tick) + ) + return false; + if (!reset && (motion.tick < this.tick || motion.ack < this.ack)) + return false; + if (!reset && this.epoch !== null && (motion.epoch ?? 0) < this.epoch) + return false; + const epochChanged = this.epoch !== null && motion.epoch !== this.epoch; + const teleport = + this.authority && + Math.hypot( + ...motion.body.position.map((v, i) => v - this.authority.position[i]), + ) > 8; + const instant = reset || epochChanged || teleport || !this.body; + const oldPosition = this.body?.position; + if (instant) { + this.pending = []; + this.offset = [0, 0, 0]; + this.waitingThrough = -1; + } + this.ack = motion.ack; + this.tick = motion.tick; + this.epoch = motion.epoch ?? 0; + this.settings = { ...(motion.settings || {}) }; + this.authority = copyBody(motion.body); + this.body = copyBody(motion.body); + this.pending = this.pending.filter(({ seq }) => seq > this.ack); + this.suspended = this.ack < this.waitingThrough; + if (!this.suspended) { + for (const { input } of this.pending) { + const next = this.simulate(this.body, input); + if (!next) { + this.suspended = true; + break; + } + this.body = next; + } + } + if (this.suspended) this.body = copyBody(this.authority); + this.correction = oldPosition + ? Math.hypot(...this.body.position.map((v, i) => v - oldPosition[i])) + : 0; + if (!instant && this.correction < 4) + for (let i = 0; i < 3; i++) + this.offset[i] += oldPosition[i] - this.body.position[i]; + else this.offset = [0, 0, 0]; + this.preview = null; + return true; + } + push(seq, input) { + if ( + !this.body || + seq <= this.ack || + seq <= (this.pending.at(-1)?.seq ?? -1) + ) + return false; + this.pending.push({ seq, input: { ...input } }); + if (this.pending.length > this.historyLimit) { + this.waitingThrough = this.pending.shift().seq; + this.suspended = true; + } + if (!this.suspended) { + const next = this.simulate(this.body, input); + if (next) this.body = next; + else this.suspended = true; + } + this.preview = null; + return !this.suspended; + } + sample(alpha, dt, input) { + if (!this.body) return null; + const damping = Math.exp(-15 * Math.max(0, dt)); + this.offset = this.offset.map((value) => value * damping); + let next = this.body; + if (!this.suspended) { + // This partial render step is disposable and is never sent or acknowledged. + const signature = JSON.stringify(input); + if (this.preview?.signature !== signature) + this.preview = { signature, body: this.simulate(this.body, input) }; + next = this.preview?.body || this.body; + } + return { + position: this.body.position.map( + (v, i) => v + (next.position[i] - v) * alpha + this.offset[i], + ), + eyeHeight: EYE_HEIGHT[this.body.pose] ?? 1.62, + body: this.body, + }; + } + invalidateWorld() { + this.preview = null; + } +} diff --git a/client/pointer-lock.js b/client/pointer-lock.js new file mode 100644 index 0000000..fca5d4a --- /dev/null +++ b/client/pointer-lock.js @@ -0,0 +1,115 @@ +/** Keep pointer capture retryable after browser errors and ordinary unlocks. */ +export class PointerLockController { + constructor(canvas, { onChange = () => {}, onError = () => {} } = {}) { + this.canvas = canvas; + this.document = canvas.ownerDocument; + this.onChange = onChange; + this.onError = onError; + this.status = this.locked ? "locked" : "idle"; + this.lastError = null; + this.generation = 0; + this.disposed = false; + this.cancelled = false; + this.observedLocked = this.locked; + this.changeListener = () => this.changed(); + this.errorListener = (event) => + this.failed( + event.error || + new Error(event.message || "Pointer lock was denied by the browser."), + this.generation, + ); + this.document.addEventListener("pointerlockchange", this.changeListener); + this.document.addEventListener("pointerlockerror", this.errorListener); + } + + get locked() { + return this.document.pointerLockElement === this.canvas; + } + + request() { + if (this.disposed || this.locked || this.status === "requesting") + return false; + const generation = ++this.generation; + this.cancelled = false; + this.lastError = null; + this.status = "requesting"; + if (typeof this.canvas.requestPointerLock !== "function") { + const error = new Error("This browser does not support pointer lock."); + error.name = "NotSupportedError"; + this.failed(error, generation, "unsupported"); + return false; + } + try { + if (this.canvas.tabIndex < 0) this.canvas.tabIndex = 0; + this.canvas.focus({ preventScroll: true }); + // Start synchronously: awaiting anything here loses the user's gesture. + const result = this.canvas.requestPointerLock(); + result?.then?.( + () => { + if (this.cancelled && this.locked) this.document.exitPointerLock?.(); + else if ( + !this.disposed && + generation === this.generation && + this.locked + ) + this.changed(); + }, + (error) => this.failed(error, generation), + ); + return true; + } catch (error) { + this.failed(error, generation); + return false; + } + } + + failed(error, generation, status = "error") { + if ( + this.disposed || + generation !== this.generation || + this.locked || + this.status !== "requesting" + ) + return; + this.generation++; + this.status = status; + this.lastError = error?.message + ? error + : new Error(String(error || "Pointer lock failed.")); + this.onError(this.lastError); + } + + changed() { + if (this.disposed) return; + if (this.locked && this.cancelled) { + this.document.exitPointerLock?.(); + return; + } + const locked = this.locked; + this.generation++; + this.status = locked ? "locked" : "idle"; + this.lastError = null; + if (locked !== this.observedLocked) { + this.observedLocked = locked; + this.onChange(locked); + } + } + + release() { + if (this.disposed) return; + const requesting = this.status === "requesting"; + this.generation++; + this.cancelled = true; + this.status = "idle"; + this.lastError = null; + if (this.locked || requesting) this.document.exitPointerLock?.(); + } + + dispose() { + if (this.disposed) return; + this.release(); + this.disposed = true; + this.document.removeEventListener("pointerlockchange", this.changeListener); + this.document.removeEventListener("pointerlockerror", this.errorListener); + } +} diff --git a/client/renderer.js b/client/renderer.js index f8b22a0..7385804 100644 --- a/client/renderer.js +++ b/client/renderer.js @@ -1,88 +1,31 @@ +import { EditMeshController } from "./edit-mesh-controller.js"; +import { captureEditMesh } from "./edit-mesh.js"; import { multiply, perspective, viewMatrix, key, - isFullCube, unitBox, project, } from "./math.js"; -const vertex = `#version 300 es -precision highp float;layout(location=0) in vec3 aPos;layout(location=1) in vec3 aColor;layout(location=2) in vec3 aNormal;layout(location=3) in float aMaterial;layout(location=4) in float aOpacity;uniform mat4 uVP;out vec3 vPos;out vec3 vColor;out vec3 vNormal;flat out float vMaterial;out float vOpacity;void main(){vOpacity=aOpacity;vPos=aPos;vColor=aColor;vNormal=aNormal;vMaterial=aMaterial;gl_Position=uVP*vec4(aPos,1.);}`; -const fragment = `#version 300 es -precision highp float;in vec3 vPos;in vec3 vColor;in vec3 vNormal;flat in float vMaterial;in float vOpacity;uniform vec3 uEye;uniform sampler2D uTexture;uniform bool uTextured;uniform sampler2D uEffectTexture;uniform bool uEffectTextured;uniform float uPulse;out vec4 outColor; -float hash(vec3 p){return fract(sin(dot(p,vec3(127.1,311.7,74.7)))*43758.5453);} -vec3 shacraftBounceTint(vec3 color,float pulse){return color;} -void main(){vec3 n=normalize(vNormal);vec2 uv=abs(n.y)>.5?vPos.xz:(abs(n.x)>.5?vPos.zy:vPos.xy);vec3 p=floor((vPos+n*.002)*16.);float noise=hash(p)*.14-.07;float pattern=1.; -if(vMaterial>1.5&&vMaterial<2.5){pattern=.89+.11*step(.07,fract(uv.y*4.));pattern*=.9+.1*step(.055,fract(uv.x*.5+floor(uv.y*4.)*.5));} -if(vMaterial>2.5&&vMaterial<3.5){pattern=.87+.13*step(.06,fract(uv.y*4.));pattern*=.84+.16*step(.045,fract(uv.x*2.+floor(uv.y*4.)*.5));} -if(vMaterial>3.5&&vMaterial<4.5){pattern=.91+.09*sin(floor(uv.x*16.)*1.73+sin(floor(uv.y*16.)*.22));} -float tex=uTextured?mix(.84,1.12,texture(uTexture,uv).r):1.;if(vMaterial>4.5&&uEffectTextured)tex=mix(.75,1.2,texture(uEffectTexture,uv).g);float diffuse=max(0.,dot(n,normalize(vec3(-.45,.86,.3))));float light=.69+diffuse*.34;vec3 color=clamp((vColor+noise)*pattern*tex*light,0.,1.);if(vMaterial>.5&&vMaterial<1.5&&n.y<.5)color=mix(color,vec3(.38,.29,.17),.65); -if(vMaterial>4.5)color=shacraftBounceTint(color,uPulse);float fog=1.-exp(-pow(distance(vPos,uEye)/74.,2.));color=mix(color,vec3(.70,.80,.79),fog*.91);outColor=vec4(color,vOpacity);}`; -const skyVert = `#version 300 es -precision highp float;out vec2 vUV;void main(){vec2 p=vec2((gl_VertexID<<1)&2,gl_VertexID&2);vUV=p;gl_Position=vec4(p*2.-1.,1.,1.);}`; -const skyFrag = `#version 300 es -precision highp float;in vec2 vUV;uniform float uPitch;uniform float uYaw;uniform float uAspect;out vec4 outColor;void main(){float h=vUV.y+uPitch*.72;vec3 color=mix(vec3(.77,.83,.77),vec3(.38,.65,.78),smoothstep(.14,1.2,h));vec2 sun=vec2(.77-uYaw*.3,.82-uPitch*.72);float d=length((vUV-sun)*vec2(uAspect,1.));color=mix(color,vec3(1.,.98,.8),smoothstep(.048,.039,d)*.98);color+=vec3(.045,.025,0.)*exp(-d*7.);outColor=vec4(color,1.);}`; +import { getBlockFaceTextures } from "./block-textures.js"; +import { prepareTexturePack } from "./texture-pack.js"; +import { boxVertices, buildSectionMesh } from "./mesh-geometry.js"; +import { TerrainController } from "./terrain-controller.js"; +import { affectedSectionKeys } from "./ambient-occlusion.js"; +import { shadowFrame } from "./shadow-frame.js"; +import { BlockLightController, inferLightBounds } from "./block-light-controller.js"; +import { changedLightSections } from "./light-changes.js"; +import { viewDistanceProfile } from "./view-distance.js"; +import { + worldVertex as vertex, worldFragment as fragment, + skyVertex as skyVert, skyFragment as skyFrag, + shadowVertex, shadowFragment, SUN_DIRECTION, +} from "./lighting-shaders.js"; const lineVertex = `#version 300 es -precision highp float;layout(location=0)in vec3 aPos;uniform mat4 uVP;void main(){gl_Position=uVP*vec4(aPos,1.);}`; +precision highp float;layout(location=0)in vec3 aPos;uniform mat4 uVP;uniform vec3 uOffset;void main(){gl_Position=uVP*vec4(aPos+uOffset,1.);}`; const lineFragment = `#version 300 es precision highp float;out vec4 outColor;void main(){outColor=vec4(.13,.21,.12,1.);}`; -const faces = [ - { - n: [1, 0, 0], - v: [ - [1, 0, 1], - [1, 0, 0], - [1, 1, 0], - [1, 1, 1], - ], - }, - { - n: [-1, 0, 0], - v: [ - [0, 0, 0], - [0, 0, 1], - [0, 1, 1], - [0, 1, 0], - ], - }, - { - n: [0, 1, 0], - v: [ - [0, 1, 1], - [1, 1, 1], - [1, 1, 0], - [0, 1, 0], - ], - }, - { - n: [0, -1, 0], - v: [ - [0, 0, 0], - [1, 0, 0], - [1, 0, 1], - [0, 0, 1], - ], - }, - { - n: [0, 0, 1], - v: [ - [0, 0, 1], - [1, 0, 1], - [1, 1, 1], - [0, 1, 1], - ], - }, - { - n: [0, 0, -1], - v: [ - [1, 0, 0], - [0, 0, 0], - [0, 1, 0], - [1, 1, 0], - ], - }, -]; function program(gl, vs, fs) { const p = gl.createProgram(); for (const [type, source] of [ @@ -102,54 +45,100 @@ function program(gl, vs, fs) { throw Error(gl.getProgramInfoLog(p)); return p; } -function boxVertices( - out, - pos, - box, - color, - material = 0, - skip = () => false, - yaw = 0, - opacity = 1, -) { - for (let f = 0; f < 6; f++) { - if (skip(faces[f].n)) continue; - const face = faces[f], - c = Math.cos(yaw), - s = Math.sin(yaw), - n = [ - face.n[0] * c - face.n[2] * s, - face.n[1], - face.n[0] * s + face.n[2] * c, - ]; - for (const i of [0, 1, 2, 0, 2, 3]) { - const v = face.v[i].map( - (v, k) => box.min[k] + v * (box.max[k] - box.min[k]), +/** Avatar geometry follows the public physics pose; yaw remains interpolated. */ +export function playerAvatarParts(player) { + const pose = player.pose || "standing", + swimming = pose === "swimming", + crouching = pose === "crouching", + defaultHeight = swimming ? 0.6 : crouching ? 1.5 : 1.8, + height = Number.isFinite(player.height) + ? Math.max(0.4, Math.min(2.5, player.height)) + : defaultHeight, + eye = Number.isFinite(player.eye_height) + ? player.eye_height + : height - (swimming ? 0.2 : crouching ? 0.23 : 0.18), + shirt = player.color || [0.29, 0.46, 0.36], + skin = [0.77, 0.61, 0.43], + trousers = [0.25, 0.3, 0.32], + parts = [], + add = (part, min, max, color, material = 0) => + parts.push({ part, box: { min, max }, color, material }); + if (swimming) { + // The collider is short while the visible body lies along its facing axis. + add( + "torso", + [-0.21, height * 0.24, -0.36], + [0.21, height * 0.7, 0.28], + shirt, + 2, + ); + add("head", [-0.23, height * 0.2, -0.82], [0.23, height, -0.36], skin); + for (const side of [-1, 1]) { + add( + "leg", + [side * 0.13 - 0.085, height * 0.27, 0.28], + [side * 0.13 + 0.085, height * 0.57, 0.89], + trousers, ); - out.push( - pos[0] + v[0] * c - v[2] * s, - pos[1] + v[1], - pos[2] + v[0] * s + v[2] * c, - ...color, - ...n, - material, - opacity, + add( + "arm", + [side * 0.31 - 0.085, height * 0.22, -0.38], + [side * 0.31 + 0.085, height * 0.55, 0.24], + shirt, ); } + add( + "eyes", + [-0.18, eye - 0.04, -0.824], + [0.18, eye + 0.04, -0.816], + [0.13, 0.19, 0.15], + ); + } else { + const headBottom = height - 0.5, + hip = crouching ? headBottom - 0.55 : headBottom - 0.64, + lean = crouching ? -0.13 : 0; + add( + "torso", + [-0.21, hip, -0.13 + lean * 0.5], + [0.21, headBottom, 0.13 + lean * 0.5], + shirt, + 2, + ); + add( + "head", + [-0.23, headBottom, -0.23 + lean], + [0.23, height, 0.23 + lean], + skin, + ); + for (const side of [-1, 1]) { + const knee = crouching ? 0.07 : 0; + add( + "leg", + [side * 0.13 - 0.085, 0.02, -0.09 + knee], + [side * 0.13 + 0.085, hip, 0.09 + knee], + trousers, + ); + add( + "arm", + [side * 0.31 - 0.085, hip, -0.1 + lean], + [side * 0.31 + 0.085, headBottom - 0.03, 0.1 + lean], + shirt, + ); + } + add( + "eyes", + [-0.18, eye - 0.04, -0.234 + lean], + [0.18, eye + 0.04, -0.226 + lean], + [0.13, 0.19, 0.15], + ); } -} -function materialType(state = "", effect) { - if (effect === "bounce") return 5; - if (state.includes("grass_block")) return 1; - if (state.includes("planks")) return 2; - if (state.includes("brick")) return 3; - if (/log|stem|wood/.test(state)) return 4; - return 0; + return parts; } const section = (p) => p.map((v) => Math.floor(v / 16)).join(","); export class Renderer { constructor(canvas) { this.canvas = canvas; + this.renderOrigin = [0,0,0]; this.selectionOrigin = [0,0,0]; const gl = (this.gl = canvas.getContext("webgl2", { antialias: true, alpha: false, @@ -163,10 +152,44 @@ export class Renderer { this.program = program(gl, vertex, fragment); this.sky = program(gl, skyVert, skyFrag); this.line = program(gl, lineVertex, lineFragment); + this.shadowProgram = program(gl, shadowVertex, shadowFragment); + this.shadowSize = Math.min(2048, gl.getParameter(gl.MAX_TEXTURE_SIZE)); + this.shadowRadius = 48; + this.shadowsEnabled = true; + this.shadowReady = this.createShadowMap(); + this.lightingName = "Daylight"; + this.daylight = 1; this.sections = new Map(); + this.publishedSections = new Set(); + this.loadStarted = performance.now(); + this.firstTerrainMs = null; this.dirty = new Set(); this.blocks = new Map(); this.materials = new Map(); + this.blockLightField = null; + this.lightViewBounds = null; + this.meshUpload = null; + this.terrain = new TerrainController({ + onLight: field => { this.blockLightField = field; }, + onDirty: ids => { + for (const id of ids) if (this.sectionInView(id)) this.dirty.add(id); + }, + onError: () => this.enableTerrainFallback(), + }); + if (this.terrain.error) { + // Some embedded browsers do not support workers. Keep the game usable + // through the former CPU path, and identify it in diagnostics. + this.terrain.dispose(); + this.terrain = null; + this.blockLighting = new BlockLightController(field => { + for (const id of changedLightSections(this.blockLightField, field, this.sections.keys())) this.dirty.add(id); + this.blockLightField = field; + }); + } else this.blockLighting = this.terrain; + if (this.terrain) this.edits = new EditMeshController({ + capture: id => captureEditMesh(id, this.blocks, this.materials, this.textureLayers, this.blockLightField), + onError: error => console.warn("Shacraft edit worker unavailable; using terrain queue", error), + }); this.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texImage2D( @@ -199,10 +222,18 @@ export class Renderer { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); this.effectTextured = false; + this.blockTexture = this.createBlockTexture(1, 1); + this.blockAtlasGrid = [0, 0]; + this.blockGrassOverlay = [-1, -1]; + this.textureLayers = new Map(); + this.faceTextureCache = new Map(); + this.texturePackGeneration = 0; this.bounceAt = -10000; this.dynamic = this.mesh([]); this.lines = this.mesh([], 3); this.triangles = 0; + this.meshRebuilds = 0; + this.meshResets = 0; this.vp = new Float32Array(16); this.lost = false; canvas.addEventListener("webglcontextlost", (e) => { @@ -211,7 +242,63 @@ export class Renderer { }); canvas.addEventListener("webglcontextrestored", () => location.reload()); } - mesh(data, stride = 11) { + createShadowMap() { + const gl = this.gl; + this.shadowTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.shadowTexture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24, + this.shadowSize, this.shadowSize, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, 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); + this.shadowFramebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.shadowFramebuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.shadowTexture, 0); + gl.drawBuffers([gl.NONE]); + gl.readBuffer(gl.NONE); + const ready = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE; + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + return ready; + } + drawShadows(frame) { + if (!this.shadowsEnabled || !this.shadowReady) return; + const gl = this.gl, p = this.shadowProgram; + gl.bindFramebuffer(gl.FRAMEBUFFER, this.shadowFramebuffer); + gl.viewport(0, 0, this.shadowSize, this.shadowSize); + gl.colorMask(false, false, false, false); + gl.depthMask(true); + gl.clear(gl.DEPTH_BUFFER_BIT); + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.BLEND); + gl.enable(gl.CULL_FACE); + gl.cullFace(gl.BACK); + gl.frontFace(gl.CCW); + gl.enable(gl.POLYGON_OFFSET_FILL); + gl.polygonOffset(1.1, 2.); + gl.useProgram(p); + gl.uniformMatrix4fv(gl.getUniformLocation(p, "uLightVP"), false, frame.matrix); + gl.activeTexture(gl.TEXTURE2); + gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.blockTexture); + gl.uniform1i(gl.getUniformLocation(p, "uBlockTextures"), 2); + gl.uniform2fv(gl.getUniformLocation(p, "uBlockAtlasGrid"), this.blockAtlasGrid); + gl.uniform2fv(gl.getUniformLocation(p, "uGrassOverlay"), this.blockGrassOverlay); + for (const mesh of this.sections.values()) { + this.meshOffset(p,mesh.origin); + gl.bindVertexArray(mesh.vao); + gl.drawArrays(gl.TRIANGLES, 0, mesh.count); + } + this.meshOffset(p,this.renderOrigin); + gl.bindVertexArray(this.dynamic.vao); + gl.drawArrays(gl.TRIANGLES, 0, this.dynamic.count); + gl.disable(gl.POLYGON_OFFSET_FILL); + gl.colorMask(true, true, true, true); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + } + meshOffset(program,origin=[0,0,0]) { + this.gl.uniform3fv(this.gl.getUniformLocation(program,"uOffset"),origin.map((v,i)=>v-this.renderOrigin[i])); + } + mesh(data, stride = 20) { const gl = this.gl, vao = gl.createVertexArray(), buffer = gl.createBuffer(); @@ -226,6 +313,9 @@ export class Renderer { [2, 3, 6], [3, 1, 9], [4, 1, 10], + [5, 3, 11], + [6, 2, 14], + [7, 4, 16], ]) { gl.enableVertexAttribArray(loc); gl.vertexAttribPointer( @@ -244,7 +334,7 @@ export class Renderer { this.gl.deleteBuffer(mesh.buffer); this.gl.deleteVertexArray(mesh.vao); } - upload(mesh, data, stride = 11) { + upload(mesh, data, stride = 20) { const gl = this.gl; gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.DYNAMIC_DRAW); @@ -291,61 +381,259 @@ export class Renderer { if (effect) this.effectTextured = true; else this.textured = true; } + createBlockTexture(size, layers, height = size) { + const gl = this.gl, + texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture); + gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, size, height, layers); + gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.REPEAT); + return texture; + } + clearTexturePack() { + this.texturePackGeneration++; + this.blockAtlasGrid = [0, 0]; + this.blockGrassOverlay = [-1, -1]; + this.textureLayers.clear(); + this.faceTextureCache.clear(); + this.gl.deleteTexture(this.blockTexture); + this.blockTexture = this.createBlockTexture(1, 1); + this.invalidate(); + } + async setTexturePack(descriptor, files) { + const gl = this.gl; + const {layers, width, height, atlas, entries, grassOverlay} = prepareTexturePack(descriptor, files, { + layers: gl.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS), size: gl.getParameter(gl.MAX_TEXTURE_SIZE), + }); + const bitmaps = []; + const generation = ++this.texturePackGeneration; + let next; + try { + for (const entry of atlas ? [atlas] : entries) { + const bitmap = await createImageBitmap(files.get(entry.path), { + premultiplyAlpha: "none", + colorSpaceConversion: "none", + }); + bitmaps.push(bitmap); + if (generation !== this.texturePackGeneration) return; + if (bitmap.width !== width || bitmap.height !== height) + throw Error(`Текстура ${entry.name || "atlas"} должна быть ${width}×${height}.`); + } + // Separate array layers prevent atlas bleeding; only native pixel data reaches the GPU. + next = this.createBlockTexture(width, bitmaps.length, height); + for (let i = 0; i < bitmaps.length; i++) + gl.texSubImage3D( + gl.TEXTURE_2D_ARRAY, + 0, + 0, + 0, + i, + width, + height, + 1, + gl.RGBA, + gl.UNSIGNED_BYTE, + bitmaps[i], + ); + gl.deleteTexture(this.blockTexture); + this.blockTexture = next; + next = null; + this.textureLayers = layers; + this.blockAtlasGrid = atlas ? [atlas.columns, atlas.rows] : [0, 0]; + this.blockGrassOverlay = grassOverlay; + this.faceTextureCache.clear(); + this.invalidate(); + } finally { + for (const bitmap of bitmaps) bitmap.close(); + if (next) gl.deleteTexture(next); + } + } + faceTextures(mat) { + if (!this.textureLayers.size) return null; + if (!this.faceTextureCache.has(mat.state)) + this.faceTextureCache.set( + mat.state, + getBlockFaceTextures(mat.state, this.textureLayers), + ); + return this.faceTextureCache.get(mat.state); + } replace(blocks, materials) { + this.meshResets++; + this.loadStarted = performance.now(); this.firstTerrainMs = null; + this.publishedSections?.clear(); + this.edits?.reset(); for (const m of this.sections.values()) this.disposeMesh(m); this.sections.clear(); this.dirty.clear(); this.blocks = blocks; this.materials = materials; - for (const k of blocks.keys()) - this.dirty.add(section(k.split(",").map(Number))); + this.blockLightField = null; + if (this.terrain) this.terrain.reset(blocks, materials, this.textureLayers, this.lightViewBounds); + else this.requestBlockLighting(); + if (blocks.loadedSectionKeys) for (const id of blocks.loadedSectionKeys()) this.dirty.add(id); + else for (const k of blocks.keys()) this.dirty.add(section(k.split(",").map(Number))); } - change(changes) { + change(changes, sectionIds = null, sectionRecords = null) { + if (!sectionIds && changes.length > 64) this.edits?.reset(); + const owners = changes.map(({pos}) => section(pos)); + const urgent = !sectionIds && changes.length <= 64 ? [...new Set([...owners, ...changes.flatMap(({pos}) => + affectedSectionKeys(pos, [{ min: [-2, -2, -2], max: [3, 3, 3] }]).filter(id => this.sections.has(id) || this.edits?.tickets.has(id)))])].filter(id => this.sectionInView(id)) : []; + if (changes.length || sectionRecords) { + if (this.terrain) this.terrain.update({ ...(sectionRecords ? { sections: sectionRecords } : { changes }), materials: this.materials }); + else this.requestBlockLighting(); + } + if (sectionIds) { + const affected = new Set(); + // A stream packet already identifies whole entering/departing sections. + // Mark their halos once instead of repeating the same work per voxel. + for (const coords of sectionIds) + for (let x = -1; x <= 1; x++) + for (let y = -1; y <= 1; y++) + for (let z = -1; z <= 1; z++) { + const id = coords.map((v, axis) => v + [x, y, z][axis]).join(","); + if (this.sectionInView(id)) this.dirty.add(id); + affected.add(id); + } + this.edits?.request([...this.edits.tickets.keys()].filter(id => affected.has(id))); + return; + } + this.edits?.request(urgent); for (const { pos } of changes) { - this.dirty.add(section(pos)); - for (const f of faces) - this.dirty.add(section(pos.map((v, i) => v + f.n[i]))); + // Geometry and corner lighting can cross section edges diagonally. + for (const id of affectedSectionKeys(pos, [{ min: [-2, -2, -2], max: [3, 3, 3] }])) + this.dirty.add(id); } } + unloadSections(ids) { + if (ids.length) { + if (this.terrain) this.terrain.update({ unload: ids }); + else this.requestBlockLighting(); + } + const removed = new Set(ids.map((id) => id.join(","))); + for (const id of removed) { + this.edits?.cancel(id); + this.publishedSections?.delete(id); + const mesh = this.sections.get(id); + if (mesh) this.disposeMesh(mesh); + this.sections.delete(id); + this.dirty.delete(id); + } + // Retained face and diagonal neighbors may lose an occluder. + const refreshEdits = new Set(); + for (const coords of ids) + for (let x = -1; x <= 1; x++) + for (let y = -1; y <= 1; y++) + for (let z = -1; z <= 1; z++) { + const neighbor = coords.map((v, axis) => v + [x, y, z][axis]).join(","); + if (!removed.has(neighbor) && this.sections.has(neighbor)) this.dirty.add(neighbor); + if (!removed.has(neighbor) && this.edits?.tickets.has(neighbor)) refreshEdits.add(neighbor); + } + this.edits?.request([...refreshEdits]); + } invalidate() { - for (const k of this.blocks.keys()) - this.dirty.add(section(k.split(",").map(Number))); + this.edits?.reset(); + if (this.terrain) this.terrain.update({ materials: this.materials, textures: this.textureLayers }); + else this.requestBlockLighting(); + if (this.blocks.loadedSectionKeys) for (const id of this.blocks.loadedSectionKeys()) this.dirty.add(id); + else for (const k of this.blocks.keys()) this.dirty.add(section(k.split(",").map(Number))); + } + setLightBounds(bounds) { + if (JSON.stringify(bounds) === JSON.stringify(this.lightViewBounds)) return; + this.lightViewBounds = bounds; + if (this.terrain) this.terrain.update({ bounds }); + else this.requestBlockLighting(); + } + requestBlockLighting() { + if (this.terrain) { this.terrain.update({ materials: this.materials }); return; } + if (this.blockLighting) + this.blockLighting.request(this.blocks, this.materials, this.lightViewBounds || inferLightBounds(this.blocks)); + } + enableTerrainFallback() { + if (!this.terrain) return; + this.terrain.dispose(); + this.edits?.dispose(); + this.discardMeshUpload(); + this.terrain = null; + this.blockLighting = new BlockLightController(field => { + for (const id of changedLightSections(this.blockLightField, field, this.sections.keys())) this.dirty.add(id); + this.blockLightField = field; + }); + this.requestBlockLighting(); + for (const key of this.blocks.keys()) this.dirty.add(section(key.split(",").map(Number))); + } + sectionInView(id) { + if (!this.lightViewBounds) return true; + return id.split(",").every((value, axis) => { + const base = Number(value) * 16; + return base <= this.lightViewBounds.max[axis] && base + 15 >= this.lightViewBounds.min[axis]; + }); + } + discardMeshUpload() { + if (!this.meshUpload) return; + for (const part of this.meshUpload.parts) if (part.mesh) this.disposeMesh(part.mesh); + this.meshUpload = null; + } + isMeshCurrent(result) { + return result.editJob !== undefined ? Boolean(this.edits?.isCurrent(result)) : this.terrain.isCurrent(result); + } + /** Upload at most 64 KiB per step; publish both surfaces only when complete. */ + applyTerrainMeshes(budgetMs) { + const start = performance.now(), gl = this.gl; + if (this.meshUpload && !this.isMeshCurrent(this.meshUpload.result)) this.discardMeshUpload(); + while (performance.now() - start < budgetMs) { + if (!this.meshUpload) { + const queue = this.edits?.ready.size ? this.edits.ready : this.terrain.ready; + const result = queue.values().next().value; + if (!result) break; + queue.delete(result.id); + if (!this.isMeshCurrent(result) || !this.sectionInView(result.id)) continue; + const parts = [result.vertices, result.transparent].map(data => ({ data, mesh: null, offset: 0 })); + this.meshUpload = { result, parts }; + } + const pending = this.meshUpload; + const part = pending.parts.find(p => p.offset < p.data.length); + if (part) { + if (!part.mesh) { + part.mesh = this.mesh([]); + part.mesh.count = part.data.length / 20; + gl.bindBuffer(gl.ARRAY_BUFFER, part.mesh.buffer); + gl.bufferData(gl.ARRAY_BUFFER, part.data.byteLength, gl.STATIC_DRAW); + if (performance.now() - start >= budgetMs) break; + } + const end = Math.min(part.offset + 16384, part.data.length); + gl.bindBuffer(gl.ARRAY_BUFFER, part.mesh.buffer); + gl.bufferSubData(gl.ARRAY_BUFFER, part.offset * 4, part.data.subarray(part.offset, end)); + part.offset = end; + } else { + const { id } = pending.result, previous = this.sections.get(id); + const [opaque, transparent] = pending.parts; + if (opaque.mesh || transparent.mesh) { + const next = opaque.mesh || this.mesh([]); + next.transparent = transparent.mesh; + next.origin = pending.result.origin || [0,0,0]; + if (previous) { + const retired = { vao: previous.vao, buffer: previous.buffer, transparent: previous.transparent }; + Object.assign(previous, next); + this.disposeMesh(retired); + } else this.sections.set(id, next); + } else if (previous) { this.disposeMesh(previous); this.sections.delete(id); } + if (!pending.result.preview) { this.dirty.delete(id); this.edits?.cancel(id); } + this.publishedSections?.add(id); + if (this.firstTerrainMs === null && this.sections.has(id)) this.firstTerrainMs=performance.now()-this.loadStarted; + this.onMeshPublished?.(id, pending.result); + this.meshRebuilds++; + this.meshUpload = null; + } + } + this.meshUploadMilliseconds = performance.now() - start; } rebuild(id) { - const base = id.split(",").map((v) => Number(v) * 16), - vertices = [], - transparent = []; - for (let x = base[0]; x < base[0] + 16; x++) - for (let y = base[1]; y < base[1] + 16; y++) - for (let z = base[2]; z < base[2] + 16; z++) { - const pos = [x, y, z], - block = this.blocks.get(key(pos)); - if (!block) continue; - const mat = this.materials.get(block) || { - color: [150, 152, 142], - render: [unitBox], - }, - color = mat.color.map((v) => v / 255), - full = isFullCube(mat); - for (const box of mat.render || [unitBox]) { - boxVertices( - mat.opacity < 1 ? transparent : vertices, - pos, - box, - color, - materialType(mat.state, mat.effect), - (n) => - full && - isFullCube( - this.materials.get( - this.blocks.get(key(pos.map((v, i) => v + n[i]))), - ), - ), - 0, - mat.opacity ?? 1, - ); - } - } + this.meshRebuilds++; + const { vertices, transparent, origin } = buildSectionMesh({ id, blocks: this.blocks, + materials: this.materials, textureLayers: this.textureLayers, + faceTextureCache: this.faceTextureCache, blockLightField: this.blockLightField, localCoordinates: true }); let mesh = this.sections.get(id); if (mesh) this.upload(mesh, vertices); else if (vertices.length || transparent.length) { @@ -353,6 +641,7 @@ export class Renderer { this.sections.set(id, mesh); } if (mesh) { + mesh.origin = origin; if (mesh.transparent) this.upload(mesh.transparent, transparent); else if (transparent.length) mesh.transparent = this.mesh(transparent); } @@ -362,6 +651,7 @@ export class Renderer { } } updateSelection(hit) { + this.selectionOrigin = hit ? hit.pos.map(v=>Math.floor(v/16)*16) : [0,0,0]; const a = []; if (hit) { const mat = this.materials.get(hit.block), @@ -372,7 +662,7 @@ export class Renderer { points.push( [0, 1, 2].map( (k) => - hit.pos[k] + + hit.pos[k] - this.selectionOrigin[k] + ((i >> k) & 1 ? box.max[k] + 0.003 : box.min[k] - 0.003), ), ); @@ -386,6 +676,7 @@ export class Renderer { } draw(camera, players, entities, entityDefinitions) { if (this.lost) return; + const distance = viewDistanceProfile(this.viewDistance); const gl = this.gl, ratio = Math.min(devicePixelRatio || 1, 1.75), w = Math.floor(this.canvas.clientWidth * ratio), @@ -394,40 +685,131 @@ export class Renderer { this.canvas.width = w; this.canvas.height = h; } + if (this.terrain) { + this.edits?.pump(); + this.applyTerrainMeshes(2); + const eye = camera.eye; + let nearest = null, distance = Infinity; + if (!this.terrain.busy && !this.terrain.pending && this.terrain.ready.size < 2) for (const id of this.dirty) { + if (!this.sectionInView(id)) { this.dirty.delete(id); continue; } + if (this.blocks.readySections && !this.blocks.readySections.has(id)) continue; + if (this.blocks.sectionIsEmpty?.(id)) { + const mesh = this.sections.get(id); + if (mesh) this.disposeMesh(mesh); + this.sections.delete(id); this.dirty.delete(id); this.edits?.cancel(id); + this.publishedSections?.add(id); + continue; + } + if (this.terrain.ready.has(id) || this.meshUpload?.result.id === id || this.terrain.busy?.id === id) continue; + const center = id.split(",").map(v => Number(v) * 16 + 8); + const next = center.reduce((sum, v, axis) => sum + (v - eye[axis]) ** 2, 0); + if (next < distance) { distance = next; nearest = id; } + } + if (nearest !== null) this.terrain.requestMesh(nearest); + } else { + const start = performance.now(); + for (const id of this.dirty) { + this.rebuild(id); this.dirty.delete(id); + if (performance.now() - start > 2) break; + } + } + this.renderOrigin = camera.eye.map(v=>Math.floor(v/16)*16); + const localEye = camera.eye.map((v,i)=>v-this.renderOrigin[i]); + const dynamic = []; + for (const p of players) { + for (const part of playerAvatarParts(p)) + boxVertices( + dynamic, + p.position, + part.box, + part.color, + part.material, + () => false, + p.yaw || 0, + 1, null, "", null, 0, this.blockLightField, true, this.renderOrigin, + ); + } + for (const e of entities) { + const def = entityDefinitions.get(e.kind || e.name) || {}, + color = (e.color || def.color || [192, 161, 123]).map((v) => v / 255), + boxes = e.render || + def.render || [{ min: [-0.3, 0, -0.3], max: [0.3, 0.8, 0.3] }]; + for (const b of boxes) + boxVertices(dynamic, e.position, b, color, 0, () => false, e.yaw || 0, + 1, null, "", null, 0, this.blockLightField, true, this.renderOrigin); + } + this.upload(this.dynamic, dynamic); + const shadow = shadowFrame(localEye, SUN_DIRECTION, this.shadowSize, this.shadowRadius); + this.drawShadows(shadow); + this.canvas.dataset.lighting = this.lightingName; + const center=camera.eye.map(v=>Math.floor(v/16)); + let nearReady=0,nearLoaded=0; + for(let x=-1;x<=1;x++)for(let y=-1;y<=1;y++)for(let z=-1;z<=1;z++) { + const id=`${center[0]+x},${center[1]+y},${center[2]+z}`; + if(this.publishedSections?.has(id))nearReady++; + if(this.blocks.readySections?.has(id))nearLoaded++; + } + this.canvas.dataset.nearMeshes=String(nearReady); + this.canvas.dataset.nearLoaded=String(nearLoaded); + this.canvas.dataset.firstTerrainMs=this.firstTerrainMs===null ? "" : String(Math.round(this.firstTerrainMs)); + this.canvas.dataset.terrainMeshing = this.terrain?.meshWorker ? "local-light-worker" : "shared-worker"; + this.canvas.dataset.localLightCells = String(this.terrain?.localLightCells || 0); + this.canvas.dataset.localLightMs = String(Math.round((this.terrain?.localLightMilliseconds || 0)*100)/100); + this.canvas.dataset.editPrepareMs = String(Math.round((this.edits?.prepareMilliseconds || 0) * 100) / 100); + this.canvas.dataset.editMeshMs = String(Math.round((this.edits?.meshMilliseconds || 0) * 100) / 100); + this.canvas.dataset.editWorker = this.edits && !this.edits.error && !this.edits.disposed ? "ready" : "fallback"; + this.canvas.dataset.terrainMode = this.terrain ? "worker" : "main-thread-fallback"; + this.canvas.dataset.terrainPrepareMs = String(Math.round((this.terrain?.prepareMilliseconds || 0) * 100) / 100); + this.canvas.dataset.meshBuildMs = String(Math.round((this.terrain?.meshMilliseconds || 0) * 100) / 100); + this.canvas.dataset.meshUploadMs = String(Math.round((this.meshUploadMilliseconds || 0) * 100) / 100); + this.canvas.dataset.timeOfDay = this.daylight === 0 ? "night" : "day"; + this.canvas.dataset.shadows = this.shadowsEnabled && this.shadowReady ? String(this.shadowSize) : "off"; + this.canvas.dataset.blockLighting = this.blockLighting.status; + this.canvas.dataset.lightSources = String(this.blockLightField?.sourceCount || 0); + this.canvas.dataset.lightBuildMs = String(Math.round(this.blockLighting.milliseconds || 0)); + const eyeLight = this.blockLightField?.sample(camera.eye); + this.canvas.dataset.blockLight = String(eyeLight?.blockLevel ?? 0); + this.canvas.dataset.skyLight = String(eyeLight?.skyLevel ?? 15); gl.viewport(0, 0, w, h); gl.clearColor(0.65, 0.79, 0.8, 1); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); gl.disable(gl.DEPTH_TEST); gl.disable(gl.CULL_FACE); gl.useProgram(this.sky); + gl.uniform1f(gl.getUniformLocation(this.sky, "uDaylight"), this.daylight); + gl.uniform1f(gl.getUniformLocation(this.sky, "uSkyExposure"), ((eyeLight?.skyLevel ?? 15) / 15) ** 2); gl.uniform1f(gl.getUniformLocation(this.sky, "uPitch"), camera.pitch); gl.uniform1f(gl.getUniformLocation(this.sky, "uYaw"), camera.yaw); gl.uniform1f(gl.getUniformLocation(this.sky, "uAspect"), w / h); + gl.uniform1f(gl.getUniformLocation(this.sky, "uTanHalfFov"), Math.tan(Math.PI / 5.4)); gl.bindVertexArray(null); gl.drawArrays(gl.TRIANGLES, 0, 3); this.vp = multiply( - perspective(Math.PI / 2.7, w / h, 0.06, 190), - viewMatrix(camera.eye, camera.yaw, camera.pitch), + perspective(Math.PI / 2.7, w / h, 0.06, distance.farClip), + viewMatrix(localEye, camera.yaw, camera.pitch), ); - const start = performance.now(); - let rebuilt = 0; - for (const id of this.dirty) { - this.rebuild(id); - this.dirty.delete(id); - rebuilt++; - if (rebuilt >= 3 || performance.now() - start > 7) break; - } gl.enable(gl.DEPTH_TEST); gl.enable(gl.CULL_FACE); gl.cullFace(gl.BACK); gl.frontFace(gl.CCW); gl.useProgram(this.program); + gl.uniform1f(gl.getUniformLocation(this.program, "uDaylight"), this.daylight); + gl.uniform1f(gl.getUniformLocation(this.program, "uFogDistance"), distance.fogDistance); + gl.uniform1f(gl.getUniformLocation(this.program, "uViewDistance"), distance.radius); gl.uniformMatrix4fv( gl.getUniformLocation(this.program, "uVP"), false, this.vp, ); - gl.uniform3fv(gl.getUniformLocation(this.program, "uEye"), camera.eye); + gl.uniform3fv(gl.getUniformLocation(this.program, "uEye"), localEye); + gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "uLightVP"), false, shadow.matrix); + gl.uniform3fv(gl.getUniformLocation(this.program, "uShadowCenter"), shadow.center); + gl.uniform1f(gl.getUniformLocation(this.program, "uShadowRadius"), shadow.radius); + gl.uniform1f(gl.getUniformLocation(this.program, "uShadowTexel"), 1 / this.shadowSize); + gl.uniform1i(gl.getUniformLocation(this.program, "uShadows"), this.shadowsEnabled && this.shadowReady ? 1 : 0); + gl.activeTexture(gl.TEXTURE3); + gl.bindTexture(gl.TEXTURE_2D, this.shadowTexture); + gl.uniform1i(gl.getUniformLocation(this.program, "uShadowMap"), 3); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.uniform1i(gl.getUniformLocation(this.program, "uTexture"), 0); @@ -442,6 +824,11 @@ export class Renderer { gl.getUniformLocation(this.program, "uEffectTextured"), this.effectTextured ? 1 : 0, ); + gl.activeTexture(gl.TEXTURE2); + gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.blockTexture); + gl.uniform1i(gl.getUniformLocation(this.program, "uBlockTextures"), 2); + gl.uniform2fv(gl.getUniformLocation(this.program, "uBlockAtlasGrid"), this.blockAtlasGrid); + gl.uniform2fv(gl.getUniformLocation(this.program, "uGrassOverlay"), this.blockGrassOverlay); gl.uniform1f( gl.getUniformLocation(this.program, "uPulse"), Math.max(0, 1 - (performance.now() - this.bounceAt) / 600), @@ -450,80 +837,17 @@ export class Renderer { for (const [id, m] of this.sections) { const center = id.split(",").map((v) => Number(v) * 16 + 8); if ( - Math.hypot(center[0] - camera.eye[0], center[2] - camera.eye[2]) > 135 + Math.hypot(center[0] - camera.eye[0], center[2] - camera.eye[2]) > distance.drawRadius ) continue; + this.meshOffset(this.program,m.origin); gl.bindVertexArray(m.vao); gl.drawArrays(gl.TRIANGLES, 0, m.count); this.triangles += m.count / 3; } - const dynamic = []; - for (const p of players) { - const c = p.color || [0.29, 0.46, 0.36], - yaw = p.yaw || 0; - boxVertices( - dynamic, - p.position, - { min: [-0.21, 0.63, -0.13], max: [0.21, 1.27, 0.13] }, - c, - 2, - () => false, - yaw, - ); - boxVertices( - dynamic, - p.position, - { min: [-0.23, 1.27, -0.23], max: [0.23, 1.73, 0.23] }, - [0.77, 0.61, 0.43], - 0, - () => false, - yaw, - ); - for (const side of [-1, 1]) { - boxVertices( - dynamic, - p.position, - { - min: [side * 0.13 - 0.085, 0.02, -0.09], - max: [side * 0.13 + 0.085, 0.63, 0.09], - }, - [0.25, 0.3, 0.32], - 0, - () => false, - yaw, - ); - boxVertices( - dynamic, - p.position, - { - min: [side * 0.31 - 0.085, 0.63, -0.1], - max: [side * 0.31 + 0.085, 1.24, 0.1], - }, - c, - 0, - () => false, - yaw, - ); - } - boxVertices( - dynamic, - p.position, - { min: [-0.18, 1.56, -0.234], max: [0.18, 1.64, -0.226] }, - [0.13, 0.19, 0.15], - 0, - () => false, - yaw, - ); - } - for (const e of entities) { - const def = entityDefinitions.get(e.kind || e.name) || {}, - color = (e.color || def.color || [192, 161, 123]).map((v) => v / 255), - boxes = e.render || - def.render || [{ min: [-0.3, 0, -0.3], max: [0.3, 0.8, 0.3] }]; - for (const b of boxes) - boxVertices(dynamic, e.position, b, color, 0, () => false, e.yaw || 0); - } - this.upload(this.dynamic, dynamic); + // Actor vertices already use the camera origin. Reset the world program's + // offset after terrain; its last section must never displace players/mobs. + this.meshOffset(this.program,this.renderOrigin); gl.bindVertexArray(this.dynamic.vao); gl.drawArrays(gl.TRIANGLES, 0, this.dynamic.count); this.triangles += this.dynamic.count / 3; @@ -540,6 +864,7 @@ export class Renderer { return dist(b[0]) - dist(a[0]); }); for (const [, m] of translucent) { + this.meshOffset(this.program,m.origin); gl.bindVertexArray(m.transparent.vao); gl.drawArrays(gl.TRIANGLES, 0, m.transparent.count); this.triangles += m.transparent.count / 3; @@ -553,6 +878,7 @@ export class Renderer { false, this.vp, ); + this.meshOffset(this.line,this.selectionOrigin); gl.bindVertexArray(this.lines.vao); gl.drawArrays(gl.LINES, 0, this.lines.count); } @@ -560,7 +886,7 @@ export class Renderer { } project(p) { return project( - p, + p.map((v,i)=>v-this.renderOrigin[i]), this.vp, this.canvas.clientWidth, this.canvas.clientHeight, diff --git a/client/section-block-map.js b/client/section-block-map.js new file mode 100644 index 0000000..7e9e1b7 --- /dev/null +++ b/client/section-block-map.js @@ -0,0 +1,68 @@ +const sectionKey = (key) => + key + .split(",") + .map((value) => Math.floor(Number(value) / 16)) + .join(","); + +/** Block positions indexed by their 16³ section without copying block values. */ +export class SectionBlockMap extends Map { + #sections = new Map(); + + constructor(entries) { + super(); + if (entries != null) + for (const [key, value] of entries) this.set(key, value); + } + + set(key, value) { + if (!super.has(key)) this.#index(key, sectionKey(key)); + return super.set(key, value); + } + + /** Insert using a section ID already validated by the caller. */ + setInSection(key, value, section) { + if (!super.has(key)) this.#index(key, section); + return super.set(key, value); + } + + #index(key, section) { + let keys = this.#sections.get(section); + if (!keys) this.#sections.set(section, (keys = new Set())); + keys.add(key); + } + + delete(key) { + if (!super.delete(key)) return false; + const section = sectionKey(key), + keys = this.#sections.get(section); + keys.delete(key); + if (!keys.size) this.#sections.delete(section); + return true; + } + + /** Remove every stored block in a section and return the number removed. */ + deleteSection(section) { + const keys = this.#sections.get(section); + if (!keys) return 0; + const count = keys.size; + for (const key of keys) super.delete(key); + keys.clear(); + this.#sections.delete(section); + return count; + } + + clear() { + super.clear(); + this.#sections.clear(); + } + + /** Live key iterator; an absent or empty section contains no stored blocks. */ + keysInSection(section) { + return this.#sections.get(section)?.keys() ?? [][Symbol.iterator](); + } + + /** Sections containing stored blocks; empty loaded sections have no entries. */ + loadedSectionKeys() { + return this.#sections.keys(); + } +} diff --git a/client/section-stream.js b/client/section-stream.js new file mode 100644 index 0000000..a6f9b17 --- /dev/null +++ b/client/section-stream.js @@ -0,0 +1,64 @@ +import { MAX_VIEW_WIDTH, VIEW_HEIGHT, MAX_VIEW_CELLS, MAX_VIEW_COORDINATE, WORLD_MIN_Y, WORLD_MAX_Y } from "./view-distance.js"; +const triple=p=>Array.isArray(p)&&p.length===3&&p.every(Number.isSafeInteger); +const sectionId=p=>p.join(','); +export function decodeSection(record) { + if(!triple(record?.section)||record.section.some(v=>Math.abs(v*16)>MAX_VIEW_COORDINATE))throw Error('Invalid section coordinates'); + const {palette,runs}=record; + if(!Array.isArray(palette)||!palette.length||palette.length>4096||!palette.every(v=>Number.isInteger(v)&&v>=0&&v<=0xffffffff))throw Error('Invalid section palette'); + if(!Array.isArray(runs)||!runs.length||runs.length>8192||runs.length%2)throw Error('Invalid section runs'); + const uniform = runs.length === 2 && runs[0] === 4096 && Number.isInteger(runs[1]) && runs[1] >= 0 && runs[1] < palette.length; + if (uniform) return {section:[...record.section],cells:new Uint32Array([palette[runs[1]]])}; + const cells=new Uint32Array(4096);let offset=0; + for(let i=0;i=palette.length||offset+count>4096)throw Error('Invalid section run'); + cells.fill(palette[index],offset,offset+count);offset+=count; + } + if(offset!==4096)throw Error('Incomplete section'); + return {section:[...record.section],cells}; +} +export function sectionInBounds(section,bounds) { + return section.every((v,i)=>v*16>=bounds.min[i]&&v*16+15<=bounds.max[i]); +} +export function applySectionView(view,message) { + if(message.world!==view.world)return 'ignored'; + if(!Number.isSafeInteger(message.generation)||message.generation<=view.viewGeneration)return 'ignored'; + if(message.revision!==view.revision||!triple(message.view_center)||message.view_center.some(v=>v%16)||!triple(message.view_min)||!triple(message.view_max)||!Array.isArray(message.unload))return 'resync'; + const bounds={min:message.view_min,max:message.view_max}; + if(message.full_height===true){ + if(bounds.min[1]!==WORLD_MIN_Y||bounds.max[1]!==WORLD_MAX_Y)return 'resync'; + bounds.fullHeight=true; + } + let volume=1; + for(let i=0;i<3;i++) {const length=bounds.max[i]-bounds.min[i]+1;if(length<=0||length>(i===1?VIEW_HEIGHT:MAX_VIEW_WIDTH)||bounds.min[i]%16||(bounds.max[i]+1)%16||Math.abs(bounds.min[i])>MAX_VIEW_COORDINATE||Math.abs(bounds.max[i])>MAX_VIEW_COORDINATE||(!(i===1&&bounds.fullHeight)&&(message.view_center[i]bounds.max[i])))return 'resync';volume*=length;} + if(volume>MAX_VIEW_CELLS||message.total_sections!==undefined&&message.total_sections!==volume/4096)return 'resync'; + const unload=new Set(); + for(const p of message.unload) {if(!triple(p)||sectionInBounds(p,bounds)||unload.has(sectionId(p)))return 'resync';unload.add(sectionId(p));} + // Authoritative bounds determine departing sections; explicit unloads are + // checked above but cannot accidentally leave old sections resident. + for(const id of view.blocks.loadedSectionKeys())if(!sectionInBounds(id.split(',').map(Number),bounds))unload.add(id); + for(const id of unload) {view.blocks.deleteSection(id);view.loadedSections.delete(id);} + view.viewCenter=[...message.view_center];view.viewBounds=bounds;view.viewGeneration=message.generation; + view.totalSections=volume/4096; + return {unload:[...unload].map(id=>id.split(',').map(Number))}; +} +export function applySectionBatch(view,message) { + if(message.world!==view.world||message.generation!==view.viewGeneration)return {status:'ignored'}; + if(message.revision!==view.revision||!Array.isArray(message.sections)||message.sections.length>128)return {status:'resync'}; + const decoded=[],seen=new Set(),columns=[]; + try { + if(message.columns!==undefined&&(!Array.isArray(message.columns)||message.columns.length>128))throw Error('Invalid skylight columns'); + for(const record of message.sections) { + const result=decodeSection(record),id=sectionId(result.section); + if(seen.has(id)||!sectionInBounds(result.section,view.viewBounds))throw Error('Section outside view'); + seen.add(id);decoded.push(result); + } + for(const column of message.columns||[]) { + if(!Array.isArray(column.column)||column.column.length!==2||!column.column.every(Number.isSafeInteger)||!Array.isArray(column.heights)||column.heights.length!==256||!column.heights.every(v=>Number.isInteger(v)&&v>=-32768&&v<=32767))throw Error('Invalid skylight column'); + if(!column.column.every((v,i)=>v*16>=view.viewBounds.min[i*2]&&v*16+15<=view.viewBounds.max[i*2]))throw Error('Skylight column outside view'); + columns.push({column:[...column.column],heights:new Int16Array(column.heights)}); + } + } catch {return {status:'resync'};} + for(const {section,cells} of decoded) {const id=sectionId(section);view.blocks.setSection(id,cells);view.loadedSections.add(id);} + return {status:'applied',sections:decoded,columns}; +} diff --git a/client/section-voxel-map.js b/client/section-voxel-map.js new file mode 100644 index 0000000..6377507 --- /dev/null +++ b/client/section-voxel-map.js @@ -0,0 +1,75 @@ +/** 16³ sections; uniform air/solid sections retain a single uint32 value. + * Compatibility iterators visit non-air blocks; hot paths use numeric access. + */ +export class SectionVoxelMap { + #sections = new Map(); + #bytes = 0; + size = 0; + static sectionKey(x,y,z) { return `${Math.floor(x/16)},${Math.floor(y/16)},${Math.floor(z/16)}`; } + static index(x,y,z) { return ((x%16+16)%16)+16*((z%16+16)%16)+256*((y%16+16)%16); } + getAt(x,y,z) { const cells=this.#sections.get(SectionVoxelMap.sectionKey(x,y,z))?.cells; return cells ? cells[cells.length===1 ? 0 : SectionVoxelMap.index(x,y,z)] : 0; } + get(key) { const p=key.split(',').map(Number); return this.getAt(...p) || undefined; } + has(key) { return this.get(key)!==undefined; } + hasSection(id) { return this.#sections.has(id); } + set(key,value) { + const p=key.split(',').map(Number), id=SectionVoxelMap.sectionKey(...p); + let section=this.#sections.get(id); + if(!section) {section={cells:new Uint32Array(4096),count:0,ids:new Map()};this.#sections.set(id,section);this.#bytes+=16384;} + const index=SectionVoxelMap.index(...p), old=section.cells[section.cells.length===1 ? 0 : index]; + if(old===value) return this; + if(section.cells.length===1) {section.cells=new Uint32Array(4096).fill(old);this.#bytes+=16380;} + if(old) {this.size--;section.count--;const count=section.ids.get(old)-1;if(count) section.ids.set(old,count);else section.ids.delete(old);} + section.cells[index]=value; + if(value) {this.size++;section.count++;section.ids.set(value,(section.ids.get(value)||0)+1);} + return this; + } + setInSection(key,value) {return this.set(key,value);} + delete(key) {if(!this.has(key)) return false;this.set(key,0);return true;} + clear() {this.#sections.clear();this.size=0;this.#bytes=0;} + deleteSection(id) {const previous=this.#sections.get(id);if(!previous)return 0;this.size-=previous.count;this.#bytes-=previous.cells.byteLength;this.#sections.delete(id);return previous.count;} + setSection(id,cells) { + if(!(cells instanceof Uint32Array)||![1,4096].includes(cells.length)) throw Error('A section must contain 4096 uint32 cells or one uniform value'); + const ids=new Map();let count=0; + for(const value of cells) if(value) {const n=cells.length===1 ? 4096 : 1;count+=n;ids.set(value,(ids.get(value)||0)+n);} + this.size+=count-(this.#sections.get(id)?.count||0); + this.#bytes+=cells.byteLength-(this.#sections.get(id)?.cells.byteLength||0); + this.#sections.set(id,{cells,count,ids}); + } + /** Borrowed dense cells or a single uniform value; copy before transferring. */ + getSectionCells(id) { return this.#sections.get(id)?.cells; } + get sectionCount() {return this.#sections.size;} + get byteLength() {return this.#bytes;} + sectionIsEmpty(id) {return this.#sections.get(id)?.count===0;} + loadedSectionKeys() {return this.#sections.keys();} + *sectionEntries() {for(const [id,section] of this.#sections) yield [id,section.cells];} + *materialIds() {const seen=new Set();for(const section of this.#sections.values())for(const id of section.ids.keys())if(!seen.has(id)){seen.add(id);yield id;}} + forEachBlock(callback,bounds=null) { + const selected = function* (sections) { + if (!bounds) {yield* sections;return;} + for(let x=Math.floor(bounds.min[0]/16);x<=Math.floor(bounds.max[0]/16);x++) + for(let y=Math.floor(bounds.min[1]/16);y<=Math.floor(bounds.max[1]/16);y++) + for(let z=Math.floor(bounds.min[2]/16);z<=Math.floor(bounds.max[2]/16);z++) { + const id=`${x},${y},${z}`,section=sections.get(id); + if(section)yield [id,section]; + } + }; + for(const [id,section] of selected(this.#sections)) { + if(!section.count)continue; + const [sx,sy,sz]=id.split(',').map(v=>Number(v)*16), cells=section.cells; + if(bounds&&(sx>bounds.max[0]||sx+15bounds.max[1]||sy+15bounds.max[2]||sz+15>8),z=sz+((i>>4)&15); + if(!bounds||(x>=bounds.min[0]&&x<=bounds.max[0]&&y>=bounds.min[1]&&y<=bounds.max[1]&&z>=bounds.min[2]&&z<=bounds.max[2]))callback(x,y,z,value); + }} + } + } + *keysInSection(id) { + const section=this.#sections.get(id);if(!section?.count)return; + const [sx,sy,sz]=id.split(',').map(v=>Number(v)*16); + for(let i=0;i<4096;i++)if(section.cells[section.cells.length===1?0:i])yield `${sx+(i&15)},${sy+(i>>8)},${sz+((i>>4)&15)}`; + } + *entries() {for(const id of this.#sections.keys())for(const key of this.keysInSection(id))yield [key,this.get(key)];} + *keys() {for(const id of this.#sections.keys())yield* this.keysInSection(id);} + *values() {for(const section of this.#sections.values())if(section.count)for(let i=0;i<4096;i++){const value=section.cells[section.cells.length===1?0:i];if(value)yield value;}} + [Symbol.iterator]() {return this.entries();} +} diff --git a/client/shadow-frame.js b/client/shadow-frame.js new file mode 100644 index 0000000..9f7add1 --- /dev/null +++ b/client/shadow-frame.js @@ -0,0 +1,25 @@ +/** Directional orthographic projection, snapped in light space to avoid crawling shadows. */ +export function shadowFrame(eye, sun, resolution = 2048, radius = 48) { + const length = Math.hypot(...sun), + z = sun.map((v) => v / length), + horizontal = Math.hypot(z[0], z[2]), + x = horizontal > 1e-6 ? [z[2] / horizontal, 0, -z[0] / horizontal] : [1, 0, 0], + y = [z[1] * x[2] - z[2] * x[1], z[2] * x[0] - z[0] * x[2], z[0] * x[1] - z[1] * x[0]], + dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0), + texel = 2 * radius / resolution, + sx = Math.round(dot(x, eye) / texel) * texel, + sy = Math.round(dot(y, eye) / texel) * texel, + sz = dot(z, eye), + depth = radius * 2, + center = eye.map((_, i) => x[i] * sx + y[i] * sy + z[i] * sz); + return { + center, + radius, + matrix: new Float32Array([ + x[0] / radius, y[0] / radius, -z[0] / depth, 0, + x[1] / radius, y[1] / radius, -z[1] / depth, 0, + x[2] / radius, y[2] / radius, -z[2] / depth, 0, + -sx / radius, -sy / radius, sz / depth, 1, + ]), + }; +} diff --git a/client/style.css b/client/style.css index 6ded951..07e3cb3 100644 --- a/client/style.css +++ b/client/style.css @@ -18,7 +18,8 @@ body { overflow: hidden; } button, -input { +input, +select { font: inherit; } button { @@ -33,7 +34,8 @@ button:hover { background: #4c5e4a; } button:focus-visible, -input:focus-visible { +input:focus-visible, +select:focus-visible { outline: 2px solid #dfefba; outline-offset: 3px; } @@ -47,7 +49,7 @@ button.primary { color: #253021; font-weight: 650; } -input { +input, select { background: #202821; color: #f4f4ef; border: 1px solid #576255; @@ -367,7 +369,7 @@ footer { gap: 6px; margin-bottom: 20px; } -.inline input { +.inline input, .inline select { min-width: 0; } .inline button { @@ -595,3 +597,6 @@ body.locked .topbar:hover { inset: 25% 14px auto; } } + +/* Keep the live readout beside menus, while the world remains interactive. */ +#diagnostics { left: 24px; right: auto; } diff --git a/client/terrain-controller.js b/client/terrain-controller.js new file mode 100644 index 0000000..a2dc067 --- /dev/null +++ b/client/terrain-controller.js @@ -0,0 +1,231 @@ +import { localLightBounds } from "./local-light-bounds.js"; +import { attachBlockLightSamplers } from "./block-light.js"; +import { SectionBlockMap } from "./section-block-map.js"; + +const slimMaterial = m => ({ state: m.state, minecraft_id: m.minecraft_id, color: m.color, + render: m.render, opacity: m.opacity, transparent: m.transparent, effect: m.effect, + light: m.light, light_dampening: m.light_dampening, light_occlusion: m.light_occlusion }); + +/** Separate lighting and local mesh workers; one mesh in flight, two ready. */ +export class TerrainController { + constructor({ onLight = () => {}, onDirty = () => {}, onError = () => {}, workerFactory, meshWorkerFactory } = {}) { + this.onLight = onLight; this.onDirty = onDirty; + this.onError = onError; + this.epoch = 0; this.version = 0; this.workerVersion = -1; this.job = 0; + this.meshTickets = new Map(); this.materialSignatures = new Map(); + this.meshSerial = 0; + this.meshWorkerVersion = -1; + this.ready = new Map(); this.busy = null; this.pending = false; this.disposed = false; + this.changes = new SectionBlockMap(); this.sectionChanges = new Map(); + this.unloads = new Map(); this.sentMaterials = new Map(); this.columns = new Map(); this.compact = false; + this.status = "loading"; this.mode = "worker"; + this.materials = new Map(); this.textures = new Map(); this.bounds = null; + this.resetSource = null; this.initial = null; this.preparing = false; + this.resetPending = false; this.texturesPending = false; + try { + this.worker = workerFactory ? workerFactory() : new Worker(new URL("./terrain-worker.js", import.meta.url), { type: "module" }); + this.worker.onmessage = ({ data }) => this.receive(data); + this.worker.onerror = event => { + event.preventDefault(); this.fail(event.message || "Terrain worker failed"); + }; + } catch (error) { this.fail(error.message); } + if (this.worker && (meshWorkerFactory || typeof Worker === "function")) { + try { + this.meshWorker = meshWorkerFactory ? meshWorkerFactory() : new Worker(new URL("./terrain-mesh-worker.js",import.meta.url),{type:"module"}); + this.meshWorker.onmessage = ({data}) => this.receive(data); + this.meshWorker.onerror = event => {event.preventDefault();this.meshFallback(event.message);}; + } catch (error) { this.meshFallback(error.message); } + } + } + meshFallback(error) { + this.meshWorker?.terminate(); this.meshWorker = null; this.busy = null; this.ready.clear(); + this.onDirty([...this.meshTickets.keys()]); this.meshTickets.clear(); + console.warn("Shacraft local meshing unavailable; using terrain worker",error); + } + invalidateMeshes({changes,sections,columns,unload,materials,textures,bounds} = {}) { + if (!this.meshWorker) return; + const boundsChanged = bounds !== undefined && JSON.stringify(bounds) !== JSON.stringify(this.bounds); + let all = Boolean(textures); + if (materials) for (const [id,mat] of materials) { + const signature=JSON.stringify(slimMaterial(mat)); + if (this.materialSignatures.get(id)!==signature) {this.materialSignatures.set(id,signature);all=true;} + } + const affected = new Set((unload || []).map(p=>`${p[0]},${p[2]}`)); + for (const {section} of sections || []) affected.add(`${section[0]},${section[2]}`); + for (const {column} of columns || []) affected.add(column.join(",")); + for (const {pos} of changes || []) affected.add(`${Math.floor(pos[0]/16)},${Math.floor(pos[2]/16)}`); + const coords=[...affected].map(key=>key.split(",").map(Number)),dirty=[]; + for (const id of this.meshTickets.keys()) { + const [x,,z]=id.split(",").map(Number); + const boundaryChanged = boundsChanged && JSON.stringify(localLightBounds(id,bounds)) !== JSON.stringify(localLightBounds(id,this.bounds)); + if (!all && !boundaryChanged && !coords.some(([sx,sz])=>Math.abs(sx-x)<=2&&Math.abs(sz-z)<=2)) continue; + this.meshTickets.set(id,++this.meshSerial);this.ready.delete(id);dirty.push(id); + } + this.onDirty(dirty); + for (const p of unload || []) { const id=p.join(",");this.meshTickets.delete(id);this.ready.delete(id); } + } + fail(message) { + if (this.disposed) return; + this.status = `error: ${message}`; + this.error = message; + console.error("Shacraft terrain", message); + queueMicrotask(() => { if (!this.disposed) this.onError(message); }); + } + reset(blocks, materials, textures, bounds) { + this.epoch++; + this.meshTickets.clear(); this.materialSignatures.clear(); this.ready.clear(); this.meshWorkerVersion=-1; + for (const [id,mat] of materials) this.materialSignatures.set(id,JSON.stringify(slimMaterial(mat))); + this.changes.clear(); this.sectionChanges.clear(); this.unloads.clear(); this.sentMaterials.clear(); this.columns.clear(); + this.compact = typeof blocks.sectionEntries === "function"; + this.materials = materials; this.textures = textures; this.bounds = bounds; + this.resetSource = this.compact ? null : blocks; this.initial = null; this.preparing = false; + if (this.compact) for (const [id,cells] of blocks.sectionEntries()) this.sectionChanges.set(id,cells); + this.resetPending = true; this.texturesPending = true; + this.busy = null; + this.changed(); + } + update({ changes, sections, columns, materials, textures, bounds, unload } = {}) { + this.invalidateMeshes({changes,sections,columns,materials,textures,bounds,unload}); + if (columns) for (const item of columns) this.columns.set(item.column.join(","),item); + if (sections) for (const { section, blocks, cells } of sections) { + const id = section.join(","); + // Complete entering sections supersede older queued edits. Retain their + // numeric records until packing instead of indexing every voxel again. + this.unloads.set(id, section); + this.changes.deleteSection(id); + this.sectionChanges.set(id, cells || blocks); + } + if (changes) for (const change of changes) this.changes.set(change.pos.join(","), change); + if (materials) this.materials = materials; + if (textures) { this.textures = textures; this.texturesPending = true; } + if (bounds !== undefined) this.bounds = bounds; + if (unload) for (const coords of unload) { + const id = coords.join(","); + this.unloads.set(id, coords); + // An unload supersedes older edits; later entering records must survive it. + this.changes.deleteSection(id); + this.sectionChanges.delete(id); + } + this.changed(); + } + changed() { + this.version++; this.workerVersion = -1; + if (!this.meshWorker) this.ready.clear(); + this.pending = true; + if (!this.error) this.status = "pending"; + if (!this.timer) this.timer = setTimeout(() => { this.timer = null; this.flush(); }, 25); + } + prepareReset() { + if (this.preparing) return; + const epoch = this.epoch, source = this.resetSource, iterator = source.entries(); + let packed = new Int32Array(Math.max(1, source.size) * 4), length = 0; + this.preparing = true; + const step = () => { + if (epoch !== this.epoch || this.disposed) return; + const start = performance.now(); + for (let count = 0; ; count++) { + const next = iterator.next(); + if (next.done) { + this.initial = packed.subarray(0, length); + this.resetSource = null; this.preparing = false; + this.flush(); return; + } + if (length + 4 > packed.length) { + const larger = new Int32Array(packed.length * 2); larger.set(packed); packed = larger; + } + const [key, id] = next.value, pos = key.split(",").map(Number); + packed.set([pos[0], pos[1], pos[2], id], length); length += 4; + if (count % 64 === 63 && performance.now() - start >= 2) { + setTimeout(step, 0); return; + } + } + }; + step(); + } + flush() { + if (!this.worker || this.disposed || !this.pending) return; + if (this.resetSource) { this.prepareReset(); return; } + const start = performance.now(); + const materials = []; + for (const [id, material] of this.materials) { + if (this.sentMaterials.get(id) === material) continue; + this.sentMaterials.set(id, material); materials.push([id, slimMaterial(material)]); + } + let count = this.changes.size; + for (const records of this.sectionChanges.values()) if (!(records instanceof Uint32Array)) count += records.length; + const changes = new Int32Array(count * 4); + let i = 0; + const pack = records => { + for (const { pos, block } of records) { + changes[i++] = pos[0]; changes[i++] = pos[1]; changes[i++] = pos[2]; changes[i++] = block; + } + }; + for (const records of this.sectionChanges.values()) if (!(records instanceof Uint32Array)) pack(records); + pack(this.changes.values()); + const packet = { type: "sync", epoch: this.epoch, version: this.version, + reset: this.resetPending, compact: this.compact, initial: this.initial, changes, materials, + sections: [...this.sectionChanges].filter(([,data]) => data instanceof Uint32Array).map(([id,cells]) => ({section:id.split(",").map(Number),cells:cells.slice()})), + columns: [...this.columns.values()], + textures: this.texturesPending ? [...this.textures] : undefined, + bounds: this.bounds, unload: [...this.unloads.values()] }; + const transfers = [changes.buffer, ...packet.sections.map(s => s.cells.buffer)]; + if (this.initial) transfers.push(this.initial.buffer); + this.pending = false; this.resetPending = false; this.texturesPending = false; + this.initial = null; this.changes.clear(); this.sectionChanges.clear(); this.unloads.clear(); this.columns.clear(); + this.status = "building"; + try { + if (this.meshWorker) { + const copy=structuredClone(packet),buffers=[copy.changes.buffer,...copy.sections.map(s=>s.cells.buffer)]; + if(copy.initial)buffers.push(copy.initial.buffer); + this.meshWorker.postMessage(copy,buffers); + } + this.worker.postMessage({...packet,independentMeshes:Boolean(this.meshWorker)}, transfers); + } + catch (error) { this.fail(error.message); } + this.prepareMilliseconds = performance.now() - start; + } + receive(message) { + if (this.disposed || message.epoch !== this.epoch) return; + if (message.type === "error" && message.meshTicket !== undefined) { + if (message.job !== this.busy?.job) return; + this.busy = null; + if (this.isCurrent(message)) this.meshFallback(message.error); + return; + } + if (message.type === "synced") { + this.meshWorkerVersion = Math.max(this.meshWorkerVersion,message.version); + } else if (message.type === "light") { + // Include deltas from skipped intermediate fields too: their union is + // needed when the next field is compared to a field never displayed. + if (!this.meshWorker) this.onDirty(message.dirty); + if (message.version !== this.version) return; + this.workerVersion = message.version; + this.status = "ready"; this.milliseconds = message.milliseconds; + // Dynamic actors only need point samples, not terrain face geometry. + this.onLight(attachBlockLightSamplers(message.field, new Map(), new Map())); + } else if (message.type === "mesh") { + if (message.job !== this.busy?.job) return; + this.busy = null; + if (!this.isCurrent(message) || message.stale) return; + if (message.error) { this.fail(message.error); return; } + this.meshMilliseconds = message.milliseconds; + this.localLightMilliseconds=message.lightMilliseconds; this.localLightCells=message.lightCells; + this.ready.set(message.id, message); + } else if (message.type === "error" && message.version === this.version) this.fail(message.error); + } + isCurrent(result) { return result.epoch === this.epoch && (result.meshTicket !== undefined + ? Boolean(this.meshWorker) && this.meshTickets.get(result.id) === result.meshTicket : result.version === this.version); } + requestMesh(id) { + if (!this.worker || this.disposed || this.busy || this.pending || this.preparing || + (this.meshWorker ? this.meshWorkerVersion < this.version : this.workerVersion !== this.version) || this.ready.size >= 2 || this.ready.has(id)) return false; + this.busy = { type: "mesh", id, epoch: this.epoch, version: this.version, job: ++this.job }; + if (this.meshWorker) { + if(!this.meshTickets.has(id))this.meshTickets.set(id,++this.meshSerial); + this.busy.meshTicket=this.meshTickets.get(id); + } + try { (this.meshWorker || this.worker).postMessage(this.busy); } + catch (error) { this.busy = null; this.fail(error.message); return false; } + return true; + } + dispose() { this.disposed = true; clearTimeout(this.timer); this.worker?.terminate(); this.meshWorker?.terminate(); this.ready.clear(); } +} diff --git a/client/terrain-mesh-worker.js b/client/terrain-mesh-worker.js new file mode 100644 index 0000000..878be3f --- /dev/null +++ b/client/terrain-mesh-worker.js @@ -0,0 +1,13 @@ +import { TerrainState } from './terrain-state.js'; +import { loadLightProperties } from './light-properties.js'; + +// Geometry never queues behind a whole-view lighting build. +const state = loadLightProperties().then(properties => new TerrainState(properties)); +self.onmessage = ({data}) => state.then(terrain => { + if (data.type === 'sync') { + if (terrain.sync(data)) self.postMessage({type:'synced',epoch:data.epoch,version:data.version}); + } else if (data.type === 'mesh') { + const result = terrain.meshLocal(data); + self.postMessage(result, result.vertices ? [result.vertices.buffer,result.transparent.buffer] : []); + } +}).catch(error => self.postMessage({...data,type:'error',error:error.message})); diff --git a/client/terrain-state.js b/client/terrain-state.js new file mode 100644 index 0000000..92b4526 --- /dev/null +++ b/client/terrain-state.js @@ -0,0 +1,192 @@ +import { localLightBounds } from "./local-light-bounds.js"; +import { SectionVoxelMap } from "./section-voxel-map.js"; +import { SectionBlockMap } from "./section-block-map.js"; +import { buildBlockLight, attachBlockLightSamplers } from "./block-light.js"; +import { applyLightProperties } from "./light-properties.js"; +import { changedLightSections } from "./light-changes.js"; +import { buildSectionMesh } from "./mesh-geometry.js"; + +// Compare the transmitted values rather than object identity: structured clone +// creates new objects even when a chunk repeats an unchanged definition. +const materialSignature = material => JSON.stringify([ + material.state, material.minecraft_id, material.color, + material.render?.map(box => [box.min, box.max]), + material.opacity, material.transparent, material.effect, material.light, + material.light_dampening, material.light_occlusion?.map(box => [box.min, box.max]), +]); + +/** Persistent CPU terrain state. Only numeric deltas cross the worker boundary. */ +export class TerrainState { + constructor(properties) { + this.properties = properties; + this.epoch = -1; + this.version = -1; + this.blocks = new SectionBlockMap(); + this.materials = new Map(); + this.materialSignatures = new Map(); + this.changedMaterials = new Set(); + this.textureLayers = new Map(); + this.faceTextureCache = new Map(); + this.meshed = new Set(); + this.field = null; + this.bounds = null; + this.needsLighting = false; + this.skyColumns = new Map(); + this.localLights = new Map(); + } + sync(packet) { + if (packet.epoch < this.epoch || packet.epoch === this.epoch && packet.version < this.version) return false; + if (JSON.stringify(packet.bounds) !== JSON.stringify(this.bounds)) + for (const [key,entry] of this.localLights) { + const [x,z]=key.split(","); + if (JSON.stringify(localLightBounds(`${x},0,${z}`,packet.bounds)) !== JSON.stringify(entry.bounds)) this.localLights.delete(key); + } + const columns = new Set((packet.unload || []).map(p=>`${p[0]},${p[2]}`)); + for (const {section} of packet.sections || []) columns.add(`${section[0]},${section[2]}`); + for (const {column} of packet.columns || []) columns.add(column.join(",")); + for (let i=0;i<(packet.changes?.length || 0);i+=4) columns.add(`${Math.floor(packet.changes[i]/16)},${Math.floor(packet.changes[i+2]/16)}`); + for (const [id,entry] of this.localLights) { + if ([...columns].some(column=>{const [x,z]=column.split(",").map(v=>Number(v)*16);return x<=entry.bounds.max[0]&&x+15>=entry.bounds.min[0]&&z<=entry.bounds.max[2]&&z+15>=entry.bounds.min[2];})) this.localLights.delete(id); + } + if (packet.reset) { + this.localLights.clear(); + this.blocks = packet.compact ? new SectionVoxelMap() : new SectionBlockMap(); + this.skyColumns.clear(); this.materials.clear(); this.meshed.clear(); + this.materialSignatures.clear(); this.changedMaterials.clear(); + this.field = null; + } else if (packet.epoch !== this.epoch) return false; + this.epoch = packet.epoch; + this.version = packet.version; + for (const [id, material] of packet.materials || []) { + const signature = materialSignature(material); + if (this.materialSignatures.get(id) === signature) continue; + this.localLights.clear(); + this.materialSignatures.set(id, signature); + this.changedMaterials.add(id); + this.materials.set(id, applyLightProperties(material, this.properties)); + } + if (packet.textures) { + this.textureLayers = new Map(packet.textures); + this.faceTextureCache.clear(); + } + const apply = data => { + if (!data) return; + for (let i = 0; i < data.length; i += 4) { + const key = `${data[i]},${data[i + 1]},${data[i + 2]}`; + if (data[i + 3]) this.blocks.set(key, data[i + 3]); + else this.blocks.delete(key); + } + }; + apply(packet.initial); + for (const coords of packet.unload || []) { + const id = coords.join(","); + this.blocks.deleteSection(id); + this.meshed.delete(id); + } + for (const {section,cells} of packet.sections || []) this.blocks.setSection(section.join(","),cells); + for (const {column,heights} of packet.columns || []) this.skyColumns.set(column.join(","),heights); + apply(packet.changes); + this.bounds = packet.bounds; + if (this.bounds) for (const id of this.skyColumns.keys()) { + const [x,z]=id.split(",").map(v=>Number(v)*16); + if(x+15this.bounds.max[0]||z+15this.bounds.max[2])this.skyColumns.delete(id); + } + this.needsLighting = true; + return true; + } + light({dirty:compareDirty=true} = {}) { + const start = performance.now(); + const view = this.bounds || inferBounds(this.blocks); + // Terrain meshes compute their own light. The shared field is only for + // nearby moving actors and must stay bounded at any render distance. + const bounds = compareDirty ? view : actorLightBounds(view); + const field = buildBlockLight(this.blocks, this.materials, bounds, this.skyColumns.size ? this.skyColumns : null); + const sections = new Set([...this.blocks.loadedSectionKeys(), ...this.meshed]); + const dirty = new Set(compareDirty ? changedLightSections(this.field, field, sections) : []); + if (compareDirty && this.field && this.changedMaterials.size) { + // A newly learned opaque block can have the same light values as its + // placeholder but a different color, shape or texture. Scan only here in + // the worker, and preserve this union across syncs coalesced before light(). + for (const id of this.blocks.loadedSectionKeys()) { + let affected = false; + for (const key of this.blocks.keysInSection(id)) + if (this.changedMaterials.has(this.blocks.get(key))) { affected = true; break; } + if (!affected) continue; + const section = id.split(",").map(Number); + for (let x = -1; x <= 1; x++) + for (let y = -1; y <= 1; y++) + for (let z = -1; z <= 1; z++) { + const neighbor = `${section[0] + x},${section[1] + y},${section[2] + z}`; + if (sections.has(neighbor)) dirty.add(neighbor); + } + } + } + this.changedMaterials.clear(); + this.field = field; + this.needsLighting = false; + // Keep the worker's sampling arrays; only these copies are transferred. + return { type: "light", epoch: this.epoch, version: this.version, dirty: [...dirty], + milliseconds: performance.now() - start, + field: { min: field.min, size: field.size, sourceCount: field.sourceCount, + data: field.data.slice(), blockLevels: field.blockLevels.slice(), skyLevels: field.skyLevels.slice() } }; + } + meshLocal(packet) { + const result = {type:"mesh",epoch:packet.epoch,version:packet.version,id:packet.id,job:packet.job,meshTicket:packet.meshTicket}; + if (packet.epoch !== this.epoch || packet.version > this.version) return {...result,stale:true}; + const start = performance.now(), [sx,,sz] = packet.id.split(",").map(Number); + const key = `${Math.floor(sx/2)*2},${Math.floor(sz/2)*2}`, view = this.bounds || inferBounds(this.blocks); + // Light levels are at most 15. An 18-cell horizontal halo includes their + // reach and face/partial-model samples; keep full Y for unattenuated sky. + const bounds = localLightBounds(packet.id,view); + if (bounds.min.some((v,i)=>v>bounds.max[i])) return {...result,stale:true}; + let entry = this.localLights.get(key); + const cached = Boolean(entry); + if (!entry) { + const field = buildBlockLight(this.blocks,this.materials,bounds,this.skyColumns.size ? this.skyColumns : null); + entry = {bounds,field}; + if (this.localLights.size >= 8) this.localLights.delete(this.localLights.keys().next().value); + this.localLights.set(key,entry); + } else { this.localLights.delete(key); this.localLights.set(key,entry); } + const lightMilliseconds = performance.now()-start; + // Fresh samplers reference current voxels; their occlusion caches must not + // survive a sync, even when its numeric light field remains valid. + const field = attachBlockLightSamplers({...entry.field},this.blocks,this.materials); + const geometry = buildSectionMesh({id:packet.id,blocks:this.blocks,materials:this.materials, + textureLayers:this.textureLayers,faceTextureCache:this.faceTextureCache,blockLightField:field,localCoordinates:true}); + return {...result,...geometry,milliseconds:performance.now()-start,lightMilliseconds,lightCached:cached, + lightCells:field.size.reduce((a,b)=>a*b,1)}; + } + mesh(packet) { + const result = { type: "mesh", epoch: packet.epoch, version: packet.version, id: packet.id, job: packet.job }; + if (packet.epoch !== this.epoch || packet.version !== this.version || this.needsLighting) + return { ...result, stale: true }; + const start = performance.now(); + const geometry = buildSectionMesh({ id: packet.id, blocks: this.blocks, materials: this.materials, + textureLayers: this.textureLayers, faceTextureCache: this.faceTextureCache, blockLightField: this.field, localCoordinates: true }); + this.meshed.add(packet.id); + return { ...result, ...geometry, milliseconds: performance.now() - start }; + } +} + +export function actorLightBounds(view) { + const min = [...view.min], max = [...view.max]; + for (const axis of [0, 2]) { + const center = Math.floor((view.min[axis] + view.max[axis]) / 32) * 16; + min[axis] = Math.max(min[axis], center - 48); + max[axis] = Math.min(max[axis], center + 63); + } + return {min, max}; +} + +function inferBounds(blocks) { + const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity]; + for (const key of blocks.keys()) { + const pos = key.split(",").map(Number); + for (let axis = 0; axis < 3; axis++) { + min[axis] = Math.min(min[axis], pos[axis]); max[axis] = Math.max(max[axis], pos[axis]); + } + } + return Number.isFinite(min[0]) + ? { min: min.map(v => v - 15), max: max.map(v => v + 15) } + : { min: [-16, -16, -16], max: [16, 16, 16] }; +} diff --git a/client/terrain-worker.js b/client/terrain-worker.js new file mode 100644 index 0000000..a42c356 --- /dev/null +++ b/client/terrain-worker.js @@ -0,0 +1,27 @@ +import { TerrainState } from "./terrain-state.js"; +import { loadLightProperties } from "./light-properties.js"; + +const state = loadLightProperties().then(properties => new TerrainState(properties)); +let timer = null; +const send = message => { + const buffers = message.type === "light" + ? [message.field.data.buffer, message.field.blockLevels.buffer, message.field.skyLevels.buffer] + : message.vertices ? [message.vertices.buffer, message.transparent.buffer] : []; + self.postMessage(message, buffers); +}; +self.onmessage = ({ data }) => { + state.then(terrain => { + if (data.type === "sync") { + if (!terrain.sync(data)) return; + clearTimeout(timer); + timer = setTimeout(() => { + timer = null; + try { send(terrain.light({dirty:!data.independentMeshes})); } + catch (error) { send({ type: "error", epoch: terrain.epoch, version: terrain.version, error: error.message }); } + }, data.independentMeshes ? 225 : 0); + } else if (data.type === "mesh") { + try { send(terrain.mesh(data)); } + catch (error) { send({ ...data, error: error.message }); } + } + }).catch(error => send({ type: "error", epoch: data.epoch, version: data.version, error: error.message })); +}; diff --git a/client/tests/actor-rendering.test.js b/client/tests/actor-rendering.test.js new file mode 100644 index 0000000..ba76287 --- /dev/null +++ b/client/tests/actor-rendering.test.js @@ -0,0 +1,91 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { Renderer } from "../renderer.js"; + +// Record actual draw-call state: a uniform belongs to one linked program, +// and changing programs does not reset that program's previous uniforms. +function fixture(shadows) { + let active, vao; + const offsets = new Map(), draws = [], errors = []; + const uniform = location => { + if (location.program !== active) { + errors.push(`uniform ${location.name} belongs to ${location.program}, active ${active}`); + return false; + } + return true; + }; + const gl = new Proxy({ + useProgram(program) { active = program; }, + getUniformLocation(program, name) { return { program, name }; }, + uniform3fv(location, values) { + if (uniform(location) && location.name === "uOffset") offsets.set(active, [...values]); + }, + uniform1f: uniform, uniform1i: uniform, uniformMatrix4fv: uniform, + bindVertexArray(value) { vao = value; }, + drawArrays() { draws.push({ program: active, vao, offset: offsets.get(active) }); }, + }, { get(target, name) { return target[name] ?? (/^[A-Z_0-9]+$/.test(name) ? 0 : () => {}); } }); + const renderer = Object.assign(Object.create(Renderer.prototype), { + blocks: new Map(), + gl, canvas: { clientWidth: 800, clientHeight: 600, width: 800, height: 600, dataset: {} }, + program: "world", shadowProgram: "shadow", sky: "sky", line: "line", + renderOrigin: [0, 0, 0], sections: new Map(), dirty: new Set(), + dynamic: { vao: "actors", count: 0 }, lines: { count: 0 }, + shadowsEnabled: shadows, shadowReady: true, shadowSize: 2048, shadowRadius: 48, + blockLighting: { status: "ready", milliseconds: 0 }, daylight: 1, bounceAt: -1000, + }); + renderer.upload = (mesh, vertices) => { + mesh.vertices = new Float32Array(vertices); + mesh.count = vertices.length / 20; + }; + return { renderer, draws, errors }; +} + +for (const shadows of [true, false]) { + test(`players and entities keep world positions through camera/section changes; shadows ${shadows}`, () => { + const previousRatio = globalThis.devicePixelRatio; + globalThis.devicePixelRatio = 1; + try { + for (const base of [0, -160, 29_999_840]) { + const { renderer, draws, errors } = fixture(shadows); + const player = { position: [base + 18.125, 77, -5.875], yaw: 0.3 }; + const entity = { kind: "crate", position: [base + 21.125, 77, -6.875] }; + let baseline; + for (const [x, y, z, reverse, empty] of [ + [15.99, 79.99, 0.01, false, false], + [16.01, 80.01, -0.01, true, false], + [31.99, 79.99, -16.01, false, false], + [32.01, 80.01, -15.99, true, true], + ]) { + const origins = [[base, 64, -16], [base + 32, 96, 16]]; + if (reverse) origins.reverse(); + renderer.sections = new Map(empty ? [] : origins.map((origin, i) => [ + origin.map(v => v / 16).join(","), + { origin, vao: `terrain-${i}`, count: 36, transparent: { vao: `glass-${i}`, count: 36 } }, + ])); + draws.length = 0; + const eye = [base + x, y, z]; + const direction = [player.position[0] - eye[0], 79 - eye[1], player.position[2] - eye[2]]; + const camera = { eye, yaw: Math.atan2(direction[0], -direction[2]), pitch: Math.atan2(direction[1], Math.hypot(direction[0], direction[2])) }; + renderer.draw(camera, [player], [entity], new Map()); + assert.deepEqual(errors, [], "uniform writes must target the active shader program"); + const actorDraws = draws.filter(draw => draw.vao === "actors"); + assert.equal(actorDraws.length, shadows ? 2 : 1); + for (const draw of actorDraws) assert.deepEqual(draw.offset, [0, 0, 0], `${draw.program} inherited terrain transform`); + // Reverse the GPU transform for every avatar and entity vertex. + // It must recover identical world geometry despite rebasing the camera. + const world = []; + for (let i = 0; i < renderer.dynamic.vertices.length; i += 20) + for (let axis = 0; axis < 3; axis++) + world.push(renderer.dynamic.vertices[i + axis] + renderer.renderOrigin[axis]); + if (baseline) world.forEach((v, i) => assert.ok(Math.abs(v - baseline[i]) < 0.00001, `vertex ${i} moved with camera`)); + else baseline = world; + assert.ok(world.length > 36 * 3, "both an avatar and an entity were drawn"); + assert.ok(renderer.project([player.position[0], 79, player.position[2]]), "label projection uses the same camera origin"); + } + } + } finally { + if (previousRatio === undefined) delete globalThis.devicePixelRatio; + else globalThis.devicePixelRatio = previousRatio; + } + }); +} diff --git a/client/tests/ambient-occlusion.test.js b/client/tests/ambient-occlusion.test.js new file mode 100644 index 0000000..d78c25c --- /dev/null +++ b/client/tests/ambient-occlusion.test.js @@ -0,0 +1,144 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { + affectedSectionKeys, + createAmbientOcclusionSampler, + isAmbientOccluder, +} from "../ambient-occlusion.js"; +import { unitBox } from "../math.js"; + +const top = [[0, 1, 1], [1, 1, 1], [1, 1, 0], [0, 1, 0]]; +const stone = { state: "minecraft:stone", render: [unitBox] }; +const slab = { min: [0, 0, 0], max: [1, 0.5, 1] }; +const materialMap = () => new Map([ + [1, stone], + [2, { state: "minecraft:stone_slab[type=bottom]", render: [slab] }], +]); +const blockMap = (...cells) => new Map(cells.map(([pos, id = 1]) => [pos.join(","), id])); +const sampleTop = (blocks, materials = materialMap(), box = unitBox, pos = [0, 0, 0]) => + createAmbientOcclusionSampler(blocks, materials)(pos, box, [0, 1, 0], top); + +test("an exposed flat floor has no dark grid or dark silhouette corners", () => { + const blocks = new Map(); + for (let x = -2; x <= 2; x++) + for (let z = -2; z <= 2; z++) blocks.set(`${x},0,${z}`, 1); + assert.deepEqual(sampleTop(blocks), [1, 1, 1, 1]); + assert.deepEqual(sampleTop(blockMap([[0, 0, 0], 1])), [1, 1, 1, 1]); +}); + +test("one adjacent wall shades only its two touching vertices", () => { + assert.deepEqual(sampleTop(blockMap([[-1, 1, 0], 1])), [0.92, 1, 1, 0.92]); +}); + +test("diagonal contact shades one corner and two enclosing walls saturate it", () => { + assert.deepEqual(sampleTop(blockMap([[-1, 1, -1], 1])), [1, 1, 1, 0.92]); + const sides = [[[-1, 1, 0], 1], [[0, 1, -1], 1]]; + assert.deepEqual(sampleTop(blockMap(...sides)), [0.92, 1, 0.92, 0.76]); + assert.deepEqual(sampleTop(blockMap(...sides, [[-1, 1, -1], 1])), + [0.92, 1, 0.92, 0.76]); +}); + +test("all six face orientations sample the outward hemisphere", () => { + for (let axis = 0; axis < 3; axis++) + for (const sign of [-1, 1]) { + const normal = [0, 0, 0]; + normal[axis] = sign; + const tangent = [0, 1, 2].filter((a) => a !== axis); + const vertices = [[0, 0], [1, 0], [1, 1], [0, 1]].map(([u, v]) => { + const result = [0, 0, 0]; + result[axis] = sign > 0 ? 1 : 0; + result[tangent[0]] = u; + result[tangent[1]] = v; + return result; + }); + const diagonal = [0, 0, 0]; + diagonal[axis] = sign; + diagonal[tangent[0]] = -1; + diagonal[tangent[1]] = -1; + const sample = createAmbientOcclusionSampler(blockMap([diagonal, 1]), materialMap()); + assert.deepEqual(sample([0, 0, 0], unitBox, normal, vertices), [0.92, 1, 1, 1], + `normal ${normal}`); + } +}); + +test("actual slab height controls occlusion rather than whole-cell occupancy", () => { + assert.deepEqual(sampleTop(blockMap([[-1, 0, 0], 2]), materialMap(), slab), + [1, 1, 1, 1]); + assert.deepEqual(sampleTop(blockMap([[-1, 0, 0], 1]), materialMap(), slab), + [0.92, 1, 1, 0.92]); + assert.deepEqual(sampleTop(blockMap([[-1, 1, 0], 2])), [0.92, 1, 1, 0.92]); +}); + +test("neighboring boxes within one stair model shade its recessed tread", () => { + const tread = { min: [0, 0, 0], max: [0.5, 0.5, 1] }; + const riser = { min: [0.5, 0, 0], max: [1, 1, 1] }; + const materials = new Map([[1, { ...stone, render: [tread, riser] }]]); + assert.deepEqual(sampleTop(blockMap([[0, 0, 0], 1]), materials, tread), + [1, 0.92, 0.92, 1]); +}); + +test("render boxes extending beyond their owner can shade a neighboring face", () => { + const materials = new Map([[1, { + ...stone, render: [{ min: [0, 0, 0], max: [1, 1.5, 1] }], + }]]); + assert.deepEqual(sampleTop(blockMap([[-1, 0, 0], 1]), materials), + [0.92, 1, 1, 0.92]); +}); + +test("transparent and cutout materials never act like opaque corner cubes", () => { + for (const overrides of [ + { transparent: true }, { opacity: 0.4 }, { cutout: true }, + { state: "minecraft:oak_leaves[persistent=true]" }, + { state: "minecraft:red_stained_glass" }, { state: "minecraft:water[level=0]" }, + { state: "minecraft:cobweb" }, { state: "minecraft:short_grass" }, + ]) { + const material = { ...stone, ...overrides }; + assert.equal(isAmbientOccluder(material), false); + assert.deepEqual(sampleTop(blockMap([[-1, 1, 0], 1]), new Map([[1, material]])), + [1, 1, 1, 1]); + } + assert.equal(isAmbientOccluder({ ...stone, state: "minecraft:grass_block" }), true); + assert.equal(isAmbientOccluder({ ...stone, state: "minecraft:brown_mushroom_block" }), true); +}); + +test("a texture-pack cutout predicate is cached per material", () => { + let calls = 0; + const sample = createAmbientOcclusionSampler(blockMap([[-1, 1, 0], 1]), materialMap(), + (material, id) => { calls++; return id !== 1; }); + assert.deepEqual(sample([0, 0, 0], unitBox, [0, 1, 0], top), [1, 1, 1, 1]); + sample([1, 0, 0], unitBox, [0, 1, 0], top); + assert.equal(calls, 2); +}); + +test("new rebuild samplers observe edits without keeping stale cached air", () => { + const blocks = blockMap(); + assert.deepEqual(sampleTop(blocks), [1, 1, 1, 1]); + blocks.set("-1,1,0", 1); + assert.deepEqual(sampleTop(blocks), [0.92, 1, 1, 0.92]); + blocks.delete("-1,1,0"); + assert.deepEqual(sampleTop(blocks), [1, 1, 1, 1]); +}); + +test("empty render geometry casts no AO and unknown blocks match placeholder cubes", () => { + assert.deepEqual(sampleTop(blockMap([[-1, 1, 0], 1]), new Map([[1, { ...stone, render: [] }]])), + [1, 1, 1, 1]); + assert.deepEqual(sampleTop(blockMap([[-1, 1, 0], 99])), [0.92, 1, 1, 0.92]); +}); + +test("section invalidation includes corners across positive and negative boundaries", () => { + assert.deepEqual(affectedSectionKeys([5, 5, 5]), ["0,0,0"]); + assert.deepEqual(affectedSectionKeys([16, 5, 5]), ["0,0,0", "1,0,0"]); + assert.deepEqual(affectedSectionKeys([15, 15, 15]), [ + "0,0,0", "0,0,1", "0,1,0", "0,1,1", + "1,0,0", "1,0,1", "1,1,0", "1,1,1", + ]); + assert.equal(affectedSectionKeys([-1, -1, -1]).length, 8); + assert.ok(affectedSectionKeys([-1, -1, -1]).includes("0,0,0")); + assert.ok(affectedSectionKeys([0, 0, 0]).includes("-1,-1,-1")); +}); + +test("extended render geometry widens the affected sections", () => { + assert.deepEqual(affectedSectionKeys([5, 13, 5]), ["0,0,0"]); + assert.deepEqual(affectedSectionKeys([5, 13, 5], [{ min: [0, 0, 0], max: [1, 3, 1] }]), + ["0,0,0", "0,1,0"]); +}); diff --git a/client/tests/block-light-controller.test.js b/client/tests/block-light-controller.test.js new file mode 100644 index 0000000..f4d6383 --- /dev/null +++ b/client/tests/block-light-controller.test.js @@ -0,0 +1,227 @@ +import test, { after, afterEach } from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { BlockLightController } from "../block-light-controller.js"; +import { buildBlockLight } from "../block-light.js"; +import { loadLightProperties } from "../light-properties.js"; + +const properties = JSON.parse( + await readFile(new URL("../light-properties.json", import.meta.url)), +); +const savedWorker = globalThis.Worker, + savedFetch = globalThis.fetch; +const controllers = []; +class FakeWorker { + constructor() { + this.packets = []; + this.terminated = false; + } + postMessage(packet) { + this.packets.push(structuredClone(packet)); + } + terminate() { + this.terminated = true; + } + reply(index) { + const packet = this.packets[index]; + const { min, size, data, sourceCount, blockLevels, skyLevels } = + buildBlockLight( + new Map(packet.blocks), + new Map(packet.materials), + packet.bounds, + ); + this.onmessage({ + data: { + generation: packet.generation, + field: { min, size, data, sourceCount, blockLevels, skyLevels }, + milliseconds: 1, + }, + }); + } +} +globalThis.Worker = FakeWorker; +globalThis.fetch = async () => ({ ok: true, json: async () => properties }); +afterEach(() => { + for (const controller of controllers.splice(0)) { + clearTimeout(controller.timer); + controller.worker?.terminate(); + } +}); +after(() => { + if (savedWorker === undefined) delete globalThis.Worker; + else globalThis.Worker = savedWorker; + globalThis.fetch = savedFetch; +}); +const bounds = { min: [-2, 0, -2], max: [2, 3, 2] }; +const materials = new Map([ + [1, { state: "minecraft:torch", light: 14, render: [] }], + [ + 2, + { + state: "minecraft:sea_lantern", + light: 15, + render: [{ min: [0, 0, 0], max: [1, 1, 1] }], + }, + ], +]); +function fixture() { + const published = []; + const controller = new BlockLightController((field) => published.push(field)); + controllers.push(controller); + return { controller, worker: controller.worker, published }; +} + +test("requests awaiting metadata coalesce into the latest complete world", async () => { + const { controller, worker, published } = fixture(); + controller.request(new Map([["0,1,0", 1]]), materials, bounds); + controller.request(new Map([["1,1,0", 2]]), materials, bounds); + await loadLightProperties(); + controller.start(); + assert.equal(worker.packets.length, 1); + assert.equal(worker.packets[0].generation, 2); + assert.deepEqual(worker.packets[0].blocks, [["1,1,0", 2]]); + worker.reply(0); + assert.equal(published.length, 1); + assert.equal(published[0].sample([1, 1, 0]).blockLevel, 15); + assert.equal(controller.status, "ready"); +}); + +test("an old world's in-flight result is discarded before publishing the replacement world", async () => { + const { controller, worker, published } = fixture(); + await loadLightProperties(); + const first = new Map([["0,1,0", 1]]); + controller.request(first, materials, bounds); + controller.start(); + controller.request(new Map([["1,1,0", 2]]), materials, bounds); + first.clear(); + assert.equal(worker.packets.length, 1); + worker.reply(0); + assert.equal(published.length, 0); + assert.equal(worker.packets.length, 2); + worker.reply(1); + assert.equal(published.length, 1); + assert.equal(published[0].sample([1, 1, 0]).blockLevel, 15); + assert.equal(controller.pending, null); + assert.equal(controller.busy, false); +}); + +test("rapid edits during a build coalesce while the last valid field remains available", async () => { + const { controller, worker, published } = fixture(); + await loadLightProperties(); + const blocks = new Map([["0,1,0", 1]]); + controller.request(blocks, materials, bounds); + controller.start(); + worker.reply(0); + const retained = published[0]; + blocks.set("0,1,0", 2); + controller.request(blocks, materials, bounds); + controller.start(); + blocks.set("1,1,0", 1); + controller.request(blocks, materials, bounds); + blocks.clear(); + controller.request(blocks, materials, bounds); + assert.equal(published.length, 1); + assert.equal(retained.sample([0, 1, 0]).blockLevel, 14); + worker.reply(1); + assert.equal(worker.packets.length, 3); + assert.equal(worker.packets[2].generation, 4); + assert.deepEqual(worker.packets[2].blocks, []); + assert.equal(published.length, 1); + worker.reply(2); + assert.equal(published.length, 2); + assert.equal(published[1].sourceCount, 0); + assert.equal(published[1].sample([0, 1, 0]).blockLevel, 0); +}); + +test("worker failure recovers using the newest queued world and the same solver", async () => { + const { controller, worker, published } = fixture(); + await loadLightProperties(); + controller.request(new Map([["0,1,0", 1]]), materials, bounds); + controller.start(); + controller.request(new Map([["1,1,0", 2]]), materials, bounds); + let prevented = false; + worker.onerror({ + preventDefault() { + prevented = true; + }, + }); + assert.equal(prevented, true); + assert.equal(worker.terminated, true); + assert.equal(controller.worker, null); + // Resolve through publish rather than a timing assumption about the fallback. + await new Promise((resolve, reject) => { + const timeout = setTimeout( + () => reject(Error("Fallback lighting did not finish")), + 1000, + ); + const publish = controller.publish; + controller.publish = (field) => { + clearTimeout(timeout); + publish(field); + resolve(); + }; + }); + assert.equal(published.length, 1); + assert.equal(published[0].sample([1, 1, 0]).blockLevel, 15); + assert.equal(controller.status, "ready"); +}); + +test("a duplicate stale reply cannot mark a newer build idle or start a concurrent job", async () => { + const { controller, worker, published } = fixture(); + await loadLightProperties(); + controller.request(new Map([["0,1,0", 1]]), materials, bounds); + controller.start(); + controller.request(new Map([["1,1,0", 2]]), materials, bounds); + worker.reply(0); + assert.equal(worker.packets.length, 2); + assert.equal(controller.busy, true); + worker.reply(0); + assert.equal(controller.busy, true); + controller.request(new Map([["-1,1,0", 1]]), materials, bounds); + controller.start(); + assert.equal(worker.packets.length, 2); + assert.equal(published.length, 0); + worker.reply(1); + assert.equal(worker.packets.length, 3); + worker.reply(2); + assert.equal(published.length, 1); + assert.equal(published[0].sample([-1, 1, 0]).blockLevel, 14); + worker.reply(2); + assert.equal(published.length, 1); +}); + +test("synchronous Worker construction failure still publishes light from the fallback solver", async () => { + const previousWorker = globalThis.Worker; + globalThis.Worker = class { + constructor() { + throw new Error("Worker blocked by browser policy"); + } + }; + let context; + try { + context = fixture(); + } finally { + globalThis.Worker = previousWorker; + } + const { controller, published } = context; + assert.equal(controller.worker, null); + const completed = new Promise((resolve, reject) => { + const timeout = setTimeout( + () => reject(Error("Fallback lighting did not finish")), + 1000, + ); + const publish = controller.publish; + controller.publish = (field) => { + clearTimeout(timeout); + publish(field); + resolve(); + }; + }); + controller.request(new Map([["0,1,0", 1]]), materials, bounds); + await loadLightProperties(); + controller.start(); + await completed; + assert.equal(published.length, 1); + assert.equal(published[0].sample([0, 1, 0]).blockLevel, 14); + assert.equal(controller.status, "ready"); +}); diff --git a/client/tests/block-light.test.js b/client/tests/block-light.test.js new file mode 100644 index 0000000..6696891 --- /dev/null +++ b/client/tests/block-light.test.js @@ -0,0 +1,202 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { attachBlockLightSamplers, blockEmission, buildBlockLight } from "../block-light.js"; +import { unitBox } from "../math.js"; + +const stone = { state: "minecraft:stone", render: [unitBox], light: 0, light_dampening: 15, light_occlusion: [] }; +const torch = { state: "minecraft:torch", render: [], light: 14, light_dampening: 0, light_occlusion: [] }; +const lamp = { ...stone, state: "minecraft:redstone_lamp[lit=true]", light: 15 }; +const materials = () => new Map([ + [1, stone], [2, torch], [3, lamp], + [4, { ...lamp, state: "minecraft:redstone_lamp[lit=false]", light: 0 }], + [5, { ...torch, state: "minecraft:soul_torch", light: 10 }], + [6, { ...torch, state: "minecraft:sea_lantern", light: 15 }], + [7, { ...stone, state: "minecraft:glass", transparent: true, opacity: 0.35, light_dampening: 0 }], +]); +const map = (...cells) => new Map(cells.map(([pos, id]) => [pos.join(","), id])); +const bounds = { min: [-16, -3, -3], max: [16, 5, 3] }; +const sample = (field, pos) => field.sample(pos.map((value) => value + 0.5)); + +test("block light uses canonical source levels, one-cell falloff and finite reach", () => { + const field = buildBlockLight(map([[0, 0, 0], 2]), materials(), bounds); + assert.equal(field.sourceCount, 1); + for (let x = 0; x <= 15; x++) assert.equal(sample(field, [x, 0, 0]).blockLevel, Math.max(0, 14 - x)); + assert.equal(sample(field, [3, 2, 1]).blockLevel, 8); + assert.equal(sample(field, [0, 0, 0]).skyLevel, 15); +}); + +test("closed solid walls occlude light without wraparound in flattened arrays", () => { + const blocks = map([[-2, 0, 0], 3]); + for (let y = -3; y <= 5; y++) for (let z = -3; z <= 3; z++) blocks.set(`0,${y},${z}`, 1); + const field = buildBlockLight(blocks, materials(), bounds); + assert.equal(sample(field, [-1, 0, 0]).blockLevel, 14); + assert.equal(sample(field, [0, 0, 0]).blockLevel, 0); + assert.equal(sample(field, [1, 0, 0]).blockLevel, 0); + assert.deepEqual(sample(field, [1, 0, 0]).block, [0, 0, 0]); +}); + +test("light travels around an open doorway with Manhattan path attenuation", () => { + const blocks = map([[-2, 0, 0], 3]); + for (let y = -3; y <= 5; y++) for (let z = -3; z <= 3; z++) if (y !== 0 || z !== 2) blocks.set(`0,${y},${z}`, 1); + const field = buildBlockLight(blocks, materials(), bounds); + assert.equal(sample(field, [1, 0, 0]).blockLevel, 8); +}); + +test("transparent glass transmits while metadata dampening controls attenuation", () => { + const blocks = map([[-2, 0, 0], 3]); + for (let y = -3; y <= 5; y++) for (let z = -3; z <= 3; z++) blocks.set(`0,${y},${z}`, 7); + const field = buildBlockLight(blocks, materials(), bounds); + assert.equal(sample(field, [1, 0, 0]).blockLevel, 12); + const mats = materials(); + mats.set(7, { ...mats.get(7), light_dampening: 3 }); + assert.equal(sample(buildBlockLight(blocks, mats, bounds), [1, 0, 0]).blockLevel, 10); +}); + +test("authoritative unlit state emits zero and recomputation removes stale light", () => { + const blocks = map([[0, 0, 0], 3]); + assert.equal(sample(buildBlockLight(blocks, materials(), bounds), [1, 0, 0]).blockLevel, 14); + blocks.set("0,0,0", 4); + const off = buildBlockLight(blocks, materials(), bounds); + assert.equal(off.sourceCount, 0); + assert.ok(off.blockLevels.every((level) => level === 0)); + assert.ok(off.data.every((value) => value === 0)); + blocks.delete("0,0,0"); + assert.equal(sample(buildBlockLight(blocks, materials(), bounds), [1, 0, 0]).blockLevel, 0); + blocks.set("0,0,0", 3); + assert.equal(sample(buildBlockLight(blocks, materials(), bounds), [1, 0, 0]).blockLevel, 14); +}); + +test("torch and soul colors retain their tint at distance without colored radius shifts", () => { + const warm = buildBlockLight(map([[0, 0, 0], 2]), materials(), bounds); + const cyan = buildBlockLight(map([[0, 0, 0], 5]), materials(), bounds); + const close = sample(warm, [1, 0, 0]).block, far = sample(warm, [8, 0, 0]).block; + assert.ok(close[0] > close[1] && close[1] > close[2]); + assert.ok(far[0] > far[1] && far[1] > far[2] && far[2] > 0); + assert.ok(Math.abs(close[1] / close[0] - far[1] / far[0]) < 0.02); + const soul = sample(cyan, [1, 0, 0]).block; + assert.ok(soul[2] > soul[1] && soul[1] > soul[0]); + assert.deepEqual(blockEmission({ state: "minecraft:torch" }).level, 0); + const lampTint = blockEmission(lamp).color; + assert.ok(lampTint[1] > 0.7, "a redstone lamp casts warm white light, not red torch light"); +}); + +test("multiple lights combine by maximum level, never by additive strength", () => { + const mats = materials(); + mats.set(5, { ...mats.get(5), light: 14 }); + const field = buildBlockLight(map([[-2, 0, 0], 2], [[2, 0, 0], 5]), mats, bounds); + assert.equal(field.sourceCount, 2); + assert.equal(sample(field, [0, 0, 0]).blockLevel, 12); + const middle = sample(field, [0, 0, 0]).block; + assert.ok(middle[0] > 0.4 && middle[2] > 0.4); + assert.equal(Math.max(...field.blockLevels), 14); +}); + +test("direct sky stays 15 down clear columns and a full roof leaves darkness below", () => { + const open = buildBlockLight(new Map(), materials(), bounds); + assert.ok(open.skyLevels.every((level) => level === 15)); + const blocks = new Map(); + for (let x = -16; x <= 16; x++) for (let z = -3; z <= 3; z++) blocks.set(`${x},2,${z}`, 1); + const covered = buildBlockLight(blocks, materials(), bounds); + assert.equal(sample(covered, [0, 3, 0]).skyLevel, 15); + assert.equal(sample(covered, [0, 2, 0]).skyLevel, 0); + assert.equal(sample(covered, [0, 1, 0]).skyLevel, 0); + assert.equal(sample(covered, [0, -3, 0]).skyLevel, 0); +}); + +test("sky spreads laterally under an overhang with one level of decay per cell", () => { + const blocks = new Map(); + for (let x = 0; x <= 16; x++) for (let z = -3; z <= 3; z++) blocks.set(`${x},2,${z}`, 1); + const field = buildBlockLight(blocks, materials(), bounds); + assert.equal(sample(field, [-1, 1, 0]).skyLevel, 15); + assert.equal(sample(field, [0, 1, 0]).skyLevel, 14); + assert.equal(sample(field, [1, 1, 0]).skyLevel, 13); + // The open exterior column remains level 15 at this height as well. + assert.equal(sample(field, [2, 0, 0]).skyLevel, 12); +}); + +test("slab face geometry blocks downwards sky despite its zero dampening", () => { + const mats = materials(), slab = { min: [0, 0, 0], max: [1, 0.5, 1] }; + mats.set(8, { state: "minecraft:stone_slab[type=bottom]", render: [slab], light: 0, light_dampening: 0, light_occlusion: [slab] }); + const blocks = new Map(); + for (let x = -16; x <= 16; x++) for (let z = -3; z <= 3; z++) blocks.set(`${x},2,${z}`, 8); + const field = buildBlockLight(blocks, mats, bounds); + assert.equal(sample(field, [0, 2, 0]).skyLevel, 15); + assert.equal(sample(field, [0, 1, 0]).skyLevel, 0); +}); + +test("complementary slab faces close their shared boundary exactly", () => { + const bottom = { min: [0, 0, 0], max: [1, 0.5, 1] }, top = { min: [0, 0.5, 0], max: [1, 1, 1] }; + const mats = materials(); + mats.set(8, { state: "minecraft:stone_slab[type=bottom]", render: [bottom], light: 0, light_dampening: 0, light_occlusion: [bottom] }); + mats.set(9, { state: "minecraft:stone_slab[type=top]", render: [top], light: 0, light_dampening: 0, light_occlusion: [top] }); + const narrow = { min: [-2, 0, 0], max: [2, 0, 0] }; + const closed = buildBlockLight(map([[-2, 0, 0], 2], [[-1, 0, 0], 8], [[0, 0, 0], 9]), mats, narrow); + assert.equal(sample(closed, [-1, 0, 0]).blockLevel, 13); + assert.equal(sample(closed, [0, 0, 0]).blockLevel, 0); + assert.equal(sample(closed, [1, 0, 0]).blockLevel, 0); + const open = buildBlockLight(map([[-2, 0, 0], 2], [[-1, 0, 0], 8], [[0, 0, 0], 8]), mats, narrow); + assert.equal(sample(open, [1, 0, 0]).blockLevel, 11); +}); + +test("negative coordinates and chunk boundaries preserve level and indexing", () => { + const region = { min: [-20, -2, -2], max: [20, 2, 2] }; + const field = buildBlockLight(map([[-16, 0, 0], 3], [[16, 0, 0], 3]), materials(), region); + assert.equal(sample(field, [-17, 0, 0]).blockLevel, 14); + assert.equal(sample(field, [-15, 0, 0]).blockLevel, 14); + assert.equal(sample(field, [15, 0, 0]).blockLevel, 14); + assert.equal(sample(field, [17, 0, 0]).blockLevel, 14); + assert.deepEqual(field.sample([-21, 0, 0]), { block: [0, 0, 0], sky: 0, blockLevel: 0, skyLevel: 0 }); +}); + +test("face samples use the outward hemisphere and cannot pull light through a solid roof", () => { + const blocks = map([[0, 3, 0], 3]); + for (let x = -16; x <= 16; x++) for (let z = -3; z <= 3; z++) blocks.set(`${x},2,${z}`, 1); + const field = buildBlockLight(blocks, materials(), bounds); + const bottom = [[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1]]; + const underside = field.sampleFace([0, 2, 0], unitBox, [0, -1, 0], bottom); + assert.deepEqual(underside.block, [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]); + assert.deepEqual(underside.sky, [0, 0, 0, 0]); + const top = field.sampleFace([1, 2, 0], unitBox, [0, 1, 0], [[0, 1, 1], [1, 1, 1], [1, 1, 0], [0, 1, 0]]); + assert.ok(top.block.some((rgb) => rgb[0] > 0)); + assert.ok(top.sky.every((value) => value === 1)); +}); + +test("worker transfer can restore sampling without propagating the field again", () => { + const blocks = map([[0, 0, 0], 2]), mats = materials(); + const field = buildBlockLight(blocks, mats, bounds); + const raw = { min: field.min, size: field.size, data: field.data, blockLevels: field.blockLevels, skyLevels: field.skyLevels, sourceCount: field.sourceCount }; + const transferred = structuredClone(raw, { transfer: [raw.data.buffer, raw.blockLevels.buffer, raw.skyLevels.buffer] }); + const hydrated = attachBlockLightSamplers(transferred, blocks, mats); + assert.equal(sample(hydrated, [1, 0, 0]).blockLevel, 13); + assert.ok(sample(hydrated, [1, 0, 0]).block[0] > 0); +}); + +test("invalid or excessive bounds fail before allocating a field", () => { + for (const invalid of [null, { min: [0, 0, 0], max: [1, 1, 0.5] }, + { min: [1, 0, 0], max: [0, 1, 1] }, { min: [0, 0, 0], max: [1024, 1024, 1024] }]) + assert.throws(() => buildBlockLight(new Map(), materials(), invalid), RangeError); + const field = buildBlockLight(new Map(), materials(), { min: [0, 0, 0], max: [0, 0, 0] }); + assert.equal(field.data.length, 4); + assert.equal(field.skyLevels[0], 15); +}); + +test("78 directional crossings match measured original Java 26.2 attenuation", () => { + const fixture = JSON.parse(readFileSync(new URL("./fixtures/lighting-java26.2.json", import.meta.url))); + const examples = new Map(fixture.examples.map((entry) => [entry.state, entry])); + const directions = { east: [1, 0, 0], west: [-1, 0, 0], up: [0, 1, 0], down: [0, -1, 0], south: [0, 0, 1], north: [0, 0, -1] }; + const measured = (state, light) => { + const entry = examples.get(state); + return { state, light, render: [], light_dampening: entry.dampening, + light_occlusion: entry.occlusion.map((box) => ({ min: box.slice(0, 3), max: box.slice(3, 6) })) }; + }; + assert.equal(fixture.crossings.length, 78); + for (const crossing of fixture.crossings) { + const target = directions[crossing.direction]; + const mats = new Map([[1, measured(crossing.from, 15)], [2, measured(crossing.to, 0)]]); + const field = buildBlockLight(map([[0, 0, 0], 1], [target, 2]), mats, + { min: target.map((value) => Math.min(0, value)), max: target.map((value) => Math.max(0, value)) }); + assert.equal(sample(field, target).blockLevel, Math.max(0, 15 - crossing.block_dampening), + `${crossing.from} -> ${crossing.to}, ${crossing.direction}`); + } +}); diff --git a/client/tests/block-textures.test.js b/client/tests/block-textures.test.js new file mode 100644 index 0000000..28a9cfe --- /dev/null +++ b/client/tests/block-textures.test.js @@ -0,0 +1,106 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { getBlockFaceTextures, getFaceUV } from "../block-textures.js"; + +const names = ["stone", "cobblestone", "oak_planks", "oak_log", "oak_log_top", "dirt", "grass_block_top", "grass_block_side", "sand", "gravel", "bricks", "stone_bricks", "glass", "oak_leaves", "diamond_ore", "iron_ore", "coal_ore", "gold_ore", "redstone_ore", "deepslate", "obsidian", "snow", "netherrack", "oak_door_bottom"]; +const layers = new Map(names.map((name, index) => [name, index])); +const textureNames = (state, available = layers) => + getBlockFaceTextures(state, available).map((face) => face ? names[face.layer] : null); + +test("partial packs keep missing and unrelated materials on the fallback path", () => { + for (const state of ["minecraft:spruce_planks", "minecraft:stripped_oak_log[axis=y]", "minecraft:mossy_cobblestone", "minecraft:deepslate_diamond_ore", "mod:stone", "minecraft:oak_trapdoor", "minecraft:stonecutter", "", undefined]) { + assert.deepEqual(textureNames(state), Array(6).fill(null), String(state)); + } + assert.deepEqual(textureNames("minecraft:stone", new Map()), Array(6).fill(null)); + assert.equal(getBlockFaceTextures("minecraft:stone", layers)[0].layer, 0); + assert.deepEqual(textureNames("minecraft:stone", new Map([["stone", -1]])), Array(6).fill(null)); +}); + +test("material variants use their own surface without broad substring matching", () => { + for (const [state, texture] of [["oak_stairs[facing=east,half=bottom]", "oak_planks"], ["cobblestone_wall[north=low]", "cobblestone"], ["stone_brick_slab[type=top]", "stone_bricks"], ["brick_stairs", "bricks"], ["snow_block", "snow"]]) { + assert.deepEqual(textureNames(`minecraft:${state}`), Array(6).fill(texture)); + } +}); + +test("grass uses a tinted top, full-color sides and a dirt bottom independently", () => { + assert.deepEqual(textureNames("minecraft:grass_block[snowy=false]"), ["grass_block_side", "grass_block_side", "grass_block_top", "dirt", "grass_block_side", "grass_block_side"]); + const faces = getBlockFaceTextures("minecraft:grass_block", layers); + assert.ok(faces[2].tint[1] > faces[2].tint[0] && faces[2].tint[0] > faces[2].tint[2]); + assert.deepEqual(faces[0].tint, [1, 1, 1]); + assert.equal(faces[2].cutout, false); + assert.deepEqual(textureNames("minecraft:grass_block[snowy=true]"), [null, null, "grass_block_top", "dirt", null, null]); + const missingSide = new Map(layers); + missingSide.delete("grass_block_side"); + assert.deepEqual(textureNames("minecraft:grass_block", missingSide), [null, null, "grass_block_top", "dirt", null, null]); +}); + +test("log end grain follows every axis while oak wood remains bark on all faces", () => { + for (const [axis, caps] of [["x", [0, 1]], ["y", [2, 3]], ["z", [4, 5]]]) { + assert.deepEqual(textureNames(`minecraft:oak_log[axis=${axis}]`), Array.from({ length: 6 }, (_, face) => caps.includes(face) ? "oak_log_top" : "oak_log")); + } + assert.deepEqual(textureNames("minecraft:oak_log"), textureNames("minecraft:oak_log[axis=y]")); + assert.deepEqual(textureNames("minecraft:oak_wood[axis=x]"), Array(6).fill("oak_log")); +}); + +test("cutout textures preserve full-color glass and tint grayscale leaves", () => { + const glass = getBlockFaceTextures("minecraft:glass", layers); + const leaves = getBlockFaceTextures("minecraft:oak_leaves[persistent=true]", layers); + assert.ok(glass.every((face) => face.cutout)); + assert.ok(leaves.every((face) => face.cutout)); + assert.deepEqual(glass[0].tint, [1, 1, 1]); + assert.ok(leaves[0].tint[1] > leaves[0].tint[0] && leaves[0].tint[0] > leaves[0].tint[2]); +}); + +test("doors use lower artwork only on the lower broad faces, respecting open rotation", () => { + const alongZ = ["oak_planks", "oak_planks", "oak_planks", "oak_planks", "oak_door_bottom", "oak_door_bottom"]; + const alongX = ["oak_door_bottom", "oak_door_bottom", "oak_planks", "oak_planks", "oak_planks", "oak_planks"]; + for (const facing of ["north", "south", "east", "west"]) { + const x = ["east", "west"].includes(facing); + assert.deepEqual(textureNames(`minecraft:oak_door[half=lower,facing=${facing},open=false]`), x ? alongX : alongZ); + assert.deepEqual(textureNames(`minecraft:oak_door[half=lower,facing=${facing},open=true]`), x ? alongZ : alongX); + assert.deepEqual(textureNames(`minecraft:oak_door[half=upper,facing=${facing},open=false]`), Array(6).fill(null)); + } +}); + +test("face UVs orient a top-left source consistently from outside each cube face", () => { + const corners = [ + [[1, 0, 1], [1, 0, 0], [1, 1, 0], [1, 1, 1]], + [[0, 0, 0], [0, 0, 1], [0, 1, 1], [0, 1, 0]], + [[0, 1, 1], [1, 1, 1], [1, 1, 0], [0, 1, 0]], + [[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1]], + [[0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]], + [[1, 0, 0], [0, 0, 0], [0, 1, 0], [1, 1, 0]], + ]; + for (let face = 0; face < 6; face++) { + assert.deepEqual(corners[face].map((pos) => getFaceUV(face, pos)), [[0, 1], [1, 1], [1, 0], [0, 0]]); + } + assert.deepEqual(getFaceUV(4, [0.25, 0.5, 1]), [0.25, 0.5]); + assert.deepEqual(getFaceUV(0, [1, 1.5, 0.25]), [0.75, -0.5]); + assert.throws(() => getFaceUV(6, [0, 0, 0]), RangeError); +}); + +test("horizontal log bark follows the log axis through a proper cube rotation", () => { + const vertical = [0.25, 0.75, 0.125]; + // Rotate the same point and normal with the complete cube, then compare UVs. + const horizontalX = [vertical[1], 1 - vertical[0], vertical[2]]; + const horizontalZ = [vertical[0], 1 - vertical[2], vertical[1]]; + const faceFromVerticalX = [3, 2, 0, 1, 4, 5]; + const faceFromVerticalZ = [0, 1, 4, 5, 3, 2]; + for (const block of ["oak_log", "oak_wood"]) { + for (let face = 0; face < 6; face++) { + const expected = getFaceUV(face, vertical); + assert.deepEqual(getFaceUV(faceFromVerticalX[face], horizontalX, `minecraft:${block}[axis=x]`), expected); + assert.deepEqual(getFaceUV(faceFromVerticalZ[face], horizontalZ, `minecraft:${block}[axis=z]`), expected); + assert.deepEqual(getFaceUV(face, vertical, `minecraft:${block}[axis=y]`), expected); + } + } + for (const [axis, sideFaces] of [["x", [2, 3, 4, 5]], ["z", [0, 1, 2, 3]]]) { + for (const face of sideFaces) { + const point = [0.25, 0.5, 0.75]; + const coordinate = axis === "x" ? point[0] : point[2]; + assert.equal(getFaceUV(face, point, `minecraft:oak_log[axis=${axis}]`)[1], 1 - coordinate); + } + } + assert.deepEqual(getFaceUV(4, vertical, "minecraft:deepslate[axis=x]"), getFaceUV(4, vertical)); + assert.deepEqual(getFaceUV(4, vertical, "mod:oak_log[axis=x]"), getFaceUV(4, vertical)); +}); diff --git a/client/tests/dynamics-diagnostics.test.js b/client/tests/dynamics-diagnostics.test.js new file mode 100644 index 0000000..f734f50 --- /dev/null +++ b/client/tests/dynamics-diagnostics.test.js @@ -0,0 +1,17 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {DynamicsDiagnostics} from '../dynamics-diagnostics.js'; +const sample=(x=0)=>({position:[x,77,0],yaw:0,frameMs:10,physicsMs:1,drawMs:2,correction:0,waiting:false,dirty:0,viewChanges:x?2:0,batches:x?3:0,meshResets:1,loadedSections:245,totalSections:245,voxelBytes:4014080}); +test('diagnostics exclude warmup, record movement and calculate bounded summaries',()=>{ + const d=new DynamicsDiagnostics();d.arm('flight',5);const t=d.armed; + d.ready(sample(),false,t+100);d.frame(sample(),t+200);assert.equal(d.frames.length,0); + d.ready(sample(),true,t+500);d.ready(sample(),true,t+1001);assert.equal(d.status,'recording'); + d.frame(sample(),t+1100);d.frame({...sample(16),frameMs:40},t+6100); + assert.equal(d.status,'done');assert.equal(d.result.frames,2);assert.equal(d.result.frameMs.max,40);assert.equal(d.result.over25ms,1);assert.equal(d.result.distance,16);assert.equal(d.result.meshResets,0);assert.equal(d.result.viewChanges,2); +}); +test('automatic flight sends one toggle, climbs obstacles, and stops yielding input after recording',()=>{ + const d=new DynamicsDiagnostics();d.arm('flight');d.status='recording';d.started=0;d.yaw=0; + assert.equal(d.controls(false,false,0).fly_toggle,true);assert.equal(d.controls(true,false,0).fly_toggle,true);assert.equal(d.controls(true,false,50).fly_toggle,false); + assert.equal(d.controls(true,true,5000,true).jump,true);assert.equal(d.controls(false,true,5500).jump,true);assert.equal(d.controls(false,true,6100).jump,false); + d.status='done';assert.equal(d.controls(true,true,6200),null); +}); diff --git a/client/tests/edit-diagnostics.test.js b/client/tests/edit-diagnostics.test.js new file mode 100644 index 0000000..7735c10 --- /dev/null +++ b/client/tests/edit-diagnostics.test.js @@ -0,0 +1,20 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {EditDiagnostics} from '../edit-diagnostics.js'; + +test('edit timings separate round trip and mesh publication, and ignore unrelated changes',()=>{ + const d=new EditDiagnostics();d.request([16,2,-1],0,10); + d.confirmed([{pos:[16,2,-1],block:2}],20); + assert.equal(d.published('1,0,-1',30),null); + d.confirmed([{pos:[16,2,-1],block:0}],25); + assert.equal(d.published('0,0,-1',40),null); + assert.deepEqual(d.published('1,0,-1',45),{acknowledgementMs:15,geometryMs:20,totalMs:35}); + assert.equal(d.published('1,0,-1',50),null); +}); +test('expired requests and world resets cannot produce misleading edit timings',()=>{ + const d=new EditDiagnostics();d.request([0,0,0],1,0); + d.confirmed([{pos:[0,0,0],block:1}],6000); + assert.equal(d.published('0,0,0',6001),null); + d.request([0,0,0],1,6002);d.confirmed([{pos:[0,0,0],block:1}],6003);d.reset(); + assert.equal(d.published('0,0,0',6004),null);assert.equal(d.last,null); +}); diff --git a/client/tests/edit-mesh.test.js b/client/tests/edit-mesh.test.js new file mode 100644 index 0000000..7040e7f --- /dev/null +++ b/client/tests/edit-mesh.test.js @@ -0,0 +1,75 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFile} from 'node:fs/promises'; +import {SectionVoxelMap} from '../section-voxel-map.js'; +import {captureEditMesh,buildEditMesh} from '../edit-mesh.js'; +import {EditMeshController} from '../edit-mesh-controller.js'; +import {TerrainState} from '../terrain-state.js'; +const properties=JSON.parse(await readFile(new URL('../light-properties.json',import.meta.url))); +const cube={min:[0,0,0],max:[1,1,1]}; +const materials=new Map([[1,{state:'minecraft:stone',color:[128,128,128],render:[cube]}],[2,{state:'minecraft:sea_lantern',color:[230,245,250],render:[cube],light:15}],[3,{state:'minecraft:glass',color:[160,210,230],render:[cube],opacity:0.3}]]); + +test('local edit geometry matches full-world meshing at boundaries and distant coordinates without scanning the world',()=>{ + for(const base of [0,-32,29999840]) { + const state=new TerrainState(properties),initial=new Int32Array([base+15,2,0,1,base+16,2,0,1,base+17,2,0,2,base+16,3,0,3]); + state.sync({epoch:1,version:1,reset:true,compact:true,initial,materials:[...materials],textures:[],bounds:{min:[base-2,-2,-3],max:[base+32,6,3]}});state.light(); + // The bulk light calculation is deliberately not run after this removal. + state.blocks.delete(`${base+15},2,0`); + const current=state.mesh({epoch:1,version:1,id:`${base/16+1},0,0`,job:1}); + state.blocks[Symbol.iterator]=()=>{throw Error('No global iteration permitted');}; + state.blocks.sectionEntries=()=>{throw Error('No global section iteration permitted');}; + const packet=captureEditMesh(current.id,state.blocks,state.materials,state.textureLayers,state.field); + assert.ok(packet.sections.length<=27); + assert.ok(packet.light.data.length<=24**3*4); + const before=state.blocks.getSectionCells(current.id).byteLength; + const transfers=[...packet.sections.map(s=>s.cells.buffer),packet.light.data.buffer,packet.light.blockLevels.buffer,packet.light.skyLevels.buffer]; + const transferred=structuredClone(packet,{transfer:transfers}); + assert.equal(state.blocks.getSectionCells(current.id).byteLength,before,'live voxel buffers are never detached'); + assert.ok(state.field.data.byteLength>0,'live lighting buffers remain usable'); + const mesh=buildEditMesh(transferred,properties); + assert.deepEqual(mesh.vertices,current.vertices); + assert.deepEqual(mesh.transparent,current.transparent); + assert.deepEqual(mesh.origin,current.origin); + } +}); + +test('breaks and placements rebuild current geometry while full lighting is still pending',()=>{ + const blocks=new SectionVoxelMap();blocks.set('15,2,0',1);blocks.set('16,2,0',1); + const mesh=()=>buildEditMesh(captureEditMesh('1,0,0',blocks,materials,new Map(),null),properties); + const before=mesh();blocks.delete('15,2,0');const removed=mesh(); + assert.equal(removed.vertices.length,before.vertices.length+120,'the adjacent face appears'); + blocks.set('15,2,0',2);assert.equal(mesh().vertices.length,before.vertices.length); + const placed=buildEditMesh(captureEditMesh('0,0,0',blocks,materials,new Map(),null),properties); + assert.ok(placed.vertices.length>0); + assert.equal(placed.vertices[15],1,'lamp emission is immediately visible'); +}); + +class Worker { + packets=[]; postMessage(packet,transfers){this.packets.push(structuredClone(packet,{transfer:transfers}));} + terminate(){this.terminated=true;} + reply(packet){this.onmessage({data:{...packet,vertices:new Float32Array(),transparent:new Float32Array(),preview:true}});} +} +function fixture(){const worker=new Worker(),captured=[]; + const controller=new EditMeshController({workerFactory:()=>worker,capture:id=>{captured.push(id);return {id,sections:[],materials:[],textures:[],light:null};}}); + return {worker,controller,captured};} + +test('independent edit queue is bounded, coalesces newer edits and rejects stale/reset/unloaded results',()=>{ + const {worker,controller:c}=fixture(); + c.request(['0,0,0']);c.pump();const old=worker.packets[0]; + c.request(['0,0,0']);worker.reply(old);assert.equal(c.ready.size,0); + c.pump();const latest=worker.packets[1];worker.reply(latest);assert.equal(c.ready.size,1); + c.request(['1,0,0','2,0,0']);c.pump();worker.reply(worker.packets.at(-1));c.pump(); + assert.equal(c.ready.size,2);assert.equal(worker.packets.length,3,'two results cap memory before upload'); + c.cancel('0,0,0');assert.equal(c.isCurrent(latest),false);c.pump();const unloaded=worker.packets.at(-1); + c.cancel('2,0,0');worker.reply(unloaded);assert.equal(c.ready.has('2,0,0'),false); + c.request(['3,0,0']);c.pump();const reset=worker.packets.at(-1);c.reset();worker.reply(reset); + assert.equal(c.ready.size,0);assert.equal(c.pending.size,0); + c.dispose();assert.equal(worker.terminated,true); +}); + +test('a ready edit stays valid across unrelated terrain/light work until its own geometry changes',()=>{ + const {worker,controller:c}=fixture();c.request(['0,0,0']);c.pump();worker.reply(worker.packets[0]); + const result=c.ready.get('0,0,0');c.request(['8,0,0']); + assert.equal(c.isCurrent(result),true);c.request(['0,0,0']);assert.equal(c.isCurrent(result),false); + c.dispose(); +}); diff --git a/client/tests/fixtures/lighting-java26.2.json b/client/tests/fixtures/lighting-java26.2.json new file mode 100644 index 0000000..db95318 --- /dev/null +++ b/client/tests/fixtures/lighting-java26.2.json @@ -0,0 +1,984 @@ +{ + "version": "26.2", + "examples": [ + { + "minecraft_id": 0, + "state": "minecraft:air", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 1, + "state": "minecraft:stone", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 562, + "state": "minecraft:glass", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 27161, + "state": "minecraft:tinted_glass", + "emission": 0, + "dampening": 15, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 7098, + "state": "minecraft:white_stained_glass", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 8331, + "state": "minecraft:glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 6927, + "state": "minecraft:ice", + "emission": 0, + "dampening": 1, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 12914, + "state": "minecraft:packed_ice", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 15275, + "state": "minecraft:blue_ice", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 86, + "state": "minecraft:water[level=0]", + "emission": 0, + "dampening": 1, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 102, + "state": "minecraft:lava[level=0]", + "emission": 15, + "dampening": 1, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 279, + "state": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "emission": 0, + "dampening": 1, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 531, + "state": "minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=false]", + "emission": 0, + "dampening": 1, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 13333, + "state": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "emission": 0, + "dampening": 0, + "can_occlude": true, + "use_shape": true, + "propagates_skylight_down": true, + "occlusion": [ + [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.5, + 1.0 + ] + ] + }, + { + "minecraft_id": 3918, + "state": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "emission": 0, + "dampening": 0, + "can_occlude": true, + "use_shape": true, + "propagates_skylight_down": true, + "occlusion": [ + [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.5, + 1.0 + ], + [ + 0.0, + 0.5, + 0.0, + 1.0, + 1.0, + 0.5 + ] + ] + }, + { + "minecraft_id": 7129, + "state": "minecraft:oak_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 5666, + "state": "minecraft:oak_door[facing=north,half=lower,hinge=left,open=false,powered=false]", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 6919, + "state": "minecraft:snow[layers=1]", + "emission": 0, + "dampening": 0, + "can_occlude": true, + "use_shape": true, + "propagates_skylight_down": true, + "occlusion": [ + [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.125, + 1.0 + ] + ] + }, + { + "minecraft_id": 6928, + "state": "minecraft:snow_block", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 3370, + "state": "minecraft:torch", + "emission": 14, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 3371, + "state": "minecraft:wall_torch[facing=north]", + "emission": 14, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 6885, + "state": "minecraft:redstone_torch[lit=true]", + "emission": 7, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 7006, + "state": "minecraft:soul_torch", + "emission": 10, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 7016, + "state": "minecraft:glowstone", + "emission": 15, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 12892, + "state": "minecraft:sea_lantern", + "emission": 15, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 9480, + "state": "minecraft:redstone_lamp[lit=false]", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 20840, + "state": "minecraft:lantern[hanging=false,waterlogged=false]", + "emission": 15, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 7023, + "state": "minecraft:jack_o_lantern[facing=north]", + "emission": 15, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 12566, + "state": "minecraft:light[level=15,waterlogged=false]", + "emission": 15, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 27164, + "state": "minecraft:sculk_sensor[power=0,sculk_sensor_phase=inactive,waterlogged=false]", + "emission": 1, + "dampening": 0, + "can_occlude": true, + "use_shape": true, + "propagates_skylight_down": true, + "occlusion": [ + [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.5, + 1.0 + ] + ] + }, + { + "minecraft_id": 29539, + "state": "minecraft:copper_bulb[lit=false,powered=false]", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 29521, + "state": "minecraft:copper_grate[waterlogged=false]", + "emission": 0, + "dampening": 0, + "can_occlude": false, + "use_shape": false, + "propagates_skylight_down": true, + "occlusion": [] + }, + { + "minecraft_id": 9479, + "state": "minecraft:redstone_lamp[lit=true]", + "emission": 15, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 13331, + "state": "minecraft:oak_slab[type=top,waterlogged=false]", + "emission": 0, + "dampening": 0, + "can_occlude": true, + "use_shape": true, + "propagates_skylight_down": true, + "occlusion": [ + [ + 0.0, + 0.5, + 0.0, + 1.0, + 1.0, + 1.0 + ] + ] + }, + { + "minecraft_id": 13335, + "state": "minecraft:oak_slab[type=double,waterlogged=false]", + "emission": 0, + "dampening": 15, + "can_occlude": true, + "use_shape": false, + "propagates_skylight_down": false, + "occlusion": [] + }, + { + "minecraft_id": 13332, + "state": "minecraft:oak_slab[type=bottom,waterlogged=true]", + "emission": 0, + "dampening": 1, + "can_occlude": true, + "use_shape": true, + "propagates_skylight_down": false, + "occlusion": [ + [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.5, + 1.0 + ] + ] + } + ], + "crossings": [ + { + "from": "minecraft:air", + "to": "minecraft:stone", + "direction": "down", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:stone", + "direction": "up", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:stone", + "direction": "north", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:stone", + "direction": "south", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:stone", + "direction": "west", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:stone", + "direction": "east", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:glass", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:glass", + "direction": "up", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:glass", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:glass", + "direction": "south", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:glass", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:glass", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:tinted_glass", + "direction": "down", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:tinted_glass", + "direction": "up", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:tinted_glass", + "direction": "north", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:tinted_glass", + "direction": "south", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:tinted_glass", + "direction": "west", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:tinted_glass", + "direction": "east", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:ice", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:ice", + "direction": "up", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:ice", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:ice", + "direction": "south", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:ice", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:ice", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:water[level=0]", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:water[level=0]", + "direction": "up", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:water[level=0]", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:water[level=0]", + "direction": "south", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:water[level=0]", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:water[level=0]", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "direction": "up", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "direction": "south", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 1 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "up", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "south", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "direction": "up", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "direction": "south", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:air", + "to": "minecraft:glowstone", + "direction": "down", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:glowstone", + "direction": "up", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:glowstone", + "direction": "north", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:glowstone", + "direction": "south", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:glowstone", + "direction": "west", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:glowstone", + "direction": "east", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:sea_lantern", + "direction": "down", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:sea_lantern", + "direction": "up", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:sea_lantern", + "direction": "north", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:sea_lantern", + "direction": "south", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:sea_lantern", + "direction": "west", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:air", + "to": "minecraft:sea_lantern", + "direction": "east", + "block_dampening": 15, + "sky_column_dampening": 15 + }, + { + "from": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "to": "minecraft:oak_slab[type=top,waterlogged=false]", + "direction": "down", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:oak_slab[type=top,waterlogged=false]", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:glowstone", + "to": "minecraft:air", + "direction": "down", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "to": "minecraft:oak_slab[type=top,waterlogged=false]", + "direction": "up", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:oak_slab[type=top,waterlogged=false]", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "up", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:glowstone", + "to": "minecraft:air", + "direction": "up", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "to": "minecraft:oak_slab[type=top,waterlogged=false]", + "direction": "north", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:oak_slab[type=top,waterlogged=false]", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "north", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:glowstone", + "to": "minecraft:air", + "direction": "north", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "to": "minecraft:oak_slab[type=top,waterlogged=false]", + "direction": "south", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:oak_slab[type=top,waterlogged=false]", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "south", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:glowstone", + "to": "minecraft:air", + "direction": "south", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "to": "minecraft:oak_slab[type=top,waterlogged=false]", + "direction": "west", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:oak_slab[type=top,waterlogged=false]", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "west", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:glowstone", + "to": "minecraft:air", + "direction": "west", + "block_dampening": 1, + "sky_column_dampening": 0 + }, + { + "from": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "to": "minecraft:oak_slab[type=top,waterlogged=false]", + "direction": "east", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:oak_slab[type=top,waterlogged=false]", + "to": "minecraft:oak_slab[type=bottom,waterlogged=false]", + "direction": "east", + "block_dampening": 16, + "sky_column_dampening": 16 + }, + { + "from": "minecraft:glowstone", + "to": "minecraft:air", + "direction": "east", + "block_dampening": 1, + "sky_column_dampening": 0 + } + ], + "measurement_scope": "Public original Java 26.2 block-state light properties and LightEngine.getLightDampeningInto calls. Effective shape is empty unless canOcclude and useShapeForLightOcclusion are both true. Crossings measure directional shape blocking and target attenuation, not a full running light engine or skylight source map.", + "provenance": { + "source_url": "https://piston-data.mojang.com/v1/objects/823e2250d24b3ddac457a60c92a6a941943fcd6a/server.jar", + "source_sha1": "823e2250d24b3ddac457a60c92a6a941943fcd6a", + "source_sha256": "cdacdfb25898de5e4b4b0e5ddcc2722f77067e46605709c2d886c000ebb63ec5", + "executable_sha256": "183c0499c5f855570ee487dd38e141a53f0121f83a0b07a3bac2d8b6698823e8", + "probe_sha256": "8663e2f81af754fa4063a6f0a109fa27b8c1fae06a5a393d7ca42ac243a252bb", + "command": "python3 scripts/measure_lighting.py --java /path/to/java25/bin/java" + } +} diff --git a/client/tests/large-world.test.js b/client/tests/large-world.test.js new file mode 100644 index 0000000..ff579da --- /dev/null +++ b/client/tests/large-world.test.js @@ -0,0 +1,33 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {SectionVoxelMap} from '../section-voxel-map.js'; +import {TerrainController} from '../terrain-controller.js'; +import {TerrainState} from '../terrain-state.js'; +import {buildBlockLight} from '../block-light.js'; +import {buildSectionMesh} from '../mesh-geometry.js'; +test('authoritative columns keep a cave dark when the roof is above the loaded vertical window',()=>{ + const world=new SectionVoxelMap();world.setSection('0,0,0',new Uint32Array(4096)); + const bounds={min:[0,0,0],max:[15,15,15]},columns=new Map([['0,0',new Int16Array(256).fill(30)]]); + assert.equal(buildBlockLight(world,new Map(),bounds,columns).sample([8,8,8]).skyLevel,0); + columns.get('0,0').fill(-1); + assert.equal(buildBlockLight(world,new Map(),bounds,columns).sample([8,8,8]).skyLevel,15); +}); +test('compact controller transfers section copies and preserves the main collision buffers',()=>{ + const packets=[],worker={postMessage(p,transfers){packets.push(structuredClone(p,{transfer:transfers}));},terminate(){}}; + const c=new TerrainController({workerFactory:()=>worker}),world=new SectionVoxelMap(); + const cells=new Uint32Array(4096).fill(3);world.setSection('0,0,0',cells); + const materials=new Map([[3,{state:'minecraft:stone',color:[128,128,128]}]]); + c.reset(world,materials,new Map(),{min:[0,0,0],max:[15,15,15]});c.flush(); + assert.equal(cells.byteLength,16384);assert.equal(packets[0].initial,null);assert.equal(packets[0].compact,true);assert.equal(packets[0].sections[0].cells[0],3); + const state=new TerrainState(null);state.sync(packets[0]);assert.equal(state.blocks.getAt(0,0,0),3); + c.update({unload:[[0,0,0]]});c.update({sections:[{section:[0,0,0],cells:new Uint32Array(4096)}]});c.flush();state.sync(packets[1]); + assert.equal(state.blocks.hasSection('0,0,0'),true);assert.equal(state.blocks.size,0);c.dispose(); +}); +test('section-local mesh coordinates retain fractional geometry near the world border',()=>{ + const world=new SectionVoxelMap(),x=29_999_840;world.set(`${x},0,0`,1); + const materials=new Map([[1,{state:'custom:partial',color:[128,128,128],render:[{min:[.125,.25,.125],max:[.875,.75,.875]}]}]]); + const result=buildSectionMesh({id:`${x/16},0,0`,blocks:world,materials,localCoordinates:true}); + assert.deepEqual(result.origin,[x,0,0]); + const xs=[];for(let i=0;i product * value, 1); + return { + min, + size, + data: new Uint8Array(count * 4), + skyLevels: new Uint8Array(count).fill(15), + }; +} +const index = (field, [x, y, z]) => + x - + field.min[0] + + field.size[0] * (y - field.min[1] + field.size[1] * (z - field.min[2])); + +test("initial lighting marks current sections, while equal fields retain every mesh", () => { + const sections = new Map([ + ["0,0,0", { vao: "first" }], + ["1,0,0", { vao: "retained" }], + ]); + assert.deepEqual(changedLightSections(null, field(), sections.keys()), [ + ...sections.keys(), + ]); + const before = [...sections.values()]; + assert.deepEqual(changedLightSections(field(), field(), sections.keys()), []); + assert.deepEqual([...sections.values()], before); +}); + +test("a corner light delta invalidates all eight sharing neighborhoods but no distant section", () => { + const previous = field(), + next = field(); + next.skyLevels[index(next, [15, 15, 15])] = 14; + const neighbors = []; + for (let x = 0; x <= 1; x++) + for (let y = 0; y <= 1; y++) + for (let z = 0; z <= 1; z++) neighbors.push(`${x},${y},${z}`); + assert.deepEqual( + changedLightSections(previous, next, [...neighbors, "2,0,0"]), + neighbors, + ); +}); + +test("a tint-only change crosses the section boundary and preserves distant retained sections", () => { + const previous = field(), + next = field(); + next.data[index(next, [16, 4, 4]) * 4 + 2] = 180; + const sections = ["0,0,0", "1,0,0", "2,0,0"]; + assert.deepEqual(changedLightSections(previous, next, sections), [ + "0,0,0", + "1,0,0", + ]); +}); + +test("moving field bounds compares world coordinates and only invalidates lost coverage", () => { + const previous = field(); + const shifted = field([-1, -2, -2], [55, 36, 36]); + assert.deepEqual( + changedLightSections(previous, shifted, ["0,0,0", "1,0,0"]), + [], + ); + const clipped = field([0, -2, -2], [54, 36, 36]); + assert.deepEqual( + changedLightSections(previous, clipped, ["0,0,0", "1,0,0"]), + ["0,0,0"], + ); +}); diff --git a/client/tests/light-properties.test.js b/client/tests/light-properties.test.js new file mode 100644 index 0000000..2366f10 --- /dev/null +++ b/client/tests/light-properties.test.js @@ -0,0 +1,72 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { applyLightProperties, loadLightProperties } from "../light-properties.js"; + +const properties = JSON.parse(await readFile(new URL("../light-properties.json", import.meta.url))); +const reference = JSON.parse(await readFile(new URL("./fixtures/lighting-java26.2.json", import.meta.url))); + +test("all original measured examples match by Minecraft ID and canonical state", () => { + for (const example of reference.examples) { + for (const material of [{ minecraft_id: example.minecraft_id }, { state: example.state }]) { + const actual = applyLightProperties(material, properties); + assert.equal(actual.light_dampening, example.dampening, example.state); + assert.deepEqual(actual.light_occlusion, example.occlusion.map((box) => ({ min: box.slice(0, 3), max: box.slice(3, 6) })), example.state); + assert.deepEqual(material, "state" in material ? { state: example.state } : { minecraft_id: example.minecraft_id }); + } + } +}); + +test("partial state strings use default values and accept arbitrary property order", () => { + const top = applyLightProperties({ state: "minecraft:oak_slab[type=top]" }, properties); + assert.equal(top.light_dampening, 0); + assert.deepEqual(top.light_occlusion, [{ min: [0, 0.5, 0], max: [1, 1, 1] }]); + const wet = applyLightProperties({ state: "minecraft:oak_slab[waterlogged=true,type=top]" }, properties); + assert.equal(wet.light_dampening, 1); + assert.deepEqual(wet.light_occlusion, top.light_occlusion); + const iron = applyLightProperties({ state: "minecraft:iron_trapdoor[open=false]" }, properties); + assert.equal(iron.light_dampening, 0); + assert.deepEqual(iron.light_occlusion, []); +}); + +test("custom materials retain their own identity and optional light properties", () => { + const custom = { id: 1, state: "shacraft:trampoline", light: 11, light_dampening: 2, light_occlusion: [] }; + const actual = applyLightProperties(custom, properties); + assert.notEqual(actual, custom); + assert.deepEqual(actual, custom); + for (const state of ["minecraft:oak_slab[type=invalid]", "minecraft:stone[missing=true]", "minecraft:oak_slab[type=top,type=bottom]"]) { + assert.deepEqual(applyLightProperties({ state }, properties), { state }); + } + assert.deepEqual(applyLightProperties({ id: 1 }, properties), { id: 1 }); + const glass = applyLightProperties({ id: 999, minecraft_id: reference.examples.find((e) => e.state === "minecraft:glass").minecraft_id, light: 4 }, properties); + assert.equal(glass.id, 999); + assert.equal(glass.light, 4); + assert.equal(glass.light_dampening, 0); +}); + +test("every registry state is present and every shape index is valid", () => { + assert.equal(properties.codes.length, 32366); + assert.equal(Object.keys(properties.blocks).length, 1196); + assert.equal(properties.shapes.length, 60); + for (const code of properties.codes) { + assert.ok(Number.isInteger(code) && code >= 0); + assert.ok(properties.shapes[Math.floor(code / 16)]); + } +}); + +test("the runtime metadata request is shared by concurrent and later callers", async () => { + const originalFetch = globalThis.fetch; + let calls = 0; + globalThis.fetch = async (url) => { + calls++; + assert.equal(url.pathname.endsWith("/light-properties.json"), true); + return { ok: true, json: async () => properties }; + }; + try { + const [first, second] = await Promise.all([loadLightProperties(), loadLightProperties()]); + assert.equal(first, properties); + assert.equal(first, second); + assert.equal(await loadLightProperties(), properties); + assert.equal(calls, 1); + } finally { globalThis.fetch = originalFetch; } +}); diff --git a/client/tests/local-terrain-meshing.test.js b/client/tests/local-terrain-meshing.test.js new file mode 100644 index 0000000..81ee74b --- /dev/null +++ b/client/tests/local-terrain-meshing.test.js @@ -0,0 +1,117 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFile} from 'node:fs/promises'; +import {TerrainState} from '../terrain-state.js'; +import {TerrainController} from '../terrain-controller.js'; +import {SectionVoxelMap} from '../section-voxel-map.js'; +const properties=JSON.parse(await readFile(new URL('../light-properties.json',import.meta.url))); +const cube={min:[0,0,0],max:[1,1,1]}; +const materials=new Map([[1,{state:'minecraft:stone',color:[128,128,128],render:[cube]}],[2,{state:'minecraft:sea_lantern',color:[240,245,250],render:[cube],light:15}],[3,{state:'minecraft:water',color:[80,110,240],render:[cube],opacity:0.5}],[4,{state:'minecraft:glass',color:[180,220,240],render:[cube],opacity:0.3}]]); + +test('local light meshes match whole-view light with distant sources, a high roof, water and negative coordinates',()=>{ + const blocks=new SectionVoxelMap(),bounds={min:[-48,-16,-48],max:[79,47,63]},columns=[]; + for(let x=-48;x<=79;x++)for(let z=-48;z<=63;z++)blocks.set(`${x},0,${z}`,1); + for(let x=4;x<13;x++)for(let z=5;z<13;z++)blocks.set(`${x},40,${z}`,1); + for(let y=1;y<40;y++)blocks.set(`10,${y},11`,3); + blocks.set('-14,1,4',2);blocks.set('31,1,8',2);blocks.set('3,1,8',4); + for(let x=-3;x<=4;x++)for(let z=-3;z<=3;z++) { + const heights=new Int16Array(256); + for(let lx=0;lx<16;lx++)for(let lz=0;lz<16;lz++)if(x*16+lx>=4&&x*16+lx<13&&z*16+lz>=5&&z*16+lz<13)heights[lx+16*lz]=40; + columns.push({column:[x,z],heights}); + } + const state=new TerrainState(properties); + state.sync({epoch:1,version:1,reset:true,compact:true,sections:[...blocks.sectionEntries()].map(([id,cells])=>({section:id.split(',').map(Number),cells})),materials:[...materials],textures:[],bounds,columns}); + state.light(); + for(const id of ['0,0,0','-1,0,0','0,1,0']) { + const packet={id,epoch:1,version:1,job:1,meshTicket:1}; + const expected=state.mesh(packet),actual=state.meshLocal(packet); + assert.deepEqual(actual.vertices,expected.vertices);assert.deepEqual(actual.transparent,expected.transparent); + assert.ok(actual.lightCells<=68*68*64); + } + assert.equal(state.meshLocal({id:'0,2,0',epoch:1,version:1}).lightCached,true,'vertical sections share their column light'); + state.sync({epoch:1,version:2,materials:[],bounds,changes:new Int32Array([70,1,50,2])}); + assert.equal(state.meshLocal({id:'0,0,0',epoch:1,version:2}).lightCached,true,'distant edits keep the local field'); + state.sync({epoch:1,version:3,materials:[],bounds,changes:new Int32Array([0,1,1,2])}); + assert.equal(state.meshLocal({id:'0,0,0',epoch:1,version:3}).lightCached,false,'near edits invalidate light'); + state.light();assert.deepEqual(state.meshLocal({id:'0,0,0',epoch:1,version:3}).vertices,state.mesh({id:'0,0,0',epoch:1,version:3}).vertices); +}); + +test('a roof outside the vertical view stays dark in local meshes and cache size stays bounded',()=>{ + const state=new TerrainState(properties),bounds={min:[-144,0,-144],max:[159,79,159]},columns=[]; + for(let x=-9;x<=9;x++)for(let z=-9;z<=9;z++)columns.push({column:[x,z],heights:new Int16Array(256).fill(100)}); + state.sync({epoch:1,version:1,reset:true,compact:true,initial:new Int32Array([0,1,0,1]),materials:[...materials],bounds,columns}); + const result=state.meshLocal({epoch:1,version:1,id:'0,0,0'}); + for(let i=19;ip.type==='sync').at(-1);this.reply({type:'synced',epoch:p.epoch,version:p.version});} + mesh(packet=this.packets.at(-1)){this.reply({...packet,vertices:new Float32Array(20),transparent:new Float32Array()});} +} +function fixture(){const light=new Worker(),mesh=new Worker(),dirty=new Set(),c=new TerrainController({workerFactory:()=>light,meshWorkerFactory:()=>mesh,onDirty:ids=>ids.forEach(id=>dirty.add(id))}); + const cells=new Uint32Array(4096).fill(1),blocks=new SectionVoxelMap();blocks.setSection('0,0,0',cells); + c.reset(blocks,materials,new Map(),{min:[-144,-32,-144],max:[159,47,159]});c.flush();mesh.sync();return {light,mesh,c,cells,dirty};} + +test('nearby meshing starts before any global light result and survives repeated far chunk packets',()=>{ + const {light,mesh,c,cells}=fixture(); + try { + assert.equal(c.workerVersion,-1);assert.equal(c.requestMesh('0,0,0'),true); + const job=mesh.packets.at(-1); + for(let i=5;i<9;i++){c.update({sections:[{section:[i,0,i],cells:new Uint32Array(4096)}],materials});c.flush();mesh.sync();} + mesh.mesh(job);const ready=c.ready.get('0,0,0');assert.ok(ready);assert.equal(c.isCurrent(ready),true); + assert.equal(cells.byteLength,16384); + assert.notEqual(light.packets[0].sections[0].cells.buffer,mesh.packets[0].sections[0].cells.buffer); + assert.equal(c.workerVersion,-1,'global lighting is still deliberately unfinished'); + c.update({changes:[{pos:[16,0,0],block:2}]});assert.equal(c.ready.size,0);assert.equal(c.isCurrent(ready),false); + c.flush();mesh.sync();assert.equal(c.requestMesh('0,0,0'),true); + const old=mesh.packets.at(-1);c.update({unload:[[0,0,0]]});mesh.mesh(old);assert.equal(c.ready.size,0); + }finally{c.dispose();} +}); + +test('material, sky-column and world changes reject affected meshes, but repeated definitions do not',()=>{ + const {mesh,c}=fixture();try{ + c.requestMesh('0,0,0');mesh.mesh();let ready=c.ready.get('0,0,0'); + c.update({materials:new Map([...materials].map(([id,m])=>[id,structuredClone(m)]))});assert.equal(c.isCurrent(ready),true); + c.update({columns:[{column:[0,0],heights:new Int16Array(256).fill(100)}]});assert.equal(c.isCurrent(ready),false); + c.flush();mesh.sync();c.requestMesh('0,0,0');mesh.mesh();ready=c.ready.get('0,0,0'); + c.update({materials:new Map([[1,{...materials.get(1),color:[12,34,56]}]])});assert.equal(c.isCurrent(ready),false); + c.reset(new SectionVoxelMap(),materials,new Map(),{min:[0,0,0],max:[15,15,15]});assert.equal(c.isCurrent(ready),false); + }finally{c.dispose();} +}); + +test('unload and re-entry cannot reuse a ticket from an old in-flight mesh',()=>{ + const {mesh,c}=fixture();try{ + c.requestMesh('0,0,0');const old=mesh.packets.at(-1); + c.update({unload:[[0,0,0]]});c.flush();mesh.sync(); + c.update({sections:[{section:[0,0,0],cells:new Uint32Array(4096).fill(2)}]});c.flush();mesh.sync(); + mesh.mesh(old);assert.equal(c.ready.size,0); + c.requestMesh('0,0,0');const current=mesh.packets.at(-1); + assert.notEqual(current.meshTicket,old.meshTicket);assert.equal(c.isCurrent(old),false); + mesh.mesh(current);assert.equal(c.isCurrent(c.ready.get('0,0,0')),true); + }finally{c.dispose();} +}); + +test('horizontal view movement retains interior meshes and invalidates only changed light boundaries',()=>{ + const {mesh,c}=fixture();try{ + c.requestMesh('0,0,0');mesh.mesh();const near=c.ready.get('0,0,0');c.ready.delete('0,0,0'); + c.requestMesh('-9,0,0');mesh.mesh();const edge=c.ready.get('-9,0,0'); + c.update({bounds:{min:[-112,-32,-144],max:[191,47,159]}}); + assert.equal(c.isCurrent(near),true);assert.equal(c.isCurrent(edge),false); + c.update({bounds:{min:[-112,-16,-144],max:[191,63,159]}}); + assert.equal(c.isCurrent(near),false,'moving the top sky boundary can change light throughout a column'); + }finally{c.dispose();} +}); + +test('an obsolete failed mesh releases its job instead of blocking subsequent chunks',()=>{ + const {mesh,c}=fixture();try{ + c.requestMesh('0,0,0');const old=mesh.packets.at(-1); + c.update({changes:[{pos:[0,0,0],block:2}]});c.flush();mesh.sync(); + mesh.reply({...old,type:'error',error:'obsolete work'}); + assert.equal(c.busy,null);assert.equal(c.meshWorker,mesh);assert.equal(c.requestMesh('0,0,0'),true); + }finally{c.dispose();} +}); diff --git a/client/tests/math.test.js b/client/tests/math.test.js index d33d489..d83d07e 100644 --- a/client/tests/math.test.js +++ b/client/tests/math.test.js @@ -9,7 +9,12 @@ import { viewMatrix, project, unitBox, + isFullCube, } from "../math.js"; +test("translucent cubes do not hide opaque surfaces behind glass", () => { + assert.equal(isFullCube({ render: [unitBox], opacity: 0.3 }), false); + assert.equal(isFullCube({ render: [unitBox], opacity: 1 }), true); +}); test("camera axes and world projection match the server coordinate convention", () => { assert.deepEqual(direction(0, 0), [0, 0, -1]); const east = direction(Math.PI / 2, 0); diff --git a/client/tests/mesh-geometry.test.js b/client/tests/mesh-geometry.test.js new file mode 100644 index 0000000..646ed67 --- /dev/null +++ b/client/tests/mesh-geometry.test.js @@ -0,0 +1,132 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { boxVertices, buildSectionMesh, materialType, MESH_VERTEX_STRIDE } from "../mesh-geometry.js"; +import { buildBlockLight } from "../block-light.js"; +import { unitBox } from "../math.js"; + +const stone = { state: "minecraft:stone", color: [128, 144, 160], render: [unitBox], opacity: 1, light: 0 }; +const materialMap = () => new Map([ + [1, stone], + [2, { ...stone, state: "minecraft:water[level=0]", color: [50, 90, 180], opacity: 0.55, transparent: true }], + [3, { ...stone, state: "minecraft:glass", opacity: 0.35, transparent: true }], + [4, { ...stone, state: "minecraft:oak_leaves", transparent: true }], + [5, { ...stone, state: "minecraft:torch", light: 14, render: [], light_dampening: 0, light_occlusion: [] }], + [6, { ...stone, state: "minecraft:redstone_lamp[lit=true]", light: 15 }], +]); +const blockMap = (...cells) => new Map(cells.map(([pos, id = 1]) => [pos.join(","), id])); +const build = (blocks, options = {}) => buildSectionMesh({ id: "0,0,0", blocks, materials: materialMap(), ...options }); +const rows = (vertices) => Array.from({ length: vertices.length / MESH_VERTEX_STRIDE }, (_, index) => + [...vertices.slice(index * MESH_VERTEX_STRIDE, (index + 1) * MESH_VERTEX_STRIDE)]); + +test("empty sections return transferable empty Float32 arrays", () => { + const result = build(new Map()); + assert.ok(result.vertices instanceof Float32Array); + assert.ok(result.transparent instanceof Float32Array); + assert.equal(result.vertices.length, 0); + assert.equal(result.transparent.length, 0); + const invisible = build(blockMap([[1, 1, 1], 5])); + assert.equal(invisible.vertices.length, 0); +}); + +test("an isolated cube keeps all six faces and the complete 20-float format", () => { + const result = build(blockMap([[2, 3, 4], 1])), vertices = rows(result.vertices); + assert.equal(MESH_VERTEX_STRIDE, 20); + assert.equal(vertices.length, 36); + assert.equal(result.transparent.length, 0); + for (const vertex of vertices) { + assert.ok(vertex.slice(0, 3).every((value, axis) => [2, 3, 4][axis] <= value && value <= [3, 4, 5][axis])); + assert.deepEqual(vertex.slice(3, 6), [128, 144, 160].map((value) => Math.fround(value / 255))); + assert.equal(Math.hypot(...vertex.slice(6, 9)), 1); + assert.deepEqual(vertex.slice(13), [-1, 1, 0, 0, 0, 0, 1]); + } +}); + +test("opaque neighbors cull their shared faces, including across section boundaries", () => { + assert.equal(build(blockMap([[1, 1, 1], 1], [[2, 1, 1], 1])).vertices.length / 20, 60); + const result = build(blockMap([[15, 1, 1], 1], [[16, 1, 1], 1])); + assert.equal(result.vertices.length / 20, 30); + assert.ok(rows(result.vertices).every((vertex) => vertex[6] !== 1)); + const negative = build(blockMap([[-1, 1, 1], 1], [[0, 1, 1], 1]), { id: "-1,0,0" }); + assert.equal(negative.vertices.length / 20, 30); + assert.ok(rows(negative.vertices).every((vertex) => vertex[0] <= 0)); +}); + +test("water goes into the translucent buffer and does not hide a stone face", () => { + const result = build(blockMap([[1, 1, 1], 1], [[2, 1, 1], 2])); + assert.equal(result.vertices.length / 20, 36); + assert.equal(result.transparent.length / 20, 36); + for (const vertex of rows(result.transparent)) { + assert.equal(vertex[9], 6); + assert.equal(vertex[10], Math.fround(0.55)); + } +}); + +test("texture-pack glass and leaves retain cutout faces in the opaque pass", () => { + const blocks = blockMap([[1, 1, 1], 3], [[2, 1, 1], 4]); + const fallback = build(blocks); + assert.equal(fallback.transparent.length / 20, 36); + const result = build(blocks, { textureLayers: new Map([["glass", 2], ["oak_leaves", 3]]) }); + assert.equal(result.vertices.length / 20, 72); + assert.equal(result.transparent.length, 0); + const vertices = rows(result.vertices); + assert.ok(vertices.every((vertex) => vertex[10] === 1)); + assert.equal(vertices.filter((vertex) => vertex[13] === 2).length, 36); + assert.equal(vertices.filter((vertex) => vertex[13] === 3).length, 36); + assert.ok(vertices.filter((vertex) => vertex[13] === 3).every((vertex) => vertex[4] > vertex[3])); +}); + +test("partial geometry preserves its real height and crops texture coordinates", () => { + const materials = materialMap(); + materials.set(7, { ...stone, state: "minecraft:stone_slab[type=bottom]", render: [{ min: [0, 0, 0], max: [1, 0.5, 1] }] }); + const result = build(blockMap([[1, 1, 1], 7]), { materials, textureLayers: new Map([["stone", 8]]) }); + const vertices = rows(result.vertices); + assert.equal(Math.max(...vertices.map((vertex) => vertex[1])), 1.5); + assert.ok(vertices.every((vertex) => vertex[13] === 8)); + const sides = vertices.filter((vertex) => vertex[7] === 0); + assert.ok(sides.every((vertex) => vertex[12] >= 0.5)); +}); + +test("baked AO shades contact corners while exposed faces remain bright", () => { + const result = build(blockMap([[1, 0, 1], 1], [[0, 1, 1], 1], [[1, 1, 0], 1])); + const top = rows(result.vertices).filter((vertex) => vertex[1] === 1 && vertex[7] === 1); + assert.equal(top.length, 6); + assert.ok(top.some((vertex) => vertex[14] === Math.fround(0.76))); + assert.ok(top.some((vertex) => vertex[14] === 1)); +}); + +test("actual propagated torch light and sky are baked without changing emission", () => { + const blocks = blockMap([[4, 0, 4], 1], [[4, 2, 4], 5], [[10, 0, 10], 6]); + const materials = materialMap(); + const blockLightField = buildBlockLight(blocks, materials, { min: [-1, -1, -1], max: [16, 16, 16] }); + const result = build(blocks, { materials, blockLightField }); + const vertices = rows(result.vertices); + const top = vertices.filter((vertex) => vertex[1] === 1 && vertex[7] === 1 && vertex[0] < 6); + assert.ok(top.every((vertex) => vertex[16] > 0 && vertex[16] > vertex[17] && vertex[17] > vertex[18])); + assert.ok(top.every((vertex) => vertex[19] === 1 && vertex[15] === 0)); + assert.ok(vertices.some((vertex) => vertex[15] === 1)); +}); + +test("geometry extraction keeps yaw and per-vertex dynamic lighting for actors", () => { + const out = [], sampled = []; + const field = { sample(point) { sampled.push(point); return { block: [0.1, 0.2, 0.3], sky: 0.4 }; } }; + boxVertices(out, [5, 6, 7], unitBox, [1, 1, 1], 0, () => false, Math.PI / 2, + 1, null, "", null, 0, field, true); + const vertices = rows(new Float32Array(out)); + assert.equal(sampled.length, 36); + assert.ok(vertices.every((vertex) => vertex[0] >= 4 && vertex[0] <= 5 && vertex[2] >= 7 && vertex[2] <= 8)); + assert.deepEqual(vertices[0].slice(16), [0.1, 0.2, 0.3, 0.4].map(Math.fround)); + assert.equal(materialType("minecraft:water[level=0]"), 6); + assert.equal(materialType("shacraft:trampoline", "bounce"), 5); +}); + +test("reused texture caches keep section output byte-identical", () => { + const blocks = blockMap([[1, 1, 1], 1], [[2, 1, 1], 3]); + const textureLayers = new Map([["stone", 4], ["glass", 5]]), faceTextureCache = new Map(); + const first = build(blocks, { textureLayers, faceTextureCache }); + const second = build(blocks, { textureLayers, faceTextureCache }); + assert.deepEqual(second.vertices, first.vertices); + assert.deepEqual(second.transparent, first.transparent); + assert.ok(faceTextureCache.size > 0); + const transferred = structuredClone(first, { transfer: [first.vertices.buffer, first.transparent.buffer] }); + assert.deepEqual(transferred.vertices, second.vertices); +}); diff --git a/client/tests/physics-wasm.test.js b/client/tests/physics-wasm.test.js new file mode 100644 index 0000000..8fc7b6d --- /dev/null +++ b/client/tests/physics-wasm.test.js @@ -0,0 +1,133 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { + loadPhysics, + LocalPrediction, + samplePhysicsWorld, +} from "../player-physics.js"; + +const binary = await readFile(new URL("../physics.wasm", import.meta.url)); +const fixture = JSON.parse( + await readFile( + new URL( + "../../crates/shacraft-physics/tests/fixtures/java26.2.json", + import.meta.url, + ), + "utf8", + ), +); +const originalFetch = globalThis.fetch; +let step; +try { + // Exercise the actual browser ABI and its non-streaming MIME fallback. + globalThis.fetch = async () => + new Response(binary, { + headers: { "Content-Type": "application/octet-stream" }, + }); + step = await loadPhysics("http://local-test/physics.wasm"); +} finally { + globalThis.fetch = originalFetch; +} + +const bounds = { min: [-64, -32, -64], max: [63, 63, 63] }; +function floor(surface = "stone") { + const blocks = new Map(); + for (let x = -4; x <= 4; x++) + for (let z = -55; z <= 5; z++) blocks.set(`${x},-1,${z}`, 1); + const materials = new Map([ + [ + 1, + { + state: `minecraft:${surface}`, + collision: [{ min: [0, 0, 0], max: [1, 1, 1] }], + }, + ], + ]); + return (body) => samplePhysicsWorld(body, blocks, materials, bounds); +} +const settings = { allow_flight: true }; + +test("the shipped browser WebAssembly follows independently measured Java 26.2 trajectories", () => { + let checked = 0; + for (const [name, trajectory] of Object.entries( + fixture.travel_kernel_trajectories, + )) { + if (trajectory.medium !== "air") continue; + const getWorld = floor(trajectory.surface); + let body = { + position: trajectory.initial_position, + velocity: trajectory.initial_velocity, + flying: trajectory.flying, + on_ground: !trajectory.flying, + }; + for (const sample of trajectory.samples) { + const input = { + forward: sample.tick <= trajectory.input_ticks ? 1 : 0, + sprint: trajectory.sprint, + jump: sample.tick === 1 && trajectory.jump_first_tick, + }; + body = step({ body, input, world: getWorld(body), settings }); + for (const field of ["position", "velocity"]) + for (let axis = 0; axis < 3; axis++) { + const expected = sample[field][axis] * (axis === 2 ? -1 : 1); + assert.ok( + Math.abs(body[field][axis] - expected) < 2e-6, + `${name} tick ${sample.tick} ${field}[${axis}]: ${body[field][axis]} != ${expected}`, + ); + } + assert.equal( + body.on_ground, + sample.on_ground, + `${name} tick ${sample.tick} grounded`, + ); + checked++; + } + } + assert.ok(checked >= 200); +}); + +test("real WebAssembly prediction replays delayed authority without introducing trajectory drift", () => { + const getWorld = floor(); + const prediction = new LocalPrediction(step, getWorld); + let authority = { + position: [0, 0, 0], + velocity: [0, -0.0784000015258789, 0], + on_ground: true, + }; + prediction.receive({ body: authority, ack: 0, tick: 0, epoch: 1, settings }); + const packets = []; + for (let tick = 1; tick <= 80; tick++) { + const input = { + forward: tick < 55 ? 1 : 0, + sprint: tick > 20 && tick < 50, + jump: tick === 25, + sneak: tick >= 55, + }; + prediction.push(tick, input); + authority = step({ + body: authority, + input, + world: getWorld(authority), + settings, + }); + packets.push({ body: authority, ack: tick, tick, epoch: 1, settings }); + // Variable 150–250 ms inbound latency; authority still acknowledges order. + if (packets.length > (tick % 3) + 3) prediction.receive(packets.shift()); + for (let axis = 0; axis < 3; axis++) { + assert.ok( + Math.abs(prediction.body.position[axis] - authority.position[axis]) < + 1e-11, + `position drift at tick ${tick}`, + ); + assert.ok( + Math.abs(prediction.body.velocity[axis] - authority.velocity[axis]) < + 1e-11, + `velocity drift at tick ${tick}`, + ); + } + } + for (const packet of packets) prediction.receive(packet); + assert.equal(prediction.pending.length, 0); + assert.deepEqual(prediction.body, authority); +}); diff --git a/client/tests/player-avatar.test.js b/client/tests/player-avatar.test.js new file mode 100644 index 0000000..d8fc5c7 --- /dev/null +++ b/client/tests/player-avatar.test.js @@ -0,0 +1,39 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { playerAvatarParts } from "../renderer.js"; + +test("remote avatar stance and eye placement follow server physics dimensions", () => { + for (const [pose, height, eye_height] of [ + ["standing", 1.8, 1.62], + ["crouching", 1.5, 1.27], + ["swimming", 0.6, 0.4], + ]) { + const parts = playerAvatarParts({ pose, height, eye_height }); + assert.equal(Math.max(...parts.map(({ box }) => box.max[1])), height); + const head = parts.find(({ part }) => part === "head").box; + const eyes = parts.find(({ part }) => part === "eyes").box; + assert.ok(Math.abs((eyes.min[1] + eyes.max[1]) / 2 - eye_height) < 1e-12); + assert.ok(eyes.min[1] >= head.min[1] && eyes.max[1] <= head.max[1]); + for (const { box } of parts) + for (let axis = 0; axis < 3; axis++) { + assert.ok( + Number.isFinite(box.min[axis]) && box.max[axis] > box.min[axis], + ); + } + } +}); + +test("swimming and crawling use a horizontal silhouette while crouching leans forward", () => { + const standing = playerAvatarParts({}); + const crouching = playerAvatarParts({ pose: "crouching" }); + const swimming = playerAvatarParts({ pose: "swimming" }); + const head = (parts) => parts.find(({ part }) => part === "head").box; + assert.ok(head(crouching).min[2] < head(standing).min[2]); + const length = + Math.max(...swimming.map(({ box }) => box.max[2])) - + Math.min(...swimming.map(({ box }) => box.min[2])); + assert.ok(length > 1.6); + assert.ok(Math.max(...swimming.map(({ box }) => box.max[1])) <= 0.6); + assert.equal(swimming.filter(({ part }) => part === "leg").length, 2); + assert.equal(swimming.filter(({ part }) => part === "arm").length, 2); +}); diff --git a/client/tests/player-interpolation.test.js b/client/tests/player-interpolation.test.js new file mode 100644 index 0000000..43ac875 --- /dev/null +++ b/client/tests/player-interpolation.test.js @@ -0,0 +1,140 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { + updateRemotePlayer, + smoothRemotePlayer, +} from "../player-interpolation.js"; + +const radians = (degrees) => (degrees * Math.PI) / 180; +const near = (actual, expected, tolerance = 1e-11) => + assert.ok( + Math.abs(actual - expected) < tolerance, + `Expected ${actual} to be within ${tolerance} of ${expected}`, + ); + +test("network updates change targets without snapping the rendered pose", () => { + const previous = updateRemotePlayer(null, { + id: "remote", + position: [1, 2, 3], + yaw: 0.2, + name: "Before", + }); + const packet = { + id: "remote", + position: [5, 6, 7], + yaw: 1.2, + name: "After", + }; + const player = updateRemotePlayer(previous, packet); + + assert.deepEqual(player.position, [1, 2, 3]); + assert.equal(player.yaw, 0.2); + assert.deepEqual(player.target, [5, 6, 7]); + assert.equal(player.targetYaw, 1.2); + assert.equal(player.name, "After"); + + smoothRemotePlayer(player, 0.25); + assert.deepEqual(player.position, [2, 3, 4]); + near(player.yaw, 0.45); + assert.deepEqual(player.target, [5, 6, 7]); + assert.equal(player.targetYaw, 1.2); + assert.deepEqual(packet.position, [5, 6, 7]); +}); + +test("a packet arriving mid-turn continues from the current rendered angle", () => { + let player = updateRemotePlayer(null, { position: [0, 0, 0], yaw: 0 }); + player = updateRemotePlayer(player, { position: [4, 0, 0], yaw: 1 }); + smoothRemotePlayer(player, 0.5); + player = updateRemotePlayer(player, { position: [8, 0, 0], yaw: 2 }); + + assert.deepEqual(player.position, [2, 0, 0]); + near(player.yaw, 0.5); + smoothRemotePlayer(player, 0.5); + assert.deepEqual(player.position, [5, 0, 0]); + near(player.yaw, 1.25); +}); + +test("turns across the angle boundary follow the short arc in both directions", () => { + for (const direction of [1, -1]) { + let player = updateRemotePlayer(null, { + position: [0, 0, 0], + yaw: radians(179 * direction), + }); + player = updateRemotePlayer(player, { + position: [0, 0, 0], + yaw: radians(-179 * direction), + }); + + smoothRemotePlayer(player, 0.5); + near(player.yaw, radians(180 * direction)); + smoothRemotePlayer(player, 0.5); + near(player.yaw, radians(180.5 * direction)); + } +}); + +test("unbounded yaw values and equivalent full turns do not cause long spins", () => { + let player = updateRemotePlayer(null, { + position: [0, 0, 0], + yaw: 30 * Math.PI + 0.2, + }); + player = updateRemotePlayer(player, { + position: [0, 0, 0], + yaw: -18 * Math.PI + 0.6, + }); + smoothRemotePlayer(player, 0.5); + near(player.yaw, 30 * Math.PI + 0.4); + + player = updateRemotePlayer(player, { + position: [0, 0, 0], + yaw: player.yaw + 8 * Math.PI, + }); + const before = player.yaw; + smoothRemotePlayer(player, 0.5); + near(player.yaw, before); +}); + +test("initial and instant updates initialize both the rendered pose and targets", () => { + const first = updateRemotePlayer(undefined, { position: [3, 4, 5] }); + assert.deepEqual(first.position, [3, 4, 5]); + assert.deepEqual(first.target, [3, 4, 5]); + assert.equal(first.yaw, 0); + assert.equal(first.targetYaw, 0); + + const instant = updateRemotePlayer( + first, + { position: [20, 30, 40], yaw: -2.5 }, + true, + ); + assert.deepEqual(instant.position, [20, 30, 40]); + assert.deepEqual(instant.target, [20, 30, 40]); + assert.equal(instant.yaw, -2.5); + assert.equal(instant.targetYaw, -2.5); + smoothRemotePlayer(instant, 0.75); + assert.deepEqual(instant.position, [20, 30, 40]); + assert.equal(instant.yaw, -2.5); +}); + +test("exponential smoothing has the same result at 30, 60, and 144 fps", () => { + const elapsed = 0.5; + const remaining = Math.exp(-elapsed * 19); + for (const fps of [30, 60, 144]) { + let player = updateRemotePlayer(null, { + position: [1, 2, 3], + yaw: radians(179), + }); + player = updateRemotePlayer(player, { + position: [11, 22, 33], + yaw: radians(-179), + }); + const blend = 1 - Math.exp(-19 / fps); + for (let frame = 0; frame < elapsed * fps; frame++) { + smoothRemotePlayer(player, blend); + } + near(player.yaw, radians(181) - radians(2) * remaining); + for (let axis = 0; axis < 3; axis++) { + const start = axis + 1; + const target = (axis + 1) * 11; + near(player.position[axis], target - (target - start) * remaining); + } + } +}); diff --git a/client/tests/player-physics.test.js b/client/tests/player-physics.test.js new file mode 100644 index 0000000..a212287 --- /dev/null +++ b/client/tests/player-physics.test.js @@ -0,0 +1,208 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { + PhysicsClock, + LocalPrediction, + samplePhysicsWorld, +} from "../player-physics.js"; + +const body = (x = 0) => ({ + position: [x, 1, 0], + velocity: [0, 0, 0], + pose: "standing", +}); +const motion = (x = 0, ack = 0, tick = 0, epoch = 1) => ({ + body: body(x), + ack, + tick, + epoch, + settings: { movement_speed: 0.1 }, +}); +const step = ({ body: current, input }) => ({ + ...current, + position: [ + current.position[0] + (input.forward || 0), + ...current.position.slice(1), + ], + flying: input.fly_toggle ? !current.flying : current.flying, +}); +const makePrediction = (getWorld = () => ({ blocks: [] }), limit) => + new LocalPrediction(step, getWorld, limit); +const near = (a, b) => assert.ok(Math.abs(a - b) < 1e-9, `${a} != ${b}`); + +test("20 Hz input timing is the same at 30, 60, and 144 render frames per second", () => { + for (const fps of [30, 60, 144]) { + const clock = new PhysicsClock(); + let ticks = 0; + for (let frame = 0; frame < fps * 3; frame++) + clock.advance(1000 / fps, () => ticks++); + assert.equal(ticks, 60); + near(clock.alpha, 0); + } +}); + +test("a long suspended frame cannot create unlimited catch-up inputs", () => { + const clock = new PhysicsClock(); + let ticks = 0; + assert.equal( + clock.advance(60_000, () => ticks++), + 5, + ); + assert.equal( + clock.advance(0, () => ticks++), + 0, + ); + assert.equal(ticks, 5); + clock.advance(25, () => ticks++); + near(clock.alpha, 0.5); + clock.reset(); + near(clock.alpha, 0); +}); + +test("authority acknowledges one input and replays only the still pending commands", () => { + const prediction = makePrediction(); + prediction.receive(motion()); + prediction.push(1, { forward: 1 }); + prediction.push(2, { forward: 1 }); + prediction.push(3, { forward: -1 }); + assert.equal(prediction.body.position[0], 1); + prediction.receive(motion(0.8, 1, 1)); + near(prediction.body.position[0], 0.8); + assert.deepEqual( + prediction.pending.map(({ seq }) => seq), + [2, 3], + ); + near(prediction.offset[0], 0.2); + near(prediction.sample(0, 0, {}).position[0], 1); + near(prediction.sample(0, 1, {}).position[0], 0.8 + 0.2 * Math.exp(-15)); +}); + +test("late ticks, decreasing acknowledgements, and duplicate inputs cannot rewind movement", () => { + const prediction = makePrediction(); + prediction.receive(motion(4, 4, 10)); + prediction.push(5, { forward: 1 }); + assert.equal(prediction.receive(motion(-10, 5, 9)), false); + assert.equal(prediction.receive(motion(-10, 3, 11)), false); + assert.equal(prediction.push(5, { forward: 20 }), false); + assert.equal(prediction.push(4, { forward: 20 }), false); + assert.equal(prediction.body.position[0], 5); +}); + +test("world/respawn/input reset epochs drop old commands and visual correction", () => { + const prediction = makePrediction(); + prediction.receive(motion()); + prediction.push(1, { forward: 1 }); + prediction.receive(motion(0.7, 1, 1)); + prediction.push(2, { forward: 1 }); + prediction.receive(motion(6, 2, 2, 2)); + assert.deepEqual(prediction.pending, []); + assert.deepEqual(prediction.offset, [0, 0, 0]); + assert.equal(prediction.body.position[0], 6); + assert.equal(prediction.receive(motion(-6, 3, 3, 1)), false); + assert.equal(prediction.body.position[0], 6); + prediction.reset(); + assert.equal(prediction.body, null); + assert.equal(prediction.tick, -1); + prediction.receive(motion(30, 0, 0), true); + assert.equal(prediction.body.position[0], 30); +}); + +test("a teleport without an epoch change does not replay pre-teleport movement", () => { + const prediction = makePrediction(); + prediction.receive(motion()); + prediction.push(1, { forward: 1 }); + prediction.receive(motion(100, 0, 1)); + assert.equal(prediction.body.position[0], 100); + assert.equal(prediction.pending.length, 0); +}); + +test("unavailable chunks suspend prediction until authority and a complete context arrive", () => { + let available = false; + const prediction = makePrediction(() => (available ? { blocks: [] } : null)); + prediction.receive(motion()); + assert.equal(prediction.push(1, { forward: 1 }), false); + assert.equal(prediction.suspended, true); + assert.equal(prediction.body.position[0], 0); + available = true; + prediction.receive(motion(0.5, 1, 1)); + prediction.push(2, { forward: 1 }); + assert.equal(prediction.suspended, false); + assert.equal(prediction.body.position[0], 1.5); +}); + +test("bounded history suspends until the discarded sequence has been acknowledged", () => { + const prediction = makePrediction(undefined, 3); + prediction.receive(motion()); + for (let seq = 1; seq <= 5; seq++) prediction.push(seq, { forward: 1 }); + assert.equal(prediction.pending.length, 3); + assert.equal(prediction.suspended, true); + prediction.receive(motion(1, 1, 1)); + assert.equal(prediction.suspended, true); + prediction.receive(motion(2, 2, 2)); + assert.equal(prediction.suspended, false); + assert.equal(prediction.body.position[0], 5); +}); + +test("render previews do not mutate acknowledged bodies, queue commands, or consume a flight toggle", () => { + const prediction = makePrediction(); + prediction.receive(motion()); + for (let i = 0; i < 3; i++) { + near( + prediction.sample(0.5, 0, { forward: 1, fly_toggle: true }).position[0], + 0.5, + ); + assert.equal(prediction.body.flying, undefined); + assert.equal(prediction.pending.length, 0); + } + prediction.push(1, { forward: 1, fly_toggle: true }); + assert.equal(prediction.body.flying, true); + prediction.receive({ ...motion(0, 0, 1), body: body() }); + assert.equal(prediction.body.flying, true); +}); + +test("swept neighbourhood includes fast-fall floors, transparent fluids and local collision boxes", () => { + const player = { ...body(), position: [-0.2, 7, 0], velocity: [0, -3.92, 0] }; + const collision = [{ min: [0, 0, 0], max: [1, 1.5, 1] }]; + const materials = new Map([ + [1, { state: "minecraft:water[level=0]", collision: [] }], + [2, { state: "minecraft:oak_fence", collision }], + ]); + const blocks = new Map([ + ["-1,6,0", 1], + ["-1,2,0", 2], + ["40,0,0", 2], + ]); + const bounds = { min: [-32, -16, -32], max: [31, 31, 31] }; + const world = samplePhysicsWorld(player, blocks, materials, bounds); + assert.equal(world.blocks.length, 2); + assert.deepEqual( + world.blocks.find((b) => b.state.includes("fence")), + { pos: [-1, 2, 0], state: "minecraft:oak_fence", collision }, + ); + assert.deepEqual( + world.blocks.find((b) => b.state.includes("water")).collision, + [], + ); + assert.equal(samplePhysicsWorld(player, blocks, new Map(), bounds), null); + assert.equal( + samplePhysicsWorld(player, blocks, materials, { + min: [-1, 0, -1], + max: [1, 10, 1], + }), + null, + ); +}); + +test("invalid motion packets leave the valid body and history untouched", () => { + const prediction = makePrediction(); + prediction.receive(motion()); + assert.equal( + prediction.receive({ + ...motion(), + body: { position: [NaN, 0, 0], velocity: [0, 0, 0] }, + }), + false, + ); + assert.equal(prediction.receive({ ...motion(), ack: 0.5 }), false); + assert.equal(prediction.body.position[0], 0); +}); diff --git a/client/tests/pointer-lock.test.js b/client/tests/pointer-lock.test.js new file mode 100644 index 0000000..f957736 --- /dev/null +++ b/client/tests/pointer-lock.test.js @@ -0,0 +1,169 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { PointerLockController } from "../pointer-lock.js"; + +function deferred() { + let resolve, reject; + const promise = new Promise((yes, no) => { + resolve = yes; + reject = no; + }); + return { promise, resolve, reject }; +} +function fixture(t, request) { + const document = new EventTarget(), + calls = [], + changes = [], + errors = []; + document.pointerLockElement = null; + document.exitPointerLock = () => { + calls.push("exit"); + document.pointerLockElement = null; + document.dispatchEvent(new Event("pointerlockchange")); + }; + const canvas = { + ownerDocument: document, + tabIndex: -1, + focus(options) { + calls.push("focus"); + assert.equal(options.preventScroll, true); + }, + requestPointerLock() { + calls.push("request"); + return request?.(); + }, + }; + const controller = new PointerLockController(canvas, { + onChange: (locked) => changes.push(locked), + onError: (error) => errors.push(error), + }); + const lock = () => { + document.pointerLockElement = canvas; + document.dispatchEvent(new Event("pointerlockchange")); + }; + t.after(() => controller.dispose()); + return { controller, canvas, document, calls, changes, errors, lock }; +} + +test("focus precedes the synchronous user-gesture request and duplicate pending calls are ignored", (t) => { + const pending = deferred(), + { controller, canvas, calls } = fixture(t, () => pending.promise); + assert.equal(controller.request(), true); + assert.deepEqual(calls, ["focus", "request"]); + assert.equal(canvas.tabIndex, 0); + assert.equal(controller.status, "requesting"); + assert.equal(controller.request(), false); + assert.deepEqual(calls, ["focus", "request"]); +}); + +test("a rejected request remains retryable and subsequent success clears the error", async (t) => { + const first = deferred(), + second = deferred(); + let count = 0; + const { controller, errors, changes, lock } = fixture(t, () => + ++count === 1 ? first.promise : second.promise, + ); + controller.request(); + const error = new Error("Document not focused"); + first.reject(error); + await Promise.resolve(); + assert.equal(controller.status, "error"); + assert.equal(controller.lastError, error); + assert.deepEqual(errors, [error]); + assert.equal(controller.request(), true); + lock(); + second.resolve(); + await Promise.resolve(); + assert.equal(controller.status, "locked"); + assert.equal(controller.locked, true); + assert.equal(controller.lastError, null); + assert.deepEqual(changes, [true]); +}); + +test("legacy success, ordinary unlock, and recapture follow actual document state", (t) => { + const { controller, document, changes, lock, calls } = fixture(t); + controller.request(); + lock(); + assert.equal(controller.request(), false); + document.exitPointerLock(); + assert.equal(controller.status, "idle"); + assert.equal(controller.locked, false); + assert.equal(controller.request(), true); + lock(); + assert.deepEqual(changes, [true, false, true]); + assert.equal(calls.filter((call) => call === "request").length, 2); +}); + +test("missing APIs and legacy error events report failure without permanently disabling retries", (t) => { + const { controller, canvas, document, errors, lock } = fixture(t); + delete canvas.requestPointerLock; + assert.equal(controller.request(), false); + assert.equal(controller.status, "unsupported"); + assert.equal(errors[0].name, "NotSupportedError"); + canvas.requestPointerLock = () => undefined; + assert.equal(controller.request(), true); + document.dispatchEvent(new Event("pointerlockerror")); + assert.equal(controller.status, "error"); + assert.equal(errors.length, 2); + assert.equal(controller.request(), true); + lock(); + assert.equal(controller.status, "locked"); +}); + +test("a stale promise rejection cannot overwrite a later successful capture", async (t) => { + const first = deferred(); + const { controller, document, errors, lock } = fixture( + t, + () => first.promise, + ); + controller.request(); + document.dispatchEvent(new Event("pointerlockerror")); + controller.request(); + lock(); + first.reject(new Error("Late failure from an old request")); + await Promise.resolve(); + assert.equal(controller.status, "locked"); + assert.equal(controller.lastError, null); + assert.equal(errors.length, 1); +}); + +test("release cancels pending capture and immediately exits a late acquisition", async (t) => { + const pending = deferred(), + { controller, changes, errors, lock, calls } = fixture( + t, + () => pending.promise, + ); + controller.request(); + controller.release(); + assert.equal(controller.status, "idle"); + lock(); + pending.resolve(); + await Promise.resolve(); + assert.equal(controller.locked, false); + assert.equal(controller.status, "idle"); + assert.deepEqual(changes, []); + assert.deepEqual(errors, []); + assert.equal(calls.filter((call) => call === "exit").length, 2); +}); + +test("synchronous failures are retryable and disposal removes event handling", (t) => { + const { controller, canvas, document, errors, changes, lock } = fixture( + t, + () => { + throw new Error("Synchronous rejection"); + }, + ); + assert.equal(controller.request(), false); + assert.equal(controller.status, "error"); + assert.equal(errors.length, 1); + canvas.requestPointerLock = () => undefined; + controller.request(); + lock(); + controller.dispose(); + assert.deepEqual(changes, [true, false]); + assert.equal(controller.request(), false); + lock(); + document.dispatchEvent(new Event("pointerlockerror")); + assert.deepEqual(changes, [true, false]); + assert.equal(errors.length, 1); +}); diff --git a/client/tests/renderer-smoke.html b/client/tests/renderer-smoke.html index 0c14d22..8cf83dd 100644 --- a/client/tests/renderer-smoke.html +++ b/client/tests/renderer-smoke.html @@ -1,64 +1,420 @@ -Shacraft renderer fixture - + material(10, "sea_lantern", [221, 244, 224], { light: 15 }); + material(11, "torch", [229, 158, 70], { + light: 14, + render: [{ min: [0.43, 0, 0.43], max: [0.57, 0.8, 0.57] }], + }); + material(12, "quartz_block", [211, 207, 189]); + for (let x = -18; x <= 18; x++) + for (let z = -20; z <= 16; z++) + put( + x, + 0, + z, + Math.abs(x) <= 2 || (x >= -7 && x <= -3 && z >= -10 && z <= -3) + ? 2 + : 1, + ); + // A tall inside corner and a small roof expose contact and indirect light. + for (let y = 1; y <= 5; y++) { + for (let x = -7; x <= -3; x++) put(x, y, -10, 3); + for (let z = -9; z <= -4; z++) put(-7, y, z, 3); + } + for (let x = -7; x <= -5; x++) + for (let z = -10; z <= -8; z++) put(x, 5, z, 3); + put(-6, 1, -9, 10); + // The right support can be removed independently of the lintel. + const removablePillar = []; + for (let y = 1; y <= 4; y++) { + put(0, y, -6, 4); + put(5, y, -6, 4); + removablePillar.push([5, y, -6]); + } + for (let x = 0; x <= 5; x++) put(x, 5, -6, 5); + for (let y = 1; y <= 3; y++) put(7, y, 1, 4); + for (let y = 1; y <= 5; y++) put(9, y, -3, 3); + for (let x = -5; x <= -2; x++) put(x, 1, 3, 8); + for (let x = -5; x <= -2; x++) put(x, 1, 1, 9); + put(-5, 2, 1, 8); + for (let x = 3; x <= 5; x++) + for (let y = 1; y <= 3; y++) put(x, y, 4, 6); + for (let x = 6; x <= 10; x++) + for (let z = -11; z <= -7; z++) { + put(x, -1, z, 2); + put(x, 0, z, 7); + } + for (let x = 5; x <= 11; x++) { + put(x, 0, -12, 3); + put(x, 0, -6, 3); + } + for (let z = -11; z <= -7; z++) { + put(5, 0, z, 3); + put(11, 0, z, 3); + } + // All exterior faces are solid, including the roof. The window connects + // two indoor chambers so lamp-off darkness is independent of daylight. + for (let x = -17; x <= -9; x++) + for (let z = 4; z <= 14; z++) { + put(x, 0, z, 2); + put(x, 5, z, 12); + if (x === -17 || x === -9 || z === 4 || z === 14) + for (let y = 1; y <= 4; y++) put(x, y, z, 12); + } + for (let z = 5; z <= 13; z++) + for (let y = 1; y <= 4; y++) put(-13, y, z, 12); + put(-13, 2, 5, 6); + put(-13, 3, 5, 6); + const lampPosition = [-15, 2, 8], + partitionPanel = []; + put(-15, 1, 8, 2); + put(...lampPosition, 11); + for (let y = 1; y <= 3; y++) + for (let z = 8; z <= 9; z++) partitionPanel.push([-13, y, z]); + const players = [ + { + id: "fixture-player", + name: "Avatar", + position: [3.5, 1, 1.4], + yaw: -0.5, + pose: "standing", + height: 1.8, + eye_height: 1.62, + color: [0.31, 0.47, 0.64], + }, + ]; + const entities = [ + { kind: "fixture-crate", position: [-3, 1, -4], yaw: 0.3 }, + ]; + const entityDefinitions = new Map([ + [ + "fixture-crate", + { + color: [168, 121, 81], + render: [{ min: [-0.5, 0, -0.5], max: [0.5, 1, 0.5] }], + }, + ], + ]); + renderer.replace(blocks, materials); + renderer.shadowsEnabled = shadowToggle.checked; + let pillarPresent = true, + wallPresent = true, + frameCount = 0, + lastStatus = -Infinity; + const errors = new Set(); + document.body.dataset.camera = cameraSelect.value; + document.body.dataset.pillar = "present"; + document.body.dataset.lamp = lampSelect.value; + document.body.dataset.wall = "present"; + shadowToggle.onchange = () => { + renderer.shadowsEnabled = shadowToggle.checked; + }; + cameraSelect.onchange = () => { + document.body.dataset.camera = cameraSelect.value; + }; + pillarButton.onclick = () => { + pillarPresent = !pillarPresent; + const changes = removablePillar.map((pos) => { + if (pillarPresent) blocks.set(pos.join(","), 4); + else blocks.delete(pos.join(",")); + return { pos, block: pillarPresent ? 4 : 0 }; + }); + renderer.change(changes); + pillarButton.textContent = pillarPresent + ? "Remove pillar" + : "Restore pillar"; + document.body.dataset.pillar = pillarPresent ? "present" : "removed"; + }; + lampSelect.onchange = () => { + const block = { torch: 11, "sea-lantern": 10, off: 0 }[ + lampSelect.value + ]; + if (block) blocks.set(lampPosition.join(","), block); + else blocks.delete(lampPosition.join(",")); + renderer.change([{ pos: lampPosition, block }]); + document.body.dataset.lamp = lampSelect.value; + }; + wallButton.onclick = () => { + wallPresent = !wallPresent; + const changes = partitionPanel.map((pos) => { + if (wallPresent) blocks.set(pos.join(","), 12); + else blocks.delete(pos.join(",")); + return { pos, block: wallPresent ? 12 : 0 }; + }); + renderer.change(changes); + wallButton.textContent = wallPresent + ? "Remove room partition" + : "Restore room partition"; + document.body.dataset.wall = wallPresent ? "present" : "removed"; + }; + const lightSamplePositions = { + source: lampPosition, + near: [-15, 2, 9], + window: [-13, 2, 5], + behindWall: [-12, 2, 8], + far: [-10, 2, 12], + outside: [-15, 2, 15], + }; + function updateLightSamples() { + const field = renderer.blockLightField; + if (typeof field?.sample !== "function") return; + const samples = Object.fromEntries( + Object.entries(lightSamplePositions).map(([name, position]) => { + const sample = field.sample(position); + return [name, { block: sample.blockLevel, sky: sample.skyLevel }]; + }), + ); + document.body.dataset.lightSamples = JSON.stringify(samples); + document.body.dataset.lightSources = String(field.sourceCount); + lightStatus.textContent = `Light 0–15 (block/sky): ${Object.entries( + samples, + ) + .map(([name, sample]) => `${name} ${sample.block}/${sample.sky}`) + .join(" · ")}`; + } + function frame(time) { + try { + renderer.draw( + cameras[cameraSelect.value], + players, + entities, + entityDefinitions, + ); + frameCount++; + const error = renderer.gl.getError(); + if (error !== renderer.gl.NO_ERROR) + errors.add(`0x${error.toString(16)}`); + if (time - lastStatus >= 200) { + lastStatus = time; + const ready = frameCount >= 3 && renderer.dirty.size === 0; + document.body.dataset.status = errors.size + ? `error:WebGL ${[...errors].join(",")}` + : `${ready ? "ready" : "building"}:${renderer.triangles}`; + document.body.dataset.glError = errors.size + ? [...errors].join(",") + : "0"; + document.body.dataset.triangles = String(renderer.triangles); + document.body.dataset.sections = String(renderer.sections.size); + document.body.dataset.pendingSections = String( + renderer.dirty.size, + ); + document.body.dataset.shadowsEnabled = String( + renderer.shadowsEnabled, + ); + document.body.dataset.frames = String(frameCount); + document.body.dataset.meshRebuilds = String( + renderer.meshRebuilds, + ); + updateLightSamples(); + status.textContent = `${errors.size ? "WebGL " + [...errors].join(",") : "WebGL OK"} · ${renderer.triangles.toLocaleString("en-US")} triangles · shadows ${renderer.shadowsEnabled ? "on" : "off"}`; + } + requestAnimationFrame(frame); + } catch (error) { + fail(error); + } + } + requestAnimationFrame(frame); + } catch (error) { + fail(error); + } + + + diff --git a/client/tests/renderer-streaming.test.js b/client/tests/renderer-streaming.test.js new file mode 100644 index 0000000..106f876 --- /dev/null +++ b/client/tests/renderer-streaming.test.js @@ -0,0 +1,47 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { Renderer } from "../renderer.js"; + +function meshFixture() { + const renderer = Object.create(Renderer.prototype); + renderer.sections = new Map([ + ["-2,0,0", { name: "leaving" }], + ["-1,0,0", { name: "border" }], + ["0,0,0", { name: "retained" }], + ["1,0,0", { name: "far" }], + ]); + renderer.dirty = new Set(); + renderer.disposed = []; + renderer.disposeMesh = (mesh) => renderer.disposed.push(mesh); + return renderer; +} + +test("stream unload disposes only departing meshes and keeps visible mesh identities", () => { + const renderer = meshFixture(); + const before = new Map(renderer.sections); + renderer.dirty.add("-2,0,0"); + renderer.unloadSections([[-2, 0, 0]]); + assert.deepEqual(renderer.disposed, [before.get("-2,0,0")]); + for (const id of ["-1,0,0", "0,0,0", "1,0,0"]) + assert.equal(renderer.sections.get(id), before.get(id)); + assert.deepEqual([...renderer.dirty], ["-1,0,0"]); +}); + +test("incoming cells queue their section and boundaries without clearing existing geometry", () => { + const renderer = meshFixture(); + const before = [...renderer.sections.values()]; + renderer.change([{ pos: [32, 5, 5], block: 7 }]); + assert.deepEqual([...renderer.sections.values()], before); + assert.equal(renderer.disposed.length, 0); + assert.deepEqual([...renderer.dirty].sort(), ["1,0,0", "2,0,0"]); +}); + +test("unloading adjacent sections does not queue either for reconstruction", () => { + const renderer = meshFixture(); + renderer.change([{ pos: [-17, 0, 0], block: 0 }]); + renderer.unloadSections([[-2, 0, 0], [-1, 0, 0]]); + assert.equal(renderer.dirty.has("-2,0,0"), false); + assert.equal(renderer.dirty.has("-1,0,0"), false); + assert.equal(renderer.dirty.has("0,0,0"), true); + assert.equal(renderer.sections.size, 2); +}); diff --git a/client/tests/section-block-map.test.js b/client/tests/section-block-map.test.js new file mode 100644 index 0000000..7bac0e9 --- /dev/null +++ b/client/tests/section-block-map.test.js @@ -0,0 +1,98 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { SectionBlockMap } from "../section-block-map.js"; + +test("construction and repeated set preserve Map behavior and unique section keys", () => { + const blocks = new SectionBlockMap([ + ["0,0,0", 1], + ["15,15,15", 2], + ["16,0,0", 3], + ["0,0,0", 4], + ]); + assert.ok(blocks instanceof Map); + assert.equal(blocks.size, 3); + assert.equal(blocks.set("0,0,0", 5), blocks); + assert.deepEqual( + [...blocks], + [ + ["0,0,0", 5], + ["15,15,15", 2], + ["16,0,0", 3], + ], + ); + assert.deepEqual([...blocks.keysInSection("0,0,0")], ["0,0,0", "15,15,15"]); + assert.deepEqual([...blocks.loadedSectionKeys()], ["0,0,0", "1,0,0"]); + assert.deepEqual([...new SectionBlockMap(blocks)], [...blocks]); +}); + +test("section boundaries use floor division independently on negative axes", () => { + const blocks = new SectionBlockMap([ + ["-1,-16,-17", 1], + ["-16,-1,-32", 2], + ["-17,0,16", 3], + ["0,-17,-1", 4], + ]); + assert.deepEqual( + [...blocks.keysInSection("-1,-1,-2")], + ["-1,-16,-17", "-16,-1,-32"], + ); + assert.deepEqual([...blocks.keysInSection("-2,0,1")], ["-17,0,16"]); + assert.deepEqual([...blocks.keysInSection("0,-2,-1")], ["0,-17,-1"]); + assert.deepEqual([...blocks.keysInSection("0,0,0")], []); +}); + +test("delete removes empty sections and clear permits clean reuse", () => { + const blocks = new SectionBlockMap([ + ["0,0,0", 1], + ["1,0,0", 2], + ["16,0,0", 3], + ]); + assert.equal(blocks.delete("0,0,0"), true); + assert.equal(blocks.delete("0,0,0"), false); + assert.deepEqual([...blocks.keysInSection("0,0,0")], ["1,0,0"]); + assert.equal(blocks.delete("1,0,0"), true); + assert.deepEqual([...blocks.keysInSection("0,0,0")], []); + assert.deepEqual([...blocks.loadedSectionKeys()], ["1,0,0"]); + assert.equal(blocks.clear(), undefined); + assert.equal(blocks.size, 0); + assert.deepEqual([...blocks.loadedSectionKeys()], []); + assert.deepEqual([...blocks.keysInSection("1,0,0")], []); + blocks.set("0,0,0", 4); + assert.deepEqual([...blocks.keysInSection("0,0,0")], ["0,0,0"]); + assert.deepEqual([...blocks.loadedSectionKeys()], ["0,0,0"]); +}); + +test("section key iterators allow deleting every yielded block without skipping", () => { + const blocks = new SectionBlockMap([ + ["0,0,0", 1], + ["1,0,0", 2], + ["2,0,0", 3], + ["16,0,0", 4], + ]); + for (const key of blocks.keysInSection("0,0,0")) blocks.delete(key); + assert.deepEqual([...blocks], [["16,0,0", 4]]); + assert.deepEqual([...blocks.loadedSectionKeys()], ["1,0,0"]); +}); + +test("validated section insertion and bulk deletion preserve other sections and live iterators", () => { + const blocks = new SectionBlockMap([["0,0,0", 1]]); + assert.equal(blocks.setInSection("-17,-1,16", 2, "-2,-1,1"), blocks); + blocks.setInSection("-18,-2,17", 3, "-2,-1,1"); + blocks.setInSection("-17,-1,16", 4, "-2,-1,1"); + assert.deepEqual( + [...blocks.keysInSection("-2,-1,1")], + ["-17,-1,16", "-18,-2,17"], + ); + const keys = blocks.keysInSection("-2,-1,1"); + assert.equal(blocks.deleteSection("-2,-1,1"), 2); + assert.equal(blocks.deleteSection("-2,-1,1"), 0); + assert.deepEqual([...keys], []); + assert.deepEqual([...blocks], [["0,0,0", 1]]); + assert.deepEqual([...blocks.loadedSectionKeys()], ["0,0,0"]); + blocks.set("-17,-1,16", 5); + assert.deepEqual([...blocks.keysInSection("-2,-1,1")], ["-17,-1,16"]); + assert.equal(blocks.delete("-17,-1,16"), true); + blocks.setInSection("16,0,0", 6, "1,0,0"); + blocks.clear(); + assert.deepEqual([...blocks.loadedSectionKeys()], []); +}); diff --git a/client/tests/section-stream.test.js b/client/tests/section-stream.test.js new file mode 100644 index 0000000..4e27786 --- /dev/null +++ b/client/tests/section-stream.test.js @@ -0,0 +1,70 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {SectionVoxelMap} from '../section-voxel-map.js'; +import {decodeSection,applySectionView,applySectionBatch} from '../section-stream.js'; +import {samplePhysicsWorld} from '../player-physics.js'; +const record=(section,id=1)=>({section,palette:[id],runs:[4096,0]}); +const view=()=>({world:'world',revision:0,blocks:new SectionVoxelMap(),loadedSections:new Set(),viewGeneration:0}); +const message=(generation=1)=>({world:'world',revision:0,generation,view_center:[0,0,0],view_min:[-48,-32,-48],view_max:[63,47,63],unload:[]}); +test('compact sections decode known air and preserve negative coordinates without per-voxel keys',()=>{ + const world=new SectionVoxelMap(),cells=decodeSection(record([-1,-4,1],3)).cells; + world.setSection('-1,-4,1',cells);assert.equal(world.getAt(-1,-64,16),3);assert.equal(world.size,4096);assert.equal(world.byteLength,4); + world.delete('-1,-64,16');assert.equal(world.size,4095);assert.equal(world.getAt(-1,-64,16),0); + world.setSection('0,0,0',new Uint32Array(4096));assert.equal(world.hasSection('0,0,0'),true);assert.equal(world.size,4095); + assert.deepEqual([...world.materialIds()],[3]);world.deleteSection('-1,-4,1');assert.equal(world.size,0);assert.equal(world.sectionCount,1); +}); +test('malformed compact sections are rejected before any valid section is applied',()=>{ + const v=view();applySectionView(v,message()); + const bad={...record([1,0,0]),runs:[4097,0]}; + assert.equal(applySectionBatch(v,{...message(),sections:[record([0,0,0]),bad]}).status,'resync');assert.equal(v.blocks.size,0); + for(const runs of [[4095,0],[4096,1],[0,0],[4096.1,0],[4096,-1]])assert.throws(()=>decodeSection({...record([0,0,0]),runs})); +}); +test('new views retain overlap and reject delayed batches from previous generations',()=>{ + const v=view();applySectionView(v,message()); + applySectionBatch(v,{...message(),sections:[record([-3,0,0]),record([0,0,0])]});const cells=[...v.blocks.sectionEntries()][1][1]; + const moved={...message(2),view_center:[16,0,0],view_min:[-32,-32,-48],view_max:[79,47,63],unload:[[-3,0,0]]}; + assert.deepEqual(applySectionView(v,moved).unload,[[-3,0,0]]);assert.equal(v.blocks.hasSection('-3,0,0'),false); + assert.equal([...v.blocks.sectionEntries()][0][1],cells); + assert.equal(applySectionBatch(v,{...message(),sections:[record([-3,0,0])]}).status,'ignored'); + assert.equal(v.blocks.hasSection('-3,0,0'),false); +}); +test('collision sampling distinguishes missing terrain from a received air section',()=>{ + const world=new SectionVoxelMap(),body={position:[8,3,8],velocity:[0,0,0],pose:'standing'},bounds={min:[0,0,0],max:[15,15,15]}; + assert.equal(samplePhysicsWorld(body,world,new Map(),bounds),null); + world.setSection('0,0,0',new Uint32Array(4096));assert.deepEqual(samplePhysicsWorld(body,world,new Map(),bounds),{blocks:[]}); +}); + +test('uniform sections remain compact across worker copies and expand only when edited',()=>{ + const world=new SectionVoxelMap(); + world.setSection('0,0,0',new Uint32Array([7])); + world.setSection('1,0,0',new Uint32Array([0])); + assert.equal(world.byteLength,8);assert.equal(world.size,4096); + const samples=[];world.forEachBlock((x,y,z,id)=>samples.push([x,y,z,id]),{min:[14,0,0],max:[17,0,0]}); + assert.deepEqual(samples,[[14,0,0,7],[15,0,0,7]]); + assert.equal([...world.keysInSection('1,0,0')].length,0); + world.set('15,0,0',9);assert.equal(world.byteLength,16388); + assert.equal(world.getAt(14,0,0),7);assert.equal(world.getAt(15,0,0),9); + assert.deepEqual([...world.materialIds()],[7,9]); + world.deleteSection('0,0,0');assert.equal(world.byteLength,4);assert.equal(world.size,0); + world.clear();assert.equal(world.byteLength,0); +}); + +test('full-height worlds allow flight above the ceiling but still require interior collision data',()=>{ + const blocks=new SectionVoxelMap(),bounds={min:[-32,-64,-32],max:[47,319,47],fullHeight:true}; + const body={position:[8,400,8],velocity:[0,0,0],pose:'standing'}; + assert.deepEqual(samplePhysicsWorld(body,blocks,new Map(),bounds),{blocks:[]}); + body.position[1]=310;assert.equal(samplePhysicsWorld(body,blocks,new Map(),bounds),null); + blocks.setSection('0,19,0',new Uint32Array([0])); + assert.deepEqual(samplePhysicsWorld(body,blocks,new Map(),bounds),{blocks:[]}); +}); + +test('large uniform batches load compactly and reject oversized batches atomically',()=>{ + const v=view(),m={...message(),view_min:[-48,-64,-48],view_max:[63,319,63],full_height:true}; + applySectionView(v,m); + const sections=Array.from({length:128},(_,i)=>record([i%7-3,Math.floor(i/7)-4,0],0)); + assert.equal(applySectionBatch(v,{...m,sections}).status,'applied'); + assert.equal(v.blocks.sectionCount,128);assert.equal(v.blocks.byteLength,512); + const oversized=[...sections,record([0,0,1])]; + assert.equal(applySectionBatch(v,{...m,sections:oversized}).status,'resync'); + assert.equal(v.blocks.hasSection('0,0,1'),false); +}); diff --git a/client/tests/shadow-frame.test.js b/client/tests/shadow-frame.test.js new file mode 100644 index 0000000..72e145f --- /dev/null +++ b/client/tests/shadow-frame.test.js @@ -0,0 +1,21 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { shadowFrame } from '../shadow-frame.js'; + +const sun = [-.5, .78, .37]; +const clip = (m, p) => [0, 1, 2].map(i => m[i] * p[0] + m[i + 4] * p[1] + m[i + 8] * p[2] + m[i + 12]); +test('shadow projection puts the camera neighborhood in range and light-facing objects closer', () => { + for (const eye of [[0, 2, 8], [-123.5, 70, 400], [32700, 50, -32700]]) { + const { matrix, center } = shadowFrame(eye, sun); + assert.ok(clip(matrix, center).every(v => Math.abs(v) < 1e-4)); + const near = clip(matrix, center.map((v, i) => v + sun[i] * 20)); + const far = clip(matrix, center.map((v, i) => v - sun[i] * 20)); + assert.ok(near[2] < far[2]); + assert.ok([...near, ...far].every(v => v >= -1 && v <= 1)); + } +}); +test('sub-texel camera movement keeps the shadow grid fixed', () => { + const a = shadowFrame([0, 0, 0], sun).matrix; + const b = shadowFrame([.001, .001, .001], sun).matrix; + for (const i of [0, 1, 4, 5, 8, 9, 12, 13]) assert.equal(a[i], b[i]); +}); diff --git a/client/tests/terrain-controller.test.js b/client/tests/terrain-controller.test.js new file mode 100644 index 0000000..7d9d5d8 --- /dev/null +++ b/client/tests/terrain-controller.test.js @@ -0,0 +1,335 @@ +import test, { afterEach } from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { TerrainController } from "../terrain-controller.js"; +import { TerrainState } from "../terrain-state.js"; +import { SectionBlockMap } from "../section-block-map.js"; + +const properties = JSON.parse( + await readFile(new URL("../light-properties.json", import.meta.url)), +); +const controllers = []; +const bounds = { min: [-1, -1, -1], max: [18, 3, 3] }; +const materials = new Map([ + [1, { state: "minecraft:stone", color: [128, 128, 128] }], + [2, { state: "minecraft:torch", color: [255, 200, 100], light: 14 }], +]); + +class FakeWorker { + packets = []; + transfers = []; + postMessage(packet, transfers = []) { + this.transfers.push(transfers.length); + this.packets.push(structuredClone(packet, { transfer: transfers })); + } + terminate() { + this.terminated = true; + } + reply(message) { + this.onmessage({ data: message }); + } + light(packet, dirty = [], value = 0) { + this.reply({ + type: "light", + epoch: packet.epoch, + version: packet.version, + dirty, + milliseconds: 1, + field: { + min: [0, 0, 0], + size: [1, 1, 1], + sourceCount: value ? 1 : 0, + data: new Uint8Array(4), + blockLevels: new Uint8Array([value]), + skyLevels: new Uint8Array([15]), + }, + }); + } + mesh(packet) { + this.reply({ + ...packet, + vertices: new Float32Array(20), + transparent: new Float32Array(), + milliseconds: 1, + }); + } +} +function fixture() { + const worker = new FakeWorker(), + published = [], + dirty = new Set(); + const controller = new TerrainController({ + workerFactory: () => worker, + onLight: (field) => published.push(field), + onDirty: (ids) => { + for (const id of ids) dirty.add(id); + }, + }); + controllers.push(controller); + return { controller, worker, published, dirty }; +} +afterEach(() => { + for (const controller of controllers.splice(0)) controller.dispose(); +}); + +function queuedClock(t) { + const callbacks = new Map(); + let id = 0, + now = 0; + t.mock.method(globalThis, "setTimeout", (callback) => { + callbacks.set(++id, callback); + return id; + }); + t.mock.method(globalThis, "clearTimeout", (id) => callbacks.delete(id)); + t.mock.method(performance, "now", () => (now += 3)); + return () => { + for (let count = 0; callbacks.size; count++) { + assert.ok(count < 100, "Preparation failed to finish"); + const [id, callback] = callbacks.entries().next().value; + callbacks.delete(id); + callback(); + } + }; +} + +test("edits during incremental reset packing replay over the captured entries coherently", (t) => { + const drain = queuedClock(t), + { controller, worker } = fixture(); + const blocks = new SectionBlockMap( + Array.from({ length: 140 }, (_, x) => [`${x},0,0`, 1]), + ); + controller.reset(blocks, materials, new Map(), bounds); + controller.flush(); + assert.equal(controller.preparing, true); + blocks.delete("0,0,0"); + blocks.set("1,0,0", 2); + blocks.set("200,0,0", 2); + controller.update({ + changes: [ + { pos: [0, 0, 0], block: 0 }, + { pos: [1, 0, 0], block: 2 }, + { pos: [200, 0, 0], block: 2 }, + ], + }); + drain(); + assert.equal(worker.packets.length, 1); + const state = new TerrainState(properties), + packet = worker.packets[0]; + assert.equal(packet.reset, true); + assert.equal(packet.version, controller.version); + assert.ok(packet.initial instanceof Int32Array); + assert.ok(packet.changes instanceof Int32Array); + assert.equal(state.sync(packet), true); + assert.deepEqual([...state.blocks], [...blocks]); +}); + +test("a replacement world cancels old reset preparation and rejects old light and mesh replies", (t) => { + const drain = queuedClock(t), + { controller, worker, published, dirty } = fixture(); + controller.reset( + new SectionBlockMap(Array.from({ length: 140 }, (_, x) => [`${x},0,0`, 1])), + materials, + new Map(), + bounds, + ); + controller.flush(); + assert.equal(controller.preparing, true); + const oldEpoch = controller.epoch; + controller.reset( + new SectionBlockMap([["16,0,0", 2]]), + materials, + new Map(), + bounds, + ); + controller.flush(); + drain(); + assert.equal(worker.packets.length, 1); + const packet = worker.packets[0]; + assert.deepEqual([...packet.initial], [16, 0, 0, 2]); + worker.light(packet, ["1,0,0"], 14); + assert.equal(controller.requestMesh("1,0,0"), true); + const job = controller.busy; + worker.light({ epoch: oldEpoch, version: packet.version }, ["old-world"], 15); + worker.mesh({ ...job, epoch: oldEpoch }); + assert.equal(controller.busy, job); + assert.deepEqual([...dirty], ["1,0,0"]); + assert.equal(published.length, 1); + assert.equal(published[0].sample([0, 0, 0]).blockLevel, 14); + worker.mesh(job); + assert.equal(controller.ready.get("1,0,0").epoch, controller.epoch); +}); + +test("subsequent syncs send deduplicated numeric deltas and only changed materials or textures", () => { + const { controller, worker } = fixture(); + const blocks = new SectionBlockMap([["0,0,0", 1]]), + textures = new Map([["stone", 0]]); + controller.reset(blocks, materials, textures, bounds); + controller.flush(); + blocks.entries = () => { + throw Error("Incremental sync scanned the world"); + }; + blocks[Symbol.iterator] = blocks.entries; + controller.update({ changes: [{ pos: [0, 0, 0], block: 2 }] }); + controller.update({ + changes: [ + { pos: [0, 0, 0], block: 0 }, + { pos: [16, 0, 0], block: 1 }, + ], + }); + controller.flush(); + const delta = worker.packets[1]; + assert.equal(delta.reset, false); + assert.equal(delta.initial, null); + assert.equal(delta.blocks, undefined); + assert.deepEqual([...delta.changes], [0, 0, 0, 0, 16, 0, 0, 1]); + assert.deepEqual(delta.materials, []); + assert.equal(delta.textures, undefined); + assert.equal(worker.transfers[1], 1); + const updated = new Map(materials); + updated.set(2, { + ...materials.get(2), + light: 15, + ignoredMetadata: "not copied", + }); + controller.update({ materials: updated, textures: new Map([["stone", 7]]) }); + controller.flush(); + assert.deepEqual( + worker.packets[2].materials.map(([id]) => id), + [2], + ); + assert.equal(worker.packets[2].materials[0][1].light, 15); + assert.equal(worker.packets[2].materials[0][1].ignoredMetadata, undefined); + assert.deepEqual(worker.packets[2].textures, [["stone", 7]]); +}); + +test("skipped intermediate light fields contribute their dirty union without being published", () => { + const { controller, worker, dirty, published } = fixture(); + controller.reset( + new SectionBlockMap([["0,0,0", 1]]), + materials, + new Map(), + bounds, + ); + controller.flush(); + const old = worker.packets[0]; + controller.update({ changes: [{ pos: [0, 0, 0], block: 2 }] }); + controller.flush(); + const latest = worker.packets[1]; + worker.light(old, ["0,0,0", "1,0,0"], 0); + assert.equal(published.length, 0); + assert.equal(controller.requestMesh("0,0,0"), false); + worker.light(latest, ["1,0,0", "2,0,0"], 14); + assert.equal(published.length, 1); + assert.deepEqual([...dirty], ["0,0,0", "1,0,0", "2,0,0"]); + assert.equal(controller.requestMesh("0,0,0"), true); +}); + +test("mesh requests allow one in flight and two ready, and stale replies cannot release a newer job", () => { + const { controller, worker } = fixture(); + controller.reset( + new SectionBlockMap([["0,0,0", 1]]), + materials, + new Map(), + bounds, + ); + controller.flush(); + worker.light(worker.packets[0]); + assert.equal(controller.requestMesh("0,0,0"), true); + assert.equal(controller.requestMesh("1,0,0"), false); + worker.mesh(controller.busy); + assert.equal(controller.requestMesh("0,0,0"), false); + assert.equal(controller.requestMesh("1,0,0"), true); + worker.mesh(controller.busy); + assert.equal(controller.ready.size, 2); + assert.equal(controller.requestMesh("2,0,0"), false); + controller.ready.delete("0,0,0"); + assert.equal(controller.requestMesh("2,0,0"), true); + const stale = controller.busy; + controller.update({ unload: [[2, 0, 0]] }); + assert.equal(controller.ready.size, 0); + controller.flush(); + worker.light(worker.packets.at(-1)); + assert.equal(controller.requestMesh("0,0,0"), false); + worker.mesh(stale); + assert.equal(controller.ready.has("2,0,0"), false); + assert.equal(controller.requestMesh("0,0,0"), true); + const current = controller.busy; + worker.mesh(stale); + assert.equal(controller.busy, current); + worker.mesh(current); + assert.deepEqual([...controller.ready.keys()], ["0,0,0"]); +}); + +test("a section unloaded then re-entered within one flush keeps only its newer blocks", () => { + const { controller, worker } = fixture(), + state = new TerrainState(properties); + controller.reset( + new SectionBlockMap([ + ["16,0,0", 1], + ["17,0,0", 1], + ]), + materials, + new Map(), + bounds, + ); + controller.flush(); + state.sync(worker.packets[0]); + controller.update({ changes: [{ pos: [17, 0, 0], block: 2 }] }); + controller.update({ unload: [[1, 0, 0]] }); + controller.update({ changes: [{ pos: [16, 0, 0], block: 2 }] }); + controller.flush(); + state.sync(worker.packets[1]); + assert.deepEqual([...state.blocks], [["16,0,0", 2]]); +}); + +test("complete sections replace queued edits and replay newer edits after their numeric records", () => { + const { controller, worker } = fixture(), state = new TerrainState(properties); + controller.reset(new SectionBlockMap([["16,0,0", 1], ["17,0,0", 1]]), materials, new Map(), bounds); + controller.flush(); state.sync(worker.packets[0]); + controller.update({ changes: [{ pos: [17,0,0], block: 2 }] }); + controller.update({ sections: [{ section: [1,0,0], blocks: [{ pos: [18,0,0], block: 1 }] }] }); + controller.update({ changes: [{ pos: [18,0,0], block: 2 }] }); + controller.flush(); state.sync(worker.packets[1]); + assert.deepEqual([...state.blocks], [["18,0,0", 2]]); + assert.deepEqual([...worker.packets[1].changes], [18,0,0,1,18,0,0,2]); + + controller.update({ sections: [{ section: [1,0,0], blocks: [{ pos: [19,0,0], block: 1 }] }] }); + controller.update({ unload: [[1,0,0]] }); + controller.update({ sections: [{ section: [1,0,0], blocks: [{ pos: [20,0,0], block: 2 }] }] }); + controller.flush(); state.sync(worker.packets[2]); + assert.deepEqual([...state.blocks], [["20,0,0", 2]]); + + controller.update({ sections: [{ section: [1,0,0], blocks: [] }] }); + controller.flush(); state.sync(worker.packets[3]); + assert.equal(state.blocks.size, 0, "An empty complete section clears old contents"); +}); + +test("streamed section records are packed at flush without indexing each voxel on arrival", () => { + const { controller, worker } = fixture(); + controller.reset(new SectionBlockMap(), materials, new Map(), bounds); + controller.flush(); + const records = [{ pos: [16,0,0], block: 1 }]; + controller.changes.set = () => { throw Error("Section records must not pass through the per-edit index"); }; + controller.update({ sections: [{ section: [1,0,0], blocks: records }] }); + assert.equal(controller.sectionChanges.get("1,0,0"), records); + controller.flush(); + assert.deepEqual([...worker.packets[1].changes], [16,0,0,1]); + assert.equal(controller.sectionChanges.size, 0); +}); + +test("runtime worker errors notify the renderer asynchronously and stop after disposal", async t => { + t.mock.method(console, "error", () => {}); + const worker = new FakeWorker(), errors = []; + const controller = new TerrainController({ workerFactory: () => worker, onError: message => errors.push(message) }); + controllers.push(controller); + let prevented = false; + worker.onerror({ message: "Worker stopped", preventDefault() { prevented = true; } }); + assert.equal(prevented, true); + assert.deepEqual(errors, []); + await Promise.resolve(); + assert.deepEqual(errors, ["Worker stopped"]); + worker.onerror({ message: "Obsolete error", preventDefault() {} }); + controller.dispose(); + await Promise.resolve(); + assert.deepEqual(errors, ["Worker stopped"]); +}); diff --git a/client/tests/terrain-state.test.js b/client/tests/terrain-state.test.js new file mode 100644 index 0000000..47414a1 --- /dev/null +++ b/client/tests/terrain-state.test.js @@ -0,0 +1,253 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { TerrainState } from "../terrain-state.js"; +import { MESH_VERTEX_STRIDE } from "../mesh-geometry.js"; + +const properties = JSON.parse( + await readFile(new URL("../light-properties.json", import.meta.url)), +); +const cube = { min: [0, 0, 0], max: [1, 1, 1] }; +const stone = { + state: "minecraft:stone", + color: [128, 128, 128], + render: [cube], +}; +const lamp = { + state: "minecraft:sea_lantern", + color: [240, 250, 250], + render: [cube], + light: 15, +}; +const bounds = { min: [-2, -2, -2], max: [18, 3, 3] }; +function packet(overrides = {}) { + return { + type: "sync", + epoch: 1, + version: 1, + reset: true, + initial: new Int32Array([0, 0, 0, 1]), + changes: new Int32Array(), + materials: [ + [1, stone], + [2, lamp], + ], + textures: [], + bounds, + unload: [], + ...overrides, + }; +} +const request = (state, id = "0,0,0") => ({ + epoch: state.epoch, + version: state.version, + id, + job: 1, +}); + +test("reset plus deltas preserves numeric coordinates and authoritative material lighting metadata", () => { + const state = new TerrainState(properties); + assert.equal( + state.sync( + packet({ + initial: new Int32Array([-1, 0, 0, 1, 16, 0, 0, 1]), + changes: new Int32Array([-1, 0, 0, 0, 16, 0, 0, 2]), + }), + ), + true, + ); + assert.deepEqual([...state.blocks], [["16,0,0", 2]]); + assert.deepEqual([...state.blocks.loadedSectionKeys()], ["1,0,0"]); + assert.equal(state.materials.get(1).light_dampening, 15); + assert.equal(stone.light_dampening, undefined); + assert.equal(state.mesh(request(state, "1,0,0")).stale, true); + const result = state.light(); + assert.equal(result.field.sourceCount, 1); + assert.equal(state.field.sample([16, 0, 0]).blockLevel, 15); + assert.notEqual(result.field.data.buffer, state.field.data.buffer); + assert.notEqual( + result.field.blockLevels.buffer, + state.field.blockLevels.buffer, + ); + assert.notEqual(result.field.skyLevels.buffer, state.field.skyLevels.buffer); + assert.ok(state.mesh(request(state, "1,0,0")).vertices.length > 0); +}); + +test("outdated syncs and mesh requests cannot overwrite a new version or world", () => { + const state = new TerrainState(properties); + state.sync(packet()); + state.light(); + state.sync( + packet({ epoch: 2, version: 5, initial: new Int32Array([16, 0, 0, 2]) }), + ); + assert.equal(state.sync(packet({ version: 100 })), false); + assert.equal(state.sync(packet({ epoch: 2, version: 4 })), false); + assert.equal( + state.sync(packet({ epoch: 3, version: 6, reset: false })), + false, + ); + assert.deepEqual([...state.blocks], [["16,0,0", 2]]); + assert.equal(state.field, null); + assert.equal( + state.mesh({ epoch: 1, version: 1, id: "0,0,0", job: 1 }).stale, + true, + ); + state.light(); + assert.equal( + state.mesh({ epoch: 2, version: 4, id: "1,0,0", job: 2 }).stale, + true, + ); + assert.ok(state.mesh(request(state, "1,0,0")).vertices.length > 0); +}); + +test("unloaded sections disappear from persistent storage and cannot be resurrected by old syncs", () => { + const state = new TerrainState(properties); + state.sync(packet({ initial: new Int32Array([0, 0, 0, 1, 16, 0, 0, 2]) })); + state.light(); + state.mesh(request(state, "1,0,0")); + assert.equal(state.meshed.has("1,0,0"), true); + state.sync( + packet({ + reset: false, + version: 2, + initial: null, + materials: [], + unload: [[1, 0, 0]], + }), + ); + assert.equal(state.blocks.has("16,0,0"), false); + assert.deepEqual([...state.blocks.keysInSection("1,0,0")], []); + assert.equal(state.meshed.has("1,0,0"), false); + state.light(); + assert.equal(state.mesh(request(state, "1,0,0")).vertices.length, 0); + assert.equal( + state.sync(packet({ initial: new Int32Array([16, 0, 0, 2]) })), + false, + ); + assert.equal(state.blocks.has("16,0,0"), false); +}); + +test("material and texture replacements affect the next mesh and invalidate face texture cache", () => { + const state = new TerrainState(properties); + state.sync(packet({ textures: [["stone", 3]] })); + state.light(); + const first = state.mesh(request(state)); + assert.equal(first.vertices.length, 36 * MESH_VERTEX_STRIDE); + assert.equal(first.vertices[13], 3); + assert.equal(state.faceTextureCache.get("minecraft:stone")[0].layer, 3); + state.sync( + packet({ + reset: false, + version: 2, + initial: null, + materials: [ + [ + 1, + { + ...stone, + render: [{ min: [0, 0, 0], max: [1, 0.5, 1] }], + light: 7, + }, + ], + ], + textures: [["stone", 9]], + }), + ); + assert.equal(state.faceTextureCache.size, 0); + assert.equal(state.mesh(request(state)).stale, true); + state.light(); + const next = state.mesh(request(state)); + for (let i = 0; i < next.vertices.length; i += MESH_VERTEX_STRIDE) { + assert.ok(next.vertices[i + 1] <= 0.5); + assert.equal(next.vertices[i + 13], 9); + assert.ok(Math.abs(next.vertices[i + 15] - 7 / 15) < 1e-6); + } + assert.equal(state.faceTextureCache.get("minecraft:stone")[0].layer, 9); +}); + +test("lighting changes keep emptied meshed sections dirty until their stale geometry is replaced", () => { + const state = new TerrainState(properties); + state.sync(packet({ initial: new Int32Array([0, 0, 0, 2]) })); + state.light(); + state.mesh(request(state)); + state.sync( + packet({ + reset: false, + version: 2, + initial: null, + materials: [], + changes: new Int32Array([0, 0, 0, 0]), + }), + ); + assert.equal(state.blocks.size, 0); + assert.ok(state.light().dirty.includes("0,0,0")); + assert.equal(state.mesh(request(state)).vertices.length, 0); +}); + +test("a retained unknown cube remeshes when its same-light definition arrives", () => { + const state = new TerrainState(properties); + state.sync(packet({ initial: new Int32Array([15, 0, 0, 99, 16, 0, 0, 1]) })); + state.light(); + const before = state.mesh(request(state)); + state.mesh(request(state, "1,0,0")); + const oldLight = state.field.data.slice(), oldSky = state.field.skyLevels.slice(); + const defined = { ...stone, color: [60, 70, 80] }; + state.sync(packet({ reset: false, version: 2, initial: null, materials: [[99, defined]] })); + const result = state.light(); + assert.deepEqual(state.field.data, oldLight); + assert.deepEqual(state.field.skyLevels, oldSky); + assert.ok(result.dirty.includes("0,0,0"), "the placeholder's owner must be rebuilt even with identical lighting"); + assert.ok(result.dirty.includes("1,0,0"), "neighbor culling/AO must also be refreshed"); + const after = state.mesh(request(state)); + assert.notDeepEqual(after.vertices.slice(3, 6), before.vertices.slice(3, 6)); + assert.deepEqual([...after.vertices.slice(3, 6)], defined.color.map(value => Math.fround(value / 255))); +}); + +test("repeated equivalent material definitions do not spuriously dirty retained sections", () => { + const state = new TerrainState(properties); + state.sync(packet()); + state.light(); state.mesh(request(state)); + const current = state.materials.get(1); + const repeated = { render: [{ max: [1, 1, 1], min: [0, 0, 0] }], color: [128, 128, 128], + state: "minecraft:stone", ignoredMetadata: "does not affect the transmitted material" }; + state.sync(packet({ reset: false, version: 2, initial: null, materials: [[1, repeated]] })); + assert.equal(state.materials.get(1), current); + assert.deepEqual(state.light().dirty, []); +}); + +test("a color-only definition replacement invalidates its mesh without a light delta", () => { + const state = new TerrainState(properties); + state.sync(packet()); + state.light(); state.mesh(request(state)); + const oldLight = state.field.data.slice(), oldSky = state.field.skyLevels.slice(); + state.sync(packet({ reset: false, version: 2, initial: null, materials: [[1, { ...stone, color: [220, 70, 30] }]] })); + assert.ok(state.light().dirty.includes("0,0,0")); + assert.deepEqual(state.field.data, oldLight); + assert.deepEqual(state.field.skyLevels, oldSky); + assert.deepEqual([...state.mesh(request(state)).vertices.slice(3, 6)], [220, 70, 30].map(value => Math.fround(value / 255))); +}); + +test("material invalidations from separate coalesced syncs retain their union", () => { + const state = new TerrainState(properties), wide = { min: [-2, -2, -2], max: [50, 3, 3] }; + state.sync(packet({ initial: new Int32Array([0, 0, 0, 1, 48, 0, 0, 3]), materials: [[1, stone], [3, stone]], bounds: wide })); + state.light(); state.mesh(request(state)); state.mesh(request(state, "3,0,0")); + state.sync(packet({ reset: false, version: 2, initial: null, materials: [[1, { ...stone, color: [10, 20, 30] }]], bounds: wide })); + state.sync(packet({ reset: false, version: 3, initial: null, materials: [[3, { ...stone, color: [30, 20, 10] }]], bounds: wide })); + assert.deepEqual(new Set(state.light().dirty), new Set(["0,0,0", "3,0,0"])); + assert.deepEqual(state.light().dirty, [], "the material union is consumed after a successful field publication"); +}); + +test("world reset clears pending material geometry invalidations", () => { + const state = new TerrainState(properties), wide = { min: [-2, -2, -2], max: [50, 3, 3] }; + state.sync(packet()); state.light(); state.mesh(request(state)); + state.sync(packet({ reset: false, version: 2, initial: null, materials: [[1, { ...stone, color: [10, 20, 30] }]] })); + state.sync(packet({ epoch: 2, version: 3, initial: new Int32Array([48, 0, 0, 1]), materials: [[1, stone]], bounds: wide })); + assert.deepEqual(state.light().dirty, ["3,0,0"]); +}); + +test("a new definition absent from the loaded blocks does not remesh terrain", () => { + const state = new TerrainState(properties); + state.sync(packet()); state.light(); state.mesh(request(state)); + state.sync(packet({ reset: false, version: 2, initial: null, materials: [[99, lamp]] })); + assert.deepEqual(state.light().dirty, []); +}); diff --git a/client/tests/terrain-streaming-smoke.html b/client/tests/terrain-streaming-smoke.html new file mode 100644 index 0000000..81e8e25 --- /dev/null +++ b/client/tests/terrain-streaming-smoke.html @@ -0,0 +1,148 @@ + + + + +Shacraft terrain streaming benchmark + +
Terrain streamingPreparing scene…
+
Initial loading and warmup are excluded from measurements.

64 × 64 visible floor, lamp grid, glass and stairs. Six boundaries at 8 blocks/s. CPU draw measures JavaScript and WebGL submission, not GPU completion. Keep this tab visible.

+ + diff --git a/client/tests/terrain-upload.test.js b/client/tests/terrain-upload.test.js new file mode 100644 index 0000000..38704fa --- /dev/null +++ b/client/tests/terrain-upload.test.js @@ -0,0 +1,236 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { Renderer } from "../renderer.js"; + +function fixture(t, { uploadCost = 1, allocationCost = 0 } = {}) { + const clock = { now: 0 }; + t.mock.method(performance, "now", () => clock.now); + let serial = 0, bound; + const gl = { + ARRAY_BUFFER: 1, DYNAMIC_DRAW: 2, STATIC_DRAW: 3, FLOAT: 4, + buffers: new Map(), uploads: [], allocations: [], deletedBuffers: [], deletedVaos: [], + createBuffer() { const buffer = { id: ++serial }; this.buffers.set(buffer, new Uint8Array()); return buffer; }, + createVertexArray() { return { id: ++serial }; }, + bindVertexArray() {}, bindBuffer(_target, buffer) { bound = buffer; }, + enableVertexAttribArray() {}, vertexAttribPointer() {}, + bufferData(_target, data, usage) { + const bytes = typeof data === "number" ? new Uint8Array(data) : + new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice(); + this.buffers.set(bound, bytes); + this.allocations.push({ buffer: bound, byteLength: bytes.byteLength, usage }); + if (typeof data === "number") clock.now += allocationCost; + }, + bufferSubData(_target, offset, data) { + const bytes = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); + assert.ok(offset + bytes.byteLength <= this.buffers.get(bound).byteLength); + this.buffers.get(bound).set(bytes, offset); + this.uploads.push({ buffer: bound, offset, byteLength: bytes.byteLength }); + clock.now += uploadCost; + }, + deleteBuffer(buffer) { this.deletedBuffers.push(buffer); this.buffers.delete(buffer); }, + deleteVertexArray(vao) { this.deletedVaos.push(vao); }, + }; + const renderer = Object.create(Renderer.prototype); + Object.assign(renderer, { gl, sections: new Map(), dirty: new Set(["0,0,0"]), meshUpload: null, + meshRebuilds: 0, lightViewBounds: { min: [0, 0, 0], max: [31, 31, 31] } }); + const old = renderer.mesh(new Float32Array(60).fill(7)); + old.transparent = renderer.mesh(new Float32Array(60).fill(8)); + old.tag = "retained identity"; + const other = renderer.mesh(new Float32Array(60).fill(9)); + renderer.sections.set("0,0,0", old); + renderer.sections.set("1,0,0", other); + const terrain = { epoch: 1, version: 1, ready: new Map(), + isCurrent(result) { return result.epoch === this.epoch && result.version === this.version; } }; + renderer.terrain = terrain; + gl.allocations.length = 0; + const result = (opaqueVertices = 3000, transparentVertices = 1000, overrides = {}) => { + const vertices = new Float32Array(opaqueVertices * 20), transparent = new Float32Array(transparentVertices * 20); + for (let index = 0; index < vertices.length; index++) vertices[index] = index * 0.25; + for (let index = 0; index < transparent.length; index++) transparent[index] = -index * 0.125; + return { id: "0,0,0", epoch: terrain.epoch, version: terrain.version, vertices, transparent, ...overrides }; + }; + const queue = (message) => terrain.ready.set(message.id, message); + const drain = () => { + for (let frame = 0; frame < 200 && (renderer.meshUpload || terrain.ready.size); frame++) + renderer.applyTerrainMeshes(0.5); + assert.equal(renderer.meshUpload, null); + assert.equal(terrain.ready.size, 0); + }; + return { renderer, terrain, gl, clock, old, other, result, queue, drain }; +} + +test("uploads are capped at 64 KiB and both surfaces publish only after completion", (t) => { + const f = fixture(t), message = f.result(); + const oldBuffer = f.old.buffer, oldTransparent = f.old.transparent, oldVao = f.old.vao; + f.queue(message); + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.gl.uploads.length, 1); + assert.equal(f.gl.uploads[0].byteLength, 65_536); + assert.equal(f.renderer.sections.get(message.id), f.old); + assert.equal(f.old.buffer, oldBuffer); + assert.equal(f.old.transparent, oldTransparent); + assert.deepEqual(f.gl.deletedBuffers, []); + assert.ok(f.renderer.dirty.has(message.id)); + // Four opaque slices and the first translucent slice still cannot replace + // the visible mesh, even though its opaque replacement is already complete. + for (let frame = 0; frame < 4; frame++) f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.renderer.meshUpload.parts[0].offset, message.vertices.length); + assert.ok(f.renderer.meshUpload.parts[1].offset < message.transparent.length); + assert.equal(f.old.buffer, oldBuffer); + assert.equal(f.old.transparent, oldTransparent); + f.drain(); + assert.ok(f.gl.uploads.every((upload) => upload.byteLength <= 65_536)); + assert.equal(f.renderer.sections.get(message.id), f.old); + assert.equal(f.old.tag, "retained identity"); + assert.notEqual(f.old.buffer, oldBuffer); + assert.notEqual(f.old.vao, oldVao); + assert.notEqual(f.old.transparent, oldTransparent); + assert.equal(f.old.count, 3000); + assert.equal(f.old.transparent.count, 1000); + assert.deepEqual(f.gl.buffers.get(f.old.buffer), new Uint8Array(message.vertices.buffer)); + assert.deepEqual(f.gl.buffers.get(f.old.transparent.buffer), new Uint8Array(message.transparent.buffer)); + assert.ok(f.gl.deletedBuffers.includes(oldBuffer)); + assert.ok(f.gl.deletedBuffers.includes(oldTransparent.buffer)); + assert.equal(f.renderer.sections.get("1,0,0"), f.other); + assert.ok(!f.gl.deletedBuffers.includes(f.other.buffer)); + assert.ok(!f.renderer.dirty.has(message.id)); + assert.equal(f.renderer.meshRebuilds, 1); +}); + +test("a generation change discards partially uploaded buffers and preserves visible geometry", (t) => { + const f = fixture(t), oldBuffer = f.old.buffer, oldTransparent = f.old.transparent; + f.queue(f.result(900, 900)); + for (let frame = 0; frame < 3; frame++) f.renderer.applyTerrainMeshes(0.5); + const staged = f.renderer.meshUpload.parts.map((part) => part.mesh); + assert.ok(staged.every(Boolean), "both replacement surfaces were allocated"); + assert.equal(f.old.buffer, oldBuffer); + f.terrain.version++; + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.renderer.meshUpload, null); + assert.equal(f.renderer.sections.get("0,0,0"), f.old); + assert.equal(f.old.buffer, oldBuffer); + assert.equal(f.old.transparent, oldTransparent); + assert.ok(f.renderer.dirty.has("0,0,0")); + for (const mesh of staged) { + assert.ok(f.gl.deletedBuffers.includes(mesh.buffer)); + assert.ok(f.gl.deletedVaos.includes(mesh.vao)); + } + assert.ok(!f.gl.deletedBuffers.includes(oldBuffer)); + assert.ok(!f.gl.deletedBuffers.includes(oldTransparent.buffer)); + assert.equal(f.renderer.meshRebuilds, 0); + f.queue(f.result(3, 0)); + f.drain(); + assert.equal(f.old.count, 3); + assert.equal(f.old.transparent, null); + assert.equal(f.renderer.meshRebuilds, 1); +}); + +test("explicit staged-upload disposal is idempotent and owns only replacement resources", (t) => { + const f = fixture(t); + f.queue(f.result()); + f.renderer.applyTerrainMeshes(0.5); + const staged = f.renderer.meshUpload.parts[0].mesh; + f.renderer.discardMeshUpload(); + f.renderer.discardMeshUpload(); + assert.equal(f.renderer.meshUpload, null); + assert.equal(f.gl.deletedBuffers.filter((buffer) => buffer === staged.buffer).length, 1); + assert.equal(f.gl.deletedVaos.filter((vao) => vao === staged.vao).length, 1); + assert.ok(f.gl.buffers.has(f.old.buffer)); + assert.ok(f.gl.buffers.has(f.old.transparent.buffer)); +}); + +test("empty results remove both old surfaces without allocating empty GPU replacements", (t) => { + const f = fixture(t), oldTransparent = f.old.transparent; + f.queue(f.result(0, 0)); + f.drain(); + assert.equal(f.renderer.sections.has("0,0,0"), false); + assert.ok(f.gl.deletedBuffers.includes(f.old.buffer)); + assert.ok(f.gl.deletedBuffers.includes(oldTransparent.buffer)); + assert.equal(f.gl.allocations.length, 0); + assert.equal(f.gl.uploads.length, 0); + assert.equal(f.renderer.sections.get("1,0,0"), f.other); + assert.equal(f.renderer.meshRebuilds, 1); +}); + +test("a new translucent-only section retains an empty opaque handle for draw paths", (t) => { + const f = fixture(t), message = f.result(0, 6, { id: "0,1,0" }); + f.queue(message); + f.drain(); + const mesh = f.renderer.sections.get(message.id); + assert.ok(mesh?.vao && mesh.buffer); + assert.equal(mesh.count, 0); + assert.equal(mesh.transparent.count, 6); + assert.deepEqual(f.gl.buffers.get(mesh.transparent.buffer), new Uint8Array(message.transparent.buffer)); + assert.equal(f.renderer.sections.get("0,0,0"), f.old); +}); + +test("stale or out-of-view results never allocate or replace a mesh", (t) => { + const f = fixture(t); + f.queue(f.result(3, 0, { version: 0 })); + f.renderer.applyTerrainMeshes(0.5); + f.queue(f.result(3, 0, { id: "8,0,0" })); + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.gl.allocations.length, 0); + assert.equal(f.gl.uploads.length, 0); + assert.equal(f.renderer.sections.get("0,0,0"), f.old); + assert.equal(f.renderer.meshRebuilds, 0); + assert.ok(f.renderer.dirty.has("0,0,0")); +}); + +test("the frame budget stops before further upload steps and preserves queued work", (t) => { + const f = fixture(t); + f.queue(f.result()); + f.renderer.applyTerrainMeshes(0); + assert.equal(f.gl.allocations.length, 0); + assert.equal(f.terrain.ready.size, 1); + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.gl.uploads.length, 1); + assert.equal(f.renderer.meshUpload.parts[0].offset, 16_384); + assert.equal(f.renderer.meshUploadMilliseconds, 1); + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.gl.uploads.length, 2); + assert.equal(f.renderer.meshUpload.parts[0].offset, 32_768); +}); + +test("an expensive GPU allocation yields before copying vertex data", (t) => { + const f = fixture(t, { allocationCost: 3 }); + f.queue(f.result()); + f.renderer.applyTerrainMeshes(2); + assert.ok(f.renderer.meshUpload.parts[0].mesh); + assert.equal(f.renderer.meshUpload.parts[0].offset, 0); + assert.equal(f.gl.uploads.length, 0); + assert.equal(f.renderer.meshUploadMilliseconds, 3); + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.gl.uploads.length, 1); + assert.equal(f.renderer.sections.get("0,0,0"), f.old); +}); + +test('preview publication keeps the section dirty for corrected lighting and reports visible geometry', t => { + const f=fixture(t),published=[]; + f.renderer.onMeshPublished=(id,result)=>published.push({id,preview:result.preview}); + f.queue(f.result(6,0,{preview:true})); f.drain(); + assert.equal(f.old.count,6); + assert.equal(f.renderer.dirty.has('0,0,0'),true); + assert.deepEqual(published,[{id:'0,0,0',preview:true}]); + f.queue(f.result(6,0,{preview:false}));f.drain(); + assert.equal(f.renderer.dirty.has('0,0,0'),false); +}); + +test('edit uploads survive unrelated terrain versions but reject newer edits before publication',t=>{ + const f=fixture(t),oldBuffer=f.old.buffer; + const edits={epoch:9,ticket:1,ready:new Map(),isCurrent(r){return r.epoch===this.epoch&&r.editJob===this.ticket;},cancel(){this.ticket++;}}; + f.renderer.edits=edits; + edits.ready.set('0,0,0',f.result(3000,0,{epoch:9,editJob:1,preview:true})); + f.renderer.applyTerrainMeshes(0.5);const stage=f.renderer.meshUpload; + f.terrain.version++; + f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.renderer.meshUpload,stage,'a distant chunk update must not discard a local edit'); + edits.ticket++;f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.renderer.meshUpload,null);assert.equal(f.old.buffer,oldBuffer); + edits.ready.set('0,0,0',f.result(3,0,{epoch:9,editJob:2,preview:true})); + for(let frame=0;frame<10&&(f.renderer.meshUpload||edits.ready.size);frame++)f.renderer.applyTerrainMeshes(0.5); + assert.equal(f.old.count,3);assert.equal(f.renderer.dirty.has('0,0,0'),true); + f.queue(f.result(3,0));f.drain(); + assert.equal(edits.ticket,3,'final lighting cancels any older preview'); + assert.equal(f.renderer.dirty.has('0,0,0'),false); +}); diff --git a/client/tests/texture-pack.test.js b/client/tests/texture-pack.test.js new file mode 100644 index 0000000..a9c8f14 --- /dev/null +++ b/client/tests/texture-pack.test.js @@ -0,0 +1,70 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {prepareTexturePack, textureSubset, BLOCK_FACES} from '../texture-pack.js'; +import {getBlockFaceTextures, getFaceUV} from '../block-textures.js'; +import {buildSectionMesh} from '../mesh-geometry.js'; + +const limits = {layers:256, size:2048}; +const files = new Map([['atlas.png', {}]]); +const descriptor = () => ({pixel_size:32, atlas:{path:'atlas.png', columns:40, rows:32}, + textures:Array.from({length:1269}, (_,i)=>({name:`tile_${i}`}))}); + +test('atlas supports the full catalog on a GPU with only 256 array layers', () => { + const result = prepareTexturePack(descriptor(), files, limits); + assert.deepEqual([result.width,result.height,result.layers.size],[1280,1024,1269]); + assert.equal(result.layers.get('tile_1268'),1268); + const regular = {...descriptor(),atlas:undefined}; + assert.throws(()=>prepareTexturePack(regular,files,limits),/размер/); +}); + +test('atlas bounds, verified resources, and names are validated before allocating GPU memory', () => { + assert.throws(()=>prepareTexturePack(descriptor(),new Map(),limits),/атлас/); + assert.throws(()=>prepareTexturePack(descriptor(),files,{...limits,size:1024}),/видеокарты/); + for(const atlas of [{path:'atlas.png',columns:1,rows:1},{path:'atlas.png',columns:40.5,rows:32}]) + assert.throws(()=>prepareTexturePack({...descriptor(),atlas},files,limits),/атлас/); + for(const textures of [[{name:'same'},{name:'same'}],[{}],[{name:'../escape'}]]) + assert.throws(()=>prepareTexturePack({...descriptor(),textures},files,limits),/ресурс/); +}); + +test('state faces and UV transforms survive worker transfer and reach section geometry', () => { + const d=descriptor(); + const face={texture:'tile_1268',tint:[.4,.7,.3],cutout:true,uv:[0,0,1,0,0,-1,0,1]}; + d.block_faces={sets:[Array(6).fill(face),Array(6).fill(null)], + states:{'minecraft:test[facing=east,half=top]':0},defaults:{'minecraft:test':1}}; + const {layers}=prepareTexturePack(d,files,limits); + const cloned=new Map(structuredClone([...layers])); + const state='minecraft:test[half=top,facing=east]'; + const faces=getBlockFaceTextures(state,cloned); + assert.equal(faces[0].layer,1268); + assert.deepEqual(getFaceUV(0,[.25,.5,.75],state,faces[0]),[.75,.5]); + assert.deepEqual(getBlockFaceTextures('minecraft:test',cloned),Array(6).fill(null)); + const mesh=buildSectionMesh({id:'0,0,0',blocks:new Map([['0,0,0',1]]), + materials:new Map([[1,{state,color:[255,255,255],render:[{min:[0,0,0],max:[1,1,1]}]}]]),textureLayers:cloned}); + for(let i=0;i { + for(const face of [{texture:'missing'},{texture:'tile_0',tint:[NaN,1,1]}, + {texture:'tile_0',uv:Array(8).fill(Infinity)}]){ + const d=descriptor();d.block_faces={sets:[Array(6).fill(face)],states:{},defaults:{}}; + assert.throws(()=>prepareTexturePack(d,files,limits),/гран/); + } + const d=descriptor();d.block_faces={sets:[Array(6).fill(null)],states:{'minecraft:stone':9},defaults:{}}; + assert.throws(()=>prepareTexturePack(d,files,limits),/состояние/); +}); + +test('edit snapshots send only nearby state mappings from a large texture catalog',()=>{ + const d=descriptor(); + d.block_faces={sets:[Array(6).fill({texture:'tile_0'}),Array(6).fill({texture:'tile_1'})], + states:{'minecraft:stone':0,'minecraft:dirt':1},defaults:{'minecraft:stone':0,'minecraft:dirt':1}}; + const {layers}=prepareTexturePack(d,files,limits); + const subset=textureSubset(layers,new Map([[1,{state:'minecraft:dirt'}]])); + assert.equal(subset.get(BLOCK_FACES).sets.length,1); + assert.deepEqual(Object.keys(subset.get(BLOCK_FACES).states),['minecraft:dirt']); + assert.equal(getBlockFaceTextures('minecraft:dirt',subset)[0].layer,1); + assert.equal(layers.get(BLOCK_FACES).sets.length,2); +}); diff --git a/client/tests/view-distance.test.js b/client/tests/view-distance.test.js new file mode 100644 index 0000000..85c28bc --- /dev/null +++ b/client/tests/view-distance.test.js @@ -0,0 +1,86 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { normalizeViewDistance, viewDistanceProfile, MAX_VIEW_CELLS, MAX_LIGHT_CELLS } from "../view-distance.js"; +import { applySectionView, applySectionBatch } from "../section-stream.js"; +import { SectionVoxelMap } from "../section-voxel-map.js"; +import { buildBlockLight } from "../block-light.js"; +import {actorLightBounds} from '../terrain-state.js'; + +const message = (radius, generation, center = [0, 64, 0]) => ({ + world: "test", revision: 7, generation, view_distance: radius, + view_center: center, view_min: center.map((v,i) => v - (i===1?2:radius)*16), + view_max: center.map((v,i) => v + (i===1?3:radius+1)*16-1), + unload: [], total_sections: (radius*2+1)**2*5, +}); +test("distance settings are bounded and projection, fog and memory scale together", () => { + for (const value of [null, undefined, "bad", 1, 65, 3.5, Infinity]) assert.equal(normalizeViewDistance(value), 3); + assert.equal(normalizeViewDistance("8"), 8); + const initial=viewDistanceProfile(3), maximum=viewDistanceProfile(64); + assert.equal(initial.sections, 1176); assert.equal(maximum.sections, 399384); + assert.equal(maximum.width, 2064); assert.equal(maximum.streamVoxelBytes, MAX_VIEW_CELLS*4); + assert.ok(maximum.drawRadius>initial.drawRadius); + assert.ok(maximum.farClip>maximum.drawRadius); + assert.ok(maximum.fogDistance>initial.fogDistance); +}); +test("resizing retains overlapping arrays, accepts the far ring and ignores obsolete batches", () => { + const view={world:"test",revision:7,viewGeneration:0,blocks:new SectionVoxelMap(),loadedSections:new Set()}; + applySectionView(view,message(3,1)); + const cells=new Uint32Array(4096).fill(1);view.blocks.setSection("0,4,0",cells);view.loadedSections.add("0,4,0"); + assert.deepEqual(applySectionView(view,message(8,2)),{unload:[]}); + assert.equal(view.totalSections,1445);assert.equal([...view.blocks.sectionEntries()][0][1],cells); + const batch={world:"test",revision:7,generation:2,sections:[{section:[8,4,8],palette:[0],runs:[4096,0]}]}; + assert.equal(applySectionBatch(view,batch).status,"applied"); + const shrunk=applySectionView(view,message(2,3)); + assert.deepEqual(shrunk.unload,[[8,4,8]]);assert.equal(view.totalSections,125); + assert.equal(view.blocks.sectionCount,1);assert.equal([...view.blocks.sectionEntries()][0][1],cells); + assert.equal(applySectionBatch(view,batch).status,"ignored"); + assert.equal(applySectionView(view,message(66,4)),"resync"); +}); +test("the maximum view permits the small air margin beyond the playable border", () => { + const view={world:"test",revision:7,viewGeneration:0,blocks:new SectionVoxelMap(),loadedSections:new Set()}; + assert.notEqual(applySectionView(view,message(8,1,[29_999_872,64,-29_999_872])),"resync"); + assert.equal(applySectionBatch(view,{world:"test",revision:7,generation:1,sections:[{section:[1_875_000,4,-1_874_992],palette:[0],runs:[4096,0]}]}).status,"applied"); +}); +test("lighting accepts the largest negotiated volume and still rejects larger allocations", () => { + const bounds={min:[0,0,0],max:[303,79,303]}; + const columns=new Map(); + for(let x=0;x<19;x++)for(let z=0;z<19;z++)columns.set(`${x},${z}`,new Int16Array(256).fill(100)); + const field=buildBlockLight(new SectionVoxelMap(),new Map(),bounds,columns); + assert.equal(field.data.length,MAX_LIGHT_CELLS*4);assert.equal(field.sample([130,50,130]).skyLevel,0); + assert.throws(()=>buildBlockLight(new Map(),new Map(),{min:[0,0,0],max:[304,80,304]}),RangeError); +}); + +test('buffered views fit the allocation bound while preserving the requested render distance',()=>{ + const view={world:'test',revision:7,viewGeneration:0,blocks:new SectionVoxelMap(),loadedSections:new Set()}; + const expanded={...message(9,1),view_distance:8,stream_radius:9}; + assert.deepEqual(applySectionView(view,expanded),{unload:[]}); + assert.equal(view.totalSections,1805);assert.equal(viewDistanceProfile(8).streamSections,8664); + assert.equal(applySectionView(view,message(66,2)),'resync'); +}); + +test('64 chunk radius accepts the outer buffer without allocating a giant light volume',()=>{ + const view={world:'test',revision:7,viewGeneration:0,blocks:new SectionVoxelMap(),loadedSections:new Set()}; + assert.deepEqual(applySectionView(view,{...message(65,1),view_distance:64,stream_radius:65}),{unload:[]}); + assert.equal(view.totalSections,85805); + assert.equal(applySectionBatch(view,{world:'test',revision:7,generation:1,sections:[ + {section:[64,4,-64],palette:[5],runs:[4096,0]}, + {section:[65,4,65],palette:[0],runs:[4096,0]}, + ]}).status,'applied'); + assert.equal(view.blocks.getAt(1024,64,-1024),5); + assert.equal(view.blocks.byteLength,8); + const bounds=actorLightBounds(view.viewBounds); + assert.equal((bounds.max[0]-bounds.min[0]+1)*(bounds.max[2]-bounds.min[2]+1),112**2); + assert.ok(112**2*80{ + const view={world:'test',revision:7,viewGeneration:0,blocks:new SectionVoxelMap(),loadedSections:new Set()}; + const full={...message(65,1),full_height:true,view_min:[-1040,-64,-1040],view_max:[1055,319,1055],total_sections:411864}; + assert.deepEqual(applySectionView(view,full),{unload:[]}); + const sections=[{section:[0,-4,0],palette:[1],runs:[4096,0]}, {section:[0,19,0],palette:[2],runs:[4096,0]}]; + assert.equal(applySectionBatch(view,{world:'test',revision:7,generation:1,sections}).status,'applied'); + assert.deepEqual(applySectionView(view,{...full,generation:2,view_center:[0,512,0]}),{unload:[]}); + assert.equal(view.blocks.getAt(0,-64,0),1);assert.equal(view.blocks.getAt(0,319,0),2); + assert.equal(view.totalSections,411864);assert.equal(view.viewBounds.fullHeight,true); + assert.equal(applySectionView(view,{...full,generation:3,view_min:[-1040,-48,-1040]}),'resync'); +}); diff --git a/client/tests/world-view.test.js b/client/tests/world-view.test.js new file mode 100644 index 0000000..a765de8 --- /dev/null +++ b/client/tests/world-view.test.js @@ -0,0 +1,358 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { SectionBlockMap } from "../section-block-map.js"; +import { + getViewBounds, + mergeChunkUpdate, + mergeSnapshot, + positionInView, +} from "../world-view.js"; + +function view() { + return { + world: "lobby", + revision: 7, + viewCenter: [0, 0, 0], + viewBounds: { min: [-32, -16, -32], max: [31, 31, 31] }, + blocks: new Map([ + ["0,0,0", 1], + ["31,0,0", 2], + ["-32,0,0", 3], + ]), + }; +} + +function moveEast() { + const message = { + type: "chunks", + world: "lobby", + revision: 7, + from_center: [0, 0, 0], + view_center: [16, 0, 0], + view_min: [-16, -16, -32], + view_max: [47, 31, 31], + unload: [], + sections: [], + }; + for (const y of [-1, 0, 1]) + for (const z of [-2, -1, 0, 1]) { + message.unload.push([-2, y, z]); + message.sections.push({ section: [2, y, z], blocks: [] }); + } + message.sections.find((s) => s.section.join(",") === "2,0,0").blocks = [ + { pos: [32, 0, 0], block: 4 }, + ]; + return message; +} + +test("crossing a section boundary retains overlapping blocks and map identity", () => { + const current = view(), + blocks = current.blocks, + result = mergeChunkUpdate(current, moveEast()); + assert.equal(result.status, "applied"); + assert.equal(current.blocks, blocks); + assert.equal(current.revision, 7); + assert.deepEqual(current.viewCenter, [16, 0, 0]); + assert.deepEqual( + [...current.blocks], + [ + ["0,0,0", 1], + ["31,0,0", 2], + ["32,0,0", 4], + ], + ); + assert.deepEqual(result.changes, [ + { pos: [-32, 0, 0], block: 0 }, + { pos: [32, 0, 0], block: 4 }, + ]); +}); + +test("an empty incoming section clears any stale block without touching overlap", () => { + const current = view(); + current.blocks.set("32,0,16", 99); + const result = mergeChunkUpdate(current, moveEast()); + assert.equal(result.status, "applied"); + assert.equal(current.blocks.has("32,0,16"), false); + assert.ok( + result.changes.some( + (change) => change.pos.join(",") === "32,0,16" && !change.block, + ), + ); + assert.equal(current.blocks.get("0,0,0"), 1); +}); + +test("negative coordinates use floor division when loading and unloading sections", () => { + const current = view(), + message = moveEast(); + current.viewCenter = [-16, 0, 0]; + current.blocks = new Map([ + ["-1,0,0", 1], + ["0,0,0", 2], + ["-48,0,0", 3], + ]); + message.from_center = [-16, 0, 0]; + message.view_center = [-32, 0, 0]; + message.view_min = [-64, -16, -32]; + message.view_max = [-1, 31, 31]; + message.unload = message.unload.map(([, y, z]) => [0, y, z]); + message.sections = message.sections.map(({ section: [, y, z] }) => ({ + section: [-4, y, z], + blocks: y === 0 && z === 0 ? [{ pos: [-49, 0, 0], block: 4 }] : [], + })); + const result = mergeChunkUpdate(current, message); + assert.equal(result.status, "applied"); + assert.deepEqual( + [...current.blocks], + [ + ["-1,0,0", 1], + ["-48,0,0", 3], + ["-49,0,0", 4], + ], + ); +}); + +test("same-world full snapshots only report actual changes and retain the map", () => { + const current = view(), + blocks = current.blocks, + records = [...blocks].map(([id, block]) => ({ + pos: id.split(",").map(Number), + block, + })); + assert.deepEqual(mergeSnapshot(blocks, records), []); + assert.equal(current.blocks, blocks); + records.pop(); + records.push({ pos: [32, 0, 0], block: 4 }); + assert.deepEqual(mergeSnapshot(blocks, records), [ + { pos: [-32, 0, 0], block: 0 }, + { pos: [32, 0, 0], block: 4 }, + ]); + assert.equal(blocks.get("0,0,0"), 1); +}); + +test("newer or older chunk revisions request resync without advancing revision", () => { + for (const revision of [6, 8]) { + const current = view(), + before = structuredClone(current), + message = { ...moveEast(), revision }; + assert.equal(mergeChunkUpdate(current, message).status, "resync"); + assert.deepEqual(current, before); + } +}); + +test("an out-of-order or duplicate transition cannot overwrite the current window", () => { + const current = view(), + message = moveEast(); + assert.equal(mergeChunkUpdate(current, message).status, "applied"); + const before = structuredClone(current); + assert.equal(mergeChunkUpdate(current, message).status, "resync"); + assert.deepEqual(current, before); + assert.equal( + mergeChunkUpdate(current, { ...message, world: "other" }).status, + "ignored", + ); + assert.deepEqual(current, before); +}); + +test("incomplete or malformed transitions do not partially unload a live world", () => { + const invalidMessages = [ + (m) => m.sections.pop(), + (m) => m.unload.pop(), + (m) => m.unload.push([0, 0, 0]), + (m) => (m.view_min[1] = -8), + (m) => m.sections[0].blocks.push({ pos: [0, 0, 0], block: 5 }), + (m) => m.sections[0].blocks.push({ pos: [32, -16, -32], block: -1 }), + ]; + for (const invalidate of invalidMessages) { + const current = view(), + before = structuredClone(current), + message = moveEast(); + invalidate(message); + assert.equal(mergeChunkUpdate(current, message).status, "resync"); + assert.deepEqual(current, before); + } +}); + +test("explicit view bounds include the entire bottom section with legacy fallback", () => { + const streamed = getViewBounds(moveEast()), + legacy = getViewBounds({ view_center: [16, 0, 0] }); + assert.equal(positionInView([0, -16, 0], streamed), true); + assert.equal(positionInView([0, -17, 0], streamed), false); + assert.equal(positionInView([0, -16, 0], legacy), false); + assert.equal(positionInView([0, -8, 0], legacy), true); + assert.equal(positionInView([48, 0, 0], streamed), false); +}); + +test("indexed transitions never iterate or read retained blocks", () => { + class IndexedBlocks extends SectionBlockMap { + [Symbol.iterator]() { + throw Error("A chunk transition must not scan the complete map"); + } + get(key) { + assert.ok(!["0,0,0", "31,0,0"].includes(key), "Retained block was read"); + return super.get(key); + } + } + const current = view(); + current.blocks = new IndexedBlocks(current.blocks); + current.blocks.set("-31,0,0", 8); + current.blocks.set("32,0,16", 99); + current.blocks.set("32,0,0", 3); + const result = mergeChunkUpdate(current, moveEast()); + assert.equal(result.status, "applied"); + assert.deepEqual( + [...current.blocks.entries()], + [ + ["0,0,0", 1], + ["31,0,0", 2], + ["32,0,0", 4], + ], + ); + assert.deepEqual([...current.blocks.loadedSectionKeys()].sort(), [ + "0,0,0", + "1,0,0", + "2,0,0", + ]); + assert.deepEqual( + result.changes.map(({ pos, block }) => [pos.join(","), block]).sort(), + [ + ["-31,0,0", 0], + ["-32,0,0", 0], + ["32,0,0", 4], + ["32,0,16", 0], + ], + ); +}); + +test("malformed transitions preserve the section index before any indexed access", () => { + class IndexedBlocks extends SectionBlockMap { + keysInSection() { + throw Error("Incomplete transition accessed the index"); + } + } + const current = view(); + current.blocks = new IndexedBlocks(current.blocks); + const beforeBlocks = [...current.blocks], + beforeSections = [...current.blocks.loadedSectionKeys()], + beforeCenter = current.viewCenter, + beforeBounds = current.viewBounds, + message = moveEast(); + message.sections.at(-1).blocks.push({ pos: [32, 16, 16], block: -1 }); + assert.equal(mergeChunkUpdate(current, message).status, "resync"); + assert.deepEqual([...current.blocks], beforeBlocks); + assert.deepEqual([...current.blocks.loadedSectionKeys()], beforeSections); + assert.equal(current.viewCenter, beforeCenter); + assert.equal(current.viewBounds, beforeBounds); +}); + +test("full snapshot merges maintain the section index alongside the block map", () => { + const blocks = new SectionBlockMap(view().blocks); + mergeSnapshot(blocks, [ + { pos: [0, 0, 0], block: 1 }, + { pos: [32, -1, 0], block: 4 }, + ]); + assert.deepEqual([...blocks.loadedSectionKeys()], ["0,0,0", "2,-1,0"]); + assert.deepEqual([...blocks.keysInSection("-2,0,0")], []); + assert.deepEqual([...blocks.keysInSection("2,-1,0")], ["32,-1,0"]); +}); + +test("optional section unloads omit only departing changes for indexed and ordinary maps", () => { + for (const BlockMap of [Map, SectionBlockMap]) { + const current = view(); + current.blocks = new BlockMap(current.blocks); + current.blocks.set("32,0,16", 99); + const result = mergeChunkUpdate(current, moveEast(), { + includeUnloadedChanges: false, + }); + assert.equal(result.status, "applied"); + assert.equal(current.blocks.has("-32,0,0"), false); + assert.deepEqual(result.changes, [ + { pos: [32, 0, 16], block: 0 }, + { pos: [32, 0, 0], block: 4 }, + ]); + assert.deepEqual( + [...current.blocks], + [ + ["0,0,0", 1], + ["31,0,0", 2], + ["32,0,0", 4], + ], + ); + } +}); + +test("bulk streamed merges avoid departing key access and use validated sections for insertion", () => { + class BulkBlocks extends SectionBlockMap { + set(key, value) { + assert.equal( + this.locked, + undefined, + "Incoming records reparsed through ordinary set", + ); + return super.set(key, value); + } + delete() { + throw Error("Departing blocks were deleted individually"); + } + keysInSection(section) { + assert.ok( + !section.startsWith("-2,"), + "Departing block keys were requested", + ); + return super.keysInSection(section); + } + [Symbol.iterator]() { + throw Error("Streamed merge scanned the full map"); + } + } + const current = view(), + message = moveEast(); + current.blocks = new BulkBlocks(current.blocks); + current.blocks.locked = true; + const result = mergeChunkUpdate(current, message, { + includeUnloadedChanges: false, + }); + assert.equal(result.status, "applied"); + assert.equal(current.blocks.has("-32,0,0"), false); + assert.equal(current.blocks.get("32,0,0"), 4); + assert.deepEqual(result.changes, [{ pos: [32, 0, 0], block: 4 }]); + assert.deepEqual( + [...current.blocks.loadedSectionKeys()], + ["0,0,0", "1,0,0", "2,0,0"], + ); +}); + +test("bulk merges still validate all incoming records before deleting any section", () => { + for (const invalidRecord of [ + { pos: [32, 16, 16], block: -1 }, + { pos: [31, 16, 16], block: 4 }, + { pos: [32, 16.5, 16], block: 4 }, + ]) { + const current = view(), + message = moveEast(); + current.blocks = new SectionBlockMap(current.blocks); + const before = [...current.blocks], + sectionsBefore = [...current.blocks.loadedSectionKeys()], + centerBefore = current.viewCenter; + message.sections.at(-1).blocks.push(invalidRecord); + assert.equal( + mergeChunkUpdate(current, message, { includeUnloadedChanges: false }) + .status, + "resync", + ); + assert.deepEqual([...current.blocks], before); + assert.deepEqual([...current.blocks.loadedSectionKeys()], sectionsBefore); + assert.equal(current.viewCenter, centerBefore); + } + const current = view(), + message = moveEast(); + current.blocks = new SectionBlockMap(current.blocks); + message.sections + .find((s) => s.section.join(",") === "2,0,0") + .blocks.push({ pos: [32, 0, 0], block: 0 }); + assert.equal( + mergeChunkUpdate(current, message, { includeUnloadedChanges: false }) + .status, + "resync", + ); + assert.equal(current.blocks.get("-32,0,0"), 3); +}); diff --git a/client/texture-pack.js b/client/texture-pack.js new file mode 100644 index 0000000..a282e64 --- /dev/null +++ b/client/texture-pack.js @@ -0,0 +1,70 @@ +// Declarative data only: the same resolved map is structured-cloned to mesh workers. +export const BLOCK_FACES = "@block_faces"; + +/** An edit job only needs face definitions for the materials in its neighborhood. */ +export function textureSubset(layers, materials) { + const mapping = layers.get(BLOCK_FACES); + if (!mapping) return layers; + const result = new Map(layers), sets = [], states = {}, defaults = {}, indices = new Map(); + const include = old => { + if (!Number.isInteger(old)) return undefined; + if (!indices.has(old)) { indices.set(old, sets.length); sets.push(mapping.sets[old]); } + return indices.get(old); + }; + for (const {state} of materials.values()) { + if (typeof state !== "string") continue; + const base = state.split("[")[0]; + if (Object.hasOwn(mapping.states, state)) states[state] = include(mapping.states[state]); + if (Object.hasOwn(mapping.defaults, base)) defaults[base] = include(mapping.defaults[base]); + } + result.set(BLOCK_FACES, {sets, states, defaults}); + return result; +} + +export function prepareTexturePack(descriptor, files, limits) { + const size = descriptor?.pixel_size, entries = descriptor?.textures, atlas = descriptor?.atlas; + if (!Number.isInteger(size) || size < 1 || size > 128 || !Array.isArray(entries) || !entries.length || + entries.length > (atlas ? 16384 : Math.min(256, limits.layers))) + throw Error("Некорректный размер текстурпака."); + let width = size, height = size; + if (atlas) { + if (![atlas.columns, atlas.rows].every(v => Number.isInteger(v) && v > 0) || + atlas.columns * atlas.rows < entries.length || !files.has(atlas.path)) + throw Error("Некорректный атлас текстурпака."); + width *= atlas.columns; height *= atlas.rows; + if (width > limits.size || height > limits.size) throw Error("Атлас превышает лимит видеокарты."); + } + const layers = new Map(); + for (const entry of entries) { + if (!entry || typeof entry.name !== "string" || !/^[a-z0-9_]+$/.test(entry.name) || layers.has(entry.name) || !atlas && !files.has(entry.path)) + throw Error("Некорректный ресурс текстурпака."); + layers.set(entry.name, layers.size); + } + const mapping = descriptor.block_faces; + if (mapping) { + if (!Array.isArray(mapping.sets) || mapping.sets.length > 65536 || !mapping.states || !mapping.defaults || + Object.keys(mapping.states).length > 100000) throw Error("Некорректная таблица граней."); + const sets = mapping.sets.map(faces => { + if (!Array.isArray(faces) || faces.length !== 6) throw Error("Ожидалось шесть граней."); + return faces.map(face => { + if (face === null) return null; + const tint = face.tint ?? [1, 1, 1], uv = face.uv; + if (!layers.has(face.texture) || !Array.isArray(tint) || tint.length !== 3 || + !tint.every(v => Number.isFinite(v) && v >= 0 && v <= 1) || + uv !== undefined && (!Array.isArray(uv) || uv.length !== 8 || !uv.every(v => Number.isFinite(v) && Math.abs(v) <= 256))) + throw Error("Некорректная текстура грани."); + return {layer: layers.get(face.texture), tint, cutout: face.cutout === true, ...(uv ? {uv} : {})}; + }); + }); + for (const table of [mapping.states, mapping.defaults]) + for (const [state, index] of Object.entries(table)) + if (state.length > 1024 || !Number.isInteger(index) || index < 0 || index >= sets.length) + throw Error("Некорректное состояние в таблице граней."); + layers.set(BLOCK_FACES, {sets, states: mapping.states, defaults: mapping.defaults}); + } + const overlay = descriptor.grass_overlay; + if (overlay && (!atlas || !layers.has(overlay.base) || !layers.has(overlay.overlay))) + throw Error("Некорректный слой травы."); + return {layers, width, height, atlas, size, entries, + grassOverlay: overlay ? [layers.get(overlay.base), layers.get(overlay.overlay)] : [-1, -1]}; +} diff --git a/client/view-distance.js b/client/view-distance.js new file mode 100644 index 0000000..a68f7fb --- /dev/null +++ b/client/view-distance.js @@ -0,0 +1,30 @@ +export const MIN_VIEW_DISTANCE = 2; +export const DEFAULT_VIEW_DISTANCE = 3; +export const MAX_VIEW_DISTANCE = 64; +export const WORLD_MIN_Y = -64; +export const WORLD_MAX_Y = 319; +export const VIEW_HEIGHT = WORLD_MAX_Y - WORLD_MIN_Y + 1; +export const VIEW_BUFFER = 1; +export const MAX_VIEW_WIDTH = ((MAX_VIEW_DISTANCE + VIEW_BUFFER) * 2 + 1) * 16; +export const MAX_VIEW_CELLS = MAX_VIEW_WIDTH ** 2 * VIEW_HEIGHT; +// Lighting uses local windows; raising render distance must not allocate a +// multi-gigabyte dense light volume. +export const MAX_LIGHT_CELLS = 304 ** 2 * 80; +export const MAX_VIEW_COORDINATE = 30_000_000 + (MAX_VIEW_DISTANCE + VIEW_BUFFER) * 16; + +export function normalizeViewDistance(value) { + const distance = Number(value); + return Number.isInteger(distance) && distance >= MIN_VIEW_DISTANCE && distance <= MAX_VIEW_DISTANCE + ? distance : DEFAULT_VIEW_DISTANCE; +} + +export function viewDistanceProfile(value) { + const chunks = normalizeViewDistance(value), width = (chunks * 2 + 1) * 16; + const drawRadius = Math.SQRT2 * chunks * 16 + 24; + const verticalSections = VIEW_HEIGHT / 16; + return { chunks, radius: chunks * 16, width, sections: (chunks * 2 + 1) ** 2 * verticalSections, + voxelBytes: width * width * VIEW_HEIGHT * 4, + streamWidth: width + VIEW_BUFFER * 32, streamSections: (chunks * 2 + 1 + VIEW_BUFFER * 2) ** 2 * verticalSections, + streamVoxelBytes: (width + VIEW_BUFFER * 32) ** 2 * VIEW_HEIGHT * 4, drawRadius, + farClip: Math.max(190, drawRadius + 60), fogDistance: 78 * chunks / DEFAULT_VIEW_DISTANCE }; +} diff --git a/client/world-view.js b/client/world-view.js new file mode 100644 index 0000000..403af6b --- /dev/null +++ b/client/world-view.js @@ -0,0 +1,206 @@ +import { WORLD_MIN_Y, WORLD_MAX_Y } from './view-distance.js'; +const positionKey = (pos) => pos.join(","); +const integerPosition = (pos) => + Array.isArray(pos) && pos.length === 3 && pos.every(Number.isSafeInteger); +const samePosition = (a, b) => + integerPosition(a) && + integerPosition(b) && + a.every((value, i) => value === b[i]); +const sectionOf = (pos) => pos.map((value) => Math.floor(value / 16)); + +export function getViewBounds(message) { + const center = + message.view_center || + message.spawn?.map((value) => Math.floor(value / 16) * 16); + if (!integerPosition(center)) return null; + if (integerPosition(message.view_min) && integerPosition(message.view_max)) + return { min: [...message.view_min], max: [...message.view_max], + ...(message.full_height === true && message.view_min[1] === WORLD_MIN_Y && message.view_max[1] === WORLD_MAX_Y ? {fullHeight:true} : {}) }; + // Protocol 1 servers without chunk_stream_v1 use an unaligned vertical view. + return { + min: center.map((value, i) => value - (i === 1 ? 8 : 32)), + max: center.map((value) => value + 31), + }; +} + +export function positionInView(pos, bounds) { + return ( + !bounds || + pos.every((value, i) => value >= bounds.min[i] && value <= bounds.max[i]) + ); +} + +function recordMap(records) { + const result = new Map(); + for (const record of records) { + if ( + !integerPosition(record?.pos) || + !Number.isSafeInteger(record.block) || + record.block < 0 + ) + throw Error("Invalid block record"); + if (record.block) result.set(positionKey(record.pos), record.block); + } + return result; +} + +/** Update the existing map so unchanged blocks never trigger mesh rebuilds. */ +export function mergeSnapshot(blocks, records) { + const next = recordMap(records), + changes = []; + for (const [id] of blocks) { + if (!next.has(id)) { + blocks.delete(id); + changes.push({ pos: id.split(",").map(Number), block: 0 }); + } + } + for (const [id, block] of next) { + if (blocks.get(id) !== block) { + blocks.set(id, block); + changes.push({ pos: id.split(",").map(Number), block }); + } + } + return changes; +} + +function sectionWindow(center) { + const c = sectionOf(center), + sections = new Set(); + for (let x = c[0] - 2; x <= c[0] + 1; x++) + for (let y = c[1] - 1; y <= c[1] + 1; y++) + for (let z = c[2] - 2; z <= c[2] + 1; z++) + sections.add(positionKey([x, y, z])); + return sections; +} + +function alignedCenter(center) { + return integerPosition(center) && center.every((value) => value % 16 === 0); +} + +function* entriesInSections(blocks, sections) { + if (typeof blocks.keysInSection === "function") { + for (const section of sections) + for (const key of blocks.keysInSection(section)) + yield [key, blocks.get(key), section]; + } else { + for (const [key, block] of blocks) { + const section = positionKey(sectionOf(key.split(",").map(Number))); + if (sections.has(section)) yield [key, block, section]; + } + } +} + +/** + * Validate the complete transition before mutating blocks or view metadata. + * Consumers handling section unloads separately can omit their block-zero + * records; the departing blocks are still removed from the map. + */ +export function mergeChunkUpdate( + view, + message, + { includeUnloadedChanges = true } = {}, +) { + const invalid = { status: "resync", changes: [] }; + if (message.world !== view.world) return { status: "ignored", changes: [] }; + if ( + !Number.isSafeInteger(message.revision) || + message.revision !== view.revision || + !alignedCenter(view.viewCenter) || + !samePosition(message.from_center, view.viewCenter) || + !alignedCenter(message.view_center) || + !samePosition( + message.view_min, + message.view_center.map((value, i) => value - (i === 1 ? 16 : 32)), + ) || + !samePosition( + message.view_max, + message.view_center.map((value) => value + 31), + ) || + !Array.isArray(message.unload) || + !Array.isArray(message.sections) + ) + return invalid; + const previous = sectionWindow(view.viewCenter), + next = sectionWindow(message.view_center), + departing = new Set([...previous].filter((id) => !next.has(id))), + entering = new Set([...next].filter((id) => !previous.has(id))), + unloaded = new Set(), + received = new Set(), + replacement = new Map(); + for (const pos of message.unload) { + if (!integerPosition(pos)) return invalid; + const id = positionKey(pos); + if (!departing.has(id) || unloaded.has(id)) return invalid; + unloaded.add(id); + } + for (const section of message.sections) { + if (!integerPosition(section?.section) || !Array.isArray(section.blocks)) + return invalid; + const id = positionKey(section.section), + [sx, sy, sz] = section.section; + if (!entering.has(id) || received.has(id)) return invalid; + received.add(id); + for (const record of section.blocks) { + if ( + !integerPosition(record?.pos) || + Math.floor(record.pos[0] / 16) !== sx || + Math.floor(record.pos[1] / 16) !== sy || + Math.floor(record.pos[2] / 16) !== sz || + !Number.isSafeInteger(record.block) || + record.block < 0 + ) + return invalid; + const key = positionKey(record.pos); + if (replacement.has(key)) return invalid; + replacement.set(key, { + pos: record.pos, + block: record.block, + section: id, + }); + } + } + if (unloaded.size !== departing.size || received.size !== entering.size) + return invalid; + + const changes = [], + blocks = view.blocks, + bulkUnload = + typeof blocks.keysInSection === "function" && + typeof blocks.deleteSection === "function"; + if (bulkUnload) { + for (const section of departing) { + if (includeUnloadedChanges) + for (const key of blocks.keysInSection(section)) + if (blocks.get(key) !== 0) + changes.push({ pos: key.split(",").map(Number), block: 0 }); + blocks.deleteSection(section); + } + } + for (const [id, block, section] of entriesInSections( + blocks, + bulkUnload ? entering : new Set([...departing, ...entering]), + )) { + const record = replacement.get(id), + newBlock = record?.block || 0; + if (newBlock !== block) { + if (newBlock) blocks.set(id, newBlock); + else blocks.delete(id); + if (includeUnloadedChanges || !departing.has(section)) + changes.push({ + pos: record?.pos || id.split(",").map(Number), + block: newBlock, + }); + } + replacement.delete(id); + } + for (const [id, { pos, block, section }] of replacement) { + if (!block) continue; + if (typeof blocks.setInSection === "function") + blocks.setInSection(id, block, section); + else blocks.set(id, block); + changes.push({ pos, block }); + } + view.viewCenter = [...message.view_center]; + view.viewBounds = getViewBounds(message); + return { status: "applied", changes }; +} diff --git a/crates/shacraft-compat/src/anvil.rs b/crates/shacraft-compat/src/anvil.rs index 301ee85..f66800e 100644 --- a/crates/shacraft-compat/src/anvil.rs +++ b/crates/shacraft-compat/src/anvil.rs @@ -407,6 +407,21 @@ fn world_name(dimension: &str) -> String { } pub fn import_anvil(source: &Path, destination: &Path, mode: Mode) -> Result { + import_anvil_impl(source, destination, mode, false) +} + +/// Load source sections as an immutable baseline, without per-block edit history. +/// Subsequent edits remain journaled; resetting them restores the imported map. +pub fn import_anvil_baseline(source: &Path, destination: &Path, mode: Mode) -> Result { + import_anvil_impl(source, destination, mode, true) +} + +fn import_anvil_impl( + source: &Path, + destination: &Path, + mode: Mode, + baseline: bool, +) -> Result { let stage = io::stage(destination)?; ensure!( !stage @@ -475,6 +490,16 @@ pub fn import_anvil(source: &Path, destination: &Path, mode: Mode) -> Result>>()?; + if baseline { + let cells = Box::new(std::array::from_fn(|i| registry[indices[i]])); + let nonair = cells.iter().filter(|&&block| block != 0).count(); + report.nonair_blocks += nonair as u64; + report.sections += 1; + if nonair > 0 { + store.materialize_section(&world, [x, y, z], &cells)?; + } + continue; + } let mut changes = Vec::new(); for (index, pid) in indices.into_iter().enumerate() { let block = registry[pid]; @@ -512,6 +537,9 @@ pub fn import_anvil(source: &Path, destination: &Path, mode: Mode) -> Result Result<()> { source, destination, mode, - } => import_anvil(&source, &destination, mode)?, + baseline, + } => { + if baseline { + import_anvil_baseline(&source, &destination, mode)? + } else { + import_anvil(&source, &destination, mode)? + } + } Command::ExportAnvil { store, destination, diff --git a/crates/shacraft-compat/tests/roundtrip.rs b/crates/shacraft-compat/tests/roundtrip.rs index 46c3eb2..2747b4c 100644 --- a/crates/shacraft-compat/tests/roundtrip.rs +++ b/crates/shacraft-compat/tests/roundtrip.rs @@ -1,5 +1,5 @@ use shacraft_compat::{ - Mode, export_anvil, export_schem, import_anvil, import_schem, + Mode, export_anvil, export_schem, import_anvil, import_anvil_baseline, import_schem, nbt::{self, Tag}, }; use shacraft_core::{BlockChange, WorldStore}; @@ -151,6 +151,56 @@ fn genuine_java_world_import_exact_roundtrip_edit_and_new_chunk() { assert_eq!(store.registry()[id as usize], "minecraft:stone"); } +#[test] +fn anvil_baseline_preserves_roundtrip_edits_snapshots_and_reset() { + let t = tempfile::tempdir().unwrap(); + let path = t.path().join("baseline"); + let source = fixture("java26_2-world"); + let report = import_anvil_baseline(&source, &path, Mode::Exact).unwrap(); + assert_eq!(report.nonair_blocks, 3); + assert_eq!(report.worlds["main"], 0); + let exact = t.path().join("exact"); + export_anvil(&path, None, &exact, Mode::Exact).unwrap(); + assert_tree_equal(&source, &exact); + let db = rusqlite::Connection::open(path.join("worlds.sqlite3")).unwrap(); + let history: i64 = db + .query_row("SELECT count(*) FROM operation_changes", [], |r| r.get(0)) + .unwrap(); + assert_eq!(history, 0); + drop(db); + let mut store = WorldStore::open(&path, 2).unwrap(); + let pos = [-1, -1, 31]; + let original = store.get_block("main", pos).unwrap(); + assert_ne!(original, 0); + store + .edit("main", 0, "remove", vec![BlockChange { pos, block: 0 }]) + .unwrap(); + drop(store); + assert!(export_anvil(&path, None, &t.path().join("rejected"), Mode::Exact).is_err()); + let edited = t.path().join("edited"); + export_anvil(&path, None, &edited, Mode::BestEffort).unwrap(); + let reimport = t.path().join("reimport"); + import_anvil_baseline(&edited, &reimport, Mode::Exact).unwrap(); + assert_eq!( + WorldStore::open(&reimport, 2) + .unwrap() + .get_block("main", pos) + .unwrap(), + 0 + ); + let mut store = WorldStore::open(&path, 2).unwrap(); + store.reset_world("main", 1, "reset").unwrap(); + assert_eq!(store.get_block("main", pos).unwrap(), original); + store.create_world("playable", Some("main")).unwrap(); + assert_eq!(store.get_block("playable", pos).unwrap(), original); + assert!( + store + .read_section("playable", [-1, -1, 1]) + .unwrap() + .is_some() + ); +} + #[test] fn native_new_world_export_and_schematic() { let t = tempfile::tempdir().unwrap(); diff --git a/crates/shacraft-core/src/database.rs b/crates/shacraft-core/src/database.rs index e159e02..6697825 100644 --- a/crates/shacraft-core/src/database.rs +++ b/crates/shacraft-core/src/database.rs @@ -111,6 +111,16 @@ pub(crate) fn configure(conn: &mut Connection) -> Result<()> { tx.pragma_update(None, "user_version", SCHEMA_VERSION)?; tx.commit().context("storage_commit: initialize schema")?; } + // Additive v1 extension: immutable natural terrain underneath edit overlays. + conn.execute_batch( + "CREATE TABLE IF NOT EXISTS generated_sections ( + world_id INTEGER NOT NULL REFERENCES worlds(id), + x INTEGER NOT NULL, y INTEGER NOT NULL, z INTEGER NOT NULL, + blob_id INTEGER NOT NULL REFERENCES blobs(id), + PRIMARY KEY(world_id,x,y,z) + ) WITHOUT ROWID; + CREATE INDEX IF NOT EXISTS generated_blob_idx ON generated_sections(blob_id);", + )?; let check: String = conn.query_row("PRAGMA quick_check(1)", [], |row| row.get(0))?; if check != "ok" { bail!("storage_corrupt: {check}"); diff --git a/crates/shacraft-core/src/store.rs b/crates/shacraft-core/src/store.rs index 2893dd5..960f389 100644 --- a/crates/shacraft-core/src/store.rs +++ b/crates/shacraft-core/src/store.rs @@ -162,9 +162,14 @@ impl WorldStore { params![world.id, world.revision], )?; let id = tx.last_insert_rowid(); + tx.execute( + "INSERT INTO snapshot_sections(snapshot_id,x,y,z,blob_id) + SELECT ?1,x,y,z,blob_id FROM generated_sections WHERE world_id=?2", + params![id, world.id], + )?; if let Some(base) = world.base { tx.execute( - "INSERT INTO snapshot_sections(snapshot_id,x,y,z,blob_id) + "INSERT OR REPLACE INTO snapshot_sections(snapshot_id,x,y,z,blob_id) SELECT ?1,x,y,z,blob_id FROM snapshot_sections WHERE snapshot_id=?2", params![id, base], )?; @@ -246,6 +251,51 @@ impl WorldStore { result } + /// Read a complete stored section, including explicit all-air overrides. + /// None means no durable data exists; a procedural host may generate it. + pub fn read_section(&mut self, name: &str, pos: Pos) -> Result>> { + validate_world_name(name)?; + validate_section_pos(pos)?; + let world = lookup_world(&self.conn, name)?; + effective_blob(&self.conn, world, pos)? + .map(|id| load_decoded(&self.conn, &mut self.cache, self.registry.len(), id)) + .transpose() + } + + /// Persist the immutable procedural baseline before its first edit. This + /// materializes already-existing natural terrain and does not advance the + /// edit revision. A repeated call never overwrites a baseline or overlay. + pub fn materialize_section( + &mut self, + name: &str, + pos: Pos, + cells: &[u32; 4096], + ) -> Result { + validate_world_name(name)?; + validate_section_pos(pos)?; + ensure!( + cells.iter().all(|id| (*id as usize) < self.registry.len()), + "unknown_block in generated section" + ); + let started = Instant::now(); + let tx = self + .conn + .transaction_with_behavior(TransactionBehavior::Immediate)?; + let world = lookup_world(&tx, name)?; + if effective_blob(&tx, world, pos)?.is_some() { + return Ok(false); + } + let blob = intern_blob(&tx, cells)?; + let [x, y, z] = pos; + tx.execute( + "INSERT INTO generated_sections(world_id,x,y,z,blob_id) VALUES(?1,?2,?3,?4,?5)", + params![world.id, x, y, z, blob], + )?; + tx.commit().context("storage_commit: materialize_section")?; + self.record_commit(started); + Ok(true) + } + pub fn edit( &mut self, name: &str, @@ -530,6 +580,7 @@ impl WorldStore { "WITH section_keys AS ( SELECT x,y,z FROM world_sections WHERE world_id=?1 UNION SELECT x,y,z FROM snapshot_sections WHERE snapshot_id=?2 + UNION SELECT x,y,z FROM generated_sections WHERE world_id=?1 ) SELECT x,y,z FROM section_keys WHERE (?3 IS NULL OR (x,y,z) > (?3,?4,?5)) ORDER BY x,y,z LIMIT ?6", @@ -579,6 +630,7 @@ impl WorldStore { SELECT b.id FROM blobs b WHERE NOT EXISTS(SELECT 1 FROM world_sections w WHERE w.blob_id=b.id) AND NOT EXISTS(SELECT 1 FROM snapshot_sections s WHERE s.blob_id=b.id) + AND NOT EXISTS(SELECT 1 FROM generated_sections g WHERE g.blob_id=b.id) LIMIT ?1)", [max_blobs as i64], )?; @@ -630,6 +682,7 @@ impl WorldStore { "snapshot_count": count("snapshots"), "immutable_blob_count": count("blobs"), "overlay_section_count": count("world_sections"), + "materialized_natural_sections": count("generated_sections"), "operation_count": count("operations"), "history_change_count": count("operation_changes"), "database_bytes": file_size("worlds.sqlite3"), @@ -749,6 +802,18 @@ fn canonical_state(state: &str) -> Result { } } +fn validate_section_pos(pos: Pos) -> Result<()> { + for axis in pos { + let min = axis.checked_mul(16).context("invalid section coordinate")?; + let max = min.checked_add(15).context("invalid section coordinate")?; + ensure!( + min >= -COORD_LIMIT && max <= COORD_LIMIT, + "section outside coordinate limits" + ); + } + Ok(()) +} + fn locate(pos: Pos) -> (SectionPos, usize) { let section = pos.map(|v| v.div_euclid(16)); let [x, y, z] = pos.map(|v| v.rem_euclid(16) as usize); @@ -798,6 +863,23 @@ fn base_blob(conn: &Connection, base: Option, [x, y, z]: SectionPos) -> Res } } +fn natural_blob( + conn: &Connection, + world: World, + pos @ [x, y, z]: SectionPos, +) -> Result> { + if let Some(id) = base_blob(conn, world.base, pos)? { + return Ok(Some(id)); + } + Ok(conn + .query_row( + "SELECT blob_id FROM generated_sections WHERE world_id=?1 AND x=?2 AND y=?3 AND z=?4", + params![world.id, x, y, z], + |r| r.get(0), + ) + .optional()?) +} + fn effective_blob( conn: &Connection, world: World, @@ -812,7 +894,7 @@ fn effective_blob( .optional()?; match own { Some(id) => Ok(Some(id)), - None => base_blob(conn, world.base, pos), + None => natural_blob(conn, world, pos), } } @@ -959,7 +1041,7 @@ fn apply_changes( if !section_changed { continue; } - let baseline = if let Some(id) = base_blob(tx, world.base, pos)? { + let baseline = if let Some(id) = natural_blob(tx, world, pos)? { load_decoded(tx, cache, registry_len, id)? } else { Box::new([0; CELL_COUNT]) diff --git a/crates/shacraft-core/tests/generated.rs b/crates/shacraft-core/tests/generated.rs new file mode 100644 index 0000000..971cab6 --- /dev/null +++ b/crates/shacraft-core/tests/generated.rs @@ -0,0 +1,78 @@ +use shacraft_core::{BlockChange, WorldStore}; +#[test] +fn procedural_baseline_preserves_deletion_undo_reset_clone_and_restart() { + let dir = tempfile::tempdir().unwrap(); + let stone; + { + let mut store = WorldStore::open(dir.path(), 2).unwrap(); + stone = store.register_block("minecraft:stone").unwrap(); + store.create_world("natural", None).unwrap(); + let cells = [stone; 4096]; + assert!( + store + .materialize_section("natural", [-1, -4, 1], &cells) + .unwrap() + ); + assert_eq!(store.revision("natural").unwrap(), 0); + assert!( + !store + .materialize_section("natural", [-1, -4, 1], &[0; 4096]) + .unwrap() + ); + let pos = [-1, -64, 16]; + assert_eq!(store.get_block("natural", pos).unwrap(), stone); + store + .edit("natural", 0, "mine", vec![BlockChange { pos, block: 0 }]) + .unwrap(); + assert_eq!(store.get_block("natural", pos).unwrap(), 0); + store.create_world("copy", Some("natural")).unwrap(); + assert_eq!(store.get_block("copy", pos).unwrap(), 0); + assert_eq!(store.get_block("copy", [-2, -64, 16]).unwrap(), stone); + store.undo("natural", 1, "undo", "mine").unwrap(); + assert_eq!(store.get_block("natural", pos).unwrap(), stone); + store + .edit( + "natural", + 2, + "mine-again", + vec![BlockChange { pos, block: 0 }], + ) + .unwrap(); + store.reset_world("natural", 3, "reset").unwrap(); + assert_eq!(store.get_block("natural", pos).unwrap(), stone); + assert_eq!(store.get_block("copy", pos).unwrap(), 0); + store.collect_garbage(100).unwrap(); + } + let mut store = WorldStore::open(dir.path(), 2).unwrap(); + assert_eq!(store.get_block("natural", [-1, -64, 16]).unwrap(), stone); + assert_eq!(store.get_block("copy", [-1, -64, 16]).unwrap(), 0); + assert!(store.read_section("copy", [-1, -4, 1]).unwrap().is_some()); + assert_eq!( + store.section_positions("natural", None, 16).unwrap(), + vec![[-1, -4, 1]] + ); +} +#[test] +fn generated_input_is_checked_before_mutation_and_air_is_explicit() { + let dir = tempfile::tempdir().unwrap(); + let mut store = WorldStore::open(dir.path(), 1).unwrap(); + store.create_world("natural", None).unwrap(); + assert!( + store + .materialize_section("natural", [i32::MAX, 0, 0], &[0; 4096]) + .is_err() + ); + assert!( + store + .materialize_section("natural", [0, 0, 0], &[u32::MAX; 4096]) + .is_err() + ); + assert!(store.read_section("natural", [0, 0, 0]).unwrap().is_none()); + store + .materialize_section("natural", [0, 0, 0], &[0; 4096]) + .unwrap(); + assert_eq!( + *store.read_section("natural", [0, 0, 0]).unwrap().unwrap(), + [0; 4096] + ); +} diff --git a/crates/shacraft-physics/Cargo.toml b/crates/shacraft-physics/Cargo.toml new file mode 100644 index 0000000..3271dcd --- /dev/null +++ b/crates/shacraft-physics/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "shacraft-physics" +version.workspace = true +edition.workspace = true +license.workspace = true + +[lib] +crate-type = ["rlib", "cdylib"] + +[dependencies] +serde.workspace = true +serde_json.workspace = true diff --git a/crates/shacraft-physics/src/lib.rs b/crates/shacraft-physics/src/lib.rs new file mode 100644 index 0000000..c390d42 --- /dev/null +++ b/crates/shacraft-physics/src/lib.rs @@ -0,0 +1,1222 @@ +//! Shared, fixed-tick player locomotion for the server and browser. +//! +//! Distances are blocks, velocities are blocks per 50 ms tick, and angles are +//! radians in Shacraft's coordinate system (yaw zero faces negative Z). This is +//! an independent implementation; its tuning targets Minecraft Java 26.2. +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +const EPSILON: f64 = 1.0e-7; +const WIDTH: f64 = 0.6000000238418579; +const GRAVITY: f64 = 0.08; +const AIR_DRAG: f64 = 0.9800000190734863; +const HORIZONTAL_DRAG: f64 = 0.9100000262260437; +const INPUT_SCALE: f64 = 0.9800000190734863; + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum Pose { + #[default] + Standing, + Crouching, + Swimming, +} +impl Pose { + pub fn height(self) -> f64 { + match self { + Self::Standing => 1.7999999523162842, + Self::Crouching => 1.5, + Self::Swimming => 0.6000000238418579, + } + } + pub fn eye_height(self) -> f64 { + match self { + Self::Standing => 1.6200000047683716, + Self::Crouching => 1.2699999809265137, + Self::Swimming => 0.4000000059604645, + } + } +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct PhysicsBody { + pub position: [f64; 3], + pub velocity: [f64; 3], + pub on_ground: bool, + pub pose: Pose, + pub sprinting: bool, + pub flying: bool, + pub in_water: bool, + pub in_lava: bool, + pub on_climbable: bool, + pub horizontal_collision: bool, + pub vertical_collision: bool, + pub fall_distance: f64, + pub jump_cooldown: u8, + pub swimming: bool, + pub submerged: bool, +} +impl PhysicsBody { + pub fn height(&self) -> f64 { + self.pose.height() + } + pub fn width(&self) -> f64 { + WIDTH + } + pub fn eye_height(&self) -> f64 { + self.pose.eye_height() + } + fn bounds(&self) -> Aabb { + Aabb::body(self.position, self.height()) + } +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct Controls { + pub forward: f64, + pub strafe: f64, + pub yaw: f64, + pub pitch: f64, + pub jump: bool, + pub sprint: bool, + pub sneak: bool, + pub fly_toggle: bool, +} + +#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct Aabb { + pub min: [f64; 3], + pub max: [f64; 3], +} +impl Aabb { + pub fn new(min: [f64; 3], max: [f64; 3]) -> Self { + Self { min, max } + } + pub fn unit() -> Self { + Self::new([0.; 3], [1.; 3]) + } + fn body(position: [f64; 3], height: f64) -> Self { + Self { + min: [ + position[0] - WIDTH / 2., + position[1], + position[2] - WIDTH / 2., + ], + max: [ + position[0] + WIDTH / 2., + position[1] + height, + position[2] + WIDTH / 2., + ], + } + } + fn translated(self, offset: [f64; 3]) -> Self { + Self { + min: std::array::from_fn(|i| self.min[i] + offset[i]), + max: std::array::from_fn(|i| self.max[i] + offset[i]), + } + } + fn intersects(&self, other: &Self) -> bool { + (0..3).all(|i| self.max[i] > other.min[i] + EPSILON && self.min[i] < other.max[i] - EPSILON) + } + fn expanded(self, movement: [f64; 3]) -> Self { + Self { + min: std::array::from_fn(|i| self.min[i] + movement[i].min(0.)), + max: std::array::from_fn(|i| self.max[i] + movement[i].max(0.)), + } + } + fn deflated(self, amount: f64) -> Self { + Self { + min: self.min.map(|v| v + amount), + max: self.max.map(|v| v - amount), + } + } +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct CollisionBlock { + pub pos: [i32; 3], + pub state: String, + pub collision: Vec, +} +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct PhysicsWorld { + pub blocks: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(default)] +pub struct PhysicsSettings { + pub allow_flight: bool, + pub frozen: bool, + pub movement_speed: f64, + pub flight_speed: f64, + pub step_height: f64, + pub jump_impulse: Option, + pub speed_level: u8, + pub slowness_level: u8, + pub jump_boost_level: u8, + pub levitation_level: u8, + pub slow_falling: bool, + pub dolphins_grace: bool, + pub depth_strider: u8, + pub leather_boots: bool, +} +impl Default for PhysicsSettings { + fn default() -> Self { + Self { + allow_flight: false, + frozen: false, + movement_speed: 0.10000000149011612, + flight_speed: 0.05000000074505806, + step_height: 0.6000000238418579, + jump_impulse: None, + speed_level: 0, + slowness_level: 0, + jump_boost_level: 0, + levitation_level: 0, + slow_falling: false, + dolphins_grace: false, + depth_strider: 0, + leather_boots: false, + } + } +} +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct StepRequest { + pub body: PhysicsBody, + pub input: Controls, + pub world: PhysicsWorld, + pub settings: PhysicsSettings, +} + +fn name(state: &str) -> &str { + state + .split('[') + .next() + .unwrap_or(state) + .strip_prefix("minecraft:") + .unwrap_or(state.split('[').next().unwrap_or(state)) +} +fn property<'a>(state: &'a str, key: &str) -> Option<&'a str> { + state + .split_once('[')? + .1 + .trim_end_matches(']') + .split(',') + .find_map(|part| { + let (k, v) = part.split_once('=')?; + (k == key).then_some(v) + }) +} +fn is_climbable(state: &str) -> bool { + matches!( + name(state), + "ladder" + | "vine" + | "scaffolding" + | "weeping_vines" + | "weeping_vines_plant" + | "twisting_vines" + | "twisting_vines_plant" + ) +} +fn fluid(state: &str, water: bool) -> Option { + let block = name(state); + let present = if water { + block == "water" + || block == "bubble_column" + || matches!(block, "kelp" | "kelp_plant" | "seagrass" | "tall_seagrass") + || property(state, "waterlogged") == Some("true") + } else { + block == "lava" + }; + if !present { + return None; + } + let level = property(state, "level") + .and_then(|v| v.parse::().ok()) + .unwrap_or(0); + Some(if level >= 8 { + (8.0_f32 / 9.0_f32) as f64 + } else { + ((8.0_f32 - f32::from(level)) / 9.0_f32) as f64 + }) +} + +struct WorldView<'a> { + blocks: &'a [CollisionBlock], + lookup: HashMap<[i32; 3], &'a CollisionBlock>, + boxes: Vec, +} +impl<'a> WorldView<'a> { + fn new( + world: &'a PhysicsWorld, + body: &PhysicsBody, + input: &Controls, + settings: &PhysicsSettings, + ) -> Self { + let lookup: HashMap<_, _> = world.blocks.iter().map(|b| (b.pos, b)).collect(); + let mut boxes = Vec::new(); + // Context-sensitive surfaces are generated for this body rather than + // inherited from the catalog's empty-entity collision measurement. + for block in &world.blocks { + let local = match name(&block.state) { + "scaffolding" => { + if !input.sneak && body.position[1] >= block.pos[1] as f64 + 1. - EPSILON { + vec![Aabb::new([0., 14. / 16., 0.], [1.; 3])] + } else { + Vec::new() + } + } + "powder_snow" => { + if (settings.leather_boots + && !input.sneak + && body.position[1] >= block.pos[1] as f64 + 1. - EPSILON) + || body.fall_distance > 2.5 + { + vec![Aabb::new( + [0.; 3], + [1., if settings.leather_boots { 1. } else { 0.9 }, 1.], + )] + } else { + Vec::new() + } + } + _ => block.collision.clone(), + }; + let offset = block.pos.map(f64::from); + boxes.extend(local.into_iter().map(|b| b.translated(offset))); + } + Self { + blocks: &world.blocks, + lookup, + boxes, + } + } + fn get(&self, pos: [i32; 3]) -> Option<&CollisionBlock> { + self.lookup.get(&pos).copied() + } + fn at(&self, point: [f64; 3]) -> Option<&CollisionBlock> { + self.get(point.map(|v| v.floor() as i32)) + } + fn free(&self, bounds: Aabb) -> bool { + !self.boxes.iter().any(|b| b.intersects(&bounds)) + } + fn intersecting(&self, bounds: Aabb) -> impl Iterator + '_ { + let mut blocks: Vec<_> = self + .blocks + .iter() + .filter(|b| { + Aabb::unit() + .translated(b.pos.map(f64::from)) + .intersects(&bounds) + }) + .collect(); + // Source map/serialization order differs between native and browser. + // Java visits X, then Y, then Z; fluid depth accumulation and callbacks + // depend on that order when a body overlaps several different cells. + blocks.sort_unstable_by_key(|block| block.pos); + blocks.into_iter() + } + fn fluid_height(&self, block: &CollisionBlock, water: bool) -> Option { + let own = fluid(&block.state, water)?; + let above = [block.pos[0], block.pos[1] + 1, block.pos[2]]; + Some( + if self + .get(above) + .and_then(|b| fluid(&b.state, water)) + .is_some() + { + 1. + } else { + own + }, + ) + } + fn fluid_state(&self, body: &PhysicsBody, water: bool) -> (bool, bool, f64, [f64; 3]) { + let bounds = body.bounds().deflated(0.001); + let mut depth: f64 = 0.; + let mut submerged = false; + let mut current = [0.; 3]; + let mut count = 0.; + for block in self.intersecting(bounds) { + let Some(height) = self.fluid_height(block, water) else { + continue; + }; + let top = block.pos[1] as f64 + height; + if top <= bounds.min[1] { + continue; + } + depth = depth.max(top - body.position[1]); + if top > body.position[1] + body.eye_height() { + let eye = [ + body.position[0], + body.position[1] + body.eye_height(), + body.position[2], + ] + .map(|v| v.floor() as i32); + submerged |= eye == block.pos; + } + let flow = self.flow(block, water); + let scale = if depth < 0.4 { depth } else { 1. }; + for axis in 0..3 { + current[axis] += flow[axis] * scale; + } + count += 1.; + } + if current.iter().map(|v| v * v).sum::() < 1.0e-5 { + current = [0.; 3]; + } + if count > 0. { + for value in &mut current { + *value /= count; + } + } + (depth > 0., submerged, depth, current) + } + fn flow(&self, block: &CollisionBlock, water: bool) -> [f64; 3] { + let own = fluid(&block.state, water).unwrap_or(0.); + let mut flow = [0.; 3]; + for (dx, dz) in [(-1, 0), (1, 0), (0, -1), (0, 1)] { + let next = [block.pos[0] + dx, block.pos[1], block.pos[2] + dz]; + let neighbor = self.get(next); + let difference = if let Some(height) = neighbor.and_then(|b| fluid(&b.state, water)) { + own - height + } else if neighbor.is_none_or(|b| b.collision.is_empty()) { + self.get([next[0], next[1] - 1, next[2]]) + .and_then(|b| fluid(&b.state, water)) + .map_or(0., |height| own - (height - 8. / 9.)) + } else { + 0. + }; + flow[0] += dx as f64 * difference; + flow[2] += dz as f64 * difference; + } + let length = (flow[0] * flow[0] + flow[2] * flow[2]).sqrt(); + if length > 0. { + flow[0] /= length; + flow[2] /= length; + } + if property(&block.state, "level") + .and_then(|s| s.parse::().ok()) + .is_some_and(|v| v >= 8) + { + let against_wall = [(-1, 0), (1, 0), (0, -1), (0, 1)].iter().any(|&(dx, dz)| { + self.get([block.pos[0] + dx, block.pos[1], block.pos[2] + dz]) + .is_some_and(|b| !b.collision.is_empty()) + }); + if against_wall { + flow[1] = -6.; + let length = (flow.iter().map(|v| v * v).sum::()).sqrt(); + for value in &mut flow { + *value /= length; + } + } + } + flow + } +} + +fn clip_axis(bounds: Aabb, boxes: &[Aabb], axis: usize, mut movement: f64) -> f64 { + if movement.abs() < EPSILON { + return 0.; + } + for obstacle in boxes { + if !(0..3).filter(|&i| i != axis).all(|i| { + bounds.max[i] > obstacle.min[i] + EPSILON && bounds.min[i] < obstacle.max[i] - EPSILON + }) { + continue; + } + if movement > 0. && bounds.max[axis] <= obstacle.min[axis] + EPSILON { + movement = movement.min((obstacle.min[axis] - bounds.max[axis]).max(0.)); + } else if movement < 0. && bounds.min[axis] >= obstacle.max[axis] - EPSILON { + movement = movement.max((obstacle.max[axis] - bounds.min[axis]).min(0.)); + } + } + movement +} +fn collide(bounds: Aabb, movement: [f64; 3], boxes: &[Aabb]) -> [f64; 3] { + let mut adjusted = movement; + let mut bounds = bounds; + adjusted[1] = clip_axis(bounds, boxes, 1, adjusted[1]); + bounds = bounds.translated([0., adjusted[1], 0.]); + // The major horizontal component is resolved first, matching corner slides. + let axes = if movement[0].abs() < movement[2].abs() { + [2, 0] + } else { + [0, 2] + }; + for axis in axes { + adjusted[axis] = clip_axis(bounds, boxes, axis, adjusted[axis]); + let mut offset = [0.; 3]; + offset[axis] = adjusted[axis]; + bounds = bounds.translated(offset); + } + adjusted +} +fn horizontal_length(v: [f64; 3]) -> f64 { + v[0] * v[0] + v[2] * v[2] +} +fn stepped_move( + bounds: Aabb, + movement: [f64; 3], + boxes: &[Aabb], + height: f64, + grounded: bool, +) -> [f64; 3] { + let height = height as f32 as f64; + let flat = collide(bounds, movement, boxes); + if height <= 0. + || !(grounded || movement[1] < 0. && flat[1] != movement[1]) + || (flat[0] == movement[0] && flat[2] == movement[2]) + { + return flat; + } + // Java 26.2 tries the actual collider Y planes in ascending order. The + // lowest useful step leaves more headroom than an unconditional .6 lift. + let base = if movement[1] < 0. && flat[1] != movement[1] { + bounds.translated([0., flat[1], 0.]) + } else { + bounds + }; + let swept = base.expanded([movement[0], height, movement[2]]); + let mut candidates = Vec::new(); + for obstacle in boxes.iter().filter(|obstacle| obstacle.intersects(&swept)) { + for plane in [obstacle.min[1], obstacle.max[1]] { + let candidate = (plane - base.min[1]) as f32; + if candidate >= 0. && candidate != flat[1] as f32 && candidate as f64 <= height { + candidates.push(candidate); + } + } + } + candidates.sort_by(f32::total_cmp); + candidates.dedup(); + for height in candidates { + let mut step = collide(base, [movement[0], height as f64, movement[2]], boxes); + if horizontal_length(step) > horizontal_length(flat) { + step[1] += base.min[1] - bounds.min[1]; + return step; + } + } + flat +} +fn reduce_edge(mut distance: f64) -> f64 { + if distance.abs() <= 0.05 { + 0. + } else { + distance -= distance.signum() * 0.05; + distance + } +} +fn avoid_edge(bounds: Aabb, mut movement: [f64; 3], boxes: &[Aabb], step_height: f64) -> [f64; 3] { + let supported = |x, z| { + !boxes + .iter() + .all(|b| !b.intersects(&bounds.translated([x, -step_height, z]))) + }; + while movement[0] != 0. && !supported(movement[0], 0.) { + movement[0] = reduce_edge(movement[0]); + } + while movement[2] != 0. && !supported(0., movement[2]) { + movement[2] = reduce_edge(movement[2]); + } + while movement[0] != 0. && movement[2] != 0. && !supported(movement[0], movement[2]) { + movement[0] = reduce_edge(movement[0]); + movement[2] = reduce_edge(movement[2]); + } + movement +} +fn accelerate(velocity: &mut [f64; 3], forward: f64, strafe: f64, yaw: f64, amount: f64) { + let length = (forward * forward + strafe * strafe).sqrt().max(1.); + if length < EPSILON { + return; + } + let forward = forward / length * amount; + let strafe = strafe / length * amount; + let (sin, cos) = yaw.sin_cos(); + velocity[0] += sin * forward + cos * strafe; + velocity[2] += -cos * forward + sin * strafe; +} +fn clamp_finite(value: f64, min: f64, max: f64) -> f64 { + if value.is_finite() { + value.clamp(min, max) + } else { + 0. + } +} + +/// Advance one fixed 20 Hz tick. Callers supply authoritative nearby block +/// states, including water and climbable cells with empty collision geometry. +pub fn step( + body: &mut PhysicsBody, + input: &Controls, + world: &PhysicsWorld, + settings: &PhysicsSettings, +) { + if body + .position + .iter() + .chain(&body.velocity) + .any(|v| !v.is_finite()) + { + body.position = body.position.map(|v| if v.is_finite() { v } else { 0. }); + body.velocity = [0.; 3]; + } + if settings.frozen { + body.velocity = [0.; 3]; + body.sprinting = false; + return; + } + let input = Controls { + forward: clamp_finite(input.forward, -1., 1.), + strafe: clamp_finite(input.strafe, -1., 1.), + yaw: clamp_finite(input.yaw, -1.0e8, 1.0e8), + pitch: clamp_finite( + input.pitch, + -std::f64::consts::FRAC_PI_2, + std::f64::consts::FRAC_PI_2, + ), + ..input.clone() + }; + if !settings.allow_flight { + body.flying = false; + } + if input.fly_toggle && settings.allow_flight { + body.flying = !body.flying; + // The explicit flight shortcut also works while standing still. A + // resting body's small downward gravity remainder must not make the + // same tick count as landing and immediately cancel its new flight. + if body.flying && body.on_ground { + body.velocity[1] = body.velocity[1].max(0.); + body.on_ground = false; + } + } + if body.jump_cooldown > 0 { + body.jump_cooldown -= 1; + } + if !input.jump { + body.jump_cooldown = 0; + } + // Vanilla zeroes tiny residual motion before integrating the next input. + if horizontal_length(body.velocity) < 9.0e-6 { + body.velocity[0] = 0.; + body.velocity[2] = 0.; + } + if body.velocity[1].abs() < 0.003 { + body.velocity[1] = 0.; + } + let view = WorldView::new(world, body, &input, settings); + let (water, submerged, water_depth, water_flow) = view.fluid_state(body, true); + let (lava, _, lava_depth, lava_flow) = view.fluid_state(body, false); + body.in_water = water && !body.flying; + body.in_lava = lava && !body.flying; + body.submerged = submerged && !body.flying; + body.on_climbable = !body.flying + && view + .intersecting(body.bounds().deflated(EPSILON)) + .any(|b| is_climbable(&b.state)); + body.sprinting = input.sprint + && !input.sneak + && (input.forward > 0.8 || body.swimming && input.forward > 0.) + && !body.horizontal_collision; + body.swimming = + !body.flying && body.sprinting && body.in_water && (body.submerged || body.swimming); + let desired = if body.swimming { + Pose::Swimming + } else if input.sneak && !body.flying { + Pose::Crouching + } else { + Pose::Standing + }; + body.pose = if view.free(Aabb::body(body.position, desired.height())) { + desired + } else if view.free(Aabb::body(body.position, Pose::Crouching.height())) { + Pose::Crouching + } else { + Pose::Swimming + }; + let mut forward = input.forward * INPUT_SCALE; + let mut strafe = input.strafe * INPUT_SCALE; + if body.pose == Pose::Crouching && !body.flying { + forward *= 0.3; + strafe *= 0.3; + } + let was_grounded = body.on_ground; + let under = view.at([ + body.position[0], + body.position[1] - 0.5000001, + body.position[2], + ]); + let near_under = view.at([ + body.position[0], + body.position[1] - 0.2000001, + body.position[2], + ]); + let ground = near_under + .or(under) + .map(|b| name(&b.state)) + .unwrap_or("air"); + let friction = match ground { + "ice" | "packed_ice" | "frosted_ice" => 0.9800000190734863, + "blue_ice" => 0.9890000224113464, + "slime_block" => 0.800000011920929, + _ => 0.6000000238418579, + }; + let speed = (settings.movement_speed.clamp(0., 10.) + * (1. + 0.2 * f64::from(settings.speed_level)) + * (1. - 0.15 * f64::from(settings.slowness_level)).max(0.) + * if body.sprinting { + 1.300000011920929 + } else { + 1. + }) as f32 as f64; + if body.in_water || body.in_lava { + let flow = if body.in_water { water_flow } else { lava_flow }; + let strength = if body.in_water { + 0.014 + } else { + 0.0023333333333333335 + }; + let mut push = flow.map(|value| value * strength); + let length = push.iter().map(|value| value * value).sum::().sqrt(); + if body.velocity[0].abs() < 0.003 + && body.velocity[2].abs() < 0.003 + && length > 0. + && length < 0.0045 + { + for value in &mut push { + *value *= 0.0045 / length; + } + } + for (velocity, current) in body.velocity.iter_mut().zip(push) { + *velocity += current; + } + } + if !body.flying && input.jump { + let liquid_jump = body.in_water && (!was_grounded || water_depth > 0.4) + || body.in_lava && (!was_grounded || lava_depth > 0.4); + if liquid_jump { + body.velocity[1] += 0.04; + } else if (was_grounded || body.in_water && water_depth <= 0.4) && body.jump_cooldown == 0 { + let factor = if ground == "honey_block" { 0.5 } else { 1. }; + let jump = settings + .jump_impulse + .filter(|v| v.is_finite()) + .unwrap_or(0.41999998688697815 * factor) + + 0.1 * f64::from(settings.jump_boost_level); + body.velocity[1] = body.velocity[1].max(jump); + if body.sprinting { + body.velocity[0] += input.yaw.sin() * 0.2; + body.velocity[2] -= input.yaw.cos() * 0.2; + } + body.jump_cooldown = 10; + } + } + if body.flying { + let amount = settings.flight_speed.clamp(0., 2.) * if body.sprinting { 2. } else { 1. }; + accelerate(&mut body.velocity, forward, strafe, input.yaw, amount); + body.velocity[1] += ((f32::from(input.jump) - f32::from(input.sneak)) + * settings.flight_speed as f32 + * 3.0_f32) as f64; + } else if body.in_water || body.in_lava { + if input.sneak { + body.velocity[1] -= 0.04; + } + let mut acceleration = 0.019999999552965164; + if body.in_water { + let depth_strider = + f64::from(settings.depth_strider.min(3)) * if body.on_ground { 1. } else { 0.5 }; + acceleration += (speed - acceleration) * depth_strider / 3.; + if body.swimming { + let look_y = input.pitch.sin(); + let factor = if look_y < -0.2 { 0.085 } else { 0.06 }; + if look_y <= 0. + || input.jump + || view + .at([ + body.position[0], + body.position[1] + 1. - 0.1, + body.position[2], + ]) + .and_then(|b| fluid(&b.state, true)) + .is_some() + { + body.velocity[1] += (look_y - body.velocity[1]) * factor; + } + } + } + accelerate(&mut body.velocity, forward, strafe, input.yaw, acceleration); + } else { + let acceleration = if was_grounded { + if friction > 0.6 { + let friction = friction as f32; + ((speed as f32) * (0.21600002_f32 / ((friction * friction) * friction))) as f64 + } else { + speed + } + } else if body.sprinting { + 0.025999998673796654 + } else { + 0.019999999552965164 + }; + accelerate(&mut body.velocity, forward, strafe, input.yaw, acceleration); + } + if body.on_climbable { + body.fall_distance = 0.; + body.velocity[0] = body.velocity[0].clamp(-0.15, 0.15); + body.velocity[2] = body.velocity[2].clamp(-0.15, 0.15); + body.velocity[1] = body.velocity[1].max(-0.15); + if input.sneak + && body.velocity[1] < 0. + && !view + .intersecting(body.bounds()) + .any(|b| name(&b.state) == "scaffolding") + { + body.velocity[1] = 0.; + } + } + let mut stuck = None; + for block in view.intersecting(body.bounds().deflated(0.001)) { + match name(&block.state) { + "cobweb" if !body.flying => stuck = Some([0.25, 0.05, 0.25]), + "sweet_berry_bush" if stuck.is_none() && !body.flying => stuck = Some([0.8, 0.75, 0.8]), + "powder_snow" if stuck.is_none() && !body.flying => stuck = Some([0.9, 1.5, 0.9]), + _ => {} + } + } + let mut movement = body.velocity; + if let Some(factors) = stuck { + for i in 0..3 { + movement[i] *= factors[i]; + } + body.velocity = [0.; 3]; + } + if input.sneak + && !body.flying + && !body.swimming + && (was_grounded + || body.fall_distance < settings.step_height + && !view.free(body.bounds().translated([0., -settings.step_height, 0.]))) + { + movement = avoid_edge(body.bounds(), movement, &view.boxes, settings.step_height); + } + let requested = movement; + let moved = stepped_move( + body.bounds(), + requested, + &view.boxes, + if body.flying { + 0. + } else { + settings.step_height.clamp(0., 2.) + }, + was_grounded && !body.flying, + ); + for (position, distance) in body.position.iter_mut().zip(moved) { + *position += distance; + } + body.horizontal_collision = + (requested[0] - moved[0]).abs() > EPSILON || (requested[2] - moved[2]).abs() > EPSILON; + body.vertical_collision = (requested[1] - moved[1]).abs() > EPSILON; + body.on_ground = body.vertical_collision && requested[1] < 0.; + if body.horizontal_collision { + body.sprinting = false; + } + for axis in [0, 2] { + if (requested[axis] - moved[axis]).abs() > EPSILON { + body.velocity[axis] = 0.; + } + } + let landed_ground = view + .at([body.position[0], body.position[1] - 0.2, body.position[2]]) + .map(|b| name(&b.state)) + .unwrap_or(ground); + if body.vertical_collision { + let restitution = match landed_ground { + "slime_block" => 1., + block if block.ends_with("_bed") || block == "bed" => 0.75, + _ => 0., + }; + let gravity = if settings.slow_falling && body.velocity[1] <= 0. { + 0.01 + } else { + GRAVITY + }; + body.velocity[1] = if requested[1] < 0. && !input.sneak && !body.flying { + restitution_velocity(body.velocity[1], moved[1], gravity, restitution) + } else { + 0. + }; + } + if body.on_ground || body.in_water || body.on_climbable || body.flying { + body.fall_distance = 0.; + } else if moved[1] < 0. { + body.fall_distance -= moved[1]; + } + if body.on_climbable && (body.horizontal_collision || input.jump) { + body.velocity[1] = 0.2; + } + let gravity = if settings.slow_falling && body.velocity[1] <= 0. { + body.fall_distance = 0.; + 0.01 + } else { + GRAVITY + }; + if body.flying { + body.velocity[0] *= HORIZONTAL_DRAG; + body.velocity[2] *= HORIZONTAL_DRAG; + body.velocity[1] *= 0.6; + body.fall_distance = 0.; + if body.on_ground && !input.jump { + body.flying = false; + } + } else if body.in_water { + let mut drag = if body.sprinting { 0.9 } else { 0.8 }; + let depth_strider = + f64::from(settings.depth_strider.min(3)) * if was_grounded { 1. } else { 0.5 }; + drag += (0.54600006 - drag) * depth_strider / 3.; + if settings.dolphins_grace { + drag = 0.96; + } + body.velocity[0] *= drag; + body.velocity[2] *= drag; + body.velocity[1] = fluid_fall(body.velocity[1] * 0.8, gravity, body.sprinting); + if body.horizontal_collision + && view.free( + body.bounds() + .translated([body.velocity[0], 0.6, body.velocity[2]]), + ) + && water_depth < 1. + { + body.velocity[1] = 0.3; + } + } else if body.in_lava { + if lava_depth <= 0.4 { + body.velocity[0] *= 0.5; + body.velocity[2] *= 0.5; + body.velocity[1] = fluid_fall(body.velocity[1] * 0.8, gravity, body.sprinting); + } else { + for value in &mut body.velocity { + *value *= 0.5; + } + } + body.velocity[1] -= gravity / 4.; + if body.horizontal_collision + && view.free( + body.bounds() + .translated([body.velocity[0], 0.6, body.velocity[2]]), + ) + && lava_depth < 1. + { + body.velocity[1] = 0.3; + } + } else { + if settings.levitation_level > 0 { + body.velocity[1] += + (0.05 * f64::from(settings.levitation_level) - body.velocity[1]) * 0.2; + body.fall_distance = 0.; + } else { + body.velocity[1] -= gravity; + } + body.velocity[1] *= AIR_DRAG; + let horizontal_drag = if was_grounded { + ((friction as f32) * (HORIZONTAL_DRAG as f32)) as f64 + } else { + HORIZONTAL_DRAG + }; + body.velocity[0] *= horizontal_drag; + body.velocity[2] *= horizontal_drag; + } + if !body.flying { + if matches!(landed_ground, "soul_sand" | "honey_block") { + body.velocity[0] *= 0.4000000059604645; + body.velocity[2] *= 0.4000000059604645; + } + if landed_ground == "slime_block" + && body.on_ground + && !input.sneak + && body.velocity[1].abs() < 0.1 + { + let factor = 0.4 + body.velocity[1].abs() * 0.2; + body.velocity[0] *= factor; + body.velocity[2] *= factor; + } + block_effects(body, &view, &input); + } +} +/// Apply an external impulse in blocks per tick; useful for explosions, +/// combat knockback, or server-authored launch pads. Invalid components are +/// ignored rather than poisoning subsequent simulation frames. +pub fn apply_impulse(body: &mut PhysicsBody, impulse: [f64; 3]) { + for (velocity, impulse) in body.velocity.iter_mut().zip(impulse) { + if impulse.is_finite() { + *velocity += impulse.clamp(-64., 64.); + } + } + if impulse[1] > 0. { + body.on_ground = false; + } +} +fn restitution_velocity(incoming: f64, moved: f64, gravity: f64, restitution: f64) -> f64 { + if -incoming < gravity || restitution == 0. { + return 0.; + } + let fraction = (moved / incoming).clamp(0., 1.); + (fraction * gravity - incoming) * (1. + fraction * (AIR_DRAG - 1.)) * restitution +} +fn fluid_fall(vertical: f64, gravity: f64, sprinting: bool) -> f64 { + if sprinting { + return vertical; + } + if vertical <= 0. + && (vertical - 0.005).abs() >= 0.003 + && (vertical - gravity / 16.).abs() < 0.003 + { + -0.003 + } else { + vertical - gravity / 16. + } +} +fn block_effects(body: &mut PhysicsBody, world: &WorldView<'_>, input: &Controls) { + let bounds = body.bounds().deflated(0.001); + for block in world.intersecting(bounds) { + match name(&block.state) { + "bubble_column" => { + let down = property(&block.state, "drag") == Some("true"); + let above = world.get([block.pos[0], block.pos[1] + 1, block.pos[2]]); + let surface = + above.is_none_or(|b| fluid(&b.state, true).is_none() && b.collision.is_empty()); + body.velocity[1] = if down { + (body.velocity[1] - 0.03).max(if surface { -0.9 } else { -0.3 }) + } else { + (body.velocity[1] + if surface { 0.1 } else { 0.06 }).min(if surface { + 1.8 + } else { + 0.7 + }) + }; + body.fall_distance = 0.; + } + "honey_block" + if !body.on_ground + && body.velocity[1] / AIR_DRAG + GRAVITY < -0.08 + && body.position[1] <= block.pos[1] as f64 + 0.9375 => + { + let dx = (body.position[0] - (block.pos[0] as f64 + 0.5)).abs(); + let dz = (body.position[2] - (block.pos[2] as f64 + 0.5)).abs(); + if dx + EPSILON > 0.4375 + WIDTH / 2. || dz + EPSILON > 0.4375 + WIDTH / 2. { + let incoming = body.velocity[1] / AIR_DRAG + GRAVITY; + if incoming < -0.13 { + let ratio = -0.05 / incoming; + body.velocity[0] *= ratio; + body.velocity[2] *= ratio; + } + body.velocity[1] = (-0.05 - GRAVITY) * AIR_DRAG; + body.fall_distance = 0.; + } + } + "scaffolding" if input.sneak => { + body.velocity[1] = body.velocity[1].max(-0.15); + } + _ => {} + } + } +} + +/// Raw JSON bridge keeps the exact same Rust numerical implementation in the +/// browser. The host writes only the allocated input region and copies output +/// before the next call; neither pointer survives another allocation. +#[cfg(target_arch = "wasm32")] +mod wasm { + use super::*; + use std::cell::RefCell; + const MAX_INPUT: usize = 16 * 1024 * 1024; + thread_local! { + static INPUT: RefCell> = const { RefCell::new(Vec::new()) }; + static OUTPUT: RefCell> = const { RefCell::new(Vec::new()) }; + } + #[unsafe(no_mangle)] + pub extern "C" fn physics_version() -> u32 { + 1 + } + #[unsafe(no_mangle)] + pub extern "C" fn physics_input(len: u32) -> u32 { + if len as usize > MAX_INPUT { + return 0; + } + INPUT.with(|input| { + let mut input = input.borrow_mut(); + input.resize(len as usize, 0); + input.as_mut_ptr() as u32 + }) + } + #[unsafe(no_mangle)] + pub extern "C" fn physics_run() -> u32 { + let request = INPUT.with(|input| serde_json::from_slice::(&input.borrow())); + let (status, result) = match request { + Ok(mut request) => { + step( + &mut request.body, + &request.input, + &request.world, + &request.settings, + ); + (0, serde_json::to_vec(&request.body)) + } + Err(error) => ( + 1, + serde_json::to_vec(&serde_json::json!({"error": error.to_string()})), + ), + }; + OUTPUT.with(|output| { + *output.borrow_mut() = + result.unwrap_or_else(|_| b"{\"error\":\"serialization failed\"}".to_vec()) + }); + status + } + #[unsafe(no_mangle)] + pub extern "C" fn physics_output() -> u32 { + OUTPUT.with(|output| output.borrow().as_ptr() as u32) + } + #[unsafe(no_mangle)] + pub extern "C" fn physics_output_len() -> u32 { + OUTPUT.with(|output| output.borrow().len() as u32) + } +} + +#[cfg(test)] +mod reference_callbacks { + use super::*; + fn fixture() -> serde_json::Value { + serde_json::from_str(include_str!("../tests/fixtures/java26.2.json")).unwrap() + } + #[test] + fn actual_java26_2_collision_measurements() { + let fixture = fixture(); + for case in fixture["collision_cases"].as_array().unwrap() { + let position: [f64; 3] = serde_json::from_value(case["position"].clone()).unwrap(); + let requested: [f64; 3] = serde_json::from_value(case["requested"].clone()).unwrap(); + let boxes: Vec = serde_json::from_value(case["boxes"].clone()).unwrap(); + let actual = stepped_move( + Aabb::body(position, Pose::Standing.height()), + requested, + &boxes, + case["step_height"].as_f64().unwrap(), + case["on_ground"].as_bool().unwrap(), + ); + for axis in 0..3 { + assert!( + (actual[axis] - case["result"][axis].as_f64().unwrap()).abs() < 1.0e-7, + "{} axis {axis}: {:?} expected {}", + case["name"], + actual, + case["result"] + ); + } + } + } + #[test] + fn actual_java26_2_restitution_measurements() { + let fixture = fixture(); + for case in fixture["callback_measurements"]["vertical_collision_restitution"] + .as_array() + .unwrap() + { + let incoming = case["incoming_y"].as_f64().unwrap(); + let moved = case["moved_fraction"].as_f64().unwrap() * incoming; + let factor = match case["surface"].as_str().unwrap() { + "slime_block" => 1., + "white_bed" => 0.75, + _ => 0., + }; + let expected = case["velocity"][1].as_f64().unwrap(); + assert!( + (restitution_velocity(incoming, moved, GRAVITY, factor) - expected).abs() < 1.0e-12 + ); + } + } + #[test] + fn actual_java26_2_honey_measurements() { + let fixture = fixture(); + let world = PhysicsWorld { + blocks: vec![CollisionBlock { + pos: [0; 3], + state: "minecraft:honey_block".into(), + collision: vec![], + }], + }; + for case in fixture["callback_measurements"]["honey_slide_callback"] + .as_array() + .unwrap() + { + let mut body = PhysicsBody { + position: [1.238, 0., 0.5], + velocity: [0.1, case["incoming_y"].as_f64().unwrap(), 0.2], + ..Default::default() + }; + let view = WorldView::new( + &world, + &body, + &Controls::default(), + &PhysicsSettings::default(), + ); + block_effects(&mut body, &view, &Controls::default()); + for axis in 0..3 { + assert!( + (body.velocity[axis] - case["velocity"][axis].as_f64().unwrap()).abs() + < 1.0e-12 + ); + } + } + } + #[test] + fn actual_java26_2_bubble_measurements() { + let fixture = fixture(); + for case in fixture["callback_measurements"]["bubble_column_callback"] + .as_array() + .unwrap() + { + let mut world = PhysicsWorld { + blocks: vec![CollisionBlock { + pos: [0; 3], + state: format!( + "minecraft:bubble_column[drag={}]", + case["down"].as_bool().unwrap() + ), + collision: vec![], + }], + }; + if !case["above"].as_bool().unwrap() { + world.blocks.push(CollisionBlock { + pos: [0, 1, 0], + state: "minecraft:water[level=0]".into(), + collision: vec![], + }); + } + let mut body = PhysicsBody { + position: [0.5, 0., 0.5], + velocity: [0.1, case["incoming_y"].as_f64().unwrap(), 0.2], + ..Default::default() + }; + let view = WorldView::new( + &world, + &body, + &Controls::default(), + &PhysicsSettings::default(), + ); + block_effects(&mut body, &view, &Controls::default()); + for axis in 0..3 { + assert!( + (body.velocity[axis] - case["velocity"][axis].as_f64().unwrap()).abs() + < 1.0e-12 + ); + } + } + } +} diff --git a/crates/shacraft-physics/tests/fixtures/java26.2.json b/crates/shacraft-physics/tests/fixtures/java26.2.json new file mode 100644 index 0000000..be25ee6 --- /dev/null +++ b/crates/shacraft-physics/tests/fixtures/java26.2.json @@ -0,0 +1,7814 @@ +{ + "version": "26.2", + "surfaces": { + "stone": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "ice": { + "friction": 0.9800000190734863, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "packed_ice": { + "friction": 0.9800000190734863, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "blue_ice": { + "friction": 0.9890000224113464, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "frosted_ice": { + "friction": 0.9800000190734863, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "slime_block": { + "friction": 0.800000011920929, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 1.0 + }, + "honey_block": { + "friction": 0.6000000238418579, + "speed_factor": 0.4000000059604645, + "jump_factor": 0.5, + "bounce_restitution": 0.0 + }, + "soul_sand": { + "friction": 0.6000000238418579, + "speed_factor": 0.4000000059604645, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "soul_soil": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "white_bed": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.75 + }, + "water": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "lava": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "cobweb": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "powder_snow": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "ladder": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + }, + "scaffolding": { + "friction": 0.6000000238418579, + "speed_factor": 1.0, + "jump_factor": 1.0, + "bounce_restitution": 0.0 + } + }, + "player_attributes": { + "minecraft:air_drag_modifier": 1.0, + "minecraft:armor": 0.0, + "minecraft:armor_toughness": 0.0, + "minecraft:attack_damage": 1.0, + "minecraft:attack_knockback": 0.0, + "minecraft:attack_speed": 4.0, + "minecraft:below_name_distance": 10.0, + "minecraft:block_break_speed": 1.0, + "minecraft:block_interaction_range": 4.5, + "minecraft:bounciness": 0.0, + "minecraft:burning_time": 1.0, + "minecraft:camera_distance": 4.0, + "minecraft:explosion_knockback_resistance": 0.0, + "minecraft:entity_interaction_range": 3.0, + "minecraft:fall_damage_multiplier": 1.0, + "minecraft:friction_modifier": 1.0, + "minecraft:gravity": 0.08, + "minecraft:jump_strength": 0.41999998688697815, + "minecraft:knockback_resistance": 0.0, + "minecraft:luck": 0.0, + "minecraft:max_absorption": 0.0, + "minecraft:max_health": 20.0, + "minecraft:mining_efficiency": 0.0, + "minecraft:movement_efficiency": 0.0, + "minecraft:movement_speed": 0.10000000149011612, + "minecraft:name_tag_distance": 64.0, + "minecraft:oxygen_bonus": 0.0, + "minecraft:safe_fall_distance": 3.0, + "minecraft:scale": 1.0, + "minecraft:sneaking_speed": 0.3, + "minecraft:step_height": 0.6, + "minecraft:submerged_mining_speed": 0.2, + "minecraft:sweeping_damage_ratio": 0.0, + "minecraft:water_movement_efficiency": 0.0, + "minecraft:waypoint_transmit_range": 60000000.0, + "minecraft:waypoint_receive_range": 60000000.0 + }, + "sprint_attribute_modifier": 0.30000001192092896, + "poses": { + "standing": { + "width": 0.6000000238418579, + "height": 1.7999999523162842, + "eye_height": 1.6200000047683716 + }, + "crouching": { + "width": 0.6000000238418579, + "height": 1.5, + "eye_height": 1.2699999809265137 + }, + "swimming": { + "width": 0.6000000238418579, + "height": 0.6000000238418579, + "eye_height": 0.4000000059604645 + }, + "fall_flying": { + "width": 0.6000000238418579, + "height": 0.6000000238418579, + "eye_height": 0.4000000059604645 + }, + "sleeping": { + "width": 0.20000000298023224, + "height": 0.20000000298023224, + "eye_height": 0.20000000298023224 + } + }, + "fluid_levels": { + "water": [ + { + "level": 0, + "height": 0.8888888955116272, + "source": true + }, + { + "level": 1, + "height": 0.7777777910232544, + "source": false + }, + { + "level": 2, + "height": 0.6666666865348816, + "source": false + }, + { + "level": 3, + "height": 0.5555555820465088, + "source": false + }, + { + "level": 4, + "height": 0.4444444477558136, + "source": false + }, + { + "level": 5, + "height": 0.3333333432674408, + "source": false + }, + { + "level": 6, + "height": 0.2222222238779068, + "source": false + }, + { + "level": 7, + "height": 0.1111111119389534, + "source": false + }, + { + "level": 8, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 9, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 10, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 11, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 12, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 13, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 14, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 15, + "height": 0.8888888955116272, + "source": false + } + ], + "lava": [ + { + "level": 0, + "height": 0.8888888955116272, + "source": true + }, + { + "level": 1, + "height": 0.7777777910232544, + "source": false + }, + { + "level": 2, + "height": 0.6666666865348816, + "source": false + }, + { + "level": 3, + "height": 0.5555555820465088, + "source": false + }, + { + "level": 4, + "height": 0.4444444477558136, + "source": false + }, + { + "level": 5, + "height": 0.3333333432674408, + "source": false + }, + { + "level": 6, + "height": 0.2222222238779068, + "source": false + }, + { + "level": 7, + "height": 0.1111111119389534, + "source": false + }, + { + "level": 8, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 9, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 10, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 11, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 12, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 13, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 14, + "height": 0.8888888955116272, + "source": false + }, + { + "level": 15, + "height": 0.8888888955116272, + "source": false + } + ] + }, + "travel_kernel_trajectories": { + "stone_walk_stop": { + "surface": "stone", + "sprint": false, + "medium": "air", + "fluid_depth": 0.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 0.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 0.0, + 0.09800000336766246 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.053508008053839436 + ], + "on_ground": true + }, + { + "tick": 2, + "position": [ + 0.0, + 0.0, + 0.24950801478916435 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.08272338384467842 + ], + "on_ground": true + }, + { + "tick": 3, + "position": [ + 0.0, + 0.0, + 0.4302314020015052 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.09867498087929642 + ], + "on_ground": true + }, + { + "tick": 4, + "position": [ + 0.0, + 0.0, + 0.6269063862484641 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.10738455387183765 + ], + "on_ground": true + }, + { + "tick": 5, + "position": [ + 0.0, + 0.0, + 0.8322909434879642 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11213998127812054 + ], + "on_ground": true + }, + { + "tick": 6, + "position": [ + 0.0, + 0.0, + 1.0424309281337472 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11473644494353707 + ], + "on_ground": true + }, + { + "tick": 7, + "position": [ + 0.0, + 0.0, + 1.2551673764449467 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11615411426952052 + ], + "on_ground": true + }, + { + "tick": 8, + "position": [ + 0.0, + 0.0, + 1.4693214940821298 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11692816181141515 + ], + "on_ground": true + }, + { + "tick": 9, + "position": [ + 0.0, + 0.0, + 1.6842496592612073 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11735079181837918 + ], + "on_ground": true + }, + { + "tick": 10, + "position": [ + 0.0, + 0.0, + 1.899600454447249 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11758154782898447 + ], + "on_ground": true + }, + { + "tick": 11, + "position": [ + 0.0, + 0.0, + 2.115182005643896 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11770754062540936 + ], + "on_ground": true + }, + { + "tick": 12, + "position": [ + 0.0, + 0.0, + 2.330889549636968 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11777633270024773 + ], + "on_ground": true + }, + { + "tick": 13, + "position": [ + 0.0, + 0.0, + 2.5466658857048783 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11781389317747222 + ], + "on_ground": true + }, + { + "tick": 14, + "position": [ + 0.0, + 0.0, + 2.762479782250013 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11783440120041885 + ], + "on_ground": true + }, + { + "tick": 15, + "position": [ + 0.0, + 0.0, + 2.9783141868180945 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11784559858224833 + ], + "on_ground": true + }, + { + "tick": 16, + "position": [ + 0.0, + 0.0, + 3.194159788768005 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11785171235343735 + ], + "on_ground": true + }, + { + "tick": 17, + "position": [ + 0.0, + 0.0, + 3.410011504489105 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11785505047289427 + ], + "on_ground": true + }, + { + "tick": 18, + "position": [ + 0.0, + 0.0, + 3.625866558329662 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11785687308632946 + ], + "on_ground": true + }, + { + "tick": 19, + "position": [ + 0.0, + 0.0, + 3.841723434783654 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11785786823338068 + ], + "on_ground": true + }, + { + "tick": 20, + "position": [ + 0.0, + 0.0, + 4.057581306384697 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11785841158373374 + ], + "on_ground": true + }, + { + "tick": 21, + "position": [ + 0.0, + 0.0, + 4.17543971796843 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.06435070019922154 + ], + "on_ground": true + }, + { + "tick": 22, + "position": [ + 0.0, + 0.0, + 4.239790418167652 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.035135486389854025 + ], + "on_ground": true + }, + { + "tick": 23, + "position": [ + 0.0, + 0.0, + 4.274925904557506 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.019183977797129728 + ], + "on_ground": true + }, + { + "tick": 24, + "position": [ + 0.0, + 0.0, + 4.294109882354635 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.010474453093868082 + ], + "on_ground": true + }, + { + "tick": 25, + "position": [ + 0.0, + 0.0, + 4.304584335448504 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.005719052053534896 + ], + "on_ground": true + }, + { + "tick": 26, + "position": [ + 0.0, + 0.0, + 4.310303387502039 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0031226027839285713 + ], + "on_ground": true + }, + { + "tick": 27, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.001704941318058414 + ], + "on_ground": true + }, + { + "tick": 28, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 29, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 30, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 31, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 32, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 33, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 34, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 35, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 36, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 37, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 38, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 39, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 40, + "position": [ + 0.0, + 0.0, + 4.3134259902859675 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + } + ] + }, + "stone_sprint_stop": { + "surface": "stone", + "sprint": true, + "medium": "air", + "fluid_depth": 0.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 0.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 0.0, + 0.12740001240968724 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0695604148553142 + ], + "on_ground": true + }, + { + "tick": 2, + "position": [ + 0.0, + 0.0, + 0.32436043967468864 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.10754040577779149 + ], + "on_ground": true + }, + { + "tick": 3, + "position": [ + 0.0, + 0.0, + 0.5593008578621674 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.12827748323013013 + ], + "on_ground": true + }, + { + "tick": 4, + "position": [ + 0.0, + 0.0, + 0.8149783535019848 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.13959992883423883 + ], + "on_ground": true + }, + { + "tick": 5, + "position": [ + 0.0, + 0.0, + 1.081978294745911 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.14578198485214422 + ], + "on_ground": true + }, + { + "tick": 6, + "position": [ + 0.0, + 0.0, + 1.3551602920077424 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1491573878299825 + ], + "on_ground": true + }, + { + "tick": 7, + "position": [ + 0.0, + 0.0, + 1.6317176922474121 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15100035806994805 + ], + "on_ground": true + }, + { + "tick": 8, + "position": [ + 0.0, + 0.0, + 1.9101180627270473 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1520066199378492 + ], + "on_ground": true + }, + { + "tick": 9, + "position": [ + 0.0, + 0.0, + 2.1895246950745837 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1525560389815397 + ], + "on_ground": true + }, + { + "tick": 10, + "position": [ + 0.0, + 0.0, + 2.469480746465811 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1528560218142385 + ], + "on_ground": true + }, + { + "tick": 11, + "position": [ + 0.0, + 0.0, + 2.7497367806897364 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15301981245991675 + ], + "on_ground": true + }, + { + "tick": 12, + "position": [ + 0.0, + 0.0, + 3.0301566055593403 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15310924216284458 + ], + "on_ground": true + }, + { + "tick": 13, + "position": [ + 0.0, + 0.0, + 3.310665860131872 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15315807078631474 + ], + "on_ground": true + }, + { + "tick": 14, + "position": [ + 0.0, + 0.0, + 3.591223943327874 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1531847312178261 + ], + "on_ground": true + }, + { + "tick": 15, + "position": [ + 0.0, + 0.0, + 3.8718086869553874 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15319928781512213 + ], + "on_ground": true + }, + { + "tick": 16, + "position": [ + 0.0, + 0.0, + 4.152407987180196 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1532072357181689 + ], + "on_ground": true + }, + { + "tick": 17, + "position": [ + 0.0, + 0.0, + 4.433015235308052 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1532115752737365 + ], + "on_ground": true + }, + { + "tick": 18, + "position": [ + 0.0, + 0.0, + 4.713626822991476 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15321394467135163 + ], + "on_ground": true + }, + { + "tick": 19, + "position": [ + 0.0, + 0.0, + 4.9942407800725155 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15321523836259976 + ], + "on_ground": true + }, + { + "tick": 20, + "position": [ + 0.0, + 0.0, + 5.274856030844802 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15321594471810326 + ], + "on_ground": true + }, + { + "tick": 21, + "position": [ + 0.0, + 0.0, + 5.428071975562905 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.08365591553293879 + ], + "on_ground": true + }, + { + "tick": 22, + "position": [ + 0.0, + 0.0, + 5.511727891095844 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0456761351863877 + ], + "on_ground": true + }, + { + "tick": 23, + "position": [ + 0.0, + 0.0, + 5.5574040262822315 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02493917270851812 + ], + "on_ground": true + }, + { + "tick": 24, + "position": [ + 0.0, + 0.0, + 5.58234319899075 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.013616789880476819 + ], + "on_ground": true + }, + { + "tick": 25, + "position": [ + 0.0, + 0.0, + 5.595959988871226 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.007434768138308198 + ], + "on_ground": true + }, + { + "tick": 26, + "position": [ + 0.0, + 0.0, + 5.603394757009535 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.00405938387502438 + ], + "on_ground": true + }, + { + "tick": 27, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.002216423853206766 + ], + "on_ground": true + }, + { + "tick": 28, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 29, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 30, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 31, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 32, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 33, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 34, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 35, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 36, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 37, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 38, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 39, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 40, + "position": [ + 0.0, + 0.0, + 5.607454140884559 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + } + ] + }, + "stone_jump": { + "surface": "stone", + "sprint": false, + "medium": "air", + "fluid_depth": 0.0, + "flying": false, + "jump_first_tick": true, + "input_ticks": 0, + "initial_position": [ + 0.0, + 0.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 0.41999998688697815, + 0.0 + ], + "velocity": [ + 0.0, + 0.33319999363422365, + 0.0 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 0.7531999805212017, + 0.0 + ], + "velocity": [ + 0.0, + 0.24813599859094576, + 0.0 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 1.0013359791121474, + 0.0 + ], + "velocity": [ + 0.0, + 0.16477328182606651, + 0.0 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 1.166109260938214, + 0.0 + ], + "velocity": [ + 0.0, + 0.08307781780646721, + 0.0 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 1.2491870787446813, + 0.0 + ], + "velocity": [ + 0.0, + 0.0030162615090425808, + 0.0 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 1.2522033402537238, + 0.0 + ], + "velocity": [ + 0.0, + -0.07544406518948656, + 0.0 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 1.1767592750642373, + 0.0 + ], + "velocity": [ + 0.0, + -0.15233518685055708, + 0.0 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 1.0244240882136801, + 0.0 + ], + "velocity": [ + 0.0, + -0.22768848754498797, + 0.0 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 0.7967356006686922, + 0.0 + ], + "velocity": [ + 0.0, + -0.30153472366278034, + 0.0 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 0.49520087700591187, + 0.0 + ], + "velocity": [ + 0.0, + -0.3739040364667221, + 0.0 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 0.12129684053918977, + 0.0 + ], + "velocity": [ + 0.0, + -0.4448259643949201, + 0.0 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 13, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 14, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 15, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + }, + { + "tick": 16, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "on_ground": true + } + ] + }, + "stone_sprint_jump": { + "surface": "stone", + "sprint": true, + "medium": "air", + "fluid_depth": 0.0, + "flying": false, + "jump_first_tick": true, + "input_ticks": 15, + "initial_position": [ + 0.0, + 0.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 0.41999998688697815, + 0.32740001240968725 + ], + "velocity": [ + 0.0, + 0.33319999363422365, + 0.17876042753918261 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 0.7531999805212017, + 0.5316404391451012 + ], + "velocity": [ + 0.0, + 0.24813599859094576, + 0.18585879368564506 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 1.0013359791121474, + 0.7429792320269776 + ], + "velocity": [ + 0.0, + 0.16477328182606651, + 0.19231830706508796 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 1.166109260938214, + 0.9607775382882968 + ], + "velocity": [ + 0.0, + 0.08307781780646721, + 0.19819646440978847 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 1.2491870787446813, + 1.1844540018943166 + ], + "velocity": [ + 0.0, + 0.0030162615090425808, + 0.20354558774762674 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 1.2522033402537238, + 1.4134795888381746 + ], + "velocity": [ + 0.0, + -0.07544406518948656, + 0.2084132901253459 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 1.1767592750642373, + 1.6473728781597519 + ], + "velocity": [ + 0.0, + -0.15233518685055708, + 0.21284289941673093 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 1.0244240882136801, + 1.885695776772714 + ], + "velocity": [ + 0.0, + -0.22768848754498797, + 0.21687384398806242 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 0.7967356006686922, + 2.128049619957008 + ], + "velocity": [ + 0.0, + -0.30153472366278034, + 0.2205420036536898 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 0.49520087700591187, + 2.374071622806929 + ], + "velocity": [ + 0.0, + -0.3739040364667221, + 0.22388002904561205 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 0.12129684053918977, + 2.6234316510487723 + ], + "velocity": [ + 0.0, + -0.4448259643949201, + 0.2269176322398045 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 0.0, + 2.875829282484808 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.22968185122618393 + ], + "on_ground": true + }, + { + "tick": 13, + "position": [ + 0.0, + 0.0, + 3.232911146120679 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1949667201910825 + ], + "on_ground": true + }, + { + "tick": 14, + "position": [ + 0.0, + 0.0, + 3.5552778787214487 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.17601225644430638 + ], + "on_ground": true + }, + { + "tick": 15, + "position": [ + 0.0, + 0.0, + 3.8586901475754423 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.16566311803648698 + ], + "on_ground": true + }, + { + "tick": 16, + "position": [ + 0.0, + 0.0, + 4.024353265611929 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.09045207295416784 + ], + "on_ground": true + }, + { + "tick": 17, + "position": [ + 0.0, + 0.0, + 4.114805338566097 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.04938683756938659 + ], + "on_ground": true + }, + { + "tick": 18, + "position": [ + 0.0, + 0.0, + 4.164192176135484 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02696521644496582 + ], + "on_ground": true + }, + { + "tick": 19, + "position": [ + 0.0, + 0.0, + 4.1911573925804495 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.014723009889067624 + ], + "on_ground": true + }, + { + "tick": 20, + "position": [ + 0.0, + 0.0, + 4.205880402469517 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.008038764333154523 + ], + "on_ground": true + } + ] + }, + "ice_walk_stop": { + "surface": "ice", + "sprint": false, + "medium": "air", + "fluid_depth": 0.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 0.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 0.0, + 0.022490629097454473 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02005714406293894 + ], + "on_ground": true + }, + { + "tick": 2, + "position": [ + 0.0, + 0.0, + 0.06503840225784789 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.03794410606023668 + ], + "on_ground": true + }, + { + "tick": 3, + "position": [ + 0.0, + 0.0, + 0.12547313741553906 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.05389569959163861 + ], + "on_ground": true + }, + { + "tick": 4, + "position": [ + 0.0, + 0.0, + 0.20185946610463215 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.06812133143619138 + ], + "on_ground": true + }, + { + "tick": 5, + "position": [ + 0.0, + 0.0, + 0.292471426638278 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0808077505690746 + ], + "on_ground": true + }, + { + "tick": 6, + "position": [ + 0.0, + 0.0, + 0.39576980630480707 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.09212149973493779 + ], + "on_ground": true + }, + { + "tick": 7, + "position": [ + 0.0, + 0.0, + 0.5103819351371993 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.10221110176111484 + ], + "on_ground": true + }, + { + "tick": 8, + "position": [ + 0.0, + 0.0, + 0.6350836659957686 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1112090093118493 + ], + "on_ground": true + }, + { + "tick": 9, + "position": [ + 0.0, + 0.0, + 0.7687833044050724 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11923334367920202 + ], + "on_ground": true + }, + { + "tick": 10, + "position": [ + 0.0, + 0.0, + 0.9105072771817289 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1263894454368626 + ], + "on_ground": true + }, + { + "tick": 11, + "position": [ + 0.0, + 0.0, + 1.059387351716046 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.13277125731328954 + ], + "on_ground": true + }, + { + "tick": 12, + "position": [ + 0.0, + 0.0, + 1.21464923812679 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.13846255743804048 + ], + "on_ground": true + }, + { + "tick": 13, + "position": [ + 0.0, + 0.0, + 1.3756024246622849 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.14353805915090595 + ], + "on_ground": true + }, + { + "tick": 14, + "position": [ + 0.0, + 0.0, + 1.5416311129106453 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1480643918117455 + ], + "on_ground": true + }, + { + "tick": 15, + "position": [ + 0.0, + 0.0, + 1.7121861338198452 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1521009754867446 + ], + "on_ground": true + }, + { + "tick": 16, + "position": [ + 0.0, + 0.0, + 1.8867777384040443 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15570080099365882 + ], + "on_ground": true + }, + { + "tick": 17, + "position": [ + 0.0, + 0.0, + 2.0649691684951574 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1589111255461985 + ], + "on_ground": true + }, + { + "tick": 18, + "position": [ + 0.0, + 0.0, + 2.2463709231388105 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.16177409312972268 + ], + "on_ground": true + }, + { + "tick": 19, + "position": [ + 0.0, + 0.0, + 2.430635645365988 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.16432728775231187 + ], + "on_ground": true + }, + { + "tick": 20, + "position": [ + 0.0, + 0.0, + 2.617453562215754 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.16660422683409987 + ], + "on_ground": true + }, + { + "tick": 21, + "position": [ + 0.0, + 0.0, + 2.784057789049854 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.14857765714896376 + ], + "on_ground": true + }, + { + "tick": 22, + "position": [ + 0.0, + 0.0, + 2.9326354461988178 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1325015614751302 + ], + "on_ground": true + }, + { + "tick": 23, + "position": [ + 0.0, + 0.0, + 3.065137007673948 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11816489861423392 + ], + "on_ground": true + }, + { + "tick": 24, + "position": [ + 0.0, + 0.0, + 3.183301906288182 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.10537946201587176 + ], + "on_ground": true + }, + { + "tick": 25, + "position": [ + 0.0, + 0.0, + 3.288681368304054 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.09397740906974292 + ], + "on_ground": true + }, + { + "tick": 26, + "position": [ + 0.0, + 0.0, + 3.3826587773737966 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.08380905772826588 + ], + "on_ground": true + }, + { + "tick": 27, + "position": [ + 0.0, + 0.0, + 3.4664678351020624 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.07474092153452702 + ], + "on_ground": true + }, + { + "tick": 28, + "position": [ + 0.0, + 0.0, + 3.5412087566365895 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.06665395726011476 + ], + "on_ground": true + }, + { + "tick": 29, + "position": [ + 0.0, + 0.0, + 3.6078627138967043 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0594420021484596 + ], + "on_ground": true + }, + { + "tick": 30, + "position": [ + 0.0, + 0.0, + 3.6673047160451637 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.05301038024837285 + ], + "on_ground": true + }, + { + "tick": 31, + "position": [ + 0.0, + 0.0, + 3.7203150962935365 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.04727465954223247 + ], + "on_ground": true + }, + { + "tick": 32, + "position": [ + 0.0, + 0.0, + 3.767589755835769 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.042159543552842016 + ], + "on_ground": true + }, + { + "tick": 33, + "position": [ + 0.0, + 0.0, + 3.8097492993886113 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.03759788287837655 + ], + "on_ground": true + }, + { + "tick": 34, + "position": [ + 0.0, + 0.0, + 3.847347182266988 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.033529793679201926 + ], + "on_ground": true + }, + { + "tick": 35, + "position": [ + 0.0, + 0.0, + 3.88087697594619 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.029901871544379725 + ], + "on_ground": true + }, + { + "tick": 36, + "position": [ + 0.0, + 0.0, + 3.9107788474905694 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02666649041778022 + ], + "on_ground": true + }, + { + "tick": 37, + "position": [ + 0.0, + 0.0, + 3.9374453379083496 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.023781177380357687 + ], + "on_ground": true + }, + { + "tick": 38, + "position": [ + 0.0, + 0.0, + 3.961226515288707 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02120805508095479 + ], + "on_ground": true + }, + { + "tick": 39, + "position": [ + 0.0, + 0.0, + 3.9824345703696618 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.018913344496068313 + ], + "on_ground": true + }, + { + "tick": 40, + "position": [ + 0.0, + 0.0, + 4.00134791486573 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.01686692149098536 + ], + "on_ground": true + } + ] + }, + "blue_ice_walk_stop": { + "surface": "blue_ice", + "sprint": false, + "medium": "air", + "fluid_depth": 0.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 0.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + -0.0784000015258789, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 0.0, + 0.02188220029444743 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.019693761928400874 + ], + "on_ground": true + }, + { + "tick": 2, + "position": [ + 0.0, + 0.0, + 0.06345816251729573 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.03741795116319856 + ], + "on_ground": true + }, + { + "tick": 3, + "position": [ + 0.0, + 0.0, + 0.12275831397494172 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.05336954462579032 + ], + "on_ground": true + }, + { + "tick": 4, + "position": [ + 0.0, + 0.0, + 0.19801005889517947 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.06772581958003394 + ], + "on_ground": true + }, + { + "tick": 5, + "position": [ + 0.0, + 0.0, + 0.28761807876966083 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.08064632379456121 + ], + "on_ground": true + }, + { + "tick": 6, + "position": [ + 0.0, + 0.0, + 0.3901466028586695 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.09227464866920225 + ], + "on_ground": true + }, + { + "tick": 7, + "position": [ + 0.0, + 0.0, + 0.5043034518223192 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.10274002503107534 + ], + "on_ground": true + }, + { + "tick": 8, + "position": [ + 0.0, + 0.0, + 0.628925677147842 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.11215875933514534 + ], + "on_ground": true + }, + { + "tick": 9, + "position": [ + 0.0, + 0.0, + 0.7629666367774348 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.12063552623039606 + ], + "on_ground": true + }, + { + "tick": 10, + "position": [ + 0.0, + 0.0, + 0.9054843633022783 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1282645318564883 + ], + "on_ground": true + }, + { + "tick": 11, + "position": [ + 0.0, + 0.0, + 1.055631095453214 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.13513056079914523 + ], + "on_ground": true + }, + { + "tick": 12, + "position": [ + 0.0, + 0.0, + 1.2126438565468067 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.14130991833955248 + ], + "on_ground": true + }, + { + "tick": 13, + "position": [ + 0.0, + 0.0, + 1.3758359751808067 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.14687127846941697 + ], + "on_ground": true + }, + { + "tick": 14, + "position": [ + 0.0, + 0.0, + 1.5445894539446712 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15187644709605838 + ], + "on_ground": true + }, + { + "tick": 15, + "position": [ + 0.0, + 0.0, + 1.718348101335177 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15638104891937638 + ], + "on_ground": true + }, + { + "tick": 16, + "position": [ + 0.0, + 0.0, + 1.8966113505490008 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1604351456142675 + ], + "on_ground": true + }, + { + "tick": 17, + "position": [ + 0.0, + 0.0, + 2.078928696457716 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.16408379218863242 + ], + "on_ground": true + }, + { + "tick": 18, + "position": [ + 0.0, + 0.0, + 2.2648946889407955 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.16736753770003107 + ], + "on_ground": true + }, + { + "tick": 19, + "position": [ + 0.0, + 0.0, + 2.454144426935274 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.17032287589567632 + ], + "on_ground": true + }, + { + "tick": 20, + "position": [ + 0.0, + 0.0, + 2.646349503125398 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.17298265078393177 + ], + "on_ground": true + }, + { + "tick": 21, + "position": [ + 0.0, + 0.0, + 2.81933215390933 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.15568265971621228 + ], + "on_ground": true + }, + { + "tick": 22, + "position": [ + 0.0, + 0.0, + 2.9750148136255423 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.140112840371419 + ], + "on_ground": true + }, + { + "tick": 23, + "position": [ + 0.0, + 0.0, + 3.1151276539969612 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1261001583139215 + ], + "on_ground": true + }, + { + "tick": 24, + "position": [ + 0.0, + 0.0, + 3.241227812310883 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.1134888842781585 + ], + "on_ground": true + }, + { + "tick": 25, + "position": [ + 0.0, + 0.0, + 3.3547166965890414 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.10213886347896302 + ], + "on_ground": true + }, + { + "tick": 26, + "position": [ + 0.0, + 0.0, + 3.4568555600680044 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.09192395800812365 + ], + "on_ground": true + }, + { + "tick": 27, + "position": [ + 0.0, + 0.0, + 3.548779518076128 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.08273064500683115 + ], + "on_ground": true + }, + { + "tick": 28, + "position": [ + 0.0, + 0.0, + 3.631510163082959 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.07445675503486757 + ], + "on_ground": true + }, + { + "tick": 29, + "position": [ + 0.0, + 0.0, + 3.7059669181178267 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0670103366154648 + ], + "on_ground": true + }, + { + "tick": 30, + "position": [ + 0.0, + 0.0, + 3.7729772547332914 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.06030863433700658 + ], + "on_ground": true + }, + { + "tick": 31, + "position": [ + 0.0, + 0.0, + 3.833285889070298 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.0542771691547567 + ], + "on_ground": true + }, + { + "tick": 32, + "position": [ + 0.0, + 0.0, + 3.8875630582250547 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.04884891067159087 + ], + "on_ground": true + }, + { + "tick": 33, + "position": [ + 0.0, + 0.0, + 3.9364119688966457 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.043963532198914294 + ], + "on_ground": true + }, + { + "tick": 34, + "position": [ + 0.0, + 0.0, + 3.98037550109556 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.03956674031892037 + ], + "on_ground": true + }, + { + "tick": 35, + "position": [ + 0.0, + 0.0, + 4.019942241414481 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.035609671497312964 + ], + "on_ground": true + }, + { + "tick": 36, + "position": [ + 0.0, + 0.0, + 4.055551912911794 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.03204834904077697 + ], + "on_ground": true + }, + { + "tick": 37, + "position": [ + 0.0, + 0.0, + 4.087600261952571 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.028843194364120233 + ], + "on_ground": true + }, + { + "tick": 38, + "position": [ + 0.0, + 0.0, + 4.116443456316691 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.025958587135577707 + ], + "on_ground": true + }, + { + "tick": 39, + "position": [ + 0.0, + 0.0, + 4.142402043452269 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02336246941197402 + ], + "on_ground": true + }, + { + "tick": 40, + "position": [ + 0.0, + 0.0, + 4.165764512864243 + ], + "velocity": [ + 0.0, + -0.0784000015258789, + 0.02102598936431965 + ], + "on_ground": true + } + ] + }, + "water_move_stop": { + "surface": "stone", + "sprint": false, + "medium": "water", + "fluid_depth": 1.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.0, + 0.01959999994337558 + ], + "velocity": [ + 0.0, + -0.005, + 0.01568000018835067 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 9.995, + 0.054880000075101826 + ], + "velocity": [ + 0.0, + -0.009000000059604645, + 0.028224000525951372 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 9.985999999940395, + 0.10270400054442877 + ], + "velocity": [ + 0.0, + -0.012200000154972078, + 0.038259200945568075 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 9.973799999785422, + 0.16056320143337244 + ], + "velocity": [ + 0.0, + -0.014760000269412998, + 0.04628736140089035 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 9.959039999516008, + 0.22645056277763836 + ], + "velocity": [ + 0.0, + -0.016808000391483315, + 0.052709889860851296 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 9.942231999124525, + 0.29876045258186523 + ], + "velocity": [ + 0.0, + -0.018446400513553632, + 0.05784791270538255 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 9.923785598610971, + 0.3762083652306234 + ], + "velocity": [ + 0.0, + -0.019757120630741136, + 0.06195833104225758 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 9.90402847798023, + 0.45776669621625654 + ], + "velocity": [ + 0.0, + -0.02080569674011614, + 0.06524666576075759 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 9.883222781240114, + 0.5426133619203897 + ], + "velocity": [ + 0.0, + -0.021644557640116146, + 0.06787733357475761 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 9.861578223599999, + 0.6300906954385228 + ], + "velocity": [ + 0.0, + -0.02231564637011615, + 0.06998186785731764 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 9.839262577229883, + 0.719672563239216 + ], + "velocity": [ + 0.0, + -0.022852517362116156, + 0.07166549530845366 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 9.816410059867767, + 0.8109380584910453 + ], + "velocity": [ + 0.0, + -0.02328201416211616, + 0.07301239728943287 + ], + "on_ground": false + }, + { + "tick": 13, + "position": [ + 0.0, + 9.79312804570565, + 0.9035504557238537 + ], + "velocity": [ + 0.0, + -0.023625611607236165, + 0.07408991889027257 + ], + "on_ground": false + }, + { + "tick": 14, + "position": [ + 0.0, + 9.769502434098413, + 0.9972403745575019 + ], + "velocity": [ + 0.0, + -0.02390048956742817, + 0.07495193618378938 + ], + "on_ground": false + }, + { + "tick": 15, + "position": [ + 0.0, + 9.745601944530986, + 1.091792310684667 + ], + "velocity": [ + 0.0, + -0.024120391938858576, + 0.07564155002887889 + ], + "on_ground": false + }, + { + "tick": 16, + "position": [ + 0.0, + 9.721481552592127, + 1.1870338606569215 + ], + "velocity": [ + 0.0, + -0.02429631383862434, + 0.07619324111317133 + ], + "on_ground": false + }, + { + "tick": 17, + "position": [ + 0.0, + 9.697185238753503, + 1.2828271017134685 + ], + "velocity": [ + 0.0, + -0.024437051360534104, + 0.07663459398718195 + ], + "on_ground": false + }, + { + "tick": 18, + "position": [ + 0.0, + 9.672748187392969, + 1.379061695644026 + ], + "velocity": [ + 0.0, + -0.024549641379739636, + 0.07698767629165178 + ], + "on_ground": false + }, + { + "tick": 19, + "position": [ + 0.0, + 9.64819854601323, + 1.4756493718790533 + ], + "velocity": [ + 0.0, + -0.02463971339644624, + 0.07727014213943671 + ], + "on_ground": false + }, + { + "tick": 20, + "position": [ + 0.0, + 9.623558832616784, + 1.5725195139618655 + ], + "velocity": [ + 0.0, + -0.024711771010885265, + 0.07749611482103191 + ], + "on_ground": false + }, + { + "tick": 21, + "position": [ + 0.0, + 9.598847061605898, + 1.6500156287828975 + ], + "velocity": [ + 0.0, + -0.024769417103295478, + 0.06199689278065121 + ], + "on_ground": false + }, + { + "tick": 22, + "position": [ + 0.0, + 9.574077644502603, + 1.7120125215635487 + ], + "velocity": [ + 0.0, + -0.024815533977910847, + 0.04959751496358152 + ], + "on_ground": false + }, + { + "tick": 23, + "position": [ + 0.0, + 9.549262110524692, + 1.76161003652713 + ], + "velocity": [ + 0.0, + -0.024852427478152896, + 0.03967801256211367 + ], + "on_ground": false + }, + { + "tick": 24, + "position": [ + 0.0, + 9.524409683046539, + 1.8012880490892438 + ], + "velocity": [ + 0.0, + -0.02488194227878634, + 0.0317424105226897 + ], + "on_ground": false + }, + { + "tick": 25, + "position": [ + 0.0, + 9.499527740767752, + 1.8330304596119336 + ], + "velocity": [ + 0.0, + -0.024905554119644936, + 0.025393928796550783 + ], + "on_ground": false + }, + { + "tick": 26, + "position": [ + 0.0, + 9.474622186648107, + 1.8584243884084843 + ], + "velocity": [ + 0.0, + -0.024924443592613293, + 0.02031514333995985 + ], + "on_ground": false + }, + { + "tick": 27, + "position": [ + 0.0, + 9.449697743055493, + 1.878739531748444 + ], + "velocity": [ + 0.0, + -0.024939555171213157, + 0.01625211491414326 + ], + "on_ground": false + }, + { + "tick": 28, + "position": [ + 0.0, + 9.42475818788428, + 1.8949916466625873 + ], + "velocity": [ + 0.0, + -0.024951644434273192, + 0.013001692125054915 + ], + "on_ground": false + }, + { + "tick": 29, + "position": [ + 0.0, + 9.399806543450007, + 1.9079933387876422 + ], + "velocity": [ + 0.0, + -0.024961315844865335, + 0.01040135385503618 + ], + "on_ground": false + }, + { + "tick": 30, + "position": [ + 0.0, + 9.37484522760514, + 1.9183946926426785 + ], + "velocity": [ + 0.0, + -0.024969052973454343, + 0.008321083208022743 + ], + "on_ground": false + }, + { + "tick": 31, + "position": [ + 0.0, + 9.349876174631687, + 1.9267157758507012 + ], + "velocity": [ + 0.0, + -0.02497524267641778, + 0.006656866665613236 + ], + "on_ground": false + }, + { + "tick": 32, + "position": [ + 0.0, + 9.32490093195527, + 1.9333726425163145 + ], + "velocity": [ + 0.0, + -0.02498019443886232, + 0.005325493411846623 + ], + "on_ground": false + }, + { + "tick": 33, + "position": [ + 0.0, + 9.299920737516407, + 1.938698135928161 + ], + "velocity": [ + 0.0, + -0.02498415584887698, + 0.004260394792962127 + ], + "on_ground": false + }, + { + "tick": 34, + "position": [ + 0.0, + 9.27493658166753, + 1.942958530721123 + ], + "velocity": [ + 0.0, + -0.024987324976935933, + 0.0034083158851575656 + ], + "on_ground": false + }, + { + "tick": 35, + "position": [ + 0.0, + 9.249949256690595, + 1.9463668466062807 + ], + "velocity": [ + 0.0, + -0.024989860279420874, + 0.002726652748756344 + ], + "on_ground": false + }, + { + "tick": 36, + "position": [ + 0.0, + 9.224959396411174, + 1.9463668466062807 + ], + "velocity": [ + 0.0, + -0.02499188852143905, + 0.0 + ], + "on_ground": false + }, + { + "tick": 37, + "position": [ + 0.0, + 9.199967507889735, + 1.9463668466062807 + ], + "velocity": [ + 0.0, + -0.024993511115077766, + 0.0 + ], + "on_ground": false + }, + { + "tick": 38, + "position": [ + 0.0, + 9.174973996774657, + 1.9463668466062807 + ], + "velocity": [ + 0.0, + -0.024994809190008085, + 0.0 + ], + "on_ground": false + }, + { + "tick": 39, + "position": [ + 0.0, + 9.149979187584648, + 1.9463668466062807 + ], + "velocity": [ + 0.0, + -0.024995847649967814, + 0.0 + ], + "on_ground": false + }, + { + "tick": 40, + "position": [ + 0.0, + 9.12498333993468, + 1.9463668466062807 + ], + "velocity": [ + 0.0, + -0.024996678417947976, + 0.0 + ], + "on_ground": false + } + ] + }, + "water_sprint_stop": { + "surface": "stone", + "sprint": true, + "medium": "water", + "fluid_depth": 1.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.0, + 0.01959999994337558 + ], + "velocity": [ + 0.0, + 0.0, + 0.017639999481737608 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 10.0, + 0.05683999936848877 + ], + "velocity": [ + 0.0, + 0.0, + 0.033515998594731096 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 10.0, + 0.10995599790659544 + ], + "velocity": [ + 0.0, + 0.0, + 0.04780439741791192 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 10.0, + 0.17736039526788294 + ], + "velocity": [ + 0.0, + 0.0, + 0.06066395601811269 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 10.0, + 0.2576243512293712 + ], + "velocity": [ + 0.0, + 0.0, + 0.07223755845169762 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 10.0, + 0.3494619096244444 + ], + "velocity": [ + 0.0, + 0.0, + 0.08265380036598786 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 10.0, + 0.45171570993380783 + ], + "velocity": [ + 0.0, + 0.0, + 0.09202841784050653 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 10.0, + 0.5633441277176899 + ], + "velocity": [ + 0.0, + 0.0, + 0.10046557334406502 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 10.0, + 0.6834097010051305 + ], + "velocity": [ + 0.0, + 0.0, + 0.1080590130961102 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 10.0, + 0.8110687140446163 + ], + "velocity": [ + 0.0, + 0.0, + 0.11489310869190916 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 10.0, + 0.9455618226799011 + ], + "velocity": [ + 0.0, + 0.0, + 0.12104379456519068 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 10.0, + 1.0862056171884673 + ], + "velocity": [ + 0.0, + 0.0, + 0.12657941170450027 + ], + "on_ground": false + }, + { + "tick": 13, + "position": [ + 0.0, + 10.0, + 1.2323850288363432 + ], + "velocity": [ + 0.0, + 0.0, + 0.1315614669978995 + ], + "on_ground": false + }, + { + "tick": 14, + "position": [ + 0.0, + 10.0, + 1.3835464957776182 + ], + "velocity": [ + 0.0, + 0.0, + 0.13604531664317734 + ], + "on_ground": false + }, + { + "tick": 15, + "position": [ + 0.0, + 10.0, + 1.5391918123641712 + ], + "velocity": [ + 0.0, + 0.0, + 0.1400807812170241 + ], + "on_ground": false + }, + { + "tick": 16, + "position": [ + 0.0, + 10.0, + 1.698872593524571 + ], + "velocity": [ + 0.0, + 0.0, + 0.14371269923727323 + ], + "on_ground": false + }, + { + "tick": 17, + "position": [ + 0.0, + 10.0, + 1.8621852927052198 + ], + "velocity": [ + 0.0, + 0.0, + 0.14698142536890577 + ], + "on_ground": false + }, + { + "tick": 18, + "position": [ + 0.0, + 10.0, + 2.028766718017501 + ], + "velocity": [ + 0.0, + 0.0, + 0.14992327880944253 + ], + "on_ground": false + }, + { + "tick": 19, + "position": [ + 0.0, + 10.0, + 2.198289996770319 + ], + "velocity": [ + 0.0, + 0.0, + 0.15257094683578637 + ], + "on_ground": false + }, + { + "tick": 20, + "position": [ + 0.0, + 10.0, + 2.3704609435494812 + ], + "velocity": [ + 0.0, + 0.0, + 0.1549538479963705 + ], + "on_ground": false + }, + { + "tick": 21, + "position": [ + 0.0, + 10.0, + 2.5254147915458516 + ], + "velocity": [ + 0.0, + 0.0, + 0.1394584595023458 + ], + "on_ground": false + }, + { + "tick": 22, + "position": [ + 0.0, + 10.0, + 2.6648732510481974 + ], + "velocity": [ + 0.0, + 0.0, + 0.12551261022716245 + ], + "on_ground": false + }, + { + "tick": 23, + "position": [ + 0.0, + 10.0, + 2.79038586127536 + ], + "velocity": [ + 0.0, + 0.0, + 0.11296134621199239 + ], + "on_ground": false + }, + { + "tick": 24, + "position": [ + 0.0, + 10.0, + 2.9033472074873523 + ], + "velocity": [ + 0.0, + 0.0, + 0.10166520889758478 + ], + "on_ground": false + }, + { + "tick": 25, + "position": [ + 0.0, + 10.0, + 3.005012416384937 + ], + "velocity": [ + 0.0, + 0.0, + 0.09149868558393884 + ], + "on_ground": false + }, + { + "tick": 26, + "position": [ + 0.0, + 10.0, + 3.096511101968876 + ], + "velocity": [ + 0.0, + 0.0, + 0.0823488148440463 + ], + "on_ground": false + }, + { + "tick": 27, + "position": [ + 0.0, + 10.0, + 3.178859916812922 + ], + "velocity": [ + 0.0, + 0.0, + 0.07411393139629292 + ], + "on_ground": false + }, + { + "tick": 28, + "position": [ + 0.0, + 10.0, + 3.252973848209215 + ], + "velocity": [ + 0.0, + 0.0, + 0.06670253648964981 + ], + "on_ground": false + }, + { + "tick": 29, + "position": [ + 0.0, + 10.0, + 3.319676384698865 + ], + "velocity": [ + 0.0, + 0.0, + 0.06003228125037244 + ], + "on_ground": false + }, + { + "tick": 30, + "position": [ + 0.0, + 10.0, + 3.3797086659492375 + ], + "velocity": [ + 0.0, + 0.0, + 0.05402905169405407 + ], + "on_ground": false + }, + { + "tick": 31, + "position": [ + 0.0, + 10.0, + 3.4337377176432917 + ], + "velocity": [ + 0.0, + 0.0, + 0.048626145236495694 + ], + "on_ground": false + }, + { + "tick": 32, + "position": [ + 0.0, + 10.0, + 3.4823638628797875 + ], + "velocity": [ + 0.0, + 0.0, + 0.04376352955350848 + ], + "on_ground": false + }, + { + "tick": 33, + "position": [ + 0.0, + 10.0, + 3.526127392433296 + ], + "velocity": [ + 0.0, + 0.0, + 0.039387175554753774 + ], + "on_ground": false + }, + { + "tick": 34, + "position": [ + 0.0, + 10.0, + 3.5655145679880498 + ], + "velocity": [ + 0.0, + 0.0, + 0.035448457060214954 + ], + "on_ground": false + }, + { + "tick": 35, + "position": [ + 0.0, + 10.0, + 3.600963025048265 + ], + "velocity": [ + 0.0, + 0.0, + 0.03190361050903638 + ], + "on_ground": false + }, + { + "tick": 36, + "position": [ + 0.0, + 10.0, + 3.6328666355573014 + ], + "velocity": [ + 0.0, + 0.0, + 0.028713248697491395 + ], + "on_ground": false + }, + { + "tick": 37, + "position": [ + 0.0, + 10.0, + 3.6615798842547926 + ], + "velocity": [ + 0.0, + 0.0, + 0.02584192314316506 + ], + "on_ground": false + }, + { + "tick": 38, + "position": [ + 0.0, + 10.0, + 3.687421807397958 + ], + "velocity": [ + 0.0, + 0.0, + 0.023257730212729092 + ], + "on_ground": false + }, + { + "tick": 39, + "position": [ + 0.0, + 10.0, + 3.710679537610687 + ], + "velocity": [ + 0.0, + 0.0, + 0.020931956636948683 + ], + "on_ground": false + }, + { + "tick": 40, + "position": [ + 0.0, + 10.0, + 3.7316114942476357 + ], + "velocity": [ + 0.0, + 0.0, + 0.018838760474197077 + ], + "on_ground": false + } + ] + }, + "water_jump": { + "surface": "stone", + "sprint": false, + "medium": "water", + "fluid_depth": 1.0, + "flying": false, + "jump_first_tick": true, + "input_ticks": 0, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.03999999910593, + 0.0 + ], + "velocity": [ + 0.0, + 0.02699999976158141, + 0.0 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 10.066999998867512, + 0.0 + ], + "velocity": [ + 0.0, + 0.016600000131130204, + 0.0 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 10.083599998998643, + 0.0 + ], + "velocity": [ + 0.0, + 0.008280000302791586, + 0.0 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 10.091879999301435, + 0.0 + ], + "velocity": [ + 0.0, + 0.0016240003409385643, + 0.0 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 10.091879999301435, + 0.0 + ], + "velocity": [ + 0.0, + -0.005, + 0.0 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 10.086879999301434, + 0.0 + ], + "velocity": [ + 0.0, + -0.009000000059604645, + 0.0 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 10.07787999924183, + 0.0 + ], + "velocity": [ + 0.0, + -0.012200000154972078, + 0.0 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 10.065679999086857, + 0.0 + ], + "velocity": [ + 0.0, + -0.014760000269412998, + 0.0 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 10.050919998817443, + 0.0 + ], + "velocity": [ + 0.0, + -0.016808000391483315, + 0.0 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 10.03411199842596, + 0.0 + ], + "velocity": [ + 0.0, + -0.018446400513553632, + 0.0 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 10.015665597912406, + 0.0 + ], + "velocity": [ + 0.0, + -0.019757120630741136, + 0.0 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 9.995908477281665, + 0.0 + ], + "velocity": [ + 0.0, + -0.02080569674011614, + 0.0 + ], + "on_ground": false + } + ] + }, + "lava_deep_move_stop": { + "surface": "stone", + "sprint": false, + "medium": "lava", + "fluid_depth": 1.0, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.0, + 0.01959999994337558 + ], + "velocity": [ + 0.0, + -0.02, + 0.00979999997168779 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 9.98, + 0.04899999985843895 + ], + "velocity": [ + 0.0, + -0.03, + 0.014699999957531684 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 9.950000000000001, + 0.08329999975934621 + ], + "velocity": [ + 0.0, + -0.035, + 0.01714999995045363 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 9.915000000000001, + 0.12004999965317542 + ], + "velocity": [ + 0.0, + -0.037500000000000006, + 0.018374999946914605 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 9.877500000000001, + 0.1580249995434656 + ], + "velocity": [ + 0.0, + -0.03875000000000001, + 0.018987499945145092 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 9.838750000000001, + 0.19661249943198628 + ], + "velocity": [ + 0.0, + -0.03937500000000001, + 0.019293749944260336 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 9.799375000000001, + 0.2355062493196222 + ], + "velocity": [ + 0.0, + -0.0396875, + 0.019446874943817957 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 9.759687500000002, + 0.2745531242068157 + ], + "velocity": [ + 0.0, + -0.03984375, + 0.019523437443596768 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 9.719843750000003, + 0.31367656159378804 + ], + "velocity": [ + 0.0, + -0.039921874999999996, + 0.019561718693486174 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 9.679921875000003, + 0.3528382802306498 + ], + "velocity": [ + 0.0, + -0.0399609375, + 0.019580859318430878 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 9.639960937500003, + 0.39201913949245626 + ], + "velocity": [ + 0.0, + -0.03998046875, + 0.01959042963090323 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 9.599980468750003, + 0.4312095690667351 + ], + "velocity": [ + 0.0, + -0.039990234375, + 0.019595214787139402 + ], + "on_ground": false + }, + { + "tick": 13, + "position": [ + 0.0, + 9.559990234375002, + 0.47040478379725004 + ], + "velocity": [ + 0.0, + -0.0399951171875, + 0.01959760736525749 + ], + "on_ground": false + }, + { + "tick": 14, + "position": [ + 0.0, + 9.519995117187502, + 0.5096023911058831 + ], + "velocity": [ + 0.0, + -0.039997558593749996, + 0.019598803654316536 + ], + "on_ground": false + }, + { + "tick": 15, + "position": [ + 0.0, + 9.479997558593752, + 0.5488011947035752 + ], + "velocity": [ + 0.0, + -0.039998779296874995, + 0.019599401798846058 + ], + "on_ground": false + }, + { + "tick": 16, + "position": [ + 0.0, + 9.439998779296877, + 0.5880005964457968 + ], + "velocity": [ + 0.0, + -0.039999389648437494, + 0.01959970087111082 + ], + "on_ground": false + }, + { + "tick": 17, + "position": [ + 0.0, + 9.399999389648439, + 0.6272002972602833 + ], + "velocity": [ + 0.0, + -0.03999969482421875, + 0.0195998504072432 + ], + "on_ground": false + }, + { + "tick": 18, + "position": [ + 0.0, + 9.35999969482422, + 0.666400147610902 + ], + "velocity": [ + 0.0, + -0.03999984741210938, + 0.01959992517530939 + ], + "on_ground": false + }, + { + "tick": 19, + "position": [ + 0.0, + 9.31999984741211, + 0.705600072729587 + ], + "velocity": [ + 0.0, + -0.039999923706054694, + 0.019599962559342484 + ], + "on_ground": false + }, + { + "tick": 20, + "position": [ + 0.0, + 9.279999923706054, + 0.7448000352323051 + ], + "velocity": [ + 0.0, + -0.039999961853027344, + 0.019599981251359033 + ], + "on_ground": false + }, + { + "tick": 21, + "position": [ + 0.0, + 9.239999961853027, + 0.7644000164836642 + ], + "velocity": [ + 0.0, + -0.039999980926513676, + 0.009799990625679517 + ], + "on_ground": false + }, + { + "tick": 22, + "position": [ + 0.0, + 9.199999980926513, + 0.7742000071093437 + ], + "velocity": [ + 0.0, + -0.039999990463256835, + 0.004899995312839758 + ], + "on_ground": false + }, + { + "tick": 23, + "position": [ + 0.0, + 9.159999990463257, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999523162842, + 0.002449997656419879 + ], + "on_ground": false + }, + { + "tick": 24, + "position": [ + 0.0, + 9.119999995231629, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.039999997615814215, + 0.0 + ], + "on_ground": false + }, + { + "tick": 25, + "position": [ + 0.0, + 9.079999997615815, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999880790711, + 0.0 + ], + "on_ground": false + }, + { + "tick": 26, + "position": [ + 0.0, + 9.039999998807907, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999940395356, + 0.0 + ], + "on_ground": false + }, + { + "tick": 27, + "position": [ + 0.0, + 8.999999999403954, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999970197678, + 0.0 + ], + "on_ground": false + }, + { + "tick": 28, + "position": [ + 0.0, + 8.959999999701978, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.039999999850988385, + 0.0 + ], + "on_ground": false + }, + { + "tick": 29, + "position": [ + 0.0, + 8.91999999985099, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999992549419, + 0.0 + ], + "on_ground": false + }, + { + "tick": 30, + "position": [ + 0.0, + 8.879999999925497, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.0399999999627471, + 0.0 + ], + "on_ground": false + }, + { + "tick": 31, + "position": [ + 0.0, + 8.83999999996275, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.039999999981373546, + 0.0 + ], + "on_ground": false + }, + { + "tick": 32, + "position": [ + 0.0, + 8.799999999981376, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999999068678, + 0.0 + ], + "on_ground": false + }, + { + "tick": 33, + "position": [ + 0.0, + 8.759999999990688, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.039999999995343385, + 0.0 + ], + "on_ground": false + }, + { + "tick": 34, + "position": [ + 0.0, + 8.719999999995345, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999999767169, + 0.0 + ], + "on_ground": false + }, + { + "tick": 35, + "position": [ + 0.0, + 8.679999999997673, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999999883584, + 0.0 + ], + "on_ground": false + }, + { + "tick": 36, + "position": [ + 0.0, + 8.639999999998837, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999999941792, + 0.0 + ], + "on_ground": false + }, + { + "tick": 37, + "position": [ + 0.0, + 8.599999999999419, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999999970896, + 0.0 + ], + "on_ground": false + }, + { + "tick": 38, + "position": [ + 0.0, + 8.55999999999971, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.039999999999854485, + 0.0 + ], + "on_ground": false + }, + { + "tick": 39, + "position": [ + 0.0, + 8.519999999999854, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.039999999999927247, + 0.0 + ], + "on_ground": false + }, + { + "tick": 40, + "position": [ + 0.0, + 8.479999999999926, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.03999999999996362, + 0.0 + ], + "on_ground": false + } + ] + }, + "lava_shallow_move_stop": { + "surface": "stone", + "sprint": false, + "medium": "lava", + "fluid_depth": 0.2, + "flying": false, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.0, + 0.01959999994337558 + ], + "velocity": [ + 0.0, + -0.025, + 0.00979999997168779 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 9.975, + 0.04899999985843895 + ], + "velocity": [ + 0.0, + -0.04500000029802323, + 0.014699999957531684 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 9.929999999701977, + 0.08329999975934621 + ], + "velocity": [ + 0.0, + -0.06100000077486038, + 0.01714999995045363 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 9.868999998927116, + 0.12004999965317542 + ], + "velocity": [ + 0.0, + -0.07380000134706498, + 0.018374999946914605 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 9.79519999758005, + 0.1580249995434656 + ], + "velocity": [ + 0.0, + -0.08404000195741657, + 0.018987499945145092 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 9.711159995622634, + 0.19661249943198628 + ], + "velocity": [ + 0.0, + -0.09223200256776816, + 0.019293749944260336 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 9.618927993054866, + 0.2355062493196222 + ], + "velocity": [ + 0.0, + -0.09878560315370569, + 0.019446874943817957 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 9.52014238990116, + 0.2745531242068157 + ], + "velocity": [ + 0.0, + -0.10402848370058071, + 0.019523437443596768 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 9.416113906200579, + 0.31367656159378804 + ], + "velocity": [ + 0.0, + -0.10822278820058073, + 0.019561718693486174 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 9.307891117999999, + 0.3528382802306498 + ], + "velocity": [ + 0.0, + -0.11157823185058076, + 0.019580859318430878 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 9.196312886149418, + 0.39201913949245626 + ], + "velocity": [ + 0.0, + -0.1142625868105808, + 0.01959042963090323 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 9.082050299338837, + 0.4312095690667351 + ], + "velocity": [ + 0.0, + -0.11641007081058083, + 0.019595214787139402 + ], + "on_ground": false + }, + { + "tick": 13, + "position": [ + 0.0, + 8.965640228528256, + 0.47040478379725004 + ], + "velocity": [ + 0.0, + -0.11812805803618086, + 0.01959760736525749 + ], + "on_ground": false + }, + { + "tick": 14, + "position": [ + 0.0, + 8.847512170492076, + 0.5096023911058831 + ], + "velocity": [ + 0.0, + -0.11950244783714088, + 0.019598803654316536 + ], + "on_ground": false + }, + { + "tick": 15, + "position": [ + 0.0, + 8.728009722654935, + 0.5488011947035752 + ], + "velocity": [ + 0.0, + -0.12060195969429291, + 0.019599401798846058 + ], + "on_ground": false + }, + { + "tick": 16, + "position": [ + 0.0, + 8.607407762960642, + 0.5880005964457968 + ], + "velocity": [ + 0.0, + -0.12148156919312172, + 0.01959970087111082 + ], + "on_ground": false + }, + { + "tick": 17, + "position": [ + 0.0, + 8.48592619376752, + 0.6272002972602833 + ], + "velocity": [ + 0.0, + -0.12218525680267055, + 0.0195998504072432 + ], + "on_ground": false + }, + { + "tick": 18, + "position": [ + 0.0, + 8.36374093696485, + 0.666400147610902 + ], + "velocity": [ + 0.0, + -0.12274820689869821, + 0.01959992517530939 + ], + "on_ground": false + }, + { + "tick": 19, + "position": [ + 0.0, + 8.240992730066152, + 0.705600072729587 + ], + "velocity": [ + 0.0, + -0.12319856698223124, + 0.019599962559342484 + ], + "on_ground": false + }, + { + "tick": 20, + "position": [ + 0.0, + 8.117794163083921, + 0.7448000352323051 + ], + "velocity": [ + 0.0, + -0.12355885505442636, + 0.019599981251359033 + ], + "on_ground": false + }, + { + "tick": 21, + "position": [ + 0.0, + 7.994235308029495, + 0.7644000164836642 + ], + "velocity": [ + 0.0, + -0.12384708551647743, + 0.009799990625679517 + ], + "on_ground": false + }, + { + "tick": 22, + "position": [ + 0.0, + 7.870388222513018, + 0.7742000071093437 + ], + "velocity": [ + 0.0, + -0.12407766988955425, + 0.004899995312839758 + ], + "on_ground": false + }, + { + "tick": 23, + "position": [ + 0.0, + 7.746310552623464, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.1242621373907645, + 0.002449997656419879 + ], + "on_ground": false + }, + { + "tick": 24, + "position": [ + 0.0, + 7.622048415232699, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12440971139393171, + 0.0 + ], + "on_ground": false + }, + { + "tick": 25, + "position": [ + 0.0, + 7.497638703838768, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12452777059822472, + 0.0 + ], + "on_ground": false + }, + { + "tick": 26, + "position": [ + 0.0, + 7.373110933240543, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12462221796306648, + 0.0 + ], + "on_ground": false + }, + { + "tick": 27, + "position": [ + 0.0, + 7.248488715277476, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.1246977758560658, + 0.0 + ], + "on_ground": false + }, + { + "tick": 28, + "position": [ + 0.0, + 7.1237909394214105, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12475822217136598, + 0.0 + ], + "on_ground": false + }, + { + "tick": 29, + "position": [ + 0.0, + 6.999032717250045, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.1248065792243267, + 0.0 + ], + "on_ground": false + }, + { + "tick": 30, + "position": [ + 0.0, + 6.874226138025718, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12484526486727172, + 0.0 + ], + "on_ground": false + }, + { + "tick": 31, + "position": [ + 0.0, + 6.749380873158446, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12487621338208892, + 0.0 + ], + "on_ground": false + }, + { + "tick": 32, + "position": [ + 0.0, + 6.624504659776357, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12490097219431161, + 0.0 + ], + "on_ground": false + }, + { + "tick": 33, + "position": [ + 0.0, + 6.499603687582045, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12492077924438491, + 0.0 + ], + "on_ground": false + }, + { + "tick": 34, + "position": [ + 0.0, + 6.37468290833766, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12493662488467967, + 0.0 + ], + "on_ground": false + }, + { + "tick": 35, + "position": [ + 0.0, + 6.24974628345298, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12494930139710438, + 0.0 + ], + "on_ground": false + }, + { + "tick": 36, + "position": [ + 0.0, + 6.124796982055876, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12495944260719526, + 0.0 + ], + "on_ground": false + }, + { + "tick": 37, + "position": [ + 0.0, + 5.999837539448681, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12496755557538886, + 0.0 + ], + "on_ground": false + }, + { + "tick": 38, + "position": [ + 0.0, + 5.874869983873292, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12497404595004044, + 0.0 + ], + "on_ground": false + }, + { + "tick": 39, + "position": [ + 0.0, + 5.7498959379232515, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.12497923824983909, + 0.0 + ], + "on_ground": false + }, + { + "tick": 40, + "position": [ + 0.0, + 5.624916699673412, + 0.7791000024221835 + ], + "velocity": [ + 0.0, + -0.1249833920897399, + 0.0 + ], + "on_ground": false + } + ] + }, + "creative_fly_move_stop": { + "surface": "stone", + "sprint": false, + "medium": "air", + "fluid_depth": 0.0, + "flying": true, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.0, + 0.04900000168383123 + ], + "velocity": [ + 0.0, + 0.0, + 0.044590002817362605 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 10.0, + 0.14259000618502507 + ], + "velocity": [ + 0.0, + 0.0, + 0.08516690655058194 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 10.0, + 0.2767569144194383 + ], + "velocity": [ + 0.0, + 0.0, + 0.1220918900119832 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 10.0, + 0.4478488061152527 + ], + "velocity": [ + 0.0, + 0.0, + 0.15569362593025457 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 10.0, + 0.6525424337293385 + ], + "velocity": [ + 0.0, + 0.0, + 0.1862712064971221 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 10.0, + 0.8878136419102918 + ], + "velocity": [ + 0.0, + 0.0, + 0.2140968056149005 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 10.0, + 1.1509104492090234 + ], + "velocity": [ + 0.0, + 0.0, + 0.23941810154183427 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 10.0, + 1.4393285524346888 + ], + "velocity": [ + 0.0, + 0.0, + 0.2624604814994214 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 10.0, + 1.7507890356179414 + ], + "velocity": [ + 0.0, + 0.0, + 0.2834290478651362 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 10.0, + 2.0832180851669087 + ], + "velocity": [ + 0.0, + 0.0, + 0.30251044380785913 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 10.0, + 2.434728530658599 + ], + "velocity": [ + 0.0, + 0.0, + 0.3198745146161665 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 10.0, + 2.803603046958597 + ], + "velocity": [ + 0.0, + 0.0, + 0.3356758195071171 + ], + "on_ground": false + }, + { + "tick": 13, + "position": [ + 0.0, + 10.0, + 3.188278868149545 + ], + "velocity": [ + 0.0, + 0.0, + 0.3500550073722879 + ], + "on_ground": false + }, + { + "tick": 14, + "position": [ + 0.0, + 10.0, + 3.587333877205664 + ], + "velocity": [ + 0.0, + 0.0, + 0.3631400687067025 + ], + "on_ground": false + }, + { + "tick": 15, + "position": [ + 0.0, + 10.0, + 3.999473947596198 + ], + "velocity": [ + 0.0, + 0.0, + 0.3750474748641892 + ], + "on_ground": false + }, + { + "tick": 16, + "position": [ + 0.0, + 10.0, + 4.4235214241442185 + ], + "velocity": [ + 0.0, + 0.0, + 0.38588321477978627 + ], + "on_ground": false + }, + { + "tick": 17, + "position": [ + 0.0, + 10.0, + 4.858404640607836 + ], + "velocity": [ + 0.0, + 0.0, + 0.39574373838715815 + ], + "on_ground": false + }, + { + "tick": 18, + "position": [ + 0.0, + 10.0, + 5.3031483806788255 + ], + "velocity": [ + 0.0, + 0.0, + 0.4047168151284691 + ], + "on_ground": false + }, + { + "tick": 19, + "position": [ + 0.0, + 10.0, + 5.756865197491126 + ], + "velocity": [ + 0.0, + 0.0, + 0.41288231519839036 + ], + "on_ground": false + }, + { + "tick": 20, + "position": [ + 0.0, + 10.0, + 6.218747514373348 + ], + "velocity": [ + 0.0, + 0.0, + 0.4203129204761675 + ], + "on_ground": false + }, + { + "tick": 21, + "position": [ + 0.0, + 10.0, + 6.639060434849515 + ], + "velocity": [ + 0.0, + 0.0, + 0.3824847686564574 + ], + "on_ground": false + }, + { + "tick": 22, + "position": [ + 0.0, + 10.0, + 7.021545203505973 + ], + "velocity": [ + 0.0, + 0.0, + 0.3480611495084385 + ], + "on_ground": false + }, + { + "tick": 23, + "position": [ + 0.0, + 10.0, + 7.369606353014412 + ], + "velocity": [ + 0.0, + 0.0, + 0.316735655180946 + ], + "on_ground": false + }, + { + "tick": 24, + "position": [ + 0.0, + 10.0, + 7.686342008195358 + ], + "velocity": [ + 0.0, + 0.0, + 0.288229454521384 + ], + "on_ground": false + }, + { + "tick": 25, + "position": [ + 0.0, + 10.0, + 7.974571462716742 + ], + "velocity": [ + 0.0, + 0.0, + 0.2622888111735777 + ], + "on_ground": false + }, + { + "tick": 26, + "position": [ + 0.0, + 10.0, + 8.23686027389032 + ], + "velocity": [ + 0.0, + 0.0, + 0.23868282504675356 + ], + "on_ground": false + }, + { + "tick": 27, + "position": [ + 0.0, + 10.0, + 8.475543098937074 + ], + "velocity": [ + 0.0, + 0.0, + 0.21720137705225195 + ], + "on_ground": false + }, + { + "tick": 28, + "position": [ + 0.0, + 10.0, + 8.692744475989326 + ], + "velocity": [ + 0.0, + 0.0, + 0.19765325881388207 + ], + "on_ground": false + }, + { + "tick": 29, + "position": [ + 0.0, + 10.0, + 8.890397734803207 + ], + "velocity": [ + 0.0, + 0.0, + 0.17986447070429568 + ], + "on_ground": false + }, + { + "tick": 30, + "position": [ + 0.0, + 10.0, + 9.070262205507502 + ], + "velocity": [ + 0.0, + 0.0, + 0.16367667305804254 + ], + "on_ground": false + }, + { + "tick": 31, + "position": [ + 0.0, + 10.0, + 9.233938878565544 + ], + "velocity": [ + 0.0, + 0.0, + 0.1489457767754103 + ], + "on_ground": false + }, + { + "tick": 32, + "position": [ + 0.0, + 10.0, + 9.382884655340954 + ], + "velocity": [ + 0.0, + 0.0, + 0.13554066077188182 + ], + "on_ground": false + }, + { + "tick": 33, + "position": [ + 0.0, + 10.0, + 9.518425316112836 + ], + "velocity": [ + 0.0, + 0.0, + 0.12334200485710775 + ], + "on_ground": false + }, + { + "tick": 34, + "position": [ + 0.0, + 10.0, + 9.641767320969944 + ], + "velocity": [ + 0.0, + 0.0, + 0.11224122765474086 + ], + "on_ground": false + }, + { + "tick": 35, + "position": [ + 0.0, + 10.0, + 9.754008548624684 + ], + "velocity": [ + 0.0, + 0.0, + 0.10213952010945752 + ], + "on_ground": false + }, + { + "tick": 36, + "position": [ + 0.0, + 10.0, + 9.856148068734141 + ], + "velocity": [ + 0.0, + 0.0, + 0.09294696597832186 + ], + "on_ground": false + }, + { + "tick": 37, + "position": [ + 0.0, + 10.0, + 9.949095034712464 + ], + "velocity": [ + 0.0, + 0.0, + 0.08458174147790408 + ], + "on_ground": false + }, + { + "tick": 38, + "position": [ + 0.0, + 10.0, + 10.033676776190369 + ], + "velocity": [ + 0.0, + 0.0, + 0.07696938696313715 + ], + "on_ground": false + }, + { + "tick": 39, + "position": [ + 0.0, + 10.0, + 10.110646163153506 + ], + "velocity": [ + 0.0, + 0.0, + 0.07004214415505731 + ], + "on_ground": false + }, + { + "tick": 40, + "position": [ + 0.0, + 10.0, + 10.180688307308563 + ], + "velocity": [ + 0.0, + 0.0, + 0.06373835301803049 + ], + "on_ground": false + } + ] + }, + "creative_fly_sprint_stop": { + "surface": "stone", + "sprint": true, + "medium": "air", + "fluid_depth": 0.0, + "flying": true, + "jump_first_tick": false, + "input_ticks": 20, + "initial_position": [ + 0.0, + 10.0, + 0.0 + ], + "initial_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "samples": [ + { + "tick": 1, + "position": [ + 0.0, + 10.0, + 0.09800000336766246 + ], + "velocity": [ + 0.0, + 0.0, + 0.08918000563472521 + ], + "on_ground": false + }, + { + "tick": 2, + "position": [ + 0.0, + 10.0, + 0.28518001237005014 + ], + "velocity": [ + 0.0, + 0.0, + 0.17033381310116388 + ], + "on_ground": false + }, + { + "tick": 3, + "position": [ + 0.0, + 10.0, + 0.5535138288388766 + ], + "velocity": [ + 0.0, + 0.0, + 0.2441837800239664 + ], + "on_ground": false + }, + { + "tick": 4, + "position": [ + 0.0, + 10.0, + 0.8956976122305054 + ], + "velocity": [ + 0.0, + 0.0, + 0.31138725186050914 + ], + "on_ground": false + }, + { + "tick": 5, + "position": [ + 0.0, + 10.0, + 1.305084867458677 + ], + "velocity": [ + 0.0, + 0.0, + 0.3725424129942442 + ], + "on_ground": false + }, + { + "tick": 6, + "position": [ + 0.0, + 10.0, + 1.7756272838205835 + ], + "velocity": [ + 0.0, + 0.0, + 0.428193611229801 + ], + "on_ground": false + }, + { + "tick": 7, + "position": [ + 0.0, + 10.0, + 2.301820898418047 + ], + "velocity": [ + 0.0, + 0.0, + 0.47883620308366853 + ], + "on_ground": false + }, + { + "tick": 8, + "position": [ + 0.0, + 10.0, + 2.8786571048693776 + ], + "velocity": [ + 0.0, + 0.0, + 0.5249209629988428 + ], + "on_ground": false + }, + { + "tick": 9, + "position": [ + 0.0, + 10.0, + 3.501578071235883 + ], + "velocity": [ + 0.0, + 0.0, + 0.5668580957302723 + ], + "on_ground": false + }, + { + "tick": 10, + "position": [ + 0.0, + 10.0, + 4.166436170333817 + ], + "velocity": [ + 0.0, + 0.0, + 0.6050208876157183 + ], + "on_ground": false + }, + { + "tick": 11, + "position": [ + 0.0, + 10.0, + 4.869457061317198 + ], + "velocity": [ + 0.0, + 0.0, + 0.639749029232333 + ], + "on_ground": false + }, + { + "tick": 12, + "position": [ + 0.0, + 10.0, + 5.607206093917194 + ], + "velocity": [ + 0.0, + 0.0, + 0.6713516390142342 + ], + "on_ground": false + }, + { + "tick": 13, + "position": [ + 0.0, + 10.0, + 6.37655773629909 + ], + "velocity": [ + 0.0, + 0.0, + 0.7001100147445758 + ], + "on_ground": false + }, + { + "tick": 14, + "position": [ + 0.0, + 10.0, + 7.174667754411328 + ], + "velocity": [ + 0.0, + 0.0, + 0.726280137413405 + ], + "on_ground": false + }, + { + "tick": 15, + "position": [ + 0.0, + 10.0, + 7.998947895192396 + ], + "velocity": [ + 0.0, + 0.0, + 0.7500949497283784 + ], + "on_ground": false + }, + { + "tick": 16, + "position": [ + 0.0, + 10.0, + 8.847042848288437 + ], + "velocity": [ + 0.0, + 0.0, + 0.7717664295595725 + ], + "on_ground": false + }, + { + "tick": 17, + "position": [ + 0.0, + 10.0, + 9.716809281215673 + ], + "velocity": [ + 0.0, + 0.0, + 0.7914874767743163 + ], + "on_ground": false + }, + { + "tick": 18, + "position": [ + 0.0, + 10.0, + 10.606296761357651 + ], + "velocity": [ + 0.0, + 0.0, + 0.8094336302569382 + ], + "on_ground": false + }, + { + "tick": 19, + "position": [ + 0.0, + 10.0, + 11.513730394982252 + ], + "velocity": [ + 0.0, + 0.0, + 0.8257646303967807 + ], + "on_ground": false + }, + { + "tick": 20, + "position": [ + 0.0, + 10.0, + 12.437495028746696 + ], + "velocity": [ + 0.0, + 0.0, + 0.840625840952335 + ], + "on_ground": false + }, + { + "tick": 21, + "position": [ + 0.0, + 10.0, + 13.27812086969903 + ], + "velocity": [ + 0.0, + 0.0, + 0.7649695373129148 + ], + "on_ground": false + }, + { + "tick": 22, + "position": [ + 0.0, + 10.0, + 14.043090407011945 + ], + "velocity": [ + 0.0, + 0.0, + 0.696122299016877 + ], + "on_ground": false + }, + { + "tick": 23, + "position": [ + 0.0, + 10.0, + 14.739212706028823 + ], + "velocity": [ + 0.0, + 0.0, + 0.633471310361892 + ], + "on_ground": false + }, + { + "tick": 24, + "position": [ + 0.0, + 10.0, + 15.372684016390716 + ], + "velocity": [ + 0.0, + 0.0, + 0.576458909042768 + ], + "on_ground": false + }, + { + "tick": 25, + "position": [ + 0.0, + 10.0, + 15.949142925433485 + ], + "velocity": [ + 0.0, + 0.0, + 0.5245776223471554 + ], + "on_ground": false + }, + { + "tick": 26, + "position": [ + 0.0, + 10.0, + 16.47372054778064 + ], + "velocity": [ + 0.0, + 0.0, + 0.4773656500935071 + ], + "on_ground": false + }, + { + "tick": 27, + "position": [ + 0.0, + 10.0, + 16.951086197874147 + ], + "velocity": [ + 0.0, + 0.0, + 0.4344027541045039 + ], + "on_ground": false + }, + { + "tick": 28, + "position": [ + 0.0, + 10.0, + 17.38548895197865 + ], + "velocity": [ + 0.0, + 0.0, + 0.39530651762776414 + ], + "on_ground": false + }, + { + "tick": 29, + "position": [ + 0.0, + 10.0, + 17.780795469606414 + ], + "velocity": [ + 0.0, + 0.0, + 0.35972894140859135 + ], + "on_ground": false + }, + { + "tick": 30, + "position": [ + 0.0, + 10.0, + 18.140524411015004 + ], + "velocity": [ + 0.0, + 0.0, + 0.3273533461160851 + ], + "on_ground": false + }, + { + "tick": 31, + "position": [ + 0.0, + 10.0, + 18.467877757131088 + ], + "velocity": [ + 0.0, + 0.0, + 0.2978915535508206 + ], + "on_ground": false + }, + { + "tick": 32, + "position": [ + 0.0, + 10.0, + 18.765769310681907 + ], + "velocity": [ + 0.0, + 0.0, + 0.27108132154376363 + ], + "on_ground": false + }, + { + "tick": 33, + "position": [ + 0.0, + 10.0, + 19.036850632225672 + ], + "velocity": [ + 0.0, + 0.0, + 0.2466840097142155 + ], + "on_ground": false + }, + { + "tick": 34, + "position": [ + 0.0, + 10.0, + 19.283534641939887 + ], + "velocity": [ + 0.0, + 0.0, + 0.22448245530948172 + ], + "on_ground": false + }, + { + "tick": 35, + "position": [ + 0.0, + 10.0, + 19.50801709724937 + ], + "velocity": [ + 0.0, + 0.0, + 0.20427904021891505 + ], + "on_ground": false + }, + { + "tick": 36, + "position": [ + 0.0, + 10.0, + 19.712296137468282 + ], + "velocity": [ + 0.0, + 0.0, + 0.18589393195664372 + ], + "on_ground": false + }, + { + "tick": 37, + "position": [ + 0.0, + 10.0, + 19.898190069424928 + ], + "velocity": [ + 0.0, + 0.0, + 0.16916348295580816 + ], + "on_ground": false + }, + { + "tick": 38, + "position": [ + 0.0, + 10.0, + 20.067353552380737 + ], + "velocity": [ + 0.0, + 0.0, + 0.1539387739262743 + ], + "on_ground": false + }, + { + "tick": 39, + "position": [ + 0.0, + 10.0, + 20.22129232630701 + ], + "velocity": [ + 0.0, + 0.0, + 0.14008428831011463 + ], + "on_ground": false + }, + { + "tick": 40, + "position": [ + 0.0, + 10.0, + 20.361376614617125 + ], + "velocity": [ + 0.0, + 0.0, + 0.12747670603606098 + ], + "on_ground": false + } + ] + } + }, + "callback_measurements": { + "vertical_collision_restitution": [ + { + "surface": "stone", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -0.3, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -0.3, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -0.3, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -1.0, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -1.0, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "stone", + "incoming_y": -1.0, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -0.3, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.3, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -0.3, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.31840000152587894, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -0.3, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.36530400638580324, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -1.0, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 1.0, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -1.0, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 1.014900004863739, + 0.2 + ] + }, + { + "surface": "slime_block", + "incoming_y": -1.0, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 1.0527040184020997, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -0.0784000015258789, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.0, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -0.3, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.22499999999999998, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -0.3, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.2388000011444092, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -0.3, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.2739780047893524, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -1.0, + "moved_fraction": 0.0, + "velocity": [ + 0.1, + 0.75, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -1.0, + "moved_fraction": 0.25, + "velocity": [ + 0.1, + 0.7611750036478043, + 0.2 + ] + }, + { + "surface": "white_bed", + "incoming_y": -1.0, + "moved_fraction": 0.9, + "velocity": [ + 0.1, + 0.7895280138015748, + 0.2 + ] + } + ], + "honey_slide_callback": [ + { + "incoming_y": -0.16, + "velocity": [ + 0.1, + -0.12740000247955321, + 0.2 + ] + }, + { + "incoming_y": -0.3, + "velocity": [ + 0.022111913940015954, + -0.12740000247955321, + 0.04422382788003191 + ] + }, + { + "incoming_y": -1.0, + "velocity": [ + 0.005316840390061075, + -0.12740000247955321, + 0.01063368078012215 + ] + } + ], + "slime_step_callback": [ + { + "incoming_y": 0.0, + "velocity": [ + 0.04000000000000001, + 0.0, + 0.08000000000000002 + ] + }, + { + "incoming_y": -0.0784000015258789, + "velocity": [ + 0.04156800003051758, + -0.0784000015258789, + 0.08313600006103516 + ] + }, + { + "incoming_y": 0.05, + "velocity": [ + 0.04100000000000001, + 0.05, + 0.08200000000000002 + ] + }, + { + "incoming_y": 0.2, + "velocity": [ + 0.1, + 0.2, + 0.2 + ] + } + ], + "bubble_column_callback": [ + { + "above": false, + "down": false, + "incoming_y": -1.0, + "velocity": [ + 0.1, + -0.94, + 0.2 + ] + }, + { + "above": false, + "down": false, + "incoming_y": 0.0, + "velocity": [ + 0.1, + 0.06, + 0.2 + ] + }, + { + "above": false, + "down": false, + "incoming_y": 1.0, + "velocity": [ + 0.1, + 0.7, + 0.2 + ] + }, + { + "above": false, + "down": true, + "incoming_y": -1.0, + "velocity": [ + 0.1, + -0.3, + 0.2 + ] + }, + { + "above": false, + "down": true, + "incoming_y": 0.0, + "velocity": [ + 0.1, + -0.03, + 0.2 + ] + }, + { + "above": false, + "down": true, + "incoming_y": 1.0, + "velocity": [ + 0.1, + 0.97, + 0.2 + ] + }, + { + "above": true, + "down": false, + "incoming_y": -1.0, + "velocity": [ + 0.1, + -0.9, + 0.2 + ] + }, + { + "above": true, + "down": false, + "incoming_y": 0.0, + "velocity": [ + 0.1, + 0.1, + 0.2 + ] + }, + { + "above": true, + "down": false, + "incoming_y": 1.0, + "velocity": [ + 0.1, + 1.1, + 0.2 + ] + }, + { + "above": true, + "down": true, + "incoming_y": -1.0, + "velocity": [ + 0.1, + -0.9, + 0.2 + ] + }, + { + "above": true, + "down": true, + "incoming_y": 0.0, + "velocity": [ + 0.1, + -0.03, + 0.2 + ] + }, + { + "above": true, + "down": true, + "incoming_y": 1.0, + "velocity": [ + 0.1, + 0.97, + 0.2 + ] + } + ] + }, + "collision_cases": [ + { + "name": "half_slab", + "on_ground": true, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + -0.0784, + 0.0 + ], + "result": [ + 0.8, + 0.5, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.5, + 1.0 + ] + } + ] + }, + { + "name": "half_slab_low_ceiling", + "on_ground": true, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + -0.0784, + 0.0 + ], + "result": [ + 0.8, + 0.5, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.5, + 1.0 + ] + }, + { + "min": [ + -1.0, + 2.3, + -1.0 + ], + "max": [ + 2.0, + 2.4, + 1.0 + ] + } + ] + }, + { + "name": "full_block", + "on_ground": true, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + -0.0784, + 0.0 + ], + "result": [ + 0.4999999880790711, + 0.0, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 1.0, + 1.0 + ] + } + ] + }, + { + "name": "thin_step", + "on_ground": true, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + -0.0784, + 0.0 + ], + "result": [ + 0.8, + 0.0625, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.0625, + 1.0 + ] + } + ] + }, + { + "name": "lowest_improving_step", + "on_ground": true, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + -0.0784, + 0.0 + ], + "result": [ + 0.4999999880790711, + 0.125, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.4, + 0.0, + -1.0 + ], + "max": [ + 1.4, + 0.125, + 1.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.5, + 1.0 + ] + } + ] + }, + { + "name": "descending_into_step", + "on_ground": false, + "position": [ + 0.0, + 0.2, + 0.0 + ], + "requested": [ + 0.8, + -0.4, + 0.0 + ], + "result": [ + 0.8, + 0.3, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.5, + 1.0 + ] + } + ] + }, + { + "name": "corner_major_z", + "on_ground": true, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + -0.0784, + 0.9 + ], + "result": [ + 0.8, + 0.5, + 0.4999999880790711 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.5, + 1.0 + ] + }, + { + "min": [ + -1.0, + 0.0, + 0.8 + ], + "max": [ + 2.0, + 2.0, + 1.8 + ] + } + ] + }, + { + "name": "airborne_no_step", + "on_ground": false, + "position": [ + 0.0, + 0.0, + 0.0 + ], + "requested": [ + 0.8, + 0.1, + 0.0 + ], + "result": [ + 0.4999999880790711, + 0.1, + 0.0 + ], + "step_height": 0.6000000238418579, + "boxes": [ + { + "min": [ + -10.0, + -1.0, + -10.0 + ], + "max": [ + 10.0, + 0.0, + 10.0 + ] + }, + { + "min": [ + 0.8, + 0.0, + -1.0 + ], + "max": [ + 1.8, + 0.5, + 1.0 + ] + } + ] + } + ], + "fluid_current_cases": [ + { + "incoming_x": 0.0, + "current_x": 0.001, + "strength": 0.014, + "velocity": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "incoming_x": 0.0, + "current_x": 0.01, + "strength": 0.014, + "velocity": [ + 0.0045000000000000005, + 0.0, + 0.0 + ] + }, + { + "incoming_x": 0.0, + "current_x": 1.0, + "strength": 0.014, + "velocity": [ + 0.014, + 0.0, + 0.0 + ] + }, + { + "incoming_x": 0.01, + "current_x": 0.001, + "strength": 0.014, + "velocity": [ + 0.01, + 0.0, + 0.0 + ] + }, + { + "incoming_x": 0.01, + "current_x": 0.01, + "strength": 0.014, + "velocity": [ + 0.01014, + 0.0, + 0.0 + ] + }, + { + "incoming_x": 0.01, + "current_x": 1.0, + "strength": 0.014, + "velocity": [ + 0.024, + 0.0, + 0.0 + ] + } + ], + "measurement_scope": "Public block and attribute APIs; original Player.travel, jumpFromGround and Entity.collideWithShapes execute in an isolated flat-plane harness. Player constructors and server constructors are bypassed. The harness supplies inputs, threshold preparation, the measured sprint attribute modifier, constant medium/depth and flat-plane movement bookkeeping. Collision cases call original Entity.collide including step selection on explicit boxes. Collision restitution, honey slide, slime step, bubble column and fluid current application are invoked separately. This is not an original full game tick, multiplayer, fluid-world sampling, or automatic callback-dispatch measurement. The water sprint case intentionally leaves swimming pose false to isolate travelInWater.", + "provenance": { + "source_url": "https://piston-data.mojang.com/v1/objects/823e2250d24b3ddac457a60c92a6a941943fcd6a/server.jar", + "source_sha1": "823e2250d24b3ddac457a60c92a6a941943fcd6a", + "source_sha256": "cdacdfb25898de5e4b4b0e5ddcc2722f77067e46605709c2d886c000ebb63ec5", + "executable_sha256": "183c0499c5f855570ee487dd38e141a53f0121f83a0b07a3bac2d8b6698823e8", + "probe_sha256": "d672bfc1fd65df0e3de9091bc0cc1ea21494e36a3c69f367e405de20f903d106", + "command": "python3 scripts/measure_physics.py --java /path/to/java25/bin/java --output crates/shacraft-physics/tests/fixtures/java26.2.json", + "java": "openjdk version \"25.0.1\" 2025-10-21 LTS\nOpenJDK Runtime Environment Microsoft-12574222 (build 25.0.1+8-LTS)\nOpenJDK 64-Bit Server VM Microsoft-12574222 (build 25.0.1+8-LTS, mixed mode)" + } +} diff --git a/crates/shacraft-physics/tests/locomotion.rs b/crates/shacraft-physics/tests/locomotion.rs new file mode 100644 index 0000000..d6fb30b --- /dev/null +++ b/crates/shacraft-physics/tests/locomotion.rs @@ -0,0 +1,624 @@ +use shacraft_physics::{ + Aabb, CollisionBlock, Controls, PhysicsBody, PhysicsSettings, PhysicsWorld, Pose, step, +}; + +fn block(pos: [i32; 3], state: &str, collision: Vec) -> CollisionBlock { + CollisionBlock { + pos, + state: format!("minecraft:{state}"), + collision, + } +} +fn floor(state: &str) -> PhysicsWorld { + let mut world = PhysicsWorld::default(); + for x in -12..=12 { + for z in -60..=60 { + world + .blocks + .push(block([x, -1, z], state, vec![Aabb::unit()])); + } + } + world +} +fn player() -> PhysicsBody { + PhysicsBody { + position: [0.5, 0., 0.5], + velocity: [0., -0.0784000015258789, 0.], + on_ground: true, + ..Default::default() + } +} +fn run(body: &mut PhysicsBody, input: &Controls, world: &PhysicsWorld, ticks: usize) { + for _ in 0..ticks { + step(body, input, world, &PhysicsSettings::default()); + } +} + +#[test] +fn original_java26_2_travel_kernel_trajectories() { + let fixture: serde_json::Value = + serde_json::from_str(include_str!("fixtures/java26.2.json")).unwrap(); + for (case, trajectory) in fixture["travel_kernel_trajectories"].as_object().unwrap() { + let medium = trajectory["medium"].as_str().unwrap_or("air"); + // A fixed shallow-fluid depth is a kernel-only harness condition; + // the integrated world correctly changes depth as a player falls. + if case == "lava_shallow_move_stop" { + continue; + } + let world = if medium == "air" { + floor(trajectory["surface"].as_str().unwrap()) + } else { + let mut world = liquid_world(&format!("{medium}[level=0]")); + for block in &mut world.blocks { + block.pos[1] += 10; + } + world + }; + let mut body = PhysicsBody { + position: serde_json::from_value(trajectory["initial_position"].clone()).unwrap(), + velocity: serde_json::from_value(trajectory["initial_velocity"].clone()).unwrap(), + flying: trajectory["flying"].as_bool().unwrap_or(false), + on_ground: medium == "air" && !trajectory["flying"].as_bool().unwrap_or(false), + ..Default::default() + }; + let input_ticks = trajectory["input_ticks"].as_u64().unwrap(); + for sample in trajectory["samples"].as_array().unwrap() { + let tick = sample["tick"].as_u64().unwrap(); + // Kernel fixture keeps sprint asserted after input release; the + // integrated player controller ends swimming at release instead. + if medium == "water" && trajectory["sprint"].as_bool().unwrap() && tick > input_ticks { + break; + } + let input = Controls { + forward: if tick <= input_ticks { 1. } else { 0. }, + sprint: trajectory["sprint"].as_bool().unwrap(), + jump: tick == 1 && trajectory["jump_first_tick"].as_bool().unwrap(), + ..Default::default() + }; + step( + &mut body, + &input, + &world, + &PhysicsSettings { + allow_flight: true, + ..Default::default() + }, + ); + // Java yaw zero faces +Z; Shacraft yaw zero faces -Z. + for (field, actual) in [("position", body.position), ("velocity", body.velocity)] { + for axis in 0..3 { + let expected = + sample[field][axis].as_f64().unwrap() * if axis == 2 { -1. } else { 1. }; + assert!( + (actual[axis] - expected).abs() < 2.0e-6, + "{case} tick {tick}: {field}[{axis}] actual {} expected {expected}", + actual[axis] + ); + } + } + assert_eq!( + body.on_ground, + sample["on_ground"].as_bool().unwrap(), + "{case} tick {tick}" + ); + } + } +} + +#[test] +fn full_cube_stops_player_but_half_slab_is_stepped_without_jump() { + let mut wall = floor("stone"); + wall.blocks + .push(block([0, 0, -1], "stone", vec![Aabb::unit()])); + let mut blocked = player(); + run( + &mut blocked, + &Controls { + forward: 1., + ..Default::default() + }, + &wall, + 20, + ); + assert!((blocked.position[2] - blocked.width() / 2.).abs() < 1.0e-6); + assert_eq!(blocked.position[1], 0.); + wall.blocks.last_mut().unwrap().collision[0].max[1] = 0.5; + let mut climbed = player(); + run( + &mut climbed, + &Controls { + forward: 1., + ..Default::default() + }, + &wall, + 5, + ); + assert!(climbed.position[2] < 0. && climbed.position[1] >= 0.5); +} + +#[test] +fn step_up_preserves_clearance_under_low_ceiling() { + let mut world = floor("stone"); + world.blocks.push(block( + [0, 0, -1], + "stone_slab[type=bottom]", + vec![Aabb::new([0.; 3], [1., 0.5, 1.])], + )); + world + .blocks + .push(block([0, 2, -1], "stone", vec![Aabb::unit()])); + let mut body = player(); + run( + &mut body, + &Controls { + forward: 1., + ..Default::default() + }, + &world, + 12, + ); + assert!( + body.position[2] >= body.width() / 2. - 1.0e-6, + "standing body must not step into a ceiling" + ); +} + +#[test] +fn sneaking_keeps_support_at_straight_and_diagonal_edges() { + let world = PhysicsWorld { + blocks: vec![block([0, -1, 0], "stone", vec![Aabb::unit()])], + }; + for strafe in [0., 1.] { + let mut body = player(); + run( + &mut body, + &Controls { + forward: 1., + strafe, + sneak: true, + ..Default::default() + }, + &world, + 120, + ); + assert_eq!(body.position[1], 0.); + assert!(body.position[2] > -body.width() / 2.); + assert!(body.position[0] < 1. + body.width() / 2.); + assert_eq!(body.pose, Pose::Crouching); + } + let mut walking = player(); + run( + &mut walking, + &Controls { + forward: 1., + ..Default::default() + }, + &world, + 20, + ); + assert!(walking.position[1] < -1.); +} + +#[test] +fn crawl_pose_persists_until_there_is_headroom() { + let mut world = floor("stone"); + world + .blocks + .push(block([0, 1, 0], "stone", vec![Aabb::unit()])); + let mut body = PhysicsBody { + pose: Pose::Swimming, + ..player() + }; + step( + &mut body, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + assert_eq!(body.pose, Pose::Swimming); + world.blocks.pop(); + step( + &mut body, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + assert_eq!(body.pose, Pose::Standing); +} + +#[test] +fn diagonal_input_is_normalized_and_air_control_is_weaker() { + let world = floor("stone"); + let mut straight = player(); + let mut diagonal = player(); + run( + &mut straight, + &Controls { + forward: 1., + ..Default::default() + }, + &world, + 20, + ); + run( + &mut diagonal, + &Controls { + forward: 1., + strafe: 1., + ..Default::default() + }, + &world, + 20, + ); + let a = (straight.position[0] - 0.5).hypot(straight.position[2] - 0.5); + let b = (diagonal.position[0] - 0.5).hypot(diagonal.position[2] - 0.5); + assert!( + (b / a - 1. / 0.98).abs() < 1.0e-6, + "vanilla normalizes a diagonal after multiplying input by .98" + ); + let mut air = PhysicsBody { + position: [0., 20., 0.], + ..Default::default() + }; + step( + &mut air, + &Controls { + forward: 1., + ..Default::default() + }, + &world, + &PhysicsSettings::default(), + ); + assert!((air.position[2] + 0.019600000381469584).abs() < 1.0e-6); +} + +#[test] +fn held_jump_has_ten_tick_cooldown_and_release_rearms() { + let world = floor("stone"); + let mut body = player(); + let jump = Controls { + jump: true, + ..Default::default() + }; + step(&mut body, &jump, &world, &PhysicsSettings::default()); + assert_eq!(body.jump_cooldown, 10); + body.position[1] = 0.; + body.velocity = [0., -0.08, 0.]; + body.on_ground = true; + step(&mut body, &jump, &world, &PhysicsSettings::default()); + assert_eq!(body.position[1], 0.); + step( + &mut body, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + step(&mut body, &jump, &world, &PhysicsSettings::default()); + assert!(body.position[1] > 0.4); +} + +fn liquid_world(state: &str) -> PhysicsWorld { + let mut world = PhysicsWorld::default(); + for x in -3..=3 { + for z in -12..=3 { + for y in -4..=4 { + world.blocks.push(block([x, y, z], state, vec![])); + } + } + } + world +} +#[test] +fn water_swimming_lava_and_waterlogged_cells_apply_distinct_motion() { + let mut water = PhysicsBody { + position: [0.5, 0., 0.5], + ..Default::default() + }; + let mut lava = water.clone(); + let input = Controls { + forward: 1., + ..Default::default() + }; + run(&mut water, &input, &liquid_world("water[level=0]"), 20); + run(&mut lava, &input, &liquid_world("lava[level=0]"), 20); + assert!(water.in_water && !water.in_lava && lava.in_lava); + assert!(water.position[2] < lava.position[2]); + assert!(water.velocity[1] > lava.velocity[1]); + let mut swimmer = PhysicsBody { + position: [0.5, 0., 0.5], + ..Default::default() + }; + run( + &mut swimmer, + &Controls { + sprint: true, + forward: 1., + pitch: 0.6, + ..Default::default() + }, + &liquid_world("water[level=0]"), + 10, + ); + assert!(swimmer.swimming && swimmer.pose == Pose::Swimming); + assert!(swimmer.position[1] > 0.); + let mut logged = PhysicsBody { + position: [0.5, 0., 0.5], + ..Default::default() + }; + run( + &mut logged, + &input, + &liquid_world("oak_sign[waterlogged=true]"), + 2, + ); + assert!(logged.in_water); +} +#[test] +fn climbable_clamps_fall_and_jump_climbs() { + let world = liquid_world("ladder[facing=north]"); + let mut body = PhysicsBody { + position: [0.5, 2., 0.5], + velocity: [0., -2., 0.], + ..Default::default() + }; + step( + &mut body, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + assert!(body.on_climbable && body.position[1] > 1.84); + let height = body.position[1]; + run( + &mut body, + &Controls { + jump: true, + ..Default::default() + }, + &world, + 5, + ); + assert!(body.position[1] > height); + let height = body.position[1]; + body.velocity[1] = -0.1; + run( + &mut body, + &Controls { + sneak: true, + ..Default::default() + }, + &world, + 5, + ); + assert!((body.position[1] - height).abs() < 1.0e-6); +} +#[test] +fn slime_bounces_without_sneak_and_honey_limits_jump() { + let world = floor("slime_block"); + let mut body = PhysicsBody { + position: [0.5, 0.1, 0.5], + velocity: [0., -0.9, 0.], + ..Default::default() + }; + step( + &mut body, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + assert!(body.velocity[1] > 0.7); + let mut sneaking = PhysicsBody { + position: [0.5, 0.1, 0.5], + velocity: [0., -0.9, 0.], + ..Default::default() + }; + step( + &mut sneaking, + &Controls { + sneak: true, + ..Default::default() + }, + &world, + &PhysicsSettings::default(), + ); + assert!(sneaking.velocity[1] < 0.); + let mut honey = player(); + step( + &mut honey, + &Controls { + jump: true, + ..Default::default() + }, + &floor("honey_block"), + &PhysicsSettings::default(), + ); + assert!((honey.position[1] - 0.21).abs() < 1.0e-6); +} +#[test] +fn cobweb_slows_falling_and_bubble_column_lifts() { + let mut web = PhysicsBody { + position: [0.5, 2., 0.5], + velocity: [0., -1., 0.], + ..Default::default() + }; + step( + &mut web, + &Controls::default(), + &liquid_world("cobweb"), + &PhysicsSettings::default(), + ); + assert!((web.position[1] - 1.95).abs() < 1.0e-6); + let mut bubble = PhysicsBody { + position: [0.5, 0., 0.5], + ..Default::default() + }; + run( + &mut bubble, + &Controls::default(), + &liquid_world("bubble_column[drag=false]"), + 10, + ); + assert!(bubble.position[1] > 0.5 && bubble.velocity[1] > 0.); +} +#[test] +fn powder_snow_and_scaffolding_have_entity_sensitive_support() { + for material in ["powder_snow", "scaffolding"] { + let world = PhysicsWorld { + blocks: vec![block([0, -1, 0], material, vec![Aabb::unit()])], + }; + let mut body = player(); + let settings = PhysicsSettings { + leather_boots: true, + ..Default::default() + }; + step(&mut body, &Controls::default(), &world, &settings); + assert_eq!(body.position[1], 0., "{material}"); + run( + &mut body, + &Controls { + sneak: true, + ..Default::default() + }, + &world, + 5, + ); + assert!(body.position[1] < 0., "{material}"); + } +} +#[test] +fn flight_is_authorized_and_frozen_body_does_not_move() { + let mut denied = player(); + step( + &mut denied, + &Controls { + fly_toggle: true, + ..Default::default() + }, + &PhysicsWorld::default(), + &PhysicsSettings::default(), + ); + assert!(!denied.flying); + let mut flight = player(); + let settings = PhysicsSettings { + allow_flight: true, + ..Default::default() + }; + step( + &mut flight, + &Controls { + fly_toggle: true, + jump: true, + ..Default::default() + }, + &PhysicsWorld::default(), + &settings, + ); + assert!(flight.flying && flight.position[1] > 0.); + let position = flight.position; + step( + &mut flight, + &Controls { + jump: true, + forward: 1., + ..Default::default() + }, + &PhysicsWorld::default(), + &PhysicsSettings { + frozen: true, + ..settings + }, + ); + assert_eq!(flight.position, position); + assert_eq!(flight.velocity, [0.; 3]); +} + +#[test] +fn fluid_and_callback_results_do_not_depend_on_block_serialization_order() { + let mut world = PhysicsWorld { + blocks: vec![ + block([0, 0, 0], "water[level=5]", vec![]), + block([1, 0, 0], "water[level=7]", vec![]), + block([0, 0, 1], "water[level=2]", vec![]), + block([1, 0, 1], "water[level=6]", vec![]), + block([-1, 0, 0], "water[level=0]", vec![]), + ], + }; + let start = PhysicsBody { + position: [0.95, 0., 0.95], + ..Default::default() + }; + let mut forward = start.clone(); + step( + &mut forward, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + world.blocks.reverse(); + let mut reversed = start; + step( + &mut reversed, + &Controls::default(), + &world, + &PhysicsSettings::default(), + ); + assert_eq!(forward.position, reversed.position); + assert_eq!(forward.velocity, reversed.velocity); + assert!( + forward.velocity[0].abs() + forward.velocity[2].abs() > 0., + "fixture must exercise current pushing" + ); +} + +#[test] +fn shallow_grounded_water_jump_uses_the_normal_jump_impulse() { + let mut world = floor("stone"); + world + .blocks + .push(block([0, 0, 0], "water[level=7]", vec![])); + let mut body = player(); + step( + &mut body, + &Controls { + jump: true, + ..Default::default() + }, + &world, + &PhysicsSettings::default(), + ); + assert!((body.position[1] - 0.41999998688697815).abs() < 1.0e-12); + assert_eq!(body.jump_cooldown, 10); +} + +#[test] +fn ground_flight_shortcut_hovers_and_landing_still_cancels_flight() { + let world = floor("stone"); + let settings = PhysicsSettings { + allow_flight: true, + ..Default::default() + }; + let mut body = player(); + step(&mut body, &Controls::default(), &world, &settings); + assert!(body.on_ground && body.velocity[1] < 0.); + step( + &mut body, + &Controls { + fly_toggle: true, + ..Default::default() + }, + &world, + &settings, + ); + assert!(body.flying && !body.on_ground); + for _ in 0..5 { + step(&mut body, &Controls::default(), &world, &settings); + assert!(body.flying && !body.on_ground); + assert_eq!(body.position[1], 0.); + assert_eq!(body.velocity[1], 0.); + } + body.position[1] = 0.1; + body.velocity[1] = -0.2; + step(&mut body, &Controls::default(), &world, &settings); + assert!(body.on_ground && !body.flying); + assert_eq!(body.position[1], 0.); +} diff --git a/crates/shacraft-server/Cargo.toml b/crates/shacraft-server/Cargo.toml index 6b0af34..4fe97b3 100644 --- a/crates/shacraft-server/Cargo.toml +++ b/crates/shacraft-server/Cargo.toml @@ -11,6 +11,7 @@ serde.workspace = true serde_json.workspace = true shacraft-core.workspace = true shacraft-content = { path = "../shacraft-content" } +shacraft-physics = { path = "../shacraft-physics" } axum = { version = "0.8.9", features = ["ws"] } tokio = { version = "1", features = ["full"] } tower-http = { version = "0.6", features = ["fs", "limit", "trace"] } diff --git a/crates/shacraft-server/src/control.rs b/crates/shacraft-server/src/control.rs index 834c040..56e4a6c 100644 --- a/crates/shacraft-server/src/control.rs +++ b/crates/shacraft-server/src/control.rs @@ -11,6 +11,7 @@ impl Game { .map(|w| { let mut v = json!(w); v["mode"] = json!(self.config(&w.name).mode); + v["terrain"] = json!(self.config(&w.name).terrain); v }) .collect::>() @@ -67,11 +68,53 @@ impl Game { .map(|n| n * 1024) }); Ok( - json!({"tick":self.tick,"tick_ms":self.last_tick_ms,"max_tick_ms":self.max_tick_ms,"uptime_seconds":self.started.elapsed().as_secs(),"players":self.players.len(),"active_worlds":self.players.values().map(|p|&p.world).collect::>().len(),"world_count":self.store.list_worlds()?.len(),"plans":self.plans.len(),"entities":self.meta.entities.len(),"entity_revision":self.meta.revision,"rss_bytes":rss,"slow_clients_disconnected":self.slow_clients,"queued_client_bytes":self.players.values().map(|p|p.out.bytes.load(Ordering::Relaxed)).sum::(),"limits":{"players":32,"command_queue":64,"messages_per_client":16,"bytes_per_client":8388608,"build_plans":16,"plan_cells":32768},"storage":self.store.stats(),"catalog":self.catalog.summary(),"wasm":self.jump.metrics()}), + json!({"tick":self.tick,"tick_ms":self.last_tick_ms,"max_tick_ms":self.max_tick_ms,"uptime_seconds":self.started.elapsed().as_secs(),"players":self.players.len(),"active_worlds":self.players.values().map(|p|&p.world).collect::>().len(),"world_count":self.store.list_worlds()?.len(),"plans":self.plans.len(),"entities":self.meta.entities.len(),"entity_revision":self.meta.revision,"rss_bytes":rss,"slow_clients_disconnected":self.slow_clients,"queued_client_bytes":self.players.values().map(|p|p.out.bytes.load(Ordering::Relaxed)).sum::(),"limits":{"players":32,"command_queue":64,"messages_per_client":16,"bytes_per_client":8388608,"build_plans":16,"plan_cells":32768},"terrain":self.terrain.stats(),"stream":{"batches":self.stream_batches,"sections":self.stream_sections,"last_ms":self.last_stream_ms,"waiting_players":self.players.values().filter(|p|p.waiting_terrain).count()},"tick_samples_ms":self.tick_samples,"storage":self.store.stats(),"catalog":self.catalog.summary(),"wasm":self.jump.metrics()}), + ) + } + "diagnostics.snapshot" => Ok( + json!({"tick":self.tick,"tick_ms":self.last_tick_ms,"stream_ms":self.last_stream_ms,"terrain":self.terrain.stats(),"players":self.players.values().map(|p|json!({"id":p.id,"world":p.world,"position":p.position,"velocity":p.body.velocity,"waiting_terrain":p.waiting_terrain,"view":p.view,"generation":p.view_generation,"sent_sections":p.sent_sections.len(),"view_distance":p.view_distance,"stream_radius":p.stream_radius(),"pending_inputs":p.pending_inputs.len(),"processed_seq":p.processed_seq})).collect::>()}), + ), + "player.teleport" => { + let id = string(&p, "id")?; + let position: [f64; 3] = serde_json::from_value(p["position"].clone())?; + ensure!( + position + .iter() + .all(|v| v.is_finite() && v.abs() <= crate::terrain::BORDER) + && (-128.0..=1024.0).contains(&position[1]), + "position outside playable bounds" + ); + let player = self.players.get_mut(id).context("unknown player")?; + player.position = position; + player.velocity = 0.; + player.grounded = false; + player.input = Input::default(); + player.reset_motion(); + if p["flying"] == true { + player.body.flying = true; + } + self.snapshot(id, false)?; + Ok(json!({"id":id,"position":position})) + } + "terrain.inspect" => { + let world = string(&p, "world")?; + let position: Pos = serde_json::from_value(p["position"].clone())?; + let generator = self + .generators + .get(world) + .context("world is not procedural")?; + Ok( + json!({"world":world,"config":generator.config,"position":position,"height":generator.height(position[0],position[2]),"biome":generator.biome(position[0],position[2]),"min_y":crate::terrain::MIN_Y,"max_y":crate::terrain::MAX_Y,"border":crate::terrain::BORDER}), ) } "world.create" => { let world = string(&p, "world")?; + if let Some(config) = p.get("terrain") { + self.create_overworld(world, serde_json::from_value(config.clone())?)?; + return Ok( + json!({"world":world,"revision":0,"terrain":self.config(world).terrain}), + ); + } self.store.create_world(world, p["template"].as_str())?; let conf = if let Some(template) = p["template"].as_str() { let mut c = self.config(template); @@ -84,13 +127,14 @@ impl Game { }; self.meta.worlds.insert(world.into(), conf); self.save_meta()?; + self.open_generators()?; Ok(json!({"world":world,"revision":0})) } "world.read" => { let world = string(&p, "world")?; let min: Pos = serde_json::from_value(p["min"].clone())?; let max: Pos = serde_json::from_value(p["max"].clone())?; - let blocks = self.store.read_region(world, min, max)?; + let blocks = self.read_world_region(world, min, max)?; let response = json!({"world":world,"revision":self.store.revision(world)?,"blocks":blocks,"materials":self.materials(&blocks)}); ensure!( response.to_string().len() <= 6 * 1024 * 1024, @@ -105,9 +149,11 @@ impl Game { .context("expected_revision required")?; let op = string(&p, "operation_id")?; let changes: Vec = serde_json::from_value(p["changes"].clone())?; + self.materialize_changes(world, &changes)?; let result = self.store.edit(world, rev, op, changes.clone())?; + self.terrain_changed(world, &changes); if !result.replayed { - self.broadcast(world,json!({"type":"blocks","revision":result.revision,"changes":changes,"materials":self.materials(&changes)})); + self.broadcast_blocks(world, result.revision, &changes); } Ok(json!(result)) } @@ -248,7 +294,7 @@ impl Game { .context("min_players too large")?; } if p.get("elimination_y").is_some() { - conf.elimination_y = number(&p, "elimination_y")?; + conf.elimination_y = f64::from(number(&p, "elimination_y")?); } if let Some(value) = p.get("floor_block") { let name = value @@ -274,14 +320,17 @@ impl Game { ensure!(plan.expires > Instant::now(), "plan expired"); let world = plan.world.clone(); let changes = plan.changes.clone(); + let revision = plan.revision; + self.materialize_changes(&world, &changes)?; let result = self.store.edit( &world, - plan.revision, + revision, string(&p, "operation_id")?, changes.clone(), )?; if !result.replayed { - self.broadcast(&world,json!({"type":"blocks","revision":result.revision,"changes":changes,"materials":self.materials(&changes)})); + self.terrain_changed(&world, &changes); + self.broadcast_blocks(&world, result.revision, &changes); } Ok(json!(result)) } @@ -291,7 +340,7 @@ impl Game { serde_json::from_value(p.get("min").cloned().unwrap_or(json!([-24, -4, -24])))?; let max: Pos = serde_json::from_value(p.get("max").cloned().unwrap_or(json!([24, 24, 24])))?; - let blocks = self.store.read_region(world, min, max)?; + let blocks = self.read_world_region(world, min, max)?; let colors = blocks .iter() .map(|b| { @@ -470,8 +519,8 @@ impl Game { ) } } -fn entity_position(v: &Value) -> Result<[f32; 3]> { - let p: [f32; 3] = serde_json::from_value(v.clone())?; +fn entity_position(v: &Value) -> Result<[f64; 3]> { + let p: [f64; 3] = serde_json::from_value(v.clone())?; ensure!( p.iter().all(|n| n.is_finite() && n.abs() <= 32700.), "position outside playable limits +/-32700" diff --git a/crates/shacraft-server/src/game.rs b/crates/shacraft-server/src/game.rs index 3e89609..b2e4af6 100644 --- a/crates/shacraft-server/src/game.rs +++ b/crates/shacraft-server/src/game.rs @@ -3,8 +3,11 @@ use serde::{Deserialize, Serialize}; use serde_json::{Value, json}; use shacraft_content::{Catalog, StateDefinition}; use shacraft_core::{BlockChange, Pos, WorldStore}; +use shacraft_physics::{ + Aabb as PhysicsAabb, CollisionBlock, Controls, PhysicsBody, PhysicsSettings, PhysicsWorld, +}; use std::{ - collections::{BTreeMap, HashMap, HashSet}, + collections::{BTreeMap, HashMap, HashSet, VecDeque}, path::Path, sync::{ Arc, @@ -47,15 +50,16 @@ impl Outbox { #[derive(Clone, Serialize, Deserialize)] #[serde(default)] pub struct WorldConfig { - pub spawn: [f32; 3], + pub spawn: [f64; 3], pub mode: String, pub countdown_seconds: u32, pub round_seconds: u32, pub min_players: usize, - pub elimination_y: f32, - pub spawn_points: Vec<[f32; 3]>, - pub spectator_spawn: [f32; 3], + pub elimination_y: f64, + pub spawn_points: Vec<[f64; 3]>, + pub spectator_spawn: [f64; 3], pub floor_block: String, + pub terrain: Option, } impl Default for WorldConfig { fn default() -> Self { @@ -69,6 +73,7 @@ impl Default for WorldConfig { spawn_points: Vec::new(), spectator_spawn: [13., 2., 0.], floor_block: "minecraft:snow_block".into(), + terrain: None, } } } @@ -107,8 +112,14 @@ impl WorldConfig { .chain(&self.spawn_points) { ensure!( - point.iter().all(|n| n.is_finite() && n.abs() <= 32700.), - "spawn position outside playable limits +/-32700" + point.iter().all(|n| n.is_finite() + && n.abs() + <= if self.terrain.is_some() { + crate::terrain::BORDER + } else { + 32700. + }), + "spawn position outside playable world border" ); ensure!( point[1] > self.elimination_y + 0.5, @@ -118,11 +129,14 @@ impl WorldConfig { for (i, a) in self.spawn_points.iter().enumerate() { for b in self.spawn_points.iter().skip(i + 1) { ensure!( - (0..3).map(|axis| (a[axis] - b[axis]).powi(2)).sum::() >= 0.64, + (0..3).map(|axis| (a[axis] - b[axis]).powi(2)).sum::() >= 0.64, "spawn_points are too close together" ); } } + if let Some(terrain) = &self.terrain { + terrain.validate()?; + } let floor = catalog .state(&self.floor_block) .context("unknown floor_block")?; @@ -149,23 +163,117 @@ struct Input { forward: f32, strafe: f32, jump: bool, + sprint: bool, + sneak: bool, + fly_toggle: bool, +} +impl Input { + fn controls(&self) -> Controls { + Controls { + forward: f64::from(self.forward), + strafe: f64::from(self.strafe), + yaw: f64::from(self.yaw), + pitch: f64::from(self.pitch), + jump: self.jump, + sprint: self.sprint, + sneak: self.sneak, + fly_toggle: self.fly_toggle, + } + } } struct Player { id: String, name: String, world: String, - position: [f32; 3], + position: [f64; 3], velocity: f32, grounded: bool, + body: PhysicsBody, + physics_settings: PhysicsSettings, + prediction: bool, + pending_inputs: VecDeque, + received_seq: u64, + processed_seq: u64, + motion_epoch: u64, + // Latest received view angles stay independent of queued movement replay. + look: [f32; 2], input: Input, out: Outbox, last_input: Instant, last_action: Instant, last_chat: Instant, last_snapshot: Instant, + last_view: Instant, + chunk_stream: bool, + section_stream: bool, + view_distance: i32, + buffered_view: bool, + full_height: bool, + last_distance_change: Instant, + sent_sections: HashSet, + pending_sections: VecDeque, + view_generation: u64, + welcomed: bool, + last_batch: Instant, + waiting_terrain: bool, view: [i32; 3], alive: bool, } +impl Player { + fn stream_radius(&self) -> i32 { + self.view_distance + i32::from(self.buffered_view) + } +} + +impl Player { + fn reset_motion(&mut self) { + self.body = PhysicsBody { + position: self.position, + velocity: [0., f64::from(self.velocity) / 20., 0.], + on_ground: self.grounded, + ..PhysicsBody::default() + }; + self.pending_inputs.clear(); + self.processed_seq = self.received_seq; + self.motion_epoch += 1; + } + fn synchronize_pose(&mut self) { + if self.body.position != self.position { + self.reset_motion(); + } + self.body.on_ground = self.grounded; + if (self.body.velocity[1] * 20.) as f32 != self.velocity { + self.body.velocity[1] = f64::from(self.velocity) / 20.; + } + } +} +#[derive(Serialize)] +struct ViewSection { + section: Pos, + blocks: Vec, +} + +fn view_bounds(center: Pos) -> (Pos, Pos) { + ( + [center[0] - 32, center[1] - 16, center[2] - 32], + [center[0] + 31, center[1] + 31, center[2] + 31], + ) +} + +fn view_sections(center: Pos) -> Vec { + let (min, max) = view_bounds(center); + let min = min.map(|v| v.div_euclid(16)); + let max = max.map(|v| v.div_euclid(16)); + let mut sections = Vec::with_capacity(48); + for x in min[0]..=max[0] { + for y in min[1]..=max[1] { + for z in min[2]..=max[2] { + sections.push([x, y, z]); + } + } + } + sections +} #[derive(Clone)] struct Match { phase: String, @@ -195,6 +303,13 @@ pub struct Game { last_tick_ms: f64, slow_clients: u64, pub jump: crate::packages::JumpModule, + terrain: crate::terrain::TerrainService, + generators: HashMap>, + sky_cache: HashMap<(String, i32, i32), Vec>, + stream_batches: u64, + stream_sections: u64, + last_stream_ms: f64, + tick_samples: VecDeque, } impl Game { pub fn open( @@ -240,11 +355,27 @@ impl Game { last_tick_ms: 0., slow_clients: 0, jump, + terrain: crate::terrain::TerrainService::new(), + generators: HashMap::new(), + sky_cache: HashMap::new(), + stream_batches: 0, + stream_sections: 0, + last_stream_ms: 0., + tick_samples: VecDeque::with_capacity(600), }; for conf in game.meta.worlds.values() { conf.validate(&game.catalog)?; } game.seed()?; + game.open_generators()?; + if !game + .store + .list_worlds()? + .iter() + .any(|world| world.name == "overworld") + { + game.create_overworld("overworld", crate::terrain::TerrainConfig::default())?; + } for world in game.meta.active_matches.clone() { let revision = game.store.revision(&world)?; game.store.reset_world( @@ -490,6 +621,10 @@ impl Game { self.step(); self.last_tick_ms = start.elapsed().as_secs_f64() * 1000.; self.max_tick_ms = self.max_tick_ms.max(self.last_tick_ms); + if self.tick_samples.len() == 600 { + self.tick_samples.pop_front(); + } + self.tick_samples.push_back(self.last_tick_ms); next += Duration::from_millis(50); if next < Instant::now() { next = Instant::now() + Duration::from_millis(50); @@ -520,10 +655,19 @@ impl Game { self.meta.worlds.get(world).cloned().unwrap_or_default() } fn players_json(&self, world: &str) -> Value { - json!(self.players.values().filter(|p|p.world==world).map(|p|json!({"id":p.id,"name":p.name,"position":p.position,"yaw":p.input.yaw,"pitch":p.input.pitch,"alive":p.alive})).collect::>()) + json!(self.players.values().filter(|p|p.world==world).map(|p|json!({"id":p.id,"name":p.name,"position":p.body.position,"yaw":p.look[0],"pitch":p.look[1],"alive":p.alive,"velocity":p.body.velocity,"pose":p.body.pose,"height":p.body.height(),"eye_height":p.body.eye_height(),"sprinting":p.body.sprinting,"flying":p.body.flying})).collect::>()) + } + fn motion_json(&self, p: &Player) -> Value { + let mut settings = p.physics_settings.clone(); + settings.frozen |= p.waiting_terrain; + json!({"body":p.body,"ack":p.processed_seq,"tick":self.tick, + "epoch":p.motion_epoch,"settings":settings,"waiting_terrain":p.waiting_terrain}) } fn materials(&self, blocks: &[BlockChange]) -> Vec { - let ids: HashSet<_> = blocks.iter().map(|b| b.block).collect(); + self.materials_for_ids(blocks.iter().map(|b| b.block)) + } + fn materials_for_ids(&self, ids: impl Iterator) -> Vec { + let ids: HashSet<_> = ids.collect(); let mut budget = 0; ids.into_iter() .filter_map(|id| self.material(id)) @@ -545,18 +689,98 @@ impl Game { Some(v) } fn snapshot(&mut self, id: &str, welcome: bool) -> Result<()> { + let player = self.players.get(id).context("not joined")?; + let allow_flight = self.config(&player.world).mode == "creative" || !player.alive; + let frozen = self + .matches + .get(&player.world) + .is_some_and(|m| m.phase == "countdown"); + if let Some(player) = self.players.get_mut(id) { + player.synchronize_pose(); + player.physics_settings.allow_flight = allow_flight; + player.physics_settings.frozen = frozen; + player.physics_settings.jump_impulse = None; + if !allow_flight { + player.body.flying = false; + } + if !player.alive { + player.body.flying = true; + } + } let p = self.players.get(id).context("not joined")?; let world = p.world.clone(); let center = p.position.map(|v| (v.floor() as i32).div_euclid(16) * 16); - let blocks = self.store.read_region( - &world, - [center[0] - 32, center[1] - 8, center[2] - 32], - [center[0] + 31, center[1] + 31, center[2] + 31], - )?; - let value = json!({"type":if welcome{"welcome"}else{"snapshot"},"id":id,"world":world,"revision":self.store.revision(&world)?,"spawn":p.position,"blocks":blocks,"materials":self.materials(&blocks),"players":self.players_json(&world),"entities":self.entity_list(&world),"manifest_hash":self.manifest["hash"],"view_center":center}); + if p.section_stream { + return self.begin_section_view(id, center, true); + } + let (min, max) = if p.chunk_stream { + view_bounds(center) + } else { + ( + [center[0] - 32, center[1] - 8, center[2] - 32], + [center[0] + 31, center[1] + 31, center[2] + 31], + ) + }; + let blocks = self.read_world_region(&world, min, max)?; + let p = &self.players[id]; + let mut value = json!({"type":if welcome{"welcome"}else{"snapshot"},"id":id,"world":world,"revision":self.store.revision(&world)?,"spawn":p.position,"blocks":blocks,"materials":self.materials(&blocks),"players":self.players_json(&world),"entities":self.entity_list(&world),"manifest_hash":self.manifest["hash"],"view_center":center}); + if p.chunk_stream { + value["features"] = json!(["chunk_stream_v1"]); + value["view_min"] = json!(min); + value["view_max"] = json!(max); + } + if p.prediction { + value["motion"] = self.motion_json(p); + let mut features = if p.chunk_stream { + vec!["chunk_stream_v1"] + } else { + vec![] + }; + features.push("movement_prediction_v1"); + value["features"] = json!(features); + } if let Some(p) = self.players.get_mut(id) { p.view = center; p.last_snapshot = Instant::now(); + p.last_view = p.last_snapshot; + } + self.send(id, value); + Ok(()) + } + fn stream_view(&mut self, id: &str, center: Pos) -> Result<()> { + let p = self.players.get(id).context("not joined")?; + let world = p.world.clone(); + let from_center = p.view; + let old_sections = view_sections(from_center); + let new_sections = view_sections(center); + let old: HashSet<_> = old_sections.iter().copied().collect(); + let new: HashSet<_> = new_sections.iter().copied().collect(); + let unload: Vec<_> = old_sections + .into_iter() + .filter(|section| !new.contains(section)) + .collect(); + let mut sections = Vec::new(); + for section in new_sections + .into_iter() + .filter(|section| !old.contains(section)) + { + let min = section.map(|v| v * 16); + let max = min.map(|v| v + 15); + sections.push(ViewSection { + section, + blocks: self.store.read_region(&world, min, max)?, + }); + } + let materials = self.materials_for_ids( + sections + .iter() + .flat_map(|section| section.blocks.iter().map(|block| block.block)), + ); + let (min, max) = view_bounds(center); + let value = json!({"type":"chunks","world":world,"revision":self.store.revision(&world)?,"from_center":from_center,"view_center":center,"view_min":min,"view_max":max,"unload":unload,"sections":sections,"materials":materials}); + if let Some(p) = self.players.get_mut(id) { + p.view = center; + p.last_view = Instant::now(); } self.send(id, value); Ok(()) @@ -574,12 +798,30 @@ impl Game { self.config(world).mode != "template", "template is not a playable world" ); + ensure!( + !self.generators.contains_key(world) + || p["features"] + .as_array() + .is_some_and(|f| f.iter().any(|v| v == "chunk_stream_v2")), + "This world requires chunk_stream_v2; refresh the client" + ); let name = p["name"].as_str().unwrap_or("Игрок").trim(); ensure!( !name.is_empty() && name.chars().count() <= 32 && !name.chars().any(char::is_control), "invalid player name" ); let id = Uuid::new_v4().to_string(); + let view_distance = if let Some(value) = p.get("view_distance") { + let radius = value.as_i64().context("view_distance must be an integer")?; + ensure!( + (i64::from(terrain::MIN_VIEW_RADIUS)..=i64::from(terrain::MAX_VIEW_RADIUS)) + .contains(&radius), + "view_distance must be 2..64 chunks" + ); + radius as i32 + } else { + terrain::VIEW_RADIUS + }; let now = Instant::now(); self.players.insert( id.clone(), @@ -594,12 +836,50 @@ impl Game { }, velocity: 0., grounded: false, + body: PhysicsBody::default(), + physics_settings: PhysicsSettings { + allow_flight: self.config(world).mode == "creative", + ..PhysicsSettings::default() + }, + prediction: p["features"].as_array().is_some_and(|features| { + features + .iter() + .any(|feature| feature.as_str() == Some("movement_prediction_v1")) + }), + pending_inputs: VecDeque::new(), + received_seq: 0, + processed_seq: 0, + motion_epoch: 0, + look: [0.; 2], input: Input::default(), out, last_input: now, last_action: now - Duration::from_secs(1), last_chat: now - Duration::from_secs(1), last_snapshot: now, + last_view: now, + section_stream: p["features"] + .as_array() + .is_some_and(|f| f.iter().any(|v| v == "chunk_stream_v2")), + sent_sections: HashSet::new(), + pending_sections: VecDeque::new(), + view_distance, + full_height: p["features"] + .as_array() + .is_some_and(|f| f.iter().any(|v| v == "full_height_v1")), + buffered_view: p["features"] + .as_array() + .is_some_and(|f| f.iter().any(|v| v == "view_buffer_v1")), + last_distance_change: now - Duration::from_secs(1), + view_generation: 0, + welcomed: false, + last_batch: now - Duration::from_secs(1), + waiting_terrain: false, + chunk_stream: p["features"].as_array().is_some_and(|features| { + features + .iter() + .any(|feature| feature.as_str() == Some("chunk_stream_v1")) + }), view: [0; 3], alive: !self.matches.contains_key(world), }, @@ -612,6 +892,32 @@ impl Game { let player = self.players.get(id).context("not joined")?; let world = player.world.clone(); match typ { + "view_distance" => { + ensure!( + player.section_stream, + "view distance requires chunk_stream_v2" + ); + let distance = p["chunks"].as_i64().context("chunks must be an integer")?; + ensure!( + (i64::from(terrain::MIN_VIEW_RADIUS)..=i64::from(terrain::MAX_VIEW_RADIUS)) + .contains(&distance), + "view distance must be 2..64 chunks" + ); + if player.view_distance == distance as i32 { + return Ok(()); + } + ensure!( + player.last_distance_change.elapsed() >= Duration::from_millis(500), + "view distance change rate limited" + ); + let center = player + .position + .map(|v| (v.floor() as i32).div_euclid(16) * 16); + let player = self.players.get_mut(id).unwrap(); + player.view_distance = distance as i32; + player.last_distance_change = Instant::now(); + self.begin_section_view(id, center, false)?; + } "input" => { let seq = p["seq"].as_u64().context("input sequence required")?; let yaw = number(&p, "yaw")?; @@ -626,18 +932,52 @@ impl Game { "invalid movement input" ); let player = self.players.get_mut(id).unwrap(); - if seq > player.input.seq { - player.input = Input { + if seq > player.received_seq { + let input = Input { seq, yaw, pitch, forward, strafe, jump: p["jump"].as_bool().unwrap_or(false), + sprint: p["sprint"].as_bool().unwrap_or(false), + sneak: p["sneak"].as_bool().unwrap_or(false), + fly_toggle: p["fly_toggle"].as_bool().unwrap_or(false), }; + if player.prediction { + ensure!( + player.pending_inputs.len() < 32, + "movement command queue full" + ); + player.pending_inputs.push_back(input); + } else { + player.input = input; + } + player.received_seq = seq; + player.look = [yaw, pitch]; player.last_input = Instant::now(); } } + "look" => { + let yaw = number(&p, "yaw")?; + let pitch = number(&p, "pitch")?; + ensure!(pitch.abs() <= 1.6 && yaw.abs() < 1e7, "invalid look input"); + let player = self.players.get_mut(id).unwrap(); + player.look = [yaw, pitch]; + } + "input_reset" => { + let player = self.players.get_mut(id).unwrap(); + player.pending_inputs.clear(); + player.processed_seq = player.received_seq; + player.input = Input { + seq: player.processed_seq, + yaw: player.input.yaw, + pitch: player.input.pitch, + ..Input::default() + }; + player.motion_epoch += 1; + player.last_input = Instant::now(); + } "break" | "place" => { ensure!( player.last_action.elapsed() >= Duration::from_millis(110), @@ -661,7 +1001,7 @@ impl Game { if conf.mode == "spleef" { ensure!(typ=="break"&&self.matches.get(&world).is_some_and(|m|m.phase=="active"&&m.participants.contains(id)),"Spleef allows breaking the configured floor only during a match"); ensure!( - self.store.get_block(&world, pos)? == self.id(&conf.floor_block)?, + self.world_block(&world, pos)? == self.id(&conf.floor_block)?, "arena boundary is protected" ); } @@ -676,8 +1016,12 @@ impl Game { .context("invalid block id")? as u32 }; if block != 0 { + let boxes = self + .definition(block) + .map(|s| s.collision.clone()) + .unwrap_or_else(|| vec![shacraft_content::Aabb::new([0.; 3], [1.; 3])]); ensure!( - self.store.get_block(&world, pos)? == 0, + self.world_block(&world, pos)? == 0, "placement cell occupied" ); ensure!( @@ -685,15 +1029,28 @@ impl Game { .players .values() .filter(|q| q.world == world) - .any(|q| intersects( - q.position, - [pos[0] as f32, pos[1] as f32, pos[2] as f32], - [pos[0] as f32 + 1., pos[1] as f32 + 1., pos[2] as f32 + 1.] - )), + .any(|q| boxes.iter().any(|b| { + let half = q.body.width() / 2.; + let min = [ + q.body.position[0] - half, + q.body.position[1], + q.body.position[2] - half, + ]; + let max = [ + q.body.position[0] + half, + q.body.position[1] + q.body.height(), + q.body.position[2] + half, + ]; + (0..3).all(|i| { + min[i] < f64::from(pos[i]) + f64::from(b.max[i]) - 1e-7 + && max[i] > f64::from(pos[i]) + f64::from(b.min[i]) + 1e-7 + }) + })), "placement intersects a player" ); } let changes = vec![BlockChange { pos, block }]; + self.materialize_changes(&world, &changes)?; let rev = self.store.revision(&world)?; let result = self.store.edit( &world, @@ -701,8 +1058,9 @@ impl Game { &format!("play-{}", Uuid::new_v4()), changes.clone(), )?; + self.terrain_changed(&world, &changes); self.players.get_mut(id).unwrap().last_action = Instant::now(); - self.broadcast(&world,json!({"type":"blocks","revision":result.revision,"changes":changes,"materials":self.materials(&changes)})); + self.broadcast_blocks(&world, result.revision, &changes); } "switch_world" => { ensure!( @@ -713,6 +1071,10 @@ impl Game { self.store.revision(target)?; let conf = self.config(target); ensure!(conf.mode != "template", "template is not playable"); + ensure!( + conf.terrain.is_none() || player.section_stream, + "procedural worlds require chunk_stream_v2; refresh the browser client" + ); if let Some(m) = self.matches.get_mut(&world) { m.participants.remove(id); } @@ -725,8 +1087,10 @@ impl Game { conf.spawn }; q.velocity = 0.; + q.grounded = false; q.input = Input::default(); q.alive = !spectator; + q.reset_motion(); self.snapshot(id, false)?; } "resync" => { @@ -748,7 +1112,10 @@ impl Game { let q = self.players.get_mut(id).unwrap(); q.position = spawn; q.velocity = 0.; + q.grounded = false; + q.input = Input::default(); q.alive = true; + q.reset_motion(); } "start_match" => { self.start_match(&world)?; @@ -774,6 +1141,7 @@ impl Game { } Ok(()) } + #[cfg(test)] fn collision_boxes( &mut self, world: &str, @@ -812,36 +1180,88 @@ impl Game { .get(id as usize) .and_then(|s| self.catalog.state(s)) } + fn physics_world(&mut self, world: &str, body: &PhysicsBody) -> Result { + // Include the swept motion plus neighbors needed by shapes, fluids and stepping. + let min = std::array::from_fn(|axis| { + (body.position[axis] + body.velocity[axis].min(0.) - 3.).floor() as i32 + }); + let max = std::array::from_fn(|axis| { + (body.position[axis] + + body.velocity[axis].max(0.) + + if axis == 1 { body.height() + 3. } else { 3. }) + .ceil() as i32 + }); + let blocks = self + .read_world_region(world, min, max)? + .into_iter() + .map(|block| { + let definition = self.definition(block.block); + CollisionBlock { + pos: block.pos, + state: self + .store + .registry() + .get(block.block as usize) + .cloned() + .unwrap_or_default(), + collision: definition + .map(|d| { + d.collision + .iter() + .map(|b| PhysicsAabb { + min: b.min.map(f64::from), + max: b.max.map(f64::from), + }) + .collect() + }) + .unwrap_or_else(|| vec![PhysicsAabb::unit()]), + } + }) + .collect(); + Ok(PhysicsWorld { blocks }) + } fn step(&mut self) { self.tick += 1; + self.pump_terrain(); let ids: Vec<_> = self.players.keys().cloned().collect(); for id in ids { let Some(mut p) = self.players.remove(&id) else { continue; }; + p.synchronize_pose(); if p.last_input.elapsed() > Duration::from_secs(1) { - p.input.forward = 0.; - p.input.strafe = 0.; - p.input.jump = false; + p.pending_inputs.clear(); + p.processed_seq = p.received_seq; + p.input = Input { + seq: p.processed_seq, + yaw: p.input.yaw, + pitch: p.input.pitch, + ..Input::default() + }; + } + if p.prediction { + if let Some(input) = p.pending_inputs.pop_front() { + p.processed_seq = input.seq; + p.input = input; + } + } else { + p.processed_seq = p.input.seq; } let conf = self.config(&p.world); - let frozen = self + p.physics_settings.frozen = self .matches .get(&p.world) .is_some_and(|m| m.phase == "countdown"); - let speed = if frozen { 0. } else { 5. }; - let len = (p.input.forward * p.input.forward + p.input.strafe * p.input.strafe) - .sqrt() - .max(1.); - let dx = (p.input.yaw.sin() * p.input.forward + p.input.yaw.cos() * p.input.strafe) - * speed - * 0.05 - / len; - let dz = (-p.input.yaw.cos() * p.input.forward + p.input.yaw.sin() * p.input.strafe) - * speed - * 0.05 - / len; - if p.input.jump && p.grounded && !frozen { + p.physics_settings.allow_flight = conf.mode == "creative" || !p.alive; + p.physics_settings.jump_impulse = None; + if !p.alive { + p.body.flying = true; + } + if p.input.jump + && p.body.on_ground + && p.body.jump_cooldown <= 1 + && !p.physics_settings.frozen + { let under = [ p.position[0].floor() as i32, (p.position[1] - 0.2).floor() as i32, @@ -853,62 +1273,49 @@ impl Game { .ok() .and_then(|id| self.store.registry().get(id as usize)) .is_some_and(|state| self.jump.handles(state)); - p.velocity = if trampoline { - self.jump.call().unwrap_or(7.) - } else { - 7. - }; - p.grounded = false; + if trampoline { + p.physics_settings.jump_impulse = + Some(f64::from(self.jump.call().unwrap_or(7.)) / 20.); + } } - p.velocity = (p.velocity - 20. * 0.05).max(-30.); - let movement = [dx, p.velocity * 0.05, dz]; - p.grounded = false; - let center = p.position.map(|v| v.floor() as i32); - let boxes = match self.collision_boxes( - &p.world, - [center[0] - 3, center[1] - 5, center[2] - 3], - [center[0] + 3, center[1] + 5, center[2] + 3], - ) { - Ok(boxes) => boxes, - Err(e) => { - p.out - .send(json!({"type":"error","message":format!("world read failed: {e}")})); + let physics_world = match self.physics_world(&p.world, &p.body) { + Ok(world) => { + p.waiting_terrain = false; + world + } + Err(error) if error.to_string().contains("terrain pending") => { + p.waiting_terrain = true; + // Freeze the body and discard acknowledged motion instead of + // falling through sections that have not been generated yet. + p.body.velocity = [0.; 3]; + p.velocity = 0.; + p.pending_inputs.clear(); + p.processed_seq = p.received_seq; + p.motion_epoch += 1; + self.players.insert(id, p); + continue; + } + Err(error) => { + p.out.send( + json!({"type":"error","message":format!("world read failed: {error}")}), + ); self.players.insert(id, p); continue; } }; - for axis in [0, 2, 1] { - if movement[axis].abs() < 1e-6 { - continue; - } - let steps = (movement[axis].abs() / 0.15).ceil().max(1.) as usize; - for _ in 0..steps { - let mut candidate = p.position; - candidate[axis] += movement[axis] / steps as f32; - if boxes.iter().any(|b| intersects(candidate, b.min, b.max)) { - let mut low = 0.; - let mut high = 1.; - for _ in 0..10 { - let t = (low + high) * 0.5; - let mut at = p.position; - at[axis] += (candidate[axis] - p.position[axis]) * t; - if boxes.iter().any(|b| intersects(at, b.min, b.max)) { - high = t; - } else { - low = t; - } - } - p.position[axis] += (candidate[axis] - p.position[axis]) * low; - if axis == 1 { - p.grounded = movement[1] < 0.; - p.velocity = 0.; - } - break; - } - p.position = candidate; - } - } - if p.position[1] < conf.elimination_y || p.position.iter().any(|v| v.abs() > 32700.) { + shacraft_physics::step( + &mut p.body, + &p.input.controls(), + &physics_world, + &p.physics_settings, + ); + p.input.fly_toggle = false; + p.position = p.body.position; + p.velocity = (p.body.velocity[1] * 20.) as f32; + p.grounded = p.body.on_ground; + if p.position[1] < conf.elimination_y + || p.position.iter().any(|v| v.abs() > crate::terrain::BORDER) + { let active = self .matches .get(&p.world) @@ -920,12 +1327,21 @@ impl Game { p.position = conf.spawn; } p.velocity = 0.; + p.grounded = false; + p.input = Input::default(); + p.reset_motion(); } self.players.insert(id.clone(), p); let p = &self.players[&id]; let center = p.position.map(|v| (v.floor() as i32).div_euclid(16) * 16); - if center != p.view && p.last_snapshot.elapsed() > Duration::from_secs(2) { - let _ = self.snapshot(&id, false); + if center != p.view { + if p.section_stream { + let _ = self.begin_section_view(&id, center, false); + } else if p.chunk_stream && p.last_view.elapsed() >= Duration::from_millis(250) { + let _ = self.stream_view(&id, center); + } else if !p.chunk_stream && p.last_snapshot.elapsed() > Duration::from_secs(2) { + let _ = self.snapshot(&id, false); + } } } self.advance_matches(); @@ -937,13 +1353,15 @@ impl Game { .players .values() .filter(|p| p.world == world) - .map(|p| (p.id.clone(), p.input.seq)) + .map(|p| (p.id.clone(), p.processed_seq)) .collect(); for (id, ack) in ids { - self.send( - &id, - json!({"type":"state","tick":self.tick,"ack":ack,"players":players,"match":m}), - ); + let mut message = + json!({"type":"state","tick":self.tick,"ack":ack,"players":players,"match":m}); + if let Some(player) = self.players.get(&id).filter(|p| p.prediction) { + message["motion"] = self.motion_json(player); + } + self.send(&id, message); } } self.plans.retain(|_, p| p.expires > Instant::now()); @@ -951,17 +1369,22 @@ impl Game { fn raycast(&mut self, id: &str) -> Result> { let p = self.players.get(id).context("not joined")?; let world = p.world.clone(); - let eye = [p.position[0], p.position[1] + 1.62, p.position[2]]; - let dir = [ - p.input.yaw.sin() * p.input.pitch.cos(), - p.input.pitch.sin(), - -p.input.yaw.cos() * p.input.pitch.cos(), + let eye = [ + p.position[0], + p.position[1] + p.body.eye_height(), + p.position[2], ]; + let dir = [ + p.look[0].sin() * p.look[1].cos(), + p.look[1].sin(), + -p.look[0].cos() * p.look[1].cos(), + ]; + let dir = dir.map(f64::from); let end = std::array::from_fn::<_, 3, _>(|i| eye[i] + dir[i] * 6.); let min = std::array::from_fn(|i| eye[i].min(end[i]).floor() as i32 - 3); let max = std::array::from_fn(|i| eye[i].max(end[i]).ceil() as i32 + 3); - let mut nearest: Option<(f32, Pos, Pos)> = None; - for change in self.store.read_region(&world, min, max)? { + let mut nearest: Option<(f64, Pos, Pos)> = None; + for change in self.read_world_region(&world, min, max)? { let cell = change.pos; let boxes = self .definition(change.block) @@ -971,8 +1394,8 @@ impl Game { if let Some((t, normal)) = ray_box( eye, dir, - std::array::from_fn(|i| cell[i] as f32 + b.min[i]), - std::array::from_fn(|i| cell[i] as f32 + b.max[i]), + std::array::from_fn(|i| f64::from(cell[i]) + f64::from(b.min[i])), + std::array::from_fn(|i| f64::from(cell[i]) + f64::from(b.max[i])), ) && nearest.is_none_or(|old| t < old.0) { nearest = Some((t, cell, normal)); @@ -1011,7 +1434,7 @@ impl Game { self.store .reset_world(world, rev, &format!("match-reset-{}", Uuid::new_v4()))?; for (i, id) in ids.iter().enumerate() { - let angle = i as f32 / ids.len() as f32 * std::f32::consts::TAU; + let angle = i as f64 / ids.len() as f64 * std::f64::consts::TAU; let p = self.players.get_mut(id).unwrap(); p.position = conf.spawn_points.get(i).copied().unwrap_or([ angle.sin() * 7., @@ -1020,6 +1443,9 @@ impl Game { ]); p.alive = true; p.velocity = 0.; + p.grounded = false; + p.input = Input::default(); + p.reset_motion(); } self.matches.insert( world.into(), @@ -1071,6 +1497,9 @@ impl Game { p.position = conf.spawn; p.velocity = 0.; p.alive = true; + p.grounded = false; + p.input = Input::default(); + p.reset_motion(); } self.meta.active_matches.remove(&world); let _ = self.save_meta(); @@ -1088,6 +1517,8 @@ impl Game { } } pub(super) fn resnapshot(&mut self, world: &str) { + self.terrain.clear_world(world); + self.sky_cache.retain(|(w, _, _), _| w != world); let ids: Vec<_> = self .players .values() @@ -1107,6 +1538,7 @@ impl Game { .collect() } } +#[cfg(test)] fn intersects(p: [f32; 3], min: [f32; 3], max: [f32; 3]) -> bool { let a = [p[0] - 0.3, p[1] + 0.001, p[2] - 0.3]; let b = [p[0] + 0.3, p[1] + 1.799, p[2] + 0.3]; @@ -1123,10 +1555,11 @@ fn string<'a>(p: &'a Value, key: &str) -> Result<&'a str> { p[key].as_str().context(format!("{key} string required")) } include!("control.rs"); +include!("world_streaming.rs"); -fn ray_box(eye: [f32; 3], dir: [f32; 3], min: [f32; 3], max: [f32; 3]) -> Option<(f32, Pos)> { - let mut near = 0f32; - let mut far = 6f32; +fn ray_box(eye: [f64; 3], dir: [f64; 3], min: [f64; 3], max: [f64; 3]) -> Option<(f64, Pos)> { + let mut near = 0f64; + let mut far = 6f64; let mut normal = [0; 3]; for i in 0..3 { if dir[i].abs() < 1e-7 { diff --git a/crates/shacraft-server/src/main.rs b/crates/shacraft-server/src/main.rs index 6392d84..6dc1b75 100644 --- a/crates/shacraft-server/src/main.rs +++ b/crates/shacraft-server/src/main.rs @@ -1,6 +1,7 @@ mod game; mod packages; mod render; +mod terrain; use anyhow::{Context, Result}; use axum::{ Json, Router, @@ -116,7 +117,19 @@ async fn main() -> Result<()> { .route("/api/control", post(control)) .route("/packages/{id}/{version}/{*path}", get(resource)) .route("/ws", get(websocket)) - .fallback_service(ServeDir::new(&args.client)) + .fallback_service( + Router::new() + .fallback_service(ServeDir::new(&args.client)) + .layer(axum::middleware::map_response( + |mut response: Response| async move { + response.headers_mut().insert( + header::CACHE_CONTROL, + axum::http::HeaderValue::from_static("no-cache"), + ); + response + }, + )), + ) .layer(DefaultBodyLimit::max(2 * 1024 * 1024)) .layer(tower::limit::ConcurrencyLimitLayer::new(16)) .with_state(app); diff --git a/crates/shacraft-server/src/terrain.rs b/crates/shacraft-server/src/terrain.rs new file mode 100644 index 0000000..76c8262 --- /dev/null +++ b/crates/shacraft-server/src/terrain.rs @@ -0,0 +1,775 @@ +//! Original deterministic terrain. Unedited sections are reproducible cache data. +use anyhow::{Result, ensure}; +use serde::{Deserialize, Serialize}; +use serde_json::{Value, json}; +use shacraft_core::Pos; +use std::{ + collections::{HashMap, HashSet, VecDeque}, + sync::{Arc, Mutex, mpsc}, + time::Instant, +}; + +pub const MIN_Y: i32 = -64; +pub const MAX_Y: i32 = 319; +pub const BORDER: f64 = 29_999_872.; +pub const VIEW_RADIUS: i32 = 3; +pub const MIN_VIEW_RADIUS: i32 = 2; +pub const MAX_VIEW_RADIUS: i32 = 64; +pub const VERTICAL_RADIUS: i32 = 2; +pub type Cells = [u32; 4096]; +pub type TerrainKey = (String, Pos); + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(deny_unknown_fields)] +pub struct TerrainConfig { + pub seed: u64, + pub version: u32, +} +impl Default for TerrainConfig { + fn default() -> Self { + Self { + seed: 20260914, + version: 1, + } + } +} +impl TerrainConfig { + pub fn validate(&self) -> Result<()> { + ensure!(self.version == 1, "unsupported terrain generator version"); + Ok(()) + } +} +#[derive(Clone)] +pub struct Palette { + pub grass: u32, + pub dirt: u32, + pub stone: u32, + pub deep: u32, + pub bedrock: u32, + pub sand: u32, + pub water: u32, + pub lava: u32, + pub log: u32, + pub leaves: u32, + pub snow: u32, + pub coal: u32, + pub iron: u32, + pub copper: u32, + pub gold: u32, + pub diamond: u32, + pub deep_iron: u32, + pub deep_diamond: u32, +} +#[derive(Clone)] +pub struct Generator { + pub config: TerrainConfig, + pub palette: Palette, +} +#[derive(Clone, Copy)] +struct Column { + height: i32, + desert: bool, + mountain: bool, +} +#[derive(Clone, Copy)] +struct Tree { + x: i32, + z: i32, + ground: i32, + height: i32, +} + +fn hash(seed: u64, x: i32, y: i32, z: i32) -> u64 { + let mut h = seed + ^ (x as i64 as u64).wrapping_mul(0x9e3779b185ebca87) + ^ (y as i64 as u64).wrapping_mul(0xc2b2ae3d27d4eb4f) + ^ (z as i64 as u64).wrapping_mul(0x165667b19e3779f9); + h = (h ^ (h >> 30)).wrapping_mul(0xbf58476d1ce4e5b9); + h = (h ^ (h >> 27)).wrapping_mul(0x94d049bb133111eb); + h ^ (h >> 31) +} +fn smooth(v: f64) -> f64 { + v * v * v * (v * (v * 6. - 15.) + 10.) +} +fn lerp(a: f64, b: f64, t: f64) -> f64 { + a + (b - a) * t +} +fn noise(seed: u64, x: f64, y: f64, z: f64) -> f64 { + let [ix, iy, iz] = [x.floor() as i32, y.floor() as i32, z.floor() as i32]; + let [fx, fy, fz] = [ + smooth(x - x.floor()), + smooth(y - y.floor()), + smooth(z - z.floor()), + ]; + let n = |a, b, c| ((hash(seed, a, b, c) >> 11) as f64 / ((1u64 << 53) as f64)) * 2. - 1.; + lerp( + lerp( + lerp(n(ix, iy, iz), n(ix + 1, iy, iz), fx), + lerp(n(ix, iy + 1, iz), n(ix + 1, iy + 1, iz), fx), + fy, + ), + lerp( + lerp(n(ix, iy, iz + 1), n(ix + 1, iy, iz + 1), fx), + lerp(n(ix, iy + 1, iz + 1), n(ix + 1, iy + 1, iz + 1), fx), + fy, + ), + fz, + ) +} +impl Generator { + fn column(&self, x: i32, z: i32) -> Column { + let s = self.config.seed; + let nx = f64::from(x); + let nz = f64::from(z); + let continent = noise(s, nx / 420., 0., nz / 420.); + let hills = noise(s ^ 17, nx / 105., 0., nz / 105.) * 15. + + noise(s ^ 29, nx / 36., 0., nz / 36.) * 4.; + let ridge = (1. - noise(s ^ 71, nx / 240., 0., nz / 240.).abs()).powi(3); + let mountains = ((continent - 0.12) * 2.8).clamp(0., 1.) * ridge * 96.; + let mut height = 68. + continent * 35. + hills + mountains; + let river = noise(s ^ 131, nx / 210., 0., nz / 210.).abs(); + if river < 0.045 && mountains < 14. { + height = lerp(58., height, (river / 0.045).powi(2)); + } + // A dry, softly blended spawn clearing; the rest of the world is unbounded noise. + let distance = nx.hypot(nz - 8.); + if distance < 40. { + height = lerp(76., height, smooth((distance / 40.).clamp(0., 1.))); + } + Column { + height: (height.round() as i32).clamp(28, 210), + desert: noise(s ^ 911, nx / 330., 0., nz / 330.) > 0.27 && mountains < 30., + mountain: mountains > 38., + } + } + pub fn height(&self, x: i32, z: i32) -> i32 { + self.column(x, z).height + } + pub fn biome(&self, x: i32, z: i32) -> &'static str { + let c = self.column(x, z); + if c.height < 61 { + "ocean" + } else if c.mountain { + "mountains" + } else if c.desert { + "desert" + } else if noise( + self.config.seed ^ 351, + f64::from(x) / 180., + 0., + f64::from(z) / 180., + ) > -0.15 + { + "forest" + } else { + "plains" + } + } + fn trees(&self, sx: i32, sz: i32) -> Vec { + let mut trees = Vec::new(); + for gx in (sx * 16 - 3).div_euclid(8)..=(sx * 16 + 18).div_euclid(8) { + for gz in (sz * 16 - 3).div_euclid(8)..=(sz * 16 + 18).div_euclid(8) { + let h = hash(self.config.seed ^ 771, gx, 0, gz); + let x = gx * 8 + 2 + (h % 4) as i32; + let z = gz * 8 + 2 + ((h >> 8) % 4) as i32; + let c = self.column(x, z); + let forest = self.biome(x, z) == "forest"; + if c.height <= 63 + || c.desert + || c.mountain + || h % 100 >= if forest { 58 } else { 12 } + || f64::from(x).hypot(f64::from(z - 8)) < 12. + { + continue; + } + trees.push(Tree { + x, + z, + ground: c.height, + height: 4 + ((h >> 20) % 3) as i32, + }); + } + } + trees + } + fn ground_block(&self, x: i32, y: i32, z: i32, c: Column) -> u32 { + let p = &self.palette; + let seed = self.config.seed; + if !(MIN_Y..=MAX_Y).contains(&y) { + return 0; + } + if y == MIN_Y || y < MIN_Y + 5 && hash(seed ^ 1, x, y, z) % 5 > (y - MIN_Y) as u64 { + return p.bedrock; + } + if y > c.height { + return if y <= 62 { p.water } else { 0 }; + } + if y < c.height - 4 && y > MIN_Y + 5 { + let n = noise( + seed ^ 801, + f64::from(x) / 34., + f64::from(y) / 24., + f64::from(z) / 34., + ); + let tunnel = noise( + seed ^ 807, + f64::from(x) / 28., + f64::from(y) / 18., + f64::from(z) / 28., + ) + .abs() + < 0.065 + && noise( + seed ^ 809, + f64::from(x) / 65., + f64::from(y) / 37., + f64::from(z) / 65., + ) + .abs() + < 0.18; + if n > 0.39 || tunnel { + return if y < -54 { + p.lava + } else if y < 18 && n > 0.69 { + p.water + } else { + 0 + }; + } + } + // A naturally open ravine near spawn is a repeatable route underground. + if (26..=35).contains(&x) + && (-24..=30).contains(&z) + && y > -26 + && y <= c.height + && f64::from(x - 30).abs() + < 2.4 + noise(seed ^ 999, 0., f64::from(y) / 14., f64::from(z) / 18.) * 1.5 + { + return 0; + } + if y == c.height { + return if c.desert || c.height <= 63 { + p.sand + } else if c.height > 145 { + p.snow + } else { + p.grass + }; + } + if y >= c.height - 3 { + return if c.desert || c.height <= 63 { + p.sand + } else { + p.dirt + }; + } + let ore = hash( + seed ^ 331, + x.div_euclid(2), + y.div_euclid(2), + z.div_euclid(2), + ) % 1000; + let edge = !hash(seed ^ 333, x, y, z).is_multiple_of(5); + if edge { + if y < 0 && ore < 5 { + return p.deep_diamond; + } + if y < 18 && ore < 5 { + return p.diamond; + } + if y < 28 && (5..12).contains(&ore) { + return p.gold; + } + if y < 66 && (12..35).contains(&ore) { + return if y < 0 { p.deep_iron } else { p.iron }; + } + if y > 0 && y < 88 && (35..55).contains(&ore) { + return p.copper; + } + if y > 0 && (55..86).contains(&ore) { + return p.coal; + } + } + if y < 0 { p.deep } else { p.stone } + } + pub fn generate(&self, section: Pos) -> Cells { + let [sx, sy, sz] = section; + let mut cells = [0; 4096]; + if sy * 16 > MAX_Y || sy * 16 + 15 < MIN_Y { + return cells; + } + for z in 0..16 { + for x in 0..16 { + let wx = sx * 16 + x; + let wz = sz * 16 + z; + let c = self.column(wx, wz); + for y in 0..16 { + cells[(x + 16 * z + 256 * y) as usize] = + self.ground_block(wx, sy * 16 + y, wz, c); + } + } + } + for tree in self.trees(sx, sz) { + for y in tree.ground + 1..=tree.ground + tree.height + 2 { + for z in tree.z - 2..=tree.z + 2 { + for x in tree.x - 2..=tree.x + 2 { + if x.div_euclid(16) != sx + || y.div_euclid(16) != sy + || z.div_euclid(16) != sz + { + continue; + } + let trunk = x == tree.x && z == tree.z && y <= tree.ground + tree.height; + let leaf = y >= tree.ground + tree.height - 2 + && (x - tree.x).abs() + (z - tree.z).abs() + <= if y > tree.ground + tree.height { 2 } else { 3 }; + let i = (x.rem_euclid(16) + 16 * z.rem_euclid(16) + 256 * y.rem_euclid(16)) + as usize; + if trunk { + cells[i] = self.palette.log; + } else if leaf && cells[i] == 0 { + cells[i] = self.palette.leaves; + } + } + } + } + } + cells + } + /// Highest opaque natural cell. Used even when its section is not streamed. + pub fn sky_heights(&self, sx: i32, sz: i32) -> [i16; 256] { + let mut heights = [-65; 256]; + for z in 0..16 { + for x in 0..16 { + let wx = sx * 16 + x; + let wz = sz * 16 + z; + let c = self.column(wx, wz); + let mut top = c.height; + while top > MIN_Y { + let block = self.ground_block(wx, top, wz, c); + if block != 0 && block != self.palette.water && block != self.palette.lava { + break; + } + top -= 1; + } + heights[(x + 16 * z) as usize] = top as i16; + } + } + for t in self.trees(sx, sz) { + if t.x.div_euclid(16) == sx && t.z.div_euclid(16) == sz { + heights[(t.x.rem_euclid(16) + 16 * t.z.rem_euclid(16)) as usize] = + (t.ground + t.height) as i16; + } + } + heights + } +} + +struct Job { + key: TerrainKey, + generator: Arc, +} +struct Finished { + key: TerrainKey, + cells: Arc, + milliseconds: f64, +} +struct Cached { + cells: Arc, + used: u64, +} +/// Fixed CPU workers and bounded pending jobs. Old natural sections can be +/// discarded at any time; only edited sections require durable storage. +pub struct TerrainService { + tx: Option>, + rx: mpsc::Receiver, + workers: Vec>, + cache: HashMap, + lru: VecDeque<(TerrainKey, u64)>, + pending: HashSet, + clock: u64, + pub generated: u64, + pub discarded: u64, + read_interests: HashMap, + pub last_ms: f64, + pub max_ms: f64, + pub hits: u64, + pub misses: u64, + pub evictions: u64, +} +impl TerrainService { + pub fn new() -> Self { + let (tx, jobs) = mpsc::sync_channel::(32); + let jobs = Arc::new(Mutex::new(jobs)); + let (finished, rx) = mpsc::sync_channel(32); + let mut workers = Vec::new(); + for i in 0..2 { + let jobs = jobs.clone(); + let finished = finished.clone(); + workers.push( + std::thread::Builder::new() + .name(format!("terrain-{i}")) + .spawn(move || { + loop { + let job = match jobs.lock().unwrap().recv() { + Ok(job) => job, + Err(_) => break, + }; + let start = Instant::now(); + let cells = Arc::new(job.generator.generate(job.key.1)); + if finished + .send(Finished { + key: job.key, + cells, + milliseconds: start.elapsed().as_secs_f64() * 1000., + }) + .is_err() + { + break; + } + } + }) + .expect("terrain worker thread"), + ); + } + Self { + tx: Some(tx), + rx, + workers, + cache: HashMap::new(), + lru: VecDeque::new(), + pending: HashSet::new(), + read_interests: HashMap::new(), + clock: 0, + generated: 0, + discarded: 0, + last_ms: 0., + max_ms: 0., + hits: 0, + misses: 0, + evictions: 0, + } + } + /// A control read may target terrain with no player nearby. Keep its + /// completed jobs long enough for the caller to retry, without unbounded pins. + pub fn retain_for_read(&mut self, key: TerrainKey) { + if self.read_interests.len() >= 512 + && !self.read_interests.contains_key(&key) + && let Some(old) = self + .read_interests + .iter() + .min_by_key(|(_, t)| **t) + .map(|(k, _)| k.clone()) + { + self.read_interests.remove(&old); + } + self.read_interests + .insert(key, Instant::now() + std::time::Duration::from_secs(10)); + } + pub fn request(&mut self, key: TerrainKey, generator: Arc) -> bool { + if self.cache.contains_key(&key) || self.pending.contains(&key) { + return true; + } + if self.pending.len() >= 32 { + return false; + } + if self + .tx + .as_ref() + .unwrap() + .try_send(Job { + key: key.clone(), + generator, + }) + .is_err() + { + return false; + } + self.pending.insert(key); + true + } + pub fn poll(&mut self, wanted: &HashSet) { + if self.lru.len() > self.cache.len() * 4 + 128 { + self.lru.retain(|(key, stamp)| { + self.cache + .get(key) + .is_some_and(|entry| entry.used == *stamp) + }); + } + self.read_interests + .retain(|_, until| *until > Instant::now()); + while let Ok(done) = self.rx.try_recv() { + self.pending.remove(&done.key); + self.generated += 1; + self.last_ms = done.milliseconds; + self.max_ms = self.max_ms.max(done.milliseconds); + if wanted.contains(&done.key) || self.read_interests.contains_key(&done.key) { + self.insert(done.key, done.cells); + } else { + self.discarded += 1; + } + } + } + pub fn get(&mut self, key: &TerrainKey) -> Option> { + self.clock += 1; + if let Some(entry) = self.cache.get_mut(key) { + entry.used = self.clock; + self.lru.push_back((key.clone(), self.clock)); + self.hits += 1; + Some(entry.cells.clone()) + } else { + self.misses += 1; + None + } + } + pub fn contains(&self, key: &TerrainKey) -> bool { + self.cache.contains_key(key) + } + pub fn insert(&mut self, key: TerrainKey, cells: Arc) { + self.clock += 1; + while self.cache.len() >= 8192 && !self.cache.contains_key(&key) { + let Some((old, stamp)) = self.lru.pop_front() else { + break; + }; + if self + .cache + .get(&old) + .is_some_and(|entry| entry.used == stamp) + { + self.cache.remove(&old); + self.evictions += 1; + } + } + self.lru.push_back((key.clone(), self.clock)); + self.cache.insert( + key, + Cached { + cells, + used: self.clock, + }, + ); + } + pub fn clear_world(&mut self, world: &str) { + self.cache.retain(|(w, _), _| w != world); + } + pub fn invalidate(&mut self, world: &str, sections: &HashSet) { + self.cache + .retain(|(w, pos), _| w != world || !sections.contains(pos)); + } + pub fn stats(&self) -> Value { + json!({"workers":2,"pending":self.pending.len(),"queue_limit":32,"cache_sections":self.cache.len(),"cache_limit":8192,"cache_bytes":self.cache.len()*16384,"generated_sections":self.generated,"discarded_results":self.discarded,"cache_hits":self.hits,"cache_misses":self.misses,"cache_evictions":self.evictions,"last_generate_ms":self.last_ms,"max_generate_ms":self.max_ms}) + } +} +impl Drop for TerrainService { + fn drop(&mut self) { + self.tx.take(); + // Drain completed work while joining: workers may be backpressured. + while self.workers.iter().any(|w| !w.is_finished()) { + while self.rx.try_recv().is_ok() {} + std::thread::yield_now(); + } + for worker in self.workers.drain(..) { + let _ = worker.join(); + } + } +} + +/// Keep one prefetched ring resident while crossing a single horizontal section. +pub fn view_needs_move(previous: Pos, next: Pos, buffered: bool) -> bool { + (0..3).any(|axis| { + (previous[axis] - next[axis]).abs() > if buffered && axis != 1 { 16 } else { 0 } + }) +} +#[cfg(test)] +pub fn bounds(center: Pos, radius: i32) -> (Pos, Pos) { + view_bounds(center, radius, false) +} +pub fn view_bounds(center: Pos, radius: i32, full_height: bool) -> (Pos, Pos) { + ( + [ + center[0] - radius * 16, + if full_height { + MIN_Y + } else { + center[1] - VERTICAL_RADIUS * 16 + }, + center[2] - radius * 16, + ], + [ + center[0] + (radius + 1) * 16 - 1, + if full_height { + MAX_Y + } else { + center[1] + (VERTICAL_RADIUS + 1) * 16 - 1 + }, + center[2] + (radius + 1) * 16 - 1, + ], + ) +} +pub fn sections(center: Pos, radius: i32) -> Vec { + view_sections(center, radius, false) +} +pub fn view_sections(center: Pos, radius: i32, full_height: bool) -> Vec { + let c = center.map(|v| v.div_euclid(16)); + let (min, max) = view_bounds(center, radius, full_height); + let mut result = Vec::new(); + for x in c[0] - radius..=c[0] + radius { + for z in c[2] - radius..=c[2] + radius { + for y in min[1].div_euclid(16)..=max[1].div_euclid(16) { + result.push([x, y, z]); + } + } + } + result.sort_by_key(|p| (p[0] - c[0]).pow(2) + (p[2] - c[2]).pow(2) + (p[1] - c[1]).pow(2) * 2); + result +} +/// Palette + runs avoids JSON objects and repeated world coordinates per voxel. +pub fn pack(cells: &Cells) -> Value { + if cells.iter().all(|id| *id == cells[0]) { + return json!({"palette":[cells[0]],"runs":[4096,0]}); + } + let mut palette = Vec::new(); + let mut indices = HashMap::new(); + let mut runs = Vec::::new(); + let mut previous = u32::MAX; + let mut count = 0; + for &block in cells { + let next = indices.len() as u32; + let index = *indices.entry(block).or_insert_with(|| { + palette.push(block); + next + }); + if index == previous { + count += 1; + } else { + if count > 0 { + runs.extend([count, previous]); + } + previous = index; + count = 1; + } + } + runs.extend([count, previous]); + json!({"palette":palette,"runs":runs}) +} + +#[cfg(test)] +mod tests { + use super::*; + fn generator(seed: u64) -> Generator { + Generator { + config: TerrainConfig { seed, version: 1 }, + palette: Palette { + grass: 1, + dirt: 2, + stone: 3, + deep: 4, + bedrock: 5, + sand: 6, + water: 7, + lava: 8, + log: 9, + leaves: 10, + snow: 11, + coal: 12, + iron: 13, + copper: 14, + gold: 15, + diamond: 16, + deep_iron: 17, + deep_diamond: 18, + }, + } + } + #[test] + fn generation_is_order_independent_and_seeded_at_negative_and_distant_coordinates() { + let g = generator(20260914); + let other = generator(921); + for pos in [[-1, 3, -1], [1, -2, 0], [1_800_000, 4, -1_800_000]] { + let first = g.generate(pos); + let _ = g.generate([pos[0] + 1, pos[1], pos[2]]); + assert_eq!(first, g.generate(pos)); + } + assert_ne!(g.generate([19, 3, -7]), other.generate([19, 3, -7])); + } + #[test] + fn world_has_deep_caves_ores_surface_water_and_an_unbroken_bedrock_bottom() { + let g = generator(20260914); + let bottom = g.generate([0, -4, 0]); + assert!(bottom[..256].iter().all(|id| *id == g.palette.bedrock)); + let mut caves = 0; + let mut deep = 0; + let mut ores = 0; + for sy in -3..2 { + for sx in -2..=2 { + for sz in -2..=2 { + for id in g.generate([sx, sy, sz]) { + if id == 0 { + caves += 1; + } + if id == g.palette.deep { + deep += 1; + } + if (12..=18).contains(&id) { + ores += 1; + } + } + } + } + } + assert!(caves > 1000); + assert!(deep > 10000); + assert!(ores > 1000); + assert!(g.generate([0, 20, 0]).iter().all(|id| *id == 0)); + assert!(g.height(0, 8) > 62); + assert!((-1000..1000).step_by(40).any(|x| g.height(x, 100) < 62)); + } + #[test] + fn natural_sky_height_agrees_with_the_highest_opaque_generated_cell_including_ravine() { + let g = generator(20260914); + for [sx, sz] in [[0, 0], [1, 0], [-1, -1]] { + let heights = g.sky_heights(sx, sz); + let sections: Vec<_> = (MIN_Y / 16..=MAX_Y / 16) + .map(|sy| g.generate([sx, sy, sz])) + .collect(); + for z in 0..16 { + for x in 0..16 { + let top = (MIN_Y..=MAX_Y) + .rev() + .find(|y| { + let sy = (y.div_euclid(16) - MIN_Y / 16) as usize; + let id = sections[sy][(x + 16 * z + 256 * y.rem_euclid(16)) as usize]; + id != 0 + && id != g.palette.water + && id != g.palette.lava + && id != g.palette.leaves + }) + .unwrap(); + assert_eq!( + i32::from(heights[(x + 16 * z) as usize]), + top, + "{sx}/{sz}/{x}/{z}" + ); + } + } + } + } + #[test] + fn view_and_wire_payloads_are_bounded_and_near_sections_are_first() { + let view = sections([-16, 64, 32], VIEW_RADIUS); + assert_eq!(view.len(), 245); + assert_eq!(view[0], [-1, 4, 2]); + assert!(view.len() * 4096 <= 1_048_576); + assert_eq!(pack(&[3; 4096]), json!({"palette":[3],"runs":[4096,0]})); + let cells = std::array::from_fn(|i| (i % 3) as u32); + let value = pack(&cells); + let runs = value["runs"].as_array().unwrap(); + assert_eq!( + runs.iter() + .step_by(2) + .map(|v| v.as_u64().unwrap()) + .sum::(), + 4096 + ); + } +} diff --git a/crates/shacraft-server/src/tests.rs b/crates/shacraft-server/src/tests.rs index 1c303b1..736b452 100644 --- a/crates/shacraft-server/src/tests.rs +++ b/crates/shacraft-server/src/tests.rs @@ -51,9 +51,20 @@ fn fixture() -> (TempDir, Game) { (dir, game) } fn connect(game: &mut Game, world: &str, name: &str) -> TestClient { + connect_with_features(game, world, name, &[]) +} +fn connect_with_features( + game: &mut Game, + world: &str, + name: &str, + features: &[&str], +) -> TestClient { let (tx, inbox) = tmpsc::channel(16); let bytes = Arc::new(AtomicUsize::new(0)); - let p = json!({"type":"join","protocol":1,"name":name,"world":world,"manifest_hash":game.manifest["hash"]}); + let mut p = json!({"type":"join","protocol":1,"name":name,"world":world,"manifest_hash":game.manifest["hash"]}); + if !features.is_empty() { + p["features"] = json!(features); + } let id = game .join( p, @@ -83,6 +94,854 @@ fn entity_spawn(game: &mut Game, kind: &str) -> Result { game.query("entity.spawn",json!({"world":"lobby","kind":kind,"position":[2.,1.,2.],"properties":{"custom_name":"Saved animal","nbt":{"test:unrecognized":{"type":"long","value":"9223372036854775807"}}},"expected_revision":game.meta.revision,"operation_id":Uuid::new_v4().to_string()})) } +fn physics_fixture() -> (TempDir, Game, TestClient) { + let (dir, mut game) = fixture(); + game.store.create_world("physics", None).unwrap(); + game.meta.worlds.insert( + "physics".into(), + WorldConfig { + spawn: [0.5, 1., 0.5], + elimination_y: -100., + ..WorldConfig::default() + }, + ); + let stone = game.id("minecraft:stone").unwrap(); + let mut floor = Vec::new(); + for x in -4..=4 { + for z in -30..=4 { + floor.push(BlockChange { + pos: [x, 0, z], + block: stone, + }); + } + } + edit(&mut game, "physics", floor); + let mut client = connect_with_features( + &mut game, + "physics", + "Walker", + &["chunk_stream_v1", "movement_prediction_v1"], + ); + client.drain(); + ticks(&mut game, &mut [&mut client], 2); + (dir, game, client) +} + +fn movement(seq: u64) -> Value { + json!({"type":"input","seq":seq,"yaw":0.,"pitch":0.,"forward":1.,"strafe":0.}) +} + +fn settle_sections(game: &mut Game, client: &mut TestClient) -> Vec { + let deadline = Instant::now() + Duration::from_secs(15); + let mut messages = client.drain(); + while game.players[&client.id].sent_sections.len() + < ((game.players[&client.id].view_distance * 2 + 1).pow(2) * 5) as usize + { + assert!( + Instant::now() < deadline, + "terrain did not settle: {}", + game.query("diagnostics.snapshot", json!({})).unwrap() + ); + game.players.get_mut(&client.id).unwrap().last_batch = + Instant::now() - Duration::from_secs(1); + game.step(); + messages.extend(client.drain()); + std::thread::sleep(Duration::from_millis(1)); + } + messages +} + +#[test] +fn render_distance_changes_only_the_requesting_view_and_preserves_motion() { + let (_dir, mut game) = fixture(); + game.store.create_world("distance-test", None).unwrap(); + let mut first = + connect_with_features(&mut game, "distance-test", "First", &["chunk_stream_v2"]); + game.query( + "player.teleport", + json!({"id":first.id,"position":[0.,80.,8.],"flying":true}), + ) + .unwrap(); + settle_sections(&mut game, &mut first); + let position = game.players[&first.id].position; + let epoch = game.players[&first.id].motion_epoch; + let mut second = + connect_with_features(&mut game, "distance-test", "Second", &["chunk_stream_v2"]); + second.drain(); + game.client(&first.id, json!({"type":"view_distance","chunks":6})) + .unwrap(); + let view = first + .drain() + .into_iter() + .find(|v| v["type"] == "view") + .unwrap(); + assert_eq!(view["total_sections"], 845); + assert_eq!(view["unload"], json!([])); + assert_eq!(game.players[&first.id].sent_sections.len(), 245); + assert_eq!(game.players[&second.id].view_distance, 3); + assert!(second.drain().is_empty()); + game.players.remove(&second.id); + for value in [json!(1), json!(65), json!(3.5), json!("6"), Value::Null] { + assert!( + game.client(&first.id, json!({"type":"view_distance","chunks":value})) + .is_err() + ); + assert_eq!(game.players[&first.id].view_distance, 6); + } + assert_eq!(game.players[&first.id].position, position); + assert_eq!(game.players[&first.id].motion_epoch, epoch); + settle_sections(&mut game, &mut first); + game.players + .get_mut(&first.id) + .unwrap() + .last_distance_change = Instant::now() - Duration::from_secs(1); + game.client(&first.id, json!({"type":"view_distance","chunks":2})) + .unwrap(); + let view = first + .drain() + .into_iter() + .find(|v| v["type"] == "view") + .unwrap(); + assert_eq!(view["total_sections"], 125); + assert_eq!(view["unload"].as_array().unwrap().len(), 720); + assert_eq!(game.players[&first.id].sent_sections.len(), 125); + assert_eq!(game.store.revision("distance-test").unwrap(), 0); + assert!( + game.section_data("overworld", [1_875_000, 4, 0]) + .unwrap() + .unwrap() + .iter() + .all(|id| *id == 0) + ); +} + +#[test] +fn full_height_stream_retains_ground_and_roof_during_vertical_flight() { + let (_dir, mut game) = fixture(); + game.store.create_world("height-test", None).unwrap(); + let mut client = connect_with_features( + &mut game, + "height-test", + "Fly", + &["chunk_stream_v2", "view_buffer_v1", "full_height_v1"], + ); + let welcome = client + .drain() + .into_iter() + .find(|v| v["type"] == "welcome") + .unwrap(); + assert_eq!(welcome["view_min"][1], -64); + assert_eq!(welcome["view_max"][1], 319); + assert_eq!(welcome["total_sections"], 1944); + let p = game.players.get_mut(&client.id).unwrap(); + p.sent_sections.extend([[0, -4, 0], [0, 19, 0]]); + let center = [p.view[0], 512, p.view[2]]; + game.begin_section_view(&client.id, center, false).unwrap(); + let view = client + .drain() + .into_iter() + .find(|v| v["type"] == "view") + .unwrap(); + assert_eq!(view["view_min"][1], -64); + assert_eq!(view["view_max"][1], 319); + assert_eq!(view["unload"], json!([])); + assert!(game.players[&client.id].sent_sections.contains(&[0, -4, 0])); + assert!(game.players[&client.id].sent_sections.contains(&[0, 19, 0])); + assert_eq!(terrain::view_sections([0, 96, 0], 65, true).len(), 411864); +} + +#[test] +fn sixty_four_chunk_view_queues_the_full_buffer_and_delivers_a_retained_outer_ring() { + let (_dir, mut game) = fixture(); + game.store.create_world("distance-64", None).unwrap(); + let mut client = connect_with_features( + &mut game, + "distance-64", + "Wide", + &["chunk_stream_v2", "view_buffer_v1"], + ); + game.query( + "player.teleport", + json!({"id":client.id,"position":[0.,80.,0.],"flying":true}), + ) + .unwrap(); + game.client(&client.id, json!({"type":"view_distance","chunks":64})) + .unwrap(); + let view = client + .drain() + .into_iter() + .rev() + .find(|m| m["type"] == "view") + .unwrap(); + assert_eq!(view["view_distance"], 64); + assert_eq!(view["stream_radius"], 65); + assert_eq!(view["total_sections"], 85805); + assert_eq!(view["view_min"][0], -1040); + assert_eq!(view["view_max"][0], 1055); + let center = game.players[&client.id].view; + let outer = [64, center[1] / 16, -64]; + assert!(game.players[&client.id].pending_sections.contains(&outer)); + assert_eq!( + game.players[&client.id].pending_sections.front().unwrap()[0], + 0 + ); + let gold = game.id("minecraft:gold_block").unwrap(); + game.store + .materialize_section("distance-64", outer, &[gold; 4096]) + .unwrap(); + // Model an otherwise retained view with one outer section still missing. + let player = game.players.get_mut(&client.id).unwrap(); + player.sent_sections.extend( + terrain::sections(center, 65) + .into_iter() + .filter(|pos| *pos != outer), + ); + game.begin_section_view(&client.id, center, false).unwrap(); + client.drain(); + assert_eq!( + game.players[&client.id].pending_sections, + VecDeque::from([outer]) + ); + let deadline = Instant::now() + Duration::from_secs(5); + loop { + assert!(Instant::now() < deadline, "outer section was not delivered"); + game.players.get_mut(&client.id).unwrap().last_batch = + Instant::now() - Duration::from_secs(1); + game.pump_terrain(); + if let Some(batch) = client.drain().into_iter().find(|m| m["type"] == "sections") { + assert_eq!(batch["sections"][0]["section"], json!(outer)); + assert_eq!(batch["sections"][0]["palette"], json!([gold])); + assert_eq!(batch["loaded_sections"], 85805); + break; + } + } + assert!(game.players[&client.id].pending_sections.is_empty()); + assert_eq!(game.store.revision("distance-64").unwrap(), 0); +} + +#[test] +fn procedural_stream_is_bounded_retains_overlap_and_never_advances_edit_revision() { + let (_dir, mut game) = fixture(); + let mut legacy = connect(&mut game, "lobby", "Legacy"); + legacy.drain(); + game.players.get_mut(&legacy.id).unwrap().last_snapshot = + Instant::now() - Duration::from_secs(2); + assert!( + game.client( + &legacy.id, + json!({"type":"switch_world","world":"overworld"}) + ) + .is_err() + ); + assert_eq!(game.players[&legacy.id].world, "lobby"); + game.players.remove(&legacy.id); + let revision = game.store.revision("overworld").unwrap(); + let mut client = connect_with_features( + &mut game, + "overworld", + "Explorer", + &["chunk_stream_v2", "movement_prediction_v1"], + ); + let welcome = client + .drain() + .into_iter() + .find(|m| m["type"] == "welcome") + .unwrap(); + assert_eq!(welcome["blocks"], json!([])); + assert_eq!(welcome["total_sections"], 245); + let first = game.players[&client.id].position; + game.client(&client.id, movement(1)).unwrap(); + game.step(); + // A cold collision read either holds the authoritative body or uses a + // completed solid section; it can never fall through ungenerated ground. + assert!(game.players[&client.id].position[1] >= first[1] - 0.01); + let messages = settle_sections(&mut game, &mut client); + let batches: Vec<_> = messages + .iter() + .filter(|m| m["type"] == "sections") + .collect(); + assert!(!batches.is_empty()); + for batch in batches { + assert!(batch["sections"].as_array().unwrap().len() <= 32); + assert!(batch.to_string().len() < 512 * 1024); + } + assert_eq!(game.store.revision("overworld").unwrap(), revision); + let before = game.players[&client.id].sent_sections.clone(); + let center = game.players[&client.id].view; + game.begin_section_view(&client.id, [center[0] + 16, center[1], center[2]], false) + .unwrap(); + let retained = &game.players[&client.id].sent_sections; + assert_eq!(retained.len(), 210); + assert!(retained.is_subset(&before)); + let update = client.drain(); + assert!( + update + .iter() + .any(|m| m["type"] == "view" && m["unload"].as_array().unwrap().len() == 35) + ); + assert!(!update.iter().any(|m| m["type"] == "snapshot")); +} + +#[test] +fn remote_procedural_reads_finish_without_players_and_air_edits_survive_restart() { + let (dir, mut game) = fixture(); + let min = [1_000_000, -20, -1_000_000]; + let max = [min[0] + 17, min[1] + 3, min[2] + 3]; + let query = json!({"world":"overworld","min":min,"max":max}); + let deadline = Instant::now() + Duration::from_secs(10); + let read = loop { + match game.query("world.read", query.clone()) { + Ok(value) => break value, + Err(e) => assert!(e.to_string().contains("terrain pending"), "{e}"), + } + assert!(Instant::now() < deadline); + game.step(); + std::thread::sleep(Duration::from_millis(1)); + }; + let natural = &read["blocks"][0]; + assert!(natural.is_object()); + let pos: Pos = serde_json::from_value(natural["pos"].clone()).unwrap(); + let original = natural["block"].as_u64().unwrap() as u32; + let revision = game.store.revision("overworld").unwrap(); + game.query("world.edit",json!({"world":"overworld","expected_revision":revision,"operation_id":"mine-natural","changes":[{"pos":pos,"block":0}]})).unwrap(); + assert_eq!(game.world_block("overworld", pos).unwrap(), 0); + game.terrain.clear_world("overworld"); + assert_eq!(game.world_block("overworld", pos).unwrap(), 0); + drop(game); + let mut game = open_game(dir.path()); + assert_eq!(game.world_block("overworld", pos).unwrap(), 0); + let revision = game.store.revision("overworld").unwrap(); + game.query("world.undo",json!({"world":"overworld","expected_revision":revision,"operation_id":"undo-natural","target_operation":"mine-natural"})).unwrap(); + assert_eq!(game.world_block("overworld", pos).unwrap(), original); + let before = game.store.stats()["materialized_natural_sections"].clone(); + assert!( + game.materialize_changes( + "overworld", + &[BlockChange { + pos: [100, 320, 0], + block: original + }] + ) + .is_err() + ); + assert!( + game.materialize_changes( + "overworld", + &[BlockChange { + pos: [100, 70, 0], + block: u32::MAX + }] + ) + .is_err() + ); + assert_eq!(game.store.stats()["materialized_natural_sections"], before); +} + +#[test] +fn distant_player_coordinates_keep_sub_block_precision_and_wait_for_cold_terrain() { + let (_dir, mut game) = fixture(); + let mut client = connect_with_features( + &mut game, + "overworld", + "Far", + &["chunk_stream_v2", "movement_prediction_v1"], + ); + client.drain(); + let position = [29_999_000.125, 250.25, -29_999_000.875]; + game.query( + "player.teleport", + json!({"id":client.id,"position":position,"flying":true}), + ) + .unwrap(); + assert_eq!(game.players[&client.id].body.position, position); + let snapshot = client + .drain() + .into_iter() + .find(|m| m["type"] == "snapshot") + .unwrap(); + assert_eq!(snapshot["spawn"], json!(position)); + let _ = settle_sections(&mut game, &mut client); + assert_eq!(game.players[&client.id].position, position); + game.client(&client.id, movement(1)).unwrap(); + ticks(&mut game, &mut [&mut client], 1); + let next = game.players[&client.id].position; + assert!(next[2] < position[2] && next[2] > position[2] - 1.); + assert_eq!(next[0], position[0]); + assert_eq!(next[1], position[1]); +} + +#[test] +fn movement_queue_acknowledges_processed_commands_and_bounds_packet_bursts() { + let (_dir, mut game, mut client) = physics_fixture(); + for seq in 1..=32 { + game.client(&client.id, movement(seq)).unwrap(); + } + assert!(game.client(&client.id, movement(33)).is_err()); + assert_eq!(game.players[&client.id].processed_seq, 0); + let before = game.players[&client.id].body.position; + game.step(); + let state = client + .drain() + .into_iter() + .find(|m| m["type"] == "state") + .unwrap(); + assert_eq!(state["ack"], 1); + assert_eq!(state["motion"]["ack"], 1); + assert_eq!(game.players[&client.id].pending_inputs.len(), 31); + assert!((before[2] - game.players[&client.id].body.position[2] - 0.098).abs() < 1e-6); + game.client(&client.id, movement(1)).unwrap(); + assert_eq!( + game.players[&client.id].pending_inputs.len(), + 31, + "duplicate must not move twice" + ); + game.client(&client.id, movement(33)).unwrap(); + ticks(&mut game, &mut [&mut client], 32); + assert_eq!(game.players[&client.id].processed_seq, 33); +} + +#[test] +fn server_movement_preserves_shared_double_precision_state_over_ticks() { + let (_dir, mut game, mut client) = physics_fixture(); + let mut expected = game.players[&client.id].body.clone(); + for seq in 1..=80 { + let mut input = movement(seq); + input["forward"] = json!(if seq <= 55 { 1. } else { 0. }); + input["sprint"] = json!(seq > 20 && seq < 50); + input["jump"] = json!(seq == 25); + input["sneak"] = json!(seq > 55); + game.client(&client.id, input).unwrap(); + let p = &game.players[&client.id]; + let controls = p.pending_inputs.front().unwrap().controls(); + let settings = p.physics_settings.clone(); + let world = game.physics_world("physics", &expected).unwrap(); + shacraft_physics::step(&mut expected, &controls, &world, &settings); + ticks(&mut game, &mut [&mut client], 1); + let actual = &game.players[&client.id].body; + for axis in 0..3 { + assert!( + (actual.position[axis] - expected.position[axis]).abs() < 1e-12, + "tick {seq}, axis {axis} was rounded by the adapter" + ); + assert!((actual.velocity[axis] - expected.velocity[axis]).abs() < 1e-12); + } + } +} + +#[test] +fn input_reset_cancels_backlog_and_respawn_invalidates_prediction_epoch() { + let (_dir, mut game, mut client) = physics_fixture(); + let epoch = game.players[&client.id].motion_epoch; + for seq in 1..=8 { + game.client(&client.id, movement(seq)).unwrap(); + } + game.client(&client.id, json!({"type":"input_reset"})) + .unwrap(); + let p = &game.players[&client.id]; + assert!(p.pending_inputs.is_empty()); + assert_eq!(p.processed_seq, 8); + assert_eq!(p.motion_epoch, epoch + 1); + ticks(&mut game, &mut [&mut client], 2); + assert_eq!(game.players[&client.id].body.position[2], 0.5); + game.client(&client.id, movement(9)).unwrap(); + ticks(&mut game, &mut [&mut client], 1); + game.client(&client.id, movement(10)).unwrap(); + game.client(&client.id, json!({"type":"respawn"})).unwrap(); + let p = &game.players[&client.id]; + assert_eq!(p.body.position, [0.5, 1., 0.5]); + assert_eq!(p.body.velocity, [0.; 3]); + assert_eq!(p.motion_epoch, epoch + 2); + assert_eq!(p.processed_seq, 10); + assert!(p.pending_inputs.is_empty()); +} + +#[test] +fn flight_is_authorized_by_world_and_revoked_in_switch_snapshot() { + let (_dir, mut game, mut client) = physics_fixture(); + let mut input = movement(1); + input["forward"] = json!(0.); + input["fly_toggle"] = json!(true); + input["jump"] = json!(true); + input["position"] = json!([5000., 5000., 5000.]); + game.client(&client.id, input).unwrap(); + ticks(&mut game, &mut [&mut client], 2); + assert!(game.players[&client.id].body.flying); + assert!(game.players[&client.id].body.position[1] > 1.); + assert!(game.players[&client.id].body.position[1] < 2.); + game.players.get_mut(&client.id).unwrap().last_snapshot = + Instant::now() - Duration::from_secs(2); + game.client(&client.id, json!({"type":"switch_world","world":"arena_1"})) + .unwrap(); + let snapshot = client + .drain() + .into_iter() + .find(|m| m["type"] == "snapshot") + .unwrap(); + assert_eq!(snapshot["motion"]["settings"]["allow_flight"], false); + assert_eq!(snapshot["motion"]["body"]["flying"], false); + let mut input = movement(2); + input["fly_toggle"] = json!(true); + game.client(&client.id, input).unwrap(); + ticks(&mut game, &mut [&mut client], 1); + assert!(!game.players[&client.id].body.flying); +} + +#[test] +fn raycast_uses_pose_eye_height_and_look_does_not_consume_movement() { + let (_dir, mut game, mut client) = physics_fixture(); + let stone = game.id("minecraft:stone").unwrap(); + edit( + &mut game, + "physics", + vec![BlockChange { + pos: [0, 1, -2], + block: stone, + }], + ); + let p = game.players.get_mut(&client.id).unwrap(); + p.body.pose = shacraft_physics::Pose::Swimming; + assert_eq!(game.raycast(&client.id).unwrap().unwrap().0, [0, 1, -2]); + game.players.get_mut(&client.id).unwrap().body.pose = shacraft_physics::Pose::Standing; + assert!(game.raycast(&client.id).unwrap().is_none()); + game.client(&client.id, movement(1)).unwrap(); + game.client(&client.id, json!({"type":"look","yaw":0.,"pitch":-0.5})) + .unwrap(); + assert!(game.raycast(&client.id).unwrap().is_some()); + assert_eq!(game.players[&client.id].processed_seq, 0); + assert_eq!(game.players[&client.id].pending_inputs.len(), 1); + ticks(&mut game, &mut [&mut client], 1); + assert_eq!(game.players[&client.id].processed_seq, 1); + assert_eq!( + game.players[&client.id].look, + [0., -0.5], + "queued movement must not roll back the action ray" + ); + assert!(game.raycast(&client.id).unwrap().is_some()); +} + +fn streaming_fixture() -> (TempDir, Game, TestClient) { + let (dir, mut game) = fixture(); + game.store.create_world("stream", None).unwrap(); + game.meta.worlds.insert( + "stream".into(), + WorldConfig { + spawn: [0.5, 2., 0.5], + elimination_y: -32700., + ..WorldConfig::default() + }, + ); + let client = connect_with_features(&mut game, "stream", "Explorer", &["chunk_stream_v1"]); + (dir, game, client) +} + +fn move_view(game: &mut Game, client: &mut TestClient, position: [f32; 3]) -> Vec { + let player = game.players.get_mut(&client.id).unwrap(); + player.position = position.map(f64::from); + player.velocity = 0.; + player.input = Input::default(); + player.last_view = Instant::now() - Duration::from_secs(1); + game.step(); + client.drain() +} + +fn chunk_message(messages: &[Value]) -> &Value { + assert!(messages.iter().all(|message| message["type"] != "snapshot")); + let chunks: Vec<_> = messages + .iter() + .filter(|message| message["type"] == "chunks") + .collect(); + assert_eq!(chunks.len(), 1, "one incremental view update: {messages:?}"); + chunks[0] +} + +fn received_sections(message: &Value, field: &str) -> HashSet { + message[field] + .as_array() + .unwrap() + .iter() + .map(|value| { + serde_json::from_value(if field == "sections" { + value["section"].clone() + } else { + value.clone() + }) + .unwrap() + }) + .collect() +} + +#[test] +fn chunk_stream_welcome_and_resync_use_complete_aligned_sections() { + let (_dir, mut game, mut client) = streaming_fixture(); + let welcome = client.drain().remove(0); + assert_eq!(welcome["type"], "welcome"); + assert_eq!(welcome["features"], json!(["chunk_stream_v1"])); + assert_eq!(welcome["view_center"], json!([0, 0, 0])); + assert_eq!(welcome["view_min"], json!([-32, -16, -32])); + assert_eq!(welcome["view_max"], json!([31, 31, 31])); + + let stone = game.id("minecraft:stone").unwrap(); + edit( + &mut game, + "stream", + vec![ + BlockChange { + pos: [-32, -16, -32], + block: stone, + }, + BlockChange { + pos: [31, 31, 31], + block: stone, + }, + BlockChange { + pos: [-32, -17, -32], + block: stone, + }, + BlockChange { + pos: [32, 31, 31], + block: stone, + }, + ], + ); + game.players.get_mut(&client.id).unwrap().last_snapshot = + Instant::now() - Duration::from_secs(1); + game.client(&client.id, json!({"type":"resync"})).unwrap(); + let snapshot = client.drain().remove(0); + assert_eq!(snapshot["type"], "snapshot"); + assert_eq!(snapshot["view_min"], welcome["view_min"]); + assert_eq!(snapshot["view_max"], welcome["view_max"]); + let positions: HashSet = snapshot["blocks"] + .as_array() + .unwrap() + .iter() + .map(|block| serde_json::from_value(block["pos"].clone()).unwrap()) + .collect(); + assert_eq!(positions, HashSet::from([[-32, -16, -32], [31, 31, 31]])); + assert_eq!(snapshot["revision"], game.store.revision("stream").unwrap()); + assert!(game.client(&client.id, json!({"type":"resync"})).is_err()); +} + +#[test] +fn chunk_stream_x_move_sends_only_entering_sections_and_materials() { + let (_dir, mut game, mut client) = streaming_fixture(); + client.drain(); + let stone = game.id("minecraft:stone").unwrap(); + let ore = game.id("minecraft:diamond_ore").unwrap(); + edit( + &mut game, + "stream", + vec![ + BlockChange { + pos: [0, 0, 0], + block: stone, + }, + BlockChange { + pos: [-32, 0, 0], + block: stone, + }, + BlockChange { + pos: [32, 0, 0], + block: ore, + }, + ], + ); + let last_snapshot = game.players[&client.id].last_snapshot; + let messages = move_view(&mut game, &mut client, [16.5, 2., 0.5]); + let chunks = chunk_message(&messages); + assert_eq!(chunks["world"], "stream"); + assert_eq!(chunks["from_center"], json!([0, 0, 0])); + assert_eq!(chunks["view_center"], json!([16, 0, 0])); + assert_eq!(chunks["view_min"], json!([-16, -16, -32])); + assert_eq!(chunks["view_max"], json!([47, 31, 31])); + let entering = received_sections(chunks, "sections"); + let leaving = received_sections(chunks, "unload"); + assert_eq!(entering.len(), 12); + assert!(entering.iter().all(|section| section[0] == 2)); + assert_eq!(leaving.len(), 12); + assert!(leaving.iter().all(|section| section[0] == -2)); + let blocks: Vec<_> = chunks["sections"] + .as_array() + .unwrap() + .iter() + .flat_map(|section| section["blocks"].as_array().unwrap()) + .collect(); + assert_eq!(blocks, vec![&json!({"pos":[32,0,0],"block":ore})]); + assert_eq!(chunks["materials"].as_array().unwrap().len(), 1); + assert_eq!(chunks["materials"][0]["id"], ore); + assert_eq!(chunks["revision"], game.store.revision("stream").unwrap()); + assert!(chunks.get("spawn").is_none() && chunks.get("players").is_none()); + assert_eq!(game.players[&client.id].last_snapshot, last_snapshot); +} + +#[test] +fn chunk_stream_negative_diagonal_vertical_and_disjoint_moves_are_exact() { + let (_dir, mut game, mut client) = streaming_fixture(); + client.drain(); + let mut previous = [0, 0, 0]; + for (center, expected_count) in [ + ([-16, 0, 0], 12), + ([0, 16, 16], 30), + ([0, -16, 16], 32), + ([160, 48, -160], 48), + ] { + let position = center.map(|coordinate| coordinate as f32 + 0.5); + let messages = move_view(&mut game, &mut client, position); + let chunks = chunk_message(&messages); + let before: HashSet<_> = view_sections(previous).into_iter().collect(); + let after: HashSet<_> = view_sections(center).into_iter().collect(); + assert_eq!(chunks["from_center"], json!(previous)); + assert_eq!(chunks["view_center"], json!(center)); + assert_eq!( + received_sections(chunks, "sections"), + after.difference(&before).copied().collect() + ); + assert_eq!( + received_sections(chunks, "unload"), + before.difference(&after).copied().collect() + ); + assert_eq!(chunks["sections"].as_array().unwrap().len(), expected_count); + assert!( + chunks["sections"] + .as_array() + .unwrap() + .iter() + .all(|section| section["blocks"] == json!([])) + ); + previous = center; + } +} + +#[test] +fn chunk_stream_reentering_section_reads_latest_edit_and_deletion() { + let (_dir, mut game, mut client) = streaming_fixture(); + client.drain(); + let stone = game.id("minecraft:stone").unwrap(); + let ore = game.id("minecraft:gold_ore").unwrap(); + edit( + &mut game, + "stream", + vec![ + BlockChange { + pos: [-32, 0, 0], + block: stone, + }, + BlockChange { + pos: [-31, 0, 0], + block: stone, + }, + ], + ); + move_view(&mut game, &mut client, [16.5, 2., 0.5]); + edit( + &mut game, + "stream", + vec![ + BlockChange { + pos: [-32, 0, 0], + block: ore, + }, + BlockChange { + pos: [-31, 0, 0], + block: 0, + }, + ], + ); + let messages = move_view(&mut game, &mut client, [0.5, 2., 0.5]); + let chunks = chunk_message(&messages); + let blocks: Vec<_> = chunks["sections"] + .as_array() + .unwrap() + .iter() + .flat_map(|section| section["blocks"].as_array().unwrap()) + .collect(); + assert_eq!(blocks, vec![&json!({"pos":[-32,0,0],"block":ore})]); + assert_eq!(chunks["revision"], game.store.revision("stream").unwrap()); +} + +#[test] +fn chunk_stream_keeps_view_when_center_unchanged_and_throttles_only_view_updates() { + let (_dir, mut game, mut client) = streaming_fixture(); + client.drain(); + let messages = move_view(&mut game, &mut client, [15.5, 2., 15.5]); + assert!(messages.iter().all(|message| message["type"] == "state")); + let player = game.players.get_mut(&client.id).unwrap(); + player.position = [16.5, 2., 15.5]; + player.last_view = Instant::now(); + player.last_snapshot = Instant::now() - Duration::from_secs(3); + game.step(); + assert!( + client + .drain() + .iter() + .all(|message| message["type"] == "state") + ); + game.players.get_mut(&client.id).unwrap().last_view = + Instant::now() - Duration::from_millis(251); + game.step(); + chunk_message(&client.drain()); + game.client(&client.id, json!({"type":"resync"})).unwrap(); + assert_eq!(client.drain()[0]["type"], "snapshot"); +} + +#[test] +fn chunk_stream_world_switch_starts_with_a_full_snapshot() { + let (_dir, mut game, mut client) = streaming_fixture(); + client.drain(); + move_view(&mut game, &mut client, [48.5, 18., 48.5]); + game.players.get_mut(&client.id).unwrap().last_snapshot = + Instant::now() - Duration::from_secs(3); + game.client(&client.id, json!({"type":"switch_world","world":"lobby"})) + .unwrap(); + let messages = client.drain(); + assert_eq!(messages.len(), 1); + let snapshot = &messages[0]; + assert_eq!(snapshot["type"], "snapshot"); + assert_eq!(snapshot["world"], "lobby"); + assert_eq!(snapshot["view_center"], json!([0, 0, 0])); + assert_eq!(snapshot["view_min"], json!([-32, -16, -32])); + assert_eq!(snapshot["view_max"], json!([31, 31, 31])); + assert!(snapshot["blocks"].as_array().unwrap().len() > 100); + assert_eq!(game.players[&client.id].view, [0, 0, 0]); +} + +#[test] +fn unnegotiated_clients_keep_legacy_snapshot_bounds_and_interval() { + let (_dir, mut game, mut streaming) = streaming_fixture(); + streaming.drain(); + let stone = game.id("minecraft:stone").unwrap(); + edit( + &mut game, + "stream", + vec![ + BlockChange { + pos: [0, -8, 0], + block: stone, + }, + BlockChange { + pos: [0, -9, 0], + block: stone, + }, + ], + ); + for features in [vec![], vec!["unknown_future_feature"]] { + let mut client = connect_with_features(&mut game, "stream", "Legacy", &features); + let welcome = client.drain().remove(0); + assert!(welcome.get("features").is_none()); + assert!(welcome.get("view_min").is_none()); + assert_eq!(welcome["blocks"], json!([{"pos":[0,-8,0],"block":stone}])); + let messages = move_view(&mut game, &mut client, [16.5, 2., 0.5]); + assert!(messages.iter().all(|message| message["type"] == "state")); + game.players.get_mut(&client.id).unwrap().last_snapshot = + Instant::now() - Duration::from_secs(3); + game.step(); + let messages = client.drain(); + assert!(messages.iter().any(|message| message["type"] == "snapshot")); + assert!(messages.iter().all(|message| message["type"] != "chunks")); + game.players.remove(&client.id); + streaming.drain(); + } +} + #[test] fn official_collision_shapes_drive_world_physics() { let (_dir, mut game) = fixture(); @@ -121,6 +980,7 @@ fn authoritative_actions_reject_forged_targets_and_sync_real_edits() { let player = game.players.get_mut(&a.id).unwrap(); player.position = [0.5, 1., 8.5]; player.input.pitch = -1.2; + player.look[1] = -1.2; let before = game.store.revision("lobby").unwrap(); assert!( game.client(&a.id, json!({"type":"break","pos":[20,0,20]})) @@ -441,6 +1301,7 @@ fn configured_spleef_rules_control_full_round_and_survive_restart() { let player = game.players.get_mut(&a.id).unwrap(); player.position = [0.5, 1., 2.5]; player.input.pitch = -1.2; + player.look[1] = -1.2; player.last_input = Instant::now(); let (hit, _) = game.raycast(&a.id).unwrap().unwrap(); assert_eq!(game.store.get_block("stone_arena", hit).unwrap(), stone); @@ -552,3 +1413,59 @@ fn interrupted_creation_of_managed_world_can_finish_its_seed() { assert_eq!(game.store.revision("lobby").unwrap(), 1); assert_ne!(game.store.get_block("lobby", [0, 0, 0]).unwrap(), 0); } + +#[test] +fn buffered_views_prefetch_a_ring_and_do_not_unload_on_single_chunk_crossings() { + let (_dir, mut game) = fixture(); + game.store.create_world("buffer-test", None).unwrap(); + let mut client = connect_with_features( + &mut game, + "buffer-test", + "Buffered", + &["chunk_stream_v2", "view_buffer_v1"], + ); + let welcome = client + .drain() + .into_iter() + .find(|m| m["type"] == "welcome") + .unwrap(); + assert_eq!(welcome["view_distance"], 3); + assert_eq!(welcome["stream_radius"], 4); + assert_eq!(welcome["total_sections"], 405); + let initial = game.players[&client.id].view; + let generation = game.players[&client.id].view_generation; + let original: HashSet<_> = terrain::sections(initial, 4).into_iter().collect(); + game.players.get_mut(&client.id).unwrap().sent_sections = original.clone(); + // Move the streaming interest directly, avoiding unrelated physics/spawn. + for dx in [16, 0, -16, 0, 16] { + game.players.get_mut(&client.id).unwrap().position[0] = f64::from(initial[0] + dx); + game.pump_terrain(); + assert_eq!(game.players[&client.id].view, initial); + assert_eq!(game.players[&client.id].view_generation, generation); + assert_eq!(game.players[&client.id].sent_sections, original); + assert!(!client.drain().iter().any(|m| m["type"] == "view")); + } + game.players.get_mut(&client.id).unwrap().position[0] = f64::from(initial[0] + 32); + game.pump_terrain(); + let view = client + .drain() + .into_iter() + .find(|m| m["type"] == "view") + .unwrap(); + assert_eq!(view["view_center"][0], initial[0] + 32); + assert_eq!(view["total_sections"], 405); + assert_eq!(view["unload"].as_array().unwrap().len(), 90); + for pos in view["unload"].as_array().unwrap() { + let x = pos[0].as_i64().unwrap() * 16 + 15; + assert!( + i64::from(initial[0] + 32) - x > 3 * 16, + "unloads must lie beyond the requested radius" + ); + } + let new_center: Pos = serde_json::from_value(view["view_center"].clone()).unwrap(); + let (min, max) = terrain::bounds(new_center, 4); + for dx in [-16, 0, 16, 31] { + let x = new_center[0] + dx; + assert!(min[0] <= x - 3 * 16 && max[0] >= x + 3 * 16); + } +} diff --git a/crates/shacraft-server/src/world_streaming.rs b/crates/shacraft-server/src/world_streaming.rs new file mode 100644 index 0000000..7f4cdfd --- /dev/null +++ b/crates/shacraft-server/src/world_streaming.rs @@ -0,0 +1,516 @@ +use crate::terrain::{self, Generator, TerrainConfig, TerrainKey}; + +impl Game { + fn broadcast_blocks(&mut self, world: &str, revision: u64, changes: &[BlockChange]) { + let mut columns = Vec::new(); + if self.generators.contains_key(world) { + let positions: HashSet<_> = changes + .iter() + .map(|c| (c.pos[0].div_euclid(16), c.pos[2].div_euclid(16))) + .collect(); + for (x, z) in positions { + if let Ok(heights) = self.sky_column(world, x, z) { + columns.push(json!({"column":[x,z],"heights":heights})); + } + } + } + self.broadcast(world,json!({"type":"blocks","world":world,"revision":revision,"changes":changes,"materials":self.materials(changes),"columns":columns})); + } + fn generator_palette(&self) -> Result { + Ok(terrain::Palette { + grass: self.id("minecraft:grass_block")?, + dirt: self.id("minecraft:dirt")?, + stone: self.id("minecraft:stone")?, + deep: self.id("minecraft:deepslate")?, + bedrock: self.id("minecraft:bedrock")?, + sand: self.id("minecraft:sand")?, + water: self.id("minecraft:water")?, + lava: self.id("minecraft:lava")?, + log: self.id("minecraft:oak_log")?, + leaves: self.id("minecraft:oak_leaves")?, + snow: self.id("minecraft:snow_block")?, + coal: self.id("minecraft:coal_ore")?, + iron: self.id("minecraft:iron_ore")?, + copper: self.id("minecraft:copper_ore")?, + gold: self.id("minecraft:gold_ore")?, + diamond: self.id("minecraft:diamond_ore")?, + deep_iron: self.id("minecraft:deepslate_iron_ore")?, + deep_diamond: self.id("minecraft:deepslate_diamond_ore")?, + }) + } + fn open_generators(&mut self) -> Result<()> { + let palette = self.generator_palette()?; + for (name, conf) in &self.meta.worlds { + if let Some(config) = &conf.terrain { + config.validate()?; + self.generators.insert( + name.clone(), + Arc::new(Generator { + config: config.clone(), + palette: palette.clone(), + }), + ); + } + } + Ok(()) + } + fn create_overworld(&mut self, name: &str, config: TerrainConfig) -> Result<()> { + config.validate()?; + let generator = Arc::new(Generator { + config: config.clone(), + palette: self.generator_palette()?, + }); + self.store.create_world(name, None)?; + self.meta.worlds.insert( + name.into(), + WorldConfig { + spawn: [0., f64::from(generator.height(0, 8) + 1), 8.], + elimination_y: -128., + terrain: Some(config), + ..WorldConfig::default() + }, + ); + self.save_meta()?; + self.generators.insert(name.into(), generator); + Ok(()) + } + fn section_data(&mut self, world: &str, pos: Pos) -> Result>> { + let key = (world.to_owned(), pos); + if let Some(cells) = self.terrain.get(&key) { + return Ok(Some(cells)); + } + if pos.iter().any(|v| { + i64::from(*v) * 16 < -i64::from(shacraft_core::COORD_LIMIT) + || i64::from(*v) * 16 + 15 > i64::from(shacraft_core::COORD_LIMIT) + }) { + let cells = Arc::new([0; 4096]); + self.terrain.insert(key, cells.clone()); + return Ok(Some(cells)); + } + if let Some(cells) = self.store.read_section(world, pos)? { + let cells: Arc = Arc::from(cells); + self.terrain.insert(key, cells.clone()); + return Ok(Some(cells)); + } + if let Some(generator) = self.generators.get(world) { + if pos[1] * 16 > terrain::MAX_Y || pos[1] * 16 + 15 < terrain::MIN_Y { + let cells = Arc::new([0; 4096]); + self.terrain.insert(key, cells.clone()); + return Ok(Some(cells)); + } + self.terrain.request(key, generator.clone()); + Ok(None) + } else { + let cells = Arc::new([0; 4096]); + self.terrain.insert(key, cells.clone()); + Ok(Some(cells)) + } + } + fn read_world_region(&mut self, world: &str, min: Pos, max: Pos) -> Result> { + if !self.generators.contains_key(world) { + return self.store.read_region(world, min, max); + } + let mut volume = 1i64; + ensure!( + min.iter() + .chain(max.iter()) + .all(|v| i64::from(*v).abs() <= i64::from(shacraft_core::COORD_LIMIT)), + "coordinate outside storage bounds" + ); + for i in 0..3 { + ensure!(min[i] <= max[i], "invalid region"); + volume = volume + .checked_mul(i64::from(max[i]) - i64::from(min[i]) + 1) + .context("region overflow")?; + ensure!( + volume <= shacraft_core::MAX_READ_VOLUME as i64, + "region too large" + ); + } + let mut sections = Vec::new(); + let mut pending = false; + for sy in min[1].div_euclid(16)..=max[1].div_euclid(16) { + for sz in min[2].div_euclid(16)..=max[2].div_euclid(16) { + for sx in min[0].div_euclid(16)..=max[0].div_euclid(16) { + let pos = [sx, sy, sz]; + if let Some(cells) = self.section_data(world, pos)? { + sections.push((pos, cells)); + } else { + pending = true; + self.terrain.retain_for_read((world.into(), pos)); + } + } + } + } + ensure!(!pending, "terrain pending; retry when generated"); + let mut result = Vec::new(); + for ([sx, sy, sz], cells) in sections { + for y in min[1].max(sy * 16)..=max[1].min(sy * 16 + 15) { + for z in min[2].max(sz * 16)..=max[2].min(sz * 16 + 15) { + for x in min[0].max(sx * 16)..=max[0].min(sx * 16 + 15) { + let block = cells[(x.rem_euclid(16) + + 16 * z.rem_euclid(16) + + 256 * y.rem_euclid(16)) + as usize]; + if block != 0 { + result.push(BlockChange { + pos: [x, y, z], + block, + }); + } + } + } + } + } + Ok(result) + } + fn world_block(&mut self, world: &str, pos: Pos) -> Result { + if !self.generators.contains_key(world) { + return self.store.get_block(world, pos); + } + let cells = self + .section_data(world, pos.map(|v| v.div_euclid(16)))? + .context("terrain pending")?; + Ok( + cells[(pos[0].rem_euclid(16) + 16 * pos[2].rem_euclid(16) + 256 * pos[1].rem_euclid(16)) + as usize], + ) + } + fn materialize_changes(&mut self, world: &str, changes: &[BlockChange]) -> Result<()> { + if !self.generators.contains_key(world) { + return Ok(()); + } + ensure!( + changes.len() <= shacraft_core::MAX_EDIT_CELLS, + "edit exceeds cell limit" + ); + let mut unique = HashSet::new(); + for change in changes { + ensure!( + change + .pos + .iter() + .all(|v| f64::from(*v).abs() <= terrain::BORDER), + "outside playable bounds" + ); + ensure!( + (change.block as usize) < self.store.registry().len(), + "unknown block" + ); + ensure!(unique.insert(change.pos), "duplicate position"); + } + let positions: HashSet<_> = changes + .iter() + .map(|c| c.pos.map(|v| v.div_euclid(16))) + .collect(); + let mut sections = Vec::new(); + for pos in positions { + ensure!( + pos[1] >= terrain::MIN_Y / 16 && pos[1] <= terrain::MAX_Y / 16, + "outside build height -64..319" + ); + self.terrain.retain_for_read((world.into(), pos)); + let cells = self + .section_data(world, pos)? + .context("terrain pending; retry when loaded")?; + sections.push((pos, cells)); + } + for (pos, cells) in sections { + self.store.materialize_section(world, pos, &cells)?; + } + Ok(()) + } + fn terrain_changed(&mut self, world: &str, changes: &[BlockChange]) { + let sections = changes + .iter() + .map(|c| c.pos.map(|v| v.div_euclid(16))) + .collect(); + self.terrain.invalidate(world, §ions); + self.sky_cache.retain(|(w, sx, sz), _| { + w != world + || !changes + .iter() + .any(|c| c.pos[0].div_euclid(16) == *sx && c.pos[2].div_euclid(16) == *sz) + }); + } + fn sky_column(&mut self, world: &str, sx: i32, sz: i32) -> Result> { + let key = (world.to_owned(), sx, sz); + if let Some(heights) = self.sky_cache.get(&key) { + return Ok(heights.clone()); + } + let Some(generator) = self.generators.get(world).cloned() else { + return Ok(vec![-32768; 256]); + }; + let mut heights = generator.sky_heights(sx, sz); + // Only edited columns have durable sections. Resolve their actual top + // against the seed, including air overrides left by mining a roof. + let mut stored = HashMap::new(); + for sy in terrain::MIN_Y.div_euclid(16)..=terrain::MAX_Y.div_euclid(16) { + if let Some(cells) = self.store.read_section(world, [sx, sy, sz])? { + stored.insert(sy, cells); + } + } + if !stored.is_empty() { + let highest = stored.keys().max().copied().unwrap() * 16 + 15; + let natural_max = i32::from(*heights.iter().max().unwrap()); + let mut generated = HashMap::new(); + for z in 0..16 { + for x in 0..16 { + let mut top = highest.max(natural_max); + loop { + let sy = top.div_euclid(16); + let index = (x + 16 * z + 256 * top.rem_euclid(16)) as usize; + let block = if let Some(cells) = stored.get(&sy) { + cells[index] + } else { + let cells = generated + .entry(sy) + .or_insert_with(|| generator.generate([sx, sy, sz])); + cells[index] + }; + let opaque = self.definition(block).is_some_and(|d| { + d.opacity >= 1. + && !d.state.contains("leaves") + && !d.state.contains("water") + && (!d.state.contains("glass") || d.state.contains("tinted_glass")) + && d.render + .iter() + .any(|b| b.min == [0.; 3] && b.max == [1.; 3]) + }); + if opaque || top <= terrain::MIN_Y { + break; + } + top -= 1; + } + heights[(x + 16 * z) as usize] = top as i16; + } + } + } + if self.sky_cache.len() >= 2048 { + self.sky_cache.clear(); + } + self.sky_cache.insert(key, heights.to_vec()); + Ok(heights.to_vec()) + } + fn begin_section_view(&mut self, id: &str, center: Pos, welcome: bool) -> Result<()> { + let p = self.players.get_mut(id).context("not joined")?; + let ordered = terrain::view_sections(center, p.stream_radius(), p.full_height); + let new: HashSet<_> = ordered.iter().copied().collect(); + let unload: Vec<_> = p + .sent_sections + .iter() + .filter(|pos| !new.contains(*pos)) + .copied() + .collect(); + p.sent_sections.retain(|pos| new.contains(pos)); + if welcome { + p.sent_sections.clear(); + } + p.pending_sections = ordered + .into_iter() + .filter(|pos| !p.sent_sections.contains(pos)) + .collect(); + p.view = center; + p.view_generation += 1; + p.last_view = Instant::now(); + let world = p.world.clone(); + let generation = p.view_generation; + let radius = p.stream_radius(); + let (min, max) = terrain::view_bounds(center, radius, p.full_height); + let mut message = json!({"type":"view","world":world,"revision":self.store.revision(&world)?,"generation":generation,"view_center":center,"view_min":min,"view_max":max,"unload":unload,"total_sections":new.len()}); + message["view_distance"] = json!(p.view_distance); + message["stream_radius"] = json!(radius); + message["full_height"] = json!(p.full_height); + if welcome { + let p = &self.players[id]; + message["type"] = json!(if p.welcomed { "snapshot" } else { "welcome" }); + message["id"] = json!(id); + message["spawn"] = json!(p.body.position); + message["features"] = json!([ + "chunk_stream_v2", + "movement_prediction_v1", + "view_distance_v1", + "view_buffer_v1", + "full_height_v1" + ]); + message["max_view_distance"] = json!(terrain::MAX_VIEW_RADIUS); + message["blocks"] = json!([]); + message["materials"] = json!([]); + message["players"] = self.players_json(&world); + message["entities"] = json!(self.entity_list(&world)); + message["motion"] = self.motion_json(p); + message["manifest_hash"] = self.manifest["hash"].clone(); + message["terrain"] = json!(self.config(&world).terrain); + message["world_bounds"] = + json!({"min_y":terrain::MIN_Y,"max_y":terrain::MAX_Y,"border":terrain::BORDER}); + let p = self.players.get_mut(id).unwrap(); + p.welcomed = true; + p.last_snapshot = Instant::now(); + } + self.send(id, message); + Ok(()) + } + fn pump_terrain(&mut self) { + let start = Instant::now(); + let moved: Vec<_> = self + .players + .values() + .filter(|p| p.section_stream) + .filter_map(|p| { + let center = p.position.map(|v| (v.floor() as i32).div_euclid(16) * 16); + terrain::view_needs_move(p.view, center, p.buffered_view) + .then_some((p.id.clone(), center)) + }) + .collect(); + for (id, center) in moved { + let _ = self.begin_section_view(&id, center, false); + } + let mut wanted = HashSet::::new(); + let mut priorities = HashMap::::new(); + // Shared requests deduplicate between players. The squared distance + // order puts collision sections before the outer visual/preload ring. + for p in self.players.values() { + if !self.generators.contains_key(&p.world) && !p.section_stream { + continue; + } + let center = p.position.map(|v| (v.floor() as i32).div_euclid(16) * 16); + // Queue order is computed once per view, not by sorting up to + // 411,864 sections every simulation tick. Only a bounded lookahead + // and the current collision neighborhood need server residency. + let upcoming = if p.section_stream { + p.pending_sections + .iter() + .take(if p.full_height { 256 } else { 128 }) + .copied() + .collect::>() + } else { + terrain::sections(center, p.stream_radius()) + }; + for pos in terrain::sections(center, 2).into_iter().chain(upcoming) { + let key = (p.world.clone(), pos); + wanted.insert(key.clone()); + { + let c = center.map(|v| v / 16); + let distance = (pos[0] - c[0]).pow(2) + + (pos[2] - c[2]).pow(2) + + (pos[1] - c[1]).pow(2) * 2; + // Delivered terrain can leave the server cache. Rebuild it + // only for collision or another client's unsent view. + if !p.sent_sections.contains(&pos) || distance <= 6 { + priorities + .entry(key) + .and_modify(|priority| *priority = (*priority).min(distance)) + .or_insert(distance); + } + } + } + } + self.terrain.poll(&wanted); + let mut ordered: Vec<_> = priorities + .into_iter() + .map(|(key, distance)| (distance, key)) + .collect(); + ordered.sort_by_key(|(distance, _)| *distance); + // Scheduling a large view can itself exhaust the budget on a slower + // CPU. Give loading its own bounded slice so new sections still progress. + let load_start = Instant::now(); + for (_, key) in ordered { + if self.terrain.contains(&key) { + continue; + } + if load_start.elapsed().as_secs_f64() > 0.004 { + break; + } + let _ = self.section_data(&key.0, key.1); + } + let ids: Vec<_> = self + .players + .values() + .filter(|p| p.section_stream && p.last_batch.elapsed() >= Duration::from_millis(50)) + .map(|p| p.id.clone()) + .collect(); + for id in ids { + let p = &self.players[&id]; + let world = p.world.clone(); + let generation = p.view_generation; + if p.out.bytes.load(Ordering::Relaxed) > 512 * 1024 { + continue; + } + let requested: Vec<_> = p + .pending_sections + .iter() + .copied() + .take(if p.full_height { 128 } else { 32 }) + .collect(); + let considered = requested.len(); + let mut packed = Vec::new(); + let mut delivered = Vec::new(); + let mut material_ids = HashSet::new(); + let mut columns = HashMap::new(); + let mut dense_sections = 0; + let mut estimated_bytes = 0; + for pos in requested { + if start.elapsed().as_secs_f64() > 0.010 && !packed.is_empty() { + break; + } + let Some(cells) = self.terrain.get(&(world.clone(), pos)) else { + continue; + }; + let uniform = cells.iter().all(|id| *id == cells[0]); + if !uniform && dense_sections >= 32 { + break; + } + let mut value = terrain::pack(&cells); + let bytes = 128 + + 12 * (value["palette"].as_array().unwrap().len() + + value["runs"].as_array().unwrap().len()); + if !packed.is_empty() && estimated_bytes + bytes > 256 * 1024 { + break; + } + estimated_bytes += bytes; + if uniform { + if cells[0] != 0 { + material_ids.insert(cells[0]); + } + } else { + dense_sections += 1; + material_ids.extend(cells.iter().copied().filter(|id| *id != 0)); + } + value["section"] = json!(pos); + packed.push(value); + delivered.push(pos); + if self.generators.contains_key(&world) + && !columns.contains_key(&(pos[0], pos[2])) + && let Ok(heights) = self.sky_column(&world, pos[0], pos[2]) + { + columns.insert( + (pos[0], pos[2]), + json!({"column":[pos[0],pos[2]],"heights":heights}), + ); + } + } + if packed.is_empty() { + continue; + } + let p = self.players.get_mut(&id).unwrap(); + let delivered: HashSet<_> = delivered.into_iter().collect(); + let remaining: Vec<_> = p + .pending_sections + .drain(..considered) + .filter(|pos| !delivered.contains(pos)) + .collect(); + for pos in remaining.into_iter().rev() { + p.pending_sections.push_front(pos); + } + p.sent_sections.extend(delivered); + p.last_batch = Instant::now(); + let loaded = p.sent_sections.len(); + let total = p.sent_sections.len() + p.pending_sections.len(); + let value = json!({"type":"sections","world":world,"revision":self.store.revision(&world).unwrap_or(0),"generation":generation,"sections":packed,"columns":columns.into_values().collect::>(),"materials":self.materials_for_ids(material_ids.into_iter()),"loaded_sections":loaded,"total_sections":total}); + self.stream_batches += 1; + self.stream_sections += value["sections"].as_array().unwrap().len() as u64; + self.send(&id, value); + } + self.last_stream_ms = start.elapsed().as_secs_f64() * 1000.; + } +} diff --git a/docs/CLIENT.md b/docs/CLIENT.md index 72b54c9..f87e401 100644 --- a/docs/CLIENT.md +++ b/docs/CLIENT.md @@ -4,21 +4,47 @@ The client lives in `client/` and is served by `shacraft-server` at `/`. It uses ## Controls -- Click the world to capture the mouse. If the browser blocks pointer lock, hold the mouse button and drag to look around. +- Click the world to capture the mouse. A drag or rejected request never disables the next capture attempt. If the browser blocks pointer lock, select the explicit drag-control mode in the game menu; holding a mouse button turns the camera and short clicks edit blocks in that mode. The canvas is focusable, and F3 reports capture status and browser errors. - WASD or arrow keys move; Space jumps. Movement follows the camera; +Y is up, and yaw 0 looks along −Z. The player's position specifies their feet. +- Hold Ctrl to sprint and Shift to crouch or descend in creative flight. Crouching reduces the collider and eye height and prevents walking off supported edges. Double-tap Space within 300 ms, or press F, to toggle flight when the world permits it; Space ascends. The same controls handle swimming and ladders. - Left-click removes the selected block, right-click places a block against the selected face, and middle-click copies the selected material into the current hotbar slot. - 1–9 or the mouse wheel selects a hotbar slot. E opens the library of all states; search uses English Minecraft identifiers. Selecting a state replaces the current slot. - T or Enter opens chat, Enter sends, and Esc closes it. +- The game menu includes **Render distance**, from 2 to 64 chunks (up to 1,024 blocks) around the player, with Apply and a loading counter. It remembers the choice locally; increasing it also extends fog, the projection range, and actual streaming bounds. Larger views load progressively with nearby sections first. - The world-name button opens the instance selector. F3 opens diagnostics. The menu contains the player name, return-to-spawn action, and Spleef start action. - Esc releases the mouse. Losing focus or opening a panel sends zero input so the player does not keep moving. ## Rendering and synchronization -Geometry is built from each material's local box shapes. Meshes are divided into 16³ sections; shared faces between full opaque cubes are culled. A block change rebuilds its section and adjacent sections. The shader uses directional lighting, fog, a pixelated surface pattern, and an original texture from a verified package. The sky and sun are also drawn with WebGL. Transparent materials use a separate pass with sections sorted by distance; transparent surface ordering within each section is simplified. A package with the declarative style `effect: bounce` (including the trampoline and custom blocks) supplies a texture, a verified GLSL highlight function, and an original sound; the response is tied to the player's upward movement received from the server. Entity shapes come from the catalog; players have separate multipart avatars. These are original, simplified visuals rather than an exact reproduction of Minecraft. +Geometry is built from each material's local box shapes. Meshes are divided into 16³ sections; shared faces between full opaque cubes are culled. A block change rebuilds affected sections, including diagonal neighbors whose corner lighting changes. Transparent materials use a separate pass with sections sorted by distance; transparent surface ordering within each section is simplified. A package with the declarative style `effect: bounce` (including the trampoline and custom blocks) supplies a texture, a verified GLSL highlight function, and an original sound; the response is tied to the player's upward movement received from the server. Entity shapes come from the catalog; players have separate multipart avatars. These are original, simplified visuals rather than an exact reproduction of Minecraft. -The client sends input at most 20 times per second, never declares its own position, and does not edit blocks optimistically. The server computes movement, collisions, and edits, while the client smooths received positions between frames. This introduces a small movement delay but keeps the displayed position aligned with the authoritative simulation. The camera responds to the mouse locally. +Static terrain uses separate persistent module workers for whole-view light and local terrain meshing. Protocol v2 uses dense `SectionVoxelMap` arrays and transfers copied section buffers, retaining main-thread collision ownership. The legacy path uses indexed `SectionBlockMap` records. Later updates send block deltas, complete entering sections, section unloads, sky occlusion columns and changed material definitions. Nearby meshes compute their own bounded light tiles and do not wait for whole-view light. Eight cached tiles cover 2×2 chunk columns each, with an 18-block halo and the full active vertical range. Spatial invalidation and per-section tickets prevent unrelated distant batches or view-edge changes from cancelling useful mesh work. Mesh vertices are section-local; camera-relative drawing preserves precision at distant coordinates. The controller permits one mesh request in flight and at most two completed meshes waiting for upload, prioritizing received nearby dirty sections. See [world streaming](WORLD_STREAMING.md) for storage, wire format and bounds. -`welcome` and `snapshot` replace all visible geometry. A full `registry` is optional: snapshots contain at most 256 definitions of materials in use, and the client gradually fetches the remaining shapes through `/api/catalog?ids=...&limit=128`. Each response rebuilds only affected sections; a neutral cube is displayed until its shape arrives. `blocks` events are applied only in revision order; data outside the latest 64×40×64 window is discarded while the revision still advances. A gap triggers `resync`; old revisions are ignored. After a disconnect, the client retries after 1, 2, 4, 8, 16, then 20 seconds. Connection failures, incompatible protocols, resource errors, and actions rejected by the server are shown to the user. +The main thread uploads completed section buffers in `bufferSubData` steps of at most 64 KiB, targeting a 2 ms upload budget per frame. It keeps the previous visible mesh until both opaque and translucent replacement buffers are complete, then replaces their GPU handles while retaining the section object. This avoids displaying partially uploaded geometry. GPU allocation and an individual driver call cannot be interrupted, so the budget is a scheduling target rather than a guaranteed frame duration. Dynamic avatars/entities, their light samples, draw submission and UI remain on the main thread. If the terrain worker cannot start or later fails, the renderer retains visible meshes and uses synchronous terrain meshing with the former `BlockLightController`; diagnostics identify this fallback explicitly. + +The default shader has **Moonlight** and **Daylight** modes. The game starts at night, with a dark sky, stars and weak cool moonlight; the lighting button in the game menu switches to daylight and remembers the choice locally. Daylight combines warm direct sunlight with cool sky illumination and muted ground bounce. Texture colors are decoded from sRGB, lit in linear space and encoded for display; texture sampling stays nearest-neighbor. One fixed world-space light direction controls the sun/moon and shadows. The sky, distance fog and water reflections follow the selected mode. Emissive materials also illuminate nearby surfaces and actors through separate propagated block/sky light fields, each with canonical levels 0–15. Skylight controls natural illumination, reflection and fog inside roofed spaces; source light remains independent of the time of day. See [block lighting](LIGHTING.md) for measured rules, worker integration and boundaries. + +Sun shadows use a 2048² depth map (bounded by GPU support), a light-space grid that snaps to texels, and a stable 3×3 PCF filter. Coverage fades near the 48-block radius. Opaque terrain, cutout texture silhouettes, players and entities cast shadows; translucent glass and water do not cast solid shadows. Shadow geometry updates with world edits and actor movement. Geometry-aware corner ambient occlusion also considers slabs, stairs and shapes extending beyond their owning cells, while leaving unobstructed flat planes clean. Shader sources live in `lighting-shaders.js`, shadow projection in `shadow-frame.js`, and AO sampling in `ambient-occlusion.js`. F3 shows the active lighting and shadow-map size. If a depth framebuffer is unavailable, the client keeps daylight and AO without sun shadows. + +Open `/tests/renderer-smoke.html` for a deterministic lighting fixture with overview, corner, sun-facing and enclosed-room cameras, a shadow toggle and a removable pillar. The room includes a torch/sea-lantern/off control, glass window and removable partition, plus canonical block/sky readings. Its DOM diagnostics retain WebGL errors and mesh counters for browser verification. Unit tests cover corner occlusion, partial shapes, chunk-boundary invalidation, shadow projection, propagation, measured Java light transitions and asynchronous result ordering; the fixture checks the actual GPU programs and rendering path. + +The client runs the same Rust movement solver as the server, compiled into `client/physics.wasm`. It loads the module before joining and advertises `movement_prediction_v1` only after its ABI has been verified. Input is sampled at fixed 50 ms steps independently of display FPS. A stalled frame contributes at most five catch-up commands, and hidden pages reset their accumulator. The client sends controls and sequence numbers, never its own position, and does not edit blocks optimistically. + +The server's per-player `motion` message supplies the authoritative body, processed input sequence, tick, movement settings, and reset epoch. The client removes acknowledged commands, then replays remaining commands from that body using the shared solver and its current collision neighbourhood. A maximum of 120 commands is retained; an overflow suspends prediction until the missing history has been acknowledged. Out-of-order ticks and decreasing acknowledgements are ignored. Respawn, world changes, reconnects, and input-reset epochs clear old commands. A teleport also clears interpolation and pending commands. + +Render frames interpolate toward one disposable predicted next step, so local movement and mouse look respond before the round trip to the server. Small authoritative corrections decay visually without changing the simulated position or velocity. Crouching and swimming change the camera eye height. The local collision query includes the swept body volume, extended collision boxes, climbable blocks, and fluids even when their collision shape is empty. If a required chunk or material definition has not arrived, prediction waits for authoritative motion instead of treating unknown space as air. Block and chunk changes invalidate the render preview. A missing or incompatible WebAssembly module leaves the client in a visible server-only fallback mode. + +Opening a panel, losing focus, or hiding the page sends `input_reset` when prediction is negotiated. The server clears queued movement and acknowledges the discarded commands with a new epoch, while gravity continues. A `look` packet immediately before a block action updates the server's selection ray without queuing another movement step. On legacy servers the client uses the previous zero-input packet and smooths server positions. Server-side package jump hooks remain authoritative; their impulses can produce a small correction on the first predicted jump. + +Remote player yaw has a separate server target and displayed angle. Each render frame smooths position and yaw with `1 - exp(-19 * dt)`, using the shortest angular arc for yaw. New packets replace the target without snapping the displayed pose. Initial appearances and world changes initialize the pose immediately. This avoids 20 Hz rotation steps and long spins across the angle wrap. + +The client prefers `chunk_stream_v2`, `view_buffer_v1` and `full_height_v1`, with a default 9×9×24 data window of 16³ sections (configurable from 7×7×24 to 131×131×24), typed cell arrays, palette/RLE batches and explicit readiness. Uniform sections use one uint32 value, including in worker transfers; editing expands only the affected section. The entire world height, Y=−64 through 319, remains resident during vertical flight. This includes one loaded chunk ring beyond the selected radius. Horizontal loading anchors move after two chunk crossings, keeping overlap and avoiding immediate unloads on a single crossing. Distance fog blends the visible edge before buffer unloads. A view generation rejects late batches from previous windows; revisions still order actual edits. Same-world resync keeps existing visible geometry while replacing authoritative sections. The v1 path remains available for older nonprocedural servers: an aligned 64×48×64 window with indexed block records. See [section protocol v2](WORLD_STREAMING.md#section-protocol-v2). + +F3 includes movement recordings, automatic routes, a rolling frame/CPU chart and JSON export. Automatic scenarios deliberately continue through the diagnostics panel; Stop/Esc or hiding the tab stops them. Manual play still resets held input when a panel opens. Diagnostics is a nonmodal overlay: clicking the world, resuming play and starting a recording leave it open. F3 or its close button hides it. Focusing its controls pauses manual movement; clicking the canvas restores control. Trace limits, timing definitions and measured local results are in [movement diagnostics](WORLD_STREAMING.md#diagnostics). + +A full `registry` is optional: snapshots contain at most 256 definitions of materials in use, and the client gradually fetches the remaining shapes through `/api/catalog?ids=...&limit=128`. Newly received material definitions also refresh retained sections that were displaying neutral fallback cubes. `blocks` events are applied only in revision order; data outside the current view bounds is discarded while the revision still advances. A `chunks` message must match the current world, revision, and previous center, with exactly the expected entering and departing sections; it cannot advance the world revision. A revision gap or an inconsistent transition triggers `resync` before any chunk data is changed. Servers without the negotiated feature can still send full snapshots using the legacy 64×40×64 window. After a disconnect, the client retries after 1, 2, 4, 8, 16, then 20 seconds. Connection failures, incompatible protocols, resource errors, and actions rejected by the server are shown to the user. + +Dynamic actors already contain camera-relative vertices. Both the color and shadow passes explicitly reset their own program's section offset before drawing players and entities. They must not inherit the last terrain mesh's offset. Regression checks cover mesh-order changes, empty terrain frames, negative/distant coordinates and camera-origin crossings. The renderer fixture includes paired actor cameras at X=15.99 and X=16.01 for a visual boundary check and reports actual WebGL errors. ## Packages @@ -28,6 +54,18 @@ The Control API token is never sent to the client. Packages do not execute arbit ## Debugging and checks -F3 displays real values: world, revision, visible block and entity counts, players, WebGL, FPS, triangles, tick, acknowledged input, coordinates, packages, and available server metrics. `#world-canvas` exposes `data-world`, `data-revision`, `data-blocks`, `data-entities`, `data-webgl`, and `data-connected`; these update once per second for automated browser checks. Secrets and control commands are not exposed through the DOM. +F3 displays real values: world, revision, visible block and entity counts, players, WebGL, FPS, triangles, section mesh counts, mesh rebuilds, geometry resets, full snapshots, chunk updates, tick, acknowledged input, physics mode, pose, pending input count, correction distance, coordinates, packages, the active block texture pack and its image count, and available server metrics. `#world-canvas` exposes `data-world`, `data-revision`, `data-blocks`, `data-entities`, `data-webgl`, `data-connected`, `data-texture-pack`, `data-texture-count`, `data-texture-size`, `data-full-snapshots`, `data-chunk-updates`, `data-mesh-resets`, `data-mesh-rebuilds`, `data-section-meshes`, and `data-view-center`; these update once per second for automated browser checks. Movement checks also use `data-physics` (`predicted`, `waiting-world`, or `server`), `data-player-position`, `data-player-pose`, `data-prediction-pending`, and `data-prediction-correction`. Secrets and control commands are not exposed through the DOM. See [local block texture packs](PACKAGES.md#local-block-texture-packs) for the package descriptor and preparation command. -Run the pure math checks with `cd client && npm test`. They cover camera axes and projection, negative coordinates, the nearest face, reach limits, and exact hits on non-full-block shapes. Visual and end-to-end checks use a real server separately from these unit tests. +Terrain diagnostics include frame-time p95/maximum over the most recent 240 frame intervals, the number of dirty sections, worker/fallback mode, the last packet-preparation time, worker section-build time and current frame's geometry-upload time. The canvas exposes `data-terrain-mode` (`worker` or `main-thread-fallback`), `data-terrain-prepare-ms`, `data-mesh-build-ms`, and `data-mesh-upload-ms`. Lighting diagnostics include `data-block-lighting`, `data-light-build-ms`, `data-light-sources`, `data-block-light`, and `data-sky-light`. Worker build time is background CPU time; it is distinct from the frame and upload measurements. + +F3 also shows the geometry worker mode (`data-terrain-meshing`), first nonempty terrain publication (`data-first-terrain-ms`), completed/received sections in the camera's 3×3×3 neighborhood (`data-near-meshes` / `data-near-loaded`), and local light tile work (`data-local-light-cells` / `data-local-light-ms`). These distinguish nearby rendering progress from background completion of the full draw distance. + +Run the client checks with `cd client && npm test`. They cover camera axes and projection, negative coordinates, the nearest face, reach limits, exact hits on non-full-block shapes, partial-pack fallback, per-face texture selection, cutout/tint metadata, horizontal log UV orientation, retained block maps and meshes during streaming, empty incoming sections, exact view bounds, same-world snapshot differences, and rejection of inconsistent or out-of-order chunk transitions. Physics checks cover FPS-independent timing, bounded catch-up, acknowledgement replay, stale packets, reset epochs, teleports, missing collision data, history overflow, and disposable render predictions. They also instantiate the shipped WebAssembly through the browser loader, compare its per-tick positions and velocities with independently measured Java 26.2 movement fixtures, and replay delayed authoritative updates through the actual solver. Rebuild the asset with `scripts/build_physics.sh` after changing the Rust crate. Visual and end-to-end checks use a real server separately from these unit tests. + +Confirmed small block edits use a separate edit-mesh worker, independent of whole-view lighting. It receives only the section and its sampling neighborhood, builds current geometry/culling/AO with the previous light field, and gets upload priority. Lighting is corrected by the regular terrain worker afterwards. At most one edit job is in flight and two completed buffers are queued. Section tickets reject superseded edits, unloads and world resets; unrelated chunk updates do not discard a valid local edit. Large bulk edits keep the regular terrain path. If the edit worker fails, edits still use the ordinary terrain queue. + +F3 separates the last local edit’s server acknowledgement, confirmed-to-mesh and total time. `data-edit-timings` contains `acknowledgementMs`, `geometryMs` and `totalMs`; `data-edit-prepare-ms`, `data-edit-mesh-ms` and `data-edit-worker` expose the small worker path. Timings end at mesh publication in the render loop, not GPU completion or monitor scanout. `block-edit` events are included in recorded traces. Server authority, edit validation and collision updates are unchanged. + +Terrain tests cover indexed world changes, persistent worker state, transferred deltas, stale generations, material/texture changes, pure geometry output and staged GPU uploads. Fake-GL upload tests check byte offsets and the 64 KiB step limit, preservation of old opaque/translucent meshes until completion, partial-upload disposal, and yielding after an expensive allocation. They also check independent edit uploads against newer edits and unrelated terrain versions. Local edit geometry is compared byte-for-byte with whole-world geometry at section boundaries and distant coordinates, including glass and lamps; live voxel/light buffers must survive worker transfer. They do not establish real GPU frame-time guarantees. + +Open `/tests/terrain-streaming-smoke.html` for an isolated browser comparison between worker and main-thread meshing. It warms a synthetic 64×64 view before a 12-second run at eight blocks per second, crossing six section boundaries without modifying a server world. Results include frame and JavaScript draw timings, the duration of each chunk-update stage, retained-mesh checks and WebGL errors. Keep the tab visible and compare modes in the same browser at the same canvas size. CPU draw timing measures JavaScript and graphics submission, not GPU completion. diff --git a/docs/LIGHTING.md b/docs/LIGHTING.md new file mode 100644 index 0000000..88c7579 --- /dev/null +++ b/docs/LIGHTING.md @@ -0,0 +1,129 @@ +# Block and sky lighting + +Light-emitting block states illuminate their surroundings. The renderer computes +two independent integer fields, **block light** and **sky light**, each ranging +from 0 to 15. These fields determine the brightness of terrain, transparent +surfaces and moving avatars/entities. Emissive surfaces themselves remain bright. + +## Rules and reference data + +Emission comes from the server catalog's state-specific `light` value. An ordinary +torch emits 14, a sea lantern 15, and an unlit lamp emits 0. State changes, +installation and removal trigger a new calculation. Overlapping lights select +the strongest level; they do not add their levels together. + +Block light travels to the six adjacent cells and loses at least one level at +each transition. Target material dampening and the combined source/target +occlusion faces can reduce or stop transmission. The solver uses actual face +rectangle unions, including complementary slab and stair shapes, rather than +treating every collision box as an opaque cube. Light can travel around an open +doorway with attenuation along that path. + +Open vertical sky has level 15. Unobstructed downward travel through clear cells +keeps 15; other propagation loses at least one level. Roofs, material dampening +and face occlusion interrupt direct skylight. A sealed room therefore has sky +level 0 even during the daytime scene, while a light source inside it +continues to illuminate the room. + +`client/light-properties.json` contains measured Java 26.2 dampening and effective +light-occlusion shapes for all **32,366 states**, with 60 deduplicated shapes. +The loader resolves either the catalog's `minecraft_id` or state strings, +including partial properties with original defaults. These IDs are independent +of Shacraft's runtime material IDs. Examples include transparent glass (0), +tinted glass (15), water/leaves/ordinary ice (1), and packed/blue ice (15). +Metadata is about light transmission, which can differ from collision geometry. + +The data and 78 directional crossing measurements come from the pinned original +executable through an independently authored probe. The propagation tests agree +with those crossings. This is evidence for the measured properties and local +transitions, not execution of an entire original Minecraft world-light engine. + +```sh +python3 scripts/measure_lighting.py --java /path/to/java25/bin/java +node --test client/tests/light-properties.test.js client/tests/block-light.test.js +``` + +The probe checks the official bundle and extracted executable hashes. No original +runtime or proprietary source code is distributed. The compact runtime metadata +is about 150 KB before HTTP compression. + +## Rendering and updates + +`terrain-controller.js` maintains one persistent `terrain-worker.js` instance. +The worker owns the section-indexed block map, material light properties, texture +metadata and bounded light fields. A normal streamed view has 196,608 cells; +the field buffers total about 1.18 MB. Initial blocks are packed in short main-thread +time slices and transferred as `Int32Array` records `(x, y, z, block)`. Subsequent +messages carry numeric block deltas, section unloads and changed definitions, +instead of repeatedly cloning the full loaded block map. + +`terrain-state.js` computes fields through `block-light.js`, compares old/new +light values around section neighborhoods, and builds affected static geometry +through `mesh-geometry.js`. Propagation, light comparison, AO sampling, face culling +and mesh generation therefore all run in the worker. Vertex samples blend +accessible neighbors outside each face and avoid sampling through solid corners. +The worker keeps its field arrays and transfers copies for moving actors to +sample on the main thread. Epoch/version checks reject obsolete results; dirty +section notifications from skipped intermediate fields are retained so a later +result cannot leave an old visible mesh with stale lighting. + +Material definitions also invalidate geometry independently of light values. +The worker compares transmitted material signatures, finds loaded sections using +changed definitions, and refreshes those sections and their AO/culling neighbors. +This replaces a retained placeholder when its real opaque material arrives even +if the light field is unchanged. Repeated identical definitions do not trigger +extra remeshing; pending material changes are combined across coalesced updates. + +The main thread receives transferable opaque/translucent vertex arrays. It +uploads them in steps of at most 64 KiB with a 2 ms scheduling budget per frame, +retaining the old visible section until both replacements are complete. The +section object keeps its identity when its GPU handles are replaced. There is +one mesh request in flight and at most two completed results waiting for upload. +GPU allocation and individual driver calls cannot be preempted; the scheduling +budget does not guarantee that every frame finishes in 2 ms. + +The browser's world map is also indexed by section, allowing validated chunk +transitions to update entering/departing blocks without reparsing the entire +retained volume. If the terrain worker is unavailable or fails at runtime, the +renderer keeps existing visible meshes and falls back to main-thread terrain +meshing plus the former `BlockLightController`. That controller can use its own +light worker, or calculate light on the main thread when workers are unavailable. +Fallback mode can therefore pause rendering during heavy calculations. + +Canonical levels remain scalar. Warm torch light, cool sea-lantern light and +other source tints are a Shacraft visual treatment of those levels. They are not +a claim that vanilla Java lighting stores RGB light. The shader converts the +field to linear irradiance and combines it with the existing sun shadows and +ambient occlusion. At block/sky level 0 only a small visibility floor remains; +the daytime sky is not reflected or fogged brightly through a sealed room. + +F3 shows block/sky levels at the camera, source count and build status, plus +worker/fallback mode, pending geometry, packet-preparation time, worker mesh-build +time, geometry-upload time and recent frame-time p95/maximum. Canvas attributes +`data-terrain-mode`, `data-terrain-prepare-ms`, `data-mesh-build-ms`, and +`data-mesh-upload-ms` distinguish background work from main-thread upload work. +The enclosed room in `/tests/renderer-smoke.html` supports source on/off/color changes +and removal/restoration of a partition, with explicit canonical readings. + +The game opens at night by default. The lighting button in the game menu switches +between day and night and remembers the choice in this browser. Night uses a +dark sky, stars, moonlight and matching fog/water reflections. This changes sky +illumination in the shader only: propagated block/sky levels, lamp strength and +terrain meshes remain unchanged. The setting is local; there is no synchronized +server day/night cycle yet. The renderer fixture keeps its daytime default. + +## Boundaries + +Lighting is computed for the client's loaded view, with an exposed sky boundary +above that volume and closed unknown side/bottom boundaries. It does not yet +receive a full-world authoritative sky heightmap, so a roof above the loaded +vertical range can require more world context. Rebuilding a field after an edit +has a short worker/update delay. Colored tints and display brightness are visual +choices; global illumination and ray-traced point-light shadows are not used. + +The fields are currently renderer state. This change does not add light-dependent +mob spawning, crop growth, redstone updates, or other absent gameplay systems. + +## Procedural world columns + +In the v2 world stream, the server supplies full-height opaque column maxima. These seed the top of the local skylight volume and preserve dark caves when the roof is outside the vertical view. Roof edits update the column; unloading a horizontal column releases its data. Sky rendering follows the camera sky exposure so the unloaded underground horizon stays dark. The active light field remains bounded to the streamed window; this is not global propagation over the entire world. See [world streaming](WORLD_STREAMING.md). diff --git a/docs/PACKAGES.md b/docs/PACKAGES.md index b4030a9..9b0a21f 100644 --- a/docs/PACKAGES.md +++ b/docs/PACKAGES.md @@ -40,4 +40,37 @@ This is a limited, working extension API, with no claim of arbitrary Forge/Fabri The base package provides a pixel texture; the trampoline provides its own texture, a GLSL color function, style settings, and a short synthesized sound. The custom WebGL2 renderer applies them. The core and server contain no graphics engine. Packages do not load arbitrary privileged JavaScript. +### Local block texture packs + +A `client-style` resource may declare a `texture_pack` with a display `name`, a `pixel_size` from 1 to 128, and `textures: [{name, path}]`. Each image path must name a resource from the same package that has already passed size and SHA-256 verification, and every image must be square with the declared pixel size. The client decodes the PNGs into a WebGL2 texture array and uses nearest-neighbor sampling. The local study uses actual 32×32 images. Known block faces select images by Minecraft texture name; missing faces keep the core's procedural material. Grass-top and oak-leaf masks receive a green tint, and transparent pixels are cut out. This is a partial block-texture layer, not support for arbitrary resource-pack models, animations, entities, or shaders. + +Prepare the local 24-texture study using the standard-library helper: + +```sh +python3 scripts/prepare_texture_pack.py \ + --source artifacts/pixel-pack-32/pack \ + --output artifacts/pixel-pack-32/shacraft-packages +target/release/shacraft-server \ + --data artifacts/mvp-demo \ + --packages artifacts/pixel-pack-32/shacraft-packages \ + --listen 127.0.0.1:4000 +``` + +The helper copies the selected images verbatim and bundles the required base and trampoline packages. All 24 default images must exist and match the declared dimensions. The default is 32×32; `--pixel-size 64` packages real 64×64 inputs (16, 32, 64 and 128 are supported). It validates dimensions without resampling, writes the matching `pixel_size`, and updates resource sizes and hashes. Use `--textures stone dirt ...` to select a different subset, and `--name`, `--id`, `--version`, and `--license` to describe another pack. `--overwrite` rebuilds only a directory marked as a previous output of this helper. It never downloads source art. Preparing a pack does not grant distribution rights; the reference-derived study and its bundle remain under ignored `artifacts/` and are not included in the repository. Restart a running server with the generated `--packages` directory and reload the game to activate it. F3 shows the active pack name and texture count. + When modifying a package, recalculate the size and SHA-256 of each changed resource, increase the version, and update exact dependencies. `scripts/catalog_assets.py` reproducibly generates the bundled original resources and manifests. The format is designed for a future launcher: it can consume the same manifest and cache by `(id,version,sha256)`; integration with a specific launcher is outside this repository's scope. + +### Local full-catalog atlas + +For local compatibility testing, `scripts/prepare_vanilla_texture_pack.py` accepts an existing Java client JAR, its matching generated block-state report, and a new output directory. It does not download assets. Pillow is required. + +```sh +python3 scripts/prepare_vanilla_texture_pack.py \ + --jar artifacts/pixel-pack-32/source-cache/minecraft-26.2-client.jar \ + --states artifacts/catalog-cache/generated/reports/blocks.json \ + --output artifacts/vanilla-local/packages +``` + +The resulting package declares `atlas: {path, columns, rows}` alongside the texture names. All tiles have `pixel_size` dimensions; integer texel sampling prevents bleeding and avoids the GPU's array-layer limit. The atlas and style are verified package resources. Optional `block_faces: {sets, states, defaults}` maps canonical states to six-face sets in east/west/up/down/south/north order. Each face supplies a texture name, optional tint/cutout flag, and optional eight-number UV transform (two affine rows over local x/y/z/1). Validated mappings are transferred to terrain and edit workers with the texture map. + +The importer resolves model inheritance, variants, rotations, and face materials onto the engine's existing geometry. It selects a representative face for multipart geometry and uses particle materials for entity-rendered blocks. It does not import full models, block-entity rendering, biome tint maps, or animation playback. Animated sprites use the first declared frame; native 16-pixel sprites are doubled without changing their colors in 32-pixel atlas cells. These are local testing assets with Mojang/Microsoft ownership, not open-source repository assets or a redistributable default pack. Keep the output under ignored `artifacts/`. Select its directory with the server's `--packages` option; selecting the previous package directory restores the previous textures. diff --git a/docs/PHYSICS.md b/docs/PHYSICS.md new file mode 100644 index 0000000..5aaca66 --- /dev/null +++ b/docs/PHYSICS.md @@ -0,0 +1,187 @@ +# Player physics + +Shacraft uses one Rust player-movement implementation on the authoritative server +and in the browser through WebAssembly. It targets the movement of Minecraft +Java 26.2, with measured reference cases from the original executable. The +measurements establish specific numerical agreements; they do not establish +complete Minecraft compatibility. + +## Playing + +- **WASD / arrow keys:** walk; **Ctrl + forward:** sprint. +- **Space:** jump, swim upward, or ascend while flying. +- **Shift:** crouch and avoid walking off edges; descend in water or flight. +- **Double-tap Space / F:** toggle flight when the server permits it. Creative + worlds permit flight; ordinary players in other world modes cannot enable it. +- **F3:** inspect the active physics mode, pose, unacknowledged input count, + and the latest position correction. + +Walking accelerates and retains momentum. Ground friction, air control, the +sprint jump impulse, held-jump cooldown, gravity and drag all operate on fixed +50 ms ticks. Crouching changes the collision box and eye height. A player who +cannot stand or crouch fits into the swimming-sized crawling pose when possible. + +Collision handling uses the catalog's block-state boxes, resolves vertical +movement before horizontal movement, and chooses step heights from obstacle +surfaces. Slabs, stairs, ceilings, corners and sneak-edge support participate in +the same solver. Scaffolding and powder snow have additional player-dependent +collision rules. + +The solver also handles ice variants, slime and bed bounces, honey slowing and +wall sliding, soul sand, climbable blocks, cobwebs, berry bushes, powder snow, +water, lava, waterlogged cells, bubble columns, swimming and creative flight. +Water/lava behavior includes acceleration, drag, buoyancy inputs, fluid levels +and currents derived from the provided nearby block states. + +`PhysicsSettings` exposes movement and flight speed, step height, launch-pad +jump overrides, leather boots and coefficients for speed, slowness, jump boost, +levitation, slow falling, Dolphin's Grace and Depth Strider. These are solver +inputs for server integrations; their presence does not add an inventory, +equipment or potion gameplay system. `apply_impulse` accepts an external +velocity change for future combat, explosions or scripted launch effects. + +## Shared simulation and networking + +The implementation is in +[`crates/shacraft-physics`](../crates/shacraft-physics/src/lib.rs). +Positions use blocks and velocities use blocks per tick. Angles are radians; +Shacraft yaw zero faces negative Z. Reference tests convert Minecraft's positive +Z convention explicitly. + +The server supplies authoritative nearby block states, shape boxes and settings. +The browser runs the same compiled solver immediately for local input. Each +server motion update includes a sequence acknowledgement, tick and motion epoch. +The client restores the acknowledged state and replays pending inputs. Teleports +and world changes reset prediction; render smoothing affects the displayed +position without feeding a smoothed position back into physics. + +[`client/player-physics.js`](../client/player-physics.js) samples the swept +collision neighborhood, keeps a bounded input history and interpolates display +frames between fixed simulation ticks. It suspends prediction when that +neighborhood extends into unknown chunks instead of treating missing data as +air. A failed or incompatible WebAssembly load falls back to server movement. +Server support is negotiated with `movement_prediction_v1` so older clients can +continue using authoritative updates. + +## Reference evidence + +[`scripts/physics_reference.java`](../scripts/physics_reference.java) runs +against the pinned official 26.2 server executable already used for catalog +extraction. It does not start a Minecraft server. Registry initialization is +real; player and world constructors are bypassed for an isolated measurement +harness. Only factual measurements and the independently authored harness are +stored in the repository. + +The committed +[`java26.2.json`](../crates/shacraft-physics/tests/fixtures/java26.2.json) +contains: + +- Friction, speed, jump and bounce factors for 16 surfaces; default player + attributes; five pose dimensions; water/lava heights for all 16 level values. +- Thirteen trajectories from original `Player.travel`, `jumpFromGround` and + `Entity.collideWithShapes` calls: walking, sprinting, jumping, ice movement, + water, lava and creative flight. +- Eight original `Entity.collide` measurements, including low-ceiling steps, + thin steps, descending into a step and choosing the lowest useful step. +- Separate original collision restitution, honey slide, slime step, bubble + column and current-application measurements. + +The trajectory harness supplies inputs, small-velocity threshold preparation, +the measured sprint attribute modifier, constant medium/depth and flat-plane +position/collision bookkeeping. It deliberately does not claim to execute the +entire original game tick. Callback samples measure the callbacks separately, +not their complete automatic dispatch in a running world. The water sprint +kernel keeps the swimming pose disabled to isolate water travel. + +Some details differ from older Minecraft physics descriptions: the sprint +attribute modifier is the float-derived `0.30000001192092896`, the player's +horizontal small-velocity threshold applies to the vector's squared length, +bed restitution is `0.75`, and bounce velocity includes the fraction of motion +completed before collision. The measured standing jump reaches +`1.2522033402537238` blocks above its starting position. + +Native trajectory tests compare position and velocity on every tested tick with +an absolute tolerance of `2e-6`. They exercise twelve of the thirteen kernels: +the artificial constant shallow-lava depth is excluded because an integrated +world changes immersion as the player falls. Water sprint comparison stops when +input is released, because the integrated controller ends sprinting while the +isolated kernel keeps its sprint flag set. Separate step cases use `1e-7`, and +restitution, honey and bubble callback tests use `1e-12`. + +Browser tests execute the shipped WebAssembly through the actual JavaScript ABI, +compare the eight air/ground/flight reference trajectories with `2e-6` tolerance, +and exercise replay under delayed acknowledgements. Additional tests cover +movement, collision, fluids, body poses, prediction resets, missing chunks and +input ordering. These tolerances describe the tested cases, not an error bound +for every possible world, angle or interaction. + +The HTTP/WebSocket integration check starts a real release server on an isolated +port with a temporary database and loads the WebAssembly it serves. It compares +consecutive authoritative states against the same consumed command in the +browser solver with `1e-10` tolerance. It also checks burst acknowledgements, +duplicate commands, crouching, jumping, flight permissions, reset epochs, +continuous movement across chunk boundaries, and a client without prediction +support. Only explicit world changes may produce full snapshots during that +check. The report records both binary hashes and the largest observed error. + +## Building and verification + +After changing the Rust solver, rebuild the browser artifact before opening the +game or running browser physics tests: + +```sh +rustup target add wasm32-unknown-unknown +bash scripts/build_physics.sh +cargo test -p shacraft-physics +cd client +npm test +``` + +The complete workspace checks remain `cargo test --workspace`, +`cargo fmt --all -- --check` and +`cargo clippy --workspace --all-targets -- -D warnings` from the repository root. + +Run the isolated real-network check from the repository root after rebuilding +both the native server and browser module: + +```sh +cargo build -p shacraft-server --release +bash scripts/build_physics.sh +node scripts/check_player_physics.mjs \ + --port 4013 \ + --binary target/release/shacraft-server \ + --output artifacts/physics/network-report.json +``` + +The harness refuses a port already serving HTTP and does not use the running +demo server or its database. + +To reproduce measurements with an existing Java 25 JDK and the catalog cache: + +```sh +python3 scripts/measure_physics.py \ + --java /path/to/java25/bin/java \ + --output crates/shacraft-physics/tests/fixtures/java26.2.json +``` + +If the cache is absent, prepare it using the catalog generation instructions +before running the probe. The measurement runner verifies the pinned official +bundle hash and verifies that the extracted executable matches that bundle. +The fixture records the source URL, source and executable hashes, Java version, +probe hash and reproduction command. Runtime binaries, diagnostic bytecode +output and logs remain in ignored `artifacts/`. + +## Remaining scope + +This change implements player locomotion, not Minecraft's complete simulation. +It does not add fluid spreading or scheduled fluid/block updates, pistons and +moving block machinery, boats/minecarts, entity pushing, an elytra model, or the +full combat/damage/knockback system. The external impulse API is a building block +for those systems rather than their implementation. + +Collision accuracy also depends on the catalog's measured boxes and on the +states supplied by the server. Additional entity-dependent shapes, moving +obstacles, complete fluid flow rules, every status-effect interaction and +arbitrary input-angle trajectories need further reference cases. The browser +and server share the same numerical implementation, but prediction can still +be corrected when world edits or authoritative settings arrive after an input. diff --git a/docs/PHYSICS_PLAN.md b/docs/PHYSICS_PLAN.md new file mode 100644 index 0000000..cc78dac --- /dev/null +++ b/docs/PHYSICS_PLAN.md @@ -0,0 +1,22 @@ +# Java 26.2 physics implementation + +The target is measured Java 26.2 player movement, using one original fixed-tick +Rust implementation on the server and in the browser through WebAssembly. +Existing texture, chunk-streaming, and remote-rotation improvements must remain. + +1. Measure movement attributes, block friction and speed/jump factors, poses, + and available reference trajectories from the pinned official executable. +2. Build the shared movement solver: velocity, acceleration, friction, gravity, + jumping, sprinting, sneak-edge protection, swept collisions, step-up, poses, + climbing, fluids, special surfaces, and permitted creative flight. +3. Integrate server-authoritative commands, processed acknowledgments, and + bounded client prediction/replay. Preserve package jump hooks and arena rules. +4. Verify original reference facts, trajectory behavior, native/WASM parity, + packet ordering, latency recovery, and the running browser with the local pack. +5. Record measured compatibility and explicit remaining mechanics. Movement + parity must not be confused with complete vanilla AI, redstone, or world-fluid + simulation. Additional interactions must be described by their actual tests. + +Progress and final evidence belong in `docs/PHYSICS.md` and ignored +`artifacts/physics/`. Do not describe simulated reference formulas as measurements +from the official executable. diff --git a/docs/SERVER.md b/docs/SERVER.md index 1478808..9c7cb83 100644 --- a/docs/SERVER.md +++ b/docs/SERVER.md @@ -17,9 +17,9 @@ The first launch creates a lobby, the `gallery` world, an immutable Spleef base, ## State ownership -One dedicated thread owns WorldStore, physics, and game state. HTTP and WebSocket handlers enqueue bounded commands. Movement runs at 20 ticks per second: speed is 5 blocks/s, gravity is 20 blocks/s², and the normal jump impulse is 7 blocks/s. The player's AABB is 0.6×1.8 blocks; the position specifies the center of their feet. +Y points up, yaw increases to the right, and pitch increases upward; the viewing direction is `[sin(yaw)*cos(pitch),sin(pitch),-cos(yaw)*cos(pitch)]`. +One dedicated thread owns WorldStore, physics, and game state. HTTP and WebSocket handlers enqueue bounded commands. The shared Rust/WASM movement solver runs at 20 ticks per second with measured Java 26.2 acceleration, friction, gravity, jump, fluid and collision behavior. Position specifies the center of the player's feet. Standing, crouching and swimming/crawling use different body and eye heights. +Y points up, yaw increases to the right, and pitch increases upward; the viewing direction is `[sin(yaw)*cos(pitch),sin(pitch),-cos(yaw)*cos(pitch)]`. See [player physics](PHYSICS.md) for reference evidence and limits. -Gameplay positions and spawn points are limited to ±32,700 on each axis because this client's physics uses `f32`. Storage and the converter retain their wider ±30,000,000 contract; this does not guarantee gameplay physics at distant coordinates. A player who leaves the gameplay range returns to spawn, or is eliminated during an active match. +Player positions, spawn points, physics and action rays use double precision. Procedural worlds support horizontal gameplay through ±29,999,872 and build layers Y=−64…319; section-local rendering preserves distant geometry. Nonprocedural arena configuration and entity administration retain their ±32,700 bounds. Storage and conversion retain their ±30,000,000 contract. See [procedural worlds and diagnostics](WORLD_STREAMING.md) for the bounded CPU worker pool, durable natural baselines and streaming limits. Input expresses movement intent rather than position. The server checks the 6-block reach, the nearest shape intersection, the placement cell, intersections with players, and arena rules. Stale input is cleared after one second. Gameplay physics reads a bounded region of neighboring blocks for each tick; independent worlds without players need no array of loaded sections. @@ -35,15 +35,27 @@ The token is not secret from the local machine's administrator. The manifest has ## WebSocket, snapshots, and edits +The current client prefers **`chunk_stream_v2`** with **`view_buffer_v1`**, documented in [section protocol v2](WORLD_STREAMING.md#section-protocol-v2). It receives an incremental view (405 sections by default, configurable from 245 to 1,805) and palette/RLE batches with generation IDs. The loaded radius includes one extra chunk ring; horizontal view anchors move only after a two-chunk displacement. Older v2 clients without the buffer feature retain 245 sections by default, configurable from 125 to 1,445. Procedural worlds require v2. The descriptions below of full snapshots and `chunks` apply to the retained v1/legacy paths. + Send the first message to `/ws` within 10 seconds: ```json -{"type":"join","protocol":1,"manifest_hash":"from /api/manifest","name":"Player","world":"lobby"} +{"type":"join","protocol":1,"manifest_hash":"from /api/manifest","name":"Player","world":"lobby","features":["chunk_stream_v1","movement_prediction_v1"]} ``` -`welcome` contains `id`, `world`, `revision`, `blocks:[{pos,block}]`, definitions of the `materials` in use, `players`, `entities`, `spawn`, `view_center`, and `manifest_hash`. A snapshot covers `[centerX-32, centerY-8, centerZ-32]…[centerX+31, centerY+31, centerZ+31]`, with inclusive upper bounds. When the view center moves, the server sends a new `snapshot`; the client replaces its geometry completely. Snapshots do not include the full string registry. `materials` is limited to 256 entries and 128 KiB; the client requests the remaining definitions sequentially through `/api/catalog?ids=1,2,...&limit=128`. This allows players to join worlds with large palettes without overflowing the outbound queue. +`welcome` contains `id`, `world`, `revision`, `blocks:[{pos,block}]`, definitions of the `materials` in use, `players`, `entities`, `spawn`, `view_center`, and `manifest_hash`. The view center uses world coordinates rounded down to multiples of 16, including negative coordinates. A client requesting `chunk_stream_v1` receives that feature in `features`, plus inclusive `view_min` and `view_max` bounds. Its full snapshot covers `[centerX-32, centerY-16, centerZ-32]…[centerX+31, centerY+31, centerZ+31]`: 4×3×4 complete 16³ sections. -The client sends `input` with `seq,yaw,pitch,forward,strafe,jump`; `break` with `pos`; `place` with `pos,block` or `state`; and `switch_world`, `resync`, `respawn`, `start_match`, `chat`, and `ping`. A `state` response contains authoritative positions, `tick`, the acknowledged input `ack`, and match state. Blocks arrive in `blocks` messages with a new revision. If a revision is missing, the client requests a snapshot. Subscription and snapshot creation are serialized with edits on the same thread, so an edit made between those steps cannot be lost. +As the negotiated client's center moves, the server sends `chunks` updates at most once every 250 ms. Each contains `world`, the current `revision`, `from_center`, `view_center`, `view_min`, `view_max`, `unload:[[sectionX,sectionY,sectionZ]]`, `sections:[{section:[sectionX,sectionY,sectionZ],blocks:[{pos,block}]}]`, and `materials`. Section addresses are integer section coordinates; block positions and view centers are world coordinates. Only newly visible sections are read and sent, including empty ones, while retained sections keep their existing client geometry. Unloaded sections are removed. A jump with no view overlap sends every entering section through the same message. Chunk messages do not change the spawn, players, or world revision: they contain a view of the current revision. Initial joins, world switches, and explicit resyncs still send a complete snapshot. + +Clients that omit `chunk_stream_v1` retain protocol 1's original bounds, `[centerX-32, centerY-8, centerZ-32]…[centerX+31, centerY+31, centerZ+31]`, and receive replacement `snapshot` messages on movement at most once every 2 seconds. Unknown feature names are ignored. + +Snapshots do not include the full string registry. `materials` is limited to 256 entries and 128 KiB; chunk updates include only definitions used by entering blocks. The client requests any remaining definitions sequentially through `/api/catalog?ids=1,2,...&limit=128`. This allows players to join worlds with large palettes without overflowing the outbound queue. + +The client sends `input` with `seq,yaw,pitch,forward,strafe,jump,sprint,sneak,fly_toggle`; `break` with `pos`; `place` with `pos,block` or `state`; and `switch_world`, `resync`, `respawn`, `start_match`, `chat`, and `ping`. The three added movement flags default to false for older clients. A `state` response contains authoritative positions, `tick`, the processed input `ack`, and match state. Public players also contain velocity in blocks per tick, pose, height, eye height, sprinting and flying. Blocks arrive in `blocks` messages with a new revision. If a revision is missing, the client requests a snapshot. Subscription and snapshot creation are serialized with edits on the same thread, so an edit made between those steps cannot be lost. + +Clients negotiating `movement_prediction_v1` send one movement command every 50 ms. At most 32 commands are queued, and one is consumed per server tick; packet bursts never create additional simulation ticks. Duplicate sequence numbers are ignored. When the queue is empty the last controls remain held, with flight toggles consumed once. Stale controls clear after one second. `welcome`, `snapshot` and `state` include `motion:{body,ack,tick,epoch,settings}`. The body is the complete shared solver state, including velocity, pose, contact flags and jump cooldown. Settings are chosen by the server, including creative flight permission and arena countdown freeze. The client restores this state and replays unacknowledged commands through the shipped `/physics.wasm` module. + +`input_reset` clears queued and held controls, acknowledges discarded commands and advances the motion epoch. Respawn and world/arena teleports also advance the epoch so prediction discards obsolete input. `look` with `yaw,pitch` updates the action ray without consuming a movement sequence; the browser uses it immediately before a block action. Final client positions, velocities and flight permission are never accepted as authority. Clients without the movement feature keep the earlier latest-input behavior and authoritative state updates. Control edits retain the core contract: an expected revision, a unique `operation_id`, a durable acknowledgment, replay of the same request without a second write, and rejection on conflict. A build plan covers at most 32,768 cells and is retained for 5 minutes, with at most 16 plans stored; preview does not change the world. Plans are ephemeral and disappear after a restart; accepted edits remain on disk. `camera.capture` returns a PNG of the server's isometric projection and the exact revision; it is not a frame from the player's WebGL camera. @@ -67,7 +79,7 @@ The core idempotency journal covers block edits, undo/reset, and build commits. ## Limits and observability - 32 WebSocket sessions, including those waiting to join; 16 concurrently served HTTP requests; a 64-command queue. -- WebSocket input messages up to 64 KiB, with at most 80 messages/s per connection; block actions no more often than every 110 ms, chat every 700 ms, explicit resync every 500 ms, world switches every second, and automatic snapshots on section changes every 2 seconds. +- WebSocket input messages up to 64 KiB, with at most 80 messages/s per connection; block actions no more often than every 110 ms, chat every 700 ms, explicit resync every 500 ms, and world switches every second. Negotiated chunk updates run at most every 250 ms on section changes; legacy automatic snapshots retain their 2-second interval. Movement streaming uses a separate timer and does not delay explicit resyncs or world switches. - Control API JSON up to 2 MiB; standard edits up to 32,768 cells; reads up to 262,144 cells and 6 MiB of response data. Exceeding the byte limit requires a smaller region. - Each client's outbound queue holds up to 16 messages and 8 MiB. A slow connection is closed if its queue overflows or sending times out. The aggregate queue bound depends on the number of clients; these bytes are separate from the section cache. - Server metadata up to 8 MiB, at most 4096 entities, and up to 16 KiB of properties per entity. Gameplay snapshots contain compact representations without arbitrary property JSON; full properties are available through `entity.list` with offset and limit (default 64, maximum 128). diff --git a/docs/STATUS.md b/docs/STATUS.md index 8d3ef00..ccd2f32 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,6 +1,6 @@ # Project status -Updated 2026-09-14. The agreed local MVP profile is implemented and verified. The original plan was committed before implementation as `ddfcef2`; claims from the previous cloud environment were not used as evidence. The verified implementation is commit `b6ba064`, published at [emil28092005/shacraft-core](https://github.com/emil28092005/shacraft-core). Its GitHub Actions run passed. Subsequent documentation changes do not change the runtime. +Updated 2026-09-17. The agreed local MVP profile is implemented and verified. The original plan was committed before implementation as `ddfcef2`; claims from the previous cloud environment were not used as evidence. The earlier published baseline is commit `b6ba064` at [emil28092005/shacraft-core](https://github.com/emil28092005/shacraft-core), whose GitHub Actions run passed. The current implementation adds shared Rust/WASM movement, block lighting, worker meshing, procedural worlds, movement diagnostics, atlas texture packs, and full-height streaming at up to 64 chunks of render distance. The README includes an in-game screenshot of an imported minigames lobby. ## Implemented @@ -13,7 +13,11 @@ Updated 2026-09-14. The agreed local MVP profile is implemented and verified. Th - Spleef: two independent arenas sharing a map, countdown, elimination, winner/draw, reset, spectators, persistent rules, and recovery after interruption. A lobby and a gallery of 1,197 samples. - Anvil and Sponge v3 import/export: typed NBT, original preservation, atomic output publication, loss/conversion reports, and transfer of block and entity edits made in Shacraft. -## Verified +## Current checks + +On 2026-09-17, `bash scripts/verify.sh` passed formatting, a physics WASM rebuild, workspace Clippy with warnings denied, 130 Rust tests, 190 JavaScript tests, storage crash recovery, and real HTTP/WebSocket scenarios for gameplay, chunk transitions, and movement prediction. Native and WASM movement agreed within the test tolerance. The browser also accepted the 64-chunk, full-height view, built all 27 nearest sections, and continued loading distant terrain. These checks do not establish a performance guarantee at the maximum distance. + +## Verified baseline 84 Rust tests, 6 JavaScript tests, formatting, and Clippy without warnings; 14 groups of real HTTP/WebSocket scenarios, a separate MCP SDK session, SIGKILL, and recovery. Exports were read by the official Java 26.2 codecs and an independent NBT reader. The client was inspected in a real browser: rendering, state search, gallery navigation, material loading, reconnection, and resource caching were confirmed. @@ -24,7 +28,7 @@ Final release benchmark: 100 idle map instances used 50.50 MiB RSS; 10 moving cl - This is an independent minigame platform with a Minecraft catalog, not a complete vanilla simulation: no full AI, redstone, inventories, or fluid simulation. Context-dependent shapes are marked; models do not reproduce the vanilla assets. - `exact` conservatively refuses export after edits; `best-effort` reflects changes and produces a report. Anvil and `.schem` conversion does not translate all biome/block-entity semantics; source data is archived. Version, size, and context limits are documented in [interop.md](interop.md). - Block history is stored on disk without automatic deletion. Undo accepts only the current target edit. Preview plans are ephemeral and expire after five minutes. Entity/rule metadata has its own revision; its API does not claim the core's idempotency journal. -- The playable range with f32 physics is ±32700; storage and conversion support the core's ±30 million coordinates. Several bounded structures control memory use; there is no single hard RSS cap. +- Procedural gameplay uses double precision through ±29,999,872 with Y=−64…319 building layers. The menu selects a visible radius of 2–64 chunks, default 3. Including a preloaded ring, the default data window is 144×384×144; the maximum is 2,096×384×2,096. The full world height remains loaded during vertical flight. Horizontal unload hysteresis retains overlap across single chunk crossings. Nearby terrain uses local lighting in an independent worker; distant data and meshes load progressively. Uniform sections stay compact, but large views still incur substantial loading time and memory costs. Distant-terrain LOD is not implemented, and there is no single hard RSS cap. See [current world implementation and local measurements](WORLD_STREAMING.md). - Linux x86_64 and local workloads have been tested. A long production soak, power-loss testing, all operating systems, and an exported-world playtest in a running Minecraft game have not been claimed as passed. - Launcher integration, accounts, production deployment, and existing servers are future integration work. The source repository is public; the game server has not been deployed to a remote machine. diff --git a/docs/WORLD_STREAMING.md b/docs/WORLD_STREAMING.md new file mode 100644 index 0000000..fa09e51 --- /dev/null +++ b/docs/WORLD_STREAMING.md @@ -0,0 +1,278 @@ +# Procedural worlds and movement diagnostics + +The server creates `overworld` on startup if that name is unused. Open +`http://localhost:4000/?world=overworld`, or select it in the world menu. +Existing worlds, packages, edits and arenas remain available. An existing world +named `overworld` is never automatically converted. + +## World dimensions and generation + +- Playable horizontal coordinates: **−29,999,872 through +29,999,872**. +- Building layers: **Y = −64 through 319**, inclusive: **384 layers**. +- Default seed: `20260914`; generator version: `1`. +- Original deterministic terrain: continents, hills, mountains, rivers, + oceans, forests, plains, desert areas, snow, trees, caves, tunnels, aquifers, + deep stone, ores, low lava pockets and a bedrock bottom. +- A spawn clearing and a narrow ravine near X=30 give access to the surface and + underground. Fluids are generated blocks; they do not yet simulate flow. + +The height range follows the modern Java Overworld convention described in +[Mojang's Caves & Cliffs Part II announcement](https://www.minecraft.net/fr-ca/article/caves---cliffs--part-ii-out-today-java). +Terrain generation is independently authored. Matching Minecraft seed output, +all vanilla biomes, structures and gameplay systems is outside this implementation. + +The version and seed are durable in `server.sqlite3`. Generation depends on +absolute integer coordinates, so request order and section boundaries do not +change trees, caves or terrain. Keep generator version 1 stable for saved worlds; +future algorithms need a new version and an explicit migration strategy. + +Player simulation, action rays and spawn coordinates use double precision. +Meshes store section-local float positions; draw matrices and dynamic actors use +an origin near the camera. Small geometry and movement steps remain representable +near the horizontal border. Arena/entity administration retains its earlier +configuration limits where documented. + +## CPU work, streaming and storage + +The server uses **two CPU generation threads** with **32 pending jobs** at most. +The simulation thread owns storage and gameplay. Requests are shared between +players and ordered by distance, with extra weight on vertical distance. Old +view requests are dropped; completed jobs outside current interests are discarded. +Control reads retain bounded, temporary interests so remote reads can complete +without a nearby player. Generation does not require a GPU. + +**Game menu → Render distance** selects a radius from 2 to 64 chunks +(32–1,024 blocks around the player), default 3. Each player chooses their own +radius; changes apply without reconnecting and persist locally. The current +client negotiates an extra loaded chunk ring beyond that visible radius. Its +default data window is **9×9×24 sections**, or **144×384×144 blocks / 1,944 sections**. +At radius 8 it is **19×19×24**, or **304×384×304 blocks / 8,664 sections**. +At radius 64 it is **131×131×24**, or **2,096×384×2,096 blocks / 411,864 sections**, +including the one-chunk preload ring. The queue covers this entire window. +It is sorted once when the view changes; each tick examines a bounded lookahead +of 256 pending sections plus collision neighborhoods. Up to 128 sections are +sent per 50 ms interval, including at most 32 nonuniform sections, with a +256 KiB estimated section-payload budget, backpressure and time budgets. + +Horizontal streaming has one chunk of hysteresis: crossing a single chunk +boundary does not move the loading anchor or unload its opposite edge. The +anchor moves after a two-chunk displacement. The extra ring preserves coverage +of the selected radius between anchor changes. Generation, delivery and meshing +prioritize nearby sections; overlapping cells and meshes remain in place. +Expansion retains overlap; explicit reduction unloads excess sections. Distance +fog completely blends the visible edge into the sky before the buffer is +unloaded. Horizontal culling and the projection far plane follow the radius. + +The current client negotiates `full_height_v1`: every loaded column spans +**Y=−64 through 319**, all 24 vertical sections. Climbing and flying above the +world ceiling retain ground and roof sections. Missing interior terrain still +blocks prediction; space outside the world height is known void. Clients that +do not negotiate this feature retain the legacy 80-block sliding window. +Distant-terrain LOD is not implemented; these bounds and local benchmarks do +not establish parity with Minecraft's renderer. + +Already delivered distant sections do not need to remain in the server cache; +only collision neighborhoods and unsent client sections trigger regeneration. +Requests from multiple players still deduplicate, including a new player +requesting terrain previously sent to someone else. Natural sections live in a bounded LRU: at most 8,192 decoded sections, or +128 MiB of voxel payload. This is separate from the core's encoded-section +cache, SQLite, metadata, meshes and total process RSS. Visiting more terrain does +not allocate a permanent world-sized array. Before editing a natural section, +the server materializes its immutable baseline in `generated_sections` in +`worlds.sqlite3`; the existing revision/idempotency journal then stores the edit. +An explicit air deletion survives cache eviction and restart. Undo/reset use +the saved baseline. World templates inherit the generator configuration and +pin existing edited sections. Natural materialization does not advance the +edit revision. Standalone core exports contain stored sections; exporting the +entire procedural world is not supported. Back up both SQLite databases. + +The browser stores nonuniform cells in `Uint32Array` sections: **30.38 MiB** for a dense +1,944-section default voxel map, or **135.38 MiB** at radius 8, excluding worker +copies, lighting and GPU geometry. Uniform received sections use four bytes +instead of 16 KiB, retain known-air readiness, and expand on edit. Empty sections +need no mesh job. Lighting has a separate allocation cap of 7,393,280 cells; +it does not scale with the maximum stream volume. With the local mesh worker, +the shared actor field is limited to 112×384×112 blocks around the view center. +Palette/RLE avoids JSON objects and position strings per block. + +A dedicated terrain-mesh worker builds local light, AO, culling and geometry +without waiting for whole-view lighting. A light tile covers 2×2 chunk columns +plus an 18-block horizontal halo, at most **68×384×68 / 1,775,616 cells**. The full +active vertical range preserves skylight under tall roofs. An eight-entry LRU +shares these fields between nearby and vertically stacked sections. Spatial +invalidation and per-section tickets reject obsolete work without discarding +nearby results on every distant section batch. Moving a distant view edge keeps +an interior tile's light and mesh valid if its sampling bounds are unchanged. + +A separate persistent worker computes a bounded local light field for actor and quick-edit +sampling, starting after 225 ms without a new sync. Its completion does not gate +terrain publication. Large views still need time to finish distant meshes. +Uploads are staged in 64 KiB steps targeting 2 ms per frame; old meshes remain +until their replacements are ready. Driver calls are not preemptible. + +Unknown sections are distinct from received air. Both authoritative simulation +and prediction wait for collision data instead of falling through missing +terrain. The server resets the input epoch on a terrain wait, holds the body, +and resumes when its neighborhood is available. Teleports also reset prediction. + +Skylight includes full-height column occlusion data. A cave remains dark when +its roof lies above the streamed vertical window. Editing a roof updates its +column data. The background uses the camera's sky exposure to avoid bright sky +appearing through unloaded underground terrain. Full lateral lighting outside +the active window is not simulated. + +## Section protocol v2 + +Join with `features:["chunk_stream_v2","movement_prediction_v1","view_buffer_v1","full_height_v1"]` and optional +`view_distance:2..64` (default 3). A server advertising `view_distance_v1` accepts +`{"type":"view_distance","chunks":64}` while connected. Noninteger or out-of-range +values are rejected before mutation; changes are limited to once per 500 ms. +The server responds with a normal `view` transition containing `view_distance` +and the new `total_sections`, preserving position, motion epoch and revision. +Negotiating `view_buffer_v1` adds the extra loaded ring and horizontal hysteresis; +`stream_radius` reports the loaded radius, while `view_distance` remains the +selected visible radius. Older v2 clients retain the unbuffered behavior: 245 +sections by default and 1,445 at radius 8. +`full_height_v1` fixes the vertical bounds to the world height and adds +`full_height:true` to view/welcome/snapshot messages. It also enables batches +of up to 128 sections; older clients receive at most 32. +Welcome/snapshot messages also expose `max_view_distance:64`. The initial +`welcome` or explicit `snapshot` supplies the world, revision, motion, generation, +`view_center`, inclusive `view_min`/`view_max`, `total_sections`, terrain settings +and world bounds. Its `blocks` array is empty; sections follow incrementally. +Generation numbers increase for each new view or resync. + +A `view` message updates bounds and lists departing section coordinates in +`unload`. Retained sections keep their current data. A `sections` message contains +at most 128 complete sections (32 for legacy clients), each as: + +```json +{"section":[0,4,0],"palette":[0,123],"runs":[256,1,3840,0]} +``` + +Runs are `(count, paletteIndex)` pairs totaling exactly 4096 cells. Cell order is +`x + 16*z + 256*y`. Section coordinates are integers; world coordinates are +section coordinates multiplied by 16. Even empty sections are sent explicitly. +Messages include `world`, `revision`, `generation`, material definitions and +`columns:[{column:[sectionX,sectionZ],heights:[256 values]}]`. + +Batches run at most once per 50 ms per client. The server pauses section sends +above 512 KiB of queued output; existing queue and timeout limits still apply. +Packing has a soft 10 ms work budget. Clients validate the complete batch before +mutation, ignore obsolete generations and resync on revision gaps. Ordinary +block edits advance revisions; view changes never do. + +Old clients retain v1/full-snapshot behavior in nonprocedural worlds. A client +without v2 is rejected from a procedural world with an instruction to refresh. + +## Diagnostics + +Open **F3 → Movement diagnostics**. Choose manual recording, automatic flight, +automatic running, or flight with turns, then start a 30-second recording. +Automatic scenarios use ordinary authoritative input, climb obstacles during +flight, and need no pointer lock. Recording starts after terrain/meshes settle. +Stop or Esc cancels automatic movement. Hiding the tab stops recording and marks +the result `interrupted: "tab-hidden"`. + +The panel stays open while playing or recording; clicking the world restores control, and F3 or the close button hides it. Its controls pause manual input while focused. The panel shows a rolling frame/CPU chart and a summary. **Download JSON** exports +bounded frame samples, network/stream events and server samples. It measures +frame p50/p95/p99/max, frames over 25/50 ms, main-thread physics/update and draw +submission time, long tasks, position corrections, terrain waits, distance, +view changes, batches and mesh resets. Draw CPU duration is not GPU duration. +The canvas DOM exposes the summary as `data-dynamics-result`, plus current +section counts, coordinates, readiness and streaming timings for browser checks. +`data-first-terrain-ms` measures first nonempty mesh publication after the world +reset. `data-near-meshes` / `data-near-loaded` count completed and received +sections in the camera's 3×3×3 neighborhood, including completed empty sections. +`data-terrain-meshing`, `data-local-light-cells` and `data-local-light-ms` expose +the independent geometry path and its local lighting work. + +Authenticated Control API methods for repeatable diagnosis: + +```json +{"method":"diagnostics.snapshot","params":{}} +{"method":"terrain.inspect","params":{"world":"overworld","position":[1000000,0,-1000000]}} +{"method":"player.teleport","params":{"id":"player-id","position":[1000000.125,180,-1000000.875],"flying":true}} +{"method":"world.create","params":{"world":"another-overworld","terrain":{"seed":42,"version":1}}} +``` + +`diagnostics.snapshot` reports generation queues/cache, simulation timings, +positions, velocity, input backlog, waits and per-player stream state, including +`view_distance` and `stream_radius`. Teleport +is an administrative API, not a client movement permission. `/api/metrics` +adds generation/stream counters and the most recent 600 tick durations. +`world.read`, `world.edit`, build commit and `camera.capture` may return +`terrain pending` for cold sections; retry the same read or idempotent operation +after a short interval. No blocking generation is performed for a cold read. + +## Local verification, 2026-09-14 + +A release server and the real browser ran against an isolated copy of the local +data, using the Pixel32 Study package. Automatic flight traversed **495.08 m in +30.003 s**, with **39 view changes and 78 section batches**. Across 4,317 frames, +frame p95 was **7.0 ms**, p99 **7.1 ms**, maximum **13.8 ms**; no frame exceeded +25 ms. The run reported no terrain-wait frames, position correction or full mesh +reset. Section application p95 was 5.6 ms, maximum 7.3 ms. At the last server +sample, tick work was 0.53 ms and RSS was 78.5 MiB. Three entering sections were +still in transit at recording end; all 245 completed after stopping. + +These measurements are one local workload, not a comparison with Minecraft or +a guarantee for other devices, multiplayer loads or long sessions. The local +summary is saved in ignored `artifacts/large-world-flight.json`. + +Automated checks cover generation determinism, negative/far coordinates, deep +content, skyline accuracy, durable mining/undo/restart, remote reads without +players, bounded batches, overlap retention, malformed/stale data, known air, +shared physics and section-local geometry precision. Browser checks also cover +an open ravine at Y=10, a closed cave at Y=−29, and coordinates near ±29,999,000. + +## Render distance and live edit verification, 2026-09-15 + +These measurements predate the additional loaded ring described above. + +In an isolated copy of the Overworld, the real browser expanded from radius 3 +to 8 and received all 1445 sections (23,674,880 raw voxel bytes). Shrinking to +radius 2 retained 125 sections (2,048,000 bytes), without a full snapshot, mesh +reset, revision change or player displacement. Reloading restored the selected +radius from local storage. The server regression also checks per-player +isolation, invalid values, overlap retention and the world-border margin. + +At radius 8, confirmed-to-visible-section publication took 121.9 ms for a break +and 120.6 ms for placement in two browser samples. Including server response, +they took 149.4 ms and 137.2 ms. Local packet preparation was 0.6–0.9 ms. The +regular whole-view light calculation in the same session took about 4.7 seconds; +the independent edit worker published geometry before it finished. These are +local observations at 1280×720 with shadows and about 1.27 million triangles, +not frame-time or network guarantees. Propagated light can still catch up later +on large views. + +F3 remained open on canvas clicks, block edits and recording start; explicit F3 +toggled it closed and open. The full verification script passed (126 Rust and +171 JavaScript tests, storage crash checks and all three network suites); an +additional staged edit-upload regression also passed afterwards. + +## Nearby mesh priority and buffered streaming verification, 2026-09-15 + +In the real browser at radius 8 with the buffered 1,805-section window, first +nonempty mesh publication took **354 ms and 388 ms** in two startup samples. +All **27 nearest sections** had completed while only **1,167 of 1,805** sections +had arrived and whole-view lighting was still building. Subsequent local-light +cache tiling improves reuse; those startup samples were taken before that tuning. +A final reload with the tiled cache and a warm server published its first mesh +in **189 ms**, completed all 1,805 sections and logged no browser warnings/errors. + +A 30-second automatic flight at 1280×720 with 2048² shadows traversed **497.12 m**. +Across 3,746 frames, frame p95 was **13.9 ms**, p99 **20.9 ms**, maximum **48.6 ms**. +There were no frames above 50 ms, terrain-wait frames or full mesh resets during +the recording. It recorded 39 view changes and 147 batches. Stream application +p95 was 9.4 ms. These are local workload observations, not cross-device or +Minecraft comparison results. + +Server regressions exercise repeated crossings of a single chunk boundary, +two-chunk anchor changes, coverage of the selected radius and departing rows +outside that radius. Client regressions compare local-light mesh bytes with the +whole-view result, including roofs, water, glass and negative coordinates; they +also check distant-update retention, bounded caches, stale jobs, unload/re-entry +tickets and unchanged interior tiles during view shifts. The verification script +passed 127 Rust tests, storage crash checks and all three network suites. The +final client suite passed 180 JavaScript tests. diff --git a/docs/WORLD_STREAMING_PLAN.md b/docs/WORLD_STREAMING_PLAN.md new file mode 100644 index 0000000..2adeec6 --- /dev/null +++ b/docs/WORLD_STREAMING_PLAN.md @@ -0,0 +1,28 @@ +# Large world and movement diagnostics + +## Objective + +Create a playable, deterministic Overworld with 384 block layers (-64 through 319), wide horizontal coordinates, caves and surface terrain. Keep server simulation responsive while terrain is generated and streamed. Preserve existing lobby, arenas, packages and user edits. + +## Implementation sequence + +1. Add durable procedural section baselines to the core store. Only sections touched by edits need materialization; natural terrain is reproducible from a versioned seed. Cover air deletion, undo/reset, restart and template behavior. +2. Add a deterministic terrain generator and a bounded server worker pool/cache. Prioritize player collision neighborhoods, then nearby visible sections; never simulate unknown terrain as empty air. Add generation, cache, queue and tick timing metrics. +3. Add a negotiated compact section-stream protocol with explicit loaded sections, cancellation of obsolete view requests, bounded batches and overlap retention. Keep legacy clients supported. Use dense typed section arrays on the browser side and transferable worker payloads. +4. Support precise distant positions and rendering relative to the camera's section origin. Seed skylight from authoritative column occlusion heights so deep caves stay dark even when roofs lie above the loaded vertical window. +5. Add reusable movement diagnostics: rolling timings, trace recording/export, automatic flight/running scenarios, streaming and prediction counters, accessible controls and machine-readable results. +6. Test deterministic seams, underground content, persistence, streaming order/unknown sections, distant coordinates and worker behavior. Run live browser routes against the real server and report observed results and remaining limits. +7. Create/open `overworld` on the local server; keep the existing worlds available. Update documentation and the project graph. + +## Working choices + +- Original terrain algorithm, inspired by voxel sandbox worlds; no claim of matching Minecraft's exact seed output or every biome/structure. +- Server remains CPU-only. Background work uses a small fixed worker pool and bounded queues/cache. +- 16x16x16 storage/transfer sections; independent vertical streaming instead of loading all underground layers. +- Explicit readiness for collision data, and staged GPU publication retaining old meshes. +- Seed and generator version are durable world configuration. User edits survive cache eviction and restart. +- Local benchmark routes use normal player inputs. They never clear or overwrite existing worlds. + +## Completion + +All seven steps are implemented. The main server runs the release build at `http://localhost:4000/`, with the separate `overworld` open in the browser; the existing lobby remains at revision 210. Full verification passed: 125 Rust tests, 158 JavaScript tests, Clippy, formatting, crash recovery and HTTP/WebSocket scenarios. A focused follow-up test also verifies that legacy clients cannot enter procedural worlds through a world switch. See [implementation, measured route and limits](WORLD_STREAMING.md). diff --git a/docs/images/minigames-lobby-night.png b/docs/images/minigames-lobby-night.png new file mode 100644 index 0000000000000000000000000000000000000000..37bfd8f44137e1ab6f9aefc47f58ac06c0547367 GIT binary patch literal 1503354 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

jF*2d-4B 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

Rqhf)Q1KD*0exu)$}f)D2) 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 vPCWHi4WCvw0zqyb?h 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⊀Ho3y;D_5xS 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

gNXjdev$x}Y_Id2i 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%0AV#_vhKJbeq*xp8>!^&7n`@sm`bsJIy+9Us_$ z_nCYLkty&!f?g>BS}=L=GsFArUGVmp0r zZtzn$kyNq5)?DzRe=7ur#Q(+8yUP^lbqXrWA$OxCnak_r+U{Fwmb+jTbYy~`Y>m|| zan$s#g}=-|%PU|FS}I6#G9}N2-mP&(Y7a(m>fZ9@l5DCTnfySOJSx)zO5_rOKmsdd zUn1oEYZL@kZCQ8}WEpD8Y4_QSfAQ=BYb_Yph}}pcJ)zo!BACW)F|DJyAZz3{k`<^9 zg&vmUsc8UmcXg2V22Q?DT10?nR}a}mR1dYUHDD5F&D)bUOxo7=i@jUbsFiBu&KeR! zTj5JLcVmFVkGFA%e|3ZN+=B_kFwC>IboVD$eWSK!$%=bqJ3xk>(~^p!?_boePCl+Z zY-^J7P>W^}%HdaR0jx0xAzag;jlCRAc9UUeiVX3*zf*p|ZzDGE{``ir0M}iewZbg{ zPjV9&104ZxEZD1t`?x2LtGxuyVNY3Hm{+)}E~;x?yf;MEKHs0RLQ?A07L zh)WWMM9+aV(_$%HcQ8F+&B2=P#Ni__JxUZ}JCaiQ&yIqQAq zM&VZby?xxsQ2^_wEohJ@rszySWVr|Bw)e-yK?55Oi-O0mo^6NSd+eJ>aFSkOv2>_ zC1oyp><#WrI@A~uGmuK{k!aIf(fG$&JjdIc(@=u-kW}F1A0ovK@yAFFi1+O9FtpsJ|+yRRxzTdm0KX(4Iq_{aRpZV9Gg25_1MtOJLeL6 z-RtnZvf`8bD%0X4Ct;KRcpN?I92jqV@?x9|%l<6#dfx&47|}NNp1(P4`aRut_S~mu z;8`*8z&*e2^@z0nM6{4#iSTUl(A1WTU)8pb2a@{=2bl}=q%ZQ$FwFMdF^xZ04|43) zaA%`y`TZ_yTNpYeDdo-R3tJ;D$uK~(8X4QbYHEmR$*|lL$BHjU=*EK67 ziBaVj0CZCn+Aq73psh4C@uQ+bI!AuM#6*8b3n`~naYsxWhoA@3W_g;ZuoK*{yL!y? zc08g52lSt~6zTqI$Q#8GCDKW|(HPb;@(xpoqcr{N#eNhu2)Tn1K4Gby6{IelK$0R? zLu%!K!4$hxu*nft8kHhc0fUX&8|5{uMkk%RWA7rKw~f@h$bubVq5r zXC(NguMX-`Eci*TZH>h3%sGF2oU6e3;*$K`FHY4P-LO~fi z?JVmmS-xo^f}A7v;9gTAa zO$~Xn3g4QkZyfo|bT#DHVHi1r!Q>)U{EtVBg-my=MjiX|$=v}?y>f={5VgPF-dcz^ zSs)mKZxZw zg4Ro{Q`#`Zj-}(quVYqYNcdC{*rPkx^4q?4;pIO$E34*gmf$<*3j_tXBc3MkU;O)@ zskYm}`r=9WW5Xq?^P?Ch_&DKp+gYB9`y%*|8irrYdqw-E%(Ro^?q7S#ruU?9zI_4u zmI_7(NrD&jKYJB*6+Ze)FD8a|U-p_DC{#AOpJi_S6@5(}Z37|fUQdMQe(LZFB?i5g z>}3RP&SJk`aLGv492*;XWZ)9?Wtr$$ZCN6C2wppH`b9HqYl{@Spgy226+&IOnfVw( z#SI-#pY^m1wD(e>8$cuCDPkRQAKglEMSf4$WZNA&qo5V#*2)E9?1A-PsqU)=QFGe8 zunHHh6B4Zo90eu0*x&qrEFbUc|IvpmGe~YGz!uV&n<0vBNUgln2Hx3r=oey!YWYZI@yD??x2{t6?S)3=FlGxnG7sx4xL&60=UrDgQ7WOz!P^U@Jm?Flk$A05)g5UHb<1m|;$uP>+ ze>?)HfX8E@eN@=pFI~H%qdp@rvUc_Cs<=MM{uf`DZ+`nn0DqrGUJz37x2>9A6jW zA?(DV6F3&2rK{nw(!h$smN_r0{xwwVTaXHtp-ClWrv4Gjs~mx{O3lnskHGiTG44yGkm6TZN#9jcN3* zB*4LOwZNvKJd9pkR9{G2>sEIWb*ouC{O&nAWTno#%jQ^B?&XfdZxI{$ z3rsYQ4HHRxl|#$0OW{;$9OI*VpY$*eg+onQc=}WQywV1-2wwRp;>wlj$FhO9{18zl z=Oz{dPpGTG7f>YfV$--1gel;`uyRaPUk!C!_yVx`X$&OxzY?|pQYrb8+@boXTYg&K z(j!w=PhD2`p;q}s#;{_%zhQq{JOqFE9UQQ$cY6R{ml$T`b4dh)A$^6heHW|AI!Krn z6hDsRybL$zL0$TVPet83K6@)kzNS|rL-^AG6WDY!mq6^?$$H2B_|4uZN|P@kS2wR+ zA09D6(dk>2N?PO8B>_I-7g3 zm(SMBcFlO5tPHvT;VJ=Y%Q3~-pv`$Zb>Eh!CLq$vLG(%yw>0J?;iJ>HtuDho4+**v zSaG8!dR4m0sWz}P_;DHtY6S)Z{5;b*9`(#OpU$Jqam^vqFf>TAW4(kPU7vTLYKR-6 zkicrsZ?TxhC2NAH%=-_0*MA=;B*j58W6%7j^R0J+W&|jyhirq6{4i z@eM*}hU=y-#EV!wC@$e&miJsaH;!r+r+_bQq((6+%$-)Gb#S_^`I1B6Kk~+Lz0Fgv zE=Iy}1SHJJD9@F1{S|%T3&5!G{0yl8O52c8%JwT_srW{DUlu((#Ioa{Bxq0qA~*Z3 zg3hUZh|?*)?VCa69gA#b@J$F`4azSHyoh8Gqf!GvP``g^}yQqte2qA-0*NU!&7@U>nCiY zh*id6lMfx6LHE-Hs1)R{y`RON3m&e6KR}g7ruI$2U47-lob1kMZV%;z4i`|YGv;Tc z=iSYHgH^0%O9n@c-hmL9%~|)r%zG?SF0eY?az1Zkkk{<0^vROE(JcxqEMGT4uWfFB zYY2%5={YlpdlPs{c9dbEZnSaC{x7%jIHWA(aFH4&XyR-w>lmg$VSWBzqcj5pj$c&@L3`1X; zY9Q&&EK&rzZkUGwZH|``V^0eQlltE%p|Yd6!pK7t=s{PvLh}W!lCJuRDVu~yDCPhf z3Q&IsTzhMoi24D7ubD8)G#y@EPyNZj`zPKTn(xzR`8Jh(!LsQTmNYUpR|3c>zo|Sz zwJ5K`&HBPUU2^6h{JXe&6~s4JxFoKhY^u32wp=pmn^7_!S=aUb1 z^-C~N)@bH?y?hTZQ$1|x{igCCPkHsE>Atd9gFbjKRP~qPSQw{#)81IJi(CR?wiZ7Z z?dj85Kex^Y(W{1j#Lk5Z9t4Gay4+mDWW{`7Cu4an>e>GfUZ(mYfdEar^m;wqBA-~f zMw0ou;-J;?kXZC>xW53VWBKVLBNM};*PWZt;$&Yzz*hb^pXMR(wFLFR5H*#6sW*Ke zav+oz^eTTS{HS8P?DG~Inzg+}?^#8B>cfPIeO=hO7YRzon>qIE$`ac$N@yC1i=|($Hv~LuP`eAg-9X#p0Y|JvEyuMou2RNkcYh)sZE-70-X`>S^>|(Z zcP`UY*AT+a9+`&$Gw$ufM`uROfSI55rU&Mu3Avv))ZrxJ>D{4hOi}uw5)z{mh&0m^jwT74XMMzTXyhq5Kr>FQS<01os3f+f1gBxY zQ(koxDZj?(L@|%Y?EYXL*Ec@);3nD0bXMjmP(})jxrNPWSHVb#iU?&QR!pZ>kS)b8 zZLZL!iJbc}2j5ORj|`-z8g=(u#~2Q$?DllDXN!Lp@*XwNv@aX&bUy3>w~XsK;fq%JZ+JY_CwyRVZxe*>aw>? z`4hRAI^nd_`&Bheu0?e!BS;}s&)yse`>nm*n!_&il=l*D!CrJ&Kfx6GG;OZTPL(AA zzn7^TFG!z?k$h<|P>dAzhsa(G4RFqt4UtD2+c_H*F5|Tqc ziCTs`f+C)yOW{_-(|@CG@Z~m7f{z9XHny=yr;aOk(v~+@8pyl5&2i>jILhvA#{^Q0 zqe1GAeN)rU&HsI%%8wvL1eez4KzDHF4c{h*KxvQ*|3!Zbaj#N5v>%he>G!V;UGS;j zO}9LRI@MxXXl1Lh0SErV}1QaTr9%9x@9EuO( zpH^=LKN+?@b`i@hye9o@+B>j`bnvD}FLeteN5XK%K>niO(Uvev5gFZw6_G&M)Uk5l z@I7XD@v_6T^IeksRu(rWX+vP z%-zm&t)Gw-W_kF}NDa1&r3gqvWYhfoJq7Z_O)EEIvPeQW${k!Tj$Aeqg285ePd@NJ zL&htg?ZiTkwF!~zL**g|5Kce`h>HR9Fe{(8EXkGu6qBSyE%n0YoG*=;a9 zWoFcQX_Q@bcFT?nfpq4tFk5}q6h!Gp9oyQ(V+X&k@Lbt*F3Z6#8+-+ViOv7r|AZ#1 zBmIPWzr_euE}@H@#&2%TPLgj|mDY8rIEeds`#0FJY&@ZCJf~Lj{&Eoz=Uqb_^LpqU zLoD%R4gyrO3AR{BytpsejxjM+Z)W`^SsAh<}l*SRK=tD-x z{5x8pUa$K=Lw6mp9<+l<7Of$V`7h9^w{dZStOu$AQV9Iv`F8jJXnM=AHoLZI6!!w9xI>ZR?hb__#ogT++}+*XiWPS)UV=j*KyWDT z!QFM|e%}54$-gAWvDTHWSu=CaG{(k`DCBQg8N}+=UHR2s9DwC9+rHTecVZ;gs3K!J zBP*^Z?45ARMwvd_;$mmN4iej zd^yMor0?+JF@GOUOONbCF%aI~)+~4>QP-+>)9qX`dyiPT@i=U>OFr*n8|o!1)b7p| zTJ?5@4>EqZUwCZ1fBW!Ozwz|?+*{K!58+8~*6d#fQ z1FiW@e2C!g>D94kBr7BOW8M+udYCC=@7-~{j?RLQPQ0>bLJJ4;;If}6PiI8`_Z32Io~C$j6Di5aN_!0y4>kU?Xab z4sizGwz=FsdPy3yV~fBa5v0Nb>##&)8VunKRu2@( zU=05Z-n{WJ>#Ymun3mqB&{SubgBm{mKRm-WQcwq_tq66edtBQ;DVdNn9}*%I9{|gh z?&yP!O!bC1fkWYvk-b^V-sWV`*^lOwk4}_QL@0vQto$3g_G&bUv&CsvJu>HN1nKFx z&6;I9+E4=>e^bbC{O5iq)}%QjsNOE;+cEqLQC^CL!9=vdpzsNpJQcE1@6EPePcDCj z%!HlWsO_+B<@*kI|F*5#^5DdtZzd9Ii12+~yYXB5vF0pG)_heED$EW66J7O@a|n#1 zA6!UF@8sLZz{`FGi{j@{#zlu!*mHyX`&Du~`Sgd}hRCR+tQ+At#$1{WVU#*j5<^1i zSg>Rimu(v3$8y4NlVuF}I9|YWbBtK-a$Wf^Yp)?+WGX|N*f)bAa&D@HHOj%?`FtcrKy9zJeb z6R5e@RTZEK<_lbC1`6Gtw2L=f=eZP;D0gy~muYmGy`vWq8sg(tA%I7DeDL&5y~q9& zBS&~NvQsV7bGI49V9>Eku;G**e=$Qo+4&AbvDID(>d0f?o<2i3d--yf;{uk9xl-d= z0W?Z8oaId?5Jk}G^o(G7=#m=x!3on=nEe@_LW$mBd7~ZTs|8YY0$=NWnzgsr=NCnNay&OpWkV8bKO74PS8H# z-%4uT-zXi)XtG@hr!lIGAs&cOO-m=t#IPqY#D>f;RW8C`Nq&kE^0{W{;d?E1qi1n3;n4@n~$APt01JcdX?W9aFt)gdT-^c}Q8W$G_y zjXl3rL@x)dPa9TpaH?HA32YU6R32>Y1nu@x@l;`YY4e;o0Wr}SBMJ=+@?Ra`k_-xH zf`E$>vfZVZK(>rUVE%i^mzBFYxnC!7=4q);e=g?(=H-SIsZb<~1o(*=M{m%AQiOsE zW{?JfBH)M+SGwKbNSNfAiY}wj1S7fb6Yc|nsFRnz^^2+W4Sbq5Y*rK zrej27@I+6$wlW&^rtxqXf{PEygBCe+*B4T;leDwl!PUp%scpm?BE$G-;MBiflQah~ zU-Oa6gk^Fw{*9qokeVrkG8%M{8;T9$qJcAacQDjBq!P|BlYWVRi7HOgn|NeU5eO99`0lVz&=%(O|T=tJF=yj6uEwG^> zew^EmDw>mpl4-EcyJPwpdvpCL#%NbX;_`B}TCUl!UY8Dlr>bzis>6eBqLH^ZrfNbr=w1F#5vANP z=I;5U3YIB5t=#b6?vHwS23_u-YMGfbh5kJ4efA+(F~Cs}?(zNUBV^)IVZ%CbR{fb( zbX{6Lk$N68j0|mT4z}XDga(E7vDSRMw_G%z^UTx4vv<0bme49;bTZS;{ctRg4fXhA z0OdhVEBi8zjOdt7*iDslZrQYR(3A}Qu*RVtQx5d@%IfbJ`0VlW?BjoV2o#B-?iZh_ zLrn9*tcYwd+v6KEkBO45*mLN0y|tLJ=Z3aH3X~`RIUeM4U}jv-03tP#eD1&NnaBTHxZ{vO zP**enq!Px8d6+Y?p)~Fg{Dj|5)M|7Rw0=2cV^R0Q3vUxt{HDLER!w{gr|%HQS*9yUKEPS->H4lYNQ#Qc!Z{cbxJVIJlR{DQGWE_s9g)wk(B z{4DEo z!6Fim%T#NzhA-kXT}v|XsrGHH>qhodhR#oayJPJ!9TKMW*j|9ox3Dmyi>;MC_takO zC{hc&LI}S|gqR&YV05}>EZ_H&))D!Tbw-u4#xi+VF2+QK_+{?#DAhAghOzCLNfO!2 zMV5L*El#({C3ZuD(m`YwCZ}7hUB(m*ZqpO+P-jqE{SJc9|MLPoj=EmPP-~`TZ=Wed zLZO0I7?LpM#&vw`GA zuRigVO223IarSW{wI4SuR`II5uMQ&>ar0JNtZPW2E$?X)Ec}|x7}!@NyC5X`zN`KA zDn0GbHFf;oSVG>4(7--vt43f?n|bsG8N-(2_`2Hp6{VA5#vg&rvv_fDOXsGa=Mn?I zkxT78H`dqxQ2PQldnuhl=^x*l@2xme><;}m&T~I~>|oPO*VWg)KNZSd@wDP6jgFO# zKlsHQ-1H&QCM(HKE{Nv1FAcWmVKf4I^ijrenmmjK+{K!}|7IrSl+Nb-ph}}?+aC87 zi|4+o3*ykNxtQ;3G3+vVIUw*cTUXORlggSuXB6w8Zaj)V+1SsSdh+i5?OpQ`3%`xx zkD1!)*GL&v*V8VQ>R+v29*@3X#oODNldLSYO|pL5aVat<27|x^p&Zg9{a>k|hjYSK z9L1m+M{~`%dINK?8qEBeQnuz7I>*fHeE?ZHdssJE3N|-~WugbazhidL)K? z(JS6o=;7iKorFCHcV~3&awn1e5z@4)v{6vU@p5Z?-sFEkM?6`;E#TEa8QY9QbAYsu zi9w(R|5WeZ?jvCNTsS%u%kf;WyuTevg|yVYXzIl2YKZ|2fLQVtu(l*0bNqYDwi8L+#%@7b&Io zEQ0H;bkJ+_I++$7IZ4KC?@74Z0AFt_5Z;4RVKjn^*6NE3=%Z3Ow$@mN3Aprx;!~)o zeMP^n9a4koEPw-MFOn@6v1IeIO@F!5Ws~Tz5r4tY>x}rg{amY1pfE#zC13PaU|dKl zfXAm20c;PlWa%(fwBTLZp~^I>hV^l{!%Rhy_F7(mqA0_BHVGcNW3zvT5yzW{g%>=d zD|O*TF|sm#JwW~P^j-a2*0s> zYCx1INqWor%avA>;oOVS$Z2Q5@(EkoR9A)?WuTC``GrLSm!agh24k}MrXJB!xR)*` z)r)l!T>n&eVt8P^46j?kt0)zV>6hpt;xZG}*fjH{ORgzQ;j=oS8&QqwN#r<|olP2t znnW^DqYz58B)BRjoL$foBFgbt&2XQ64@##gMq(e;wZObCH^p{$6 z1xmwk-O#VBgFif&z=T!&$S-ORW{)zYU(UUq3u1hMaZ=9jUv;%>dPn*Usy!Fs8{-Bb zD;)378*tCyf@^~O5reNWmtW|}Az{gIxQ+owQ6u2|6dpv0>t>UU;qP4A&S&)>s#-AJ zNOVjBUS{N`aua0L3W4F-Wg1v_a^w`BnGwYwFI=?=4oaSKQ9~N}q z5=L`k;>Zy)?q7$|=%*>;_#o08m-;o}N7LQH3^FUo&4gu#EytJz4K==L7AG--E5ACx z31et;()xEpXW-aTvPy|0ODt?-(%|v{+?X%rweFOr;FroU%IjVO+axOxBhIsSb+HZ%hAS=<}Nf-*mqV7qzz9FMF6Z5Bl z?YO#~UURnB6lw*GQ8ueFqO=cAZ1`^j_y$*9v zsnP>5CLfELu9<3K#`Y9294a@Hv(2LqZloU^~y<#p_tq*R| z=nwj5r__D6+go;-`vpZofW2YvxCQ4W)0*g3Z$e6+xp^q0>U~WZEKkudo=lf9j_`d% zs;FUjd%MzCRG3mp2jn~OQCCYkEapeCWHJ6PHuIoLeT);la_GarIUg@*YB|Bku{Xikp7>9iWISW7#iHMekTk)z-Oc^aofU`i@5A zeEhtFxKpRZHPU*VZ5>Pk4a*X2HAYqgJFxeRrpKKh!vMFt(q?GC_{EOFeZdP(Ly!pL z!2g9X!!?U{0u)rJ&>)s&Q0UNOpjE}@C{T`~M$TusQ-s*+I)+w^1vr9Q${9=a04Wx+ zdqN|Nv?N*;3(IjM9Qr)5-8mV|JNQZSXvS~RY-WL{OfSagFHGbwHWYv@TMs2pg)BqH zqB7bfr-y&6g#3Y`CCw|_M|)X$1C#NW`d&*z`CS}xcXN$zEy(7gDj)69`wo-*>J|Jr zN*iZs$ib=-p`+O}e4ksfa^jS&|7$e0<|5YTks;vFM`r2e=;Li8`(&q4n<g>s_^-O%#Bja<^+%sK+ASF2@ z%LiqE=-TUhie7$h0VhcFGlH><72`#Dr4Xt$$4;(*)L*7wR%}=SYJ^qQrYEKObJTcd*ZAe z+yvyW_daoKYY+9aj#Eo@sbW1vELvag%{r6#c{mgYeLWRoX_`~1L`<00 z6VJDByFW4@S6(>VyItw_Uy{&K$k?Yvx!?tz-=mI2SKhkT=)G4MZgaIA)9ek}q1&ocQ+hDrYKe+zBD=&WZ2(X^kajYTWybs$Og2Z#r?Xr({y7CReL zSQg;E+;3NoAmFCl-HLYTCZsBZ4JE&FOr+K|5SeEJl&bMH21r&6W|}szC^cI6M@D#Q zt9$CdcR&XvwCZIZs8SdgSycGgE_QUPeeZ{PX&nW$_x8(bjja6#Som&RU0d1`L|X&@ zx9P2ojs>@!ACEtgoi&H!*iqKNo0??K4LYne4OZ1!E5`gR5TSHxL2TUY!{kH$>2%%p zLYUoH(Bd^;5~X`tZh@`$INvuKxAt6TPm-(jZ`l~R#`B&Su&9x+fez6|y4mCHS~abG zc2n$a6~5r@L7z(K8zl_KdK!{z?A+SZrLFIpgaPB%eOy<9{|e$ilM5=9wfk=Kt5@ z)n4cx7|A?4K55M@Sod15w7*-+m`YjlXoeC==EdRCBF~7C@q=>IMT#~=ezQa(ytBJ_ zsVdwc?$ct&^~oYAy8SPU#!#MXWG7CTXE61H`t^O2^cZ#+F_o}u{GCG80dxnvh8rdtIKnxr{Eg*@809P3!h$)YV0%#~o%#Sk_6^9^^;KMv5 z$Gg!cpvBe<~3RSBW6sF+_hKhsqqX?~zBDq*T>}bMdwq zvHJYR3kHhz={+2Zy&}%-vYb5FpNxwL5ol-X=w-26I13c(CT4@bO=-;iARE*j?*eaX zM~MAR%r!P^Krv0~9e^&H-|s{copAH3?*u3a@`8tsRJng#e~=ZY-UMyXxNlOyYA{k= z5B0Mp5XMcn3&RJa;W`U{d-lzQpyNkF5xKd|93zH|IWodLzEs=-66{UuGR6p3Z^~YT zFepkS;48zB7w>2Ahu|<~z7pMp8_u*-t<*!i2p)WM3>gAZ9fXikH?$Ss1DdUd=16R8 zhCT5_nd@(@_hb!N3WYS1@@cpz4D5QJB4BwJ5z^7LtYwM#gPL#>hURxIT0`>p210{ zlEO?-$`Vf6&|GQX{xy#BtG?78_;qnE|CM>W{yp(!O8;G?Ht>!FCJv`9iW0$wIaO7r zx_hXq<37>jADehX%GY<*=O$(eq^)@Wp4U66h79>qDGle94gO9L`2EO`Tr_ZOWr;$GlGU!#2e$DR@|Uv2Lf@QRKw}o$CLP zilIr*-TeLID8(uZ1O>er<~GTrdf&?P)5w8-bz7q$-#alDt4jF*ZT^^A6HMqaItuuJ zV&rr0=pg=e9Dc)a{GNMm6E;JG0ZFS)0k>xtDpgY7QLfOEL8#034oJ3#7`0}$of-oU z61-+>a&=R$3}C#QY&#a(ff?$>U+(XST>GK<8a2Ka>Bw$y4_(o^ts}+ehVeNmV(9$G zDeqz<4x-68E0)1fZ3h4k0C6f-83Ya*`k|4@)juKdNO}4=G|!~ z68c6K7E~Kb=WWG)UNHUe^6~N<2m{NQra`?Y3*%HJF7p1*BEljAM+5FhEgAs@#^Ktz zS-8IS(yhGYil^Rz0T(bz1XMu#6B6*FM~|FfKIH29@srnKG$y9lPp7xHw726r3Qqp) z28h^k@5Q!T@19dXs2OBw64OEwdrVLhzR^Ai+tWkoQQ_gUrxr=rqe<6RyT)HYNptsB zVcm&<&92X=Lt0>XIp0QslbEp?8~9ND9zyZDYK@K0%4Xyuum;E6b5Z@?U%hY8Q~7^e zblR5qimwN#Uf@FqEkB=^N!Kr(EimRClK2iZ1elWqVe`QnZYc_{){Y?d(TmZ60|N{D z4uvnp_TL6$WA!cLr1o$ywlDWwio?0P7#t0bR|m@`zA1>o2kGtg7VLha<`z4=Y|G#I zlnY5E?J{c%c@=fgZ81Ii56HGQp40ihSh$$~g#GHF8PIlXBT#saVe28?gq88#*77lg zWkNZiB6>LC&CxTaA*6z-#`?XPEB>$A_R=FKISa`}&vmA99h6< zInO-KJqdG_4tumP=2r6SdUTccX_~`!M(VDo18WD0!%d!RGc~B?cCNpT1K&t5hsoV@ zbI&JLBQO79g#NTx618!@oO?C0?m@-JpG^bLA#Qk`$E@e^&gz99`oj0i_ul2<>m1x1 zVf#;k*oyXh`^COuW^Z{gB=8g_0odNkOAYNb~Fulj-^|R_{jj}e)`-VyB5&wuDRH~cUyHsKMc5V zUVz`i%rVu}^_9NIk6fblnsNQQ6tV9Q-gnFY+-*R)8ElEk{p%W6vteZw?k+XI1=1=# zKhGInn}4op8J1@99aXD&VbiG#Q->xL1(1u8tum8mENH97L@WQLW}fi4SGg3o4mm*% zpa7FQ$)!PPDx8|!=s-2se&OX*7#ppTU^#n0il_Ali&aZ!$Bgc~w_!C$(=cUd!;LSG zN86CQckEa10Dz)*;(|YW!o-|S4KlMHmJYVoXaAG9=>+NT04#iUfU^_V8mr9Wj!AgG zPW*fUGv<*0o7UjgNWiA(tnK%*4@LjBdR~r=t%-Mkc% zbL#>=^Gux2u9X$>^i{{i72XsbzQ)0k{-vMEnj^Ylh@^J?;gdgsTEMP<8$R_sly{!R z@ExDPyHzUnvmPHo&sq5p)`9`HzQJ5E5T=+tpivjkP>)Zeop1p#oZ1E|o_U#bXE{1k@f z<4jD~RJd8{mc z2*yn!*~wB3?G3&~xbYP+)^-~uU;e@U_YZCz)49${SP(SVDI@buWcB=W7$wNH#7V6o zJ%(EGL*z5)DSxj{EWla7%(^SIC8Jkinl8VCT?1BC!xX5~uyLNwq2SsU$elZN^!sn{ zA-bnA`Hw|yEKTuJoZ81+-=JpPkS&|RJ1v4R`0fzOMQAU&Mt_nXiy5&0!QjF7C;0s- zk3sIp9}}+Viy2TSEe_WLqJp@^MEZYD+XGsykXoA+m9^Xvdzw65sRe1i-vwws`4$!}V( zrIs#Mj*+J)%UXbIjAtrG*-51FIUhe{|51L1wQQvPI@z zm(q3wzhu>w|52SYUeJDl90RCTi*YD#otyxo4Z5##Kgn!fWAYU+2t8K{|QJ>2*3}N2#>8T1yoL49I zjncO$A^lR)f)j{vDU_`OSJ?IE}L>eL-(SztX!_KO6m&Va!S#upJu_Xrv2r& z7JbGz8!f4A=}D7}=?cL+u^?L?*W7klPU7?^E9nN=OrfwKX1R}eviq(#LSp9%FH$FB zfs?`sl?zql5H5NJQt6-)obW*-s}(|pQY~5qoVZ4A623thl_ve_{B9ROq$h-a~8iB+FXLvAAEaSz{Za=v|7h4?v*u_D8*6L zAXKC=pdhnAMcg!CCsdQ^X&;g6fX|%7q2NDZVbeY+3T_X(GL-*1S+Qu==SYlM2 z#OhLC&4n=a1!+Cpdl`{i*SZroEHp)Z;I5mPTu%S=ryt5G?&Yv+a7)T%R5yL$pHJsr ztl>W$^G51q=F^ZG!8`!=z)ju9bc{27oDxy2I5AB6?xV4i88>NO;3Qg3CScWb`53mK zlx*VI;m2zM08d1>Ju40qsC%4wfCSDCHREFRb~`M6ILhXY>ADNVoST69k@iMF-ystB zA&ZShPOTrX+T^Qk{^f>MCntVe4R)Sv`Iw6-?<8x)Y#Z*b&)r>QNNn^fwW{yK4DR(; z1488&!{njXQsNE1^#cbM5qJ(Fl=}Rwo2mE1CtiD0PVz!*+O%1N;92unG{>7AT$VX+}k%!tbjJk;$l zLby;!)D8})6MZc<7TW(NdQV3Q9FS(^Yi*48UtHmf?$YDA#Yg3 zIV5VF@3)?P>)c8Jy!Mg8tE@a8m>XH9Z{7jmZ9I&+l}V84{=|o|>s>;G#7)+(E^SH0 zMjQWs7AAhpfmSN#s!9EG8=EKRH4ne@*(LXel}>tau=$pT)eRFyVyxN(j>|7Z35 zm6eS`NaeY&9HIkDpICk3-x;rz_tnU=9(GtxvP!(ke`=6;N>>RR>E`UWYJMesRIY{7 z#cqiAkBWeuG#}cM+nbPUImzc)CDFF|dS~{yj)n$z!TuA^Kkqq|8c>3)wxuOc{ z!K0n@bsyeBYp>pTDy-1P;%6{Mo=BTYmRNV8zhmUfA?=lVmmPHQS0%ZqYw;^%v`Wgp z)`zr0->KpKhy|rjrc^Z%+-=9Z*CHC%q zxryx&Y~0r9F4tIc5d*w;CJmuIN_ubm$_1Ziey4dd5>{p`+LC>-DueAy%}m)4eWb=R z>Vd~qLq-bix`WCx_ynE`NPEM;%$lqV!=~_#`(GURPKCLWWta=LbK2P}W3GnqZfjaH zILs1?i(>}XQA|3!4P^)#!KwdTH+c>@L7}}Y%$@U+HO8TtoH`*6z1FTmy*pLE8zwnN zJRr21wGAl6uOTJy=z3TIOu>fUM?_1zA9}Rw0qNnxyV>w?2C-{DvX5(cK>UKendVyh zPb%y%87EPCLYx5rm9fzSY7vE>;ll2XI~n}^l%cmcB296j@aCHm)_gmgY&Q%12G*;O zp>YGokChaVtu8QXNN=dQNiy%~HA@I3Wr8{IZsGamfxrmz{?f9+1j`uV&W?|t;BnvJ z@fZBk1py6xEL{HAR~AiiN^G<-@$m0`mxwp+p(D_(U5kF>k89>^YT(Y%Hp}8~J&L-} zPiUJGsCFIr#U$Wx18Wxp9xB>SlkaH>-73epdlG4?6|$#e+->2u{lwzkPVX*Rs+A1= z;zeAiIy}ze>)XK4Kp@)1*qHx&1EBL1*bG!wTB9) zP)_jAYOQ-p>aX3KA*ht;&dO#c_)ONXKEloe`{Nq%irY0V>y@<`gxWWaS=$$7T0NSb zY^TqrTleAB*WT?%hZjf58sHb)s9oBOfQ@=3qf$aa=>mr{p@L0(`%1HfXNqgt&Yn=;oNAt<-3 z*CJoW6_!aj!p7ctH{hQSCYU?c#E%UVHdd)_$sXc5YGJemB2?^U>)$Ztivd`i{}k%g zCRq_(`biK9n&{ES$gAk(?_s)~fbbjTQxIpGqnQ1&H4BO;%%on~;f8H$84|6w##y}S57s34Br8-^n~E5g6gLUls`ceaFUs*M59pobo;-e0Jg!R+^La<~(D3a`?nb=EbJhV~yCGxk01zSYqM zZ9G;JoTaF}JD8R_rgsFSeqegp3xwd5pXs4^Wejy`v`sS3m60ddZ`@i$I62Ut{Jr~dIcc*X|`X<8p^}(kx_qzds zEAf^CX!FENlbotLiU!8i05AN*1&CHjpnuoyC)gh?ykfVdY**+#Z)~e~eQ~4wbTx`Z z;Oc~lrI-{Bd_SDak(-{ud)-A*s}4G}xuy+xodw7P=ycI&eA`Q$g-<+GDA*E#`v;>G(0);u#g6$P%rJ;E1jNxQ@gV3bFSM$F|m;VWug1{>{>Ve z=#)3!Q?wV`+ zY#EQjQk?>w&RjF>W4FEFvm!>wX){%7F&QIU$)lKRM+wT;YzvGNFoQ;y%h2MuIUA96Pk*X6ezuH``w)SK_KtQ7;9WKZ=1-Ej^33m>qZE^%kPl{8RM z0I;^X$@HwT3QN+D|CXgYCZ_{G{AVula~-w%ecvhN`6aME9<=f0A9Jie(;pwjuDxZC zZ>tTI3FSeBMvf9~TM@|3Zi*6>6~@&j3oFFeJcwW31D(lzKYVXy^y?PHqG@23AsNd3 z4^ReX?OPS`-8m*Qc*o}2n=(y+TmGS3#{||lX_LLH?m_92|M_X22bwQwSm_gWK|XE+ zjb@iXgIpXX$?6wmrjaEVC+!m^uv=|hb}1(1UiNHEVBj4+P_~v#1%N!h(`c?b@Bxi1 zHpepA048Hvy7xL#6O(-0`?4Z}2Q1P>p>v(PGs2VLZ?(2*q4mVipY3vC5{#IzQF(bq zQg<>cdI<Rd6Ni*CI)qsJl!$_$oos32`{FkLDvFQO zqx!TBK`Q|enPb0ahWe^A)78)M7cW|WtV*`X&uOV^tB$PZxfyuJ`yN@nLN4M9*E>6V zy(g!A+<>>&+>o1wy$Gy#)E7`ZG+$TI=%?k{KWZd-Ugyp0OqV;<4X9%i1W^v!bhido zUH`U_bGCF~Ede&gSyOjTM(q3Pu#RWw9xsSvo4OgXrod;7*H>g<2q>tq1*v@On4HQd z`lc_H!79HmbgDZShb%|<{>LV70PO*+cdP@ix%+DLl;n#&R~xW_BeeN5F)wkzodS(1 z2v$1J>!tHrs;p35^dF*Cv9*g9Y{y2Z{6bva}E7RFeA%7B}}Jr0J3!^JgVkEr9z z9j!O#$vgt_GFtd`3e~WLN#-X2PgB;184$_9udkhN208!^T{X_HM9qJc%}NzvqNqpQ z(347tV)5`BbFr4S@7>nxBSc4+n}W(yY8>KPv; zDdB>rGn((e?RNNDMV6~WS&|6r1P&_Q_7c?TEOubjV;}`kv6iA(QrhqExYC+G)|&ia zsb&Ik_-NMUxL(U<2`R!R2!@~wc&OBX53_gO_ zo=Z$JxfXCnP~|dGEEsfipsLC*G?n0M1`sL8hP126HiP3DlE;QmV=JFyx$A8d@*d_g zvs+g~Ys5UY0ILxLc222zs1b23%w%rOV7?X|LBHar$Iy7}a?WkI5Y23C!0*^@j%}j@ zLo>1|jcOip1qy0g_Ri~`P6CWmEuYH3g63P6S*a&EV9`m?M)%=0bAI5gC>SzYD|$R` zQX>tCFz9;fxv>A1LSx~5rVE2^LN99!`R!qEqsoVFYX)jEoDjKKf4EQOU^@Q-#ym)Y z>Hqn?U(nc?owpUi9F?kZ*i0KVra86nB)Q(!S%W(k&owx)`|HY(o`yW|eAyY#>`GHc ze9W^;g=(QUFSL{c_CCFE9$^g*y32a$PSS7107|KRz` z=Kei1aQoWt65aFhO4%=;E$}kw{UVX#DphQCpFXgCLiu%+ViW9l$@MZ`@b3K9E%s*H zD@gf=k3s5pc53M%aW5G5E#rCNDBl^pcqGbzSUg?0Y8^)lB1I`(&_a;VaPWMUj;&?7 zXDv`(eAWW?d=o`OHcK@&u0QvT~((^z}Pp`SyI^rOl%(IwUU4zIqG1ehH zlZIu4_BOxE#B8`Z(v^VMK!Y7f(5-A-Ptt{=;K zbtousa<68C6)RuKvAnh*_4KA;{HtcXZpSFiTcj=84E{Na>(-*ai9_h3M$Um=BFa%IjP;gjr)+J2S1-FQx^`V z9d=-r>icR6&Z}Em-H=?3QD?Yr3f0N!WyM!myn=@wVq<`56Z<+A=Xm%<{ImZWsEDG6*SK-!RQK%u{iRhisDP>IyRgeO zR|bE6lBmztFuC~C-(V_fb3^r+NltptJi2jf^ZjNHuVIi^np9h~P1u?7(Xe=|>VBFR zvqJW9f6qkC!~{=Fgf+fw#VSsY!NeC>y2 z{qxI*f9e4T&5o>GWUp+|c({M*yCdTLJ+ral@HB;;zDWBd9WbtBP0j#ngy1SyovU4d z)hV_^9om8A%&DacmBu|iFSWufM9Ao6jA3p~6lQtB-ySeL^636j!mt%XbiA0CGhw3} z*Ux(uQ6RPJ11#M!e`>ntyah_BSJ0$uaaW)%fPb0D8_mP5I2|Y30|+yWBIn zel~t;mkv0D&0*zbYSfR0N2%%Mh_H+XuX{QtsZqhVnN&C5@)K5rpmCe*PhHV*)L3X8 zM93$n_t5int?diu!g9(G^dB4olD<^#2^e9~dU#TSp+RHMNR_WQ4eEl%U@2_USnpqE zEi+Q0=NbT53X>e-NB$9CT*W^}zTB;Bcg`FD>e>w_ZTTRcGA(mEVNVPaWgNm7dt?oDTA-DyR$kGNrdAh2eLj zrj&f&9td^CSCJdPlIO~a#GNX%fffB}2MZ;y2?!q=l4nRL&|V zzcU=#xM>^vDet2`|H@3}MH=!cDr}lqs7-~?K1rVa{=`Lhe+fZBOB{d-*P=BN$7^A$ zg2? zUcnHGA9bA&9?kWudX`vx#SIy?LtXwo%>J`$-B4ah*toETPQmpz2ZDTXPyVr}J|KJ0 zH7qDB_mZa|)I>8)it|PkV9&18UkMP}uX)aeEOV*33_!LGovOior=p4Fm<^GRf%IIE zYqKE;W&0ZB(k+4mDUZ#ccX69J9p00XHggA!DvNc0H#@e6x9krc!1cs0c+#~*BfV^yV=-K<$qV zAW0ztNNZka&3nh(akXN&u*)jZ*C`r<-48oaq6d1y|B>FPl(|vMfkMln=biKm3AO;Z zGP28n74XCw?&c~ynWP$(OK3+4y2o52#@J`x=5VR{WqNpj&pvDZmlOXo>qmDy6=XWr zdNuZGya*9WMK^WGAcQ>9l=kxyNgWj>9-vxKLJLV%#@uD~gg%6bC$qYgX>;Y+j;ToB zu#L=p9>T-^(+Z!O1%1Nm=ysLa1jG)grKCIOODuC}c+2o^qbF!5YzY2|l$(&)-yade z4-?{BMWNx^b{1-`?L0jAV`3TKtAUO$4K2%9#jm9O*8G_XVd^;)<)a(MXrbxoThfox zKMv+Tm&KCSn482)?!6d3zSjEug}GNkfe%-7EkTw*P-~RMsR{qvOr&g$Ij3Ly^{Z-B zV}|hJ@1O3FSspn921JD8*v-XzL+f{@o@f6MMsHE+$Ma#G5K6{pHSc^J8EMXJ_t#=> zOY+1D-ae&4y$v*gDZjC4gJ()q>&|_tZN~#eqH9qFTF^oS-x)=bhAeH>FU{Qzs=|1> zm>(90qzq(Vod27<7zX}4;dM&S3CiC8&lGU*FBPYRo9z42S~n}_SbgqpB1YB4jJ+;0N|d)VX}R(mmG^y&-Pt(^rg&y z$eOgcVDiI2Dr(*jQ9(yb{DBcx9?9G@tFs@W zw3`Tjf@3bWzYi9|A1}Ayv;@PhcfH7FtW}@a$vk{d(UqP4!1J~930sk;Q3@`0He8Z!l>G5_UAPN`E}f|32?@E z+H*I{MN6Sc3qr%1AZ9e-vuGGi*3lLI9{EA1535cc9_&(sWDC%M>8X;JCXM2S>WGAXb8n^j`j91z8je6)j4|Rmt(IxAS4Ot zRC+!z2%5sys=&;FfqiuZ@(yJoSs6k}2Kmu};p!_DD0 zC%fw|Q6UkQjZmvj#>yQUwZJ!kr%39M?@J5YhmZf%80X0# z-}z#tZM5i!Gny(lgS30D)+x5k7WU$m1s><9pB)62G@#e*DnuiLeARNTxAn%%>(dR- z&F%)`sh*9km&2nsVlV#X1*6bePh>kX!3*Q}v#@IO(SwHu>jY@h56 zIK-@RF2Ps9&`d)U8Gru1NrJ)VT%XUBU2RfM+eka<#fJDB{O09`TNc&QxMeP#oRQ!Df#%oO?{W^gxeBe%A#p7=cD#&ssNsg!%i7 zPTt=_H*FWMfxET-FMew-N{-PGv@q^FGDpju3w0oeFV;iab(b@ec&+cKpO<*^ac`jM zDegzclYpO(dvQ<`q1PXAd%mRdPgf8rn=l>b&JAiIaH{@<&MBoe)OOIm@H9R&z5Jqm{I4P zPpcrhP7fuU28^U>oD52vxI-9BHMCcErDYx^RY2DSi*Qz}I4pCLi4Z}W1IeXOoN8_+ zGX0@_iDjqZ=)T&_vwQppsn(9WRHqW4CeaYJ{S%HU`qXEr-Qul^vsn)+U6^Z*ImSyd zJTq}?eW{N-+ct5bIM?4+dGXgItz#>Dml*p0XgbTFwxaFr<1WRD1$TG%Vg(8<6sJgW zin}`nio08jQ>?fbaPe5Qa)bk033J|kDuLj;8{Cl7EXwGpBz{EXU-LnH(Xg=EdIlM{{to%zZ zA#eE!fq8;Gpv|7$f3}~iijm%ks3HAE`ROkrrJ+X?wr%pu5B+)3Itw+$C)IksoG>$| z0*&aw_QqW|=+d1Q=HlxI5q89UNfRsKIXC$IY>1v4_PGpz=@4Az6sG;Ult9T~t>>#y z1J=RZ-1AMv0Nqt7zf}XR^HgoZ)POb))z)GDamH<3e+Z|~1Tx}@VXu!Qbi=a%mSQWt z_oJ3=;C*#3}t%fG^ z7(neU`!m$KN8Gqe(LXZq0IS4)fntmwO1qWb9LT?O82i6TbOl1Iq5OTjJVJ^Ql<@If6t@b_EU<5#XnE2lwa(0_P{Rj%U>LTu4z`qfz6LO2P_kod)oOrJC*Kg^+!8^ z7O3dwucD`SOjjZ|J?-XQ1v6y{7Nln9^}gX8nI4;x2JT693(BcplAZ-jm^N8os^eqH5_G19DYjhjE0r!;zyQEFuO`Z;Um;vHM}<9lb( zeVy(nK%s!t^_|hPTl!k^}?aT1w|%;>@9DYHo8wffG{hwx zO0dkTQb22=SHP3bI)Dw9?cw@DTo6RK)U*@@Szc3{nv*flPEJ@Y;Cwg z^aqH>sTPvcoo_9@do1gfco|zR14zB z(-HHROG|={ru;kFr3L?*{MAz;S3efj^UTGE*P_{FM4a*~I-7X6FfwHSa|39%)ePrU zkj&b@73s|;7R2HuVq)f&X!s!j|b$^DZ`{q!U>lU(4x*^^+rgoa6|99%}`INjq%n`7*cfTHh ztQXVFty!c$SN$_aXK@eyy`I`a=34iBoW^P>Y@5hee%= z4T}3nzYX7RR1uC_kv49ngnIl$pI)-X7jG@N<=@#`gvVjUy;J8ZMY@0DY~3DVxF)7! zET=(B&7LDR`mmUc@sUM|5naqkgTw?{FtL=3G8Erir9QCxOW|h{I}AyHQK=1D)y{A? z#t>2Ttsk4gp%J_V# zJ!`98W9TegA_E&lwE7iNQee^)X7OT#{7S?)n-chRM%33$0(}yZ3DAbq za3llnCd}9b?{XcpwGv`qzArH$=Sy}Anrq>B={+#pL@}rFOeE&lFnJT11~f*a2s-Jd-B94Vsm*| zGOGGL_6%Q`1a8&#lhkE=cN5>ibIbJ%YCxF3m{C}E`ssfPIj|yHo8jladeM?Y+Egq{ zn|;#RJpB08qN^AG&T)EU5yi9Mz()ND?yN#aR}v|ggXmkAL|FNy>-r`PSFHwiV_2lF zmW05&M)l!;v~AVV=UjZhs3%BUiS5*i96aQbMd0q|_}7k?kmr07@!MqFi>DI%wXrj# z*wEy{7)sXJ?f~b10R;RdGKk;^iK6}N(#K3a<-*D_wCnn6F8AgTF*AY{3fm}ED!y{& zt8TtoovWI%E6qN4CrrwVzysap?hJQBBqg{Ca*)Pli0D9-8>Tc1 zYj@;U5{ddkOHas=!!w-kKix*GH2He!LqM*&oF7N?sHA1bY-ecu(t^u(yfDzoqtt&X^NA!vCq{u??3-#U9If_vJn8 zHn_&xnZVtNkgwa5M_%-Ck=X@KTTe~qYEX^@?F{g9FOqRV9+(-BXPq!b@6tM zvMS=!`h_jcHdUGRFtMSLeBg~qa-Eqa+SXJJyQz4}HiYV#LB3QBt5UFQid#LV za6kcl@FdE?F%q-jw^oUPl;6`HTbJK$(p0zi^-%R(yWdTku}}^1Rl}6kjtEPtiM<+t zVZN=e^)^IS>Zb*1UhCa#car;t-a@!Ax3F*lfyyYEWj#@UZc8fW28v9`0?~)Ew3q4b zmGCwYq4#BOK6EyBCkiK$Gqc5{Wk)Y0jBqulhU9bmsc%vdUd&5)1W()~^-n#@U3#K^ z8(h!E-H*Ea(lyL@)$ziezXK12%;%4=cQP&S%=4Ygf6-FSJ3aaU9Z1GLQDWgCgwIia z=sN=Q;dC|k-&luL6Rstid*kz*r=gWUY-i(SdoUs`eY@V-U}O2i=~(yW)m%m^6^&l1 zHSKxFkynB0J$uwF;^T1?_(15J;lA)GsX(QkV~m~^o^X;da9%+B5RTC{V;rl^hH>&Y z`L9njWe_qmc4cp+b!Lr^|4@Lb7Qq^$LRx0!MLlHE_>vPpLcik4YvB*AeA3j@!$*A= zp%JA4&Y(UuK+6}>#?w>x*)NBabHy30yZQ7!NTW|BD?(I9Yi}=;Kv7F;AQ5BS+c8~F zE@||zdDN~jvhMlFLJ;W1a+9xNc^}71Ztr}&W)Vlrwf1Zu@V@y4FuICVp_K&9!I(`ivNX?V3RAj>_t=C-Jd?C-~o#x6P4)s4xJt=qKFaD0oUV_8$g| zncL}s-N&DpFp*^6gwg>=}2+RpiD1C^)6bynSIZ*OUh(Pqxhz8f(9 zEg#M7YZ0NQmQoVErt0RqxIr)Z+u5t5Mmizdpjium$w)4p8sUp`dagXMg12mr{KqK?h5O3+ zcCpFQXXbXqZUw`6d-V8>!~nrE;1MFZ&%xM(K>Nq_inG#XLPwn*KO zr$5unpFzQvEjkMVVxbvYq-|XnFC1fJ#e|)C=Um!!u0>#fbeitwjEANIcf#ST)RTY2dwwd-Tn*CP*2 zkeO40fdQ*WCr~E~HYPX`C=S1qvRmlln@&+FE zpt8l_pa^e1P2_Yk5v1UcPw_J1R=4;FSh)xz&{HK;sVV;FyPVj+S$6wa#pOJ?EwyQAYW2G|=#o)QEN4o0ng#@U*P#l?AeO42GP zWvs~MYCmOP_tYEQ^+LpT8WI5?u-(PcX|n~QV*pQke~-k`#WODfEVXV_$lqhNTr85fESoq_mu?{(ID*N$%J z2|?4(GuicVs&;XIvGc&2bHB#dhz+dmEpv|p{{e-38ou_QqYe9OCi3MV$WI$9-_whm zR^VbSr)TZ5a`gQEqK$t&bZzl}U+xPnt}pT3$X@06UQhXmWDP12tagR4trllS+g~@k zI^W*~{mD!aEGVB)GPUX;|HHnPh7{t;-5%rZzr43K=NGz%TPxD$L-OYsgcaDX7+@;V z-9n>Q((yWi{6PYkNqiD0ytTVjEcMpUqYk*-zozt!Kgf8ZN#I#jY85e1=fpIxj7+Mv z<~_zYv?}WMLF&1215$Bf`-*kdrgObNksw2P-;1uLbshZIrsPqpc!Zc?WC*$nH*&Ew-^+ z8FO#aZOcY@@mUe-_xyI+Ep<~$LN;~DpLC(E#8r)#}N{4{P{n4-3SxyT? zU+$PLZ*x?1C5AoVIn=NH!Ny;zIi}G~j73Y!tg?86s&vQoC4&g0p8o292X}%bDUitdZHL2vC5+Ejyx(5rJ6k}Wzdf~rzPevcfjajJJ@=MwY?B$^ow`=ohVsM-NAa`) zKL)Rov}-or%~mykbld)@j?68qPO525?o9YQcM;+3(e`oJk7gItj+s3>gkcZb3!tJR zdc>9xk#XnUCst873bH$6sA%s;A~MHdNL#3cr7oB>k1dRZTpAIR54F5xJd2vOK$Z}e zD89fS`-O`y4;r#(l!xKfb{O#p=UhCFgd8nCPW*n6fdeYVT$-tFA?ef*!%n05R)xW& z>zW#o=T{sJU$}poQJ;+`oF=dG-z>Y4kz3mk+>s}*eDiO6Q+4?iD#8s%o2SxjjY3FxUDd4zErf@2;fouP2YY||xMk7(Gf>4{-8a0p zXYqTLU2o{5OtG!pLjbJ(vsi(88e!BT7HPCi0i$ffClObi&&UvL-(L@EGJEB{cEfxH zt0Y$qG2+<&$f2=&U$x;~@N&oBy`gW(5`bf|f65C9{K<;Bqdkz zUCThFN^nz(hCv(EB(2_l#n9N7gJwPGjO<+=>hXfX0c=PO=e~|E1A3iAuCxpBmH3wi8#^MsP3A{lZ-zYU;iTTeHZ-d`$ zA^%=*S_0<{_m15Vx{?KEa}lH^OSH)wbN`tN+Hn^KgbUE>`8pL}uA>8^KD zB(AR$IctS9e<7=mJsZ0>KttB|Zg{(2aTB_{1gsjsJK6X^T;OUBd!`?^rFZL(?ja4O zle3HmJB3am+Cg5vILKV8)!q`s)xFNVV}r?<@P^6oSlO4`$wGIH5UW(;3KC|nTRV!0 zghAt<{gw5D4w;$CteR8J{%^&(dE2mqs z7JWc>Xp=XbKR$`uUe&_OM7fS0C`OUzvy?b3o3amlNA0Le9Il7%9>Ys$gM@bAbJ)gn zCvi|gQOv!mKuu1(`02y3g!OJF$!I=U12f9Ra)!Xq>Vs#9K?Qm zD!QdgDXkSSo^Qc7g@sm2Glr9Jz(+OB3x4g0z!m(b=UMG4`EqgC*#qxf^!zX{qgO+E z&{-9HmHj@=E*aDb^<{zq^(7MPuo~mNqF7lr)~z}2W&dgPVYfn#*|OC);#b*z#6c|Mn5hl}fi!;@#It<5gtITPVs2*0w&3UzH_HA`C^e1Wb7-W_l&DFk z_{GFv{#LIE^bw)#=OD*xnZ=2iNV_Tb$<^D-%;({QfU^s`>P@Z=)syLu-}dr2yXB)_h_ka)f-?^>N@kfc7mFE{^f{>JT)rnzNX+iHcqAEKfrxN z^VE97@nqqt9klzk(>U<_!!zxoK}K}D--BT*=lSXS*?(4gpT5X^CnBX3$u(5!DT)8} z-9gvB<6D(VH}~`~aoFqLe?H5Z2w2Ctw*@q19;k@!lz(0sZZ3(zz1$7{**A#(cG>M4 zi-v{!HY6m4W`6y;I`PYtF8IRQF@G*ysDUDH?d-wfKKcygNJrFh-}{*gYRa)9O$?rnrVn$pjIQEU*^`~nGFqAdq@AJIen_lyqUIBO#j8zD zn;AZ<{Z0@MkVnMvt64}MzP+>U_v=0(lROqRq9SHjY&&rWtcMR zgaha`(c{#4<8ZOLz%bI%c$}d6`-=X~muwq-uv{W)v#9U=u42W*UpsmC{Tvth{od036c%52Us@lw{FkSB*_7?p} z!A{RhpYtyEXSvkgHr}3*3~gU8$W;QT8REnWu)#h+T&eC|YyLZG4mxMIjvSXtr)t@* zhT*c3QQ1JYEpz9n8OYTOZuccjGXxyC`lM3{LT>6W*d7ivb=)zd?1579_K`pOi)wVW z;^^a;c~wivx14mb<)&54G2xK7qO*XoIoZ0EHqd7U1w<5nV7)^C#25NHC2=&cNS5%P zCDjV5PLT9HSTp2IxcHmLVVv#L4xw#l%r;C_JoB2>LVD}t>3WIcUe$1++aWJ&lIgy5 z4$`1TN!o1k7>R=sWOp(;_cf0-JxP2 zYl?CLFAA!24gwxf-{%EA`vHwbZtNH-PFEyJZ8`1pc5%qxKWH%?czw+nNdc%K&&4yZ z*?2=XXpznz89HxVv}g)Rio?=PJaLGMjYRnx=x7+6*}0def2<)aXHcu0yqHwUvl>gn zr)ceM*s>V>5NTHMEo@|rd+E$^9e7b2t0+}f1u%VNNeqFbB@9Me`0l34bXREr5@`!< zK<*^79f=N6TfTKgBiD5-mb0bkDyBfI8&#i&rw8ff)Dz0fET1-axqR>{QME!e&>?){ zR0KToLPd2e>gbQ$^_vKBu`rWXrbGIX8hQ+fq)o;aq5`_(hbF{2R-3GY=YaF{GEp3H zpdhIo_QrCOJJH2WCR>T@0wH*iI?8~ts{}&_7o@Fd4iXwFeodYw-}OORe)&k_{rf3X zI{%uJw}?i@+8p$aGk4eXTi@x~2*IA-yY}zg%fJ7e-j5yngibuHc^5m;9|@M#e1EWo z^T#Imz4ow=$x>c{@s(s=Av3l-6!2FToJTRENk+<6`)W{-GO#_J%1{AtVFHTcu11?q zAvoGbR{+}Rez`;wm^@+p1@Um0ItMbJ7ElNhg+paU#JoJNZwIU3ms2m;cVKTJ8-u* zXvPSa)VD;+z(5nJgg3@E7R9IiwM9H%U23tntE*(4ihJ?aq{CF*E2!vZBl@FSP!hAY znT&+r6bRtVY~3SF=~-7|Z2wzmN?ILN6?fc6A@iLHwfGv}Qic zs#uII)|pXRN7(v1|Km1XK&`;3a$tW0))(zGDoH2`O#uM{NyA-b>m|^SKZ-CN?E1s3 zS9F%1X6!}GvWo81qihV{mLl{uh}~HIYm-getda6Fh0P@Cm7P*Lynu!8THu3N;77wB zbtecB#%7P(a#tIMZV$JavhU-BteD(p1H4N4mFUZ{HlIO00Gr9t9MQN($5)3C4YC8) zu#-eZCO*RU;u;zmY*=&PsUX4Yu0>#l#m-5!9VAr^|>VLE{3~Lv$ z*XMa?5~Q0ObJ*8dn_K$ARO2S-uA$J_=>Hz2k1KPE@hbv-RL{3V!kbhb!KG_-J&9BN zdLE(Qba@>PWA0x>e_xy334UW3e>~?0e=HY$6QbPo6wYyO6W=#}eT{z>a^_o?OgZIx z&f3m@Ib8T$C987Mlu90DFt@a_r$Vb_0luDco0b6@i2x196PduefEwG8%|`|Vl2vxy ztzI83^~8&SeefUXVP65Q{OmPv@7f5FkmGxj(-&bWV_NzX%Fi%M0S?C&Dc2${Dx9!Y zW*~|cJe*8EfcmvsZJ(rS(G>xy(uc(#B2K=g=(`&o<)>9|t1L`;>AVZuSLPeP-}eSV z<`@t%BuNs$I9-xfuU=80_b*H2>qQiILEfcf9U&3O!!`8=ZxR{Lp4=>HC{Zb$v5K5b&mG{M5>3hwR!K`~IT&t>0A&Tv^fd z-K~8`ySkZg$yepl#?=^2dLB~XNn8q3z3Y_{uib&SO3*krpYPqw27DGGO^+pcusKL@ z0dEH8HUASUuc}RAkM03^mdN%<(5d09)ZbF}(VGq@t6YEl55g~MR0jX6Xken|z?O6P zcX;MEI^Su)N(z@XQ=FEtM}#{iWz&p>cT*8_KjAgw^d<0Dy6RerT+2w`EqnB11@a{9 zg6+C2@$9df2tHlkG%(s^)QGH)E^{xjY?<;UP{iH4K2z1*lW-bg9mTQ&p(}W{P%5>^ zFXwJ#AG!aCWjrVp@0hWa?4Bo4E{|h)J0sN<%jny0 z%2RIHf-4`}-!%N~p88C~fr6uYsntqt<#+h0@!XrF2EHXY zogl+3kHD8CyK3*dW8}csDrP@pGVXZ7y40UqtjnW_M)?1hq#Hq%@VMj!QU?G*Zg|#ABsld*AP97jjA5pd zBS1+K8py;j>$r`aX~aO3s4P^(s}h4QO#lu;q(J*w9sT8Oajdj0TmodD+Rnp54@%)6 z*fMZmyP$v^He)=w#qm;ief}-xPt&st-Qe z{?Vw_U{PvbDQ0)AsL($kN@}at14EY zcJ+XhlQmedQNQU{z{&eYS=^`m zTu#!Ho3aX0^}B?!W@^%>^Vsw;ZF}iRO_s?u?6!2)H3Tr`Z>LG>un%QkY!k*)#^gsb z4sgXFx9!LdUb)$G2gSrbt)`duZy>j%)1~bnp|R_&S(nz*dex-ssYy3Jwof^Al^>IY zi^P6>O`Z)xX4|%wGkl+ir&B!?CdGj*J>rnND=sI8T^hV@Im!LR(0`_^unHH+af}a?B5_FV@WRAWfWZ4jsBCYA#g|H$f@a~PP|+d(~()ImN@|HlHjvDA}l$e}Sf(=dO8V3ccY zPp+Lr{m-`wOah_&ZAR_W|7jano$9n2{;9$W3Gj8Y1`Kvax|7;ubnMl1v3a;jHLg)p z{JJ_Ds2F&&9ohM7ClqyPfS9RS1%zVXQ6tcM^P;wzR*yZP4ROB^4LVKw*d(M2URo(= z*G3<`gis?4-<8}n4t8}hKCZ*xRfb8%+@Y3z}%l>oxIeaf1d!Esjnp8v^t z;~TF}N9a3*)TgdMA92&i2qw37^xK&X;Y4PJjB*@bF0S%m9c?Fo%ENO=F4L=#`|05w z?ZX1y!!v+Fx9grV{w1$>hx!rvob)t-@DEI%bU`Sx1%2FWpg zBi~>;U3Qnna>c6FNhr!&{Ot`=ZEus!vo!M|3J@v^cFcdR1|GpNiT6y|Q@!lGQlxkM$Nhq>{7|I>nII|Im5$|8$LA>mlEv`i7fq)%3WjIBY2Med znpsCFoBr2j-eZ*r;EIXBe*coM_`y?S{>eFjBT{2<!3<*eQadNMtRwEQsl-<^( z$vbnsGzA_OOkIgu-Ft<((tWZ>NN204RFGKTJ2sCKNW1J!sITEvw;A_Z?zb6(UDY9V zaitFR&$+#FWes8W?{5*3Mhg~zU?-t4{zLcZ6$xL9{A&>UM~#*g>w|$vIX730UJ1H{ z{YS(eQ$0=c({Y5P0H$rr@?IGugSJaSlES43Ygz>W4!Qe-Alq1$H(bi=oYVz5%iEsu zdsv~iPo$(%MH2Zny8DUchs`4@)6gMmlmmFo$-Z$+IM@hrxs2Oi{_zSR_GP$u!(3IY z>qXN4A(Cpci;?0~L;JPs`q3vDii3CJ3$@^7Il2qi{mT-a!>pwK2Ohr4AmWE$k9^EO z(kQj|%xb}5enFwdPWBpqw)lDvO#Z#47*J5jzUX9zc2psULw`%_C3eCG(`Mc3rm@Yb z_-V^unrj|1nt~^?(s>r--lmn9dxC5!$FxN~dd*sAsstLeq3tnMk-PeJo^zhf*M2%1 z!S|jJF(N939~duddH@CD~rh>=yi9V@sDi6?JZFSQ?L z)_%w;f7BpK!~tdRT5e({RG_g)6wu%ZE!yFt1uqD&`tAJ0v{Q4J-vca(7mA%U;x~8E zPVx<+H7`&Gq`5zF2CP-i?ceGP4y}v^ZVquTU+psn`pT?S6=T%Y``9k5kPX#M3nTtO zblSgdKLsg|h;0~v+@cmJlV_E(yx71~ z>|)kuEZ<$$=xht$p}4Yr>%uMZ_u1jR+{5>6i1v0LDIn$n_<$;AjJV)&jLlEQnYNG+^^{p;IiAy3^RSZq{)(#R7e{xljSv{(W=x zxkR9{R7o z=`(UAys4Iak?Aabuc&I3ZADLmVG4XtYi|J<&M7DK4{N0PCjirY$=$tOwShLgG?O!Y ziXBHv@XT+F-gnLbvlyEbsDl zMhD1N{^yyduLt5Js})&wSK#UjdMMVTUC*&E$lji6*E26f*wei3QVdSO$vl+Vs2^Ec$hPZj}KyQ6(Cun`r?duA= zKCg$LPLXw5e#J`avd9k5KNS0A9B(M(O(uKA(r z=@Mp`%a`kwc3v?n*PH=_c2a5?@*O^HOvrETFBYs^v-<-Rfjkz5d?&ZHg9ydq(;nAe zM1m>FaKmR*B?Ha_H(p_ldB~GL#&&z(eI?bTFUOoB;gd4pT|6Qf445-Q3oggbS)Z0# zmnW6w;$p!C<}F<~#fWDAwhfhBmVsBNpBAIT)gPM4cY}|PLMq`?Wc^uF%^$UhF*ZOdyqr(i$Q=Vfle+4j5bx*O7&r6RP^4I>`Vee>@^>9x6g^;0M z9tGqLTq~IvA(4xfrYT1Emwv0_XE6IA;W*d9g%NgP1FQ}njm_@~McNRm`j>5?3fRjr z++*gaJ;v9=b$F|`5ELxM+2DupYZWg^E%u8JWk*A9#VQ<$KFCr&^;b1qcqUusI>axn zfLs21T0uot>eHu4vD*Gi-ju9x?ktTRJU<#g!cPW&dl2YW^K39W_b@5E&C%q<_5k!N z(^W*lx(d@EU4^GnA6~)4;0`Zu<=bJW0O!fxDwj^l?)|y+DUnWHr*u7&*;u_@0dI>V z`lLU1kUF@*Q};#77lGJTkO)FIj`}Vw2is z!Bqk94kv+`n}X&MQ~@cC^r+|TYht7MNch2L))Gga{BT_;17yc@(FmmdCFr8K67|2w z8ko$O!B#EVSj0?KA#?BlA@-<(DDxwzXH>5uCueBRFpVV%%>S;`g}c{J9#$i#{!dI8 ze}c-d?m#)61mIyQwJsD77ek#J(0zxe{rm`dxTD_P_C1$^JE@+|Rs-6@&!cBE7yqXt z>T64+M0{GN=5X)-!#(Evy+uxaaN91C$T$l_t6mXPaP(Y|oK+8Fh6>bLBv%!(^xV-% z{qx{3mT+s6oo)Hk_ZgHO+dpVAJ`&A|+m(O0KZfU<_YfaVEKBJZh|Rh5=JYA2O#A76 zdk}5d>m?ZzF3cx}fV3oF_{K}YaG~fW#YNA>wQKAqqjqGU>D+h7Oq2E(0q)(Rueha8 z=k8v-@!T&nwXkg&-J+r1`%e>EdNZW-ZYbzW@oE`<9q~TSssY@8$k{w7@%=YCLo<*|3DAfug)rb358mbQ&A3sMsp);Ykq&`dl5IAm?*ZC~Xh9X_-V_ym6LS-0Ge~s0K9~ zug59eh0n>m=LA;oF{!5lJY9cJCQb;rTd-K(i&1osGlumzoOp;pq=RP!cr_rZ^R-HO zMPD|BT7vB#8^kic#xxZ*U-5%&7rm*uA^a}BGM2bInI}kjx3cm|zBpbcaBAOUtVEN4 z*#&EUP_CuKq6un1G^fF}8)*{6@DF0~wN+6o3J9a>O%BWmDb|61EivImcN29L2hgU->;c6mQ z)W0~>UNPvdiM2bXI%rkwBwA9H4=h#rchNoew*z@S*vzA=r`euF4Z3?Bv%ZMRLM?q7 z-$Mf1b2^9%NC=vN z#u5L>zB))@+JdPyeNhifTGQTPM4bB;NB#3C{A@>mvX<35L9*6`n{8*;oVhI6t8|_Z z4xA8AJ_16I*(XH-lpjI0IT%}Ghxw^1tggPs24Civahub!GKHN6_YKP+6c6J>REeEH`B%pIP%9p)x z{@abo6>xh;Ce+Lryo#kg@as?WikbJnKizYfueaE4?x!*{x!)tQuaRGrh>PiUm@r|` z>^>_^>*Tv+O5tH*|DcbV?k(&eD?cdoQg={Ux^joXGA((+mb4ad1i<4RU7HnIfQ4WN8CBNG_?+QfvZN@d~g^{>k%h@ z5An;rB=k{lS8_nXzrOSL)Yq?*eKPY-|{)L zR@4tr%XaNSE5J{uh)xNTn8mms2lf-B&L!Vso$STyU4mQz0=9a{x~}NCe`V zx}0QSyu`SH1^#v^{YF=2OBLxolhrBnA*V-Y$ve+FhzP7RYs{1HO5pB3VCMiV>>zeR zEMxrmKdxmxKxRTjQY2t}rypK;2se&uCuisAlIQK33eZf@8Q*>X&WVsOb~Vy;JY$aZ z^FNt89Zdmm$$R_?X|i|Y;7M!W#{CBRm+=ETt*a8D+ByK0N8qdcMB`} zaa$~$Pdgi}Z|M)l0OY7n)pgPqEEKFVsx4B6h!>Z??BjoZR3%>xnKT)OvG|}quWlG( zCE`vrm+v;>fD!KNU#HjWbWYevSoRPm8i?lA)U$pYrNbQFLmMUBruUER-XJaiHS`}U z+JrJL0y^lUDpot5{N9_O&sv^nV!?Er1AAtwB$*caR`F5LcdnAMbw}%m$1zOFK<{84 z$aUb(5KC^MNR1kXN72@<`=Db^F$uw?cjk5ctRyRY9_bvn?qlG}@^;Y%S|$KN21Qw$ zM-cD%LOz7w$?PpiE6+86uVB>Q?1}1aipn%rmi2+ycufWFO(T0P4W~i-tKQTzLuC(M zkR^Ny$c}o$a={r?4evq|pOD0y=(xAkk!SV&vS3ve-Q+LiJ(hK>&5~D^88vqs&L_7J z=3gOxrU~IfdCqDmO^FqinI|XpqtB>a-{*NjJ__De@X;EQs=y>sZWRHO-jzLv;|4vj zc7kR-+A(34;Fb-n|Zsj1twbyAr&l!g&pn6V^5NBWwV>T zYf8;ps~p>}vFhP9s0^r@-wrp1)1+^n&1zeptoN2+Ixzs-2EzJ^8kS54>&AaYMT&Bl zt12KG8Gf7oEIK}xLxNoWJp;=fo0^V>*3Hm|y5Ra=$)`O14}TM~YeQ1Phc3@tGATc> z=nMPvan`~7$Fp#Vz_^%_N%rwTA}ag*_c%%f3ZGxrng=#Git6(SF2x$~J+9G>uCiHP z1kcUh#Zr^5HR*=iF#8`_iFdG-XifbCp>JBty0E=5d^wT^x@bSn61$bS+NR4-=eXS; z$nE~SOIWmnCSceE`BI62B`j}IS(rKPFI-d&fReaSw~u51U|2ZM;_3I8>tJ-KtT{W$ z+1ZR!g^k^ifmigok$M=?uN9* z7`!vKEX-40$IMqmoo7AiIvApcQ+^d;s2cjVM@1|g3q~f5Zj=8qrbuvxI1ZQG!5?iQ z>|=XLMm4xzEG+45X^Ax;cev(ZLFqEmAu-hJC8C{?EMjv$Lo^w~G+P*pi!O~(rWz}k zKz}JnAeeXREZA--zHSp=JhEH^L!bZ9!VMu~d(D6+<{Q%+wMW6QJf%~M#;h4g>~iU0 zrR|FuVvsX|FgQ!|ke5kKRB{u}sjZ}1++^k6;yn$!Mv3%UaJAiCY@-!cr~Au3l%`0I zHQ%#d>czoZp4__jv6J{i$hWaBC~LX4huTME;G=Vl#ZL3x%g?A8FFi{JfHMG35xf7J zT$O-@R{dxvz_FgxVVlO#1^0Cf^Jy(5U}{VR@!RD7mLDz}`AwT9{2nOiVODnrg0n2H zRrR<&Bvrud!a4c5S-Jr`!)X!n)73UfQ{CtXFap0B$$fK)&B_W>0rflQ31F|zt~Zc1 zDOhA7P-jO@y}N@xj!3bO*K?XnIS10a6tmtNsc_{{3#s8*JTi5@X^)pSsW`ZC3o!;a^?k$1lPyWKygvtok6h4EMoW<$IW&|0q|@~Uoq17`Z4$9`WuX{-5<1ZLoGo)k)3sQEYBW$Cqse@BAaTkN_Jm-E+E@bvly;cY z=UTSpZAqsIhUE7M586sLT?O)PZk8!|5KWhfg!2p9c+VC0~xOqfsIbUz%Zl^M7WC)%8cq zsOA3i?dkU)M@y;}y%jTaMQ^+P+!t{i*Mx2QAk-%n>FFm;g- zcQKadF+h3DJ5UeY%CK;cc!2+RZe=q*nEeGL6_|{g-zVzbVgRpQeMyzJ9cz=fgVrTRIhzGj>^Dcg99nFmL zOhGX<9Ck^M`3f}W3U>1pG=sp&=RVi>Zy;GXIJS#MbX2u_U-Y^9srt8{uGF^nypNzJ zh+b_yrLae`PWL^?}S*B|H1Ox zd(izxiB39=$gJPk*!qA4`Gj{lsht9J+I2}fK`4#*oUx?j%GY8K=Ud!oc5e7viYbZE zsjoj_S^ytHwa*YMBBvaFNdMNYsv-sZUl5sNP&mx=uZd7kh&&vOkNvBnCZhNTj{fGx z1vzs=<#TIX+|a3!5E}8nv~mXZN8N8@w?*!rILQojRv8cYygl9zuwj&J96hEWCAPh1 z?LgiJ8@;+0`Y=4}!UEVmUkdM8k03j{nA;>j{+0GX#QgUK%8=~9$ zHi`TYHE)6LSJ&~87lY`{l!qu%5yNjc=ADY*=bO5}bTm>fe;Q4Uv~lO{6E;bHq7GED zmno6o^1qpm&8G;+VoK&OSMp4UQF-EJN)-_@pFRD!N?|4_9Tq0VX*SOf@E_dU2$o*i z0eUmy8P=%P@7#uA^G&92iR>c5rR&(!Js|z*38FC2Ez)6rmB;MvLd1v5KfaM}EWX;g zVXWpZ^P4lfvKzT9S(JNs8Yar0wnaC*MN@rIGMV@_jP7zRI!jnEQ@!*qa|jp53$@v4 zZ+=uTF~4?Ga!EMEeNLgoT*_&>s^n?ZVW#t*k*d2VcWEzjn;9@c9LnNP{@=uSM{fqT4|qB3d=Xjd4kT?6#e3rW zF8Qv!g9Y+r7xlXj{WOagQ8p&A8Ptf@`4}sqaqxME(<@X?#_zn41ts-b4&N~(5I-!X z84=+xLtoaXV8zn@~igmK9o&1Mg)GtlmLpjg{Bp< z24#epFAcEz&M?1iI~Daf5%dX{Ce88H^cAzL_9P0aJy5xU0Kz<#s5{^JM;0qUB6JTh zuf6&qiHy1iXE!6&^u&z9ia}3_l;(LQo6s_SIsgCf1yIIqa3G^eU=~l;L^))UPWqUJ z($FCks0hCyBzVp?I#0cq6vL2EH-C`upT7nDH>{nW1ruEdK!WiajSAMDRe?I9pC8pb z*Q3NX=dY12NrW~E1~SdzL=2b>w%mG*>Gg+@FoVTL=Z}K=*KtdJaeK1N54+#@ttFWgh(u4!YstWf*)oxm}MTG9S(@ri^+4OWrAjCMM?VRagZ`? z_$pp3d>ipqi!<}1j$ES!E>e^mV~%UZnW9@zdD#g`*C{^v;VCJ@t5-aM3Q`SZnAa^OrSM+}c2|Vz= zS6lO#($ldbbT9TMcGtB<3xGTmcEW-TMivW1PPSld-EtLdOXlN|e#c9yd7rSp3p?O- zcVpzp=GO*c^m;$?WvX8i7AQaN`L5c&&IY~TY45cLl%fuz}jJ%vgPaFY#evbdspdh+vUq z$Oal=&oZe2=HBZn^O1^>ZZ}CvqZkOLH}VwEimII=mcnP4C=um7=(XsR>P2}&zVDCX z7vG4Uo}#Bf=YRNN53N*IqK^!S!iEHKmt}pp!4hll6GjP?RV}+L?iCk`$DQyzISAgL zkGvogAM(XjE60x#xI5{@gEes0Uxoo>Un`n+=}bY(=5iEghH8rx;!P|*Jvfoy7dZ5T zkA07XHt->FvAE!J*)O~Oef0~R3GH*9e`{S}$$-V$3ioyQvi0XqE*g2)@X2f-_bF%ze1J3|9^-feLWBv zw4L=jjg%kEf{x#1XZ2CV?a&OQ&XdZT%uUfEf3fk3C zrI%vOwZ{~{jb5nlE}E) zdVBDdZhJq4l5*6!t)T;Cr|)JbbhXU@ekCTj?Ug-dK$6+x<4N5n42p zb_f(2ST=vfqQ@QvqpKzL>kZtf)(8YP<=wU)(yWB}3YW4d%24D(=X2M4<9VLP7Z|&_ zq;Nf5hBFY5ijn?I{$7lvMKp19JRBr1(vc2Rb$Bg^Vrp|Kk2qb=a!AuweYv&aG z{jM2TpDj12>wKRXm-@XfZO!s~h~um01f|v7L^spr8WzjVHti!eL11{8$n`~T!?k=P>nwx`ZnZzQpr@bjp=Mn|iFJv&#GLZfqCCdN7mR2NYYf+#~G=y@xo$o$Y zus(G<#K8PlCmX43i`sG5i6v~8qotDX)7*pky=&hwl7+7guhk$W0|0 zSg^KUIzrGnt3*6mCjaUZ_6;Vn zGT3Ky-ZgR(>j!w)|hSsZV|81d=3Cl>s#-8)ebW=d8(Q*?_Z0N{fWk>+zg;%GjIjqQTtH zzFwK1RsDBsQ_s4m4&46N6#|D} zx@2XwrQ#deUDCXVg)7mDVH~wO%AtsUX%ltSO@10{{R~wErJa17!sjZzl#gA1=B4PrKf)c?dhP)~QK=byK2ZLuqn{*|9PtYvKUOVn!S$yY2YNIv{be z*Of>Z`ns$53i^OB#iUcxh_82i6h9zjQiDG5lw1>@7S%`D=N%OXJ8IKCU7<@|DlVO@ zP49q}s?d;WZ7LDu{11LNU8)*rBYl&LdOoFwcM3YxO|e!$G1@YOOf;zkxySO@t~$?? z7+lYofn>FrwILlFbI+wH8HbzeS(_D-cGj?D^rG z|0>q4n)O{gg$pZ&(uew4Rs-nKT`O1P`?tH!hxTg?vp2ZB>_gXqikc&D5?|u3kay(N zvpMcr;tI839&(-nF-tj-X|7x)J$WO~h;MGQX_C!ubjJDpZ8JqpK6P)Fo1}YpEGa5K zl!UQPewn5{@8emf2AoCGr!%CZsdQFIxxQKU9aTkLnl?*&Gw{*h(q(vqiOBDMi;ADU z=q{hnBiR>vSzTk8`I>dP7r$oV# z`@4_rrwGs|Mh2S({@3FIkVy+3+I+BwfCD$bC$yR;Hz;ndQ!d%g&T&nnj<82Fd$ ztN$LK`TJgqmf@&$2>7a2z$=tZPL@Gh(ih@d*0{_dRp8Yt6PA!S7>L&KdUA}*t4HY% z=!0H%uwy60`+r;mc=rAIhFSFan+fbAA8RM-M%b|vj2~dx`o(qO;`Yh~HgBpreSX4cRpZgd?7?!J zT$f$X&$BnA)%XI030M8x2)EHjcHuZTdPkg;vm5Yd@NnHaDvv8MWMcA&pxG~_~b$z^!3XW4r~RB-=bFy_jqHkouO-?6(bv}Ewn zccPYT?cvgjQJ~iRi*Ro6m6VuppLPQVyI29I55J|rC{V{CC{S2@y^3)GL0;$sE|UZ= z0NbxxSSiOV`h!hq3^OoUkTvg3~ny^khdf+6J`xau0 z-#vQ9Yc^dsox%PZgi8(Nyf}SnnBs01Ip(r(ygutu)@pZrSVB?=-&UiIl1{%(p7MT^ zCGA?j`rN%9wd(Rk?KN+>kg?VG(nh+^p?%N&(-2%vj2>e&-iD<0ZQgkZ%`zNBz+U$t zvV?5Iq?(7J5X&XBl0en-RP)6{C-3C`(&O~DtZl=|#OsY0+@b1WczT`8AcyH|Iu)H& zdn*4e>Os>qf}`a~v&w(mJPJ97*2@pH>R4;dTp85LL-Mncz{Y4-^}NvyQ9j(mw?_qk zqihWQ+^pX>y)c#PgwCNM<5tK>lLfmbmQ5k|E;W|z?PDSvYvpm|M%%y%osGAsgz*^A z2H_?!>d`u0l!PM>-<|mvlTQ%Z4St?k&i-9wVyWp80gJZDeMZ_G1DqL@v6$C_G zeEEw_u*O09?yRU)nI6lh=UogHp{57j-K8-%-{JMhCud%E{&ZM~dyF^#=Ps|Yt4|h5 zwzpS+p!VKew7+E}zQw%LAkMK2VP=|?N&#j@`C+4lMrdNCbUyk=8lJu1kA`2FMw&Fy z+^K=%J63U6*r3_)r%`{@t;*>OtpbaGOv*Aak0&h+^~%13+O0X-4+gC-M!_n~)Rij% zq)1ODmsN_86%zA8)^(|wXj&iJoCj5UJXQAEsRbPH--#Ob*5D@(+MM_sWcUv5rWrOh zJR~ens|~^MWEy!t%r+GGUxqfD+1i%&`sWupvmNK4({+`wUMxW)yOO`{xz%zOBaiN( zjfkrB?&5bM4Frr*j~AqG8{X{b;=jqu+?VVeKIUAhv=K^o)1AA!OnkHgD9EarGO=9q z*mmCN>$6IeO0)j^Bq<-^Rs$;*HIAx=x9tx&jP%9-hE&In(+!hoV8aZ-1oZy*Z{H)5 zV+E^O;E~QbDoIhHgsAo+1ai_Ae9p_PLfh&onrgCJelWPHv!!N4+w0iiwmfRZbv>8U zgoo8u`R2+Mg(N#>%ql|Jn{D;K54SNO8QT5=KL$y9+TW_ z4PgNl4cd&c?(4&<0OZbLV5@ETk{fWBtfEVQS(6Mk`X0vu(n$+2fBe_R$qpv#m`w0@ zhyjFUNG{3m{1qU5K*(eERiX-P&dp$))-jPVF;{m!t{AW|`7*)()--q_fkC_L5jr)C zK3@xeGLRPc42B(kw{ffZeJ}K}`~e20z__12!?K!l8gAsOn92o*O6tcA&q|>_HhW;e z_!B0*)=2&|D3B|%D^PIjh-&=shQi^y0XDnXDfcNJ)?f4@s7nr}_a?EHqzDdB3FbNF zkCh(8y4Z%+M|KVo>86Iv{2j<6P1W(-N9In+p)YVxD|vv(TNi)6?SYHzah<=!3ncBv zLQ5r%sD>=OW*Y+o8H6PNi4SCFUW46?zfT;Wx??|W9@AXS1Ny*oUA;ks-~V~l)z*(w zj}1ZS)?X*z!>}p*+aNO#lQ%+$eA|jqz_|hY#@4kn*}LP$@_&yL3gy5>KA2Auv*?x{ z4g`o7sMqb=89f9v^LwB52>gYEV7*1(-BgnuybdzUy@c|gbJA|c-5hud$&=`Uoqbt4YmgCaokShd9zIypch|vb zN#f|u5fH+tEp%hTqWGV)d14!<3a^<6vZF|C;;Sus`mV>lNI$XsZ+HAkf}~=^pL%q; z_|MIiG8upcR+fsm#zUJz{gb?(XIkeEq)-BlP$rys_gwzGQBb&DEu-6r{M)aEo;8t%u=M0(8fOAbs!_!ql^dM%7uuz;9Pi==5M^Q&~g@A!`&x;=9LQ zyt3qo8#Gn8-GR%JSj`Y4DQO&gXir$TS{F3eN37~RH+15cc?6r6H%%r+A43yX%)1e3 zl&v1olh^fUwv6xMi)g{Lz~PJ{BjcF&JRImC8tBT&rqgKl~aO`&BHaYvaf-@J{E!DYNA^^ zzw+AG@!?-k3TER|jK`q)Y`n%nC3?4crJ_D|#w-!eAjbIz`qzk|6++&v3U~QnHv4t@s-8kTA|&By>WVR>G&ErsMV{l$~o>jklbG;L2R# z&>xKuHT_}u(i|lZh|l;eOO}emKnvx9+Wk9zuE!ry$U^bOIu*^Ye&XThj`1TjY9fM& zDi~}@=dYPP4%6omo3&WfarFE5MBBMk2?qEn*@Zdq(UMe}DHte>AB*IuEC~-;4mj{=CyUA7XdbG2D-gALeOFQ>C}o@6wvlntrXNKqUpBIBuYf!71XGD`&#z zi}QHAWQpFj#FW#?$g?6@Id`Jf!8iZh3hUxcV#%B0e&_?T(!3+DVpFRoNG404U3V{* z*I%`WKN#>cLmp+hPR6j#&%o1?(L5)-IDLWFI_SA1H$s5b;LY0t6ZN-+i=r4og zhF;ghk?==(q45C1jopZ^K>e=i__H$SgEOWfRihs*g6Nfb&QCGxYCHa4QS+R%T2@yD z8Z}z8ug1WGHiQn#!LxY-29kxbAZ4S8_Q>;@RG*Jfs6VmnoX5ACI*u4D==@RH=s;?u zx?TdGr;?}II8Mn!mj(}}DUPYtV{zWueV0)~$71?Yg_73${EI>;PUad;4l=lh|p0xhv}t1qOKOv6q& z%f9Fy+tX9|v`rb(B-zecp{wq|{VDwx$&73Mc^MH~kD!)1&SOa@d&9-s^EOfNPc4BZ zz2sa9iTRf6S{Qf8p$3YLtr1(DaS?m&)sm6=KsYlZp3a18% zwM4?ITOAfgd&`bQjKL2t`Wd%7Q#N$?rlRV-8jO8I9U`Z-RaZB4{1Ls;|L2v#=p}1~rZrv8LF1 zoOxz@@V-{g*rhKCj(;@@8EUnaP@oG-9kgSP#v4LbGrg+p4U}uAk7C=^1~_ae31_xvdS-c@PI~Ci*!5uiOjjO zH#BwU(YIKOq_I^?|17w^Fue)$b=dY{;`;xp-s(!lc{Co2juqe?<}I*RTlP(bRXaJ0 z%~tD%A}KETx|wmdtLr68|6Bm>XByp>2Ty)F(9xEa@7r7{-^EOKR-?>zGDq1+>Dux- z`kjh5rqTo=OU(kBN{53rQJxw}DSVz8i9L(D{6TFxa2J?&pJh@F1r%t>M6e0u37H^$ zPQlaqOef&fhnuB^;%`dOGZU6+3C=4HE$s4z`u9hiK;NNpLX8On?9&%nmIC%nVdUKc zsEF|Hg5+CImTQli*NQm7dFbQ|i!yuW9bDVfu}k}KMd$f)~%nVC_bED(ez z9>m8^kSk2O1%eU^*4_()22nBiG6qihtVDSpwjMZDE{0-8XVtRaFX0&lBK=wPYmg6J zk9WC#6cM7g*P}f2U>#AzDw3(KanzB$jZne@#JY_q%mp(Qx|F$7Sn|i)*wlxhvMb|W z*514ab5z7C{DMCOb%!w1(a^Zr9+HFV1(uM*2zCEck-&n}1G7i@q{+uPUA6(;Q_H3u zJMsl?>q@)#p`N_O?f;1d?=_jLV;92j9p7J^mjWdR!T7uD)dC}YTT@Q)`2D{&DS#ZX ze|c}bpwnH2pTm$C*>744o|Mm+#c#o;35(*v|IY;xro~G{^I8j8G%>F}9OfPL%dA0H zWlL9Dj1)5pmsi*G{W(C-{z>WhadzADx=Ce~Cj;5e@a;rmRwx#mclU6TZq@%T_Y9+D zx3*wNSolS8K`)c`Ne8m&UAu;a`OeDpiKWMIilWxr*G)QA?w_H>SU?wM%7!dvl%fCh z{!yQ&*ZOjlJ)08NU8{R;Ic~6P}u=0Ic?<) z1BV~0V!zYa<`%``+_)w%kLBX5}+wzzXmI@GmtR;v-m@H-5 zQmF6JCxXvF8zmDqVBXz;<={S4+0L1N)kt`elrw4Q8aY-LbRZA_jVL-?1z%heP2UlF zIU|$*JLKY3lbQ_k;k9}axm*&d^Hl>xJbD-a61^sJSN)f0o6-p^- zrg!eJx6mlnm5nMe58ndOoG)9 zy*ty;(s#}S7n7?yuWLK&mu}4HCl}+5$iSPLXW=|Bn$!|!$=WFR$VFpr)cDV7>-=5g zQ4N2;@9s_T&((J_V_<>{xUU_pY=6MkSdW%<)#64yuW7X#4eF*5RaWL{#pC?z+S6$) zcTi9zZOy))a+EExmBLfBq%F?w#46Sa{(!saLqt%!t6%olCn3`I<8FD$ zpQB_SYewc@$ATD#DO7Jx`t=HoC`NTFc!ra$og<)|65IacX)KM9$STgN1(F&Y=S_QvTiUimqk}FE31P5dBDVP#*4bO##4seMs0U{r`Ib3~?{HaZXt#2#~Q;n&ym! ze(%~E0cd2Hs2#nsUuy0?)nV4U17Osjen6RrRA&Oj3+V=G|E zTsxf=`KPDMho?cx_zk--s8s2{dtHCM%i(yD;@|b^r-(xV2l5_!R zIf%Rb)xInoqsPF{OCni ztL|s)dt#|22VLNPqtj*kwkD^}``-C3dw~A?AkU?6yH$DRkY9a#i#RW`yn(5gRy~R~ zkMVP|W22B2zGv36*8F~Lq*8NU<>VzT;u~t6P@sKv^zY3}BgfD7@!!!pxq^#gvQm?^ zD;4!FYT=Q3$mDZ*DGh1yVbzQ*n6(V?Tv7s8qiAeDTD9x6c!acYBp3jz!`7@xb>29T zv0(<&lg6_|czGFVCsMa{-&zq*Mx1jpy#CpHwC^?|qt!+XScRM?)`%Z`VJAePOh}Pw zF*?}xenU-5qE3#P0T$h7*8F3vqB{@wYTT#$$SUcd!ho^WFr&WpeK%9WUf)HjNVo|0 z_HO2fmzFh+%a|SRg$oqBi1{QEs#4%GN+(NIEokYtj@zMwq#9>9J&(UrNaLw;l{rOg z!WNUMLwB7Sbzlmz)M__HAyg7^qz0S5+ev$^9YjQ?NU7(CZ_0S$26nE$Se(r=$G8v* zOfn*gyf)hB(=&oF*1YBYlKOrsce5PDt?rE`Z%&^hGRA>%{6mn)xV$*VqV1*;~~$Czu*7aT4pYugJ=n#Rkl zE@ng)+o5UODdI54tj#D4)O#Es)7`;(J(f3H^O~4dNuI~$H3%P`eeL&eUKVOGR#r=* zUUgWeei##Pfwll57^~ce=vL#rzLjyHCWGOS)-oT|(KK4-0WLEQ;E*fQkq+lOPXP(! z9{^)bx$>E7U&JNZR3R*t`j%dFsKbH&B{2J8H3A#VI`K3$tYtftdK9BKjZ+e8aL)E* ztp#(6FhLTN*Re5pdiYCx%n8Zzm~0_cH$^h_EQBipCHO6~XBE&3xsZJPhI8{2e_-PO zzIuP~Uv+%2%7|@cQ2;Mt+*fjz;_a8wL>F75caz&(WG`Wi9482-CP@hw%)l1Sl7C7^ zOX#eS(*(N~WhZ`^+B=dUkuUY(e zV`7s0zCko_1EZ5zuG}%oVpWxmA4B=zSH!4I}q}C983SYtr~QRuGslf_#W^( z9~2AXk~#Mb($$glmkv0Yc=Q9n%0QPALZ(TM?S%pc`C#TeB27TLXWQ{HktU1x7Was} z|0AcM*KYcC>N(I?K+b9lZfxcc3xWuGFU26Q_cXSdXhHr@7b)fc#_9_^1un|K@cF*J z_1+dMHyIi<2(pO^%tVS&wam-0qosJ+6~>3Y(0hmR5sC|Kg&p`b^sig zC(DUrzmH{vW-!-#+gOLf#W!Ed9`gC4vpM^$wV+&u%QXi}RoAnBq$bpACi@tL3tcbT zD3F3g72wir_Bw$3Y9b;Tiu`bX~;X=7*zyd zvPS=IOaI!*6KhE*YMexG{}(`U zW{~~h#cDVNEGF?$F=ck{$XRs!%)}H^@3j{KQ0QRQ>tIJeg=7BCmZX4y1?4jZ)G9J1 zMiIZ^O|+N(LN=gCU1~@I&iXsO)>vUyZ%*Fuym{7Ew>1z(2~HZ-uf}hCkqK!GP8gtq zaXOu`p@--EufvdyC{oOU5_{ux1}bkJBUc`Sz)F7q+aoo%^FiN%pR2a-k!~!6d>SFLJObP+@JDDu8t8tKEF_Qdv+fNNg-(J`H@7 zO9A2!)2KHf$t``q7%zycWK z^K}j_#h1Tc!0YH2coEjoB z+1_iukZR;qd+z1$ld{=5Yi~Q;`ovm_=76(ce)YB3mezLHi?!T#?DS4uqHu@5&QSkF zrU&GKFSHe?bo%0vvFQQIZB+JIbyqeVQ9=A+cDZ^!SBn^c2#CS#Eface5n8-&tpSl} z7|a*HE8U3zbp9Q@kjye~?KmxW9vT?zfJ)W&JXWv1b6E{^A65@6U#iZ z)EI4pl(K3`06I9shLZ%hLS)*faT4|==)ulDMZghJb$KPHER#r4KbPi`pgDR2OZTV{ z&Uu)y6bxfI-xQ2R=vUlF37b%YjiQkGi2xJcXvEkH)7^N@dapfmIS$=UtW9@^i_wXda) zJ02!q zM%{9Fy?rN3h*v3$SJ`G(OW47;mY?g#k>Grx;d~xB1EzTf6kVgAI}5zy=LuHoO~%}l zPf(Px*6?bZhb{eK!yr7E-fkLFGb#B{H2&om^L2LJSI zpiMvo>VvmONnJ_Q>Ld${)jk1v)5^b0G<4^`IkEm-Z-Ly42^Ra^WJ0bI1IKzE=@Wxi zFG!*4cCADGKbPO=?!@u!;IOwz@ay_I!})ST7~x%6^r{c5QpU1ze!~>YB;t~dj{5|C z#VNuGD1`$t(0820Y5JizmS~M+JA$&)cvk45AeC9G00z3d@yDt4CZ*0sJ$ig z6NCH_b=QkK0ZE$}00!!HTeDewl(mSoF_Ot}8#@m6q?gFZe;h$yF57!7<|?9D8-qF( zWNNL=SWNVbbc+a4dWO%kwlG#di!*WLv@luP2k5poHf9r=B-HWLgH-L9yq` zx2Mx9%3#{OyVp~b-0MbJvntwLr2GBfAiURYznJ-mVlSqo?myAtM$pYrz%Jw)@epKl zd)4mOWcu1q@5&vjz$C9jXxm>opKP1XVT45Sek=y@ibMJ^5g0`B{(rUu`z&0_o?4r^ z>gJV|?$_P(!w1Or!yb~?%e8hTKH~=GDIdac0Qv*9H=)!npXvMyt2}rE9bWi<=1HjV z(b*U!%jlz~O6^_N2!IXWSZxRpSv{_F&d2n^@G}mm2Tibn-tq?5PHx#L9x~T3w}y{n zvCF}=*{;ctcio16WxeeLUpi|VgU0+l zDU@|v4Vv;*urY@#bUz8B!uA0r24WoSPHvjI>Hhv=SGG3GLLBvg!7YFpNuHsJI>Am8)nc6Wf@Ez zLb{lNJb5=J z$V5(AY^E@O-t((#J$t&m?i@spo)Y;WWXdzAuT^CCF6fO+2EM|u8;?&3%AS(i%UC|8 zXNi-@DoQJxWX!K~-`1Mw@aA!xwtE-1@&hA-z<_ zHCyh%>Y?lf&PNmoWy&R{jY}N-C-qs2l&T?(`B2)Z_(3KPe8;Gr-sduQlZgJ(q|lwj zCMINuWNJ;Tu@ZxDWs9UkXIQ(Qm%O_X#XoO411j2#0F88oJRNI`B4=hEEM3^x076)Q zM;c(t#;>;o5E68FDtjkhne|OxG>5dByyU%Z$ny!kE$0PxLdl=tE4xPT;!Vv-rLJM$ zFxCxL>$|s0s7v6;q|ta{?haeof$DFv1ir?iuqCvane9U=+cXFiYK@=IF@M%709WaZ zb7(VWb^UUPra8aWV=KRXF^Igwn+6EjLuRy1duq&h`jLwm%-XvOHw(`8_DK%W4|2Nn zT2Nf;JWR@NWSACwLG;)p2A`SLn)Fu@{`LcXZDV*5Ezqm^i#XEx6BwGx7Uib}o2rQ! zbnTRDSIbz?Pn8$yUefeuPn+OU3L>4#m2rk|zq*NF_KKXdxRBxwbMoCFfMPz^&1G-@ zjH*xHu9Ia>sGHbEv^g3N%{k6(fW@J6`QzGH$kmZ(WCEN2>Z5Y_#w$2mbszxsn6yel20&AIJBOrrq$)} zW8u)csf0O%T2nhw){foL7Ri$Pk}pYqSVNK$>Ek-o)rI-D-* z+Ih@W%Pbx6#72a?u7UF(4ApuX6z6KI&y87yjJ0``Y}O7tsiGXX*m>m{G?=Qrg3pI! zmMomZaJ)Js9mT2X7;p06HpLS7r)yxA;TM4r!Vvs#izn^&R7|wlv*b`S5|rHqvx4N2 ze!+jI)Tm6|nkUqNRt~nFTq<~IWD^TEJ%f4Z0V-YdN+r^{2Or?4deA*d2UY355?#x3)aIo}J&S6DH@Lbx?y18$Pn!wmbmfnuy3)moqkv4zv8 zvWWd#kXjf$N5sL2p6*BfK<>SL8$P9p7ef(~%S-yWL^-3!i>oD2shlR_*b| zx#E2pO!@wojkCZ#x@w>z;1jYfYOWoK%Ioqj$j`%%_2|DO9Z~NcD@5V{*%($l>x?M^ z9*^QJT>*K0MurDkoO!a&N-tnY4kQ=yruu$6(IisT#s2>2v}Wl4VBI)00Wk%is*;0j z^JZ@dZ&bl5`me5#v6aN-gLKkMRuTx}70hL`F~Y{iE;ds=!tC3*+1%=L!2gVjPHpxAwVKII#%G&e9E`+ZM}?J-w*Tf zeUE_@q9F4P$AL;7S?K1I83Gq42C>efw^=U04$aQdJ77Lp>0+_l7pmz1b3McU^q0VS zBie}6<$Ew&YvvIJc)vdH*lHn)&&UG{6tQ4!$OMHfzMa8NflCH_vpM-c#Ny@ns6Z-4 zt&^aWB#tmvD~@Q(_?;Ebl~*d{5Q%nmnD_Q^yk_WgtleczIDZ8W>;75yXwwgZFr^=X z2d;&8?O4B9KeggLdI16NHG0sbcbV^p+iq9_?|;IW>h+h|bB@VP7pYCvv}WLc8UzBi zonAKN&2Yx6R-D%xe7!we`OcXaGfiQs2hG?2c3y6TVl+Pv`(T{(j#WmYbNI+p|z zJ+#jB$x6IMJU8c}_=c%I+BPSBqGsnAR!cO@fbl;PmKQpBtr$I?&ZJ4;5UguJrjkqk z?$cu3?BEi}Era~E**qL8HG)os+DTinD{2!m9mTRp(vTOiF`7d}pMsruNGR;%B0m>H z0%854{WkY=bK6z$V?6GT+>|;8t83u5puasY`x>IY5V$x_^swZInj|qqT}N0`(aK)$ zt;)gscjLIY#xd>DA+bZ~76>;__8PfSYgq}8QH)(U-6@^ejWoSVY&9vvai_WSQDUQ! zcSP|xFAVkoQ(*-=OB{EczOq|)oX`0}yesF*x<@E9z!P#HK+%G8=;s|VBmRWmUIKSY zRfz`34gDsJlXgN--!|tN)&)O`vJdzV*>RcMir>ZsBIXC4W>!otI~FNh6WN>A*{rIn zs#y@3UFX6B29tyuu<;wPJ^K9(>gy55*)j*f!r>UAEdxUx)Y6Q!7@ZE%WFy?oVo)0| zzwi4%|&kI*giNY>t5X8(=S2B(-^)sAK!ETyG04w9WNTtOJr+#T5UGv zVEbjmvzvllulTcZdK>E(&2BMDO@^kjWE@;~tY=QGc;?FXH5eB8V`QIqvaB-}+5w(=Vax%| zZvmK2Ny%HJeXCv#F09svFK8xVwV2>+9*G#^Ydv`oA8u?rhSU8U-@vN1w4P(014(+N zR|I%y6X5PSdp~3G{{i(t3cs@~u5dOGe8YfVmu zH0LeLw&n2tgy527oGCQJ12|aKEY=p?&Qt$+RH2k&d{i-evtaBUP*FBDF;>)zmg&h5 z?;}bpq!cKvD267@W5$Bz#foZF0FiPyAQGs?1)+_M&j$H$7}z#oltc;H1Ngo76k4GV zD!lU$143y+6se!eV`_%dA~)}BFTtMV-E~n=YC&rQgF<3=00pZqeI6RgRbyFovG0l# zKv1)`8Mx;xFE1`Bi^N*Eu~&;VuP!bDCooL?j`t~7(H#D_>-*PI=l@MhL9DikM2 zlMG-J2mudHrgYXb999S+P*N~otSJjkh>_RlTg8LUS>9YP@y;WK-a90;VF(S;y)z8J zN5`^mQ8I9Ty{0mPqtSqv85N~c1e@n;&A8ton~p2y z%LNZlj}cPQG&R=4toh;UQQnet^Z~SFToznznDp~OZ0kaQ06Q@Rz8&9RFOj8YaxzTw zjpHHyWdpCSD1LIr;&R3KWHbNF2hTPP>G^eB&VIx6Y{b>eB}WfNsqe4vac~c`mK>ZV zb)4C&CF7GJqrA>MI2&{Qa*hv?!+R4hpU)6daP;Va)jz!A=%Z6)p*Xxhxuto=z6?UZ zxNd+U0XTRt+WXnenEeqUvlAUXn)ctL_zIGso$JZJkRu3q_1UbKINq2l6(^6Aystp) zi|=eQ$^Vj{V)l-VzrudNuJGt!%+)MSi1rB|;PN{Z_0I0>&hG5a-k;ru`+9#v!nd2l z^uWIx18CgYAFaQ9{*`Iy&VoIX0>=>C{M;x*$xPvE-{BKSxE4)0Bn zMsaX2ff$yTHRIy}%d47$vvCIXjgrjXj-~78*qy`qqoV;`)3Lg4`i+;#$%xArOQt6k zu6=+iUf{cjsNw~S%ZBmMkb2QFesqAfp7lk|@SyDLWqdSXr3*$c=gjU;VOb~H-W!A@ zk?lm)XoYpjIplWak`mh>Tc*IbQutvl$^LGf-gg_!clLg)>*^ltu#uIe|4dfQ-b$ZQ zl-RCDO1&q^x|OBf#)%>Jac{=iNWBVCB6gj8WR|@hYN%a_vKSIb$#yj=%Ob`d2DI-} z?v0%7ZRJ+l?3EkTo&@f;3^4=lY?i@%y9_tW{bSW#@c!1i6H@f@yRfad-Fo%T_L8=n z|326~ma=zA9k*S_tE;Q+Gm3$=>mUl&T|=EnuCjzHtgXn4^~l;bAYkpbgGKC8xh|JW zsSN z_a^*5zx;v+#{-;?37odGQ4oS-v958}q4StvyOyFbEZ57vF1@oHjt|i)eJ{(B;5&R+ z0;|3HoJ_|QCavcSV+bMQLjqE4{x+Z$tqYuOXgf>2!?5L@r6?;x6!S)v001BWNkly6Ue_X2N8E9Ecg`~~2C3!VzKGF^K_RKzKx?<-;HWforoxy4??VQWZGk1; z2UK>vc<(XAAhoyPky2v2Zm%6FrD>aW4`NeF^-{S?Nu2NKnilMc@py!A0_7D*M=>mL zp`$co+Garv5>rG}lnh2=XbXZ{&dteZ zAViH>32I$XmB$oj4N>Fj2H#Yu$|6L`^0Gs6g2`-&!Fv`L9;o-2gF z#r<&M-G16`n|9aMiGk{tyq&dgr+r)A8|lWJH-PmX+cik3Zsgsel*0N1fNh)gHoV=L z$K|x^-L!AXdpF$WwBLDOJ9)dV!^)KRrWdwfbzfgo=ey4f5^&{R&-2!BA+jG)zSUNC z5qb(E$+$;dK;eaEAU7$ZfInEU`rW3m*m zX4P~UC9&4^0Kv{WVvLN2gB}F9$^gL5TIQ=2N{PMxy=l`pvaHtx2~BVeCj)Hf=!8ci zkrj9^x%y&>8p<^PP?Ghk#rep3-O)9cYErUZwwOwzP=wivqp=}euUIvf$+Y6K3zU-q z^F_;OGQiJjg3(0lm>PjEE7bWMKOW+1i_ntQtVLIfYEV#Lw^X_ytUYJ}Qcx%jN+21d z6yOaut}&({2!|>Zu5*+Fjjb)ttsur8a9$2H$`pu2M;sN2jkUEzr!W#GqXeD~LE!y{ zl`#-PKpV~BG%@)!8MD936r7&F?-~9!tbCi`{x3pnJ^$^0`Bwm3Ef$;}Y#HX}t2NWn zaPRx`%L{(~!7+dQ;TeN+%W_jU4gcGJ_?V-EF&{lTpv+7QO$I$SZOdx4#AuCCib0`z zX6AMWgln|PY`Os#>LleY)msdvdttX&Ap@&*&7cqr2PNJ)R9O+bIVhFptVx3#aNF;& z7bZ;!!C`I3dbRJ_*ScVSl^%fYx;;>@)>fe{%UxTi84M9kjc>uWw`5HK4|<)-_tI ze2BOP{e787zs6#~`ar2ARUzrzmgz6C&Tp^XB(#Y){_iClcfe^ou{TyPYK8|xhO-6j z=>cwi1|%T=^wguZWO_D2X@$3*a&*r8e9iQ1%=$X*R}W8yTd-V6$JoZlLuNbd0Y?wE zWAvWFPlW3ibEc;wWIF4_;e#=@3)oN2Syctcz?;v~`fsvo82{{R9{s9&Ml9(W5ExS84C#mDHR8S1SuEi#8u{_H@xZ-_M>*i2_WaIDL9R3=yRz zZ$3}#e(7Geb$j;YfLEW6xc8GK!963!X-{eCOn_u)R#0i**T>2n&V-+aF8)Al}* z9lWo1_{~y)O1_5;;RAqn3xb|}Rn$AXvpc)9JA2ReO>|zr4hr`6=!pWHN(EzCgqr(B_dPOx~(`cO~5VupU-8s*qwiLU7mh7AXx1WV~7LVoZ9Qh$A`SRyv_g&f%CqXq6-;-@o=_eJTMHZg3n&f`P*MV@9zoVU^3?7;+nJLBbKW* zi}?Z<8ju}A8iKb71<%i4Q5u~8BbLh*Ldpc1bB-85AaKDm z9E@1kD}r}eYZEAc=UF87yg*STAiWQch(ZWx90cn*7;08s>;VdT!}RAoWbj{%$tfL( zj4Okbg5XkKNs2Z#m<>ynya5_=&SG*ILI^m!-fKUha}?#E58pb^6S&5EkH`-2=o3?0 z^ojXUq4A{f#5gF?+9XE7DAILr!AYd;kY!1?ta|`|YXfC|j**CV4q6Xh60Ijlf!@eZ zT7i!pAqc<|tU^lgO-`%nFva%e*_40FDz_`MZgI{fDeJcD!9aD>Vyz>_u-C?R`<)1x zu}*E%_8pOkF$QZbQmQ>bRtWo_ZwueVy&30b+Bd`FH%R-o@JRgHwBHqe^LN#tKu3|7 z1reC2P%5I0?yqSS0+A$3*Uh)i`@7WXyUP1x=Di93u6e)f9==W9?|R-bh8;Gx?k%bL zO}Z{iv+lBs$GDYh_P%{Tarw4!J2tm&t?D;#TbG>P8vx#DSTT$R#%QkRX^nU^9no1w z=R83MtSYHYB*e%nSgZ{A$|9vf8-;TLWh5;TjKFJ&RDzYTiREz(NOYvY>7|YHJaPikSNsqctG}yicq!QUWq!Ylo8&q)6o^($pP968Nti zV&WK6fVNADdd{kGl)%sjYU_|OQaX#Bc}gQ`=PgC4sgz{CZa_)ma!r^Fk#)pZ5p2Xp zkON6qTSO%ZQ867npc-Uwd`NAqb1h|ghzyodb(S{$HxH(OtL2&yJZ-b48Vos{REcqK zN6~e)wk(^LgJHqZq(o(qYLX*7;y2HpvtD-;W`xuw4^B#c@nXyDS9c!g0+XSkv4O7X z7!?&pD`JG;0_e9vT`$fr7?dUR`3mnHZ!WHBa^GJS+x6%zya+OW4Xm_LjrwnE@rk;l5+v2anR4wq9Y1 z0;SVDWg`U+X+HF>FjEu^2P2lNC31(l%68pO*a9NR4C1_a{W`UYcFkxsr5cSnKDqza zGu_r_jZ_IZtQAbk9q_h}iS<>0+8izniLLf}(O{iK?@Ad82sZ$W2{g#w!JjBZh7CmDB?j2HJuNfZ=SvLt9T5U7E*FfBMtdde_jd(cW zcE^vW%roHd`0`6-d^|Q~Y*Xi2hKRo3; z-^HCvdJRRryD2LSTn$vOQd@1fA!gqFOclLW~;Vl6C7TfmzuwX#1 z;BsqN{O-zV@4tWknu2VJaDS`q8v_7g9|X8r(7)ThW5WpVuCiVJ!M+^7?KOO7cXnrY zc4xo$=JN@#^Cf`bbX0S`QYbfrJqgwCI30=a_{=`T@Xd{no4LLIbi}=%ysb;T0lmF* zEJi?8xYB0s^MEKi*b@&+LEaD>xn9f&cF8`w#R#Ca>VK!&-=yxoe;K~X{VrB5(K+s) zp78R`1!ZX{w4w7BDI|lUpv{1j*O%7}stN%#U5iqZK~>RY*~V9wS5##Q5e|oACc^=B z)AI8V9|JI-Z%>$4#_;sf8DE~yF+~EJMJbuBmYg0PK#Z)KnyN5V#lAzbZW;!qMhI}u zv8rpNQVbIE9OpdNCg8zp-SElzb7rema>lL$;m{zAAjHVR*32^oEQTx@OUZb0yjQPE zjT4Z;Ca{bY;Ci5)OaPl06L2Ob_pUYtTJ4v;vu&2q%^Geg6ISezxJ{ut1D&&x|(gI=gX2^xy-l#%>c+GHnXw_5d(jbV#kJ3e__n`j{N{ zAv1aH+EyGFnYN9|{^svCz7MU4Do%Iw0gHRpT*Vrg9Lxn69 zw)IIuTuHnHOe9vCd&Lo26`4ge0qbJS{dJb@MMQ#?AOy}WBIk|l*teV0-)1J68K>jbtD zkr)KQ2c(KP8!1YI?;I$}K$N|Nv+a_UxYi~~JF}6_mLLM{+EGnP24ci?a)8o0Z(xhW zl9)kEoA#L6Y#;{D>+_eWd}t^Nl1#M^2$h&so$D|{;x>I!@Q5l&-OofrEF)ncQ6jPU zF6cm|v7inXZ6c1e7V#mV%apz{iVz}73PKkUS|W|292NM^V_S!aAhkpnGO@O~h-)lT zr@lkRwB8ZEA&SH_+O!?>MOt$zEr~Yby~j(D)?S^*g^0|owNl9Rd^?X+36LLMB(Br5 z6o&?Ex__k;*(iWIfp+kT?ZVD$UjAnVAB#1lJ z;{6Vrno=1&-4R8k>9)YQ)V>r_q&6`a3=l-357hN~`x|KpS)w)s-|wq8ZA(>_w9avM ze1JQcFr7?kyAJCD);kKVX>CBuMZ#^y=2~ zhaWznZnq2HtJRXpWW>vhE2Iis&lXhGcI=Gsg z;C;{bcQcF-h%&Lq?v`mcZ-8=8(bi25@GHu}md!8AH}8hU=&`}|VVgF!8|Iy3G#*pe zsgBeRP|?Le(=-Iv_434 zSC(;iSAKL@aq;DxgL`8xUMv_*KIG&vIP1}cX7*;854@*?@4oXaU$2?;(!-I9XV)Cv zpYZzAYkoSA%+IC-psW<;kMD8yV#(3N35)YIHXr}_Lu{A&=Zj}^4)1Lb_YV#Rs6z4b zH&>iKo-%utz=2mj^5_qa8T`c~`1LvB4-(7a;>$V5kEhJuq`BRrpPk^kv@SaT{F{!v8k^U|uRq(e{K1y& zAhLY7T=9FhtLwDCuYjY&F`d_GUU_GCc4v3?dt%FV%d0m(5_5Ksh`;^%`-L0+z!u*P z4F5i`weJIjylEPe?Cv*}*WCc_maCdqm*2NheA|&aP40Hdn{U&5zOy^Kvpc)9-&XtQ z(P<|M)y+}=?|;v)Kie$&N5Bg26ODfiE3RHlIeM7J$Ez39J%Hco(}NwFe0cNuGhTo8 zv=2Xfy3A>%IESZ$Boov*2BVUL2V-WhR-EKhev6A0r;n%TGD`+OnZmOxntyni*lsGx z=!;8MvkvpKv{5iV8TRsy2j|y>dxw}WuBgw(Xj8Dbt~q)>+wG69A^zmIDj%d0hm$=1m&gupvTHNN2D%NZdi=8A)RV`i_H z1P_zb0rS^uib^p&tXR)m#>Ycc@e1FieCJocVtVuk1p5H=z~4r$ZCGm7?fwQrmw^G55&V~zRgVTduw=zRR?ml%^|Xa~bF>-Cz!$vqa!HIXD) zYn{Ip%w3fQ%hehs1tvQsob!DhwYDWj&^m!s)GFYH0v*A39#tr!3rM4IYlm(lekgE_ zM+b-N!EU);Z3{?T-nh1I1H{?L0H-oKzauNH48#q1MG-?FIFAn1p^*}b!I0r-OdueUy+pP54r5B0Pv0T~Ps zBi?6cz7#3ETd{1n^3$o}61ZSo6GS;bc5aZ8CcPoB!fpAcRC3 zO?0WfCwV}DE;Y8ztdBAB@NkSNs{|k@OMKU*a7c`nN)xPQu~-s>z{vDo$s$Q!DpTQY zN7uQYVO2fw`oMbK&~yQ%3WB#t4MGH>GPp)& z5T7NA1PbuJW4>Brl%_Bm?=8}lh$snUX2=i{Xfv}xhM*8a;;h3rHQJQ@lqd$9fq;sQ zW@VB)?l48gadixtRW!zk>soYC_TM+ala0Bq#gx@v^ASQ5qXPu1#TBCrh)(%#0TnTN z){AR~8En1@Pw#PRU-fFvaD0^S%Wlh&^De4!&WoLNQ+U&?DNWe}zQqnRR1nat=S(IO zV!ke7APPaqa^}G~wANo8o~5~W`^OMGZM|YJn&h!YycOQ8<_vnaE|K;s^E(w|WHcVK z$Mh*c>H^m_iAmHHcx!jU1wtGAM*i6tg7c}3nX*sYdyDsuqS!EtI;1Z8aN8~@%7T#z zMAxECk(g+UD$N0$Ln(<63CtFQ;NJ8xswkNZ604*TiSbQogA{-dnek8{wPrIc$`})1 z)!W2Crc@r+x}Npc=pq3PqbEc`QI-$`0zokv;p%1oTe4)E(uU7pog-r8^H=Bnfeax< zX4{DfA#m0qguphI@wD9Qb4;Nblm%63_=}I8AfzDphzbg?Bg!UF@|&5*H8a+&pmmNy zDtr?d7K-6P#cZ*}IE^SqSnCrrtn?fW4eKTW`%0~7@}UBh?AKm#a~du8$EA_97Rq9T z6+0~L8Q8RHYo@0^rEOLjJe&YwG9P+K<4ujx8ZT6TKq3L>L5qmeimDn@uUE8PhcODJ zG~PS9uBGcbAOW(vF0}>XeBM%+&HK20H$-Lv z2K25nDV|acS))4ZX zBKJ?)m?W#5+rLnr=r^pRJ^_<&n2%u({1-#O$4Ce(3NxUtXGo#5%z8j7N!Koss(9}J zz(HAXFc|;?y6!&rPtrcsa8R+X8-{~>tm}q@$#dXN0{G7E?1!|)qQ>h1P(a@M{4v0P z0Qf-6V|`&Xt#!0E&jHyU#Lj1jZp4MypCybGMsqDRQyt)PPJKK@yt?M4)J#YWy+!2K zgJA$}eM&Vv1)8^g#+T%q(hpUj(LO2d~Qzd9;SrblKTS?b zK2Oex*PmYUq!2uRvEcAQa`dH5=*a6&FFE`0i1E>Y`T3IRX+AZ1I>OfXv$)-i=}Cpo z4v2%ZaRPj3#pGl_^bgVcg2Cvgz!v-$<#Uu$1o0&@K1RGrn<%5B0ZL28M+3N8F>#ha zc3ytPbBuz1_aczwBJB-bu+63wY$tq$(ae_?b2}N<4{BHQT`=pN-Pw1u;3LlM?*_*Z z@o~F(CZ+Bf;Wpvc)%|yoS*3*Bg34~j@y_nC0d3-JzstSGTf|($|$@KfKM{1(bGB0 zx`XuwY}mEQ*((Ii4j4iz$*QZtZkUIl@h#h3@5stEqyZ!{&;w474(K}1bOc3_oag{6 zS2HvvhxbSP;**z1shJE*4#pL)FRyrgc|}nsFwW6*#CR~?lVlx~1$EO>7KU}*&^b$` zHK7Ph$0J6gA<@;8Rmp5oQ#y?`hNEIgho$Q*c4ZNO93FC@YC2;vU1ZgHPVP_m>4y(d z0?JYoH!KI81*Is8lJ#nh&a(5~dAyIL=uDwUYK5=|FUYlt2Z0>TvFePWl(z%wBwG0WmabPBkBCc5ug55M$);kdx_E{_TNAGV8~zm`Ekm_ z7<5t4t`aE6D2XZxqU#dlpH83wXFCSN0ooW;SrV#?GRzlq%m48=U(oJ=R%gq^ zV9>NJ|K_j%Wc%*f4rTU%6kXF|$`Wr|Vibr>xDeHa001BWNkldV&X~69_T5fY6HI6H5^xgDs81d7l~J zlH{XQ3Z+#7Z3qd{;H^U_m6*da$Sp>Zq#dQgZk}~W4ndS6X5d%I65y%72|dtFNQsE) z{Xl9$mWte^VvHdHxw;q$G4y~oAtY_Rpc|aNn$vKm;HF-4@V?<=`y!X zhfq3)Cl)FQ`I<_sUs6F;r10P|N`GZIDx%alvvCK6)QC{zen#MZK9_zW}) zJ|ys9^u!P`MFBC7f6?L5sL(O41YO%w1&^o%#c)7y7T0wMB1T94#fPUv-|;6;4$xZQ zUBuaza!{dkfiwlpVgVxZAAfPld{ra$j?2KpYz4=Yl7IW3{}eN<5|B_zybW}12Kfs? z2;f6Za|xQCA&lRl+K49C9CPC#@g zdp4lbX#V9No^Wz@h)_Do-fh7DO#~`+ zKC<629GL{#mZ?1!MS&8E#VVqrU^p~Lqqc0b3M7Icz!Q0Sah};HQ~XhBn6Dcqqk^ub z2meW>n6KRypd9!A4~?X=p7YBY0LMpDjz%Mv^O~-;{qH7&0V7@ZVDLYB@&u_QQV9O$ z?>^?|A3kL|8u00hmdUW>r;m<_G4i(`f5M;t;ZJjaafx+~QfnI9adC0Yz2mg5|McZ0 z5HY4;wp^fe#Xt>u)<329$Dq__-V!D>v&D+(c-RB}cC9K4I-5Y<%ItvulQTaG_(yTp7MLjSvs*|y2oLSpcg3Vdc6)HhT5{?>FI&z_$Hg3Ie!56J1Pqc9r= zMorUvg`~rs-PxV}PFtxZtq+W=f@Rb73#&-#3re#+h@FZ5F!`XOb&ddxD#fZvheQ0J zM0NYL>#cK;UquR;SuDmj>YvSNC_i;3d3{U`jqAD6Q*Y)gcMx8 zm~;Fn$?hIxnc&kWQ|52dx@>wnW_?{Vy}y;9pSOVmaL>+>AKe4s=>7y*NDl8$aF;Wp z3s6X6h;%kk%$D$I3<#dYj#Z4PFRpPd`SgyMT}Gar}6SDix<2*Ud&^m(7`V4BDdo~E#?7rVp>@6WDh zOHlhtBz4n)dV9|D&F!D7KkyFtcxQL^yI{9L-FLBGUnSxDuK3%y-z^M)uRBz9|IfcV zeDM!AF8pU-m*ZP@vyAWR)db&88~BH0wC#^}-DK7KIso7HJn{Rrcjdc(eN!W1zYKRE zz&pFM-(kCZckk@ZZnL9@Gp=8z&5FYZGp=47@aFUF!gjOp-F)6(_>PEi#o%y?DIBjq zyXN?T?b&XwUn&kC%pgpAHix4}6HK8I5p9` zc6xw*y}~?B?0<)EuG2l-pP&lG@uLGwA$tH}2$A(KUh!nAS+)@v<9*=bi#gNN5eBf0 zLutw4c*vpFsO;=GxHm@S)04#)7p$b>=+Pmrb(Dh-3E>sh_#E3gq)u{`2^ctLe!ip} zC+8l(YW@k392dS#;6G_z66_-e2O0dQ(#D5+aKP%SVRTqgFFNGunE9JE!xz^ydDGb+ zkKolTZHn}#C?iH`7Hiu-uiNHPUFRtZwLK{Eb%$eq0NVw$ZosVm4g`2--@}wv6lSuw zQ1s4G*UPsga(iiC38mgYz1vI17B}TzQ=F!KJH1W3;5|`Eq&5VX*_%`XFzqfgHo&$R zLUsg>-%6`_@8w>+TOwE9l*r9->aULTP0O$;_ibg^#CccU1@CXIJK&vl2hiGe{=LWA z29ceGH?3>yTf>@q!N2xR*2m?R#Bq;A$s$Kxck>pfT3 zbEeZ#asqqL#pM-~@rY`WfF0kbwKl`(eQYsqfsI*D!PBGv@fEcJ(`;0a7WvYv=3mBvLi=RIt#MCb5>ow!ykYS|~ zV4}19@;6`b`4?{xLQo9~PL9S51|=~D4#pKaJG*TNC@FEy^5nr;VzslDkO6yIPqDU3 z0KU^{2G|5*1Q!BAq%m3uiE|F`V+J{BVvHCw=w(s8w|MLGfM-Aoesv`i+mQ7XMlmQP zbr&)_L826>3Wd!;jf{}TdXJP6A>ecjhf|3zbYi_y0Fmf?x(6julak;qF*fKjFdSwO zm`v<#!CH!8iB<_z7o5d8izM zLU@92@k&CpZ;k0O21>1Q!Sz55v*Qfk@a>gG(Ig)|QYT=V>pE0s!;{)TjEP~)bqG}; z=`!#RVifq+CSVaM4Iu>Mq2^CM`U#8GnqNPA&d;7cVv>Pc|M4F_?%CA3rp-W`o&MQ6 zOqoDgLKSpPgOLhh3Yz%>RTRj~7@2@p7L-olDNq|>&DCimLfRtF8yBY0~Fa`oK#2%~-u(&>F zJUzjbRnKI4d-!ng`sOhSvHeYAP~9?-ZNS!VhZls9`b!W5+a+el;0duq#K?MmMO6*y z+!k2lo0{MpRWeRMG z%<1QFq(nky9VM~kWfn#i92sRy+EEQSsfe8=MvW}09-!jAC3=T3MPe6IvIn&aA+XjG zqspKpm)QNZ!PO1AG^y>yd?4C6RF)!^(vX`_k{1pZp%l_5pfynty-nasml119qjbQz zfT_v^`tCZ4sv>#|+9Y|sC@_V|;Q6!`k;-JI#1>N)c<1=ZqX%5hYlef0WtN2<=l*6` z3PNZRQsKQ%eRxcgz(r9IqCm(9-r~K-l&PJjcUAY`MpHYH7&FN4vqLG~Vgxj0Nn1Bx z83qnIh?!YAlGtNi1}&$s%-E+*UXyHR+)@hATPK*(hG7Q0tXFe98gC<2H6+B4=evQT zsOY*TjkCR_cHA~=s=*K;-*&DQMM=~e=equPo46b4;7#7uV6@}#dj9~x5Yn8%XqkcS z5v?@`(~7pW)J@YfTHo27-P!N23AG*9cdhprZ}wqD8uvH8?wei1ZeOvQj2JCe@cJ4e zOpb@?(D?BXW=q;SriZv{OFWdzrI8&317}Qemv#s%Q;s(4es2LRLl^FG>*_Pcx&JD)9h@ncC1f1Q1oE@^dxoxa~R+aCyR+YBYnqz#6)3j^Vh@&jAMAg-486BeE`Jjm=H*3N2p>Oy%a;cnJ={tM zhzQqj)*L^c;ycIkyyp1f_T*t8^70=qCr#W9Dl|~*;>0ZxK4-Zh6D;(@dP{en3<3=f*3$)f#8inor-cOZM z;Os_`?nkkvS#!P;D7Ux+{@vMoF(ox!mqA~E5(?+jaqJ#smYx0^dDx;T_he&%9@LN( zOW%qEycK5?ru8VZ?4*2!5c|Lm=m8)bX*;DAP2KFJwPCOOvC3T(WiJPNTN!p4^WIg4 zO`LCAhE2I|t2^(yJw}$@x+8>l*4^QB#CV`7jKK%jGpm(Vl7F5aOf!>J+8$2;G>=j$ zGn)y@!eE79Pz{JNF>jUQ5$DS}r5_+<#p0?aL{Hnc2|RYWN&vRtkV?^F5Cp2Kq?{hp zh7RvQt4M1t1V^U~LMu8F^ORBoV&WbeBxfETY`Vn!p{b&U%!9Sv~nB}G|e7Bo$ap3Wu)1tXJut_u$D11ct&$&lHm z0ud1+!CP#bwC#lykUzGwMMfVha(vIhZ1B2j?NGIK6OY;Kdvq;@Jc zOjsc~euB+%roj^)l`Ae2TLgY7zW zQGj>I%q$kX!;}U=#9DARKvpb>K7dZ3o(&UV(`{M*IvaK*8`H(cdiF5BL~Pq(w4x{r zyt626(*GR*-Ecg~;KxAMc6i${o=$sbymOw{mwDb6VKN%<`tq7VX?j3i*R+Z0Dl>U* zr1~NuGhh{cc#II*7TYB@F|`FEdxmQ_P#*P3GK)~Vd!1~tz({8uq45qU9#$zf0ApK^yhXjqm zdylC{sFd-+@4rtau|zJQY7QQ%@c>5ZvX3!FdO_2yL~TtODYoe0zr%j)0o>O^B0V@_ z-SGLL5^64RPxLLWR!nEdq?`u$F0ofly1#kD{PHYAx{L z^8SjW)29L_$3!|HrIl9rX3Np((?R*E|2LxONV z{Y$}UDFjg$BjT0D)MV!{t``oF}J8tkzq0ZO7BIDf(RcF5@af+tM^LHm5Ad z9K1(ciz`5{ag~hy+F-0>yINtZ8eQfYJ+M67R~9S4j40!^KG66yB-#fnK=!tFrW6qL z;{Z8|?YPz`<;ZQzV5My=F*8`fhu{U|Orn@;l^D3kwk`crA}dQK4=RGedyKUO!fn~@ z0_|ptsVY&>Mb1(5L9CK1i^`eac{Roa8Sb`$(ZQe*bEfraP?W8ld2f+fv)y2bY<7tp z0(DiPV*yBWAo{?(QmnVPynJy?j9YTZ)Rp7;*_iv~TSg9@nla7T8IwXRYJgH_PD~kW;K=tOijO^?})R z!p)6bv)+dR1O;%;GO8YHx#S!YOrkPfX-}6(MvoBX0zIl5u zP;OaH6%f83KYJD0;5{hBX8oP9?dJ#|0>Az2%Q6mV*4viduAwf)HTTO6quR0D{PbMY zV?4%V{BbdxjajePT$~6C8X1=l-qYKb z@!1@6vtoB~jJmv|`skeX?T-2Bgx#{moE=fUxuyN$k`}0Hi>WV*X!CnU-3-?0;rTYe z^jPlkb4uL3S+h77h}movDJ4d;Yj(>s>ghGdPo#+c=*b-8q*FdRdkDDAn-=oE;BxcZ zH=NBJn{sg4nummA*)QYtLj|Y2|EGU<*9OM*`}%NES2xxaP(2@f0;bjvmhFEXu?OzI z;URF)gM0rPa627r`$NR>(Ttn>H3=z@2Zr{2{aq*K$9RnQ#9u=${}FQhONno&CmdAx9x(8IF*!Pa@B8nJ zJ!o;(SckM#eEg&U9U5H2DO0 z!~As0`gY4`_Nr7c_UeDnSl<4g+3A?&?eAHf{0(I2LZUJPE&#-{8IzE(_gmugBjUIB z%on3!LYpF3Qy#p8h|+zcJQH%l9$4t4^8d6vXb~9jPd~=p-mfvh$xq~`Ni>yP49@iM- zMEglAa*CuFsH&ePV`3>S?JSA%Oi?T7QYOSS zz#+c%0+@s-kW^`!#@K!3V~8BmZKF!F>-M0MSOFhE9A1GrP;POKnA4zy<#!FPwtxT? zC?(K}br_oj7He8;RS~0?bD6^c|0VA+TI^n}6&0`^O0&+ALo6^-CKN?1Yc$%q0j%rc zlNdyWFNPoxNa@oiwPoAx6HyuHLSR(Dhq2Sc0WT(ot7R0WqLL`@L7Zw-3viM%$~iR9 z?i%V*U7$%()N7lT=sR3p3rv$UZPTJ`UBH@vBx@vTKdMT9mc^#qR<*!+p`&dY>e*c8 zC~b?=Sro!5fp^-rm210zbzRd^O=plYUE2!a78-IT>VMh^IB4oUxTv*}->cbSDo5c0Row7B)-HGyFH72EqQlbDEyudhn1;1Ee z+M3k0-%?oP;E;T2Hk_tbMOzq#Y4zY>x!%jnApRL8MLeRt}DuriNv-+8B@+v9@;xSpp00O z_m=A^h+Um=MHx?Jw6OvW*A*F=`}E3~XfvqH_19Ncb`KCbfiy#bomElT^lis@J|`h6 zX4;BXZq5R+b*=P|Zay3O#J(sjlxug}wgexDDavn>VY^(?wH?Mew5^FK2+b{T!pQQ?X;=TMHR6gIYQUcHLchz zm%cb>h`zvoS$=!v93dv^0-ASSSH_;b+G&iT%x@IFZHq-YU}asSjexV>qpcxl8RKG> zaWn@-<1k8&Ha>mV1Y4P@@*m*V-{g8;(zo2J2~O!N-m+M5fa*-nUeh##JMv55>B#ve?Hf_t7U%%!bKK%vNbpK2! z&IHuhZ65)^$9Rkn9rq1jXRJ3HMx$ydBF4^tblpETzAs;19RSC>upbN4!M{2~R^m<( z4wl(wMV;Xe%jD}Ts*lgCw zn7O~)V4ddZVn(|;N9k+sU$0m^o#A&EnE5r6lUrg}iX7gdB-S?@<`*+gpUsK?a>bpo zoWzW=at~6!cmi*4(Z4z)|KXa&lOs$epV`U`PCNk3I*`7)=HrE90~|LU>Ejco-$;@E zB@jM7!M+ii^X6iT{rZ-Cx#6~b#^Q;`Sw&WR=b%2?ji;Je&R#6Y8BU(fFk12Uiz&f> ziFLo=2)V*1%|1vAW){TeaAiC)gs}Kf72!%GgSC@ylbn z&#t)DnxiK(Zj|Qan>+H$V@zeJHw~OmS)9*VUT>HzYSy>$fdyq~o&ulC9~qWcJEn_I zK)+&j_c`Y;7qpvmrpK>|-7_Xfuh2%|KY-ck7-KZEqQ*2|H{52pMRR<$X0L4pwbg9P z>(#U-tefE>)VkS&00|NEo79%&wgbI?KsB-&U%-eih_&Xn3H@_<{#0XmED!9iHgJ|7 z;lIDQ_;;8R`mU8^nNFmXh`q(4)`aNEet+F6tqU{J36z&J&O4diB0k6uSflQPg!+EIdaA^vE!(O69T|01<%>rJ~uo$Y|tHSwJ*vD<;#r?5AOI zbW94(UiCeTs*2K2i|SiLiV5RtvEM6}smdBu%Jkq{uY#vdf#Fg@5wRLl^aGG3He^~L zq!@5jEw+5tV2mZS4N8ql;!i*uigm3i03Y5{)naw4i=tliqO4|&Lb1Y(i(()^ii8wU z)a-U!v=P|axtg%sP}McoSve0;kz*){bYZ|$R;U=kdr=#z6n?kHjcQR4%%UcylGw1S zykCzLMBOWRNixPjQewrZv_s>i0^L}07F9yk_m{>D0EN<4et&IA?4crUETO2GX{`mq zGNRa{jTM-&s0{@#AWH}yZEK9S7$=s%)yR@U!23?rSk_QTnh-UJ(k&W(o|btrHbJlhLjs`3_|)YOsggE6Z5q zIJ>qZYfFv=#&wS5ePKykQr8g_Xx&4AhFolUV<=E(hO#qU^8tfvy#W2tdG$Vm-B7%khRF=c`xp$z-`sj2^~)Wh~uhgLV#E z*W?VYs_|WmvGUsV$^M+trUE+NzF9)vKTKO~L~U=^cBm}sfAvhp`{X^!R$^JWl{uNI zYEk7XeTS%Nial@eUfNex;kO%6QFIky-Nu?tm7lZy&pPV#pQk+#cJRmAkehc=?@m6fQgp$kY=;FlO!Zaw1wO2q+| zlYTfO15d9o7l*M+6r74GsnU@5aG%l|W57BAX{@s}jVFbcE_9?I>T3e}Y3lK00R12i zO0zj-*2@*M#TnD-@t~R{kccU^zMA#&n%Uw^&d+z2k-6GteaB>SG{A#{0%3}1QxD73 z^%!fbVVTi*HXL`q3_xXUS;hdCoZ`@?Lbt;=BPibyeJUV&CP$AljublSPZVgKWf{tK z8@mU~pe?@h0^zp$;mT-{o0i_FJo8= z5vw)Y8bS&fWd-buap?b|4^{fnoJ&z2{9GEGULj; zAmuy&?cH`Gpk4uuTvZ9^YwQ5&^=%;qQ7vrSj;(J=WPBHJ&a&BcgiurIEZ~spt$H)c zR_MG3|AP0#3_c{RmSt>J4}hxxl8P8TH}@U3(m1Q}F!a-h(ZAQLb}ly^uCic6jTRjc zYkO!Lfnb%j>{cs6+lgXhf#iIQ)RP%1Nq^{EMccJ#rBT+f+pG`P5$G?5gd0!LIn%YB z*dTWv$}-m40+WeCWN3W>I5p9W#kp9j?+>hYqMVz7rae4X`LFYdQKcDIn$E|EpXV~q zc20mmCv%<9dTiY*c9xt#Ur>`p8B-Z4957Z%Ki_p!wS%If2z#q(tuk@jQB|Wdmr&3v z>&D1vG$wjq`q&zi_o~4;c$9UBa8X9NiV&qeXzOU3z6dz(m zMNy|r=*PnXyb6%62qB5$W0^0KWWM5?j=CRTlV?;LQb;trE%m5IX&H|*5uF2x$cvMD z06$~&#E`H~lzh9U#Z4yC-paX1KH$rJ!T^|tqWTyEllg)aJ)_YCji^D#5C;YBtTf6v zVh9931x^v$X;VPMGM7}4I*%&tS?tF(F$Mt^rP@HOsDoUCIfKfHYBWQ$AeV7DbOBOA z7jQO&D7Md~5cB3{LoT;xr;9N$Wyp!x_u<;0wBl|f-<`5374`*FsX&cN8*++eKI=q@ zyp%Nk)2mx@40t={H{af2j3K5(j*-gb(hn;}wJ0}Bl;WzC4{~7g-l6zKe;)~=fb|y_ zk14Xp_!;A91kOOyJS-yq&RpfxO>&WXEo7U%MPqgl=Mt0l)z zW@xLJ9FJ)?=h*rUWGlst8FclAUZ+PJ&Hd$?#gmyh-c&P;QFKjsP@r=1(Gj;_-*fU( zis;+V-eUj5a}51=TW-IV+`(ZX{^^T3_ixr5{rZB>zPTs={u)pm{r(b;9Ge%XOkOCa zudd;#6yYCV-n04ioP4!madt;Faol_(Qh28?7u;XUNk4me#O?KplX}k87x%=JdHFY| z!#+R%^%)?d1Siks4BmdbD7L{8z0d)`#Yacny~pOa7dtqNi(jni8pHkDF^};WkMS5k zPy8h_HGkZsQ2mH)>`!s3`&Y+LAq4*&VwgF+XZQYG_SgdaZ~yZv{?FeY+UxEiK;Zi! zz(1qN>gQ@)f8NLW7?1H7kMS6Po?*h8lcO0jj{JO({Kdx$Ol61HH?QIHt9`{;4+ZX* zUvv4DJOJn|f1iH3Mk?eo7auK#hnl9coPE6D>dP;=fAb3f+TFi!^^Htn&R)#1*6`$4 zqWbIG_}*c%a<gdAFipKX5%Wx&Jh0PiusFUlu}HO$5fMw*acSCJB}`{(Qb^fhQ;}q z?XtzzZ!xxFO+&jmXS4hRi}Nw7yU&=Nj!FI*%6Weu%QD808oJp4H;XFkXb zpsqS`}5XoQpE1Bw!^uR4g`&N?MAM*=#l_ z=NaR~It&9bkV>*pA2jOzJy9i!V)=eh3Q?rm>lhenhr{dMAVo=>iOrcncR43?_Qcdl;=9;tsgn5Wlk}qWQ&fRsC~6>* zgzxiQD2+zcKQxg@;SB7)gXy6;Wvskbc{mRO8+cN$)R>F1lhLS36mCpH5`j@H{Bqe} z=>*08u2+py+KH=U1Y;+`9xM_^Mg6SnI_g^N03~@VN`P%A>SI+^4Yq0-*lpINu46Qt3D6hKJz|c3bfj*N`=s2v_spXKtpLi z3H*Ulrn3fLY?dmgXXaz$HpgsepLu9S~2`tJR4uu-FM&a!h-bEgn9XnAC1K zK8n&4roaBgwlNi`Dzv?Iry~|iOi?Lhun!GE0J(ZL6ID?!DpqpMN*Sj%6(Mf8+isY; zdVnOIv&Akk^Y&(ob)Hmgvy?Gd>q?Rya@3lt01eaP}_>UtuIr3I9GcX?wKM<=2Z zrBQ@-jkOD`sZg$_ZFh{SF(43DjDgWeK=u?fIq&G2hVghx*NSzy)wY0xVJIu^muVVF zRCAJ|^YGASjxc8Auo%xE+vh9EZBTH}lp*tpxF zGQ^yyswp8fkRY3caT-^tL8VWj(K^cCPR31)89tZat0p#ETsgEeu#Ot#36MIyB=wzuc)RbbtLil23Z6|h9H{VmHpunVrLatsfb zNkd;J30dnbT3a^D4M|&;+m;+7yH-6=nt9MhOFPpqfdZ3P{ zjVqSp4vGriXgbAr9bF^Gpo}GYfh|>m{$ZaBa8?g}R~y26lz`IVa5I2}A?9IUY+cbc zE!G(6|I2tmmj2(QjNfjG60nkS!U+^y+(PGtZv2I^{5W0?wvm?HKbI*VOx1Rt4w}1B4D}Md)3+AP$LhFR9l8mE9 z)D^!^sZnb`0C~Myxl*~PG#0BvW68w|T9@rql_U9%uI;eSp;LYU|7mSeu8d8_qHHR^ zmq5?`daATBnJacE?J!!b?d5Jq_Q8h^tp#3`i{8pTNR(?oC6CfF2TEn$C2Hd`_w(MP zQKIq~B00-goJ4dd{Z0 z+%II53aA{#^}qvFoCGt57*{I7b=sR|T#%Ig*XVYC}j7s|~pn_JrQn`9M9pX%FTr zNvy1gA`q>Iep~jBcS5~)y{`KUgdN|FNBHq)kM(*-v}2%#VnzO^fd8g-#ir?KyF~3Y ztrs}{Zn-0C-dl*>yR0m?5tX3{iBWkT(jk4r>|{)O-7sBlx%Gjj8Zr6u3V_Yg6#eFo zE(Ge2F5vYooL(?Lo1&d&em21vh&!?1>$d0E$rYPBQLH|kgH)3%l#&8~Sc<_`*E_V% zoIG2gt>*aIoRl)NrbU|>-A?Yqd=pWxZ&4qgasPUSa?lG;_Ui|HuB-5?t=;>7K(Z0DG)c-0c$}VRw7MNOd`a%Fi|J#P$fBhCl z6}&v=@_Ng~AFjDIhNGO(zdEP;-5ch=l7}SQH!Bt|7m(oY&5EN>&NHJe@cPwYO*sC?;<0d2d(Rtvd7&M3TB_jVktygU4XmhastZ zu%0g4RN4&e+_3F;);s(@rL_PUN}~>zLyLu*sBsk)x*-`OpQR8EEEnbJYHvMhv;`&m zA7jKA0XD3wQCg#o6Ns(Y#^n^szA^wvS(OBq7Q0=v0p|!LbT%k!2TRofA}Kdi${KW0 z)sw`dM`=S!SycX%03s9%!W6u~SVq*@k`L%IHVjsS)`}vY6Ic*LVJmx2Gy={I_R0Nv zDH1{;qe))AS3o2;fP*<_n%$NhI&@VJHf|}wXfhoV(yp#ZT>-3061&-~MRBd1qYymR zc!C0f?m*ztoqz}0m;#n&9;nNCkFBfWJp0Zwn#$au>soS7bV;Di-jX%3w@3{A^)VzB z6-t{y3D6dM=bRzLSkxlHxr(UvDool)fMOm`|G1fZVSX7I8DZjSu(8khsdrjcRCq_DnDSpeR*w@V^g6kEw{_{pvZ9;q2F*$q-f}Thb}M-8M>~Kz9~LT zUiS*HS{qTCjk&yU28GP{&N{skV~k<=tY2O!{T)cq6xCK^Dzvh6+Z*c1DQ+~z7s$=I zQEAf&Q|wv+oR;_RZ{9FJmU(dh>uUY*cUUd2nJ!L-Wxk{ASC(JizGZfF!Qmal%+(LJ z<(n;&`SI{~41w9aF301B?XH&B%%_V%6|mnoSIG=lDaCqqTdcHWQ3w5O1*a)oQTrMcV=914OO2tgDIz@n9i*@V65G z*9R89hcKWnW5JG)qQh$#mi?;8ILQV9e@(O*FUBWUfN2zec0UW`$V@<{L}Al3NUQ|KU_;nX}Xk1 zF|t}+GpcKxHRQY_D?M1=_k|ESi)C}y?%Q}55|z<3{vilpw4wDu?pveu%@}!ZJSgfG z+vVT|cC4o}v48gh$*Y_nfQK=7QF=DTrkqSYnaVnYdM06m`IZEP zn9J~&rQoj=WaNw#TEsm3R^!UD>*DaF-dceT+mIMpL)&=jkt31Wb&+vp`fgI%L)T!O z5rxPY&{|Y>HR_-c#6XOM-45d{ru5aux-!0&eXT2$%0)3!<||!OfO==qK9aLR8C~Y6 z0)d&}(fz!s>(GPkv?%e8CR6%i2moucs8kn7vgHz)|g?5H#QT<#!L{ZMoP{tYvo!Cr=E(icq#^_v%8d4P1c~$12QYy@?S zoJ4W7%&k+~(1nEeQN|@x#ucr}{TMX#TcSLlQySn=-4|yiQ7r7&#fbWLjBzMDQ(Bjz zhH_tMG>S;f21O!8&fd;$vOYSr{`=BR9Ba) zhN^n_WzIO>+-;bSWS$#R;x}L1aC!IedE>t|x|ncAKm`$QLp`=U{qzFgMaGK})!Tbu#z(p1vqrJ~%^TdW&vAf#yJ7KU#!cDI`o$@s z%f!#$^0uxyEx*-jHfHkK6>%}<#owIDwvWfyG6&ZB3ETBITz)m<2z%;Z4tDJjP=@#$!CjzhB(mum8>9Umy3E z8_r)YhSwLrFkF5qccaJ8?zw-hIVv~7&KWMhnibn%NbD_sL2ioAK04y+8(IGR|`Qp41lXECPxfPF4mdB?l&dK;W^9O z-?KRR8#3R%_q^O?&C~lWmsvACs%h38(B>&lC@5*5BQJ z2C7~;seEpgBK*u#u&#>_V86o{)spnwHM@uJR~1$JVdsK%QB0D^)WyoF2e2v!syu)e zg$)6q`b2duAcI2Ty)Rp#sI?`02;`IrxgzIBi{lR+0#odtlBMM7%HO%z7AkE8^aCjN zt3CLp53Id&Du5g%ffA!wh6X>VIrV^^(i)XZXQ2(GxL198&o=eJ>x?7~`@4&NJ(V8b z(B_iRPQ}93WJ#&07$uQg;0$fdkeEv)iKJpcjYg!H&_)kQB!$>IS|j*(^85RoP!xwm z1x~=eu4zzF6p=(VBT9m+9zzO)GFc2>;J0Ea7k0a%ILM%;mXavH`0|;ER~UkCakU{E zv9D7mp&~UQ9H3773H11(w=datP$0gtVH3BKxnp-j4o;?%%n2hA^q;Ii;OC{CJWa~6C$kb=N}qsd@t z2+~*f_VOtvR(2Xne*gd=07*naRLd)ju^gQ~Euco9Kr6OnDat&h+c7V;zx{HD@L&J_ zc6-m_URK|PH{OE)b z`~j!{^=LY@34rZt&Fts|=&zr{f90Ght;wk^D%XnDmtV*=4@D7;0pzPj6S`)fydI6D zeHbIx63CdMm1R7(*vVx7*tEG7AhlNw)q4NBH1@3W(0=9j(S-PLzG2H8$G>wO3jAjY z2lFgdwriXn#)@G(WvuYQ)3nWZw&#k{XxY$kyvx;w$~n5=8P^Vt=ICgKRT{qvG@XoX z{s0bem1DVXvC6V6N<3|`)$EFTVBwXxy1C;QFJExCx-ETC9zM$l$DK2T%@$>4iOOiY zkZ^Vn0_=QZWcSaEdqs9@EhPBQ|9p$9cbuJ!ffZ+qisS>;xB;a&o>_A4%6uxLO{NVI zUBJO+yQQiezU?rssQ9H!CXfnHBr0;!U!@Ew?5K^$x`1*u$!`lxnenZF?7j7Q&Ip9% z#ESjh=t83Em7EW5$)=}(a?yedWx<xqe$p2&3`HDTlY@ZuDhF^QtZ{hX;dGfdsb0mgfK5u#?Y1&+v2OSsLoAAD zS)k&mx?ybD7gfldYTI@NCad-!C8FTiwe6tttF^+7`l5}85MV0pzUx{kaX z=;X`x1pZUbNq=1SNjWQ)&z%79MrT4uXe}^c5C17EilG9#?Uk2(E2_3S1X9RDAwx_u z?wHD<3b5M4f2r$;WiG2tzfI^1aFjKeYOkc&!+#-&nqUuDCbB?=S*+4+U6F%_oXAR) zHwA1A54Pu9FTbBs!~KNVSNGd1`;uZ&>@Et01^!FkV@4xlNaY@`DA*Nf&yB{?e!Buv z#)z_x+=W32Q5jtdtO6mFd%Z#+W{R!57Dd2bAy4U2lvNs#42y{f!+mCk?-qio{e30{ z0#sU~ldL;@25?Yl@StF=EHA}p2iBu0gBDBW7)9kir!>q<9xmG#$vu1)7JNIr|J`-{ zd)EDKkzHT#5o4K06!1L-Km4A=Ah11C~03KUYHJ9u`Mh_nX~d)tKlZ=)1#`!kS5 zAK+2lX4i1P+0TQTw&m&Rv4FtuR4mNK4~r+9QT$*3&(8+{h7_obrgj4V!#)ZBt`ke) zst0&}C@MI(Zbn(I+Wvjxt9m1y|qPbNpn+{pA{z;nP<) z!|_i3{t4TEevAF}1&b$BqE9^e#gW{1`i%SP1|JfqpDu8vfambo9{zQ?0rDayH~T z`kcm(xgCjmAU`Yo2XK40CfeBp5b!Y`<1rrNuO)uiX*KboK))Z1pE9>u{$~IB1E6B^ zOmm+@{jSpXpI`h4Hu*h~q~iSt8$$Z=qyI18xF22Sy_+uoeisDncj&)?U;Z&3<1rrN zF&^V5M2;^YuZP!{UvhAhd&J38xIL(P12`|0bhfgbf3)EC&3=2YKfA%Wk2!vJ2N_a& zfp2a>!Dv>oU3VNml_XkBV6s&1ojzY+D~+uzrv*slZcY17Z@8;#AoFRJ*<`5iw_F@K zZkj+nt!UOA`I|cypPpmBzJ*_%lSoqSSUapUK;roMLdN)<34gfa-davSIwFO{Xx+fs zjQUq+q;GDSK3SmOEXglK#bj|lEmpr1Vh3jQ8ZxxIPSmZ+@!wx=Nhvcw9kIOHQq`96 z5$u)?vy%zRz9t4y-$;Ce4lm`muWp&#Z+V?Hv%@OS^733qwi)zt$9OS@8<`LeiQqwF~OId)(l3bGHf`9}%Yd};zUBU2I#Fwz#q_Q!MDLwIsc_OQl#>#oZ3=?B06PxdLm-X)<-y z8|FdQC~fd<56+3gpm7djlH|XZT;q|0`+JzsLS;bLkMxON8IKe%L9u< z=j`5M=XzTJH;pOEe@b-)7J;m`7-NU^pd*#eOcnds6au3v5q!t}s$tVY*Ld0lclUS9 zrqcp}C|N(p{k~=j7#AUDCS$|PmuEx5)J-Z<%BW(8+b396FUnS|)~peT-4#e-*Cv!T z_;{coTa^ELCE<_~$^aT(zgf|Sipn~C^wjp@L#8eYoNma(lxck)9>7@Zn2im0_sgQ5 z0&U!3T(J#S6`gNzwIob5mixOFGuo29V&`{Mm8>^*WA4K(o86j=(KC#K>wL-jRsg$^ z9Wgn8`bSpLgud@URDBP|K2fL=7;#i-*1JTYA=Mqbyu)eDZ1<8bHdte*oMYFtSZj#> zyMtB_(E$8+fA`A=pY=AJvto<5-fWpoC;aZ}Gj5i5to${eKo{n$t1H|@qc4w!M44>g z)6H+l%hSO^IK;?!RO7ub3Z1fa(>9Fin(4^}ZL`7q4r9c6Fl9(x$MozO%|;;GtRQT5 zXxresU9rBiXrr-KfWVXz-2nONA?XT85-A64GDJkpDiQ`;Qc8c2iaO2VEUHf`_hVBJ z_k|$)oOAj~%cs=;ZAhslCQw!h9H*e^8eFkOGo_ynp`#v807cuZ1*jP8uH`xgidvYX zEw;ZYiHhg@maFRtZL>z}KIt0Cx(74`P#BFgN6$_lsOAj{b_X`SzNxvqT4J;#CQpuu zX18WMTVS*!_!ea}^OG~yt41#VoJc7SztdjDP++0pJ4q6keGXpW;~wU8RZR{ZT~X8Q z)p3XA$~fCLTV~TKyUpssa_jqRtgG-{hq0En*%D(rtfvpgY**K~a=g1;WIQ(b6qwJx zzj$l6i{JaXHhYytpJWVB1-eMSDRb5WTN8$Y6s0vGdYrAm%X>aW9FUU6x&1YuwH{s{ zK4{K}T5W%vbyW`_U`z>u^tWw+^8lJgRQyJx5pCO1*KWA3H}$tDqi_?0ZKlNW7Vbp# z@lt<@xtp+wOD2;E^N-=zi~ouL@BY8?A3yp>IS=2{=KxgY^%rkm@%iN!%wB3%UxGI~ zF2>Jg`PsMJxA%&HlEEwA5RF3jKxQfGwz-7{vp6& zt>yW}gy&C>=$b7l>>zqpJH>h@b2UX0tI~cBOQ!Skdxio7ffST&@N^-u7~5f4Wep() z8Xp-s!)hn{V2yNsO{XxqS2t}0PAi~FF73)#BZ_I|Z-oaEsq@%XGr)n?b~5+Q6boOo z*C11#m@_fM>3js*5u?X%JKU(=KeaE)c(MFewx2ikZ9C`EKgry(>sqX>hMVQht|7)W z6jdbhP*kzmG@KpFe3JqSic+H|#$N3&KUDq$QIgdLl)=?CIwzFb&#$emWIr@AM^!R| z?dQ>2Tj~3?DRVJD%zeAg59_I3EiRXHXB@t5%6i2XGA2f&9{%fw`M5~}681$LsfQ4a zfV*AisYYW+qDGwy+<~ zMcGmH#ZF29V^@z*NnRUcNih}ZP7m;A^84cffks_568mf~mc*!{x*3Yvxi+K%8ux0d zGDj8oueWEHLb0^JH&nUU3ImE#oTfnSfqJDiI!jTShP?u9?A3PPUzFCbtMd03w8;@Z zTvtOW_VE~7J;-Ls{a*a;cG;`L9~Q~|q<#9Hbp>=3<-P~|q#y3L%)eAo5$vz|_bctc ztC&xL0F~18D)&8=mE-#%%VGPfUssiOUDZu^6mg|_v7Aq` z?G)^wNDR=FzFg*5&^2)=Y~0&H%l`L({f7u=47*19+i~g3-`w6&S^Hp)HSG66k@4;N z=aWlIrG6yya9%&Mnsp0@BHAGYW+TTgWn$dR-(&@2tJ#%#LY~x&ZkKfBlIV-RGGI+# zG!d9RT@)2^$ggj?*OtZ6r@$pg7c;ueIbnQB_D`7}y^#U{YnUC6IkZbWe9lWbj?LYU zql@w!K4y$n#F#m{5Qs1M$nldox7slI-6bb~cY)H1)#ZkhXEVsKy54g9d~vW<%CmO3 zJ6~X(<|(k-23DgAzPac0<%0XSD~_JbxqH3j*{@IG*Jn&n+`L*2&;FNJ8%}?H4hq&^ zE;)WW9k!i(;_RdD|7Y(_o-Ikw`@H8Haya9ihZ?%N(TxTO5(G%lq9~aZ6`~_7hb?>K z|HBbpdgGn<-gxWq&JHgeL5Z>)79(ug7D; zRSlp)OtkL1sJi#u%se@N!~49yAFxlgitYoKpH4V>yu;*d&b9aC#oIAoktrU$cfjTI zDTj|@9^>X>$>F0Nj-D*JcsA&S4ghver)24SevsG!0-8!OJ-_S6^H&SEW&Qipu(-aD z`?!z$_*ukukMdTl{zGtHKWsc6&3>fyzCV!oIq_FWq4vgK44Yf8rguJ(UkDED^?$I4 zPcR|2S+=GDkaUb__ANTRoi^m5& zs!k;>a5DvEXY7uLT>Yqpj&Evv!<|31vu5G;ubbuLFT=ehS#G#^woBlKgU9n!j2tk{ zGY}&#KAUs;?%vkAL|dfv>->7f-pT0J<}Vi}S=!y+*|N}F?~e(eT*3QMjby47hk$vw zLzY_b#m$=C(~Qou60lD%6EKier9QqwJlbVd=Hvt>ujV+R*#T~(B%4+YcS=^1iqYX9 zTK*oMW1E1|Ny)?obf$3DF+S`wIbU@9T9j`ydG!I~-7f=YKtP5^^mm>k!y|%vfp8BA z)gF~uFxVR)lwi19QcYHj@OX;XE?4mJ^!GBs{0)UMwGCMB8Ri*l>#$9r%;=Q4f`_7% zx0Hj@{OFH0vP@FsSvNt~0wraUv#x54v5W@A#$t(>6xiD-ING<2`dLz@QVe@(qBzUJ zr$j(VRp!VlQk#CkVwh=j1&^*d<5~FLlq@Bn{309HCdNn3f+FW zq+A$+BM8WfUbH0KvQ&+bNjgU=Cc#9A$6~97kd)}!WMzAPbXmsaptaE|Osi-ys}(|o z*HmO&2jKMx*3uYDmS@OTc}B;K+_q(~P>O0kM-^rKZmqeV%;PmMmaG>oVpXO=n3#A8 z@qEawBzEvsO!gT=UerjH5?rF$By+^NQ_f%5uxtdInx?p#w&mhk`*u9<5UREn0@WH23)>TYUSa(~2DOVZi*EhWT zb&@@xuMOlef$OWLQ`LhAxvgtYnG5Q1uN z&(1F5dD&9oau{aSlAZp57wZ>P3y;oav{O}rKf3xeTodT+XRL3|*?rJwdfreDBp<$f z#nC%Ggc}1JRhTvjD1^XN4UKb@MS-^wz%i!5H4R?VDI=jH4A{cYN^6#8iE~{_u2cAH z5*XIPfK_EM#>MlQlFT;5|BZLx-D~%5NH*|7$S%3xsph%6$w;^L*_LA74_IDni4YoZ z>IgNfj4UfVg_}Y8xsCbclHvFuS=DNUjKEQrm9ae_D*TyhMcx~9>)loJYi)qr<>K%8 zYs}Rx zC2xw^%|-X~YT?nkB)HX<%A<(ScGkz372Y})>&2}kvUfh7BO#;Jb?RIP_}t~Pc49R3 zE$%K?_DW1+Frmh~s5}^mwrYm@_Hrgd@OPJcZF^hG4Ths+vuPuopcFnd5%$}Hb(PM$ z-;HgeB5b;^y^pZ9wQi$!={$K6t#3Qacs6Q#?QurXPas4<$=GkO&QRtBO=DO$ZGn=E zmiO5fjQO;c%p|J6UEzpJ^p+E|Rk z=KU~TE!nB++n*N(J+?GgC42f1r6p$VnE7WcKa`XsjXFE!Rr8GgNP!K6@e*d1#YJG~ z978TEB)UjrX~@)9L;f^_)cUz@u|siV@WN~+RIX^gcf zEfUlp3sKrWrH~Tg1J=|a;&{j>I7`aV*(ghy;eAC2vQusYI`~g0oz&VA*l8_NsZ>mu z=2V2j+X|VL9TXaH-I$;q^LbN86~AsQnN;F*j=&~G;f<=8+*;Q)bvK^f2JCJ>cb<@} z>w|ZxepZrNUmL{{o4;(x80|9u4#LpAOW7OBA-;RtK|!BgOZ=4m>(4w z(<3e=A?P%g->CoHRq4OGu8<1vY+FAR0p50-N!hzo(oOeb2!ONcx<{$Z2o;8IUj#n& zqtck1r~=ttudR0X7MyrX1yZHrI5yu82`+S<+MuZ`WKs@wE~>_=q@Edzz65qTMM_Dg zGlsnk-_!_AJhy|A(Dr*0SZZyuzt#g}0vA`y3Lof-$-H+|ReVpZ)|)~Zi0`eY`Tp>r z*=~DMyIvLrt98}gA9tg56v=*q?jgo{RNL;WO}npkZ1+Qm?S7%MTY2w5w67K+7QI7! zm1GYN2p3aUx?~7UrDo^VgzVuVi^+=NULQ_&qm}uzBB(Qh7c|ugs=R;z`QQ@M!1AVI z=X5hxms&DD8jxj@+2s;rJO>YA-*WeKh*=wS(C9)j-0vgKCWOa(j1LC!J($V#4oh<~ z-S}O!+Lk2mJl@L$SKX1O=Qjv~2>4I0p?ot)(7gw?CkMm^xD*MFyt8l@i>o~d^YoQz ztsmp%Pcw&+WB74y_;ccBvH*QA19%_zaUcI~#m_+B@B4=D{0)Az_;Kb^f4JPNC){x& z`Ef?uo&%J-hu?Qu4IrAjv)27#AwcKs&&`eS`TOycNR{8mecZ==+{a&w_{on2yQr!a zmkWV%QH{c>NbX<#7^=hePA6PE+wFcoe6rv&$>Ll43>c^X;quuNj-D*IdLF;{;L(`r z#gcnjyJf7v%ikU&9>en)oa_Le-IEblFQ&8?_|P=Gd}%m*dl%POb{>pz zjYa1fgI&mqEKc@@IAJ!wS}@x0p|oVU-$UvskC+WEFw0Yfe#v6?l>Sc6^yUM0_P$I| zFPLAi7#|I(ZYuh_C96e4xf2tn{^gW#x`Vx#Qi+Tnn~90-O3zjiDE$clsRXu(n2?eJ z;~d$R9Yp|Y`=j@`#={~`QVW4VurtbOtxbfK??C5hSLu9W-QYwCxc>;6emdWU_E=ZJb&~ zglNHMH`TF15=Et23%wAPz1m4#krW4@1Gm~l0wG!HIfvAF2b|rP)cp=|56Ak38qPjBy~&OPqy}+LgKxNc22G8PgdYf9j$@d1jkmQ#5SB&ZfPO!s@6$Wuxscrw9Y#EE^^CH~`jNZDDth1U8_>sSdNV!|whsK68u z)aw5xRL`iA2b#S{0K?4(9`9xkf9M5-u@;5MjKn#3RwF z4j)*o7Sy(8x^&d$3IQya3r>$uSiihUiD~=B#Ps%E)F!5n5BH;Os-RPGxEsM+s;a^{ z$2Y!qj1VEhWyXLKoV~na)@0;5>)_VyXp{FcL7-QYH4jgsTJEx`fxy|#2AF7*rcSJ| zR$LJT8MN5VAj$rzDA8_T0FfXWC zvamJB-_(Q`;C9a?m_jvoW zAgXG{FOG@$A}?b5O2hHa0}7S#m(QXdgjAAO*AY%~jb*N;yj8x^~7tFI!Z}QU6Z9cOXDn=YSnPt<80+6;?M0JSdKIZ z7#intnyid%t~VZ)MQCVvps}?@<}i6#p-U4jfUCO?OTeZibydgx zwx&+NZXQ+n66|7|CMEE@RpWUwO;k<;8WRDgE<7|Qw&T9@5{|%=bG}nPYm@Tr&j2EL z%KjKBZr^v?;hbf)o--QmeeN=MmxtD-o1{t;Ef%qXfQyPQ-n|C?m1UpN?jcet6cLJ+ zQs7h3NDFbb7Q!ve=d1-u2O5z2K-FrAx0bBzci*)Q2)1^(QfjJd#m@f8EjwV~mQ}IT z8CA8UFZWrlV$#mLWdu@$+^F&;RjyvYV8dGZ2&boh)@XQ2RmC=EKAVEnNIi`GKJQVg z2O=iEb-t;1&WoJoY>rY2oo7+GIfT^aXY>Z+WKAC1L~9zdYzV@}^Yl5o+Wy`ZO)TU>&w;Fvi^i%S3|1+a^d#89`z1@z_|zbf+1(tGrZ{!}rnAL0^_TZ|N=qj6Di@i1-9);YXuwt6;;)?bM|dC z#xqg{EAbMk1ce+^uN%lKgc9g5Aj=g(H`FUfCJUOCq9}4K5mJzuf=ocwgK`ZBgzZu6 z8>*EdFEw@*;r~&;&vLaQ(;1U#R1R#cz!)1YyrAO7hLLI}z{LrOuO=XcJ^ChEHB`s3$U*Bl=mAp(qt z89sRSc1sE=lk(UK(Mn8(x>IcoqK<_k2?AWK)(m>RsOH@`R8}RBP2xjC@GiZ}YMf6< zM_LzPG-}9Xh6s*>gCWi}m?{E+LaGRSDAmD#1WyPGk?Hu(Oxx>hde>{Dj&`?F$!^Th zDyFHdKtw71xF6o(>MC08rZGZbv%RcW;;rfIt0CZxBcyFdJ6@M;r&V{~>%8o&f1_n< z8mqTTcd2kMB&+!#B$9wjYTf|OtWiQ>iEx!n(9d=sv+ZBBpqD59-KT35nYGrTV1v%c z7UbLd{k1Wv*o;Y~+>AL}2=H^qvv&%}HXFQcvx|2ib+lhjg)MSx4Em-bIp-WIFK!je zDR^z&_}x10OL`)LbI2^J54QdHcwTj<(76rT#eKM~mfymEUj$5S$M4(LzdvZ*;9XbP z*Mf6ikP0ed;aRJC7<|0YA}QyGRAlPgm+1CB3E5tTTdIk7RUq$<8(V;~yIZ`gg@{Fssj$p>k8G0SYMS2&c1>GA=&J^m7vxGK3JI=8(V((| z(QbRc)krB(`G8;>gwE4IKR%NdiIDLewfi`quL()6-+RY$Y3TP-k#H&u?iD#zT~p>8 z1;BOPbVUWdR8S1CTHPHy{MDi|9+T!sm6q7rLK<_J1TvOdFuyCD{)Q$XB)F~G8^OzK z%*!jZRt)!gC?y&0_26pG{|@&1T1Uk4I$XF4I>FOk+8GvYVC= z4EB1M$}zi~!J{#Umvcz=!mSgJ2!b+KWDk>TP^OZ~pJ4ZNjQHq^S0XCppZLv~b+>Bp zA6{aG;NVLKc<{UXYo%L&xTn03?a%m#`vOfr_a5& zGvsC(zxUBzj*zMoeONWH`tgZc-p761$9?>q#C9XOc`2^u-@icMrxju85QER3*ZaQf z{o5mVY(k|K@C$!zU3eynHt5;6H$)$76J^IZBqlH)rtjqieK& zl9pKD-9rM4^!GTBzW8*?;o}j9PZnH#wr2m4=KA@Z{Rd;ROrnZt>Ui*I%=PneR0#yK z{0T6pzf;h=TEvRd&u$n$-U9;e=_UFr$AqWX>|IT{np<`rMu1QRP`PC9;TZM&1{>hw zlWTU4H3rs;3w9zI@Ei!2qcR>m$YDX2tkq$mG?6oueU2OU8!->P*9n8LLlk zC{9LHlYO%OIoB^{j1GHTKA%zc`jlhGsdu_6akic-JtYKf_;E@ zA3!M3I(01kh(ZU#qM@iO@7rZ-4o%aqR90ffO;pczh5iIF!;HjWL9iC@16i39>Lp6)XoYKIa@~2$ z%`~uFnb#_Qvpi1P&E`=}VYb*vS(bSo6CI|;TN95}C|p%_P>4#Zeo=WVB_!KwYo&1O z3YqFuBg~g3ks;Xt#ROJN<|ehjRO9J_OO>Zd>B+{);s^q!gkDliYe7Jt)D7a_VnWUN zyEB6K@skQAHT~X*KwvSSP>goz=`?wlC3S+l=xma<)f3)ix7#L&wvz~Lhz|4!DRGiM z-`d`-?aHVs2y}`A&KcC!It01|$D7t`6a6vaC25RBd5N`AVa{Rj(*?cWfM|^f@yQNp zpJjwM666rPL*OAeT!6X>1SzTObesYdYjhUD-CM1U*eb+MFBNMIUwQwO-O(sox(Uc~ z5n)N)Dkj90Lm;XhrsZT_pc;z{0plFbG|UzapT3-Ncz8(N%+X3=or_T4EdbBo+9#zH z^VyWslM`0!*sf*SZE&syI06ABqSfwlxh5|Pl+KfF@5YWw>!>CYA;7Kcod$*~i-3lb zGO2?FiackzTA_9J234;J3WngKnu=1aCzstZ2mv~eU|p^?jWr#ZcIPrM8kS^QQRJGk z$awqVG3Pfo5CS^Ou*N4#%$U`GcyfdginDOV*WdpZ-aBUVCI9@xe*prP*MgI;4Orbw zkbs$vxlVHb!)$~;nDelCgxx#m=9Qu6OTx~Q<&8y+DvowWxXBUo50=ROCCqb-x9I&# z%BvGXeuf-gVK4UyE}##t(S@Y99PnG;_&Om#KS2wtn@jRxe1?m#7vJOQe)G=IJiEYH z&+f3`a$ZqriIy4{EDAwz9<-!P_DgLjp)lT%sRT1wkMSk~qB^I@3mRup$*xW79Ic?P z4WX$KS~2eLq-WCcWdA+piy6-*pYYD{mw2)K41vI`Enj`~RX)1@kfY*c0}ukGE@@_- zC*!xV1INeHkEmwx`hNN0mpONz(X1`i%yPW*Fy4!y!5hIOY?Q9HrzhH+-=eY+)?jPW zNGsI3j0wZZ5YcGrgI9>FeIUZ~U-`;AeD}K_^S6KVSNOeu^nWs$&k+b}a~t>>^m}Q4 z;Ne>jID7t*uYBWu{`nvLA%EkoU*Vs9`%i$t&T&TFMD>JfX*qf;LY?)(a5{L*lFO(D zvi6jH&3b03s8L#X&!|eOp}~8~vZPn`yQ6CR0(zqcFitl4;4n=?NQrCbU1w+4{@(rU%p3pyrseab z805S|Ye@)M>}PECLtvxYH=kWG+N#WLA-wh+ZvQ-=T`?LTY?KFWRL$+|3Db+HwLjd3 z`dU@M%{HULOud@3vwza+ueSo6BhxZjCL}f!EHP%%GZ_!zfb3Uo;7F}DVluSQ={&KB4Y5aL(QQR&E z5#kV883B78_p>O5SZ7(U=Jfib&Qh*@eg&Yn`Z{&JOwjA*{n#eh+h-)I2l)=zP+PDW z;`aU3w!!VY&N+|PirFHnE;?(`dr*HmqGlRZOdHSh`eXL%Q?e&BPDUpT2fHZ$4o^RM z&O3vz@Ui?Z@5!(6qPgT7zwl))Zzcd(W6_!BaJb9g{Ee^kKm5i(+;zt^7L^)AIbiwHw_$d^atvd1N76!U^rSWz_>RAJuTzx1L->TFe$9}d6; z%5j0N9I7WH80BGpr;YZ`cYx~GPJW4}lMnFTW39tjgH{Ti`Wh|3;9Rudb~b`rJ}n!; zK!Z;(LVJz_P$ye-Z#~swi8~r%>U9SIN+Ga~At-sPkic1oN;c?9Nk+Y#D%q`9CSa2N zZ)H7AZRurs*S2`)plfHM3aTeCt)2s*Gq8g>r8;3@o>LSVVctXUO{kZa-md2A(+Ro| zz%I3qaOc22r2l9_HDAX3!1WPTc1AS^*LdVG$JYm(esjgyrypQz#ju~@7Mk6+G%wDc zqg}~vo{|A|j(RX-Ia|^jX>MND^u`){mBVh}&!5j&?O7I|dHQ+DFQ1;`yd!bu-PpBN z!CWrl+)I{cn8q<0lvGWFlnUb-LQQAkz8zX;R8`ff@W*W%tTogos@9%gFBz24>f3sU zzN6UKY$-O15c{U*SJ#Y&1C+{=+H%%WX@T2n%iD@oQfXGJRl2VnQb^#OhsV3AfM?Ye z_krk?ZsT^M%Bnyxo6mUnOD7C_I>KGa+BEOyIPVZhgotx5vIFoUNf$z3zNmS6vqDJ8 zxUbmT?IVQ8drQ4qA$1k4RT~rM7ZOZ}NT8Ewi~Ld_$vdnuC>?F%os9~qq8+CbA+yi| zfFY`72Jad4RJ3DlZFoggQuj@R(gohzq%tlx%75MXF{z?EkC!sdAGoLnDHP5pwMOTX z+Mtg`U|Yaf3kP zp+*NNW7%L?))#q=o zN^P_Co?($uS&wcDZJeNgJ*RrG&-`-5IDvY@y&l!PW)mWKn~O^!{pV1!^a~6g7Z%%co*1zH0HsV54iel zh7hp-Xw3X##r~r>hn?vGH?QLN?i>vwfLcd~h{LybfJF!LMQ|Ws?K3W(#r#GTJBasH z6gyaP^dw$?+gNU1saTx%qvWx^$T}@O{qqv{+DG?sANTQNkDsTP+|O^s9MJ1$>x;gY zf0(l^wxB)18@_aVds`6SYi7nR1Q-{D^{gF~-su?sOj^6orTpSwe%9#aecZ==+{gEe z`?m8weuS|08JB6md-!C|*+(}#csC}6ub!{EfiJ+`DcqbX_D*B+<>J{chffxqKXrsq z6SxM(1Ok`O=NvpZV*k;IS0BZS`Ere6)uQ0i_i}Nv@t=(;Jr@ zJ=w*4bji9bSbsKU_jJs~CpR3Qju`BgTzouX|G|*i9H7QucCOqv`ceaHgR@+6SLA7!h5F(;VM;FDmB@lGB$6Bl4a`EItJX ztLsHq7|~9jhV)BFRyge(-J;nf1a859Ti3Y#cv){CJfHrN$(kewYYagJjCIIRVWr1ZOH^4zJ2D@WAgi@uW!?b78JH#o%h24$ z8CN$onG%#_AfvKR%ojvk-!{PzM67;RGA0t@L~^wDbk?BqBC4i{*80cOS-OT06Ku|+ zvLb>dQsJ5kLInSi3TJJc1lBpiyJRn`(nP83tYM{2AYiziIQ_Yiv;L{ZPros8-r}~B zZgpJ|6EXtG@LoZkY@354hkLMR!V3SC&8NTS(Lhn)$nOjc{W+oG!=Q#i&nDu zThCzH65GU_OUf=yvySU2od$FE4Xf1%L{zH^F#&IkN2v(cDychAO-jvrxxko!O7N-P zf=Yl+LCZVajcHtniLN>&wUmhOOn|)T;jFt?Z%nijcAGb^wHELF76fSVE})d?tbbHeXxy%lYi*3O?6#_$?o{S%v<`Qk zozr*Yggh{L^(lkh1Jp%DHLGcy!CQycn{@%S68y?9ymRZg7Rwb+PLCK4ZmR{fe;W?^ zJU>6@!Qn1fH#gBbvEOI+IOpbN#ZmcXSWR$OisO?5^ij^K{1#;vm5%DB#z;$l^_boL zg1V_Gn?A=Un&o1}&Bre|KI-G-5?PVp9?kq>hScY1Bamkf?ap!E6H(2!@Vu;FaV0m*LEjoQbDM_gWwk%jSo?)**D~ZyAVZTI4L7v5XPHD-} zFsjPPl(ch7QS|qtwNhR%%EoA=qxzf&gv11pD#v(7V*n}X4GN64oL^qEzrRmt90*I% zFFDNL;_0iWJUV<#Rur7^jK6sH7d$$AE8Y**P}IBh2PNmLmkjoEDrGsFKEtd%DpNe# zeN3ivzCQjH{tf?{zCFNM$JO#xH>r{-&GD1>IDhsbQo@(t`Z^!K_{&XGldOPCEvXFz z93d#`u)xl9P6tCyf9WBA^e6uhWmEI+dr#Qy^(p%$Po6yHY_{O-$B!Z)DM2rH3Bw3y z_$`&P@o<0-o>>SiU!0TsGAUvNTm#Md0N0!GAO6;V%J2WtKjQ4e6~FO|-vVG~Q1DOx z<#Psm8Kvy=JKy{kzxRj#7k+2LZ+-PQFxIhHE!i245^OJc{_>LR+2$P|NQ$F6+VvT; z=?gj25QuP^O;*viX|T54f6=`w%Cd}B!p0S=*Q@Ch>(t zAh6DKZA1I6Y{9;e)SH}d724FTHQ$Ewx(&;^m^l@=oGNVkmn_)@d%+iK;F5g zTefWktT8wza9*ILAP5OU;9P(Zm3#zXZHQ2%@$4OrI!Fb$fFg#$jn)0U~{wbrqips6%3&m;yzy9v8 zA_M%{)iqx_7?O)C^v=J>2WKC!`}hgJw%TDjTXgr9X)G%f+wTA9E5FTOy!a4(`QH;b z=E=iTZjw^q&>mv;rmSx)y>Wz$HJbIrL>uCd`zYnu+uh^S>O&@1hV{%5!iwRJ!YGZ# z5C$1yW-z^+x-#G(D;3TMLgSDRMl?5d1bT$P_y7ybM9jIF&BpYdwu*hgA}eWZMKQ|orDtjzdh~gI6T!N^9@5A)xz4EL_tnmjhm6_Uus19bLXc}2)wzU+1kfv~s7*tW zK#0~Bud1OeGRizdXFJFu&KcY+8_MHL%9V!ML3`^`45B)g%%B%e$+MRn$bzsc&|<~v zqaI6fg(?)i{Y$<+`UaQtE0k17Ef~GuC%8QhAA(s+bm6eWK!#-R@Fap=nWHC1oGm`1 za2W^gZJxi3Dv+~_ij(4$Pe1vXhrc-F^5Z3c{~Ldg#d3{9Q1)~7vWB-GKgOo#uvNtE zl^Z+qbydapuCuI`@mZTJSG+u*y|K?Hwdx!LAgM8W57u-xoz^GCdgm~A72&uI5;iR; zuQn>tHYtp655u&|fI!_eNEw0ETNU*z33Sm`=7@Ww=SJs|{A3I=^T6~wY%;8Ssycd6)PODXbs)O*uJ;wc_M2S z92L%1$uin)6z-L}y*-gf1^zS#(Os82KrabO+*XtnLPUCc>wIlrV`z&X;`#E{bgF*N zSyW!)o2ml@{fNDj5%cRc!-D~<*_!@10*kB3n!(|a(O&$0xYr{faL$u!jm#v~ zWS`~yDLcnQbSBw38lZB;<+CY!r^9%xHWfpkO`wSPWHDb6PKNX^W;BoXA;9i*&J2;p zBk}p#Jsu&my8;FAMBTicvzP3Mw_{Mob(d9qR|f&QRqqP|ktVJV9*$9&+!T7ysBb$l_K{D+$?e#W7@uP(^nEC{A3eTM`f>{v)bM&c(QZuM z`om9Rx4&4-W~V4eDef%`yuVW|oKK_3hPQ`(89nyqLwWc9wHM?ds z-hbmd^W_gGp)AElGIup8kYb1BGz~UGL0u^b@pn^aK#~5B(NqeV2CmMXW10*pdk|oH z(PQUmjSyw5L{HnYmF~9R7!AbjyGD~2r&UVQsD;`f9b}hNnxddDJk8aLQEkX?R+QEw zU(Fc<&85YSWG4xOq;p(UpA6q&%9K&B+dd4zsL=S9W|DdQYPCdoC3dWx_PEdKkT#AI$jri6#=6gux4n=cx7&zQ6J7Uapa)6{iCmJe7jSMfPVyU*) zTdk7vL3qvbr(G{vRfm`a5dx*6;*w0t1479y8%EVBO5FwYAcA`?fU(IIcUxs5gs6bz zHp4#W>?XOBk~78_EE@>0t^9B5ic)6;o031o!Kwg)by&BGpH=ZV+rw45M{m5#Vsg#k z;3UF#v-55rtaSwM;&-NGj&~lZWrPBgie3bIL{~y)QnIpD0Bo8DDMgng^<6S8Cia|j zXdRUZY}i)q@>plcbVl7Y6nTy%s^rwk@>oD;3)_ZC2|n)}#a7a|uG-|I=n|~;I-VP! zz$H`Hw}8twalEY}r<7)~Sh22aE^cPGY!P8&jR?^Kr=OLaU0-7>ixZxvHsnQy(H4Jp zz=J`~$~ioRO~CsI*Dg}Br3G9UixnX(3BarKOP)M9qRb_`dBgJRIXxwl<64BT z4)P4=W1cERPP==Cofq`Vc(1J|HxvSDGr5(-b{=w_R9a;Oz*VMDF0fM;*aXKY3B}f2 zx$_`J=nDA)frZW3J$b9!2V+}H*lLqVNXs^6b57^8X;j*g5~T#DSw}^Y;5j}%r57xx zqaB3Extd*(6_Q_g@J)n(PcB{{a>p_(c=z;g;x7a*&pzS7S9a+YHxOpLfB033qTp=# zg3)ro>{SI+{NmeR=j8AZpOyUOzxo3J-hclqoIm@Jue|%qI2#xgn#n4ug(@h@W3;zq z*)@-Mf1T&oe}v8@%em#Ec+RnX!1%3#Uw!}UxJ!fUJ0@#Oqi*=*lXJ>41PuTHAOJ~3 zK~xTUW2S#`#PKg(qI@4GSG@b~5&!n-8H?pAwsZZQk7f(bK7G!T1S& zdtakGj>RH*Utuc8AAjdxVO^j<*5m`l;@Xf89KZDL4&QkHAMoG)?*GcKe(fM83W0jD z#Cp&5^_1WSygWarC=0Z-2_%TwH>Dzo8}Ew@YZ{c!;=3SSRDr-+cdHu|Tm#Rw(y@%%1AAQ0UH&y_8D&bMBO{5g|XWt^_F^Y>_5bP>i(`a zmV5x!x<*V_Gi8y zih^yFz2R%iR@IWx?!jxz7G*zPr=)@-Q^LBxH)LZ~E6`a%*~`I@wmSymwv z0Mef0cx~eEvHb=iqT;JiMY?V}DMp3Zkrx&jO0rDE_P(yj%Mx!}+ueZHI>IAuA6si& z@G&`_=h&u&U)I7S=YA;))Dqg%-WFc71XnavNFts1fB5Sp&hnz3ZSyADg=XiX=xEyn7UUD>sJt)2MsqKE;k*cS+a+Gy=g`8naGCS1srcz6oi}qOqMCu820+Kvh?7%)4l%aK<8(jO}_l zzf!0OBDZjTy}mVGR8nC~lc1~kp46%T;C)nUxcon(1_zfT%#dI-@t(AuBYkb#Vv@pcd}60tjY2W?<`t7l#VKIrfDLWS2vwno@@cMG*}Z-#(9vf z<8H@?-aBO7#DdE$g}ZKCn}EMO*Xgv!{+oC4n#XgLfGk}`n_lmtDp?kx#C8lUl5Obc z!G%b9%LZ9yQQdBP`R?bfIh$=T(R+u^3#_S83HWRKJ0Tu$+_${wl>gde6e2#`t@7XJ zL6afv+Z$CNJ12m29Cwr)1E3@uB|uUkgQ=0Na`sm7%J!Yrsu-emtXkDNjrDCTZVoQl z^orPTQaauz5FIg`!Mj)t5LE_=0HL6J?uAy^rb1^4AQb6Zr+&HAvCvKxv9A>iG6O7#mbu8<;*KfMne4T}i25y*Odtg%SF z8w-AHEbg@~z9;|3|LM?dmiKei>^~ecyIiu9R0xBJZToz(P7XQg*?PFgChWjCoqY!Q(M1kIU~p95XpzuzNh@{No8bM?)sBW`qDc>l*jgeryvEjF00ax_f%T z;wvZdRrApmtG|4O=w(bD9KN-SN+96j!!bAKOZFZNIs53ElXrGGOCkf~<6$?K7KCK) zWB>?c7W=V>PZpegc#W;cOwLLW8>b`Smd)>*-HxIv^v&5Wd#7NUjK%fqx8oO$!_Qtp@Lx6lx=pd)b0+t3A3w49yw|~9;O$4X|LwkKc{d01#a~2k zDmeK0jE$GvYYKpO7rPxlXJlPR{JsA1y&B+s+{cd?KesQg`?!yvZG8Pphn(#9Zhf{t z-arGL_nj1+UrsnV7~y?XmeKn4PRjrO$DeXFe|_@yZb-ES0M2rx%2`d@PYx1?5%+6x z129Pc$C#aO_F1W87T2KEp!;lk(TfvG!1N++EB+sUUQa-XIQnhBcX8Qg*d#k3W7%8Q ze0IHNw}^?i`jad6kNPZX!}^m;hIz(%WeCj}+zjm$K8o=17)R27O8o5^?=?H~nl za;%*IZ56S+vphQP6Y7fI&Q1gbK0W7udH%gSUYjw32e0DB2Sw~!O;%~bFTsDUN8kKdQT`t zyXD|8klLw3jJ*+d#7E`PvO}@s& zLR%?qj6oG8rm7<3)dEyfpmc@{3HlH+DgX(QD)MEV?2`(mGJJQ80v~*LwB9>Hngk|Q zse|e&wh^&neH)evAx_E)sR^E#g#S5c^nUhx@RJYk-7WP4+tl50OB?XEN@_=&nY4Cj zCX&rjaOT#}0M^!o76S4P@0)H#=Qi)YRvk*E|L=xUtr}gE?u*;&MRlgvuT-?PY>2kL zs@ryF?rL4LSWY`R00LuYE7}T$8vs?Y=8{5u}GN# zHO59oE9WD8VBO}K^UfzIP_wR9rs-_oAgNLaHqf6CC@Ilevs^DJ^P*F2TBl`H0w^}nU$juvI-{=EIOn2LV0sV9 zEQeLV+8QY&jf-t~OoHA4M4R}Io2-_6?Y$@6=Zj@j>lzL=_vc@H_z5R_eOSQtdd6Td z;H~2xqd|}Pa?RiRJ462RgXc_V^9VYchP=H8wvxDwY1L)ohnbGbGSlUfGS6wOLn}#> z60(chGc05T9RnCA5^x!lR{&LGDRY&S5)xooISLiQN1d))Wuu*JOn3(B#*&HH{wf(0 zHuJS7Q&9!8y{;~>^_{V;Tvuzfiq_7$gVyOF7@L$j+b6PxU#&Gb8I>~I3=zA0w@!H&$r#ZA{(ARGx1?{kQBK zm;CMh-{Jqh{-=~9jahrX^Zd{G&wlGS`0mI5g7NMVv*`s{^)ETzJ!EfifRdV5=ieby zI;u9IDYGG^8ndjg**VF$oDVTLAaJ_#F3$HEsRJh0g5Q3x&wu@Y{4Rg@OJC)geaV0E zJO2s)-Jkqp_BrCWfBgX;f70jwWA9C$ZMn|-yk||_dpOgbaWPyFGa-%=B~B70(NY{s zmK`UN6j#crN+nfEC6#>17pE#;l2Vn+e?ZC^DsfVhBU=^cgKRN0O%kL;F$76*1PKZt zKoG#ibf+`zp}W_V5AW*U`<#0(2+AN$$Y)gn_ndvYd-u3{t@nN2-%q=(PXEd9Zp9=8{}3H=qyQ(5EP*pU}q0^B?08wHd9% znmzW`>^VsyIwnH)Xf6GC4+{2>xz;P_1}Mrl>Zau-5q)F^mH7Ef&4N>B&kjlGG$qBCU;(J`mE*r z9c8Xmu1yM}^pt|fR%22M1w2&TxPHKL5hVd$jRdgk?=e%}VJR}2Zqh8~oWFPvhX;F9 zqt&=r=`lHpN@E{T)!N`(4Fv$u+70kOS?)(&?#~c|{N87&Q^KbXyJp$jC#rjRO7>6V zJ5kgHv3Bg?ztF#5i^|yB?>{X?2xQboWoFnDL&i0hr8m>FbxH5d{$)~v99I!YH z1fOsQ{=~TWq$6FbBz5J^wrN2cN8yu?+L0LS?()d$lv1(7nx4Ryt;dXzIVQQ zX2v^453tuh#82P(B+FN?@ve9NBFnJg`=5M~i>J=;y%%KC`S1MFUHl)9Kga1iNBpP1 z@KOHBKYb3CibY%!L*m2t{SwdKc#^xf9^$dDdXB7vCc^5r1|>b*&+9I`r;x zP+l^1|F0%)j&bwArRm$)npl2*^lN--{|~WR^VOHW!Y{n{-F)FYPr#b;`D^|2;8qIaC@tz0Y#kXF35?VNW`V`OYf1lV!>aB{DBScXm8;_>6 zZ6kKgF_vqo2CMVfD=C+*O+=?QSRQ&T4P<$DR~nqw7;Df45Q`~c`@)4TU=?d>QkgDA z=3SyPP?aK$41}0aNi3+d$~2wa*Ex$)n2(9QMWD8_o-ul`@a(+wan@)Ouxw7VBBz9Od~vv%NX=-Myu`0!FSzshU?7S9xH5H&-T?`S69G;fr5;UaSKv$9|Ua z3^{Xk_W%$Oxo=e&zi#FouC{wafyKf%qcPf&7+)BT%9%<#x)9{O z(0a1fw*?9P8b}z|K*AWiqB3d4Ubv|7_3)n$t3s6+lUNOBv4Tuwa<0)@({?T7e5`0D z4}~=A%}uw+-5!&jGxX|y0y_4JJ|sY)^v$KfOdA2j3iOz=6yL-$XYHY~VL#TsLykiV#&S+XzeJfz=6@NnXDuyK zVo}D5CG5HyZx2&0MIlx%#ag#r&Y4VC#c|rW@{aG%%@Gd@VqC=(dz*PPe2*TE|A$>y zsRgc*`EA=Qm`=ATh7NM9O_YatfEv?UCRD&#r8K^4u&yfVbp^u85vAhV{AtaO1F=c% z0l>O;IID^6j9jdsV_w-5%g*+y&Z0&vDtAX!9D6{%FMNs6bzvGVfHS;l2Vlrl1YE!RO? znWHP?N}Ma8wDeCYc$8K+R|;=pAbC$RnygB!0s#n>wW5-lBe@iBR#hcKxt!^`K-b2h zsBKh=_||Ra){BbQ3yOnL1$dPBr&jt%99HK@Oc`x8q3y6%Q@ILP8=Bc1s}irw(pR0xBseP`;I+S?%j?A{=4?VCLz2)&RhRx1XoYmkH5W@?yD0P z=A^yp?f3(5`Hi1F|nL~<)$)Qn>Rc2+^!Afu^E<&gCpCyUCX(|#enf- zHLhPS4{ovW?LPR6KG3V=_3HwFw{CAvkN2kbo4455aEjha9rQ{2%iT`y#glf@-qP*D z=`j~}UT1Ky28LZYvx(Mv-4TMr`GRJxGBU0OxZbKQm5Kc28_V*^3Pva;xI?&c-D=>* zVK~|)t|j-Ak6hiqMFnYTx+E(Oiki+4%1oX!Q;*rKOOnvj`a}qc7(7ZrJ+6yFmldnF z;0b<-Qff$;CsvzD${O#+OpqIcaHf`?_FYO4pE$>S}9 zs0ZZ4)R_{1Iy$gB!jtsyq7S%AEcI+v5kkUg2~dT$Wi;6+R(EDC(4R>mU@9kyQ9clh zvc#-um@n4?+L;2KELgT3(dV94e+&;=+5htBVaFpe!iRN)qrX1wzV$ zQi~`NDGBE063Dd``S!QkNqZC9Xf&nklz0T4h8(e`BF8kS62VG=YCUPDjTzK5Vp>xpiJsgQ zHGpD@t14G)v;bH77wcGtIaS^vwq8^S%6Ix=(Y0)rC3y?pAA6VzC(?i3b?tC|=F556 zm(tJO>e2^DIncZIgmMg8Yr0bMKVQy=ZMI!o63naSQK<5H)3w9jX7d>+SadDw_=GwJ zXj^iQ_@*uPNV!-A%eyP3L@r6>-j3LqqZY?@T(dbDvuvlR42O%w(2oWmShjKu*(fF( z6Ch)qVPkWHU;5Dd_|liZ#%c-;JC)S8?^+9>4m4=70UOPxJoz-Rz7!pSb>69=dRr zZ@1s#0eg?!l{^@&Ioi?`C3>=dth4+Ge>@2fS&E zlHe3rEzosq{jUD5~!lir%HxYmE^uy1nQJAc0}+3XNTa?T9>i6D8@2C7=iJ| z1PE9=D*NuysFKMoz#*0tJL+mm*CwiQHGqG8-(ssVsa)S2JX95@&ukI5HOp3je;F?) z>FZ+;N^THC%jU)ze7nci_7;bG`%o+oH4XjSMvHDW(R+-mST5&mkYKWj#uD54a8K$r zHA7u&pHmi?#Q-TP88avYD$)54r!78vd{~=9t^xGcYGz%FGnNno);K(#jZtP?SD+m# zc}C+g#)`U>abgMhjTaT0*FTP#);#s}i^O|=o!@@nJv{c^Z}K0N6b90MA^x z!MW*2dGYMeF{v!ieD@oe+A!JHY@Dt5uYc`V_yyicPsYFF@ zJT`pxYhMH4-~Ql7cpaHDJI?2oD)HC~n3iG^*rKd&wIM`-0PD&!YXYYHuC)NX(+Z50b(aOy z&UoO0i`9Q{r!+g7dv`r@p`&t{UQ6-LG;B`Pk z5WCBMJHTKyX>sztC_slbqF&v@e=#O}w*uDsIjl7T3C5JDivnPZnJ)IlJ^}-FZAXY6 zDDY3p)Mi4?;M+N!mwAwn9#uKIc1i3!t{%}XmZ-{+T92wMMpuBqs=WfBj2|ss*B3u& zxpzvyXI=*Fsa0fvM9dx&|p7a?7wq( z7S@WaQeP05*MP#zpz^-{-9VY+-JHDa!MIp#S;?Y8j{#-Ncidt=D`BxHu-z?kqA{*u z&c2v(U1@w!RX)~wfUuvNuJ5Pso&2Bu5z&CMg`&<=CvX_^y+pK_7;~;|pg`F?M4PO5yOnrD^uz0p6z^nS z0Fu$hS@vHo+n$cue^r*BY;|0FVP#pov3+6K_8V=}Q4jZKwlCKG*?A z>Q6>*^OLa`C+$bxPA>FGJ838FN8D!1mXW*l-3xTBk_a%) z;bX$2493v4odo`jq4OOXC2BlnZxXO*TY?XaYR9te@LdmcCyVz003ZNKL_t(sW_%Z@ zT}>tvlLzczU6r$_6krV5i^Y*rS`uAVP1iPJGnbN7b|cARl`}CU0sE3zDx)*|2XmaO z>Baw=Hb^pGYuau`3IdXyIk!z!*<$JGhkSHQp5)sCzyL-M2{=jg-sYh`X>WQH2txoW z38ELECxaVrlR`UK^d3=JNC7uGP4vxLRl6nomK3_dUWb@aP81TfaUgk_0oqF`N+NYF ziM|d69{K#(ddI=Qemy7(7C8+{N-@gvMQbDL)xCX{EI(@^lk%BQnHc3g6hfk&imHSj zS(dG5Tsy?_G_z;}dC>R}NHO6vgF;aZfmm!^wJ}42ZQbrNrBv+7MCrpA zO9}z6?}oFFU{HKv{}bep@h>MHy#EngdV%dNf&PE)p8M$h^Tgc)=JwrG^;wkny!XyM z-gnRY_!lod!R*Er&TsFKfZzW4kMP807$5v8+V8Tl`7RctUt~6x^Y#C|@HsZ<-|vAl zn~zeD6}8=BJUPSZQ}@!$mfU;xmmoh)J+)lnkpJ#Cew}~tr=RAobKBflG~9tjl~>hI zKmG4=b~)zSV!=~SE_h+`CH~6~y^r7dqc8BOXRmVaou|lGKuH z^ii#szD@&53CLor0``mAq;V6LOT(heWFr8aw&UTt`K(~H$<|h2_i%rBoaBBA_-6fG z5UJ}CC6$ZHqEuyy98JoiifXEI-ziPjiOI$`^>{?rh+^AlvdNJkmq^O3p5>BS?wTc& z%^H>M0IXygNJ?V1Tw86mD7$%2jGk&VrGLL^ZNT=Hl45Ocj6vI);2XAwKwr6!*Q{|t z6kSG@C>y5W+1!|N1W(isl`{!ZvC}%qHj)}ZWur^~Y;6JedW&OGkV0FGR+v;^rQWi> zz<2%c>&y4Q8>@!D)2r9@ziV6GGivzUqz+S6qNLKRqxZ^%103h%zZ8hwVr_Z5wtRoC z>H;2CG|PsZ4JrUhlJclfvdD5?yQZiIcaoTOqcK|9;T00!GTQ@Z7n<>FA34^@q^iMGvz(*G~!hey<hm^3+QW|H)tf75?GJKFyWq7X0te{Vr$UHR7Z9{Y?&ME&A@?;;{4V zT|4B7=O5#uxx{!<)6V7ISJTY@^ws~F_s!nNnMZ5jK~#)<>zm)@-S^+isjav3@{KR@ zpMUfhFwXJc{+(ar@BgEZ%dO-z|KJmk!6_hT9xy-6pH2Rd{pS zy#J>kCbfs0sqW@RdzlR`6ctfXw6d<)n&(yVfT+)lx|+3?5Q+ks(ZhHt1AB9Uv2<31 z)RAMB>5kQCpd}8VQx835Rgsom0U_j`iOY@@6UO$%BS{nqLxEA9Ci+CCB9;OiQLPR| zAx~k70#foB;}X$}+N80XYFx8eG`KBC=luZ6Rh2`b=z=GPgms#`?z~770#{#t4OeM` z7nQi>JTO1_BHi9gz@6+ZX1rrM;mnyGoY8EzQ_h?|iyDo&^0LGve30S_Un@5EI-Y4R z%LA6Bz(SYz)OxXoG5y%5pD3=zsr@)gn*!-%Eijsqx#thsjy<*=V+}F3az1ii^=V~= z#ZsQ}rfEo7)b2y)3ru8)l^jC|{>YpJfLID)N(-gXBE*1B3qt7V%Dg<6ijjVtpK~7I zzYM6_%Dkv3!}UcsQEMU|r){~vGASmywKlKWx zTBe$ulGmTEhkfc>N`chO(Ia`+8;&LrQwsRS?veRu574Qs24%GvRxS(c`vfcaFCDul zj>p!1Q1M$jHV>8`ihWpljrY)H|8qEA{8d^H6Q&rB%<1KN+&tG`|IT$)ex)=q1x)mW zTKuDbM|~ zRUGUsF~!BeI)#*^igmIpeW?^{D3pp=3pseKHUcxU2BK+0j%^uVMNBm&bd8MT%Kg)y z{~Q98u|i52lR?`a6a=Nj4%iqg`;h?^A4+!IawI1`dlAuW6Q4Z6LWow~#r)^04A~Yv(JMq~m|@VZY-|KCjEq^4Vhl<~Z&8`ip}% zw(ZwzAAH9>+;QsGkjuOgTjjRvsH$7XjQjcQqFwdBUw`^4*AJUpE`QQa+DTh$Z-oTu zzhRK#`rC0G2K=$KAM^q*?Y2w2L7?we+q%`7uLu6EfAoWZ#Qd-ECQ@Y%w^j;tYtk>X zcA#(O{=O9+@{=a*Dc1?N8YIf&G zfs`bg2Lcy_UhM;>WuD%2Fmal83C?Lcf4qz{u{o}3eW7}cKpZ|KMwP)@LvJaOR2Dcc zWU;kyC3qSW+T=m~&-<>x9%4n8l^O;%N8mJ7u3%JU1aJax)#k~J}2I~y-WrHzZs+HFg<1vUz6jg;vl8`@~2~4Ps z=U~>Mm8R($+OP_)&el{2y%+Tatu^g(fpg_vT1%FubToh)yTzasHhdN}x!4c&^+~Y= z42P>@H#uoP`qs8{NrDX5Xq6z#CE=Z7fEYOb)N0tNZGWtOuerux@Ycy(F4U77(ci_JARg-vz0vKeDv~?4=Y4 zzE>73iW%j=bKf7)GdBWxBvwf^fejVP9P686l(jM>-{G^Tnv6wds&eGc3pf@7PCMGg zQl6bCilNfKbf^rYx@K#u!e|LB7q$+NWZl8x0oz+!E9H-&n^0)YpkkxSF#ue-a)q6p zofUwWGi@`ca+cYm5w$lh7Gz2(NxbI7sIG@E4{OPps;X#wM+|YWRa6R^C@MVFNM1fh z!PbW3&hvM&y}8NG)>ts;9BCgujU#dD^j1+EFr;t>tu@Q0BSf(ot|lY8xtPQm@v_9gCGF=mZ z#$$W+53S|e0;Up+B!gyLIhr8JY-coGNOUoi8;>&vWfaCJa#pflQCKlXQ#r??@!0aN z>k`lgOo8=84Mt;(B85mu0h=vdQNYwinIl87-7e2f3@huz6wncLR`}qFF_Lm%wp=jQ zn(rNajm>IBaJYXL{%psDhQ@pD+q}Uaef2y1t@poY zxQ4ohEBkwV>?@CR>B0w5XZ{Lp4ET1z`BU3Gf9)DCg|9I(u=K03z7}cjzVkkQ`={T}C%*S>{`-IVhunF7i&Sz4smbh2#%~@%3wa5%w_oO5cagJa?toTdP*`8HzrAGBZK2-1V0ZTk?w?#@ zxfR$LTXM+6bBboMAgeVC>AXdZ9ma@#cAr32$`&v^2q>1z`$$g*MLGJvLjlnX9A0c@7jw^k z3S?zb?E+6g>zZ!&2KDLFgYr?%QhcK3fvFwggDcxq0(gWloP&POg?KDOS;f8-PnP09|`}kW<8kV+BPhQ2iIl!UfE8Eo0jh_fKyV;_OG+KbGA7D zDRK%&_F3szfPFch&@FMJ33(w9{H>Q?JujhK(liS;w$2R8=bX_-NNf$W7{$T{LFRbc&c9&AlJKcwC<)ct$Ex9U@t9Ob(P6{@Kd=ruxC2^Gb1&nhFp zfDed8wMJ>fq@F;Y$T>D!s1(FjPiaZs`&OX)avcRI$pQu`NzTs>=gb!~nJ*U0Q{xO5 z&TV3pA|f{GR%OtjT~&&l0y!$K&sz2tU9lOKq_bg(wiP+Gn0bfR3$EH4rwmK)iB_&b z4?JDlU-I_1JuPcg16UwZM=_%`#7vmc;tKTqlsAAZ|8o_kSF)!t&xBm~^m z9hx-f`Oz~xd!wa(`UPH?T;^f@AhYl`&Y4fb^dmg|!k=(0e25Rct>wS^8$Zwg`S~vc znZ;q`zxnrnmH*|>KEqSZSD2JJgR2dpiFD@{yma-ubf-rwcN-X6nhf~N1~6L$w9(97 z2EDvauyVdI8tn|Ri@g7Bzseu{=^qojj9+?w_hX{y_aFWGhq?B3%i+tR6mmtr{PO1* zQSHi@N}kQ86PR8BDXRe(j44vPQBk(HEStb&>`Hx9 z>37sBC6Thcn?(UCGMY*P-)O_42~0+Y-b-=O#Gz=QUpK}CD$BflQj@LNj)o9L{Z2s) z3F8d46O~FbY)+@7g9EJ7_%6`}nQxA!7VRpw&R7Pl zM%kQ<@SUfs9GQH};*lP#lWUL(rQm5jdDM8%-ma{-9xmvAjImd)&E@>cII3+MmWu_Z zsPMzh#WU+$5_@Pvj+q#|y!Tp9%pG<-E=4|Gil+^7|X2{Ep=-kTDvwE^S+UHfR3c7(5L|x>%pxquAt3c z1-(~Zm-DqYpVJ0%BIT8uTkw8>1=m&MfuT@r9lQg1S1DCtbS9N!7R6UlZ^KxUmm)Xo zM7^;G;FPgwU6bOhsN=>VW)V_Hz(`x0qZ4hz_D!V!GuK#l#;3C+3{V zDZaUIBB0Gk`hc{)z9q)EI(PA?x?|TFjIEf@XT+kk31DmmEHEZRPPEN}$#k2#mZHFs zOY$!0=G2u&X}jh|AS!_UJYM3t6GA8ROk<=7aJYUcV9NScJrp<&LU@UQk(6vMC z^Vt_(;(>eaV%c?!D}nfyZU1~_rh}u1e6}&IaL&m6UpbU<ma3{z6c|o{tBRY4 z_xMhfj;*Um-lLq1;SZM`)mp!o0JC<>)mGuttz)vi{cm5WJ+g*S6eEws@DWEB6gRoL z3~6#DR?I4Ae4Fth(zXE~V^LR?qUmlv6U$@kh)pYCb(z;{T?*B;6{Y?xacld7)QmDH zD?7Zu2uD6&Zz&{R-Cf-BZ^xUqeg6j6505?vLrnUuZ)7yIdDE~zzxkwWO~y=W=@YeH z*|2o6MK}SPuENU(zeGytxOZ1{m*+@6KP?RrbeZM=OOK zZ*19Nv~+NAOulw)1H)-wJO7Ji%R%>JCPDwQwzooOa?(!PNjqsL?G3leT8zrjOtCq;U|HDwVAnGsz3rMBAB%RALWh*N?6kVH6gYznD1UE?$JG5l#{#6~y+ zDtcVyit3*zG!>2#HyYEc|Md`H2%;32f+uFE$77cB1xhQFF-7(7W}AdGkXftGrmkX< z8xH16ybn~B=H;u6s6}W)%9(>%$6~P{QLiQ3C736H&ee98O@pf{364Wiu<4VzqVSjo zMV#Jt>R8pb5{tZ)GH$$0UH3`)NVnL152| zY{A?&L*KY_YMav=9ix%rrSE(4#R>2H*>`jHmER{^&wTi2AK>b;VfUVoVuRDIBg+X~G zu2nut;>sF@GLn3DM$^SeRo>qria%S3X}I$;lzTt`zl$(Pw(?D2hL2~FY;9{URKdT5jT&)&sB^Ha>#;{d$&%FH7WhPr=7UNwO{sl0K8u-@eRlfDq zt8C;A-gEvTCT4?fthwKca+^w-++=7JTlWU;zN6vV-kAG0ALh%?%y?Jz2+?@jdEnId zcW6T#fRdmMOQp$S#EoSGXll2C3L29WX_<&IqEo|}jWcvzAk61zTcNZjWdXItjy*}z zt|$kIvQ;AchSAuHqHoFr{MRdp^y4r|xaUE6MC&y001w@}DM}{3!xxLhemiJO=vq>S z)OF~y+ma{?l0X+YOQT(}EwhdkvMBuokEtrz2R$Cf04Zbv8@(5p8hQ8h@Sw69RS9_0 zZzCm1t|kRpOY+xRjhZ+%%~;0fT9aZahS<1>QbxvADUnhwYD5!_E>>nrX>tsJ9E(`Y zYEm-gJV(;lVS9iKh`trIKR_7^%8#U zE4U%~7GRfEqWeg@_d-d9Ptkz*t zv86ZAD#%d5IB(4H-y7dSL}%w#OqbbeX3qXl$V24mzL#?azi4JxCUU~EP7 zOSFQN6ghaRdV(&NeOhe_{E(9*jg>+x#cVd`+TIe9XwJy|MfN?G`%@*ca+i5bQIJcK zs1!{b=~_?D9mEdnMku2(*0M-J6oZt&+}apa(pYcG3jRnr2Ky|cVWokLqo>krsCbDFo09oV<=>i#Zc^Ff|`^&6l!fG4P*f0T1m z%dfxpLww`%_laAI%Qph&M|UuJXwKzV_E0*~9(;)W00E(_YZL6@=k0Mi+UFmrlgptY)xEOelB*| zDMgYO^<=SBm3}NFQCv?&Ny<4VwtguVr87~=r4>-otXchvb#N-rmZqvKt&hZ*sLH$* z1yvcJ8Iy5k9BYlnudQ2Gjy9~u1#JYD0bAzm)}%80R-!Bv5?RL~4w7J4Hu}i2x6V}x zyZAhH9OM0z&UZ{FW0uQ~fA8MF#cAZuoiohd^$1UY>x<+`%{?iz9BuQ=<;&bN`(wO5 z#diH5FTHjRfOooI;l6io@Z2|My!X^c`7D3L#&p8rY{5GpJjbv7;(dc^eLw%~6{SK< z*t!z6>lg%#8|Jf_&;=41jf{<7d2J8x&oOV{%GCqfnAkh;H-m(0^XU-65XBhyL6cgE8`cJes-R8x?{{N|ebCzAi^^sX=Q%ebdXH9iP&$+S6d-P0vEJH>5V`^26NRzWw$@?A z_4Rt#?v1Pq3S%mQ_oB|;A9qTkI;hlb;lddGO<@F$RpSs{u}Q!yK${-NAyCWWEwhzY9I2=!wYas)zr2I54i|Ta7j>mo14o zvpGlN3w_L_S1p{3Y$>XcFPc=EosEbMqPDD*BNEVx5>GBFv`GpXeA|@xuoOBZA5c!V znTySAAB*fALqw%d?w8(GL}ggC-I~itRSGLA0VK1ipa$Q`IAO7n@sLtvC2E|$X^Fv8 z)tmInrN&tzC60RR8u}QHxV1QK*5a}-Yh+w!?Qw^eT-KN3Yq|Dm_?f(NcUf;zfLRSO zSd%(D(%_Cm{tH z_hn#ONul4gmN-kZMBd|T7VUi;|E8k-EJgdW%~G^~493{ra=hbbE^ye&J0yodh=GH{ zt`va5-a$i&uA@-w&syF}?X}&#;b&{ik#l#v9e0C@xAdbvX(#QZowOfO`%A|ay~#wQ z%0B|6aMg~Vezh(Vb7XpRJDtHF&bt0q-~EG*&8{ze(-vL_0_+2)KhE~_<;#EZmH*N` z3@7cRowSp7(%!uGgI^NPNdO#VlIMLNq_d3bie)2{TJHnXaYaGT*1jQgFk6;&40m3b zvazv(Ts9}Y@&ueYHAR)AQuG}tRg&DHKp~)VQNqZQ(3c>c5dbE6+ER(Cj3zWQtk#kU zUJ6K|wIZcV7Xr2%moi2I#3lG^oE0nAT>h3t!Aog_Bn0GdosWzv!^TLGO|6#!j6ODy z*{Bpp{I$>^ut$ zlWA_|A{=g@gV5QW2N`hcDUD0>KSl_2)y>_~{sL?0OMZ4l?}u?pd`k0B-Ma{QIm z_%&Mqk^m5~D0Q{|_V-^8OB~L_z&L7a308nCg>a$|SFi?7azX$3qQZ8$t^sVa^n6$Yyq zC4uH1l543+`Te%jJ%(H`Hk0>UHT0+|{aP?T8bFE2UtfaJY=u+LPaQJpcB4O+gZ>Mp* zDXohF;ObtFIiQu5$Yl@t6{{faddoynPU!#M-vhm^Ge~k?+ls97k$Yr1-MQ`l#28pC z51EWNhamqOX}4O>`$mG-gDOBvg%}|?{dx!7HGZlTuy1Y4?_@OsEdiJa>OX`dsV)}6Zt*E^?3B((t=>- zEV+y1Bmk6v8H%R$XtTsQN7Hx|u$=8tPihp3o$ZRdqhr3bj7OR2c$=J0vFJR+NOkre zPQCU|vDJwCb;I6hBw*a7|Cn&@GJDI0=f3^tY(ID(ci(Y=$G`HsjLjzI)M+lAJI(gh zCy58};7{GlZrkzs&wd_jE!*3h?Cl*6=fGG?+qAgK(9ESjG*0?HqYYhAX1H4Z)oV$S zJ`oiM8@#^nmisLh;IC~x+N{(m&HCTVEu)P>S$QYtC`ig~vEx)m4Pv@kTX{FfK-YD{ zyJWE1%f+&*Pn5SML1qlGZAe+T@u^Q7QOkG51x2YyC}fLXKH%CoLC z%4AXE?31!u^W@=6aynAt>D?=2-%!<-?RrzjdZ8s#6@`*ilA4i_d`a}?p|6ZFO0h@J zFl&v{j#QNVly-z>iM9q+#u+O2NpDdE?7B1*S>)2EWF=#w=tCJ}iJEi|_2(Q=%F3`c zMb2zEat?T{P@}qlhGK&id`o?1lh}E**#PGViv>ALqRA(RMxl(wM*+W5n=qR-IoFa< zGmg+M%D5;KqAB2jC1tVL^KFBzYO)@eear>sb0}@dW?X@nnNf~1;(YM4LsYXS0 z%}PR7X@T>M*(j<&Y6bi|D?oMu_O(_dFY_{i^A({LHFh@=05NncTQQ}KK&T-0n9+-Z zxm#I_=1j4ZHKNAoDIiTO!)pmVOEH)dwZ)vuTu=G~3h0}%D7q09X?6qaDwMIMs=lmW z<^|Rj>+Ikm8D<=CFq`7Lm&hm?#~3NpQ7B$$UgL$FAIX zF?Wx!6GvEx?YnZo#iIP0#hO`Q^gyK@;SSNfyK?X+N7SJ*qSo7m0@EvocWy}Os4{b0f&cv# zH^vMQgsA?>y1us%M*8p$8LK%{6qBr>jd6&H^xKzzOVLJMkzz-8*wQONFB-XTPwi~6 zw|~HWm+nC~PZ6!f&i1%?$9(`i|KepJ6Yuy978|E%9!lKUoAJo>D(Jh3*Pf<+*9Upz z!U9GWljR<5RrA1omw5KM7kJ!%j2FJ}2tRe_qkPu=-*l}Mu*`jf&XL^A7>&m$qiCC! zdQ=yPR$;BhRT?$jB6Tgn%h;w@<<`?Np=oHFmYg~+T^M7mC3GHt?}S&cE%@XYE>n%_ zL2+JyKPgh_;lH?czIt`ow(F=XhmVn}s_4r4qPCVW+6?2_#d3ksdN|*c@pvenv1@Z0 z9|AFGY*wonL0%O|`WS{73P9@o06k_ebATAbkPFH=(sdDIHJck7Wge9A-g9_(z~<%_ zuFNCX#{=X{Ec3r3Fr@d)W(Q0+wnQOySYg%t8eB*z(o|Xt@LE*ydU#FFx12X?*P*l3 zMngIppPSA01y3=C9D6uzHJAK>1!G#&j-zkTO0NpoZc)(IEB+0Kv-WccVSp!nmS<%E z68qy=KNqFlPOX0R`7z1G)zU|nzwNrkjxFUCwA=58bx!)H*MSRf1s3+pz-_=pZ3(d( z;J;MHu&{#MKva@bDNK=LkYcH(!)7Cd!vSPZRi#J0GqhWDc~<^Je8x=v!ZkkNV7 z59iFF0BE!&Yju+ybqW#6IDKp4xV9gUcbn_GcS|bZR?83l{Oz_yW}{X#tsHQQk*Q1a z%o%|OcQ&U2iE76kXNy(4aoA!9ue2csk2aQr!%og!ie#-hJZNOV3>?lH>1zt0KU>^d z&GU`5*T*8d&a=FYTd%lGz4$X!I%y~Eq@A>%_;wTJ_OE3xeqhV< zwfBY6sEMTyH0K|eGGG7oZ)oYYoaF8Tb|$x9^mbpS)-TVkzxDMqUisF)zM=E=W-aq( zw3B!5NjqsL?WFyLw6|`DJYRHFDhpZogZPX9h3lb z77HQgM#R_=y9J4a8ujXDtpvK3sRU{iAtgc=&{a_p(N+@d-T%+tn>1OHW%qr*JGlEB zB66t8n!3?o10V$hD3PL(CQ2rn7F@|pE3UNHx6@J|K{T0BriBEP87P2F5JL~BIWuE; z&)x5Ev^eLw`-_aMu5J_>4R+qPu8er`+@HHY_dA^PJO6*8SOCGfHH?Aa1_8c4`FQBorIy;+Cpam=$O*>=Y(DlpH}5(p`!;zTsr z=N=CLjA?!S;iRu6S?*4S*y{`}1W#G&*tJb&$@r$yA*Obs0VYAn=d%W^(Llq`K6^z7 zkq{%VZWX?$wUAThG=j*;>r-Z$XS;_yPp*4*L&vf2`TXnG%fWZ1;Fwb4K203E0T4cY z`4WJ0o+&K=>;oyO${@%BjWkwBY9)q_BH2K&R?T0`zOPl<=8HL|H07FhlUPM|twlj8 z?+A3dzfDlyxk#xuNOg#)C2YHotC(V3sf+66uX|fgZS$}==M)r^N{o?Og~Q>BlUZP? z;zV8gmo4Ph4GK2Y3h%xDf}7W015GuuStJ)+fX?^&EZMU#jwg;!o*|`Bge5`z^I9$G zBJf}G3<3qS4)sw%&qc*;YfZ?->&x$nMfI=2bTuba0aVq7QVSw_|1F=rwFol!cbimg z@A)>{0S2NP#3Tkc!ZC-J<4N7Wi%5 zuhdm}t*L3Mb*_y8U56yCC=W4`#xtSs2%$4o1Movr_p-By9+``RKVT3`r4}g8wOFm% zt+u2yn%J&QVWwBrgIX$5AzP9w8&Fra*P&Fk(oNgMRH2Fjo@$?@3PxQY7fT+8_NmTw zq&YFqX#vOjp{L|xed0{l1+_IpEta~zs#S2;G0r*;D)=m#P;!9tYIo*5v5OS(kl}uu zR8eQ>fgR`jcGMkL*Uh=H(ght&_MOmmk*|TfPyT1Fy1>iBMEdG0Uf$ht`}7*AM?U-0 zKjHT7#Q*Wf{~Le$#ru5ty=Of2FOa)C!bdNdKK?h{J-Z_s{P*DpFWB`1{jTG%)4)ON zGEQIq1=DoT@I=+mQp)sE5rm;L`^gq)uTZ_C7FBGE(Lvwo_h!I$@DLkBCi=cw*MF<1 z%3@2FmZBrRcMh>cj5w{16esqtf(O3a(;uF#-JQ)VQkuEFea-dtQ+!6h??BU;{x>P?Q{mIs$lC1zD{(} z;zEaKEffHKmP3f7s)|Tbg-XFk zRelx`YMu=a0&ziAPW-BbA(HjGcHV%wii=@^|7uCN&?%f&HR&9?J+(Bub`THOhhCra zsEN^>)&4n$K%OIAFSz|47klbFG4E9Es))i*(=;I>96C+7`NN?1bn7SQncN3r-!o4W zq1#hZB3a_HI>8^VRCTAM1$50tt;f3vv&!Xlz7jT?w04*R9Zrsj;)Oze7Mj7X`tVE17N3!Kv|i<^z2 z<4yR`Rkbu0oT)CF3b2hCO*yLOif?oAMRmC%MGTCU<+a1^$PgWbz|E^n$;F->1CCmM zTQW5loD0lU>o+S;;(I)~evfjkwue`{J*P?4>>ZB(>qjs7AO5@lmQTNW1&ECy1^GTi z3Hp3e342I48ULaq^ua)B$A9xLu6X(C7F;E`z(4$?XZmmg9DNx0>z{pwbB_D-sAER@wENh3H{+NH^e+xcvy#K+0Pd@x1FP`r-4p1HGJmP%dbV{mJ zpAdZ} zrJiY?38wh3udBME!XP^D$~8mw%XX_J>k1Q=Qi(xf!UmJ68j~r7_MOe)0`uvtzhi}g zIbXnkRG~^G7hBg$A%tG%zd11j-sb&MR)xy*IO;PW0^a-O_`$CVXGP;rZ4DG-WSq_$ zu&iI#HO{}GNEbp>g*Wf%hdnvz*k5c+8v6ZGR2BTHwpU74<-@LDUK@5tyEg~B-m{L! zR?PJFg0XcT6?`XUT$%HuP~s(AxV5@{99Fz&QYfs++mdIyQg-b`mC@R|--m!NSfQ^T zm-C(w0x8MkfMJNF^tS*fUa0crWxc+*u$V2eYk;5i#jP;5O2(IHeT`q#?-xjrO;PPe zDbU;ge9&TVqPzjJ=5((G2)QZ$J7V8aQzi_ZPR~+CLS(X7P_}r%SGSHoxqHcex970y z_`UBv;UI9&S=W@aI^E1EEk(sAIdiiqCbS|H=S_BY;yW!kvie$F{D9FM9hmseO) zRZ&~D*jkwV^tj`0T)#g-ix!8V>$xGSz5GS{1qIr+QCWHL=#(_!La*~1peDU%OHNuS znKMl_y}^HZo^9N1MRiGIVX^@fZM_y_Amu_I1G~U#3^-K5v4suRu4?MPF*y}O^6 zB64w_^ZA?M!LIAr4FjVUysyqp`r2+7I39LysQi6%d$2BlwEddWGw<5F_O88akF;%% z=In(x++=|#Prfa{_VzyVJEI1qz5xV2`e6^dO&gYw-^R9=x{##Oq{T3H& z_1*by_xtx4@p#wXwRi1Z`_G~MX7|F6o&EbycWmq0-g`1E0T2=4gJ&9S?7AKteE4in z=sH5*A#>v8*LUPxNhvRZjMlbL;O(7Stj=?0o-g0m+xu?rPVD=H$C2kmH*_EhQi+UE zvZ;j#(c3~=03Q@$DpjooYNFTz(;3KCXRR7^mcR!Vz^#^y^MMe|ek}xi)itsca50j` zi5P>zfwE3m+Rrs>V)%=j%&vc6*K7Y)sf=@F*K43B<*b&C2z|H0F{VMVZ2$7U(0A*k zOg0ggUGEvE#hjKgC5A4pa2RG4GoA^(s?11%(08U70~lx!Vz*c%HM>UVBOVQk&F2#_ zMpf0bfK=?lGF^+79BHjpm!?_h`Yp`&_F$7ZRD8vPQ#n_~!#Aqr?UwrwJk3al?oBMk}Oa)-I0m?ZqKZh6$lF+^1&(rb^Hpp+=?$dNJUCpLi z7@Q|rm2%w#C#yk!ns^j)nHP|w1uSb7iew}MUO^{SdhyI@y3mhY?0J?XfLkhLfhDlE zSV#*9d3|n5SrTp%R4G%^41V{GqCcf2GQFS?vX<(Se*%en|sqyZylZ>7LLHjHeskfAI-lfAKl} zt||Vlpg_EO0zkh%ED4PH_9f4syx{iLD}1y3E*V@@(4!?6L=&lfr*JC1m~CWXo)ka> zE|Mm&f&JR=+oZ}P-p$U3H4!1}eHKG^5ir+7sx(5i!G5hTdThIvRCu^uOJvn5h}UG1 zubOaf*0=3gqYn#^S&Al2TCxgDgn3i+$h8nz*Pa#q9(_}Tvd>sl(cmJ9up}DowHSf{ z%yChE5m=IaIV;@Ll7sDMMg^w4R|x9T*ws;`;Hq0xNAd&f9aW5T%yUv}x}eF9x;gIk z8nC=iueGSbd+w`6!J7; zg2W5#SLac|vEZmc-$!b$%!~SqDIu0(Y7_c;-$hCh8!y!Y2T^sQVyZUV?UO<9Nlclj zs-j67%BNB&x$5r~LR5RV;N1e03mKQvX5T`|tGa=YJteKy((R5crSR<86D@!!Gd}d% z&r4dK1!{#wNnw3muT3DQQB~@^U;eJi7*(`t$vr`zHxZ%Cv#DyRO*a98*~cwOtx|B& zpcu0?Zr_h4di8pG7r-mvCqb1V+CEBA3uf_!Hdc!i-6p8WmMWVG*n2hcE=V@`3%5Xc zEQv}@Ub@=GQBjz)io%)#c{)Sr^t#v=QA#3oJMugt;#AckC8Qe+{%c96u#De0QA_bE zlsszR5+dF!%=GoSLbXICFpp;_I}AJ$af{M7C;CN*YH(KPXJy z^*Z;JNx`T#ewvbskY><1Pp3gS7&NlaO_YsCo-4kLvi_zst6n>#p#72y9WHc~bf#7z_IvVt*5@I1s^%9= z6V~=2=sborBDE6w1GOe3C$-7V2`|~~5EJ;wc)lley~42}f>Zd?AvmcZW$9a;Q!woA z?vBt8OP>r8k|`|B71t~PtKdUqJWYsM-Ud@lb96{aHW#n>S}943fnq=4OdYf9H39F7 zjybgyq8NNw%d$<^4GL;aXZq@?qJWx0g@t@~Uf{_*>$uz3fR{qLx8tZnKO8wHa9Qn# zr9waSjIU3m0>Not9$c{gRo8;vJMh-`!2+=Rt<`6H@@rKkx}Y|V6jPb^-o|>p&mb$T z0N{lt|EchVS_(G!PiiKZVvSfQC)STk6v-N#T7N6$HV-PdBRHrS9-6;y@C(8Wu4<3q^#GtDX2Yc&cXEhR-Zjk@XQ+-Yu{@- zW8bcc*R^!YnINkE@6bZP7@Q4;mEsD`|+<(Hq|D!+RAOF|?6X$V8J}JbnKIQcKmVfv=-^U9K z^H=<@fAnv;&zbk<5BX>R=$~?XI`QOi;FEpi)z!b@ejJe>RNgChe9)^Rek)=Wfll`H z*OB}CGo==O`su7nm=@c~S?7~}fu=j8Of=PWN+OlY{-BDh4aTp6DyFybFstpncMcz; zs$`W)NeVunFM{YTtRQYSN{ux_9=4fX?}YfS7%JuABK_ zDGNBfI0S^iobm=*5?cd3zJ^(gr2Q7CcyzHbF4hG5{_i1QoOzFep! z>%CDGTBqn`{dsWWb`AZVz=;4g>Aa>LvkRo8&ryR318#x;iey5K%X8UY=aHZF5ZZHI z)#|vE4g9yBZ~M6wcjoB~R*bl)3!gKkjO3B^^{}JbecEDch@RhhJkteueY)e&?EqQS z{qCnTb1ASC4Fj_N9pL5bk-z#Z@!qoor@I@z|Iu?|rvUJiqt5GU&Xj3VMb@sfLW4Dy z-S*oQR%478{UWUK*A{Qy&V5=zwyrrH`(72DPY+`Dy7m)tt?V}N+%Edn5y9DXNE~S# z>4t%69LYt2>s%^9Y)&eA+ztNoUAI{MHs!xO&-D8PL9}RYo)h=u+hGB>rZqVBo>vbX z6}H!<>pXK>m3tq$@_76b{{hrG7_do)B3B4eg9oNEBGoFyV}}colG0iw`QVV>D)DdEYH5`>Dn{iIXa(TV zM^1A_vcvBz@ESBKbGp^!&lj)8MIr0q5p=Ps_iYkZSddH<0vYC z)y*1OD)W?ia;;Wf$K!zyo<7Hiz>}*3)10}#Kk>uwf5d5?`0>xa4gzFQQYmiMVIngznK7$1H zvs+TSl1sH@W5%Ou7f$o$IOi^ay;Rk{c0F_tL<;#5*h68#c0Z}ApGTySv#ENt=RzP$ zp>u&G1;2I5YRQ6HNTt~Js^*Y#*1l)`kAA+{(K&(ca8R|QoG##Dh0HyrW(2n^YFqLu zSrTpq^|YgFc?svBw!rVE4;0}3v_gBTE|SnR0#&LA9T$yBM-x+)Ebv+cZo z$6NTXi;?2m@hOzo;J>;_jlPsz?Ufd22Cvuvl4&Qzbm7^pTxQ1s|4vv7Lu1iWR>2`p$qoEoyDQc`#k~YI&eLl4C0DTRr@-H*yfx2bsG_UFjc22)Vn*XRJHLP4x9O@_MMB8 zk8_A&JLP<9fMp^K_8c|3m8N>-P5A=AF^&_i7V4mZ#>5c*s?q4i&i9 zWV!?9T$i!cxi$yTZQHm!SJ+`gm1D6Ho^n-nd^^WJ2If*2Vqne{DAaC(VO*}~)29*V zE1h?I^vV0Y{PJ^+;Z#*%4tu>{y>tAhFVB3;?`m8pIDY(-pMey<`s_0R&gWZdsqDLs z*D3Pasmg1~GyAJ+oonVyz02&cuBb^!(+TGS(cfv`+{HHvIiSH_3QEW5+3nUfirS=G zA=ET6Ts;A)3;1z&f47+{K+VfyRsUJ1U!(@$64J5TL>VHyn?V>Tfyd0N^!H^<0E(@t7yN_C7)ml{5 zRM0ivqmBh{tS6l_fNI_6qQLwO1!JoUUBp&u`g3VxYcO>%dtO~sCxUnh|0#f&aR%>u zvph|vY}ohe4pPe{G`Ury-?m>?{r=Hy+uT;1Dol2fVR!filoEe_TerP3Mb|fjGcjlp zg<8&=GJOoV7zhN8S3M5L?afz9yyBNtOx(Wj+ro+ZU5_}wu>s8m!4y1mvNe+d<(pG1 zk|_qD<+4$#DXL~U&1XX0SVy;Fzt(RV{8uFtZN6S4L(y%#_YBAP@do*c%nB>FIJyCW z_h0^${q^&Uen3QcJ>F^o7?8@0FmRtng{jPWVjI-GpH=1dVL|aU7ry*@T#8ymnavLp&DJVbj5VaWq*Va4_ua;ezf z{;pttVdxYZ?=1%3h49Fev)xvEDV^2I=Jm~cw(O}3uNKMsj)UXhNqYw+zH9H=-&On3U;X5l*y_!(>l@$V9=`tee(1aGp5zybgXUa#B& z%?jdeEzcP#g14YSE>(e#5RjD3W~{?kU8=VLOwF2zZgq{NWMb$krlue%Y2qMdKowc4 zC4shpVgvicshESU*vVN{Y9wev6;XSSxL3unJU1mP*!6)qtw7cDW5>(;w^hu-G$)S3 z8i+jhj)zM6edkG8lkC^~ZV9gFu~;G^C3gLr3va;!um&ntvnZR+3Sjy!;>CezKo)^g zlOg;EhyJ7@`yB5L_tN?PWH?U`S!fRz?Pq%JUF+jqY|E(?TV*Hgq4NbIU#wrk~pX*w|s2UQD&#ePhytVd$pS^uF4-z~r>Rj4&{xPGSRn=|ut zh7gE8=+9UZc!Zyi;sHy|$w7`LS-U`XJ zU}?3)llT52@uA?3soGeQM(lmt?VMW^Chh)HfWWp}Kob4#+n76TDj>+@W&{yL!j{xv=Xs`Tv7Y zj+C6(T|a?5F-@ANE=6!?u|Tzo?hv9TTLMfOzIb)gdu2}ep{FTwF2J6_BMnNcrCAUc z%5-LT*yBni3=t7Wa9$xc3`7tXH7)0yCIxNmQgs@8j~*~NXF3CHG|8z+(AY(O_VR3F zq=Ftf=S3YtWPQCQQEI82&S|ku$E!`DV2PG2OK`+>D^yl<Mi@MltSz_0C z1_gu+WR_-K*?^SV=2KqZ*TxXhafzx*8P3K7eNDe}$(hC4+NIfhFiYS92mKM=Tyy^!3!~ zjO3(1qp00hvBH%QPz%bOfj}KcoQp_O#fd78H3H|zXMNs7zlWkW;64tjBIV>>uInfh9cq-nkY=-Ow93)Gw_^Q;h@0egPfQ%Y9Vq1fr`+li%*lyuhZc5#8> z>_IcNB6smSK%Mpagnr$R_mOPsHl7U-xM{TtGM|=X^l_)EueM+BogQav3%M z*S6F5r)8gQTRpyh1rlq%m;+v@5gMdeQd+k&Yi2eON@@i$3rM1Chnx)_EUTj2qJU{| zZ>d}WmX2AK3%g#SHXjjD7)ULFE51}jR%pfh$TaHtg;4Qcl>&2_=|ivIxpZ2X)Rg61 z;B+(EIO%X+_gBU{`n}qg$8NxN4p$Uxa^6!>8~U7PYD)OQ6mq=U^ezfhf`ZR>*NZgO z8|`;-(Dgg*;~ETY$@Imt*Q^I?(0NQwMaP20_R#vI5ERI7S6Ou2Qux}heOZVUQ>|7( z)~0q@pv<_?U-WCOA6%50O4Ytk6om1iDNyO$MY8tU4NG(Wa*{7q*SR{sHi%FR{Ki|~ zcnN+l@RrR37nMv?{B1VK&THXa1C5*rVoHtJ9MgdoLD}bbaXq&ptAd-!ylx9HbP;kUItBim zTP?L`;DQsCByz?2nK+z%bmiufGRn|-6V0-HQTPA5(3=S(-K4Y-fNfYWB>Z1Z+^ zugYuE?mb7%nft>vc}`kLhJwKTjVk?NV~l@&w&E&1_7FRu;FuYrqt?P9!tuDO!Y_p% z1`_)CppV9slTUZ}80mLAe(;gMC>X3&*1U&37=p%OKDa@y>mtQsTvT{s2nco|A6dE!%GGbOA!HAlff90J`Kh1{AY|*L&r7 zWiggTF)?vE-)#WHZ{IGreLQ{I)c&1WL2uzifZhH`*B`MJ@CBr}Z4d39y$?(_cWcV^ z3ie%Y=j`%_*i%bg;%pC90du<7b!k=m-I_DQe$PB=fkTXI|0lM-Y|z?VijF5;N18LU zt?}+}&m6Dzk6e{EBc%?f_r<2qn@hIX+O&*GKRMmgfH8nquOi38fgk<&GaWzb|ElN72+dKEZd`V5LiKXahGl^z~bsMrm{TmkM7HezKRfsL5nj)t<2|nrt`9Z zf6)qmrTuSN)9XAlk0)DyusCEOdM}IJPkju`xv=Xz=ed;;t(RTe2_bxSr%KZrcWZCa z7);AoOjBhTI+A@CyMDc%4KD1vHSRAqzia1S5i3r}7vtFy-->H&B*xBE6W9BrTG2*R zR&@q4E}$fOuR3&m5nE5LeQ>Z?LB;uiN1X^tn?E>bYhASO73hP<4IXisz7L$tDI%pU z$QRfR1Gjf4ymxe6eAEd_-+So>^^bq=DgW}HexhGY*HP2VUw?kHoRfEsFJ7$$&|kiq zXcoo*U%$Ro#`<;3|NZK5ymwdNU3=I5ezjll8EI?n^@q3b;<4`F+kTw1T;jUHHuw5% zz`y$V%WwZkx5;h(9kyi_@E?BiixHiF`Nik_^ycqEu2F;P_-~o9eb?T#ckMfBzXmjMl9Q&d~K5%oCxC+JIHD1Vj;X%BzKnKsR)1Q)j=o zV6M!GrUBrcBe#XPEzA|{DI@~`rw4lYL;oOW1MiLk(bIhmSF2um_{ zyXTsdB?|>ys}7U}{__S!G&RFAC&IA91tCoat^}cGL4vA6IE#zB;MNIB@Hkf~^Q@{8 zohFf28^}$QM}J%gK;VZeD+*0>1fNWnP;J)D(!O085W1Xual=ZWJGd41OVX*7^wh@L!G zhUiIi*#zY4Vl#2SxnIO;8TOs$uBa8_E;#ZgmQXC%yM+a#_e`gI&Udet1Vk4*Qch~4 zn9Fjlt3i~d6b}1=_nuzy`ODYK{$JnU@$|TnpT1vT2QL2h)yvo1-JCgoGVtk_U+eo$ z_dGou7YhXa{ji>+9bikywj{uECy4eLwFqTn`BQ7)De>6}$9Ih^2AMbCO z^SlJUTcQnE?yp)`SaF

>h`6Neo!cqA7KI69qR9H99`c-xuY#f9#-uG7w}(ekEue6$dV{> zzFQM6-@s#UEq@-qZ)-=@n%^X=6n-$EE6uCIg9qnDEj6hdV2>p!okRoa&9Z6>?A4Z} zLKmm|{SMiHJRV22lzvmcbFzV&hNj%93Kj~F3DfOMW_LwSXTXuZ9yNK}?bK3f(;cSQ z=cRv~r;#L%+gFKUe}LmNJ~(eUDHHHb+o+!kJCp3UoN@vs2CV;Xv2-^f3`TwbrghZD3;bs_yC> zL1xCY-UFdqm8@c~HnVEU9bryt>D812OEPevDSb9zFQaOtj#5Pvp%&30b~BLHqADS^R)srD0SoYVF_KaumqIRu51t*k9}|5a ziC)N6ZHLZtVz&YF&yyzYO9gM0_ope*$4;yG1&XOqs4bxWJkFV+kJO4;8|pcqQ>G8m z?kyqrku+z9VbgETLf=O%$Z)6v;KrJ`CBYELV2YtSUUab|)dHoGO2vsN1W?@qe(Svz zE@B5#GOpJoZBuG#YMa*_m)1(o42Kj>f=jQtguRu#Qm@v&#l6`4+e&f)O`YzhqY8YDtzHi$)Sy{pYt@STkV z=Bca?rzV`8LtIo&+AM6hs(K6jw^iJ;-+kPHkGdTXw)1ap)Am)X5O#+*_xs3p%YL!> z)8_N*19iX0wo`7xJ~t;yKH*}w9!pNdXaz_$y|H~eUYR%BHFcy1FrjP5@?g8LJ6xU@ z?QQM-?&8`3lu@BY*FLW)6B_8~Vz;Q1VE;;~)M+C0{bGr{-LC=$s#4gXZbCq6BAxE_ zJIQICuZZAf?IUt^$UG8akM}#y$t<{IRfRYoO|5GE*`aE)-a!aE=Gh@7P{uPc8vKPR z!WAv(I9%_LS}1vDw?7)x1XdqMF(q4XuYunGDeG}aP9Q~Xf5FC3Q=fERRj7QxNkJ+& zCyRQlNFjFm`PJt54IpfNq^jPP1t9dWJWId@1fU9pm&IMG4qDc~OQDFWgQ_a0;N040 zOU~I z%@st1R12K}mU&qlXwi=ru&v5v!HQ{gSCN~$iKedG*2-nF`S4uOQxB>#hQ>m$LbB2R z4V|tjs=@qr*W!YL{w;1o70#m-o{ecK6i_(36%ja2Bz#m0+uT$NOXdEY*vpRhUOdM+ zE#Mm`$1wyg{1jFB-A?Cy@XNTY;GeTN$)?D|drb*gkxI!~6(_~Ua}iFrw}fF>ibEP8 zBc@j7{R~bO52vwGrIKRgcwCRAT5(`gJe=p5-SG$rX`1Q#sH&YQsj^<|39;v2|EqsO zt{I%#x5uD!!cSi&4#Pmoj(MK(&gL4jDF7;_vRN}yVVWlcatB0&InBKM`YS^4jHa?( zHfmKNUMgP#q&$(sOnP}H#vLi0NnhK%*MOgt#$_X!&nrX%Q0m1PiZ~Ox&AMJ@RsKGW zoBWWlsvQbT|G)n6at(Cx8Jlyeb&VutgQs(z2{>xagki7iFe{L1P~k;US6K@g>INtb zUKRHw={#N`!Zycpz?+3%3d8AIM*+PA43t{vERL|uL4+0d1Bl`BchYG3pg!0;D`6BQhP3{I4DVz<9q<`@+qm*sg(^MuGcJ_4Iq&ExI% z<|~d@&$z#PwY=ti*r-IW>yY($W;=HScJt*m$wk3GZ=g}=I=$x?CDf5lgpZ#+;jkOH zKaD&&9{BkB$T-cUQW(>OtML5~KIHvp*ZhaS_zANWOtrR;9lPDmiUl>oetp~niKoXM z&z@fM*Hm^x$2d8jJ$b^HubPX6?xT;9X`1jcFy+hO2BeEu31uo7jp3BZQ8UweW7(AGCl)V4f#~qOG8=#SE;k zXmQ0hj=2!&HkQLr_L19j8_eE3-Z`ln;8urVdwPK%8Jym2Ycb7I$b zIxcT^EU0C1-0yKYFR@>-b$1B*+=?iqS#qN0q)Pm4o%~3APYWtE=2~mj9wY=UbWDjb z7(lo=5S`~mqFGfVS}X{Hw`aOo%*nTytreJh=eRrHaNfk~kNsmnYm03>`lrj>hrqLg z=XzK4xo0BmA|E_`fr#d(Vi&36R3$yDDy{DZL?EB?OOzKzN7X~q4rz1 zx8$N9eL9?f(3gMH=dFMHrG)HS{N<6oxL;P??&n;dxBWSOi*0{BTg%eD0|DQ)|E$~J z%ct`@X}`H=uI;1u_O#LB`wMiZ0r%E?9Kfp7_3vAy9S@QfyxTHP8^WOlj$M1*!4Ez- z(jE4e40C+)UPp|9&_xY|I}M=wu3LaUH8ZG7BGHG4NHRO1L<|C=iM$wlV%L#f1#wDXMT{=iDj@+j+Yf zaH&wH5f}8kEOsqir;39udEz>=yxX3O_X<&2@YFePYAS10;Kt$i;@Q2MTF7=ix9$Bn zbdj%K_6KH+001BWNkl4JN=Z{R{x0bKXg$BubQ^ad)7slG8W%sKN{pWcyk!H16E zMb%zhqVGCh-JW^>{TF=t^(}qu^j>;o4l(D|vKeuUOUpcKurqqKTZo%&qxY(e5XDrx zEI?2%AwEzG3R}|?f?6vQ0x^1~BDipA`rb_4<2o;)f7t?F{A#mt+oXp}wt(%1}UfnQHiMw09x7&B} z#eAbm5!Ra3Wjns(VTB6y*%NYY_l5p@e}79UnY>YB6NJSh3k^Pn*i-Us_B^5isg_7= z@Slh&VAchcxV%6fvO<(z%Zarwt%bo7?&GLriZaQQNIR-S%G> zBmKrAO4TUuXqLuT*H5*N4xT>tfDpZB&eIBIqzShZ&PKo1oY~p2&3VS-h?el3^So?# z`|8WZp6apf0Q*e1%`?|e-y`R$04u;)xV!m^t0(UhyQnHiT0~NJXrR<7?AFxtLWr8U@mkI7yei%~?-t-sih?&+ z#~vRdT~KSjk`q!Au^&|JQSxG^1Dc!SI(=V=O=E{D`a3mK zst}yQoxbbHCr>x@rh2vp@1=ONzy>G1!m!TM4+Ej^neXrD2esk#rl{c@NWlO;o%f`9 z#<|F_>j{02B&~L@DHHqSruw^I6e42uv2kt)m5`f`&w1D-Rl#5*p zBx^9o*_SYp7E_9nc`G!;U0%XUp^Hh7OzozE0NyaE>4RFq07s;G1U-zxZ+a?
&^O3t$6{Qsg4OK>{%<$fJ3T|1#PO(thn_vSNN~}>zu0NtjTqq(;csl^t;0XrAtvb zv{qHG6Im4-1V@QQl|-eoJ6;oGPX)%DsiFzNu2>qX9$M6P8tmt-BB4R*6$Ka; zu&|gtx3qCT=y(;@q-7B(KEO1owQ<*}66(^II2@ju=0!2ehk-dm9nY$+;xJWHa0XL5 zr?7_d#u3*a3A<=xY9hw|VjkebW~{DR!Lk@RgrrG%Cy3~LL41oTw1jKGi{N6!p;q!b zCwG)ob>1drxdx@AZw)$!sFst?xr@FYP#ZY|8ywn4QwufE)@MdAILG+_x!U@pt`L7+ z!S4kughipIK@JM_sRC^4<0&hEC{9(t$pzQ;=JhkHRBD}h zdNnX59Y2H3Tgnj0b7t2E+8{E{u% zgCY*^4f3xFLr+uYuwT^!Pa_<69a(f6`cAyr1;eAJ{?=y~*f;>Jf_M;-Aw!VTY+GT|hYbkiA^U=F=q9$Df&c!XqO*h-M zX?B`o&qL)8{?PII^((qz$F3VVk29zHJI?2mey>iy*RWe-QSI8+s;cZ=?8qYY!C60~ z#SgV+7&^dHsd&SoTWc;D9w^oi2r!;UoqszRr!(8=Q>mHqz_FtNS^A4KbIt`ota<}2 zfM1MS$fiKxW#N~eSGD428`G*nnspPGeWUQO9m}Th!pDer5$^|bz9)pHtlZYW#lXbb z;+ze(ep8LU0b!4+-!Jp7x4?|wv@LC2ib9D^)v?+!H7n+Cf(zkIC~<-RYPEBgi))*6 zQyDgJId%rE4NRjdE&9#(-he@DPZ#bBkHCo{+6R1lIFYx)iAym65S=ryx!89T@h-e! zPdm@!vJL|UJiBF$X)%g2Ux0!xenE8;&p&#?tDijK_`&Do@j%Kq3OlAio(F#T&zelF z{`05*Hu0k$|KEC^gBB7Toq%;9OrDJA&)YySAh`uYFlcYdEgDgUqT zWYGQnzWXov-~avp37gU3|?Du7P1^kwRro(ng5gu`(DrW*n8%*-ut^Q8i23&-}8gsV=qnd&OO+h zuGbUCpyN&K8q({YxLvFWXuW-fc%|vjuJzPw(2h_T98!r$O{r+kSJ;{JU)*Ja0gl@X`ARn#8&{ z`>~JT->X8K+1GsU#nIF_CgtDenQj^3sNcZ-Eu=)4C1$;`IBE2}KO>m!oOYA2VSC4(zvp6G%u zRvax!x!R{T0LmGx(iXWc1_CI|6$7ExMYYc^>+*gPRhLpb%N3q#6;`?c5_(g_^Dz** zLG5!wTm#3V6^f;-padam4T2?mmhnd}kL6-q!oBeviNN(?&+Yx0^E9&`dWK%@0Humv zchTzdvQcZXi=?VH;{+iRqgJmXLJYkIa@-gx!GT zqIPk?Sx|4a*8^0UC#w2EHM^nhIrhB5n9SfAFoRAR~9t2$*{ps`lA62 z7TkzVZA;U`d9%S`CEc5H$(v`pKE}eZJ0PM;p(Rc9!vWW9w}w54LUXG4p-P!?7^o!? zx}H2wm+U#D2ddSy~%k zsanGB@Pt}3I|CB7+qJfpI3Hi>{TvTZsWr3jdP*wzXlgHLBIo+q3kxQ-gmWOzBPA#H zR|h<*@}vpx2XKY=^s#{N7eGIOe$0LQH${gUKU z)e|u#FOinK)#Tst>Zq2~IpMpW0H%6_fs1O3xWID@#BcCIP7C11k|YNo_ee>L5>QL# zOV0FH*Ln?VwtH}AKby*oL}a$VnR2Kri7*^AFq_i<&)%E$NRnlDe!shznY%|sW@S}Z z_1;uZ4~Nr$#37)EnHMb>LGSt?`V9I&dJ`ZC5I{i~Ne~|d%nT_Eha#s*_ENoNRb^!? z?q+w@!#VewxkqGGb@fVh8M-SYJnWj=dhOnGe&_$kI8mKUbCAGk5=*?K(5RXA)C@H) z`03D9PnG z%ULWHn*uGGRBS4O)>=mI1=P!hSm8<)0L3n_s49$ps}(D}WD0|^43j4=k%S~9T3?e( z=@v}#wOMTU;OrgU5|*cp!b|~y(At42Twv8gToMkx5gar%<*HyvhiY_e?))gKQ6*_| zxvBS+4sM}V^rk6Z6&)8eb-NVRHd&SVs*Zi-fCW0-B!kGATqFK)gBy2p&*}TX*mi$J zNdW6UG{~u`F&Hf6PzW)SL!}xmAi?VW2Ch0)k2acU(Zp~HShXWI3R}wdE45f`D58ex zELBz1N|EQ!4I>Z*PHpG6qKa!)l=*B_ph^;O#u!p67$O))%Sz;C8QVare!t86!!+nD zpBFo>A`Sm_%*U0)6DJUE>UhmBuo%SUtM56bq^Lwe ze5#j$%^X0-a#GZgbxdV2O)*gI;u~mG75t#Xlt%hzJ%?C>)wZp#$3fAegf_R23V3fH zt6H}2JnaWE5L=8#J~EqQ$raL)w2%N!G510&=Pj8PB(W8oHNAN46y#bvjUSvs>hn3P zK!1bsjS*#D@1#Ir);YD;<2jx()1=?)EK%X}#TbmsxSUy1WamdxwmKYl`kdsh65kXd z<8qS14=*au)+l&cE90~y*CbOSzz;M`0@oP-D{f=udP;ZWORjA?znOnWM(zw;aFzraO zIX39LJ4UQK^mtZSBtGTGD~un>aUsqHdvgFU`%r7u7|sgohdIFL@Y4uh3SHw8c=6Uj z*Y*8bC@GN2)Z7;(FatrJH6>Ojs_m9h`iDr1xwWWJJ9Brc19koOC=`RhW-z0Eyss@_Pd2=Z;6V2jDh>tuX?*&a~~7h z1{wl23;1OQk3+$CnXLB*?07u&0?lMd#;UDD_G+xagjo)>55X5*!+V0 z>^)^!u;bJ}@6WVuCvBA5YAu8%t>eDJBPekN_f{yeTch`J#^ZMK`J3CegQ~UmI?JYf z-|W|A?(s=ViQDh6XYg|e6It8J=lag?$E=V&{z7R{-&d(A^R+le=!HU;fMFZI=d!}% zzcievg+_ju2=fEZPn)wR_wW|7lx=0{FBPgBhJjpfF*Y*ppOJFq`YW%w`*2Zsv$8wv zINce{l-a-glIi)t^gJ@(4m^A~<0iv2op|_o;MGrN_Sf><9o~UwUzyu{?v?Q*-H1hr9-|^~usx%tpefj*`AMyO_1Anypj{*3%KmT+7 z^#A=={If6pF@N>9?*s7uk6+5R-kbR2cm9|h;m=(m0fQGmGnEZ^VavO8~y zOJQ=B)T^r`Mm1~(!4F*#uz$o~{LL+J+kbzyv&59CSd584>AF>q-Dlf zr*R;8_MIEaIf&bVL4fL36tUS%N`Z0Gcdhn$*2&nz>ioST@oy<2T^%lp#yeULrh%7k zkp1w3jO!|uoRR>FF_E3=uYDPdh_ZE1CFQVD0vyMo7X^w1eJid%pNGO@Hz;H53gRQz zMGAN;DaL*coU@c%F@B)rh%a`H@2SeQcOJ7F$l-zA{(v!&=>UE(*wI6Q6x2P-7>Var z0g;V0y!g&@iRVO#MgGYjzTJ;M%nNCm8TWfJTGVllTs<6)U{hz2(r?vd> zXAf&3MXmh!JDftY< zYL|N5KZv<74g+Bcc&+^QYD?Gyr?t`*Tl7DYKo!e|O2O}Tl$c~PX^mFW3nXAP8H=f# zZAuW7f+|x8+*hk8@s!j8Q$?z=o6^oK*Ub+TAHI@cP*BCNaa`eqr#iA1hk;k^&q?;d zI}gN7zE&E>jdkwj`McTqO`zi9?=_QB#tEGk9%MX}1)y#1K0ZDWLg1f$_a6iBSAY9{uLiw4F1R3-n;+jDDYdN1 za!X(s2VNgn3z8rF>>~|w=k2c17%5{6gY^_DAw^=$(r=Z*;pQ0_v$4dLihFCVz+m$U zYb(<@>ECl#{zCtiK!oT1{$9Y~js32)iT!yiY%5Ir3X+htBlov2&#uLMy2bjD!3`J; z^XZPm%`=5~e7AGCTpD!O6pxO_*OZia{?2=kpug>M{p=k|NerW?NeyEqg+MKttD7r~ zN|e`}s5N7~^!wM>U+&vDC7>iee)W>+?YF5pag17-pEI?NfFU368J^2|eQg%7;7egL z1NR?($o}RncA8+fwqVCq)g$GK^?R(}cRS%UM@oDkmBRjTt?$X9TNp#LP!j-80-ghI zbQ-j+Uh_JP&qK?6qBKM7+Qd5imEPzcq&hmHXAw!LkS_}0!Gw!cM`PGPpN==Ju z55W@e5p@-Ztq!BMcePZ8(ez|?v)j!fV`Ayg@f=PJ2?$pU#bHDWgmq~lS>M;KU6nm{<={D2*I)WH%8EO$qYF~oT$#DX6N zv8UZ#_pzJRV0yD3wa!U0w<#2>GE1+tHb#flT*TS$9NWZFzs~`8Mgs4Jj zmBAKaU797K-wRaHg8If_s$7q%3P(nh#m#x zYhg;EVlbv)2T#tXL%k(us8;$MW5Ifis@gzde0D=Am78Zbl8DrIK*?fv&3d)hze6mMeWuMbzZa&bsH71tmnBYo)l5?^b_-Z#CoIadI|ysntees0ONGsQWD(Y6U?iY9RtHd~Y5dhfOVU;Ft%f%^suQj%KYo+qul z+UG`*uq)N+BKFQ^Jx7~;-olL54`R*RK)43*`JwMGAh6%&{8$p`dA?NtYwg;1_4B-G zyM-n%)%4mqJ5vwbf_@hO;o0?p^S1h(vTyXyFKvTcyUTke&&NmS#d}ZMT#xO3U$$j; z=%|mi1RGqpRwey;9QY$ zoA!6s?I>Z!AO(b_J;&n}xrL&KfsiB44d4buS#VEEC!yR>Fen+E&JFh0o*`vQiHJJj zUi)O(&sB}eXy30zYzpP4rbMSev9Xp)?FwVfL$4`WZTrqzimKVgetv*Qz_)4Vj&%+% zmdKK%y_^{oRo<1?)YEf~c#@*Om_i3h9ID1#AfA@ax^Jy@jj32+?hn-#2z0Cqr$zcVd{)oivw zVo%jI6?pk?k41z9>s(jD&N<2ZXc*1_8-vE3koXTdV#h%MA)O%Rl+J*{(GGfVC(?4l zI*%U)CU2Q`T9D+ujy>caDb5p;jzy~>J>4lx6(A#7aKi3wUTer#axKW?c*jvPjh8xK?p#!SG(yYKBW z#`igR$w|kQ@_SBFu;hoa7dy8;R@AZ#r~4z%Uc3vXP>o?e-bt>JVpaki9}{+#>mE8#Oh ziBBzWYWGQPjn2c~nb z0;bA2bhrf!<X#j>mGF}JfDwEZ|~aJz<#>h3{b1lV)x2?yd!)=#CFmWJLu}2(PBH8V`4XWmRNAj z-~a$107*naR3$J?s|s9O#=-IGc4pj-Jv25Bo}gpXM=^BZVbPz==0gK^Q>w5V2VTAk z>{Uh3Xg}Th+1B?00_mo6<;6B%mvbWp1u@K6>v3+B{z>y8DMf}paMGn9Zc+Mk41wvO z0HNkxte0oaBPPg1~@s)+0GvEshJMU}!X}^&(VILXvTP3N&c8-Ez)Z za#}>eITf6hXCUibDlZGqt`2a0rG>5Ho>T^j$Asm?x8HT_4%Z6j!*{>^)+(@}=eB4* zA*9SWX})e=_|eagT?I0y#1DRY*U#hoKUbS#-PteT!C(FIi{7)pj^($9;r%WgJ^Vg^ zh=2XV@Bg-U;S(17%Uyvsj`&QslZw-6as0N4-H6e=5vF^S@A9u?(RswLVava<Sx(Y2t3}6yCa$1fcbvcVDP2YY{6v z06Pp6RT*i`iY8%8S{O#JNm-dVmM~MQOiIzjdw6(|08>r^8JGs@X@EXUk~;>e40lea zSX#bSYfD&In%w{u3aJP9sH*x_p_)pLfo274j07o++VnM^!s!4FAJqsi{B z1ZX`qMM{pMk|b#h(wwkm5nu#OG}PJ?yUi}JT90v%LxfU@DL|=A*U#iWwvJ&hK}<8Q zC%>g1oCk*jSvm9a)xvOgWS2jzliAB_T0f=3ZTI!O6sFOzB-o9HWs!5eM6nzMxL@KK z_z7}-$I%gEz#31;k^Qt*j;5GdQo!j0;Rna$2b!$d@pz&Q)~&M~j|+#xBo>2DEUB!) zBjYO+)0O`~pvo4YYN4r=Dt?eje8osmXQ|YK!EL0eM{hW7#*1Hm@2!4Tzw+*v_%HtX zpYX5#>|gW#kHxam51w~kyhY4~pZ)v;ytO>LIdFB@^L)AD;qFAO@Z+ESg!g~&_W;DS zV5?aF*@F}hT1?+RRDyc2hFxNFd)HV>-SUw zU;o;R)w1t0iCrqz->ga5t+GyD!S3_6^7FH2&w4^S7YP&}@9(h+pJa_FWtwuF5kmS1VLu%qB^1&XVAHJ___OuKVBqTGATuQcvgg7|RNQG*u5dXjPm^=MYF+ ztd(u8iT4eV(KfB>J*6bEZV}0k6^iI9%Kc%iq4q>pT5T=IgCySl03~Y8_nu` ze?N##)sBLZcex$J`l^WiAl0d|ioiwIdeZ3uH;!k?mQpglx^8J_t;bAz!Xg2}S}P^r ztFm700aarhaf$drR0eA+>}E+(AI)GC&_)_YMB)gfNGJ2Fla^R2d3i{Z2chMlE8+zJTUR0l1X;lP{> z>2zeAM&{QKqLSwaQV5hJDnoK?h4FfVrI0_=es|mvmJ`O<4&aL=vm}>{v(#L=>V$P( z9AIO@47R_+!tsQgMg^?I+NP-=wfn(XiyOw?56cB?mcf=A%bZ;MbXryIjH=~bD&kqonUZW% zvg^=UQ+&Gsqu2Aap1-EVc4?RUR9k!To$Xq6fa+4wuLIfibz9q(tX-A+%=z`y{oA%R z3Nt=x`w8DEpQ+kmvy$8@*=>~gTKi809pBUz`tSYuwEj`s?RuA=odJ^V9Qa)a`G7N^ z?F>{zl?^wLhahM&SA%M2ybnB`Q4A&THm+P&iz*Tu(ho@ zVV*kw7f|MU{F~3&9P?*sy8$0A+irnQfkqtFDKlz@35t{ssdJ` z0DjFfJD;}=CmDMgizA$*7^$Sh(5|uf9a70PD&BeQvlmj_U{wXI zLE)%xbI^c&LrX(r)FA`rePR;|G z$Zbl4wMZg6=fvQ?u6C$ml_zjcD-;>1DRlKkYVBi^YAu5^GJY(XVUSo*Errv=1Jzhe zNg6Av)TFlY24aCp9ReDBE^#Hh3h330?RL#Zeg=-I%D4u@?R?8HSyE0tAybN|wGGpb zTC&7&+*Xl1cNnt8!*b3zE0)nIB~hI-u8%DmP}masesEN0Hg`zv*XSH5l)w3DFJlm0 zJC{lw_QZz=z{q&6it@1^W&Dz3B;`U13)9sN`6K{gT%BEDu%p>%mmH)>$ygazRt4ya7Hw#uFcq)@D#TO3j(bWjq?ifmL5oiZN>1cj zsEE>OjRGH5pcsjTI3p@@IW9OibU>^D%B3aEbpBZ?m~k&w=_z2n(|b@<;Eawji){e2 z-f4coSxeP%WGU;IMnZ;_n-?30tCHZYw`p)XXy1J{Zfv%e9_yR(xX#VS17V4jl8CWT zbj~lpki}X#m2!h8v4wa?26 z6h?h-osMEnxpg6F5uEH2#;yIiv7QnZiIvDVt* z#CicI%D+Vco%MU#F*@fu20(HS8fns*Hz$DegJEkobf#dM{^n zf3cNe6eUoPVYn&`n(BD?`8{8I`&&3`SW+aM0$+PEU~HDSjdt-nUvbefj1?B3dfvKv zMox*3kD_$)-tE0Q}28{Li?5IPw1+UvhX$ zRbsCS-+cRBuCMm|`|o`p|NKOKE$21WOi)*cS)bk0JTv)$Sp@`IjK2YyZP_}s#AEFc zAFNI+a~Ac=HgBsHCVkh;xqyM4v)rGg?c&zL#kQnUxEei6T3un5_}CkF97g7OCR_99 zZ>?WyMdwQl1np-^jvQb8{4BN|QepH`q|p9w7EZ4)ho_&jHR37|VBA=cFPf*AM&Dg~ zc6)j5n-XBX*hc?M-yvpAv|QML*B(2t#&i(u{GIMJ#*w;}ea@*XYPMsP!ZKB2mZX;e z{t41)#tvT8Y4Zx6wplkg}yWf7%gZ3#T{_va6`ti$nM&d{k-t?rHdfxEwe)MsV9YXE- zxqgMJC@HSTCn~XR-fjFq(p>JEmyu$HmgBIKwEg*qp-D>dlMl2_8~0QB*@s8ISU%tK zDQUmo*z)@gBK~@h{!{8sK5_Z0AALS}@UxxOZ6VpZe5SLpzSj7oZ+z>GtNr(XvHjcm zoAR%J^n)j?gDd~dKezlRU;ptZe!U6HC;t8OE-RX-R=Q_i1ph#mdO0eSPd^nh_}yCm zLGA3XeEI!8`Y)Et<@vQth8pzo{6-W|wuzu;S6+ZR=XvKXO)ML_1%p&i54{UM3r-XX zJX*C>OAmK4fp?aif=t$D@R~TTu_ZDUf^(MItBgE(SvqXjz8kCr%2Jdd3o^lP+)Gx) z8tO)gK|wu@KlcG_Z3)?ni9;LsS0VN!Hr9SeCJ4RascqBf#6h7PkU&!FFjqiHs+9aF zGT<>tFnZdJu$iRvL43;C!7~o-?166ih`~$6bqs+p3$zCk;IM-ytK#1}X_N_GiDCh~ zoh-ENhgrZqJB&D8r%%M^!0!4ATdODp>Lhe-2sp{45Y{_^D1}Ea_M6=d> zs<(Os>DM+XNt|L>U;I_TK|grz?jLx5BLTmvQ{0LuI~8ibkBh<^=mfhd_2itnyU(PQ znD3G#B`RPeAHP1enK^f-z<2-YH!xYiLbDSPXDG4TT(oCozFigGT6JBC35GTBRW)dk zOX1zaz|TYOXXJjVT6{FZfCkkNQhcm1{L~BPGLrG+3iOqZ$Az3KbINCd9}sXiEtTm2&e%1mlnjg# zSb9k1>^=a9Ig^XwFj$sNLRG9L)}5;rmRR+>Jg2)m3UFio3je{s;rrjKIH5L~=OgpI z1ax;qa)F0iX?uTvPl$oP{tti4M<0JAFsZe8>#10=Gp$g_gyoJH3*H-rMr7|}RG_X} z43=s#gIn#fWPht3UzK5{k&0F43o*tHr*6+hrFJVRvHqCxPAh9Q*i%~tyc4VEmKkCl^DE2ImSni*1E5S>GjwQY2aH zUBy@dFiH_iCr4(OTu*8bZlILN_081ZW7c}L94mmMS;?%nigYy$fEUldq~|~a5~;{_ zKHVR=9vx!UnFzIZSfQN@fAd1VPw)G7ciq1Jh|!N{R)kiS5^B*tpa}eM`#NH+XWDsc zoyf}r*2?iY2hIfPD+aqJw#P{m+l`P(0-9_TdF12yapL?!-R83GCnnt$zPnTq>W~7Q zCB;dqPf*l3Wm1r;VXe##r_hTM+VkL@C1*#?m0~O@G)q=P!4l%4 z_pzbQVs-0P&DA+iTEzPAv;>A?aXLP$#flOk3MS8y5`$O^8C4HlB+;4f1AdZ3T}d80 zc$Osr7EymYMm^A;&3%$jlub;_h;icVO_Jm zYXNUbcnG{G$D32cOcUdD5apc;fy#^LU*(}fJyocQ9A_{VV}}mwl^n<^Fzl`s{L=ud z8z{?(TARYFsC79vkSmhx&H`ci>CpQQV?4%PbGp6P`%YSyGUMDp#YnPF?GoMYK+OV* z8U;}Zi>M>%Al2BSiRJ=j9UJ8sa6^@3aw@B8T~Q@a1!k?A$Yt~V0r|87KuxjExQqT~ z1AU#rY^`6>=d-EGJ$k+?=lw-VYH7Hm7&?g8V-?0=)ds0<+d8r2!5#v-?Lg7y z7>ys+`HuE$rmeeK@2R$S)AkHBy8t4eYTK4tZGJveAiP*45opdq$?bMZT+g|l zt20GNKWN)cv)2DywuKJfG`LW})%E-O{kKt+++NdmA76r!eVu+u&s7??(BzxiR-iUD z#f@^|7J58`C8zz_b6qxV`+ddc+3WY@3hFjUxUFxVYRma{%p|}LMT;I9NTU#XE(uax z)t#ZQXU2i$^dK=EKWzGtE#Mr^0A)GY0qce{z`2j_+zw-ssNa>;)p%twXZK@G5j#%u zz0TtX?T1qoILb9!dCxW^ZFHRGnw_wr>Ga7pO#$Ntpfjo#(EeHnfvvo%z_b{a({)7c zc_&j@>-!M98W{tYTBy0;M*+Pll29)dYDp9;lL0sG$zf)Canm-8F;$CFRpqgW!m(Tv zxqjYRQDBQlxh{roAKi*wtBzG(G`ENn**$o!#~pJ>P%AMPaw(z;XJiZ|#Rm#476G_Q z%2;OwoZBcE)sh*ez06rEqN1AxNE)UcwfZ0f!DX9?rOXt%o!VIi5Es4&()0aYq3SGss!c-Vs(U=FiB!YCS|Nu*M|xw z8%(mKu=KcB1vzdvkh7sy$8uVT^MXGds7c44>Jkw{*71Y%^R*OMvZxPLc~_S?Vf{$W zm5Qhb8#gGZ*xDk+&*?$b_wZ80)|D zZhvq6LrF7!kYdDfIG_8;y7C@0wW*Ui?Vom=b#_m*yVzgrf#+wj4gm7ay06fo?p)Qj z`~IkNyo1K1+hEkPySfoDN8>IzMTXshn`aW4U%^BLJCYWqRGDv@+VXQ%j<3aq6!J9A zGI&w)j)|@?*sVN`?Lgu-_G?_F=FGC3Bsge1)C@@c-utP;hh2qVkKrl6&{)&m8$N0I zEO4S348}d{pRaIY#!ZJlpV}^|1A)HxMJ4Mz`0$GP^?~8-14D)C>9Oou<%>&_Iib`Q zNqlX$+vCTnLxwTRaJg#Q;cD7(_wkIa4OpuZXNd6OM<1W>pn&q#c*9fg2-Uey&l{8zLPdqZ~?kaz!CF!BvS;imd)9>@D9 zZ+k5G1OG$HQF0NxE6=-pgOBq|1~Xv>jkibtq}xo|fP?^Ux8v=veVY&8|2yrvw)f8C z`}Jl&a0h)|?{WC3p<`dIyuZ7wzP9P^V z#n8uQ>zG0NTJ2ojCU=q)j&sg-#YwlBtF-w-O*2)&&7R8&f$VL6#HDC^ATNPopsNbY z7_34}ct1$7P)?Ydai$V-yyPsZ&ZWIO$_Q4*jHP7QPZ(9D zZiPKnJJH$%9NfS+-dpn*ZH%V}uII_<-vU4VXl@7BZ-O7ceCY3mpM7}h?;T?;FJFBD z5B@GJpZ=!*^)A0X01`Q3dWeiO^@_tAf`{5qCv zrGSh^$gZ!n!d?R@rdFO(#bymc)DNvBCTV}L9+wms9ygY}lx1B}RNH2}h9~A4f@&h;pDz z!a|q@I8s1z3suUb)aiuPQIjUSb+=iL8S#QwFun@AqpSnz==RVZNq7c&xKWy{kP?;|5 zg9m4cxpeF5-5|iiBb#U-q{PjBV2L*0*zLLv@M)gc^JENuaHJ^qJZ&wAXCQ(#mJ~DA@7O*2x~RMwuvXqv zuRapB1M3VhVVog^!Z13f3A`=L^9f_&aM)9Fl!|&cZWJsMwGLgWtfl#C6>!NLOCeJc z^#$2qiycMDD`$a;2IpY(5}2rkS`*e-P3EPpd}pm=v|?d9x}9#%^mk7PiJV7b43v_w z(?Osc^OhWdL`(I4c7S^l4g@$IX9Wv)QbimRDip`GlY1%0S?{IHFgpAu z`SB(Nq6Uey=Ge9NFNLNoz^QUqCEdNTYwbR0Oy6&lH3%+FnA3z@xU5)F*t_ z4`<-Xnd(kSdfG3*qjpRn%4~j3deh)Sg8-?{cVG;(3vUS@Kaf;0(b?^L(o+?LZ$P)* zB#DfX#7$LY9?{pclq}YGMemm!7D>ovfdMIHRgS3zLcmvx#gcT~RgI_&=3|g^6@xsF zxnQip7z*S3h7D$x>AtJa_2qaVeaZZk~Chh zZbyn5l%7`zwv>!baRq5ZTp?K}(8Bfg4dqZY_=!StUJE8vQLhvUWbY4sj8}F*74=u= z2eAoD2~!-#@5swh`sG;31yM*ECb=&Z_D)L>bsl7_nWCda8DFQAu-=FYuBzlTt5{>Q z9-rQ&W>1(K*lo!3jB{BNf<~WpqpEr`{;g`;jv2_QXtEBVkQcFVF^I)1|AyrTGkUX@K3@ zHK;{SgN2$BOoydc!04&=ziiv~_XZrMaKgD2cD`J%oty3NXWP91kRK(M-_Z69Nct>o zt;aZj4sf;pajVAl3Bchc{AI0y4TSWIv|Uwa&-?OAaLX8j*&NFjI&_;P|5I&CHqN-9RoJ;gSwuP1CIRS@{#zjBS^6RGsb%vw47C~owXwwPq~JnO zA)VU_lw!<)DMpoXL?NP9RUyui!}T>G%rbvbWy(?_}?sm4w$Dphe>bIfk?r^a@nqDNCZ1B6hVY!{+^V z4j%gcI&4J&{T+S*5SGpTborb-Dops4wolqAD~Qt7gg+yE*p>#_odJE@z9XDIS6cy1 z&(Fe^Qds8j_q;cTZdizr8@hKJ1 zrvS#w?={YALCOX`E>E0)h2}xPbF1Sy*_RE#m>&a-#(9FyZ}R*gV>t!gogc`kVyMO= z>_$D_DvY><1a%fzzo|!}1zQD(3pq!u5l0GRe2*6xQz#`+Yhf6S#?G{D1hbr^$kjHr z>TTQ9$6Azo#@)5f%dRV-H%VWTr4KE& zV8=n!bgWkuyG09qwNmgi0)-(Z=A^}FgC{bQmLuRf-34;IXM3j0+W-I{07*naR8U6& zH+axFbX-KKui{u9W&stBe7isU8Wb`wysSz?ee2JLGt`Lqbo$v~KoJ=Rn5 zi5LRIB#tIA93|Q8yv*m2_?U49QlVBujuGqkJUq-;<0M#^3NhYw#m!du0Y)vZi^lXE zDMuUvKT46Gfhcyg&1$#btH!Yf3UbaJnihINo^Me>ON=`$9H~j-wiilXr4&&}tQDMC zLDnh-Q+{{o?keb^ZtKt5 zZ)44V-1l+kljAX39B=Kv*Z079zCT+~ansh>4Ayh=)|Iw}o)X-EiSm1k)n2b-K|esb z7!Q`mip6~#bqOY3j#c%uoaB3R41|zz!(p|9M&e^_Ffdx3hsYVEmcq_ju4@%{iX!nU z3&b3I{Ml5%ZUCT9f)g=FXmAA?finlPT#FXbi|S#66KkzFA2pj z4N{c+fqZuS*mLvVE%O76yP4DJh__zii_M`1QFCuGMdLiiSe%nW`&ug7V$XII?SpXq zm>O@f)?y7bJmo9{tg&&w31%8S;%5uA5EoeAU?drHATcDJRBeNym^j4OZ?Fv zeuwLu8%|5$ryqU9fBG-}m^r5&dwu@wh9AEF0bhCdJuvXImoKG27ugqMirAa$J7h_f zm=m>HytTwo89m*ZrB*4#K3>Q>mW!V)wZnN5n`zNn(^sliqH8f$r#@M@D*SG z`nO3T@|AZ#;%6U9vVRVR-RPK8W;a@zNKmr`e)CcZF?R=@_PtLnZyh`zZ`LWPF!)w} zpl~KoYUcL##O>|rY;!3mcDp@%n1~949}Xk;cem^hS2*Xm+Igx?++0su^aqv1VW)7Z zw(G?i3KCM}ozccYwEU7Pvl{OxNs1B1!=9QlF$TPIvMoc83ALC^trClF2M{%1WGbBI zg%}h2ad^WCtDAeNo`0^noSZWjDKe!(To!T)xN(wMn^$M2mLpKm7lop8PS|0f#>hBL zloZ$eTZqJEA%%cz`ANNH+uW&vl}$}h&Z~|?r$S5x>#Ha!BhFvTyfE!198uytXH11g zx)l(VcUh&@h`vE2KBfI^Rw%O8s+PnRYSC-19cWFMV$>C=l0zb#P9l~N#7^B$J6deb zIxpv>LY`+rXx|}um8w5C*NL2yLV$7v!{E5yjl>km$9pPO$95I(#x=&8A~{QL&|oOl z@a5+dG0ynWVX7em@4a}Js=3t^LmwB?-ZhP{sg)1z1l9&9x$wd329z2;`1sV%mDO?U zN4MwWn=h7sn9Ccw+u!K&TY(UNfdl_#oo~;Nuh9vgrQupl@Tt4-i7UM6kM);6wpx{G z`8;h|&y8;%RAW|I+h$qtYh3>FrQ7`W>wX-57aq4yUViuY@Qda5Y1!}ADsKy19mGDM zEjQPb0z)Fd{p@N|^*ymw#Z;Uh$y*BmorsoNAw{TJK@6iwEk{gC4@Bj(;EdQ45Mx*U z7^b0b%sD5jB32SBIi)`6EgMBVV_G17z?G;FV3lgrEQ4s01Q|p^Taw&1rp=7Ga^~w< zp_(cKzr2Ea-nD_Zs4%&q(B!zS6L`%SvC)i6)SSu+2tsY42Kk!WY-Jex1^Wm zWKxuBxELcPMzXUC2M!(9YY?DpS93WzG3o>==fp4$-D-cQqSE&6uX|~Kacut za$Zsg2CWmN!AfB~TvI||2?3{;e65PQY9%?yKtz%=l@w=UEDVF^0355_-}evlZ&VB5 zVeo{oY}S*3``yE7%enFIzyHATxKK6p^3dQkUCBAm$G0b5*d3?adz`hTlJRO^az;H; zyP{u=Q5C{6l+1Fc(|8M}-2=74q?W$%aaC$tu3o%%_It^R)9Y81oQd_kn)+%I6~NwB z6#%E5=V7UjhF~!!-ntriSW4ea+yrQLqhSsL{_O?{a-3q}iToB&S#seTc$iOGaVX%% zai05q|MA^juYt_DaDO~K-c&CDY?H9_z;sQ9*Bcv@{r)+_RB_Y5l`p*Y{5jKZPe_T; zc`}u^(#1Ba3`sNKo#%ytad5$j2T=a*rQ_dx?*oDH%s}N!7z~HE z`)MF)K)+}p-yzSjA1%wny})^HpoUifgjg8|r`6tBg2Xxuv`vYud4lNe>71-u6HRnhv@b7*&^EW?PEoy2OyJD!s_<+H%+wHJbR7l0{!0A0BLCoh@ zd#N4;VASMOqEPUvkPu^F@O8EP1Hj38HQ~kyXmC6V56p5sO2!Y9Tz4lb3nfLZ4i}50 z>e@9DyV;s!58l?41S~Xi-S&q)HAhnNfX8SM+FDBpqG%Xn5G9PE!GZ2`!+{Nwx`YF* z^_-TbM3|U%5)cpb5o;aZ!(`2Q61FAG{jer!F5tkYRCs{T1_-vq?l$>znFPN`Q1`ZH zpb=~0?7z6kh-B*D!^TeE4~lFB7TjMevkjtWumG$g1N zD0x0%ed)o#EhH$3w+-~x-irzerc^Ys?6g-k9X7)cEXzVu2W@JU@?3d+ehbVCP_UMYw*@yHn2*Pes&av#pqfL0 z6W{*@flx{jfX)shDI5ik$%$s2VyvU&DnLjQC7^V=#SW8Pw+3=DkdLbF1d=pvkkq}r zXL5y7A~i{Ss2HOPJnYD)ppdfk9oFy2r@4;WjqmqeQj!z3tiZN$qsIU7_nTxqb;8 zZaxbqh3LE_MXmLeSQT=~;15))Bpq~&W349!Q3{f_gDU=beHgQX4g(fZ&#P66bL_C| z)_#=2>6o#D0tW^K00q)3#bR@%G}};XF*=`$A&8CnAdreE46DUe&3bupbCvJSK-s{9c>@ow>Vvgr zatJJO=IZ(_0qacH;JJVgqZV^*+rw^5_{js0E!);x>_UCeo~shN@f_}b(|Y~0%^0CU zC^-cDL0Tfg^d6~xvTU$$-6Ecj&GUl1hRf{3!(EJ~dE-aUf} zH`fs8>ae*&j%qLN>1v2=%-8JROI?+048XW2egaHbjKYNZX_znv?Ne&KfC)Wh9oMBI z%7og78RNlN3_F&S6hqZoAd98*S`^}#PX&u7&+GlyinT;&Os!yZVAx+v-+~u)!Z!CA z43xrTJ^uL%QRMy{K;hjiinQtOgtdA;+jTRZdDeG~#v0`BnX<^7%#R1+@hFy>ip*rS zrnUPU0fc~BXSL0Z_)%aci8p1sa-q%vN~+jlPc%~4LluRk5>Gl_)caj&(-ang4Pqf@ zqxRK~66Cv6EtD|JxNn%S){(-3wdM@&%Ozrr6d^XHG;s*2IV9Z2i_i-Qw*A|- zZ#;towNKr)@6XZ`eZbkAk#$_#{@xb18HZl}z4hm1+mBte@5M;l5W^F2;iGZZ=Kg&O z5btBgCyu3^`?L0&zWZ{__y_=h3QV*D;j~IqH|&KctP$%C-g$OAk5MpDtm0L70_m8q5CXg>2tu zRTj+poEQAycy|&qq$jql~ePVL9HhyRy8#-Qll2p(F<9NqLP= z!y4}{DdL6@L)?;^WLc}b;Nls$d>C)2epFslO-1pqhm=` z@=D$kV`Xwu)ZNZ;i3Yv(1SY%y00HJx-2WkUmQ6zUlaW`kp3D;QHZRzW>n=X&37IAN_>sMhfu$$?%N9+in94mC0M?C94AQ zc_#VxC_)cS-16CBz#91Ab?zWQQvsYM71d+*{dhuT8hwwMzdCOElPd8AV+?8A$8E;K z^Q?CFx(~-=<@WxB^H0kS1)Qc`P?jYapt~ML*7qGg~=V|4W+p>BqQ){@HF? z?d<(H5<_709*n_HqX?SRN-=95s{nak*xy`t5tC(+VuryF-5R$!l*vxj4T2~~Xca>9 z!>FIFu3#-rly$5)PE-H6*7{h1tFAC@TXM?@4g;goB()0sX2(oQlJjhz_igu07M$Om z0gu*8tkl&&%91-Yi1kdd>C<;8P&#&sFFIBe=84E%YBSb(`rJGkaJ^|~-tgNm5B{~~68^i~?33y7C;oO;Ch!OXr1|T8 z(&m1d<#*>6{N34;FP1NsUw%0pralm;wQ#j-ibn!%9QK34bpiz3sA6AEQPkm(fw=c$ zfBc)ZhYV&7c0WPMm|BTP1&lPXCQ5u|h27#JuuIGeA;|=>SW&IA-Vv7uo%KyoyF#Do zpqUJMR)9F?2wA2l%}Uo8u*NHlwn^l(f_BA#Z@^crIPXPK${37u0=VRits>FyM^SsS znGWZO8bLeHvf;WR$c?EwNH@KTQ6NPl6?!^J$=2e$RGBp8nl>tyIkIL_YyY_a-}C{i zS+7+K3Dh?5ZQGI!wn6<~^q!_Ac>uCy}ATHCFEMcuFVb7!4baA9-J zvjkX|)67s!w}3W!ZvZ{;-c$fzA4LhLR+w|-Ats0mS1sVGXK~m}7-LMF!on#m>@|_! z7OytPDI`9=y>HEl4ba$}lhmwDSt|~`bprO)vsJgdBLB2WrytqB^A)uaf|8}m|Mco5 z)AjR5ZRh*f42LVZRy;fVj&OVs`y)4DU0H9!&$-l#e|5+8nUr5+N(vnbsL>l#QTmH1 zt;bx&?%7(0A0*&!P1b;y!8iLIV>;B*u3MY1gIuFzM4`&$5vn2CfE)L`^R2IvBJ2(a za8)cda#KN!>_({sJC>Qj4uqPiUZ7J`24W2is^Fvrx@1*qNwZesmyCA<$Kw&KCl@G4 zzw+|cNhYB{lbWCB6QvZUQGw2y|3CKLY)O(NJJb7gF*En@$cS7jt844(1v`i#2tr5! zFhiLO%HRcNcs0+!hv5TIgf|r71w}|+kV1}d8v+D}#0W6h8jVIT)!o%y)s>Z%85!Y= znW^gG#Zgr=^YEz3S{fK3OGT_%a zC)PeUrpWN>7%E^pP%vPUG_h2OVLukhJwpnUOmC50v1#Ts$P}dGIMnM;DWUR9fo3K@ zpn-Qo8j}KaZIKYy%u|`M1@^tllM4dIGsLKyf2*u%Z#-V{@O;PmOgG$iwth&wuTGM# zg_JY=lv0&=*rU>S8qijWm5_s%f^la#s03pQ80pl3k%X8=tWhA}I2=mn=C<@b49OtL zDtNKgg>fIO0*o?{5vwc?zUg$$u?E_+1vs#29O5T%pstB?aNwu`F6$79tU9mHJ2j-_ zvEC}^&m^`74gTM3w;1oZzP`a2%l2@Nc#l1hnTy#_G}nR!l~;)RKC0bI!e-NM3iGT?d#NDp{9fZ&OM?{QGLz7w;c zM|ltGwa!2-hSMOw5)7J4=*`=>i^Xa#Q_SkD2FFX?AW4BFx$ovu!`Wn*?x9;FVVppM z*6Sv7zUNJeFzjenQv!e(uX=Q@(O{m*Qg#_+X8>%I!KwmbI|YqR>1&np?8i|VKdjYY zP-c)cCI{+It=;T3D>R& z`+ZIbFbeJ?B6hE!++hyZOGwz|;OilS^&+q$?1#+s8IcsgIE?Fv`zcGljGGGBv+C%_ zd4^$7=|f3Vu*$9pL52 zGY_y%fmR*2rLLKc&sxeDt^>?3-ibNrZvJj-0CxtIdr8n<0o#-St|cf_9Qpk`1sE*n zFYk1|p9-qU@6P^=uR%QlrQz%&|bLD1i%|I0QMNXXB{$TiN_-V-+s5{;iLO>X9t`Sqy(5lPzhb@v;CT-h#)hl52P@1 zae2---d(r#7O?^`gX@e}Sy35Z62RBM5M}^Ay@qi(5QYP9yuIPI*De=pvp(J#T?UrE>_WO{}Z80X&wv8qkgt6Lu6SzFpz5IIZX&g1+lCkUJZ4+gM~ z=q%@#50%j&Df@U?4=0wQa^1EJ!g~EF2_L-w5#8z%4ls%MQ5i_>EU2pMh1D?(TwgsU zg}}Z0uY9KZ#2fD2KgYEY`u&30)cRGOlYo;zzPmtx1ssyXxUhv@21JPU9}gm&z4yl7 zmQem|K)~De^_?}^Hd_BKFyVZSk}ytS!VKIotyeH%21!c@)iwlA5>tb^ z5{3#KHda}xxC2mV$a~N-U5A(%-6ueyF)RAL&KHs;EG>D@m(pY#?i1jVLG54bEUsOV zh6C1VqKZ_x<7^Km^&RcEBlaL!?s&jki|fva!#s(k1XYicM`C~>^J$f1oZ5C0B4OOm zKz(Y()rgGl4qmLeuRM# zqJqLvpNVPKh;107p4S;=V571>PvAadeYOt`Nd$4e%I+lrXWSCl2c#_DSNaH}iFzdg zY2g5}ewj>C-l-$@;bU-Lc_)sKy_L{WY}2_N1-HS0pQV1j{slnq*tX;IfdgN*{&88b zP`?bo@3?$gfM725nKOa>B#ao*2xH2sMwSrtf>+%JLBV3iHpCDSJihZh*gU8Jz3uQ3hi&B1&|vO0Ycfee4_sqI50Mb zzHhl62hPscdEGp4eRD(Cbu>v;ZE&#LtK@svt+KktRE8tqo@CO8B6(WWd#tsDnaWEo zIj;_=(!Zt8x=q8^AAXIl>3Bc=p#JvZ2Uj&d6QZy>_x#eMU*esQzK3lbhnoNqp8Fqj z{@63@Bdd+){`#EvKYR`XfBWnSr%H+U%yA}kme(cO7D0q43Y z<*6uNy|~$B-=wX5I9G!LmTFMfJ09M@M+hUnvf=5?3WjF2%1IFUVTs9pslc$?DS+Py zzU`1WmnN1;!WtO*o-htH-3sfoGEI*4^@juNi+dFKZ-40ZejAoSxD1Fa??Hb!kotk( zY~8e^U0HWLD8W zyFjv7K^Tym zzUljz676ck(<@EN?xeM_@sN;rY!;39v8Am*wAzBD>r6?#q@r@b8Y+KlbBY zKOP_Uap1p?ZSpgemu=4O z;;31i29g+jW+ExH+eW~3EfKI7a26@fr<~yesHJ6cCQjbWCvvvF0TYT`Y~I9Vz!HFK zCj+y90Snt6nR&)qb?6B*fSzP&rrZa9h6%UUBgT-zK()c8TsI^`Hqa~)r6NyRE>*#1 zv%o1-Nj(MhO%&r5jH3^cG>q7`$@0I&c-7yAeqeQWrq^dsSrb64kT9Cvg0d~<=CWL} z8qmIN)zMm?ux`LGu-=^4=R9QI_&IZ4HE3u5YgX%;ZC4rpyaOFp^xGY-QN}(A8N@Mb zXfE9v$B4@t(p11hd9&o4(zfew0pmT^I|cVKGyJ7w8cpE8GSe5vKhw0>*(Lzs*|i4x zL!Y?$XgASu+sLzLJNhy3{6-}eo;-cV{rmT5b8!A-}EAly-K{BoN0icPuai?bSPx+J{4yhAyQa zBfcw+7G)#@82Z4fY4N^f+Uu>Y8p9Z-vHIx2C9l5zl`QAlASp~vKckzO#u=W;Q^4`S zJ>rK~>ZEyn^%m~{hd_A0{p<-(4j=G4U;8co)!+Q7I?)*z5SfzNT4RdjdD(EGHOT!G<2ONe_ z!F=^SAuhg~+l8y99OJSyhr@_EB1J4IO=IGeO{T}?ekkMC*y`ViU}42POt(#!FF=#EDuzWC;!h`mGp40qUuIm?Rd)VsGy~$=r9AH(w5O+AWe~5-zMHXt&Vf^Rf%ZOa{nrR62K-llD z!5FQ-pMZNNvo%dXy|4t|WwyBe?uLht?yC%sm6{kPAtLF3Sf9_8C;%$^T1yGGK1?e%+n<&Cd@#`=32FI?Vti+SMIedhVgIE#^3`(v}d$Zg84wPilv zENzCVeo7s~zURZIH{82?2qSqfC#2YC5aE(>LsFjOF<7T;-a{C;cd7e?u|G@zk~072 zzf&sA%%<+Y`~3?p?ycYmM92{Ur2_FjC6MpqfPiV%UlnwBM>z)n6mZ~O_3QP$BpB}$ zm`^18rsjzjFJVJkJF@}pOV)>ly(VGQ=kRf0z#|r}`ML#q4Ml4G*cPp}K(0SOcd-p( znAYZFkpHm_X)2t5Q($3M_Ke--t(AbFk_E0tA@#j&Gn7R&dJm(Q=hlUkh1S9BD*V6 z4ERPF;1~YX-9c@`vG`;Z_!EchS44eJDGvB%1!J)V9V8)aZ>lt4iut*AE5@NP1r9_> znl#+B*pMdyR&MGT7xkSAqg?)o>E_neKvI`V4o34B9q*7 z7%>ufX<*+hkwn>OmLT$Z(gt;In@Ql#_Is5{b5=hb)h}cH*oG}&=fygd>o1Z%te@H7 zEY4qT)5UvmJMklh@fP?Gz8G*{`R)`z?>KQ|v5r|^6Km$S`tlxU!1?3fXKTq_^_^=- zg+10cC^#7&ItJh{ogEGa|kE)r>OxC#UKlVpK`QS)WNk&0-Ab zb2%U}vOgFMmT?$3^aBrGd9C_~0Un@B%>$#?H;j=a!Z}pHW4VcxgqR|$%W}_fbF<^} z@|^Wy$8Lx?XLxb-lmbWF4W~f|Uw`;D0Q#}#`3F5ipK#vLtS!E=gdlLx=k$~C4#qo% zU0`$H6MNy+_D!Dg9_`wZlJL&=pXTuoGeTchjpZswbkc1FNF&H~RgVz?MBX zH@dbK5MY{t7?-_sM{nlfUJN7MW`l&lFbsHam8~;_aML(qn?^}Xaw5Ux3zr&a@?A&h zdpfUiorKVI9nPC6hFRuK-$EFWO8ime&NW6ihLmHMLk94Pg7kpc54f&fu*@9;2J1i7 zcQ1r2QCuW&OI!V+XUvJ>*6AEPk9kxuU@lG9(eDlwkY`(E#fvFvTuHz-YGaicXOo#8 zt(2JI>>AN$ASg?vwMyI}$Rs6 zCrzyrODtmce@O|OEe#Q)vA_^Wge;A$>zffJ<%uz6;4HYcVgdAgiJ~ND$o&R{anI#i z<1)r=K;ZGiO;%BYw_aUUKWECycttbX2z+$4uj4w2@M1d$roxMxzWON;;l=iDmi;fw zzy0Nx-+JrTci(yU-M@z``J#&g+DkI;vYeR9?_4b9lMlJ0e0cQ&-u#4vju{TWAS%Jz z9z8e$0p{=Iiv?K8IQ`kKZ_i~|N`NsAdEX0lOjvxK7>5EDz5E4wX2 z4i1|N`pCDGuVn)2M0ArTLe6qma7qfHX1CbvQJoAYWs6hVe@I5KV!*lChELSFXux=t zB-72i&PnQYn52Jwb>5n41Q!rsF@6y$*wMO%SR4($T{v9AI5}I(eOG$%eC;A&voqZo z7<XXmVe z_5Ft3^O2jszNT$F;ZaNf?v72{&^DgoQHyUa7nhombokMh?yDO*G%PDuf%T>3@UsK^ z4+F3K&I6vkd*E;o{Do%c9soX^HXb})6Iw$TIym#BpKQ5_TMoPL^T0jE(C{qjeV0tQ zZ@&7ANJ?C-Kj01X3;fmfpI75*@FP#d&#)f;@9+KzDGF!z_5J&beT(ax8$R;ya(FQy zQ5X*THop0_hJM@g;_w~_eD&g+><-g-^v=?Ukq-{>41O?W#R$+g zwvK;g#L;7tM7(ntBa9&~oK7hjY$5Nl1-OR>FiPOYI>sYUB) zxcps!?2fNT51Iv2XMvQ;Kvuv{b8mLJzuA3SuZ(ze;MBa0#Wj3F{d$e{bW27v0Oz_z zuGK*k9$SB|m9lV;33^XHEB3t;BU0`BJDFQgTjWWv4>z}&~w z*LnqvGP^do&9ZmIxN-|D^hJT@K5zX+Fm#e=TLebuWj;UTHdU%t>sBXmRH>#@&q47y7c$<#@5b^`m4Lr>dz)+s7XvIO>MaSWMF3#m&t% z=NAvSxsF_2-P{4ZYk)*bh1D+u=UzNh;N2^)^Wyr3cHk51PyHbnlR*tK^57Mfd+XYZ zI)0W6ba#W_U|M@VZ~YY05*&frTm{T?3XDE){}}u>XYx5&zk=8%nc6u3?xdXU5x^^j zk*?K*y|eY^B>{Bvb8q0)&F8BR^oPi^k8Ut_4d%db*wQpzwM9W$p(QG&#<>D2)iNA< z9zK4R7gsNUJw;_qvs|@r zj=*r`Imxigmpx-VEu&>uj@lp` z>iJH!acf>WVXHd7tZ&LYS>*gOU?gs@aBZu=9P4YwU#;aOwKa_bJNhe? zvP&~SU8(Pt`7?|>_eSN8 ztyR{s6f>CKV1hwp#+GjKwVAcnk7M@pe^+oKRz|ASggd zQX+<)c6CmL zVBWlqIqP~I&UsC!;Jk47V!(Ajr~0R)br*Iss6W9>>&Efk?YIvYYyJsvpUEsj5_A2s zPcNYQ`gz2ph%dI{jKQx0O^c5!&g{ezZtxCCBTc7cE~4UW3T&GxhBobKtb+2aP1#o_7~9b`3c4A0SsJ&qw9N$}476>BZCYh5&2)od7;x5NXbBWs zxB*!K36dZvd*o_U?6Qp>my-ubN#hiDvPH}H##xN9Y`n?_$1yVO18Efgv;XQ}aQ+|z zv9tfXu=}&cwR`u6$mQj0 zfN&Vb9NW_VZM?>J#3wZO*eqmBy~|8sx$T$|A&!hg;QW5egU64#xw+voPa2P2eS>b* zaoA@6u7Uob$?&_~mQDo35@O&7AN&A-wzHVVFzyr0+T%&EvYcI(dz<_CMde+OlI9m> z29laf0jsLX?RbHLptS!&h>O^{ppw5gL!x+9H=W_I*WK!4+|85}%u>Td7zcXMbdv3N~?I=lb>gP0|z`&dcYK$g@r!Zm##=gfpi)-2p=F|8jIfe%?Y;S0?54c-p zwtVz&fd0_qyxwQq>391>X6TdUm^thZY%cEA@B2e$!L9SN5)Mp^fM)UBD**+{EUfW~ zEK@uK1FGL#>%=fBxKEh*@Ps%F3>jz`GYhK5p?wAWO+dUQYhVn4XaUhV+`3W)$eI|Pt6%RlH(Xfg3RnYH@cj{ls7Zwg%1e^V`K@%s9DmGni^4yh^t{**W z8MCb{z?-kml9^;;oEHJ(8m=;(%^0bm zz(4!e511D4pYwIxb*4Lin0}rY!^b!&fcKs}z4N#4y!)g2_izW)85e4&= z1Y5>uNTWJ_3>kc3Kw`=nW}=&{FxK}^ zH;@LH7@zceuvxOOICIpHY;Mg5C5uH2H6u#p_*@19=6jG?CVFN&l5C+Bt|~L1fF-wS zJw>ibg8u8h&y0T4!36|JREb6FEhY1-g7%Wh?Mjs{HUcS)8K@UCxKXpmFv{5Cte-%D z<=Qx&BeQ&NmQO1gGARTK)1UW#Vki`)qsFKcuJtoXJn|+z-=EJwJ!7&X_v&NnGCd;Vbzbtnw`y~=_V<}aCmkj2Obc>lvK>(vT; z-6)>XHxfmhcz^?9~U!+Ssbh&Nt)%*}R3+c-oFLl|j&Q;pl> z()b2JI2;C?w~TSh%4xl02tnm$hZ)1#FfI1m8@=YHot&H|(_i*OsDS<5wQiK|-P;gi zfu{oQJ<-`5}1`hk4LqGCMUweZOpFiijAH0KEB^-&k-SGN92z>BuM~sHcHv`67 zKKzbhecs?M_M`|8zaF@GV)*G_?s@C$k65Khe3Edl92ok@NBwhJJYBQGymH{l?js0r zxEX0X$NJLo(T}%;Ug{>|hr6HAB+Kg3vA^os|Miac^^TngyQ@HYwIc?>9279>f8!qh z-5%RPvsRE&e={<4mh>WLMMWV*VJ(i!S6AG8c*A>t_=GqA(JSnq2dH>9tuG3So`*s~rzjqUJF%kUy`@k&bw@D=|x0M5=@9lpo!|JJW@Esj6=&bK+tKp9Qr`I)@Kunk;1?np6l^K9Vli(ge?Z?KY5=ihY=N>u zjv4$n&y*}M1R<05M{;8 zJ81<%W?5kj)?1uW<~+QD&y6vH~&GVO*)dD*c1n~u7yQXysVj4io?>W1nSf~ z>iiYWG&BgfEOQ)3R%aVsgJ#dLNX^84z*(cJc-G)-aTKWZbc}+Ni0`_Y17jLjCQH(b zsN}MOMAY%`E6@{)oUlj<^aL=TcD*6RQRStqQBYtwV64YC8px~fRRI7QqhK3b>T58= zSc|m{DeR}9LsYPrHlPf^i@%-6I8Fitry%bXpgd-SSg`fHWPN2*>QA&W8^CvfC z%q`H*sT(S$!m_ob9aLTQXPk;Qg$A2?8Gn{y>A5 zDI6w{O$>wr@+^ZT2A$*gDia)Is6k!ZoDs)8F&zQ+m3PB`|>vKLIRfPJrb~0CNsdnfmeQx!W02QJUD@YW?HD zdui|JxzAbZ<_vLjpwA-Mcr^CrK)g8!=+0o}QTp2v7XA8H##GDh1dpgRTT zkP^lSL$D}4hd@YJ+Yo|K*kz6Jd3{!py!u=`!+y({BJ1^LRzCu+0?D;*A#N`6aRA%vXMFYRU+3ZDhoms_>Z=#G z1M0JJa2hPrVEsc#f%f70V_Dzs1lyGL;nRZWa($A{)wh`Aj>;`?(24rBkK8mjRPbA6 zZ=41DkG@Zf`SA99cI#S>+E_>hAGLGm{nRmWnmw=1Yo#C6F`)Gcx9V4hr{j6`2#7ep zrqXWL3a`C(o}cSEq}6R;(+R+no;{Fg2Ry_adv;5tXxv+dU zjy+A&-TEyIfy>J^mk*A-JTD1?JKr=6eIOxt-&BA?N)Z}Cq{sSh=66~?)AKW>&Kbr) ze>LJe1x6ImEPz4fpp8k{zMI|)W#Y2zuAkGk>s%j1T4WGl%s#2`vGtXidQaP}Xnj1% z=DJ`wybHuuY@V_f&jEsS@J%{m^Lj}z-aKhyIS)+FZ93PImG+cP3mW{KJ(MGGPzF9N zK!Bgn2HBT2U)SgTb-XTT8|;>?x|lPTpd)L6xlKBsACB$h6ZIFY*1nlQglM2q;*m`{ z?rZ&d@`mvZF|$`0t3b1uZAD3f#1Xg3`wydYk#%eOQR}NsIUE?Hg4ONyYIblGo9ZI1W?N z)|lC;p@RBK8%?ubJWG9^CD4BYkTx41<++|LbDK1`fep9XfIIBOkE?$)?t#S~?Kr_> zzCNFl&8_3^4p!w)VlJKDgVJv^mU8Ep`@YuVprjM~NLvyxhA9DK z4&;Nnu1j8fjBoUOR#_Zzxs6_v^d~c)OfKg^@5y9N_AVNwJ?~4jSCQ8U`hSd%=8H{E$Y1T-}$^7c1x;`jS#d@c{n#R=x zTIU*NAv{p79)u;^bFQyIa15IyWrP<;ccFLbjA97%||zCiZ?|8qa)DzUW9yTJ|Azr5Jpr%q37&qC7{TMm#97`ycmT`<(l}Gn{b^1Iyux&iU7%(#pI^B8vc9QFsJ`*&4mb<3yoi<%KoQog28$P{Aql` z(Dw(r^YiR)*EmN>n6H4r*?lf#e_R-X~A?2NHLVfRJOf(tjY<&hP3XEfqZ#t|Di#F!(bsmcO`UFymwJTp> zk%YG1=l;<+Hj;nCB2G}E2g%ALq0U1T(xF(mER(Kl)+qC8(Dk9q_#_HJ9V@+)fGa0ni z=*_^x0-CJ-PymVbdmW#}&_zsTRIGD*ZA)df1O@Ds&2<3*x@KamERxLQaKK{N4UT8e zBev;LxQ}qX6HJyudH=&3J(UsOeeVgczxoJ?!XXAa=Q)Itm1~w@cM+1AG54KZO%){C zHjci?(fVe__P5*^G``6SGs5|1O^73B>lMyg?%zLWx8D;(q-`74UCXL%>wIvkRB22S zXX_Qaeb3PMJiFQP+rR#c0DN@yf)Ep3+pt-wF@3$;aqsbEZRdKo=lpEV)9YtMJAy5M zCrfkY2?K;dxaR;#jN{1o3@*;}+V(dIw}#7CTineWhYq1$dd7WZ7e$f;O zR)@&*pYAz(s{s+ZGmkZaanLyl`8fapAOJ~3K~&DN&d}ck?!DSkHeuI4y5Y5d^oZT_ zEHx+sZJulXde8Z9obi)yz2LzcIE&vlG&z)K=MM0v_ojbNKM#eBb=&QfF z#y(!Ldp_bC!{!_J7=E;)eS6KYE!k0#C*k{x=koaR24@{-D+M9{%}?e7$Y2ESKX`-9 zFiGc5LrP|U&i+RD{?GmvfbLvDvEx4Rzl95+Tmn7Q){7MrCZ zERHx6Ll{Dwf?PJyj6-GKIxa?ZEmYch4ItVKNKg5lySO*KBW3P+_njXham><8D3fT4 z)uCHhQ57ViYZidXGTR}9oT-_O`xq-zsmb?knkGy8+RS*T;B)7d`2o!0xfMs0v6e8# zDT5kySos#$b`+TUylouUFW@6kyQ9=w04a_D zYCx4{o`X#aBgb($)y5nsR{&~~lsQoCSUp}O2b4}+gGr&Xg&qUM+${cRj{D{qK*tP_ z@vAZ7*O9|-3-HY3dYGKs+C$9aa+qmNz7UQRm<7Nr;IRXKc zz&8IbF#|=_R@A^|VgGSJQvr9@dyH|2Xi`fWMddjG zF`nxeTede_y459;Oa?ILOHEmV#(Kcz-zJs{NtQ5NaX9R_cmEY6<+UP9VW}K!_{27v zc25c;_wJw9Ky9-+TKDEaqRKLToAqnG>N3zw;Ft~JBv@@~?#5&yuOF z%hxmkkjwo6*w@ZUDG(1wfU#43k;an%ADCD$Cvfg*z}8)$w^ASYbZyM;tzPF5fFhg# zp_kuE+4no%efPUeuFt#Nie{0JwmfeB-N(1FJZ7;WJ33~0{Oxn!ZsS*e={M_IT1p&- z3WAse6mQK}Gr!2GF|%O#osSbcNghvMHOu2>ZLpZr=f{kT@2cDBCEA$J#ma=3=-zlt z?Dr%L);Sz1gDoOC`7|dR=0sFw?J^KUwYaxC;c&Pn4kOKKMbkLOol3eY0Pj%!GKCp) z9$f8rA94BcF^9up*~WgafWD+)r5o^NI#Km~LzL4?&7{G4sf>(7Y*ruS)X8&2!aBKaiG>!%_Nx{fik&&NC4DDS)e z=$H30lU%(siNJbI1~^U@%3#7{Alt%D%=VM9c}=eXAg?}#yzeM&lzm4m>}#Pg);aab zdX=4@#*XM*->emQRpe7sre}$9+9w+YA6nm%ij1zrt%CNh&)-UYkxlMfB=207kUDO_px4M5i-t!%SDa(0}$9)AG=Q0QS`9>vr zCC*s)Q&idMa(s$3O#@9sS))^qcR1(so?aRGoNuaxulgl@o}aw}4Q!L8Zv$!E>wTNz zv(fq7h#|^|&n$joJT@n(i!=CcqxN1N&&DbE!uTd9yEhOc$s`(Qpn&(t%0u}-Yh6xy zH~OyFlB}cb@+Fa-FcM8x@G;qc9`$-sP!$Sg`vlPSx3FfbTgk#Ou-|U6O{?*UJ}{1h z`g1TDBq_K?r6rqYoY+SV$bN@0hV|;4Z+!JW-}owg^wACP|3sN*`mvwbBSMLw}!TW#A`Ge_wj3fM)|Kk7Rpa1^v@IU<3pEBfxa%VlT z1PXXx-d9~WR-NT$1^`50H^h98k^5(Qo^79K8b_b6v8eWxl16H-#ilh3$Xd6P3x+dD=6_?rBr)wEJ%+b}tU3 zn0<(Y#V=UTW0u5j7-FJ5N}?+A!-dh(I!la#nO%Jdftb>rK!~E=bW7ps$alXTbgjHg z3Ciyxw)u(|;Qe&gWJBS{Osw|n@ImUZr4AqyPrXau8 z6;b9t$#!F=fV3iY--&N9B3Oa2=-1`5H%N_();K+o#tDm{TQ^IJJreq9Z!geCqbheL zz@1XIe|7CoIW|%JWGS;uZn}iNF_Fy!jUONx2Ve~8G7~l=VSmuR*zJWr%X$IraVoS!7Oh(eQahNtz3NDy_ zGkH@XG6j8>)0pH81BK%)e=(SBC>8KT<~UMtqydRZfdD2;x#oMMTx0gtXOo2a57Qd0 zi?4MhvnWx(V=08p-~>cvm@AA+#rT{+a+5(~MWs1J37FJqH@d*v##Kq*IB44`gvu~i z`z7~V4LO(zH>1FcP$A}QZfax=!Xy_4RSf8u3L6NyMMzcK1wRUW{z6pHm2iNTO6EH%9 zfwv9Fve`Uatw}L)*j_Kjav!G5qWQYgW;$?y-LA(src%z=43J!gan$2UjAI}MmECQc zhH)JE_kZJ8xvSi4CmELW&DpKr=HHdi-~F*>@V)lvl8ZAnXx^3?_!OaWhO@5WgO8qb zwbOI#`{ky7-w)gjTkgNw^0RMeb}>f2|3|QTq|fU42henu*MD96@x5=gy#DKn?bYN& z6oK*8Cje}p4Ltt(8QW(Ah~dHb3WD(Czjy(FZyhf_81S9G2P#z%l)(?!KVLkC4E_r| zd|O!?cFzO--)t)c`6u6cLDM*Ho@7U2Ygu1-1_>PA*>UgJF4!}%Bm%tkk6vN_La+bf z8!N7!4D|2pnA_~-&tW%m{;TH<-`ml?*75tl^}7K4Z{PkY?U}wW|KvA+4`blJ`-6X3 z>;JR=_#gA%|H=QU&qLs_4g8OP@rMZTd%yl4@kihK1ODl6pYdnk|2o$KQhQV-k{fy1# zT%8?Ir9e}RSbI@{K*qW{FD?2gDYKkFWeahDbr~!fGC1EmqyWrOFlkvgVu}b-!GCE~ z@V0RZdQUMffc8KIhDb__jYt6>#v$U@9pTW^uGXy2HiUkMNYr&pgl^rbZ4*btYDQcP zdz`g6gt6~w+YY*pFb)btN7qIG*I0EJxE2W`Vl$gy(5y!99AVhvn-#`7;+PpzU6&=2 zBhDHH4LW5FDC~qOk9Y4ZaoE$HT`K4(4p?Ke6s%^~mtcV~1(7s~L7xfv8JT7UX;jGs zYn7qZH`$HA}TK0Wna3G`Jk%`tH1I4F0jJ(z$Rv+KKc{-Xe8 z>E{ygo=a;kB&KI=YOwP5ea-`;$|89*ZfE1O)=x|M%~QefQ&QJJ1-F*H(gKWh0?c&G z>ayP*2t&a7b!How_i4(^izOpp6aWn4Spo&xSlS;%p^S@1j0KPj-=k9gbi z;nOR~X5)4jZm}1LUQoH|M9H=?Re890cDyHGsrCZJe;XUhCluVKdIT<5^q zIMz0r3B>R*ZP?5pDM#ht8YC^6l(`78h3&)8^kVznlLyzaA(y>0NF7=qEqG zN~+f>+23NZstka|&JwO7NrO0*3C8j0(QBNYU7TL8;TA~$BojA00ztvv4Dd6uDD*`zFUz}QPU_uXN$= zN+ZZj0x-F3UpKIegyDdsM6+5eFiqT18y1q_U7Wed^V(rsWE4`+>sWOxY_RG><%Ipk ziE&))kfWprBgznU%pO;-=9tZJHg_-9kWXksqS`Gd8MTW&$UyoS09v(;??{}O1E@Yr z8xqC|FWxighS}Yn1F=VwS)MhVn4r4V=lVV`ZduDUc*hU&h1q&9NHiJc+ zvmiZT9Oy>_G1bJ|lHd!Ix=u(VIsC$5zr{8avBj97dd{cl{!a z`)iG-8IYnLWx$x{6;SFsWw=bk!1=?6GoY!#H=gyyBW$zM7;EWw5yX4O1pnqQeoEKs z+(DJp;;sTN(V^5bhvUvYMiPWDsJ^V9IikVF8kyE*eaV^f4!xp*D}r0Mv54v7%<3O#aUp z;^MrM*(^CmT?mzg#;fmPis*h>{w~YBc zFk`k!Q=6hv4*l+C_F2b}@oq7Sii}}N*);_em*Oo0&>XWdSUVkGy)&9ICMnHc_Q|3y ze+iRQec>9dtZvK2w*W0{mSw2~f})!(gKl1Hdzo^)l5*ryB+rbY0wc6NGXc=%MnY7w zVR3f4=<-{+eo-( zhWX!NM(0|jZ*9&r6CndI^WP!x>_t!0wKx~qZs!?nup8jP<(kb|$JzaRl)+?-Vb!eF zQEYVl+TDIG0dcZ1)+0IW&bEK1s%}3_TZoE>M1MCm^o<#WI*%im-YJ0A@XJiDs* zUVwg=S@yTIXX-o!*E{XYb=2 z3GoD*B60~2195_`l z-#G3o9sW3sn4p>bu4!r8RwYwopmj!_Ct+laYK2(e62<`|$~-FqaU3v7Gx?owXxn@0 z5Qrl5AUtmHoCSbu2 zqNI|lRn@(9>o%wRnzzZ!-7r{t@7$U1`<;8Mq_QzldvMP8X0vi<=FZ)$^{nSno~RW~ zyTT2Jk{}@;zN8QP6J={+a`~GN3M00V&-zdg|X`6ZIo?4gpE@G1_@B9!g^5ye~x7F3ixdXP)vcPQ#Ry1#F4$@6WYl2 zgWP80D;Yq78)n$Iv0W9JPB)YIt8JunGW*vjwvoz&*=NQ)mjCVtk8=@d@LqabZ6eZN zu7s6zkU4Gc^F$Ia_skw+B4OCES}!nGvsy1<>6n7!PJqJl{g8oSsqYPr^Yim`>@)yf zx3eQ)m{wf9*s|Pgc=q&p+Gg19h6-%AFWX-wohe|u=VjZJ5$}`PxV&6(`S61EM(+2` zPd|hN2-MM|n~Su#8y(c;u>_A%3KtxU#U`;|c^*B!gy3-@9N7RScIGw;$q=TzlMIM3 z%XR55=D@xDZfv_^B7r%n@GL<83LCQNFb&M#WdjNzwU)OnELHQiq%F<*LiUAG;?ud| z)!;5YwPBX)0`7X1ji*oFW52&miCVH*p;Bf&@Cu-suvH3c(FoovtNz*l%(gMxUKdpX z`NoOg6lfP`=c$o7;HVx<{+Io85TUBB@v6GTPh?}io3Fd-d#USj*EJ;2yk1>PRN82n ztA;>+*)?OkNNuO>x8wG5%qOr>+nL+gtj<~3X39`Dp{p9(>ancl{P%1wae_(ml#PWI z)q~p3-IASE#(k1GShQx`o&bBo#^?lys?0e5(3TOgHrhbTx3k-BQEJV0yDjtGJfE)@ z_QF0q$a9Yd?+>69gVr3L|A70C-XN+5^w^e;>_mBgN-v5H+b$)U*9Xp1GUhNuj2c;{ zqw~bj6I)yL|8fo6w5WwVW9Q_3E|#lLV8cO99>$~W0*m;Ty4^L-8`_0DBbEGbDkY!F zd(x?mA_ujsb5EPTHC6zqyQ@Hv;3k7z9c;Qc}2{S9a5D*-U}X&euf|3yM~ zWZWIucrDR;Y-5hbfSSGWxh3aoPCIPL&Fpe|T zb?doYNxo=XeBVzJU+TH`oHZ}o$N(j68%zOxon}rx2^!1KA=O1yHezNdt0i#LeZ5L9 z9+-}4yGXqR&+l+u%ZOh!dW;;B|f?2=YJ8Wde$WapdbTUN@5#2OJHdq+| zjX-k0rT{fJh;(lH-4sSY#cpUIkEi9f;^jY5D83OzD%Dgma& z7>WH}02gFm{{oFFHnh({hOW~N*hc91t=}o3qg{@wN8He;Bd}i z?MNgcrzf%iFG^AZlvIF5+2q?Ymf^4yUq_VdN$kaeGUy=02xue8rBQrKk{B!rmu?v7 zhrs2%2W46mBRqTl5gZ<3fl--(wQdMep21m8vn8K8;%oYZ;29x|&o&r3=_*9D5F3hc(hR`y>xbf;rxM zvfyXm{xXrk?|k(e<(#tz4WHV48-Mc^;_bj!o(BHnpZM4K_RFJN#-zDN>CJrL`Ry** z`uOW8AM<7#0s(uHIb}{J?v^ zVX$W}xcvz1QVSEbm1lbMVL)5B{5(ASmdwZA`XdAT+ZTioY46Kg{0F~v!599d)cw8R z+OR%9@Hpk%Uw!AU=f2JW03ZNKL_t&`i$@=jXRbpR`0yRL_oOBG3;J7)HkvnoVF&bl z_BTTQB*!dEdDRRBl zbw)s0ip7?F)jO){pr9l&Fx_4LF1un(szNDgX?8y%J0BSi*-vCA`!lvCGyef7-ITfx zeNPxf&`Cjf2zr2II_+z<8REk82p-`wSP;^)T!|9-d@Hm3}` zyVO;yZ|^P--07>0#~r8E{c|WG$rb(qS>uyTf__r||682%C72JO61pvh5da9&pv|eG zl$mY_;TVXQL05C&ACxcau7OL?>Eg%^Np?1ShDA0iJ0%=JC8jz>0Th;MajL~fSyYvU zvLhmkSefypdyh&e^Fe?Q!A*LVJh4g;Hjx0V7E#{Si%Bh$X$2w;s7iL6Fi%BDvc7pz z7V7Jyg}RC)C!0p8h-r*ud8dk*M&x$A^XN1Q%OJq0V{s~HKwZw7P%6JCRpcOnl&PMW z5kr;(R%j)YmY`&@q!DMVQZlJh=_WFx9@U~rrG;XQ6o<}s?{Pz*_nzCmFPVp0ciij- z@PRHkZY!YQ(-$v!?a@QDQY@A&UDq=>mooGW5AL5;vb)J?oa&Ev7_$&S2_bDKNfk3W zC*Ly&lb>zdv`ANMub$!i{9Ni|<#)3bW-j0L*yTcwshA3h5PT5u&umC)n^_Z%R7eQ zkDD-_*gxGAdG_*}z?e~XdowN++eHPQySf@>1d#7#epv3#&F-bgb&<^@xwm(J z!}6s+J>EAFHjjI5zbniy%U0^seE0~Z6#b)*P`@Y7;Jw3lxp=f-cQxSBg5GtW`)?ZB z&2)P3d(Yp62>-#q^Y0N{$AA5sf9vR8%LM;33qnW221m}H1rDDwN5_W<{oq*w`a3%o z&53?BJ&46;RvfmD&`0#cCH?nyT>SJI5y=?at_^=k-(!FM5s%;eGJUt_7vK6h{IKUA z{@&L)+ihgpzx?+B*j&mY z=WKX_N#MwLuD{K&^E4~Nu=jZ9=?|WEVffVg3mm$xuvY@~o#$rpjE#E8p&J=0l+~Er zCpu5>e91zMfYGLahr6z0a0APBkz!qPWIqh!Brs)P4b`?}J%Q#&diKtF=FELfV-l08 z^#6^O0Jhd+?yk|Au9rUXFnDecp4CF(yhow%hf(svg@Dx>tzZbDfbVKKV(CIOF$P?u z0Mw;F4W(}tP+Ul0Mkg$X=~!b70xFDYY?GjyF#m~z&JB*XZ3-9VM8zdYGXyp-H#4c5GP7LSFS7dHpZ~9x{SlYwrO!a zh$N0t5EXX0BrX;O^kfVvEzEQ zmqd)lw8fF(lkR{I0@81+L1{}cCb4x57^U$lVxmL)jz){iMKzhtLE&7FWc_PIHprl? zCYpsvF{F1K{6KVxF%LNoyOQUjqG+Tbj)WLRRyY_*Vu(&8Xo4FEK1pAt@iJxyTw)yv zF=AB8y3|^v2a=;9hDc1(Nv5fSXElf=&EKLM2$mAuDM7^)7&{8URdy!FBFud`_!W}# zM%5syJHR)Y@nXJja=jBaYLG%<7retp2@=+J7=x|39vS?QnZSXK}{vXpnqb4}Z>?zRD-5|CEsV86@{WS%>ql%riNX{{qfVLNUbc?SiutSNwwxU7R6 z$xf2Ijk=|^KHc}l*cRsPDg}+l=OWMV(DfLz=Jr++CwxC(7um5XES^(o$&^K%gQH1a za&xwzZI|?eW3g^gDi)xe$YG{F)=Mxkgea0C-l9`dnU9gSUE+OW7@`v!FtszY5#uto z3rQq${egD5!Zv37-ezqi0|Ms(?MaY10gu}tppg>W)fTXf_}96Ov7HAe-$JVwsV>v@ zT1!OMAia6t5#0dGHHGPH2AHicIG5Y2i|_lf|HxH2VPkv-({(}!k!LSHn1ZonM_DtU z0(H$nT0b(VtJ)r8V86d%zdw~Xp51A47u?uqjLdiQ-%~eUNdhV#VQn{`7hho`1+w$p zN!2#uk&O{Jq|>;V{2MWdgkRUWbsq00mby*vZ*t_Fc4`~reT;Sv z`yGe!evZ$d9zVb4sk$87x!cCn&VIG!(W5ts+gl`2Mnk_BHogSNihe+)z*62O^Umzc zkpI_tS(kw{RlhM|@;U{!uKJ-7%saIKOo8p`_>(qrU!3MeuS!y=%X+l{tyrzcM7mdk zyNjL6(a8Pfoix0EO?6KdYi{Z*SL;pchf^Z3R%zZl2YIPv zCqJ{%23kO(#XmRnT;Cj6tb{!`c!f4Cp$k>APTgnvk|dy0M7Z1UxHw-D`#p>031HOt z0*{gva$C*-@Zdzc+O+Lx;|`$LM20rC^=zXsbuyhF)^(W7L94lKEem|tv6JmEf)n%a zkF)U!>XL1!7$J`Ah=n=quq$kbHIuE}hl4PT^{DDr110@oC!SoJ7;!UzEr0(Z%jr(% z-KXkuY@>Sj^*f*U85ww(zHi_66B+kn=i_YTcaz`$9X8|^Muy(e#PPGL>sQ)pbzGhk zX}gsDH9P#whN^5RW5HCTwU>3MZX^*yLs_flqL6kLmH01WaFcZwK)YIxAlarR_yMC* zEF*eMVx9}b=#Lb+O&Lo~yP#Pv5LsUmgPcNJg~p?mM=usdlGpe9;wz3pQ~;V*2C?;K zL-AP$(6Ps$QC1Oxs36FcMF~K#ZSli^NpiC~NeKHvu5D~n66jTWUyWUs-+dqHLQIN3 z5QhQ1kbbwGp%i6^5HQX7j6)D9P465G13_y{Vd74GdjX^fp@fRkKZ^9R_yNj(#`u6r z{-~&pyu$)yQL@h0!kSd(13~8EDjpRSZnB1w_R5qu)zaE!iu#kddg&sp2hCw9T;JjR+y{3<`M2=s19J~-$Q5Fp5R z(hoA8o8-T1tYH{r%=F%Kae2w>Z@q={p7*}@UGY)6h;1}4-hCh5miNBgSeh30H=g~q zBQ`C;Tl{c9H=6aCfV38C!(k^9*8l!r`ge)Z^Of)YHt&4+EmW%G!dkgE#OGMI=PZ$V zvm5fGJDS~w0Y1E%6Ew_c?%Ce>_lxc6xP6RZZa>X0zVTVUy8A!)`S|Dgr^Ek7hT`1& z%pR`ZM%{al{k4~9`l^YTOayIE*1-hRdh z-w*G!E`?XR@mKL5ox(C4RcF$(DOwX1(^3u%Fx95CTnV^t$r(2Jdkp^1I(ppvtC2#gR0k?*`6R zhV@Ee)Q(lt$@{uxB->z&#kKCT0O5Q}u+K_A(9qhMe-YU4t9V1Q(+>kz*W)qoeMAE3 zw!HiPN4)*!YiJGYFTI<5}r;y_#qxt}m2}mug-pH71Me!y9;oJ2_ z`kBEo^qs^3lKmVP@O~U;r%Z+to6bJsoCp(R#5N0t#4c#{c#dsbyasm|-%o8^7}1HYjo=D{cL+FezrhRBWs|VEmY<<3lpHyX($PI zek^6eoCZvBj-^c66KqNKIWhRccB68=g0PS&MM2k}G7$3pW!c<>W=CsOVsAs6VkeJe zlMJO)5xHK5v5l_tJV63QjILz4m4#j${|nC3B!;P6|Co%(Gm)X)CJ9AF1g*=l#ux!i zRCO#F;DDA`15twtF$E*5`_YCtIDBH8vWtaeL8^%B#fhmrNfubi`OZ%OfvN;ag#KUF z9kEE*D5db7D}A3h3$k<60)ZGc*E?6<+wFef&<&ieR>TfCI&HHtuZ6`4+Q9_ z1?btifhDjVWZ}NFR?bfu#Jimg=*Cvef7J)QAEvB)#z=t0`GBkBfoxhl-)=_-*heqM zRZ-vf6R;jIN+IRryK9kc0@lrv-Ebhcxtr~71in_~7k>Kl+@x!sZ^S8ev)yyPUh%c> zd{4IDzYn+Y!tS|uaS5DA51ik4Ra|lq9Pk9!pc`BIjNHWU>dp4oj&@_qMlw zm~0#No;NN(%~Ss_ZXf7w9AD$N0eJJ_+r0VcZQgtOJ+jp1VD?<^nqou1fRROVluq-X z(%-XJ9A|%Q6KiCQFt}be=hIR@J=BxhB%`%CTcV9hi?QrH4h(~Uq9WiU7$tJQ-4M{k z@~vm75UX@?9J&PZ%YjTEWuoa~5QlHo_H4x}7>g}&H2UB%X@Teq2wtRQv(q+9Mdp%$ z`N4a%ozl}Ao0#87V8JvZW@*A05m{cJM$D*^vr!(LZI=R+8=QbFlVe(#=)|6aO1e@2 zXxbQD-w_cR1m}cNBRG$?TAaQKloyp?ZoD4~crrUVl+r09u)+HTTGSSu*i3y0U>lmI zEph=vVxY~;w@T^a0Lh-c2)Mp4%m5(-n$U{Q79Aad zfFF91OKX~m#JJLCl&DS4tiTv#E6=9{y$7jFE++!r5fWg}67+O`37FLka&tR1*etkX z7Oomha|ff=Bp{jVQU#&vVB<8fH`*>hpn1@?0^-%zy~|FK+^PbEx$eR!att)c_00k7 z5aMVDIBd5JL%_QM)1H-nK+c_l$776y(4w5iyH37W<!EMo{k zv0N>IfcIT_XG+Pp7)b!)nVs(72_dp*G|SBz?14y+N=QK42nkE@;eu8Eha#4b08emcPjxI6C4dp+bghK z-8%-Oo&wM0eF@l5A0rHn%gOg~vTvwu%o!pXzo`k6&>RGu%ZYmAzM;&GW?-TtDaKjd zgB#fIwNP!n4wgGr-g@hcMKU*+PYUR&xBc$# z{@SE|(^5Y(`8|Rb?0ce`@DduF%wrsCixH_CMAebO+<%ahu!kZ+PdOug}gu zb?sN#k>elUe~m|vUY`Q~NbjnWiwBr9Z`A->V9J7SYyTw+vn zN7p?9cBSKhi5)Tn)*PIeS^)tY;UTvm;sOnl72$i4raUz2THfZhG9~_{G2hGdpFXWsFfRM?yyBKM;hDVPV z1m|d1dA}>qe3De5DSfzI09YP08m;~8UPgxB{Jh-Y(RNY%P376HE(vZZfC+%@&Lfi@ zEq#6VT>>caM@lk-)FBs1h*+?D@shS(0V2T+GLLX>l;nhv)&ZHN#gyxW0Q8YC^sLSe zS_Nz~P4p=DSAkyV0QU?`o6N0G%+FtCM{{~yp0f!`-A3ST%{X_&e#giHUC+_S`dO%? zPw!%su5HMsnVlLicOs!7@2lDNP6G6peh){95fw{x&B~qYIkzFthr8{Zuu-p#CTxBu zk{Zf0pV=u4tus5m-wRka`PZWtCO-iq4Va}(4s~JEM>oV|BZDgxprXSxB6+L;%-A0M z(4$?CZpB~hV=U9(EEQbjeG@=0R{fOx?eY5^rWKH1^gSqrU2i1zk-%0eN%Sh)5WONR zz>rz|oyQFwP1~YPLvS6s)o62uLK6Ff&&+;c?J~*x3iz=xHu>bG-iytdjAucZymA6; z^p0k=9M}4$EfT$23wTbF`W4og5&RcHSAJXP25h^+b$fX)TKpd3zezr)!J$wB#%vk^ z2{M8=yc4B|;FHpW%D!-gj#1(l2-8(AYSyk|mHe)CL*He#K#GG=8-q3p2$B4I&W&xb z9|nRSN`g~kEpFIj*%5p3nS>AtMo(hAl7J`oWUZC;Ezm9&fG^~=%77aJC>Vx7OgjcA z^3oyrq9_8eS?AeN>FBFDV z^|Twq{-rK;$>sJi#yfnBSYq-o$~`Pw&0!SEIV!K3k$=)M3a`ukk8pM#6< z1B%^^oUi;yAKfr3az-Yyb zn`_#(rSBd4u3|t`@WIpS_(e@Zq1bgFae3B&QhfCE1)%u++YhnEa&eZx(-D-3+&gck zKH9V|xPhF8*6q6#j}mZSEdAs7cLx6v696y9GH%sD5ha%(xB;&tjka`$18wTx3t+H3 z*(sx)R54v&XF#X`-c^brYu(^|KZzX`ARbd2rh0bueaY_uci79bvbHe&4c*jsu4CSo zWq)1v85&_Gk2#kzo#j)Ez%EzvOuQ3SgM72qw;5v;CfuAH55)A$og0XQD*(}m`1dpO zxKg&VQ`dT0;{30wP0YK4{4FS@2{B<1X7)o;Ud$K~qc!jcML_nGvbvbgX}y=K=)$kz|MAr#|;7 z<_$n8`1-rw=g9x~lkzV`DFC8E)oKf1uegx1)EgA(Ut>%G`2FzL)F_>R3}p~WJ9U=N zP2j;QL-R&b~HHTL$u+X^-r7eXdWuO!IK&9swkp=X&bFvx* zw!H@*(2YgydbWo>N@;d`2c$rxg1)bwG4TBAnoqwj&c^M2Pm>l}&UvhzN>b-?s(bP- zU=lE>pMe7#BUJQ_l`Ivl4Tr;lMhz0G_O85hMg9IHU!vO%0`BW~C>2q=@mQ+k0hX=8 z=mgFjhRWUySeO8t0FOWWIWm2Dw(EzUXWxH!GKgp9tJ}jt-(Oc|MDN2oL>V3 z&k|rSZ$I0t_}aI=3&3ml*KiBBjK^Q?w)EY=FZ}f9<*L;rJ^%hFEll5k@uJ!uv5g^y z!17a9>|V;Gb$!{gyXrYS&1?uewl9Vv?fd;-x42=AZBmxn*)2D#u|5|+c#LPu?fI4# z!|rNeec7{2n70# zfekDlwlu(d|M)4^T9#IE_Jwl}TgP&3>7px{s3708daz_0;e2iQH@@_<{Lla7s~D^J z)o=X{&sSSsix(_6mP2CO{L6phm-t`5^&6~}P?2AM*s*&#@YlZoH;KU4f%b`J^Eu1; z(Ld9tcP zoHfWI^_w>5h5Y~!yGhgSUXjr<3@&BQR@vgUd~Yhjdv1r0^>TspUNW{T$9v8G5}ef3 z`5>U#BrBXVvocUku9eP@QO2E+q-CPW;^C*$zkV3X96Y1{wez%XgAX26^_)Y>)YB;& z+k0Om17h%ntyU+=c_I`5eTnnq-q7wdCwcl(q%8HpIlI7B3KhhfKX5P)a!2V9bZ zXch|rTZV}99T-1m@DT|yG5J=`3*Q~kcEK=oXw}LXJVc^u*zG&C8c;?6Pz4n41w5Ch z577mD0(Jz~qjZCdk^v2tzU$C>NSS-2+8|zOWz#S$&%*iqZWXFcQr{s;wqOWE=djDQ z1VB^@u4L!SFwJHT8GN}|kri@6lI03+z%JJ*nLrV>O&R-f1k2?&nAlB>or3?0By0`{ z>BIt;19m4EA0`Y~GcZkNeyPE6e;{^F0gLXi-ra>vqes@DM%4Tzc_l~Ar(6kGjkL1oLWIMyLoj~N}vn$%x zu(`aznke6mwnP^Jhe^^EMGhB7yJ%4%5UnOEjZzBdIuk#wQAHv`1Id~?-A&kY0CTC}mWZA0G=?6=Q&@aPS| zu-)E{*EI_WmRRhV(v~FANrLtP7!C(qf8fz;Z{U5$YB_>7?mxbtnqS3$c?u|3+WQP7 zoB!79i5+sFx9mU7TvgjS0vuazl^Ddq^CZ72F_&5R2-L-$dtv*gw z$7MV7y4AL7&{*0U=jSO#M!vc1E@k_2ea@%f{QPNI;u8SyBjD6s0IX`?k&f(;-bB4zeggSR@kM^Fu_<*S3@#9Yywkmm8l}z<=8e}Y`fV`63y5Ft9 zZ{rC703ZNKL_t(asO)4Q(_MW~W)dy3-03>h?WO`m9f9g9Fq2+ir0XBEWF0a4)?lhC z$w3)il1L`~dj?&>w657?PI8#D!j*pQN3%13UMexN<@+e@x3ZJlb{R7P{DOA5suDsf z-%yzsoIwZ#G6SG3zCiDV(aGK17CU`EB!=@I=ut+KS(m)`n7l^RO4g1(h@6)eR==~0 zd%`N8fg;PLxB`_f3AMTS5FmgF7Ns=CNL=CewnO8HO4ArseKC=s%$Vp?$;}a9b+%3t zrG^+gqW8EeVS>s|tk|d~b^z6Cy4@C~WSy4<2mH|CRg>1qUINeQn3xi*GD~|*?M=l) zI>r+cAjdlaDE@GEd^sk#EsKT44;`zswY=HcyhT9%>iAo(fxY$bYAsQ~i>1BK?A-PJ zRdzj|g;*MoP$WNsT8D{|ht zX|RiRN|x&}8dMNF-sf>u3CK4%0VgQ&c?eKX*zWZDOnmj;q1(myw{D1pbeuz5g~H*3 zNcKiIU>6It6(7N3k-^lCX1S0!fOq2G_MWB{u%I@gVB>?t3PQI>FBh1$B?O1D4GK>r z(5x0@bsZ4EpQr~Ynx@4x4c@85;N)m*OGIOuhTH8f`3fw~4-=IrtrcN7OeJNl#XDDg zL>V9)P4Om>GVZc`Llo&OpQ4E8} zps|gnZLB12hN+a|;8N;bieGd?nD`!RaG(j))Bo#6qjjX)Q`C04A;;b1n5$h4j){|JALVl@Wz#CU9%9$v7LITB z|5zSLAGqc_te$_G^Upmm#}950M*9f+{kF)JuP(*tvu|Dyqo@Qt_|zdyk|Xi@EjDj` zQ0#242F~9cc>LK7&%gFM>(^!8|K4v~MsSa2eSZY~-fZ^}% z@&1eFTy~qXb>DStZw@8t>lBy}D1bsar$5>caM?{kclo&O?IFpzHYJ9tV&u`=U%(Fo zFMjYnE*`%=`d{;!BF77!en3AA>04AlUl;*<*W-qOohfLwO^XJ$`#r`Q4iz9UM#Z9O z>H40wZ8`Kq0Y%Qsi<|3mPA-S%18r-0|JjxpBkRp2FRowEHVw76BnE8V+w56 zM&_>0;~kiTN5EW;;A8UXkL@*sy?Q6$zX;s!uZc=?zFLW|jS z-oLP=H_3qP3@D6@3Hn-FR8}F1QB-3p+1~v~ZDWL#^CTAUi0|MGJx^-8~~R=nECn3&p_O~gF;*+LwF>=B&n%ltZ& zr$*JEj{Rq~ck);8Zfw(uFiGYeA$8)3K{vR<{Flc{mELI{n_?WXB(uwn@BAm_|C8md zC$F&K+v{nF-Bv}~} z$jb{L5-pU+`98JPgfyYq?S>*raJ%dAS+ZFv_IuCmZp+zb!=Vp_wmU!Z?7J7~OogT^ zy9e(klhVXdBHI+$6Has(!GF%>tjT#vOokPBsZiYKH(hnRgLh?7tyCby0i!nKdrALK zSs%x?qGxSU+DATN+I}K|i^p%u`4yv|QVQ=5Y+t5{ishYWqdB+{m4N3Kiw&rr z_AWVB1pK!j2F{mDdgqBzvF|#f9~m)(*-<9UY6ckJ9u9EGOndU*_AoltuWq(XRwc_=$Wg!22(rSHB`nb>C;}6_;Jl_Esp-Z+Bul zFZhPRrN2LZyj@?)H&%oHf)9N0Pp^3Tdt0tQO!7r%&;rBN8E-tkWV3m~cR&0#W}(02soD_DUS$=6l|J89pytuUN6D_}bzhn6F8J8Qw$u1K{xOEkp$Tw{`GTuG@TJ&CN$0yO-nQ0c1h6x{!C!?*eaZ zF4#q^OU{=yuzm}TIc<^ z&`MzHye*fJN#UqP%YLir`;dmJV>ZmqdLs_!vRVEe`VN1PY~oP5XkpdJ%zj3JOL87H z+eVfyi!l-xm4gojy{cFkBx~3Y0W^g*kL0}c_yR0mE*hd0DR#7y@fQKVs3g6cuN^`t zU~<`<0f^%$tCW$kHUcRVEoUq%gu%}vV7%b7CnAEjG;NDgip63{Y@IBu7fXg-nCG+> z<~~zhUpjq}YR_OZfDi+l^9ynQ$4JvGXf_u_*B7bape@nBi`xUlh%&MO58e}FK$!?p zMJ>|2u?EiO=81|m7RzL0CfcvipjB&v+@f7X4n%#6xO{e@RV5`MsQMQtD!ImW)_W) z1@0u9r+`Ar#suCwVP|&zBRlz+Y-boS3wsRaNyj^H=yn~!-JqypuhSKQp*(jT^k!6z40*asa66IkrH?wUtWUc(p!{O1Nt zt1ucKK02QOIweTEz7s?wbytK{%jM=CrWGLOYPmWA;#p5YNi)C_NMOLU7l4PFnQs=j zEmF)UWP*Vsma0kHpV`UxSxX0w)gD=4ik*DVZjdGrj+v|ET~_Qfv-VU6yn`DEWKhy+ zJNcTgvXj9)a{3r#p0KlN#YfL1$RQx78jwW!`)+{Kd|_JqQ09N1vNPR3x0BZ(b7s8} zC{>p^Xi62EcY~$!?^oH$+fLc3&Z_Ek`aVS-_wnP;r1f)lv`-z!qg1P~{MQJ{%x{7C>D;ek` zJ5@h$(oU+Awf1A}6h^lhbDNm~)(WWI*5CJ7kB9ePW4%6~%sl~iyPIQYYyG}LkhW6E zOdk$gcA3HQi2ZS7GMvgg&%cXl+nWOh$KSafPQQh0=lS#ZQ89A=;^BmWDzgB}qdf+u zO@Kc6`PZPqGKZK+gQjD1$r9z${#CA5v-6GsqtkZekY&|Bjv%2L$ULz#2Nzat6n8iZ z2#hSL%drogu`!qLYt{!(+S*-q(tW(0@-Xvhgytl}9I;TOk+-xEATTH82G&X$-$I{ukT^uoAmbq2+ zEmsVFwH=V}@rVgC+aZ1P+D_WuoGGw?1n*+h%*URXrvsy;d3{a=I-HDOC+q-a9d*i% z+-JPgPJNAu9c>E>9WbslwSe4IwlNIl#VVyxY0N5#gW43oJ`sZJW!{t+y0y*B=dJ*! zl-5MmNWfc+lBahf=i&`#2%Lb#4(B=U73gv zfrv|r0%M(s$&V1fq;k9hT-RflX>F`cdN$IZ!(ZIzUE zpc^#S$l6qs&wfAIfocN~Fi@a8X80MZDZ`X0RhHVU}77`VQ^;_~8>m%r0; z?@P}Bxcd4-;+IE~hjMx{|6Zc9Yno>4zk#RS70tr3X_jo0veQ5N+Bf<6FMnY?d0y_? z{t1rBqyWAjIBah*iAY>P@b1uZcuj+mvgZpPljaAa}5zbc>0tteCBn$_cTq* z`7-+g;A~@2TESZpLG@X(u4TY+He>2O|OyA4D=YBtUs4 z59kj)CMh^I>*N#5gb2kKBabL5iDZZBdRe*1L~z}q;2BI}Oq6(nJdt$P=p~8rDGteR+Jn>YV*<3Rcg>LjE4cdB4BpK@-B%#Q z=VMWJu9)IbFcXK1Y)Ktkltq&QvXpOR44NEWt4stSgYHxmXLa=AKohEAn+ExsL2j&R z2HlD4IVM0O#qlHb{32th@^zIw%Me0Y$QSo_9EV&vHqkZvVFYAE68JAU3SuC$#AV>1 zPN0scBD=#Vv3od#adHtooy)S#dv;yLYBfXI9lEakG{$gq+tDu0STvUH;ea(3tthN| zb(!>j>0udTi@m<@Av4#N_bUe$(BJ(1rDyJaC=#@iap)&3mf-|z-Cbitv$oxFimmD4IbVk!y)=kTG zKlUGUTe~Yc|5Hyc_|$6`ytjDg3{fV*k4^^7YqKY|MA~)UfBB5V?Z9F)O7fh(JCRM8mwZ&Wbu6wN z+slS~Z!G9`p0h{t|Mok#G>=#GJNTRL{5lWVl#}};%kBHfMYrMC{@JhdZ~f7q;s1XB zTSbl-;Dh**zwyieWV|;E@fp1FLx>5P9IZ zgB%-IIs=7Lmhdq4ZHuOqYtHA4Wi+<=?UR<)YV;^tZWeFaerWJV`H!y@AVkAU^$77b~=^3VZOUhmg zK^QZtzxxu*zG=l9|WFRrn+C6eV36WGyvLJYzfksJuF7w}P37P1!h;3Y^9 zA@&DhumgySh)Q#$UdCprNvV z7Nnj8#p?U5&UM4UVY^2+4bb4dN^#E?Ok12mrkT!#H92S^buuOr{eg&QeZIk(nCfy4 zoF}%XFoHD5!NpM`6r`W&JI8+4vD|EU_Vi_Xjs`mUrf+VuLw=9eW+HV5Ou%-ocRYCf zgzKvjgntamo7xFsI#<)$5ZsRCYRTpO2N(lunAK}~g?tM6kX zfmh#eW#>rVZ&v3cxlC<&`r*4oB`gP{Kw&_m6RUX^wqfeVh-rLH$E=d<__G%u+#$1C zmpNETmF-ioTrP84a@+`zo7<_6n{7$goyw%v=gn=@^{E`VnLSw5`_yFLbo*%M!GqUj zmk(g{5isuew#JH@fbFv2@ zOu6Hlv}VN4w&r%~(h*>F`aL!eVg&y3=ZdIe%M|0n0Aro^BM`|M8Mz&H_qq1BGc+;mb!EU+`N3s zGW91-`d?({Mmxa7R!r}`ZXZo+=nhw$oiDJq!8WFv7uv$)I$?3mAoKKWRGmaI9}m+Q z=np$tyHy}YZ5siZSI=18F-GTpDkp(V*i)-nN zx{>$R2n&&mF3pYP0Ba0>I0!&dNesjHLLLx&KoP(vHl*MZK(E0^1SBvB5YK2s==Y+& z188OGx?X%d$|N9RPgZqM3W74Y-9coChaP1uLy9|SEW6!-rV$qT;2qW`AfRpW{SK94 z6Cnor-8FW#L=7Dw1kUf>XK*eht{eK?ew*c;ahE)B$MoJx947hKRQB;^y1X36AxkiN zY`cLM8HO;nW7`mtbgNQev;`FzGO)X17Ym3aa9&enUuJ&vhyFm0gVZI13J32>vVJ~h zqOy|8bz)}Ih#!1^I84BY`P_^10M2oBSg`BhtvBD`oO4w7O;lo4du{Wa=Ijr%SWo=~ zYV~-!8d8SquIFlZz^a$L_r2d{*av?8XTQW}U;iR2-SK6c0LuIgRk-{4vjYmVW~9+54~Y z-VdI$zkbH*!t&x9=a?w$PR1Ap{T^p;w5iQneDDMx_(bY}vt!&aR6b;|R#-UeI_B~! zg(p#WQf$-j@4f$Fic!`!VmZEM6YP_J^Y&&Mw`x!LS3c^lX%{lCuA3#hqF@r~`^1LX zitjl4>uu9=)7>7$sg76C!$=4ZPU;XeHs&|@3C!;=g-$SH%IZ>dAUo*czP%0X->+`?Y1b{ z`2-9WW=c8s&?#axJbih^Gh>TX_}O|>8!omttL%RSVqm=l=K`1KCi%r9!_afK8JYhi zX6njs0n8n;1bbL;<0cz&(^1Le7l=mKM zG{!V3Q8i+!IA|u9D6+qIbvxA>IUnK%0R^VnahfYtOoLgCko;Wy$oyxrk9t&asgDDR zQK*;_L)>gFcX#*r`zxQI`}#@wc@gvxXD$Pw!_%2_4)sNkLCtB#Zdz<=tf0**4 z-1{duXYMtC83^#lRpQ-`?MJe9a_f)l1OG`G%OAiqesxgelb5@|fAcafN78vrfk7cS z3D9Jg4`U`7c^??k>L^YS# zDu%%Pb`^Hf()XR%TD0jq5XVT|Qz^y|rR{EwU3gA9mQ*;QH~V&Yz6gOZzLw>wo$o&%V2# zGXLFgxO%_i$rsk_lcey2Hy7+~9M?}fmK%c~in==yxOgD#{BR?|r+Ytp!PD;@QwA?r z!e(ZDK;2*BT*O+%gZ+lZ6GOa(ejDmXUjF+BAO04rIKIai;qm%D`>Sywncu^Ut1HPI zO>Oz!**QK$-n_RVgvi6oMxEl>0GVA+#-)_eo1A_5 zz60QV1?H2>kwr>mZ6^1yScqJ2lltrdXezng+PTRSpp)5pT>5xOnSa!qJfqlFBf8-@vh4zt7$d$OD@%9M^Q z#t5d7O#I+P!Ya7b-b8LzO&EQqGI44Kq*1oP%o)W>{iXrsY)e%Evs&72a;+0Uya{8` zEPzx1KH5$hb*cd95&O{zI}@8yC}b{T@YiB)hS7+SqgJSN~C%8An=u#+W+VpBFf*E-UZ!u~{hW8Hs$BfTlbMxO?|aU@-P0P)fHI={p7*VK zpUTS0%H?^!&-c6Co)@;l$X01%>_Qsb8lPL*8n2y$I($xQhvo8^Yd2nCIbZI9l=h^R zi(|Q50Ay2D7{EhSy>IIfQ0PD(HgkDbGGJi>HaiH`8iD8rAdl<1k<9z3Ol@9f%i96$ zuB&}p48W<8op_xQxX9bFBzJi(Y5amc;BN_xVF2X1DHy3LLFDY)D(2QSCmx(pvVy|?cy)Npd$z4GIyQWF$j(Len2v3*S{!kD{SK>z>}k_Gm)Hgqm}n|3 zJ(|DMTJHjY`!i*#ygbjK=$b3jth@?RS`}rfVI|Vn){n zx^7F`#(jMO@Ks6?{4Vcf=ZiUg+_%e~X^_zD+6|}I@37sjM@hHP7PbT^JYR^fqVFBf z_E>AFyhCfv;|GtK&u1K6Ic7ee;b)+eH}k-}=A1CBE$654938>%k{I{o@j1)mQ(>F) zA@38k(O|$tf4RZnosSs%8M|!)4_fL*)3sX`OG8~R(Ao`sAirZpLPqX)VSmgkS*we= zvScqD^{>)S*#^^hY{F2uC(T^|WJhb}qA0Coi(jq{+ZCVVqYf^qe6uiXfe$KT#t+O)=Hzz9M#G7v{3^XKGn5t zQKpjbx2^cS5Z`fC&mtR@CIkbUUI0u{YM9E%J`q?{_23SyG{FbDu0<<@w-$vk!fPb} zN)zW*pBVJwdS5AokuNghfxM?$DO~Sx{Vw|L2SSLH@)NwvDiPiX%xpp5Zbezbi2q9I z3Kbl#Z!uMc(gG5dcegIa3Mtn6EaC3G7e&~*qPL#bidqKASEhBAOZ47TEr$Jkde>~> zSF0v*H6J8l*Lu)yc+Zql0#x)qGvq0Z01OobuL!DQaphW8Q&PZ_r;mpF==vNRQMosQ zF*=hbcvsXd+J;h1NnWSQ?E5K(6Nsb?D#vts>+^o4s!V>T61l^oavZCUM^^4_t!rMm zcFM_ve}+;s!nWneww%2B0iJd}-nFQ^-%slU+j%4)X*>SWCx4D#^Q(Rhv&BiQxaXTr z6!$mM&R=}|l$UQ_<0Fe6)(V2+bmyqA9Py|Gp{Ei&T`#Ht)>~!~j98gTl37YN%)jGO zAVL|fxbTEncIytV!s4i6dv5tn^&jBK%y{cVKg#A!%h`ht^cDqt|95;R-Ut5HKYcTr z3Gmh(Zr=cV<;_fTu)Nabzt{IpX=>?r>qkAyQyCZE_~#3%>Ntb{)Z!j5eBBIqn+AC2 z=dWR%qc(k3d0H0$z4P@pgGBq@MF8LcZuefA3gVmo46&)MSI4l`@A&pb~LAw9y7fqz}!;aXvr^Rs|a!@ed^#Ls$< z?Z@C(mH#)K-}W7=#h5kF_CCr2H}qD+={DP_(W1)2(v?PMxrg9(oTlb7&Ft3qadO z3F1k4`{5X*c>m!;u3WiF0Ir=3Z61KtLWAl#o>zp*XSUkaBE=m7-dbV1R?xRC>27jt zLJ3Q1s(UH>n|D^RAF0TQ8zKl%N8$;s4X*F;QPHQKEeH&I`V2;#+AEHU&wfyLbKOqn z&JY=L1K=GA_m}GLtR1Ydq?j%6mx#x$}gem zy>iL;{mWIpoZD9ih?L%!l5q@b^7V7pHjMrOcs7FVvS$Vnp%^60cDRiZVpyA`Ns< zU{nM~sDM^gTwDg3c;kH~5Sxyf?E%>CT;6Q9ZDLcCYwucdKmu{vQ3<`*l4FJHlT+} z0`XCS>s+R%7hA((a2GcW!{&786^RM3ZQH@Ah)~%ZQ(+@>W9qhj-xInHl%kJqpMDik zvWY+z!5X0uhxpv%1Y}Ijd3PTBxYVWVc9NBt?4@9x8u_Z^DnaEySAgZmh<(7 zCq;%~lK)L*eLifS*6jGu%Xh_g+p+0)xynbYC1>ZuZ_m~no zeTz$Mb8XaIb(q3`_}Be9{@h>r@!|evivRIve;R;4@Xg=K zPk!N(834F`YzaZ(;yYc}hO2kuxanbaQpwnI4IcmN7J|aIJ~RFu-iuLwZ^ zfC=~qU|SETHSX;lr{8o!2!Z((lOM~|`z;zJ06oAonk(1k`e&a$=jN}y!sblu?at+2 z+Xw8@V4n1-J2L@t$9CM_-f{e3LA}&;8xQy3{G{b*HKSWQuD&>@J$JZe;Kr31um7tx zJ9eDDI41vBsd+&XAnx%Ke`{JchI=`<&#&Lqrfetpyse?G{6ASB* zy&G`e$;L+&pggVFu4ATH6*r0zIOyZ$(i}T)>S4YL(8rCk1{{WO{I>7nGr#cvvfVu8 z1F!rlUi;jqB?OV`5WpxsNJGU8<0d*hy$^UIGc7W|DIJ-Bb4)PgF+^+4(b1CQIg&i>ZA66a-dpn1u7 zmxhbiGjqH#G25Ae$q`}jtLjGNZ=yu52Xq)V_VPRoK{Y6&@TwXD$AvA|3mc#^HMR^8 zM3#{f2&5BhhN%TGpC#_fAl@8b4Z%R?`aKZE9#|sUpMICYK~b7!#Qrn26@!9%rLdI( z-ibA16fmE#qKp_}3J{uyeMXfDxG>+3FBprawkFJWrLBYDrP5Y;Zelr`0+b@iaKug& ze^W9P>8hq{d-~Rb)_AXrB!e2I8|FvyoXd5T>yw=J0KQUMVN9UX0kos3G4(ysL#z}Tf6vN0Bx8xA=@fh3QI8Pp*}tZq?LW5Ue3pDT!MrS z0FL%-6)ZwiTcbAL1B~ngax!RTa-EV9vt(%*+k20;4uBC3%d?Gbjb!NxQ0oXpGyw`h z0fJ!&24`T^M1FT_>*0N2=o{p8Vc&;PF49Uc$|3N{`0qg)G>m?mWNF88pyhAmyAqT) zX5=H=8O~#`l-Eyx4}iPz;`3RyAaHv94mYpg*?XP`L171u!Q`31`)+GGKe*inKOMIi z=BW|L=Kuh&{M{j2x*Fcm=e6Z_8yxJ7rx)6ym~V8!lvaYl5}+Zr(KHXT1RuTe*5^eM zH-t%_7|y@AAB@Y(FMpKf@_4^q1!&03mm@ITArM6Z7IR46IL)J}9j5Dm*e>Oq{!ClC zy3|%0W3sIh*rBJ_i{o)j7)anlNxtjG$p_^)m!4B`{flgk#<}OUmD(WQdx&77QWp5; z&6iltk9hRxEjF9=CGy$;`(sdfto+>o&@0EwavZ#fDResCj>p9PdK_Xa9m;xp#`^U$ z=8F}}W{Ilm?7K>9VWspwpr7F#D8b!{<#FE3Il6iiyd8n?P(&_sf`@hyO&trdwSSf65&u9mj*aA^(Dfb7mUNk64xhU3~X$)y@94V0HwB=z!S<4@P|p?wW$1fh zNA%vYT|eQ@-MjStj`?g1%2q(ITg-tqy{a|0U%Z|BMA!D<9ovlqUE}QVjwzkk2O;<> z1KolT^qnUJ!)A?u|BxZ8?^=$JW`u4V_ZrhRV?Rjm#yV&4-IO&k?RU#@JpD!wd#X~# zS7S#Y={;Mior+`GRvL%PI;XjBx-QPoE{wjrEQtUZ*_z6-m$tMPzlHa90QwfT0-$G= z#7qL2tq%~NP4b~@Gk_>nz*&(ic6}#+K_z~nKCLypuv{9YMZVTqY~N8e4LTtUBB5MW&j=m${=kU6u;e&(FK)pvy8sj7zT{{lK^3EmNc$5f5@XM)GO zoiK;0sOD2eK%nb!(SM_jMwuDL)R=i7I4f}|W6)X{@_ejp9TVbJRbfn%ZP~sP@Sawn z6wTrYl=yvQ%4qN|vOH=-Urci@pEH!;t;hu%Gx85P*JlaW-gQ*EP$58x!iUmQ@A$L% zT)=`E*ykK|1O;t&(g)UCc^++NQ4tI*x9kbt=ePk3u@_+gbZ9;J#k?2aBZxe#g8bP> zS!u5{YP+VYn+(RedPP_o&(0oma&k3GnGStP;p~RhvO#H$sSLuFDn7{ddK;yU9vpj9MdG!W=|MUMR_s-wpyFU7H=68M@ z&Evn#zk2O6to6_H^3DGk{nGEn0bA>N()7$)%TImcZ%FO^5T}3fr5AbQ^*31572D1q zjDjaf+vBx>V`ud~I5PQWcfDg?OZ>`O$E+DZL`^LUKsWEaz#CtDJul17n+NR9gfQgA zm+$a@eC|iMeRIj~%yRASoOgb4lUkfl{NsPbAN{`H$e;LKzm>o66F)66g)3j=2Y>x< z;z$4QH(6eh{ZzqJnTesHSUw$FBd&kpzQ6_qMF7M~|mb@$H*LfP52&CuDycU_x&zZZcCfea`F0Tu4reel|s9z7g=E~U0( zFV3u0W>y#9gYDbMpeLVo+#6I?&C~T-Ky>luN)@eH!J-TT>Tc>LGXW;>UjoE#cRR$d zb~soyZ))1YmvFw>#(GqMr?;M6*KxEw1X`8#P>Qv7wi6|+7S*NzrZTV z8!k7g(PhYzVwv$=<;#71&wHIchh7{+4v$p%7QecHfR{Y_;tT-AM_!T+`&xAlJiPE1 zU-9y9$++{iUJ@H0>@NfdY23+yG$*NXKO8;M;8AI#o8^fICNv#4p}~6;K^9vIbY#?1 zMJLY-)|3s3Y=#vO;;X6Bc?y(w8Mxv4J{wX&7WI-EB9lRx1=G zJ0Elr%%@d#_+5-`-B z16|y}I!_-r#Ko;UkX#t3& z49?;|VQv&K9*Pl=by(~~hAl+|iH5?+c(E0bO-CKsBm2IE)c*+BRu<9qtdU@1d?{36 z%DKR1(~VlSY78a#?}IPCKzgY{YDYg_0Hk+dGnw2sT}#*ZG<7}R*a3alv1=V4c;PAl z$BT;FH;&MCgY%x7CpAH7=CfL|DtpUoZ?!{+;lLPuS;EMnLq(HvvRtw`+hs;S5MWycF)}*otupEf#C(>_^e&#DL`H#!0n9Zdw&6|soy08E>{{sK_6yvM^a ztra#(TUOfSjI!3b43y6qVt~<}lcOV!j#qf^na>u?77a>int5`3CU#J9^mksP(0K3A zktr;6ZNcD_99hXp*%L@?wYBJ(Ig7<(+ZG+2$s)-XGSJ?;klA+Az|i}SV1vLi4`RMJ~`k65afEc-44NqGC(ks0DmBRUfKke zU>LjG2gsGraUwH2V#B$>*7W;SrvwZf%Y{u@Y$QNpyNUe!G*~l|)JlMZaox18@($;@ zScsynJqh1@t7F+fUDacziHW_vI$Z!@%(kZY>MdtaMV5)p8NICw0AKpsjo2DA6@6Ua z32-%tgqMNc`9o&28eP{c7Xe+R`V<+zli<{pRYF=-`WroRAyGYPPX1Y~;Nv0qe^ zzEUtrjmp$kWD-h&I@@h?a4t)0K98+wpQ(oDobEOLF#_|X@6x?wyRlBL>qgRwQeB$lfY0HE5lg}2%HJpz;g>-9OC^^*)Z z8i4l$+tj;}BL=`ZD3u7Nw$2_tm#yvkDX5{ZjKNjuJ1#A$uid}@I*Z7xC4dBvBowNl zp68DV!LwSOOzM)>Wa)igXWPougkW>uE6+QWr8%_)8)1W_09=$njA@^nf|Yd1k~Wc= zO(lZ@ccag8O@=xi08FL#V+x!u*{4S1`hoF&+&{j+yBcptLYrCV!6imc?Sl zV)3hZayqNo$w>_Q-``={koNFy8lKjldd3D4hSq<{X=^Ao;(kJ!%Y)ej%{!{cZ zx7!@tlce(x?jwpliO=gJHGsUP?_gmox83wUDc4$R4=`5lBlcKBCu_L8U-1**@?;;e z#|#qm0;+x+IqT4|$g0q=% zP;N3ZOPc*Z| z67M{1*P)G}-3@+WWh!(KUwuki1+czHg(2y^z`%UIfJYV?ioBZCpe~5n=el%C+_@&@`u^|bzyBM56M#D(S!K1O8&T~D z;D>(w$NBSr{S*Aa_q>Wn@%p{T{EN>IpuOCN-5`CN+bIZGud|L#Cu{E&rMi=0RnK|c zt{Ea@!*8dy_81ls-@w6D=>&}!CdcY(MrT`^YK8)O+p#@6lNdzb5AnJXa50u>cP-ur zto2m&An}@dX*-EIwLK`crR>M+?KXcJ$22`vrSmasE$0)KyQ->~H#KLQE%ivDOBGf; z);e0-p`D}e?VddGp`t=y7RQ4&jvKc3!b}Uysyed=+TQ1w;@C#2&%XV-Ho{0}Oa?#} zPa6>#X$youpcM%C=c?0ll;^GA-g$9Mz5oE2%5$)2eI-j8OVobjefY(f5nAvs&;GBJ=PmDFW2J$7 zU~hAK+##lr$USI7YjnzLiwgmzb+#$&N997~a7q4U*cQei001BWNkl67$>qU$^( zZMULm$Qc&tGmt?QfY9G7B^3D?@KD~|_<6YC@;xiYOn=rzaD>)lhQABCQGk&Iu=Q>v z$((5EopX89nSe%z(tEt~*u3MZ^XAzYH30(-;J;~^HL{6J3&gJL_X29N@l^*{42K&% zi|lgwc}BT}RGzNaDZD6-h2rS(s>a%uK5k+Y>t0>edEuF^XLkjQ-(0dLb?m!()?^@H zV36JGx}Dt9$5XL2wb~z#LI5Q7r*oX1-x|UI*Y}8 zGO>oyLjA#`$Ao~K2YD5{OAF$7;!C%#vTb*qo}AJ&4V|^zygH|<47YC_iDZHbv^%L= z-|n*0X+Cd2A?#Uzb)MzPEna);^ITnu4B+}~$7%%D8&jtPtd?SL*LJMxIrq*U$0~=t z^G~nL3I3QnH)pJtr_^=L$*RHzxO@8;+xIyr69VjZEwP8S>j)vxwH55S6?0n|qt`)bxm z5b$b)?_|>?c4xSzBdh}2G%`-6O-f|WN|JnO19A1}DmK~$aq55UrH>L~_T0x_nWL4$ z22a~ts=C4U9^dZ-NCxb78$e-qJ51AvgJ`>xHcG+C$`GuJ!8J|0+u>XU<(l}GWf@?} z)YV!Xh-H9YXwf}NDV+17WTXwjIeC^Qg4Pw3Gg$Ce&W~fFwXR_Q8#YhDdn!|BHbCzk z^LZ`IqVZhoTz0?@#DfAJc7@FZ@YBYSSpJfYa&Ao^QVj&16lff1IKCpzu;tMal~$~d zPEcC0I39w}z$$*VyyC%V`Y;pq9 z7zNrUz@x%2Q|T^rHGnwE0He42wkFrl!Ha0G1PSFjCa^^bges4hZIr4R13M+)Nmn(x zS&Red5ukBUcCRQ?wzJICP}(cNO(RKR#sSKaq%e>q5vR;#Bk)yh8)pN%jg9h$M-sRI zlwL@GG#XP6@>>AP#lTt)4#~Zls;1H%&TeQH4fBOOv*Xp3{Wi_dsSJwsqvz7Kma`{M zI6Aq?dc8&KimIB^%;)qy%w|W-#>vINDogjKBA**X%6BI6yA?%WHR#B=a;WX)9#v82 z0dP73?-chqmGw&fK%PSh`WyOm3M#vFegfW20BX~~?g085+ky%6UCG*%s+#(HW_mg- zHM}QD$+$0#z*XfKGHI95HGw^Lo^+nB_HC8+qOHwtBSEeZ0X#9Nxd$rC0O0~;R?LA) zDc0+!D5ZJu;7#6bd0zIiXP3i_c+2HV*tAf2-b3l=0G01F#6+yPJ_woH62mA=g3VPu?ho?ip3MvjDf;^! z!&>=WyzYgzkiaj&kLo!BJymrcU#E3T;PJh>P2S%DEE2z~_E}y_0NE5gHUiy7Tbs>O zUVro7#OEZ3FYb@~;JbX}K;L^``u5)M-@P9v)nU6`v)!(r>o>x*`IRdl{qVO)!qVm` zFah*TfKV`5Z^(gR&M6rDGYCoyjpz3XaA_owKDpkZW+sX>zp= zycJx;|{G)57+{pJ4xU@Ne)kJrG9uwD!8;a zm4O`rzaZ}?N?UTO*xQpGPHi+1m9ZJgWp;oZe$z zrxy1=pH&1aeuw4a3frA!x7jjZUgOE*aT0^p2GXrW-(!*uZaWK9JbZMP&#$VUuHA6^ zg%@xRnwrtQjM-@iwozTx%$mTgF}eQE23+5<+iqyvo@Q}10;Lp2*Mnac22#eD$n2cL z)GO8-Ik4S2sw&9`Tk3j-(ffPaqH?3Ur9M*5&6!0tvgDTI`KaGa%8<-5UMr2-CH1rE z+Jf<%vL|gku~#M@46MeJ{c>^7B{*<;UDGr&C&apEKSnj2cgWtzR_xy+iR1YFyOuZx z@tLTAt|dV@&B4MrSnfAsqG5`?_z;=)qCHbZTYz`C=(hk-zwp+fbRmQ2#d}`sBl>O& z7_^#UZIAa6EU3upQrMoVo)ZeGV*w#bj7RHAumhWx5G+sf6Ra(G~ z0DX*O1o2~H1x!&j4I+77M`>YU&~q_XWU8L!ykWhTei|4Od|huPk(vVJ;{^C9eMgS~ zd6_v(=}~_UAkxS2t3@-TcaElz!v!)(@O&e3&ut%>0|9T#J}UsvQi<0nsOuPiF?DWt zNnRd&jv)-Jlj%8XGt1pT8zYKMO5?rHiPe=>C{xjOYfSX1R|Y~5aIw}hZfPU&G=;p! z>Gq6is2flyY%l)o>(`I4_Nw@773@|=1Om=lHjmy!U%Q0~idAj+^!-Qd-nqvvO0k|5 zpsOGL4S$TE`nx~Iee;l?`OM$q4}Qxja1~eIVAuW|e&6r<{rv3D|0F5|e(LZ3I6v?` z-_22TgDbV+lW#oW29IOA2EO>tknmISgx~r*zn_2nvws_auJ`;`f8+&h{rz%J-B0m5 z|C9fezxJ2@3bRU6U#&Q*PPzA{to2ToHBUE(@ z{Q$1}`_%3MzvU19cK+qx`RC}7UoW@w4#%!Tdy?!L1jM__2TaqtU9OnrZ&x z-}^cFl>63rFXHU8WnYh$4Q8hJ-~Yw`1;C&AJ-?mLtv@@|KLQHxe(P3Lp4O7&A_`A~ z0AynFTeIcn_0#zPdv8?Aj>DGgp!j_&jw0(<02v<@S zQXD0d0u+9eX`iCXJd}C8=lmPk z{}ziPE*aQvBZzE2d^{?ff;qXWHS74fs!aw0ma*;i=zPOwyTgSrk~8)UN+_M{Njt)- zs@S!i#A6VE;c`BWRqmIjs`6mkIROU(C}U_$Md#9<&!H=mkCzsmvlvs2*#As51_7or zJmTT^w%=jfKyL?do@@KjZx*LF(%??wYf&Qa#O&xa8xD1GjpUE=0cGmgu1makwC9h| z^_)P+N=G`LLjWIaHW8ddXOQ0zQ`DtTtZ3j-Hx2^455bPUldcm+-(B2R!+V2LzYK_` zckf?$Z{>Y)dVWPpniCF{DKW`=D(|)_!hWxKH&rNyL)BdXV*V<9Jn>1q2PfeB<7I!& zi|v07unzHcX)Tjq z7yt<=7!pzt(F-`wp%`C@7~WCSFA0fe-0vM44J;vuW5z_uLzE00eF8{$7gI3ik57N2?*#9GW=a^EIkMB4^P3u z{wDP0$@26b%hL5j)>v{diIk>`w8_sNpNtXO_|EmCb}-RiT~%~#M^M5bI5*8fJAGsX z^9&Nd(~<&sec5cqA~=BxYh!TM$MXZ$Mk;+%VJeYzb_JNk?>dx{45!&@l_~A5?L`7u zAz;0jS>hEmrpbWJ-T9gj6u$5AerN>Sb|U=;ERK&O6JR$2Beq?enJH6-Rh0tl1so`# zSuEykc00PZAJJL|6~M!8l1-FK0{rmpeUW|`>ohxZ5}@HjId1kTr+VY8;@tQj*>C5hn9rp?|k<}MpK z|K{nE@BEfitn~zraJwDX?=G^F!&DW$b=cn0b$tfcrS~`hq3zk6uL($ISBMOXT5GHe zQD!1Ao6qIhRFwqb>l)j2^wDMrvA@S^cI$0q2_-Yfp%ofM?>w&SsAsbb)RZh%ahABg z=gE_&gWW_C9>kIDT%R2}z>ooMJ@&yP>iI0r;XyKOO(Wx@ZRwsorK&1IP$(S)WEB*8 z+e(I#Qh2u}gn-uK!15vBt<4UffRc7lL@<`a_ZI*3OjsZ!)hlNcdGB!{pu!pt^qaNV zbvAF3Rb^1#Nyc<<^LMGJ%Aku4pbk!aaKzwGkPW!14LZ#?nO)FFY4<)xWd^Tf{Y7FYq_42d)E>0Yn{tke?B|nq;J^Kct4C2UE7a_ z+OF%t2dwiPp9sKjb$mo+6!ZBURn@GHk5PJ%!%g>*uPbF+ffqE>mdUk38dD`lSnxB4Aw4Pp|teQnC9HkZ>$q{EgEpGVD4glQ!(t(?0@{GDDVhC7jEe{QLkdofWqcnn$oLu_ zJxl>a3q)t2sc?OZDV%_%WVLsXSS;qOj<0fbJdf?E(N&V)6*-I~ujmi;e;9xiqc1BG z^PfmfRyp{a?HyupiUGSra=xjJra|_SE$oooZ3#x)W6RY0%slCRx`=&q#LVf3@#)gK zm4UeuR9gluBd~c2j7_X9BgV{=fF6($4YjAjf>`kgEF|q=jr)bc6Jiz)!3oGC2%>D zp!(!~M+`fR-{a?E$#b5LQgv{lyaod;hUfzw7=ypulk zd_|4=nhN{Be->j|d2O*5Ms=CiZG8T?F6kQY9;l__@1}Cq(|dS+dnsvgYVX}K%#Fff z<0E0P{o3mi1XLi}s)LVgLOOUTW_5=IC(2||r3^2>{1KT?n5<2Fk+d+8-6fto zl`5A%R31;u^K&VHP9s*$0tA?j?J*2bZN+05gca*i0u;4|8@FC&u{eHCNnk0@>UYmu z)TO5n_U7{?tCj34%B0*Z6M5j?lO%DOted`HZ_i?q*Z5k`-xtRfAHNsF@n_qU6V}@` z>(@UMnHi6THVp>$Pw(J-V0OERNi^>l3+bc9V#R8)l6?sj?8yh_ml9~5zMGbEUlQMg z3+FpM$e?Ftwda)zzUcY|n9G-QRI%Tf?n_4R+y%C>z4F|`-k~*CzQz;?c3>?F#d{dv zzmlai?MtQ%cC*H?I=U%9p=L$bd%W#YX2oW6j*SUHCP~z_ir@#P?Nn@M@l6G);hlSr znJ?x%>MXW>%FWv^V2ncf{UiclZ;k~p+F=$mn#C;EHQ;=Ow=GZ3S{Bucse7*k1!^Z#Cj-F;qs;ZPzSU4O&}a0h{!#VO`se_Bo^HGI_4$exrQ0RW;s6jGi%! znFU9CYP;9(^aKFD2UMKyK__Lp2fdJCwD@h_Z%pew*_Vv!9gk1hH%9>B1AxP+y(uX1 z(4Hx^dqCnZdwZthew3=juM33evn)Y_&dC^-;y5ZuVrKAx;Cf6w6Cakd0sxbje-e zep6viO20`U!4SsE9-Vd6X6%m$0alAS);TI;GMLWS2Im}2U9s6FK$MVUbXZKipt6># zlIOOs>?A-=V}isAW)05vRGAGBq{b$m8{-7sGs$ylot^SO{8=-7{qNwKJ&Z+K~ezw;vZH%C;}j$ggH z!NcQ<&;RTDeDdDUv0}y9+b!yv;=ccl0Q}r9{B`ske&EAj&wu!9e;@o>F#XQ}pX8@M zU-NkLfG<6L%Jue$7xgKhzV~U~+5U50MEn5vc9t*v|q zfj{~Uf0&>C3xA$J^QZq5Rr}-o!_PLn^2!hJKmXOgOi*y^>lUL_!HmvT^OVI>!0~&EUymt_lLgoKcHzE z{@h>rap}7==|g|v@B9pZ{JXyg-*x=Rr~XL>0B#;zxDHpAN373x9Id47&d%49{s+fP zIkxNCff;bQ;OTl;C!Vi2JSiBn&)1ugjrI8eNLxo=*@s@f%PxWhH~lWR!qIA($tD2W zE>MLSzbmi~rV(~lUDvqtbBVV!4Z3Lv2&uxY(`y{9;y5^2b8dGnU;5HJqqrl;`#C+g zs;kJv8snC60$(iW5}PR&?7IYV?OV=cm@MH#&P(6WWR0)1qN+8v_t*((#=r_FV8Fy^ zXnTk4_hZi`FmS!yQ8x{9tw-nXN)@pnY_~8%_9WV|u2ZrK)LnPLa*v>$x1VUajDC~Td5u3d)<=ySKzZT0P z0|)mv)1x8nvZgq+55GVj__A`jzv4hi=YN#}0V|NY4I0m-;|o6h`Wt(b!^@{zKJuZv zmm2=e8()0()xX?6TTG7Q?*|~@S7-TZt=GT(0cOu`|UjTGcMK*)$Cm^y35U$dOE(b=QJ$NP1-N3FBC)6mF z>#fCW6*n~F#nmAKYmr!t_m43D$>uxc$=Ya>Wq_wZ&5^AT&_M|ZCtf=Z^L>=2O84w0 zBYYP5&N@{^H%YiH!%Tvr~ zBdzwv)>M)NtehplpTU8h077y+P!4qgkBUH^APe!mMPY~ly&;bxL{zG4d(5ns%}2a= z*SE~-8Hoij046dIX66zQM@ZX67Q2qN%W1gzpU$}q09G4f`K}u_OfgGPAz3x$vl2$J0RVTjTJm<3S!rfzahg}LeCTDF z?~Yc>(PpnUW`8)JWC@$l)2_EU!%-Y-A%eoXd>w5x&I+ra%x%I1qaz^Bgbr&RA*g7# zqc7O`bOJ(!AX0}RI$DE(yHt^-6GDh~L5CjaLhPHGD)iV8^1GkFe*qbr(n35Ca4ra2 z3k*`!xrj=EanJTBqeXf`ke7HH zrGMqd1njIvc}#fc<1Gy4`Pj!kh6xQUC-TT;CYTmxJs*N(jX4Xh0Qyb9XGsn>JB1H`xgZ8?xtI|yO9tvHvj<(s2y;Nj zHrq>1{lqFzI_WO}(ma;53Oz?xPibc9xnC{X zWq4mw&}&Z;D?Nv@VGe;#{lJ=;0CCSNn|l%SjMhpR_@==1E|OUr z^{0uwa_o2>dr9&(wS}7kLiE6f;%z?;I_4l`75n?RGX~q^jS-et;QoDKlM|Hbk-8=7_KIV}eGK!!I}c)Tsg$oxW5;`y!hN6Z zJ$(433z^4Y=&#QYI1M8^7umb49I|)F*0X>A?teR!;Xd|duHT!zvESw0)omCzE^ffV zPGGw|yYRfB4$r=BD);YwksG&O1}1C6IKKqj;|nk=$UEy3%XImE9{{iJy^jSLJgEE4tzau-QE2{)4yJZq6>b&qHPZ-0^+AcU$jvvhqmNI`_u-|~9Z7J_AdtnruCJ+>Rq0xQ=@D*IE#Cf2# zqPGy7y3*0A~02;-EBBJo>5h`_yCJFa|SCG>)#BZ zWB3katS;9y7wtKL-AkEf*ketZ zGe_r7_bgL;vA$D#d7dln`EebFwd43Y$scf$y}bla$m5F|wb9^9iF{cECDO$e3^KXp zK2(dpP@9=tvtZ{A9()Lxy2&6BN5Dq^jrbp*ZgTCGr~qiKQO3}2JM3=5ZhOwz)2BIJ&~9Wr*tQ}S zsh~8Ecdf zF-YuAKv8vF)9p3{8qiwq$bDpY)Q{&lp@(R@$~ z$ThZ)>pNck&=Eo1p!a8d_shRV?x}yw5B=bGW9?J={#B~FW^?}+`Ofcn74JU8Y+i{! zx~g$)Bq31JXY{F}`;fyKu;TJ#m3*3F_1%Asb|GvbA+6VmC|M_oby?z@LKFkYu zVb^|+Km7-O2XEbfgi=s7(kHH+T;ccsrf;WiYGHZZc0Ac__@Qt69`1ep8Qulv3&U>P zVT|JL=?z}L|B$eAeD~dNpjjmqGR@<@M_J3C{h{B@Yxf>vY86>eYu?#za9zhA{gY5urK#{+Cd{qBp7@o)W136ZrBQs*i+pQte-?iI(UI>E?>-wSJ zbz_#nW_2v1UjUTEwT1kmqFG(Z@k{_?eEwTvfS#Z{rfSf>$JC3xxM0;to4Lpas4+Oz z?-P9`-$Dep=a_k#L;|9SrVIz2@4r&M2FknHS3mow@7CIThL!y?g8vqGZy)?#MwrnJ zr72<J8K!Un-fPHtyex>|Umn_Q)dw{X>bD2$*{#N1#N zkrRk7%il&&$-66Z$8w(o5Mx?Z@7;6QPLl(CZ2$lu07*naRO5!QcJ;;i+UWe8oOjft z>``^$8>fsG2{FaUp4gPdW~DW~wIW@)e`^rne7ntHHW&bY`8vh_FM3W1NS5nuw1BFT zlfV`CTTM31$aB4RdX=Ug1JOo)@5nJ(Rk|F8N5zd zs959^7t6BXPXEe6H)Z~0+mmaKOa}R3iEYdEiXXDA4B!iU$M&llvW>v-TTBE7+AjZA zYlU-hTrx&vr{ghG$jv%0j_nW)TLL~ z>01_MDq)N3ELB|rZp;=F+k9Xh6zM~NU@fk9_`XL|Lot^LXw%BO5;srYJ7MSx;BEST zxRTa7H?+}F(kuA9`Af$VpnBI$92CWT({=(-b^$!{cbaSK#gb|kIJ$C@$LwaY;NU&2l5XvDy`EE*W?}1ss<$v)On7>U^*E3Y#U+ z*-^-xj(`kf;KyaslK1bw#irdvK+RWwd9MY;?n%kJ&6YhG5~4Rhx&g}n!l-aaUg`{mT<+O<2}ynbgq$E5m27O*^5_uA8%RCm%Q}ChcW#^Lbiiu{KUC*bz-XPsB z(v^z)kM6PEjDLT5DM9hkGgW+k-nnepFz(O8yUm){x1V9TJmLEFJFv4XmnV!^m_gQJ zC8)9hu$BPy5xeDN&vB8x5)dfoh`sS1WWvyWU@b1cNgwM`zuuEwttOK8@3+0w&+>X8 z?i1p^aqa4Jj;jg z+@sxE`o850pL;DIT`XptoSrhPJsO+$P33xa?;VV7GmH1sWZ;3x`=++D>^3{*1$eEq z;$JNHO`d*l-?ZE8^1cb}nKc!&S%vE@iwT?D9w6_)e*dC9fz}G0K*wnfco8W3IqlIj z<2B{PC-B_%iv7^u*ggfPmg~m@(#KQVUnzU#x-z{FX&syPC3}qgwg-I}Jg-s`VpR*H zZyL9%IVio?Z!<&g#9oMd06_d##kxPl?@X#+0#1N{-MmEy2-<*igc!H*){9i_b}fom z+JK5azYstfD2Ntpl2VMmJEe{I3ghsuO^vfXzH6!L8O{7E%d1y8y*=3Q-qEhlNd@Xkht#`J6}LKP(Gc_OZ$l@gzDw4;py2QK)S94=r| zzuvHAgEke~c-GEh`<^PQ%~VFDoI_+YYi2Y07;7@7Mj0fYs9>|%(#&Qk;7W6aU@g1d z8dI-O1UBuAV`idOL=RUKrmhIq0t-x4pN~=y+*%lX%;iWY_Rdt%^R5|(pzC# zGp%r&^BGr;8@~S48zPGfeDu{ByIwlZ19-Z}U zw{4tDV>|+w&u97jc_ne{OwJRZ^$mBp3*fz#MBFLB&bDNae@fB7l%go?c zlER$bD|~iEyfB2o?&-sP-f%4J$M0hNubMALw)5d=pj|&5T|-Cm4M3E}0;ojN5&~7T z9L`rN`Zx{Rgp4=xD(!#RlM4 zHoPF^Xc!EK3Kb9k%WQ0=)WN~>P%>odyh@0{}$>>a;S-b0a%or5%>haI7Gt^wBT zf^{!~0E&#CpfuPt;vWh=d09wVE0YgoPfq}}(s^Uh_sLO}96!UR?y{FM(aGZmHYsO^ zMbM$HJC)WQY{j6iQs6JnG?5zu>|+b`W~rFE78_CCb9cU-Y)>y_+$`JBY+r@$zK zdk*BH^Ny;jM_|IRAl~>Jr{K~ql?+Z)vSidT4r0x zZVO77;kMBkQaAD*bw7zTUrKhs z#FD408a;Cmz*-;iP61Ungs!9AwgdvrY!(4^V<4rAj!<3IG*umCamDFlYN5fl&Qlw) zX+psE9o?>_p3NWxj8EA?MgPfx;|g6RDd70IX)=qYGIH$@0>1C*x{kW8GkahH|7E+b z$0W&MT`Y8r!BjQQ$^97<(5AszVU6s&j;gNF!A6i^`9?|BrLe|{56k&5NX433GIIkM z69ilsEFlDJXT@m{T(((G5#Bqr(RiRj<60}55g!B;5y;t1-u1$kY79PRfsX4K9n7&V zK?Q8*WDcpTA_5<9&W{~u(V^iJm3ag!miF_hg%q&XTI7GzhRb{Mb}49t44F5kJ-0I z&-1*Sq)Jp(L!3`_-B1DtgB1xDZR-8NUuKxF3(240`@0^K@Rmylz z0Ez=3q|2mO)8~;)Q1RPT=S!u4rezXDnA*!W%fQ@3ezZ7oWs0<-W+_?j-G-)?1di2Fv&YmU?OgQXRKE!mQ3@b-y=Q%P&e6$L z&d)dWor?^9HRo^Nr>&@V7W(Aoq=K1^GR-9qWMa^=#LhFDEk(Grx5J1o3a~Qu< zB{K*x07Z-E3@M0QR3-<6_Q9sf{-NMow%5rVJe86fq*C4Z{ttlnM(mYk{~ZN*>%Dr7 z>=iag0q(M$;yI&$Sb4nz0l~6lMwls>I01!so6HEQt2#?mPv7-q!`mJ2JopmZ?b$OK zh{h~?&n_1M^xliT5~MdOexDigqH^#Znv^ttWH4s5xfj5s=;zZ7&BWfQuJPXyIDFE7 za$ocXBTD(43m`)R>P^AsQ+uf{S++F(&djU-pS?Hfu_Q^-#6Dfj>@DsdYc7?Q)zcVE z4afrl0tAo5TnX^NGw=Kv{AWDz!gC*ZnCT*Bt0k){V|RaxnQlCYif*RwxkqFcYkImA zi125dn5vqtBA4TTAubDKT0)D*QufI&8Smv>2j;m#@%kud99{YZe zedFuxs=hacp6-Qt1sOS3VQb^@Zg*4d5lcP9jvXWl06j5b<$Jo!fvD$^ufF;o`~4l> zy!k!O$3wS#CHV94@&kyV@7?YOGc5 zpDC5&SscUKR53xt@^jiwyDkW)1w!*VU95Y*kMqU5cYnMJAT3!tTh_($`03-;WgsP= zJ03sbc%*&UcDu*x*T2NB(=N(&!pc#q1AyZBqQ~-A0}@va?dPcGQ@5Kr*p= zi{ruKbUI*n^AaCFd|a)CSsy)aru4URP?ri1_cIQ1i{KXwqr>@lk8i*G4$jO_wpe?& z^;_hR%P_{!!M6b5_ppZYFwYiPG^T9?+&Q1Z1`m-TU3Au2!3Q`GoMr()!yb5lWiSj9 zQYwg0a~QfBUBO~J}`UhMUlX}^pF zkQ~1{Al;Q-r0kbP+bZ{0t9?$hr(S>Odau9IZA5146(F|lo5fnwE~nUs>hY#zw&r6g zMPlRKj9c97ZgDmS`~6D*z|kxzJZ{g~tg27YUVX(J8hhj_`#;a|kiohqV|sTa35Q z(%ibaeU7hw`F-(e7MxED^dsw>w*hgJ$4~x&cQez^BjPO1CfJ(*dk#T4C4fV z7_!cW0Br=si=f7Z>=gnWsfzBE5&S1&T|)>cNugN12ZCJyNDLdY+Z^WwN^6RiBm}%W z!bOL82_mrIu+2gbkT|8Wk9(y$%A~Jy#$en|5D*Z@L#iu1+QfcoITDMYaMDUCa`u)I zA?m7w4?yrZofv#269{pbMx2)g-g^w=2xZAW>8ypfmH<3TK&2I-fYJoybBpYj##2D{%C42;VyUdbgXL`CU4UQ6 z0aV4PRLj{yDg~*C{c@TFmYK$an~lWncEq=@2C@SSibezhcrWnBAMf$oKWh9xzj;&T zivd)}bGE%L#>8>nW53&`^E`GW`(#YN`tB=ir+6;#YQACJ_W?Ep{Kwz_z|{sD_4&53 z+v=fS-;@mg*3@e-y1y9{itbMAprHx}Y^?4F*t@xpr8UF@jT7p5h&I8Ok`7HIr=cxtp(k0cRJSA3gydm~QXV#ZAmW zzCYm8kH4=o67r8FIt~Y8>OFtFCzFoE^VUFZwiUoo00eFaV3s4Dwz(O8erIHBFrHR27z(W-`$(4`*Jb!kVLez4q=M~X8m-DnNwBU9P zv(LyNIAdt>5H~KX_7{N7G{F>$pg|KwJBM?X9HMqH2}`K8hB+J|r;z}AK%|Nm#7GsN zlb|uwog=t~H{vlDax=h3CZk~>54H2*fdGMVA;$z416jfI4Rk#z^~3o8-7ypBK#MGt9C? zu$+X_8ZJ_KtBwNOnFT%s2syx6QYd&3FwX-K=t%%bw=76(aeAP|b^xSaPy60lS~LV= zV%2(pXUgwDA%&@ZFHx?D%z6}xl*13Nk;6sg&GHVUeJdK2AdaRvRM|m=#3eI zNPw zY&=8!o)*J)f&^_aDdd-g^8r#b{W!fthZu4lJXU)+V<3c#;i?@Hvtq0-2$8^e-nnil zb?;paA6zB^FYa&lxVa@@>t@{G@_ad6!a>0+x^U0CPS@P~kuz z(kPGaABb=)*$Ja@pf&uFuv|kvz+VaJlZ=9h3hEA{RtwB|EUXW+WK;}YZR&Wl16ToC zTEJB@{`5lo6nSjRm-C*PPb#HZKj(9T<6 zUwFYvU9;pN&QCi3E{!0|Y;phbBW~`V<8U}*nRAHV`3=p(#2k<}zs3+t0F^s?`M(;C2vHb8S^VQh+E1sZEA}S1-OL zwtoPRg;E7j=e=1AmScYzTD6kX0;D?Nl>D;+sFZU|vsNtuR}}WSSQ|tcFJFF(moLA? zX+Glp+dtsYfa^b}k3KbBWA1Fz>2$zvfBTOBfcrZMFW9 z4GVD(Y|3j9J=AN%`lj@=1?IHZfmq+;Sg#G+)XvWg0$R<3HArZ+j_kajua*6X_c$x& zxn|ARtE2K=nH~N5K5UiWqTlasZ?L<)0ldZZ^&ZyvsAHaRIvvp1mZQAPAm+WpZodZ* zFfSU`0ZQ-i@Ad#3oF#qthmRkz z+uu<*R&N21Bm+PN2$V{~J5PF%pfE3hu~FwECwO7s2u=Px!NyNw0Uk!VbGxW0YXtoRpET4?JFZVaD)+h zHm_f#(tyl!w^UJg8f7~l?MlMoONoeVuN?*Q*;{BaHeF4;46v>AEt;1Wxs zO!eTI@e+st&`50I0HI`LrIV0>oZ1PXO7FGSQJ8PmZAF&GMEKz?*#kl*T1fImjKCGy z!brNOe2IXsUT*QHx5uOlFKZ>Yw*HT5I|aacn6=18c1)DpivfX8>n#>NJDa*8OmJz<#@C7i784xda9*#ij|a?D-himjNb{n*;#XED&*>u$+$=ry7(;^+3OFU;i@6_Ys(PeE(-mcdz0zqI%}^ zp7yRS_>ZHI`SS^`V73&j-bLs$?1^19wB&c?qp}X#>a9pUkjG8mxjzI?^C=LSZYAdP z5i$~Mz=OiV0|;>~StdK5FizXQu>=D6*WdrLKJjI0ou8a8gY#mu>Hy&A;er zeml5~$LY_abT*WSpP9t!$Mr-b!-wmh{%v{+;`7=)aV-6;^nd*C{}cZBW1JK^g)3=m z|Cat~rQi*`^_8b#=&Wc<^Qu^R0om2LR*p3WA&81OkOWtfAEh}J0kD=fL(X3BYrTDF z2%%zgOOp=rWGn=2j4lBHDIXp-mPLCc037d-rIg))DSPqfoa@APST01}YH%z;hGi&b zIzb|BT(sI^%ft2=_J-p$&*zJ*ir)L^-Q&>KvQo0+*bG=MAn*RKPm`iF*0N z$4}jSEM^Tjbz55vQ3mfk?!d&TzNsqWe>;;r*>hK zcQ1lA%*B8#@`LF`oBa)pnGpcE#lX%6dK$2~xy8bvft!7eR07j5;DmDm(xo~uj=)j~ z&{{!j1sBhSKx~6&w_uapVDmXn&Upwypgs{{jmtd4F2q7Oj8kNb3n?t?e3}6PZ0{&! z(0n>~7o5YW@o)b_4tp|;nrQo@cJ!KJzN|W=`maO&^0k1=VRNshBuk{lbSMO6`E-z$ z6;GMBV|(Fm8j8PJe$7z$sLZm=A&+q(Ui0NU@T6>3vdh1;S#9c@<@XFyeW?JV5<LMe^!eyK4I6UIqGsR7&F6v3H>ylZ0}kP_2D3jrar!N$jsokEDjv39rVc64Shydu#j-K@vgtZxH{Er(#1VE3w3{0>Kq>zd6kUX|rQcez0Db7X+ zQFypGb4qy+J`mM>nK1^G0hRGnND4vUH3VJ&16KFsi-n>Xz!PO&R0bC^lRRW4bTWOg*f>r|F&+yh@nnsM< zG3H4_>TUj>MP9G6@{>G#b^rh%07*naRCtTU0Ehbr>~Ejr;o%_x5`~)Z;Uj&U&31!% zv2X=I-FpWW%QUi=d`z3|1Q87OUwsY0VVpF)-N*bycGV)ZZ^<6nW4vR7Z)q^^u`afK zW5p7g%8shNCT6=*X1cjF>=sNNmt;0Zyaco@zzE5}sM|i04NhE!is=EUK&q`wId=MT z6H2aPBYA?%5+qv5Yw8A|Fs%Ua?j3=)dZ3P8dJOc(axR4s{al$ZUw#7scyad%K>jw& zCKE(t{3zRF&#(^EAZ|V`LhN2-VQghK;FBlGEc4JXNnVq=V(p5FK^OoT4Od}`k=sEE zAz#XC%X>v;GSmafP|Y%>6cj4-k?^RWLySoMyeR}&Mnd?y0xC&-^ip-}yM=S9f zgjknzyWQjO|Ng&&Z-AbwHr;}`nt9`J_y`U|3IIY4@V*Y0)~?|%hc*TLGDF5tQEYTb za-6SN`^)epLTE6Pb1q9r4AB6R%r|fTfb;SGpA6e$eh=pd-8}s?nV+%GiqE}$|0f*I z5BUD;f05e>klIKKyy*g*I7L9m%a`9`yS>Hn@DV}}6(ffb5<j;yYGy8^xQdWpd!=~Blbq}mr;kXeG*NG39H1X#}z9hrP?ub*MR ze}=>1Bi_FK!$p?e7C>K~YtvIe_dPJ+C7FlQ0mt9|1^}?x-{RHFZ!6F};@ptxx&?9- zfI$%g>08@*t^v5OfO;Lk%r%DdbT0!BBUo{D&*#W2)~c6){3RH&eNS39ch;|~aKiCi zSdKODzDbFxECH7a7C4}m8ShCleO(4A1@s`Xi4FqOIAJlgPZMg7k00J)Iorer$Us15 z1qVnE&wBUZY`kZS_tB=boDZ0$0d_g#oA18EvYfHq6z!$hJ6G)Z1tX*yH57oaw=dIo zF=x_;e7rwmyWNBRty>Tv{muJ17g>OWm|!emEHKZWh)BZ%Jt+)IKn(!`<+mIvM~boy z@b4AtXb(i#?A=*r298~j>52WTZZ8ekuejchajUVf+`IAhB3ySGJA3kaGCO@EGajC= z$}B^KmtblD38cvVr@Rk9mwBT*HQ|=n%b_*#2AR+rMQk)lE8t^ zd$Q{YRP9RY5wHs&sLiNBLt}uq3(9U@GRuW!Ny~PvR3cTOu*$uCw@qNIoBa-ddQW(S zF%oiQv?=f}fAw9uuZ#*cBpY>uv@evB!#F}|i4X#8vem^<=J6edfn))YQo=flFh#n4 zk=Exj+0YhP>khRAlS2h_Iva`zaxA4d|q)o#n2mrtO?%V2E6gGQiD*WM3KjIhPdwLXPi#zXA)UaswHS~UqhCzi_Jcchfq%KKa+27jNPp${ zV+-&ruOGeh1wqpI*TT2`l~Y^l%j>G|fAI?2$QD~m2>8vv|HFl+F2CuolR|8_m&zIE z*XHc$m@y>V-Q8!t^QSAS!s^HMlvYFKK;9SGe9SNSN{kfU`49Mqe|YoA-B(gSODKo% z|5_4-yU54902zj{06+LusF24}sf_b2kn5je3MKdu9nSzy&8<>qi{k!Ef`xz-9NPFg zLrkeS42r$z!J~hev)pun@yN)|=W&;etQh3JdW~53enQhDkwlo0| zDZc&1%HU9roTL=+&Zjab+G7zJ`b1@BNN>8mxgnOdOW}6~R+CRtu;k@p8>;1T(CM0U zHhWn{WOgZaGmU@{3Gm4G^07c>YHS~#V@O`DWW1j)4qCxDi%}2hc47mh@*h8az_i~% zh^(ICv3T6=Xc5Tag&z)p0OT}c*zIz@1R%yS(f6N@A8~m99$HK6ZuW^4kYooyurHl} zicEI_z`UFb6NLZ-uq-oy?G}r)Q;%tgfC8f8&R_O$Iuj7g*KPW2mvmnV{;SaV0eN?f z`gHmo7o*Is#(+6qTt7DLn#JPB`^=!!(z~Y(V0<&vyodO1>pWC22neK5i20e%Gt9g| zk0XH4(2oQ2dB*1U4jlSuK1XjF4=5R6t%HgnGodv^0OolH0j(COVT8~_c1|6?Se6xMRgz+KCQNZ zpkp6^X|tiWD>b|`*x%hkNZRyyN1!|JErxNVO-&%>_@IXrzQP4k-ncm4>0tsujAkh` zAuAmM0SCSJ7>0?$-3JQ@of|=>;DeuOQz^%ZhX%05DR~?R3j~YcLt^UWeDnR}EnI`n zl^zHP$tRUY@RTK>mDR@ePQ@4Qr#5&*OM`T!P8?eA`~iFt+?m39v|j zxC@|-71IT>!Q>JUq%>3|Z+>QaYCu6bbWUF;0Qe}U3hVob%!>V_WFBBZ-cqxCRED|| zT-FO8R{kwy_Lx581)0v0$GRFP00XQI033p+`?MM=RzHBiyy+Vho`BiwJwOPW!#A4& zT7{U`3GfW2t&OE%AYywyo;%ML$A=^Kw=eMUaDrJJmh+5hzlS)^kWxb^5YW$Ou<-FP zLrRs5bs_@(SeY^o9{Xo6phpFTB^q4V168L!Px3fCRR$wfM!JrXc4aJ;IvLDMnPn;s zFRPHZ{M&!N%ys`M+N;!+VISxip^-taxlZc*t-!Zs`|mN)0V^Em{j(K7sTVe#&sRq327~|r*c8V-;9(2w;knrwsO^4zf01u~ zez&{D`FOvsXs+L40pErqF6)r*4I(@`rZsQCHO*-c)SP8rdM=M^Kd;Q|3fS}MfZzT3 zKjB~e-G7_TF?g+HX-nw>K#GqgEcW{wY`6PrPHI6NtJDIin`;0nr_(Y7W;xzgA?qXX zsban=+F&w5Gg$n>nx!3E>HJTWnSgBt7z7+nErY)H`)Am1_c$CLa5~+u*cAahnPsu(vV_?9@r_W0gjgQV5uMIt-nf#z5?ifRVJ4`o(s;xo0=W3+CP+YzpPpL zy1;7GW7;(UT$0K94Y>xD|0J1hYW9ECI;NvD;Pq^{WP-!eA;z z{YD7V2Q3L8HbO+eAj=JbK!C(3Mj?B%I*sOE^B$zjCcJ*=ZXp$9;YB+Hux%bCDS({=+0v)aankjGLr43JtwM;q+3xF-7X z!$<7*JDj5(WhlbYzIpe7?1TW$^Rgnt08jx0`JExwjhyIP8S61J@O2nqmjwu96B?%} z0sBfYTY!MGlqabNjC#O0(zVlx%1yR7(d;Gy#$kk(66eJv7SFk`z2tDZ_2%Ci2Mp9~ z562VsyKN3x8wB>-EzV|1QPu*0PxtrfHvnulBhKe@vcrx=uYi~RNX->=TS z*mUAgG-*W(`IktI-I>#W=|DgUBvvX0?=iEQM{7v-8DSs2Mem-y20(+n^&S$T2>C1# zqLETZP?zyGEnf97qJ@s7cNc&$dY8c6vsW~kgaGedWL%*8mEg@VEqFwnPys*+QF$Bm z5-(1ync>RKxO=>NrBIE&*l<1)Io2D85Ol(gm7u@J5>Gbe#LhWhDb!*;n)4?h&}1p3 zfE3JblqbcO? zVO;=YvX*(lIE}E?w`vx@$qf~$PE7M{opUMNC*l}Dd8T@F&S4x!0%ulF(q?{p_dI%a zQQ}a-0R_8aATyMhGN{HFlYlt9DC1DeA^_VL&oC&7U@b%dM)tZBfLUS~#ALh@w0N7B z3WTYr0mHb#G;X2P8MDcK^X>hoZd00#sTZ#7Ns|_JA=YgJ)SO0`c}dDc1Yn#dsFsN$ z)*^ZGQF+gY2k2o)VR^kZcsSf+6TywIo|E_1;g~mO`&}oLOmh!Fn><9NG1WEYbv_d? zPbpd$g_z%7*zTm94F>l3kjB?>vmv^Ck)NOA26j+1?`aPCq{OPzv3H%e2Ih23p4-DT z!WkR0P2qHxWx*ihA}%0-MJWt*z57uyN3?l)@yt9e!U5x|mY^V;R3_T3+ zQgqvfR09HNLt*9N$~MGR3ML6}mFaLWOn z`$g=VydhFixg7u~F~l)Uz(ye6u-St`FS8HAbK#sio<=HY-(N>ja8!=J#b&ELg3B=2M)iHVOuiviAh9L^`)-QG}G z55FJ;0{t<|bIXS4L7)cV+295QsZhqna1js-NnugS5Qn1df*tSd6i)aGm?9azSh?RZ zcvb+TMwwhHtyylVi0y(oO3+3rGhS=KeTiY9Oa-`uuT?-0-)H$KWp)j`4OlV_bEP4z zQy!Mx1<*7GxKbvAAGj{PH8>slJrZUqJMs>}3P?r&0CI9*<52K{JjU7hJCo5(NCBk+ zL@Wb^L3d<=q&ZilN`;WMN_7cvi!pJ7Eyvqi+aWf$}i}NY7 zU8`YA;69;rQs6G<1C(&s3>(}$e}Qpm46#yxLK!#4?4quH`HhmHCw{}yFm>Vkt=JS8 zsMZ*SS8OfFN>{#Kg)!x}!N+AjquegwfG7RDKamC!!F7E{`+53h)iJBKOY79 zKhl1mBC~fdGx)4PCh4{{BUb8bS3+;{eE`;MCj~%}|Err3ZGhmoin>M zKfk(Of-qQavli*e85 zty5@Ik7c*KR<^aD!or)ciNsX+yVL)R?RJmXFG)u->7jDQxVjer()y_F(+Qx23{>U& zpDI%VwF6Si%I9s~SCwI+c^>W@S590&eP24YN$o3*y*=>!wLMa&T*K~ey$3AI*jW>F zc3{DPOtn-EAiTw13#{p5u5p;C!61-M_%c4<9SWbZ2We8_IXydkLk1FhGr4 zy!r86x;{=C=ffv_^WAsE`ZemcQ%nhfFY?IsG7bv6{mWE8%WMGeaXOM7IQV+q=iw_5 zVC(n=04^xF8Cd4%bR`{y4<00@iGT*fScAe!@Oxs)kJlvfTCf*V_OZFG0!FrA{X&i` z_h=;`5qS@v_w?&EV#-e|w`?y}zHF6O?&H2(TlDraSN3X^;~_gA7VDM@fOw%FxFB#e z2A>WOxQ$FxZ$Ev)pnz!_R{-6zzjyOh)EVDfveEbUcq}jQIM#xa`MNdmMfI@Giud}W z)kQi7gpled%Z%Ydy`%acvLm21OV$y`F|$k*u_HwApa9fJ+kK@Gf+Kf(=4{5YpHI1+ef;zZrz7cQj}aW`knMeLnNySy z(y{vJ1Z^ReBD+V_J4>Z2`&GHe)=DF=z9#@e)RB5jvL%H)XUFg0je&&7%uz~{uCa|k z=4`f)Sc>`-ifC5eS_nbT>fRCf%qvL%NJ-b(2|s-wkPbFPK${#XL@DdVeL>ad-2!V2 z=}fIbP+2$0-;51hBC;Z+b(XV`GCGS3Vx>!t*~op<8Utq*st+ZJJr5L~nFtM-p^S1L zVqPfk)aQnYnJ05Qu**WxoItvMj`$_w+D1fB5;Fk?c%*1g%p4-F#|11`&Vd;rL~)Gh z)K!3_1ec;USbQcU()GKUeF}vgEa%G?=lNf{_lX2RWzqxH(WFPrc7e4X)}A2+g_u4s z1`zDpmh1Bz?Z|A)Hip{x!;u`=2CcCy4bx#vi=lOrjdoIN9iBhC#fOjg>3UJD&rZok za`gsMWrpU~d70C(F$T**HpGS2*H~*4GokLGbYdGC1`Q=-1;iV)hKXepAh6!~y!MC$q7n%d za<~L)YNaDcPe8{_PXYj@8BkzQ8Vd|&Q--f~$;)lf8rIp&6qt(-YaNU=7$f+F2=v&q zC9P^md0T8=1!KP=0B&u#2o(@8ucAnR2QXKjoFaooLk2dL`4C{L{s>OnY=MwvoQ^XP z1cs3}?*i>q>b%G67t}9bJtu~`yW2fpzkUX97wB<=yK#m$1U#H>?-1f9WS-AZN>vo^ z)|h-8;-Xd%Ed~# zE(&%*sRwvt;4Le<$Xn9POY)qWc6$OF2HK3N2rg^KDfawjWs7q*D_`PyyDVw^7`8ij zo4pdH6q)re06vDFNO@&%Q0uCGBh^45qXht8hf*##JCCRJea!MTZYOwa2?$ttjF&86 z)OKw3YzV}_IH(E3G(t)Rr8V_M5a?0*0L6-rSdUUsKM&TxaJXq_poB!QM`+F0Eo{gN z4;jOGxX3o6h6zd%kQ3twXbJ(Mh5^>h2oOZ6Z>e0YK%+5)c6Cb1xZyFeA5FNO1OSC+ zyT8L9-qYOwcK(R3?&w>;`*6T7p0npnfDju0_rL!?Q{DWJzxp?D%P}gS0bN9xIMyWRP?PvmA(ZfW1HkqSBM+(Wr#xV=n+DNV!CLkclZU zAf$Pa6>4heFrKkO+B-n1wI_aQNG*+?Xbfc?BUHsa)-iDN-!AiDYt)JNR-rQ6vJ{4@ zUf9vnXvwK%lc+*QJ_YDdmMi{c_CZm|t{;-NJdmI|+b+XAQ`c zUmyE%@S$S)V=$nbDSVY0C+u&^tx^H70kay`>IvGz$)3<83*_gSBhOP6e4ODWA-^A!3 zR`;e*Xi=_bz(ETNTruqxpruRwtZ7Rv16B<>s97+$ZvaRPMEPP}=4(EyvRygJ}Xwc}wz&_qVK!oHB?c8yoY*{O-i2 zRe}i$ufNMw3&?1ZoyVy0(6QIS*AJRxV!z{=I+u$4A>$FU;gq*!3O@L;YBI z%btv<%6w|t?QS51!0~)sg}(*j-af7y#1dZ|=W})rA~t?eJ+t3GOULaPQ?P)qqavcQMY#ap_VyST2Kk+tBK1O@pHCbwCxV938p7 z$e;HCuU>tJw{I_po>{lm%PfuMy`R&r9%n4<0}L9jt&A#rklymTA|O@t%5}m-mG$w%Z=y!`DtGQE0qWFk<%r_{F?^={n0PueafW z+w!D#*a6$7KEpb(I5yK*yVPr`PB|;Ee<70?7JrS?>45j|f572Fcwpdq`}q0wr?tG( z>44w<{x<+9WcjOC-(kPq=Xtkb$tv3dyiJC;9srC$bH5lA-a_ac(w4za6*F`X7!^VP zkAduc9EU3hgBEy|g~oh`+{S$&H(s}eOp(@R&EBR2@?F}0@oUQvps5<0y<#c1Wio72 z1)378a+TkzSMFBkW*Q@_k;S*)-r#hO049t$KHOtjcui3-r&s$HVkvjdrhU#bTa+w; z^gQt5<#Q+nXtf4Utw8bKz%Hk>E@C1dJ>)fyu|RMRA3r=`fA=!(6{Ag}0RQoCcKj-V zf>Q00L!{kMFEaoDAOJ~3K~ysi;w-S7K46*#?Djiy#L^C zR9@@W`=9oAx%Z;_p!I5M1N^NowV@WASX@ht<;{L=wHCPqZoH)9h`-Zb5x6e1G+ug( zOZXp-La}0iE%R3Hzk2KXp5t7TR*t4cIh7jVOg7pINo;VH&Z(C?hp{HTRoa1xvbX|1 z_$0&I1wu-UMcZ@EKnei}Y74>JEK`tPt_p=JG+dzlgw`XRBYm8TK*~~XkPYcTa$F_&Md@`XH7DU`3Ue@<~ac*ot7yIO=%kl1K#&XN!VIe0OcPG$x!Wfmj)#h+&IN~Q8Zplcj3eOSsC5DmwxxXi`ZeHjam)}Q z;2iVuK8BnwleZS$+5*%U`)|4TEbL(cNMU{f0{?~LMltB(nEzH5UpQ+MJ7)?0tKK^d zV1yvQekB)3WHwrF;JlAfkj|B?Y)=dc3@N3Ci~Wh`OF3-PbIue_4s5q)o21+zSP$D- z=Un1qGSOyP<=wjk&j06}%6a7f&s6mpo=(3oGhc2k&grxCh^w$EKSM2k2E!qzZtG>{ zr+VTR1qvMa`IQWhr@vN1`%9(ZJba8TE?u0!3x%?h3hmTb#wagAc`QfiV$;BDvgSRu z13G-{Jq&L9sqf))4E_TEJ>6iqKzYl_dy@eU(>|SlbRiiRJm&Zg2mxx^*NS)a+Y=$( z8GK?gkf10xfxcq+Or^jTQN^GaS()HqFE`#IBjqBkWe2p@t{5C!nPr)L!<^PKjwPzy zPJT*8(A(R)i&?kM;dnei0N8E!t5BwO{#_bdoOduF5Q~nB;ivX(=UhhPONGVICUDRi z?h!8-W3y+LbL)kGv$ToPN+jBI0I6cV^H|)Hz--nsb$FENGf=4n3$X~z41gfeo02jy z*E#2D;d`MXoV5g6iTN)>GH1p!J}wq$anZ+O`xTF_;_2L#m0N;K^My}i47SEp1f>;U(trUKEL*B!?-3|Z& z27f)F0#OM#n-H_&;p8{*EX_1t2wEtGWusf|U4O3FE6F>T0E^>x17|I4^wyG6LUJ4f zpFy_?0IMZJ+~fx9AmV0N$iBv~1^+SQpVk9{P;p!h&^kbGHVLTAJ zH>9MKQbUg;ytQ!N!^|_r-JZt%=ryX9B;}+UVdevrl8|aDDpwGoR0@RIKqyv1DhPNu z=i!~fu-O;mg@7E`+c>fV2AP0*bf17Lyi5T=sj)C1dcYd!&2HrssfUr|np18Q0I?E^ z0zj84JpyBx;YMoIDKh1!$ca0!h|DY>6BiH5woi*xbxeC;%Ov6t}8X zHuLY&uvO%@z1J-ZhTUB@sx%A{t<19Ar4qWjFTHMaS#E0#Dh>WUC4P}wMy$_bA4E3v z(JT7QD!uYtlgVH zM$i%n&A<(S49_i)Gcmh0%!B1$R&4eF)+<0lTb2u81jyPjTfV<%oa}~xEtn)zT{dzL zhX=fQ{{!Y@2Bnk^MQtj>PWI9zkkeC{s;-4|eJYDz@A~6mVu9oF0mtJ%UKjeA>HF`0 zU5}Fu&;iKfcp9rqRvd269Z+y@E@rtGnF@=wMRG=H+T*1V(`C8@pjw5szV=K3oVp~F z^4FL9`sLSn{rbCA-pW4HWkI}hf5p`NC5(kdzFWD8nf7O9LQF<_S>IPOLbXgw?YPnf z$0L7}6gseYzGc6xKok`-Yb~=Ux2g+C%!QK6a8WLW$qdedB2#&c$Kn1%0s^kb%hK9WoV_rv{uJ>4H9+d=bj0s|M_|Cs zc8^zguW{2bh$qH|`2EXJwLK@JYHpA9LrylkJolFKHv?G<7Qt#xmpXxh^T~XD#W>hH zjzqbw!vQ-aCAkfNYPC-A9YFtMd$b}SsQT0~_zv%$A}cG=RYBRWUp;?|GzD2{6bkfzCeQ?VAtjdd(7OF>ZFvoK*tu`g7@^ zEua;?`sP_`1Ix)`o-JnMu;1UMJte2$1AJqm=RGCwA;;}=cpq>$2>`4kDwzU7Oo7FE zthc93kg%Bv@t{g@vB_RYw(bB13iA0(ag2yn7DbGR(AcpBp za)n6kgc%97mPyB|)L7)xV80t6prOYp<(ET}+hvA;z+z1d=PAgUSCUhCa1KgI(yzuk zBh@x(Vx>@Up1_1cXez6>aXe~u4pj4M(5Y{v;HfH(!|^*XKt@D@3l9%r0Xe9&$FR{R z6PzI(rU2=oeYS2GLm=Xib?HU8~?sKZ+Rc%Om22dtTy>JYC1OGO?+ z-^W^y5DX9s-AACXza|nu=y6Q;R?g2d&jdKTy^AM3<^<5A{{8;bM?i?G|4+j@^sTW( za&k6H4h3vxz|7cm?gx;fDNTdM*(@ol*J3QBlvtw8kZmRaFc;$%K%hh&owAR|Gjz1& zSnDb>m2|D9^vovF`*0fCgC<9Q*VCAUuwG403(>%E6&GKwZ`rV(=yetJ|IOJSQQ zJ9~h?vcx{mH2`#R7G|OFxnmJ_cw`cT4)M>67cb&H)EkWM8#X@H9$J&tSzP#EeE0+b{Io6@f53t1%~l$rnd1p!Dv@7bPVy-$Fo z5aJ#(#P=5YD)U*gVdi2qH~n1c=a%o3Nj_dM=9KOCQI?*^WR zIca)F{rs1-i(a_hEARMArOQa2-lji@i=M0(M10oyr=*AbM`#ZJmYVc9Fypb?y4S*E zH}o$HDG50Z1{w0^I>6gJL9)@Gy@kB92}I$|oHi6{$n1QK`c7aApP!L(DnJ}F%H9_k zw74?hH-Me;FgQA;)(}Jv^=rL>cZh(A>u4g^VF~OdAtcIGM({p~7Ln#A2wwMHA8NPT zJ%x1cy$2CwQlzE|QYrz9N~_3NM&1xWkD-sHge0>BZm0qv2LS~4_=q8ujG)3?A6iNR z)CrF$ z>O28Jiz!k7SgawIE^h#MC_O@mfaQ1uv$$=aJ%hC-g=z)z;wyz4j|)J(-$Scm{XGLP z>IvtE1A#%u(%R&a}piiV;+#A=^U=lETQq}yiJJ0VE10AwJu z9tOy9s@i&p3Ik^h{`BEJjt`gTmSblV_tTYw|L_pl{zBSMiW*Bs)4=EiZLYJOMt@VJYx)@P=EwTMR^U#V>9A! zsdNNkt(QrBZwP=n&lKXm@S0&ImO!RDPt1f$kunGXLTv!@jy&QF)3t}FJc%z);J-p{ z_8yX?7)42s9$yp3Om06?NettFahxE8jO|z@#!fv=dA!Syb-%BF-!_MkSA0SaNeiQn+O8ld-yX^>#Jcy z07*4KsR3SS8W)5jFuQeBPIds0F$9ITu(591ed%&KKn^42LkNg*halF!6A|Ku)S3lK52OU+@im43PJJtMJgbZOzM`UM zWo7I$!J4edEetodP_zT+vU{nKjFXuK>Ht_ziqSE$g1N}^Rk?-y9^j;s+tfwH zrqNUA7jiGM`W1Ch0u8Ei>c?39W(4mr&jy>Dml4FL>0ba`VW?>p?PUnx;B#9XMg{l< z0S@CdVl#1Gvr|dSLdbaqaFyBb-P=!(GW#L2`!Ta01RKoPUa)%9WcV69Ztk8zDS_vy zTKB2Gy^jX(<(NPWJr=??zjPd#8alurmfs$yc5#I@kn+$0M?5CCWpyizEsx5*V08_t%aAZDo*?1?ZRAC?Zow1{_?Lo9gGM$_4P|-Jbz;Kz~1xkuOQ%xhi$5pC=PbZ3R)fzB4)r>i&0$;F<6?n%#jqQ)qQ&z6b)U&|;7|S$3DLF!iA?X8`On3pR3F=HXHzVo+uRHuQiD@puLJ{!+Omh^+^>zakePz~^dAZPz~+)`crJK%H4i86dp^ zu{ZVI15^AQa)m&0geuF->%A{x1Z=J+ke4q*Lt<5)r^w~-z}^R(P6xdG@F$#(_wj0f z?7ciLeffIesceJi(*eIf9e_Xmr^F1nop!06mf)u}hbB;)SuvC`2nZ1fm;g7(eYs*B z>;ZB7ZuW3sb{Hl#z+snmysdB!G?RIej#!HML zV9=uOE6qGt$@LaD@*BG5fZN?2P-I&O0VVcO*kivPugc|+&3x@56JgVrl^WpE*v5K@ zQ0bt`Vb#Yq2t#7hDorW`?=sj=4uB_ufCScKy_~fK^hyOK+ZL}!rO0xHq>#SJKBnk9 zB&I$gQ=VvzF{SV2+yWgJK|;lH3qU{sLO}{qnN|b%6R_1#0 zK#;7TlR$8Q5U}TSij<>9jS!=^02CF=8cX$73k zdK#g0X15dp@FLc8vL9HO=#ZxL06h`#)Fsf7z&LGS=5r!y3=kMM1SGZ5W|%@|rDeeY z1p-3Ohlivu9yb#?)eGR^aKt9o&8rvLx#)19`DVZGI}`DBPQUwew51i(2@_X@&=5RC zyFntn;FF!7`9w2s#j)&sTCmyG0KVDGm@~Hs^yQ?4SHsYngy~#J-oG zch12YA43pR9iK7dbfUEYfdDUuaQ>XM&UJexADe>wXwVwxc_EOVF2I9KO3W0&;me7EfAg}yISV0fXzV^5Ax0Y0lHNMd^Q!1rb(AbX zOPzp$N)73^VO<13YxAnjq0=rYCGejy8I*@L_^(@Qsoh_=E!3wxB1kdiE^`=h$uf;NVA7t84qLN8@*VzJ+L? ztksX}YwwT1i}jctI=|9m9eJTW5SPmkim|ynjC@YvzwmJl0H@=_Whtw3Ps>$!;(bp| z|1|;soLwW>OT{d+?b+@oQzmvXYs`v~uME-4$nEy|^d1H~bbw+P-xC2D!I$qb-RCd9 zCj?MMPy1gq6@z}DJo>0CmA!jt7lIJhhT8V-@~;mJa=X$cuel8rN%Z2_@rwko z+3l;Ebk5>@rhYSRN%^9iiBW_A-+%x!c#4ioHYDHYWlDb(=8v0nJs*u&U5;&*fn{k9OGke#4$l>mJrF{;r@-tf;A4gjA zKpUbE&mG>shY-Ly8iD3N#zmk2?63m_uq;QYaZ6rSn=J%@{R;{KE+vHw5K_jCt%cJP z6IB_u&vu2PfX)ftkb>yUg^&b16#~QV8J#~KDxj~o7TaA8aj3M84286zbjCvK5o#Es zVu3ct-a1Gvp~exz_6Fv3z%WwV{@?zWXRxMj11a3JvEAPQ;EaWJ4j~Y5b=>VSA09w$ zYXso2y}5-eXwG+Pgo>MX%0K0uHw6?0Cdh`yW2qwBfNKT z=QDsYwi)UN)-Ld7fgZ-h7Kg$R>0N*^1~)f1X;Ukug5Sk4)zgN^7zYFb+gi(P4H81i z1Z*{i!d56fV%+4g2+82NkBoLwCIw9pOpQ+)q$MhG2}03#@s8#r>lO;dAPj`ik*#)s4>mF@ zlHyNKDk;Q(9DcV9B`@@trZAzm#6&11PNw!6az4;=Lcq>T1o=gPpIy?tsWw}v*k*yO zj1p2IhzMYfY<|q}$83Hf1UR#h(nb-uIDua~ObP(fX0c?`NmH$_y|~Npw#hKl0$5t* zG*Gcq^o)VPBg}gp<1XE^E=N_iLN1*)eYuU{s0s<$ma8zFca4{gar<*w{j3WVN;|Up z4b$4-a*5RsAVZ9h0@FCc+Y^Kc*xqf)N!uDooxy(Inq-_~BT;Gi{wd6Ul&4e0><2^- zWXuWR2LQYM9`j;h=TF#dCfq)I39T}ys5Bfhh^-2L1tjB13WeAj(@XGP{5Gw@eZ}rq z-q!)NvD~VimmsDFSoft2e~-!KR5G|#`7J>fSAdZ$qZ@X&e0S3?em0iBD{|lb`L{UE z#{vY}kI}TxQVg-~SXf(Nh`v{!+|;pDXvNayT7M2ONI;IHTZGz>;5*p2B)q zru}wb0RUGFRYm$)7yvu6FUbY4UPC=WF8B2=z>C2*#k#Q!)0mtXS|CCB{@#4o12H6a zrVDbT?5^An5Mc!bigF<{AdtR6BfAX2&a(NIC$RRF<6g@K_*rrb**}G45Wotg!fo$S z=Dzs*XJZ5`Wp|!yfoeTgz+*IgKQ$ElWmZ6}o_R`oOfEA6Znm`6PRxL1ABuO=o~i>V zE&5pt%4MLv8pkfsvIHfUZ0a?*Fz@A7EPgSSjDt^=OMfn~1G3zbbrAKpzbiB}1Y8s@camYef%5_G1e{L} zdH~EaW1KXmK|v~HokGe^&FIJFSTO}Qdy7>6(SZh7gPboh#kXvM%tF{>3rsA89l1QO zmV3!+FV~KX<=o{Q_LE$nkL9hvy0Qkl@3;Jz#k>0&aGGScb0vU(`2GKte*gEs{5N$! zmsgkwS)L&9gSC-uPY+Nr`h-vbL|JbRvLQzZ-bD}`kSr}sf?*c`4A#i(e(>bzDu)3| z=|p@{4$Y-rKAjgj>ESsPu~KA@k%}COoug2u+TqMX z%zXhEMq;@e#xW5d1m_?G*#pOMLXI*gAO>bdv}7-g27}-%+&mM(!Z<;XBROVA-E)j; z45N-yNU_UDyh9?F#@x0#b;mE{o(cK_r{!xtOQl zeEd-5Be4lK3q%erJewI(C|GAPn?Cy>fCLZ>F2H#o!GsYkc$zVvGRA@JXAC$DA;20J zLmX3~7~EGj5v>&2JV3zK#0+R%idc8aMDL=lWQiCEw%u}Glu`-&$Eg%GO(T(GB;uI> zt%eHt$5G0H@m)ZkYXX4K(<`bx7l!!sIF8uui9Pi6@Cn-+ zV*1p&UdM#hkDPqKN?-T4^z)`K)n>Qhx>ta}-b>yeSEqV8xa#-ZT>D~mU8{3^q@{gn zJ*D14aqgd(UH`?!0s!p%hsSSf(t648w^XIa7Hof6@t<|yMIc*D-q{q4{Zg|}Y=FgN zA)3Ko1SD^fW&Q-`ER@bhI#w(Q4pkf%eY_~H^W?L7O`y8~>o3Xz1mhkrfZQ&Hodkes zx37*fXsVxjc?UA^&z76|;=Q#m)AhbqgY`o8cw|{uK$7J(C3W;-5Ck@jFLkbczRnQ? zrx*Yrl}s#y&bt)0cX1wrRuy{z00b9u*k7OPhBqfd^;r=C;9Ss8%OH|$iE@AiNQcz*l;vG*p;k|arf-_I8JSl*IbRd;oD&j94i00e{wLWBog z$O}I(KLHLD@=9<{fD9S{A=5S8JzZ5&5WjPLOEZSP4_X4cT_q$m!j}1aOaV6d`}n$Hv2s(3J^1eP^sbz$S{RK*LMW((Mq8=0s{KTv>gBd zAOJ~3K~yZ$F)AgXy=-?G&LgJ>VbF>D8*FE)l2B;JTigy7{6I_8S4d z`EkHMoaDYu4Fhr4Jk65b^<(foFdQvE2#41Zt!szCXXY6(( z1`TaVbTgxC0iTBuv9_lyFTxtCNhD(MgaFA2P|pWQJ`&skyV+#phZ3Wi7SLRB4(G}h??`9?Stp^yPh>_vUDAg8Nj9KW z5|Ac==v|FS6rke{Z7gGe7*wM;2DA>um?MC-k`yN(AivB==z!$U=zcR9X|xr zK^{vndXgJB#}nTi{ss_5_mIBkw?F(>QVjf$yZ@PQzW;T7KQCXroW_01M*0|FvlC+u zWCOI~?eSZF|Ng)5;`V>d{h?-#1z{!3&c87AgADI!E}4!Q8;4p0vz0nEtP^bt#|xlT zxxQuHYZ$zm3+n$%hP)+9$Tf~!7OcL{%y&gB7a;@AGic3t+D#G=>wOn zegGk=PiFNisd}%Sw}J~Otr$=5*lapXzhS%Wg;@cZG39x2Fo%W(;W3886ZtMNIEPv%)%^X*k zW1{ve^R?t~c;I+`;O*PrKRX5Br%5RVfj?Fpnyph3Dl=bMb5@!8R-F4ab>a&9N@4ti$q_ou zQ|7YUerSL=Ypj3g^O58Ef!*##9EI{wNU`cJQR!xw#5qeGio#x`%@7 z_gSetR?70(p9-*huG}K~$H@Jh`^#IsVAHDW=F<#-aGj}dCVK{Cn*aq%mewT@LiY{h z-4YyE<@p)Vr2uATsqL>g`)45EYoLI|elr0Un%@>+y;Y$5wfbkd6%c)m$*Daz=myBR zs9!6irZjKAZ};()wP^mxIasfJr?n*}Sx2752DsK7t>&zK%l)-IQ@7{&MgPpw&z3Vr z^b>>X6`i3y4}1zEAWVC}YP-sP%{hJf?svNzcDujibUM`Zz*D(gz@E$A_o?MmSOEe4 z?sQ=H;XB^E5w@J&WowJOIr&#=8IzP4Ns|%g8sYku%k!P1{fafs}*8WY+Wpm)~rZ;T* zTOjcD*DpAoixan>0RmfqRJA)-K%k@=h6!w^?VcFJk75a|ddKXH06FeLOpy+zV@#8!8ceiXhgDvSI+xOV$ zBTq2}PW_;!`-={>vgXc!*lTQoi#4{gUKaudy9Mp1fT(tCJqGw&S#M`LXR|NP>b*QS zx6jcAu6U7J#=w@@Z{@-ZowI#L%Iib1NmU?d0q*7fIeOPHuVtHW3}W{)nR%_S`W2u< zij<5fB_l>n%^Q7nizui8u1ecUE_n^g*|AD6Z;Wz|k3rVY0{rutg)gOm)^_p{MPbl2 zrpwvu)XWzZlVm2+O28pyeD@gut`r%7q|w$2Q(SZtd8^SGSXBN`6R0dkY`>BF^R*_E zT_n|}+tnE`EH-XowG+Ug%Fk3v+N>1xU9oE#Oun}e6pX_e*rHOvB>}5wExwHc?yCXj z8Stk}H)91<#*m!L;Fz3_GkB@<;4&Z+v~AWn7to!VfPmV7hUA0z4FKI)v@voH@(z?{ zvlB9g5M50XY>Y-5Q^BOcOPXeKaJxbR@lyx_=JZ}t87rxK=_e3!k>~|jHaa20P=GeJ z>V3ic8swT(LTMx5ycp^_ZHyH=yHRyq?`~v_1m|$sA7PEI{vhd>JfAyD0Rk#xB>)~p zat>v!WHhr~P9H1-Z+mx7%J%v3JYcL457;(amUCF!iBBR?$Ef#C#+Q=$WvoRR@sm6} z$iDIM;V7wPk(A8`H*k}G>l(5M*APq`+`vuVvktBWh$WKuk~TNN?(UA1AdEu=l4-56 z-ITI8&V|(^{_*Z}VD_-4i*=~D=^CPE^9>a!aiy?d)5%mY4M>YvMD1gwwHVY24)Em`=|1! zEC2FWe?I&BZ@!t*r*HTjM}GCmGM~b%e0ur3@nIh((wS=|+)i2Vu0HN3Xv}k3FgtCR zN%3qTAlGw4FKHp$qIQol7+fonLU6pS-GBP+H=iNzAFhn!C7a<+^LnS=-;2_ooEIN_(DsPT4sSP*|58z(09eky#Y4QVRQGMVUVWU@HQa5i)be zka4XjmfNKCOtU>49{ugd{xzLLb4csQNr z-!=-iTLPc6h#2Bkpla!h0{(mX;s$LDFJJ7r+3yH3a(lBQ1fj>bR`d3U11Q*Tb{Mlk zX@&P1AHdsx#wp5yik_<6b)7^x3^~Hjdym={19xP*k3ZKNM!g083Qdd8D5nyLDaD0oF#RFFY{5+$9qf)MaA z5VNAQz1h?E61``%lDqPF7|(-Hxfg(MR(c5u-3c%)%-B#PK1AGEz>3>K(XNdE!ju6L zV+Qwin~f+2LloM7Ye^(bw_!LQ8s<4kk?j4EFbs6N9SIoRxhi4|qIisFNmtu#1RNI5 zCjrbcttTld#$gmzx2SUj*r7(jr<52^j&YD^u7s!g$K}b@(wg?Fyn01!=!@ zWlllStY=|7Rp*dW#gU)#7}o;IQysxi>Whl8Qkch(K-v16ZxmL48nAt?wYJ0%&_$8% zyQ-W4oZNeqPMp;V6*Y+nep;(H=8n^8imLwk?rVPg_rFE~8~Z|lek(`FloBBUYD(4I z8g5HqfLa)g3+sT=lhL*X^3NO)FgbNw!|+;U7|&$gYuljIEF%2Ec-=Z?7tfus^({;5 zq+M|+t;zne%zO3wD?q;XS!tZ7$1@E8EqXU&AMm3Xjhu_1H8E;}FV7aESHH_nynIF| zKt5mw@D(-}NKx9Zv?7KxeWyWdwtJ1S34Q?G&Vu!gLlcdsAVwxY>8y-oFwi;RTZydWwKuWy-79EynR0Fs^_I zqURb5-vt9-D{HOjIa5u{XZ{Peyd}u>irgoGm-)8~_R5yQV=21@+%04;0Rw9cQe|93 z7AY;uC3q-l-I{)10N!N|8()(sV(F8j@^pR>EU zmz00-D0AKnbPTg~sbz4ycFhIbUoP!DzDT22WGo!twZ&`B{bpZTvg5U~1*G7gls&8S zVm)r_y=0eKvKTH?xtj$Tc-e<_EHBoN*5SDXt8ce^e)aWVUOIep-IsN}c1Oi|{msON*XTFx8LEQlqrV*Q`3Y-G zdrvU~0+pG4$+TC>?EB@pHqIIG*4QAIb-rj*`Fmj=T@TQDT<5I)um%KM)ETIN=T$v& zIo7$H2Qxjm?E~9gw&}6CA3eLm%&9f|{Ts%?7lv-)(B!i{9&9LU$d(s~IyrFbifYdT*=q z4rhnyZWzu9Hv$L0!W5XM;Fno9FWBMBc)WIwTNz6lzrF`H@@o)OYqw~|?4nY0U32-l zzSDV7m{JCv)1lTg_)=~oZ@YhuwiZ7QICmzcfWlCMMr$c`ZtWavcA3Q-h~ANC`&R0t zbY9yx`&pglL}WsAQ0(8LyJmlrcc>;9UhWsx#^j@btU3XgU97wX457phnxX*l&;q!K zZqiK)E1=jUg>XTeUI23`UuXKd1<1NnGJuFb#oAP}V8wC7_PzKZbVrDC{?a+~NQ%N3 z7?WhKDH%y(ARicQzD8D13#2#zn&{4z(NEis7$T+@J4*~Bp<&gsMvI+2B%(@?2_RyM zbvH9H)#pU-=(e&3DnMIHGCfg23=Z#x3T{-^(%)vAm$8*G&AWiu<0Byilon7}%ly}Z z0SmBAA>iMnB-2e{^lN==!O45pok15LT+8ecB{eZdV-5J>Oc>7C&4w0CSb>TOV(=4t zUIyx={QjYUHDlu|hjbzZ}oc`G19`Mw4E6|j)<^HW6(9+LFKnEf%R z{GM|&#dlH8mp%hCAv%Y#9Z`X80>CSAOGl-SPd02p>FSNOW4xFdHodB42*-lKYzu?<4>Af4U<9hht>B zkw<-e@O=B-cYOCw_EC-I+no8Nv+LkF@o}XI_?{+zEQr6Tlpj7!w$_{d?#X_9ZuwNJ zmNf<+f~41$9-U>f8@yw`0u~&G?59c~S;tKEue;z0m8o#u-de_C0%D9aHo&517vE;e zz&T|*qH}p;Nj2^7li)u${jU1r_mX+m>hvY+RB8mNu0xS({Y>#?Hf>QxeC^Bc+xqyS zVP0$4{OY*QOtb*Do6g&1t*NYk!OI$zpk<9NpJOw|ymK?mL1F&$8M_f10R38tA%NLj z!8QE-(0X&{qn^D*RKQr zo?9+izMfOchPDI(UgJH3|NNUP>5cyZOPjiE34B_Oc)RlZwW2GN(E4+hGJec+Qi`** z!`Ghk7|WeXAsafHiB%${ngx7Tmf*KF5S9EJ zRyLO_NJFg+{Vp3^t^oE*@qR=%MZ_XAboQd(mgaAo=4#e}uffpA9Dmv;;2UA?#YTB4_N6PBp}i$I}gRxG=8jBeV9 zlA0Yv+Y&-r^iHbXr2w=-=dbSXZcs{bf4AfIR*Wb6n;j{5`pp(?3?DyaMy8Z7W{*;e zdaqI@Un{I$j~=GPgOym#C84B41F4kP_W(t93HL!~$`GuXQT?nLqt zm&ZlF>4`ZKZyW>Ne$U~Y4M16eDhE#QC8g@a=|I2fCndC`h&@WW1@B`8^9AQ1C5FM% zsS=H4r|7>dqeLPdP6tU_0I1Q|Ya*h=MK7PbD9S=g;Ld04W|tLMOHu}-1X$L zda~9gNWMk`1?Ouj?UWLFjFmn-45I)Z6%*556oovTM!Xv*B|$3~1+=F!+g}V$WG6@n zt6d1fSeM2Tv)NPy(3p;7x1790W|nA0N%!l4v-ER5)TiL^&HPS@>L{s9c!1K9vI07M z89+%3`(KPX>hCOu8?Cc4YO^sy*46|BcLvVbE~f|1bxFa4>hUg;lJu__p?y}i1~CK` zfUCAOwQ+KuGz|HbxSA$8m3<~(r@9?e_V1J#^MvtGF|D`21dvt|F$l8WYTMQQtuhJ% zy6bB{Y9)Nnl2XuCV+g>*`6K`N`+pDQ6ey)OD$Rj;S4z9(#B_NoTT9Kh#-vf4H|;ZL zEOUA#B@I{VwlwUo$d=14ot-U1AS`yv6-Nn7?07SWV+H$cXXl&?N9P&{YXK~oIT9af z=S5#XQ+5lUs_$j-ep=ZNA5NG);s;TR<*n=0^hj0ig3)jJdnx^Wi1Ttdp)x2 zcih~)q~F{&&h66929T4%Q8Nedg4N`LDNlq=&nql8<@**8ct!TaYSQ%Kn(Q^UycOAN z;HCNNxt#mUceq>!*3zUjug3HY~saP5nx$)f6Ld-+#MW zzh!xvQS4J4^v{uf2@H7s`YZYW?lmy)<27*R8biqpSTg-sor-0xX2G0yF{dxUhLh}T z%vdv!ZDBfTSV2~urEAXpwymv0l)Tj!5{wcw~~&$0h_^z*i10i2Kzm>hG$SG^hEamBE$}Wsh@_G8c zvfo|Vhbypo4V1Jdo2d*^UH_r=uC>Ae3e+05VfOkM-1i7`9r{6cm<+bvlc zTm7aoY^|JswC%XLxn;NeD**!j@H>VkJ@DFmy0*sTUoU=Z?`h}$bLVPWSqxe*;C6q* zn^(VJoAvn_pnU;&o3jBf*ryloQ8nXwjmh#c*^lWB?RoCv>|4$vi}S$6^B3pqQl|Qz z=ijY>(*TrRjEf4sThWiN$*zCcM)o+@VVm)HA-g#<*E7gMW-D9Sg$}#29`qYazmau% zm%%#6lK=vtWn!O-%X(VZZ6M|KL%GQxl0kzi2V4F9@4ugZ^GCk;`7b0m%QESY@?#wz zZN1l6_j(KcZknUc12HhT#Bg@>+lJvim%$?*3df5RW%|407ni~ogd@3MU(39Swv_hE) z3>%%pySe^Z{ALAArnH&)b;Mo|F$4c%9L0~MHA-8|CeJ%RLKvsuX*Gc@ie*dKdBqss zrXY?XVoWdK+2HHmr~4ft`J8cSgy6878=^|0cOf=nlp!cf8c$H@Wg0(9X^wNQGRmp` z1|PhD`20u=j(#V1i!HV=&~+r+5ym4C1%(Kp0LD_bosufJ(wI)tROay$PiHp!o5~Id zNLDIsQ8^VdN(q5Mk*zh#bZ8}Dp!!ag*!N-x6o$L#J-Xk}Z8xAbS{t+*E2ATd>d#d9 zh06QW!oC$E6fhk~Kz58Weu775-MH&}l+t)TU`!`zLzNPLTbIX=0;4QwjWUYhBS{q< zu#721)RT{~+inEVXG{i|YP8YSS6N1D1vDt+J!T)BHfCbQ1foj0eTr_g6~92&qm-h{ zjD-c*ojD0+vW1aM)=XnWPLZBSXq77aVIL#L8aWRrjWMRm21q(K^G!**-#q6ussT|- z%Hw1#%2>X9xntO`oKYK_=S39!wci#I^TLv8=(@i8`?N9jeYBvXusnN8ZLfZ%ltLx2 zR$)xfZ8rgxPp306!pj$LB!#Vo-+r%ZdfW6dVU6Kt)AQxezUGTB2DCBU-xy+$eiSgQ z)bqdn=3CzWaFn##T30r~3YKZsv1`OGhvOwka%jks-hEsrlS+P`5*OwydLX1R0!&lY zzA!`wB~5U9UxI!Guy-6}-{{SJEVTal=tK2ywpAL2A^VHc4CDt?U!B%kQUZs|_pG&M zJRKS0DB!)A{WPTyQWBQF1iJ6)v#qvM>fa>5zce;}P!{@of|4{l=Ji$5vrnvlDa)F5 zd8!_?8Cg;A^D|R(IZ9i}N|sUvlBY_Llu{!{o1CGnDaKaJLMd@Z^kl0qc9|9MpUQJe zTKP0Dk5W$+SI#4HMMAp#`uSCR?5jtvdB)X?@x6A(Qq_G-H;%If>hbZoeevZ*U1sLd z!{z#^Zr1HA^?ufpzpT8ZOL*PqITxzDmBsAIGP6KPjpntev4EW4KklUdr}7h)tCM08)~_3%`qEem{8vd`rQj$M!e6~|B%5S`G8=`VSBlu z%_x=KC63iEhl+a3%lmN;AjGEs& z9Wd8hKXYh`1VT&S+-wa|Yi@4DnDhRF)JG|WHCucNj3b=hfwdbr zB@`a3C7o}K5g#Xq76`$%F`5vhCwINn+qpv>t3Q8pj|PnL^u5a8n+i@cR#-;-=^^*2 z%4u^)d`$TB8QWP>*X8uG0^~DBlY#(0lF!UKi#aXBDF2(LVU>_{z3Mz-tWc8|hPz=H zFh&c-xb13mMJYZEQ)E+9Mpuj-G1H!(Fh*l-htd}3Vx>bjCge1@q6|$;dMPvT!SL}k z0r_;tcygIOd&r97#KKo1s(gsNfB(St_6`vC!g823rh{x48$Lb=C=F1_GM;2_^L|7d zC5KqCKvXba2$A^VJ(0xb=2jT?q|)fF%Pe~x=Z7Pt5jJrxFK+C;#ADf=-a(GmX z)bEWl)%a8*M3uJCOO#_OjC(5OC}lAO*AyVqVfB#Mf{RSIBjKuXq`VVUY7`{9IIX6- z&Xzurq2eWissJwALuq5kR5Tz9ZF#YO1;G2`6bN#+x#$1+um6tw-91rH&#Gxc77SSR zFk^8O4_&5Lk|2AC^GiyPuvaoa&Su+RRiesg)*Olwn*z0sZIW=0@*W_Q54U+?F zjb+X^%xM?pic@H2gtpy^VQD?GewlWvHN4MLr7mP&0jLBIr_%`{DAU)p=;#~yZ0y`| zu@a-O3f2eu-Vnlx6at%FPrvJP9UJfqm(Hiv)Kx1$m(%gg`FP^y?&XZlPnn)~?+++r zxqr1~80DVhVGc4e%^CCp)EZ9g`YksvUjiXJt_mxl2f7(U;sw)ESItiJI!axt`3++cI)h~PVUB`S^-^;IO^9Nma{sn0CQVM{Zh8bnFBkP z@*k63O7e~X7huUHuw%9Et>Y+q4u=O$r;i-Y4;Rk*AH$3`{g&$At?cso^JI&F*ROw` z|Nm;Xc1S}fhoU&gSC~q#fC8_jOE&q#)c z5`4Y@pVV~hYrybk9F_0ex?DI}7qUUdXRK@F)3V!syl9u6GxW4^u9PzX03ZNKL_t*P z-piV$)JmR+W^Y*n5BK|f_WS$!^>G2CyYvz_Rmuil+4Gb-5;c`mLJ#XYxN+w%k9jd-;2M-qZHK=cW{&_l3%9)#LInW%H=~ zBK!OAe*JEKtb!t$gBNEk!7R?87wFiXV zaRFG(@ABsEB{z33IUL^e{rA7+d^|ksJW>9CieYr^n&+~cu3cOHKAjHy-SIz@6zukQ zym|cK-?)T;Y6`f)&plbQNB}n%%*%vH*3)xHE z4VZ!R>MdGLd-Y=cfb`#*9T|Z(EPD-9I|*3TF_qGF?_1T6YrtCr3b!34U8Pa* z`;Y$#4gC7M|C4TW!>;S-a$k-QhS47}c}KTsUcPua$ec_0T|;~XhQlFzAx`<`-k(^`U%Nl2!V z=&Bu3+fIBFScbF9U=U4;#b*{!r!z6L#C18iT7lS`qnAMM2!2eYO#TpKlpt@F2q_Xy zh2_px5MW9UIMvKZUB9WoLS-$C=X{TlVkkvsVU!F>w%dx`y5EW)#&-FALsS+Y3ji`< zyIrnV4k%aB9m#t_OwzWlCq<7+2HkI^&pI&K5Emknidpr@T4FWQ+fJ(sh1t=wB!`QBlbEOpL42gG4orv3gcC|BY}eQHzvD2qn;AXH>5y~kYBgyj z%M`;tM11yL-oALjQ{`+1tTEX)mAJdV&$fO=%9Jy<-x8b z`7a|M50SSY&isqNcm-PV{z2BIj~@^G;oI-TZ|fru4?@;-K23hYl7+5C^R=0c&ZmY6 zv;pX)C0Yk&L=tT&5MgrP0;q<`&?rSrv9kXG3=6>C_yne97zXiBSxGkz5Pc-XQ2nVs zI5z!e^?qwQMjU51^-YYip2@ATq&`(myS$HXyPLBuriuQi?H<)l0Kt?8ePrr(A(6j7jUr00~mEp+zGa7o)#*#bkHNQ<1S zn2;7=sMK>TA=k?%nWFxI%YXRwANcdHE`wL#@;#(9o36F|sW6wH_D-I0^QWm97k?%L=n@Sm1R!9kSp@C7lS88VesoW1-Q`|WAY;Jy(pm=MGV3O z7=p)kV(?LbwmsY1dr*nwMqFXWg3OrK(266G8!-supeWc1KaRwh@NQtEwuF#@d0i*0 zNL^2IBcl(D=f>b>q+gv2n69f)A#IdSjAwk1(}Z_N`pvci^|ZB;>NkNujkwI-lu{Bl zy9DmxfHrbUs}$KJTu3!~B)TIuUk}saH28?Ndk&{SQitbO&L3=B+( zjLfUbH>Sg+vG!BlQ?-TQC0dpuLql}4H8jZpmfsr#og0S9*sa{m37~XGi1H3+%Fs1u z=K{c242s%z6|i`5>ouq0;WXZu>-SHb=@rW zRK;ld2y@-0w;YF+`kTpMIs+$UiI|V!o%df!q6+7z4I55Q}1*+rHw^SOflD%+V`=7`*`BcKhaC zUO2s{alJN{mrnDgY_o0H2v^pEc3dyzFYCURhI>}`dfyy)w8{$Cw4neATi|Le4#d^D zILU9Fl#j^<>bjwI)_<4%+15S(ey#3@!+Va$kGy^R`?>DX;!GCK_OlIyIO~?_fv{?As)>J-ZfUK z702$fw0l^oqwRO|J+yrn%g?hh(LCeYJ|0N!C*Sd|i1Q47pyeTS3>_@@euPH{dRr%}%Fv z#)zM;d{yVo3>4A=epdE~CCIPbQ|4F8@HyMV7xLG@^s8&f;`ypsi)M9?IUw-Le5^$; zQj|BqyOsfU*(Wp0)+4gl`bgt1WY<1f0bX9{01c4uDl@rOwY~)uz6$tj?`hY^*^igN z@m6*L%UrO;=DwVg0$9jw`T0h zZ=b*_R{+0d&1~wvzw6lFcp&hrKYz_R>#HgCeEd+rd;^=Cn<=$i%hKNHs{7p({MB!# z>%aZOJ7NqRddoN*`S~w?0f1SIw+q%iZCPWMtF~7HU%V;fDlrbSQoMWr!2aeQ@4{TS zXu+R)o-!C3{W~Zy8zOK#B~C-YTEjS;Fe=dR0^8k|RlxNlWBajlV$-zb+Yb=4a ze-^g30;Io~=PUb~vFi+kFr98npHv*561KDQ>~LBH?wPKFYU>^p{hVk+iOgdE4AG%5 zXfp*VOZyzbjhF&X(WVk97~4%Y*%%)&_3^bAuzZh`)e#ZgCt|{ zHE6rv>^Kfh;8pMf1}x(v%dK2^s`RhoX2VnqI;FI(jCx;tH;y92{bej#EZMM}TK93M2HT3?zC%6$%lYG^o zwP8GuoShI)7~63gBWgV1hfzp8hO_tym148)C1_}rehVS8ySu}I_`ZgL;=|kCzK}jS z4wWU&bkn*xo(J6dM7Q1H&L>nR88Kalb6&2^@40}%`%Q<|LYT7KzY>se_K|s4_NeR| zN&=em!~dpCtY{7pG5sN7L1hA$I;TkxyEXsJn}@((?HD&sWPD zLiF{k9|6?6U<0hCLssI_|EWB)s7KPz{xM1&LrQ}&m90-3J4@-iWcHgCV`tYaKUX;p zQAm7%Am9&Wa+==)bb||amljY`tGjr{WxZ1KDOCX96mgY!Y8h2I>Yy!J$$>h?$a8Yf zYdtaZx!`NtLT08ahwV1Xa#^YYI&YRn*~-pWuv%vAz2rXd&d-_}niRrvm73Ah2r7xAkkr6&x;p3f|u00au8A6zu2KRk=wnrOBstsp}Q@&+lgmD zDLFtTM1fFo#Ar#mi%vO8M4_xjd51!Aeh@Z;ZoA8hc*?-Q4LV0{#o(}7m=$^>saUm< zs4Atv=O{LSuI~w1c1kduPN1OQ=JcP+;DZ;y95P=j^}X#Ga}<)aL*|`7W+Nhiv6Zqs zxWsT4Ww6_9(N>hal%yU2V}$5DkVwfAyq=i+Tp)aWpT~@<3Q1CM`gqP`D`D+k>UtjW zgPTBmrjyh(b|=hwNsL^{`@Hch;`vl%N+iFA1n0x4?rGNSNKTX`=cb5Dr7c)PN-&PD zrpqM+QV#D6;am?H##mA^jH9Q5=_0ssM0ZGP03a5&IPZyANxP|So^3KOrwB#??YSY6 zvQY&_loo1jl9mX?t|ujpYnGcB1Z+3@5nbd5QGx^zm}h`CgfSA)BsW&0R!W)>Bz3SY zMxug`DMqj`qLdhXh&k#fdWp{5?8TWG93d2D$52@vgP)i~b;^ALL_bz#NZU}^4k3}U zbv(tGjXo|jN@l=^lZeF1aH$lk7=aX|tPsTD&}I?M3+S$|hFGm^u^;91)2?2>H0mu& z^lma5W`kZe9qkPS&e-W{c0OdAjSK0mk`ZxcMukQbfuU`E5h5WXZolr#{ z-PUGoQ7d)3=!fd?66;V&pZh5LTiYMkN}wMGWAR+}EBvjah%uUrUCCnNzkpAk$pdQg)m(^{p|^ zNgFQfRT%9at@{EH`0e+<2jK17-_w>gC-@Qs^jr|kbDi?nfPs&dS8u*zzrU*vc$zT| zZ5q1n`a0N@**ks2DYy!BX&l+Br8vo#skj#RwCl%({71@c%q-W^7TmJ{ht&DFWI$=! zUjZF?-j#W*ZFbbg1)z8-zu6mR*R+oRcFoXNQoF6m29dv%on@8&i+VAr+V!Lbt}NPL z*Zn0}zQ}LSLCt-~^N}yU_yzC_QiwHB1gJWKoZrfrU4R+Ox)>ZS3&dmtX>|BTen|zj zR#Gt@8(lx67y508eE-AmIGqkxfPZTC>_+wl*fTZ*Xs0- zNB(o=o=yk;_M2a`+ucD3Q;?9-)C>{LIV3IYJ7w%Cr7wQFxc*1TzqxstgE^-9*Ey45 zV>?XW&(Ew40I|;D2Am^*URk4NduDrVj?7pyS~%(-D{UeeV<6 z?D+1x9B3R*1TSZkufG18;0F4Q$$?2(M$@;GtlYmj@UFD6#Ap0$_qw*>bOt|qPUo@F z%cZn|b;ag%p_k|8xG|uO1WykGIG-@uFr1HA1DlP-cKY(HmFvF@ntBxM8W&*C8er)z zLF-I9L|M$wN$u7y{bCDGWG&=H-i*Rc?9Dt8C|7 z?h|un^7T5kdVlc8OW9f0Rhv#7>+|)Z?i+eaOZ*g5dWaJXVJgpQ=4XmtY?~>`b&Zpz zFcNCpO>Ql1x+7+mqQsaofvyQm5V&8d?Wq;X_> zb32n&fNrXJo*zA@!3$U~_m23rlw9B3pS&jo@wp{8vbh!cDsSitaHo*Ljs};K_(EbC zW14Pvi`wl7=L0Ef{HfUOCqSb@F}{5-V={klI2MzVZiBXQrQ2>E|F5I ze&a-996d%0k;P`C`Lo+EI2<0>Z!~A;_}LrTYeRG#Kc29emGaxSANk>3A)rb8@cu~f zq4r5B<9QBhORNJ0$L#A`0;5{+-?dU1#2aAR601;||CSHP;6L#}`b%p-We?orP7e$Z zAEa-$`RrV77k6L-iYzFc$*0+-{#`Qv)${Z<)x0(578!{ZaMg9)zSvm)XtZF95K!BEA*9%>7j=Cyx!}(O(8I!QOnM{MOwa#?@qEv?*`J-z8s2tI@q2FZc zb}x}q-DZ;y>yjoG1-=--GaFuXj&T^+WTS)kE>nO5m`br7v}M!x#023qh*G4ju;Dc{ z++{3Qj>-{Q5hOK1YF2>+_#nW#AW)j?+wEgebOpt+X*suX3r ziP`57hmwFEn%`y)e4DSCM|;O??5iwVt^8$X`?Akm0sq0IWR;Q%2l!$Sn;DLafw7U- zrXOB19IU3!T^KW0Q>ZQLyXLI?MENr&!&ZLtPSJBG&}tg1)-kdGYgNEYY|?*ei?-Vd z7_!p7$K;>R9zS|w2n;STo*gsxSnnCn-vO{~9AD@2v0fMb{CVa3-u9p)n`|txI?(r) zyPKQZhjlJ2ovjV$=sIX;lTO$fquK=?YF{=?VPOR?|%5uT=~Q7z7oj@&~;P0 zoSUwD0Cu|#+ufF%{f=Fi4SxNLy0%0g=Z?RrpC*rA-fgm91u3R-DaG%C}ci zWiRGn`L0cwcEJ?VIQ1^xXBm1u{^@k!H^2E$ z(vIB?Uw-+|xVgE%96xJ}>&-eXK^zkhK6y!%d3FD90BOQ1SiqR-avxaH!)Ac0l{1J` zb0L2LNc?R1<@3xQpyr^%#dxV_dEEq4tXy}=TJG0>`xDEboe}W#8%uF1KaLPqABgM1L>s-0iophr4{8 z8v{Nj#?!#)Bg1K&>EC0MxuUn1XRgtY7y7%@$I{!Lt~0pc*z}3b#$r^!^pjqG!JggL ze|8R^pO2(H%vm0xf+erX-`Spj|GWQ-U)=q3esTM&tMV&&dPVPky?;T9i4Y?n#yR-; zuYdFJcya%7o)Kv>6-;AoC4tHAO%fPk9mN0Xz1%~2FQyR3vrzG~? z7$D}1MqWU13MH}Wx+7#zUdS0HjI}igJkhW~r9_tjRIYhISkwRZ8%RoFx(zA& zpZqw|Z8m77_%R1QDoF(!b82Np0eMV8V(xIr-wO-iX4_BxCO6`S5tO7D9?ltv z7!I``Cm^LF_>i+lDf*2jWj6EScx1Dev8Fl;IeVA2w>88iInOcsRQjyXDr8=U0vL53 zm*;D5U_3k!f$?~x+vRK|*3ua(v#IZ^|H^yEcot$E0Rg581}xVE@9{p8ykswPN9o7m ze5T)SYi6&`K-YID+Y{Z$&PaBppS|ozspHSSzRiv*jn1SZr%@3Tcz5D(4!rwt;`Qs- zKw@x)k_Wl79VLrZ2m$A0r0MR4AtaRE^7lVPNs*pF>l>mMfA5PIJG6aZ+bi}PgU+D7 z@h}0n4=2yZhXe24ALYF%#k&v3`FdAM%ICP|tF;V+KDZL5#c3FT$)A&Alzt7a`bPbN z>2C4J*@vYTTYNCSWh%V6m-Ow?PicSa{UyVhyx$_v=S+Pn1H(z!W9JS&R|gtzcGu zI`hp`{(+%P)0kNpXReeVK771LxBZJZuP@~_fBey#xOnJV?VkqzUCfqGtHR>)ryd{{d1@_532A7}Ht;p=U?n0(9CLb2pfqjYV6K+X!JJs_# zz%Dk6e0y*E{o3?Z`E;U^L_ri5z!ZXjPm0Xq1YV}NGkQhx;vvwm|E<@hf~d--qx8f8 zn12iEaaiqCx9g0FkFh+4W`hQ%l%4H0l{R;MwI~N21*n|nwQX#>=-uAlqP61wUO;r) z&4%qx4pRGFkB<^b_Tl5P3bA$vS~HH3^PthzFgkgn?F1m`Gh?992HS<%Gfe^4X-(f{ z`fzsy73ey}%NLn)n?ac9)C46~FYl@XrW93aD~$~G0HVNH3^K-DbZC??FDlSU5mKb< z1iV)W$_tQB!7ReFP=wd?p$bR}yXj<4&IiBPoa$m!1VjNYOk}5FtcsuRdeG&?7>09+ zl8S8aa!SK-9y(*?8_yucWAz}z6WG`3x^ zvMsMEQC=-j?~42jCv?1w;=gcm+bR94w1K+UO!DWBigK^&3Q#uJw@aw7I2*=D3X`En z-_G}o3owI9=q_>3&sKm7;*?(+S=+Q?7XXm9Z%h9+M&@hGW^I49PL@?hq=kHcMSg7u zb5I9xS^pMXxU7Hlm*aHdL>OJ-d^m}5XN+LB$Q$U;W`j1c>tT08O(S6%Wi~eF&J+`O zE9_V*ih)&k9s6D5guB-7OLn%EYuY|M45|SDF3)XR!;2Sh*xuYoDqoW><`xuZ^fV`1(9NndnuU|9ZQqLH%^g3iJG&o|fANfE zy_@x<09&u7-(K8*;l#L7@A@0f9DGiyv`>^@nDLkP9Hg)PgkAlYo&E?msF!t@`0}W^_hSWNx^H=u%9+ZK+u zn(DjRr)T#xeX_QHT?MwZzg_E_*?o&S)XHzc23Jy%O-w6~ukXn_am2RsC}00rz{6AW z+x8abNz?arJ*a^Yi+fu67odvfIZF^_Ws_-{RmycR17$47z+>`{#{;ilf5rLup*o3D zPCo>I()Fy|21LwQ1dG-=3-Hrb9X}mEK5O0h)bz-Y*?*q`4nFr8&w2K9uK8mDtY^tb zenPox@_#z8;-}sB%{Ra1&;IORu;1UW0(H!GU)Pi1CC%VWr)lO<%O17H?sZLmDYF#k zTFufKuAYIHXaAM;qzzbjjCE}S>~ud$J~Zpe%6-?^+S_u`ceY~*LcS_TPXQhK+ZX)# z?F){_4;+sV6%6{kv62?&ip%rGV=RJCkLjo7pH2t<_HX|K0NdRSUw-k+85kVq@9|oi zWO#)2cg-HKv?Y{Fe?s}C4Hqe_wY_-PAkNiC0p|@1`8>5Z^Lxl=t~&H5cKi!q>I!pt z``xwkUmMi5CckAqZqMDV-q@xkZ|h#iyPgLw&CXp}{${J$?2C-R@suPGPWQa~VG0Pl zX74X0g!j}f+fY+%YHb(`4)5K7$``%);stJepzrkjTwB_@2D)n7sV&{s(nZg1TgG-` z96V^na138hbQ)u4RF0Qpzq~Vh<(j6L zzMqYORh)JX0B%}E?U4J>JR`jTg0M$>BUsE$y`HgQXF(3QOww3NK<09pEm+jgqCdnqF z6{g#vI*aB6MnHRBoC84Xu~K;Na@u0DeLwp>%ky-X*%2jZUTKZ7TQEC9I-|9K)?!Sv zbiCR7#W0NZT(5N}02&3_%LDw-tdlv@jucaUkIp+n8yXtLx20o*3_6Q0qOvVs0dYJF zU@SOnH-XW#DR3G9n?Z$%5ClZ2d?e-!UD_(N?M2Qw0-4xDK}tCTP;kIWNGAXY6Oa!r zKCc)Uj}F`SC?6(&T23>pvQQNQ-i_jO8$H1}j8Wi11r`##fbh&2P#9y0F`~kmVr5n? z)GS+-Fhj|`ejHIs(e-`(Y_zJt!f^=rVFXSXQ@%HxAI`Pyin9PjYu(9x7jWZ%2JEKs z3s^}ZOpQ);Gq$)v#z}01 zZ~7$caJ}VjZ~5wHx8ma@<#%fN@GzovzY5<)p=j1ljK@f0b26H)Kw7p3kHt z^*su{qsVL14_}m(FH;t*%#?oK4G)mOpAXn>I}wu5=q7;9HvQJl7E0zwZBWJLAExuO zGR+wm@a~Y$bu0LY#)wof8=)m9$s|27#^(d3er&mZocX-+Q`GsXD6hruzxytqtySXJ z-~8>>Tfcb!3iqq^li9Do`OVe)jvt<8&AhDV<1+uvzxtQ;y49OMp@iG{SZmDxn1`oM zqR%VK8a=0m^|bcz@$}er7iA6X_bFZS?!&rL@W(1Y^&I-gRerkG{nY)`0t1&o!?|)j zF;}&qJ*CaGz&F6Y0`f>LRsRAs7*~+r02IY|2Cz)%0*SzvBk(wm0N`SqHjq-n1&_%BS_=d06YB5s6ac&Pp!z zB>)h4u2KEznL0;@7O6Y9@etcXDbTzN08|9*ks%|c_00@^5!lN?&p!1DG^CB0pwfHr zE;Hx3m>Pl}c@dqRu20T?{pe5jut{lsBR1ELNp@m$Uh^>Jv$lvlXD== zv-CYrCj>8&YKg4XHFBJj~$Q?lM!lhgR#zIcWE`v;iG z#Y20K_a9F5IdrjobWTY+VJbH6L%N@Vf1B+lr}G`O!|jV#P)b06JDu5j$DF~*P~Tc( zX6H3ynOOs$HXOtkQ;D(hlbz|wNzBL6+UKf%Ag(PJK&4Ij7y7_cHRt!-80&=$J|~Kw zSi0oe*}{M~c^$6j26Gnj?>HDJfgq{w*$|Yp=*OJr_4kLv15V@dQ6{CwOWZTX^1J-k zvyC;EPjbUAm#eH zrvT8F_2ZLdJT9|j8@s;#PiH}UtX*||&jp2FN{jqhAO7(BzsKu0zs8$4zeZwOE5>>X zP~re0lygf;Q3fD1m_S=>yzC346z5Iwa0~cQi)iWIOgG>u)E6>Z=S5cMBA9{eB6a^7 z>mmm&7c794F4x*Os9kLBtQnk8t{wSv1c>i;ci8Rj@ap9ooK6S4d-o?CkB7$CEyrHA ze_j}a^O$;$E_3ZX5;&iZnHg}i-Q)G$m$-TPhJLR0xLOCO13wlv0bl_NPve)TdF484 zPO}M=si5n2q%(UX7JCs?7>k`w<=k64uO}JR@3}8UALgJ!&Vb(vhO70D1?zCyzpJ*T z^t~Cd#m90ge#vB3oJZ2%b-R2F?vW+1aL%ysNc{kITVS{C0C?>7uW>rk+z;sS{_VS1 z-!e6@Qo8UT^J|jB8KHx-#5(umPahzqLO*DnfBX?&e@DSKN+RpC3np^*d=~m2XpC*P z^h`F}8TdC5dJi8TM(p=@*(Q*RGp-0QPbC2Zi))>L>h_pMz#2s$D`jD(5w|x301K(w zSqJ9x^fc=5-k{{U}vd2@;}9M zlw~Q4LjZh;tbn}!7|0$NS&Gs`$dJHn0HFIGQffFKavM?re9#@NpKa$#xBP4xlQG$M zs&yY(`V9Qx0M!$Tgb;IvC?K)}YK_TRNKob<9m>T;#%mM#LkJ#9Q+?rNU=5{y?Yfx= zLn_LIBLomY>}&RHbE8!v4H1Z-O6t?uaJ_KOG6rYS^+UE(y5Jy$fKZ$KtX;|mB;wxT zsG~{=K#1tai+YIwq;xsk7bXKppxdPNF~9}~*=@+D;SB75Au0hj&IL+Bkod?cVDr3&teA#Jqq{+Qp7vlG=H z+b4AoA;_lUAQ7yEOygOAd_4jfh8@f_!F)VID+v|-i_05hyrp=d4Mp>&PFf zBu=L>`x5)etUZz|9Tyou3&!Xdm(M`{XtKc=T{i;QohGWRe30 zte~Zk5@!eQw^EIhnUKZ(oQ>HI!XycCb+x#qD ze#W83GCo?Knt}8=xEHNN_Lt`MEc&~=54qB7>K5t#KqE&fjpR2gGCHRBEk*R}KBN85 z>FjgvY1Z>>!^moRa<w^xEqD-?(Wj%fSHOvL$|c0Jf}Pxh4;C} z!?pDX0Dt&lW&-)cPxSfi{YRL|*Ad)TXKmpkyyM?bl$UBC$L;t_csLW+uzV3a~LRH9sq218ZOXsay*{1Vj?9etnrM2 zF+Nfy6;yYN(=v;(H| z2s4fd0qC{^AR~3Z3kV6&9Rz~4@ZMy_U+X@P47#2aNN*jSClH$Mdmu;x78(bbBXmE| zArLkza9Kfi9-}$KJ4$~&D}Mz3n4N__-z%kzDRPP7&I*?mWg&_3K0Q|-G#$dn7`?^k znezb7@DTu-zZVjS?2LehKaAN}62g>?3DiCVKxSt+wQp`~N|PG`$p`>o$Jkc^?_D z0xHK;*^%*;8&@DiW}F3(qs$Z=gF;)G%vAqv)M@sXmHoNj! z)`dG|E-|G&SH_wHuqC4b*vKqN^>r)8Uhe~(1x8~52#n_w`b}hMMGq)ipU1PEfwLUw zSTO;3=NEuKfDDjAk&J#A&}#<*$nA4m3a3m4fz6KE;(OMIRLhw%1Csm#^ zwq$3((lB2*Y1f>~^}53ykoG)3zX+BBfG{0P2AU{);S{bN3{^Ww965ZG(`Ahz?HUJm z%Yffvow?+|22e7S70-U@46K2{2{_uimfBOL#H$^X+(}{2i#0QW)Yh0Ay$^W%_Im{H z@%F<{%WGE3<3NpTz#}a{$W_vt_q}@c4c@%|X4Vtp`%;^@X0AE2QjzTxU+Fi#KDcQD zIPe@O0cBCfBE?&)4Q#B}&S$ANkN`2-CUAQTNSoS!0W81f;I18%t+8IO-wOvc`)%Ri z1|WBL%V)Y$ckvur_2*~9oQ(6AkIQI0hef(ERBZwP&lnF^#!^cUYJm+3rXXE0>Nc+9 z;O*8sPLAdpFwm;2UR${g5!+Hbo6}i9_uGQ)XuoQtks7rwDOYCQBGRpeP zwzXt@x()qu{Yl2pKmP$C_zV&+QlQ}lRh-a)vQgUy1o7fkJ@4kD1<0&y; z(S0A@w^_c88E3}%&;h~#!az!u?eN|^oKFsr1Ah4am-tK+yrpOG^>^RFxsP~cyBO(ScFCsFrE#w9n8fU2j6g|N+lr`W72m7Xpm}y!ztMh1eB)K ztJ_;Thxgho?P!fY%t1XI)EUS0l!6r7W2Zjn&W&Wco0NcG*9$}l(QbcvQ*HJopGO+Z z*?xr)eGL$YMzCS)?49?E>TFGooUh}-N|FUAw)WM<`F>un5_v!!*vj?ff|Zxsh8lGj z?W@7>sjW;;4)HfGLonSruR$x!?)ze^^NrzDV` z5Xe3w0>`<6+=4O#N%)}Rn3b7LbYiKEg`ME<3Dm6nK7*Z|Gw4)DshA<6@6^mk5rIt5 zB1OkC26aT%CCHXXsd6Q}`I!B6QtQZUXfnx)R2p#92k%@4XbO%kav}RioDn(I?|D1} zf}V9h>;N&qdqe(o07?-VOHttyG6X>AExb1ruq@)9Yb}i}Z!&;T4?6^# zQX?CjCkrJdWY@vE*!S}}rZ?_l`eKsp(ZQZwCI}JEW`Yo9Wqfx6W-{nwDrW@1o+HDV zn=ly}Kl2zW_g&hr%07z+VAIeMlvk^m)P#tG)(gl_2RJH!0@cHTEq#vq%_ z{IRXm7}M2DMPS(YTe`kez%<6pEqxCk=4IO%gYkTV?gj!9su^tOtcid-V#RY2{5Oqb z9tOJW0XLBkcQTZ{h=7}24`(dGn*ir0^!u9#7M$=9L3-9% zoX;L+A~_NPlbQD$DJ1&MoGN+51QP%m1cuEGYyg4;e)&M-I1!#mDbe==FJ66(7cWP6 z2y6#MZWN{9CIcS={OLU&-hG5t8@7G~*mrZ#bAR_Lev9JY^jCUEGJ-&}ZJj-%bR%ac zTxI@S*=|E}*0NG(9aNh=;A{b;l*PVQ>JTDe&iF-*S_Oo8KLZ~_;Moj;DFunIsR}EV zCLTl~HO}J$tq~rOAs~2<(VTz)+}^#0na%_n4<1VDn0lMWaVKS7!+_d^Gs~FF5vuFq zy`!-Z0?y+Bx3{kW0A?EVIxmGJ_Ck?-+5nO9eBN^YV6l0jF+Zd~53Xm<6~~{>m4>EA zF8kybKh-?{*!_>$@G3yyqt&kf2J_6SAM2%ZytgRMQO~qUJ>{AG5C7x;{wx`n^n?nOVL#U@Dh;b z)#4|rk{ZT03ZNKL_t(XWnYKTZYO4T<_r@gR6Ia)Q?3B=_Z-mX zBLhrQKvg#^0B=I+9GU0M5q>(60uUG4kTOMr^ey5d?NaR5;OlR#|00DPz^#aq1v zMJu>;2)WGC7pgwOyXDk+?5xTo0vNa{#MHbF$TYU}gTVfVHvZeYTS!Turn|cv2&Hg) zdjk^{n&a^t4}<}Ie*^Cw4x@mO62}jKKmvkpBJdRm^gr+=)>;D#0;fu;ARy2W5&Y-J z9BJ_K7@lr}+xoN`xcV%c-!F&^YBbWe({0BwR=Ntl>Q+6zE*JyA;wIzrQJszL+D=fRdpG zU5_aNW>4n~-jKyXS^`4Cd!jWDfzrzA?GQo6I;ZT`U5{yW00ONCf+*U}=nw+6ooKrO z?@U%y0|Y`)@Xlg1V^);a(9`==nyAGCAiF-+7gN3pitsU$12N7~v<(0jX`|wrq2Q+} z$`!C?r1>6b{@RqbLU$2uE2(`-!%YO_Bv4{x+ndJxtT_NJILy@b@Gjidg_nz05l545bSY3PH^2ay{aqR4RzR%kM>s7(IkJswc6V z(qoEa#o7EhfDR*c80}_OQ~+?qDw%b92$doV9YyV#Wwdh3 zNwZ>TtQmBG`I)b!&Pohc3!~*{l2NlTtjVyW#b{i-ZwG5rlyDa#@O4hzn+l~rS-!gj z_TwNxsU*hJM-06JB(U3Upfnjr06_JT-KCBX;?C6;;H|pucsMVZ{gQq&nc0z|dtK1@ z=eBcpXE~>J7n1aq;7@S&h|Ole&D~3cV9(XTVcrB&V^^9Rm)}PGpy4Z~zmR!N*?B8YRp5UOSO_`wOSZ3b3hWG~@UEIc3z0 z3w2tsri`jy%bki1#|me5OKa>;zkCk>c>DHy{CUdqG_*WQUp`o^154)nUcLGTyWK7J z+X&>9k-3(Y07lD+pJcGH zmsxtQk->uw8X&th8IPv(Vlo%bKmby23cx{=*@xG|zi+jZwQpWqo*|MeX{&sGQ z^8lNl;)3BIIG>$s{JtXfaAF3MGh1`03_qVk#_4pAU*7$&vbJ&SP*MA;+;m?J8p?NG zX}&C3^Zpz%!j+)$Pqj8*svAZ9zx?t?gy8Y!^*80EY~5LaFVJ33uSvbVCWEV@%{_<9 z$k$buq_r`hDK;fQO3rOtWk=%mH9*&&RfgwlIR{Ob{m(Me85HHZT7bA4?nQ1(1sLZu$!LLP>QvbP?LQu*pYeCi!Krz?tewHx_choz?OpDC zoX;jq|8Jh1FUVK~>@XQ?skxg#KQ4o}fsg;jxx27CHRi}}U)HBsi~KrDgBdwl)vw{)$p0LdBj$pDxu0jk*^p@D7# z-0U?V1*{2xcX<1b0v?CWi$xm&6oG;%sIUkqRME!Z1!TWN#Bg976_gA(9zNpkb{qR8 zo9veL`y#;>A=_i+>iWpXb^4Aofr~C8N$k=_B?8l5JP|GkFN!tBI}7M?-qpaq<(@V( zd}fz84|cBf-_-s~GUmrKGvd`LyLnLUC8qHiJX_k>=JuChztrY68*N>R^Z9gazUw0J z>A5nzDVP~+8Eb1r&77W7sV{6>B3{pe#A6+NJcUDapy0gCpga*Mjj=Zq z0l|>SDk8(68W0@$Ph9e;T9-2t2>_!{eiT%UgpuOo;Q-NTU>q|kMR3tJ3IU-91ZyD# z;Gkir*gwnWw<8}sjER0X07Ah|9uR;zALv;NKz9S286gFrIs&sv-OZ^z?S#|#F}`b= z)hZDbMD(3YU}oT&#!S-Utbu^QX1`BejDSRP5Q>zPSOA9)A0nwqN=qytm4I+I|DEph z<{SZ<0bwGB!T#n3a&#HMm}N{3i5bvN4(IVm>4W2Ul)^Z*Ls0vok1EOVW`Ym_!~Pb+ z`S?7k{eCHW!CJV;2&fdv>9#j8cFbea+4O9e`jLW+&n?Yw33DFVen$JgnIX`RzU4|ocEN`6b{C?&Cw65E%rU{lIs z5n#rN*gGRzA&h}H{$ zxNc^6G=}+`877ajK-PGUfRNMv+VK>zF+jJwDYFz01L;Ldpo-EoCIh&Uu6jgjCNh=MQNNgw^AGD*1f=WGVGa zzrqf3;gW#MNn=`Oo_-rqiPY6T(?eG)+ z0k>s!VVrGSDmodghfrc>6H^jCFhg7bRIgyq7P?okhUkM40;HC?j-U(@`a$+FGA9|@ zT)=SC!@fUb*moFD7Sam@8=yM{0SW0Ggcg8}8&a=gDoPIsf$?PMS|Q+#N4M3$R>RwX z>Bx-P0ni%_7wx*PIv6GcYmRbo8acAV&WO*Xzz8V|7Cr#*es;1-sWOWfA5k^K9}NQ= z<(TGm8Az9-*?jSPn}Lr1?xT}uDd#U$YGZXOh0_^m9@sC|TfMiGR!+(eLfBO6;u)DL zjU6v}kxa%de#pIY>LsSWo4Y&c2*BFiY$J=`9>$QA!^3e#{X=2^Fq!~ZfpHvj6eFcE zrcKV;1bCG|2=RAPPNG>KU8mC-24OnovAVwz5D3_8=L3$^#6%|0L+TyUp&@u$6zEVv zbq8k=yeS+9-g^d?lW;yjB0y+luv3l_(m+sYeK61+9dcZx=_Zh%L5OWgtF-qXI?E7w zZgr9rBX4bFyaVlSaSuPA={*z6ARX$Z>Hrr(VJziB%~0m8CxyFI!kR8lOtX|3R65{j8$}~p!FtXp~gKY=`(He%(OQ*Hh}?&&Ocrk0v*_+3{rLjAk?g2FwkDAKg9n9 z=VzcEFdG*HQx{p=0%PaPRNLMn)P~j-u$+_vMdaj~;Wjmg8CRAG#tc#CK;Js zh&x%ZbaWJkv()b-mosr$({QjvK+0n>Y7o!`8Ll!~)iUbun=&M4%4EQqB(tojbgZu! z<^Od2`{K5P{}KP;BSowK)$U)F?U@|VOMJ0?3BX}HY_Y|52A&7t{drb8|AxzJ8GU2f z4&+eCj8PTC-YRohRiBian0OW`y{d7_fl0-6>#3lVoNHv{?;A4iKb{FR4dDJhju*{< zC-#s(Zf3W|b{dn}vF zi+(Vj<1ZxxzygrpT0gxt*bY1V=2!m$00HWLdHW+y$2RlX%0RjQA6P)9~@5lfM zg%Hx1)wB9wCrGKIe>DBRg-OhS!IS?`00gmefN>dw=G_F{Qz~GA=zkOelBEp~DHXLM zz@-4K2}##Djs(IBj(iLv-s$X=-L$IjAt4YZdQMVl0vL*f8zk01^1;Ttgn-an2m#zb zoU&iC>jsvVSRlBGvN8!u)jTG4K&64v<@+RPE)&5?VnY-Vn$in@yeBf1)aJe)Ao_s- z(RP9zDa%>6=^=u|I9e#JF&<73A(6L`?~Bq6>ns}pyq#d|2y-6MZ3fDQrF#H+rVFH* z03Y{}X$ ze)mU%;2aJoi@UoQKnQSN66ptMd{}2A0TInrYYCipbNdnqz~*j8ev`OfH~f9;m3e~JabUlxY@oUd$?_(QI$9pKIAJzDhVm_k; zd!;AC@9Fe>25I4AT%~V>0LVv}i))M#q=x+L0Khh}*JEW3eAmLE)!@x5n)H;fuc+=a z@b5YGmgAxE`%@}=X2&!D{JZUci)e1X3IzCCpFi0Q<<*4HzsGno7;rLzS%;3p|ILeD9G z(>Yv}2T}k9Dmi!$8)-yE2A!3Z^H~l91t#{Yw7$ve;43R@S`GF~|IVp>Ie>{8ul3T9 zw^md)pzFH@c(HCfFLSir`Ze|UYS_VxDM!w%m8(#}Zh2Lj6Hi%QLt<%6&$U%&HQ9DI zWKh`O?6V_tyW2oWh5eo!@InxJH50Lo25M)bJ~rnGs_WpgtTS{s01;s5 ztpS9FP{izJCP$Gyvdf zQHibeEu3Mg=}@kmXaEY(LlJo^mrM+ELmKIu8ZuIwxv^vs-J9gBIIWv~sg1D7xXTP~ zIelTpfRe#jE$1drnOhs8(=`mJ*D}7R`|5On#r+(hv*J8eQAR1Jd4>*q&)9DD=b#Rl<={0~YWKU1* z#p}EIu^Cq|`uR%V(EYYZ^P9@BiNI#>aQAYzY!}GE>81%n&wcfFPTiQnrTkqb)<;Q> zg6TA2v){vcf%k9U<+`UB)X;AR=)MK0Q#tUVV=M?Q{q4nz*Vyd$Pzum0H2Tsr$8*`2 zOY2I@puOg3O7GE5r^gw&u5{S0$w|PHi*nYSRFBDtGA^d*X@Rcz?aYDH1QDfb)?_>a z;No)9oGci|F3EVLFP!awJ6eB!`y&A0?azOFA`?xzxP1~X9or&)SEpY5oHBsdufGET zO4$e$b2^vW0m>Z5ocSz|-G-xM;m~b49P2Zs?y`)$cDBYYlT&N=-kP?Y4BX3n75%l!Jmom>Ik2@90pE z_XTUv?e2i6+tp+9Vw!5+S2i}AjzlSnRL^{#`Kqp_94-TB&g~>4wYy-4te$yG1{w0% ze$1V&=~@ots~n$opIc7oH5NAsi|zgnc=yAzSi&9y_g#}_v@UC)!cR}dTgqtF`8j1I zInR-iL4a?5UGClSJ=bhx1-lR*+uk!Pe5Y#dopR){hHpzWi zIXm(5>6-r41bjCb-`487hLx}-hs#L6uhmrpJNEk**zaH9c>IW;fB6$mM*`=r18sR} z={uDx=aa{GXwu zSWBh5#%e{^mU0$gPiD99l?npvo)*tIYl)4Y~I?!S_ zoC5|JSg{IJszK~6u>acnk>u2R<*<=}oZsv5G?Hmb1blqI41UXLGtHR&9O=7pVr>Z| zXB;O4e}eZ8=QH5kNA!_3|Eq7mrnV-V$C?h_`o7YKx6vfA-Q4EqG#Q8KG$8~9)emrv z#zDaX7>iEXTB6;8+bn{oKx_gM?D23&x=If<1&rq-Zf?mQuo=oZmly!+bkS+PNZsK- zKKvg5fWNu>uNT1+Pb%6k>?-M8zR+8l&P(6V=gRbVym79K&);Oz;%mv;y3Wo-E#POX zG|wJa$e>PNA){JLE`r%>xz%}Yk;?ZmyCmO-`85}0(9cZHH8NWDtl6{E+Li#C(k?;F z)jUkW5&WH|@fUoZ2_-E2fkF`pgSRGwn=+;(wN)wdwS+JOWW+2Z7z3M9ai&y(*33TE zL^7Z{0#)e_Hbf*-1jPxV0Nud^AeaO&x7o$#-Gl@H(tQsX?TOxd2sj8SoRM3NEtpDb>Td34nu4b=j2L4RF&K=c9m>iq1EphmRyEFcW2r17?;% z>NJsqOfwsv8_8!!*#KwXpBq!azsxCwgEJ7;03yu3RGol!5`yLX^^9RqD~S;On<5cG zSPK(_5WI=Zt@}L@&D_{pH( z@2L&mU_6{7Bcz6Ol$zL`Pq}YG02nPxu}y4&0+E1a*uezATMJ=Ecpoy+#%6buGib?9 z!`KPNp3!Y)MZ=qhJ)zSu&O`M(I6Fb@Zt@iI2=H-F4G58JB%m8MkecS7nWoJ62ZYEP zXtRwV0j2_I@6i#=8^X+1=lqqmm;uIm zv!`p)`jytE(6&e|w2mf}PRg<@S%vc^`jj$LLM}_V0lXVwPP9>&vxCwy zQ~m+~WJG5hht00Tu+?xjz}cA6OnRK}N9aLAX$943*lEIah=)HVVQi$TMO4lMF_zi0 zB?LULqgT+Ij=(3zXT?A&Nwl`{ZRlQMI=k%5ky2tBsSc?noD0~!*kC+N2sYNEh*3}o z0cU+H$=+YM{Fzn-RtPkh4mR4u}%jOfkrYZYI)96zW0Q#+U2N_nT~({9&61c9z6M7t1R z2boO<`AHd<5+_N)W-FWvAp_BLH`C@zsVRa6q*N*enA0IDV*)BhyaZ=rL`i_!-oQu2 zHYtp$4L-L;()*3k1XAe?WD^n?Bg2dC`plx1>N3{HgHsPX9bp;!CgO8~py(^1$UuWA zBM3=~VBF*%?(gA2=~B~KK`0&5@&bSY`KAKg`2-J&_zciEAI^|MAwWZ@4$cu6&BnB^ zQc8#jjPNcgtTU^mkeUE=Ax3OC4-aa$#|Wi5cso)1goGD8yrX2;@E+E>s8~+fk(R-} ziS<(G44eiO;6iMNgmV*=q9~IDm=uZtg)RWb7)HmQfFnCL_bm{jaV#r^>7YDscg_)Y zJ@r`vQqf^GG41()kk}Tjff{x+rqcLy^Pyg;4lYq-$3Z3HI067`Og^9|MV4>mtHzMZ zK*84~A?L^|GEzn(XLhzB-`jF3CPys4CL3~6zqqls(G~zq?ovie4m<-G$VTMtTAyo& zVC77rTQ>0^gX~aBM&p9XfYnzs+FXpjjimJ950fbr_(VcOH z;V*s1$67bchfv)MICla(Fbo=9pZc+H8bg~-s5Iv)rz|(ZCT72zyD#7z@YDA{qTf(E zPUC%iW^Ij@r#a%0c?61|%XB_K35U&ggPXfA(02?lN)2intusqr&8%@LTD$Q(2RJSO z*var7!9{ufSTO>x$tggT4LQYlUz@X+G|@y*m6ie-PwJej90I| z!JF6LG&Z(qHE~8}qN;Gm8B@wxLdw z<$aigg;v_%OaaBNE5P@>9b9(B08z_nG5PX-7P=CDrkoir%2|_Pjvosq3JwHWW4K#m zjs%t<2&p@`^N|4?7;{bo^tUGGr(eE*Qrhk7z$nY|o8SD)SwG$^fpIxVV>&*`NeiH4 zD53Y-PU`~h?z+I~>QxKPREm}~FM{z~!;MQ-K<*WhB zKerrS-oE`Fr_(+D>es(r*MGqF`IerAS;wZ&RfA*${N0d|tp~x!1;8*KQU&&FJFC!L3ay=*(O63=C!+}_qNvk zRtj3q6lSN>ypLZ3$MQNWIaxm_Sh{$MSX+$uYvdF%u8{*QuFra2vMsgFW~j#X3IMhl z*p)=J*vabt)xRYY(GyUoj_qcaBi_*1K90vu-k*#Hv-u= z9AHO>AR1|v9cAOGQw8$`c*1d8kHE0KL&A0#3;5}P1ICnT8Sr+wem360KYsi>AOL^8 z|5xie)DsKWmjS@ps6+LAQ&*omX3J;F&R?A6e@#EGf!eD9A=Jpa(S;0NUz6Q0%Wue7 zlXFF1nsVy%6qvrsY*H<|L$(Lh&-;q=U{eknXRa)#QTK(jZBxctTfEJHRx|+ElD7}l z{@0xcG*GIAu4Py-`JDAOV zcYaQ*3`=0fU@fH&&%Q*m-CASjzeDWeG-W?ir#b{dKBAPiSSp=KDYE}Jk#zt$rKbRp z*j9rJ5$Grp#&f< zAf~51rF~KWFb+NhC@C?WO8=|us`IqGrNwmX<{f-%Gf zsie%zhu)akUmnwOr;K(X0OP|0fysIrXIl5LWXf7J^4@wlu=wKATtnDvHd56 zu*itlDvB{K`rvbF?f6CeCMo9B=gtw9rMO_7ChKsT16!U|>Ly*VXJkgm&kX#dPi^qu zr8?csI#%uxvc^v?&p8#BD=Bg51B?yu{K2Ds*;cqu0b|DN)+t6ss34yu!w z&KBMg6QDH?+nWL7(ZEEoj8p-f*Eio7FUT$XAK_PMcaE8(n zswc)k*pOKV`%Q=Gymanm_P@q=0fb7fOW+@_1hKVK_0F{G360-pC)qit2A#71o zuYb-WrAClFe5fdCfnwI=MJqiczKGT7n%QS=sIuoW;x7b`-OU#JTS`@zDE@bQGMWs- z7T!A?4=GY38E7_ffu}Znd`|%gMedbc_n1Aph=k&T>&3FVxS3THp#fru|Cpg`XF@|L4HI} z?ac%TKuKDM=;9C~aEPv&Gf&D$kM6xEK>UvBu?VykyMQky)JyP_DNpJKqB0=|n3$P|Bg@G{?QlBP646Dv0z~lf# zMHBHb61=6!=zUajWHj_eML~6d^KfoXl`P`HB?MC9tsNtiorOVw><0i8Nk#`TomuR> zGx-pz)EsFlS$f=Jjt9_u3pT%bO63qBbpi|_gDdaWy>Rc8aniX0}dCFdd&VeW4wr)6BKj4{C)GQdQG-=!$mro)H>9ahSd zMabsFB;!}Rtu=E1Z_`ud1TXO6Egf`E=Lvm($K;B+A3(w8 zSM)srsinvuX&x-0bVqEveuOjk=(jyK+mt491?;gh_BlfqfCZb>@%{m)(}#y0^n!$es5bx61TQRAI$68s~VAP7Ep0`Pv#g9Dw{BIfdc9A!jk(*ZRpm*T(Py5ZSti_giXc-C*FV?kU(& zDmkt7WFZH5lAO#|gV{ONERA)uWD8-mu;1Siiw#if8f)*r^~^BOtu=5#?L2%m?ea6_)L`!xP`By0Ol^eCYqjpTO$OcC znOC%h?envo4jGin+Y+5CnvK^-<;*``FDL$9%gGG2l^(Fh9+l=SrG~9Q0KSoencrVK zGShDjIXNiinR0%9`y+}sLGJttr`B1LeD{|J#DuAPs^J%38f?L-4eCDyo z+gHneo~+AqJ`cdWl=B#nR)ol;_J`l$*Wdk%^)%2xb8X;G>KdfY$9i^N11K1bK2=V| z(psOFT2A^xUVUatYj7pMr3)2|Yz;YiUHnVPsh(Y7f4BhN0D%4e2K)VQ0mSsczx)xW z(*f7ai*=o-eeb1I-cOg)zVCE8;Gh2aci3et_OD1M&}irnegE~1=aW4mvAO!S7E?R z1_-Pf1i5{k>>vsv*&2+*hmQi@k?&#~<$iDe?V@e7fbtzHrSNJ)`kv?lf)V&)`w~DT z_lV83&O@_jpR+}I7Kq!@cUEl1t@PLRb-@xaN^N#nOY02T0Eb^8hwr6H4lc2fS7Z4( zax$=u%h7d~iRE)(9S2a^4dQo2khx#UI@1F2{yF5d0*5Hlb!&u={pR4<50(>V*RiOteE z11U9)?EsiaNaBqlCcuE~=cUxdIuEx@Vxu&GKynoMYMqy7{o9 zcJ?}8f3u0Vr17puP7pAT#_aJp!Auj5#|d|LFX5cSWC{Nh$Vr^fB|iGE0U##1!*+WI z2npZqV1v)#C@Cb=;4|P=z~XrS4!v?vdH~=cLC@!W|6>L+S{HC050H}D?%cdqxFb*jUJ3j#rCqy=q%^AgrOJjB2zEfuoVsi1YCtQY!3j zUcgNzXYUhTS-)|H7yyO9bUHu?f$i=F&RQa(3PcXINYNVzENILKgn-@63)nbzg9l6` z5lF#)9Ng#JobEkk3ROzMIX7Py02`S~(_Gl!BqqsoUh{;Q0f0hE{PRyA@tbdMSUWEm z3O><On}1(nTL(6gQ=e2kyH3yWF3TvsUrgc zQ>1|I6}%0ZbAS_W*OCht;BLJZ5W13n;Yl@f`Ry)o#(lRQvl+M@A z069N{3RE{R;iM?Vy8$^ssM3k<9Vm(=fx~2nl(r#w1LwmG+5=!Gq7zqLj}R2NqEAsA z9jpmiQ486Cp&}b!Vx*%;9S;e33p=Kixtf$)Hz7<8TGQIcJC)7`lk@YtiK!Imd3XR0 zdf3H7uY~iCQVY9@qPm2h+4qEr^MazR67_aE6iMp{peW||@0n5|haCa?{2ayQ+%!iR zW>!EEm03k5uRz9!G*1#{Q0Q)6j=araKE+bj1m*|;K+ZU3tP_nW-jL|!YX?=7LpL{= z?pBprYFaGxcoVQBVt26LwGSJMv1_B0u#9x?c4 zwx3FVGs-nS`vvaC-hdfdi!)FrGf5)0Tj8orDrDjYu?5*UrJ})s7_UsOJptR2YQDyd%?UX-`sZC z-@brSfD{Sb-Cz*oeXwSEI;r})#_W~9L!46$@Xc%l4e(e=W60XG`Zt)tw5o%rC(h&R zQiOckx3I!YQ?)HQ>`2bEVE0P>Z>{au%Hd8yE+<&C=x?hK+we*%YbppqwCPgTiB=y{CdHo}0QcftN%G41f`X8JLwr1mKI;-#|)@ zH*bE8I)%}K`4E`*j7$1W1vp4R1F1Kqo|3EVnsZ=HPPrymdRSu|WCu|V!iaj3?6+l` z8gc-@Ut)w=`#!cQ$)T@Gr`xmS)bA!cT1&9zB4DK0tIKEp^N;_8^Z9|!6`&IakgPT_ z#Yhw@avVD=!Dr(qf}hX2$>@iWZ7lgW$U+XHtf$BUlHn^cKSZVn`UB_l@lo&}FwZYK zB0mPQA}~I`=J4?yj*$hvm7axy$=aX161RhowK&vJx-^?)$ES{e*kR% zrQ|%9@$#|qn4I+abUNUVfBXmh`mg@;{2OQYqYv#dTCb7CevVzs>qA*KeB)!0BFg zo=gl*8Hm#NWymeL?{io#52pi;#{=H| z@;x^DTYUNY+ZY zut^Hg;>?@r-qrNVm+TV^jQ%V+y#6cfAXL{pSNItOK;HWnx@>wU`I%JbxmZNKMo5kA zPUm)f^%b!Ms%{$t@94ZD*7K+7uZbo3 z(}bYD8+!#=MDvUiv)cf8d;EZx>IUMfs+Q|?!Jf~bSGE3n9~QQaVvqB74m7RhTxp-+ zY}G{&+;iomJ)^PauLYUUbEje)WHO3#P-A|s*-Mh#JZ4xQ7IW(}%Sruc%DE8C!q=%} zx5s9;YA50MdTXvr!OYrH0=b_l=R#1?)pAzmf-|SQ=86ciZl-&7t$EAlPs-NB<%9^W z_7)HVW|}f6QFY0eWahM?0D*I&oif{mqKz|n2WKrYbVY!oP&$)kB{1PMMaDWQbNbT+ z1k03ek<~0z>zq&>oIL|6vl##g0T=5`EQEjuBJs++M$%dz02piFz|XG$ypLzLm@RHP z=M=!{|HhtU<~TDm5hkEx_StGcQR-!549KGz(IA3+o>Fyy2r*;g>>o*_Gt-IE{3cSB ze!I^MXDMr!QW8>abH67$#-=(52q>*7U2V4CMfSoofxEiChj13wn8pn{vPi+iO^ znRjG|&;e5-kcrP+Ng{NbO9Z%E4`U~Ey3e1f9sz{_0ZR9b0Q~Uo1BRO&?tOrnJm3Z1 zolaTx^pnr}X$XMcDx81$h!@|!0wyBc@&Km$k-&}t=!ZZ=QULl+0dB&FKmG|XzPJO< z^Ez{<4U!-q!FWOlD7J4+)2x>e_NBw!?G^|lym!!o>={$^<=V;M6lGg$Ap($?DgnUT zIe2Ni-4$t&DKLo2W^;#=2QUHW(-FWHQmIUYWbK4OOZf1R!Jhja{YJJJheQBF&t63k z9T39odkG@$@j?N?744x0NBfoN;6)EJ&O}sN2;@mF(_I20%>C$J5YSY~fNrZ1q7v#7 zkq`tKB)xUWQnB@A}`#kqY-IFM{Ixbka3AI&`rcBB_XmOP<1l14gy#(^6hSi zqAfyzmJw>2v%Xb4}e$Dayv&lS%qFlW-r4OxAe0$Mc(nt&uB)aT1LD4IKAfj zh;0pM&kW$!GGkqXw)DBhSLtuL9G*k7l`{L9B0_afqXOq>6G_9{Rn9GU=FhkT#{{S9 zl-@!>z^3TF7*(dD5k<)jeDDyg0hG#;-dVrhKuQIrkkeCB2kQR#JU+d7fa(WG0K09Z zIqr16CsR!OAuC#Xh)fKO0ZzvdLN3Z><#Kj-sBQ}(0B257>5LA^V6!twfYzs^lm?TO zta($EQF(+wj&cY-zy+e>RuMGeBFHcqFoxX&0Og|kG(XETjICalHkO%W|%X zs9yow)Q&EpyYleNjPpgxt#oj$4Y$eYwgNWEfVCC~FZ~`JAdktR4@)^k8cI2*uFLl` z<7;66sGl3}lRYmTJV187LG7{WZu7lw-~BTH zKy6x@{<>$f3GC$W3Babm#YVHhkGe0FgK(L?BwkyCR9envZYX4O0yOSF9wCIpc{=9( z-8+HcH8>HhY8d9aZdkCzs>lvo-(#i+484Z%65IV2N(1}tZefT^{iKw{l`|$i8_eqj zPiqa35$JILfZG?Z;2iMb{X^VqCB~0*09M@qo`MLN!S+-)X+!or7Hoci&1?h!rN`N9 z2Hd`Q1+9|ND_TdSMl!0b_9@L*%dNWrvzsH8GHBdMZ*G=Ep zU)JQrJ^{en_ml$bmtX!^Ue^FIw90cq6`uyi2#q>sUGMc5UjtI%%P+q}a&+eO%PS5J z0L6X{u>FBw%YH9z^#Oi5EgYTcUY=Txs+qy7wH)qzS}+~g`b0`wT#O%<#x8T{jQz23+5W`umG(!wd1>RXtA+*iLI)o7nTouUb`={6SC{xzWpA*y!)X5Lp&8& z^ydH&{il#ugR8D(je7gxr>pA!l=lD2FQbvHF}?tDL^{NEH3cCobehBxUNKoV&PB~& zpjc00@aEq=maeTSD_*x?i%O1Yw*OrUu;Kbi%fT*$Lh_=e_gWi&TkquQDSeUU6yH1o z^t+tmm+EVc&Fg{Ttv1$R*Cnv&)92ePr~Z!1IUW!A`+xs$@SDH>FR=u@hL%gO!1q8+XD$4OSbM?c2aRn+Nibc6>$D(rSIaXOwsp0^#|zkQdT;@&$* zsj$f8#Qr`r5KRu)i)VWw2aFT&;}7qto|w+|>+ik;0H`8udMP5Gg;`&kK{NoiQ9s!3 zX6O8Lau`R8(YOp`OsRkaI~yb$NzR5OC6rd#u9EF57u-|t-i^4u8P+cVAk=c-Pvyn# z3jl!TtcCpClY;fwTxq@gr=(p@Kt3)f*|`?MLDl|Iug^eZFO4>f7NC1ID+yoc(%fY4 zJ)Ozc>>XJyleK0`S=?KVujanJVux9rwV2$r7uU~q4bmh#iz#uD4XAaUx8=UU>u;^Cpml_UHC-ZS zks8sVwzw{MOFrH6vB(rsJmdR72^3`Xn^0n_!Kl z?1lg&>z_~>a1K&woX>{R{bpu2z(=s2?q)x8^804cqtf|VpT~*r^PV!B0Wjl;07rhO z=qL0n6PSn~csQH=;0X*Uw1z#65TI;zo*oHClUUONgaH0O_THsQlH|M=JN}4>jLdp; zcXdzC3>pLA0t0{|2$C{hiIUlsNv6fU)J7&VJ$}^HpOKjsTFA7~N@mi6ln9ChNRZ%Q zrU%{CkE+Vdc=+Qk{1NUR9+8<l}DFG{qH0~`hlW6`s+ zn-MKYj@5yJ9OLMf^6_RR1wi5ILGgQ5Ze!*{Gw&zo%zT@bulHz-e* zxRwf{SJA zfN+lO){Hk7kDo$HiABBiZE_9L8mQ`EE#&ZatcFw)i<6}v--V){A+IbQ+i(Z1B&woB zQJDM63uek5N=4snK$*p4aMLC!dh@qNFmBYIAO{%c9C5vUCrFP#S`aGbD-esXn)80D z001BWNkl0f5n={L8nE2Lrye$NrH~XsPg{ z&z|ArB#7ggQnL3VpYn6EIq={A|0{|g|LFlH_Nm4D0RFjj06X9uI512OC>Z9Sjwl28 ztH1dt|91!iyeoBK-$~D|$2bGA%z8PNK4!sm06YLsDK%pIW19H@n?Pj0j=FC-t_&bw z4%H=?s=#Ok2;hX5hK^GLi|Pbjw?!{HBeN<2tqkpHfdWz~D2K*Qb~O}*LpG1^qo$o9 zCQ~I~7e{q{YA9v(0G`oG*%#VLrWqabUUU#$i`D4^6h(=qX+ZgY^17)`dAKt^0zugi zTw@X54m>AT+7$7BtFcUn+OJi4xL>`cUP_uhQbUna12(Qe}k1l?0G+5yi z#v!GKR>DdQ56^%|?I)$G@1bEP*IEP8?uO~M9Vn{|3!PFBNiZes-$YYCc~wez(5#`= zwbH|cLo^L&5lBL!2ML|RQUIht8??(&^GYQQFi-T6^FvuGW&c|ZZL!seb}#wP#LQ$? zxblc~4);AE6$p(N+d%AenHuYKuxJ7uCh}3>GUpt&_rQIxLdV1i(1m!>7aR<3#B}h~ z*$gGBLUyRo**CSDJz5AmXXlK4=YScpPz5_EM^5#LMQ$X^lh_(bt*Bu4vID3Dz^A!D zpK&O0?;M^D^o8{Z0t!w>Og5X5t&nZR$qUTM4`&%xvJ3pq-;12HA_d*KHUkKDZ%+iM z5@!_Q#n3+&(;$|xtkBlf?&;K)m&>q|F}7GvJ7R)sM{+__wvv>Br>127-1kZMwqHvL zMP``7l9UGFubQhd*uvS(fE!%hCS`bn{MntpVE}B$H=}D6+SWYlSi;xtG9#szvH`-m zmyZ4q&!^x&Z>zgPy)YlV(+4NEDr4#C97~P|>;?{_D9|2&O}bX%?VA@^oj$N&KR3r< zcy;;KU$2unshLL_X$j|?_e{x3LUhh)HGuyd*srb&oSYP9A+DUm-+E$914sA6f185e zQ-PYPAkHW#H375;%MYEuQ*t)hVCqzmEnx@?WrF;!d}QjCfRZBV;50aEugysS(O`Vt zC%~w?%_ML;au|CVtMM4?$G#-Un6o>{0D{CJoC%;0`KIl>u#FQ1Qs%_iMu6+eA# z9%PgcB<%xO$>m?HPEjvbcyjTvKj&nj*}{yavjOFFymrSkdD1{iPtm&DGw|?XDo~eHmPH z@}>Jon%@0Amf*D}*42oLnyrzIl^t&kTTI3ivvbpw1=A{TLR3 z<}&%xxe@^1o+%b-m5jGJe}b27kANYu-ypP=ZBO#{5weB*-5z`lXv9ka_+p&o<@e);Z>H@W3xJ^B(2YF|wO>avMLxwr5hf zo}UA!hxSv3<$Yy|)AditkUcd&jW&fGAhYb+6wbl@hS!<*!~fpHS5Yq)_L#!r<1;j^ zV{0+@@%n0w&c->amFbUF$%l=2Zu6c63e zHJGoabLNSA|9?six^B8Z35YQdt6oAOzkz=tPvd@3-0Yv_ybiLuy zB(N|U*CPLmJEufEZl~o>*~)C*4gEP&zKRqSKVp$iee@Y+h@dk59gd`tgL2~gJ@)nF z+cx$mg>#RrJaXdmiy5o(_Hqo`qZo=3=#x28y2)r?DQ0iWuU&#~*o?2|Rx-)KcpBMB zzLOCkH<;&5&1J&=Opp<2T7#Iv0_iSa}J0yd95h|2P z>47&=2#{i7RIDs92Q)y5_N;%-7;&m(!S`JF`$G(i)h7s{8)(&6y{lK0#GZN?Bc=%FhI#(SumizP--w6 zyEHy{qkK2`stYJd;nd*(K=+-G=MyC@@KAa{rAyoO7TU@t6K61V_Ie2#ivrCI9~ye z&3(RHn|D?95^tIg)#)i-Z?6oQ)Tf_7b`nH2u%dI&BmgKD44bc>23nV7h_XBSVNTCkYA zhcc3;b-0`L&5g$boSZ!{C+*8YFw9E|3)lkyj+j)2(gFe!Z3ncS1*bJ8H>YNt-EP+? zN($8qR8;}3Bs60vc;Wjk(bhICz+Lz2d*5#iC>UNT(IvA%efYlcg!M4GZKCsdiTHc1 zQB~ZZdsHz~-V!)LJRk2{=|5I&D*#H+chUnRyOx7Fav#-uK$o(>zt%Dw7DZ{kaTY@( zLxQCYAsGoaJ~+&dNMc(dFfarf{^sk~`0Ue%>D|cOq2nZ1tAG0InGGMw6yUQzY(3!l zoust+WH|H=YXKl;4BQ<#4wA#z%3kh#oO&h)V{|7=AG8Lq*of`VH)4V{@X&GyF=Z*K z4E?4Mki7uq1SP3Kabs6V^RcLsfu?U8um7G)(len+P|i`6wLx5$m94II{%heE zI9sgOU;mKz|WvkJx_*!TM$h_SVi}0YGU9Xl-{`+ljW9=3(eDRh`x#?s8^iFWXoa2v zJv8{DhSnOQy*6My`*A0XVIw-fBdZUb8N~!Rp|q3Ut}`G_*-LOs3Eg%A1+M`@A*Djs zX-F+mSbb7L&3)Lk4XV;O42A3=dI_Z!$|BrlqU_?7fR#14WvrA+pR{jKQ>rd%Of z6ug7$)G_!~+ub${1FSt-&Y-v9^fqkM+sQmJ__7tN)00{~ikMnh93^UQb(7Ch?ibwIsqo=pLe zVIr*o4(Y;nu8;MIG=T{P6Y>@ ztu#QN*cvg;P(FZ2f;0;BrF97=wEONJoOS5V1r-tZfn(UpO}zUv$~lk&j1`dOz?POj=`wvwP$WGB}?B@9b$SOg*F9ok__^#ocINM+;%ult)g zLmFTUgVce8%-I@Ui@-TV^MKN{EupRL#>@@dPN1sY1eihD@u{{>^l(Rdj(rq}oyK7v z>Nk#<@4u7q1%UIjF^GR^r?0<1JougDcTV3oYk{S%Ml!x__tsuJx|=>pDPR>C{cytA zxIQj`aCTl}xmnY3AKDG`8V?4b0 z7*C!&%bptmnd5K4sQ=9b^WC*0=Av*+44v##EJZ=UX4V$0^PC0%)-W)e*z;wlLD960 z;dqh;UxNBXV5hJwUxx%}o_q^Npo~l~A+?np%-hNYtL9{dU%vbjuU>to-`h-(a){@6&SCY#Q}6fqvpfF+{7Ik7f(8_^E26>YT11j{2|g*(1OemGm_)K&oY z^TBj~-LQ@cH>cz_d8O>qQ&Pt{TOsITr!62}kBL6NP7S~ssoe3!!>7Q*r`T@Sc=hJF zms_7pY5zN<58f5vz0Wn9%^I7{FQJJ613r5E9V}h{aP!>>-$5j=9QC!#8ZfthicXK8 zzX#Xa`MVOs`qBH6rZzw9VGD>QiGkr+nm$8+W6|U9hm=Q;7IwTVI zJ0y_9GUE5z)my~*lJ8YyYYHG`=d)Q>L<%gEds(m=LU6#c++4l6LbDZKHkcKamkoA- z^;9{E1Z#c5cpx2Y82w+qFzYMPn*X1E^3;?==I6y@VAjxI!^BDs2B54cPR|xlN<&yF z$*b!Ig{n~L&jAiFGB5zL!u(xzPX|&D_T1Wt=M~z<&xzw{up3)HDnEe|91y^wIk}jg3+A_cZ@a z4t*M_&)NH$!)FuRznrbn2J*mW8Cy1vJ@D?Q$MHJWn_#28)~$mC-;<`+Lw_`wqPE4RaN^m@@TDja&y~l(LM6)W{hVUZ8IqgrQ>s7>Q#L zUq+FUGX@GDhm~CiLI@n3l8^!9M7d!vRJ|IQn5`iKpjmItkIia+gmGN8HMAxW+b!BoqEiG_wS)rDe)2t_1&Adg zGA5`6>#ckpcx@>Cx?bY+$)`qURthuEClp(4!1fFKoHmx(ui32e@ZyPSk5&ed7x*O% z(NlhPE|tP!xx@lXh`u*{lTzH=TmgDu!xUZXub0x07jf5zG2mxhTGRtRr)ky$p_gSD zY_>)qyW4I&D6w9e_eqEz1t%y=3TkmZ6&s{@N&3y{8%KdQ_&b0hesA9)5|9G9?|_tM zPTu#*V+xv^aC4MZK_m>I#y>LnM(kWhD?n;+HULYjf`Sl+X4`;UOv?7g0!ftwcVm)@ z{VbF*Eb0>o(RrmnLx5#I5QaH(e}@|{3W&ak(qg3cd0#2D;`l7d+|Cf2ev^O&`z}Ko zcACHT=YQ}6{MFz5dY>vzC++{qd$V@jdxu}WYvQ*lY)%>WpPs(}p#*>byRV_7Vb9_P z!>jcMS}JT1yuivlvK&hvFlOotS^Bz0pjz3FMk~N84y_fI=QY~3k@D0|=ChLqND+v> zgO&qR+Sn=Vf>bsTZO?6Q@)VIO=z1=%woYeeS?mm^kf65%>guW8=`9)hPNFCo_=015 zy~X0Rg0{OHL}O9ISJG0nn&(l}=40A)%1pXDiJ~q50q_OK)hmNoUYu6YL__uhL}-+S z0S_+h$Gd5JoY=p+zQ^@ui;Hs;WWRiC+IzY*b&%yl$QvX1L)~Pi7btlRXyB&V24ywl zvX%~rWCEIG!`7FAK8;2gazXJzZY-k3HzsoAuRr^|t|RhADS*Duib zy>}uCAy8X;Tf6hHUR3CMi54X)4DU%V1%yzjtI~t(q*ORRS^0ic1OUpiEU?~eQ5GCq z)Tpub=gd9rak{Mi-&Ilg`whT9yPM6{pUz>PP%5wMjKFivt zyj)rCp3NP1_u_O}qg<{agusI*A9*SE(T;GJrW}ok7pllPFkGU+j{RU4?;*CFy?t#( zV8t-7o!FW@7Z#c9QVjDPB-KmjC1nn=1z%RAhoL zspBJ(F`Wst?2?w**OqB##>o@d3qf}|XU{Hq;OOtPKTou8QX+WbxsU1}+S<`R$`@wG zcQO|aZT;xG|0$pZe)Ze`$DDJ@!u_}{XN#v;EzZV{xzK^)gLL*};%E%74R`uZ1-iR! zi?(g8gl~^(acbvdCA8Auyoz>{`?8$_fKdZ{PtK=+KSIeM;Y%p0ilbOKdE1HaQW$JZ z>Yd)7T)KSuHj?oLj8h#VKRc^cYJ1J>dDmwErQ ztT<43u^MPssY(GG~M7Q%=@HZJ7)9vek53Y&JL8Y_GB1T${2opoV-9 zmmGmX<}M6T^XcN@Q!G!;eIR+nYLqykqTpgU_J&LfnKYKOZDJ645)9bM9+URBOz_F| z*^zWp@_j$1t&|xxz247v>@g?P7?v?qEdb}HHmBr%UCO+VA&7G{f1qT54W^;{Kub%H+w>!(xk{s}Q8W6g>-{t$$ATjDdm-Dvv z1(8nG(~U`C`TH|=4)sjy9*$GD0iy3`%N>u$#4mpHcer@+3{RdsgJ;4DQ@S1kM&I*v z&NO>%R7{3#GO?4B>h;A3j6=YF^22ks06XtVY*9)gS>P#Kxy^FXT6P9JIVlZ1Rc;1A z5*?qF@y^={=dG*L2dL{6w%hd{^1#5M^R#{EWxKBPwV3&4h40#WyTb5200%}l#;o}h`kZ9?}DecQhUB$@ftj5Gum+I=2$*UX2Zj~ zu;t#dR4zC?M+b(bTT2sXHZW&>D9&!`XR-Mr@RbUbF*3HIy3Y7?$_gkeX6_K>UN)Fg z4ylTfY;e@}K;|-30%*4Jz4UB3mNmx72Air`mcWNgk4fZQ#cFkC8JB=1|HS)cw(>cMCZ6%nZ!};Ak)W&;q;DI5v+8@ceZz@$`!_(+ zrH6MjsWVI;lwB7o84MQ=?``B`wD!kqvI(|2>xb|ggpOp(v}xSOLtDG#ik-bVx#Dzf zIa>F-_U$WK48$z&Ie)xc$EIxX$-NAj@%;5UAL+zgB`0|twk;g*{d#m_jXr8il0wGt zT^sd%J?4Ckx3C4oKApH8)AN#SJ;Hux=Ww%gtDr2ufp?F483Dxu31iu8CIS1qY>i?Q zBR}VG?{j0!=w1Y63=F5{d?aHmMP7Nv%?%u@pZ&&5X$VJBDdSM~6aXym%}C1F$ru9& z2y6hQB~mG4sRjl$MmY#0P}JB`awvzWSjrdxw4HE`pE<<4U}Ris|t#j5CR~*0%HsX5Ah?FiTAshvNjMxB_(PLrmGeUF9S?Kqw)0h zD}%47>m?TTG6K6(O2M466pS3PQ{X#)Z~=EhDGBX1CRxB5rE~-;eDm7aT3BMMYEk?D z9V?yBuK^_l7Ucqj2k)w<909<~B}xEF^-z6}lM{sP;xZKystEmta=xmez%JwC)(%mkW{X!*O@y>TYCs_+%*j-NC2i^v8 z><7DkQuu2qfa;`#k_xhupvACDODPR06pD%&$5*dB$WTaarD*l28~{;Sd>^lqn8DkesiB?nd4Ky*Lt?Bu+1mu zXVB0n$_1oUSe>1LD2cMJvob#6qA@3DJGH2Z@~687_b4NqFRa%dw%qZ3%E&F`=7JKl z4&2NFbFZC)7%%E4ZR}~wm7iPGJ9}9m%7ONBGQ{EUG|hoDCoZt{9h~C8gq+}ny}fN& zdv~z~ByBs?3AAspEUD`d{8=C?r<>So`Zd0~`FlV4|K#jPs22}Lwtw}{{}%v&Er{8~ z(G$CfQ@A+)E}lI2EN}0KfxzplA;2NkIKV)Yc8(-uk~GEm2LNsJ)=T(SRf)1Lr~7p9 z4cja57=p`edj0A;knw#xx^^x(n*Abh^t-uY2>zpfr>K$gJvn=TYT;x8W}Z_fO-jim z*JT5bx3o9s%uem)f@YzOx##4|N`Q%pq5St@EBD=+bz21n=m^JD7Zlu;XQFP01f>tE&w*{r&F{jpLgpl3{OoVToOEn?-#L4CwRK+% zXu0y=r7idSzGQ~e@_+J^Kl8`4fO<>^><)duU%vbjmzQ6T>c6}0`+c+L%6r#+{P*d0 z>CvN)@#Ny;@my#^5;(WMHRm#GrQo}n=F76RhS#Pk<5S4aSySNmjyCP`DP-rYF8{u^ zlKeaU7c*^3=b1tD3%rue+2L9#ve&*IBJJN0aBUwP?p7!3A z?`QPBBJ<&n}%$SB8vm3Lso@g^4?-h+vEJ@VxT%!lq;LiqqHgaP?+9@`=Sv`+kA)?Ne% zcVKq{5W-^uE@zLK_lgi$5F9)>5CEj;JQE>->7P7kJF#uj7Ti|2d7?C6KiRjwEbaiD zee3ZY4jkx`>|6gV-MJXtZvnj49@)oNA3Ynl!KNwpyu}&EPwSUZkNzZk{%^nd=gBhv zo0GpnX@QHmw2RCz#{l@Zr+*Rr(!syL|NA%pnB+ER{`+Ttn=QW#LB2NcPyh9Febcnv zUhkcEuoI_6eHz_}@Bfc~Z2*8z{?+4%dCw(YFtqCq%y#6W;?PP%cG6Q?Q%<0I1;!~{ zaK*6t8CzOw6eUNy?#!UZ2ns>LN(wDCv;tHCFXLoDU<5_UAcX>mnarzBK@(Fa1Jt7) zWJVcTpZCKvcn{Ae14=^ly^`b&=<+itN=K+5}o@Gx6fd{9j18|QJ z6t?`3We-5Mji(-1W`36;BO&7uQh+n=dsk5~Y?|?hQwRahIhKnGeeV$H6wum$69ZtO zA`BGD*RvPK_9F{wd-e7TRZ&C$I#)-R(&sqWMgRx(i4V0bcWhU`XVn6WMFCzeKncV0 z>=b?1BZ=G?IY zZ{sY110>_bb$MnT`A4)jyW=xw&pw+RsB_A}Fj28_858+TU8i>EO-uL8mT^eE0(%Fy zZOU1Fhk)2rkf9N4e7*jMF#s@W|F*k9tJZkC{TkBkP;vmk(@$`5_UWX(eS>|@p6C_& z-t5c@C4Bp6x8P8I>QG2`L52BUV#P2wYqwXZO0#Q{bAVI5e*n(b{gB||o7WpGm#dMC zuc;@S-CgD8WucTWV;qd1cosl+y_5osNG$3FR;TA+44}kGAIt-t?+xs|kG;7u;81(E zj9o!EQ`VjV>gYuNo!$kC{$PWC?=TSe;_^8Np}4&KDq&)Zue*)B;dI(1@0;X~g3iPq z3$Gu8U5GaFzLav$kOW}1KS$>e4E%+lZ*!`deOI&g_5?Jf_C`|0I|5`=fsjK19kT(5 z0|Jfv*gHn>&*aGimM>p_jaRRpPckLhqoZ=~n%OuJ-xbLZW4+wC=)&HA8cwmVJV!`t@9Ljj++9Zzm6nftz^fZg%? z2Jb$46ieBEFd*=K?AdWN1ZGbGYj*)1_VuFxG2?x1y}b{JV@?`4oF7bq&L{27jJa7q z${Zjtm{+W~Yg}GFN3*&9pn%}1z1x7Z>*XmPUwmR@v2B|2qhx(V=D_?rv8T_*m3e2T zsAKtv4)EI?!$)N5pm*AG`NDbv)1a5V$~dH6IUkWrGd@M1Wd~@wvFt{nY%rlVEl0Age7CkRZ@X zLn#RsFaYVc!o%{%{*60F$=U+|Pw@kAVtnPPj|c$HPR$yN5jpwHrhFy)u=1sS z%Cu>Zb;>?|`tX>)4|;U3_XT?&!$)*Too@?5zs)9nXXhwBq8WSd(?{gWocnGa1FQ|a z8*uo+U~P7`zWYaM7Wl{9vML7&xu z0iC3=1te0~d1MfuaM%iWofI7yFAbQ{gEI*z^p;tq14ON>ddp60#*V8xXaZ~ zh|U8I-F1Dh(Tf&cs~}{L?WV`+xdGC(t&9~YVSs=+31F=?WFSE+oIG;?^mAohU%ig5 zmr{C$J!dDB0S+aA0kd&-IA_@e?e9v6QoEJaXi2%qMBodQ4lb5GbMUdRUI)3 zc7eia$;UulcV3B1|FZKbX8UF@B_JjK_0PVG|Lo_V6o zfe9|W|L)UYpvp4$Ti=%dC!e|u0Pugk{#kq==x5E9hz>gV-2d?1X#gNe-;6ma-5~w+ z&&pc?0Mk_0v8M6&|EFIV0N}-U9}e~LJkSb+QS@60UJ_^p5N?2YBnUFIl0tR{kSB%H z!XCh7N@*}g(KQmRFq843XP|13LZuH2Y&S-J*Iiq!N+abfoE$GPsAFo%s7^|3-!!OJ z1=_6uW#%|97-T0w3JPVfElOr41kM4l$Mv+NpkfK80(Pzmpk4|9bc~6VvIuS7bu9=X zo|;{V)*!ugT8{Q0sqiD&HXBGO&^7j>kb*YdAmPxLKI!N`cg|BAdj~E_0;tN@)qQkN zJ}N=Dk;&5<9wz2)b>L(n=)~PO*K{fG`6nBm`(S!-S6z0=m`c zHs&J~GVlQg3YQlR}{4+#d&suV={47qZx;fW;g@Zl5-~K5@*lfPDWtW?3%JVzn~z=&L0N z2o@(RP|Cbi_9*Re;vKR>eb;WceRtN4>a~$N=Ay@?j zTX}f7Uc*s) z{kshkN=pzVlhHZgx0(;7iSp>xF9CQnHd+(Ii zsA~?bwVwj}>j5Y`_j9}69i6;$h7&_+?C+2318(=ByRO-GC>Kje30z-WIa4y;f#xI; zwCb(IL-@>yt-Aox8kBQ0Pb9?87lqv(sJct=>tNQUsdk0-4h-zwo4s2E+YSwW zy?XT=n|9-+eZOt#P(~yGw*pD0`QE3!LpE`Q{bi0JA_cnNg@x(1_6`m3IeU|H>aaeP z;Kk+hqcI}^cL(}>2==~-?1t~!-jrl>cKlyq4qL)_F+!i zZr6DE>dU?4($lm*Q2RIl_S@K7)GJ(^J;uq|!|VpY`(kSX@*56s!`8Hqy<@RMW%JCO z%lTXG+n40*y({09vo~ALfp#`)6Qm}@_&9S)19O`XQ|27PIG}CdTHK8CdX~UX&A1Rs z2j2y-9i~QXae4IxSWVEX4RoiWy;>H<+s>>rFW6I@m!A)@O3UhVrT=ck0Lb*oU@m<& zln1^jGnSm5Sk)so{p~wsqdkC~fb>HE;x6UnYiIlKzP^_UyYJH8orwgJGEKJkzuEp> z+dF7;e_;0*8{kbHcKDN~^4-FB<;po2C_ZJ+B|28um<4an_#uXv{ro$gKLXMDn2A$X!~i1X0iln{Pkg+^WX$paKM zgX$HC)wWi>0xb-<&w>2H{{cXDhOJG#?m-@K^sPdLF5hl-N9quUxFkt0DRc8#VTXg=xe5(*5|=VzcH=Fk2^Kq;UUKnb8+u$`IGq%ecQ*>}uB zMD#{WoN)>$ZRDHXyE-h;ufQUIR1X10ltg0-a^_Y#&{5`O|ZDH=wAq;x} zA^@PqG{at)LY6%MpoHvX*#lyxy^v+k)X!YI-fVrHItMzm06-xWIHwWt&(*bH%%H)8 zB&EXn$qIenW3{T$1-k|Nz6V`Bfm*-tV8uSTF9kP%4R_zFqKJTjrj7eO$Fz;EPu!*~ z;JE!OS5~pCQIu|%Cc$E5oHfg{u`K7%fayib>;m_|U1Y$1a<9kUB?sX6%uN&aBB#QE zJIO}&4p{KM4;hu)+Dmto?ISfis$7v`ao5ic39ltNWd z6g*xeh`x({yWMZ2d8=EHc--7zn^Q*5$0Ko4*`5d1;e&+4SR7&12 z?DeQFZZ}=JkV_}qQVwlnEbp)}puyq3hdcF5+lK4XomP7C2ckKddv+QC4ce7nPSWqL zTe$1^9xIvYLlbFkhu_qqREo4ul-YA6aUzfzntTVMeEa$mysXi+ExNA9(@&m84x(cM zvw>;g`6!@p#9$h5OF0s2^MkTCas7P;xHg+Btk+kbO$yi#nD8#ymUiXchXHA|I`ix= zdov)JOo!!}352{WdsF>jXOPQYdn{(6aIW?t*|R66k12tduYQMDFTcEZb|QDpZP}0x zv3Xl*+)PQ>2f%SW3E44->O;5p`}F&C+jJMk#JN0my~49ke`J2&2Y`AeaCt0y5xY=e z=cp`6Y2Gwob8J?oJ?y1z+?P$;<+%;xv|$ANGGg)AC%q5QHgLF2Ck_1Q@iQ!!r}<35 zGkcc|M(>(2Y0_Tm2bz0Nb3U2W{=Pn-_hoP5`Z-ppdt=uIux$hws~}|_5IB`Wpy1NV z3#W{Lkz}yTuRGNB0%s2%Mu5P5+Gh^WGi<+UzQ*hA*WTXS&U{-Q=nFi3@P`mWM}h1s z`6~#lecbLr`C}Ap{H}%o0O`l2z;Bj-0_&ympDgOd?0S7F?cAInt1NAv# z0Pj~PFus1k1L3CFzMVZK2l6LlHzX`DfI!DEIE>?!2Sq9iP#nbv>@y<-^K+jWpQ8Jp zhu?>p^@r3PL>scJrd3c{qiuTB^$B_zI8&Mzhbx=}aI-aQlhX%}ZJjjW#upWX z2E({cSO>tyLzIFFP+8&TXGgf;nEy^6JT`GPtwHU>Q#x*MBypYGyE$oI#_W8B7#ZNI zD!~fJqAC16+X*1gtq(KFVRZVwhvbbGQ-KA{OAII`uW9Vd4HJ$0NV8YO5@-D z`47yG1o)X}4m3Ib&%eI(?^nCs;Ah`cST0Y|iynXU-5#G>l~b2~`Xt7uWC4IzKN}tM z{p)Rh>^>?0Fsxs<9{_MJl~t@}`|tk!uM7b2@q;tqA%~X39VeUuuX~7!fRz;FT0);P zkZTG0&~%or6(~vu{YF5pD9BoYJ>X`6;W}1f0D`I_palVL6zWw4rYL0j0BZ9R>LegX zWW>nwGHT>wwT2Sf@8T^gj^=t`3#?Wpnwu7o_QfWaAx0bNxU%NxEDa_rmDH?t3WG?|qusAKDIt9J~L}Tuu15G)0GzXk=$ALj!Hz%J8 z#4@RAS&ngSsw~DRq*Nn`*4whYeKG1&9Vfi2-w1aOkQpBI(>ipJUiY0Pm%&%ePm!I6p(9fRj_>V5q7R%fHjij;ls9M3oZPS8 z$CQ~3uD^|BN!Yg39KOl#{RzM<#KYs1P)7znx^@nz zHyultEX@T5O`d76TTY&8lF0Ko2V@4bS> z6PxMU@J_5j?)M%5pDZiV)b*jweLzGrf#6%SY)|Cbm#N5~KhSrx*<9h}vja4)xv4_=;TKdtpgR+Lq=$x<4%Q z-tR31JM%3$M0$3!b#<)p=Jo5Oz60Q3DmmpSE#UOCFHKAh6up*!09NHGK6&sX06^DE2%#Z6g)4lq696b}Ks=NL4grAxB2ZzP zI_occ@X#;|GEV1x>ND@~RNnBuOm2G5yzj>XbKk|DX~tmln9{eY%_$OrT>2n3^&epK zgOI?T`<>JmKo;4FQPK@w(U7V<_AC zaA5HvB=8pvz8?p0Q=|E-^9p&9Bw~)nEP}2~jYVa#DxQTf80TCaTsoo{tAQ~3PNPT6s)=*kOY6YUr{6Qg*pmiWFZOT__96_R#K*79AZbO30 zms%U}Eh zrrwFK-b(!2KmTF&Tnqq=-|heX|Nf1+pHA`2Kc}1>H(yuyqi53QrTF7#0++9VA3rwt z_m{;_C+&SB0f6Nqx*h-S-~S4}cZo)UZx!Uqg56$Q>Cmf?ai87)K8zIWcR~WN`j&An&_rPZ9Z&j00RQ?N69n(+21`R%-Q56jR1o7B1RG> zKwD3(6JK?{ZAHlps+kgqUZOrR14Fwp42s37#OC!D)yjfI8*|U4P~atlmKsU}Ma7_m zMzt)^Zu;TlTX8T>(Oh?iVNeeP#l`sWVFfi=(iF0Awnn_#AvR79XdMUAKS}(J^ZCkH{ zZlrX9t`nYBkFK7eTEDQzhdT5^c$U5JeuV(Uvy&QqFYPe_S~7qwL0OAV8#W_CIf?~` z6bhOUC?P>BhGJ2m?*z26(%xGEGp=h;O2JnQeJg#R5uJik8oXqXz48+br8SC00epkz zuZz_Rr;8elQb?sx*9#P!;iDfK=YyNv?_~DLECy(q>>`^8Oh!&OyFkg=iyXCnp)@RL zQm6ZzgEDql{slQ-JEt`c6ArL1)qdqhQ~e z1y;HMaZ?GU%=>2-KT0dK+a`LJZtb-sRQWFQojrVDXUysA&g?w2s-n zZT%cW*)o{xP=r7WGb>^ifKDm(boC?lJ|+BaKv$0t{Fm0zJ&Ta3P-_`YwVX5D9g8Ig z#IU1WY40p$iNh%DZ)u&w!spoF(nYhow{Ks+1mlLGwrc}`U=xG?!sG%mIpb6AeVu)A zGtTHtuqXvl%gxnbGo4%HcHyeTUdHhm+I#itIW!?hku)_a2d>ixvl8t}Cg^(z_-|Z~ z!$CQE@A_Xne2Th0MP09q!*`FdTq*6xtn7Tz=8YJClK$o2Wfe%Ir)4;sX^=7KEAe<9 z*mHFZ?D^ve-nR*xQ^B!xjv1CqkBBm4UX$ZjJs9QM8az!2%XL+m@DqxZ)3dsp_9&BJU>+YIeZ*}T0y=X}qd-xm~O z9pf`{wXPjuT@L|g<-m}060)hJ@S!#j0et3UWN#0s&fA*rXH)m%zU-N6W~FkczST(z zuL-}~>+O072Dv&(<>yIhpew5DjQ`SsBiu$`uX2)<>(03~_#AkgQUc5bs?#}^=(f>% zExcb@*8XH&7^ww_1_IM0~fagvucP}Xtq zIQ1>jfDtM+7Cf`fW{vgs+DoZ9_7%SdQxZsmMJ~`4reQrtC-c;c73#$buP@D*wLh49 zpKq@1`xA3Lze#S-ap6#~bF*FJi{Jd6Vai;d;^NWAo*@v3=iu4?VEr;CQwGGDq|w}v z^2k>-%ZTJ`BAAEG0Y@>h7NR`rr-Kbdwj;a2wXDiB_Jd+wX> zHlI^aXx}egu*FIb66y(uLcfF78jMNnfE&vb66dp#y;;jEW%w#6g|>lMN@?^S5X$^- z!b|{>F&h_>cI~OP_Z>(nO!@wL3TP8Vcgg}<*?1jec0SBNT|ihXKugb5L-_(Hrwb4* zAces4lXEmqk;uvh8!`&+1Nzapp&39Jv}&QW0?EANQdlq@XP|@uC;&#W*>vb_(35ju zp@8LT2`CAzdJ~YQ6z*O3>PduH=|bZ>BccP*8co+@Sym_r!)x&doGyK=q%5_6PIP;U zMi3KI1fb;>MR|g@8(#2%-A{SxyHEnpG-&uU1qUupj69yl;q-vA%!JF8sZ&vo->76<8GCH89DxW^o9-JpjM+0b=h~Q?bGWf@ z2UFUufX{(Xe^MTHpK@mMjp}A?MqsdA<3q+@LY#RZsHJYYJ>pw;sZ95I*df%yOrY>0TUjP6g07*naRDIXqzBD(9d^gW% z?fHzlxok&Cvb#aQy#Zqe^ryA9Doz@J_5eVqT-kLU01eJK2q8f}0MPb5FwjFSO?;>8 zI;>7kvA!8^qP=q>@wc56fVSWLGWhPhH*NT`yUBvY2*Wd#7#S0QIl?b{+ynjWe9kF> zn#xV|Er$bgfJYaXNf;4LoQT-@#ZXo+d;H*|Kflu`6rp|TycVG@p2E~Mz}I~lOW4U+`NJ|{cr7j5-4on=&1 zeYD2U1Pzi>(v5UCjFf~RAp+7J4k6tPAt6%I-3W+u=ZJ)KDkU%?-AMPH_uh5C%sSuB zS?A2!>)HGN+s~tlF{%E;^w|(dcG2sG7y?jcf9AG$C1rxrA37Z^k z!sBDd;J$v;xdp<5GbJPDAC;xZ&-U%PCJU1NWJ_=sED>DAspk1Umv@gFekI5ky?Jb3wU0EB$&MyRrN;q~vyxuG$1%bQeX_3j!VDqtH-t z{J?3ecaGV_Y7UTzY3fcZjE45r1}zlc0SKdRc0#AH3=anREg9P6(qw?9^@sSqz(?z? zb;UgG#+0c@O9h7FQ~U(9!-LJTf17yZ?=Fnm@l14!AJK@(m%e=iggaSvaxf+eple1I##+!pY7jq0@b*}S&PVp!p&9zj& zu73Tau*l88cu_Ux-IM|1r0KJD^dF~v16Y=Z)KnD}vcp&{_?IADglX5}bG9uBc{LeJ zp0uGS=QeX0WoA{m?V+q#_17bF(&X;i=o?``u)l@sCMyx~*FOxyy2N6~kE3Gwf~wRS zx@dlSv!xdixK4m3h4-M#;~LRCy7BPswda>NF~cjUVg2sD#e1HpLW2ovr|$j>y5Kmh zTc}c_;7ujccpx`@qUW2#*gngS6Yw0hiovRgSy#=AOnJ&E(%h-7&@{x0RB`A@|=s z8=48LJWdf~Q)oQFYO$(ze(yl&Fot$Ja6vjb2kjg1lZ!ib6O-dp*0l9CIlsW8@sSX= zlkjf4>-u_MJGPP+ts66sRAXAt_a)P6#cWPY_${Qe3`I+1h6y$gtCu^F>+5OLzQK7x zd7p#_0C9{*9U8vv|JI6&<*c*Nc|dEyr(0Iit(TV!5qT1-zl5tFGAtmH#o2*2cF%2A zm?4P*t?bMbH#HK+fyfQX!f-$$g&%ZT)gRf%;11loUDU9Cc;!2`q=fWM|AgM4Vf_8CP4kUae0K>2$zl~imnqqsK63uB^=1;|?MDCJ_ zGg53tCD}K5hhFJewoef`g~z=vUOiY*n4p*3qROB z92)wExw(N2HNLv(Wmv{)KQn1L0Y#?6d%z<-K8dqj*b{G%WN_t|A7^si+J3p383b1 zL$n^D)6=ZGI5CkFE?xhEA8zaEs`DUuX4uK(yXVvF-)@5jIwW5Vm;;qVir~xO{|Jb2 zGEBiBh?-uQfE4A-Gdv;q}Bdt%4DC@ZH<;Lv!XKV<-o*}w0lNWPD zfSX1%H#j(^85F5n;CZg;c>mZ6J8v)mhWJ!E_@g5T?27{;2|f8R(6#?(7Y0v;MKU*_ z3WA04WB$Z>_4#p|vd@N^f{QwXABOV^7OM!EaKlV#wIqU>m7zD_d5*9Py6F`IH(--L zKuraWRM+#+?QpU#bL&2+spl)VXG?VHLt=Db9lHahM=N2hU#vhQ_;ZJK+x3!DYVvT#j|JobbA>`Em~ zFV87e-+0k_r;Zp6?^u($QA~d?sB7Hgz1DFcseOY|)MSBGBJr)24&tHS67~%z>b1cu z{Fos`UI}Ew!j;Gmo0==3@JL=OU#dij-lC1BJsXUS0r1Ivj7BXvy2kc3e=(p`wKy6Q z)xZ#>i&=2=rb~CvlVkE%I^5eNi}#omF)xpOt|n_{pHubg7pCM19fy-hJ)b?$L4zgg zQaR$5Njn;JT7#OW_M{fb8-mhR45hvfAAh7t>Bf?VLg#&Gm>_Dt|igOo~tp00a> zY|g2xa`zl;uyM(9FgmcGPVr~Yir#l%+r3FN3d|EV>+}nHt9rHaIlyhD7Cj(c{llKS zf3>(#B>7>q_k1Sci|RRU+e?uWpdKEg1jc@$3pIvxfJ3Edt{*2yZCWW|y83_lBhaGq zLH6nQ88q$Ar&Pt&Z$mH9wSnB+I5EuTFUq^U<0yL{E=WR1rB)UYOirL`-@>x6R9NqAf|3e*4Ykeg#yOonyx;TE8PNJKX%^ zxro&TLsmxX{3JHOwv+Z{Q&#luig`X8KFlb3;Sc*S0ROYDv56y!OUG0PS@43riA{**|NiAZKo?-&k2} zh|rR|7ZEOoZ949&aW;vTfoznR?9W1`2Q5OUNS5w+he&{E6)uE@W>GSxy|kG>JOq(! zXIC>3m*VSz*%DBX31he>XFwLQuRPOEPW6cOiLj+O98r~k0F%%m^wQepQWBgFpmR?y z4Zijh^3_PcKdS$;czZGqtuocRWdX46za_QYT0sC2M7Jw|9PfU>2VCoySFLRlP@x=f zQ63I4x2NcRTF1E9lm{JIa}8;QG>9$d*Me}or%1u}cfzwy(8>xl>*Xm|(~Ge#p=DxV zIzlFvyh$#5lZ*xYRE^%x>R)SyF%4liOp&v&e8a`6B0h2$ND7COubQRtY~TecsA%(}dox9h|^>UufNxy?)h$AV|Se6H`5X+wmNA8I5N z9~A@%SVbxxN9Het5i9b2Q^RyzEJ_hYN#V5#?F$6HR)60Eo(HCtyZGHYIx$d#rqrr7 z!#j4lS(wRSisdN>&GYDh(~aa6by`~%xCz3nhLij z7u;n;#ye@QM*6jY89OHnN6~~c$xzumMm~NfJ%TUZKv@M#O&BF>!BV>KjyLQc`0m6n zrvCY6LTry)E86+s4P^Kl>KQ0V3kVZ@2&QktH8YTCYFCNw`f@so(LHy#iq%_{ zRPV2!6;BuVk^N<^hTRWn9RlaP(3=YNuKU7gJbNkUV`2iAttaY5RLoQ!x6L0mrVZU}d78}DqVmR-o2EX_< zrkSz5b+70;*rX{tRJl0oTXz>89W~t>zbQqp)f`i<|9nk-dHna#+~Uq;;GYesKT>p4 z4ljNa038J0nFkss#}`As5Bym$<#(ohk&ncqSd6N+Qj(w|VaJ)^GXC;8>#!#|i0clM zM$Inc?$%GnEXzJXmGyUn%_alVUV-J}?)}Hx$GZFcvf0J7Auq#fnZP&iL;f_3V3Uap zb!DCtWH5_9yE#NlgkYbmVQk>C!Z&OH1VNR>l3rvZ6rE;p7(Sf{`cX>$4%lY>5Lp-D zw(8A$kd+$HlT$=y^rfd`A5n^7+8r2HVO{o=%fWckVQ_v#ywg3*{fKv6^dQU4s~Yc- z<)p^)mACxInn)+RL!-aLnGU;}3}$1`PYM3n*zCG-Xn%|A(9U{f-h+v+?jad5E}*-T zTE@_bgVKc0Et*$4HRmu!_H+whEw6lL+!wpjTcQqhCr~T1yAwk2oHYOP11=p1r~sfu ze}txgjqDand>-YZnrTToLkm;GBezb}+2TI1%d>t*r`S^#B}uiKc4buOPSFe(ZhMF|aNh?*YBzFVY*|!>T;v3uZyyET z{k4Z>0QV6I?iGW6gxuhVC9;p?n+$7KTfrsXt@2 z2`hHrg!I+HR#aC&_NoQpx!mKlUo_Pq47f$Ihb#MSGIvNuAOG*eB5|nsQ<8uNdxjJB>z+g62%y|{=G_eow zNRZqn=CWo7ImzIe_8v`4v9CV_B%4_&Zs4bt;GL}{>uH&4g?U={Dh03RtMFXah1BTu z=AL&91~R@sb?v>41l!ng`1?yICC-gC+UteZ;q_8X5+bE6iUS8T?m3wg*kK`>h4$pc zEU!9;Z8`g1#7A?)Fic?HEa|l0(|=>nRg$?WzGDOl>%A}KWekVuCFdtIjcx=k@B;6}1|MboD`jK3Gr7GqAqq%Hwl7(ON8$u!A=y|uw|nEICdNJm6y(A($nx%gRu zxN988N5{m9xHF+X_}>Esp};A!&{jtV3|#(ecR5o%4dz2cGg#LL!b8j0`Nc#nW@;sV zjUiT~>d({njZUfO+XL*!yP91d`=<{xi4v@d(k0Y!T1Ym|WI4+W9k{qjwgz6a=E~`> zKNd}Kx+x}k{-pndGOuK`dt7*mK(pPytx48Um39Kd zGoYE*V z14L!LEo}K;=L%|gjHf_XIMq0r$meg#LgL(skc!=KPo}S>YZ6^%ceL^AGO3dU07}6< zesPcWepdg%-qW4-FF*Nr+{Xv4l=+`kV~Ky6l2UE`$?4)(an1jFKPe(_@&o}cB!S59 znWh!Kik)Rmpdh&*q)%icwiWVx*Oau@~sn<7H$?rT}=D>J=e}tjKTt&qdds zYO2DC7GzlXZ@2}j1^!ke4<=XrL*imL7rb+`0=6Y6m^aOTJldyw+SNRGz?M3sWp}vR zliS4WpI?E?5e&h)XR{xAe&klty)?z>I03*4)Btr(23FMT!8Hvl!-tQjwGTN8&d#}k zp{$Xy_#qhnbI=Shst+(I9wy8Zu*N2XBC(aEwg@&vx20`WOed3YQx5mw35;L^>`|SpXnRFk$3MnZI7KXMkq(;+%c|Fr**cu66WBdNZr@ zZbhzWg}iPH{*(^-csg^%Rv`%ofLBRR*L#2JbLP)4;nzO_&{>(6Z|9Z@sp?D2mjoxG zF&)?G-B?bbdfLrMaesPMqlF9vOa(_dnuk5xgq35KfCI#$EjfGWUVY15g3GVW?C7BA zVEwwAv!4|PGK`gVKP22%ufx_`p7Rgw!#7S#6-6lkO$`mL-PnwPE}#oxfImG*>BOvQ zd?kYTp3?OTM!sC;rK4iRBxXrQpg$Wbd6#S}5Ka`8^kacvmI|>Y8n_Yk?hFLWR?L<4 ze`f{J)h^6TKvk!<5IhRN~?KFS%|-C zop$p2T*)LEzVwwe5$2`w12{^WV^{k@!$qv<;E}whl6TmtnjsLKKXDKaeP!Q#Xj~s< zZtF}>Zjsxc{+W1Z=(BezHIgFY0t1!eE{dZsV^Iu4c4@KvIT+#{%xL^6V za_oOKCG{E~vDM{M*C2cd9Btfd-&C*#Ddv6LE5EAaed@1s(5kA^;THr^E4yY5@g{ux z<-{?ykQ{swU*WPTbjA~Km3KeI=GqgjGEV8D5?=pF>VqzSKZ8#Z`S5ASxa5Tff0qYj zTUZpdec&mE=&az-PTmRP{Rj3mtZ-+CaxWM!W7~re(#21_zXd@67!E9%r^sAz_-Hk2 zg==NWdk8_pOl^s?C2o1LTo4$K^S*Oh%~feXc$_2Wtg595*YW-E4pNott|0 zjm`G8%Ar|O8w+`M$_ZbzsCFUc0?*>3%3+@zNgk!8Bq-VMIMxWel3|&@wCmt) zygs ziC6m4i|&>Y=R$JRD_cCU=g_k(>_Ft8}9X&{v@ z+Jzl`s%Elss}Sdrm_PF5W~7Dn3#bpVwF8-PU*Cbez}b6E4^%@%f!!k4>+#F2<#=aK zyJ^06O(J8PtwEC*7Ny+_iC4>PYolOZrDrbbakWR z`LmnNg^UEdda~}Q=eIAG|KuI}(|t2DkFpZ|@xV2&|;)5Pm=XI-`C1khw z0s3vtB_XL$m47k&|17{*f=Q!Eu1GZDY0iZ(VuDOS)e+>V{w<3S`04)gL{p5LDyJch z%<+Bc)srniYrj@!^?Y03fcsQz)Fj<}?FSAqN;*1SVF4q6?SpgCUqn%C-r`>7r?tK} zJTLfb$sNcI)tnEhE|!l*wjVUgUzh)7tLVIs!$jE#jV+dtRV4-jas!wudBX>s)*}+X zm%DmSHmmmzi|RMi?;x=GoIN_KO8jh!>_Dw{BTF`;3>&|=?I)z2z8BPoXHvU!;}eXC zh{&47=3r_qYDytCDl6~l`{A1QtdTklQ|SllldH4MC+$yw*YVLdDZ4cCmjF!o{zg1g zj*8AjTs{g6{pT0UqKY-Y3Xe9B$IQ4v@QU+ttG?aD-;iJnGPTn!0dp>#5Ev0}wuRq> z+ry$Pv7v}U4&>Vlqv>l{2rp3cd^>$Hm=DOe`hfv-m7D(U!U8S{$M4~U(H=pZ)2J3j z{SCL;YtMh(fenF=qMHP8Mk z4RF<{d4tyx{P4(unmOxpLO7Ep^FOSt+=r0E(!>}RLCPAL{;DY%Mt1%w-ssgBKr>j) zi!ayWn#k+yyl9TV`meVqs?9lPHy-GEG(Q@H8BX~x3)i<`*+ohF!v0D_R>WcG`OFpW z(_>b>Aa(uwzdA6zM90BCd?2A#MXwU~oe&MtBlFl-B12}XO6h$+NxlrA^XvzPRM?)C z(<>=RVlF*w;1GbqUWbzO{BZ#nsy&MADT$D{+J6l2E0qj#2LKG*q^N3QzNl<=ezGrH6e%PZ9~V?7r{R<+X-#x zzkZ&#cIz!|sNzxpV0u|u229!WCv&Ocq9tZapC%$QTpU&Hf!CiWv5-3r*8oCYQOGvL zs^Vk)gz&}n`+{Nd&-w!4=iidwixRdOkuTsEFVs!&s5BVazS*XEDnx+X5xyq6v{&E8 zlqHXUY_IsZ<~vyD=W%1#CczWN7^5280z?^9MREU1m6Ng6QdW3VzKqcCYfQhDn6PB5 z?El`^yePgjy!u#MxUf0jf5@{8fnsq7xiRONv^SWWvi-5=1NEtLarL9F+xo^5*%LIKW z&9$Zw4`gz9VOeq_HJ8RJP^TF7-71t@`$gjv&Q5Iu!J5~%AXy@Q?tP0epE{YQr|M|a zZBA%KMculkF)Z&%he(*Nn4A+8;JGTHVHfq6QjyRchq2<8-{E_Jr)fT~+AEE)8?)>3 zf$jjWeHT}_?3z-`;K^|1$PH4hBX;>Oy;|S(h0B`Az58vf_sIC+qUw+OFA`|iiuF}XI4^S@4K*zWGJj!cte*0HO$M zKVm?m2Jf`v=1fdrT>r-jR)_z?$+D`Ws%Db;(%N?kcyLvvct3AV`@Y?{simx$vrT`- zClu&*^Ecx8Ifx5#G`tv_tgh0uXEkf3eFOc(Q?T!SxU#yxcz84J{pmC$;UJf-Uo(bPX{?n+Pz67gmvy+q$Dx-rmFpv$c@g2<8?m=F@!HN-D3 z32P=Lz-El1l1_ND_wg%y8x`_)TM(+Vaq+nNBwwWVp=r?d&p}Gv8Vz^nDMP`gh5@p<0F11 zOlnk?%E(npZlPvO8Wch)L3ZT(oa&ly_@e$6wh^%9Tfo&@fTC zddd}+_AGep$RaMIHaP(dXQ)G7d*}8Obja;e>LJTGZl({ib6fCLoO2Qcw5@`H60!t& zKL#WbaQW5}kXE0!_yp8BJ{-IyiDZqqDULZ^9AdKvh3(|}9RHK*9mFq*J9ZmA80nDC zwXGGk2_b+8FPZXu8Tb~H%2#ECwX*B@mK?ZT&+D2Sa>N99Pck{Tjii%RC4R3`2qN^&7vM!S}5NRaGvFA)=cA zb}>=ZYS*F>WTK@exZMwbF{TyN{t;2*mD$$2nD=mSI0uG$fDq)j1B*$lk63NhYgHuy zqtX~*qxdH;J)^Z zuN?lXuNDxGVU4V4)QsCS?2G%va}IvX-sDGVAYB!heZ~E};Mou#WT%yXJq?5?84=u9 zx>j=Vq<(17)X$rwO7#%EmZx9pA|g>K!asqBaKs|tn#*=apiqm;*vc-+aIEodWP z9W2eCb73tb?jgFibqYAoXtGFlX$mW}MZxG|IK#C{E)=YEJx>3IXqk!DbP#g+5mCVX z>77mE_xn^qYY;S7&d_5a3w6auPuGdqGp?=)uEfX`j7-3Vn~6y8nPLHRvsENTe^rPz1G=Qq9ES9n~c*`BA{x=TM?dxxnODTG8^fVc=3 zWC55|Lnq;XKaUkjFNOSQ8W|Hs%cad)Ov-d}e7iDxPrYB9XIZ6<(M)w3l~25D8t+56 zt6FBXkEQfZE)MXkez6))dLhtsp<0SRzs#B;*zc8h7f4wW+r=53Ep7JahW_C(GUzb5 z)@cAx^THSj!Ua~)C3CfJfA|~A{#>}8%S|o|$wVh1Pd*&A^amX6%~?HfH@(ujRQ2}l z;Z&~F!m{n`k5*u$-^>2uQ0|ss_e=q6tbA%g6 zP{$!Jyk>gtGVOyvw~F~hG<8+qrZOtPFwR18c`||yxv-0F3+%mikrI?_O?-M^9`MeR zu%ldi<85G^f(WDEEj@EjJgxL?Wrfybzij_@V}>c;M?S!(VqXDV-lC>&# zH+5sCl5vm=xx1gUf1`}Pg%X8&n*Mo4ekm0gcKCtsNNze00J{0iR{I)BgFj7`I~Uyg zxj)QVyf!xGysPdC#DJMM8TcUNsvEI-;lbEc2Lp;5L_vutH^Zh0Ds))b;! zZ>Fix$);uyK_vWw#+&FL!fD?Nq#NHT)09VuvzAMgBqc_ACb}3Ih2bo-88}xq`tH9= ziHjV|kUxistxGv@sYU!Q0QgW?R}yiOAam3cBAr(s4#1kpYO)BEB)6@O1OowN7YVWq zf!j?-gz6ho5q*Zlz>BjY6K4Hj<_RDOfGG@s#GvD+DS!-I|8Yo5f!2)=*WC|UU?AwG zyCW23nJ~$%DWWrFA^f&wZipNcDVQ*?C-ewn$X7&FqrFLqSr?}%!|81}H6jtg?Vv`X z&H82-1Ka!cDYgYCYuapcnP;E_BU$|u7BG-c&*5sO_P$FXZFYRm`X~W_<>P^WLjmE_ z%)l22TtJ0rlw(fb$wi${;pRo>)G#vj-vsd6Z7j&w-hdy;mJ_b6rG^x#U)GYaThFuY zo-W<>EQ*^(wCp`q(se(2GxyU&*MqtyXVPJg!zAZmNB~{X95A!d1pPtsr@{VIi|@T&Awnausg7KUicWJg02Z;$oKG!h!*^7>@o2`Aq zurKr~Ssg9J^qp1;HERpU(IlY*b^B?X&ocgWa4=@a?@4;I*()-|k`mF5@Mb^0A%U5k z@V3-r0ru(lPwz~Ozuw8-plQDRkr4CLQ5eTFn$IfuC;@zB=;8Cc{g;?dt<9rOyF0!u z!GJ+HS}a!5n>?mHqMslHl64S7J4>_jNBaQmOTFC`{A?!hGZqlF`SSEQla=8i$~yH= zpIG;Wr!n>P2{)j)zbc}y_abO)AOQAv%KazU+bRV!qZxou8$`nfEweXfuw~I2yq}vj)l_$ z0NC~ux!R8h(o1kp$!mEIot}SGXXCTBW94n(D>Ei4addWY)6mm9Xa7!nXVtq=dU{9% z*!S{7P5A`*Wvbt#mDs@#I)-r))1}@$l}7{zFA2^{cN_Y&PGa#bD;=%cIzO=W#zvz5 zE1ANVxt-thviOeW=Hdaw;XjI@c=2<}Cnt4vf&O3qz9M^CRVxT1o@&BCT>S*kzRYFH z8BZL`X+eLrWPTa3M?hJeAOHhC48{W}8txCTsCL9dl3^qQgmZR%7CEnOR6aLFunY-( ze?8Yakliu!_f2Rh>I}=1ucOmH5}wMSK{~;qOqO)eGW>%L@h+a`%k7rIqJNUq3(A)V zc+Sh@pCwxNd90=l`R$sQ{zr82`A7ZKU0g8O z#4RV;&bAkGTNImnuyNs0~59MvZdJ zJ1`=x+LTdE$2BKO1VD0p;0bODerS;Y`?3Lg6yZIt44_Wre*5j&6Qm`j4+K%*Xs6NDePef&4^N0nTJY9U<`J_DK;vP{yK0Rb^I=b5Niz z=`!V@wg84@%&KhG+LV8^^pvA~LR@6;<1eSBrjMax_pv>9YiV(R5`p zDKflnu=JIuw1KGM*_A7&ZKi!Yv*(zt{tw#>Fnb-gL$-zNa1)zmT%Atut!&CZNJ9VL zAKe<-9cgG1?t~mpdgU%rlU~^0h2_-S30WG!t3OTM!iy)uJxo>!^5z0D{4X7_T0SpG zmhiGL_&6;ZYUSsOYyAT6v6!nnwlH)G@@b{MB~sIV%=)yx@K>nn8{20?GfZLq=L&>J z1QEY}HKV%jmqo_a^A zXEx7%A-u)f!V$DVpxU6qlY?AxyYdOV`hT}M2aR}NcM z0H=qXgnTA+$eO}V8nSBJSFRfI?AG^B+30Xxv?3vKS-BUF{!_#C7a`x8YQ_LHiy3Totn(ZvH{ZZ;%*>HM_2~?0FCcc&h8D)8kim1v#c=-n+5;J+4 z6p$6rquXu$bcbK@MfGxA7^dw>0xw9@0gxHwLE ziDGT|^XUV;LDye-?C^oJ$V1RwmKscwF`h4%dw+!t`P>v0JR`Rn9Mkpv!SLY;fNCG0 zKqUKk6?I|Q8vnZxyU1NqqLzBu+%?;yh6l}0ULF2C#H*p>ITCNy^aKZK*@v$poFA_PCIXYQ({07qwCsDZk10;{t9pL+sEREov0Z@h z=%QX8CReq$OBFkOgy+hWe29wm(We2{@ZHD$Gzrb2E7dMFAiA%lHDO1{&h%V7a-U}< zU4j4k#X@cZp=7y}Q*gt6?f8J~yC&LI|1|SOKAy_Wx=)9gM8Da(EdjLJAW~!WjV&!_ z%mjmBx)r;>!4D%osw;~$)anII=O7?hV?8)nWD1L9<}Vubdg!76C>L9M_<;m8?r-|< z@Ac{h*NvEO@XvV{5Tg2iI1Lr+mo6Q_ADKA99|zip{pOD)5C}ipf!0KO!at0au5r-4 z5)_*%v364Zqql^vZ*T`I-CvYIcrw3DENE`3U)gRb7xCjqmutBF9`5J$Ga+@p^4G+~ z{K`E3Gz{NPpE%$HH9TDG#7cvhfO$x>T=1dUU}AD+CjdhV0-00Y3M3`?+oZpY1Y3D_ zD-DRJl`MxPv+hdq-Lsz}6@_EqH|WL_k+WmmiZKpCz@e+$b%ET}IFqiu8M1>i9^en1 zE@nC3ZQ}G6-Ar7#-SN%kx7VsP%>yJhSjPBYl0EK1fgLiLV(O;(drxVCXHwXh**)^` zzut*1lJ37Ooq2f7LaDqW+5&@(JQh$ZvoL zhc>Gk%Hs?L#Gd)Rk0Rygd{%-~FttdzNlM|%YYJ9_@V^CzYqfAsf}PBllijJ%JnU?~eF%$HcuCBD zED8cl!{av10tw9hLha~b$Fl4E7mYGM?*-uTZ#rcKD3|eSD3AV7HjTE%HU_^Sx38vU zB`5OmzMzgwa7RbL+C1oDXc&LElYK4xGH6{jej*5q!)K`XJDY#t`M86BOrSSi_d88l zlJHh_oZ)BaZ|11-0-HwZgXj<^jBx)7Iy*qgVmiI0@< zf<(TWn2P{pR~7ER$*3OU51(}QZ(-Pk z)G4(OP+jf8#&q{zejKFbBG<3bf?QsIR|d>EoXgEsGw3hgagk`@_NQaq5P$#>>_{}? zJ9^%w7emH8x<(ELmsov1$-%uNxc@$sboOU-?E#JTi)Tm5F z_0Mw>M@fj}Z@r_?5Y<9o86)-tJZb7>noT_v+Ut)+Bu~Uj3}uX(hB}ZZctC?oVnl!G z>!*BuN-};5w!7$J(s~EI>kcFpkz}Va`$qI5BJBPbC( zN^s2I@+x0Q-&9ZHsKKamiiK9y@c?1^0Y)Gn45$oWV|gV0==@KKrJ^6O7e_R`+b9v; zV4F}}t`7uXcx!NiXd?am0mPpXWvrOOWX9G46Oiw2t{(2Px(2c3~9Qdsv( zT!nFtyI>5A>BDW9UkIskr6z1!L=qIZ;*f&?cTnXZrrvshVfO_!k{|;!r)ZP?w_njD z=ogEPES*&GDF&%#?%G-hN|Dby(9)Ebm~E^X6!Rp>AO~qI3t~m)L>nP)+n9P5!kL4= zwRPFT2>Llp&1~45ZE(dtkJ}iu=he+-!;;jzG=@!Q(Zed$8zA871qLQgL5mt^U4w2q zxUrpDufmPu;PB|>*wSFzA^p2U?{WlU>T2oaGn&$SBAi5$u)s&E95dZeH2hP+5URpp zCS%zdq$p^VU-6X8*Lm^if?hh9o)$0{cN&Zt<;pOXcKG&&uys4>e(>cosmJ?Q7Gs|L zAvvFy-i2{FIhaL@T{xm7y5BGvjS1wjs?_1XD?PyKvE2QHTH35TluVZ^H`-9Vem1Z1 zfdyEGeyKKGrFA;ba&l~Jt~1X|L56b@kG4LgFj;%M<{QT`iat7c#v?d+!4{L;$&YkN zynO^ruzZD+?x$cIM7)YN6SJ`Sl*z`Z#OT-!9Tx@isr;v`MJEc)_JrnMMNJt-f{wED zHyF|HsB^eAa=$cg(vRxX^SE8*#Y{{8-gg5vhbA`yI4|s0{O*W%&zP4xZzi3y9_?kO zYRSP>#~jYb2{LaqlC9^#D}g8MK%TaxMe+XRd3?5U3lwp}xpx8L=L^wWx7>?wa9T?r zd5YW|-1|qr@_^??(C?lx+a!RbJ@7C2`yTXtpAG#CGNVBc7Y{Wn*Z1yo*8ZYqsJ@sL zi`o`hpN^yaXW;^D!I7uRG0?U|&(leCDPW2eJo9W|-E4Nr?_!Q7p) z;{RbJLin~P5=?fW3amP}<&3~_4y#(RpM(?wZO7zeo;KWNeaSY4JJVBmL}Fkd7=R_P zsXctRid)xfdJJF#HhPQhh2ihwI=&}f% zNVm|F1nz&-B)z~*r{uIsU=Zb12BO+1S^h=+#r`O$_|DorMUe7~qUuy$`lD`;fcY$$+B#eV3Bd7AK?j#J^zwZqe|IB%A8TZfqMxCgt5Ml1+ z^>~?Ke2HPQ5dXZ-xhZ=ZE2}ti5c>Ch`vTu=2``WF;#3bZZvA~cPo7V}%bEST`lqv~ z#_KT(`U5nobU(CqewD^BW?=BoynsTt*vT6jl9n&JM;>ev@4te9l> zE@j*T`JkFN>=Si5ZJX#SRkI#P@Faf8IsLw&dgJzE^~SPTSHA<^Q{nvQx@vQEwjapC zwTo*r#kJJf3_U~$ z6kkOC1-xfzm)HAQHdHr_spH4>F3a1S!FG=!WWcgTde>29k zFh$gckQRAZvAeO!3P*(G=xRRoC((p$8mCG%Q>l-*CQtsvYo%eaB?Iq5w-_fTI_&&D zzt`yw&c4wW$A5(Og8N$((5cK!RZ$2tOkSo^xgk5naLr$n-!CY7B1956ZfXszM!?8{QR5(V%{-B+E3*U~K+r z&l%O_7Z&OVC+`Rs^TO|#q5HGD@djUIna1fC?qo{%K?bN$rzX~Sax4lsSDew;fodB$ z@?!-2(y4a}JDvZL!@Kq!M?z3gT*0MH1FRNjC$WiLL< z=2i60C`ypcRlh~Hnp9uE5$CrXr}2%rfIk2T0e&P_eav+}!Yop)t8O3k0RRDbRUtM3 z0A26OO8Jo{5oU=YZ6IDBt&7UGZx@>?$qV1VY?f|Jj9$-E@AuDlEnu+2;5k%kBoMbc z#*lFW;N>$PjQH0d6bLn&r?|bn21^n|`Z|y(hBSmGOf&oi_Z1-uU`iaIr`!Mlvx_LM>b1( znF2p$0Q4mLL*x5Ub^t*uKR3_YJ{QskQw?LtrmO#RjVm6^{uyF>7aLdH$G+QEg9DA^ zd1(QHdEtNK`{mMtc;|LtyYMOpWeiEeu)4oTRpk&uB93Fczk73T_kNQD$j!|&+~42r z1OPOQ@ylzy2!ueByS48~A*8Md*XrWqhKMJZFMg-vCS(f$@cAEZK|xefnzjsP0K64X zgpig+jVh2}z1D#tEER-n#K$8S+%Lg}>%>@8NUE$3yKlIvB3KBq89vG0s zBLIM0LXpn+=fIp&1uP+$JvDmUhd@e+R73!g5M1igiUJXh&~O1t3F0WSjEFQ+jEf|m zLssf0rA$$!bIws0nsrh~jD#+sC?OEX5$dX6CvP}NynrZ`PIE0;7NL05Wu4~<>dHx^ za)DVIp{z9PWx|{?&T8-^2~(3AsOLg762t)w+OiQbRg9Cm)HJU-qExN4l0t$d4CP~q zXchr1hHNUOORK7Dfk=ZBXNv^{msl>B78H@h0fXPMlMe%ODFOIT%D!m2!LeZjTF)60 z0H30LBLjo}lQ55bqV~OD_l^MHt1QLUj6h0(t1QA&2LZWT_D1?Fege|IQ;pA?0D(f6 z{xyti7C@&PgbabERIsZ*jOAI~yn%&n$-e!<157EPzr=dAM!8-g&K9WZ8kGgq$@X9A z>ry|u06+kmMOfg`OaObv6I%g*Hx2{f1OQ+d==1@A5_2c8ySTbSrh~AHt1B#YS>Lv` z5=vw5cV8p3uPM|@YyowRN#tKo=FoXdIKWT+JBoZZKjN)?myk_kfq8zJlP=iPEkW$w zgL%G2v0i~C8S1J=Q3m}h9c@yNTO0r&jS|(yJQqZI`uhNYB=F9RIc*s;^G+BE0F2V^ zL_oW{6#(dtLk$z=5CAYv5%?j5&0;N{!jRSr=SayFaW>@$g zc*`EE+db6*v2y~RflmN*d_wzfN#4(zDdpJqgQU!uSkvRwa~XJ{i+V<)j<={ zKX6qYWx0szfELi+cI06;<`>!{(c$kG%v>R*f*#WR)cGv^d6dNd{U z%=5^cai1wC>x$W1>Hc0l+@r3Q&Y%DO13WgpVsvAInCf{jtssw65Edju& zDn*@X-&kbI3;T#aS9@!-yAOb6q6}TK_o{xjA6DwQ`2H;iZ`OGKVU6r+jx?s0xZ|RM z&;#~GQ*V7w8~NNx77lLzLgIg)y8T~c{P8IE4;23^3k}3CY83iAG7cQLO)e0vcOsXP zBtnwJ$XD*7GIbrQQe7t@YVf8(W5_!Q@bUirX&n4b4kE9<{ZB~J%)hOO{l^n21ccyN zt<=K)I*^xS^yx>@%QeBNBsN$_p<^3e)G>?p{e-z62Abz zWn1D`8!#n)0oc;Pwk)jH+paK~QaYF;$zoKc0r^quD}Y|TGtHc4^hPto3MXutUqFEm zP3d3&UP#hTjv~6VnCVzi3o%S))BoTgC&~%uM(gMg>2eB`!(sj zy1s$n0`p7(HsDzzw0RJWUFfxdEi9z;H!v2;ZziXpaaTzQl7h``* zpyAXkBa1A-a;8eNU(FbnniY;aU^YnrQC2>~SUQ6R#r2JkoPie8z^`^OfD2M{Sop#u zxfzC77Ty57Xz>0{Ur2;OQVGue$sZR&gSJ|Y>$M7WxF9~YdX{;1T@R$}e#@m0;GARi zaix;&dTd}o;6~O(4M+kBj+im5?hOM~&2rixDd{C$PPv7SnG^*}ndvmq`zySOQ zC;(tD_>WQ#Eb9Sf0{|d842ytlDnzsE&i26d4ge4a(8oDQaD9gWfRr*c`9~zP47V@8 z*6!~Hcy{+q1w9W1fiJb>;>Ft^SQWg@-l2l-Q*>TZ;D1y5O@Z$>?_L7{?(SY=s(fw$ zh%xpqsSM=jVBZ}7?eG5avdb}Ef)8Wuhi-o&0OU)wKa~N0$oETTMsfH5_~XB--x`)d z^(fGc1*zUHYyw{QZ5Yq9i%+QiP2nsk(RxfAvK{Xlz`%A8vfAJH`_V6UwzkE7aR3&; zLjbXlE1T^e9{|7I{%pQz7d-20CiTK48@tx`g1rZWNq>0FrH(_li=Bkt?w{!GvzJ(8 z?E<&0F+$bIKZ#E*R(cHkW4@uES)8)0BqRu={uY^jv&{kkpexnG&;7bxcjF9k+5#>% z0RVw65K0Q(4*&!ds7o}e#Hx@gM>Su9@HGe_8W=|qg@BKsPeYqD=t~mxp{R=9WM^3x zkX+}{^f%nZ00~virEJdwGzK9AO;dvC^HYE|Z6`QyK)p*0JDq5_s=B}^5>33Ye)kT% zECB-KRbxpT`o;xKBT&1g+=3=wKJ~BnL*Bn|)*O}>bw`IQtDv&RBK7-qF&ns7i6Vh; zeXZ&SmG0yDVva9gy+Afkk?O^nTwi0VJDwV*K%>&VAOM8THR{-z6E8HePjk&xr3wLn zfH8_FiV(-aJ>&f0mLUd+_e>H5F~7dk4{lJQnF1eH>e=}FFEt2h@bRGrWuliU(8w6D z*-pS{(L?002QXRr7U-MW{u8$E#dpq3jBp7)>}!A9@t=L1a!>oA4~D$OJLCeGn#-aA zD7@0bQc4u%z`XQe@@azy4FGWU&@Kv~PW3GSsCb2hnRi$M5Dp@NvQTqSDJ4W*qN)m8 zz4HG4Ztv6hO%5jp0BB?r5YXh94FGVlSb_qePR^@$yaITGY9Sb!k{g{6a=nj=n`E%O`cvVW$`Z&*4Q z*uBi}CcR-v;!S#+M?Hv^1R@1QBfx78Ca*w=|1xegZF&?117SkF1pjUTKgu)o6hC(8k|ck=1WjYFv}L8gdoe7XAht&ofjI!KX(BC5`5UlzI$vi(A-Kf z?%4j-(VPeNjSn6>$Cm5$DKm<=dKL+AJy(C~8+Ph`&@HU+|cP#O=xhDqY}ok^Kk`x2d`o7Dfbg&s z!7+Dtukr5v_Jrea^6QmTlwbsaZ(jYwX-Y8m=sJ0V!8AW}aQ_l~*w_Bx{B$G(NT2O) zgZ}sM=gNZe=G|-D-Kp=wuMLcR93T4i41wSd4{G1d{<(da%@=s_;&+=t;YNOC@ytWp zx6FlocKYI7Ck7>-8x%byrdu^?5x#W#-Q;Kto2~%>l62l-MYehdzR3Ho}y0v8hRfBp%@jqj1i-rR@5A|Q^Zozg$(2180N&g`_U;FO`05(7=Pxx=pU!zg0X37E z0tGT%p4aH(LHSi)^hHbMx-#({yBXxa_)HMCHQa< z`#tyY$w0yz+jO%YxS*}&C z$+^}ae**}fRGxqNHR3q&h)MeHzLvy|pj@l*B}4L)P*((U}=F}k_#lb0SSP9Ljb_3vQ>}l z{S$Su#{Gx4HC2^2*@P`dC>R6vlw;JSYX{Ioy1VwU$D+uI>$U)s`Amf!2Cu{$g^y5 zvH(3WJxG7<0Qn{OFxCDfA0{S<4^9_;2|i4;-|NFz5JdPaotifM5`5TVU-H_nws-IG ztCV4xDS*;)7U5>0S#yJc84V&oB#t@=D;LaGI{-145ztKNcvV?YAOOS;cuo=po-+e$ z0XXbu5&{7A*yLmfNX4D@2--_2y?~G+-t&Qk9smsim=A4m*O+yKqkW*hx~@I6mtTSw zh@A7MtnFI~*)kN$0bk%xLX7VQ>=%}Vl^R%RM?Qf*8Jv4(lI}3k$-v(}Y3eGtmbG`i zSdw_hd!>6FuwvWS%$}R)caMLNJ^iK2J?HB+iXumx%<=K#1E?Mp30ZshW*_)3WbWg2 z%MK_x57TB&>7Nz===Omr{mV6j26e;q0|3A_A=zKPaSQ;k(SSd*C`I(J7AVJBaGw<6 z`DuRw0HBZ*S5Lp_v@?D!HIrl=unn5NFy|XyzmOr@i2ID2{tlmGSI68by|WV#n?~b< zGS$uNyvf)5+)pNs9|#~=R{s{=6MeQGlFK0H*Z z+Nr?kZT2t0hh4shQ;uC^3p~Ajg+;bFIWQTR9``(y4_oEe8u#4Ohq1D2%(1HYAOO(( z4FG7G4g+8)HXOzql&g2je4HUp<~CpF0sxIj!PVS!3jol>Ff0=wi!2z=3006Y@-Rn*P5DATc!%VZKHdXGOU&|8cUnldY2mymV zZQKo%#vX`I@W#8B-1i9~1f18CK!4`hG{9D2$X#^XNXN+T9~<1S1U}{xkTve^3oybJ zC@|B{!KU~5xq-?P#{N^8(#}o1a0xz4wLiv(p|O6~S%3Sn$R94jhq3m36~E%R=dM0X z8M8WV%5@0=;jsq-mjDplB!>y`8316X1h9n7L3GBtI>%CLfL|Q7^L>|?gX!lOfL zBm@F-!NDj)oX$}Tg)Ng(0+ga@2J&i0m(9=24}bgbhyVrLBb6$HOAXK|q2P@~oau+6 z79g}8d{HVr0H0_CSj$@i>gWWZ^lF`e!=$Fi@q)`%CjcU)sxqO$xq=G?wvrN(E3lxH z5(GrC_ZVOyRTHg-61}pq1t=;o7%W}5xr&D5kI@AvBLG+aa4A4_+Yl9O0DM6Eg6NZQ zqT)$kCUpS#x3iE0vzQ^e(h1fINRt@6ZcJ_&aU7$rYtUa=b z9}>l$5AJb8iGa`t0F!+%_mL1%`7m-q+2>E^KG>EtG(Mp{zd;|2zXov8b5FSEZ=Qz^ z=x)G=&OL6vN9H&B&t(jC{Wjp=U=TXc(+PwR1VPR96heYVv3-V@^BC8Q8Ki6g#JI^K z+*}1KY()$FBT(O-I86XyK9hc*_q|qy4$_%{uzB|~9fUMsdY4@ zGz0=5U@J_6hPVcM386q|W_wur#GDUzR;Nk;QIvGr0n!WVy5|v=6E;9KwNjT@FjM5d ztNMU!`T}_Rg21c+-%+3~`y~OY0dxWqlIwSvvB4tiLx=ZQwm>#B(lOVm1-{9Cuw$RU zTHNxx5siU3?w+pswoXtv(7Vxxz~5bc@V@P?ZW?V( z(2WX;djZuN5OsIIGv2iO%(uVK=czvQwcjwt+0}>6@gsuLd9lKLeueq`&mA^hGk+$; zjNiIJx=!NWyiBM$*6h%8Ve{@VKInHYO;W7akAp1q=Kqb13f3pB+xp)RR3=i6U_3M< zlCDexI@m8q|K33W#OCAn^}#*<96q=$>+kL#N55aqT%=t}CaP-dC1HIup zs1q9)@*$X?h5Jb){q~^@Cf3Hc9rD4vH-};l+gL@c4?Xi)kJTfXr&};3jR3I$Ile5*K@sIVU_<2viTCEOAdXk%BQt>M_D zIXHN)41~5jK8<+Cjg5~EEwBxbYeGQYh(#!4eCT5o4E2kqhJXV!F^fq@mg2K*2j(Mv zOzBeqk710~`XKs`u|5b1U_&m(NEE3#&;}r&BAQTtr;A$+0vtCpmV)bQQIQ=_jS<5J zD0{~Lp>Pgx&LBmNiWeXxLP8tFajZtt1YSOi0APKwF6Vs^#==y#`RcFd^5Zr^-A|81%xa?oadSVKJyL%>bmk+ zbG!;Gqf)!KoSv;DR5KX>JXr9A>?q5XOnCLuwlcu!THXaoYxp1g!>Kd`M!)MiwM56NA)3` zLj>ap`>nTF1wZ~15;b^luE2*OnVN43%dOj3FdhF*u=@0TVQk)Qs}Hu>z*uNgesM=; zG%yGcn}eSgC>ar_-P>khyi&z+Xe5>rE$T*p~jh&5J;jJm3}^x zD260JBN{tq5mKV6)OaCD+J!f<9<#V}C1LPw`qpeVB>;Dp?K+8+Qa=B~Gh6ml-suNj zmp%0WfDwVHHACPLOR2iY59znQK2#8## z&H=vAWsq0G0{)Cx0N`8!0L5CZY7_bx3ko$p99gGf+dHPtYpB zV`9=Pw9%f53+U{hh<}c3AVWUfCToBYT&E1z83Cm+cq3q@ww%{sQKS~VXmFk>b#FdR zya|}voS+b;tP9+80(#~f+6Rs@pg76`N@ZuDEtCVDW4zza4+#m`@OFi>6RcDqG6`yNm~GjblF}TQVm!Tffi6_gi+!F)k1c*&};|@Bo?q47A%In5!`KIDd2X$ z9^!v{VhLR zSx4W8KE3@cQA2+3W_w)V=h!}M_hZP1Z@>Lh3lzk_TzCkW8^|fj3yz(y>@vSTS((Ki z8^>Y~adjVyz2g`@ynCw{TFp0U2q^9Ty$viKf~!NFM$Gm+e?YNb4LqOYpa0FWUC*vS z7~-!t>{^ylp3AQFhxLD~>v*?L;4j;+MVt9x9Id zna6U&cE*;=0O+#tG0aL12*f?+F zGA(nxwrv*A(8#_D?V>f^FD#mMnBZD_H7rA$K1ap~WV6OBO>L4g1OxJ(g`BpO>p)50 zu#yCgVs$Ntz|y<{NV}NRuLvx`bO~T%uBl5;6yG{W001BWNklRLN}XqXM`3U9E{r1P39ol};i8NXd~V0i%u1 zvuRacRT6V9Lx4eZZ@HotTl*gQpgj#jGWRtXUV}I&0c}eEx;mnOT!pb9KE!M92qBe? z`$vwCYv6t@Ae$U_4>cmD?t@6@iw74`0^PCZ*!ag5@U+|hR4mh*{MhJ&3yd2ZLqpHE zU`wBDUCcTnE*JW7a341LG0}&iSdB+GaU!PWzS!9*nU;tA*u@7L#l7ROQ?V_(c0c7< zt^oqN?1AS82acB{jk_g)iJ$umCH$^HI%7Ji#&28*+jo+yd?Jm4Z|DJp>#9w~>K=Jn zsMQ_-sw&@f*so5WKK}yQ{MzQ3jmRKBCxozL5mBrE4Fh1I7h4(~F=ZYA5C9rok%|C_ z;uP06x1f|la1J3kn!1LN0)lf;NYmWO5% z{NZo^j{*R`_~UI`_Vm5#1Phwd06WPgREgZfl~Of20eEF(0e~gM>NNU|P5{0MUq6Il%T0OqL?9J5k9VR01~rVf~Iaid<}Q_kE8^fU4b@h`vO|8 zSD+M#8M8M<630lA2=70r7usSzN9BO#>Y&^po!^4hACbf{R+{oMj$%6w(}3|V zP3LUBKs?ivcS3OWc9SWn`}`g9 zd#GKo-7+ao@nc^fHu$lZ54#3XJF9P6^!m{#xhMEB*@r29jPRkU^34E*3kzib*MEGW zx2gZU;C&x^VqZeUEm_Me9}LJ6kGX*NF|T#>b`#=#?0;T4Tm8RVLe}UaQvG({X;K2< zKvk}-FX?>l*%1zNZ{K;-h@oXY1c(Mo8il;@--q^`r1ziO!dp=&gj8TY-Ow`0nRD%7 z6K?&KEh`?>H8O!_(_}VZ_MTT;Dp-2kfWH29jx(S!-NuyYl?IU4VU?2r>8^f~K?jAl zC`f0Ubb@yl*k;(EWE9E zz`8UHEe5a`BT5!tn?3*_frNnQNyzz$;cWmw(;r@-ehUC_tZYl^x&T1J63|qQ<3d1R zAJbo`C-jX56zqhW)p%;+yLxz!Cr_`jym_Wr{&XL2`o0g!h5+W|V*)>>`Y_3lsXn-J zq@cEY%%OtXyZABMhY5ZR2IfZe$P;4g?k+<;MjAr`@Xh0vKof->U0f4rhey4c=KmZ_ZKbhpAITr#TPM2E&fVQ!gh!LbQ@k#}| z3pWV?8Z(F1FTg0Cd1}o3o&>sGAw53~psXz!EA=^v&M}bzggJvv-;^yK*6V`cjdwuE zP-qzI%sB|&*kza!1iW&9nxtJoYmd>@IAn05VKh$?^zu+zMnnUM6EZmeBDl3e z_Jl3HYv#g!AH+%Gw->delAtLI5a$G=%m+C1f&M(VHhiNyEP+m2^JfV71N^xMje=6d zP5W#B0Pl&fDcc0^A8UMANqk%hNLk_i#|lebC5N)@Ij%zjm^%xACXQbRi6BNCyVb_f z?3zfX@Js z4ggRJ-pNCm!3CoXagt(jt%$@Z0K%9Z>otPw>UHhdwyxE9Y_)pO`8^57)L6Y~Dj-;F zBe?MLj!nZsS>)v*`9L7#%Nym%&-d+^&jJ9SKT)f##e#NN)S67Q}*X&txjMw ziyQ#Z`K{GC>?;syAgu8<)>P$2PaMZ+gg{xtm|%yoN1bP z)~pdlkyjcxo295~4oV5iy2f&@278sh(ULgA!`esgrVh1wS=Zig0JvIYcwFW7d=~S$ z*4cvM3}DVk?C7ZL+WWn)PPboAsdIL<#FM8_K?nio0@?Bkv#TX~^4F0qUFR$C!lnWIrYZ2Db$! zH%<(83{>~||EUG4rv&XOjYb7$|LZ@#z@fl@K)d>~btQp|~Hx7jSUtnyZr&Rf0OOvu}JCn z?!klC&aq>I=tpG(IfNg94`coC7UXT|lQH(k&d*ho1G91L;Kwd(i2w4}{|4Z2pyhp! zJ)~TMAE)-=Q1%wt0^fY|Cx7F>xACM*&pY^G#$;pUlEBM5`7z+bK7Q;2q8>c%2=UO3 zW5=<6Twsh^G|g*u_t+-C2cZ$-#Vyd30Pz8UVad3$066zY7T51o&&}3dF7`^`ALHVA=o7 zaUHffV^7C8!X&RJTF2&+!vx^9x8T&%N#Io^G3RIjf<)ga9SPc--!!=Qy<^eIKX>qZZd{mzd-cyaO1uME@H_mTg-m}@ zoOJs+0R8p(YIS(`I_cPBarZlCbiH|>l!c zl=*{GL4dS5K~>61RYsE%QgYOlzK&XVS#7UY`YDS604i~pF(@&4R7$D+yVjt|Oyh`} zkUWhsu%KF&yNDu9XL$1BWxL>@HhDg(@^_R1!J-QS(vIJPdr1KS8-M^GKfHqw{Qqa~ zO`9#rk?gR8Snm3kTxxB0PxnwW9GQ_O$&6+k{r}H2$!O9CQJmq-a9Y({WoG5ee0PZj z&<8Bx02~O!efMQ$br;O4^4$o)aRRZx;eOzb+uN7!d~X70G);?P^s&lO;^FaM-0yE+ z{R(0EKmO1Eg3K3Im)M1Uo$?%Vmzv_MQGW#18~viL+6F&-&@aZ$9P62I=&NSBQJskx zQ#X}I{sVx%A91ta=n$iaiTGFVb%dtw@lRN{EpB$x1oH84#LZs+zJVsZty+DXx_&^{ z4TcD3`Zo_LmD#o}ZuVQe`C$rkYD;d^FF7}N7cY@%iF~(r6PaPX*CJ%>|RWs`y#4_X zgI^*249?;Rb(;hR4~H$$VkkWxcJa70l1G+wktlOYG_c$d%|`vGJS#_ZA1=Wm898jZ zBKa>O?vekyezJ0(kNn5UlkDvet|_4?CV2Hki*RGGpQzWqahdC^f&tWOV|+{`w@=^VAX0o z_b+|}0O-1j_^A!=wZ1Ri^oIFwBNJuQq;3)oP@DUs$6H4u?D~^)ICR~B{jN%G;NXY^ zltiDLvjaVk>ZFz9eGXpzFrxA}^r%-Wf9E)O!&lX`8Z(2#!yW0wLsb7#9MjxR#*8tl zQyfwM2^~%A6D9>??uU~%c$bX(LzgqFeX{nw3BXD`@L_-#cihFL! z8k?@089Wj`=^(kWC*!Da-=d(N`!=LD3Ys#QG%%$&y!BlmGyERuzZ0_DdH?$w+9|A57%{&8HCuxA=_3K~Y&71GMXa8~nvnp;k*T*%YaDEQo ztWS;MTKzp9AMrna``_^T^)ImB?wy^Av(tt82(@e2%@ESrW_(*$sh!dz4===im z?f`jrLLAb!$K*)NPOkaB&5|CM5O;&NDZ6Q;Z*irRK+M@Z3voo>R%#1Q;jn9i00(E2 z^`4XPx!~-tsq2?LYd7Ue_zcMI7}>{ITP%lzvq=Xys;2ek3EM`=A&La2kDClnv^3n$6}&1V0waBZsKiF_7cWZU{AFhwW%fVAfSZGwq3ZPrB|k|Mog$#^0_ zR!=g8@Ckzg0BWlj8O&nR{woNbRg8AiOm(Ac5#*S`(X=a!)Zr}P42I5TRr|uK#wYyA zvG-VSVT8Z6i>z(y`)QH~doKk)b{40GEzq{>sg0=+I(ZLwiD~?5gsPy`%3Lo9FDnw7Zyj@*5NQ|Sd)dp!4><>PvNk#vN)`d zmFYiK*dPy~A2P8Xi{|6NhPMdE%$z@S5q=+;`6^k0H6Dv&#x`U(o?JB>UcrWEYp0Y_ z!P_L@^v=L8JA=dNHRRY_Ae1Q0xAbwaHd$t!;Eog9t2ahQH&2myqo|4Gyhkb~-xvEm ziQeM^9Q(V;?y}th_wb|R9ZevtA0@T0nd>d_&!z&F0Ghzhvfk?JXj}ij_WhvesfAgU z__CDAWal_b__KP0G<-ASQ!r6 zMt^$zsQFhb6D_(~ue~UMfYz6U5(qP12>_!xR*4#S_pc!W{c3k}0|B7x&RAiM_dmSB zIO?Ex6%#F)D-EEdv)NRtVWc)3$&R>3=_350*L7(WH=Tl2U-Xv9oX(LK+Q_vL1*_d_ zCli2^JK=e7G66WOoJk?Rg3CV+uT5mfkB=Owa7v|XNrlLe3fG2I=&s4gyfGuNMCN9@#&~>( zZ(hE{YOO!I?RtZi`MAy*&0_;I;(D|#HR6^MlNjfKH7q0zRC7j=5C`XYd;$)Kr4WZ{ zz>jmJxWFmU6h~DB3R2h?V>C+<%W`e(@v0Kq!HmF&$SEZ=GOvXL1WQTy>UyfH$g&5GzMuz@*SUDZO6;2Y_eB5mqFQHS=xIM!xAi7IdLT-oLDYH^3C_ z%;Vm%nQxQ~pNHHIvH-`kk^gKJj$|0g{j}u27_9e4wmuhak50qXymvAAkAr7UPAY1K z{HNl3L{Ems)+dwyip!5f{+la(u*)fTSzPoz0FZs>?b7$ie>2`gr39o9cH(~zKI4F%h%uF%P)WF;jrcL zI7LwvGhR_OTC#8z9kb4R=V+bsyaNEffBPLyr>E_FT}Ctv6oo66WrUyW;#f|aneSf- zfj|A}w^3BuDdMd;&ZX8Py1{NYZ5p)Cfe?+UHv*k~_Cvi;|8{zjjYQ%co^}qO40R$f zvbpE&=&#p(9NmN^gTtml9y?87_P$Z}-xT4aWMiEZHt(2>PTB9;QXHK8IUJeu$%qG4 zf=o^2%=MpeAkk;dmTM4)ZApD!=K8ocaqhW^%%2NU`kFY7$4C6ukN_Q-IjqFYk(4}K z9BD)L`uPv+7tVp`x=U;%VBP~M2hYYZ8+|yuF5(0X>n_D%$A-mWyDUgE7dhQ8$hJap z(9Pq~wPi|FCuQ4_#Kx0~0-4xAU82X$;c)gY4u_qC62xkHj@q=GoCLw$oeN~J8+bhX zU378rddb?s!8m3clT`!xxyRWmQ_%uR5mn9l73cI?QPoqVK;Q5b6osm8Fq&v3qG^i! znBC($_jkL!Eow845(l%RwjYj=QexFe9UagVIriRmI#mn69I?bX!bywP@{>0T-TRoi&iSqpManC26URS4+xf2IPLYPfD% zyfWXRSNGHLhes{z-NzF?Jl6Pl9(_AXCQWI|b`%AIu-_++>=%%CsGZ0o8x6ttJn#*M zq#`PdmaGqy&KcaM1y08f^&vTABP6?x1y8{dUlex&}* zmX)fiJ>p*xsm)BzqqRSc30s69*nf&Cgr$NUZ5A$IFxT6N8Vb|(k8%q55SA*~m?B5% zvS?McmSgKkDJR{?kO1#qzQRZ_(3HTo91l8xT;J(u`u6UnyM;8m^vcV-CN4}f;H zh5+#Di*LNU|Ng_jxWBvpj8(fvScFna{rVT*m`XiXCM5EwO!;c%rexalRwl)IiOgXb z@bGwWKFwr?ION`tpM_EpZ zD!IPWx&_9rPZBOVgXK9wH3Q32=mF{H;o4!6!?HA7a}kyV4u_?LAdn)lF_^BJN-u|H z21gc4?)x&=PYG5Ai$0xk)Xm|@l>hi^de4=clWCzOqVXIncyXk+C@z}kHSy-Vw#^c| z#=i5EaAD?XC(a`mPE0i=0BPnV6|l$bpY3Kd5dr{Ijh|B2rT~ty@gzyx-Y0%hn98f~ zwTB7eOit9+SZNLo!w~5TRE|?Z6J$djby$zZ>D*y|v-7Zw7qOR0Hp+ksL^coF>5pyqJ~sA_$MNpw<<5T@QZoUqz#@%o#8qwAE+sbpSycz?uhw?{WrczFLdf)f(?QiVPP zcD-wY3%YbVlmsZ{=-PC~`1kVFJ?>uIqp4NW@s^u6irX-HRkWKlJidU~ki=1dC50m^ zHzzY7#+9bKOJVRUr02(6$~z864$E_--pgUR2*(A6<)vxwJj_308o(S59ewZ*05mZf zm~@Shc+C+(awHL<=y6&>MfFlLE-%EH7hG4$gZzBN8?gw-^|6$b9OHgd*q;{*fBgcx z-7S9gtAFR!ElTONz~F96Dgu=4@4N5*0guPWnR|6zg6UjIW4S(#?e3Q7X~zC%2+L0y zlV#8T^Nw#hmh|`S)8e35d>ot24!iXpqG_kKLLr%$BX_#qT&ksNwyshVyWOov;sw%a z`t+ehB+Re`?>I2&22lx)Uo~wZX`8Hj4I6B(pHjPH0oD))i{&}&(hOD(%UqjJZG&AT zzqIZ%+NIB@vvz9tC+{;>l&MC#=|B19+0C+C+uISTf>CG_q?f5U=-3F6ABP@ zrGHoEcT-23h#dq&sth+qh9t3OwT6@u6{h>vkhH({d8NgJEhd|c8!;gRGNu4ViQaA; z6MzbENIBWGEAoFOtSy5|6y|;OWhg15XV8~P?B7DC;sbz>Cw+bI4?X_yA#EcWNt7kl zKf;wca$%-T7`%hSQjCLzj34qXKtKRTgdJ?oDv=vf#nHh6@-;gs}Ot@RC*=O5e)e>~}W zjd^*xL89s7MV);-4u(+CG!^!nH3maS_;}Fid_w}>nOqk~ssn%zCW_#?Z9N$_MR18s zD(@*WH~T$a?Y7u#_K-?qz2Bp%YMr`w#$d!Pv?B+Y?0F?2!8|WfBucR4aLi(;0^F)8_vE4c`a_LQ(u1!dY18TFeW%+0xSRb4xBUuh9SMBgPZ zI!W+-d-wJO_O~z4b-?K?aXNp{)vB6A=9`L(_}3Z3VXz1SG|8`Kc0GkgY+H_x57_QD z_~NT?uv!Pk4Z5Rum?A9ajDU6*woN%PMWbL!!r+uM8hg=Ha&je2&rsmhBgViSM$cGl z=gyMrlLI?45c!u|K)YW001BWNklibp24kuU70HjE?^&M_nkyi2EOBM+E=ZFJ83*znhT zeX^+)#NTUA7YzEm6wC4OA&El?O&X;n;1J7FLNQ-*&y%4;Jb}E*MJ@d?h`c!*C0K+4 z&c_38ZeF=)vou1oS4xO&p&k(YrV(Ot^BaxKOe54J$#zDMVu`$gUa-VT97c$yHqI;- zAdAKQEXlqQlFUNlUkL$mhNzZvmWEg--DQaSyJWM;Vl0f^n8Q-icMgX;#@VR?5~!!c z&ZX%K(qHBXFkf=>Gd7(yN!CKi8{Mhus zwtq7Q!+1tjZP_}sxG2LeLNz%Tl0cfq5e$_alW|=XG$~mriLpERL_cQT%$5H5QMYRw zwC!fDI*%dxZ6-wyc;*x>63~%T$ox9B4SUt&$&vs`RfQ>2hEm3MCKNxTL>L7juL-wl zQU#lM0YDCeYwV|>^*a#&1V-Nm3ZNF1Cv&t!1ZBr1M20CqVx)^q*KUVG0jNe}_mV=V zmy^6zN(jJ`=EF_2QYwG5Y15!?R^ENE_S)&vjgD!^rM6E?r;z5ws4Ssj?4y*~b+y83 zck7P1sDiG}mJY=3egV0#X4d z*b?Xm&1!4X5Arq#8rgQ%pOL`ArUzyG6*(*-&_y_(D`#t?bC$JbEDnAFV%w90A90Z- zbH%!)O*L#Wg_+8tQUzH*NIzkOxSU=ZMu!V+B}sxO)ina&pgWg}nw-Gm{SI^sAn-48 zwnoqHmcWuIzCSqFOuHn4ae!qh4i5{#;jP8Vvz*j_!~VSvtWT0}Lrdt>Eoqaozp+^C z@sxd+v0vA#75{Ba;0Uo)6|ldV0MtM$zpi6TxHGoR@zg^~;C$|IJ`IqKL>p!$3NwK+ zz79Hf_-exOyds{-^pxy`NxFN(KI#oW?Z(nH;__ccXN}UD8i^;7esLg zWoCDRy2EkU-KR#Bu!@`rdn;2aj(Pl~V@VxixJ1eSctmqc1t zcQ7=bX+sVrE-6S#!y^JJuZ}@u{*|yPZM8hFW1q+u98=0zi6j7<26O@W574ChFy--c zlKw{ps<*|s|LWpRBQWkAWX2&r9kD!Y?z z2>N7&-?vMMc|756>W3@O^RD^V1<-5bu~;16fB#!ZIpE9JIzr~Xa!5e7#nGc~^Mm+3Fp z#$18ku1dqQ}d zBkxlz6o0ki1H+VHp*ZyEc`P0dT{*_W_-D9l;?mSR9Vu)}u@JI*mH-u8JGDhch4H~! zKlWS-<032}rUh8srnC?XH`Xb;F;^!zpR)}O-O;O46xlfS9Aq%KpBekxEEf8FB;;rP zgF)R~WY1ahq5XEv*{|W-4?I2G_&2?K&yYjeF(bZF zK?#9stM#XTxG%n}2B0Zl-=Q|q-nxEpk>CJLK3jGEORv-L+GEN^+Y4m^Ky4z*O%eH; zq)dB0C6i(eqt;oHTpFvsafdUnFj>N%jf?>3h=1m+FOx8bcO)h7!K4Fj$wF-|>QYIe zk^1boUqUK;@#-a3n=Q_L4*`MQ-3{cZu-We~3pX4XjYZRXh9^hNA~N&|zI}4%1V@VD zCPm`tjCQslFt`NrQdkh;nZv?3U9W+~6@tYn)CuLJD9mm`nJ6)4(zYxX=9-=xi>KT# z#p3$Qldz%)fD4MfmySLakk-QJlcth^k}+of$XFbn3vd9_4v}m++V3PP~6BO;W762cMUgi>aQs&GS2iHeiqlJ3C`I`tI#@UoPXt%&%u_wLtDbf}j!<&Q8aHzfRI}X!3aGL7 zPq0@MpRFp#!glB8$bYV8y`1O=fJ7Hi{_jj1)thf_BIR(dq@oH6Av_}n{gw_=;Qr++ z0Kj(LW4qo%iHfu}iybota+nWAZwZpZrF%0ZMkN8f1Ra5~AMtnqR_%zJ{WqxF4aO1p z_(ALKI09`q?yea&Q;`z5aN7=aVRFyA#03kOMVR_{2!16kff)o35nm+|K$``Z|_Smm<^C z^+TlV4pEzM?v5f8Ul|KW=JeVGSnAaZvyq8uUj@XxWS<4j;1m{aH~&?!*!Mhx#ToGk zmT*3aBB$q!z6nRlpWgf)r_)Cq4l(KXGNMZSeQbEoMPM++Iuxk=CUWxSh)?D?CHc;${!L#CEtif@X{5}YeAWSObt3L0Q&Nuf zu0!CNpJn9|*>B(e9zrR6@zt-q4H#_HVp>A7JK(Rux#)e7;}70k6-KQ{ zVnN=%;GE&6?!f6i90{Lb@amCk;?lf@dKR_&(hbr8CW0W*w>~8n-35=O$o4G#Hpw*U zR9?=;m9Q}urJG}HYAL&Xq{n3(>TJ~Q&^C1qEc7`|*rg{j3O&Va>@jUNYcrpr!C}<` zVhcG6eEjgc8zKu)1Bd(cu9A!vJaL*e0W2FDMECFNTz9k!=g9S znoYWLgjnrRw<`>fKa}-D*Pdvd4NGH?Q+jk#B!FQ!LiPiMm>l{f+uS7I{~2@+o&=aE z5_a`H{f^K%VZPKXSuN2fhtHRnv33O@y{?it(&r)~8+%>BwR89r`T}cZ%#2+b2{4T< zRqS5x90@RsBXv)cNceim@hu5eY3f=#qryZ2%=!1iHLTP3O=c@E_(&M!!xS&TLxM!- z=`>;AGk#Rvhnjr43>KD5n6Vj9(jvQIDKq!Fzcb`Tw^=pR(HQ%|92Sb_*|6Bdq3@Ez z5(e3!bFi_oNJ}nb=20Rj1e@%W_Dkilx_j)B2OwJf zS)~63v`!nQ@YRKx%!A0_GT=*zAR=GNI%2bNRjz&oH4Iw5S?G*LcDq_b$`Q5WTF5CH zU{#^2Y8($A(RXG8)7?uCdR^)5AA`_}tJUWvfV21~06;?`U4A&8P#xm;MJT1zw_m=F zh-FDb*6nI8{FynOu%m2u{FgT#whFQMd!)ppBIdcou{r(}5TOPn+r!*eRiM>e%u z$xhx7Pl-~Iz{254V#)RO1T3_#6c!dwL0>rokv*3TA$_Ub!Zu#J6qXV^IYQ(DJly?e z@eoWE!Ilca&JxvT2%%hhwu=b7DH7iTEVK=u4lh48*~mXBEVLAmW|NT!bMNj`jHk>P zmE50_Z)J7O-S1`0beOlp%qQC9Jt)dfx2&M@%F@uC1fBrIjn@ z1V>2Q-+hUysguON;oN%;rKW8{o}?#RjiZ0gD0h|+SJ^ZzhA236ld;(uY{^B0<0qvw z7iSkMy*DoIIdQpP#dIr`GRmoLJN6yqFc@Gy5zNX{<1i5l6+;jsgAom(0)HGZL`c7~ z1R%R0)wu{7dB;?E%5UqiiQu??PEV&Eqij8V+#)~)INkrN8qI3slL%E*6*T%EJw0?M zh+02;(vs?`8dbBJaI)7Wp+x1{Sn?l@Y8OTT6ji1BSJKJwW!kq*=(?hU9E0zCFg76p zFh%a0EAsq^)nee;0z_7;6Vk|+}TeYH^}Yy=4)onDyU z7du8(Uh)LO0zia?!;?#OZ2L}O;qchHC25bdJG&PcrKd+y#gkj&FlVrQe9-S!wbF#x@SAJrJ0Yk} z?td2}QVZ4ND%;+koSdkWK!xw${SGISKJ_VOIRS6drJkdd5q{<|q~%;2|5LDB8&BxD zjLWN6-(bJh`_(P+-OkI_Nk8cVlf2Lf?4H?R?X=t7kve(D%i-{VfBo10SIaND?|$LQ zcgx#9C1PF<&*wlQ&6Ph_vg@ZTuU~$RFTVN}fMxSqHj437S^pEHlv@(TIERNzZ&woa z!WK3XUQm+u!UCIZq{o$zjk)6`eJA9xX=_ty?s87hC4E0-Y&e2ms-H}`#6DaUX*xWA zA)ZfR$3GrUup6KB1}=Z|6J7J{_6^z^kmE2-!^93&t%8g()JB#d2ij}v9^XJz4Vtx1 zy(Iva04VKRa2&k;fEjX?jj&Igy`oy7ZdV>L?)>q4*Z(9pa1K+sqakOsdsLzV+9o2} z2?0j{v}L#3q9U8##&JLeJ2y-ftt=$~FwbkGvm|hGK3f5xZri956*(He8oeg5YJ(OI z4BM45GMw%Z4p3E1DFN+gyb7YVFcElyq4N6{!a0Mdd-r5T{F?w! z2aT*PGj&^ZirY8^FfFUy&N;Ppn^+ikB*w3c5`dENv(p6m<>lCUlKHg0^oJ-KN0Ac7 z9u@}2)b>CBOP}>26!}r@p+pMxOXU^?<4EAirE|YTZqC0JZEP&@orNVcw}jD!S-VVu z@AVpZa*>WxSaNtS!ooZwPs!@X>bj}Ec>!0$Lh)P!%Tw`KlCS6QPLX~K-pffy#!kNE zeasP%3%*&ieP3Y5XYnk+k|I-k&1Y=Y$HN(-u5mt^O-E9q8%8`nJfJr|ul4o?o~v}H zkLZpcoqbc=^R;hGIzpR*o=LSocpOL6MlT%$-;WJ*_2)tWyt~t5?>4ribQ%EdYMZrd zP?e93rU2-I~AA#_B+ z`)_NA+JDxS5U2qB@W*Kre5LlNl)onVr~m$sngICf#hoMN(KNH`mN9ymVx#fVD1nyj z7e=8gm1)a!69B79;M8@Fw8s(srl^1VcvCkxn9!hiHxuFR;iJCRElCU9kAqXR?{4-O zhtX+^Em=&iRxKV6)A${+#TFBT*k0T1ZtJe)-1m6>#TRJTb~l#9?oKZ}H@khLECB_E zuO;L)S_(e89G+R(C5C`p-5Fz%K9zV5ORjTC-2$RzQ7Ga$EHiblVTc3@45N(lxWo|o z6eDd8&l1Dv62~lu$Cir>qx4*fvQ+S_XN{4eycEt$@dbFE)leJsH9?tQFkM9C&DBX@ z;qYABIQk!6Ps&?J{!;*CKmb(qq<74(6dntsxOweJs$fk3jLCz#nmv{vomo*qNkyZ( zx%)D``&t5h_>Q(slKdwW9D&SH^6JWqhF3L>hmR5fX}c-%UeMPV>^|v?(axk5@fIG0 zDCqE1!W|oj9`bCikESFcghFeCrV-+vi~OgrXIf-Eo&3ifCx4$#JqGE2|8oSu)$Sfr z>G9~#TJQ1*fZ^k9#>XD(&nNe+(Fk-L0Wd}W1E%XOApi=q%O~8i&k_KYF~FMLLJ^_w z$^<}R*a0sH0jPmg=%uJ0ZyXTGbOFHj_J3DT&?g)}__XZDcJ? zW#^S((?RwcnByrtSzF}-JWK4Z7E2CKQACkz*>7Ey3vAjYc&=pA&SrBd#lrQqfB>ma z{RP;x6L=2CGlbZ&L_h$zy;-4ZD#+8viO`oL0Gguu9wOnhT1o&M&nN8$svA_yIxa=L zlEYw91S@0j0h)FPAu7Ee)EpOt9VP&rKKv<503637D9ua=pxyaSYfAv6_&5TfkKd36 z=rxRef^c;?39xQkL{~=$awG9OIyda94O>_sY*!HhkO~8UszTim93oh+11teB=+f_7 z2u;Wo^tkt{piK_Xvj^{x1443YNpxQh(@#EN#uM=@2_}-eS5M7)_o)MTO=i>)-#}9@uri^~V5CDmL)gu5x25EptIPPDMpF9EZIm;RXYNY^_XUw9+%L+B5 zAzaqMI>8b%TeIe{y1kSV0+=?27$xNEe|wM3E`Cpx5O^pc02XKhak<%TpT+*Irh(4F+miloDwwwn#aQ|Xi|9mR1-6Jxci+^U>u&DQ*-8dL)A=m>~*HnsA1+g zkS6@GJ(r7`Glz#>XF*!G)HpdjC0KIrTYzWij?uFlDYovr5zA$j;2e$u;vt)g@Tqua zzKPs9j{KLbb5-)+WJvPchvYwd>^kJXY+=#~6TVv{TO`IKOodxQOk>G^srz9uvV;_$ z{6~+uQVGzAMH1Eoro5ImrOb1Z|GcBmO#Wlf2NhPvxSb>8sl?w6^-)Gt6?SIVK_fyz$)NVRg|fb}IeRWVTK47luZ$$i-v?bclyiCUWn7Nud_3T<|N4Ic5ZGG^986K&6e*h=bLp#Q zq6*iWfbd6B`X(J>p|g`-4>P9&g^t1*JYEU#czSdK&r(M>#X|8!V`KZ7v5^%;^9>4D zhjT7pvSA~_lZj&F+AwuOJeO`BnZ-lLI3Qx4PlMaPRkzwMHy+J~p<2tEs4q1p+kx9| zmI4}WthQSOM-oBa64*`$6Fi|EJuK)HMiUJy#xsqD$rHdLsVnWh9L+e_W(d~ahAna&+*oE)uoChg zEfVzkv)*1^R{Iwa0Q%F%WNP71R)3gM3WsFC6h5VtPTPtpg}ku7XVQRfI?Ww(=jhe= zm&VtD0+cAv+Uj3~yEv{ZFO@EnlQ;oSTiuv6eL~hoBoZ;6G}ls zp@J|Qam>6FV2N>?esa&^h3CA&=5@B%C;eU$ik`ors8pzevR@wNCiy)C=N8;ID?5B1 zZT62jVziWs4QLTp^z{rI%)%WHYz~6V-I4D|0}8~)ff_{9PPRA(ONd8DK>B>}Ac3c< zgzwKx=$WCP#-{eAxJKjyT14j8@SGfCe5*BFr=r%88t8#3`rpqbTh361c9bSbYLeje zOwfpn5+i$@7EAb3(7HeD-!ONa$=FAWP>R)e!qNbmKu5`U_V2Fm*|fB)o)``GU!pT< zX>GBDypYg$v)ekE0G!-6?;ilb$*uQa>i!wIA)(L81o#xXb6CS-$$gd#_;@B}?I47}&8yd_*BfkZZow8Af5e^=MZqcyHuP*s zWQP=q#dBbVZEYQUJVR8WA5$kYBtel-ukNEyKjxWXK(786*`6ic#iJPZmPp98mgw{odnmyBmG5Z4v!-L z|McX)#5sB_aM~*BS4(Nv( zZ{NI!s2eX@UY-&eOaK5N07*naR81o;D7(9ABF9l@68)R*aBo)D5Tn~{wptg|>3KCK zO8UFGy?3NPil+{vKPot& zoD}N?c&Mxt9#`kuc!&`^g~$6MQaNNj%i#&zP+WFh_Wk$2!<%=1;M-lPd`?l}ek?3M zk3qU{c$SdEmJ&?o+Xb zc$$U~mr{7ZWAX5?Cnw^iXj;}Lot@W%Qk0f0Wz!>iX3j?b$?#ZA&xmKc({&HWGo&2Q z_ajb6ZFA~Qn#8r1RyYuiEmb;ZHZOxemYErWI#&@k|RV_J0~7jED6v?mtjd^ zYzIuegwsz{HCEdj00Q0P4{-&iP%Iz-#cZ*K zg&Bhhhkwrd8Q=*wicaK4;RGtB98t`UzZ;v0dN$Pw33$f#781==z!cThjKkkJewDrf z-Zcm^{`6T;Y9jH6G`V=V^pVUy*=eW}&zn~`!lVEMbDX2_(PKgZQp9zX5{4LTZ;XK! zGXInWMCH9bmITOM3cX+YZ-5dct@T+D_Mi7ogao#PkFctQBNwsX7_NR$#|9NieVgb8 zI$Oex6Esjmmb93{LwrO}!DBIfN<7^9p8lo*FsvV4H0`|qCM3xf^yU1*7vQ1SpTxtR zFK`a#%C%bD8U$&hDCLqG{*shF8EdbjJuoQKaN0&ko1m2#Kz)DbXnt z{$WbIow8nCK)f}_z2_kyi{>I|hj>Q%tY3h~u90Fd3LO=aJ$jA^Zm^> zdj8LcGo%^m(`m%XZ0box4-_T>pad`l{zyBhe8Slj_3!6$-J(f?-quWQQ!#uGPbLa5DMr|5|tEex?B32%G7_i_*j@im;T z()8NW5XW5G)^2DIr+9J7mEC5I^=^k@7_l)6T_FUvH#b-t1uGk!V9p?h*!gow=vV;7 zJ5=ZTFLJg8Z9S~qxdpN>3G+&eU6^yb>r^;t72u%@{Uz;eTMkE5GKPxrtQBax>yqM# z()TjVc3X!&G0&Z6bw*Gfsoh5-K&Q?_xKF2O@FrN*eL8hB*b45qMc zREHxBCcXjOw}>P67USXizx3N4;K^cQ@cjM1`yx7~g3xu&Y2*>I6mtw12d&6hyT-|- zSdmalU~_-(oyT<6BZzSXJJVAXSq}ux^ix3%gV)c)+uwP0@4x;lM}E?}#Tm3h)zp;l z=3x^`K}wk+y~WY(gs9y)1z-xl4L~U`nwnDDAnbozE3c!lPbo(ak0&3N@TDt^Lyz^% zOLojB47|dq5?(|#p1tup9X@#H*SlM$AH}XgSR1gmlKa1jn6Qjv?|D3rAEpf*r(+MX zewFQ$UcUmM)BvTFCi_)2=~KD%%o71{x)FnUCtM2PLEqQf)a_31&G{7sArJ~Rk@Qj& zJxAW7dYgHU+_Py22SSqWk(sjpimiQ+a5}G>~5CCZeK$-#=qQUJK zzs&B?Q!f3rnQP3uBorY`+GDl3-eJIc-C(t@(RUK(enfvd87aye3w;gd9vUD=Kt6 z4)AGt!#*vhOYm@*D4y3}yu^CD@lyZ?g(cn$gG&!gNrF-iE^^?|Ke`mac70dZjYj}< z*LXfbG*b#-X)sy>pp{LRhok9-K9^0qg%CC5IBhf*0P1E-xK8@n8BRJCSi8N6Qpuj* z{|@v(2_J92+rwt4Rca!+IieJl+q`HAQ*>?XN40YY^)=cv^c8eh7ghJlFr4@euNAMi zIjJ0B64rMrNJU_^+5?rC)SSUm02;^2U zHd%6mDtCQ40^&5vlULkE2Nmtg{C3nxgkvqc=^H2jR5pW~5<2Q>;=1Wr%X4oynY=#v zfB(ta(tO)KQ0Q-Pm*~$Q$q2we8xUd68zvPcqpbU3Gf0u5hibZ=Y8yK zDbQ)T>nX8+mFP}S!9y_>5wr?)r(#Tr`fSAJ0{>p*!_3&G76K!@o z_;_$WsqU<^j|c^H=OdHq7qG;?7VrpwE&|}s>3@IpvPxy@H2;b^(1(L95uyTKem!jf ztB^?n-0uh6zMeWf{-asMv;x~N9;a@<*W|#_MBLleYjpj9`@h-1dNW&+7g?Irx!usC zdISbJK->b2>~Q+f!G6yKDy$adQ@%=3KsOlTqEY<1aloo>H0IvsV%CG!)(!e`!2b3Q z<0$d!wRSY0`W`p8ci0;eL}Y;BqBKwg5)BheS>_3LK8;v_s^LF=z`U_-j`Wl;+(ZuD znF-jteoUCWkjY4V#0zAX;sL-C`Yhqjru3`ZX^g}rvZ-=n?_;0{ak~LUB_Jx{&PkJQ z!Qo*FH>pzMUx+g#7gB}d$wtWllf`3qW^;Hr<0KbpFT}LSC`pe6bzS*)meGZR3M!z$5XSl&sG)BZQ=}2tMbL1~}=80`A z$(N30Zt=rlqJO)nqfM)y*$a)?-gi5v&@ska`geqfw$Cl#7$ww}Ir5)5>K%(B=0%UC z^hjf$g8Ucvqu9E(o?=d_;7~xPON!(|Yfl@7gMAnz>Ywlr#ZnaeXLOJ|r~CKMT$B7K zl-Y}v@{vaO(i~KAlWUOw^l^%nKGaOr%wQ`3a_pRwKvXq9#>|0X=p6BHNeS4ELdB7>kl#T!%7PT?EBV$NuKcWW!bC$$t0Wy?wxX`wDk2 zwbSi<>azEfi>hHuZya)MyJj$HnPD_SDw9ir9JU8y$6yLmPn?z^CN64Y7$MQ(dGYcN zufMoAoiVypa4!}am^gi7krA$o43(UoTx6)sY<4KownyQdd;Qyz$v6?((mDGmYdf~jNx?>7woYc#!Q2>ym?)lPf8n^u z0lV!QQtF5y_b={UdSI(_yC`~A1ktgb?wpCVC#4?*!PcR5>qf7UtZx4C!~5hKfc6>6 z3h{85LOdL%s;VKXEmrFnXj`I#S>jWI2|!XpjQaF%u%q9%KwM6Di9UOXZ^JUiC3* zO{2EA0G43%Jqf4;2~e57coJY>n-Dv*RM|x`<%8NX3D#$QCJwY#@t}98-l6ut*&@M+NKpD)eP$@Bl!6cyNEG zf_*rQO`FyiWIB)qJ5~$ED2J(9ZIkPLnq44@;#}~Z&D&S};2NcRh}Ff|sL~5C%>^J? ziU+`x$B5}5($`phoBCAkIpV`~*Z_D0Tssya-V7!-=umhq93~f?GJfwuQZSdb;v!6} z?b*i@2ujLkvx|iNT!Vy*#9AhShsDIKd!9m6=7@+<-&j6IGPpk}VsN{vP*no!O%1%V zK8e==G&yjP(n~EYhYqKsp4a>CfT24BQ0R{zee7!YY@6QTYoA{BBC|+x3G^ z$@?8JtOuMQ2lT^;oryBh^&?hoqZP254ya-~HH~z=Zre#FfE#S_@o>c15DslLKpXL| z>wDbnbR7Vw@gYjiYh?mDUGNRI_~GMYlwPefi>-FIhl0XxzXwExn>(FScx&={hcD)R z&|kDGmAvesazX35RA;0fyTi00DIY?`EimrT5T|PBF?OB)E&Z^#Ay)c9o=d+*$AV61 zshy`3lXc=$22&I+m|(KRxO%m94|y21juv;_gqRma*CXRquN$bLp9pxp360&B8Pmj^ zazc)YOd2$cyAGoE0U)G6^P66aCHWONo!LpTBsE)bpM4`}fGKCh$|;7Sazgrx3}v}R z1g)1N-UXPl$}VXaz6YMdoWR7UHhT&t@0s-R2;%%?4WS_>8Km3s6sE9S^4%iFU}sb{ z=Ry)9Yq(!Zv`e+gwBs;EA@47gy|f)?c&3=51+G~@l^1fXV$$7@ zL;j1HK}=l^Pf9kIu9g#-BL4;GU_#18G79X%S@IcsE*c}hT!Z|V?3^4gBLA_?FChPU z#V7y8WVyIS-yNXfe-FJby&Dkx{23i&=kh=K{* z_LB=2`7bO~-=doy+-8NUfs)GmZOh^C9=A8zS@O%jdOZoXBx_T`xiMuFwdo+-v8svY zY5imRrbg*KXh|5{Qg~9B(D?1SV&@B&f*~-jy?yh5?fxakQKvxegJ>I}^Q`Bhe^e&Y znJ~KDI5OY~ofem+8hk+-|K$6wvVoBy7b{F{q>6t-< zPn^ImCzAa*n64dtF)urPjn^v6Nq(OOQ(3CuJeKWtkL_051|92$>PFTuWale}Tyr=C z^Rxwr){gr=)X+bDpP6tcFnB2 zz29MdrcTvtB3o@_*Q}bDh_)0H;~-4c2{DBcX|kBOKDfR(8wh77OgRA&&#e)GV9EVT zl>{cvF3mdg6ZVyhF>&)cjQQs{br=uZ$zK{O52z&y*A#8*x9y7k>RuvunL z@AG6pOTwE-fcm?yvm6i-ppov5d1VO+5Ny2&7e@k|D}kZJT2Ckm%)tzPdSX0c;xsdc zgfibaG>wsKZwZsa2vyTD+Alw*y4dkCqpwMTrduU|lE>MCwRXZ3Z;xKLLYh=*ZFM3{ zw@j;>`yMveX@2LB2JO^j-?rnBtZ#m}F(T&_d8Szi-u=X6AI(I~3jI@T&W#F2w7rV_t? z78Ccpb7K_TCz|TmjmZoVcfDI<4Pbw>jn;@ql0ulK7JmHj0Z_ouA9WTiQy$*G&Gz+k z`7}kR5(b7b*7cc!uqC1)eYOgSw zv|X#6{}6AxjU(sLl)X|^sFZ|wL7lz8>48x76d<}9>$b(sZi}v;9#)_5H#nI9P$}u9 z1hy%DU*BuP(wp}WPNqKJW3}7ibnda;?I57A-R~fpHFk#RSMmXwE-qsr;26ib`oX#9 z4mElSCWL=~XK=X`dCY>_%F3l2;Q9;e z&tbA81DA^G+9}Ss`kWE$DQVZ17|U{45)PxQr8&DIrp36P8B^*WJvH4Ka5>>Ohxf<8 z@2sH>3w#FPRUP*4Imz4skf>$`i>EVrUq`doTN&yT2<7rZAl>(}!W^q~UQ(98pDM!+x_BLTxaTZ^Y;&)0BY~%$gd@Gx> zHSELIAN~4LO0WN_B1XnurvSbd`AwKqo{KKqsJ~I|4qB% zr?$t3H?B#&`O>9$RSFnKKT3cc2af=#)bvg9aVmE{gq4D4Q=QNhzzRTRQUFr|U@D!j zJ!XGX@}Jugt*o(Pik6^Lu2hpu(wD|iLx>8}F7WC)nF@Gr*m`bqBYd!gU{&#=( zAEWx0q$<;=KCkp?rI;3_E2H%aZG*}F6Oj@=2TT;#bEi?OswR7%yndb#eHXZXDz&Fz zvXL(8R@*eG?RZL~Y1UVComD{Y8%>?sV4>?Yw;9aXl^@9_m(@nwt9oO5pp+e#e$vgidGSX=9me9+Pg^8dfrpDNl z6&as#h{+wHtnH1qQ&~(Nt^gB@E5Nkg-9~lnIIq_=nx@t%fG6Nuj8t)OfRf^+0IpH5 zZX5wnH0{I(3f9?5j&4m{ISgY&7z`r-((gjuY*AG;#_{Cwjz&4?$aHmsar9FO+q+|Z z60TABXXtYo2b?~B?|$xg`$=x(pV1U6ISz=Y%8-5)V+gSV)11qt0;Z{82lB1CRx04> zu;31&Zd+__{Am0lxbTsXF9m?QY5a(Ij9?lyTmTSN?P08gIh>~SrllesXkMC0*(`uj zNdQywIN5g*pw`ndM09=Do@z^fK0}#zE*w**ZJF^9fiO-L-th*Eyd%oDAPmR_g}lexd?#& z^xywc69E7A-~R&WfQR9L;T$ZC$s&vT`8Wa~Fp=;8;Pw5Ti{Mw^!?UwBBoc!dE3~JT zBluBLpOp!~k^5}KzjNPX-L_tT?RJaf>5T3E7IiJK+Gz!BbHhjQ^U6=aFh_AcXXJol zLSKOl(X@JJ4Iy^g1vf{!bK_wR3UmP-MVlcHRl#n$tijM~_gPHjBWmmALiNvJ5=yhY z-R~gspU4;t)zDAGgbR#wy4t*fj&&3kOhBw-DMOZ9Vl*sDYexFZhPl3?Av0?CRDvy$ zS@fMKz_b+CPmPRBag{t9MGGfd3LNZ~WD770%EI?(5iU~q@Bik7NB-;1kKl@(+IxEs z&F{tG=Do%Mm*whw=T-LO$Cuev( zc!am@{R?M+;)qgqp~9MSIln8c%rdKdL!uicR1?Ek_Y>Ek#gug@p^>Ax&N)5>qxhP-R>n||!?;Y_}( z3Q@`(`@Oapt>M$Q_XwWtEsn<%Oa6nJ96A#LP)&qQI*{PWf8pQm7&%xOmeTp89YR&T zLS>vba|FQnx310+07E0Futd@l0-!Ag1i+BAl_CJDx^{Jk~DY-L(8S`KboPT=|@hbwRy%-@n8D_66*897fjTbm_H;gmLaBnJH%h0MtQhU2ap0 zEv3=^MBR9DI07J_c5IxjW1|Gp2qBLj-r>c|JKWyC(h>j2c>XyX5od8-**K=#eOl7( z5<_C?j^-354%btSn|`#>^!+O_+WlCDL=RVD%#O!L{Pw$l0N^`aFHLi6%hGnAI@Ri5 zN@~}ia=G?+yn6KwzI^?Sf3ScM3?P{*jUK!Bd&ZSZ?KTSv`<+PjpBBPmx(2S#jXYgd zg0*Lb>A+Z=rDVktM}1KDN5eEDGqgvZyBbFm(c)w_fY}Wx>;04lDb$6n9$Zy*q-*X- zJE}VayiRP}A0MYQh&i3Oq;Pt&#T8=WaB1?Ja=5m;4Zi;N+sGvS+4w}{z&{If?YRDf z@96n-hLj4jKTY=f;`F}x(jVTVs$&8mFp;cb38D5_R7*r6N0Jy$+5nmrUpb3D}0c&5)kpL+H5YXQ!TED7WuaBWSv*TWcV@3WR zC#xI)Ky{swVM&MztF>}pxcZC^_EQb?LFSX_*b z8DipaUAp;*<5-k(K$7QvYDD2enTvv=a563(7xJ8ztjCKsadWs9>a>&S1zG+|`wQxv z50k&(aO$V%fe(7E^D{Z{^DN~Az+e9o0PwaC@*XG1f51EeaPyT>3@ypv>#=D{4L#QyFUN&)-Zo7tBrl^zU;UzV#de_f?{V_+^i0Eg>h=SHp&nJyKs zO*^|b1}?#`krepjE&?AgMN9IqX2RrK8D`;37Zz4-d!gaYlJ4d(CDZhIi+Sl`s#j~c zR4+_g81@)Br-)2S0E~=p1xmM9E}VRG#y3x?zZR}SMI~~s24fWx%03%I*M*oUt`bb2 z3fJsdr4|wyMUSobM5CaG;lhQ)(y->27%SQS7+ERo|LJehw^^~#=W^sf zz!Cr_f|`53ZG<~B7LMSy-OiH2E+zi~J^@fE|9J>FYmjopiVy&mQW*PqCqBhC5&X zDS#3HwQaNV`zI-Vr#1-!pwSzA0$>9n#5@6zA@`LK0K>Y&@d0(S!RGE)QJs$uZ_0dO zLjV9E07*naRB-=d4<#k;Ufp@;J}0BsC&!i1Z@RutlK#Bv1(EeQecL)qZQ3ka&!+RD z4#$r_XvYob;LJtQ4%2z%@D8NEFr_bt%VK)*@(!=R(kY{Va)wLl0L|cI$%{X-k&wmp zj0QPQ=Ch2|O!+Yh!KIjJf6r+sq~*W<*Z&+H`EfA_cl8-V3&?;?9%se|b! zKn&(EvA8a@0dcsVg+!gfQ2ZSY?Nhnv(wzJY?^p4>9JVjPL}e_zUzge-Z8@AO$Wb2) z9Z@A4Ot|_z*(}qxF&U;rhb@VUeJQR>Fs(KXUcP#P^(uJw3;YzojDB2Du0_NJ82f9& zACMvdR+XRbn=QkTB@6b4_o%8G&E{6GyT`%z=eP}jW)02U^Hc;ty3Y4w43LL+ZM&wk8Hh8wXy$;;rQW*2kgFeRGo46X3 z>?4fFhX)Vq=6 z%-GHT9D;&;jsaBIcDd(+IrnE3tYjgsrDHXT`NV-i=41u9ekz3FC*k_3l5;-?Tuj}g z4aj!vU8-S94g~NsLGYQ%7vJ9F``__Cp%MaM1HenU3n27f1K_zzwEl;~5w|A%{Hyyr z926gQXmX&W&YpEhd)eAhWIfKj(AoH zvy;v8HA&PtOP+HJTw-`|DGuo6GPrCT5y+s6VJDx+4nK01&{sFDhl66#vMTRidd@}{ zq8OqD5p#{TbFNelX9Z}YLLCqRDX!j<5YrwJC6#+_O9*yex;@U|7q$=2$$?i`!$RLN z=J`&MZF8hn`g})DEZHaVaEcSBpxN)oNWKLQmmN3RqiR}6Ie54nj1<{6^F87myA#|N z#C{-A;GZ-*8=03-IXqfK3*V&j@JU^lvQ#$f@4Z~xxnbhm6ZIa z;wp*?K%WCT_b@w=!ss`4zM@Jos?@wP{mD67BXSxc{{VeJg1Y{HGFqdbQ}i^Xl_-wdgQ6 zP%JM007w2)Dwdxk|HbkGlAC>o$l)aUk6=h%fH8oMYVc2$kpEICbD4V`4Y4KT6{bD~ zv~J}#0Vp+dhe)5+Ff3(aFu1;qe#Pi0QC*|E&0R~~2<&&d&L9;YKc1nK#Cp5J@uc;@ z)9>F#4lwGxs*Lv4w(+;O3(1UtTQ^vp?M$3^me|@>HGngE5-r0hu_9}EHo%YWumiTQx|Z-CKR z>q#%z?#vp*q!K$GPi}w9;p5Q?({*oN;MJF30{|W$-spBTotSaJJ~f?Ky`3DJHk}xK zeb17$5BWO4G2bQ9m~vQPGW;xt^w%SZxCbt1|>*n)?I2oOOm1y((*L zgFmNxvT_EmoRL4QUo{afeb~q4>BK?b4p){f-Ar@bjL{tPU)~jX9A%0-c((t zA27OpDcLZk8_MunsEr{ZmtCu+>Rez14DAO+xXAP1kzL99gqHvBcmK%tJxBcGA_aa9 z<)?tlmP_$*76gd_5IsF;)^eS;pqh7CL$oVd1Rvq=!4$6v1~&g z1DGKZP6wuMYY8qlM;TnRYxWebpq+<{*gQB~;rF+~WVe!oZku(4m^mPdzSp$goEAA0 zIa^NZ`sh4LuP12depXC7dW}}+ki$GK&%qmGO5$SXloT$9iJbGC!kM|uM!{n3eKJoF z^K>sVMw`{Bqf^v7+}*zdFl|n;k)k1{e#Q)m&K7$v7hRhcx>3eP)BeME{|q3pVJ5)U zohHA@rMPxxbBv9KNXu$d8%&zawO%)P{lz`1T0wOa$uIP;WJw6LWXP~ZWD#cbLXMC- zeIvvqr;udhWK@mb9LJFSoPWheEh~u{SU28gBG0@KJkrVqH&8S~wQd`wGv<9w)Q1rk zq4M*b1R#`z5Ec64M-9&e;Aq+n_15tvv6Lg+FITNdMz-RFIh|J^lv5xu#377DNeE(J zn`}EGkm>zW)3xiUhys%Yp9Gjg7LK2*&pksk?d?m7152G5?D?2lG@_W4WtXq`F9Dk2V-5HQ0& z;ctq07UJ+yVrYPCR%gEi7qvy0f47GBwcTy;!q)pYdK3QnaE64$`Pkuj8u0qtzXG7} z_@I3nKSvMb%ZnE;@xu@A<|`_Jum4JKGPuN?)d0Y0t#3eGZJm^=7Le!3fi{MzfgJ#? z8n3?I;3O4*8XwSsy7d%j%3tdRo8WHtH~7WB{TqJbqQ{!n+p(3}Q7@T~crx5;&Y1$O zRD_FC8xGVOKUm|G3_iwzA&=`P#1*C94KONZv0Sw+s#Y&L>&lXb`U%$<;u--t`i@x6 zIc7<5ZR-{XE{dLD>Kg~ECHslGiPAgfij6#|;TRI4ap+ZyBfhqTKBgTlAvv;PoXeuF zBjSO*evUBcj&P9!$0-_>CFf1)0j3T@TV!973`Mw#cGoi#l0)`>dh|dhZ?c1!fN~UzHb3xZ@OL; z6Q)y2CB+qfljPtQB9;*Nl%4-<#KfoKD%mZ^VBwy}r|y<_4ulXt*FKQLMzRc_F~)(L zDkbDUM{pwlC#NIhlGm0Y|5;-TYmyAee_@vn3t{N7_QeGGPf?LU!`aAx${NK2nHlmQ zSFT6?^Nm%k)OZL<+c|8urSg7-^|>Zo3$9CNPc=6r99yBNJQbhgK!xX#C&x*nhuAt2 z@rH?HTWKFawZx2!ahRNQO8NaMm6jt!1rsXS$C2sFMGq{*hPq}qBczJ5yVvr^Hj|D zT2$I8priuNf%NqrC1;)*1$_8HJLB$O==5H<=HGUs|C8Ht=Rd{0ByuqT)GHlf;U#XT ziaBH0uqJ{=}v1@B0l z9JOJ&Ch0Fns#{99<4AGWjIwxXy5{G^^%R2QHPcOp$CS!xY4Q8Vr2^-^b0v-lwq9=C z`czyq>sT#!Gucq!ugSx{i=1b~@fJqvb+(cm0S{B8UU!|A!0a`d$dGi?_*2r1{g}9{ z{m2$-cZrDKIh!~+$Jwgwe3Fa;oVlMNuBbjIBXq8t-@9Awv^*To5Mqa$+k3qI(;s0s z@2obH4wWO=l@yL(7ZUQi(<4?!Z{Uc4HX61qtIZx^2~!sX6M2zagxD1f#S*3mw&S1x z{L4T8>uh>pO7hQ=m^1dX5)unrhdH(s*VrAQh5^-T<7@)9blYEUq-~J6sla#QcO04undQffB>qdiPpl@9wN-P+xQHU zZKmJ;Q3XPBiyA1N-InMzM~2G|2^Gc&w)QG9{fMqYDZy-hTS@{<5ag_3F3~W3eQ_gc zj#cnUb{@&nJX$H4`dT>*!Kg5}N=Sefi^XScx64h~nYq@H(n!z0Bu2_V=qb}C?z zZX<_&vg2Gp^rP4~TwuoTQ{(cQhTj`&Kbz6F-TViNjo(T@Q@?fVyqXrj_L+K%taUU;niZpIomu z7)SF#k;+9v0Ad1Qz19mKr}kGZ0D;|RkK4ODynFjweVki81=h3e<_6z>^FL1qN(@}I zT)`mrIfV5LjR$h*opQ|W^piuc!+$f%4o7~QcAJ@dB7k}oGncIc+uo(BnUqy&&(RR% zp>c;ez-W$HKgmog zUuS6HCZ60e+n(G@mwuTNCua<6vwh|!-NJW-CEu0EC>@IutcVRgMM{6F6f7$I>OsUk zs&sLNvGDuyiEzpSiIv^qs^pAqw0cAaNCv;=ZmO38opn4%W41Zgk)sH%WHI0O;3R@<%j z`@`Gcd)RJXe&fFFzFht9^c|leui3F8DTb8-gbl%E&eM5Kr=IOSLu}nN-fzz+4?SN{ z0vt{G%VBc_DdqhGK)=hYy-$|0DS)jUY5Oz(8(n`|m#f>Bm2D3w`XhlcBwNyB&U~8D zZ)v+R_?|WE4V1Z=#}D6oII7K8I37&MagzerT`vHPQWF4aL}7O_#x;@33;{48!P&Z% zs3A>MK{aZVs*PGEs&+~NEJyteC87v8L%b#R8C{4==|ssr+)yeL0Z;)`3ShfABG6mh zco?!DP463~{0&nAb48vXQPpegUj9199i)umhZo%cgsfMPuy-sARW10_e?y$GVkE-)(U>J0h4Ali`EWoW2*!aR6MblzAjZ@_!| z<^ijX-u0GCiA+mKqH~c~0NCg&)JeKDopMb4y9^h_MxDbJ4@VTVb4uvsrMQ0i>)&9z zv(LzUByqM}xTazC9lFUO+-ZL)E?RFPv4Kk;m*bC*2P&U)&fA|oXi zk?hTOkJoo!0063$A+a#Zq@Oy`&VTWo$KsMsv5RC)n{s4Se`D-4&$9C#WzW3dAnrT2 z)_rQ)E{!eLH7>$Mv%XpVFfu(4y2`NcRleL{R?V(2FAfpU-}eXaj7o41Q%`l_~HL2@7D4Za2y{)dDCP!lUA zmCb=s>_A1=ub`C1G{ysKieyr$jUfpOOLh5+TKD1F=$TlQX8?q^4QccV@;#LT9$x=4$g=*{RN67L)ibi}0Z&Ax!el$VdmD0T0PAPh83eD=j!osMhFWGBYQsb+VB*mapmF=n zFOocex%=pY+xwgKFD(22Mc<7m7f%h{?_~RzAWvTI)O~!*AJ>$N%O<>gsobgi_?B+BioV00n&y>m5k}F9qd;h`N`*j!lHRzRW9I1xApYkPs-Z`1(vmgIC zlDC^UlZ{Cf>~50|glE?-4AlAd9GBi8#|QuG?|!}r{0DePYWCq226;2iesJj`H^|N> zRtG<^d6Hqt*U_;La+;2AuoQr(#y}@0 z+PqVip2^?qHz|-LeU8lFl44TW<#e+T0Nsj0B>7OunuP<9sGvim^o$W1FM&9VaVdQl z9+1WJi^jMt?5$Le%PO9{Xyg~=7G%v&!ieQbHvYXAS!TXrsjn7-9`m}zFg^6A&`y&o zy)w5|DV0G|$%shn zE(sUML&^x_u-o=QE&w4EN&&Fo?}-}`mpFqfPV<%$maku&S+)hj6~TE0qA&haxm79q zfx&-`ByqhhIVcg@4)gdj@Ly7%%PIimLYam<7NuL$CV$PyLFFp|y;@%sA#GFS8MhBRL0{k>0;t>6A1#jxIVGWK7VN zPB{^@G`#O3hg7GbJDmXR2>i#dE#4sKvT79=u6g|(Ivnor!dgd3Vjv_rI4F^>iHypP z#PjER8_5L#w{O40dfnq}yT%WG;5KJ=JYpJ#bS`hKAL70y(<%6xRGehy_u2Yd7{MAL z!6bbpSqBA!Np2u&8o}5#DmNZAhEZd^eJ-8`Y=Kj09~JJIJ51A!4RkHTZEc^x^t_}_ zmLz~3rE!RTTy+rW{?Wi!=ou!e8Z)^7%&Ezj$i~7da;Br&At4@RKrwwkuL1X{Jugo05^=Otvy+8uK|#V|%Q_vUNlnwP{7G7$vTT|c&fXrVIXa*B`B!?H(HBE6HA+Xi{L4(+yU%oi^@_Sv10fMc! z3oEvtqXS>k!E-5Dzn667Zj$;UVA$gM3&*fMcw76k>)7wzYRjG_?c@A_7?9e@YiZ(p z2hXPcaQBW&4glD^bobuAcDnWUe1l&1I2^`=)xO_s6M6XfrRU|~BAbD`tlwj8Ha+P5 zk5klPiPbQWAF%!J$aLNCeEwQbeh~H!kMvHof?bC3tf!gqze;yO_Iy=L08U+xsxC)` zS@v*1ZyKv0v5-7iPj`L6bePEF8P1Fun-K;8G(+xM0MqfoGr94xn)bjnjR}CO>v~qF z!ZeNXkgmU~!}sm}=KzW-TpK(A2Bp>Z%(pGesuVEn_Ng3M1Sp#wI1UGXed<@~K1?eO zGabVmWR?5=a}iRzPRRu5@R*1BCNCa^eg2e=4ugUIV}w^>}oR zBW&{SH5BBKz^)bd4C!-E1F>(@_nelTj$<;wTzGgNnpkt4B3{$voAh!VA9kS*Wy|-t zK0l`#xG2fb;o%`x0H9l^>!BISy(9OFE2Xenorg*l0CRf`>kZ#eN&8T;>m+(gLlP=VGgWIqD%%3~;bh+_-J@&L zA)vgkD}KWKy<#EJ%B*Zal{Jt1mRvqoz3!pc(S}0#DH0-(y{C#EEQV-a$l@0-u>DGA z-{E!?9zm_;dydbT$+iHfn#g9-kiuH`F`T-<0M2cjydOomva%Gix+v%OCN;orQCHSh zr~~!Atyo9?OniTn`Ryf;v$%h5?B^xfDkR44o*$dU)W_}l^o=EvBN^dRZu^%GTS<{P zshpDbb0*3YucZuv)|7S?CD`0@&>xpgj1YP%m{?%=Y(|e1{NjrN*x7#gY`Y5o-efZF z_R$u3I2`d}=gK_Xx_wQ`9{B$gfFSu0vE1($M$Nb%ake?2)2@P-pL_)~PPjO`#&)&B zU;OmPz7f~yAAkHsT2rw!lLfl|Sp*z^o0r-Oa(-=b|(+Rz-Jw7dJy$bA0q61l21e%WK zs^cUzo{D2RC`i%BoP^e@luL}LHNzy^1n~R?1B?LR3yNXSD5g(24WBuDng&<_s8}c? zOd&t{bhps1v?z;m=KYe(#uQW9AQZ|Ut1Ib~isL?6lm&&;2>nI%7P2u1#40j8% z{K~<97RbPV+5Jjcewo&Jtvm4@6hO%=5!lbzX%X-=w5ycshoxbDgwx#By!nNtWfz9@ zEvsJw{#ya67r}q|Z&bvPnE7<4#r)H8Nnm8E*_>+jy->e&mBO)Cf3wVfLC`KH97c#xS?Jorw-jj`Q*be>AUzZP5HlsPbs znL@rc17Rr}$<=8DFd)fx^ZXhwKlWoSGgeLGvD{xXeQ3_GN=XdyLSR72m?WfpFC)t4 z>y<*}mXg%C%OgKU+DUJOTaE~JI=sG z7gx`5fBQOwxqbPu1L^K}duZKZzuV*8>$iz)Bv(r|l7q_?uchI0=a`URf9sf#S8KBI z%>aEpt9zlw)c^vkuDBNF4T|QnUZeNfHf#SwOQDD5@VTLVZa*X&d8{J(8`AmxA$fh=4&Kt~U0t_tzA5fpUYAjW zC~dYIpaCYynE``T#@3x_eeW3ePB8{#$<*o>ym(5f#i7Bf?EzIVA9@eUv!xzT?8cdV zQKneC3k#ddY5-_fH_HtGNeJ3XQ{gWw-XnQr5MYRc;pLDL?;itOGf%`isSgO!*Kop~ z3IfdAQMMG`B7y*uYg`a2FUZ5eknmpH$fW1@2gt@uH6*YNwn8O7i|{cwG;#@&Gq43s_zDM=s=3hl@N zC_ztblnY6)5y|$h_68u?XJzGEEXyY|2gU~D?*%?LDPPqO_Y|^Ke420EE3g0nAOJ~3 zK~%Hlf~dkFy!Rnm$s(G$o^83jqfY^^%*o!wKL^}D$?P|rLu*&<&m-_wra9R<=<-F zR}DKgmyvKL;`htz@Ye%KklmweT?44cZB|B*Eob91(=q73IbMd3H4(6#0sBPRB&>#T zm{4K~oC5J!8$2xnPeb*>{3N9C9SX!l92B4DZ_X`V#&5v9Jg57PjPCH@_K~~Y zfZcw;%TK=yp@o6}jM)Pl`lpn7z=8j$Fn!9;FJB3j+t5ZnVdaL}-~95QB?`e$fA*(I zRs1A*0Sb{)W3eNOOdu+Ks$a!Z7}OR!?K7EU%9zJxBQT-XP@OjlbsH~leM`VkFcGti zu_h?HEW(e^=#i=f=mH4X|4Mj@eI#h7GhB31oLcrSidPf(ctUw`V$ zm}3aBm%KkAT(HX%?-_F5n}|{m#%K@Pb3YpjVj~%@c+D)hWSDL_3PWN>SI%TnC=J{( z*fdy4vI~aQC9<)$b7eaLPEvUWXnVYDj?G7MKt7dhq8!3zqHvh`I&#^nr{gncF3<*N zpDbGo_?9Vs;)%G*xR=7oeMs2=1U80X@Rwv`eIFg|LOw~!c67S$DRS!DhyuN}g6yopxDfSpr=$K%@?%riHOqv||Bi{XTw#MJWk=yfE1lfP%qM z2Vs0T-*Vn=Mw` zoc%}G?B>agIA*M81tU&T#MLWqu%%Od4PZ^nC^(I6`u|WDbGn@p?(6k;?{I$k0-LiJ z`0m@daVMQRXGRAA3U#JYvi3>9Rf*Mxr|p^3y$}B6Ke5~Z5%~ArFTW1g*4z0#Vlz}5 z&nJ{E^Bpnl9lHWC{yl&33@<+NY?qnwS8G5#fzJ{dR&yOYF~lx3DhC~3IvpN#AO-@P zskbRxOP-2s)zi#WmEX^(%+66`%ahptnkUea8QQopv}KIT4%;O4aoIA5OmQ;Xw<#If zMdrRtHnIQmgFv-+(*n}aPYDn`GhgP3LjM94=kgN(-ab5N?(yl@Rko*+D`&!!_NE+w zl{+bOhmpG|I7S6qOYyF9 z4oFJaI&z272art+btc)~@->CtUj_`64sI0Bz}LsDZ2&kw+W?sGu-CY}dIrE9LLeQ4 zgW&eNv0xr{b*G>{N`-F4Lde3R%8I=9V|my=;M=eN4xfDX6)vwfRoV8t)XqI88<&gp z9?n`w^-8+l*@a`<{)bH>h_dWR&NPd$a36+pVVZ0n82#~)u~I81o^<}D5$(DLl13wIl8PZ1y!zX4pfow@yA`3pgE*=w@Tc`lc5iQX(=4 zrIpx^iF{^)R&jrODuaF^pJxLE+@mV%plJrO-zJx=U!7w-()Y0p1c)Lx$pRQv?tgOd zTnPz0EwzA<0rYSpok{@$6u^8-L4Z=T2?#K0m)Xw}P+N*}lR$vR-{WE$U(T@sS`Vo6 z-)Z$(Qh}^OWHS`r-6`9Bf5(uz1j*>oay<01fuQ?E4p4_)ThP^A$wz=ecKgy^2 zm0SOFzlNzq5z5!JnSF7Sl^FH)F$(HN`TC#B&YW`vYfT{a!RadP>;Pk%X7CDQ! z*Ac*Z(ldv5T>(844kpwk$hJhc7iH`EVqcVKGCm)V_^2{A;lKje^~Iqi$>vM#0uT=| zg{6?^k+4D}qG!R?t5t9j7EvW@?u4+xP=(o9!8Hv}0Vy z58Z+Ioj-ZBe;BYojClF!m$25R?16_JpnmdSU|7KNplwdb3%; zTKx8J{jq3FBEX#g!~Ls;35g}jpCD56L@!n$vaSgqC6(nTFz92k<1v0X0yBd(Dfmhu zDvcDT7XW&a&y?UU0EYvC5B>y zTgGv(RJrL4_i2NnVi;rF)kDTvfji&u_9-+kcbxkBJWR3)8{7;82Z*4=u6GlcHDky_ zebYMCVWttrhg?t@H>^@R-qW6{-5kR>kQ{V8BwlzfX|mGki5#Fbs$eu;rt&)~Hu3p_ z$^m+hj0?}}z+#u*@Aov>MBDF2^&n`UM^pA@ugxpojckNjFxO%CLVr}HYq{r z<4l!H`!hDmgs%f%A1j;tgVnpB4~zBj1bKsVfjcP#C(tyxb;~Jz7DswtmjA;xZKNRj zM8;uSPRH?h68O&yN52+xBZ@^YO~+jM*yA?bg!# zAAypq^RuMijG2-(a+;3GRNhgT7=LZboDp&6m%(&O>BMLndXc)xq=9U;(%>9^c1q_> zGmRNOFm1hCt&-= zVOc05R@bkfb^6VRP+F>sHfJyJ`nxjBFN87LkrPhB+;EtOtYC*tr0_b4j@>x0655zE=+_K4OpYY9 zu#|G6Z%ejZrX{jT@`34AwSyy)AyqoD-ZD7yJQZVn&0#cmIvzlJ0$xg)p)?5(#h;Vy z+tT7P%U4ZjPxJ#pwv_!e6iQ^{@`(UvpT2wZOYxDHB(9S@1z1gD34APbprkLokBm<# z8!yY#W95_H!^8do=jRU46Xviid>RnPl4L6qoi7Xa`#d$-{Se1*V92dF%392!@flFg zHFFNF1wdWiR=g1B<0qAk%f;sO0#wKMvb87;bMJ>ar-CDR6haCwkSzs$Bg~gYsI8il z48l9e=d_%iM0h@FKHRRS5E7W!0NuTmEic!HjF~{}!!`W_@OEyMjt@E*LFq7ziJr6G zUf}M{F9RE(0|GuvSdxjonAbgdIV4bDo>r@k==9nM2RRPxpa;qM*FXJF*q&|h$)}&7 z@8b9XAOcV&mXTJJ2>=oB!C7=GY#uF^WB|)S#DZ=ivEwcVqp*6{n+`8Oa`WzCn6TeH zU^*J{Ku@fT*{p+pzi@>cVBI~*5p8pr5sTCFmW6&&*#Yh$H) zKmiA~9}J)~g$fFczyFb{%EWq;WK`g6>T@{=s-=Q3Xo0?dGYGi9w(j1AFW%|U?dC$U9CGgcn&E(He-Qm7OMEU#{uv)mGf4*`8Vu@97A8TaIX{U+$gre- zE{h06Yyf59d&wWgVNDG1DQd{}jo?PSlAia}Zwu*jRF!IgVGQ#>M0R@G9v&aT4 zL`TbIflv$k#E;=7)Xy;(M7Mo@w z-%OGYo(B0O=D(!xy==p-c!mPhDETXw$oELuC|@F*&sUX=k1zfX7ktmjK^5;e<9m#p zVcc4aad;^F;d-?ScqIV96eER(MmsCTw%CdwLOKLxZK!1Qc#NK{ zLE^s3_ZMMyriyHNvg{CF6_A-Xl|=%mg{_Y7koFEjWeewO`lip$&ys&*dWFNo0pu}0 z>;~+8XyH2s4g}x;f&kvV`}F|`zWU*HajoBYTvug!R@Pek^3w}!uhWU~{&niS`~83P zFVm7I8q0qAvp>aeeEx^YHO|NvJ_u%DmMJ0YK&?Dkg@nC@oPER$$64VthbZdrI`%ib~d9hK$x zrsLqi9qV;yS9^eqQhks{_bXVNf)u9dSUA*^4Xt2XmoXOWZA)d%ran99b6XjdlcY>TtH%_&1X8HZaPLD=EEiEgy-;hmg;}K)* zL-gI8(?<+9C5`)q4j`VEo_zb`-?$3kKL9u!b_vKUnUpec6yN}Wd`>>ne7%tQZ#ra* z4y+MA&&`4V3I;)I(XUpCY`5S2J%1FO-+Tm^*xr}{d~$%BF=;qgt##TTNxz{0W#kND zUEe2V^8CsJ4A~=P^)Y=#kRb>0BmkfBi1pcJQupz=M}`1wK3~#5)?%Edw!9<MDU6A^L0RY3l{+)FF zT6m|nkQo4`!#!XDrB_fH2*`R+rRw`x_P-=VC>zU4>9UVqfv`*B06;JRAV1K+oeWC= zfJ$IPBmiJ=E)F|vw&!^D!!JbRT5NCLxZ^6Gan!VcIt|0v+zHyIVJwsH_Kgek`}U1v zCb_(R>Fba{RsslC&<)AKC9x1riH=gQ@5t689vV4sOVS&cvU0TKn|oH0Z@sp-zR3<^ z%x&yXFh05L%MEvn@>PIb(-^^_F56J%%Mu5+24E>W#1+5&_{|U-%JCS>b}MJprb7S# z!Xcs5B9rDZo!{kEc{Q_*lWIE-v zc9Ep#YUOXpmdGaHN+ zV7p&cI`#QqzWfZYUVWBaoBcjx#`4`;CQX7mQyLhm4 zX1>Ygo89BS#~M8cD9+_;ts6`FuCN6(>997*^5wTImSN}XexWLDzGB+0=f zGE-#vh@H>~Wj?kkpFYwbJuUZa(dzPDi634^o09^dS3TC}&ys6-d&)pglt^C@7otum5%}H9z!T1S1Igg=Hw9M z0xGuYCy?#E?r_M`UUzC8nkCl(-@zFV@eMOQu=#HxMJ{Y<0 z1ng4F_rmix@^Mly6ZV+G9%}|W)wERzkt`#aamJtGZP>|}U2RIwWaC>{Y==G3mb}y# zb=bS-r_jQbD723Nasrzp0EH=Yt~f<^ z9qO6_+nWyHFq%3PQ&hW^pHLa=pYc@xLD}a0VJD8V0}yHF`J^#T&Jo@9>j0Wd2Boib z#Xxzq_;!TI-SR<9>`ntFzd`E+(4x)i2pz)e=lK(+LLK`h<|9YBcU~)aa37#HrF`S? z0M|hW=(YdIN7iND(XP8y;mGEoJ+0j&Y)mX1-kTkZcS-&3!Z-H?u#OlfO+ax2tL+)= z6j=ai<4y0qaFJEQ`C9itt`5eKLgP2t==-|6eiaed%#mh2LZ0$T;d`sB4z!V%9gfbcqezZIK?us}#f%M-IK2yetX(E7li=KzipC@LxEM zU6Dm-GHV;aG`aexss2udYXrzKcB+oQT3rf=hY|#~xuPwtJ)p;Gedndz>zWNHfS5>yDngPdT zeLM%)<$Bx5!ujox2wsKZJ$-q=&Xb3idWd0n}ybJbI zt{B%x3rTN|$P%MD6LQ$=7 zzq`*ETRg~?)_uM%`Mtho23jj9HB_HceE%aH{3Bg1(V@wp%AMT7V#3;e8u=bPo9t5d z3`IIUKh>_vwT|SY{96`fpcT?foNFp`c99bOB4bgNlJ3R&stk4u<*SAWW%i32aJRP3 zQKEThLS-(>Z9FseN%DnIquhQ)S!#2ZDMQCe@1U3yX2JpIb3eEJC>-o5>9(V?Dd5*UYp%n4>4gZwn!g-Zkg z(Ygz4ew+>P#YZ0}Y=C0Zb8FV^3-Tn}Gl=dp3SG2^B0P3!v{; zi4FE)_%_L7j$5XO_oD6*Qs%P);v8IK$geRA&!xhr#@lE0Cc34dx5oVC=#{{EEuT$d zw`(xoioVIDx`lu>VP7cvh0w4oHlmS9hjMtB`bDxa`Q*N?*WpPHM<-^a{ot zW8~2B2xAGF;ajFXi)z^JA2+3r4|GP9;Qp zqPi!~j>r3_>sK&v-xrN)9c(syKUK;UBR9pkX|uM(!q&-Ht63y~AYYJ$6>5x;&3W(t z-Qb$rA3lAC-9FZP*o^@oD1ifkrvnI9)Fl8>XR_Nv0RRM0@lHvK+;sF{Dg|^M{`a5! z&q5>1&Z z?hybN>J#LHpF~4gTsy{7ru;N$05+7MJf7%2fgAJRHTkR^6XP+}Z?mvYg2h(AM^1SAVl8pTK56$SpYb>cwHaCeH^*%C)RKh zBQfTr6P+~^M3nTz!UJaV0a1zIG1mcM(aDUBQx2la%B0H4)1RcyDV*(iOv3jXl+?+= zA(nybKEz4yZhIaab0i-yJjqG#rhK|DsKgcQWMw ztR$7SFR}|u<&=)bf5Bm1+b<&<}yymjKef@xLeFXq` zxW7;G_Uk@;kF@{U@5Wh&I+dXi2eLs2%KL;?S4<{KyeJW0? zvv+zbU>9sZlNf`6x=}KSC>v@^ zJ2$u3f1G1)Ysi-#-mS^r)DFqkIyyYDyXI`07S zth>$zN(X@jz-_uHvfrtGo-!KJ;dSNPinbB$?V$UI*gqHN6JEYJPeY*6`oQ)KWVbz) zu^2#L`BGhnX}a3`rgQ_joJ;Zxg%Ld$2ZVjz0Q#)H7$Bn*10N0CbXkYP-U^2i6<+ zUT)tVa2W0}3?s}q1~&AiNn$>yeFWc=bSU%DUc_cLU!?{J7Jz!{%lX6_o9=Ij9dNiW z@`@=31_&u<{cBdIdyK=reRz)LT^!buQr|~H4*EASPAP9kWBqSs5MWFZSe1hS^Q0_b z6bk327*3XIU{w{h`U_=i!HdOYV!k;@05M-u*a`()0RiS6Ex+UJom3t;1!1Po ztok0vSS9B`L=rgy8hS}`?Nq@O5Thdn6cZqzp=RH+E znoAadDFZV)udn6{CsA14(l}fK=v5W@@`Dw2JT@aS0$G$YB9!W!4Jrq%8FQ@2Cmh;m zdOqoQJffEZV2w%qKs=HqtucvwW^x;yX>x6LUFPwr?JWQRAOJ~3K~(2ErcqEmFp;x9 z+vBllH*B7=vNnrAMp&C}wGR7_@H~XM0bqUI3BZx|qh<;#rePpP&A@{|y6*}FrYZWk zB@zP`VUynb92TRjBz_+pNJ`%b$#=GmeR_6&h8thjeBwg$(qVcEE&S@!FG6Tx;QiPG zmw*7xv)kfc^0dG4`9BW7)sNDQ{KY*g#E3QckN?k~1%ZC=cmAmebaOP3D#p52?mq=* z1nRZZs8=fm7?)SUDOz@NMm)`cVRp4~+8upxu;_w9%nXmJgR&-q6A%?%Zm=;*L;HH% zzxjsWi%o2UelvbN>@iIb*qnLCh)f21EehSGNsu{_MQWq*Y)>voklc4-#-}mHVB%}wa7>?7(^`!pC5AiykFh4{tl%&q zJ%L`H|8vSi1d~$gL3N#005cGc$84^r_fDX&PRCQ$@Wx5luo>VRFk>vHux{Dp-*i*J zo{z0v7G(&Om3MmN{S_2;zlH}upf{WcGRARCTGw5lD3HW7^CaLu3)smd07@x)y^2=l zdE1q|wt3g3u5&=ufc$GV>)SRWJ5Dvf*NZB4>*D&UOd(O%mBD|S)xH#*FFC|RE49Tlus%%7e4rK@7PzK-CW|zJARu+ZXqSQXZXQbO=ehjTZZz8 zdX}6ui$WdcMqXyjE_B>Eu%fVMdMf$yHfpTuiOyUpn_Q|e=g|JNWpEGepc2YS)XVAL zDBql+dKOsBRAG!tT?jf^j+;6?8m{zN0=eu;Ve<*xlOd`fjuK zxS_J%<8^E*5uX?9N8y6gK2N%ybH=Ygm6 zOvk-55S^WEadzHeyFu~Iv0BqclIK1>R9Q_Q9Ck3pUr#`Q@bcuCI1ZXz@Pe%POnHN8{yeW$I2i;ejURf)3S1!T z<)aQ<3IcSMDAl>a)bQg}S&dty3^TrkIUh?kKl@$t;}rgxnlEe4M<{VAnk&gnmPV6F z7>?nlkJ?^7kBS$f6mUOXZJg-z@D&m4h&Jtp{Uos8abToxw|bas3CM|mPfR}G{fTQ5 zroz^9`fJi*-+bKK@mTr=D)JRBldN63-$`SJ=JVqbmcXzooo}>W1%Ic>?9mRFR1!^T z-Nh)Af}Tg8O+5iw-!XCH;1X##!t+hY=og4h72mj@Hg0X>h zmeM_b^5g$0$+tf1FzmSDBCUyH5tGmJ4}SNbqFZ_9jN=YYS#l2czEd9P=k%>!b0$4t zWMO*40L&b(W*P$!PzqhbGmmV5cKtdyj;Cpej`(DA<|j=0+vnLm+~as0!ZQwsJq|2R z^wqO#TwPzuvLJ>l=G5}y2R5U;(DQV`W5q!NQ@BRVfSQ5U+`C9q=u`Fq+HnLdpoP$r z)IT*RI5#A8{i?`Fi-1l(JZ}h>j6AG7#Thphql-Um|1jJ{tha85#fZN1Ft^ zedL=N0TjgnfCea7-5hA0f&Zu~KZM5NC?5)-<&3S@>oe}qvKTWXqyzvY@E-t7L%K0L z?9$W!o9kC$y;n8^v{{R8yJ<4M(VQRGywqy!0DxHqO!vt18)Ly4^}0TPzSL-^wMy#K zoeuBJT3epLq4~oCW;$ZMJqrT4Yhx;Ht|uLj$=`WeZMIGJziAqIpwQ56xRPz8yLEj3 zIry*ZI#@Q4rYS9J!&tGf7C2@n?`?O5{eJN8VNAxl1rksktn1szzSje=Fs2b6nEH;N zipmdg_zl=NdR8;Nf?lU#VQub-@asS61L4#cF&_JGf&&0020&s4OyqUF(dBo9kBV` ztuub{uu`ogh3su5$=Nnn2Z8DUVDRJQL&*m`UdHW34;bL`ng0eVeO+9WWRTXxg=H7# z6WZgcI57>`Xt)@3mCGmOd;QI8TwL9NmT4(`p2UW}6nH?X6Bz#_kO5BwIJkL!jh7#L zrWbBlY3O0IX(533QDy!8IX!Gi8@!!U<*SzckbU?*;gA{t*+Ryw?pYS?CGs&DTk`Sy zOXcG-&aPV@s1N7DHZ2A!E#1%0$T}P9s%6j@WPA(*Z|i-Z@@}8J53~Gp_fJ~4TJzTl zK;A-z1>vPmZR6zUn*s7ZMIYAo_)R9>6TkW0e#A7nHFFM-AD?3x6E6_icu!^G1tOsT zvmd=e-(}y;%-SJ3dp}SgE|G^-=-ZgFNj)OfzVH2E#Nok&(6-XSnpXH$iEV^mTdIo_ zD>pB{l<|8mysYfNQcd~h4iQlrhaFZcjkBwBY_~MuHvqj$?Zy=ca&gV4VYkCHO-~mB zn3~Z&4tL)|cRf~T&w}$-=`OIN=&pAM_`E+xnK6L1y1sY&@i4#DzXfZiVB6|fYbd2L z?(Q5xhW{25@X|O!uQuX=BMo30M<@W@ri_ZiQ}6roaOZ$;*DpT}0AFfr93I%AKNSxH z=g&aEV76b;07f%{zZjjBkw#%_Z=!(Ub75kZnZ$eXN^Y+MfZdx20Mvbt_4#!urxYS7 z2Gz0ZBY;dX`;UrXzw|q!s}T;EGpgoxKqu>pstsjSEaYsP>|quAKfr7{Ea@x{`6z>b zo0xsb&$V7dX`MKmM+#l&FDi@Vg-*jU8Mobf6@in0`0`U{HVXyJNrL!vr1`ZtIBR5; zDG1Od%WcoT;O6`?$@A{pUnF(>5})DrAw7%)yq~}4SLTnJk@5TVN9F7E2lMwlu|F!2 zajC!OSLKglbw8>Pm)g5p`GtJR;h-9Lc1fK}ZHDh5V@)4k9KGxV_u)9~=51Er$GdIe z3!YlOQ_2_t6qm{8iq6TH`4Le+MN%F^h6UWQ+ zgbNaIGfW23L3-xXi*~(|MV{9ed|Ny;vLGWpC&%+}f;Xw($-l*QB=S4vAkDO3)T0wX zapPOf{hI))Y?7zi%IMzV;Q-^kq;b*emZz3C_a{-+F=ZcRXC zCZSmU|M&-B&4@qxqyH-22k_&c{7LyBEagt*^UVst2&FW-wVRCkjyu0g&CG-l0Xitz z({X^MK>}d4bqbjqB+dhD&6o@>!!{0D_vrg|$`a(A#~KP#aB5p9rEoY5I38}HyA=)x zr{o-VJAb;w$zZK@^yQiSy6eNnCwFcGz=}SG^}6k###Gh<|M(n`A%F@zdsfWKU6&No&O*r&pVH=))gCO|&f(s&R+fjkRG87rkznp9UQ zq%9VZ^&bl@9UbxY6WOgKhE)PhdX^*;QSUVANR#4Hg|+Ey_1C4)N<=rDDBEU4ekyy( z$?5l!u^}ITz;aQ9R-(GNp-HGmOswsKZE?nFB05W?=SwyfK3ll8D)UJS+zFd4k!@$8 zjGSdcJXy08@Y%R8u`_h*wY-Uu#+$H7DZW!~{F=(OG52*zXHv zlnnD6{FfvF{Kwa23H(O|Yv8{;>~CI}gZ~O)8nPtqSbwuP!eFa^73-o9*0v@|3jkJx zH^~5XQlTYaE1Uh`f75TJR8m&}wq%aS7fcrXJ_yRDi*;m9uBFU>l8hwZ)#Vn?Znju$GaWc%y>)*qHCi?Fk4l+v zzo7${P1g-iflV97WdKy&N8>fq4R~ligbVsHEv$KMAyr@PmS5Hb#goOA=g0}ST{ep?Vc}t z_rBl7khLsNx9t~?hbq`evy;wCfG>Q`G4=2&bnU%m)a<18Qee(ZnI!yeJ`Y#qqcHFs zwDCSb**P6K-&+B)-pn04IWST4lmAN{2T?$oB_WfK%a}Utn0%S@sRlNd05(mBjj$I@ zl4sJK1(3^+vs>#UZ3o;6GzYEt?Iz%ZV2A9*Ilu=?b%w^lG zJM4G&Fu1_=vlj_4Uukye$FoKZdv{R$eKsw;hK40l)a0 zZ*cwW4A=eu28FK&>fcDWJ#Ws(fnAr4c^>W#kahQJe`XO`=0L|qG>}?qe3QAZBCWy3 zSgcnaw$FPH1e^l<9tYaZf#rY{z$fKf%F4~t)r||ee*5Md?Dwe?=v4WDGY^|MOe19 zRJ~#AZ}+_ibu~bR{10ORt*|6qFf|c>aP~gOd?%T69NV8zpQWf40vyjm32E3R1~h=v!x-N^5Cav^>+ILT=tHB}$9gO5N^isEaWR>Eca`<8wWhE?8DryKm;2UofL}KMNzuPT5>)GqjrYu#D#<3XhzoMH(l|tW zPxEk%K~61wD!dRe`}_BQN9-&$)d)#?=U(WSXVlf2$+%$i|W98Srj zQiOK%Z&&wm+|8`Rg^bdElF3J9xO~%i{P3hR`93hSyYsg5?|x$aIPD+G?@Rad43G;k z6CI;~o2Dbs^>PHIX-pYzr!la|0sb(x0z#M|-No@xu_f4+jn*6yf$KfGbuT`X0z@1a z;b%D63z2te-G?%Av`rNC0nxWbq+DA2zUunG-7U$$+v9cHtp2XwLVJ6(=?T-sYQ>Fp@p#XSP6pF#{L;7mIK7D;5+c-z7cUt*ZP!$15y-TS@!CjR~Wv-E&MuHyx?SJ!F4j`+!+|B2{4{i8qp z=j?osm$SAxsc?i(L)<|A*?;_BLL;Al{3(9)$>%T=;9_i-+I2uxTID|!?_gN1f!={d zwDljR9}ueZArE|q@(+|+FlLCGGi!11AILB`_P_CPz@B|H)@Dv!iv;`!R6uzEV2vAK z06MJ$TV1Tm2F9X3IrV8hJ5V3np%2r9gg!3AP$}Ix5GK;ez3W#%zY4PEKuvl{vf{;Jrz>4-uz4);un}SM z@T9Z*3Ds!7Lf5aN^W03%F`f$~fCCa4wQ_wGcFoLq@`#huRZ3II$t0AgziUcPq44BJ zfvoOFpBm2UP3fuYr|!Qu8KsjPHCBfO#>kqYOl`JgoZW1R&7Q!J&`1fhhU9D%fU&K2 zk!Jk9WL#L!BUoI568{Ki*3!D?oS)(O+3;)uqMic$C(B;BZi^qHEXlQCUn#+VR(ej9 z>n~>j&f7^bU{(e*R^*!p|FywZHv3nSsaBrW=M?YQ)nG4HUeN`!d)921l*?G{i^^;OMX4-5+uPFabE=a37gYkH-g`U0fGs0mk5`=$-b#XfgLq zueT-G*Z958ewP~hi1qLDFTcQMZ2^pciQn98Xe0WUgU4dVx)GCpdce(W7*%fgOmwI0 z1bHy_A4NlDHRREZbEFsxwfjOnMR=nbP~5EJhRacNB+Y>q-$TZvPnYQUGmfrBG9sPd ztD#cOm;j5aA%wE^BWIKi^$BfDGVpJr#R$M1J53n{;Flz0G3FP@ILAJ@l$lootW{;C zY}tOhW)GNUDrv|H$n*bFdrZ_@gtpl{^u5bSB2)lvqTG^<3&$mwF%@8egSK{{G~D+; zJctiS$Hpm)bSD9i+55|7Jil6D_pk@B!R3`ZC~|lE7S@zud)M2G0NI(xW9dkZ@+oK!-EeAoFB+wc9H<5l-8;|Wqp!|oNwAe*f`|CPb$kny?_AhJyFK| zz;I}1rY!#^)~gQdXB`g1gxhxyxP9|Y0N_z-9h~7TdjtmLz&sJ0M{4cNft+VAT?k~( z3LXyP_`^YYqB?oIEg5U6#U3chxWB){{(eNa(zrP9vEFpadr5#E4IQQD;d5yn$w0jT zUn{b`*yzCidc8#}8DpEy|1iHS*?w0{WJs^Tym zWc^3$9>{d=NBiJfV213l0DuA@Ro2b^Xsp*QcJ5^VE;b_XnNF7RF@B$xuXd))QWoS> z{817!J%Ltp@|PfYLq@R;Vc#O|Wds`#w~qxGnZ4$zWEA&A!Z?w}d2$$x`E8pr(%<=B zr1AaJ{zeP+Yp8QFnF$FqZ~h$KPFrJ8b`6XP5Uy)5|K)^P+WWw# z=?H5rv{C_hMmGJaP5_D@wj<_d9p77m73#>Q5bflnCoHn#F)aH%jnS!;k@ubE5pWmo4H6OxGtQEJ zh;=ZXrU!ugHv@k1#xwX;oS`8WDyefkxymN5Oa%iZ)8EZB2Ite^aKLaJ93IbF9ESnpa7Y~7H0V+w zK}CL+lvli|Cni=%DdkRuO{8eWm)`sS?J^^glflNrJ5-&H^&}yTyNK$w7U;TEXm^c) z?koaOE$B~*O_sh5KEc`bCYe}jOgh9MW6e|m|B?*})n$|7nGu*d_xcq&-N7)&XpG@a z&rjj>CZOxwJJlT&LwHjN!YNbAolF#WoH@mKs9x5#v8EUgbRv>ISZi#ta0Ek1rU*(W zmnEvvqI{53aCBEdYx&9Rsv$R1dU6?QVNQ%Nl7l0WX)KfoNeRtQ*(?tAlU>hGIY>rJ zemdOsO{VOYoFR^)8S znBEuanUV42&`TAEb`IjDy6DiSc_5I3fwc;Hy-wzAwOYlw-%qn0q7q8sgvg-M_p6Yv z0L*2}e79aD*Qa9{E||+Qjw1pPPcRfJep(a&_Gz|GX;>YFFsoHqJ7F!RLkxjvEzlA8 zgh2da$X^8JKixT|H3Dv#EQE1*7Zv6|XLwJI<=k$jIvtH>0PJMIYf3gt7RWm(F!=h* z!#;IHC7W%_|IX`mV~2uiN0&PhTy< z&Ux_PlB@)vf)K_<%->)SXw@%;i7Dh8hY+H8jwQ?-?wj{1T|Iw+?fF%7=8yX}=!4IB z5Fg>Rsvi$G)o-!}n9ZIs zaY%%$e#v_F?RTpzIyUG$A4*%=6GF7$WJ z_E9U7?<48{hm?`0C+KIg)g-d;qHK&d*&!;x;{ueb>jzag>khz(!_Z@zfXl0Ai`aS( z!wARL>-XzshdI{m>39hHafz)Lh>X35VZ`OlM*tjS@6Z17ukh7x{Ra6l((j@H9A5(N zEe@9m_K7CzF)zm*k!CFC@YsiuW=kEyuH20a5&=P@}?|X zN!@Dxa8)8gMfa5egPRM-_Hekr!`km#ZhdI#nv7EYOJ$V85?f;n_Hm_EXoru1cW-xC ztvZ~Y_gJ6#cPua$Q923CAg#SpKHb9_lUOv;`zl0Ka`Lt3HUdqx(lm|EuQKDHRLqAV zhKu7i3?I(-6lO!!_ptuilm!%HjN@q>BpovXo~&pfiT86bpOh$%18BLjQn~V42~2B< zQZL~z=J%qrl%cxF_Nk+u!OMxkN{~Xw(st7RD}Ze+n!_q^vEC<%A2DFoQv07$spFlj zTRDSc(vr>pX5-11Q|#gLej*T{*nhP_lw9{9z~WPuL4b+06%b&M6X}E6*m3L~WQ8p- zjd8u^!1&p4rGg&fE(i?B`R@u?Ns6XrgmxtMxKm{WWM7!Lms#kSc^?^TDPe>UfF&kR zWAAZ_|E9GbRrgVujJzHm&7`&8svVFTWnHxZ03ZNKL_t((?#EEdn6L|qzT6XiS(&Uk zGrt4PQG3F^j)(GOtb0ZO)!zTi9;F~+F%kHdfDffZN8#`IZl794W5&}7ZTiTHF79Pa zeH>O9Acegnx8W}VsxAfk=JMt;s+j|1(q7Lo&oTcRVKj)@jixK6erbUnE@{TgXpD)r z>D;flfMmfH^TbmO=*4}Goavi<6*Jlp0EfW|kx-S_+sC6Ps`7a_KrP5!_OApM1c1)J zA5JWmU*qNTy8C{W)NMS5Mr#%P)g&Xp0E51sM2|CLP_y`IMbD~r9}islHYFU6(tUD3 zFSzo8u5RKUnLwB#Fu4PTBTj4tQj{^@h$F}I^&I#98JE26G6k}@^lIIKd42A({=5J2 zzXt&P+yD08B;oy9;J`j8Kx4L}dQ>66DLz|qOpuh+$9+WoB|vibq> zgY44rZCM?PIV%GSJvV}QCc%PYmX(2V$o0?3r9Z?9^kS)vSP^5)8Y=z|Ifkz`C1&`c3d6n$YsDJicBvk<#a3P=*xXO4j*e^x<8 z-cF5VHJ4MA5mA|+4dK+1ktGR8x~MLpytIj18b(=s_mXUqa>AV+l}$`+M-}(Q4R~$i zmw!i+(Yq$6aDTCkMK%+{Q{;eciP0~=77ZqqYgu`B-xk+Jz+h%^tAYQ3bd5G;HgMN{ zyn>=bQZRqiDdd!7UclNWga4c%$wUKKR(-D1xSw)M68JB@C*4SYTj55V_0Q!k`nS;; zx=YssJ52)fpQ~W1u*n5LV!pP}ltzZft_L#XMWdU_c9vy>>h$7+%DUf%cWA9~&$}cn zu$j_br;y0-uKShKlNN>>R$)^)AKv#g(BC!I8*YG@IfdyHtxa>Rw>r~JfON{Cd9|r4 zxs2sC$ymo_WK3~NSeuK30+l3%eSA!kjCt}&${`-kSZI)|g{I66F7Mtvpj&USyL0a^ zXGH1rN(@Czi8}@*1`%>{)8xr_I>n;ON9IH%6RAzS{Ly>>-*;fEoEG%Q$F0d1>$#wH|ei0Ap@n-|E1_*NU zdPq(V#t8Wq0DF_UMrQ}cW&nZ2Zm@{4OPC{wMVt1I`Pi8al~ahtjn45}!Qit1G#h0U z!r2I*wk7+}nv6hninKy20VuxpL`E-L{@!L~6xw?fxVO1>fF0~>1M`xQS*^W{u-}^N zKdFo;BL@ZvaxM;ERC8?2y_38znX{I^Z!z3gYtLAbElFW6FM*oX{QmxNKj7fk&*R?p z3*UE~T}0VwZj*p*QJ<9N+SGteHn_kfEjS(XI#+%#apZs$vdbNYa9E4azfMl}(GHWV z^S}VO6*y>PLOru|wigT5r>Rf$^*o zlpgNyku&~YTs_DA?Q8t(FaHWJUf$sOi>uPf*I@1i5P^bAz?y>XQL-5}zbQe_NkSzu zn;)-l5n#HqzRm3o==W+3yn1<#+jj@t3T%6lUJJM|yK}61bD?^r`gxt?6eJeF{5Q$T z!GB!N$&|XZln5xu>ygUT*a1n-Z@ztl^}5G)v&N+lRb5-d!ZqRD^EDwj;e9=a-M5&A zJ-R+6FK{wx*vSMRLUZ0E=W7FKXRQUyG!F)xM%bA?4s}vAgX+8xtVbs$)%U>>33w2o zHOZmFyk;|waJN10S!Mu|LILL_3nsJm^qaF7iHWNNQ8G-^nBGec+#vBO0YFD<1A7M( zBeZaN`XtLVjU4J1)^Kbsj65#~EVk?gp}a|-Dfi!24+hTJqFX+3BI?O)(u9%W2fpU? z(SGH08Q)%~v;7Ut?VQccmhYDEC}hwp_lIS46`QQrWup7tY6U|1*lB`Zt*ZyiD0-(& zqF9!!d0MBedrGI69R&ycGscGXP$>=A{5e=V9TCsS5kUhG&`zNqV+^`(DXyH$K1wpfR%bRXH5SUVEJmi{Jyp&bY4zCO_@|H0)O zVx_x8#`0wFRI>eK;J-;vIO+*EKe)l_*#>~Z`X*(xcy}vr3@QBCd`ia+ug~5cVf_8e z^N4T`W6e)254&i@G>BvU?a#js*J;Y3lUSer)~CL%R1S_XSBePVU76i(a6rync0Rrc z0qrY3KU;<0$?#GNJCd7Nx9;PFz7>?i$xe9t_x?onGy%qs5x=;+`1A#Uw4AjDd+(f6 z*2axrzXmL@`|fSXYmC6)*t4fK21>!PO40cA{iT$Sv#2=)(3ACyr+O9ZS$i4jJsD$@ zv6ui;LEoTB%J6HhjPG|gStVs@I^9OrH~M1CbO>SpB0D8Bs<6eI7Ime%$d1Xv9vV>i zz$j;kfXFwRf}wwoJ%XQ53Cf+I{GQ@SlJbcm5(T9_b>_$*)R4m1V9M80fQkSBs9}5( zLufLVEx^Ekc{&;Vhsw1j;J@6eV^U+^9Qd!imM_L-UhC^kuG#VrX%%&go;)DI+e&Fb|9YfXkcbIJ>w;@7D}F9#b%Us89gM zv13@3muBqrflSOyP>eaY7bT7%|Tla{WJ zLVEY+0mI-7{43pKwaxT+?!XlGu>{t$#zwXgmd^y8M0QY0MjZ+Gck}WZmlqPNW8;MK zjIk>Tf6)ToWo?EmoP{b&2`FX8IUoX3Tc>})bQRspx=KUFx33@2t*-z$fB{d$M5HqZ z<$gCd*^HP1Ax+J=rlkfl}V=k zZa*te-lo=F2%QYb;6Fez9LjTM)7gRcn0ngKM=%9%4&)Iul;^OS73 zP62`3_*s zoNrz~APx63CNkFK{QS!=uvuF?fBsCIPsFtF0Hv!+2Kvr|>3(n-nMm?zAGD6-&gsnA z`55-u#UNT?UOEgD?rxpF@9c^1d_Cnm^jO|6;uOkO&F`LaQyf<5HQ;!vWjoyV}yL|3^yf||J&-{B4=HmXuPF5FrEA6?p@3LWS)w)Tx90H6-%bR+5=U z2P$r7;{^Z#gv#+(ye^3~umAz(83bWc7QnJi_i_@r4xc_GT76@Y#F|gFnd0%5Ki%w_SF%Dh?0FC|mKG8HNM|xXKPEQ-4_R z>{^96%JuniJZ2z3;PCJuj*ghkF#-_)R@$p4N!UO1S%_YjO=d_f4rnpZm<(E)XZNki zNOBe-L8XIW*&dbToU;u|Nz!jI16C64WoWk}9weKqJKV02TFgDKJd&JAnU-!{^XrNGzq*V?n?jvA^Pl_U7|KR)4W(2F?MwY=r??m8 z;f_g82{b9O3IgeViuO@dK8Y- zS-3%F0qAZOLg1R?4ib()dL%dCZ4y40pWw1Un6SggFM#t#Hu?AKHH;aPk5-Cn&ZROl zj_a^-=2V#(LY+I~M>}FLd%XDkW2~NSu)aybd%yhp4j|*?*Z$+30R(*eaF@u;)A%4L zDlAFk>9Eg@uQAiRzxms0UH`>@^ZPY1@Xasp%8LLdE*~p5!*?a7!~TfP3keKqVb6M8 zUu{`CvHrjQ-+m@nxCXxXM_)VglUN{;5qd)ix`AZV8Q%SnLKa^#%viusQt8>}l_3r+FuJVp+Wnh7y z{~v!13A^z5?|&I($lmYWL)i!PUM_2GRob@z?jHDikL8oPG8rWqD82pbuhZ|)cj6EK z%g-edLNfP9bjll&5kb5AJ42mZ4*z2<=FNK%#g?>)eO{G?_L{3nj!7Wgj~ohw$h zA+DP<;J>_RIfb;re>UneVxF0H=yxzW`cTGF*&6tdn-E)T;jaSxXKnri!GU8TZyI8q zWm2kxQYajZHFn8cPse-Y2#d+PBrW9-u#$!iKXJlZK^n7umCN)<&MLUcAEj z#dW$-qK%sWvwAX-r~G;a=&}?bQUl{j1}agDoH2HMXgQ_(lW=X;QJfn$ks2eGhUbt# ziH_~Wt+$-*B$Q#mJpuvFf%s}6&RS)7;$XwWz0+%--CPC-V$)b$NfJ0n_ zKnXk|I>SXdhZ3~Gj8xqW6Au~4xB)UhNgdd7TA)V&<536j-yEoJDKL(hIHqX~2R6yB zay%ZAFbf2rlM-hiJO%v6<>YN8@|(LLCxAlEylf3zI87r457<0A+u*a$KL#)YW@Zk^ zz+uT;wqA$#+bo|a3E%-Ihs5%kJETsMlh^%(a`L}j)_rnsshr|728R3cc{MBF0?_92 z<#H}czMXmISwYU3aJ^i{_mY#_ZlrKTb8?2YipdF~OfCG7AkWe@mjeyMp|hpnSs-y1 zi6My^>+6yz3AvmTm_zbJkZ)B^*50sxhxPV(R?mExq7vlifYSi5W(NamU~a8DthZee z-Ge7$uLEM3`R&=(Gtjy^XdT!vcGe98>Jd|G&OqCBeRW;P*PW$u{`{~16F&d)E1aDZ z$a)6YKXc$EcXUc?c9l`6rmuQ7KM|DNkh1_rEdbKya|~w=sR3!J%-Q)CXXjgd{rBHt z*t@)!*DrlN`5KYR0mN+-*Bz~~Sh4*}u&rm0R_L2lnV{m_-hPAic7>Z~moc1esCS;# zmt}}Q8^GkGxUnD)x!j+f(`A_)SDNkLL`QlZFuWu^ij9`#qp@0L;^E&yELheVewXXq zG#)T{o9*iCS$Z=JoT6Bfx_%>gs?(&DE*R<_lM3)(-@Awu6+MKkWVvMr4hR zhoSsEs+WV`h+$dz#gK#UlRX1Xom?mtn+3eM7cfPJr~R*mjV!>jAh(T%8LD>z^&M8mfNf-?jU;10y1k9EjqW zF~G0W9kDo?*nYpp!*@q~^~LXpygVxJ&;RZ(W}i!0Ywbs0UgO{V<9`xpDJ_8i;ZJ|; zgsXTO`%T)b|Kbn+k;`i>%rxQ0fAxPQPRheAo3Jd<`SMp6m-y)V6>gqAgVGw~VZdR( z_h1ME#{@_pfQE(jAC6@Tt%^*4!RZ-aRA@HWO|1b}-MAhY9OLYU&2m}`9ETwQ3!R8{ zHpHvz3tV1bCLw$t3C`Mth0i;rIe3r9^iH44{b8&_pW1N@cSD$8 z_CS09mti+ByWy>!o|7J(z=3=c3xGizH^%wtxuc$NR3o1M;06HD-)v=|UzX;8ey}o# z4gk&?G2(CE>4mI9G1IRz&<_CAx%?iLZG#?fe=a}QZ~e>Plf(l6eEZGa{JW7-@eR9V z9%RD_&v;66@BTJ>CRX@2{>AT!H(q~pUv0j25$fE7vl9V|M+*SExh@z9um{+*y)HR0?dfn zooN9y<~J(?Y@E`jeM<_YdDD*Z;{EALBYd`Q8Bk6=^B>&!=%1n$NA- z+$lXfKS5;S99J9&cJbl|PIn+NOgd&J?d&97{So=s`?>>oW=mxXh8m^CqD8X;?jgq8uIR(?iiF`UX$Ip<{h5OOZ5e}SBL_ea10?{1wD>*Df8l!cNM@>gQh zkaYjtNxSquF+y&(3Rj->B(z-v=tyB91p`|RoVnO&`v|A0Bqx{k$>dBMk3W6izW(kV zHfIj#85x)2JXHgTNFcyD#-6#n1S+v6?p+IJsEVAYwEt9ca#=~v?b!xD{NgiKu?M9{ zr=lD0EoZ1%93F?)TLFehazHm7G;sh55QB=VSVDZViyy%)|K< zvM=o0?@LZDYn3IT(YKG1vnFfSCrf};$z=(&DBWKQgk|>^0bCp9=j6P*kMkLyN2NqI zJ`Skk^IoLttW^X>jH;_zT_JWe5eY@Q^&ktfn2YX?h~gx>`si#0D#%+s4q zkLNF*q2HXQdx`5;KYI(F4s?+a&pJ+WA-yGpek@OP*qCf1RU<);<(T3l74^O z^&9kC&zi{X8WTPD2)*6{;|QZW51{Wc?(YDt(XUyk^bkgwfs3imX^f%b0>et30Z^(- z>kbMEBlX2J0#H!izQh4a`CG4@1uR(gvW&+Er^jADdlk-5k@MF%NL5ic)j3g!yoxOS z<}A6+0b2C;lo3D_;b{rL;6Z?^P3q@S0LE#Ga;WqG4^aB70&5Ga<#=E|h`z^q8~2<_ zsbW5J>^x=P@OpI!SM2_A2Uk_VGb*jK@+y-nU6+(nNfREx$nLr+X%AWJ();gB@&4Q_Fh;!D4d$}L;=v2BcMdur?8fA0DSb58KU5la?^53Hmjv&&ed(+xn?2^Fu>c` z0ftLcn3pJ(&)JHc9X;A>lrNy6^I^Z?yCd@eqX0}fOjOC&tLT;PW1RLaO>v`WYZ&k`qmA#hW(f!V z*rDHd=sUB(0f7BskN#j^qKbcUX*n9^13cH&|I!jKgtbvUeS*b{)A@7KT^@3Hqr0Z%iH4^ zY5=N}Itsg+rh476$J@5_G3E0E04{--zu}FvU;Udu=U6V#0A9bki;lZKI%mEVDv?CB z*R?CM_@&id0C(4U{v1`DGNKB4Ow4Yf6k`NC3#+HKEF(CbPb#4ZgeEDb=iUYu^0fJAx!m zhVVx#GUZ&o+2WX&OKvK|{NGPI2z)gpRhxtiM37QqVS3&6`FH+rKh${nbXXX#&a=`7bhzGWq?J)VMcueKZfX_>XbEard;;`9*d$-V0|*4Q>i2EuX=es{Nf`+Fj!X zML(A~mA;B7a#IIuN@mtdPm%?-(!P8l1$w8dcGlwb%qspRM3NGL!|%>S&l(U|BM#Xi zO8dKe9{~GKkmrd+fqaUbGlz8?@}0yiR)P~MgoMm+Cgr=d-yI;T(~SJ*#--G0mMS5Y zh=J+2R?%<|GkJmdXK42T03ZNKL_t&@9Z^H)$RKZCzVLsy>(#7+)zo=f|FJj?zPkwL zX0yVN9QiMK2PeZJk;L_bs%>+l@{xq!8Sxr_o>gZnkWf;ivLris??q5O1}9Oon8N9> zQk-et`xxX)2H>gi%UnKAaj;Y;Ti=`^dhQxBmb1>S_`;*>D%N}KHAL-XHpI}8I1LGq zt(?b1m3LXPUr+_eNUG`cbdEIZtf5MYu8bIL&)aEB1W1Ar01mr1e$1zdlA2vObUGGu zBsp%Z1nhVzV%$NgFF2)~Vjr~ux9d~fUcJQgZ@>2A{@M9u_&zZ>DOL_AmzrjkjqBb1 zZdUCz;53Sa&%b?zi^~lzE-iU|O5GRmOUOpZHV-G_YJ6?!}rp*CPG;Iw5$I2o)I zr>jdLb}r94M@ji@Q=z@Au-gjkw&ojHn$v_bYgA4AtSEUeJqP6TQkUF(S4hFmbI%_c zN6gLDD}48d*I2D;JbHYFrmYr{cUgtecO?I^3a_**zxM1VPO4PE_t7$!(jE!u2LFMTpDsgixG zbd6$^ewlGM-4GLvr<|=Q#WnPPo@&(4lW%^yXaK%U`Du}#=USe&HJ5`hjg z-<4xFZB?weMvRlI!{b}HHgOwX7pdzqWr|wI`I1zOY;jMV6zef0Gl#R3W|iS*`VLJ~ zip8@kdX(d^4bEgoTrIu}Q$)!H^QF1XW>eR&I62kOByk&!=B_D{Y}w4^F=8D0X)-Xt zx9L418f2ujsxA)ehKoYZj!6h%r~2n3R92BMi{mxvnN4PXeaftrM4_)Me_s0E6ldME z;oBu^NLfdmovLoK&l}wkpn+%(JNEm)8G^A{*L7p~J!8+dr)&41(kHS_2UTP3A$4PT zO}708zvguj@WyPNUR5=e8VR|uifr_LLkfwSLzC8nT~ijwg^6#lsyBX2(RFWelD;7& zG)72K$Mdx+)L&J?M0X`ve47gM+&GosB}r(l_5bug{w@BO|KmSSW=vmPssMPlImMrS z{uuy?Z(qN``RO?>&Mz=f=~F4~3!tF}yQ4{%P`|D*g{ZtjjyrEURUoYCaR>xH_Y!E= z`1U$#ydlo}aIJvlqVcg~ ztoe?#2(KC}iFaRmbaDtBKDL54mrno1N1p%bECQk|T5URVF{O_AvH(@51X^aW4!H z5cMYjxckF*g?^y$#oxsD<(fBF_FFaxOsW3WD~@QRv8wB0KXr*4gWmihC(@4n2=oVh z{Leqbun+CO+mRg#Hr;-Ah4jAu=CcoR?j|!!$bU*3$KZX)e=3$Jj;^15N>u_LZO#Tm#S;`z}nntMs`8QdAg+4#JX_ zoSHHv0A}|rYCsR@57z0pzJxQyx^ToL1;9{u{Bji)0R0aYA4ukMOv=5NVW4#VL+xrM zgmJ2;{mAy|CVGD1S@pf?(;Zp-s$s_1MAm|>UF*2(&(Dkzz=iq^*W^1}>AgJI&ek;V z+%$>QfH2BQOK+SwZ(0{4-cf>K(I0(06UWh3}uHq1xV&sLJK- z4jOKX!i}k=%_)w==ZJei9&R^H_xWZVGyZc}xv;?R8|#y&kMQ`J4X;e?xJN3#W{G*% zk0R2}UC&@Gz8?$gDiYa_y#COQxVhf?u)vOdcTD0`0H+iH)u@WffiBVO4|isMP&E>d zAFm?(z%o*S|C4dN{>donlJe&iwP&#w#?N9#r>es{J`O|$v_19r zBc1b+j4hl3pi`2g`8WkY>hA(Ds{rW!R^y0fbrMwk69qs=Rvz~|$bzlhhk{MkVHqZy z(J264KKU5YqthD0?#34=L_ALcV2NMO?g5qrnA!_nh&p$C9LM5yQ`AY01epEBbj8wT zhug48UQ{*KCl^sRrIhhqy0FG{&Id~fD3K1G8N@}}AoWnx+B>a<|L-s`DvN@Yk=TVY zwMH4&31ROgxi?cLKh88w16kKm8Hej@uM`Ow8*hY9$6!)iLL+*>LJL$)9o=7~W>|P| zR1GjHn~Q^{=Bau@YGtMQ2s+I?XuV0V|~WXPpMinhxG{i8;kXx>oazK z%V3>t(-P);*st$1e=9>-s0vxKKQF|3l$t-2O7^D=XHu5qx1`ZAv+_xsQa?(SgyJ<- z(ecae>LhbJH?J$y1dlH+jFZMWxrM-wKlzdOV9TcQ4d!<`b$e7&n8{`x z&R0$A%W)(Dt#x2pYCHHahE%HdX9_TmT`6Ql9_qRdU3c&Yy2Anep$lPyT_Gwab(F|| zbLr3x=(-+lyTUjE`t2UyeRs_(8BU~h?YlHo>r6C+tdzE`{R_r9o$0H*w`3Cy4XqTU ztgv3!_~?@l^Q$C@4{o1_l%d~vSx(z|JB;Wt;OXZdpuJq9PD1tqz?n3cW6$ZTiXL}DS>cln~m z_o;|TXD5&8+&O8Qn?JmYPdHN2=>|`}L1CcX}QKTP{pM)sq?3XhE=4>~*Y zD9Ve2>tB8YAn7@31Z0IT|5Xyk*Vg@pkm6G8OV#^4nJK%U_y8sQrMc>L705}+b=SX+ zl^E&$eepN{RS~1Rx9q-j`M$Ks$04Ws2jqQN+av2L^i!(r2LRp36R>W+<`pK#zQad< z_PJO0TW{>{hdqZoZS=fT`Sx6@{PzyzKV9h5%as2p-44a~gCIBE&J`|%uZV^S4jA$R z^JC!-9Gc>FI>~E)N6q43EF}L$;cNZyt~rYrb2W30>>PjJUgeAJW5{TJH-5>0 zG?RjZv5>(VK*+I~aAO=++9JnbrHXM&!ya=4k7`}>#wdHN7;-Qvht^{bGlpTgoB-jl zwyO%ysPe_6;cU6`V5n>TPQ;zv*6d1rdu5!f%Blth!_2E6W5{ow-_|Up!w%_=jhGA0Pb$nl~+n^NX(t(C(ByG^h3c$f* zJw01_BS=#j!q8^(6m)kaHFyY7VH`C;j_ElgD@mixTajmN#y3Nh^P9}bx2@|2w2f)c zcD(_x_nY)qO+3GF*QEv#F2&#Qe9Rnr0ApwG-{2kxexB$}2U=sZF%ISP^D`SofIK&1 zWD=qRx-lY@aO9PACoJs~03eCdrm?r!Hi!t{`7@&Bp4c^QN=``~8|m1SDZQ3#|pYrSeZ60VNHPN zWzy5K#?b9%Njt2HM}mtzb{~RkA@A&5z+Ljkz`Ef3&0a>;ekl&-xkrhVv~Rs}qJ^Z{eSd| z4|lhC^iN!?J07F@c?b4nL$4MhurNGqI>9UFBn9zwmHFe0U zev9>SpEDXRfHvTh+|c3S;csFiPB+ApHsQ58;@gh zO;sYt{m@u#Irqlu+I(uwP0J@KQtdlNVUJ0Uz#45@qifPRb$(xUpIu|XGHcor&Izmr zXSWP1ImTh7_Og3p<^Hy*C(3=?X29ZHYi4~pN4A~atiy~W1G8QMcoHi&f1AU~;S@*M z&r4V%VxNtw>4@fnOz-4G1V~d=laHgx8gnj6iBIDg`_q!sl=v3}wq!;KS88C_6IInj z-wpvlt3E{B0Z=u@IOw9qY5OEg^uap`^}(#buNNT_#!8zS1{!h0{&zF_?`I0>e0BT;TT< zT5J99{)fNC|N4LaM?5+^$NAYQzWnh=_|3O3adCczi_OX}YU*}{N>&(2JZh~KWJ7LH z2gybu1VkE#**d+cl3%1WXFD==_nQ#513Q-7$S=;qCDzca=I z8sof9`d^5^>a=MbH4a^m_1bkhiBSpfjQ07+i(e%#eV=>?mMYNEl-^f~=?fTwC9Ogv z1`K+Ohuszm8bWKo(@Bj3M%(U(U2tNZo}c39fA%vTA7#PH8of|Z&=_ll&EqrRykS+? zhV4~+e-_)YUxy!v|ExC?3^q&VTNsURQ7RGrzWD1e!;hrCm%mBwi==8ojczJQRaQ70 zcFV$_&~$h8eev9rpYnt_02sE{g@vC+zh8l#6w!0*0x5=GRV2!VqVnpdm?o6$mz>bR zV|#DhdpK^dnP)cLnY1`r#z9FsrSv4b>8t5H^X;#>`!fA3Bl?l__T{T6FPFIXD20XA z0Q$~-$m0vOEHGy$NJIh}ci)v2X)Zs{iN`LDyPM)Uj`#$CCHtj`8$*OnC;I#tm8Q49 zd7T{_)c}kNpZ>*9F&=hA)i0#=nxBO3cDW(*_PhLj{;z-X0nXev*II1qy73L81<-A` z#<_0sSLA!2lK=e9Oq+&bFoqL5L!pjkAf7~Xgt0Wgx5>cttL|_UojZN}F`#4BKdRz4 z3`1fe(!NlwftqYM(9m`=7mS5!>?51dKokju5UA=p>hFpw0>aESgb@5VNAArXNy8DP zyLf3I9ETpwim1{67!IyKnvBl4>`02TX@4N{pEluEib;Ff>-Z=!v?g;ZrvT{MZIEXe z1~X4|lWL_#-`0M|kgQC8x=LIJu~Ot@dWc=Alf}>M^aYkX*xxf&Q^ovlUn%Ql zyFLFzcBY!FKhQ4PQXLaJesAx300P%<&3koznJcQ%3$54GzTz=Q2jHd&caCP$EorozDh1?LHK z{r7LKvoOj4X4MGijDkHOb#h@XY54wp8!jbrV>-!-(tK1GqNmhf>)E7)4mb&z39mPe#4AfR&beU#w~vaoFB^(qEJa zNojQ!=JZAZu!@|pqFzDu`)JdRFGh`?kjAO~`M%n;M#Mr5o?J*30EJeb0GNi1a|(c} z+XHr!l4}KN)#S#}gveFB6K62wLQ&TdkCRdmXXH9j4 z1W3ch`sf^0z@Y^qzvGmG;QLksJh*R<6cAO7)#f59JNP7pY2TD&-?si-sSc+A7#!!d zCm{gFpB7&)BKw*^+@=u0{*~3~>!`AGDsggCe=9_;16bE_csv2%aC7al0}v2x6F(zL z!gDH;8qtGH)%)sX{76Gc6Nu>%RtYewBRMB1gP~ZiNxQeP4d9jd7-BS3P3Cv2YoSUkrx2T7e;<`GZvI^S_WY2FwhOVA@V*bM6z{t#sh9feQ6yFd z_fZOSOE=Mwy8h@`OL*^#b;f?o;Xi7V$5L`|sSIYVFsITTonKm)K&0fRl{Vj08rjmG zH{>o3YrbaGOExImJfaETO*M`|*_WMT#(Wzf7PO#qRgihsabsLQhe_+CDa|?@wzhiX zW7UEQy^Q!bkDTnJO9pI0W&Tmbm}^WR~M8~ps^KeM>qwHitR-(3INms?#^ zpP#_L|GWQSNQ(U^@NfU-UjhIIOQ8GogD2k6U%APsRv1SGNji_T3|XO_gSm&>S~v6^ zpt{J33$3z6kB~;GPgEfevNNoiFn5tVA6?(0>pHmUXWw-=>=H*eatAF({v*YPB&$dr z=P-2WtV3wM-atb@Yl+=hLdpd7H9SUJ2m*9T}d;`-Wr123N%qW_#j z_81~u6jq&vcyP~56$~1r4o9Y=ih&Kc({+L9zALw6$eIdMmnMz~>9Ag0Y;f`9g1ru4 z90f(fkX7$opTs1Snf{b2%upqqtiMjE4Y641rFIAYB65>cR#>36P%@56De&g?HLB(m z!*IZU7v8aM9|&=)Q?nWEn6Q*mR-QFGsMYcsZ;TFU9)#PcKnd8fT}MWk-`Q;N6IzMdy+&Yv}2_Zt_0+;GB^3 zdjKPzJ~@fPa&zjnloU$WE1dFIDLLnWV91*QBGq3&M_858xOuxpH_(k?*Zvu-vJI8w zTPrF6eY(#l+(V!DB^qspE}{HAMC}m@Hl&|;Os5W{dbI{HL~9i~PH^RhcImNd$Y!Q! z4Q^8wD$CB3eVEaBesFQN!l9{f=ms2i*AbT0YQxcd&^z)jDXWRb9G&^>sJb&92b^lN zBC}lQ)aedA+PXzsx9GYKFJE1wZEIYduhFh-m?yf?ks1F~Y3{CFz^D2A! zoO+Ss?i6|DkBl|FMz%HT_7NbTVeETsZ{GM2!L*+oZq0_>)!9?4%Ew@6jDnvUhl~iQ z!P_CD>#5?ltUM8qb!t}gbl&Dp@H5?`u%m)5U`K4O=Nx+Z06 zATe05*a;4!rlxKE!EO~12yL01x?sSWlD7gD|5px=I|L{lsfcoAYh6}gOi!@+=t0~5 z6PB>}vI*73C|?1f+awH8xCc!X3JaKZoE^e;`bgx@-IqqFPaskKL#E!hB(cxLeM2~< zK?j(0FmpU^ftkQ7~v{F+6iC+_=JQWQKAE5${zDm7&GxuOkqDb~{YC3u-@ zDAw$G7BCj=Ju|o!y^iV2H0*Y9GwQ;+N_pQ2E6MZDSW9>r+ka`zLC3O)#F*N~i2aSV zK_p}0Qk(H26+nxH+XSSCp0&5Cp0sVl;BBaVyKx8odcJJmPUvA$M)m@_k;8Fz{O7;# zp~&@)oUcefsGBzXP&?JXs%{}jyLe*SIG`W8?1Lty@L_;Q7Xe9WVxy;PUP7c(3Zo+H z83BN7PH@kk_JfqyB!sPB)Ui15*hlLwx29AGA%(}WGyO)XsJ*?ypc)LQOgb2(vEvW? zXgBSQq8o7X37ngAcKfYAS5<~g2-W*FysRn=eQ&a; z&i6~9fq(e!KZ8qOJ^NWi0!%B97#el6LT!ymRlD)KP}I;tNE0APb)D~+RkI3CTCJnq zu%c>EHErhHrA~3h>~wX`>7gHS*zf&A==%XZStQd=kUE)D@*i>6`~2FfRY)?DZoV zz^kS;3nhDADdipH8YXm<)+TJ>$;r7_Gin8fluwGNiS&{EIF{+kV!~_rHErc7H{zO+w!3BC-0Ko!$Lb>nhDba0U{0xF@@SnyoD>4ghetxrzvk05I%s@xfQ0Lg*22hH;H}K}U`M zNtq8t{xf9pyoTr)(?{pR{(7!kG*)Tu&)KlQ{;$HjqO*$POl-Fk`3a}YM=zJzC>lcf z1|D4?_mR=gWS|(_4rdOg&W_}_qm!XO%NC4l;dk8TT*zWx`7bUuy}R@}F41{eslVPg z?61GG1t0LVuLxbfEX9+mBm3ip0u+EsR8XQt+V*L_uPzza4PFWPaY}iHBmM!vqo)@* zJ2gbNx!wIKxi&IZwk`Y2qcRq%5=H%oyjy90mgtq@O%0wFtGhljhG)k2aQ%{<^eN6m zCyEMMlqBRxdHbEaujOiciy${V@?O=J4$lMjM=HpR-gaH1 zLYGe{IFcri8=`@Tv>Js0K9aC%iZ75>XZrpz3P_H?7ZGglfz{zHVl9+As{l&yQnKMu zZF@v}IP7;fZz1b^tffS^`;csDAB{*pwm;K;y*dqf=hWj;f~_md5p6k=?S1ibB-?gf zMQQ;l-qZ8Po&@;f56|)AFFp(9E>s6D5x}R&pjmkF#AzhJJB{i}&h)Dgf=NIzeQXSK zmx{;B5*huPK$Cu{g3=j-mtwtqdWjd`y+OA(`Kdy1�uQ^B6Uvpb*SCU*q4|9Dz;^ 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ξ6GTGiXw~P6*t4gP+*<1AcR`Canre; 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%0ANf36DE{l_r^Dy}{RZ&g^KLbqM~!29KAh;c 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%0AHU*|u8( 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 z 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 UQ!aROH2^#orZ-LMjeH*d3vP_OR{#J2 literal 0 HcmV?d00001 diff --git a/docs/interop.md b/docs/interop.md index 5a8a524..77beaa1 100644 --- a/docs/interop.md +++ b/docs/interop.md @@ -14,6 +14,9 @@ cargo build --release -p shacraft-compat -p shacraft-server # Import a copy of a stopped Java world into a new native store. target/release/shacraft-compat import-anvil /path/to/java-world data/imported +# Large playable maps: load compressed section baselines instead of block edit history. +target/release/shacraft-compat import-anvil /path/to/java-world data/imported-large --baseline + # Open the import in the browser through the server; select main in the world list. target/release/shacraft-server --data data/imported --listen 127.0.0.1:4000 @@ -34,6 +37,8 @@ target/release/shacraft-compat export-schem data artifacts/build --world lobby - The CLI prints a JSON report to stdout; errors produce JSON on stderr and a nonzero exit code. Conversion runs offline: `WorldStore` holds the same single-writer lock as the server, preventing concurrent edits from mixing revisions within one export. The source Java world must itself be a copy of a stopped world: changes to file size/timestamps during copying are detected, but this does not replace a consistent backup of a running Minecraft instance. +`import-anvil --baseline` keeps the original source and conversion checks, but stores each nonempty section directly as the immutable world baseline. It avoids creating an undo record for every imported block. Imported revisions start at zero; later edits use the normal journal, and reset restores the imported map. Snapshots include the baseline. Unchanged exact exports and edited best-effort exports remain supported. Without this flag, the existing import behavior is unchanged. + ## Implemented features - Big-endian NBT: all 12 payload types, numeric widths, float/double bit patterns, signed arrays, Java modified UTF-8/CESU-8, Unicode, the element type of an empty list, and unknown compound fields. Duplicate compound keys, impossible lengths, excessive depth, and trailing decompressed bytes are rejected. diff --git a/scripts/build_physics.sh b/scripts/build_physics.sh new file mode 100755 index 0000000..eb1fdab --- /dev/null +++ b/scripts/build_physics.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/.." +# Install once with: rustup target add wasm32-unknown-unknown +# One implementation supplies native authority and browser prediction. +cargo build --locked -p shacraft-physics --target wasm32-unknown-unknown --release +cp target/wasm32-unknown-unknown/release/shacraft_physics.wasm client/physics.wasm diff --git a/scripts/check_chunk_streaming.mjs b/scripts/check_chunk_streaming.mjs new file mode 100644 index 0000000..f6d0f29 --- /dev/null +++ b/scripts/check_chunk_streaming.mjs @@ -0,0 +1,293 @@ +import assert from "node:assert/strict"; +import { harness, Client, options } from "./server-harness.mjs"; +import { + getViewBounds, + mergeChunkUpdate, + mergeSnapshot, + positionInView, +} from "../client/world-view.js"; + +// Isolated data and port: this check never edits the running demo world. +const opts = { port: "4012", ...options() }, + h = await harness(opts), + clients = [], + checks = [], + transitions = [], + world = "test_chunk_stream"; +const key = (pos) => pos.join(","), + sorted = (map) => [...map].sort(([a], [b]) => a.localeCompare(b)), + view = { + world, + revision: 0, + viewCenter: null, + viewBounds: null, + blocks: new Map(), + }; +let receiveError, + explicitResync = false, + snapshots = 0; + +function observe(message) { + if (receiveError) return; + try { + if (message.type === "error") throw Error(message.message); + if (["welcome", "snapshot"].includes(message.type)) { + if (message.type === "snapshot") { + assert.ok(explicitResync, "Walking must not send a full snapshot"); + snapshots++; + } + assert.equal(message.world, world); + assert.ok(message.features.includes("chunk_stream_v1")); + view.revision = message.revision; + view.viewCenter = message.view_center; + view.viewBounds = getViewBounds(message); + mergeSnapshot(view.blocks, message.blocks); + } else if (message.type === "blocks") { + assert.equal(message.revision, view.revision + 1); + for (const change of message.changes) { + if (!positionInView(change.pos, view.viewBounds)) continue; + if (change.block) view.blocks.set(key(change.pos), change.block); + else view.blocks.delete(key(change.pos)); + } + view.revision = message.revision; + } else if (message.type === "chunks") { + assert.ok(!("spawn" in message), "Movement must not reset the camera"); + assert.ok(!("blocks" in message), "Movement must send section deltas"); + assert.equal(message.sections.length, 12); + assert.equal(message.unload.length, 12); + assert.equal( + Math.abs(message.view_center[0] - message.from_center[0]), + 16, + ); + assert.deepEqual(message.view_center.slice(1), [0, 0]); + assert.ok(message.sections.some((section) => !section.blocks.length)); + const enteringIds = new Set( + message.sections.flatMap((section) => + section.blocks.map((record) => record.block), + ), + ), + materialIds = new Set(message.materials.map((material) => material.id)); + assert.deepEqual(materialIds, enteringIds, "Only entering materials sent"); + const departing = new Set(message.unload.map(key)), + retained = [...view.blocks].filter( + ([id]) => + !departing.has( + key(id.split(",").map((value) => Math.floor(Number(value) / 16))), + ), + ), + result = mergeChunkUpdate(view, message); + assert.equal(result.status, "applied", "Real client accepts server delta"); + for (const [id, block] of retained) + assert.equal(view.blocks.get(id), block, "Retained geometry is unchanged"); + transitions.push({ + from: message.from_center, + to: message.view_center, + entering_sections: message.sections.length, + departing_sections: message.unload.length, + retained_sections: 48 - message.unload.length, + entering_blocks: message.sections.reduce( + (count, section) => count + section.blocks.length, + 0, + ), + retained_blocks: retained.length, + bytes: Buffer.byteLength(JSON.stringify(message)), + }); + } + } catch (error) { + receiveError = error; + } +} + +function assertReceived() { + if (receiveError) throw receiveError; +} + +async function assertCurrentRegion() { + assertReceived(); + const region = await h.control("world.read", { + world, + ...view.viewBounds, + }); + assert.equal(view.revision, region.revision); + assert.deepEqual( + sorted(view.blocks), + sorted(new Map(region.blocks.map((record) => [key(record.pos), record.block]))), + "Merged client view must exactly match the authoritative region", + ); +} + +async function edit(client, changes, operation) { + const result = await h.control("world.edit", { + world, + expected_revision: view.revision, + operation_id: operation, + changes, + }); + await client.next("blocks", (message) => message.revision === result.revision); + await assertCurrentRegion(); +} + +async function walkTo(client, x, center, expectType = "chunks") { + const initial = (await client.state()).players.find( + (player) => player.id === client.id, + ), + strafe = x > initial.position[0] ? 1 : -1, + seq = client.input({ strafe }), + pulse = setInterval(() => client.input({ strafe }), 100); + try { + await client.state( + (player, message) => + message.ack >= seq && + (strafe > 0 ? player.position[0] >= x : player.position[0] <= x), + 10000, + ); + } finally { + clearInterval(pulse); + const stopped = client.input(); + await client.state((_player, message) => message.ack >= stopped); + } + const update = await client.next( + expectType, + (message) => message.view_center[0] === center, + ); + assertReceived(); + return update; +} + +try { + const manifest = await h.get("/api/manifest"); + async function material(state) { + const found = await h.control("catalog.search", { query: state, limit: 64 }); + const item = found.items.find((item) => item.state === state); + assert.ok(item, `Catalog contains ${state}`); + return item.id; + } + const stone = await material("minecraft:stone"), + gold = await material("minecraft:gold_block"), + diamond = await material("minecraft:diamond_block"), + iron = await material("minecraft:iron_block"); + await h.control("world.create", { world }); + const plan = await h.control("build.plan", { + world, + expected_revision: 0, + operations: [ + { type: "box", min: [-64, 0, -32], max: [79, 0, 31], block: stone }, + ], + }); + await h.control("build.commit", { + plan_id: plan.plan_id, + operation_id: "chunk-stream-floor", + }); + await h.control("arena.configure", { + world, + mode: "creative", + spawn: [15, 2, 8], + }); + const client = new Client(h.url); + clients.push(client); + client.ws.addEventListener("message", (event) => observe(JSON.parse(event.data))); + await client.open; + client.send({ + type: "join", + protocol: 1, + manifest_hash: manifest.hash, + world, + name: "ChunkStreamProbe", + features: ["chunk_stream_v1"], + }); + const welcome = await client.next("welcome"); + assertReceived(); + assert.deepEqual(view.viewCenter, [0, 0, 0]); + assert.deepEqual(view.viewBounds, { min: [-32, -16, -32], max: [31, 31, 31] }); + await client.state((player) => player.position[1] < 1.15); + await assertCurrentRegion(); + checks.push("Negotiated welcome supplies the complete 48-section view"); + + await edit( + client, + [ + { pos: [5, 1, 10], block: gold }, + { pos: [-24, 1, 10], block: diamond }, + { pos: [40, 1, 10], block: iron }, + ], + "chunk-stream-before-east", + ); + assert.equal(view.blocks.has("40,1,10"), false); + await walkTo(client, 18, 16); + await assertCurrentRegion(); + assert.equal(view.blocks.get("5,1,10"), gold); + assert.equal(view.blocks.has("-24,1,10"), false); + assert.equal(view.blocks.get("40,1,10"), iron); + checks.push("East crossing loads 12 sections, unloads 12, retains 36 without snapshot"); + + await edit( + client, + [ + { pos: [5, 1, 10], block: 0 }, + { pos: [-24, 1, 10], block: gold }, + { pos: [40, 1, 10], block: 0 }, + ], + "chunk-stream-while-away", + ); + assert.equal(view.blocks.has("-24,1,10"), false); + await walkTo(client, 14, 0); + await assertCurrentRegion(); + assert.equal(view.blocks.get("-24,1,10"), gold); + assert.equal(view.blocks.has("5,1,10"), false); + checks.push("Retained deletions persist and returning sections include edits made while unloaded"); + + await edit( + client, + [ + { pos: [24, 1, 10], block: gold }, + { pos: [-8, 1, 10], block: diamond }, + { pos: [-40, 1, 10], block: iron }, + ], + "chunk-stream-before-negative", + ); + await walkTo(client, -2, -16); + await assertCurrentRegion(); + assert.equal(view.blocks.has("24,1,10"), false); + assert.equal(view.blocks.get("-8,1,10"), diamond); + assert.equal(view.blocks.get("-40,1,10"), iron); + assert.equal(snapshots, 0); + assert.equal(transitions.length, 3); + assert.ok(transitions.every((transition) => transition.entering_blocks < welcome.blocks.length)); + checks.push("Negative-coordinate crossing matches authoritative region and sends only entering blocks"); + + const beforeResync = sorted(view.blocks); + explicitResync = true; + client.send({ type: "resync" }); + await client.next("snapshot"); + assertReceived(); + assert.equal(snapshots, 1); + assert.deepEqual(sorted(view.blocks), beforeResync); + await assertCurrentRegion(); + checks.push("Explicit full resync remains available and preserves the current world contents"); + + const legacy = new Client(h.url); + clients.push(legacy); + const legacyWelcome = await legacy.join(manifest, world, "LegacyChunkProbe"); + assert.ok(!legacyWelcome.features?.includes("chunk_stream_v1")); + await walkTo(legacy, 18, 16, "snapshot"); + assert.equal(legacy.queue.some((message) => message.type === "chunks"), false); + checks.push("Clients without feature negotiation retain protocol-1 snapshot fallback"); + + await h.report({ + passed: true, + checks, + transitions, + movement_snapshots: 0, + explicit_resync_snapshots: snapshots, + initial_blocks: welcome.blocks.length, + initial_snapshot_bytes: Buffer.byteLength(JSON.stringify(welcome)), + client_merge: "client/world-view.js", + binary: h.binary, + }); +} catch (error) { + await h.report({ passed: false, checks, transitions, error: error.stack, logs: h.logs().slice(-8000) }); + throw error; +} finally { + await Promise.all(clients.map((client) => client.close())); + await h.stop(); +} diff --git a/scripts/check_player_physics.mjs b/scripts/check_player_physics.mjs new file mode 100644 index 0000000..e9284f4 --- /dev/null +++ b/scripts/check_player_physics.mjs @@ -0,0 +1,221 @@ +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { readFile } from "node:fs/promises"; +import { harness, Client, options } from "./server-harness.mjs"; +import { loadPhysics, samplePhysicsWorld } from "../client/player-physics.js"; +import { getViewBounds, mergeChunkUpdate, mergeSnapshot } from "../client/world-view.js"; + +// This check starts a separate server and temporary database. It never connects +// to the user's running game or modifies their worlds. +const opts = { + port: "4013", + binary: "target/release/shacraft-server", + output: "artifacts/physics/network-report.json", + ...options(), +}; +const serverHash = createHash("sha256").update(await readFile(opts.binary)).digest("hex"); +const h = await harness(opts), clients = [], checks = [], samples = []; +const world = "test_player_physics", groundedWorld = "test_player_grounded"; +const inputs = new Map([[0, {}]]); +const view = { world, revision: 0, viewCenter: null, viewBounds: null, blocks: new Map() }; +const materials = new Map(); +let client, step, previous, heldInput = {}, receiveError, permitSnapshot = false; +let snapshots = 0, chunks = 0, comparedTicks = 0, maximumError = 0, resetCount = 0; +const zero = { yaw: 0, pitch: 0, forward: 0, strafe: 0, jump: false, sprint: false, sneak: false, fly_toggle: false }; +const controls = (input) => ({ + ...zero, + ...input, + // The wire protocol stores these fields as f32 before passing them to Rust. + ...Object.fromEntries(["yaw", "pitch", "forward", "strafe"].map((key) => [key, Math.fround(input[key] || 0)])), +}); +function received() { if (receiveError) throw receiveError; } +function observe(message) { + if (receiveError) return; + try { + if (message.type === "error") throw Error(message.message); + for (const material of message.materials || []) materials.set(material.id, material); + if (message.type === "welcome" || message.type === "snapshot") { + if (message.type === "snapshot") { + assert.ok(permitSnapshot, "Movement must not send a full snapshot"); + snapshots++; + } + assert.ok(message.features.includes("movement_prediction_v1")); + assert.ok(message.features.includes("chunk_stream_v1")); + view.world = message.world; + view.revision = message.revision; + view.viewCenter = message.view_center; + view.viewBounds = getViewBounds(message); + mergeSnapshot(view.blocks, message.blocks); + previous = message.motion; + heldInput = { ...zero }; + } else if (message.type === "chunks") { + assert.ok(!("spawn" in message) && !("blocks" in message)); + assert.equal(mergeChunkUpdate(view, message).status, "applied"); + chunks++; + } else if (message.type === "state") { + const motion = message.motion; + assert.ok(motion, "Negotiated state carries authoritative motion"); + assert.equal(message.ack, motion.ack); + assert.equal(message.tick, motion.tick); + if (previous && motion.epoch !== previous.epoch) { + resetCount++; + heldInput = { ...zero }; + } else if (previous && motion.tick === previous.tick + 1) { + assert.ok(motion.ack >= previous.ack, "Acknowledgements cannot regress"); + assert.ok(motion.ack - previous.ack <= 1, "At most one queued command is processed per tick"); + if (motion.ack !== previous.ack) { + assert.ok(inputs.has(motion.ack), `Known consumed command ${motion.ack}`); + heldInput = controls(inputs.get(motion.ack)); + } else heldInput = { ...heldInput, fly_toggle: false }; + const neighborhood = samplePhysicsWorld(previous.body, view.blocks, materials, view.viewBounds); + assert.ok(neighborhood, "Collision neighborhood is loaded during the probe"); + const predicted = step({ body: previous.body, input: heldInput, world: neighborhood, settings: motion.settings }); + let error = 0; + for (const field of ["position", "velocity"]) + for (let axis = 0; axis < 3; axis++) + error = Math.max(error, Math.abs(predicted[field][axis] - motion.body[field][axis])); + maximumError = Math.max(maximumError, error); + assert.ok(error < 1e-10, `Native/WASM drift at tick ${motion.tick}, ack ${motion.ack}: ${error}`); + for (const field of ["pose", "on_ground", "sprinting", "flying", "jump_cooldown", "in_water", "in_lava"]) + assert.equal(predicted[field], motion.body[field], `${field} matches at tick ${motion.tick}`); + comparedTicks++; + } + samples.push({ tick: motion.tick, ack: motion.ack, epoch: motion.epoch, + position: motion.body.position, pose: motion.body.pose, flying: motion.body.flying }); + previous = motion; + } + } catch (error) { receiveError = error; } +} +function input(fields = {}) { + const message = { type: "input", seq: ++client.seq, ...zero, ...fields }; + inputs.set(message.seq, message); + client.send(message); + return message.seq; +} +async function state(predicate = () => true, timeout = 10000) { + const message = await client.next("state", (m) => predicate(m.motion, m), timeout); + received(); + return message.motion; +} +async function acknowledged(fields) { + const seq = input(fields); + return state((motion) => motion.ack >= seq); +} +async function ticks(count) { + const start = previous.tick; + return state((motion) => motion.tick >= start + count); +} +try { + const manifest = await h.get("/api/manifest"); + step = await loadPhysics(`${h.url}/physics.wasm`); + const binary = Buffer.from(await (await fetch(`${h.url}/physics.wasm`)).arrayBuffer()); + const wasmHash = createHash("sha256").update(binary).digest("hex"); + const catalog = await h.control("catalog.search", { query: "minecraft:stone", limit: 64 }); + const stone = catalog.items.find((item) => item.state === "minecraft:stone"); + assert.ok(stone); + await h.control("world.create", { world }); + const plan = await h.control("build.plan", { world, expected_revision: 0, + operations: [{ type: "box", min: [-96, 0, -16], max: [160, 0, 16], block: stone.id }] }); + await h.control("build.commit", { plan_id: plan.plan_id, operation_id: "physics-floor" }); + await h.control("arena.configure", { world, mode: "creative", spawn: [15, 1, 8] }); + await h.control("world.create", { world: groundedWorld, template: world }); + await h.control("arena.configure", { world: groundedWorld, mode: "spleef", spawn: [0, 1, 8] }); + client = new Client(h.url); clients.push(client); + client.ws.addEventListener("message", (event) => observe(JSON.parse(event.data))); + await client.open; + client.send({ type: "join", protocol: 1, manifest_hash: manifest.hash, world, + name: "PhysicsProbe", features: ["chunk_stream_v1", "movement_prediction_v1"] }); + const welcome = await client.next("welcome"); received(); + assert.ok(welcome.motion.settings.allow_flight); + await state((motion) => motion.body.on_ground); + checks.push("HTTP-served WebAssembly loads and both movement/chunk features negotiate"); + + const beforeBurst = previous; + const burstStart = samples.length; + for (let index = 0; index < 12; index++) input({ forward: 1, strafe: .25, yaw: .3, + sprint: true, jump: index === 2 }); + const burstEnd = client.seq; + const burstMotion = await state((motion) => motion.ack === burstEnd); + const acks = samples.slice(burstStart).filter((m) => m.ack > beforeBurst.ack).map((m) => m.ack); + assert.deepEqual([...new Set(acks)], Array.from({ length: 12 }, (_, i) => beforeBurst.ack + i + 1)); + assert.ok(burstMotion.tick - beforeBurst.tick >= 12); + client.send({ type: "input", seq: burstEnd, ...zero, forward: -1 }); + client.send({ type: "input", seq: burstEnd - 1, ...zero, forward: -1 }); + const duplicate = await ticks(2); assert.equal(duplicate.ack, burstEnd); + checks.push("A 12-command burst advances at most one acknowledgement per tick; duplicate/stale inputs are ignored"); + + await acknowledged({}); await ticks(14); + const crouch = await acknowledged({ sneak: true }); + assert.equal(crouch.body.pose, "crouching"); + const jump = await acknowledged({ jump: true }); + assert.equal(jump.body.pose, "standing"); + assert.ok(jump.body.velocity[1] > 0 && !jump.body.on_ground); + const flying = await acknowledged({ fly_toggle: true, jump: true }); + assert.equal(flying.body.flying, true); + const ascended = await ticks(4); + assert.equal(ascended.body.flying, true, "Held input cannot re-toggle flight"); + assert.ok(ascended.body.position[1] > flying.body.position[1]); + const stoppedFlying = await acknowledged({ fly_toggle: true }); + assert.equal(stoppedFlying.body.flying, false); + await state((motion) => motion.body.on_ground, 10000); + checks.push("Crouch dimensions, normal jump, authorized flight ascent and one-shot flight toggles are authoritative"); + + const epochBeforeReset = previous.epoch; + for (let i = 0; i < 12; i++) input({ forward: 1 }); + client.send({ type: "input_reset" }); + const reset = await state((motion) => motion.epoch > epochBeforeReset); + assert.equal(reset.ack, client.seq); + await acknowledged({}); await ticks(3); + const epochBeforeRespawn = previous.epoch; + client.send({ type: "respawn" }); + const respawn = await state((motion) => motion.epoch > epochBeforeRespawn); + assert.ok(Math.abs(respawn.body.position[0] - 15) < 1e-9); + assert.ok(Math.abs(respawn.body.position[2] - 8) < 1e-9); + checks.push("Input reset discards queued commands with a new epoch; respawn clears motion and resets position"); + + const chunksBeforeWalk = chunks, snapshotsBeforeWalk = snapshots; + let walk = await acknowledged({ forward: 1, sprint: true, yaw: Math.PI / 2 }); + const startX = walk.body.position[0]; + for (let i = 0; i < 145; i++) walk = await acknowledged({ forward: 1, sprint: true, yaw: Math.PI / 2 }); + await acknowledged({}); await ticks(8); + assert.ok(walk.body.position[0] - startX > 35); + assert.ok(chunks - chunksBeforeWalk >= 2); + assert.equal(snapshots, snapshotsBeforeWalk); + checks.push("Sustained predicted sprint crosses multiple chunk boundaries using deltas without full snapshots"); + + const oldEpoch = previous.epoch; + permitSnapshot = true; + client.send({ type: "switch_world", world: groundedWorld }); + const switched = await client.next("snapshot", (m) => m.world === groundedWorld); received(); + permitSnapshot = false; + assert.ok(switched.motion.epoch > oldEpoch); + assert.equal(switched.motion.settings.allow_flight, false); + const deniedFlight = await acknowledged({ fly_toggle: true, jump: true }); + assert.equal(deniedFlight.body.flying, false); + await acknowledged({}); + checks.push("World switch resets the epoch and denies flight outside creative mode"); + + const legacy = new Client(h.url); clients.push(legacy); + const legacyWelcome = await legacy.join(manifest, groundedWorld, "LegacyPhysicsProbe"); + assert.equal(legacyWelcome.motion, undefined); + const legacyStart = (await legacy.state()).players.find((p) => p.id === legacy.id).position; + const legacySeq = legacy.input({ strafe: 1 }); + const legacyMoved = await legacy.state((player, message) => message.ack >= legacySeq && player.position[0] > legacyStart[0] + .5); + assert.equal(legacyMoved.motion, undefined); + legacy.input(); + checks.push("A client without prediction support still receives movement and acknowledgements without motion payloads"); + received(); + assert.ok(comparedTicks > 170); + await h.report({ ok: true, checks, server: h.url, server_sha256: serverHash, wasm_sha256: wasmHash, + native_wasm_tolerance: 1e-10, native_wasm_max_error: maximumError, + native_wasm_compared_ticks: comparedTicks, chunk_updates: chunks, + expected_full_snapshots: snapshots, observed_epoch_resets: resetCount, samples }); +} catch (error) { + await h.report({ ok: false, checks, error: String(error.stack || error), + receive_error: receiveError?.stack, native_wasm_compared_ticks: comparedTicks, + native_wasm_max_error: maximumError, samples, server_log: h.logs() }); + throw error; +} finally { + await Promise.all(clients.map((client) => client.close())); + await h.stop(); +} diff --git a/scripts/lighting_reference.java b/scripts/lighting_reference.java new file mode 100644 index 0000000..161ca3b --- /dev/null +++ b/scripts/lighting_reference.java @@ -0,0 +1,129 @@ +// Copyright Shacraft contributors. MIT OR Apache-2.0. +// Extract factual lighting properties through the pinned runtime's public API. +import java.nio.file.*; +import java.util.*; +import com.google.gson.*; +import net.minecraft.SharedConstants; +import net.minecraft.server.Bootstrap; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.lighting.LightEngine; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +class lighting_reference { + static String canonical(BlockState state) { + String id=BuiltInRegistries.BLOCK.getKey(state.getBlock()).toString(); + var properties=new TreeMap(); + for(var property:state.getProperties()) + properties.put(property.getName(),state.getValue(property).toString().toLowerCase(Locale.ROOT)); + return id+(properties.isEmpty()?"":"["+String.join(",",properties.entrySet().stream().map(e->e.getKey()+"="+e.getValue()).toList())+"]"); + } + static JsonArray boxes(VoxelShape shape) { + var result=new JsonArray(); + for(var box:shape.toAabbs()) { + var coordinates=new JsonArray(); + for(double value:new double[]{box.minX,box.minY,box.minZ,box.maxX,box.maxY,box.maxZ})coordinates.add(value); + result.add(coordinates); + } + return result; + } + static BlockState state(String name) { + return BuiltInRegistries.BLOCK.getValue(Identifier.parse("minecraft:"+name)).defaultBlockState(); + } + static JsonObject properties(BlockState state) { + var result=new JsonObject(); + result.addProperty("minecraft_id",Block.getId(state)); + result.addProperty("state",canonical(state)); + result.addProperty("emission",state.getLightEmission()); + result.addProperty("dampening",state.getLightDampening()); + result.addProperty("can_occlude",state.canOcclude()); + result.addProperty("use_shape",state.useShapeForLightOcclusion()); + result.addProperty("propagates_skylight_down",state.propagatesSkylightDown()); + result.add("occlusion",boxes(state.canOcclude()&&state.useShapeForLightOcclusion()?state.getOcclusionShape():Shapes.empty())); + return result; + } + static JsonObject crossing(BlockState from,BlockState to,Direction direction) { + var result=new JsonObject(); + result.addProperty("from",canonical(from)); result.addProperty("to",canonical(to)); + result.addProperty("direction",direction.getName()); + result.addProperty("block_dampening",LightEngine.getLightDampeningInto(from,to,direction,Math.max(1,to.getLightDampening()))); + result.addProperty("sky_column_dampening",LightEngine.getLightDampeningInto(from,to,direction,to.getLightDampening())); + return result; + } + public static void main(String[] args) throws Exception { + SharedConstants.tryDetectVersion(); Bootstrap.bootStrap(); + var root=new JsonObject(); root.addProperty("version","26.2"); + var states=new JsonArray(); var shapeTable=new JsonArray(); var shapes=new HashMap(); + var defaults=new JsonObject(); var blocks=new JsonObject(); var schemas=new JsonArray(); + var schemaIds=new HashMap(); + // Block state IDs are the same IDs already recorded by catalog generation. + var byId=new TreeMap(); + for(var block:BuiltInRegistries.BLOCK) { + String name=BuiltInRegistries.BLOCK.getKey(block).toString(); + defaults.addProperty(name,Block.getId(block.defaultBlockState())); + var possible=block.getStateDefinition().getPossibleStates(); + int first=possible.stream().mapToInt(Block::getId).min().orElseThrow(); + var schema=new JsonArray(); + for(var property:block.getStateDefinition().getProperties()) { + var item=new JsonArray(); item.add(property.getName()); + var values=new JsonArray(); + for(var value:property.getPossibleValues())values.add(value.toString().toLowerCase(Locale.ROOT)); + item.add(values); schema.add(item); + } + for(var state:possible) { + byId.put(Block.getId(state),state); + int offset=0; + for(var property:block.getStateDefinition().getProperties()) { + var values=new ArrayList<>(property.getPossibleValues()); + offset=offset*values.size()+values.indexOf(state.getValue(property)); + } + if(first+offset!=Block.getId(state))throw new IllegalStateException("Non-contiguous state schema: "+canonical(state)); + } + String schemaKey=schema.toString(); + if(!schemaIds.containsKey(schemaKey)) { schemaIds.put(schemaKey,schemas.size()); schemas.add(schema); } + var definition=new JsonArray(); definition.add(first); definition.add(Block.getId(block.defaultBlockState())); + definition.add(schemaIds.get(schemaKey)); blocks.add(name,definition); + } + for(var entry:byId.entrySet()) { + var state=entry.getValue(); + var occlusion=boxes(state.canOcclude()&&state.useShapeForLightOcclusion()?state.getOcclusionShape():Shapes.empty()); + String key=occlusion.toString(); + if(!shapes.containsKey(key)) { shapes.put(key,shapeTable.size());shapeTable.add(occlusion); } + var record=new JsonArray(); record.add(entry.getKey()); record.add(state.getLightDampening()); + record.add(shapes.get(key)); record.add(state.getLightEmission()); + record.add(state.canOcclude()); record.add(state.useShapeForLightOcclusion()); + record.add(state.propagatesSkylightDown()); states.add(record); + } + root.add("states",states); root.add("shapes",shapeTable); root.add("defaults",defaults); + root.add("blocks",blocks); root.add("schemas",schemas); + root.addProperty("state_columns","minecraft_id,dampening,occlusion_shape_id,emission,can_occlude,use_shape,propagates_skylight_down"); + var examples=new JsonArray(); + for(String name:List.of("air","stone","glass","tinted_glass","white_stained_glass","glass_pane","ice","packed_ice","blue_ice","water","lava","oak_leaves","azalea_leaves","oak_slab","oak_stairs","oak_trapdoor","oak_door","snow","snow_block","torch","wall_torch","redstone_torch","soul_torch","glowstone","sea_lantern","redstone_lamp","lantern","jack_o_lantern","light","sculk_sensor","copper_bulb","copper_grate")) + examples.add(properties(state(name))); + examples.add(properties(Blocks.REDSTONE_LAMP.defaultBlockState().setValue(BlockStateProperties.LIT,true))); + examples.add(properties(Blocks.OAK_SLAB.defaultBlockState().setValue(BlockStateProperties.SLAB_TYPE,net.minecraft.world.level.block.state.properties.SlabType.TOP))); + examples.add(properties(Blocks.OAK_SLAB.defaultBlockState().setValue(BlockStateProperties.SLAB_TYPE,net.minecraft.world.level.block.state.properties.SlabType.DOUBLE))); + examples.add(properties(Blocks.OAK_SLAB.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED,true))); + root.add("examples",examples); + var crossings=new JsonArray(); var air=Blocks.AIR.defaultBlockState(); + for(String name:List.of("stone","glass","tinted_glass","ice","water","oak_leaves","oak_slab","oak_stairs","glowstone","sea_lantern")) + for(Direction direction:Direction.values())crossings.add(crossing(air,state(name),direction)); + var slab=Blocks.OAK_SLAB.defaultBlockState(); + var top=slab.setValue(BlockStateProperties.SLAB_TYPE,net.minecraft.world.level.block.state.properties.SlabType.TOP); + for(Direction direction:Direction.values()) { + crossings.add(crossing(slab,top,direction)); + crossings.add(crossing(top,slab,direction)); + crossings.add(crossing(state("glowstone"),air,direction)); + } + root.add("crossings",crossings); + root.addProperty("measurement_scope","Public original Java 26.2 block-state light properties and LightEngine.getLightDampeningInto calls. Effective shape is empty unless canOcclude and useShapeForLightOcclusion are both true. Crossings measure directional shape blocking and target attenuation, not a full running light engine or skylight source map."); + Files.writeString(Path.of(args[0]),new GsonBuilder().create().toJson(root)+"\n"); + System.out.println("Measured "+states.size()+" states, "+shapeTable.size()+" effective shapes, "+examples.size()+" examples and "+crossings.size()+" directional crossings."); + } +} diff --git a/scripts/measure_lighting.py b/scripts/measure_lighting.py new file mode 100644 index 0000000..369af4e --- /dev/null +++ b/scripts/measure_lighting.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""Measure Java 26.2 light properties using the verified local catalog cache.""" +from pathlib import Path +import argparse +import hashlib +import json +import os +import subprocess +import zipfile + +ROOT = Path(__file__).resolve().parents[1] +SOURCE_SHA1 = "823e2250d24b3ddac457a60c92a6a941943fcd6a" + + +def digest(path, algorithm="sha256"): + with path.open("rb") as source: + return hashlib.file_digest(source, algorithm).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--java", type=Path, required=True) + parser.add_argument("--cache", type=Path, default=ROOT / "artifacts/catalog-cache") + parser.add_argument("--output", type=Path, default=ROOT / "artifacts/lighting/reference.json") + parser.add_argument("--runtime-output", type=Path, default=ROOT / "client/light-properties.json") + parser.add_argument("--fixture-output", type=Path, default=ROOT / "client/tests/fixtures/lighting-java26.2.json") + args = parser.parse_args() + cache = args.cache.resolve() + source = cache / "server.jar" + if digest(source, "sha1") != SOURCE_SHA1: + raise SystemExit("The official source JAR does not match pinned Java 26.2") + executable = cache / "versions/26.2/server-26.2.jar" + with zipfile.ZipFile(source) as bundle: + with bundle.open("META-INF/versions/26.2/server-26.2.jar") as embedded: + expected = hashlib.file_digest(embedded, "sha256").hexdigest() + if digest(executable) != expected: + raise SystemExit("The cached executable differs from the verified official bundle") + classpath = os.pathsep.join(map(str, [executable, *sorted((cache / "libraries").rglob("*.jar"))])) + java = args.java.resolve() + script = ROOT / "scripts/lighting_reference.java" + measured = cache / "lighting-measurements.json" + commands = [ + [str(java.with_name("javac")), "-cp", classpath, "-d", str(cache), str(script)], + [str(java), "-Xmx1G", "-cp", str(cache) + os.pathsep + classpath, "lighting_reference", str(measured)], + ] + with (cache / "lighting-measurements.log").open("w") as log: + for command in commands: + result = subprocess.run(command, cwd=cache, stdout=log, stderr=subprocess.STDOUT) + if result.returncode: + raise SystemExit(f"Reference probe failed. Read {cache / 'lighting-measurements.log'}") + reference = json.loads(measured.read_text()) + reference["provenance"] = { + "source_url": f"https://piston-data.mojang.com/v1/objects/{SOURCE_SHA1}/server.jar", + "source_sha1": SOURCE_SHA1, + "source_sha256": digest(source), + "executable_sha256": digest(executable), + "probe_sha256": digest(script), + "command": "python3 scripts/measure_lighting.py --java /path/to/java25/bin/java", + } + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(reference, separators=(",", ":")) + "\n") + print(f"Wrote {args.output}: {len(reference['states'])} states, {len(reference['shapes'])} shapes, {args.output.stat().st_size} bytes") + codes = [] + for state in reference["states"]: + state_id, dampening, shape_id = state[:3] + assert state_id == len(codes), "Minecraft state IDs must be contiguous" + assert 0 <= dampening <= 15 and 0 <= shape_id < len(reference["shapes"]) + codes.append(dampening + 16 * shape_id) + runtime = { + "version": reference["version"], + "encoding": "codes[minecraft_id] = light_dampening + 16 * occlusion_shape_index; blocks[name] = [first_state_id, default_state_id, schema_index]", + "codes": codes, + "shapes": reference["shapes"], + "blocks": reference["blocks"], + "schemas": reference["schemas"], + "provenance": reference["provenance"], + } + args.runtime_output.parent.mkdir(parents=True, exist_ok=True) + args.runtime_output.write_text(json.dumps(runtime, separators=(",", ":")) + "\n") + print(f"Wrote {args.runtime_output}: {args.runtime_output.stat().st_size} bytes") + fixture = {key: reference[key] for key in ("version", "examples", "crossings", "measurement_scope", "provenance")} + args.fixture_output.parent.mkdir(parents=True, exist_ok=True) + args.fixture_output.write_text(json.dumps(fixture, indent=2) + "\n") + print(f"Wrote {args.fixture_output}: {len(fixture['crossings'])} original directional crossings") + + +if __name__ == "__main__": + main() diff --git a/scripts/measure_physics.py b/scripts/measure_physics.py new file mode 100644 index 0000000..45122ff --- /dev/null +++ b/scripts/measure_physics.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Measure factual Java 26.2 movement through a pinned local official runtime. + +Requires the cache prepared by catalog_generate.py and an existing Java 25 JDK. +Does not download assets or start a Minecraft server. See measurement_scope in +the generated fixture for the precise boundary of the original-runtime probe. +""" +from pathlib import Path +import argparse +import hashlib +import json +import os +import subprocess +import zipfile + +ROOT = Path(__file__).resolve().parents[1] +SOURCE_SHA1 = "823e2250d24b3ddac457a60c92a6a941943fcd6a" + + +def digest(path, algorithm="sha256"): + with path.open("rb") as source: + return hashlib.file_digest(source, algorithm).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--java", type=Path, required=True) + parser.add_argument("--cache", type=Path, default=ROOT / "artifacts/catalog-cache") + parser.add_argument("--output", type=Path, default=ROOT / "artifacts/catalog-cache/physics-reference.json") + args = parser.parse_args() + cache = args.cache.resolve() + source = cache / "server.jar" + if digest(source, "sha1") != SOURCE_SHA1: + raise SystemExit("The official source JAR does not match the pinned Java 26.2 hash") + executable = cache / "versions/26.2/server-26.2.jar" + with zipfile.ZipFile(source) as bundle: + with bundle.open("META-INF/versions/26.2/server-26.2.jar") as embedded: + expected = hashlib.file_digest(embedded, "sha256").hexdigest() + if digest(executable) != expected: + raise SystemExit("The cached executable differs from the verified official bundle") + classpath = os.pathsep.join(map(str, [executable, *sorted((cache / "libraries").rglob("*.jar"))])) + java = args.java.resolve() + script = ROOT / "scripts/physics_reference.java" + measured = cache / "physics-measurements.json" + commands = [ + [str(java.with_name("javac")), "-cp", classpath, "-d", str(cache), str(script)], + [str(java), "-Xmx1G", "-cp", str(cache) + os.pathsep + classpath, "physics_reference", str(measured)], + ] + with (cache / "physics-measurements.log").open("w") as log: + for command in commands: + result = subprocess.run(command, cwd=cache, stdout=log, stderr=subprocess.STDOUT) + if result.returncode: + raise SystemExit(f"Reference probe failed. Read {cache / 'physics-measurements.log'}") + fixture = json.loads(measured.read_text()) + fixture["provenance"] = { + "source_url": f"https://piston-data.mojang.com/v1/objects/{SOURCE_SHA1}/server.jar", + "source_sha1": SOURCE_SHA1, + "source_sha256": digest(source), + "executable_sha256": digest(executable), + "probe_sha256": digest(script), + "command": "python3 scripts/measure_physics.py --java /path/to/java25/bin/java --output crates/shacraft-physics/tests/fixtures/java26.2.json", + "java": subprocess.run([str(java), "-version"], text=True, capture_output=True, check=True).stderr.strip(), + } + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(fixture, indent=2) + "\n") + print(f"Wrote {args.output}") + + +if __name__ == "__main__": + main() diff --git a/scripts/physics_reference.java b/scripts/physics_reference.java new file mode 100644 index 0000000..ffb72d3 --- /dev/null +++ b/scripts/physics_reference.java @@ -0,0 +1,332 @@ +// Copyright Shacraft contributors. MIT OR Apache-2.0. +// Measure the original Java runtime. No original source or assets are exported. +import java.nio.file.*; +import java.lang.reflect.*; +import java.util.*; +import com.google.gson.*; +import net.minecraft.SharedConstants; +import net.minecraft.server.Bootstrap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.entity.ai.attributes.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.border.WorldBorder; +import net.minecraft.world.phys.*; +import net.minecraft.world.phys.shapes.*; +import net.minecraft.tags.*; + +class physics_reference { + static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + static final sun.misc.Unsafe ALLOCATOR; + static final Method COLLIDE; + static { + try { + var field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + ALLOCATOR = (sun.misc.Unsafe)field.get(null); + COLLIDE = Entity.class.getDeclaredMethod("collideWithShapes", Vec3.class, AABB.class, List.class); + COLLIDE.setAccessible(true); + } catch (ReflectiveOperationException e) { throw new ExceptionInInitializerError(e); } + } + static void field(Object target, Class owner, String name, Object value) { + try { var f=owner.getDeclaredField(name); f.setAccessible(true); f.set(target,value); } + catch (ReflectiveOperationException e) { throw new RuntimeException(e); } + } + static double sprintModifier() { + try { + var f=LivingEntity.class.getDeclaredField("SPEED_MODIFIER_SPRINTING"); f.setAccessible(true); + return ((AttributeModifier)f.get(null)).amount(); + } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } + } + static JsonArray vector(Vec3 v) { + var a=new JsonArray(); a.add(v.x); a.add(v.y); a.add(v.z); return a; + } + static Block block(String name) { return BuiltInRegistries.BLOCK.getValue(Identifier.parse("minecraft:"+name)); } + + static class SampleWorld implements BlockGetter { + BlockState state; + SampleWorld(BlockState state) { this.state=state; } + public BlockState getBlockState(BlockPos p) { return p.equals(BlockPos.ZERO)?state:Blocks.AIR.defaultBlockState(); } + public FluidState getFluidState(BlockPos p) { return getBlockState(p).getFluidState(); } + public BlockEntity getBlockEntity(BlockPos p) { return null; } + public int getHeight() { return 384; } + public int getMinY() { return -64; } + } + + // Constructors are deliberately never invoked: this registry-only harness + // does not create a running server, world files, connections, or EULA state. + static class PlaneLevel extends ServerLevel { + BlockState surface; + List obstacles; + WorldBorder border; + PlaneLevel() { super(null,null,null,null,null,null,false,0,List.of(),false); } + public BlockState getBlockState(BlockPos p) { return p.getY()<0?surface:Blocks.AIR.defaultBlockState(); } + public FluidState getFluidState(BlockPos p) { return getBlockState(p).getFluidState(); } + public WorldBorder getWorldBorder() { return border; } + public List getEntityCollisions(Entity entity,AABB bounds) { return List.of(); } + public Iterable getBlockCollisions(Entity entity,AABB bounds) { + return obstacles.stream().filter(s->s.bounds().intersects(bounds.inflate(1e-7))).toList(); + } + } + static class ProbePlayer extends Player { + PlaneLevel plane; + boolean grounded, sprint; + String medium; + double fluidDepth; + Vec3 coordinates, velocity; + Abilities testAbilities; + AttributeSupplier defaults; + List obstacles; + ProbePlayer() { super(null,null); } + public GameType gameMode() { return GameType.SURVIVAL; } + public Level level() { return plane; } + public boolean onGround() { return grounded; } + public boolean isPassenger() { return false; } + public boolean isSwimming() { return false; } + public boolean isSprinting() { return sprint; } + public boolean isInWater() { return "water".equals(medium); } + public boolean isInLava() { return "lava".equals(medium); } + public boolean isFallFlying() { return false; } + public boolean isNoGravity() { return false; } + public boolean onClimbable() { return false; } + public boolean shouldDiscardFriction() { return false; } + public boolean isSteppingCarefully() { return false; } + public boolean isSuppressingBounce() { return false; } + public void gameEvent(Holder event) {} + public double getFluidHeight(TagKey fluid) { return fluidDepth; } + public double getFluidJumpThreshold() { return .4; } + public boolean hasEffect(Holder effect) { return false; } + public MobEffectInstance getEffect(Holder effect) { return null; } + public Abilities getAbilities() { return testAbilities; } + public double getAttributeValue(Holder attribute) { + double value=defaults.getBaseValue(attribute); + return attribute.equals(Attributes.MOVEMENT_SPEED)&&sprint?value*(1+sprintModifier()):value; + } + public Vec3 getDeltaMovement() { return velocity; } + public void setDeltaMovement(Vec3 v) { velocity=v; } + public void setDeltaMovement(double x,double y,double z) { velocity=new Vec3(x,y,z); } + protected float getBlockJumpFactor() { return plane.surface.getBlock().getJumpFactor(); } + public void liquidJump() { jumpInLiquid(isInWater()?FluidTags.WATER:FluidTags.LAVA); } + public BlockPos getBlockPosBelowThatAffectsMyMovement() { return new BlockPos(0,-1,0); } + public void move(MoverType type,Vec3 requested) { + try { + var dimensions=getDefaultDimensions(Pose.STANDING); + var bounds=dimensions.makeBoundingBox(coordinates); + var moved=(Vec3)COLLIDE.invoke(null,requested,bounds,obstacles); + horizontalCollision=moved.x!=requested.x||moved.z!=requested.z; + verticalCollision=moved.y!=requested.y; + grounded=verticalCollision&&requested.y<0; + coordinates=coordinates.add(moved); + field(this,Entity.class,"position",coordinates); + if(moved.x!=requested.x)velocity=new Vec3(0,velocity.y,velocity.z); + if(moved.y!=requested.y)velocity=new Vec3(velocity.x,0,velocity.z); + if(moved.z!=requested.z)velocity=new Vec3(velocity.x,velocity.y,0); + } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } + } + } + static ProbePlayer player(String surface,boolean sprint,double y) throws Exception { + var level=(PlaneLevel)ALLOCATOR.allocateInstance(PlaneLevel.class); + level.surface=block(surface).defaultBlockState(); + var player=(ProbePlayer)ALLOCATOR.allocateInstance(ProbePlayer.class); + player.plane=level; player.grounded=y==0; player.sprint=sprint; + player.coordinates=new Vec3(0,y,0); player.velocity=new Vec3(0,y==0?-0.0784000015258789:0,0); + player.defaults=Player.createAttributes().build(); + player.testAbilities=new Abilities(); + player.obstacles=List.of(Shapes.create(new AABB(-1000,-1,-1000,1000,0,1000))); + level.obstacles=player.obstacles; level.border=new WorldBorder(); + field(player,Entity.class,"position",player.coordinates); + field(player,Entity.class,"type",EntityTypes.PLAYER); + field(player,Entity.class,"level",level); + field(player,Entity.class,"blockPosition",BlockPos.ZERO); + field(player,Player.class,"abilities",player.testAbilities); + return player; + } + static JsonObject trajectory(String surface,boolean sprint,boolean jump,double y,int moveTicks,int ticks) throws Exception { + return trajectory(surface,sprint,jump,y,moveTicks,ticks,"air",0,false); + } + static JsonObject trajectory(String surface,boolean sprint,boolean jump,double y,int moveTicks,int ticks,String medium,double fluidDepth,boolean flying) throws Exception { + var player=player(surface,sprint,y); + player.medium=medium; player.fluidDepth=fluidDepth; player.testAbilities.flying=flying; + var out=new JsonObject(); out.addProperty("surface",surface); out.addProperty("sprint",sprint); + out.addProperty("medium",medium); out.addProperty("fluid_depth",fluidDepth); out.addProperty("flying",flying); + out.addProperty("jump_first_tick",jump); out.addProperty("input_ticks",moveTicks); + out.add("initial_position",vector(player.coordinates)); out.add("initial_velocity",vector(player.velocity)); + var samples=new JsonArray(); + for(int tick=1;tick<=ticks;tick++) { + // Match the documented aiStep input boundary. These two threshold rules + // are harness preparation, not claimed as a full original aiStep call. + var v=player.velocity; + double x=v.x,z=v.z; + if(v.horizontalDistanceSqr()<9e-6) { x=0; z=0; } + player.velocity=new Vec3(x,Math.abs(v.y)<.003?0:v.y,z); + if(jump&&tick==1) { + if("air".equals(medium)) player.jumpFromGround(); else player.liquidJump(); + } + player.travel(new Vec3(0,0,tick<=moveTicks?(double).98f:0)); + var sample=new JsonObject(); sample.addProperty("tick",tick); + sample.add("position",vector(player.coordinates)); sample.add("velocity",vector(player.velocity)); + sample.addProperty("on_ground",player.grounded); samples.add(sample); + } + out.add("samples",samples); return out; + } + static JsonObject callbacks() throws Exception { + var root=new JsonObject(); var bounces=new JsonArray(); + var bounce=Entity.class.getDeclaredMethod("restituteMovementAfterCollisions",BlockState.class,boolean.class,boolean.class,Vec3.class); + bounce.setAccessible(true); + for(String name:List.of("stone","slime_block","white_bed")) + for(double incoming:List.of(-.0784000015258789,-.3,-1.0)) + for(double fraction:List.of(0.0,.25,.9)) { + var p=player(name,false,0); p.velocity=new Vec3(.1,incoming,.2); + p.verticalCollision=true; p.verticalCollisionBelow=true; + bounce.invoke(p,block(name).defaultBlockState(),false,false,new Vec3(.1,incoming*fraction,.2)); + var v=new JsonObject(); v.addProperty("surface",name); v.addProperty("incoming_y",incoming); + v.addProperty("moved_fraction",fraction); v.add("velocity",vector(p.velocity)); bounces.add(v); + } + root.add("vertical_collision_restitution",bounces); + var slides=new JsonArray(); + var slide=HoneyBlock.class.getDeclaredMethod("doSlideMovement",Entity.class); slide.setAccessible(true); + for(double incoming:List.of(-.16,-.3,-1.0)) { + var p=player("honey_block",false,10); p.velocity=new Vec3(.1,incoming,.2); + slide.invoke(Blocks.HONEY_BLOCK,p); + var v=new JsonObject(); v.addProperty("incoming_y",incoming); v.add("velocity",vector(p.velocity)); slides.add(v); + } + root.add("honey_slide_callback",slides); + var slimeSteps=new JsonArray(); + for(double incoming:List.of(0.0,-.0784000015258789,.05,.2)) { + var p=player("slime_block",false,0); p.velocity=new Vec3(.1,incoming,.2); + Blocks.SLIME_BLOCK.stepOn(p.plane,BlockPos.ZERO,Blocks.SLIME_BLOCK.defaultBlockState(),p); + var v=new JsonObject(); v.addProperty("incoming_y",incoming); v.add("velocity",vector(p.velocity)); slimeSteps.add(v); + } + root.add("slime_step_callback",slimeSteps); + var bubbles=new JsonArray(); + for(boolean above:List.of(false,true))for(boolean down:List.of(false,true))for(double incoming:List.of(-1.0,0.0,1.0)) { + var p=player("stone",false,10); p.velocity=new Vec3(.1,incoming,.2); + // Null private level suppresses the callback's optional server particles. + field(p,Entity.class,"level",null); + if(above)p.onAboveBubbleColumn(down,BlockPos.ZERO); else p.onInsideBubbleColumn(down); + var v=new JsonObject(); v.addProperty("above",above); v.addProperty("down",down); + v.addProperty("incoming_y",incoming); v.add("velocity",vector(p.velocity)); bubbles.add(v); + } + root.add("bubble_column_callback",bubbles); return root; + } + static JsonArray currentCases() throws Exception { + var result=new JsonArray(); + var tracker=Class.forName("net.minecraft.world.entity.EntityFluidInteraction$Tracker"); + var constructor=tracker.getDeclaredConstructor(); constructor.setAccessible(true); + var accumulate=tracker.getDeclaredMethod("accumulateCurrent",Vec3.class); accumulate.setAccessible(true); + var apply=tracker.getDeclaredMethod("applyCurrentTo",Entity.class,double.class); apply.setAccessible(true); + for(double incomingX:List.of(0.0,.01))for(double currentX:List.of(.001,.01,1.0)) { + var p=player("stone",false,10); p.velocity=new Vec3(incomingX,0,0); + var state=constructor.newInstance(); accumulate.invoke(state,new Vec3(currentX,0,0)); + apply.invoke(state,p,.014); + var v=new JsonObject(); v.addProperty("incoming_x",incomingX); v.addProperty("current_x",currentX); + v.addProperty("strength",.014); v.add("velocity",vector(p.velocity)); result.add(v); + } + return result; + } + static JsonObject collisionCase(String label,double y,boolean grounded,Vec3 requested,List boxes) throws Exception { + var p=player("stone",false,y); p.grounded=grounded; + p.plane.obstacles=boxes.stream().map(Shapes::create).toList(); + field(p,Entity.class,"bb",p.getDefaultDimensions(Pose.STANDING).makeBoundingBox(p.coordinates)); + var method=Entity.class.getDeclaredMethod("collide",Vec3.class); method.setAccessible(true); + var result=(Vec3)method.invoke(p,requested); + var out=new JsonObject(); out.addProperty("name",label); out.addProperty("on_ground",grounded); + out.add("position",vector(p.coordinates)); out.add("requested",vector(requested)); out.add("result",vector(result)); + out.addProperty("step_height",(double)p.maxUpStep()); + var geometry=new JsonArray(); + for(var b:boxes) { + var object=new JsonObject(); object.add("min",vector(new Vec3(b.minX,b.minY,b.minZ))); + object.add("max",vector(new Vec3(b.maxX,b.maxY,b.maxZ))); geometry.add(object); + } + out.add("boxes",geometry); return out; + } + static JsonArray collisionCases() throws Exception { + var result=new JsonArray(); + var floor=new AABB(-10,-1,-10,10,0,10); + var slab=new AABB(.8,0,-1,1.8,.5,1); + var full=new AABB(.8,0,-1,1.8,1,1); + var thin=new AABB(.8,0,-1,1.8,.0625,1); + var ceiling=new AABB(-1,2.3,-1,2,2.4,1); + var wall=new AABB(-1,0,.8,2,2,1.8); + result.add(collisionCase("half_slab",0,true,new Vec3(.8,-.0784,0),List.of(floor,slab))); + result.add(collisionCase("half_slab_low_ceiling",0,true,new Vec3(.8,-.0784,0),List.of(floor,slab,ceiling))); + result.add(collisionCase("full_block",0,true,new Vec3(.8,-.0784,0),List.of(floor,full))); + result.add(collisionCase("thin_step",0,true,new Vec3(.8,-.0784,0),List.of(floor,thin))); + result.add(collisionCase("lowest_improving_step",0,true,new Vec3(.8,-.0784,0),List.of(floor,new AABB(.4,0,-1,1.4,.125,1),slab))); + result.add(collisionCase("descending_into_step",.2,false,new Vec3(.8,-.4,0),List.of(floor,slab))); + result.add(collisionCase("corner_major_z",0,true,new Vec3(.8,-.0784,.9),List.of(floor,slab,wall))); + result.add(collisionCase("airborne_no_step",0,false,new Vec3(.8,.1,0),List.of(floor,slab))); + return result; + } + public static void main(String[] args) throws Exception { + SharedConstants.tryDetectVersion(); Bootstrap.bootStrap(); + var root=new JsonObject(); root.addProperty("version","26.2"); + var surfaces=new JsonObject(); + for(String name:List.of("stone","ice","packed_ice","blue_ice","frosted_ice","slime_block","honey_block","soul_sand","soul_soil","white_bed","water","lava","cobweb","powder_snow","ladder","scaffolding")) { + var b=block(name); var values=new JsonObject(); + values.addProperty("friction",(double)b.getFriction()); + values.addProperty("speed_factor",(double)b.getSpeedFactor()); + values.addProperty("jump_factor",(double)b.getJumpFactor()); + values.addProperty("bounce_restitution",(double)b.getBounceRestitution()); + surfaces.add(name,values); + } + root.add("surfaces",surfaces); + var attrs=new JsonObject(); var defaults=Player.createAttributes().build(); + for(var holder:BuiltInRegistries.ATTRIBUTE.listElements().toList()) + if(defaults.hasAttribute(holder))attrs.addProperty(holder.unwrapKey().get().identifier().toString(),defaults.getBaseValue(holder)); + root.add("player_attributes",attrs); + root.addProperty("sprint_attribute_modifier",sprintModifier()); + var poses=new JsonObject(); var actor=player("stone",false,0); + for(var pose:List.of(Pose.STANDING,Pose.CROUCHING,Pose.SWIMMING,Pose.FALL_FLYING,Pose.SLEEPING)) { + var d=actor.getDefaultDimensions(pose); var values=new JsonObject(); + values.addProperty("width",(double)d.width()); values.addProperty("height",(double)d.height()); + values.addProperty("eye_height",(double)d.eyeHeight()); poses.add(pose.name().toLowerCase(Locale.ROOT),values); + } + root.add("poses",poses); + var fluids=new JsonObject(); + for(String name:List.of("water","lava")) { + var levels=new JsonArray(); + for(int level=0;level<=15;level++) { + var state=block(name).defaultBlockState().setValue(net.minecraft.world.level.block.state.properties.BlockStateProperties.LEVEL,level); + var world=new SampleWorld(state); var fluid=state.getFluidState(); var values=new JsonObject(); + values.addProperty("level",level); values.addProperty("height",(double)fluid.getHeight(world,BlockPos.ZERO)); + values.addProperty("source",fluid.isSource()); levels.add(values); + } + fluids.add(name,levels); + } + root.add("fluid_levels",fluids); + var trajectories=new JsonObject(); + trajectories.add("stone_walk_stop",trajectory("stone",false,false,0,20,40)); + trajectories.add("stone_sprint_stop",trajectory("stone",true,false,0,20,40)); + trajectories.add("stone_jump",trajectory("stone",false,true,0,0,16)); + trajectories.add("stone_sprint_jump",trajectory("stone",true,true,0,15,20)); + trajectories.add("ice_walk_stop",trajectory("ice",false,false,0,20,40)); + trajectories.add("blue_ice_walk_stop",trajectory("blue_ice",false,false,0,20,40)); + trajectories.add("water_move_stop",trajectory("stone",false,false,10,20,40,"water",1,false)); + trajectories.add("water_sprint_stop",trajectory("stone",true,false,10,20,40,"water",1,false)); + trajectories.add("water_jump",trajectory("stone",false,true,10,0,12,"water",1,false)); + trajectories.add("lava_deep_move_stop",trajectory("stone",false,false,10,20,40,"lava",1,false)); + trajectories.add("lava_shallow_move_stop",trajectory("stone",false,false,10,20,40,"lava",.2,false)); + trajectories.add("creative_fly_move_stop",trajectory("stone",false,false,10,20,40,"air",0,true)); + trajectories.add("creative_fly_sprint_stop",trajectory("stone",true,false,10,20,40,"air",0,true)); + root.add("travel_kernel_trajectories",trajectories); + root.add("callback_measurements",callbacks()); + root.add("collision_cases",collisionCases()); + root.add("fluid_current_cases",currentCases()); + root.addProperty("measurement_scope","Public block and attribute APIs; original Player.travel, jumpFromGround and Entity.collideWithShapes execute in an isolated flat-plane harness. Player constructors and server constructors are bypassed. The harness supplies inputs, threshold preparation, the measured sprint attribute modifier, constant medium/depth and flat-plane movement bookkeeping. Collision cases call original Entity.collide including step selection on explicit boxes. Collision restitution, honey slide, slime step, bubble column and fluid current application are invoked separately. This is not an original full game tick, multiplayer, fluid-world sampling, or automatic callback-dispatch measurement. The water sprint case intentionally leaves swimming pose false to isolate travelInWater."); + Files.writeString(Path.of(args[0]),GSON.toJson(root)+"\n"); + System.out.println("Measured "+surfaces.size()+" surfaces, "+poses.size()+" poses, "+trajectories.size()+" original travel-kernel trajectories."); + } +} diff --git a/scripts/prepare_texture_pack.py b/scripts/prepare_texture_pack.py new file mode 100644 index 0000000..dd72bc2 --- /dev/null +++ b/scripts/prepare_texture_pack.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Bundle selected pixel block textures with the local Shacraft packages. + +Uses only the Python standard library. Source images are copied verbatim; this +does not generate art, resample pixels, or infer distribution rights. +""" + +import argparse +import hashlib +import json +from pathlib import Path +import re +import shutil +import struct +import tempfile + + +ROOT = Path(__file__).resolve().parents[1] +DEFAULT_TEXTURES = ( + "stone cobblestone oak_planks oak_log oak_log_top dirt grass_block_top " + "grass_block_side sand gravel bricks stone_bricks glass oak_leaves " + "diamond_ore iron_ore coal_ore gold_ore redstone_ore deepslate obsidian " + "snow netherrack oak_door_bottom" +).split() +MARKER = ".shacraft-texture-bundle.json" + + +def write_json(path, data): + path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") + + +def resource(path, package, role): + data = path.read_bytes() + return { + "path": path.relative_to(package).as_posix(), + "scope": "client", + "role": role, + "size": len(data), + "sha256": hashlib.sha256(data).hexdigest(), + } + + +def texture_bytes(path, pixel_size=32): + data = path.read_bytes() + if ( + len(data) < 33 + or data[:16] != b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR" + or struct.unpack(">II", data[16:24]) != (pixel_size, pixel_size) + ): + raise ValueError(f"Expected a real {pixel_size}x{pixel_size} PNG: {path}") + if len(data) > 16 * 1024 * 1024: + raise ValueError(f"Texture exceeds the server resource limit: {path}") + return data + + +def prepare(args): + source = args.source.resolve() + output = args.output.resolve() + if source == output or source.is_relative_to(output): + raise ValueError("The output must not contain the source pack.") + if output == ROOT / "packages" or (ROOT / "packages").is_relative_to(output): + raise ValueError("The output must not replace the bundled core packages.") + if output.exists(): + if not args.overwrite: + raise ValueError("Output already exists; use --overwrite to rebuild it.") + marker = output / MARKER + if not marker.is_file() or json.loads(marker.read_text()).get("generator") != "prepare_texture_pack.py": + raise ValueError("Refusing to replace a directory not created by this script.") + if not re.fullmatch(r"[a-z0-9_.-]+", args.id): + raise ValueError("Package id must use lowercase letters, digits, '.', '_' or '-'.") + if args.id in {"shacraft.base", "shacraft.trampoline"}: + raise ValueError("The texture package needs its own id.") + if not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+", args.version): + raise ValueError("Package version must contain three numeric components.") + if not args.name.strip() or len(args.name) > 120: + raise ValueError("Texture pack name must contain 1 to 120 characters.") + if not args.license or len(args.license) > 256 or any(ord(c) < 32 for c in args.license): + raise ValueError("Supply a nonempty license or local-use notice (at most 256 characters).") + names = args.textures or DEFAULT_TEXTURES + if not 1 <= len(names) <= 127 or len(set(names)) != len(names): + raise ValueError("Choose 1 to 127 unique texture names.") + if any(not re.fullmatch(r"[a-z0-9_]+", name) for name in names): + raise ValueError("Texture names must be plain Minecraft block texture names.") + source_textures = source / "assets/minecraft/textures/block" + # Validate every selected source before touching an existing output bundle. + textures = [(name, texture_bytes(source_textures / f"{name}.png", args.pixel_size)) for name in names] + output.parent.mkdir(parents=True, exist_ok=True) + stage = Path(tempfile.mkdtemp(prefix=f".{output.name}-", dir=output.parent)) + backup = None + try: + for name in ("base", "trampoline"): + shutil.copytree(ROOT / "packages" / name, stage / name) + package = stage / f"pixel{args.pixel_size}" + images = package / "client/textures" + images.mkdir(parents=True) + entries, resources = [], [] + for name, data in textures: + path = images / f"{name}.png" + path.write_bytes(data) + entries.append({"name": name, "path": path.relative_to(package).as_posix()}) + resources.append(resource(path, package, "texture")) + style = package / "client/style.json" + write_json(style, {"schema": 1, "texture_pack": { + "name": args.name, "pixel_size": args.pixel_size, "textures": entries, + }}) + resources.append(resource(style, package, "client-style")) + base_manifest = json.loads((stage / "base/manifest.json").read_text()) + write_json(package / "manifest.json", { + "schema": 1, "id": args.id, "version": args.version, + "license": args.license, + "dependencies": [{"id": base_manifest["id"], "version": base_manifest["version"]}], + "capabilities": ["client.texture", "client.style"], + "resources": resources, + }) + write_json(stage / MARKER, { + "generator": "prepare_texture_pack.py", "schema": 1, + "package": args.id, "name": args.name, "textures": len(entries), "pixel_size": args.pixel_size, + "texture_bytes": sum(len(data) for _, data in textures), + }) + if output.exists(): + backup = Path(tempfile.mkdtemp(prefix=f".{output.name}-old-", dir=output.parent)) + backup.rmdir() + output.rename(backup) + try: + stage.rename(output) + except OSError: + if backup is not None: + backup.rename(output) + backup = None + raise + if backup is not None: + shutil.rmtree(backup) + print(f"Prepared {len(entries)} textures ({sum(len(data) for _, data in textures):,} PNG bytes)") + print(f"Package bundle: {output}") + finally: + if stage.exists(): + shutil.rmtree(stage) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--source", type=Path, required=True, help="Unpacked Minecraft-format resource pack") + parser.add_argument("--output", type=Path, required=True, help="Output bundle for the server --packages option") + parser.add_argument("--name", default="Shacraft Pixel32 Study") + parser.add_argument("--id", default="shacraft.pixel32.study") + parser.add_argument("--version", default="1.0.0") + parser.add_argument("--pixel-size", type=int, choices=(16, 32, 64, 128), default=32, + help="Required native PNG dimensions (default: 32)") + parser.add_argument("--license", default="Local reference-derived study; redistribution rights not granted") + parser.add_argument("--textures", nargs="+", help="Selected texture names without .png (defaults to the 24-texture study)") + parser.add_argument("--overwrite", action="store_true", help="Replace a bundle previously created by this script") + args = parser.parse_args() + try: + prepare(args) + except (OSError, ValueError) as error: + parser.exit(1, f"Texture pack preparation failed: {error}\n") + + +if __name__ == "__main__": + main() diff --git a/scripts/prepare_vanilla_texture_pack.py b/scripts/prepare_vanilla_texture_pack.py new file mode 100644 index 0000000..9e4c753 --- /dev/null +++ b/scripts/prepare_vanilla_texture_pack.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python3 +"""Prepare a local test atlas from an existing Java client JAR (no downloads). + +Keeps original pixel colors; smaller sprites use integer nearest-neighbor +scaling. Animated sprites use their first declared frame. Face materials are +projected onto Shacraft's existing geometry, not a replacement model renderer. +Requires Pillow. Generated assets must not be redistributed without permission. +""" +import argparse +from functools import lru_cache +import hashlib +from io import BytesIO +import json +import math +from pathlib import Path +import shutil +import zipfile + +from PIL import Image + +ROOT = Path(__file__).resolve().parents[1] +PREFIX = 'assets/minecraft/' +DIRECTIONS = ['east', 'west', 'up', 'down', 'south', 'north'] +NORMALS = [(1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)] + + +def norm(name): + return name.removeprefix('minecraft:') + + +def projection(direction, p): + x, y, z = p + return [(1-z, 1-y), (z, 1-y), (x, z), (x, 1-z), (x, 1-y), (1-x, 1-y)][direction] + + +def rotate(p, x, y): + # Java blockstate rotations are clockwise around the block center. + x, y = math.radians(-x), math.radians(-y) + a, b, c = p + b, c = b*math.cos(x)-c*math.sin(x), b*math.sin(x)+c*math.cos(x) + return (a*math.cos(y)+c*math.sin(y), b, -a*math.sin(y)+c*math.cos(y)) + + +def condition(when, props): + if 'OR' in when: + return any(condition(c, props) for c in when['OR']) + if 'AND' in when: + return all(condition(c, props) for c in when['AND']) + return all(props.get(k) in str(v).split('|') for k, v in when.items()) + + +class Compiler: + def __init__(self, jar, images): + self.jar, self.images = jar, images + + @lru_cache(None) + def read(self, path): + return json.loads(self.jar.read(PREFIX + path)) + + @lru_cache(None) + def model(self, name): + data = self.read('models/' + norm(name) + '.json') + parent = data.get('parent') + base = self.model(parent) if parent and 'builtin/' not in parent else {} + return {**base, **data, 'textures': {**base.get('textures', {}), **data.get('textures', {})}} + + def resolve(self, value, textures): + seen = set() + while isinstance(value, str) and value.startswith('#') and value not in seen: + seen.add(value) + value = textures.get(value[1:]) + if isinstance(value, dict): + value = value.get('sprite') + if isinstance(value, str) and norm(value).startswith('block/'): + name = norm(value).removeprefix('block/') + if name in self.images: + return name + return None + + @lru_cache(None) + def model_faces(self, name, rx=0, ry=0, uvlock=False): + model = self.model(name) + textures = model.get('textures', {}) + result, areas = [None]*6, [-1]*6 + for element in model.get('elements', []): + lo = [v/16 for v in element['from']] + hi = [v/16 for v in element['to']] + for direction, data in element.get('faces', {}).items(): + texture = self.resolve(data.get('texture'), textures) + if not texture or texture == 'grass_block_side_overlay': + continue # The opaque grass side already includes its edge. + face = DIRECTIONS.index(direction) + normal = tuple(round(v) for v in rotate(NORMALS[face], rx, ry)) + dest = NORMALS.index(normal) + axes = [i for i, v in enumerate(NORMALS[face]) if not v] + area = math.prod(abs(hi[i]-lo[i]) for i in axes) + if area <= areas[dest]: + continue + areas[dest] = area + corners = [projection(face, p) for p in [lo, hi]] + low = [min(c[i] for c in corners) for i in range(2)] + high = [max(c[i] for c in corners) for i in range(2)] + rect = [v/16 for v in data.get('uv', [low[0]*16, low[1]*16, high[0]*16, high[1]*16])] + + def uv_at(world): + # Inverse rotation is the transpose of the orthogonal basis. + offset = [v-.5 for v in world] + basis = [rotate(axis, rx, ry) for axis in [(1, 0, 0), (0, 1, 0), (0, 0, 1)]] + local = [.5 + sum(a*b for a, b in zip(offset, axis)) for axis in basis] + uv = projection(face, local) + if uvlock: + return projection(dest, world) + uv = [(uv[i]-low[i])/max(high[i]-low[i], 1e-6) for i in range(2)] + for _ in range(data.get('rotation', 0)//90): + uv = [uv[1], 1-uv[0]] + return [rect[i] + uv[i]*(rect[i+2]-rect[i]) for i in range(2)] + + zero = uv_at([0, 0, 0]) + unit = [uv_at(p) for p in [[1, 0, 0], [0, 1, 0], [0, 0, 1]]] + transform = [round(v, 6) for i in range(2) for v in [*(p[i]-zero[i] for p in unit), zero[i]]] + result[dest] = {'texture': texture, 'uv': transform, 'tinted': 'tintindex' in data} + particle = self.resolve(textures.get('particle'), textures) + fallback = next((v for v in result if v), None) + for i, face in enumerate(result): + if face is None: + texture = particle or (fallback and fallback['texture']) + result[i] = {'texture': texture, 'tinted': bool(fallback and fallback['tinted'])} if texture else None + return result + + def faces(self, block, props): + definition = self.read('blockstates/' + norm(block) + '.json') + models = [] + for selector, model in definition.get('variants', {}).items(): + when = dict(part.split('=', 1) for part in selector.split(',') if part) + if condition(when, props): + models.append(model[0] if isinstance(model, list) else model) + break + for part in definition.get('multipart', []): + if condition(part.get('when', {}), props): + model = part['apply'] + models.append(model[0] if isinstance(model, list) else model) + faces = [None]*6 + for model in models: + incoming = self.model_faces(model['model'], model.get('x', 0), model.get('y', 0), model.get('uvlock', False)) + faces = [a or b for a, b in zip(faces, incoming)] + result = [] + for face in faces: + if not face: + result.append(None) + continue + face = face.copy() + tinted = face.pop('tinted', False) + texture = face['texture'] + if tinted: + tint = [0.58, 0.8, 0.34] + if 'leaves' in block or 'vine' in block: + tint = [0.46, 0.7, 0.28] + if 'spruce' in block: + tint = [0.38, 0.60, 0.38] + if block == 'minecraft:redstone_wire': + power = int(props.get('power', '0'))/15 + tint = [.3+.7*power, max(0, power*power*.7-.5), 0] + face['tint'] = tint + if block in ('minecraft:water', 'minecraft:bubble_column'): + face['tint'] = [0.25, 0.46, 0.9] + alpha = self.images[texture].getchannel('A').getextrema() + face['cutout'] = alpha[0] == 0 and alpha[1] == 255 + result.append(face) + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--jar', type=Path, required=True) + parser.add_argument('--states', type=Path, required=True, help='Matching generated/reports/blocks.json') + parser.add_argument('--output', type=Path, required=True) + args = parser.parse_args() + output = args.output.resolve() + if output.exists(): + parser.error('Output already exists; choose a new directory.') + jar = zipfile.ZipFile(args.jar) + images, animated, native_sizes = {}, [], {} + for path in sorted(jar.namelist()): + if not path.startswith(PREFIX + 'textures/block/') or not path.endswith('.png'): + continue + name = Path(path).stem + image = Image.open(BytesIO(jar.read(path))).convert('RGBA') + metadata = json.loads(jar.read(path + '.mcmeta')).get('animation', {}) if path + '.mcmeta' in jar.namelist() else {} + width = metadata.get('width', min(image.size)) + height = metadata.get('height', width) + frames = metadata.get('frames', [0]) + first = frames[0] if frames else 0 + index = first.get('index', 0) if isinstance(first, dict) else first + x, y = index % (image.width//width)*width, index // (image.width//width)*height + frame = image.crop((x, y, x+width, y+height)) + native_sizes[name] = [width, height] + if metadata or image.size != frame.size: + animated.append(name) + images[name] = frame.resize((32, 32), Image.Resampling.NEAREST) + compiler = Compiler(jar, images) + report = json.loads(args.states.read_text()) + sets, lookup, states, defaults, uncovered = [], {}, {}, {}, [] + for block, definition in report.items(): + for state in definition['states']: + props = state.get('properties', {}) + try: + faces = compiler.faces(block, props) + except KeyError: + faces = [None]*6 + key = json.dumps(faces, separators=(',', ':'), sort_keys=True) + if key not in lookup: + lookup[key] = len(sets) + sets.append(faces) + canonical = block + ('['+','.join(f'{k}={v}' for k, v in sorted(props.items()))+']' if props else '') + states[canonical] = lookup[key] + if state.get('default'): + defaults[block] = lookup[key] + if not any(faces): + uncovered.append(block) + output.mkdir(parents=True) + for base in ('base', 'trampoline'): + shutil.copytree(ROOT/'packages'/base, output/base) + package = output/'vanilla' + (package/'client').mkdir(parents=True) + columns = 40 + rows = math.ceil(len(images)/columns) + atlas = Image.new('RGBA', (columns*32, rows*32)) + for i, image in enumerate(images.values()): + atlas.paste(image, (i % columns*32, i//columns*32)) + atlas.save(package/'client/atlas.png', optimize=True) + descriptor = {'schema': 1, 'texture_pack': { + 'name': 'Minecraft 26.2 Original — Local Test', 'pixel_size': 32, + 'atlas': {'path': 'client/atlas.png', 'columns': columns, 'rows': rows}, + 'textures': [{'name': name} for name in images], + 'grass_overlay': {'base': 'grass_block_side', 'overlay': 'grass_block_side_overlay'}, + 'block_faces': {'sets': sets, 'states': states, 'defaults': defaults}, + }} + (package/'client/style.json').write_text(json.dumps(descriptor, separators=(',', ':'))+'\n') + resources = [] + for path, role in [('client/atlas.png', 'texture'), ('client/style.json', 'client-style')]: + data = (package/path).read_bytes() + assert len(data) < 16*1024*1024 + resources.append({'path': path, 'scope': 'client', 'role': role, 'size': len(data), 'sha256': hashlib.sha256(data).hexdigest()}) + base = json.loads((output/'base/manifest.json').read_text()) + manifest = {'schema': 1, 'id': 'shacraft.vanilla.local', 'version': '1.0.1', + 'license': 'Minecraft assets copyright Mojang/Microsoft. Local testing only; no redistribution rights granted.', + 'dependencies': [{'id': base['id'], 'version': base['version']}], + 'capabilities': ['client.texture', 'client.style'], 'resources': resources} + (package/'manifest.json').write_text(json.dumps(manifest, indent=2)+'\n') + receipt = {'textures': len(images), 'states': len(states), 'face_sets': len(sets), + 'source_sha256': hashlib.sha256(args.jar.read_bytes()).hexdigest(), + 'native_sizes': dict((str(size), list(native_sizes.values()).count(size)) for size in native_sizes.values()), + 'animated_first_frame': animated, 'untextured_default_blocks': uncovered, + 'atlas_bytes': (package/'client/atlas.png').stat().st_size, + 'mapping_bytes': (package/'client/style.json').stat().st_size, + 'limitations': ['Static first animation frame', 'Existing engine geometry; complex multipart and entity-rendered blocks are approximated', 'Fixed foliage tint rather than biome colors']} + (output/'receipt.json').write_text(json.dumps(receipt, indent=2)+'\n') + print(json.dumps(receipt, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/scripts/verify.sh b/scripts/verify.sh index bbfc4e8..0836577 100755 --- a/scripts/verify.sh +++ b/scripts/verify.sh @@ -2,10 +2,13 @@ set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." cargo fmt --all -- --check -rustfmt --edition 2024 --check crates/shacraft-server/src/control.rs +rustfmt --edition 2024 --check crates/shacraft-server/src/control.rs crates/shacraft-server/src/world_streaming.rs +bash scripts/build_physics.sh cargo clippy --workspace --all-targets --locked -- -D warnings cargo test --workspace --locked cargo build --workspace --locked python3 scripts/check_storage.py node --test client/tests/*.test.js -node scripts/check_server.mjs --binary target/debug/shacraft-server --port 4001 --output artifacts/server-e2e-debug.json +node scripts/check_server.mjs --binary target/debug/shacraft-server --port "${SHACRAFT_TEST_PORT:-4011}" --output artifacts/server-e2e-debug.json +node scripts/check_chunk_streaming.mjs --binary target/debug/shacraft-server --port "${SHACRAFT_TEST_PORT:-4011}" --output artifacts/chunk-streaming/network-report.json +node scripts/check_player_physics.mjs --binary target/debug/shacraft-server --port "${SHACRAFT_TEST_PORT:-4011}" --output artifacts/physics/network-report.json